Link tiểu luận: https://drive.google.com/file/d/1xKzedxUc5AG3qW3FTtaWSCaKIbHsv6mB/view?usp=drive_link

File dữ liệu: https://docs.google.com/spreadsheets/d/1JjM3CT3wcRR5w1Zyu_1-JD1LvV7ENwUc/edit?usp=drive_link&ouid=117516550515876121029&rtpof=true&sd=true

options(repos = c(CRAN = "https://cran.r-project.org"))

1 Lời cảm ơn

Đầu tiên, tôi xin cảm ơn trường Đại học Tài chính – Marketing đã đưa bộ môn “Phân tích dữ liệu định tính” vào chương trình đào tạo. Đặc biệt, tôi bày tỏ lòng biết ơn và tri ân sâu sắc đến giảng viên hướng dẫn Th.S Trần Mạnh Tường. Để có thể hoàn thiện đề tài tiểu luận kết thúc học phần cả về nội dung lẫn hình thức trình bày, bên cạnh sự nổ lực của bản thân, tôi luôn nhận được sự quan tâm, hướng dẫn tận tình từ thầy Tường. Nhờ có sự đóng góp, chia sẻ từ thầy mà tôi có thể hoàn thiện bài tiếu luận một cách tốt nhất. Những kiến thức được thầy truyền đạt trong học kì này đã giúp tôi trưởng thành hơn về mặt kiến thức cũng như vững hành trang bước vào chuyên nghành của mình sau này. Tuy nhiên, dù đã cố gắng hết sức để có thể hoàn thiện đề tài nghiên cứu nhưng chắc chắn bài tiểu luận này sẽ khó tránh khỏi những sai sót và luôn tồn đọng nhiều hạn chế. Chính vì vậy, nhóm luôn mong nhận được ý kiến đóng góp từ thầy để đề tài có thể hoàn thiện hơn. Lời cuối cùng, chúng tôi kính chúc thầy sẽ có thật nhiều sức khỏe, hạnh phúc và thành công trên con đường giảng dạy.

2 Chương 1. Giới thiệu

2.1 Tính cấp thiết của đề tài

Trong thời đại phát triển của nền kinh tế và tài chính, việc vay tín dụng đã trở thành một phương tiện quan trọng để hỗ trợ cá nhân và doanh nghiệp thực hiện các dự án và mục tiêu tài chính. Tuy nhiên, việc sử dụng tín dụng cũng mang đến nhiều rủi ro và tác động đến tình hình tài chính của người vay. Mặt khác, việc sử dụng Internet ngày càng tăng ở Việt Nam đã tạo động lực và triển vọng phát triển cho thương mại điện tử, làm phong phú thêm nhận thức của khách hàng về thanh toán không tiền mặt và các khoản vay tiêu dùng (Huỳnh và Trần, 2021). Điều này đặt ra một câu hỏi quan trọng là: Các yếu tố nào ảnh hưởng đến hành vi vay tín dụng của khách hàng và làm thế nào chúng có thể được quản lý để tối ưu hóa hiệu quả tài chính cá nhân?

Đề tài “Phân tích các yếu tố ảnh hưởng đến hành vi vay tín dụng của khách hàng” được chọn với mục tiêu nghiên cứu, phân tích và đưa ra những thông tin quan trọng về các yếu tố có ảnh hưởng đến hành vi vay tín dụng của khách hàng. Nghiên cứu này không chỉ tập trung vào phân tích các yếu tố ảnh hưởng đến hành vi vay tín dụng của khách hàng mà còn giúp cải thiện quy trình đánh giá tín dụng và tạo ra cơ hội để phát triển các chính sách và sản phẩm tài chính linh hoạt, phù hợp hơn với nhu cầu và thái độ của từng khách hàng. Theo Tài và cộng sự (2017), khi khách hàng (cá nhân, doanh nghiệp…) đến vay vốn, cán bộ tín dụng phải có khả năng đánh giá đúng khách hàng và ra quyết định về việc cho hay không cho khách hàng vay. Nhờ vào việc hiểu rõ hơn về các yếu tố tác động đến quyết định vay tín dụng của khách hàng, các tổ chức tài chính có thể tối ưu hóa quy trình cung cấp tín dụng và tùy chỉnh các sản phẩm và dịch vụ tài chính sao cho phù hợp và thu hút hơn với từng đối tượng khách hàng khác nhau. Điều này sẽ giúp cải thiện mức độ đáp ứng nhu cầu vay tín dụng của khách hàng và tăng cường sự hài lòng và lòng tin của họ đối với tổ chức tín dụng.

Mục tiêu của đề tài không chỉ nằm ở việc đưa ra cái nhìn toàn diện về yếu tố ảnh hưởng đến hành vi vay tín dụng của khách hàng, mà còn tập trung vào việc đề xuất những giải pháp cụ thể và gợi ý cho các tổ chức tín dụng. Những kết quả nghiên cứu được áp dụng có thể giúp cải thiện quy trình xét duyệt tín dụng, giảm thiểu rủi ro tín dụng, và tối ưu hóa lợi nhuận. Tóm lại, đề tài mang lại cho lĩnh vực tài chính và ngân hàng những đóng góp quan trọng cũng như tạo tiền đề cho sự thúc đẩy bền vững của nền kinh tế và điều kiện thuận lợi cho cả người cho vay và người vay trong các giao dịch tài chính.

2.2 Mục tiêu nghiên cứu

Dựa trên các thông tin đã thu thập được từ cuộc khảo sát, mục tiêu chính của đề tài này là phân tích các yếu tố ảnh hưởng đến hành vi vay tín dụng của khách hàng. Đề tài sẽ tập trung vào việc xem xét và đánh giá sự ảnh hưởng của các yếu tố như thu nhập khách hàng, số tiền vay, thu nhập, trình độ học vấn, tình trạng hôn nhân và một số yếu tố khác có thể liên quan. Từ đó, có thể giúp cải thiện quy trình xét duyệt tín dụng, giảm thiểu rủi ro tín dụng, và tối ưu hóa lợi nhuận.

2.3 Đối tượng và phạm vi nghiên cứu

Đối tượng nghiên cứu bao gồm những khách hàng đến từ khách hàng đã vay vốn đến từ Vương quốc Anh. Sự đa dạng về độ tuổi, giới tính, nghề nghiệp, trình độ học vấn và tình hình tài chính cá nhân sẽ được xem xét để tạo ra kết quả nghiên cứu mang tính đại diện và có thể áp dụng rộng rãi. Dữ liệu này cho phép phân tích về các yếu tố có thể ảnh hưởng đến hành vi vay tín dụng của từng khách hàng và dự báo nguy cơ vỡ nợ của ngân hàng.

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

Phương pháp nghiên cứu tập trung vào phân tích các yếu tố có liên quan đến khả năng ra quyết định hình thức vay vốn của khách hàng. Bằng cách thống kê mô tả, xem xét mối quan hệ tương quan giữa các cặp biến, từ đó xây dựng mô hình hồi quy tuyến tính tổng quát. Thông qua các chỉ số đánh giá để lựa chọn mô hình phù hợp nhất và tiến hành phân tích yếu tố tác động đến quyết định hình thức vay vốn.

2.5 Bố cục nghiên cứu

Nghiên cứu được chia thành năm phần chính để đảm bảo tính logic và hiệu quả trong việc truyền tải thông tin. Chương 1 giới thiệu. Chương 2 tổng quan lý thuyết. Chương 3 tổng quan nghiên cứu. Chương 4 kết quả nghiên cứu. Chương 5 kết luận và khuyến nghị.

3 Chương 2. Tổng quan lý thuyết

3.1 Cơ sở lý thuyết về tín dụng

Tổ chức tín dụng là doanh nghiệp thực hiện một, một số hoặc tất cả các hoạt động ngân hàng. Tổ chức tín dụng bao gồm ngân hàng, tổ chức tín dụng phi ngân hàng, tổ chức tài chính vi mô và quỹ tín dụng nhân dân (Quốc hội, 2010). Cấp tín dụng là việc thỏa thuận để tổ chức, cá nhân sử dụng một khoản tiền hoặc cam kết cho phép sử dụng một khoản tiền theo nguyên tắc có hoàn trả bằng nghiệp vụ cho vay, chiết khấu, cho thuê tài chính, bao thanh toán, bảo lãnh ngân hàng và các nghiệp vụ cấp tín dụng khác (Quốc hội, 2010).

Một trong những hình thức phổ biến của tín dụng là thẻ tín dụng. Thẻ tín dụng cho phép người sử dụng mượn tiền từ tổ chức tín dụng hoặc ngân hàng để mua sắm và thanh toán vào cuối kỳ thanh toán. Điều này mang lại sự tiện lợi và linh hoạt cho người dùng, nhưng cũng đòi hỏi sự quản lý tài chính thông minh để tránh nợ nần không kiểm soát.

Ngoài ra, tín dụng cũng thể hiện trong hình thức vay vốn. Người có nhu cầu tiền mặt có thể vay một khoản tiền từ ngân hàng hoặc tổ chức tín dụng và cam kết trả lại theo một kế hoạch trả nợ cụ thể với lãi suất. Tuy cung cấp nguồn tài chính cần thiết cho những dự án và nhu cầu cá nhân, nhưng việc vay tiền cũng đòi hỏi sự đánh giá và tính toán kỹ lưỡng để tránh rơi vào cảnh nợ nần.

Đối với doanh nghiệp, tín dụng thương mại đóng vai trò quan trọng trong quá trình mua hàng hoặc dịch vụ. Tín dụng thương mại cho phép doanh nghiệp mua hàng hoặc dịch vụ và trả tiền sau khi đã nhận được chúng. Điều này giúp doanh nghiệp duy trì hoạt động một cách linh hoạt và đáp ứng nhu cầu kinh doanh một cách hiệu quả.

Tuy tín dụng mang lại nhiều lợi ích cho kinh tế và cá nhân, việc quản lý tín dụng cần được thực hiện cẩn thận. Người sử dụng tín dụng nên có ý thức trách nhiệm trong việc vay tiền và trả nợ đúng hạn để tránh những vấn đề tài chính khó khăn và tác động tiêu cực đến đời sống cá nhân cũng như hoạt động kinh doanh.

3.2 Hình thức vay vốn

Hình thức vay tiền có thể được chia thành hai loại chính: vay tiền mặt và vay tín dụng.

Vay tiền mặt:

Vay tiền mặt là hình thức vay mà người vay nhận được số tiền yêu cầu dưới dạng tiền mặt hoặc chuyển khoản vào tài khoản của họ. Điều này có nghĩa là người vay có quyền sử dụng số tiền này như một khoản tiền mặt và có thể sử dụng nó cho bất kỳ mục đích gì, không bị ràng buộc bởi các giới hạn cụ thể. Thông thường, vay tiền mặt thường áp dụng cho các tình huống cấp thiết hoặc khi người vay cần tiền mặt nhanh chóng.

Vay tín dụng: Vay tín dụng là hình thức vay mà người vay được cấp một hạn mức tín dụng từ một tổ chức tài chính, ngân hàng hoặc công ty tín dụng. Người vay có thể sử dụng số tiền trong hạn mức tín dụng này theo nhu cầu và thỏa thuận trước đó. Tùy thuộc vào điều kiện của hợp đồng, người vay có thể thanh toán số tiền vay trong một khoảng thời gian nhất định hoặc trả tiền theo các kỳ hạn thỏa thuận. Ví dụ về hình thức vay tín dụng bao gồm thẻ tín dụng và vay theo hạn mức trong tài khoản ngân hàng.

Cả hai hình thức vay đều có ưu điểm và hạn chế riêng, và sẽ phù hợp với các tình huống và nhu cầu tài chính cụ thể của người vay.

Ưu điểm vay tín dụng:

Việc lựa chọn vay tín dụng thay vì vay tiền mặt đem lại nhiều lợi ích và sự linh hoạt cho người vay. Với hình thức vay tín dụng, người vay có sẵn một hạn mức tín dụng để sử dụng linh hoạt theo nhu cầu cá nhân. Không cần phải chỉ định rõ ràng mục đích sử dụng, người vay có thể sử dụng số tiền này cho bất kỳ mục đích gì, từ thanh toán hóa đơn hàng tháng cho đến mua sắm hoặc đi du lịch.

Ngoài ra, tính linh hoạt trong việc trả nợ cũng là một điểm mạnh của vay tín dụng. Người vay có thể chọn trả nợ trong một khoảng thời gian dài hơn, giảm bớt áp lực tài chính và giúp duy trì sự ổn định trong cuộc sống hàng ngày. Hơn nữa, lãi suất chỉ áp dụng cho số tiền đã sử dụng trong hạn mức tín dụng, giúp giảm chi phí lãi suất so với việc vay tiền mặt.

Vay tín dụng cũng hỗ trợ tài chính cho những dự án lớn và dài hạn như mua nhà hoặc đầu tư kinh doanh, nhờ hạn mức lớn hơn so với vay tiền mặt. Ngoài ra, các chương trình ưu đãi và điểm thưởng của các thẻ tín dụng còn là một điểm thu hút, giúp người vay nhận được những lợi ích hấp dẫn khi sử dụng thẻ.

Tuy nhiên, để tận dụng hết các ưu điểm của vay tín dụng, người vay cần thận trọng và quản lý tài chính cẩn thận. Nếu không quản lý tốt việc sử dụng hạn mức tín dụng, người vay có thể dễ dàng rơi vào tình trạng nợ nần và gặp khó khăn trong việc thanh toán. Do đó, việc lựa chọn vay tín dụng nên được thực hiện một cách tỉnh táo và có kế hoạch tài chính cụ thể.

4 Chương 3. Thiết kế nghiên cứu

4.1 Mô hình tuyến tính tổng quát

Mô hình hồi quy tuyến tính tổng quát là một phương pháp thống kê được sử dụng để mô hình hóa mối quan hệ tuyến tính giữa một biến phụ thuộc (còn gọi là biến mục tiêu) và một hoặc nhiều biến độc lập (còn gọi là biến giải thích). Mô hình hồi quy tuyến tính tổng quát dự đoán giá trị của biến phụ thuộc dựa trên các giá trị của các biến giải thích. Trong mô hình hồi quy tuyến tính tổng quát, giả định rằng mối quan hệ giữa biến phụ thuộc và các biến giải thích có thể được biểu diễn bằng một hàm tuyến tính. Điều này có nghĩa là khi giá trị của biến giải thích thay đổi, giá trị của biến phụ thuộc cũng sẽ thay đổi theo một tỷ lệ cụ thể.

Công thức tổng quát của mô hình hồi quy tuyến tính có thể được viết như sau:

\(Y=\beta_0+\beta_1X_1+\beta_2X_2+...+\beta_nX_n + \epsilon\)

Trong đó:

  • \(Y\) là giá trị của biến phụ thuộc (biến mục tiêu) cần dự đoán.

  • \(X_1, X_2,...,X_n\) là các biến giải thích (biến độc lập).

  • \(\beta_0,\beta_1,...,\beta_n\) là các hệ số hồi quy, biểu thị độ lớn và hướng của mối quan hệ tuyến tính giữa biến phụ thuộc và các biến giải thích.

  • \(\epsilon\) là sai số ngẫu nhiên, biểu thị sự sai khác giữa giá trị dự đoán và giá trị thực tế của biến phụ thuộc.

4.2 Mô hình tuyến tính tổng quát cho dữ liệu nhị phân

Mô hình tuyến tính tổng quát cho dữ liệu nhị phân là một công cụ phân loại dùng để dự đoán hoặc phân biệt giữa hai tùy chọn. Các tùy chọn này có thể là có hoặc không có, đúng hoặc sai, 0 hoặc 1. Mô hình này sử dụng mối quan hệ tuyến tính giữa các biến độc lập (những thông tin cung cấp) và biến phụ thuộc (kết quả dự đoán) để đưa ra quyết định.

Đối với mỗi điểm dữ liệu, mô hình sẽ tính toán một giá trị dự đoán (thường là xác suất) dựa trên các thông tin được cung cấp. Giá trị dự đoán này sau đó được so sánh với một ngưỡng quyết định (thường là 0.5). Nếu giá trị dự đoán lớn hơn ngưỡng, mô hình sẽ dự đoán kết quả là một tùy chọn, và ngược lại nếu giá trị dự đoán nhỏ hơn ngưỡng, mô hình sẽ dự đoán kết quả là tùy chọn còn lại.

Mô hình này được xây dựng bằng cách tìm các hệ số (trọng số) tốt nhất sao cho hàm tuyến tính mô tả mối quan hệ giữa các biến độc lập và biến phụ thuộc càng tốt. Quá trình này có thể được thực hiện bằng cách sử dụng dữ liệu đã biết (dữ liệu huấn luyện) để tìm ra các hệ số phù hợp nhất sao cho mô hình có thể dự đoán chính xác kết quả cho các điểm dữ liệu mới chưa biết trước.

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

4.3.1 Bảng tần số - Bảng tần suất

Bảng tần số - Bảng tần suất còn được gọi là bảng ngẫu nhiên. Khi lập bảng ngẫu nhiên cho 2 biến thì bảng đó được gọi là bảng ngẫu nhiên 2 chiều, nếu lập cho 3 biến thì gọi là bảng ngẫu nhiên 3 chiều và cứ thế tăng lên.

Đối với bảng tần số chúng ta quy ước biến phụ thuộc (dependent/outcome/response variable) được xắp xếp theo cột, biến độc lập (independent/explanatory/predictor variable) được xắp xếp theo hàng.

4.3.2 Rủi ro tương đối (Relative Risk/Risk Ratio)

Rủi ro tương đối là một chỉ số được sử dụng để đánh giá mối quan hệ giữa một yếu tố nguy cơ và một kết quả. Được tính bằng cách chia tỷ lệ mắc bệnh ở những người có yếu tố nguy cơ cho tỷ lệ mắc bệnh ở những người không có yếu tố nguy cơ. RR được biểu thị dưới dạng số. Nếu RR lớn hơn 1, điều đó có nghĩa là yếu tố nguy cơ làm tăng nguy cơ mắc bệnh. Nếu rủi ro bằng 1, điều đó có nghĩa là yếu tố nguy cơ không có tác động đến nguy cơ mắc bệnh. Nếu RR nhỏ hơn 1, điều đó có nghĩa là yếu tố nguy cơ làm giảm nguy cơ mắc bệnh. rủi ro là một chỉ số quan trọng để đánh giá mối quan hệ giữa một yếu tố nguy cơ và một kết quả. Tuy nhiên, cần lưu ý rằng rủi ro không phải lúc nào cũng là chỉ số duy nhất cần xem xét. Trong một số trường hợp, các chỉ số khác, chẳng hạn như nguy cơ tuyệt đối (AR), có thể quan trọng hơn.

Ký hiệu \(π_i\) là tỷ lệ “thành công” của biến phụ thuộc (response variable) tương ứng với từng biểu hiện của biến độc lập. Từ bảng tần xuất, chúng ta tính \(\frac{\pi_1}{\pi_2}\), phân số này gọi là Rủi ro tương đối (Relative risk) giữa 2 biểu hiện khác nhau của biến phụ thuộc.

4.3.3 Tỷ lệ chênh (Odd Ratio)

Tỷ lệ chênh (Odd) là một chỉ số được sử dụng để đo cường độ của mối quan hệ giữa hai biến phân loại. Odd được tính bằng cách chia tỷ lệ chênh dương cho tỷ lệ chênh âm. Odd thường được sử dụng trong các nghiên cứu quan sát, trong đó các nhà nghiên cứu quan sát các biến số mà không cố gắng kiểm soát chúng. Odd không phải là một ước lượng chính xác của nguy cơ tuyệt đối, nhưng nó có thể được sử dụng để đánh giá nguy cơ tương đối của các kết quả khác nhau.Odd được biểu thị dưới dạng số. Nếu Odd lớn hơn 1, điều đó có nghĩa là biến phân loại đầu tiên có liên quan đến kết quả. Nếu OR bằng 1, điều đó có nghĩa là biến phân loại đầu tiên không liên quan đến kết quả. Nếu OR nhỏ hơn 1, điều đó có nghĩa là biến phân loại đầu tiên không liên quan đến kết quả.

Nếu gọi xác suất “thành công” của biểu hiện thứ i của biến độc lập là \(π_i\) thì chúng ta kí hiệu Tỷ lệ cược (odd) của biểu hiện này là \(odd_i\) và được định nghĩa như sau:

\(odd_i=\frac{\pi_i}{1-\pi_i}\)

Nghĩa là chúng ta tính tỷ lệ thành công theo từng hàng trong bảng ngẫu nhiên.

Tỷ lệ chênh của biểu hiện thứ i và biểu hiện thứ j được kí hiệu là \(θ_ij\) và được định nghĩa:

\(θ = \frac{odd_i}{odd_j} = \frac{π_i(1-π_j)}{π_j(1-π_i)}\)

4.3.4 Phân phối Poisson

Phân phối Poisson với tham số \(\lambda (\lambda > 0\) có hàm phân phối xác suất như sau:

\(p_k = P(Y = k) = \frac{\lambda^k.e^{-\lambda}}{k!}, k = 0,1,2,...\)

Khi đó ta viết: \(Y\) ~ \(P(\lambda)\) để chỉ rằng: \(Y\) có phân phối xác suất Poisson với tham số \(\lambda\). Giá trị trung bình khi đó của nó là \(EY = \lambda\) và phương sai là \(VarY = \lambda\).

Nếu \(Y_1, Y_2,..., Y_m\) là các biến ngẫu nhiên độc lập có cùng phân phối Poisson \(P(\lambda)\) thì \(Y = Y_1 + Y_2 + ... + Y_m\) là biến ngẫu nhiên có phân phối Poisson \(P(m\lambda)\).

4.3.5 Rủi ro tương đối (Relative Risk)

Sự khác biệt giữa hai tỷ lệ \(\pi_1\)\(\pi_2\) được đánh giá qua sai số tuyệt đối (\(\pi_1 - \pi_2\)) chỉ dựa vào khoảng cách giữa hai tỷ lệ này và bỏ qua độ lớn và ý nghĩa của chúng, nghĩa là khoảng cách như nhau thì đánh giá sai lệch như nhau. Giả sử \(\pi_1\)\(\pi_2\) là xác suất thành công của hai nhóm thì rủi ro tương đối giữa hai nhím này là tỷ lệ xác suất thành công của hai nhóm: \(\frac{\pi_1}{\pi_2}\)

Các tỷ lệ tổng thể \(\pi_1\)\(\pi_2\) là chưa biết, ta nhận được các tỷ lệ mẫu tương ứng là \(f_1\)\(f_2\). Khi đó, ta dùng rủi ro tương đối mẫu \(\frac{f_1}{f_2}\) để xấp xỉ cho rủi ro tương đối \(\frac{\pi_1}{\pi_2}\) trên tổng thể.

4.3.5.1 Tỷ lệ chênh (Odds Ratios)

Tỷ lệ cược (Odds) là tỷ lệ giữa khả năng thành công và khả năng không thành công trong cùng một điều kiện tác động của biến giải thích, ký hiệu \(odds_i\):

\(odds_i = \frac{\pi_i}{1 - \pi_i}\)

Tỷ lệ chênh (Odds Ratio) của hàng 1 và hàng 2, được ký hiệu là \(\theta\), là tỷ số giữa tỷ lệ cược của thành công ở hàng 1 và tỷ lệ cược của thành công ở hàng 2:

\(\theta = \frac{odds_1}{odds_2} = \frac{\pi_1(1 - \pi_2)}{\pi_2(1 - \pi_1)}\)

4.3.6 Mô hình tuyến tính

GLM (General Linear Model) là một mô hình tuyến tính tổng quát giải thích mối quan hệ giữa một hàm kỳ vọng có điều kiện với các biến giải thích thông qua một phương trình dự đoán có dạng tuyến tính.

GLM phổ biến vì nó có thể xử lý nhiều loại dữ liệu với các kiểu biến phản ứng khác nhua như nhị thức, Poisson hay đa thức.

Để mô hình hóa ảnh hưởng của X là sử dụng dạng hồi quy tuyến tính cổ điển, theo đó giá trị kỳ vọng có điều kiện của Y là một hàm tuyến tính của X.

\(\pi(x) = \beta_0 + \beta_1.x\)

Đây là GLM với thành phần ngẫu nhiên nhị thức và hàm liên kết đồng nhất. Mô hình này được gọi là mô hình xác suất tuyến tính hay LPM (Linear Probability Model). \(\beta_1\) biểu thị cho sự thay đổi xác suất cho mỗi đơn vị thay đổi của x.

4.3.6.1 Mô hình hồi quy Logistic

Để khắc phục một số hạn chế của LPM, người ta đề xuất một hàm liên kết mà nó đồng biến với xác suất \(\pi\) và giá trị biến thiên của nó là tùy ý đó là \(log(\frac{\pi(x)}{1 - \pi(x)})\), được gọi là hàm logistic hay logit(\(\pi\)).

Mô hình hồi quy logit:

\(log(\frac{\pi(x)}{1 - \pi(x)}) = \beta_0 + \beta_1.x_1 + \beta_2.x_2 + ... +\beta_m.x_m\)

Trong đó \(\beta_0, \beta_1,..., \beta_m\) là hệ số hồi quy.

4.3.6.2 Mô hình Probit

Mô hình Probit được sử dung để ước lượng mô hình có biến phụ thuộc dạng nhị phân. Mô hình Probit là một GLM với thành phần ngẫu nhiên nhị phân và liên kết Probit. Hàm hôi quy Probit có dạng:

\(\pi(x) = \phi(\alpha + \beta x)\) Trong đó, \(\phi(x) = \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{x}e^{-\frac{1}{2}t^2}dt\) là hàm phân phối chuẩn chính tắc. Với \(Probit(\pi(x)) = \phi^{-1}(\pi(x))\), ta có mô hình Probit:

\(Probit(\pi(x)) = \alpha + \beta x\)

4.3.6.3 Chỉ số đánh giá mô hình AIC (Akaike Information Criterian)

Công thức được sử dụng cho AIC trong R là:

\(AIC = Deviance + 2.k\) (với k là tham số của mô hình)

AIC càng bé thì mô hình càng chính xác.

4.3.6.4 Chỉ số đánh giá mô hình Bier

Chỉ số Brier là trung bình của tổng bình phương các độ chênh lệch giữa giá trị của biến phụ thuộc Y và giá trị ước lượng của nó.

\(B = \frac{1}{n}\sum_{i = 1}^n(Y_i - \hat\pi_i)^2 = \frac{sum square resid}{n}\)

4.3.7 Chỉ số đánh giá mô hình Deviance

Deviance cũng là một tiêu chí rất phổ biến được sử dụng để đánh giá một mô hình hồi quy được ước lượng bởi phương pháp Hợp lý cực đại (ML). Một cách tổng quá, cũng giống như chỉ tiêu AIC, giá trị của Deviance càng nhỏ thì mô hình càng tốt.

4.3.8 Ma trận nhầm lẫn

Ma trận nhầm lẫn là yếu tố giúp so sánh giá trị thực tế và giá trị dự báo. Trong ma trận nhầm lẫn người ta xét các chỉ số: Độ chính xác toàn thể, độ nhạy, độ đặc hiệu,…

Trong ma trận nhầm lẫn, các chỉ số quan trọng được chú ý là độ nhạy và độ đặc hiệu. Các chỉ số này càng lớn càng tốt.

4.3.9 Độ nhạy và độ đặc hiệu

Độ nhạy (sensitivity) của một thí nghiệm: Là tỷ lệ (%) của số ca bị bệnh thực sự khi xét nghiệm và cho kết quả dương tính với tổng số ca bị bệnh. Công thức để tính độ nhạy:

Độ nhạy = số dương tính thật/(số đương tính thật + số âm tính giả)

Độ đặc hiệu (specificity) của một thí nghiệm: Là tỷ lệ (%) của số ca không bị bệnh và kết quả xét nghiệm không bị bệnh với tổng số người không bị bệnh. Công thức tính độ đặc hiệu:

Độ đặc hiệu = Số trường hợp âm tính thật/ (số trường hợp âm tính thật + số trường hợp dương tính giả)

5 Chương 4. Kết quả nghiên cứu

5.1 Tổng quan về dữ liệu

Bộ dữ liệu sử dụng trong phân tích được lấy từ trang kaggle.com, được chia sẻ bởi MISHRA5001 (2019) bao gồm 14 biến và 700 quan sát để phục vụ phân tích. Trong đó, có 09 biến định tính và 05 biến định lượng.

  • SK_ID_CURR: Mã định danh cho mỗi khách hàng

  • NAME_CONTRACT_TYPE: Loại hợp đồng vay

  • CODE_GENDER: Giới tính của khách hàng

  • FLAG_OWN_CAR: Có sở hữu xe hơi hay không

  • FLAG_OWN_REALTY: Có sở hữu bất động sản hay không

  • CNT_CHILDREN: Số lượng con cái của khách hàng

  • AMT_INCOME_TOTAL: Tổng thu nhập hàng năm của khách hàng

  • AMT_CREDIT: Hạn mức vay

  • AMT_ANNUITY: Số tiền trả hàng tháng

  • NAME_TYPE_SUITE: Loại người thụ hưởng hợp đồng vay

  • NAME_INCOME_TYPE: Loại thu nhập của khách hàng

  • NAME_EDUCATION_TYPE: Trình độ học vấn của khách hàng

  • NAME_FAMILY_STATUS: Tình trạng hôn nhân/gia đình của khách hàng

  • NAME_HOUSING_TYPE: Loại hình nhà ở của khách hàng

install.packages("readxl")
## Installing package into 'C:/Users/HP/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'readxl' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'readxl'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\HP\AppData\Local\R\win-library\4.3\00LOCK\readxl\libs\x64\readxl.dll
## to C:\Users\HP\AppData\Local\R\win-library\4.3\readxl\libs\x64\readxl.dll:
## Permission denied
## Warning: restored 'readxl'
## 
## The downloaded binary packages are in
##  C:\Users\HP\AppData\Local\Temp\Rtmp2zjHJe\downloaded_packages
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.1
data <- read_excel("D:/tieuluanpt.xlsx")
View(data)
str(data)
## tibble [10,000 × 14] (S3: tbl_df/tbl/data.frame)
##  $ SK_ID_CURR         : num [1:10000] 1e+05 1e+05 1e+05 1e+05 1e+05 ...
##  $ NAME_CONTRACT_TYPE : chr [1:10000] "Cash" "Cash" "Credit" "Credit" ...
##  $ CODE_GENDER        : chr [1:10000] "M" "F" "M" "F" ...
##  $ FLAG_OWN_CAR       : chr [1:10000] "N" "N" "Y" "N" ...
##  $ FLAG_OWN_REALTY    : chr [1:10000] "Y" "N" "Y" "Y" ...
##  $ CNT_CHILDREN       : num [1:10000] 0 0 0 0 0 0 1 0 0 0 ...
##  $ AMT_INCOME_TOTAL   : num [1:10000] 202500 270000 67500 135000 121500 ...
##  $ AMT_CREDIT         : num [1:10000] 406598 1293503 135000 312683 513000 ...
##  $ AMT_ANNUITY        : num [1:10000] 24701 35699 6750 29687 21866 ...
##  $ NAME_TYPE_SUITE    : chr [1:10000] "Unaccompanied" "Family" "Unaccompanied" "Unaccompanied" ...
##  $ NAME_INCOME_TYPE   : chr [1:10000] "Working" "State servant" "Working" "Working" ...
##  $ NAME_EDUCATION_TYPE: chr [1:10000] "Secondary / secondary special" "Higher education" "Secondary / secondary special" "Secondary / secondary special" ...
##  $ NAME_FAMILY_STATUS : chr [1:10000] "Single / not married" "Married" "Single / not married" "Civil marriage" ...
##  $ NAME_HOUSING_TYPE  : chr [1:10000] "House / apartment" "House / apartment" "House / apartment" "House / apartment" ...

5.2 Chọn biến định tính và biến định lượng làm biến phụ thuộc

5.2.1 Chọn biến định tính làm biến phụ thuộc

Phân tích các yếu tố ảnh hưởng đến hành vi vay tín dụng của khách hàng

Chọn biến NAME_CONTRACT_TYPE làm biến phụ thuộc

Quyết định hình thức vay vốn của khách hàng là một quyết định mang tính chiến lược và ảnh hưởng đáng kể đến tình hình tài chính và phát triển của cá nhân và doanh nghiệp. Tầm quan trọng của việc lựa chọn hình thức vay vốn đáng được nhấn mạnh, vì nó liên quan trực tiếp đến khả năng thanh toán và nợ nần của khách hàng. Một lựa chọn hợp lý và phù hợp với khả năng tài chính sẽ giúp tránh tình trạng vỡ nợ và giảm thiểu rủi ro tài chính.

Hơn nữa, quyết định hình thức vay vốn cũng ảnh hưởng đến cách khách hàng quản lý chi tiêu và đầu tư. Ví dụ, vay tiền mặt mang lại sự linh hoạt và tiện lợi trong sử dụng số tiền vay, trong khi vay tín dụng hạn chế việc sử dụng số tiền vay chỉ cho các giao dịch nhất định. Điều này đòi hỏi khách hàng phải cân nhắc kỹ lưỡng và xem xét mục tiêu tài chính để đưa ra quyết định đúng đắn.

Tuy nhiên, tầm quan trọng của việc ra quyết định hình thức vay vốn không chỉ dừng lại ở khía cạnh cá nhân mà còn tác động lên sự phát triển kinh tế tổng thể. Khi khách hàng và doanh nghiệp có khả năng tiếp cận tín dụng và vay vốn phù hợp, họ có thể thúc đẩy sự tăng trưởng kinh tế, tạo việc làm và đóng góp vào sự phát triển các ngành công nghiệp.

Điều này càng đáng chú ý khi các tổ chức tài chính và ngân hàng đóng vai trò quan trọng trong việc cung cấp các sản phẩm và dịch vụ tài chính phù hợp với nhu cầu của khách hàng. Quyết định hình thức vay vốn đòi hỏi sự tư vấn chuyên nghiệp từ các chuyên gia tài chính và sự đồng thuận của khách hàng trong việc đưa ra lựa chọn hợp lý.

Tóm lại, việc ra quyết định hình thức vay vốn là một quá trình quan trọng và phức tạp. Tầm quan trọng của nó không chỉ liên quan đến khả năng tài chính cá nhân và doanh nghiệp mà còn đóng góp vào sự phát triển kinh tế tổng thể. Việc đưa ra quyết định hợp lý và cân nhắc kỹ lưỡng giúp đảm bảo tính khả thi và an toàn trong việc vay vốn, góp phần tạo nên tương lai tài chính ổn định và bền vững.

5.2.2 Chọn biến định lượng làm biến phụ thuộc

Phân tích các yếu tố ảnh hưởng đến hạn mức vay của khách hàng

Chọn biến AMT_CREDIT làm biến phụ thuộc

Hạn mức vay vốn là một khía cạnh quan trọng không thể bị coi nhẹ trong lĩnh vực tài chính và ngân hàng. Điều này đáng chú ý bởi vì hạn mức vay có tác động lớn đến nhiều khía cạnh của cuộc sống tài chính của cá nhân và doanh nghiệp. Sự quan trọng của hạn mức vay vốn thể hiện qua việc nó giúp đáp ứng nhu cầu tài chính của khách hàng, từ việc mua sắm hàng hóa đến thanh toán các khoản chi phí hàng ngày, đồng thời hỗ trợ các doanh nghiệp trong việc đầu tư và mở rộng kinh doanh.

Tuy nhiên, việc quản lý hạn mức vay vốn cần được thực hiện cẩn thận để tránh những tác động tiêu cực. Các tổ chức tín dụng thường xem xét các yếu tố như khả năng trả nợ, lịch sử tín dụng, tài sản bảo đảm,… để xác định hạn mức vay vốn phù hợp. Điều này giúp giảm thiểu rủi ro cho cả người vay và tổ chức tín dụng, đồng thời ưu tiên sử dụng tài nguyên tài chính cho các mục tiêu quan trọng và cần thiết nhất.

Tóm lại, hạn mức vay mang lại sự linh hoạt và tiện lợi trong việc sử dụng tiền vay, cho phép khách hàng tái sử dụng số tiền đã trả nợ khi cần thiết. Điều này giúp quản lý tài chính một cách hiệu quả hơn và giảm thiểu rủi ro tài chính. Đối với các doanh nghiệp, hạn mức vay vốn quyết định khả năng tiếp cận tín dụng để đầu tư và phát triển. Việc có hạn mức vay vốn hợp lý giúp doanh nghiệp tận dụng cơ hội đầu tư và thúc đẩy tăng trưởng kinh tế.

5.3 Thống kê mô tả

Các biến sử dụng trong phân tích:

  • Biến định tính: NAME_CONTRACT_TYPE, CODE_GENDER, FLAG_OWN_CAR, FLAG_OWN_REALTY, NAME_TYPE_SUITE, NAME_INCOME_TYPE, NAME_EDUCATION_TYPE, NAME_HOUSING_TYPE.

  • Biến định lượng: CNT_CHILDREN, AMT_INCOME_TOTAL, AMT_CREDIT, AMT_ANNUITY

5.3.1 Biến NAME_CONTRACT_TYPE (Loại hợp đồng cho vay)

Bảng tần số

table(data$NAME_CONTRACT_TYPE)
## 
##   Cash Credit 
##   6499   3501

Theo kết quả thống kê:

  • Có 6499 khách hàng vay theo hình thức vay tiền mặt

  • Có 3501 khách hàng vay theo hình thức tín dụng

Bảng tần suất

table(data$NAME_CONTRACT_TYPE)/sum(table(data$NAME_CONTRACT_TYPE))
## 
##   Cash Credit 
## 0.6499 0.3501

Biểu đồ

install.packages("ggplot2")
## Installing package into 'C:/Users/HP/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\HP\AppData\Local\Temp\Rtmp2zjHJe\downloaded_packages
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.1
ggplot(data,aes(NAME_CONTRACT_TYPE))+
  geom_bar(color = "lightblue", fill = "lavender")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Name Contract Type")

Theo như biểu đồ, có 65% khách hàng vay theo hình thức lấy tiền mặt và 35% còn lại vay theo hình thức tín dụng.

5.3.2 Biến CODE_GENDER (Giới tính)

Bảng tần số

table(data$CODE_GENDER)
## 
##    F    M 
## 6589 3411

Theo kết quả thống kê, khách hàng vay vốn được phân theo giới tính như sau:

  • Có 6589 khách hàng giới tính nữ

  • Có 3411 khách hàng giới tính nam

Bảng tần suất

table(data$CODE_GENDER)/sum(table(data$CODE_GENDER))
## 
##      F      M 
## 0.6589 0.3411

Biểu đồ

ggplot(data,aes(CODE_GENDER))+
  geom_bar(color = "lightblue", fill = "lavender")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Gender")

Theo như biểu đồ, có 66% khách hàng là nữ và 34% còn lại là nam.

5.3.3 Biến FLAG_OWN_CAR (Khách hàng có sở hữu tài sản là ô tô hay không)

Bảng tần số

table(data$FLAG_OWN_CAR)
## 
##    N    Y 
## 6662 3338

Theo kết quả thống kê:

  • Có 6662 khách hàng không có ô tô

  • Có 3338 khách hàng có tài sản là ô tô

Bảng tần suất

table(data$FLAG_OWN_CAR)/sum(table(data$FLAG_OWN_CAR))
## 
##      N      Y 
## 0.6662 0.3338

Biểu đồ

ggplot(data,aes(FLAG_OWN_CAR))+
  geom_bar(color = "lightblue", fill = "lavender")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Flag Own Car")

Theo như biểu đồ, có 67% khách hàng không có ô tô và 33% khách hàng còn lại có ô tô.

5.3.4 Biến FLAG_OWN_REALTY (Khách hàng có sở hữu tài sản là bất động sản hay không)

Bảng tần số

table(data$FLAG_OWN_REALTY)
## 
##    N    Y 
## 3025 6975

Theo kết quả thống kê:

  • Có 3025 khách hàng không sở hữu bất động sản

  • Có 6975 khách hàng sở hữu bất động sản

Bảng tần suất

table(data$FLAG_OWN_REALTY)/sum(table(data$FLAG_OWN_REALTY))
## 
##      N      Y 
## 0.3025 0.6975

Biểu đồ

ggplot(data,aes(FLAG_OWN_REALTY))+
  geom_bar(color = "lightblue", fill = "lavender")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Flag Own Realty")

Theo như biểu đồ, có 70% khách hàng vay sở hữu bất động sản và 30% còn lại là không sở hữu bất động sản.

5.3.5 Biến NAME_INCOME_TYPE (Loại thu nhập của khách hàng)

Bảng tần số

table(data$NAME_INCOME_TYPE)
## 
## Commercial associate            Pensioner        State servant 
##                 2304                 1772                  650 
##           Unemployed              Working 
##                    2                 5272

Theo kết quả thống kê, bảng tần số cho biết thu nhập của khách hàng đến từ các nguồn sau:

  • Có 2304 khách hàng thu nhập từ lương cộng tác viên thương mại

  • Có 1772 khách hàng thu nhập từ lương hưu

  • Có 650 khách hàng hưởng lương công chức Nhà nước

  • Có 2 khách hàng không có việc làm

  • Có 5272 khách hàng có việc làm

Bảng tần suất

table(data$NAME_INCOME_TYPE)/sum(table(data$NAME_INCOME_TYPE))
## 
## Commercial associate            Pensioner        State servant 
##               0.2304               0.1772               0.0650 
##           Unemployed              Working 
##               0.0002               0.5272

Biểu đồ

ggplot(data, aes(x = "", fill = NAME_INCOME_TYPE)) +
  geom_bar(color = "lightblue", width = 1, stat = "count") +
  scale_fill_manual(values = c("#F2B5D4", "#B5EAD7", "#F7DD91", "#A9D8E5", "#D1A2FF", "#FFC8A2")) +
  coord_polar("y", start = 0) +
  ylab("Number of Customers") +
  xlab("Name Income Type")

5.3.6 Biến NAME_TYPE_SUITE (Loại người thụ hưởng hợp đồng vay)

Bảng tần số

table(data$NAME_TYPE_SUITE)
## 
##        Children          Family Group of people Spouse, partner   Unaccompanied 
##             107            1438               7             353            8095

Theo kết quả thống kê:

  • Có 107 loại người thụ hưởng là trẻ nhỏ

  • Có 1438 loại người thụ hưởng là gia đình

  • Có 7 loại người thụ hưởng theo nhóm

  • Có 8095 không có người thụ hưởng

  • Có 353 loại người thụ hưởng là vợ/chồng hoặc đối tác

Bảng tần suất

table(data$NAME_TYPE_SUITE)/sum(table(data$NAME_TYPE_SUITE))
## 
##        Children          Family Group of people Spouse, partner   Unaccompanied 
##          0.0107          0.1438          0.0007          0.0353          0.8095

Biểu đồ

ggplot(data,aes(NAME_TYPE_SUITE))+
  geom_bar(color = "lightblue", fill = "lavender")+
   geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Name Type Suite")

Theo như biểu đồ, khách hàng không có người thụ hưởng chiếm tỷ lệ cao nhất (80,95%) và thấp nhất là người thụ hưởng thuộc nhóm trẻ nhỏ, chiếm tỷ lệ 1,07%.

5.3.7 Biến NAME_HOUSING_TYPE (Loại hình nhà ở của khách hàng)

Bảng tần số

table(data$NAME_HOUSING_TYPE)
## 
##     Co-op apartment   House / apartment Municipal apartment    Office apartment 
##                  46                8851                 375                  76 
##    Rented apartment        With parents 
##                 162                 490

Theo kết quả thống kê:

  • Có 46 khách hàng ở căn hộ hợp tác xã

  • Có 8851 khách hàng có nhà riêng/ căn hộ

  • Có 375 khách hàng ở căn hộ cơ quan công cộng

  • Có 76 khách hàng ở căn hộ văn phòng

  • Có 162 khách hàng ở căn hộ cho thuê

  • Có 490 khách hàng sống cùng cha mẹ

Bảng tần suất

table(data$NAME_HOUSING_TYPE)/sum(table(data$NAME_HOUSING_TYPE))
## 
##     Co-op apartment   House / apartment Municipal apartment    Office apartment 
##              0.0046              0.8851              0.0375              0.0076 
##    Rented apartment        With parents 
##              0.0162              0.0490

Biểu đồ

ggplot(data,aes(NAME_HOUSING_TYPE))+
  geom_bar(color = "lightblue", fill = "lavender")+geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Housing")

Theo như biểu đồ, khách hàng có nhà riêng/căn hộ chiếm tỷ lệ cao nhất (88,51%) và thấp nhất là khách hàng ở căn hộ hợp tác xã, chiếm tỷ lệ 1,07%.

5.3.8 Biến NAME_EDUCATION_TYPE (Trình độ học vấn)

Bảng tần số

table(data$NAME_EDUCATION_TYPE)
## 
##               Academic degree              Higher education 
##                             8                          2415 
##             Incomplete higher               Lower secondary 
##                           315                           135 
## Secondary / secondary special 
##                          7127

Theo kết quả thống kê:

  • Có 8 khách hàng có bằng cấp học thuật

  • Có 2415 khách hàng đã hoàn thành Đại học

  • Có 315 khách hàng chưa hoàn thành Đại học

  • Có 135 khách hàng dưới trình độ trung học cơ sở

  • Có 7127 khách hàng trình độ Trung học/Trung cấp

  • Có 31 khách hàng sống cùng cha mẹ

Bảng tần suất

table(data$NAME_EDUCATION_TYPE)/sum(table(data$NAME_EDUCATION_TYPE))
## 
##               Academic degree              Higher education 
##                        0.0008                        0.2415 
##             Incomplete higher               Lower secondary 
##                        0.0315                        0.0135 
## Secondary / secondary special 
##                        0.7127

Biểu đồ

ggplot(data,aes(NAME_EDUCATION_TYPE))+
  geom_bar(color = "lightblue", fill = "lavender")+geom_text(aes(label = scales :: percent(after_stat(count/sum(count)))), stat=  'count', color = 'black', vjust = -.5)+
  ylab("Number of Customer")+ xlab("Education")

Theo đồ thị, khách hàng thuộc trình độ Trung học/Trung cấp chiếm tỷ lệ cao nhất (71,3%) và thấp nhất là nhóm khách hàng có các bằng cấp học vị (0,1%).

5.3.9 Thống kê mô tả các biến định lượng

data1<-data.frame(data$AMT_ANNUITY, data$AMT_CREDIT, data$AMT_INCOME_TOTAL, data$CNT_CHILDREN)
summary(data1)
##  data.AMT_ANNUITY data.AMT_CREDIT   data.AMT_INCOME_TOTAL data.CNT_CHILDREN
##  Min.   :  2596   Min.   :  45000   Min.   :  25650       Min.   :0.0000   
##  1st Qu.: 16434   1st Qu.: 270000   1st Qu.: 112500       1st Qu.:0.0000   
##  Median : 24971   Median : 513000   Median : 144000       Median :0.0000   
##  Mean   : 27088   Mean   : 600753   Mean   : 167449       Mean   :0.4163   
##  3rd Qu.: 34637   3rd Qu.: 810000   3rd Qu.: 202500       3rd Qu.:1.0000   
##  Max.   :135936   Max.   :2961000   Max.   :1935000       Max.   :7.0000

Từ bảng thống kê mô tả cho thấy:

  • Cột AMT_ANNUITY cho thấy thông tin về các khoản trả hàng tháng. Trung vị (Median) là 24971, tức là khoảng 50% số khoản trả hàng tháng nhỏ hơn giá trị này và 50% số khoản trả hàng tháng lớn hơn. Giá trị trung bình (Mean) là 27088, là tổng của tất cả các khoản trả hàng tháng chia cho số lượng khách hàng. Khoản trả hàng tháng nhỏ nhất là 2596 và lớn nhất là 2961000.

  • Cột AMT_CREDIT chứa thông tin về hạn mức tín dụng của khách hàng. Trung vị (Median) là 513000, tức là khoảng 50% số tiền tín dụng yêu cầu nhỏ hơn giá trị này và 50% số tiền tín dụng yêu cầu cao hơn. Giá trị trung bình (Mean) là 600753, là tổng của tất cả các khoản tín dụng yêu cầu chia cho số lượng khách hàng. Số tiền tín dụng nhỏ nhất là 25650 và lớn nhất là 2286212.

  • Cột AMT_INCOME_TOTAL thể hiện tổng thu nhập hàng năm của khách hàng. Trung vị (Median) là 144000, tức là khoảng 50% số thu nhập hàng năm nhỏ hơn giá trị này và 50% số thu nhập hàng năm cao hơn. Giá trị trung bình (Mean) là 167449, là tổng của tất cả thu nhập hàng năm chia cho số lượng khách hàng. Thu nhập hàng năm nhỏ nhất là 31500 và lớn nhất là 1935000.

  • Cột CNT_CHILDREN thể hiện số lượng con nhỏ của khách hàng. Trung vị (Median) là 0, tức là khoảng 50% số lượng con nhỏ nhỏ hơn giá trị này và 50% số lượng con nhỏ cao hơn. Giá trị trung bình (Mean) là 0.4163, là tổng của tất cả số lượng con nhỏ chia cho số lượng khách hàng. Số lượng con nhỏ nhỏ nhất là 0 và lớn nhất là 7.

  • Các giá trị “Trung vị 1” và “Trung vị 3” thể hiện phạm vi giữa giá trị nhỏ nhất và trung vị, cũng như giữa trung vị và giá trị lớn nhất. Nó giúp ta hiểu rõ hơn về phân bố của dữ liệu trong từng cột và xác định các vùng dữ liệu chứa phần lớn các giá trị.

hist(data$AMT_ANNUITY, col="lightblue")

hist(data$AMT_CREDIT, col="lightblue")

hist(data$AMT_INCOME_TOTAL, col="lightblue")

hist(data$CNT_CHILDREN, col="lightblue")

5.4 Phân tích thống kê mô tả biến phụ thuộc với các biến độc lập

5.4.1 Thống kê mô tả NAME_CONTRACT_TYPE & CODE_GENDER

5.4.1.1 Bảng tần số, tần suất và biểu đồ

Bảng tần số

CODE_GENDER <- table(data$CODE_GENDER, data$NAME_CONTRACT_TYPE)
CODE_GENDER
##    
##     Cash Credit
##   F 4336   2253
##   M 2163   1248
  • Có 4336 khách hàng nữ vay tiền mặt và 2253 vay tín dụng.

  • Có 2163 khách hàng nam vay tiền mặt và 1248 vay tín dụng.

Bảng tần suất

CODE_GENDER1 <- prop.table(CODE_GENDER)
CODE_GENDER1
##    
##       Cash Credit
##   F 0.4336 0.2253
##   M 0.2163 0.1248

Phân phối biến

addmargins(CODE_GENDER)
##      
##        Cash Credit   Sum
##   F    4336   2253  6589
##   M    2163   1248  3411
##   Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE)
k |> ggplot(aes(x=data$CODE_GENDER,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "CODE_GENDER",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(CODE_GENDER)
## $data
##        
##         Cash Credit Total
##   F     4336   2253  6589
##   M     2163   1248  3411
##   Total 6499   3501 10000
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate    lower    upper
##   F 1.000000       NA       NA
##   M 1.070018 1.012308 1.131019
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M 0.01750983   0.01798724 0.01733654
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng là nam gấp 1.07 lần so với tỷ lệ người vay tín dụng là nữ.

riskratio(CODE_GENDER, rev = "c")
## $data
##        
##         Credit Cash Total
##   F       2253 4336  6589
##   M       1248 2163  3411
##   Total   3501 6499 10000
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower     upper
##   F 1.0000000        NA        NA
##   M 0.9636183 0.9343294 0.9938253
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M 0.01750983   0.01798724 0.01733654
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt là nam gấp 0.96 so với tỷ lệ người vay tiền mặt là nữ.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(CODE_GENDER)
## $data
##        
##         Cash Credit Total
##   F     4336   2253  6589
##   M     2163   1248  3411
##   Total 6499   3501 10000
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate    lower    upper
##   F  1.00000       NA       NA
##   M  1.11045 1.018536 1.210406
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   F         NA           NA         NA
##   M 0.01750983   0.01798724 0.01733654
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh giữa 2 nhóm giới tính không bằng nhau. Tỷ lệ chênh lệch của giới tính nam so với giới tính nữ là 1.11 lần.

oddsratio(CODE_GENDER, rev = 'r')
## $data
##        
##         Cash Credit Total
##   M     2163   1248  3411
##   F     4336   2253  6589
##   Total 6499   3501 10000
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower     upper
##   M 1.000000        NA        NA
##   F 0.900563 0.8261693 0.9818014
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   M         NA           NA         NA
##   F 0.01750983   0.01798724 0.01733654
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh giữa 2 nhóm giới tính không bằng nhau. Tỷ lệ chênh lệch của giới tính nữ so với giới tính nam là 0.9 lần.

5.4.2 Thống kê mô tả NAME_CONTRACT_TYPE & FLAG_OWN_CAR

5.4.2.1 Bảng tần số, tần suất và biểu đồ

Bảng tần số

FLAG_OWN_CAR <- table(data$FLAG_OWN_CAR, data$NAME_CONTRACT_TYPE)
FLAG_OWN_CAR
##    
##     Cash Credit
##   N 4352   2310
##   Y 2147   1191
  • Có 4352 khách hàng không sở hữu ô tô vay tiền mặt và 2310 vay tín dụng.

  • Có 2147 khách hàng có ô tô vay tiền mặt và 1191 vay tín dụng.

Bảng tần suất

FLAG_OWN_CAR1 <- prop.table(FLAG_OWN_CAR)
FLAG_OWN_CAR1
##    
##       Cash Credit
##   N 0.4352 0.2310
##   Y 0.2147 0.1191

Phân phối biến

addmargins(FLAG_OWN_CAR)
##      
##        Cash Credit   Sum
##   N    4352   2310  6662
##   Y    2147   1191  3338
##   Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k1 <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE)
k1 |> ggplot(aes(x=data$FLAG_OWN_CAR,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "FLAG_OWN_CAR",y = "client")

Rủi ro tương đối (Risk ratio)

riskratio(FLAG_OWN_CAR)
## $data
##        
##         Cash Credit Total
##   N     4352   2310  6662
##   Y     2147   1191  3338
##   Total 6499   3501 10000
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate     lower    upper
##   N 1.000000        NA       NA
##   Y 1.029006 0.9727497 1.088517
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   N         NA           NA         NA
##   Y  0.3201807    0.3280573  0.3200657
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng có ô tô gấp 1.03 lần so với tỷ lệ người vay tín không có ô tô.

riskratio(FLAG_OWN_CAR, rev = "c")
## $data
##        
##         Credit Cash Total
##   N       2310 4352  6662
##   Y       1191 2147  3338
##   Total   3501 6499 10000
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate    lower    upper
##   N 1.0000000       NA       NA
##   Y 0.9846037 0.954805 1.015332
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   N         NA           NA         NA
##   Y  0.3201807    0.3280573  0.3200657
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt có ô tô gấp 0.98 so với tỷ lệ người vay tiền mặt không ô tô.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(FLAG_OWN_CAR)
## $data
##        
##         Cash Credit Total
##   N     4352   2310  6662
##   Y     2147   1191  3338
##   Total 6499   3501 10000
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower    upper
##   N 1.000000        NA       NA
##   Y 1.045124 0.9579878 1.139985
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   N         NA           NA         NA
##   Y  0.3201807    0.3280573  0.3200657
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch của khách hàng có ô tô so với khách hàng không ô tô là 1.05 lần.

oddsratio(FLAG_OWN_CAR, rev = 'r')
## $data
##        
##         Cash Credit Total
##   Y     2147   1191  3338
##   N     4352   2310  6662
##   Total 6499   3501 10000
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower    upper
##   Y 1.0000000        NA       NA
##   N 0.9568241 0.8772049 1.043855
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   Y         NA           NA         NA
##   N  0.3201807    0.3280573  0.3200657
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch của khách hàng không ô tô so với khách hàng có ô tô là 0.96 lần.

5.4.3 Thống kê mô tả NAME_CONTRACT_TYPE & FLAG_OWN_REALTY

5.4.3.1 Bảng tần số, tần suất và biểu đồ

Bảng tần số

FLAG_OWN_REALTY <- table(data$FLAG_OWN_REALTY, data$NAME_CONTRACT_TYPE)
FLAG_OWN_REALTY
##    
##     Cash Credit
##   N 1990   1035
##   Y 4509   2466
  • Có 1990 khách hàng không sở hữu bất động sản vay tiền mặt và 1305 vay tín dụng.

  • Có 4509 khách hàng có bất động sản vay tiền mặt và 2466 vay tín dụng.

Bảng tần suất

FLAG_OWN_REALTY1 <- prop.table(FLAG_OWN_REALTY)
FLAG_OWN_REALTY1
##    
##       Cash Credit
##   N 0.1990 0.1035
##   Y 0.4509 0.2466

Phân phối biến

addmargins(FLAG_OWN_REALTY)
##      
##        Cash Credit   Sum
##   N    1990   1035  3025
##   Y    4509   2466  6975
##   Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE)
k |> ggplot(aes(x=data$FLAG_OWN_REALTY,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "FLAG_OWN_REALTY",y = "client")

Rủi ro tương đối (Risk ratio)

riskratio(FLAG_OWN_REALTY)
## $data
##        
##         Cash Credit Total
##   N     1990   1035  3025
##   Y     4509   2466  6975
##   Total 6499   3501 10000
## 
## $measure
##    risk ratio with 95% C.I.
##     estimate     lower    upper
##   N 1.000000        NA       NA
##   Y 1.033318 0.9743832 1.095817
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   N         NA           NA         NA
##   Y  0.2723527    0.2734721  0.2723107
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng có bất động sản gấp 1.03 lần so với tỷ lệ người vay tín dụng không có bất động sản.

riskratio(FLAG_OWN_REALTY, rev = "c")
## $data
##        
##         Credit Cash Total
##   N       1035 1990  3025
##   Y       2466 4509  6975
##   Total   3501 6499 10000
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower    upper
##   N 1.0000000        NA       NA
##   Y 0.9826714 0.9526654 1.013623
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   N         NA           NA         NA
##   Y  0.2723527    0.2734721  0.2723107
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt có bất động sản gấp 0.98 so với tỷ lệ người vay tiền mặt không có bất động sản.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(FLAG_OWN_REALTY)
## $data
##        
##         Cash Credit Total
##   N     1990   1035  3025
##   Y     4509   2466  6975
##   Total 6499   3501 10000
## 
## $measure
##    odds ratio with 95% C.I.
##     estimate     lower    upper
##   N 1.000000        NA       NA
##   Y 1.051487 0.9614235 1.150446
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   N         NA           NA         NA
##   Y  0.2723527    0.2734721  0.2723107
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch của khách hàng có bất động sản so với khách hàng không có bất động sản là 1.051 lần.

oddsratio(FLAG_OWN_REALTY, rev = 'r')
## $data
##        
##         Cash Credit Total
##   Y     4509   2466  6975
##   N     1990   1035  3025
##   Total 6499   3501 10000
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower    upper
##   Y 1.0000000        NA       NA
##   N 0.9510228 0.8692282 1.040124
## 
## $p.value
##    two-sided
##     midp.exact fisher.exact chi.square
##   Y         NA           NA         NA
##   N  0.2723527    0.2734721  0.2723107
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch của khách hàng không có bất động sản so với khách hàng có bất động sản là 0.95 lần

5.4.4 Thống kê mô tả NAME_CONTRACT_TYPE & NAME_INCOME_TYPE

5.4.4.1 Bảng tần số, tần suất và biểu đồ

install.packages("dplyr")
## Installing package into 'C:/Users/HP/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'dplyr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'dplyr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\HP\AppData\Local\R\win-library\4.3\00LOCK\dplyr\libs\x64\dplyr.dll to
## C:\Users\HP\AppData\Local\R\win-library\4.3\dplyr\libs\x64\dplyr.dll:
## Permission denied
## Warning: restored 'dplyr'
## 
## The downloaded binary packages are in
##  C:\Users\HP\AppData\Local\Temp\Rtmp2zjHJe\downloaded_packages
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.1
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
NAME_INCOME_TYPE1 <- data %>% mutate(NAME_INCOME_TYPE = case_when(NAME_INCOME_TYPE == "Commercial associate" ~ 3, NAME_INCOME_TYPE == "State servant" ~ 3, NAME_INCOME_TYPE == "Working" ~ 3, NAME_INCOME_TYPE == "Unemployed" ~ 4, NAME_INCOME_TYPE == "Pensioner" ~ 4))
NAME_INCOME_TYPE2 <-cut(NAME_INCOME_TYPE1$NAME_INCOME_TYPE, breaks=c(0,3,4), labels=c('Yes', 'No'))
table(NAME_INCOME_TYPE2)
## NAME_INCOME_TYPE2
##  Yes   No 
## 8226 1774

Bảng tần số

NAME_INCOME_TYPE <- table(NAME_INCOME_TYPE2, data$NAME_CONTRACT_TYPE)
NAME_INCOME_TYPE
##                  
## NAME_INCOME_TYPE2 Cash Credit
##               Yes 5280   2946
##               No  1219    555
  • Có 5280 khách hàng có việc làm vay tiền mặt và 2946 vay tín dụng.

  • Có 1219 khách hàng chưa/đã từng có việc làm vay tiền mặt và 555 vay tín dụng.

Bảng tần suất

NAME_INCOME_TYPE3 <- prop.table(NAME_INCOME_TYPE)
NAME_INCOME_TYPE3
##                  
## NAME_INCOME_TYPE2   Cash Credit
##               Yes 0.5280 0.2946
##               No  0.1219 0.0555

Phân phối biến

addmargins(NAME_INCOME_TYPE)
##                  
## NAME_INCOME_TYPE2  Cash Credit   Sum
##               Yes  5280   2946  8226
##               No   1219    555  1774
##               Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)
k3 <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, NAME_INCOME_TYPE2)
k3 |> ggplot(aes(x=NAME_INCOME_TYPE2,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "NAME_INCOME_TYPE",y = "client")

Rủi ro tương đối (Risk ratio)

riskratio(NAME_INCOME_TYPE)
## $data
##                  
## NAME_INCOME_TYPE2 Cash Credit Total
##             Yes   5280   2946  8226
##             No    1219    555  1774
##             Total 6499   3501 10000
## 
## $measure
##                  risk ratio with 95% C.I.
## NAME_INCOME_TYPE2  estimate     lower     upper
##               Yes 1.0000000        NA        NA
##               No  0.8735652 0.8106171 0.9414015
## 
## $p.value
##                  two-sided
## NAME_INCOME_TYPE2   midp.exact fisher.exact   chi.square
##               Yes           NA           NA           NA
##               No  0.0002638858 0.0002904651 0.0002875231
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người đã từng/chưa có việc làm vay tín dụng gấp 0.87 lần tỷ lệ người có việc làm vay tín dụng.

riskratio(NAME_INCOME_TYPE, rev = "c")
## $data
##                  
## NAME_INCOME_TYPE2 Credit Cash Total
##             Yes     2946 5280  8226
##             No       555 1219  1774
##             Total   3501 6499 10000
## 
## $measure
##                  risk ratio with 95% C.I.
## NAME_INCOME_TYPE2 estimate    lower    upper
##               Yes 1.000000       NA       NA
##               No  1.070545 1.033408 1.109016
## 
## $p.value
##                  two-sided
## NAME_INCOME_TYPE2   midp.exact fisher.exact   chi.square
##               Yes           NA           NA           NA
##               No  0.0002638858 0.0002904651 0.0002875231
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người đã từng/chưa có việc làm vay tiền mặt gấp 1.07 lần tỷ lệ người có việc làm vay tiền mặt.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(NAME_INCOME_TYPE)
## $data
##                  
## NAME_INCOME_TYPE2 Cash Credit Total
##             Yes   5280   2946  8226
##             No    1219    555  1774
##             Total 6499   3501 10000
## 
## $measure
##                  odds ratio with 95% C.I.
## NAME_INCOME_TYPE2  estimate     lower     upper
##               Yes 1.0000000        NA        NA
##               No  0.8161241 0.7307217 0.9106008
## 
## $p.value
##                  two-sided
## NAME_INCOME_TYPE2   midp.exact fisher.exact   chi.square
##               Yes           NA           NA           NA
##               No  0.0002638858 0.0002904651 0.0002875231
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng đã từng/chưa có việc so với khách hàng có việc làm vay tín dụng là 0.82 lần.

oddsratio(NAME_INCOME_TYPE, rev = 'r')
## $data
##                  
## NAME_INCOME_TYPE2 Cash Credit Total
##             No    1219    555  1774
##             Yes   5280   2946  8226
##             Total 6499   3501 10000
## 
## $measure
##                  odds ratio with 95% C.I.
## NAME_INCOME_TYPE2 estimate    lower   upper
##               No  1.000000       NA      NA
##               Yes 1.225322 1.098176 1.36851
## 
## $p.value
##                  two-sided
## NAME_INCOME_TYPE2   midp.exact fisher.exact   chi.square
##               No            NA           NA           NA
##               Yes 0.0002638858 0.0002904651 0.0002875231
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh giữa khách hàng có việc làm so với khách hàng đã từng/chưa có việc vay tín dụng là 1.23 lần.

5.4.5 Thống kê mô tả NAME_CONTRACT_TYPE & NAME_TYPE_SUITE

5.4.5.1 Bảng tần số, tần suất và biểu đồ

Bảng tần số

NAME_TYPE_SUITE1 <- data %>% mutate(NAME_TYPE_SUITE = case_when(NAME_TYPE_SUITE == "Children" ~ 3, NAME_TYPE_SUITE == "Family" ~ 3, NAME_TYPE_SUITE == "Group of people" ~ 3, NAME_TYPE_SUITE == "Spouse, partner" ~ 3, NAME_TYPE_SUITE == "Unaccompanied" ~ 4))
NAME_TYPE_SUITE3 <-cut(NAME_TYPE_SUITE1$NAME_TYPE_SUITE, breaks=c(0,3,4), labels=c('Yes', 'No'))
table(NAME_TYPE_SUITE3)
## NAME_TYPE_SUITE3
##  Yes   No 
## 1905 8095
NAME_TYPE_SUITE <- table(NAME_TYPE_SUITE3, data$NAME_CONTRACT_TYPE)
NAME_TYPE_SUITE
##                 
## NAME_TYPE_SUITE3 Cash Credit
##              Yes 1228    677
##              No  5271   2824
  • Có 1228 khách hàng có người thụ hưởng vay tiền mặt và 677 vay tín dụng.

  • Có 5271 khách hàng không có người thụ hưởng vay tiền mặt và 2824 vay tín dụng. Bảng tần suất

NAME_TYPE_SUITE2 <- prop.table(NAME_TYPE_SUITE)
NAME_TYPE_SUITE2
##                 
## NAME_TYPE_SUITE3   Cash Credit
##              Yes 0.1228 0.0677
##              No  0.5271 0.2824

Phân phối biến

addmargins(NAME_TYPE_SUITE)
##                 
## NAME_TYPE_SUITE3  Cash Credit   Sum
##              Yes  1228    677  1905
##              No   5271   2824  8095
##              Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, NAME_TYPE_SUITE3)
k |> ggplot(aes(x=NAME_TYPE_SUITE3,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "NAME_TYPE_SUITE",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(NAME_TYPE_SUITE)
## $data
##                 
## NAME_TYPE_SUITE3 Cash Credit Total
##            Yes   1228    677  1905
##            No    5271   2824  8095
##            Total 6499   3501 10000
## 
## $measure
##                 risk ratio with 95% C.I.
## NAME_TYPE_SUITE3  estimate     lower    upper
##              Yes 1.0000000        NA       NA
##              No  0.9816443 0.9176571 1.050093
## 
## $p.value
##                 two-sided
## NAME_TYPE_SUITE3 midp.exact fisher.exact chi.square
##              Yes         NA           NA         NA
##              No   0.5905744    0.5935129  0.5912447
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng không có người thụ hưởng gấp 0.98 lần so với tỷ lệ người vay tín dụng có người thụ hưởng.

riskratio(NAME_TYPE_SUITE, rev = "c")
## $data
##                 
## NAME_TYPE_SUITE3 Credit Cash Total
##            Yes      677 1228  1905
##            No      2824 5271  8095
##            Total   3501 6499 10000
## 
## $measure
##                 risk ratio with 95% C.I.
## NAME_TYPE_SUITE3 estimate     lower    upper
##              Yes  1.00000        NA       NA
##              No   1.01012 0.9734682 1.048151
## 
## $p.value
##                 two-sided
## NAME_TYPE_SUITE3 midp.exact fisher.exact chi.square
##              Yes         NA           NA         NA
##              No   0.5905744    0.5935129  0.5912447
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt không có người thụ hưởng gấp 1.01 lần so với tỷ lệ người vay tiền mặt có người thụ hưởng.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(NAME_TYPE_SUITE)
## $data
##                 
## NAME_TYPE_SUITE3 Cash Credit Total
##            Yes   1228    677  1905
##            No    5271   2824  8095
##            Total 6499   3501 10000
## 
## $measure
##                 odds ratio with 95% C.I.
## NAME_TYPE_SUITE3  estimate    lower    upper
##              Yes 1.0000000       NA       NA
##              No  0.9717355 0.875706 1.079004
## 
## $p.value
##                 two-sided
## NAME_TYPE_SUITE3 midp.exact fisher.exact chi.square
##              Yes         NA           NA         NA
##              No   0.5905744    0.5935129  0.5912447
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng không có người thụ hưởng so với khách hàng có người thụ hưởng vay tín dụng là 0.97 lần.

oddsratio(NAME_TYPE_SUITE, rev = 'r')
## $data
##                 
## NAME_TYPE_SUITE3 Cash Credit Total
##            No    5271   2824  8095
##            Yes   1228    677  1905
##            Total 6499   3501 10000
## 
## $measure
##                 odds ratio with 95% C.I.
## NAME_TYPE_SUITE3 estimate     lower    upper
##              No  1.000000        NA       NA
##              Yes 1.029111 0.9267808 1.141936
## 
## $p.value
##                 two-sided
## NAME_TYPE_SUITE3 midp.exact fisher.exact chi.square
##              No          NA           NA         NA
##              Yes  0.5905744    0.5935129  0.5912447
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có người thụ hưởng so với khách hàng không có người thụ hưởng vay tín dụng là 1.03 lần.

5.4.6 Thống kê mô tả NAME_CONTRACT_TYPE & NAME_HOUSING_TYPE

5.4.6.1 Bảng tần số, tần suất và biểu đồ

Bảng tần số

NAME_HOUSING_TYPE1 <- data %>% mutate(NAME_HOUSING_TYPE = case_when(NAME_HOUSING_TYPE == "House / apartment" ~ 3, NAME_HOUSING_TYPE == "Co-op apartment" ~ 4, NAME_HOUSING_TYPE == "Municipal apartment" ~ 4, NAME_HOUSING_TYPE == "Office apartment" ~ 4, NAME_HOUSING_TYPE == "Rented apartment" ~ 4, NAME_HOUSING_TYPE == "With parents" ~ 4))
NAME_HOUSING_TYPE3 <-cut(NAME_HOUSING_TYPE1$NAME_HOUSING_TYPE, breaks=c(0,3,4), labels=c('Yes', 'No'))
table(NAME_HOUSING_TYPE3)
## NAME_HOUSING_TYPE3
##  Yes   No 
## 8851 1149
NAME_HOUSING_TYPE <- table(NAME_HOUSING_TYPE3, data$NAME_CONTRACT_TYPE)
NAME_HOUSING_TYPE
##                   
## NAME_HOUSING_TYPE3 Cash Credit
##                Yes 5744   3107
##                No   755    394
  • Có 5744 khách hàng có căn hộ riêng vay tiền mặt và 3107 vay tín dụng.

  • Có 755 khách hàng không có căn hộ riêng vay tiền mặt và 394 vay tín dụng.

Bảng tần suất

NAME_HOUSING_TYPE2 <- prop.table(NAME_HOUSING_TYPE)
NAME_HOUSING_TYPE2
##                   
## NAME_HOUSING_TYPE3   Cash Credit
##                Yes 0.5744 0.3107
##                No  0.0755 0.0394

Phân phối biến

addmargins(NAME_HOUSING_TYPE)
##                   
## NAME_HOUSING_TYPE3  Cash Credit   Sum
##                Yes  5744   3107  8851
##                No    755    394  1149
##                Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, NAME_HOUSING_TYPE3)
k |> ggplot(aes(x=NAME_HOUSING_TYPE3,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "NAME_HOUSING_TYPE",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(NAME_HOUSING_TYPE)
## $data
##                   
## NAME_HOUSING_TYPE3 Cash Credit Total
##              Yes   5744   3107  8851
##              No     755    394  1149
##              Total 6499   3501 10000
## 
## $measure
##                   risk ratio with 95% C.I.
## NAME_HOUSING_TYPE3  estimate     lower    upper
##                Yes 1.0000000        NA       NA
##                No  0.9768486 0.8973322 1.063411
## 
## $p.value
##                   two-sided
## NAME_HOUSING_TYPE3 midp.exact fisher.exact chi.square
##                Yes         NA           NA         NA
##                No   0.5883502     0.599048   0.586904
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng không có căn hộ riêng gấp 0.98 lần so với tỷ lệ người vay tín dụng có căn hộ riêng.

riskratio(NAME_HOUSING_TYPE, rev = "c")
## $data
##                   
## NAME_HOUSING_TYPE3 Credit Cash Total
##              Yes     3107 5744  8851
##              No       394  755  1149
##              Total   3501 6499 10000
## 
## $measure
##                   risk ratio with 95% C.I.
## NAME_HOUSING_TYPE3 estimate     lower    upper
##                Yes 1.000000        NA       NA
##                No  1.012523 0.9684618 1.058589
## 
## $p.value
##                   two-sided
## NAME_HOUSING_TYPE3 midp.exact fisher.exact chi.square
##                Yes         NA           NA         NA
##                No   0.5883502     0.599048   0.586904
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt không có căn hộ riêng gấp 1.01 lần so với tỷ lệ người vay tiền mặt có căn hộ riêng.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(NAME_HOUSING_TYPE)
## $data
##                   
## NAME_HOUSING_TYPE3 Cash Credit Total
##              Yes   5744   3107  8851
##              No     755    394  1149
##              Total 6499   3501 10000
## 
## $measure
##                   odds ratio with 95% C.I.
## NAME_HOUSING_TYPE3  estimate     lower    upper
##                Yes 1.0000000        NA       NA
##                No  0.9649328 0.8471736 1.097577
## 
## $p.value
##                   two-sided
## NAME_HOUSING_TYPE3 midp.exact fisher.exact chi.square
##                Yes         NA           NA         NA
##                No   0.5883502     0.599048   0.586904
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng không có căn hộ riêng so với khách hàng có căn hộ riêng vay tín dụng là 0.96 lần.

oddsratio(NAME_HOUSING_TYPE, rev = 'r')
## $data
##                   
## NAME_HOUSING_TYPE3 Cash Credit Total
##              No     755    394  1149
##              Yes   5744   3107  8851
##              Total 6499   3501 10000
## 
## $measure
##                   odds ratio with 95% C.I.
## NAME_HOUSING_TYPE3 estimate     lower    upper
##                No  1.000000        NA       NA
##                Yes 1.036336 0.9110977 1.180396
## 
## $p.value
##                   two-sided
## NAME_HOUSING_TYPE3 midp.exact fisher.exact chi.square
##                No          NA           NA         NA
##                Yes  0.5883502     0.599048   0.586904
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có căn hộ riêng so với khách hàng không có căn hộ riêng vay tín dụng là 1.037 lần.

5.4.7 Thống kê mô tả NAME_CONTRACT_TYPE & NAME_EDUCATION_TYPE

5.4.7.1 Bảng tần số, tần suất và biểu đồ

Bảng tần số

NAME_EDUCATION_TYPE1 <- data %>% mutate(NAME_EDUCATION_TYPE = case_when(NAME_EDUCATION_TYPE == "Academic degree" ~ 3, NAME_EDUCATION_TYPE == "Higher education" ~ 3, NAME_EDUCATION_TYPE == "Incomplete higher" ~ 4, NAME_EDUCATION_TYPE == "Lower secondary" ~ 4, NAME_EDUCATION_TYPE == "Secondary / secondary special" ~ 4))
NAME_EDUCATION_TYPE3 <-cut(NAME_EDUCATION_TYPE1$NAME_EDUCATION_TYPE, breaks=c(0,3,4), labels=c('Yes', 'No'))
table(NAME_EDUCATION_TYPE3)
## NAME_EDUCATION_TYPE3
##  Yes   No 
## 2423 7577
NAME_EDUCATION_TYPE <- table(NAME_EDUCATION_TYPE3, data$NAME_CONTRACT_TYPE)
NAME_EDUCATION_TYPE
##                     
## NAME_EDUCATION_TYPE3 Cash Credit
##                  Yes 1514    909
##                  No  4985   2592
  • Có 1514 khách hàng có bằng Cử nhân trở lên vay tiền mặt và 909 vay tín dụng.

  • Có 4985 khách hàng dưới trình độ Cử nhân vay tiền mặt và 2592 vay tín dụng.

Bảng tần suất

NAME_EDUCATION_TYPE2 <- prop.table(NAME_EDUCATION_TYPE)
NAME_EDUCATION_TYPE2
##                     
## NAME_EDUCATION_TYPE3   Cash Credit
##                  Yes 0.1514 0.0909
##                  No  0.4985 0.2592

Phân phối biến

addmargins(NAME_EDUCATION_TYPE)
##                     
## NAME_EDUCATION_TYPE3  Cash Credit   Sum
##                  Yes  1514    909  2423
##                  No   4985   2592  7577
##                  Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, NAME_EDUCATION_TYPE3)
k |> ggplot(aes(x=NAME_EDUCATION_TYPE3,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "NAME_EDUCATION_TYPE",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(NAME_EDUCATION_TYPE)
## $data
##                     
## NAME_EDUCATION_TYPE3 Cash Credit Total
##                Yes   1514    909  2423
##                No    4985   2592  7577
##                Total 6499   3501 10000
## 
## $measure
##                     risk ratio with 95% C.I.
## NAME_EDUCATION_TYPE3  estimate     lower     upper
##                  Yes 1.0000000        NA        NA
##                  No  0.9118581 0.8586436 0.9683705
## 
## $p.value
##                     two-sided
## NAME_EDUCATION_TYPE3  midp.exact fisher.exact  chi.square
##                  Yes          NA           NA          NA
##                  No  0.003074473   0.00307619 0.002975171
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng dưới trình độ Cử nhân gấp 0.91 lần so với tỷ lệ người vay tín dụng trình độ Cử nhân trở lên.

riskratio(NAME_EDUCATION_TYPE, rev = "c")
## $data
##                     
## NAME_EDUCATION_TYPE3 Credit Cash Total
##                Yes      909 1514  2423
##                No      2592 4985  7577
##                Total   3501 6499 10000
## 
## $measure
##                     risk ratio with 95% C.I.
## NAME_EDUCATION_TYPE3 estimate    lower    upper
##                  Yes  1.00000       NA       NA
##                  No   1.05292 1.016844 1.090276
## 
## $p.value
##                     two-sided
## NAME_EDUCATION_TYPE3  midp.exact fisher.exact  chi.square
##                  Yes          NA           NA          NA
##                  No  0.003074473   0.00307619 0.002975171
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt dưới trình độ Cử nhân gấp 1.05 lần so với tỷ lệ người vay tín dụng trình độ Cử nhân trở lên.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(NAME_EDUCATION_TYPE)
## $data
##                     
## NAME_EDUCATION_TYPE3 Cash Credit Total
##                Yes   1514    909  2423
##                No    4985   2592  7577
##                Total 6499   3501 10000
## 
## $measure
##                     odds ratio with 95% C.I.
## NAME_EDUCATION_TYPE3  estimate     lower     upper
##                  Yes 1.0000000        NA        NA
##                  No  0.8659883 0.7876992 0.9524506
## 
## $p.value
##                     two-sided
## NAME_EDUCATION_TYPE3  midp.exact fisher.exact  chi.square
##                  Yes          NA           NA          NA
##                  No  0.003074473   0.00307619 0.002975171
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng dưới trình độ Cử nhân so với khách hàng từ trình độ Cử nhân trở lên vay tín dụng là 0.87 lần.

oddsratio(NAME_EDUCATION_TYPE, rev = 'r')
## $data
##                     
## NAME_EDUCATION_TYPE3 Cash Credit Total
##                No    4985   2592  7577
##                Yes   1514    909  2423
##                Total 6499   3501 10000
## 
## $measure
##                     odds ratio with 95% C.I.
## NAME_EDUCATION_TYPE3 estimate    lower   upper
##                  No  1.000000       NA      NA
##                  Yes 1.154736 1.049923 1.26952
## 
## $p.value
##                     two-sided
## NAME_EDUCATION_TYPE3  midp.exact fisher.exact  chi.square
##                  No           NA           NA          NA
##                  Yes 0.003074473   0.00307619 0.002975171
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng từ trình độ Cử nhân trở lên so với khách hàng dưới Cử nhân vay tín dụng là 1.54 lần.

5.4.8 Thống kê mô tả NAME_CONTRACT_TYPE & AMT_ANNUITY

5.4.8.1 Bảng tần số, tần suất và biểu đồ

AMT_ANNUITY1 <- cut(data$AMT_ANNUITY, breaks = c(-Inf,30000,135936), labels = c('2596 - 30000', '>30000'))
table(AMT_ANNUITY1)
## AMT_ANNUITY1
## 2596 - 30000       >30000 
##         6450         3550

Bảng tần số

AMT_ANNUITY <- table(AMT_ANNUITY1, data$NAME_CONTRACT_TYPE)
AMT_ANNUITY
##               
## AMT_ANNUITY1   Cash Credit
##   2596 - 30000 3985   2465
##   >30000       2514   1036
  • Có 3985 khách hàng có khoản trả hàng tháng từ 2596 đến 30000 vay tiền mặt và 2465 vay tín dụng.

  • Có 2514 khách hàng có khoản trả hàng tháng >30000 vay tiền mặt và 1036 vay tín dụng. Bảng tần suất

AMT_ANNUITY2 <- prop.table(AMT_ANNUITY)
AMT_ANNUITY2
##               
## AMT_ANNUITY1     Cash Credit
##   2596 - 30000 0.3985 0.2465
##   >30000       0.2514 0.1036

Phân phối biến

addmargins(AMT_ANNUITY)
##               
## AMT_ANNUITY1    Cash Credit   Sum
##   2596 - 30000  3985   2465  6450
##   >30000        2514   1036  3550
##   Sum           6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, AMT_ANNUITY1)
k |> ggplot(aes(x=AMT_ANNUITY1,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "AMT_ANNUITY",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(AMT_ANNUITY)
## $data
##               
## AMT_ANNUITY1   Cash Credit Total
##   2596 - 30000 3985   2465  6450
##   >30000       2514   1036  3550
##   Total        6499   3501 10000
## 
## $measure
##               risk ratio with 95% C.I.
## AMT_ANNUITY1    estimate     lower     upper
##   2596 - 30000 1.0000000        NA        NA
##   >30000       0.7636145 0.7192129 0.8107574
## 
## $p.value
##               two-sided
## AMT_ANNUITY1   midp.exact fisher.exact  chi.square
##   2596 - 30000         NA           NA          NA
##   >30000                0 7.374791e-20 1.27381e-19
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tín dụng có khoản trả hàng tháng từ 30000 trở xuống gấp 0.76 lần so với tỷ lệ người vay tín dụng có khoản trả hàng tháng dưới 30000.

riskratio(AMT_ANNUITY, rev = "c")
## $data
##               
## AMT_ANNUITY1   Credit Cash Total
##   2596 - 30000   2465 3985  6450
##   >30000         1036 2514  3550
##   Total          3501 6499 10000
## 
## $measure
##               risk ratio with 95% C.I.
## AMT_ANNUITY1   estimate    lower    upper
##   2596 - 30000 1.000000       NA       NA
##   >30000       1.146221 1.113974 1.179401
## 
## $p.value
##               two-sided
## AMT_ANNUITY1   midp.exact fisher.exact  chi.square
##   2596 - 30000         NA           NA          NA
##   >30000                0 7.374791e-20 1.27381e-19
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ người vay tiền mặt có khoản trả hàng tháng từ 30000 trở xuống gấp 1.15 lần so với tỷ lệ người vay tiền mặt có khoản trả hàng tháng dưới 30000.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(AMT_ANNUITY)
## $data
##               
## AMT_ANNUITY1   Cash Credit Total
##   2596 - 30000 3985   2465  6450
##   >30000       2514   1036  3550
##   Total        6499   3501 10000
## 
## $measure
##               odds ratio with 95% C.I.
## AMT_ANNUITY1    estimate     lower     upper
##   2596 - 30000 1.0000000        NA        NA
##   >30000       0.6662815 0.6099605 0.7274763
## 
## $p.value
##               two-sided
## AMT_ANNUITY1   midp.exact fisher.exact  chi.square
##   2596 - 30000         NA           NA          NA
##   >30000                0 7.374791e-20 1.27381e-19
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có khoản trả hàng tháng trên 30000 so với khách hàng có khoản trả hàng tháng từ 30000 trở xuống vay tín dụng là 0.67 lần.

oddsratio(AMT_ANNUITY, rev = 'r')
## $data
##               
## AMT_ANNUITY1   Cash Credit Total
##   >30000       2514   1036  3550
##   2596 - 30000 3985   2465  6450
##   Total        6499   3501 10000
## 
## $measure
##               odds ratio with 95% C.I.
## AMT_ANNUITY1   estimate    lower   upper
##   >30000       1.000000       NA      NA
##   2596 - 30000 1.500905 1.374615 1.63945
## 
## $p.value
##               two-sided
## AMT_ANNUITY1   midp.exact fisher.exact  chi.square
##   >30000               NA           NA          NA
##   2596 - 30000          0 7.374791e-20 1.27381e-19
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có khoản trả hàng tháng từ 30000 trở xuống so với khách hàng có khoản trả hàng tháng trên 30000 vay tín dụng là 1.5 lần.

5.4.9 Thống kê mô tả NAME_CONTRACT_TYPE & AMT_CREDIT

5.4.9.1 Bảng tần số, tần suất và biểu đồ

AMT_CREDIT1 <- cut(data$AMT_CREDIT, breaks = c(-Inf,400000,2961000), labels = c('45000 - 400000', '>400000'))
table(AMT_CREDIT1)
## AMT_CREDIT1
## 45000 - 400000        >400000 
##           3814           6186

Bảng tần số

AMT_CREDIT <- table(AMT_CREDIT1, data$NAME_CONTRACT_TYPE)
AMT_CREDIT
##                 
## AMT_CREDIT1      Cash Credit
##   45000 - 400000 2207   1607
##   >400000        4292   1894
  • Có 2207 khách hàng có hạn mức vay trong khoản 45000 - 400000 vay tiền mặt và 1607 vay tín dụng.

  • Có 4292 khách hàng có hạn mức vay trên 400000 vay tiền mặt và 1894 vay tín dụng.

Bảng tần suất

AMT_CREDIT2 <- prop.table(AMT_CREDIT)
AMT_CREDIT2
##                 
## AMT_CREDIT1        Cash Credit
##   45000 - 400000 0.2207 0.1607
##   >400000        0.4292 0.1894

Phân phối biến

addmargins(AMT_CREDIT)
##                 
## AMT_CREDIT1       Cash Credit   Sum
##   45000 - 400000  2207   1607  3814
##   >400000         4292   1894  6186
##   Sum             6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, AMT_CREDIT1)
k |> ggplot(aes(x=AMT_CREDIT1,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "AMT_CREDIT",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(AMT_CREDIT)
## $data
##                 
## AMT_CREDIT1      Cash Credit Total
##   45000 - 400000 2207   1607  3814
##   >400000        4292   1894  6186
##   Total          6499   3501 10000
## 
## $measure
##                 risk ratio with 95% C.I.
## AMT_CREDIT1       estimate     lower     upper
##   45000 - 400000 1.0000000        NA        NA
##   >400000        0.7266661 0.6892761 0.7660842
## 
## $p.value
##                 two-sided
## AMT_CREDIT1      midp.exact fisher.exact   chi.square
##   45000 - 400000         NA           NA           NA
##   >400000                 0 1.739582e-31 9.216053e-32
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng có hạn mức vay trên 400000 vay tín dụng gấp 0.73 lần so với khách hàng có hạn mức vay từ 400000 trở xuống vay tín dụng.

riskratio(AMT_CREDIT, rev = "c")
## $data
##                 
## AMT_CREDIT1      Credit Cash Total
##   45000 - 400000   1607 2207  3814
##   >400000          1894 4292  6186
##   Total            3501 6499 10000
## 
## $measure
##                 risk ratio with 95% C.I.
## AMT_CREDIT1      estimate    lower    upper
##   45000 - 400000 1.000000       NA       NA
##   >400000        1.199025 1.161566 1.237692
## 
## $p.value
##                 two-sided
## AMT_CREDIT1      midp.exact fisher.exact   chi.square
##   45000 - 400000         NA           NA           NA
##   >400000                 0 1.739582e-31 9.216053e-32
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng có hạn mức vay trên 400000 vay tiền mặt gấp 1.2 lần so với khách hàng có hạn mức vay từ 400000 trở xuống vay tiền mặt.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(AMT_CREDIT)
## $data
##                 
## AMT_CREDIT1      Cash Credit Total
##   45000 - 400000 2207   1607  3814
##   >400000        4292   1894  6186
##   Total          6499   3501 10000
## 
## $measure
##                 odds ratio with 95% C.I.
## AMT_CREDIT1       estimate     lower     upper
##   45000 - 400000 1.0000000        NA        NA
##   >400000        0.6060874 0.5572516 0.6591944
## 
## $p.value
##                 two-sided
## AMT_CREDIT1      midp.exact fisher.exact   chi.square
##   45000 - 400000         NA           NA           NA
##   >400000                 0 1.739582e-31 9.216053e-32
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có hạn mức vay trên 400000 so với khách hàng có hạn mức vay từ 400000 trở xuống vay tín dụng là 0.6 lần.

oddsratio(AMT_CREDIT, rev = 'r')
## $data
##                 
## AMT_CREDIT1      Cash Credit Total
##   >400000        4292   1894  6186
##   45000 - 400000 2207   1607  3814
##   Total          6499   3501 10000
## 
## $measure
##                 odds ratio with 95% C.I.
## AMT_CREDIT1      estimate    lower    upper
##   >400000        1.000000       NA       NA
##   45000 - 400000 1.649961 1.517003 1.794522
## 
## $p.value
##                 two-sided
## AMT_CREDIT1      midp.exact fisher.exact   chi.square
##   >400000                NA           NA           NA
##   45000 - 400000          0 1.739582e-31 9.216053e-32
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có hạn mức vay từ 400000 trở xuống so với khách hàng có hạn mức vay trên 400000 vay tín dụng là 1.65 lần.

5.4.10 Thống kê mô tả NAME_CONTRACT_TYPE & AMT_INCOME_TOTAL

5.4.10.1 Bảng tần số, tần suất và biểu đồ

AMT_INCOME_TOTAL1 <- cut(data$AMT_INCOME_TOTAL, breaks = c(-Inf,100000,1935000), labels = c('25650 - 100000', '>100000'))
table(AMT_INCOME_TOTAL1)
## AMT_INCOME_TOTAL1
## 25650 - 100000        >100000 
##           2139           7861

Bảng tần số

AMT_INCOME_TOTAL <- table(AMT_INCOME_TOTAL1, data$NAME_CONTRACT_TYPE)
AMT_INCOME_TOTAL
##                  
## AMT_INCOME_TOTAL1 Cash Credit
##    25650 - 100000 1381    758
##    >100000        5118   2743
  • Có 1381 khách hàng có tổng thu nhập trong khoản 25650 - 100000 vay tiền mặt và 758 vay tín dụng.

  • Có 5118 khách hàng có tổng thu nhập cao hơn 100000 vay tiền mặt và 2743 vay tín dụng.

Bảng tần suất

AMT_INCOME_TOTAL2 <- prop.table(AMT_INCOME_TOTAL)
AMT_INCOME_TOTAL2
##                  
## AMT_INCOME_TOTAL1   Cash Credit
##    25650 - 100000 0.1381 0.0758
##    >100000        0.5118 0.2743

Phân phối biến

addmargins(AMT_INCOME_TOTAL)
##                  
## AMT_INCOME_TOTAL1  Cash Credit   Sum
##    25650 - 100000  1381    758  2139
##    >100000         5118   2743  7861
##    Sum             6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, AMT_INCOME_TOTAL1)
k |> ggplot(aes(x=AMT_INCOME_TOTAL1,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "AMT_INCOME_TOTAL",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(AMT_INCOME_TOTAL)
## $data
##                  
## AMT_INCOME_TOTAL1 Cash Credit Total
##    25650 - 100000 1381    758  2139
##    >100000        5118   2743  7861
##    Total          6499   3501 10000
## 
## $measure
##                  risk ratio with 95% C.I.
## AMT_INCOME_TOTAL1  estimate     lower    upper
##    25650 - 100000 1.0000000        NA       NA
##    >100000        0.9846675 0.9229933 1.050463
## 
## $p.value
##                  two-sided
## AMT_INCOME_TOTAL1 midp.exact fisher.exact chi.square
##    25650 - 100000         NA           NA         NA
##    >100000         0.6397377    0.6454641  0.6404381
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng vay tín dụng thu nhập trên 100000 gấp 0.98 lần so với tỷ lệ khách hàng vay tín dụng thu nhập trong khoản 25650 - 100000.

riskratio(AMT_INCOME_TOTAL, rev = "c")
## $data
##                  
## AMT_INCOME_TOTAL1 Credit Cash Total
##    25650 - 100000    758 1381  2139
##    >100000          2743 5118  7861
##    Total            3501 6499 10000
## 
## $measure
##                  risk ratio with 95% C.I.
## AMT_INCOME_TOTAL1 estimate     lower    upper
##    25650 - 100000 1.000000        NA       NA
##    >100000        1.008416 0.9734182 1.044671
## 
## $p.value
##                  two-sided
## AMT_INCOME_TOTAL1 midp.exact fisher.exact chi.square
##    25650 - 100000         NA           NA         NA
##    >100000         0.6397377    0.6454641  0.6404381
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng vay tiền mạt thu nhập trên 100000 gấp 1.008 lần so với tỷ lệ khách hàng vay tiền mặt thu nhập trong khoản 25650 - 100000.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(AMT_INCOME_TOTAL)
## $data
##                  
## AMT_INCOME_TOTAL1 Cash Credit Total
##    25650 - 100000 1381    758  2139
##    >100000        5118   2743  7861
##    Total          6499   3501 10000
## 
## $measure
##                  odds ratio with 95% C.I.
## AMT_INCOME_TOTAL1  estimate     lower    upper
##    25650 - 100000 1.0000000        NA       NA
##    >100000        0.9763824 0.8836834 1.079415
## 
## $p.value
##                  two-sided
## AMT_INCOME_TOTAL1 midp.exact fisher.exact chi.square
##    25650 - 100000         NA           NA         NA
##    >100000         0.6397377    0.6454641  0.6404381
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch khách hàng có tổng thu nhập trên 100000 so với khách hàng có thu nhập trong khoản 25650 - 100000 vay tín dụng là 0.98 lần.

oddsratio(AMT_INCOME_TOTAL, rev = 'r')
## $data
##                  
## AMT_INCOME_TOTAL1 Cash Credit Total
##    >100000        5118   2743  7861
##    25650 - 100000 1381    758  2139
##    Total          6499   3501 10000
## 
## $measure
##                  odds ratio with 95% C.I.
## AMT_INCOME_TOTAL1 estimate     lower    upper
##    >100000        1.000000        NA       NA
##    25650 - 100000 1.024208 0.9264277 1.131627
## 
## $p.value
##                  two-sided
## AMT_INCOME_TOTAL1 midp.exact fisher.exact chi.square
##    >100000                NA           NA         NA
##    25650 - 100000  0.6397377    0.6454641  0.6404381
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch khách hàng có tổng thu nhập trong khoản 25650 - 100000 so với khách hàng có thu nhập trên 100000 vay tín dụng là 1.02 lần.

5.4.11 Thống kê mô tả NAME_CONTRACT_TYPE & CNT_CHILDREN

5.4.11.1 Bảng tần số, tần suất và biểu đồ

CNT_CHILDREN1 <- cut(data$CNT_CHILDREN, breaks = c(-Inf,0,7), labels = c('no', 'yes'))
table(CNT_CHILDREN1)
## CNT_CHILDREN1
##   no  yes 
## 7006 2994

Bảng tần số

CNT_CHILDREN <- table(CNT_CHILDREN1, data$NAME_CONTRACT_TYPE)
CNT_CHILDREN
##              
## CNT_CHILDREN1 Cash Credit
##           no  4596   2410
##           yes 1903   1091
  • Có 4596 khách hàng không có con vay tiền mặt và 2410 vay tín dụng.

  • Có 1903 khách hàng có con vay tiền mặt và 1091 vay tín dụng.

Bảng tần suất

CNT_CHILDREN2 <- prop.table(CNT_CHILDREN)
CNT_CHILDREN2
##              
## CNT_CHILDREN1   Cash Credit
##           no  0.4596 0.2410
##           yes 0.1903 0.1091

Phân phối biến

addmargins(CNT_CHILDREN)
##              
## CNT_CHILDREN1  Cash Credit   Sum
##           no   4596   2410  7006
##           yes  1903   1091  2994
##           Sum  6499   3501 10000

Biểu đồ cột kết hợp 2 biến

k <- data.frame(data$NAME_CONTRACT_TYPE, data$FLAG_OWN_CAR, data$CODE_GENDER, data$FLAG_OWN_REALTY, data$CNT_CHILDREN, data$AMT_INCOME_TOTAL, data$AMT_CREDIT, data$AMT_ANNUITY, data$NAME_TYPE_SUITE, data$NAME_INCOME_TYPE, data$NAME_EDUCATION_TYPE, data$NAME_FAMILY_STATUS, data$NAME_HOUSING_TYPE, CNT_CHILDREN1)
k |> ggplot(aes(x=CNT_CHILDREN1,y=after_stat(count))) + geom_bar(fill="lavender") + geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = "count", color = "navy", vjust = - .5) + facet_grid(. ~data$NAME_CONTRACT_TYPE) + labs(x = "CNT_CHILDREN",y = "client")

Rủi ro tương đối (Risk ratio)

library(epitools)
riskratio(CNT_CHILDREN)
## $data
##              
## CNT_CHILDREN1 Cash Credit Total
##         no    4596   2410  7006
##         yes   1903   1091  2994
##         Total 6499   3501 10000
## 
## $measure
##              risk ratio with 95% C.I.
## CNT_CHILDREN1 estimate    lower    upper
##           no  1.000000       NA       NA
##           yes 1.059317 1.000322 1.121792
## 
## $p.value
##              two-sided
## CNT_CHILDREN1 midp.exact fisher.exact chi.square
##           no          NA           NA         NA
##           yes 0.05044661   0.05172564 0.05009423
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng có con vay tín dụng gấp 0.05 lần tỷ lệ khách hàng không con vay tín dụng.

riskratio(CNT_CHILDREN, rev = "c")
## $data
##              
## CNT_CHILDREN1 Credit Cash Total
##         no      2410 4596  7006
##         yes     1091 1903  2994
##         Total   3501 6499 10000
## 
## $measure
##              risk ratio with 95% C.I.
## CNT_CHILDREN1  estimate     lower    upper
##           no  1.0000000        NA       NA
##           yes 0.9688959 0.9383953 1.000388
## 
## $p.value
##              two-sided
## CNT_CHILDREN1 midp.exact fisher.exact chi.square
##           no          NA           NA         NA
##           yes 0.05044661   0.05172564 0.05009423
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Tỷ lệ khách hàng có con vay tiền mặt gấp 0.97 lần tỷ lệ khách hàng không con vay tiền mặt.

Tỷ lệ chênh lệch (odd ratio)

oddsratio(CNT_CHILDREN)
## $data
##              
## CNT_CHILDREN1 Cash Credit Total
##         no    4596   2410  7006
##         yes   1903   1091  2994
##         Total 6499   3501 10000
## 
## $measure
##              odds ratio with 95% C.I.
## CNT_CHILDREN1 estimate     lower    upper
##           no   1.00000        NA       NA
##           yes  1.09336 0.9998332 1.195341
## 
## $p.value
##              two-sided
## CNT_CHILDREN1 midp.exact fisher.exact chi.square
##           no          NA           NA         NA
##           yes 0.05044661   0.05172564 0.05009423
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng có con và khách hàng không con vay tín dụng là 1.09 lần.

oddsratio(CNT_CHILDREN, rev = 'r')
## $data
##              
## CNT_CHILDREN1 Cash Credit Total
##         yes   1903   1091  2994
##         no    4596   2410  7006
##         Total 6499   3501 10000
## 
## $measure
##              odds ratio with 95% C.I.
## CNT_CHILDREN1  estimate     lower    upper
##           yes 1.0000000        NA       NA
##           no  0.9146208 0.8365813 1.000167
## 
## $p.value
##              two-sided
## CNT_CHILDREN1 midp.exact fisher.exact chi.square
##           yes         NA           NA         NA
##           no  0.05044661   0.05172564 0.05009423
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Tỷ lệ chênh lệch giữa khách hàng không con và khách hàng có con vay tín dụng là 0.91 lần.

5.5 Thống kê suy diễn cho các biến định tính

5.5.1 Biến NAME_CONTRACT_TYPE và biến CODE_GENDER

NAME_CONTRACT_TYPE1 <- ifelse(data$NAME_CONTRACT_TYPE == "Credit", 1, 0)
data <- mutate(data, NAME_CONTRACT_TYPE1)
table(data$NAME_CONTRACT_TYPE1)
## 
##    0    1 
## 6499 3501
chisq.test(table(NAME_CONTRACT_TYPE1 ,data$CODE_GENDER))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, data$CODE_GENDER)
## X-squared = 5.5572, df = 1, p-value = 0.0184

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và CODE_GENDER độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và CODE_GENDER không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.0184 < \(\alpha,\) bác bỏ giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và CODE_GENDER không độc lập nhau.

5.5.2 Biến NAME_CONTRACT_TYPE và biến FLAG_OWN_CAR

chisq.test(table(NAME_CONTRACT_TYPE1, data$FLAG_OWN_CAR))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, data$FLAG_OWN_CAR)
## X-squared = 0.94497, df = 1, p-value = 0.331

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và FLAG_OWN_CAR độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và FLAG_OWN_CAR không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.331 > \(\alpha,\) chấp nhận giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và FLAG_OWN_CAR độc lập nhau.

5.5.3 Biến NAME_CONTRACT_TYPE và biến FLAG_OWN_REALTY

chisq.test(table(NAME_CONTRACT_TYPE1, data$FLAG_OWN_REALTY))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, data$FLAG_OWN_REALTY)
## X-squared = 1.1555, df = 1, p-value = 0.2824

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và FLAG_OWN_REALTY độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và FLAG_OWN_REALTY không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.2824 > \(\alpha,\) chấp nhận giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và FLAG_OWN_REALTY độc lập nhau.

5.5.4 Biến NAME_CONTRACT_TYPE và biến NAME_INCOME_TYPE2

chisq.test(table(NAME_CONTRACT_TYPE1, NAME_INCOME_TYPE2))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, NAME_INCOME_TYPE2)
## X-squared = 12.952, df = 1, p-value = 0.0003196

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và NAME_INCOME_TYPE2 độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và NAME_INCOME_TYPE2 không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.0003485 < \(\alpha,\) bác bỏ giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và NAME_INCOME_TYPE2 không độc lập nhau.

5.5.5 Biến NAME_CONTRACT_TYPE và biến NAME_TYPE_SUITE3

chisq.test(table(NAME_CONTRACT_TYPE1, NAME_TYPE_SUITE3))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, NAME_TYPE_SUITE3)
## X-squared = 0.26045, df = 1, p-value = 0.6098

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và NAME_TYPE_SUITE3 độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và NAME_TYPE_SUITE3 không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.6098 > \(\alpha,\) chấp nhận giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và NAME_TYPE_SUITE3 độc lập nhau.

5.5.6 Biến NAME_CONTRACT_TYPE và biến NAME_HOUSING_TYPE3

chisq.test(table(NAME_CONTRACT_TYPE1, NAME_HOUSING_TYPE3))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, NAME_HOUSING_TYPE3)
## X-squared = 0.26057, df = 1, p-value = 0.6097

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và NAME_HOUSING_TYPE3 độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và NAME_HOUSING_TYPE3 không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.6097 > \(\alpha,\) chấp nhận giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và NAME_HOUSING_TYPE3 độc lập nhau.

5.5.7 Biến NAME_CONTRACT_TYPE và biến NAME_EDUCATION_TYPE3

chisq.test(table(NAME_CONTRACT_TYPE1, NAME_EDUCATION_TYPE3))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(NAME_CONTRACT_TYPE1, NAME_EDUCATION_TYPE3)
## X-squared = 8.6779, df = 1, p-value = 0.003221

Giả thuyết:

  • \(H_0:\) NAME_CONTRACT_TYPE và NAME_EDUCATION_TYPE3 độc lập

  • \(H_1:\) NAME_CONTRACT_TYPE và NAME_EDUCATION_TYPE3 không độc lập

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.003221 < \(\alpha,\) bác bỏ giả thuyết \(H_0\)

Với mức ý nghĩa 5%, NAME_CONTRACT_TYPE và NAME_EDUCATION_TYPE3 không độc lập nhau.

5.6 Khoảng ước lượng tỷ lệ

5.6.1 Ước lượng tỉ lệ hình thức vay vốn của khách hàng

Ước lượng tỷ lệ khách hàng nữ vay tín dụng đồng thời kiểm định tỷ lệ vay tín dụng của khách hàng nữ có phải là 35% hay không?

Giả thuyết:

  • \(H_0: p=0.35\)
n <- data[data$CODE_GENDER == 'F',]
prop.test(length(n$CODE_GENDER),length(data$CODE_GENDER),p= 0.35)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(n$CODE_GENDER) out of length(data$CODE_GENDER), null probability 0.35
## X-squared = 4192.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
##  0.6494985 0.6681788
## sample estimates:
##      p 
## 0.6589

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 2.2e-16 < \(\alpha,\) bác bỏ giả thuyết \(H_0\)

Với mức ý nghĩa 5%, tỷ lệ khách hàng nữ vay tín dụng không bằng 35%.

Khoảng ước lượng tỷ lệ khách hàng nữ vay tín dụng tại mức ý nghĩa 5% là (0,6494985; 0,6681788)

Ước lượng tỷ lệ khách hàng nam vay tín dụng đồng thời kiểm định tỷ lệ vay tín dụng của khách hàng nam có phải là 35% hay không?

Giả thuyết:

  • \(H_0: p=0.35\)
m <- data[data$CODE_GENDER == 'M',]
prop.test(length(m$CODE_GENDER),length(data$CODE_GENDER),p= 0.35)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(m$CODE_GENDER) out of length(data$CODE_GENDER), null probability 0.35
## X-squared = 3.4427, df = 1, p-value = 0.06353
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
##  0.3318212 0.3505015
## sample estimates:
##      p 
## 0.3411

Tại mức ý nghĩa \(\alpha=0.05\)

Ta có p_value = 0.06353 > \(\alpha,\) chấp nhận giả thuyết \(H_0\)

Với mức ý nghĩa 5%, tỷ lệ khách hàng nam vay tín dụng bằng 35%.

Khoảng ước lượng tỷ lệ khách hàng nam vay tín dụng tại mức ý nghĩa 5% là (0,3318212; 0,3505015)

5.7 Chạy mô hình hồi quy

5.8 Mô hình logit

mh1 <- glm(NAME_CONTRACT_TYPE1 ~ CODE_GENDER + NAME_INCOME_TYPE2 + NAME_EDUCATION_TYPE3 + AMT_ANNUITY1 + AMT_CREDIT1, family = binomial(link = 'logit'), data = data)
summary(mh1)
## 
## Call:
## glm(formula = NAME_CONTRACT_TYPE1 ~ CODE_GENDER + NAME_INCOME_TYPE2 + 
##     NAME_EDUCATION_TYPE3 + AMT_ANNUITY1 + AMT_CREDIT1, family = binomial(link = "logit"), 
##     data = data)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -0.14072    0.05415  -2.599 0.009362 ** 
## CODE_GENDERM            0.09958    0.04499   2.213 0.026880 *  
## NAME_INCOME_TYPE2No    -0.22405    0.05764  -3.887 0.000102 ***
## NAME_EDUCATION_TYPE3No -0.19943    0.04956  -4.024 5.73e-05 ***
## AMT_ANNUITY1>30000     -0.22098    0.05417  -4.079 4.52e-05 ***
## AMT_CREDIT1>400000     -0.41190    0.05123  -8.041 8.94e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 12950  on 9999  degrees of freedom
## Residual deviance: 12761  on 9994  degrees of freedom
## AIC: 12773
## 
## Number of Fisher Scoring iterations: 4

Mô hình:

\(Logit(\pi)=log(\frac{\pi}{1-\pi})= - 0.14072 + 0.09958CODEGENDER - 0.22405NAMEINCOMETYPE2 - 0.19943NAMEEDUCATIONTYPE3 - 0.22098AMTANNUITY - 0.41190AMTCREDIT\)

5.9 Mô hình probit

mh2 <- glm(NAME_CONTRACT_TYPE1 ~ CODE_GENDER + NAME_INCOME_TYPE2 + NAME_EDUCATION_TYPE3 + AMT_ANNUITY1 + AMT_CREDIT1, family = binomial(link = 'probit'), data = data)
summary(mh2)
## 
## Call:
## glm(formula = NAME_CONTRACT_TYPE1 ~ CODE_GENDER + NAME_INCOME_TYPE2 + 
##     NAME_EDUCATION_TYPE3 + AMT_ANNUITY1 + AMT_CREDIT1, family = binomial(link = "probit"), 
##     data = data)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -0.09077    0.03347  -2.712 0.006687 ** 
## CODE_GENDERM            0.06157    0.02759   2.231 0.025665 *  
## NAME_INCOME_TYPE2No    -0.13550    0.03499  -3.873 0.000107 ***
## NAME_EDUCATION_TYPE3No -0.12212    0.03045  -4.011 6.05e-05 ***
## AMT_ANNUITY1>30000     -0.13333    0.03285  -4.058 4.95e-05 ***
## AMT_CREDIT1>400000     -0.25424    0.03151  -8.069 7.07e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 12950  on 9999  degrees of freedom
## Residual deviance: 12761  on 9994  degrees of freedom
## AIC: 12773
## 
## Number of Fisher Scoring iterations: 4

Mô hình:

\(Probit(\pi)=\Phi-1(\pi)= - 0.09077 + 0.06157 CODEGENDER - 0.13550 NAMEINCOMETYPE2 - 0.12212 NAMEEDUCATIONTYPE3 - 0.13333 AMTANNUITY - 0.25424 AMTCREDIT\)

5.10 Mô hình cloglog

mh3 <- glm(NAME_CONTRACT_TYPE1 ~ CODE_GENDER + NAME_INCOME_TYPE2 + NAME_EDUCATION_TYPE3 + AMT_ANNUITY1 + AMT_CREDIT1, family = binomial(link = 'cloglog'), data = data)
summary(mh3)
## 
## Call:
## glm(formula = NAME_CONTRACT_TYPE1 ~ CODE_GENDER + NAME_INCOME_TYPE2 + 
##     NAME_EDUCATION_TYPE3 + AMT_ANNUITY1 + AMT_CREDIT1, family = binomial(link = "cloglog"), 
##     data = data)
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)            -0.46095    0.04220 -10.924  < 2e-16 ***
## CODE_GENDERM            0.07724    0.03606   2.142   0.0322 *  
## NAME_INCOME_TYPE2No    -0.18552    0.04744  -3.910 9.22e-05 ***
## NAME_EDUCATION_TYPE3No -0.16001    0.03945  -4.056 4.99e-05 ***
## AMT_ANNUITY1>30000     -0.18516    0.04498  -4.116 3.85e-05 ***
## AMT_CREDIT1>400000     -0.32773    0.04106  -7.982 1.44e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 12950  on 9999  degrees of freedom
## Residual deviance: 12761  on 9994  degrees of freedom
## AIC: 12773
## 
## Number of Fisher Scoring iterations: 5

Mô hình:

\(Cloglog(\pi)=log(-log({1-\pi}))= - 0.46095 + 0.07724 CODEGENDER - 0.18552 NAMEINCOMETYPE2 - 0.16001 NAMEEDUCATIONTYPE3 - 0.18516 AMTANNUITY - 0.32773 AMTCREDIT\)

5.11 Lựa chọn mô hình phù hợp

5.11.1 Chỉ số AIC (Akaike Information Criterion)

AIC(mh1)
## [1] 12773.11
AIC(mh2)
## [1] 12773.34
AIC(mh3)
## [1] 12772.79
AIC  <- c(12773.11, 12773.34, 12772.79)

Thông qua chỉ số AIC của 3 mô hình trên ta thấy mô hình cloglog có chỉ số AIC thấp nhất (12772.79). Vì thế đối với tiêu chí đánh giá AIC thì mô hình cloglog là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc NAME_CONTRACT_TYPE hơn mô hình probit và logit.

5.11.2 Deviance

deviance(mh1)
## [1] 12761.11
deviance(mh2)
## [1] 12761.34
deviance(mh3)
## [1] 12760.79
Deviance <- c( 12761.11, 12761.34, 12760.79)

Thông qua chỉ số deviance của 3 mô hình trên ta thấy mô hình cloglog có chỉ số deviance thấp nhất (12760.79). Vì thế đối với tiêu chí đánh giá devience thì mô hình cloglog là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc NAME_CONTRACT_TYPE hơn mô hình logit và probit.

5.11.3 Brier Score

install.packages("DescTools")
## Installing package into 'C:/Users/HP/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'DescTools' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'DescTools'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Users\HP\AppData\Local\R\win-library\4.3\00LOCK\DescTools\libs\x64\DescTools.dll
## to
## C:\Users\HP\AppData\Local\R\win-library\4.3\DescTools\libs\x64\DescTools.dll:
## Permission denied
## Warning: restored 'DescTools'
## 
## The downloaded binary packages are in
##  C:\Users\HP\AppData\Local\Temp\Rtmp2zjHJe\downloaded_packages
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.1
BrierScore(mh1)
## [1] 0.2232074
BrierScore(mh2)
## [1] 0.2232123
BrierScore(mh3)
## [1] 0.2232004
Brierscore <- c(0.2232074,0.2232123,0.2232004)

Thông qua chỉ số BrierScore của 3 mô hình trên ta thấy mô hình cloglog có chỉ số BrierScore thấp nhất (0.2232004). Vì thế đối với tiêu chí đánh giá BrierScore thì mô hình cloglog là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc NAME_CONTRACT_TYPE hơn mô hình logit và probit.

5.11.4 Lựa chọn mô hình

AIC  <- c(12773.11, 12773.34, 12772.79)
Deviance <- c( 12761.11, 12761.34, 12760.79)
Brierscore <- c(0.2232074,0.2232123,0.2232004)
MH <- c('logit','probit','cloglog')
KetQua <- data.frame(MH, Deviance, Brierscore, AIC)
KetQua
##        MH Deviance Brierscore      AIC
## 1   logit 12761.11  0.2232074 12773.11
## 2  probit 12761.34  0.2232123 12773.34
## 3 cloglog 12760.79  0.2232004 12772.79

Từ kết quả các chỉ số đánh giá mô hình ta có kết luận: chỉ số AIC = 12772.79; Deviance = 12760.79; chỉ số Brier = 0.2232004 của mô hình cloglog là nhỏ nhất trong ba mô hình. Điều này cho thấy trong ba mô hình hồi quy logistic trên, mô hình cloglog là tối ưu nhất.

6 Chương 5. Kết luận và khuyến nghị

6.1 Kết luận

Sau khi thực hiện hồi quy và lựa chọn mô hình phù hợp nhất trong 3 mô hình (logit, probit, cloglog), kết quả cho thấy cloglog là mô hình phù hợp và tối ưu nhất để phân tích “Các yếu tố tác động đến hành vi vay tín dụng của khách hàng.”

Kết quả mô hình hồi quy cloglog cho thấy các biến sau đều có ý nghĩa thống kê:

  • CODE_GENDER

  • NAME_INCOME_TYPE2

  • NAME_EDUCATION_TYPE3

  • AMT_ANNUITY1

  • AMT_CREDIT1

Giới tính có thể tạo ra một sự phân chia trong quá trình xác định khả năng trả nợ.

Loại thu nhập của khách hàng có thể phản ánh khả năng trả nợ và ổn định tài chính. Người có thu nhập ổn định như lương cố định có thể dễ dàng hơn trong việc trả nợ hơn so với những người có thu nhập không định kỳ, như người làm công việc tự do.

Trình độ học vấn có thể liên quan đến hiểu biết về tài chính và khả năng quản lý tiền bạc. Người có trình độ học vấn cao có thể có kiến thức tốt hơn về cách quản lý tài chính cá nhân và cân nhắc kỹ hơn khi vay tín dụng.

Số tiền trả hàng tháng so với thu nhập hàng tháng ảnh hưởng trực tiếp đến khả năng trả nợ của khách hàng. Nếu số tiền trả hàng tháng quá lớn so với thu nhập, khả năng vay tín dụng có thể bị hạn chế hoặc tạo ra áp lực tài chính lớn cho khách hàng.

Hạn mức vay liên quan đến mức độ rủi ro của khoản vay. Mức số tiền vay lớn hơn có thể đòi hỏi khách hàng có thu nhập và khả năng tài chính cao hơn để đảm bảo trả nợ đúng hạn.

6.2 Khuyến nghị

Dựa trên các biến độc lập và tình hình vay tín dụng của khách hàng, dưới đây là một số khuyến nghị để cân nhắc trong quá trình đánh giá khả năng vay tín dụng:

  • Hãy xem xét toàn bộ tình hình tài chính của khách hàng, bao gồm thu nhập, trình độ học vấn, lịch sử tín dụng, tình hình công việc, và tình hình gia đình. Điều này sẽ giúp bạn có cái nhìn tổng quan về khả năng tài chính và trách nhiệm của khách hàng.

  • Thiết lập một ngưỡng hoặc tỷ lệ thu nhập so với số tiền trả hàng tháng để đảm bảo rằng khách hàng có khả năng trả nợ một cách dễ dàng và không tạo áp lực tài chính.

  • Đối với những khách hàng có trình độ học vấn thấp hoặc thiếu kiến thức về tài chính, hãy cân nhắc cung cấp chương trình đào tạo hoặc tư vấn tài chính để giúp họ hiểu rõ hơn về quản lý tiền bạc và trách nhiệm trong việc trả nợ.

  • Xem xét mức rủi ro liên quan đến số tiền vay so với lợi ích mà khách hàng có thể đạt được từ việc vay. Đảm bảo rằng khoản vay là hợp lý và có khả năng tạo ra giá trị thực sự cho khách hàng.

  • Sử dụng công nghệ và phân tích dữ liệu để xác định xu hướng từ lịch sử tín dụng và hành vi vay tín dụng của khách hàng. Điều này có thể giúp dự đoán khả năng trả nợ và đưa ra quyết định một cách chính xác hơn.

  • Mỗi nhu cầu và vị thế của khách hàng là khác nhau, hãy xem xét tùy chỉnh quyết định vay tín dụng dựa trên từng tình huống cụ thể. Đừng dựa quá nhiều vào một biến cụ thể mà hãy xem xét mối tương quan giữa nhiều yếu tố.

Tóm lại, quyết định vay tín dụng cần phải dựa trên sự cân nhắc kỹ lưỡng và sử dụng nhiều thông tin khác nhau để đảm bảo tính công bằng và đáng tin cậy trong quá trình xét duyệt.

7 Tài liệu tham khảo

[1]. Tài, V. V., Thường, N. Q., & Dân, N. T. H. (2017). Đánh giá khả năng trả nợ vay của khách hàng bằng các phương pháp phân loại. Tạp chí Khoa học Đại học cần Thơ, (49), 110-117.

[2]. Huỳnh, N. A. H., & Trần, T. N. (2021). Các yếu tố ảnh hưởng đến hành vi vay tín dụng tiêu dùng: nghiên cứu thực nghiệm tại thành phố Hồ Chí Minh.

[3]. Quốc hội (2010). Luật số 47/2010/QH12: Luật các tổ chức tín dụng. Hà Nội, Việt Nam.

[4]. Trần Kim Thanh, Trần Mạnh Tường, Vũ Anh Linh Duy: “Giáo trình Phân tích dữ liệu định tính”, trường Đại học Tài chính – Marketing, Thành phố Hồ Chí Minh.

LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gaMOgbmggdmkgdmF5IHTDrW4gZOG7pW5nIGPhu6dhIGtow6FjaCBow6BuZy4iDQphdXRob3I6ICJOZ3V54buFbiBNaW5oIEThuqEgTeG6q24iDQpkYXRlOiAiMjAyMy0wOC0wMiINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDoNCiAgdG9jOiB0cnVlDQogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICB0b2NfZmxvYXQ6DQogICAgY29sbGFwc2VkOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIGhpZ2hsaWdodDoga2F0ZQ0KICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQpMaW5rIHRp4buDdSBsdeG6rW46IGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9maWxlL2QvMXhLemVkeFVjNUFHM3FXM0ZUdGFXU0NhS0liSHN2Nm1CL3ZpZXc/dXNwPWRyaXZlX2xpbmsNCg0KRmlsZSBk4buvIGxp4buHdTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUpqTTNDVDN3Y1JSNXcxWnl1XzEtSkQxTHZWN0VOd1VjL2VkaXQ/dXNwPWRyaXZlX2xpbmsmb3VpZD0xMTc1MTY1NTA1MTU4NzYxMjEwMjkmcnRwb2Y9dHJ1ZSZzZD10cnVlDQoNCmBgYHtyfQ0Kb3B0aW9ucyhyZXBvcyA9IGMoQ1JBTiA9ICJodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZyIpKQ0KYGBgDQoNCiMgTOG7nWkgY+G6o20gxqFuDQoNCsSQ4bqndSB0acOqbiwgdMO0aSB4aW4gY+G6o20gxqFuIHRyxrDhu51uZyDEkOG6oWkgaOG7jWMgVMOgaSBjaMOtbmgg4oCTIE1hcmtldGluZyDEkcOjIMSRxrBhIGLhu5kgbcO0biDigJxQaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5o4oCdIHbDoG8gY2jGsMahbmcgdHLDrG5oIMSRw6BvIHThuqFvLiDEkOG6t2MgYmnhu4d0LCB0w7RpIGLDoHkgdOG7jyBsw7JuZyBiaeG6v3QgxqFuIHbDoCB0cmkgw6JuIHPDonUgc+G6r2MgxJHhur9uIGdp4bqjbmcgdmnDqm4gaMaw4bubbmcgZOG6q24gVGguUyBUcuG6p24gTeG6oW5oIFTGsOG7nW5nLiANCsSQ4buDIGPDsyB0aOG7gyBob8OgbiB0aGnhu4duIMSR4buBIHTDoGkgdGnhu4N1IGx14bqtbiBr4bq/dCB0aMO6YyBo4buNYyBwaOG6p24gY+G6oyB24buBIG7hu5lpIGR1bmcgbOG6q24gaMOsbmggdGjhu6ljIHRyw6xuaCBiw6B5LCBiw6puIGPhuqFuaCBz4buxIG7hu5UgbOG7sWMgY+G7p2EgYuG6o24gdGjDom4sIHTDtGkgbHXDtG4gbmjhuq1uIMSRxrDhu6NjIHPhu7EgcXVhbiB0w6JtLCBoxrDhu5tuZyBk4bqrbiB04bqtbiB0w6xuaCB04burIHRo4bqneSBUxrDhu51uZy4gTmjhu50gY8OzIHPhu7EgxJHDs25nIGfDs3AsIGNoaWEgc+G6uyB04burIHRo4bqneSBtw6AgdMO0aSBjw7MgdGjhu4MgaG/DoG4gdGhp4buHbiBiw6BpIHRp4bq/dSBsdeG6rW4gbeG7mXQgY8OhY2ggdOG7kXQgbmjhuqV0LiANCk5o4buvbmcga2nhur9uIHRo4bupYyDEkcaw4bujYyB0aOG6p3kgdHJ1eeG7gW4gxJHhuqF0IHRyb25nIGjhu41jIGvDrCBuw6B5IMSRw6MgZ2nDunAgdMO0aSB0csaw4bufbmcgdGjDoG5oIGjGoW4gduG7gSBt4bq3dCBraeG6v24gdGjhu6ljIGPFqW5nIG5oxrAgduG7r25nIGjDoG5oIHRyYW5nIGLGsOG7m2MgdsOgbyBjaHV5w6puIG5naMOgbmggY+G7p2EgbcOsbmggc2F1IG7DoHkuIFR1eSBuaGnDqm4sIGTDuSDEkcOjIGPhu5EgZ+G6r25nIGjhur90IHPhu6ljIMSR4buDIGPDsyB0aOG7gyBob8OgbiB0aGnhu4duIMSR4buBIHTDoGkgbmdoacOqbiBj4bupdSBuaMawbmcgY2jhuq9jIGNo4bqvbiBiw6BpIHRp4buDdSBsdeG6rW4gbsOgeSBz4bq9IGtow7MgdHLDoW5oIGto4buPaSBuaOG7r25nIHNhaSBzw7N0IHbDoCBsdcO0biB04buTbiDEkeG7jW5nIG5oaeG7gXUgaOG6oW4gY2jhur8uIENow61uaCB2w6wgduG6rXksIG5ow7NtIGx1w7RuIG1vbmcgbmjhuq1uIMSRxrDhu6NjIMO9IGtp4bq/biDEkcOzbmcgZ8OzcCB04burIHRo4bqneSDEkeG7gyDEkeG7gSB0w6BpIGPDsyB0aOG7gyBob8OgbiB0aGnhu4duIGjGoW4uIA0KTOG7nWkgY3Xhu5FpIGPDuW5nLCBjaMO6bmcgdMO0aSBrw61uaCBjaMO6YyB0aOG6p3kgc+G6vSBjw7MgdGjhuq10IG5oaeG7gXUgc+G7qWMga2jhu49lLCBo4bqhbmggcGjDumMgdsOgIHRow6BuaCBjw7RuZyB0csOqbiBjb24gxJHGsOG7nW5nIGdp4bqjbmcgZOG6oXkuIA0KDQojIENoxrDGoW5nIDEuIEdp4bubaSB0aGnhu4d1IA0KDQojIyBUw61uaCBj4bqlcCB0aGnhur90IGPhu6dhIMSR4buBIHTDoGkNClRyb25nIHRo4budaSDEkeG6oWkgcGjDoXQgdHJp4buDbiBj4bunYSBu4buBbiBraW5oIHThur8gdsOgIHTDoGkgY2jDrW5oLCB2aeG7h2MgdmF5IHTDrW4gZOG7pW5nIMSRw6MgdHLhu58gdGjDoG5oIG3hu5l0IHBoxrDGoW5nIHRp4buHbiBxdWFuIHRy4buNbmcgxJHhu4MgaOG7lyB0cuG7oyBjw6EgbmjDom4gdsOgIGRvYW5oIG5naGnhu4dwIHRo4buxYyBoaeG7h24gY8OhYyBk4buxIMOhbiB2w6AgbeG7pWMgdGnDqnUgdMOgaSBjaMOtbmguIFR1eSBuaGnDqm4sIHZp4buHYyBz4butIGThu6VuZyB0w61uIGThu6VuZyBjxaluZyBtYW5nIMSR4bq/biBuaGnhu4F1IHLhu6dpIHJvIHbDoCB0w6FjIMSR4buZbmcgxJHhur9uIHTDrG5oIGjDrG5oIHTDoGkgY2jDrW5oIGPhu6dhIG5nxrDhu51pIHZheS4gTeG6t3Qga2jDoWMsIHZp4buHYyBz4butIGThu6VuZyBJbnRlcm5ldCBuZ8OgeSBjw6BuZyB0xINuZyDhu58gVmnhu4d0IE5hbSDEkcOjIHThuqFvIMSR4buZbmcgbOG7sWMgdsOgIHRyaeG7g24gduG7jW5nIHBow6F0IHRyaeG7g24gY2hvIHRoxrDGoW5nIG3huqFpIMSRaeG7h24gdOG7rSwgbMOgbSBwaG9uZyBwaMO6IHRow6ptIG5o4bqtbiB0aOG7qWMgY+G7p2Ega2jDoWNoIGjDoG5nIHbhu4EgdGhhbmggdG/DoW4ga2jDtG5nIHRp4buBbiBt4bq3dCB2w6AgY8OhYyBraG/huqNuIHZheSB0acOqdSBkw7luZyAoSHXhu7NuaCB2w6AgVHLhuqduLCAyMDIxKS4gxJBp4buBdSBuw6B5IMSR4bq3dCByYSBt4buZdCBjw6J1IGjhu49pIHF1YW4gdHLhu41uZyBsw6A6IEPDoWMgeeG6v3UgdOG7kSBuw6BvIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSB2YXkgdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nIHbDoCBsw6BtIHRo4bq/IG7DoG8gY2jDum5nIGPDsyB0aOG7gyDEkcaw4bujYyBxdeG6o24gbMO9IMSR4buDIHThu5FpIMawdSBow7NhIGhp4buHdSBxdeG6oyB0w6BpIGNow61uaCBjw6EgbmjDom4/IA0KDQrEkOG7gSB0w6BpICoqKiJQaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmciKioqIMSRxrDhu6NjIGNo4buNbiB24bubaSBt4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1LCBwaMOibiB0w61jaCB2w6AgxJHGsGEgcmEgbmjhu69uZyB0aMO0bmcgdGluIHF1YW4gdHLhu41uZyB24buBIGPDoWMgeeG6v3UgdOG7kSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcuIE5naGnDqm4gY+G7qXUgbsOgeSBraMO0bmcgY2jhu4kgdOG6rXAgdHJ1bmcgdsOgbyBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcgbcOgIGPDsm4gZ2nDunAgY+G6o2kgdGhp4buHbiBxdXkgdHLDrG5oIMSRw6FuaCBnacOhIHTDrW4gZOG7pW5nIHbDoCB04bqhbyByYSBjxqEgaOG7mWkgxJHhu4MgcGjDoXQgdHJp4buDbiBjw6FjIGNow61uaCBzw6FjaCB2w6Agc+G6o24gcGjhuqltIHTDoGkgY2jDrW5oIGxpbmggaG/huqF0LCBwaMO5IGjhu6NwIGjGoW4gduG7m2kgbmh1IGPhuqd1IHbDoCB0aMOhaSDEkeG7mSBj4bunYSB04burbmcga2jDoWNoIGjDoG5nLiBUaGVvIFTDoGkgdsOgIGPhu5luZyBz4buxICgyMDE3KSwga2hpIGtow6FjaCBow6BuZyAoY8OhIG5ow6JuLCBkb2FuaCBuZ2hp4buHcOKApikgxJHhur9uIHZheSB24buRbiwgY8OhbiBi4buZIHTDrW4gZOG7pW5nIHBo4bqjaSBjw7Mga2jhuqMgbsSDbmcgxJHDoW5oIGdpw6EgxJHDum5nIGtow6FjaCBow6BuZyB2w6AgcmEgcXV54bq/dCDEkeG7i25oIHbhu4Egdmnhu4djIGNobyBoYXkga2jDtG5nIGNobyBraMOhY2ggaMOgbmcgdmF5LiBOaOG7nSB2w6BvIHZp4buHYyBoaeG7g3UgcsO1IGjGoW4gduG7gSBjw6FjIHnhur91IHThu5EgdMOhYyDEkeG7mW5nIMSR4bq/biBxdXnhur90IMSR4buLbmggdmF5IHTDrW4gZOG7pW5nIGPhu6dhIGtow6FjaCBow6BuZywgY8OhYyB04buVIGNo4bupYyB0w6BpIGNow61uaCBjw7MgdGjhu4MgdOG7kWkgxrB1IGjDs2EgcXV5IHRyw6xuaCBjdW5nIGPhuqVwIHTDrW4gZOG7pW5nIHbDoCB0w7l5IGNo4buJbmggY8OhYyBz4bqjbiBwaOG6qW0gdsOgIGThu4tjaCB24bulIHTDoGkgY2jDrW5oIHNhbyBjaG8gcGjDuSBo4bujcCB2w6AgdGh1IGjDunQgaMahbiB24bubaSB04burbmcgxJHhu5FpIHTGsOG7o25nIGtow6FjaCBow6BuZyBraMOhYyBuaGF1LiDEkGnhu4F1IG7DoHkgc+G6vSBnacO6cCBj4bqjaSB0aGnhu4duIG3hu6ljIMSR4buZIMSRw6FwIOG7qW5nIG5odSBj4bqndSB2YXkgdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nIHbDoCB0xINuZyBjxrDhu51uZyBz4buxIGjDoGkgbMOybmcgdsOgIGzDsm5nIHRpbiBj4bunYSBo4buNIMSR4buRaSB24bubaSB04buVIGNo4bupYyB0w61uIGThu6VuZy4NCg0KTeG7pWMgdGnDqnUgY+G7p2EgxJHhu4EgdMOgaSBraMO0bmcgY2jhu4kgbuG6sW0g4bufIHZp4buHYyDEkcawYSByYSBjw6FpIG5ow6xuIHRvw6BuIGRp4buHbiB24buBIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcsIG3DoCBjw7JuIHThuq1wIHRydW5nIHbDoG8gdmnhu4djIMSR4buBIHh14bqldCBuaOG7r25nIGdp4bqjaSBwaMOhcCBj4bulIHRo4buDIHbDoCBn4bujaSDDvSBjaG8gY8OhYyB04buVIGNo4bupYyB0w61uIGThu6VuZy4gTmjhu69uZyBr4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1IMSRxrDhu6NjIMOhcCBk4bulbmcgY8OzIHRo4buDIGdpw7pwIGPhuqNpIHRoaeG7h24gcXV5IHRyw6xuaCB4w6l0IGR1eeG7h3QgdMOtbiBk4bulbmcsIGdp4bqjbSB0aGnhu4N1IHLhu6dpIHJvIHTDrW4gZOG7pW5nLCB2w6AgdOG7kWkgxrB1IGjDs2EgbOG7o2kgbmh14bqtbi4NClTDs20gbOG6oWksIMSR4buBIHTDoGkgbWFuZyBs4bqhaSBjaG8gbMSpbmggduG7sWMgdMOgaSBjaMOtbmggdsOgIG5nw6JuIGjDoG5nIG5o4buvbmcgxJHDs25nIGfDs3AgcXVhbiB0cuG7jW5nIGPFqW5nIG5oxrAgdOG6oW8gdGnhu4FuIMSR4buBIGNobyBz4buxIHRow7pjIMSR4bqpeSBi4buBbiB24buvbmcgY+G7p2EgbuG7gW4ga2luaCB04bq/IHbDoCDEkWnhu4F1IGtp4buHbiB0aHXhuq1uIGzhu6NpIGNobyBj4bqjIG5nxrDhu51pIGNobyB2YXkgdsOgIG5nxrDhu51pIHZheSB0cm9uZyBjw6FjIGdpYW8gZOG7i2NoIHTDoGkgY2jDrW5oLg0KDQojIyBN4bulYyB0acOqdSBuZ2hpw6puIGPhu6l1IA0KDQpE4buxYSB0csOqbiBjw6FjIHRow7RuZyB0aW4gxJHDoyB0aHUgdGjhuq1wIMSRxrDhu6NjIHThu6sgY3Xhu5ljIGto4bqjbyBzw6F0LCBt4bulYyB0acOqdSBjaMOtbmggY+G7p2EgxJHhu4EgdMOgaSBuw6B5IGzDoCBwaMOibiB0w61jaCBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcuIMSQ4buBIHTDoGkgc+G6vSB04bqtcCB0cnVuZyB2w6BvIHZp4buHYyB4ZW0geMOpdCB2w6AgxJHDoW5oIGdpw6Egc+G7sSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIHnhur91IHThu5EgbmjGsCB0aHUgbmjhuq1wIGtow6FjaCBow6BuZywgc+G7kSB0aeG7gW4gdmF5LCB0aHUgbmjhuq1wLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4sIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgbeG7mXQgc+G7kSB54bq/dSB04buRIGtow6FjIGPDsyB0aOG7gyBsacOqbiBxdWFuLiBU4burIMSRw7MsIGPDsyB0aOG7gyBnacO6cCBj4bqjaSB0aGnhu4duIHF1eSB0csOsbmggeMOpdCBkdXnhu4d0IHTDrW4gZOG7pW5nLCBnaeG6o20gdGhp4buDdSBy4bunaSBybyB0w61uIGThu6VuZywgdsOgIHThu5FpIMawdSBow7NhIGzhu6NpIG5odeG6rW4uDQoNCiMjIMSQ4buRaSB0xrDhu6NuZyB2w6AgcGjhuqFtIHZpIG5naGnDqm4gY+G7qXUgDQoNCsSQ4buRaSB0xrDhu6NuZyBuZ2hpw6puIGPhu6l1IGJhbyBn4buTbSBuaOG7r25nIGtow6FjaCBow6BuZyDEkeG6v24gdOG7qyBraMOhY2ggaMOgbmcgxJHDoyB2YXkgduG7kW4gxJHhur9uIHThu6sgVsawxqFuZyBxdeG7kWMgQW5oLiBT4buxIMSRYSBk4bqhbmcgduG7gSDEkeG7mSB0deG7lWksIGdp4bubaSB0w61uaCwgbmdo4buBIG5naGnhu4dwLCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gdsOgIHTDrG5oIGjDrG5oIHTDoGkgY2jDrW5oIGPDoSBuaMOibiBz4bq9IMSRxrDhu6NjIHhlbSB4w6l0IMSR4buDIHThuqFvIHJhIGvhur90IHF14bqjIG5naGnDqm4gY+G7qXUgbWFuZyB0w61uaCDEkeG6oWkgZGnhu4duIHbDoCBjw7MgdGjhu4Mgw6FwIGThu6VuZyBy4buZbmcgcsOjaS4gROG7ryBsaeG7h3UgbsOgeSBjaG8gcGjDqXAgcGjDom4gdMOtY2ggduG7gSBjw6FjIHnhur91IHThu5EgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSB2YXkgdMOtbiBk4bulbmcgY+G7p2EgdOG7q25nIGtow6FjaCBow6BuZyB2w6AgZOG7sSBiw6FvIG5ndXkgY8ahIHbhu6EgbuG7oyBj4bunYSBuZ8OibiBow6BuZy4NCg0KIyMgUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdSANCg0KUGjGsMahbmcgcGjDoXAgbmdoacOqbiBj4bupdSB04bqtcCB0cnVuZyB2w6BvIHBow6JuIHTDrWNoIGPDoWMgeeG6v3UgdOG7kSBjw7MgbGnDqm4gcXVhbiDEkeG6v24ga2jhuqMgbsSDbmcgcmEgcXV54bq/dCDEkeG7i25oIGjDrG5oIHRo4bupYyB2YXkgduG7kW4gY+G7p2Ega2jDoWNoIGjDoG5nLiBC4bqxbmcgY8OhY2ggdGjhu5FuZyBrw6ogbcO0IHThuqMsIHhlbSB4w6l0IG3hu5FpIHF1YW4gaOG7hyB0xrDGoW5nIHF1YW4gZ2nhu69hIGPDoWMgY+G6t3AgYmnhur9uLCB04burIMSRw7MgeMOieSBk4buxbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdC4gVGjDtG5nIHF1YSBjw6FjIGNo4buJIHPhu5EgxJHDoW5oIGdpw6EgxJHhu4MgbOG7sWEgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwIG5o4bqldCB2w6AgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIHnhur91IHThu5EgdMOhYyDEkeG7mW5nIMSR4bq/biBxdXnhur90IMSR4buLbmggaMOsbmggdGjhu6ljIHZheSB24buRbi4gDQoNCiMjIELhu5EgY+G7pWMgbmdoacOqbiBj4bupdQ0KDQpOZ2hpw6puIGPhu6l1IMSRxrDhu6NjIGNoaWEgdGjDoG5oIG7Eg20gcGjhuqduIGNow61uaCDEkeG7gyDEkeG6o20gYuG6o28gdMOtbmggbG9naWMgdsOgIGhp4buHdSBxdeG6oyB0cm9uZyB2aeG7h2MgdHJ1eeG7gW4gdOG6o2kgdGjDtG5nIHRpbi4gQ2jGsMahbmcgMSBnaeG7m2kgdGhp4buHdS4gQ2jGsMahbmcgMiB04buVbmcgcXVhbiBsw70gdGh1eeG6v3QuIENoxrDGoW5nIDMgdOG7lW5nIHF1YW4gbmdoacOqbiBj4bupdS4gQ2jGsMahbmcgNCBr4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1LiBDaMawxqFuZyA1IGvhur90IGx14bqtbiB2w6Aga2h1eeG6v24gbmdo4buLLg0KDQojIENoxrDGoW5nIDIuIFThu5VuZyBxdWFuIGzDvSB0aHV54bq/dCANCg0KIyMgQ8ahIHPhu58gbMO9IHRodXnhur90IHbhu4EgdMOtbiBk4bulbmcgDQoNClThu5UgY2jhu6ljIHTDrW4gZOG7pW5nIGzDoCBkb2FuaCBuZ2hp4buHcCB0aOG7sWMgaGnhu4duIG3hu5l0LCBt4buZdCBz4buRIGhv4bq3YyB04bqldCBj4bqjIGPDoWMgaG/huqF0IMSR4buZbmcgbmfDom4gaMOgbmcuIFThu5UgY2jhu6ljIHTDrW4gZOG7pW5nIGJhbyBn4buTbSBuZ8OibiBow6BuZywgdOG7lSBjaOG7qWMgdMOtbiBk4bulbmcgcGhpIG5nw6JuIGjDoG5nLCB04buVIGNo4bupYyB0w6BpIGNow61uaCB2aSBtw7QgdsOgIHF14bu5IHTDrW4gZOG7pW5nIG5ow6JuIGTDom4gKFF14buRYyBo4buZaSwgMjAxMCkuDQpD4bqlcCB0w61uIGThu6VuZyBsw6Agdmnhu4djIHRo4buPYSB0aHXhuq1uIMSR4buDIHThu5UgY2jhu6ljLCBjw6EgbmjDom4gc+G7rSBk4bulbmcgbeG7mXQga2hv4bqjbiB0aeG7gW4gaG/hurdjIGNhbSBr4bq/dCBjaG8gcGjDqXAgc+G7rSBk4bulbmcgbeG7mXQga2hv4bqjbiB0aeG7gW4gdGhlbyBuZ3V5w6puIHThuq9jIGPDsyBob8OgbiB0cuG6oyBi4bqxbmcgbmdoaeG7h3AgduG7pSBjaG8gdmF5LCBjaGnhur90IGto4bqldSwgY2hvIHRodcOqIHTDoGkgY2jDrW5oLCBiYW8gdGhhbmggdG/DoW4sIGLhuqNvIGzDo25oIG5nw6JuIGjDoG5nIHbDoCBjw6FjIG5naGnhu4dwIHbhu6UgY+G6pXAgdMOtbiBk4bulbmcga2jDoWMgKFF14buRYyBo4buZaSwgMjAxMCkuDQoNCk3hu5l0IHRyb25nIG5o4buvbmcgaMOsbmggdGjhu6ljIHBo4buVIGJp4bq/biBj4bunYSB0w61uIGThu6VuZyBsw6AgdGjhursgdMOtbiBk4bulbmcuIFRo4bq7IHTDrW4gZOG7pW5nIGNobyBwaMOpcCBuZ8aw4budaSBz4butIGThu6VuZyBtxrDhu6NuIHRp4buBbiB04burIHThu5UgY2jhu6ljIHTDrW4gZOG7pW5nIGhv4bq3YyBuZ8OibiBow6BuZyDEkeG7gyBtdWEgc+G6r20gdsOgIHRoYW5oIHRvw6FuIHbDoG8gY3Xhu5FpIGvhu7MgdGhhbmggdG/DoW4uIMSQaeG7gXUgbsOgeSBtYW5nIGzhuqFpIHPhu7EgdGnhu4duIGzhu6NpIHbDoCBsaW5oIGhv4bqhdCBjaG8gbmfGsOG7nWkgZMO5bmcsIG5oxrBuZyBjxaluZyDEkcOyaSBo4buPaSBz4buxIHF14bqjbiBsw70gdMOgaSBjaMOtbmggdGjDtG5nIG1pbmggxJHhu4MgdHLDoW5oIG7hu6MgbuG6p24ga2jDtG5nIGtp4buDbSBzb8OhdC4NCg0KTmdvw6BpIHJhLCB0w61uIGThu6VuZyBjxaluZyB0aOG7gyBoaeG7h24gdHJvbmcgaMOsbmggdGjhu6ljIHZheSB24buRbi4gTmfGsOG7nWkgY8OzIG5odSBj4bqndSB0aeG7gW4gbeG6t3QgY8OzIHRo4buDIHZheSBt4buZdCBraG/huqNuIHRp4buBbiB04burIG5nw6JuIGjDoG5nIGhv4bq3YyB04buVIGNo4bupYyB0w61uIGThu6VuZyB2w6AgY2FtIGvhur90IHRy4bqjIGzhuqFpIHRoZW8gbeG7mXQga+G6vyBob+G6oWNoIHRy4bqjIG7hu6MgY+G7pSB0aOG7gyB24bubaSBsw6NpIHN14bqldC4gVHV5IGN1bmcgY+G6pXAgbmd14buTbiB0w6BpIGNow61uaCBj4bqnbiB0aGnhur90IGNobyBuaOG7r25nIGThu7Egw6FuIHbDoCBuaHUgY+G6p3UgY8OhIG5ow6JuLCBuaMawbmcgdmnhu4djIHZheSB0aeG7gW4gY8WpbmcgxJHDsmkgaOG7j2kgc+G7sSDEkcOhbmggZ2nDoSB2w6AgdMOtbmggdG/DoW4ga+G7uSBsxrDhu6FuZyDEkeG7gyB0csOhbmggcsahaSB2w6BvIGPhuqNuaCBu4bujIG7huqduLg0KDQrEkOG7kWkgduG7m2kgZG9hbmggbmdoaeG7h3AsIHTDrW4gZOG7pW5nIHRoxrDGoW5nIG3huqFpIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgcXXDoSB0csOsbmggbXVhIGjDoG5nIGhv4bq3YyBk4buLY2ggduG7pS4gVMOtbiBk4bulbmcgdGjGsMahbmcgbeG6oWkgY2hvIHBow6lwIGRvYW5oIG5naGnhu4dwIG11YSBow6BuZyBob+G6t2MgZOG7i2NoIHbhu6UgdsOgIHRy4bqjIHRp4buBbiBzYXUga2hpIMSRw6Mgbmjhuq1uIMSRxrDhu6NjIGNow7puZy4gxJBp4buBdSBuw6B5IGdpw7pwIGRvYW5oIG5naGnhu4dwIGR1eSB0csOsIGhv4bqhdCDEkeG7mW5nIG3hu5l0IGPDoWNoIGxpbmggaG/huqF0IHbDoCDEkcOhcCDhu6luZyBuaHUgY+G6p3Uga2luaCBkb2FuaCBt4buZdCBjw6FjaCBoaeG7h3UgcXXhuqMuDQoNClR1eSB0w61uIGThu6VuZyBtYW5nIGzhuqFpIG5oaeG7gXUgbOG7o2kgw61jaCBjaG8ga2luaCB04bq/IHbDoCBjw6EgbmjDom4sIHZp4buHYyBxdeG6o24gbMO9IHTDrW4gZOG7pW5nIGPhuqduIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gY+G6qW4gdGjhuq1uLiBOZ8aw4budaSBz4butIGThu6VuZyB0w61uIGThu6VuZyBuw6puIGPDsyDDvSB0aOG7qWMgdHLDoWNoIG5oaeG7h20gdHJvbmcgdmnhu4djIHZheSB0aeG7gW4gdsOgIHRy4bqjIG7hu6MgxJHDum5nIGjhuqFuIMSR4buDIHRyw6FuaCBuaOG7r25nIHbhuqVuIMSR4buBIHTDoGkgY2jDrW5oIGtow7Mga2jEg24gdsOgIHTDoWMgxJHhu5luZyB0acOqdSBj4buxYyDEkeG6v24gxJHhu51pIHPhu5FuZyBjw6EgbmjDom4gY8WpbmcgbmjGsCBob+G6oXQgxJHhu5luZyBraW5oIGRvYW5oLg0KDQojIyBIw6xuaCB0aOG7qWMgdmF5IHbhu5FuIA0KDQpIw6xuaCB0aOG7qWMgdmF5IHRp4buBbiBjw7MgdGjhu4MgxJHGsOG7o2MgY2hpYSB0aMOgbmggaGFpIGxv4bqhaSBjaMOtbmg6IHZheSB0aeG7gW4gbeG6t3QgdsOgIHZheSB0w61uIGThu6VuZy4NCg0KKipWYXkgdGnhu4FuIG3hurd0OioqIA0KDQpWYXkgdGnhu4FuIG3hurd0IGzDoCBow6xuaCB0aOG7qWMgdmF5IG3DoCBuZ8aw4budaSB2YXkgbmjhuq1uIMSRxrDhu6NjIHPhu5EgdGnhu4FuIHnDqnUgY+G6p3UgZMaw4bubaSBk4bqhbmcgdGnhu4FuIG3hurd0IGhv4bq3YyBjaHV54buDbiBraG/huqNuIHbDoG8gdMOgaSBraG/huqNuIGPhu6dhIGjhu40uIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuZ8aw4budaSB2YXkgY8OzIHF1eeG7gW4gc+G7rSBk4bulbmcgc+G7kSB0aeG7gW4gbsOgeSBuaMawIG3hu5l0IGtob+G6o24gdGnhu4FuIG3hurd0IHbDoCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgbsOzIGNobyBi4bqldCBr4buzIG3hu6VjIMSRw61jaCBnw6wsIGtow7RuZyBi4buLIHLDoG5nIGJ14buZYyBi4bufaSBjw6FjIGdp4bubaSBo4bqhbiBj4bulIHRo4buDLiBUaMO0bmcgdGjGsOG7nW5nLCB2YXkgdGnhu4FuIG3hurd0IHRoxrDhu51uZyDDoXAgZOG7pW5nIGNobyBjw6FjIHTDrG5oIGh14buRbmcgY+G6pXAgdGhp4bq/dCBob+G6t2Mga2hpIG5nxrDhu51pIHZheSBj4bqnbiB0aeG7gW4gbeG6t3QgbmhhbmggY2jDs25nLg0KDQoqKlZheSB0w61uIGThu6VuZzoqKg0KVmF5IHTDrW4gZOG7pW5nIGzDoCBow6xuaCB0aOG7qWMgdmF5IG3DoCBuZ8aw4budaSB2YXkgxJHGsOG7o2MgY+G6pXAgbeG7mXQgaOG6oW4gbeG7qWMgdMOtbiBk4bulbmcgdOG7qyBt4buZdCB04buVIGNo4bupYyB0w6BpIGNow61uaCwgbmfDom4gaMOgbmcgaG/hurdjIGPDtG5nIHR5IHTDrW4gZOG7pW5nLiBOZ8aw4budaSB2YXkgY8OzIHRo4buDIHPhu60gZOG7pW5nIHPhu5EgdGnhu4FuIHRyb25nIGjhuqFuIG3hu6ljIHTDrW4gZOG7pW5nIG7DoHkgdGhlbyBuaHUgY+G6p3UgdsOgIHRo4buPYSB0aHXhuq1uIHRyxrDhu5tjIMSRw7MuIFTDuXkgdGh14buZYyB2w6BvIMSRaeG7gXUga2nhu4duIGPhu6dhIGjhu6NwIMSR4buTbmcsIG5nxrDhu51pIHZheSBjw7MgdGjhu4MgdGhhbmggdG/DoW4gc+G7kSB0aeG7gW4gdmF5IHRyb25nIG3hu5l0IGtob+G6o25nIHRo4budaSBnaWFuIG5o4bqldCDEkeG7i25oIGhv4bq3YyB0cuG6oyB0aeG7gW4gdGhlbyBjw6FjIGvhu7MgaOG6oW4gdGjhu49hIHRodeG6rW4uIFbDrSBk4bulIHbhu4EgaMOsbmggdGjhu6ljIHZheSB0w61uIGThu6VuZyBiYW8gZ+G7k20gdGjhursgdMOtbiBk4bulbmcgdsOgIHZheSB0aGVvIGjhuqFuIG3hu6ljIHRyb25nIHTDoGkga2hv4bqjbiBuZ8OibiBow6BuZy4NCg0KQ+G6oyBoYWkgaMOsbmggdGjhu6ljIHZheSDEkeG7gXUgY8OzIMawdSDEkWnhu4NtIHbDoCBo4bqhbiBjaOG6vyByacOqbmcsIHbDoCBz4bq9IHBow7kgaOG7o3AgduG7m2kgY8OhYyB0w6xuaCBodeG7kW5nIHbDoCBuaHUgY+G6p3UgdMOgaSBjaMOtbmggY+G7pSB0aOG7gyBj4bunYSBuZ8aw4budaSB2YXkuDQoNCioqxq91IMSRaeG7g20gdmF5IHTDrW4gZOG7pW5nOioqDQoNClZp4buHYyBs4buxYSBjaOG7jW4gdmF5IHTDrW4gZOG7pW5nIHRoYXkgdsOsIHZheSB0aeG7gW4gbeG6t3QgxJFlbSBs4bqhaSBuaGnhu4F1IGzhu6NpIMOtY2ggdsOgIHPhu7EgbGluaCBob+G6oXQgY2hvIG5nxrDhu51pIHZheS4gVuG7m2kgaMOsbmggdGjhu6ljIHZheSB0w61uIGThu6VuZywgbmfGsOG7nWkgdmF5IGPDsyBz4bq1biBt4buZdCBo4bqhbiBt4bupYyB0w61uIGThu6VuZyDEkeG7gyBz4butIGThu6VuZyBsaW5oIGhv4bqhdCB0aGVvIG5odSBj4bqndSBjw6EgbmjDom4uIEtow7RuZyBj4bqnbiBwaOG6o2kgY2jhu4kgxJHhu4tuaCByw7UgcsOgbmcgbeG7pWMgxJHDrWNoIHPhu60gZOG7pW5nLCBuZ8aw4budaSB2YXkgY8OzIHRo4buDIHPhu60gZOG7pW5nIHPhu5EgdGnhu4FuIG7DoHkgY2hvIGLhuqV0IGvhu7MgbeG7pWMgxJHDrWNoIGfDrCwgdOG7qyB0aGFuaCB0b8OhbiBow7NhIMSRxqFuIGjDoG5nIHRow6FuZyBjaG8gxJHhur9uIG11YSBz4bqvbSBob+G6t2MgxJFpIGR1IGzhu4tjaC4NCg0KTmdvw6BpIHJhLCB0w61uaCBsaW5oIGhv4bqhdCB0cm9uZyB2aeG7h2MgdHLhuqMgbuG7oyBjxaluZyBsw6AgbeG7mXQgxJFp4buDbSBt4bqhbmggY+G7p2EgdmF5IHTDrW4gZOG7pW5nLiBOZ8aw4budaSB2YXkgY8OzIHRo4buDIGNo4buNbiB0cuG6oyBu4bujIHRyb25nIG3hu5l0IGtob+G6o25nIHRo4budaSBnaWFuIGTDoGkgaMahbiwgZ2nhuqNtIGLhu5t0IMOhcCBs4buxYyB0w6BpIGNow61uaCB2w6AgZ2nDunAgZHV5IHRyw6wgc+G7sSDhu5VuIMSR4buLbmggdHJvbmcgY3Xhu5ljIHPhu5FuZyBow6BuZyBuZ8OgeS4gSMahbiBu4buvYSwgbMOjaSBzdeG6pXQgY2jhu4kgw6FwIGThu6VuZyBjaG8gc+G7kSB0aeG7gW4gxJHDoyBz4butIGThu6VuZyB0cm9uZyBo4bqhbiBt4bupYyB0w61uIGThu6VuZywgZ2nDunAgZ2nhuqNtIGNoaSBwaMOtIGzDo2kgc3XhuqV0IHNvIHbhu5tpIHZp4buHYyB2YXkgdGnhu4FuIG3hurd0Lg0KDQpWYXkgdMOtbiBk4bulbmcgY8WpbmcgaOG7lyB0cuG7oyB0w6BpIGNow61uaCBjaG8gbmjhu69uZyBk4buxIMOhbiBs4bubbiB2w6AgZMOgaSBo4bqhbiBuaMawIG11YSBuaMOgIGhv4bq3YyDEkeG6p3UgdMawIGtpbmggZG9hbmgsIG5o4budIGjhuqFuIG3hu6ljIGzhu5tuIGjGoW4gc28gduG7m2kgdmF5IHRp4buBbiBt4bq3dC4gTmdvw6BpIHJhLCBjw6FjIGNoxrDGoW5nIHRyw6xuaCDGsHUgxJHDo2kgdsOgIMSRaeG7g20gdGjGsOG7n25nIGPhu6dhIGPDoWMgdGjhursgdMOtbiBk4bulbmcgY8OybiBsw6AgbeG7mXQgxJFp4buDbSB0aHUgaMO6dCwgZ2nDunAgbmfGsOG7nWkgdmF5IG5o4bqtbiDEkcaw4bujYyBuaOG7r25nIGzhu6NpIMOtY2ggaOG6pXAgZOG6q24ga2hpIHPhu60gZOG7pW5nIHRo4bq7Lg0KDQpUdXkgbmhpw6puLCDEkeG7gyB04bqtbiBk4bulbmcgaOG6v3QgY8OhYyDGsHUgxJFp4buDbSBj4bunYSB2YXkgdMOtbiBk4bulbmcsIG5nxrDhu51pIHZheSBj4bqnbiB0aOG6rW4gdHLhu41uZyB2w6AgcXXhuqNuIGzDvSB0w6BpIGNow61uaCBj4bqpbiB0aOG6rW4uIE7hur91IGtow7RuZyBxdeG6o24gbMO9IHThu5F0IHZp4buHYyBz4butIGThu6VuZyBo4bqhbiBt4bupYyB0w61uIGThu6VuZywgbmfGsOG7nWkgdmF5IGPDsyB0aOG7gyBk4buFIGTDoG5nIHLGoWkgdsOgbyB0w6xuaCB0cuG6oW5nIG7hu6MgbuG6p24gdsOgIGfhurdwIGtow7Mga2jEg24gdHJvbmcgdmnhu4djIHRoYW5oIHRvw6FuLiBEbyDEkcOzLCB2aeG7h2MgbOG7sWEgY2jhu41uIHZheSB0w61uIGThu6VuZyBuw6puIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gbeG7mXQgY8OhY2ggdOG7iW5oIHTDoW8gdsOgIGPDsyBr4bq/IGhv4bqhY2ggdMOgaSBjaMOtbmggY+G7pSB0aOG7gy4NCg0KIyBDaMawxqFuZyAzLiBUaGnhur90IGvhur8gbmdoacOqbiBj4bupdSANCg0KIyMgTcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IA0KDQpNw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IGzDoCBt4buZdCBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBt4buRaSBxdWFuIGjhu4cgdHV54bq/biB0w61uaCBnaeG7r2EgbeG7mXQgYmnhur9uIHBo4bulIHRodeG7mWMgKGPDsm4gZ+G7jWkgbMOgIGJp4bq/biBt4bulYyB0acOqdSkgdsOgIG3hu5l0IGhv4bq3YyBuaGnhu4F1IGJp4bq/biDEkeG7mWMgbOG6rXAgKGPDsm4gZ+G7jWkgbMOgIGJp4bq/biBnaeG6o2kgdGjDrWNoKS4gTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCBk4buxIMSRb8OhbiBnacOhIHRy4buLIGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljIGThu7FhIHRyw6puIGPDoWMgZ2nDoSB0cuG7iyBj4bunYSBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoLg0KVHJvbmcgbcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCwgZ2nhuqMgxJHhu4tuaCBy4bqxbmcgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBjw7MgdGjhu4MgxJHGsOG7o2MgYmnhu4N1IGRp4buFbiBi4bqxbmcgbeG7mXQgaMOgbSB0dXnhur9uIHTDrW5oLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Aga2hpIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIGdp4bqjaSB0aMOtY2ggdGhheSDEkeG7lWksIGdpw6EgdHLhu4sgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgY8Wpbmcgc+G6vSB0aGF5IMSR4buVaSB0aGVvIG3hu5l0IHThu7cgbOG7hyBj4bulIHRo4buDLg0KDQpDw7RuZyB0aOG7qWMgdOG7lW5nIHF1w6F0IGPhu6dhIG3DtCBow6xuaCBo4buTaSBxdXkgdHV54bq/biB0w61uaCBjw7MgdGjhu4MgxJHGsOG7o2Mgdmnhur90IG5oxrAgc2F1Og0KDQokWT1cYmV0YV8wK1xiZXRhXzFYXzErXGJldGFfMlhfMisuLi4rXGJldGFfblhfbiArIFxlcHNpbG9uJA0KDQpUcm9uZyDEkcOzOg0KDQotICRZJCBsw6AgZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYyAoYmnhur9uIG3hu6VjIHRpw6p1KSBj4bqnbiBk4buxIMSRb8Ohbi4NCg0KLSAkWF8xLCBYXzIsLi4uLFhfbiQgbMOgIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2ggKGJp4bq/biDEkeG7mWMgbOG6rXApLg0KDQotICRcYmV0YV8wLFxiZXRhXzEsLi4uLFxiZXRhX24kIGzDoCBjw6FjIGjhu4cgc+G7kSBo4buTaSBxdXksIGJp4buDdSB0aOG7iyDEkeG7mSBs4bubbiB2w6AgaMaw4bubbmcgY+G7p2EgbeG7kWkgcXVhbiBo4buHIHR1eeG6v24gdMOtbmggZ2nhu69hIGJp4bq/biBwaOG7pSB0aHXhu5ljIHbDoCBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoLg0KDQotICRcZXBzaWxvbiQgbMOgIHNhaSBz4buRIG5n4bqrdSBuaGnDqm4sIGJp4buDdSB0aOG7iyBz4buxIHNhaSBraMOhYyBnaeG7r2EgZ2nDoSB0cuG7iyBk4buxIMSRb8OhbiB2w6AgZ2nDoSB0cuG7iyB0aOG7sWMgdOG6vyBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYy4NCg0KIyMgTcO0IGjDrG5oIHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IGNobyBk4buvIGxp4buHdSBuaOG7iyBwaMOibg0KDQpNw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgY2hvIGThu68gbGnhu4d1IG5o4buLIHBow6JuIGzDoCBt4buZdCBjw7RuZyBj4bulIHBow6JuIGxv4bqhaSBkw7luZyDEkeG7gyBk4buxIMSRb8OhbiBob+G6t2MgcGjDom4gYmnhu4d0IGdp4buvYSBoYWkgdMO5eSBjaOG7jW4uIEPDoWMgdMO5eSBjaOG7jW4gbsOgeSBjw7MgdGjhu4MgbMOgIGPDsyBob+G6t2Mga2jDtG5nIGPDsywgxJHDum5nIGhv4bq3YyBzYWksIDAgaG/hurdjIDEuIE3DtCBow6xuaCBuw6B5IHPhu60gZOG7pW5nIG3hu5FpIHF1YW4gaOG7hyB0dXnhur9uIHTDrW5oIGdp4buvYSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgKG5o4buvbmcgdGjDtG5nIHRpbiBjdW5nIGPhuqVwKSB2w6AgYmnhur9uIHBo4bulIHRodeG7mWMgKGvhur90IHF14bqjIGThu7EgxJFvw6FuKSDEkeG7gyDEkcawYSByYSBxdXnhur90IMSR4buLbmguDQoNCsSQ4buRaSB24bubaSBt4buXaSDEkWnhu4NtIGThu68gbGnhu4d1LCBtw7QgaMOsbmggc+G6vSB0w61uaCB0b8OhbiBt4buZdCBnacOhIHRy4buLIGThu7EgxJFvw6FuICh0aMaw4budbmcgbMOgIHjDoWMgc3XhuqV0KSBk4buxYSB0csOqbiBjw6FjIHRow7RuZyB0aW4gxJHGsOG7o2MgY3VuZyBj4bqlcC4gR2nDoSB0cuG7iyBk4buxIMSRb8OhbiBuw6B5IHNhdSDEkcOzIMSRxrDhu6NjIHNvIHPDoW5oIHbhu5tpIG3hu5l0IG5nxrDhu6FuZyBxdXnhur90IMSR4buLbmggKHRoxrDhu51uZyBsw6AgMC41KS4gTuG6v3UgZ2nDoSB0cuG7iyBk4buxIMSRb8OhbiBs4bubbiBoxqFuIG5nxrDhu6FuZywgbcO0IGjDrG5oIHPhur0gZOG7sSDEkW/DoW4ga+G6v3QgcXXhuqMgbMOgIG3hu5l0IHTDuXkgY2jhu41uLCB2w6AgbmfGsOG7o2MgbOG6oWkgbuG6v3UgZ2nDoSB0cuG7iyBk4buxIMSRb8OhbiBuaOG7jyBoxqFuIG5nxrDhu6FuZywgbcO0IGjDrG5oIHPhur0gZOG7sSDEkW/DoW4ga+G6v3QgcXXhuqMgbMOgIHTDuXkgY2jhu41uIGPDsm4gbOG6oWkuDQoNCk3DtCBow6xuaCBuw6B5IMSRxrDhu6NjIHjDonkgZOG7sW5nIGLhurFuZyBjw6FjaCB0w6xtIGPDoWMgaOG7hyBz4buRICh0cuG7jW5nIHPhu5EpIHThu5F0IG5o4bqldCBzYW8gY2hvIGjDoG0gdHV54bq/biB0w61uaCBtw7QgdOG6oyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCB2w6AgYmnhur9uIHBo4bulIHRodeG7mWMgY8OgbmcgdOG7kXQuIFF1w6EgdHLDrG5oIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIHRo4buxYyBoaeG7h24gYuG6sW5nIGPDoWNoIHPhu60gZOG7pW5nIGThu68gbGnhu4d1IMSRw6MgYmnhur90IChk4buvIGxp4buHdSBodeG6pW4gbHV54buHbikgxJHhu4MgdMOsbSByYSBjw6FjIGjhu4cgc+G7kSBwaMO5IGjhu6NwIG5o4bqldCBzYW8gY2hvIG3DtCBow6xuaCBjw7MgdGjhu4MgZOG7sSDEkW/DoW4gY2jDrW5oIHjDoWMga+G6v3QgcXXhuqMgY2hvIGPDoWMgxJFp4buDbSBk4buvIGxp4buHdSBt4bubaSBjaMawYSBiaeG6v3QgdHLGsOG7m2MuDQogIA0KIyMgTcO0IGjDrG5oIG5naGnDqm4gY+G7qXUNCg0KIyMjIELhuqNuZyB04bqnbiBz4buRIC0gQuG6o25nIHThuqduIHN14bqldA0KDQpC4bqjbmcgdOG6p24gc+G7kSAtIELhuqNuZyB04bqnbiBzdeG6pXQgY8OybiDEkcaw4bujYyBn4buNaSBsw6AgYuG6o25nIG5n4bqrdSBuaGnDqm4uIEtoaSBs4bqtcCBi4bqjbmcgbmfhuqt1IG5oacOqbiBjaG8gMiBiaeG6v24gdGjDrCBi4bqjbmcgxJHDsyDEkcaw4bujYyBn4buNaSBsw6AgYuG6o25nIG5n4bqrdSBuaGnDqm4gMiBjaGnhu4F1LCBu4bq/dSBs4bqtcCBjaG8gMyBiaeG6v24gdGjDrCBn4buNaSBsw6AgYuG6o25nIG5n4bqrdSBuaGnDqm4gMyBjaGnhu4F1IHbDoCBj4bupIHRo4bq/IHTEg25nIGzDqm4uDQoNCsSQ4buRaSB24bubaSBi4bqjbmcgdOG6p24gc+G7kSBjaMO6bmcgdGEgcXV5IMaw4bubYyBiaeG6v24gcGjhu6UgdGh14buZYyAoZGVwZW5kZW50L291dGNvbWUvcmVzcG9uc2UgdmFyaWFibGUpIMSRxrDhu6NjIHjhuq9wIHjhur9wIHRoZW8gY+G7mXQsIGJp4bq/biDEkeG7mWMgbOG6rXAgKGluZGVwZW5kZW50L2V4cGxhbmF0b3J5L3ByZWRpY3RvciB2YXJpYWJsZSkgxJHGsOG7o2MgeOG6r3AgeOG6v3AgdGhlbyBow6BuZy4NCiAgICANCiMjIyBS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmVsYXRpdmUgUmlzay9SaXNrIFJhdGlvKQ0KDQpS4bunaSBybyB0xrDGoW5nIMSR4buRaSBsw6AgbeG7mXQgY2jhu4kgc+G7kSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkcOhbmggZ2nDoSBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3hu5l0IHnhur91IHThu5Egbmd1eSBjxqEgdsOgIG3hu5l0IGvhur90IHF14bqjLiDEkMaw4bujYyB0w61uaCBi4bqxbmcgY8OhY2ggY2hpYSB04bu3IGzhu4cgbeG6r2MgYuG7h25oIOG7nyBuaOG7r25nIG5nxrDhu51pIGPDsyB54bq/dSB04buRIG5ndXkgY8ahIGNobyB04bu3IGzhu4cgbeG6r2MgYuG7h25oIOG7nyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgeeG6v3UgdOG7kSBuZ3V5IGPGoS4gUlIgxJHGsOG7o2MgYmnhu4N1IHRo4buLIGTGsOG7m2kgZOG6oW5nIHPhu5EuIE7hur91IFJSIGzhu5tuIGjGoW4gMSwgxJFp4buBdSDEkcOzIGPDsyBuZ2jEqWEgbMOgIHnhur91IHThu5Egbmd1eSBjxqEgbMOgbSB0xINuZyBuZ3V5IGPGoSBt4bqvYyBi4buHbmguIE7hur91IHLhu6dpIHJvIGLhurFuZyAxLCDEkWnhu4F1IMSRw7MgY8OzIG5naMSpYSBsw6AgeeG6v3UgdOG7kSBuZ3V5IGPGoSBraMO0bmcgY8OzIHTDoWMgxJHhu5luZyDEkeG6v24gbmd1eSBjxqEgbeG6r2MgYuG7h25oLiBO4bq/dSBSUiBuaOG7jyBoxqFuIDEsIMSRaeG7gXUgxJHDsyBjw7MgbmdoxKlhIGzDoCB54bq/dSB04buRIG5ndXkgY8ahIGzDoG0gZ2nhuqNtIG5ndXkgY8ahIG3huq9jIGLhu4duaC4gcuG7p2kgcm8gbMOgIG3hu5l0IGNo4buJIHPhu5EgcXVhbiB0cuG7jW5nIMSR4buDIMSRw6FuaCBnacOhIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbeG7mXQgeeG6v3UgdOG7kSBuZ3V5IGPGoSB2w6AgbeG7mXQga+G6v3QgcXXhuqMuIFR1eSBuaGnDqm4sIGPhuqduIGzGsHUgw70gcuG6sW5nIHLhu6dpIHJvIGtow7RuZyBwaOG6o2kgbMO6YyBuw6BvIGPFqW5nIGzDoCBjaOG7iSBz4buRIGR1eSBuaOG6pXQgY+G6p24geGVtIHjDqXQuIFRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwLCBjw6FjIGNo4buJIHPhu5Ega2jDoWMsIGNo4bqzbmcgaOG6oW4gbmjGsCBuZ3V5IGPGoSB0dXnhu4d0IMSR4buRaSAoQVIpLCBjw7MgdGjhu4MgcXVhbiB0cuG7jW5nIGjGoW4uDQogIA0KS8O9IGhp4buHdSAkz4BfaSQgbMOgIHThu7cgbOG7hyDigJx0aMOgbmggY8O0bmfigJ0gY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgKHJlc3BvbnNlIHZhcmlhYmxlKSB0xrDGoW5nIOG7qW5nIHbhu5tpIHThu6tuZyBiaeG7g3UgaGnhu4duIGPhu6dhIGJp4bq/biDEkeG7mWMgbOG6rXAuDQpU4burIGLhuqNuZyB04bqnbiB4deG6pXQsIGNow7puZyB0YSB0w61uaCAkXGZyYWN7XHBpXzF9e1xwaV8yfSQsIHBow6JuIHPhu5EgbsOgeSBn4buNaSBsw6AgUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJlbGF0aXZlIHJpc2spIGdp4buvYSAyIGJp4buDdSBoaeG7h24ga2jDoWMgbmhhdSBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYy4NCg0KIyMjIFThu7cgbOG7hyBjaMOqbmggKE9kZCBSYXRpbykNCg0KVOG7tyBs4buHIGNow6puaCAoT2RkKSBsw6AgbeG7mXQgY2jhu4kgc+G7kSDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDEkW8gY8aw4budbmcgxJHhu5kgY+G7p2EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBoYWkgYmnhur9uIHBow6JuIGxv4bqhaS4gT2RkIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw6FjaCBjaGlhIHThu7cgbOG7hyBjaMOqbmggZMawxqFuZyBjaG8gdOG7tyBs4buHIGNow6puaCDDom0uIE9kZCB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgY8OhYyBuZ2hpw6puIGPhu6l1IHF1YW4gc8OhdCwgdHJvbmcgxJHDsyBjw6FjIG5ow6AgbmdoacOqbiBj4bupdSBxdWFuIHPDoXQgY8OhYyBiaeG6v24gc+G7kSBtw6Aga2jDtG5nIGPhu5EgZ+G6r25nIGtp4buDbSBzb8OhdCBjaMO6bmcuIE9kZCBraMO0bmcgcGjhuqNpIGzDoCBt4buZdCDGsOG7m2MgbMaw4bujbmcgY2jDrW5oIHjDoWMgY+G7p2Egbmd1eSBjxqEgdHV54buHdCDEkeG7kWksIG5oxrBuZyBuw7MgY8OzIHRo4buDIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIG5ndXkgY8ahIHTGsMahbmcgxJHhu5FpIGPhu6dhIGPDoWMga+G6v3QgcXXhuqMga2jDoWMgbmhhdS5PZGQgxJHGsOG7o2MgYmnhu4N1IHRo4buLIGTGsOG7m2kgZOG6oW5nIHPhu5EuIE7hur91IE9kZCBs4bubbiBoxqFuIDEsIMSRaeG7gXUgxJHDsyBjw7MgbmdoxKlhIGzDoCBiaeG6v24gcGjDom4gbG/huqFpIMSR4bqndSB0acOqbiBjw7MgbGnDqm4gcXVhbiDEkeG6v24ga+G6v3QgcXXhuqMuIE7hur91IE9SIGLhurFuZyAxLCDEkWnhu4F1IMSRw7MgY8OzIG5naMSpYSBsw6AgYmnhur9uIHBow6JuIGxv4bqhaSDEkeG6p3UgdGnDqm4ga2jDtG5nIGxpw6puIHF1YW4gxJHhur9uIGvhur90IHF14bqjLiBO4bq/dSBPUiBuaOG7jyBoxqFuIDEsIMSRaeG7gXUgxJHDsyBjw7MgbmdoxKlhIGzDoCBiaeG6v24gcGjDom4gbG/huqFpIMSR4bqndSB0acOqbiBraMO0bmcgbGnDqm4gcXVhbiDEkeG6v24ga+G6v3QgcXXhuqMuDQogIA0KTuG6v3UgZ+G7jWkgeMOhYyBzdeG6pXQg4oCcdGjDoG5oIGPDtG5n4oCdIGPhu6dhIGJp4buDdSBoaeG7h24gdGjhu6kgaSBj4bunYSBiaeG6v24gxJHhu5ljIGzhuq1wIGzDoCAkz4BfaSQgdGjDrCBjaMO6bmcgdGEga8OtIGhp4buHdSBU4bu3IGzhu4cgY8aw4bujYyAob2RkKSBj4bunYSBiaeG7g3UgaGnhu4duIG7DoHkgbMOgICRvZGRfaSQgdsOgIMSRxrDhu6NjIMSR4buLbmggbmdoxKlhIG5oxrAgc2F1Og0KICAgIA0KICAkb2RkX2k9XGZyYWN7XHBpX2l9ezEtXHBpX2l9JA0KDQpOZ2jEqWEgbMOgIGNow7puZyB0YSB0w61uaCB04bu3IGzhu4cgdGjDoG5oIGPDtG5nIHRoZW8gdOG7q25nIGjDoG5nIHRyb25nIGLhuqNuZyBuZ+G6q3Ugbmhpw6puLg0KDQpU4bu3IGzhu4cgY2jDqm5oIGPhu6dhIGJp4buDdSBoaeG7h24gdGjhu6kgaSB2w6AgYmnhu4N1IGhp4buHbiB0aOG7qSBqIMSRxrDhu6NjIGvDrSBoaeG7h3UgbMOgICTOuF9paiQgdsOgIMSRxrDhu6NjIMSR4buLbmggbmdoxKlhOg0KDQokzrggPSBcZnJhY3tvZGRfaX17b2RkX2p9ID0gXGZyYWN7z4BfaSgxLc+AX2opfXvPgF9qKDEtz4BfaSl9JA0KDQojIyMgUGjDom4gcGjhu5FpIFBvaXNzb24NCg0KUGjDom4gcGjhu5FpIFBvaXNzb24gduG7m2kgdGhhbSBz4buRICRcbGFtYmRhIChcbGFtYmRhID4gMCQgY8OzIGjDoG0gcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IG5oxrAgc2F1Og0KICANCiAgJHBfayA9IFAoWSA9IGspID0gXGZyYWN7XGxhbWJkYV5rLmVeey1cbGFtYmRhfX17ayF9LCBrID0gMCwxLDIsLi4uJA0KICANCktoaSDEkcOzIHRhIHZp4bq/dDogJFkkIH4gJFAoXGxhbWJkYSkkIMSR4buDIGNo4buJIHLhurFuZzogJFkkIGPDsyBwaMOibiBwaOG7kWkgeMOhYyBzdeG6pXQgUG9pc3NvbiB24bubaSB0aGFtIHPhu5EgJFxsYW1iZGEkLiBHacOhIHRy4buLIHRydW5nIGLDrG5oIGtoaSDEkcOzIGPhu6dhIG7DsyBsw6AgJEVZID0gXGxhbWJkYSQgdsOgIHBoxrDGoW5nIHNhaSBsw6AgJFZhclkgPSBcbGFtYmRhJC4NCiAgDQpO4bq/dSAkWV8xLCBZXzIsLi4uLCBZX20kIGzDoCBjw6FjIGJp4bq/biBuZ+G6q3Ugbmhpw6puIMSR4buZYyBs4bqtcCBjw7MgY8O5bmcgcGjDom4gcGjhu5FpIFBvaXNzb24gJFAoXGxhbWJkYSkkIHRow6wgJFkgPSBZXzEgKyBZXzIgKyAuLi4gKyBZX20kIGzDoCBiaeG6v24gbmfhuqt1IG5oacOqbiBjw7MgcGjDom4gcGjhu5FpIFBvaXNzb24gJFAobVxsYW1iZGEpJC4NCiAgDQojIyMgUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJlbGF0aXZlIFJpc2spDQoNClPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgdOG7tyBs4buHICRccGlfMSQgdsOgICRccGlfMiQgxJHGsOG7o2MgxJHDoW5oIGdpw6EgcXVhIHNhaSBz4buRIHR1eeG7h3QgxJHhu5FpICgkXHBpXzEgLSBccGlfMiQpIGNo4buJIGThu7FhIHbDoG8ga2hv4bqjbmcgY8OhY2ggZ2nhu69hIGhhaSB04bu3IGzhu4cgbsOgeSB2w6AgYuG7jyBxdWEgxJHhu5kgbOG7m24gdsOgIMO9IG5naMSpYSBj4bunYSBjaMO6bmcsIG5naMSpYSBsw6Aga2hv4bqjbmcgY8OhY2ggbmjGsCBuaGF1IHRow6wgxJHDoW5oIGdpw6Egc2FpIGzhu4djaCBuaMawIG5oYXUuDQpHaeG6oyBz4butICRccGlfMSQgdsOgICRccGlfMiQgbMOgIHjDoWMgc3XhuqV0IHRow6BuaCBjw7RuZyBj4bunYSBoYWkgbmjDs20gdGjDrCBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBnaeG7r2EgaGFpIG5ow61tIG7DoHkgbMOgIHThu7cgbOG7hyB4w6FjIHN14bqldCB0aMOgbmggY8O0bmcgY+G7p2EgaGFpIG5ow7NtOiAkXGZyYWN7XHBpXzF9e1xwaV8yfSQNCiAgDQpDw6FjIHThu7cgbOG7hyB04buVbmcgdGjhu4MgJFxwaV8xJCB2w6AgJFxwaV8yJCBsw6AgY2jGsGEgYmnhur90LCB0YSBuaOG6rW4gxJHGsOG7o2MgY8OhYyB04bu3IGzhu4cgbeG6q3UgdMawxqFuZyDhu6luZyBsw6AgJGZfMSQgdsOgICRmXzIkLiBLaGkgxJHDsywgdGEgZMO5bmcgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbeG6q3UgJFxmcmFje2ZfMX17Zl8yfSQgxJHhu4MgeOG6pXAgeOG7iSBjaG8gcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgJFxmcmFje1xwaV8xfXtccGlfMn0kIHRyw6puIHThu5VuZyB0aOG7gy4NCiAgICANCiMjIyMgVOG7tyBs4buHIGNow6puaCAoT2RkcyBSYXRpb3MpDQoNClThu7cgbOG7hyBjxrDhu6NjIChPZGRzKSBsw6AgdOG7tyBs4buHIGdp4buvYSBraOG6oyBuxINuZyB0aMOgbmggY8O0bmcgdsOgIGto4bqjIG7Eg25nIGtow7RuZyB0aMOgbmggY8O0bmcgdHJvbmcgY8O5bmcgbeG7mXQgxJFp4buBdSBraeG7h24gdMOhYyDEkeG7mW5nIGPhu6dhIGJp4bq/biBnaeG6o2kgdGjDrWNoLCBrw70gaGnhu4d1ICRvZGRzX2kkOg0KICANCiAgJG9kZHNfaSA9IFxmcmFje1xwaV9pfXsxIC0gXHBpX2l9JA0KICANClThu7cgbOG7hyBjaMOqbmggKE9kZHMgUmF0aW8pIGPhu6dhIGjDoG5nIDEgdsOgIGjDoG5nIDIsIMSRxrDhu6NjIGvDvSBoaeG7h3UgbMOgICRcdGhldGEkLCBsw6AgdOG7tyBz4buRIGdp4buvYSB04bu3IGzhu4cgY8aw4bujYyBj4bunYSB0aMOgbmggY8O0bmcg4bufIGjDoG5nIDEgdsOgIHThu7cgbOG7hyBjxrDhu6NjIGPhu6dhIHRow6BuaCBjw7RuZyDhu58gaMOgbmcgMjoNCiAgDQogICRcdGhldGEgPSBcZnJhY3tvZGRzXzF9e29kZHNfMn0gPSBcZnJhY3tccGlfMSgxIC0gXHBpXzIpfXtccGlfMigxIC0gXHBpXzEpfSQNCg0KIyMjIE3DtCBow6xuaCB0dXnhur9uIHTDrW5oDQoNCkdMTSAoR2VuZXJhbCBMaW5lYXIgTW9kZWwpIGzDoCBt4buZdCBtw7QgaMOsbmggdHV54bq/biB0w61uaCB04buVbmcgcXXDoXQgZ2nhuqNpIHRow61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3hu5l0IGjDoG0ga+G7syB24buNbmcgY8OzIMSRaeG7gXUga2nhu4duIHbhu5tpIGPDoWMgYmnhur9uIGdp4bqjaSB0aMOtY2ggdGjDtG5nIHF1YSBt4buZdCBwaMawxqFuZyB0csOsbmggZOG7sSDEkW/DoW4gY8OzIGThuqFuZyB0dXnhur9uIHTDrW5oLg0KICANCkdMTSBwaOG7lSBiaeG6v24gdsOsIG7DsyBjw7MgdGjhu4MgeOG7rSBsw70gbmhp4buBdSBsb+G6oWkgZOG7ryBsaeG7h3UgduG7m2kgY8OhYyBraeG7g3UgYmnhur9uIHBo4bqjbiDhu6luZyBraMOhYyBuaHVhIG5oxrAgbmjhu4sgdGjhu6ljLCBQb2lzc29uIGhheSDEkWEgdGjhu6ljLg0KICANCsSQ4buDIG3DtCBow6xuaCBow7NhIOG6o25oIGjGsOG7n25nIGPhu6dhIFggbMOgIHPhu60gZOG7pW5nIGThuqFuZyBo4buTaSBxdXkgdHV54bq/biB0w61uaCBj4buVIMSRaeG7g24sIHRoZW8gxJHDsyBnacOhIHRy4buLIGvhu7MgduG7jW5nIGPDsyDEkWnhu4F1IGtp4buHbiBj4bunYSBZIGzDoCBt4buZdCBow6BtIHR1eeG6v24gdMOtbmggY+G7p2EgWC4NCiAgDQogICRccGkoeCkgPSBcYmV0YV8wICsgXGJldGFfMS54JA0KICANCsSQw6J5IGzDoCBHTE0gduG7m2kgdGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIG5o4buLIHRo4bupYyB2w6AgaMOgbSBsacOqbiBr4bq/dCDEkeG7k25nIG5o4bqldC4gTcO0IGjDrG5oIG7DoHkgxJHGsOG7o2MgZ+G7jWkgbMOgIG3DtCBow6xuaCB4w6FjIHN14bqldCB0dXnhur9uIHTDrW5oIGhheSBMUE0gKF9MaW5lYXIgUHJvYmFiaWxpdHkgTW9kZWxfKS4gJFxiZXRhXzEkIGJp4buDdSB0aOG7iyBjaG8gc+G7sSB0aGF5IMSR4buVaSB4w6FjIHN14bqldCBjaG8gbeG7l2kgxJHGoW4gduG7iyB0aGF5IMSR4buVaSBj4bunYSB4Lg0KICANCiMjIyMgTcO0IGjDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYw0KDQrEkOG7gyBraOG6r2MgcGjhu6VjIG3hu5l0IHPhu5EgaOG6oW4gY2jhur8gY+G7p2EgTFBNLCBuZ8aw4budaSB0YSDEkeG7gSB4deG6pXQgbeG7mXQgaMOgbSBsacOqbiBr4bq/dCBtw6AgbsOzIMSR4buTbmcgYmnhur9uIHbhu5tpIHjDoWMgc3XhuqV0ICRccGkkIHbDoCBnacOhIHRy4buLIGJp4bq/biB0aGnDqm4gY+G7p2EgbsOzIGzDoCB0w7l5IMO9IMSRw7MgbMOgICRsb2coXGZyYWN7XHBpKHgpfXsxIC0gXHBpKHgpfSkkLCDEkcaw4bujYyBn4buNaSBsw6AgaMOgbSBsb2dpc3RpYyBoYXkgbG9naXQoJFxwaSQpLg0KICANCk3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQ6DQogIA0KICAkbG9nKFxmcmFje1xwaSh4KX17MSAtIFxwaSh4KX0pID0gXGJldGFfMCArIFxiZXRhXzEueF8xICsgXGJldGFfMi54XzIgKyAuLi4gK1xiZXRhX20ueF9tJA0KICANClRyb25nIMSRw7MgJFxiZXRhXzAsIFxiZXRhXzEsLi4uLCBcYmV0YV9tJCBsw6AgaOG7hyBz4buRIGjhu5NpIHF1eS4NCiAgDQojIyMjIE3DtCBow6xuaCBQcm9iaXQNCg0KTcO0IGjDrG5oIFByb2JpdCDEkcaw4bujYyBz4butIGR1bmcgxJHhu4MgxrDhu5tjIGzGsOG7o25nIG3DtCBow6xuaCBjw7MgYmnhur9uIHBo4bulIHRodeG7mWMgZOG6oW5nIG5o4buLIHBow6JuLiBNw7QgaMOsbmggUHJvYml0IGzDoCBt4buZdCBHTE0gduG7m2kgdGjDoG5oIHBo4bqnbiBuZ+G6q3Ugbmhpw6puIG5o4buLIHBow6JuIHbDoCBsacOqbiBr4bq/dCBQcm9iaXQuIEjDoG0gaMO0aSBxdXkgUHJvYml0IGPDsyBk4bqhbmc6DQogIA0KICAkXHBpKHgpID0gXHBoaShcYWxwaGEgKyBcYmV0YSB4KSQNClRyb25nIMSRw7MsICRccGhpKHgpID0gXGZyYWN7MX17XHNxcnR7MlxwaX19XGludF97LVxpbmZ0eX1ee3h9ZV57LVxmcmFjezF9ezJ9dF4yfWR0JCBsw6AgaMOgbSBwaMOibiBwaOG7kWkgY2h14bqpbiBjaMOtbmggdOG6r2MuDQpW4bubaSAkUHJvYml0KFxwaSh4KSkgPSBccGhpXnstMX0oXHBpKHgpKSQsIHRhIGPDsyBtw7QgaMOsbmggUHJvYml0Og0KICANCiAgJFByb2JpdChccGkoeCkpID0gXGFscGhhICsgXGJldGEgeCQNCg0KIyMjIyBDaOG7iSBz4buRIMSRw6FuaCBnacOhIG3DtCBow6xuaCBBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpYW4pDQoNCkPDtG5nIHRo4bupYyDEkcaw4bujYyBz4butIGThu6VuZyBjaG8gQUlDIHRyb25nIFIgbMOgOg0KDQogICRBSUMgPSBEZXZpYW5jZSArIDIuayQgKHbhu5tpIGsgbMOgIHRoYW0gc+G7kSBj4bunYSBtw7QgaMOsbmgpDQogIA0KQUlDIGPDoG5nIGLDqSB0aMOsIG3DtCBow6xuaCBjw6BuZyBjaMOtbmggeMOhYy4NCiAgDQojIyMjIENo4buJIHPhu5EgxJHDoW5oIGdpw6EgbcO0IGjDrG5oIEJpZXINCg0KQ2jhu4kgc+G7kSBCcmllciBsw6AgdHJ1bmcgYsOsbmggY+G7p2EgdOG7lW5nIGLDrG5oIHBoxrDGoW5nIGPDoWMgxJHhu5kgY2jDqm5oIGzhu4djaCBnaeG7r2EgZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYyBZIHbDoCBnacOhIHRy4buLIMaw4bubYyBsxrDhu6NuZyBj4bunYSBuw7MuDQoNCiAgJEIgPSBcZnJhY3sxfXtufVxzdW1fe2kgPSAxfV5uKFlfaSAtIFxoYXRccGlfaSleMiA9IFxmcmFje3N1bSBzcXVhcmUgcmVzaWR9e259JA0KICANCiMjIyBDaOG7iSBz4buRIMSRw6FuaCBnacOhIG3DtCBow6xuaCBEZXZpYW5jZQ0KDQpEZXZpYW5jZSBjxaluZyBsw6AgbeG7mXQgdGnDqnUgY2jDrSBy4bqldCBwaOG7lSBiaeG6v24gxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgxJHDoW5oIGdpw6EgbeG7mXQgbcO0IGjDrG5oIGjhu5NpIHF1eSDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgYuG7n2kgcGjGsMahbmcgcGjDoXAgSOG7o3AgbMO9IGPhu7FjIMSR4bqhaSAoTUwpLiBN4buZdCBjw6FjaCB04buVbmcgcXXDoSwgY8WpbmcgZ2nhu5FuZyBuaMawIGNo4buJIHRpw6p1IEFJQywgZ2nDoSB0cuG7iyBj4bunYSBEZXZpYW5jZSBjw6BuZyBuaOG7jyB0aMOsIG3DtCBow6xuaCBjw6BuZyB04buRdC4NCg0KIyMjIE1hIHRy4bqtbiBuaOG6p20gbOG6q24NCg0KTWEgdHLhuq1uIG5o4bqnbSBs4bqrbiBsw6AgeeG6v3UgdOG7kSBnacO6cCBzbyBzw6FuaCBnacOhIHRy4buLIHRo4buxYyB04bq/IHbDoCBnacOhIHRy4buLIGThu7EgYsOhby4gVHJvbmcgbWEgdHLhuq1uIG5o4bqnbSBs4bqrbiBuZ8aw4budaSB0YSB4w6l0IGPDoWMgY2jhu4kgc+G7kTogxJDhu5kgY2jDrW5oIHjDoWMgdG/DoG4gdGjhu4MsIMSR4buZIG5o4bqheSwgxJHhu5kgxJHhurdjIGhp4buHdSwuLi4NCiAgDQpUcm9uZyBtYSB0cuG6rW4gbmjhuqdtIGzhuqtuLCBjw6FjIGNo4buJIHPhu5EgcXVhbiANCnRy4buNbmcgxJHGsOG7o2MgY2jDuiDDvSBsw6AgxJHhu5kgbmjhuqF5IHbDoCDEkeG7mSDEkeG6t2MgaGnhu4d1LiBDw6FjIGNo4buJIHPhu5EgbsOgeSBjw6BuZyBs4bubbiBjw6BuZyB04buRdC4NCiAgDQojIyMgxJDhu5kgbmjhuqF5IHbDoCDEkeG7mSDEkeG6t2MgaGnhu4d1DQoNCiAgKsSQ4buZIG5o4bqheSAoc2Vuc2l0aXZpdHkpKiBj4bunYSBt4buZdCB0aMOtIG5naGnhu4dtOiBMw6AgdOG7tyBs4buHICglKSBj4bunYSBz4buRIGNhIGLhu4sgYuG7h25oIHRo4buxYyBz4buxIGtoaSB4w6l0IG5naGnhu4dtIHbDoCBjaG8ga+G6v3QgcXXhuqMgZMawxqFuZyB0w61uaCB24bubaSB04buVbmcgc+G7kSBjYSBi4buLIGLhu4duaC4gQ8O0bmcgdGjhu6ljIMSR4buDIHTDrW5oIMSR4buZIG5o4bqheToNCg0KICAgIMSQ4buZIG5o4bqheSA9IHPhu5EgZMawxqFuZyB0w61uaCB0aOG6rXQvKHPhu5EgxJHGsMahbmcgdMOtbmggdGjhuq10ICsgc+G7kSDDom0gdMOtbmggZ2nhuqMpDQoNCiAgKsSQ4buZIMSR4bq3YyBoaeG7h3UgKHNwZWNpZmljaXR5KSogY+G7p2EgbeG7mXQgdGjDrSBuZ2hp4buHbTogTMOgIHThu7cgbOG7hyAoJSkgY+G7p2Egc+G7kSBjYSBraMO0bmcgYuG7iyBi4buHbmggdsOgIGvhur90IHF14bqjIHjDqXQgbmdoaeG7h20ga2jDtG5nIGLhu4sgYuG7h25oIHbhu5tpIHThu5VuZyBz4buRIG5nxrDhu51pIGtow7RuZyBi4buLIGLhu4duaC4gQ8O0bmcgdGjhu6ljIHTDrW5oIMSR4buZIMSR4bq3YyBoaeG7h3U6DQoNCiAgICDEkOG7mSDEkeG6t2MgaGnhu4d1ID0gU+G7kSB0csaw4budbmcgaOG7o3Agw6JtIHTDrW5oIHRo4bqtdC8gKHPhu5EgdHLGsOG7nW5nIGjhu6NwIMOibSB0w61uaCB0aOG6rXQgKyBz4buRIHRyxrDhu51uZyBo4bujcCBkxrDGoW5nIHTDrW5oIGdp4bqjKQ0KIyBDaMawxqFuZyA0LiBL4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1DQoNCiMjIFThu5VuZyBxdWFuIHbhu4EgZOG7ryBsaeG7h3UNCg0KQuG7mSBk4buvIGxp4buHdSBz4butIGThu6VuZyB0cm9uZyBwaMOibiB0w61jaCDEkcaw4bujYyBs4bqleSB04burIHRyYW5nIFtrYWdnbGUuY29tXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzKSwgxJHGsOG7o2MgY2hpYSBz4bq7IGLhu59pIE1JU0hSQTUwMDEgKDIwMTkpIGJhbyBn4buTbSAxNCBiaeG6v24gdsOgIDcwMCBxdWFuIHPDoXQgxJHhu4MgcGjhu6VjIHbhu6UgcGjDom4gdMOtY2guIFRyb25nIMSRw7MsIGPDsyAwOSBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgMDUgYmnhur9uIMSR4buLbmggbMaw4bujbmcuIA0KDQoqIFNLX0lEX0NVUlI6IE3DoyDEkeG7i25oIGRhbmggY2hvIG3hu5dpIGtow6FjaCBow6BuZyANCg0KKiBOQU1FX0NPTlRSQUNUX1RZUEU6IExv4bqhaSBo4bujcCDEkeG7k25nIHZheSANCg0KKiBDT0RFX0dFTkRFUjogR2nhu5tpIHTDrW5oIGPhu6dhIGtow6FjaCBow6BuZyANCg0KKiBGTEFHX09XTl9DQVI6IEPDsyBz4bufIGjhu691IHhlIGjGoWkgaGF5IGtow7RuZyANCg0KKiBGTEFHX09XTl9SRUFMVFk6IEPDsyBz4bufIGjhu691IGLhuqV0IMSR4buZbmcgc+G6o24gaGF5IGtow7RuZw0KDQoqIENOVF9DSElMRFJFTjogU+G7kSBsxrDhu6NuZyBjb24gY8OhaSBj4bunYSBraMOhY2ggaMOgbmcgDQoNCiogQU1UX0lOQ09NRV9UT1RBTDogVOG7lW5nIHRodSBuaOG6rXAgaMOgbmcgbsSDbSBj4bunYSBraMOhY2ggaMOgbmcNCg0KKiBBTVRfQ1JFRElUOiBI4bqhbiBt4bupYyB2YXkNCg0KKiBBTVRfQU5OVUlUWTogU+G7kSB0aeG7gW4gdHLhuqMgaMOgbmcgdGjDoW5nIA0KDQoqIE5BTUVfVFlQRV9TVUlURTogTG/huqFpIG5nxrDhu51pIHRo4bulIGjGsOG7n25nIGjhu6NwIMSR4buTbmcgdmF5IA0KDQoqIE5BTUVfSU5DT01FX1RZUEU6IExv4bqhaSB0aHUgbmjhuq1wIGPhu6dhIGtow6FjaCBow6BuZw0KDQoqIE5BTUVfRURVQ0FUSU9OX1RZUEU6IFRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBraMOhY2ggaMOgbmcNCg0KKiBOQU1FX0ZBTUlMWV9TVEFUVVM6IFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibi9naWEgxJHDrG5oIGPhu6dhIGtow6FjaCBow6BuZw0KDQoqIE5BTUVfSE9VU0lOR19UWVBFOiBMb+G6oWkgaMOsbmggbmjDoCDhu58gY+G7p2Ega2jDoWNoIGjDoG5nIA0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInJlYWR4bCIpDQpsaWJyYXJ5KHJlYWR4bCkNCmRhdGEgPC0gcmVhZF9leGNlbCgiRDovdGlldWx1YW5wdC54bHN4IikNClZpZXcoZGF0YSkNCnN0cihkYXRhKQ0KYGBgDQoNCiMjIENo4buNbiBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgYmnhur9uIMSR4buLbmggbMaw4bujbmcgbMOgbSBiaeG6v24gcGjhu6UgdGh14buZYw0KDQojIyMgQ2jhu41uIGJp4bq/biDEkeG7i25oIHTDrW5oIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgDQoNCioqUGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSB2YXkgdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nKioNCg0KKkNo4buNbiBiaeG6v24gTkFNRV9DT05UUkFDVF9UWVBFIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMqDQoNClF1eeG6v3QgxJHhu4tuaCBow6xuaCB0aOG7qWMgdmF5IHbhu5FuIGPhu6dhIGtow6FjaCBow6BuZyBsw6AgbeG7mXQgcXV54bq/dCDEkeG7i25oIG1hbmcgdMOtbmggY2hp4bq/biBsxrDhu6NjIHbDoCDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24gdMOsbmggaMOsbmggdMOgaSBjaMOtbmggdsOgIHBow6F0IHRyaeG7g24gY+G7p2EgY8OhIG5ow6JuIHbDoCBkb2FuaCBuZ2hp4buHcC4gVOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIHZp4buHYyBs4buxYSBjaOG7jW4gaMOsbmggdGjhu6ljIHZheSB24buRbiDEkcOhbmcgxJHGsOG7o2MgbmjhuqVuIG3huqFuaCwgdsOsIG7DsyBsacOqbiBxdWFuIHRy4buxYyB0aeG6v3AgxJHhur9uIGto4bqjIG7Eg25nIHRoYW5oIHRvw6FuIHbDoCBu4bujIG7huqduIGPhu6dhIGtow6FjaCBow6BuZy4gTeG7mXQgbOG7sWEgY2jhu41uIGjhu6NwIGzDvSB2w6AgcGjDuSBo4bujcCB24bubaSBraOG6oyBuxINuZyB0w6BpIGNow61uaCBz4bq9IGdpw7pwIHRyw6FuaCB0w6xuaCB0cuG6oW5nIHbhu6EgbuG7oyB2w6AgZ2nhuqNtIHRoaeG7g3UgcuG7p2kgcm8gdMOgaSBjaMOtbmguDQoNCkjGoW4gbuG7r2EsIHF1eeG6v3QgxJHhu4tuaCBow6xuaCB0aOG7qWMgdmF5IHbhu5FuIGPFqW5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBjw6FjaCBraMOhY2ggaMOgbmcgcXXhuqNuIGzDvSBjaGkgdGnDqnUgdsOgIMSR4bqndSB0xrAuIFbDrSBk4bulLCB2YXkgdGnhu4FuIG3hurd0IG1hbmcgbOG6oWkgc+G7sSBsaW5oIGhv4bqhdCB2w6AgdGnhu4duIGzhu6NpIHRyb25nIHPhu60gZOG7pW5nIHPhu5EgdGnhu4FuIHZheSwgdHJvbmcga2hpIHZheSB0w61uIGThu6VuZyBo4bqhbiBjaOG6vyB2aeG7h2Mgc+G7rSBk4bulbmcgc+G7kSB0aeG7gW4gdmF5IGNo4buJIGNobyBjw6FjIGdpYW8gZOG7i2NoIG5o4bqldCDEkeG7i25oLiDEkGnhu4F1IG7DoHkgxJHDsmkgaOG7j2kga2jDoWNoIGjDoG5nIHBo4bqjaSBjw6JuIG5o4bqvYyBr4bu5IGzGsOG7oW5nIHbDoCB4ZW0geMOpdCBt4bulYyB0acOqdSB0w6BpIGNow61uaCDEkeG7gyDEkcawYSByYSBxdXnhur90IMSR4buLbmggxJHDum5nIMSR4bqvbi4NCg0KVHV5IG5oacOqbiwgdOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIHZp4buHYyByYSBxdXnhur90IMSR4buLbmggaMOsbmggdGjhu6ljIHZheSB24buRbiBraMO0bmcgY2jhu4kgZOG7q25nIGzhuqFpIOG7nyBraMOtYSBj4bqhbmggY8OhIG5ow6JuIG3DoCBjw7JuIHTDoWMgxJHhu5luZyBsw6puIHPhu7EgcGjDoXQgdHJp4buDbiBraW5oIHThur8gdOG7lW5nIHRo4buDLiBLaGkga2jDoWNoIGjDoG5nIHbDoCBkb2FuaCBuZ2hp4buHcCBjw7Mga2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIHTDrW4gZOG7pW5nIHbDoCB2YXkgduG7kW4gcGjDuSBo4bujcCwgaOG7jSBjw7MgdGjhu4MgdGjDumMgxJHhuql5IHPhu7EgdMSDbmcgdHLGsOG7n25nIGtpbmggdOG6vywgdOG6oW8gdmnhu4djIGzDoG0gdsOgIMSRw7NuZyBnw7NwIHbDoG8gc+G7sSBwaMOhdCB0cmnhu4NuIGPDoWMgbmfDoG5oIGPDtG5nIG5naGnhu4dwLg0KDQrEkGnhu4F1IG7DoHkgY8OgbmcgxJHDoW5nIGNow7ogw70ga2hpIGPDoWMgdOG7lSBjaOG7qWMgdMOgaSBjaMOtbmggdsOgIG5nw6JuIGjDoG5nIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIGN1bmcgY+G6pXAgY8OhYyBz4bqjbiBwaOG6qW0gdsOgIGThu4tjaCB24bulIHTDoGkgY2jDrW5oIHBow7kgaOG7o3AgduG7m2kgbmh1IGPhuqd1IGPhu6dhIGtow6FjaCBow6BuZy4gUXV54bq/dCDEkeG7i25oIGjDrG5oIHRo4bupYyB2YXkgduG7kW4gxJHDsmkgaOG7j2kgc+G7sSB0xrAgduG6pW4gY2h1ecOqbiBuZ2hp4buHcCB04burIGPDoWMgY2h1ecOqbiBnaWEgdMOgaSBjaMOtbmggdsOgIHPhu7EgxJHhu5NuZyB0aHXhuq1uIGPhu6dhIGtow6FjaCBow6BuZyB0cm9uZyB2aeG7h2MgxJHGsGEgcmEgbOG7sWEgY2jhu41uIGjhu6NwIGzDvS4NCg0KVMOzbSBs4bqhaSwgdmnhu4djIHJhIHF1eeG6v3QgxJHhu4tuaCBow6xuaCB0aOG7qWMgdmF5IHbhu5FuIGzDoCBt4buZdCBxdcOhIHRyw6xuaCBxdWFuIHRy4buNbmcgdsOgIHBo4bupYyB04bqhcC4gVOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIG7DsyBraMO0bmcgY2jhu4kgbGnDqm4gcXVhbiDEkeG6v24ga2jhuqMgbsSDbmcgdMOgaSBjaMOtbmggY8OhIG5ow6JuIHbDoCBkb2FuaCBuZ2hp4buHcCBtw6AgY8OybiDEkcOzbmcgZ8OzcCB2w6BvIHPhu7EgcGjDoXQgdHJp4buDbiBraW5oIHThur8gdOG7lW5nIHRo4buDLiBWaeG7h2MgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIGjhu6NwIGzDvSB2w6AgY8OibiBuaOG6r2Mga+G7uSBsxrDhu6FuZyBnacO6cCDEkeG6o20gYuG6o28gdMOtbmgga2jhuqMgdGhpIHbDoCBhbiB0b8OgbiB0cm9uZyB2aeG7h2MgdmF5IHbhu5FuLCBnw7NwIHBo4bqnbiB04bqhbyBuw6puIHTGsMahbmcgbGFpIHTDoGkgY2jDrW5oIOG7lW4gxJHhu4tuaCB2w6AgYuG7gW4gduG7r25nLg0KDQojIyMgQ2jhu41uIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGzDoG0gYmnhur9uIHBo4bulIHRodeG7mWMgDQoNCioqUGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBo4bqhbiBt4bupYyB2YXkgY+G7p2Ega2jDoWNoIGjDoG5nKioNCg0KKkNo4buNbiBiaeG6v24gQU1UX0NSRURJVCBsw6BtIGJp4bq/biBwaOG7pSB0aHXhu5ljKg0KDQpI4bqhbiBt4bupYyB2YXkgduG7kW4gbMOgIG3hu5l0IGtow61hIGPhuqFuaCBxdWFuIHRy4buNbmcga2jDtG5nIHRo4buDIGLhu4sgY29pIG5o4bq5IHRyb25nIGzEqW5oIHbhu7FjIHTDoGkgY2jDrW5oIHbDoCBuZ8OibiBow6BuZy4gxJBp4buBdSBuw6B5IMSRw6FuZyBjaMO6IMO9IGLhu59pIHbDrCBo4bqhbiBt4bupYyB2YXkgY8OzIHTDoWMgxJHhu5luZyBs4bubbiDEkeG6v24gbmhp4buBdSBraMOtYSBj4bqhbmggY+G7p2EgY3Xhu5ljIHPhu5FuZyB0w6BpIGNow61uaCBj4bunYSBjw6EgbmjDom4gdsOgIGRvYW5oIG5naGnhu4dwLiBT4buxIHF1YW4gdHLhu41uZyBj4bunYSBo4bqhbiBt4bupYyB2YXkgduG7kW4gdGjhu4MgaGnhu4duIHF1YSB2aeG7h2MgbsOzIGdpw7pwIMSRw6FwIOG7qW5nIG5odSBj4bqndSB0w6BpIGNow61uaCBj4bunYSBraMOhY2ggaMOgbmcsIHThu6sgdmnhu4djIG11YSBz4bqvbSBow6BuZyBow7NhIMSR4bq/biB0aGFuaCB0b8OhbiBjw6FjIGtob+G6o24gY2hpIHBow60gaMOgbmcgbmfDoHksIMSR4buTbmcgdGjhu51pIGjhu5cgdHLhu6MgY8OhYyBkb2FuaCBuZ2hp4buHcCB0cm9uZyB2aeG7h2MgxJHhuqd1IHTGsCB2w6AgbeG7nyBy4buZbmcga2luaCBkb2FuaC4gDQoNClR1eSBuaGnDqm4sIHZp4buHYyBxdeG6o24gbMO9IGjhuqFuIG3hu6ljIHZheSB24buRbiBj4bqnbiDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGPhuqluIHRo4bqtbiDEkeG7gyB0csOhbmggbmjhu69uZyB0w6FjIMSR4buZbmcgdGnDqnUgY+G7sWMuIEPDoWMgdOG7lSBjaOG7qWMgdMOtbiBk4bulbmcgdGjGsOG7nW5nIHhlbSB4w6l0IGPDoWMgeeG6v3UgdOG7kSBuaMawIGto4bqjIG7Eg25nIHRy4bqjIG7hu6MsIGzhu4tjaCBz4butIHTDrW4gZOG7pW5nLCB0w6BpIHPhuqNuIGLhuqNvIMSR4bqjbSwuLi4gxJHhu4MgeMOhYyDEkeG7i25oIGjhuqFuIG3hu6ljIHZheSB24buRbiBwaMO5IGjhu6NwLiDEkGnhu4F1IG7DoHkgZ2nDunAgZ2nhuqNtIHRoaeG7g3UgcuG7p2kgcm8gY2hvIGPhuqMgbmfGsOG7nWkgdmF5IHbDoCB04buVIGNo4bupYyB0w61uIGThu6VuZywgxJHhu5NuZyB0aOG7nWkgxrB1IHRpw6puIHPhu60gZOG7pW5nIHTDoGkgbmd1ecOqbiB0w6BpIGNow61uaCBjaG8gY8OhYyBt4bulYyB0acOqdSBxdWFuIHRy4buNbmcgdsOgIGPhuqduIHRoaeG6v3QgbmjhuqV0Lg0KDQpUw7NtIGzhuqFpLCBo4bqhbiBt4bupYyB2YXkgbWFuZyBs4bqhaSBz4buxIGxpbmggaG/huqF0IHbDoCB0aeG7h24gbOG7o2kgdHJvbmcgdmnhu4djIHPhu60gZOG7pW5nIHRp4buBbiB2YXksIGNobyBwaMOpcCBraMOhY2ggaMOgbmcgdMOhaSBz4butIGThu6VuZyBz4buRIHRp4buBbiDEkcOjIHRy4bqjIG7hu6Mga2hpIGPhuqduIHRoaeG6v3QuIMSQaeG7gXUgbsOgeSBnacO6cCBxdeG6o24gbMO9IHTDoGkgY2jDrW5oIG3hu5l0IGPDoWNoIGhp4buHdSBxdeG6oyBoxqFuIHbDoCBnaeG6o20gdGhp4buDdSBy4bunaSBybyB0w6BpIGNow61uaC4gxJDhu5FpIHbhu5tpIGPDoWMgZG9hbmggbmdoaeG7h3AsIGjhuqFuIG3hu6ljIHZheSB24buRbiBxdXnhur90IMSR4buLbmgga2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIHTDrW4gZOG7pW5nIMSR4buDIMSR4bqndSB0xrAgdsOgIHBow6F0IHRyaeG7g24uIFZp4buHYyBjw7MgaOG6oW4gbeG7qWMgdmF5IHbhu5FuIGjhu6NwIGzDvSBnacO6cCBkb2FuaCBuZ2hp4buHcCB04bqtbiBk4bulbmcgY8ahIGjhu5lpIMSR4bqndSB0xrAgdsOgIHRow7pjIMSR4bqpeSB0xINuZyB0csaw4bufbmcga2luaCB04bq/Lg0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyANCg0KQ8OhYyBiaeG6v24gc+G7rSBk4bulbmcgdHJvbmcgcGjDom4gdMOtY2g6DQoNCiogQmnhur9uIMSR4buLbmggdMOtbmg6IE5BTUVfQ09OVFJBQ1RfVFlQRSwgQ09ERV9HRU5ERVIsIEZMQUdfT1dOX0NBUiwgRkxBR19PV05fUkVBTFRZLCBOQU1FX1RZUEVfU1VJVEUsIE5BTUVfSU5DT01FX1RZUEUsIE5BTUVfRURVQ0FUSU9OX1RZUEUsIE5BTUVfSE9VU0lOR19UWVBFLg0KIA0KKiBCaeG6v24gxJHhu4tuaCBsxrDhu6NuZzogQ05UX0NISUxEUkVOLCBBTVRfSU5DT01FX1RPVEFMLCBBTVRfQ1JFRElULCBBTVRfQU5OVUlUWQ0KDQojIyMgQmnhur9uIE5BTUVfQ09OVFJBQ1RfVFlQRSAoTG/huqFpIGjhu6NwIMSR4buTbmcgY2hvIHZheSkNCg0KKkLhuqNuZyB04bqnbiBz4buRKg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdGjhu5FuZyBrw6o6IA0KDQoqIEPDsyA2NDk5IGtow6FjaCBow6BuZyB2YXkgdGhlbyBow6xuaCB0aOG7qWMgdmF5IHRp4buBbiBt4bq3dCAgDQoNCiogQ8OzIDM1MDEga2jDoWNoIGjDoG5nIHZheSB0aGVvIGjDrG5oIHRo4bupYyB0w61uIGThu6VuZw0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQp0YWJsZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkvc3VtKHRhYmxlKGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTKg0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRhdGEsYWVzKE5BTUVfQ09OVFJBQ1RfVFlQRSkpKw0KICBnZW9tX2Jhcihjb2xvciA9ICJsaWdodGJsdWUiLCBmaWxsID0gImxhdmVuZGVyIikrDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrDQogIHlsYWIoIk51bWJlciBvZiBDdXN0b21lciIpKyB4bGFiKCJOYW1lIENvbnRyYWN0IFR5cGUiKQ0KYGBgDQoNClRoZW8gbmjGsCBiaeG7g3UgxJHhu5MsIGPDsyA2NSUga2jDoWNoIGjDoG5nIHZheSB0aGVvIGjDrG5oIHRo4bupYyBs4bqleSB0aeG7gW4gbeG6t3QgdsOgIDM1JSBjw7JuIGzhuqFpIHZheSB0aGVvIGjDrG5oIHRo4bupYyB0w61uIGThu6VuZy4gDQoNCiMjIyBCaeG6v24gQ09ERV9HRU5ERVIgKEdp4bubaSB0w61uaCkNCg0KKkLhuqNuZyB04bqnbiBz4buRKg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkQ09ERV9HRU5ERVIpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiwga2jDoWNoIGjDoG5nIHZheSB24buRbiDEkcaw4bujYyBwaMOibiB0aGVvIGdp4bubaSB0w61uaCBuaMawIHNhdTogDQoNCiogQ8OzIDY1ODkga2jDoWNoIGjDoG5nIGdp4bubaSB0w61uaCBu4buvICANCg0KKiBDw7MgMzQxMSBraMOhY2ggaMOgbmcgZ2nhu5tpIHTDrW5oIG5hbQ0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQp0YWJsZShkYXRhJENPREVfR0VOREVSKS9zdW0odGFibGUoZGF0YSRDT0RFX0dFTkRFUikpDQpgYGANCg0KKkJp4buDdSDEkeG7kyoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsYWVzKENPREVfR0VOREVSKSkrDQogIGdlb21fYmFyKGNvbG9yID0gImxpZ2h0Ymx1ZSIsIGZpbGwgPSAibGF2ZW5kZXIiKSsNCiAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsNCiAgeWxhYigiTnVtYmVyIG9mIEN1c3RvbWVyIikrIHhsYWIoIkdlbmRlciIpDQpgYGANCg0KVGhlbyBuaMawIGJp4buDdSDEkeG7kywgY8OzIDY2JSBraMOhY2ggaMOgbmcgbMOgIG7hu68gdsOgIDM0JSBjw7JuIGzhuqFpIGzDoCBuYW0uDQoNCiMjIyBCaeG6v24gRkxBR19PV05fQ0FSIChLaMOhY2ggaMOgbmcgY8OzIHPhu58gaOG7r3UgdMOgaSBz4bqjbiBsw6Agw7QgdMO0IGhheSBraMO0bmcpDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQp0YWJsZShkYXRhJEZMQUdfT1dOX0NBUikNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRo4buRbmcga8OqOiANCg0KKiBDw7MgNjY2MiBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyDDtCB0w7QgIA0KDQoqIEPDsyAzMzM4IGtow6FjaCBow6BuZyBjw7MgdMOgaSBz4bqjbiBsw6Agw7QgdMO0DQoNCipC4bqjbmcgdOG6p24gc3XhuqV0Kg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkRkxBR19PV05fQ0FSKS9zdW0odGFibGUoZGF0YSRGTEFHX09XTl9DQVIpKQ0KYGBgDQoNCipCaeG7g3UgxJHhu5MqDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsYWVzKEZMQUdfT1dOX0NBUikpKw0KICBnZW9tX2Jhcihjb2xvciA9ICJsaWdodGJsdWUiLCBmaWxsID0gImxhdmVuZGVyIikrDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrDQogIHlsYWIoIk51bWJlciBvZiBDdXN0b21lciIpKyB4bGFiKCJGbGFnIE93biBDYXIiKQ0KYGBgDQoNClRoZW8gbmjGsCBiaeG7g3UgxJHhu5MsIGPDsyA2NyUga2jDoWNoIGjDoG5nIGtow7RuZyBjw7Mgw7QgdMO0IHbDoCAzMyUga2jDoWNoIGjDoG5nIGPDsm4gbOG6oWkgY8OzIMO0IHTDtC4gDQoNCiMjIyBCaeG6v24gRkxBR19PV05fUkVBTFRZIChLaMOhY2ggaMOgbmcgY8OzIHPhu58gaOG7r3UgdMOgaSBz4bqjbiBsw6AgYuG6pXQgxJHhu5luZyBz4bqjbiBoYXkga2jDtG5nKQ0KDQoqQuG6o25nIHThuqduIHPhu5EqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRGTEFHX09XTl9SRUFMVFkpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0aOG7kW5nIGvDqjogDQoNCiogQ8OzIDMwMjUga2jDoWNoIGjDoG5nIGtow7RuZyBz4bufIGjhu691IGLhuqV0IMSR4buZbmcgc+G6o24gICANCg0KKiBDw7MgNjk3NSBraMOhY2ggaMOgbmcgc+G7nyBo4buvdSBi4bqldCDEkeG7mW5nIHPhuqNuIA0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQp0YWJsZShkYXRhJEZMQUdfT1dOX1JFQUxUWSkvc3VtKHRhYmxlKGRhdGEkRkxBR19PV05fUkVBTFRZKSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhLGFlcyhGTEFHX09XTl9SRUFMVFkpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAibGlnaHRibHVlIiwgZmlsbCA9ICJsYXZlbmRlciIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgQ3VzdG9tZXIiKSsgeGxhYigiRmxhZyBPd24gUmVhbHR5IikNCmBgYA0KDQpUaGVvIG5oxrAgYmnhu4N1IMSR4buTLCBjw7MgNzAlIGtow6FjaCBow6BuZyB2YXkgc+G7nyBo4buvdSBi4bqldCDEkeG7mW5nIHPhuqNuIHbDoCAzMCUgY8OybiBs4bqhaSBsw6Aga2jDtG5nIHPhu58gaOG7r3UgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KIyMjIEJp4bq/biBOQU1FX0lOQ09NRV9UWVBFIChMb+G6oWkgdGh1IG5o4bqtcCBj4bunYSBraMOhY2ggaMOgbmcpDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQp0YWJsZShkYXRhJE5BTUVfSU5DT01FX1RZUEUpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0aOG7kW5nIGvDqiwgYuG6o25nIHThuqduIHPhu5EgY2hvIGJp4bq/dCB0aHUgbmjhuq1wIGPhu6dhIGtow6FjaCBow6BuZyDEkeG6v24gdOG7qyBjw6FjIG5ndeG7k24gc2F1OiANCg0KKiBDw7MgMjMwNCBraMOhY2ggaMOgbmcgdGh1IG5o4bqtcCB04burIGzGsMahbmcgY+G7mW5nIHTDoWMgdmnDqm4gdGjGsMahbmcgbeG6oWkgICANCg0KKiBDw7MgMTc3MiBraMOhY2ggaMOgbmcgdGh1IG5o4bqtcCB04burIGzGsMahbmcgaMawdSANCg0KKiBDw7MgNjUwIGtow6FjaCBow6BuZyBoxrDhu59uZyBsxrDGoW5nIGPDtG5nIGNo4bupYyBOaMOgIG7GsOG7m2MNCg0KKiBDw7MgMiBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyB2aeG7h2MgbMOgbQ0KDQoqIEPDsyA1MjcyIGtow6FjaCBow6BuZyBjw7Mgdmnhu4djIGzDoG0gDQoNCipC4bqjbmcgdOG6p24gc3XhuqV0Kg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkTkFNRV9JTkNPTUVfVFlQRSkvc3VtKHRhYmxlKGRhdGEkTkFNRV9JTkNPTUVfVFlQRSkpDQpgYGANCg0KKkJp4buDdSDEkeG7kyoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSAiIiwgZmlsbCA9IE5BTUVfSU5DT01FX1RZUEUpKSArDQogIGdlb21fYmFyKGNvbG9yID0gImxpZ2h0Ymx1ZSIsIHdpZHRoID0gMSwgc3RhdCA9ICJjb3VudCIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0YyQjVENCIsICIjQjVFQUQ3IiwgIiNGN0REOTEiLCAiI0E5RDhFNSIsICIjRDFBMkZGIiwgIiNGRkM4QTIiKSkgKw0KICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCkgKw0KICB5bGFiKCJOdW1iZXIgb2YgQ3VzdG9tZXJzIikgKw0KICB4bGFiKCJOYW1lIEluY29tZSBUeXBlIikNCmBgYA0KDQoNCiMjIyBCaeG6v24gTkFNRV9UWVBFX1NVSVRFIChMb+G6oWkgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgaOG7o3AgxJHhu5NuZyB2YXkpDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQp0YWJsZShkYXRhJE5BTUVfVFlQRV9TVUlURSkNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRo4buRbmcga8OqOg0KDQoqIEPDsyAxMDcgbG/huqFpIG5nxrDhu51pIHRo4bulIGjGsOG7n25nIGzDoCB0cuG6uyBuaOG7jyANCg0KKiBDw7MgMTQzOCBsb+G6oWkgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgbMOgIGdpYSDEkcOsbmgNCg0KKiBDw7MgNyBsb+G6oWkgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgdGhlbyBuaMOzbQ0KDQoqIEPDsyA4MDk1IGtow7RuZyBjw7MgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcNCg0KKiBDw7MgMzUzIGxv4bqhaSBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyBsw6AgduG7oy9jaOG7k25nIGhv4bq3YyDEkeG7kWkgdMOhYw0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQp0YWJsZShkYXRhJE5BTUVfVFlQRV9TVUlURSkvc3VtKHRhYmxlKGRhdGEkTkFNRV9UWVBFX1NVSVRFKSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhLGFlcyhOQU1FX1RZUEVfU1VJVEUpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAibGlnaHRibHVlIiwgZmlsbCA9ICJsYXZlbmRlciIpKw0KICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlcyA6OiBwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdD0gICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtLjUpKw0KICB5bGFiKCJOdW1iZXIgb2YgQ3VzdG9tZXIiKSsgeGxhYigiTmFtZSBUeXBlIFN1aXRlIikNCmBgYA0KDQpUaGVvIG5oxrAgYmnhu4N1IMSR4buTLCBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0ICg4MCw5NSUpIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyB0aHXhu5ljIG5ow7NtIHRy4bq7IG5o4buPLCBjaGnhur9tIHThu7cgbOG7hyAxLDA3JS4NCg0KIyMjIEJp4bq/biBOQU1FX0hPVVNJTkdfVFlQRSAoTG/huqFpIGjDrG5oIG5ow6Ag4bufIGPhu6dhIGtow6FjaCBow6BuZykNCg0KKkLhuqNuZyB04bqnbiBz4buRKg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkTkFNRV9IT1VTSU5HX1RZUEUpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0aOG7kW5nIGvDqjoNCg0KKiBDw7MgNDYga2jDoWNoIGjDoG5nIOG7nyBjxINuIGjhu5kgaOG7o3AgdMOhYyB4w6MNCg0KKiBDw7MgODg1MSBraMOhY2ggaMOgbmcgY8OzIG5ow6AgcmnDqm5nLyBjxINuIGjhu5kgDQoNCiogQ8OzIDM3NSBraMOhY2ggaMOgbmcg4bufIGPEg24gaOG7mSBjxqEgcXVhbiBjw7RuZyBj4buZbmcNCg0KKiBDw7MgNzYga2jDoWNoIGjDoG5nIOG7nyBjxINuIGjhu5kgdsSDbiBwaMOybmcNCg0KKiBDw7MgMTYyIGtow6FjaCBow6BuZyDhu58gY8SDbiBo4buZIGNobyB0aHXDqg0KDQoqIEPDsyA0OTAga2jDoWNoIGjDoG5nIHPhu5FuZyBjw7luZyBjaGEgbeG6uQ0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQp0YWJsZShkYXRhJE5BTUVfSE9VU0lOR19UWVBFKS9zdW0odGFibGUoZGF0YSROQU1FX0hPVVNJTkdfVFlQRSkpDQpgYGANCg0KKkJp4buDdSDEkeG7kyoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSxhZXMoTkFNRV9IT1VTSU5HX1RZUEUpKSsNCiAgZ2VvbV9iYXIoY29sb3IgPSAibGlnaHRibHVlIiwgZmlsbCA9ICJsYXZlbmRlciIpK2dlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXMgOjogcGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQ9ICAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLS41KSsNCiAgeWxhYigiTnVtYmVyIG9mIEN1c3RvbWVyIikrIHhsYWIoIkhvdXNpbmciKQ0KYGBgDQoNClRoZW8gbmjGsCBiaeG7g3UgxJHhu5MsIGtow6FjaCBow6BuZyBjw7MgbmjDoCByacOqbmcvY8SDbiBo4buZIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgKDg4LDUxJSkgdsOgIHRo4bqlcCBuaOG6pXQgbMOgIGtow6FjaCBow6BuZyDhu58gY8SDbiBo4buZIGjhu6NwIHTDoWMgeMOjLCBjaGnhur9tIHThu7cgbOG7hyAxLDA3JS4NCg0KIyMjIEJp4bq/biBOQU1FX0VEVUNBVElPTl9UWVBFIChUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4pDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQp0YWJsZShkYXRhJE5BTUVfRURVQ0FUSU9OX1RZUEUpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0aOG7kW5nIGvDqjoNCg0KKiBDw7MgOCBraMOhY2ggaMOgbmcgY8OzIGLhurFuZyBj4bqlcCBo4buNYyB0aHXhuq10DQoNCiogQ8OzIDI0MTUga2jDoWNoIGjDoG5nIMSRw6MgaG/DoG4gdGjDoG5oIMSQ4bqhaSBo4buNYyANCg0KKiBDw7MgMzE1IGtow6FjaCBow6BuZyBjaMawYSBob8OgbiB0aMOgbmggxJDhuqFpIGjhu41jDQoNCiogQ8OzIDEzNSBraMOhY2ggaMOgbmcgZMaw4bubaSB0csOsbmggxJHhu5kgdHJ1bmcgaOG7jWMgY8ahIHPhu58NCg0KKiBDw7MgNzEyNyBraMOhY2ggaMOgbmcgdHLDrG5oIMSR4buZIFRydW5nIGjhu41jL1RydW5nIGPhuqVwDQoNCiogQ8OzIDMxIGtow6FjaCBow6BuZyBz4buRbmcgY8O5bmcgY2hhIG3hurkNCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSROQU1FX0VEVUNBVElPTl9UWVBFKS9zdW0odGFibGUoZGF0YSROQU1FX0VEVUNBVElPTl9UWVBFKSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhLGFlcyhOQU1FX0VEVUNBVElPTl9UWVBFKSkrDQogIGdlb21fYmFyKGNvbG9yID0gImxpZ2h0Ymx1ZSIsIGZpbGwgPSAibGF2ZW5kZXIiKStnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzIDo6IHBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0PSAgJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0uNSkrDQogIHlsYWIoIk51bWJlciBvZiBDdXN0b21lciIpKyB4bGFiKCJFZHVjYXRpb24iKQ0KYGBgDQoNClRoZW8gxJHhu5MgdGjhu4ssIGtow6FjaCBow6BuZyB0aHXhu5ljIHRyw6xuaCDEkeG7mSBUcnVuZyBo4buNYy9UcnVuZyBj4bqlcCBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0ICg3MSwzJSkgdsOgIHRo4bqlcCBuaOG6pXQgbMOgIG5ow7NtIGtow6FjaCBow6BuZyBjw7MgY8OhYyBi4bqxbmcgY+G6pXAgaOG7jWMgduG7iyAoMCwxJSkuDQoNCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcNCg0KYGBge3J9DQpkYXRhMTwtZGF0YS5mcmFtZShkYXRhJEFNVF9BTk5VSVRZLCBkYXRhJEFNVF9DUkVESVQsIGRhdGEkQU1UX0lOQ09NRV9UT1RBTCwgZGF0YSRDTlRfQ0hJTERSRU4pDQpzdW1tYXJ5KGRhdGExKQ0KYGBgDQoNClThu6sgYuG6o25nIHRo4buRbmcga8OqIG3DtCB04bqjIGNobyB0aOG6pXk6IA0KDQoqIEPhu5l0IEFNVF9BTk5VSVRZIGNobyB0aOG6pXkgdGjDtG5nIHRpbiB24buBIGPDoWMga2hv4bqjbiB0cuG6oyBow6BuZyB0aMOhbmcuIFRydW5nIHbhu4sgKE1lZGlhbikgbMOgIDI0OTcxLCB04bupYyBsw6Aga2hv4bqjbmcgNTAlIHPhu5Ega2hv4bqjbiB0cuG6oyBow6BuZyB0aMOhbmcgbmjhu48gaMahbiBnacOhIHRy4buLIG7DoHkgdsOgIDUwJSBz4buRIGtob+G6o24gdHLhuqMgaMOgbmcgdGjDoW5nIGzhu5tuIGjGoW4uIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggKE1lYW4pIGzDoCAyNzA4OCwgbMOgIHThu5VuZyBj4bunYSB04bqldCBj4bqjIGPDoWMga2hv4bqjbiB0cuG6oyBow6BuZyB0aMOhbmcgY2hpYSBjaG8gc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcuIEtob+G6o24gdHLhuqMgaMOgbmcgdGjDoW5nIG5o4buPIG5o4bqldCBsw6AgMjU5NiB2w6AgbOG7m24gbmjhuqV0IGzDoCAyOTYxMDAwLg0KDQoqIEPhu5l0IEFNVF9DUkVESVQgY2jhu6lhIHRow7RuZyB0aW4gduG7gSBo4bqhbiBt4bupYyB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcuIFRydW5nIHbhu4sgKE1lZGlhbikgbMOgIDUxMzAwMCwgdOG7qWMgbMOgIGtob+G6o25nIDUwJSBz4buRIHRp4buBbiB0w61uIGThu6VuZyB5w6p1IGPhuqd1IG5o4buPIGjGoW4gZ2nDoSB0cuG7iyBuw6B5IHbDoCA1MCUgc+G7kSB0aeG7gW4gdMOtbiBk4bulbmcgecOqdSBj4bqndSBjYW8gaMahbi4gR2nDoSB0cuG7iyB0cnVuZyBiw6xuaCAoTWVhbikgbMOgIDYwMDc1MywgbMOgIHThu5VuZyBj4bunYSB04bqldCBj4bqjIGPDoWMga2hv4bqjbiB0w61uIGThu6VuZyB5w6p1IGPhuqd1IGNoaWEgY2hvIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nLiBT4buRIHRp4buBbiB0w61uIGThu6VuZyBuaOG7jyBuaOG6pXQgbMOgIDI1NjUwIHbDoCBs4bubbiBuaOG6pXQgbMOgIDIyODYyMTIuDQoNCiogQ+G7mXQgQU1UX0lOQ09NRV9UT1RBTCB0aOG7gyBoaeG7h24gdOG7lW5nIHRodSBuaOG6rXAgaMOgbmcgbsSDbSBj4bunYSBraMOhY2ggaMOgbmcuIFRydW5nIHbhu4sgKE1lZGlhbikgbMOgIDE0NDAwMCwgdOG7qWMgbMOgIGtob+G6o25nIDUwJSBz4buRIHRodSBuaOG6rXAgaMOgbmcgbsSDbSBuaOG7jyBoxqFuIGdpw6EgdHLhu4sgbsOgeSB2w6AgNTAlIHPhu5EgdGh1IG5o4bqtcCBow6BuZyBuxINtIGNhbyBoxqFuLiBHacOhIHRy4buLIHRydW5nIGLDrG5oIChNZWFuKSBsw6AgMTY3NDQ5LCBsw6AgdOG7lW5nIGPhu6dhIHThuqV0IGPhuqMgdGh1IG5o4bqtcCBow6BuZyBuxINtIGNoaWEgY2hvIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nLiBUaHUgbmjhuq1wIGjDoG5nIG7Eg20gbmjhu48gbmjhuqV0IGzDoCAzMTUwMCB2w6AgbOG7m24gbmjhuqV0IGzDoCAxOTM1MDAwLg0KDQoqIEPhu5l0IENOVF9DSElMRFJFTiB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBjb24gbmjhu48gY+G7p2Ega2jDoWNoIGjDoG5nLiBUcnVuZyB24buLIChNZWRpYW4pIGzDoCAwLCB04bupYyBsw6Aga2hv4bqjbmcgNTAlIHPhu5EgbMaw4bujbmcgY29uIG5o4buPIG5o4buPIGjGoW4gZ2nDoSB0cuG7iyBuw6B5IHbDoCA1MCUgc+G7kSBsxrDhu6NuZyBjb24gbmjhu48gY2FvIGjGoW4uIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggKE1lYW4pIGzDoCAwLjQxNjMsIGzDoCB04buVbmcgY+G7p2EgdOG6pXQgY+G6oyBz4buRIGzGsOG7o25nIGNvbiBuaOG7jyBjaGlhIGNobyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZy4gU+G7kSBsxrDhu6NuZyBjb24gbmjhu48gbmjhu48gbmjhuqV0IGzDoCAwIHbDoCBs4bubbiBuaOG6pXQgbMOgIDcuDQoNCiogQ8OhYyBnacOhIHRy4buLICJUcnVuZyB24buLIDEiIHbDoCAiVHJ1bmcgduG7iyAzIiB0aOG7gyBoaeG7h24gcGjhuqFtIHZpIGdp4buvYSBnacOhIHRy4buLIG5o4buPIG5o4bqldCB2w6AgdHJ1bmcgduG7iywgY8WpbmcgbmjGsCBnaeG7r2EgdHJ1bmcgduG7iyB2w6AgZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQuIE7DsyBnacO6cCB0YSBoaeG7g3UgcsO1IGjGoW4gduG7gSBwaMOibiBi4buRIGPhu6dhIGThu68gbGnhu4d1IHRyb25nIHThu6tuZyBj4buZdCB2w6AgeMOhYyDEkeG7i25oIGPDoWMgdsO5bmcgZOG7ryBsaeG7h3UgY2jhu6lhIHBo4bqnbiBs4bubbiBjw6FjIGdpw6EgdHLhu4suDQoNCmBgYHtyfQ0KaGlzdChkYXRhJEFNVF9BTk5VSVRZLCBjb2w9ImxpZ2h0Ymx1ZSIpDQpoaXN0KGRhdGEkQU1UX0NSRURJVCwgY29sPSJsaWdodGJsdWUiKQ0KaGlzdChkYXRhJEFNVF9JTkNPTUVfVE9UQUwsIGNvbD0ibGlnaHRibHVlIikNCmhpc3QoZGF0YSRDTlRfQ0hJTERSRU4sIGNvbD0ibGlnaHRibHVlIikNCmBgYA0KDQojIyBQaMOibiB0w61jaCB0aOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gcGjhu6UgdGh14buZYyB24bubaSBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXANCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIE5BTUVfQ09OVFJBQ1RfVFlQRSAmIENPREVfR0VOREVSDQoNCiMjIyMgQuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQpDT0RFX0dFTkRFUiA8LSB0YWJsZShkYXRhJENPREVfR0VOREVSLCBkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkNCkNPREVfR0VOREVSDQpgYGANCg0KKiBDw7MgNDMzNiBraMOhY2ggaMOgbmcgbuG7ryB2YXkgdGnhu4FuIG3hurd0IHbDoCAyMjUzIHZheSB0w61uIGThu6VuZy4gDQoNCiogQ8OzIDIxNjMga2jDoWNoIGjDoG5nIG5hbSB2YXkgdGnhu4FuIG3hurd0IHbDoCAxMjQ4IHZheSB0w61uIGThu6VuZy4NCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KQ09ERV9HRU5ERVIxIDwtIHByb3AudGFibGUoQ09ERV9HRU5ERVIpDQpDT0RFX0dFTkRFUjENCmBgYA0KDQoqUGjDom4gcGjhu5FpIGJp4bq/bioNCg0KYGBge3J9DQphZGRtYXJnaW5zKENPREVfR0VOREVSKQ0KYGBgDQoNCipCaeG7g3UgxJHhu5MgY+G7mXQga+G6v3QgaOG7o3AgMiBiaeG6v24qDQoNCmBgYHtyfQ0KayA8LSBkYXRhLmZyYW1lKGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFLCBkYXRhJEZMQUdfT1dOX0NBUiwgZGF0YSRDT0RFX0dFTkRFUiwgZGF0YSRGTEFHX09XTl9SRUFMVFksIGRhdGEkQ05UX0NISUxEUkVOLCBkYXRhJEFNVF9JTkNPTUVfVE9UQUwsIGRhdGEkQU1UX0NSRURJVCwgZGF0YSRBTVRfQU5OVUlUWSwgZGF0YSROQU1FX1RZUEVfU1VJVEUsIGRhdGEkTkFNRV9JTkNPTUVfVFlQRSwgZGF0YSROQU1FX0VEVUNBVElPTl9UWVBFLCBkYXRhJE5BTUVfRkFNSUxZX1NUQVRVUywgZGF0YSROQU1FX0hPVVNJTkdfVFlQRSkNCmsgfD4gZ2dwbG90KGFlcyh4PWRhdGEkQ09ERV9HRU5ERVIseT1hZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0ibGF2ZW5kZXIiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAibmF2eSIsIHZqdXN0ID0gLSAuNSkgKyBmYWNldF9ncmlkKC4gfmRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKSArIGxhYnMoeCA9ICJDT0RFX0dFTkRFUiIseSA9ICJjbGllbnQiKQ0KYGBgDQoNCipS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmlzayByYXRpbykqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyhDT0RFX0dFTkRFUikNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIGzDoCBuYW0gZ+G6pXAgMS4wNyBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIGzDoCBu4buvLiANCg0KYGBge3J9DQpyaXNrcmF0aW8oQ09ERV9HRU5ERVIsIHJldiA9ICJjIikNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHRp4buBbiBt4bq3dCBsw6AgbmFtIGfhuqVwIDAuOTYgc28gduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIHZheSB0aeG7gW4gbeG6t3QgbMOgIG7hu68uDQoNCipU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCAob2RkIHJhdGlvKSoNCg0KYGBge3J9DQpvZGRzcmF0aW8oQ09ERV9HRU5ERVIpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBnaeG7r2EgMiBuaMOzbSBnaeG7m2kgdMOtbmgga2jDtG5nIGLhurFuZyBuaGF1LiBU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBj4bunYSBnaeG7m2kgdMOtbmggbmFtIHNvIHbhu5tpIGdp4bubaSB0w61uaCBu4buvIGzDoCAxLjExIGzhuqduLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhDT0RFX0dFTkRFUiwgcmV2ID0gJ3InKQ0KYGBgDQoNClThu7cgbOG7hyBjaMOqbmggZ2nhu69hIDIgbmjDs20gZ2nhu5tpIHTDrW5oIGtow7RuZyBi4bqxbmcgbmhhdS4gVOG7tyBs4buHIGNow6puaCBs4buHY2ggY+G7p2EgZ2nhu5tpIHTDrW5oIG7hu68gc28gduG7m2kgZ2nhu5tpIHTDrW5oIG5hbSBsw6AgMC45IGzhuqduLg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgTkFNRV9DT05UUkFDVF9UWVBFICYgRkxBR19PV05fQ0FSDQoNCiMjIyMgQuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQpGTEFHX09XTl9DQVIgPC0gdGFibGUoZGF0YSRGTEFHX09XTl9DQVIsIGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKQ0KRkxBR19PV05fQ0FSDQpgYGANCg0KKiBDw7MgNDM1MiBraMOhY2ggaMOgbmcga2jDtG5nIHPhu58gaOG7r3Ugw7QgdMO0IHZheSB0aeG7gW4gbeG6t3QgdsOgIDIzMTAgdmF5IHTDrW4gZOG7pW5nLg0KDQoqIEPDsyAyMTQ3IGtow6FjaCBow6BuZyBjw7Mgw7QgdMO0IHZheSB0aeG7gW4gbeG6t3QgdsOgIDExOTEgdmF5IHTDrW4gZOG7pW5nLg0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQpGTEFHX09XTl9DQVIxIDwtIHByb3AudGFibGUoRkxBR19PV05fQ0FSKQ0KRkxBR19PV05fQ0FSMQ0KYGBgDQoNCipQaMOibiBwaOG7kWkgYmnhur9uKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnMoRkxBR19PV05fQ0FSKQ0KYGBgDQoNCipCaeG7g3UgxJHhu5MgY+G7mXQga+G6v3QgaOG7o3AgMiBiaeG6v24qDQoNCmBgYHtyfQ0KazEgPC0gZGF0YS5mcmFtZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSwgZGF0YSRGTEFHX09XTl9DQVIsIGRhdGEkQ09ERV9HRU5ERVIsIGRhdGEkRkxBR19PV05fUkVBTFRZLCBkYXRhJENOVF9DSElMRFJFTiwgZGF0YSRBTVRfSU5DT01FX1RPVEFMLCBkYXRhJEFNVF9DUkVESVQsIGRhdGEkQU1UX0FOTlVJVFksIGRhdGEkTkFNRV9UWVBFX1NVSVRFLCBkYXRhJE5BTUVfSU5DT01FX1RZUEUsIGRhdGEkTkFNRV9FRFVDQVRJT05fVFlQRSwgZGF0YSROQU1FX0ZBTUlMWV9TVEFUVVMsIGRhdGEkTkFNRV9IT1VTSU5HX1RZUEUpDQprMSB8PiBnZ3Bsb3QoYWVzKHg9ZGF0YSRGTEFHX09XTl9DQVIseT1hZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0ibGF2ZW5kZXIiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAibmF2eSIsIHZqdXN0ID0gLSAuNSkgKyBmYWNldF9ncmlkKC4gfmRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKSArIGxhYnMoeCA9ICJGTEFHX09XTl9DQVIiLHkgPSAiY2xpZW50IikNCmBgYA0KDQoqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJpc2sgcmF0aW8pKg0KYGBge3J9DQpyaXNrcmF0aW8oRkxBR19PV05fQ0FSKQ0KYGBgDQoNClThu7cgbOG7hyBuZ8aw4budaSB2YXkgdMOtbiBk4bulbmcgY8OzIMO0IHTDtCBn4bqlcCAxLjAzIGzhuqduIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSB2YXkgdMOtbiBraMO0bmcgY8OzIMO0IHTDtC4gDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKEZMQUdfT1dOX0NBUiwgcmV2ID0gImMiKQ0KYGBgDQoNClThu7cgbOG7hyBuZ8aw4budaSB2YXkgdGnhu4FuIG3hurd0IGPDsyDDtCB0w7QgZ+G6pXAgMC45OCBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdmF5IHRp4buBbiBt4bq3dCBraMO0bmcgw7QgdMO0Lg0KDQoqVOG7tyBs4buHIGNow6puaCBs4buHY2ggKG9kZCByYXRpbykqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKEZMQUdfT1dOX0NBUikNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBj4bunYSBraMOhY2ggaMOgbmcgY8OzIMO0IHTDtCBzbyB24bubaSBraMOhY2ggaMOgbmcga2jDtG5nIMO0IHTDtCBsw6AgMS4wNSBs4bqnbi4NCg0KYGBge3J9DQpvZGRzcmF0aW8oRkxBR19PV05fQ0FSLCByZXYgPSAncicpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggY+G7p2Ega2jDoWNoIGjDoG5nIGtow7RuZyDDtCB0w7Qgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyDDtCB0w7QgbMOgIDAuOTYgbOG6p24uDQoNCiMjIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBOQU1FX0NPTlRSQUNUX1RZUEUgJiBGTEFHX09XTl9SRUFMVFkNCg0KIyMjIyBC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MNCg0KKkLhuqNuZyB04bqnbiBz4buRKg0KDQpgYGB7cn0NCkZMQUdfT1dOX1JFQUxUWSA8LSB0YWJsZShkYXRhJEZMQUdfT1dOX1JFQUxUWSwgZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUpDQpGTEFHX09XTl9SRUFMVFkNCmBgYA0KDQoqIEPDsyAxOTkwIGtow6FjaCBow6BuZyBraMO0bmcgc+G7nyBo4buvdSBi4bqldCDEkeG7mW5nIHPhuqNuIHZheSB0aeG7gW4gbeG6t3QgdsOgIDEzMDUgdmF5IHTDrW4gZOG7pW5nLg0KDQoqIEPDsyA0NTA5IGtow6FjaCBow6BuZyBjw7MgYuG6pXQgxJHhu5luZyBz4bqjbiB2YXkgdGnhu4FuIG3hurd0IHbDoCAyNDY2IHZheSB0w61uIGThu6VuZy4NCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KRkxBR19PV05fUkVBTFRZMSA8LSBwcm9wLnRhYmxlKEZMQUdfT1dOX1JFQUxUWSkNCkZMQUdfT1dOX1JFQUxUWTENCmBgYA0KDQoqUGjDom4gcGjhu5FpIGJp4bq/bioNCg0KYGBge3J9DQphZGRtYXJnaW5zKEZMQUdfT1dOX1JFQUxUWSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTIGPhu5l0IGvhur90IGjhu6NwIDIgYmnhur9uKg0KDQpgYGB7cn0NCmsgPC0gZGF0YS5mcmFtZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSwgZGF0YSRGTEFHX09XTl9DQVIsIGRhdGEkQ09ERV9HRU5ERVIsIGRhdGEkRkxBR19PV05fUkVBTFRZLCBkYXRhJENOVF9DSElMRFJFTiwgZGF0YSRBTVRfSU5DT01FX1RPVEFMLCBkYXRhJEFNVF9DUkVESVQsIGRhdGEkQU1UX0FOTlVJVFksIGRhdGEkTkFNRV9UWVBFX1NVSVRFLCBkYXRhJE5BTUVfSU5DT01FX1RZUEUsIGRhdGEkTkFNRV9FRFVDQVRJT05fVFlQRSwgZGF0YSROQU1FX0ZBTUlMWV9TVEFUVVMsIGRhdGEkTkFNRV9IT1VTSU5HX1RZUEUpDQprIHw+IGdncGxvdChhZXMoeD1kYXRhJEZMQUdfT1dOX1JFQUxUWSx5PWFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsPSJsYXZlbmRlciIpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpKSksIHN0YXQgPSAiY291bnQiLCBjb2xvciA9ICJuYXZ5Iiwgdmp1c3QgPSAtIC41KSArIGZhY2V0X2dyaWQoLiB+ZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUpICsgbGFicyh4ID0gIkZMQUdfT1dOX1JFQUxUWSIseSA9ICJjbGllbnQiKQ0KYGBgDQoNCipS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmlzayByYXRpbykqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKEZMQUdfT1dOX1JFQUxUWSkNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIGPDsyBi4bqldCDEkeG7mW5nIHPhuqNuIGfhuqVwIDEuMDMgbOG6p24gc28gduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIHZheSB0w61uIGThu6VuZyBraMO0bmcgY8OzIGLhuqV0IMSR4buZbmcgc+G6o24uIA0KDQpgYGB7cn0NCnJpc2tyYXRpbyhGTEFHX09XTl9SRUFMVFksIHJldiA9ICJjIikNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHRp4buBbiBt4bq3dCBjw7MgYuG6pXQgxJHhu5luZyBz4bqjbiBn4bqlcCAwLjk4IHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSB2YXkgdGnhu4FuIG3hurd0IGtow7RuZyBjw7MgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KKlThu7cgbOG7hyBjaMOqbmggbOG7h2NoIChvZGQgcmF0aW8pKg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhGTEFHX09XTl9SRUFMVFkpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyBi4bqldCDEkeG7mW5nIHPhuqNuIHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIGLhuqV0IMSR4buZbmcgc+G6o24gbMOgIDEuMDUxIGzhuqduLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhGTEFHX09XTl9SRUFMVFksIHJldiA9ICdyJykNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBj4bunYSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBi4bqldCDEkeG7mW5nIHPhuqNuIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgYuG6pXQgxJHhu5luZyBz4bqjbiBsw6AgMC45NSBs4bqnbg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgTkFNRV9DT05UUkFDVF9UWVBFICYgTkFNRV9JTkNPTUVfVFlQRQ0KDQojIyMjIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kw0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmxpYnJhcnkoZHBseXIpDQpOQU1FX0lOQ09NRV9UWVBFMSA8LSBkYXRhICU+JSBtdXRhdGUoTkFNRV9JTkNPTUVfVFlQRSA9IGNhc2Vfd2hlbihOQU1FX0lOQ09NRV9UWVBFID09ICJDb21tZXJjaWFsIGFzc29jaWF0ZSIgfiAzLCBOQU1FX0lOQ09NRV9UWVBFID09ICJTdGF0ZSBzZXJ2YW50IiB+IDMsIE5BTUVfSU5DT01FX1RZUEUgPT0gIldvcmtpbmciIH4gMywgTkFNRV9JTkNPTUVfVFlQRSA9PSAiVW5lbXBsb3llZCIgfiA0LCBOQU1FX0lOQ09NRV9UWVBFID09ICJQZW5zaW9uZXIiIH4gNCkpDQpOQU1FX0lOQ09NRV9UWVBFMiA8LWN1dChOQU1FX0lOQ09NRV9UWVBFMSROQU1FX0lOQ09NRV9UWVBFLCBicmVha3M9YygwLDMsNCksIGxhYmVscz1jKCdZZXMnLCAnTm8nKSkNCnRhYmxlKE5BTUVfSU5DT01FX1RZUEUyKQ0KYGBgDQoNCipC4bqjbmcgdOG6p24gc+G7kSoNCg0KYGBge3J9DQpOQU1FX0lOQ09NRV9UWVBFIDwtIHRhYmxlKE5BTUVfSU5DT01FX1RZUEUyLCBkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkNCk5BTUVfSU5DT01FX1RZUEUNCmBgYA0KDQoqIEPDsyA1MjgwIGtow6FjaCBow6BuZyBjw7Mgdmnhu4djIGzDoG0gdmF5IHRp4buBbiBt4bq3dCB2w6AgMjk0NiB2YXkgdMOtbiBk4bulbmcuDQoNCiogQ8OzIDEyMTkga2jDoWNoIGjDoG5nIGNoxrBhL8SRw6MgdOG7q25nIGPDsyB2aeG7h2MgbMOgbSB2YXkgdGnhu4FuIG3hurd0IHbDoCA1NTUgdmF5IHTDrW4gZOG7pW5nLg0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQpOQU1FX0lOQ09NRV9UWVBFMyA8LSBwcm9wLnRhYmxlKE5BTUVfSU5DT01FX1RZUEUpDQpOQU1FX0lOQ09NRV9UWVBFMw0KYGBgDQoNCipQaMOibiBwaOG7kWkgYmnhur9uKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnMoTkFNRV9JTkNPTUVfVFlQRSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTIGPhu5l0IGvhur90IGjhu6NwIDIgYmnhur9uKg0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KazMgPC0gZGF0YS5mcmFtZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSwgZGF0YSRGTEFHX09XTl9DQVIsIGRhdGEkQ09ERV9HRU5ERVIsIGRhdGEkRkxBR19PV05fUkVBTFRZLCBkYXRhJENOVF9DSElMRFJFTiwgZGF0YSRBTVRfSU5DT01FX1RPVEFMLCBkYXRhJEFNVF9DUkVESVQsIGRhdGEkQU1UX0FOTlVJVFksIGRhdGEkTkFNRV9UWVBFX1NVSVRFLCBkYXRhJE5BTUVfSU5DT01FX1RZUEUsIGRhdGEkTkFNRV9FRFVDQVRJT05fVFlQRSwgZGF0YSROQU1FX0ZBTUlMWV9TVEFUVVMsIGRhdGEkTkFNRV9IT1VTSU5HX1RZUEUsIE5BTUVfSU5DT01FX1RZUEUyKQ0KazMgfD4gZ2dwbG90KGFlcyh4PU5BTUVfSU5DT01FX1RZUEUyLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9ImxhdmVuZGVyIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gIm5hdnkiLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5kYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkgKyBsYWJzKHggPSAiTkFNRV9JTkNPTUVfVFlQRSIseSA9ICJjbGllbnQiKQ0KYGBgDQoNCipS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmlzayByYXRpbykqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKE5BTUVfSU5DT01FX1RZUEUpDQpgYGANCg0KVOG7tyBs4buHIG5nxrDhu51pIMSRw6MgdOG7q25nL2NoxrBhIGPDsyB2aeG7h2MgbMOgbSB2YXkgdMOtbiBk4bulbmcgZ+G6pXAgMC44NyBs4bqnbiB04bu3IGzhu4cgbmfGsOG7nWkgY8OzIHZp4buHYyBsw6BtIHZheSB0w61uIGThu6VuZy4NCg0KYGBge3J9DQpyaXNrcmF0aW8oTkFNRV9JTkNPTUVfVFlQRSwgcmV2ID0gImMiKQ0KYGBgDQoNClThu7cgbOG7hyBuZ8aw4budaSDEkcOjIHThu6tuZy9jaMawYSBjw7Mgdmnhu4djIGzDoG0gdmF5IHRp4buBbiBt4bq3dCBn4bqlcCAxLjA3IGzhuqduIHThu7cgbOG7hyBuZ8aw4budaSBjw7Mgdmnhu4djIGzDoG0gdmF5IHRp4buBbiBt4bq3dC4gDQoNCipU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCAob2RkIHJhdGlvKSoNCg0KYGBge3J9DQpvZGRzcmF0aW8oTkFNRV9JTkNPTUVfVFlQRSkNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2Ega2jDoWNoIGjDoG5nIMSRw6MgdOG7q25nL2NoxrBhIGPDsyB2aeG7h2Mgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyB2aeG7h2MgbMOgbSB2YXkgdMOtbiBk4bulbmcgbMOgIDAuODIgbOG6p24uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKE5BTUVfSU5DT01FX1RZUEUsIHJldiA9ICdyJykNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGdp4buvYSBraMOhY2ggaMOgbmcgY8OzIHZp4buHYyBsw6BtIHNvIHbhu5tpIGtow6FjaCBow6BuZyDEkcOjIHThu6tuZy9jaMawYSBjw7Mgdmnhu4djIHZheSB0w61uIGThu6VuZyBsw6AgMS4yMyBs4bqnbi4NCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIE5BTUVfQ09OVFJBQ1RfVFlQRSAmIE5BTUVfVFlQRV9TVUlURQ0KDQojIyMjIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kw0KDQoqQuG6o25nIHThuqduIHPhu5EqDQoNCmBgYHtyfQ0KTkFNRV9UWVBFX1NVSVRFMSA8LSBkYXRhICU+JSBtdXRhdGUoTkFNRV9UWVBFX1NVSVRFID0gY2FzZV93aGVuKE5BTUVfVFlQRV9TVUlURSA9PSAiQ2hpbGRyZW4iIH4gMywgTkFNRV9UWVBFX1NVSVRFID09ICJGYW1pbHkiIH4gMywgTkFNRV9UWVBFX1NVSVRFID09ICJHcm91cCBvZiBwZW9wbGUiIH4gMywgTkFNRV9UWVBFX1NVSVRFID09ICJTcG91c2UsIHBhcnRuZXIiIH4gMywgTkFNRV9UWVBFX1NVSVRFID09ICJVbmFjY29tcGFuaWVkIiB+IDQpKQ0KTkFNRV9UWVBFX1NVSVRFMyA8LWN1dChOQU1FX1RZUEVfU1VJVEUxJE5BTUVfVFlQRV9TVUlURSwgYnJlYWtzPWMoMCwzLDQpLCBsYWJlbHM9YygnWWVzJywgJ05vJykpDQp0YWJsZShOQU1FX1RZUEVfU1VJVEUzKQ0KYGBgDQoNCmBgYHtyfQ0KTkFNRV9UWVBFX1NVSVRFIDwtIHRhYmxlKE5BTUVfVFlQRV9TVUlURTMsIGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKQ0KTkFNRV9UWVBFX1NVSVRFDQpgYGANCg0KKiBDw7MgMTIyOCBraMOhY2ggaMOgbmcgY8OzIG5nxrDhu51pIHRo4bulIGjGsOG7n25nIHZheSB0aeG7gW4gbeG6t3QgdsOgIDY3NyB2YXkgdMOtbiBk4bulbmcuDQoNCiogQ8OzIDUyNzEga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgdmF5IHRp4buBbiBt4bq3dCB2w6AgMjgyNCB2YXkgdMOtbiBk4bulbmcuDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQpOQU1FX1RZUEVfU1VJVEUyIDwtIHByb3AudGFibGUoTkFNRV9UWVBFX1NVSVRFKQ0KTkFNRV9UWVBFX1NVSVRFMg0KYGBgDQoNCipQaMOibiBwaOG7kWkgYmnhur9uKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnMoTkFNRV9UWVBFX1NVSVRFKQ0KYGBgDQoNCipCaeG7g3UgxJHhu5MgY+G7mXQga+G6v3QgaOG7o3AgMiBiaeG6v24qDQoNCmBgYHtyfQ0KayA8LSBkYXRhLmZyYW1lKGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFLCBkYXRhJEZMQUdfT1dOX0NBUiwgZGF0YSRDT0RFX0dFTkRFUiwgZGF0YSRGTEFHX09XTl9SRUFMVFksIGRhdGEkQ05UX0NISUxEUkVOLCBkYXRhJEFNVF9JTkNPTUVfVE9UQUwsIGRhdGEkQU1UX0NSRURJVCwgZGF0YSRBTVRfQU5OVUlUWSwgZGF0YSROQU1FX1RZUEVfU1VJVEUsIGRhdGEkTkFNRV9JTkNPTUVfVFlQRSwgZGF0YSROQU1FX0VEVUNBVElPTl9UWVBFLCBkYXRhJE5BTUVfRkFNSUxZX1NUQVRVUywgZGF0YSROQU1FX0hPVVNJTkdfVFlQRSwgTkFNRV9UWVBFX1NVSVRFMykNCmsgfD4gZ2dwbG90KGFlcyh4PU5BTUVfVFlQRV9TVUlURTMseT1hZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0ibGF2ZW5kZXIiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAibmF2eSIsIHZqdXN0ID0gLSAuNSkgKyBmYWNldF9ncmlkKC4gfmRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKSArIGxhYnMoeCA9ICJOQU1FX1RZUEVfU1VJVEUiLHkgPSAiY2xpZW50IikNCmBgYA0KDQoqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJpc2sgcmF0aW8pKg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpyaXNrcmF0aW8oTkFNRV9UWVBFX1NVSVRFKQ0KYGBgDQoNClThu7cgbOG7hyBuZ8aw4budaSB2YXkgdMOtbiBk4bulbmcga2jDtG5nIGPDsyBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyBn4bqlcCAwLjk4IGzhuqduIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSB2YXkgdMOtbiBk4bulbmcgY8OzIG5nxrDhu51pIHRo4bulIGjGsOG7n25nLiANCg0KYGBge3J9DQpyaXNrcmF0aW8oTkFNRV9UWVBFX1NVSVRFLCByZXYgPSAiYyIpDQpgYGANCg0KVOG7tyBs4buHIG5nxrDhu51pIHZheSB0aeG7gW4gbeG6t3Qga2jDtG5nIGPDsyBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyBn4bqlcCAxLjAxIGzhuqduIHNvIHbhu5tpIHThu7cgbOG7hyBuZ8aw4budaSB2YXkgdGnhu4FuIG3hurd0IGPDsyBuZ8aw4budaSB0aOG7pSBoxrDhu59uZy4NCg0KKlThu7cgbOG7hyBjaMOqbmggbOG7h2NoIChvZGQgcmF0aW8pKg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhOQU1FX1RZUEVfU1VJVEUpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIG5nxrDhu51pIHRo4bulIGjGsOG7n25nIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgbmfGsOG7nWkgdGjhu6UgaMaw4bufbmcgdmF5IHTDrW4gZOG7pW5nIGzDoCAwLjk3IGzhuqduLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhOQU1FX1RZUEVfU1VJVEUsIHJldiA9ICdyJykNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2Ega2jDoWNoIGjDoG5nIGPDsyBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyBzbyB24bubaSBraMOhY2ggaMOgbmcga2jDtG5nIGPDsyBuZ8aw4budaSB0aOG7pSBoxrDhu59uZyB2YXkgdMOtbiBk4bulbmcgbMOgIDEuMDMgbOG6p24uDQoNCiMjIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBOQU1FX0NPTlRSQUNUX1RZUEUgJiBOQU1FX0hPVVNJTkdfVFlQRQ0KDQojIyMjIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kw0KDQoqQuG6o25nIHThuqduIHPhu5EqDQoNCmBgYHtyfQ0KTkFNRV9IT1VTSU5HX1RZUEUxIDwtIGRhdGEgJT4lIG11dGF0ZShOQU1FX0hPVVNJTkdfVFlQRSA9IGNhc2Vfd2hlbihOQU1FX0hPVVNJTkdfVFlQRSA9PSAiSG91c2UgLyBhcGFydG1lbnQiIH4gMywgTkFNRV9IT1VTSU5HX1RZUEUgPT0gIkNvLW9wIGFwYXJ0bWVudCIgfiA0LCBOQU1FX0hPVVNJTkdfVFlQRSA9PSAiTXVuaWNpcGFsIGFwYXJ0bWVudCIgfiA0LCBOQU1FX0hPVVNJTkdfVFlQRSA9PSAiT2ZmaWNlIGFwYXJ0bWVudCIgfiA0LCBOQU1FX0hPVVNJTkdfVFlQRSA9PSAiUmVudGVkIGFwYXJ0bWVudCIgfiA0LCBOQU1FX0hPVVNJTkdfVFlQRSA9PSAiV2l0aCBwYXJlbnRzIiB+IDQpKQ0KTkFNRV9IT1VTSU5HX1RZUEUzIDwtY3V0KE5BTUVfSE9VU0lOR19UWVBFMSROQU1FX0hPVVNJTkdfVFlQRSwgYnJlYWtzPWMoMCwzLDQpLCBsYWJlbHM9YygnWWVzJywgJ05vJykpDQp0YWJsZShOQU1FX0hPVVNJTkdfVFlQRTMpDQpgYGANCg0KYGBge3J9DQpOQU1FX0hPVVNJTkdfVFlQRSA8LSB0YWJsZShOQU1FX0hPVVNJTkdfVFlQRTMsIGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKQ0KTkFNRV9IT1VTSU5HX1RZUEUNCmBgYA0KDQoqIEPDsyA1NzQ0IGtow6FjaCBow6BuZyBjw7MgY8SDbiBo4buZIHJpw6puZyB2YXkgdGnhu4FuIG3hurd0IHbDoCAzMTA3IHZheSB0w61uIGThu6VuZy4NCg0KKiBDw7MgNzU1IGtow6FjaCBow6BuZyBraMO0bmcgY8OzIGPEg24gaOG7mSByacOqbmcgdmF5IHRp4buBbiBt4bq3dCB2w6AgMzk0IHZheSB0w61uIGThu6VuZy4NCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KTkFNRV9IT1VTSU5HX1RZUEUyIDwtIHByb3AudGFibGUoTkFNRV9IT1VTSU5HX1RZUEUpDQpOQU1FX0hPVVNJTkdfVFlQRTINCmBgYA0KDQoqUGjDom4gcGjhu5FpIGJp4bq/bioNCg0KYGBge3J9DQphZGRtYXJnaW5zKE5BTUVfSE9VU0lOR19UWVBFKQ0KYGBgDQoNCipCaeG7g3UgxJHhu5MgY+G7mXQga+G6v3QgaOG7o3AgMiBiaeG6v24qDQoNCmBgYHtyfQ0KayA8LSBkYXRhLmZyYW1lKGRhdGEkTkFNRV9DT05UUkFDVF9UWVBFLCBkYXRhJEZMQUdfT1dOX0NBUiwgZGF0YSRDT0RFX0dFTkRFUiwgZGF0YSRGTEFHX09XTl9SRUFMVFksIGRhdGEkQ05UX0NISUxEUkVOLCBkYXRhJEFNVF9JTkNPTUVfVE9UQUwsIGRhdGEkQU1UX0NSRURJVCwgZGF0YSRBTVRfQU5OVUlUWSwgZGF0YSROQU1FX1RZUEVfU1VJVEUsIGRhdGEkTkFNRV9JTkNPTUVfVFlQRSwgZGF0YSROQU1FX0VEVUNBVElPTl9UWVBFLCBkYXRhJE5BTUVfRkFNSUxZX1NUQVRVUywgZGF0YSROQU1FX0hPVVNJTkdfVFlQRSwgTkFNRV9IT1VTSU5HX1RZUEUzKQ0KayB8PiBnZ3Bsb3QoYWVzKHg9TkFNRV9IT1VTSU5HX1RZUEUzLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9ImxhdmVuZGVyIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gIm5hdnkiLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5kYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkgKyBsYWJzKHggPSAiTkFNRV9IT1VTSU5HX1RZUEUiLHkgPSAiY2xpZW50IikNCmBgYA0KDQoqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgKFJpc2sgcmF0aW8pKg0KDQpgYGB7cn0NCmxpYnJhcnkoZXBpdG9vbHMpDQpyaXNrcmF0aW8oTkFNRV9IT1VTSU5HX1RZUEUpDQpgYGANCg0KVOG7tyBs4buHIG5nxrDhu51pIHZheSB0w61uIGThu6VuZyBraMO0bmcgY8OzIGPEg24gaOG7mSByacOqbmcgZ+G6pXAgMC45OCBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIGPDsyBjxINuIGjhu5kgcmnDqm5nLiANCg0KYGBge3J9DQpyaXNrcmF0aW8oTkFNRV9IT1VTSU5HX1RZUEUsIHJldiA9ICJjIikNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHRp4buBbiBt4bq3dCBraMO0bmcgY8OzIGPEg24gaOG7mSByacOqbmcgZ+G6pXAgMS4wMSBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdmF5IHRp4buBbiBt4bq3dCBjw7MgY8SDbiBo4buZIHJpw6puZy4gDQoNCipU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCAob2RkIHJhdGlvKSoNCg0KYGBge3J9DQpvZGRzcmF0aW8oTkFNRV9IT1VTSU5HX1RZUEUpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIGPEg24gaOG7mSByacOqbmcgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBjxINuIGjhu5kgcmnDqm5nIHZheSB0w61uIGThu6VuZyBsw6AgMC45NiBs4bqnbi4NCg0KYGBge3J9DQpvZGRzcmF0aW8oTkFNRV9IT1VTSU5HX1RZUEUsIHJldiA9ICdyJykNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2Ega2jDoWNoIGjDoG5nIGPDsyBjxINuIGjhu5kgcmnDqm5nIHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIGPEg24gaOG7mSByacOqbmcgdmF5IHTDrW4gZOG7pW5nIGzDoCAxLjAzNyBs4bqnbi4NCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIE5BTUVfQ09OVFJBQ1RfVFlQRSAmIE5BTUVfRURVQ0FUSU9OX1RZUEUNCg0KIyMjIyBC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MNCg0KKkLhuqNuZyB04bqnbiBz4buRKg0KDQpgYGB7cn0NCk5BTUVfRURVQ0FUSU9OX1RZUEUxIDwtIGRhdGEgJT4lIG11dGF0ZShOQU1FX0VEVUNBVElPTl9UWVBFID0gY2FzZV93aGVuKE5BTUVfRURVQ0FUSU9OX1RZUEUgPT0gIkFjYWRlbWljIGRlZ3JlZSIgfiAzLCBOQU1FX0VEVUNBVElPTl9UWVBFID09ICJIaWdoZXIgZWR1Y2F0aW9uIiB+IDMsIE5BTUVfRURVQ0FUSU9OX1RZUEUgPT0gIkluY29tcGxldGUgaGlnaGVyIiB+IDQsIE5BTUVfRURVQ0FUSU9OX1RZUEUgPT0gIkxvd2VyIHNlY29uZGFyeSIgfiA0LCBOQU1FX0VEVUNBVElPTl9UWVBFID09ICJTZWNvbmRhcnkgLyBzZWNvbmRhcnkgc3BlY2lhbCIgfiA0KSkNCk5BTUVfRURVQ0FUSU9OX1RZUEUzIDwtY3V0KE5BTUVfRURVQ0FUSU9OX1RZUEUxJE5BTUVfRURVQ0FUSU9OX1RZUEUsIGJyZWFrcz1jKDAsMyw0KSwgbGFiZWxzPWMoJ1llcycsICdObycpKQ0KdGFibGUoTkFNRV9FRFVDQVRJT05fVFlQRTMpDQpgYGANCg0KYGBge3J9DQpOQU1FX0VEVUNBVElPTl9UWVBFIDwtIHRhYmxlKE5BTUVfRURVQ0FUSU9OX1RZUEUzLCBkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkNCk5BTUVfRURVQ0FUSU9OX1RZUEUNCmBgYA0KDQoqIEPDsyAxNTE0IGtow6FjaCBow6BuZyBjw7MgYuG6sW5nIEPhu60gbmjDom4gdHLhu58gbMOqbiB2YXkgdGnhu4FuIG3hurd0IHbDoCA5MDkgdmF5IHTDrW4gZOG7pW5nLg0KDQoqIEPDsyA0OTg1IGtow6FjaCBow6BuZyBkxrDhu5tpIHRyw6xuaCDEkeG7mSBD4butIG5ow6JuIHZheSB0aeG7gW4gbeG6t3QgdsOgIDI1OTIgdmF5IHTDrW4gZOG7pW5nLg0KDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQpOQU1FX0VEVUNBVElPTl9UWVBFMiA8LSBwcm9wLnRhYmxlKE5BTUVfRURVQ0FUSU9OX1RZUEUpDQpOQU1FX0VEVUNBVElPTl9UWVBFMg0KYGBgDQoNCipQaMOibiBwaOG7kWkgYmnhur9uKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnMoTkFNRV9FRFVDQVRJT05fVFlQRSkNCmBgYA0KDQoqQmnhu4N1IMSR4buTIGPhu5l0IGvhur90IGjhu6NwIDIgYmnhur9uKg0KDQpgYGB7cn0NCmsgPC0gZGF0YS5mcmFtZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSwgZGF0YSRGTEFHX09XTl9DQVIsIGRhdGEkQ09ERV9HRU5ERVIsIGRhdGEkRkxBR19PV05fUkVBTFRZLCBkYXRhJENOVF9DSElMRFJFTiwgZGF0YSRBTVRfSU5DT01FX1RPVEFMLCBkYXRhJEFNVF9DUkVESVQsIGRhdGEkQU1UX0FOTlVJVFksIGRhdGEkTkFNRV9UWVBFX1NVSVRFLCBkYXRhJE5BTUVfSU5DT01FX1RZUEUsIGRhdGEkTkFNRV9FRFVDQVRJT05fVFlQRSwgZGF0YSROQU1FX0ZBTUlMWV9TVEFUVVMsIGRhdGEkTkFNRV9IT1VTSU5HX1RZUEUsIE5BTUVfRURVQ0FUSU9OX1RZUEUzKQ0KayB8PiBnZ3Bsb3QoYWVzKHg9TkFNRV9FRFVDQVRJT05fVFlQRTMseT1hZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0ibGF2ZW5kZXIiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAibmF2eSIsIHZqdXN0ID0gLSAuNSkgKyBmYWNldF9ncmlkKC4gfmRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKSArIGxhYnMoeCA9ICJOQU1FX0VEVUNBVElPTl9UWVBFIix5ID0gImNsaWVudCIpDQpgYGANCg0KKlLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSaXNrIHJhdGlvKSoNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0Kcmlza3JhdGlvKE5BTUVfRURVQ0FUSU9OX1RZUEUpDQpgYGANCg0KVOG7tyBs4buHIG5nxrDhu51pIHZheSB0w61uIGThu6VuZyBkxrDhu5tpIHRyw6xuaCDEkeG7mSBD4butIG5ow6JuIGfhuqVwIDAuOTEgbOG6p24gc28gduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIHZheSB0w61uIGThu6VuZyB0csOsbmggxJHhu5kgQ+G7rSBuaMOibiB0cuG7nyBsw6puLiANCg0KYGBge3J9DQpyaXNrcmF0aW8oTkFNRV9FRFVDQVRJT05fVFlQRSwgcmV2ID0gImMiKQ0KYGBgDQoNClThu7cgbOG7hyBuZ8aw4budaSB2YXkgdGnhu4FuIG3hurd0IGTGsOG7m2kgdHLDrG5oIMSR4buZIEPhu60gbmjDom4gZ+G6pXAgMS4wNSBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIHRyw6xuaCDEkeG7mSBD4butIG5ow6JuIHRy4bufIGzDqm4uIA0KDQoqVOG7tyBs4buHIGNow6puaCBs4buHY2ggKG9kZCByYXRpbykqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKE5BTUVfRURVQ0FUSU9OX1RZUEUpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyBkxrDhu5tpIHRyw6xuaCDEkeG7mSBD4butIG5ow6JuIHNvIHbhu5tpIGtow6FjaCBow6BuZyB04burIHRyw6xuaCDEkeG7mSBD4butIG5ow6JuIHRy4bufIGzDqm4gdmF5IHTDrW4gZOG7pW5nIGzDoCAwLjg3IGzhuqduLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhOQU1FX0VEVUNBVElPTl9UWVBFLCByZXYgPSAncicpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyB04burIHRyw6xuaCDEkeG7mSBD4butIG5ow6JuIHRy4bufIGzDqm4gc28gduG7m2kga2jDoWNoIGjDoG5nIGTGsOG7m2kgQ+G7rSBuaMOibiB2YXkgdMOtbiBk4bulbmcgbMOgIDEuNTQgbOG6p24uDQoNCiMjIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBOQU1FX0NPTlRSQUNUX1RZUEUgJiBBTVRfQU5OVUlUWQ0KDQojIyMjIELhuqNuZyB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIGJp4buDdSDEkeG7kw0KDQpgYGB7cn0NCkFNVF9BTk5VSVRZMSA8LSBjdXQoZGF0YSRBTVRfQU5OVUlUWSwgYnJlYWtzID0gYygtSW5mLDMwMDAwLDEzNTkzNiksIGxhYmVscyA9IGMoJzI1OTYgLSAzMDAwMCcsICc+MzAwMDAnKSkNCnRhYmxlKEFNVF9BTk5VSVRZMSkNCmBgYA0KDQoqQuG6o25nIHThuqduIHPhu5EqDQoNCmBgYHtyfQ0KQU1UX0FOTlVJVFkgPC0gdGFibGUoQU1UX0FOTlVJVFkxLCBkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkNCkFNVF9BTk5VSVRZDQpgYGANCg0KKiBDw7MgMzk4NSBraMOhY2ggaMOgbmcgY8OzIGtob+G6o24gdHLhuqMgaMOgbmcgdGjDoW5nIHThu6sgMjU5NiDEkeG6v24gMzAwMDAgdmF5IHRp4buBbiBt4bq3dCB2w6AgMjQ2NSB2YXkgdMOtbiBk4bulbmcuDQoNCiogQ8OzIDI1MTQga2jDoWNoIGjDoG5nIGPDsyBraG/huqNuIHRy4bqjIGjDoG5nIHRow6FuZyA+MzAwMDAgdmF5IHRp4buBbiBt4bq3dCB2w6AgMTAzNiB2YXkgdMOtbiBk4bulbmcuDQoqQuG6o25nIHThuqduIHN14bqldCoNCg0KYGBge3J9DQpBTVRfQU5OVUlUWTIgPC0gcHJvcC50YWJsZShBTVRfQU5OVUlUWSkNCkFNVF9BTk5VSVRZMg0KYGBgDQoNCipQaMOibiBwaOG7kWkgYmnhur9uKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnMoQU1UX0FOTlVJVFkpDQpgYGANCg0KKkJp4buDdSDEkeG7kyBj4buZdCBr4bq/dCBo4bujcCAyIGJp4bq/bioNCg0KYGBge3J9DQprIDwtIGRhdGEuZnJhbWUoZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUsIGRhdGEkRkxBR19PV05fQ0FSLCBkYXRhJENPREVfR0VOREVSLCBkYXRhJEZMQUdfT1dOX1JFQUxUWSwgZGF0YSRDTlRfQ0hJTERSRU4sIGRhdGEkQU1UX0lOQ09NRV9UT1RBTCwgZGF0YSRBTVRfQ1JFRElULCBkYXRhJEFNVF9BTk5VSVRZLCBkYXRhJE5BTUVfVFlQRV9TVUlURSwgZGF0YSROQU1FX0lOQ09NRV9UWVBFLCBkYXRhJE5BTUVfRURVQ0FUSU9OX1RZUEUsIGRhdGEkTkFNRV9GQU1JTFlfU1RBVFVTLCBkYXRhJE5BTUVfSE9VU0lOR19UWVBFLCBBTVRfQU5OVUlUWTEpDQprIHw+IGdncGxvdChhZXMoeD1BTVRfQU5OVUlUWTEseT1hZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbD0ibGF2ZW5kZXIiKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSkpLCBzdGF0ID0gImNvdW50IiwgY29sb3IgPSAibmF2eSIsIHZqdXN0ID0gLSAuNSkgKyBmYWNldF9ncmlkKC4gfmRhdGEkTkFNRV9DT05UUkFDVF9UWVBFKSArIGxhYnMoeCA9ICJBTVRfQU5OVUlUWSIseSA9ICJjbGllbnQiKQ0KYGBgDQoNCipS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmlzayByYXRpbykqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyhBTVRfQU5OVUlUWSkNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIGPDsyBraG/huqNuIHRy4bqjIGjDoG5nIHRow6FuZyB04burIDMwMDAwIHRy4bufIHh14buRbmcgZ+G6pXAgMC43NiBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cgbmfGsOG7nWkgdmF5IHTDrW4gZOG7pW5nIGPDsyBraG/huqNuIHRy4bqjIGjDoG5nIHRow6FuZyBkxrDhu5tpIDMwMDAwLiANCg0KYGBge3J9DQpyaXNrcmF0aW8oQU1UX0FOTlVJVFksIHJldiA9ICJjIikNCmBgYA0KDQpU4bu3IGzhu4cgbmfGsOG7nWkgdmF5IHRp4buBbiBt4bq3dCBjw7Mga2hv4bqjbiB0cuG6oyBow6BuZyB0aMOhbmcgdOG7qyAzMDAwMCB0cuG7nyB4deG7kW5nIGfhuqVwIDEuMTUgbOG6p24gc28gduG7m2kgdOG7tyBs4buHIG5nxrDhu51pIHZheSB0aeG7gW4gbeG6t3QgY8OzIGtob+G6o24gdHLhuqMgaMOgbmcgdGjDoW5nIGTGsOG7m2kgMzAwMDAuIA0KDQoqVOG7tyBs4buHIGNow6puaCBs4buHY2ggKG9kZCByYXRpbykqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKEFNVF9BTk5VSVRZKQ0KYGBgDQoNClThu7cgbOG7hyBjaMOqbmggbOG7h2NoIGdp4buvYSBraMOhY2ggaMOgbmcgY8OzIGtob+G6o24gdHLhuqMgaMOgbmcgdGjDoW5nIHRyw6puIDMwMDAwIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7Mga2hv4bqjbiB0cuG6oyBow6BuZyB0aMOhbmcgdOG7qyAzMDAwMCB0cuG7nyB4deG7kW5nIHZheSB0w61uIGThu6VuZyBsw6AgMC42NyBs4bqnbi4NCg0KYGBge3J9DQpvZGRzcmF0aW8oQU1UX0FOTlVJVFksIHJldiA9ICdyJykNCmBgYA0KDQpU4bu3IGzhu4cgY2jDqm5oIGzhu4djaCBnaeG7r2Ega2jDoWNoIGjDoG5nIGPDsyBraG/huqNuIHRy4bqjIGjDoG5nIHRow6FuZyB04burIDMwMDAwIHRy4bufIHh14buRbmcgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBraG/huqNuIHRy4bqjIGjDoG5nIHRow6FuZyB0csOqbiAzMDAwMCB2YXkgdMOtbiBk4bulbmcgbMOgIDEuNSBs4bqnbi4NCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIE5BTUVfQ09OVFJBQ1RfVFlQRSAmIEFNVF9DUkVESVQNCg0KIyMjIyBC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpBTVRfQ1JFRElUMSA8LSBjdXQoZGF0YSRBTVRfQ1JFRElULCBicmVha3MgPSBjKC1JbmYsNDAwMDAwLDI5NjEwMDApLCBsYWJlbHMgPSBjKCc0NTAwMCAtIDQwMDAwMCcsICc+NDAwMDAwJykpDQp0YWJsZShBTVRfQ1JFRElUMSkNCmBgYA0KDQoqQuG6o25nIHThuqduIHPhu5EqDQoNCmBgYHtyfQ0KQU1UX0NSRURJVCA8LSB0YWJsZShBTVRfQ1JFRElUMSwgZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUpDQpBTVRfQ1JFRElUDQpgYGANCg0KKiBDw7MgMjIwNyBraMOhY2ggaMOgbmcgY8OzIGjhuqFuIG3hu6ljIHZheSB0cm9uZyBraG/huqNuIDQ1MDAwIC0gNDAwMDAwIHZheSB0aeG7gW4gbeG6t3QgdsOgIDE2MDcgdmF5IHTDrW4gZOG7pW5nLg0KDQoqIEPDsyA0MjkyIGtow6FjaCBow6BuZyBjw7MgaOG6oW4gbeG7qWMgdmF5IHRyw6puIDQwMDAwMCB2YXkgdGnhu4FuIG3hurd0IHbDoCAxODk0IHZheSB0w61uIGThu6VuZy4NCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KQU1UX0NSRURJVDIgPC0gcHJvcC50YWJsZShBTVRfQ1JFRElUKQ0KQU1UX0NSRURJVDINCmBgYA0KDQoqUGjDom4gcGjhu5FpIGJp4bq/bioNCg0KYGBge3J9DQphZGRtYXJnaW5zKEFNVF9DUkVESVQpDQpgYGANCg0KKkJp4buDdSDEkeG7kyBj4buZdCBr4bq/dCBo4bujcCAyIGJp4bq/bioNCg0KYGBge3J9DQprIDwtIGRhdGEuZnJhbWUoZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUsIGRhdGEkRkxBR19PV05fQ0FSLCBkYXRhJENPREVfR0VOREVSLCBkYXRhJEZMQUdfT1dOX1JFQUxUWSwgZGF0YSRDTlRfQ0hJTERSRU4sIGRhdGEkQU1UX0lOQ09NRV9UT1RBTCwgZGF0YSRBTVRfQ1JFRElULCBkYXRhJEFNVF9BTk5VSVRZLCBkYXRhJE5BTUVfVFlQRV9TVUlURSwgZGF0YSROQU1FX0lOQ09NRV9UWVBFLCBkYXRhJE5BTUVfRURVQ0FUSU9OX1RZUEUsIGRhdGEkTkFNRV9GQU1JTFlfU1RBVFVTLCBkYXRhJE5BTUVfSE9VU0lOR19UWVBFLCBBTVRfQ1JFRElUMSkNCmsgfD4gZ2dwbG90KGFlcyh4PUFNVF9DUkVESVQxLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9ImxhdmVuZGVyIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gIm5hdnkiLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5kYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkgKyBsYWJzKHggPSAiQU1UX0NSRURJVCIseSA9ICJjbGllbnQiKQ0KYGBgDQoNCipS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmlzayByYXRpbykqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyhBTVRfQ1JFRElUKQ0KYGBgDQoNClThu7cgbOG7hyBraMOhY2ggaMOgbmcgY8OzIGjhuqFuIG3hu6ljIHZheSB0csOqbiA0MDAwMDAgdmF5IHTDrW4gZOG7pW5nIGfhuqVwIDAuNzMgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBo4bqhbiBt4bupYyB2YXkgdOG7qyA0MDAwMDAgdHLhu58geHXhu5FuZyB2YXkgdMOtbiBk4bulbmcuIA0KDQpgYGB7cn0NCnJpc2tyYXRpbyhBTVRfQ1JFRElULCByZXYgPSAiYyIpDQpgYGANCg0KVOG7tyBs4buHIGtow6FjaCBow6BuZyBjw7MgaOG6oW4gbeG7qWMgdmF5IHRyw6puIDQwMDAwMCB2YXkgdGnhu4FuIG3hurd0IGfhuqVwIDEuMiBs4bqnbiBzbyB24bubaSBraMOhY2ggaMOgbmcgY8OzIGjhuqFuIG3hu6ljIHZheSB04burIDQwMDAwMCB0cuG7nyB4deG7kW5nIHZheSB0aeG7gW4gbeG6t3QuIA0KDQoqVOG7tyBs4buHIGNow6puaCBs4buHY2ggKG9kZCByYXRpbykqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKEFNVF9DUkVESVQpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyBjw7MgaOG6oW4gbeG7qWMgdmF5IHRyw6puIDQwMDAwMCBzbyB24bubaSBraMOhY2ggaMOgbmcgY8OzIGjhuqFuIG3hu6ljIHZheSB04burIDQwMDAwMCB0cuG7nyB4deG7kW5nIHZheSB0w61uIGThu6VuZyBsw6AgMC42IGzhuqduLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhBTVRfQ1JFRElULCByZXYgPSAncicpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyBjw7MgaOG6oW4gbeG7qWMgdmF5IHThu6sgNDAwMDAwIHRy4bufIHh14buRbmcgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBo4bqhbiBt4bupYyB2YXkgdHLDqm4gNDAwMDAwIHZheSB0w61uIGThu6VuZyBsw6AgMS42NSBs4bqnbi4NCg0KIyMjIFRo4buRbmcga8OqIG3DtCB04bqjIE5BTUVfQ09OVFJBQ1RfVFlQRSAmIEFNVF9JTkNPTUVfVE9UQUwNCg0KIyMjIyBC4bqjbmcgdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCBiaeG7g3UgxJHhu5MNCg0KYGBge3J9DQpBTVRfSU5DT01FX1RPVEFMMSA8LSBjdXQoZGF0YSRBTVRfSU5DT01FX1RPVEFMLCBicmVha3MgPSBjKC1JbmYsMTAwMDAwLDE5MzUwMDApLCBsYWJlbHMgPSBjKCcyNTY1MCAtIDEwMDAwMCcsICc+MTAwMDAwJykpDQp0YWJsZShBTVRfSU5DT01FX1RPVEFMMSkNCmBgYA0KDQoqQuG6o25nIHThuqduIHPhu5EqDQoNCmBgYHtyfQ0KQU1UX0lOQ09NRV9UT1RBTCA8LSB0YWJsZShBTVRfSU5DT01FX1RPVEFMMSwgZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUpDQpBTVRfSU5DT01FX1RPVEFMDQpgYGANCg0KKiBDw7MgMTM4MSBraMOhY2ggaMOgbmcgY8OzIHThu5VuZyB0aHUgbmjhuq1wIHRyb25nIGtob+G6o24gMjU2NTAgLSAxMDAwMDAgdmF5IHRp4buBbiBt4bq3dCB2w6AgNzU4IHZheSB0w61uIGThu6VuZy4NCg0KKiBDw7MgNTExOCBraMOhY2ggaMOgbmcgY8OzIHThu5VuZyB0aHUgbmjhuq1wIGNhbyBoxqFuIDEwMDAwMCB2YXkgdGnhu4FuIG3hurd0IHbDoCAyNzQzIHZheSB0w61uIGThu6VuZy4NCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KQU1UX0lOQ09NRV9UT1RBTDIgPC0gcHJvcC50YWJsZShBTVRfSU5DT01FX1RPVEFMKQ0KQU1UX0lOQ09NRV9UT1RBTDINCmBgYA0KDQoqUGjDom4gcGjhu5FpIGJp4bq/bioNCg0KYGBge3J9DQphZGRtYXJnaW5zKEFNVF9JTkNPTUVfVE9UQUwpDQpgYGANCg0KKkJp4buDdSDEkeG7kyBj4buZdCBr4bq/dCBo4bujcCAyIGJp4bq/bioNCg0KYGBge3J9DQprIDwtIGRhdGEuZnJhbWUoZGF0YSROQU1FX0NPTlRSQUNUX1RZUEUsIGRhdGEkRkxBR19PV05fQ0FSLCBkYXRhJENPREVfR0VOREVSLCBkYXRhJEZMQUdfT1dOX1JFQUxUWSwgZGF0YSRDTlRfQ0hJTERSRU4sIGRhdGEkQU1UX0lOQ09NRV9UT1RBTCwgZGF0YSRBTVRfQ1JFRElULCBkYXRhJEFNVF9BTk5VSVRZLCBkYXRhJE5BTUVfVFlQRV9TVUlURSwgZGF0YSROQU1FX0lOQ09NRV9UWVBFLCBkYXRhJE5BTUVfRURVQ0FUSU9OX1RZUEUsIGRhdGEkTkFNRV9GQU1JTFlfU1RBVFVTLCBkYXRhJE5BTUVfSE9VU0lOR19UWVBFLCBBTVRfSU5DT01FX1RPVEFMMSkNCmsgfD4gZ2dwbG90KGFlcyh4PUFNVF9JTkNPTUVfVE9UQUwxLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9ImxhdmVuZGVyIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gIm5hdnkiLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5kYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkgKyBsYWJzKHggPSAiQU1UX0lOQ09NRV9UT1RBTCIseSA9ICJjbGllbnQiKQ0KYGBgDQoNCipS4bunaSBybyB0xrDGoW5nIMSR4buRaSAoUmlzayByYXRpbykqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyhBTVRfSU5DT01FX1RPVEFMKQ0KYGBgDQoNClThu7cgbOG7hyBraMOhY2ggaMOgbmcgdmF5IHTDrW4gZOG7pW5nIHRodSBuaOG6rXAgdHLDqm4gMTAwMDAwIGfhuqVwIDAuOTggbOG6p24gc28gduG7m2kgdOG7tyBs4buHIGtow6FjaCBow6BuZyB2YXkgdMOtbiBk4bulbmcgdGh1IG5o4bqtcCB0cm9uZyBraG/huqNuIDI1NjUwIC0gMTAwMDAwLiANCg0KYGBge3J9DQpyaXNrcmF0aW8oQU1UX0lOQ09NRV9UT1RBTCwgcmV2ID0gImMiKQ0KYGBgDQoNClThu7cgbOG7hyBraMOhY2ggaMOgbmcgdmF5IHRp4buBbiBt4bqhdCB0aHUgbmjhuq1wIHRyw6puIDEwMDAwMCBn4bqlcCAxLjAwOCBs4bqnbiBzbyB24bubaSB04bu3IGzhu4cga2jDoWNoIGjDoG5nIHZheSB0aeG7gW4gbeG6t3QgdGh1IG5o4bqtcCB0cm9uZyBraG/huqNuIDI1NjUwIC0gMTAwMDAwLg0KDQoqVOG7tyBs4buHIGNow6puaCBs4buHY2ggKG9kZCByYXRpbykqDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKEFNVF9JTkNPTUVfVE9UQUwpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2gga2jDoWNoIGjDoG5nIGPDsyB04buVbmcgdGh1IG5o4bqtcCB0csOqbiAxMDAwMDAgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyB0aHUgbmjhuq1wIHRyb25nIGtob+G6o24gMjU2NTAgLSAxMDAwMDAgdmF5IHTDrW4gZOG7pW5nIGzDoCAwLjk4IGzhuqduLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhBTVRfSU5DT01FX1RPVEFMLCByZXYgPSAncicpDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2gga2jDoWNoIGjDoG5nIGPDsyB04buVbmcgdGh1IG5o4bqtcCB0cm9uZyBraG/huqNuIDI1NjUwIC0gMTAwMDAwIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjw7MgdGh1IG5o4bqtcCB0csOqbiAxMDAwMDAgdmF5IHTDrW4gZOG7pW5nIGzDoCAxLjAyIGzhuqduLg0KDQojIyMgVGjhu5FuZyBrw6ogbcO0IHThuqMgTkFNRV9DT05UUkFDVF9UWVBFICYgQ05UX0NISUxEUkVODQoNCiMjIyMgQuG6o25nIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgYmnhu4N1IMSR4buTDQoNCmBgYHtyfQ0KQ05UX0NISUxEUkVOMSA8LSBjdXQoZGF0YSRDTlRfQ0hJTERSRU4sIGJyZWFrcyA9IGMoLUluZiwwLDcpLCBsYWJlbHMgPSBjKCdubycsICd5ZXMnKSkNCnRhYmxlKENOVF9DSElMRFJFTjEpDQpgYGANCg0KKkLhuqNuZyB04bqnbiBz4buRKg0KDQpgYGB7cn0NCkNOVF9DSElMRFJFTiA8LSB0YWJsZShDTlRfQ0hJTERSRU4xLCBkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkNCkNOVF9DSElMRFJFTg0KYGBgDQoqIEPDsyA0NTk2IGtow6FjaCBow6BuZyBraMO0bmcgY8OzIGNvbiB2YXkgdGnhu4FuIG3hurd0IHbDoCAyNDEwIHZheSB0w61uIGThu6VuZy4NCg0KKiBDw7MgMTkwMyBraMOhY2ggaMOgbmcgY8OzIGNvbiB2YXkgdGnhu4FuIG3hurd0IHbDoCAxMDkxIHZheSB0w61uIGThu6VuZy4NCg0KKkLhuqNuZyB04bqnbiBzdeG6pXQqDQoNCmBgYHtyfQ0KQ05UX0NISUxEUkVOMiA8LSBwcm9wLnRhYmxlKENOVF9DSElMRFJFTikNCkNOVF9DSElMRFJFTjINCmBgYA0KDQoqUGjDom4gcGjhu5FpIGJp4bq/bioNCg0KYGBge3J9DQphZGRtYXJnaW5zKENOVF9DSElMRFJFTikNCmBgYA0KDQoqQmnhu4N1IMSR4buTIGPhu5l0IGvhur90IGjhu6NwIDIgYmnhur9uKg0KDQpgYGB7cn0NCmsgPC0gZGF0YS5mcmFtZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSwgZGF0YSRGTEFHX09XTl9DQVIsIGRhdGEkQ09ERV9HRU5ERVIsIGRhdGEkRkxBR19PV05fUkVBTFRZLCBkYXRhJENOVF9DSElMRFJFTiwgZGF0YSRBTVRfSU5DT01FX1RPVEFMLCBkYXRhJEFNVF9DUkVESVQsIGRhdGEkQU1UX0FOTlVJVFksIGRhdGEkTkFNRV9UWVBFX1NVSVRFLCBkYXRhJE5BTUVfSU5DT01FX1RZUEUsIGRhdGEkTkFNRV9FRFVDQVRJT05fVFlQRSwgZGF0YSROQU1FX0ZBTUlMWV9TVEFUVVMsIGRhdGEkTkFNRV9IT1VTSU5HX1RZUEUsIENOVF9DSElMRFJFTjEpDQprIHw+IGdncGxvdChhZXMoeD1DTlRfQ0hJTERSRU4xLHk9YWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGw9ImxhdmVuZGVyIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSkpKSwgc3RhdCA9ICJjb3VudCIsIGNvbG9yID0gIm5hdnkiLCB2anVzdCA9IC0gLjUpICsgZmFjZXRfZ3JpZCguIH5kYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSkgKyBsYWJzKHggPSAiQ05UX0NISUxEUkVOIix5ID0gImNsaWVudCIpDQpgYGANCg0KKlLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIChSaXNrIHJhdGlvKSoNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0Kcmlza3JhdGlvKENOVF9DSElMRFJFTikNCmBgYA0KDQpU4bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBjb24gdmF5IHTDrW4gZOG7pW5nIGfhuqVwIDAuMDUgbOG6p24gdOG7tyBs4buHIGtow6FjaCBow6BuZyBraMO0bmcgY29uIHZheSB0w61uIGThu6VuZy4gIA0KDQpgYGB7cn0NCnJpc2tyYXRpbyhDTlRfQ0hJTERSRU4sIHJldiA9ICJjIikNCmBgYA0KDQpU4bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBjb24gdmF5IHRp4buBbiBt4bq3dCBn4bqlcCAwLjk3IGzhuqduIHThu7cgbOG7hyBraMOhY2ggaMOgbmcga2jDtG5nIGNvbiB2YXkgdGnhu4FuIG3hurd0LiANCg0KKlThu7cgbOG7hyBjaMOqbmggbOG7h2NoIChvZGQgcmF0aW8pKg0KDQpgYGB7cn0NCm9kZHNyYXRpbyhDTlRfQ0hJTERSRU4pDQpgYGANCg0KVOG7tyBs4buHIGNow6puaCBs4buHY2ggZ2nhu69hIGtow6FjaCBow6BuZyBjw7MgY29uIHbDoCBraMOhY2ggaMOgbmcga2jDtG5nIGNvbiB2YXkgdMOtbiBk4bulbmcgbMOgIDEuMDkgbOG6p24uDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKENOVF9DSElMRFJFTiwgcmV2ID0gJ3InKQ0KYGBgDQoNClThu7cgbOG7hyBjaMOqbmggbOG7h2NoIGdp4buvYSBraMOhY2ggaMOgbmcga2jDtG5nIGNvbiB2w6Aga2jDoWNoIGjDoG5nIGPDsyBjb24gdmF5IHTDrW4gZOG7pW5nIGzDoCAwLjkxIGzhuqduLg0KDQojIyBUaOG7kW5nIGvDqiBzdXkgZGnhu4VuIGNobyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oDQoNCiMjIyBCaeG6v24gTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBiaeG6v24gQ09ERV9HRU5ERVINCg0KYGBge3J9DQpOQU1FX0NPTlRSQUNUX1RZUEUxIDwtIGlmZWxzZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRSA9PSAiQ3JlZGl0IiwgMSwgMCkNCmRhdGEgPC0gbXV0YXRlKGRhdGEsIE5BTUVfQ09OVFJBQ1RfVFlQRTEpDQp0YWJsZShkYXRhJE5BTUVfQ09OVFJBQ1RfVFlQRTEpDQpgYGANCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKE5BTUVfQ09OVFJBQ1RfVFlQRTEgLGRhdGEkQ09ERV9HRU5ERVIpKQ0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQoqICRIXzA6JCBOQU1FX0NPTlRSQUNUX1RZUEUgdsOgIENPREVfR0VOREVSIMSR4buZYyBs4bqtcCANCg0KKiAkSF8xOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBDT0RFX0dFTkRFUiBraMO0bmcgxJHhu5ljIGzhuq1wDQoNClThuqFpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhPTAuMDUkDQoNClRhIGPDsyBwX3ZhbHVlID0gMC4wMTg0IDwgJFxhbHBoYSwkIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgQ09ERV9HRU5ERVIga2jDtG5nIMSR4buZYyBs4bqtcCBuaGF1LiANCg0KIyMjIEJp4bq/biBOQU1FX0NPTlRSQUNUX1RZUEUgdsOgIGJp4bq/biBGTEFHX09XTl9DQVINCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKE5BTUVfQ09OVFJBQ1RfVFlQRTEsIGRhdGEkRkxBR19PV05fQ0FSKSkNCmBgYA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KKiAkSF8wOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBGTEFHX09XTl9DQVIgxJHhu5ljIGzhuq1wIA0KDQoqICRIXzE6JCBOQU1FX0NPTlRSQUNUX1RZUEUgdsOgIEZMQUdfT1dOX0NBUiBraMO0bmcgxJHhu5ljIGzhuq1wDQoNClThuqFpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhPTAuMDUkDQoNClRhIGPDsyBwX3ZhbHVlID0gMC4zMzEgPiAkXGFscGhhLCQgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgRkxBR19PV05fQ0FSIMSR4buZYyBs4bqtcCBuaGF1Lg0KDQojIyMgQmnhur9uIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgYmnhur9uIEZMQUdfT1dOX1JFQUxUWQ0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoTkFNRV9DT05UUkFDVF9UWVBFMSwgZGF0YSRGTEFHX09XTl9SRUFMVFkpKQ0KYGBgDQoNCkdp4bqjIHRodXnhur90Og0KDQoqICRIXzA6JCBOQU1FX0NPTlRSQUNUX1RZUEUgdsOgIEZMQUdfT1dOX1JFQUxUWSDEkeG7mWMgbOG6rXAgDQoNCiogJEhfMTokIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgRkxBR19PV05fUkVBTFRZIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KVOG6oWkgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQNCg0KVGEgY8OzIHBfdmFsdWUgPSAwLjI4MjQgPiAkXGFscGhhLCQgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgRkxBR19PV05fUkVBTFRZIMSR4buZYyBs4bqtcCBuaGF1Lg0KDQojIyMgQmnhur9uIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgYmnhur9uIE5BTUVfSU5DT01FX1RZUEUyDQoNCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShOQU1FX0NPTlRSQUNUX1RZUEUxLCBOQU1FX0lOQ09NRV9UWVBFMikpDQpgYGANCkdp4bqjIHRodXnhur90Og0KDQoqICRIXzA6JCBOQU1FX0NPTlRSQUNUX1RZUEUgdsOgIE5BTUVfSU5DT01FX1RZUEUyIMSR4buZYyBs4bqtcCANCg0KKiAkSF8xOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBOQU1FX0lOQ09NRV9UWVBFMiBraMO0bmcgxJHhu5ljIGzhuq1wDQoNClThuqFpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhPTAuMDUkDQoNClRhIGPDsyBwX3ZhbHVlID0gMC4wMDAzNDg1IDwgJFxhbHBoYSwkIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgTkFNRV9JTkNPTUVfVFlQRTIga2jDtG5nIMSR4buZYyBs4bqtcCBuaGF1Lg0KDQojIyMgQmnhur9uIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgYmnhur9uIE5BTUVfVFlQRV9TVUlURTMNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKE5BTUVfQ09OVFJBQ1RfVFlQRTEsIE5BTUVfVFlQRV9TVUlURTMpKQ0KYGBgDQpHaeG6oyB0aHV54bq/dDoNCg0KKiAkSF8wOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBOQU1FX1RZUEVfU1VJVEUzIMSR4buZYyBs4bqtcCANCg0KKiAkSF8xOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBOQU1FX1RZUEVfU1VJVEUzIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KVOG6oWkgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQNCg0KVGEgY8OzIHBfdmFsdWUgPSAwLjYwOTggPiAkXGFscGhhLCQgY2jhuqVwIG5o4bqtbiBnaeG6oyB0aHV54bq/dCAkSF8wJA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgTkFNRV9UWVBFX1NVSVRFMyDEkeG7mWMgbOG6rXAgbmhhdS4NCg0KIyMjIEJp4bq/biBOQU1FX0NPTlRSQUNUX1RZUEUgdsOgIGJp4bq/biBOQU1FX0hPVVNJTkdfVFlQRTMNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKE5BTUVfQ09OVFJBQ1RfVFlQRTEsIE5BTUVfSE9VU0lOR19UWVBFMykpDQpgYGANCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiogJEhfMDokIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgTkFNRV9IT1VTSU5HX1RZUEUzIMSR4buZYyBs4bqtcCANCg0KKiAkSF8xOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBOQU1FX0hPVVNJTkdfVFlQRTMga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JA0KDQpUYSBjw7MgcF92YWx1ZSA9IDAuNjA5NyA+ICRcYWxwaGEsJCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90ICRIXzAkDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBOQU1FX0hPVVNJTkdfVFlQRTMgxJHhu5ljIGzhuq1wIG5oYXUuDQoNCiMjIyBCaeG6v24gTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBiaeG6v24gTkFNRV9FRFVDQVRJT05fVFlQRTMNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKE5BTUVfQ09OVFJBQ1RfVFlQRTEsIE5BTUVfRURVQ0FUSU9OX1RZUEUzKSkNCmBgYA0KDQpHaeG6oyB0aHV54bq/dDoNCg0KKiAkSF8wOiQgTkFNRV9DT05UUkFDVF9UWVBFIHbDoCBOQU1FX0VEVUNBVElPTl9UWVBFMyDEkeG7mWMgbOG6rXAgDQoNCiogJEhfMTokIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgTkFNRV9FRFVDQVRJT05fVFlQRTMga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JA0KDQpUYSBjw7MgcF92YWx1ZSA9IDAuMDAzMjIxIDwgJFxhbHBoYSwkIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJA0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIE5BTUVfQ09OVFJBQ1RfVFlQRSB2w6AgTkFNRV9FRFVDQVRJT05fVFlQRTMga2jDtG5nIMSR4buZYyBs4bqtcCBuaGF1Lg0KDQojIyBLaG/huqNuZyDGsOG7m2MgbMaw4bujbmcgdOG7tyBs4buHDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgdOG7iSBs4buHIGjDrG5oIHRo4bupYyB2YXkgduG7kW4gY+G7p2Ega2jDoWNoIGjDoG5nDQoNCirGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBu4buvIHZheSB0w61uIGThu6VuZyDEkeG7k25nIHRo4budaSBraeG7g20gxJHhu4tuaCB04bu3IGzhu4cgdmF5IHTDrW4gZOG7pW5nIGPhu6dhIGtow6FjaCBow6BuZyBu4buvIGPDsyBwaOG6o2kgbMOgIDM1JSBoYXkga2jDtG5nPyoNCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCiogJEhfMDogcD0wLjM1JCANCg0KYGBge3J9DQpuIDwtIGRhdGFbZGF0YSRDT0RFX0dFTkRFUiA9PSAnRicsXQ0KcHJvcC50ZXN0KGxlbmd0aChuJENPREVfR0VOREVSKSxsZW5ndGgoZGF0YSRDT0RFX0dFTkRFUikscD0gMC4zNSkNCmBgYA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYT0wLjA1JA0KDQpUYSBjw7MgcF92YWx1ZSA9IDIuMmUtMTYgPCAkXGFscGhhLCQgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgdOG7tyBs4buHIGtow6FjaCBow6BuZyBu4buvIHZheSB0w61uIGThu6VuZyBraMO0bmcgYuG6sW5nIDM1JS4NCg0KS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbuG7ryB2YXkgdMOtbiBk4bulbmcgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlIGzDoCAoMCw2NDk0OTg1OyAwLDY2ODE3ODgpDQoNCirGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBuYW0gdmF5IHTDrW4gZOG7pW5nIMSR4buTbmcgdGjhu51pIGtp4buDbSDEkeG7i25oIHThu7cgbOG7hyB2YXkgdMOtbiBk4bulbmcgY+G7p2Ega2jDoWNoIGjDoG5nIG5hbSBjw7MgcGjhuqNpIGzDoCAzNSUgaGF5IGtow7RuZz8qDQoNCkdp4bqjIHRodXnhur90Og0KDQoqICRIXzA6IHA9MC4zNSQgDQoNCmBgYHtyfQ0KbSA8LSBkYXRhW2RhdGEkQ09ERV9HRU5ERVIgPT0gJ00nLF0NCnByb3AudGVzdChsZW5ndGgobSRDT0RFX0dFTkRFUiksbGVuZ3RoKGRhdGEkQ09ERV9HRU5ERVIpLHA9IDAuMzUpDQpgYGANCg0KVOG6oWkgbeG7qWMgw70gbmdoxKlhICRcYWxwaGE9MC4wNSQNCg0KVGEgY8OzIHBfdmFsdWUgPSAwLjA2MzUzID4gJFxhbHBoYSwkIGNo4bqlcCBuaOG6rW4gZ2nhuqMgdGh1eeG6v3QgJEhfMCQNCg0KVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIG5hbSB2YXkgdMOtbiBk4bulbmcgYuG6sW5nIDM1JS4NCg0KS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgbmFtIHZheSB0w61uIGThu6VuZyB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgbMOgICgwLDMzMTgyMTI7IDAsMzUwNTAxNSkNCg0KDQojIyBDaOG6oXkgbcO0IGjDrG5oIGjhu5NpIHF1eSANCg0KIyMgTcO0IGjDrG5oIGxvZ2l0DQoNCmBgYHtyfQ0KbWgxIDwtIGdsbShOQU1FX0NPTlRSQUNUX1RZUEUxIH4gQ09ERV9HRU5ERVIgKyBOQU1FX0lOQ09NRV9UWVBFMiArIE5BTUVfRURVQ0FUSU9OX1RZUEUzICsgQU1UX0FOTlVJVFkxICsgQU1UX0NSRURJVDEsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGRhdGEpDQpzdW1tYXJ5KG1oMSkNCmBgYA0KDQpNw7QgaMOsbmg6DQoNCiRMb2dpdChccGkpPWxvZyhcZnJhY3tccGl9ezEtXHBpfSk9IC0gMC4xNDA3MiArIDAuMDk5NThDT0RFR0VOREVSIC0gMC4yMjQwNU5BTUVJTkNPTUVUWVBFMiAtIDAuMTk5NDNOQU1FRURVQ0FUSU9OVFlQRTMgLSAwLjIyMDk4QU1UQU5OVUlUWSAtIDAuNDExOTBBTVRDUkVESVQkDQoNCiMjIE3DtCBow6xuaCBwcm9iaXQNCg0KYGBge3J9DQptaDIgPC0gZ2xtKE5BTUVfQ09OVFJBQ1RfVFlQRTEgfiBDT0RFX0dFTkRFUiArIE5BTUVfSU5DT01FX1RZUEUyICsgTkFNRV9FRFVDQVRJT05fVFlQRTMgKyBBTVRfQU5OVUlUWTEgKyBBTVRfQ1JFRElUMSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdwcm9iaXQnKSwgZGF0YSA9IGRhdGEpDQpzdW1tYXJ5KG1oMikNCmBgYA0KDQpNw7QgaMOsbmg6DQoNCiRQcm9iaXQoXHBpKT1cUGhpLTEoXHBpKT0gLSAwLjA5MDc3ICsgMC4wNjE1NyBDT0RFR0VOREVSIC0gMC4xMzU1MCBOQU1FSU5DT01FVFlQRTIgLSAwLjEyMjEyIE5BTUVFRFVDQVRJT05UWVBFMyAtIDAuMTMzMzMgQU1UQU5OVUlUWSAtIDAuMjU0MjQgQU1UQ1JFRElUJA0KDQojIyBNw7QgaMOsbmggY2xvZ2xvZw0KDQpgYGB7cn0NCm1oMyA8LSBnbG0oTkFNRV9DT05UUkFDVF9UWVBFMSB+IENPREVfR0VOREVSICsgTkFNRV9JTkNPTUVfVFlQRTIgKyBOQU1FX0VEVUNBVElPTl9UWVBFMyArIEFNVF9BTk5VSVRZMSArIEFNVF9DUkVESVQxLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2Nsb2dsb2cnKSwgZGF0YSA9IGRhdGEpDQpzdW1tYXJ5KG1oMykNCmBgYA0KDQpNw7QgaMOsbmg6DQoNCiRDbG9nbG9nKFxwaSk9bG9nKC1sb2coezEtXHBpfSkpPSAtIDAuNDYwOTUgKyAwLjA3NzI0IENPREVHRU5ERVIgLSAwLjE4NTUyIE5BTUVJTkNPTUVUWVBFMiAtIDAuMTYwMDEgTkFNRUVEVUNBVElPTlRZUEUzIC0gMC4xODUxNiBBTVRBTk5VSVRZIC0gMC4zMjc3MyBBTVRDUkVESVQkDQoNCiMjIEzhu7FhIGNo4buNbiBtw7QgaMOsbmggcGjDuSBo4bujcA0KDQojIyMgQ2jhu4kgc+G7kSBBSUMgKEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24pDQoNCmBgYHtyfQ0KQUlDKG1oMSkNCkFJQyhtaDIpDQpBSUMobWgzKQ0KQUlDICA8LSBjKDEyNzczLjExLCAxMjc3My4zNCwgMTI3NzIuNzkpDQpgYGANCg0KVGjDtG5nIHF1YSBjaOG7iSBz4buRIEFJQyBj4bunYSAzIG3DtCBow6xuaCB0csOqbiB0YSB0aOG6pXkgbcO0IGjDrG5oIGNsb2dsb2cgY8OzIGNo4buJIHPhu5EgQUlDIHRo4bqlcCBuaOG6pXQgKDEyNzcyLjc5KS4gVsOsIHRo4bq/IMSR4buRaSB24bubaSB0acOqdSBjaMOtIMSRw6FuaCBnacOhIEFJQyB0aMOsIG3DtCBow6xuaCBjbG9nbG9nIGzDoCBwaMO5IGjhu6NwIMSR4buDIHhlbSB4w6l0IHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDEkeG6v24gYmnhur9uIHBo4bulIHRodeG7mWMgTkFNRV9DT05UUkFDVF9UWVBFIGjGoW4gbcO0IGjDrG5oIHByb2JpdCB2w6AgbG9naXQuDQoNCiMjIyBEZXZpYW5jZQ0KDQpgYGB7cn0NCmRldmlhbmNlKG1oMSkNCmRldmlhbmNlKG1oMikNCmRldmlhbmNlKG1oMykNCkRldmlhbmNlIDwtIGMoIDEyNzYxLjExLCAxMjc2MS4zNCwgMTI3NjAuNzkpDQpgYGANCg0KVGjDtG5nIHF1YSBjaOG7iSBz4buRIGRldmlhbmNlIGPhu6dhIDMgbcO0IGjDrG5oIHRyw6puIHRhIHRo4bqleSBtw7QgaMOsbmggY2xvZ2xvZyBjw7MgY2jhu4kgc+G7kSBkZXZpYW5jZSB0aOG6pXAgbmjhuqV0ICgxMjc2MC43OSkuIFbDrCB0aOG6vyDEkeG7kWkgduG7m2kgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBkZXZpZW5jZSB0aMOsIG3DtCBow6xuaCBjbG9nbG9nIGzDoCBwaMO5IGjhu6NwIMSR4buDIHhlbSB4w6l0IHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDEkeG6v24gYmnhur9uIHBo4bulIHRodeG7mWMgTkFNRV9DT05UUkFDVF9UWVBFIGjGoW4gbcO0IGjDrG5oIGxvZ2l0IHbDoCBwcm9iaXQuDQoNCiMjIyBCcmllciBTY29yZQ0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoIkRlc2NUb29scyIpDQpsaWJyYXJ5KERlc2NUb29scykNCkJyaWVyU2NvcmUobWgxKQ0KQnJpZXJTY29yZShtaDIpDQpCcmllclNjb3JlKG1oMykNCkJyaWVyc2NvcmUgPC0gYygwLjIyMzIwNzQsMC4yMjMyMTIzLDAuMjIzMjAwNCkNCmBgYA0KDQpUaMO0bmcgcXVhIGNo4buJIHPhu5EgQnJpZXJTY29yZSBj4bunYSAzIG3DtCBow6xuaCB0csOqbiB0YSB0aOG6pXkgbcO0IGjDrG5oIGNsb2dsb2cgY8OzIGNo4buJIHPhu5EgQnJpZXJTY29yZSB0aOG6pXAgbmjhuqV0ICgwLjIyMzIwMDQpLiBWw6wgdGjhur8gxJHhu5FpIHbhu5tpIHRpw6p1IGNow60gxJHDoW5oIGdpw6EgQnJpZXJTY29yZSB0aMOsIG3DtCBow6xuaCBjbG9nbG9nIGzDoCBwaMO5IGjhu6NwIMSR4buDIHhlbSB4w6l0IHPhu7EgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDEkeG6v24gYmnhur9uIHBo4bulIHRodeG7mWMgTkFNRV9DT05UUkFDVF9UWVBFIGjGoW4gbcO0IGjDrG5oIGxvZ2l0IHbDoCBwcm9iaXQuDQoNCiMjIyBM4buxYSBjaOG7jW4gbcO0IGjDrG5oIA0KDQpgYGB7cn0NCkFJQyAgPC0gYygxMjc3My4xMSwgMTI3NzMuMzQsIDEyNzcyLjc5KQ0KRGV2aWFuY2UgPC0gYyggMTI3NjEuMTEsIDEyNzYxLjM0LCAxMjc2MC43OSkNCkJyaWVyc2NvcmUgPC0gYygwLjIyMzIwNzQsMC4yMjMyMTIzLDAuMjIzMjAwNCkNCk1IIDwtIGMoJ2xvZ2l0JywncHJvYml0JywnY2xvZ2xvZycpDQpLZXRRdWEgPC0gZGF0YS5mcmFtZShNSCwgRGV2aWFuY2UsIEJyaWVyc2NvcmUsIEFJQykNCktldFF1YQ0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgY8OhYyBjaOG7iSBz4buRIMSRw6FuaCBnacOhIG3DtCBow6xuaCB0YSBjw7Mga+G6v3QgbHXhuq1uOiBjaOG7iSBz4buRIEFJQyA9IDEyNzcyLjc5OyBEZXZpYW5jZSA9IDEyNzYwLjc5OyBjaOG7iSBz4buRIEJyaWVyID0gMC4yMjMyMDA0IGPhu6dhIG3DtCBow6xuaCBjbG9nbG9nIGzDoCBuaOG7jyBuaOG6pXQgdHJvbmcgYmEgbcO0IGjDrG5oLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB0cm9uZyBiYSBtw7QgaMOsbmggaOG7k2kgcXV5IGxvZ2lzdGljIHRyw6puLCBtw7QgaMOsbmggY2xvZ2xvZyBsw6AgdOG7kWkgxrB1IG5o4bqldC4NCg0KIyBDaMawxqFuZyA1LiBL4bq/dCBsdeG6rW4gdsOgIGtodXnhur9uIG5naOG7iw0KDQojIyBL4bq/dCBsdeG6rW4NCg0KU2F1IGtoaSB0aOG7sWMgaGnhu4duIGjhu5NpIHF1eSB2w6AgbOG7sWEgY2jhu41uIG3DtCBow6xuaCBwaMO5IGjhu6NwIG5o4bqldCB0cm9uZyAzIG3DtCBow6xuaCAobG9naXQsIHByb2JpdCwgY2xvZ2xvZyksIGvhur90IHF14bqjIGNobyB0aOG6pXkgY2xvZ2xvZyBsw6AgbcO0IGjDrG5oIHBow7kgaOG7o3AgdsOgIHThu5FpIMawdSBuaOG6pXQgxJHhu4MgcGjDom4gdMOtY2ggIkPDoWMgeeG6v3UgdOG7kSB0w6FjIMSR4buZbmcgxJHhur9uIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcuIg0KDQpL4bq/dCBxdeG6oyBtw7QgaMOsbmggaOG7k2kgcXV5IGNsb2dsb2cgY2hvIHRo4bqleSBjw6FjIGJp4bq/biBzYXUgxJHhu4F1IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6o6DQoNCiogQ09ERV9HRU5ERVIgDQoNCiogTkFNRV9JTkNPTUVfVFlQRTINCg0KKiBOQU1FX0VEVUNBVElPTl9UWVBFMw0KDQoqIEFNVF9BTk5VSVRZMQ0KDQoqIEFNVF9DUkVESVQxDQoNCipHaeG7m2kgdMOtbmgqIGPDsyB0aOG7gyB04bqhbyByYSBt4buZdCBz4buxIHBow6JuIGNoaWEgdHJvbmcgcXXDoSB0csOsbmggeMOhYyDEkeG7i25oIGto4bqjIG7Eg25nIHRy4bqjIG7hu6MuDQoNCipMb+G6oWkgdGh1IG5o4bqtcCBj4bunYSBraMOhY2ggaMOgbmcqIGPDsyB0aOG7gyBwaOG6o24gw6FuaCBraOG6oyBuxINuZyB0cuG6oyBu4bujIHbDoCDhu5VuIMSR4buLbmggdMOgaSBjaMOtbmguIE5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIOG7lW4gxJHhu4tuaCBuaMawIGzGsMahbmcgY+G7kSDEkeG7i25oIGPDsyB0aOG7gyBk4buFIGTDoG5nIGjGoW4gdHJvbmcgdmnhu4djIHRy4bqjIG7hu6MgaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIGtow7RuZyDEkeG7i25oIGvhu7MsIG5oxrAgbmfGsOG7nWkgbMOgbSBjw7RuZyB2aeG7h2MgdOG7sSBkby4gDQoNCipUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4qIGPDsyB0aOG7gyBsacOqbiBxdWFuIMSR4bq/biBoaeG7g3UgYmnhur90IHbhu4EgdMOgaSBjaMOtbmggdsOgIGto4bqjIG7Eg25nIHF14bqjbiBsw70gdGnhu4FuIGLhuqFjLiBOZ8aw4budaSBjw7MgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGNhbyBjw7MgdGjhu4MgY8OzIGtp4bq/biB0aOG7qWMgdOG7kXQgaMahbiB24buBIGPDoWNoIHF14bqjbiBsw70gdMOgaSBjaMOtbmggY8OhIG5ow6JuIHbDoCBjw6JuIG5o4bqvYyBr4bu5IGjGoW4ga2hpIHZheSB0w61uIGThu6VuZy4NCg0KKlPhu5EgdGnhu4FuIHRy4bqjIGjDoG5nIHRow6FuZyBzbyB24bubaSB0aHUgbmjhuq1wIGjDoG5nIHRow6FuZyog4bqjbmggaMaw4bufbmcgdHLhu7FjIHRp4bq/cCDEkeG6v24ga2jhuqMgbsSDbmcgdHLhuqMgbuG7oyBj4bunYSBraMOhY2ggaMOgbmcuIE7hur91IHPhu5EgdGnhu4FuIHRy4bqjIGjDoG5nIHRow6FuZyBxdcOhIGzhu5tuIHNvIHbhu5tpIHRodSBuaOG6rXAsIGto4bqjIG7Eg25nIHZheSB0w61uIGThu6VuZyBjw7MgdGjhu4MgYuG7iyBo4bqhbiBjaOG6vyBob+G6t2MgdOG6oW8gcmEgw6FwIGzhu7FjIHTDoGkgY2jDrW5oIGzhu5tuIGNobyBraMOhY2ggaMOgbmcuDQoNCipI4bqhbiBt4bupYyB2YXkqIGxpw6puIHF1YW4gxJHhur9uIG3hu6ljIMSR4buZIHLhu6dpIHJvIGPhu6dhIGtob+G6o24gdmF5LiBN4bupYyBz4buRIHRp4buBbiB2YXkgbOG7m24gaMahbiBjw7MgdGjhu4MgxJHDsmkgaOG7j2kga2jDoWNoIGjDoG5nIGPDsyB0aHUgbmjhuq1wIHbDoCBraOG6oyBuxINuZyB0w6BpIGNow61uaCBjYW8gaMahbiDEkeG7gyDEkeG6o20gYuG6o28gdHLhuqMgbuG7oyDEkcO6bmcgaOG6oW4uDQoNCiMjIEtodXnhur9uIG5naOG7iw0KDQpE4buxYSB0csOqbiBjw6FjIGJp4bq/biDEkeG7mWMgbOG6rXAgdsOgIHTDrG5oIGjDrG5oIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcsIGTGsOG7m2kgxJHDonkgbMOgIG3hu5l0IHPhu5Ega2h1eeG6v24gbmdo4buLIMSR4buDIGPDom4gbmjhuq9jIHRyb25nIHF1w6EgdHLDrG5oIMSRw6FuaCBnacOhIGto4bqjIG7Eg25nIHZheSB0w61uIGThu6VuZzoNCg0KKiBIw6N5IHhlbSB4w6l0IHRvw6BuIGLhu5kgdMOsbmggaMOsbmggdMOgaSBjaMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nLCBiYW8gZ+G7k20gdGh1IG5o4bqtcCwgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLCBs4buLY2ggc+G7rSB0w61uIGThu6VuZywgdMOsbmggaMOsbmggY8O0bmcgdmnhu4djLCB2w6AgdMOsbmggaMOsbmggZ2lhIMSRw6xuaC4gxJBp4buBdSBuw6B5IHPhur0gZ2nDunAgYuG6oW4gY8OzIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBraOG6oyBuxINuZyB0w6BpIGNow61uaCB2w6AgdHLDoWNoIG5oaeG7h20gY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQoqIFRoaeG6v3QgbOG6rXAgbeG7mXQgbmfGsOG7oW5nIGhv4bq3YyB04bu3IGzhu4cgdGh1IG5o4bqtcCBzbyB24bubaSBz4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmcgxJHhu4MgxJHhuqNtIGLhuqNvIHLhurFuZyBraMOhY2ggaMOgbmcgY8OzIGto4bqjIG7Eg25nIHRy4bqjIG7hu6MgbeG7mXQgY8OhY2ggZOG7hSBkw6BuZyB2w6Aga2jDtG5nIHThuqFvIMOhcCBs4buxYyB0w6BpIGNow61uaC4NCg0KKiDEkOG7kWkgduG7m2kgbmjhu69uZyBraMOhY2ggaMOgbmcgY8OzIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiB0aOG6pXAgaG/hurdjIHRoaeG6v3Uga2nhur9uIHRo4bupYyB24buBIHTDoGkgY2jDrW5oLCBow6N5IGPDom4gbmjhuq9jIGN1bmcgY+G6pXAgY2jGsMahbmcgdHLDrG5oIMSRw6BvIHThuqFvIGhv4bq3YyB0xrAgduG6pW4gdMOgaSBjaMOtbmggxJHhu4MgZ2nDunAgaOG7jSBoaeG7g3UgcsO1IGjGoW4gduG7gSBxdeG6o24gbMO9IHRp4buBbiBi4bqhYyB2w6AgdHLDoWNoIG5oaeG7h20gdHJvbmcgdmnhu4djIHRy4bqjIG7hu6MuDQoNCiogWGVtIHjDqXQgbeG7qWMgcuG7p2kgcm8gbGnDqm4gcXVhbiDEkeG6v24gc+G7kSB0aeG7gW4gdmF5IHNvIHbhu5tpIGzhu6NpIMOtY2ggbcOgIGtow6FjaCBow6BuZyBjw7MgdGjhu4MgxJHhuqF0IMSRxrDhu6NjIHThu6sgdmnhu4djIHZheS4gxJDhuqNtIGLhuqNvIHLhurFuZyBraG/huqNuIHZheSBsw6AgaOG7o3AgbMO9IHbDoCBjw7Mga2jhuqMgbsSDbmcgdOG6oW8gcmEgZ2nDoSB0cuG7iyB0aOG7sWMgc+G7sSBjaG8ga2jDoWNoIGjDoG5nLg0KDQoqIFPhu60gZOG7pW5nIGPDtG5nIG5naOG7hyB2w6AgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4MgeMOhYyDEkeG7i25oIHh1IGjGsOG7m25nIHThu6sgbOG7i2NoIHPhu60gdMOtbiBk4bulbmcgdsOgIGjDoG5oIHZpIHZheSB0w61uIGThu6VuZyBj4bunYSBraMOhY2ggaMOgbmcuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgZ2nDunAgZOG7sSDEkW/DoW4ga2jhuqMgbsSDbmcgdHLhuqMgbuG7oyB2w6AgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIG3hu5l0IGPDoWNoIGNow61uaCB4w6FjIGjGoW4uDQoNCiogTeG7l2kgbmh1IGPhuqd1IHbDoCB24buLIHRo4bq/IGPhu6dhIGtow6FjaCBow6BuZyBsw6Aga2jDoWMgbmhhdSwgaMOjeSB4ZW0geMOpdCB0w7l5IGNo4buJbmggcXV54bq/dCDEkeG7i25oIHZheSB0w61uIGThu6VuZyBk4buxYSB0csOqbiB04burbmcgdMOsbmggaHXhu5FuZyBj4bulIHRo4buDLiDEkOG7q25nIGThu7FhIHF1w6Egbmhp4buBdSB2w6BvIG3hu5l0IGJp4bq/biBj4bulIHRo4buDIG3DoCBow6N5IHhlbSB4w6l0IG3hu5FpIHTGsMahbmcgcXVhbiBnaeG7r2Egbmhp4buBdSB54bq/dSB04buRLg0KDQpUw7NtIGzhuqFpLCBxdXnhur90IMSR4buLbmggdmF5IHTDrW4gZOG7pW5nIGPhuqduIHBo4bqjaSBk4buxYSB0csOqbiBz4buxIGPDom4gbmjhuq9jIGvhu7kgbMaw4buhbmcgdsOgIHPhu60gZOG7pW5nIG5oaeG7gXUgdGjDtG5nIHRpbiBraMOhYyBuaGF1IMSR4buDIMSR4bqjbSBi4bqjbyB0w61uaCBjw7RuZyBi4bqxbmcgdsOgIMSRw6FuZyB0aW4gY+G6rXkgdHJvbmcgcXXDoSB0csOsbmggeMOpdCBkdXnhu4d0Lg0KDQojIFTDoGkgbGnhu4d1IHRoYW0ga2jhuqNvDQoNClsxXS4gVMOgaSwgVi4gVi4sIFRoxrDhu51uZywgTi4gUS4sICYgRMOibiwgTi4gVC4gSC4gKDIwMTcpLiDEkMOhbmggZ2nDoSBraOG6oyBuxINuZyB0cuG6oyBu4bujIHZheSBj4bunYSBraMOhY2ggaMOgbmcgYuG6sW5nIGPDoWMgcGjGsMahbmcgcGjDoXAgcGjDom4gbG/huqFpLiBU4bqhcCBjaMOtIEtob2EgaOG7jWMgxJDhuqFpIGjhu41jIGPhuqduIFRoxqEsICg0OSksIDExMC0xMTcuDQoNClsyXS4gSHXhu7NuaCwgTi4gQS4gSC4sICYgVHLhuqduLCBULiBOLiAoMjAyMSkuIEPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gaMOgbmggdmkgdmF5IHTDrW4gZOG7pW5nIHRpw6p1IGTDuW5nOiBuZ2hpw6puIGPhu6l1IHRo4buxYyBuZ2hp4buHbSB04bqhaSB0aMOgbmggcGjhu5EgSOG7kyBDaMOtIE1pbmguDQoNClszXS4gUXXhu5FjIGjhu5lpICgyMDEwKS4gTHXhuq10IHPhu5EgNDcvMjAxMC9RSDEyOiBMdeG6rXQgY8OhYyB04buVIGNo4bupYyB0w61uIGThu6VuZy4gSMOgIE7hu5lpLCBWaeG7h3QgTmFtLg0KDQpbNF0uIFRy4bqnbiBLaW0gVGhhbmgsIFRy4bqnbiBN4bqhbmggVMaw4budbmcsIFbFqSBBbmggTGluaCBEdXk6IOKAnEdpw6FvIHRyw6xuaCBQaMOibiB0w61jaCBk4buvIGxp4buHdSDEkeG7i25oIHTDrW5o4oCdLCB0csaw4budbmcgxJDhuqFpIGjhu41jIFTDoGkgY2jDrW5oIOKAkyBNYXJrZXRpbmcsIFRow6BuaCBwaOG7kSBI4buTIENow60gTWluaC4NCg==