From b0322f30506fd7131852dfb2ac66500a8ad86fd5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=97=AA=E6=98=9F2?= <2287190283@qq.com>
Date: Fri, 6 Mar 2020 01:12:29 +0800
Subject: [PATCH] =?UTF-8?q?1.=E8=BD=AF=E4=BB=B6=E5=90=AF=E5=8A=A8=E6=97=B6?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BD=91=E7=BB=9C=E8=BF=9E=E6=8E=A5=E7=8A=B6?=
=?UTF-8?q?=E6=80=81=E6=A3=80=E6=9F=A5=EF=BC=9B=202.=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95=E6=96=B9=E5=BC=8F=EF=BC=9B?=
=?UTF-8?q?=203.=E5=B7=B2=E7=9F=A5bug=EF=BC=8CRelease=E6=A8=A1=E5=BC=8F?=
=?UTF-8?q?=E6=9C=89=E6=97=B6=E6=97=A0=E6=B3=95=E5=AE=8C=E5=85=A8=E9=80=80?=
=?UTF-8?q?=E5=87=BA=E8=BD=AF=E4=BB=B6=EF=BC=88=E7=8A=B6=E6=80=81=E6=A0=8F?=
=?UTF-8?q?=E4=B8=8D=E5=8F=AF=E8=A7=81=EF=BC=8C=E4=BB=BB=E5=8A=A1=E7=AE=A1?=
=?UTF-8?q?=E7=90=86=E5=99=A8=E5=8F=AF=E8=A7=81=EF=BC=89=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
source/Class/ApplicationEvents.vb | 9 -
source/Class/BilibiliApi.vb | 60 +-
source/Class/DanmuEntry/DanmuEntry.vb | 7 +-
source/Class/Entity/LoginUrlEntity.vb | 41 +
source/Class/Tcp/TcpListener.vb | 62 +-
source/Form/FrmMain.vb | 7 +-
source/Form/Login/FrmLoginFromBrowser.vb | 6 -
source/Form/Login/FrmLoginFromCookies.vb | 20 +-
.../Form/Login/FrmLoginFromQRCode.Designer.vb | 89 ++
source/Form/Login/FrmLoginFromQRCode.resx | 1015 +++++++++++++++++
source/Form/Login/FrmLoginFromQRCode.vb | 368 ++++++
source/Form/Login/FrmQuickLogin.Designer.vb | 29 +-
source/Form/Login/FrmQuickLogin.vb | 4 +-
source/Form/Login/LoginManager.vb | 51 +-
source/packages.config | 2 +
"source/\345\247\254\345\250\230.vbproj" | 24 +-
16 files changed, 1692 insertions(+), 102 deletions(-)
create mode 100644 source/Class/Entity/LoginUrlEntity.vb
create mode 100644 source/Form/Login/FrmLoginFromQRCode.Designer.vb
create mode 100644 source/Form/Login/FrmLoginFromQRCode.resx
create mode 100644 source/Form/Login/FrmLoginFromQRCode.vb
diff --git a/source/Class/ApplicationEvents.vb b/source/Class/ApplicationEvents.vb
index 4b91d4c..2acc253 100644
--- a/source/Class/ApplicationEvents.vb
+++ b/source/Class/ApplicationEvents.vb
@@ -23,14 +23,5 @@ Namespace My
Logger.WriteLine(e.Exception)
MessageBox.Show("程序遇到未处理异常,请关闭程序后重启程序", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End Sub
-
- Private Sub MyApplication_Startup(sender As Object, e As StartupEventArgs) Handles Me.Startup
-#If Not DEBUG Then
- ' 检测到被附加到其他进程(比如od?)调试时,强制退出
- If Win32API.IsDebuggerPresent Then
- Environment.Exit(0)
- End If
-#End If
- End Sub
End Class
End Namespace
diff --git a/source/Class/BilibiliApi.vb b/source/Class/BilibiliApi.vb
index d1573bc..7919947 100644
--- a/source/Class/BilibiliApi.vb
+++ b/source/Class/BilibiliApi.vb
@@ -586,23 +586,34 @@ Public NotInheritable Class BilibiliApi
Return Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """code"":0", 3)
End Function
- '''
- ''' 获取当前登录用户信息
- '''
- '''
- Public Shared Async Function GetCurrentUserAsync() As Task(Of HttpResponse)
+ '''
+ ''' 获取当前登录用户信息
+ '''
+ '''
+ Public Shared Async Function GetCurrentUserInfoAsync() As Task(Of HttpResponse)
Dim url = "https://api.live.bilibili.com/live_user/v1/UserInfo/live_info"
m_HttpHeadersParam("Referer") = "http://link.bilibili.com/p/center/index"
- Return Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """code"":0", 3)
- End Function
+ Return Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """code"":0", 3)
+ End Function
- '''
- ''' 获取真正的直播间Id
- '''
- ''' 直播间短Id
- '''
- Public Shared Async Function GetRoomRealIdFromNetworkAsync(ByVal shortRoomId As String) As Task(Of (Success As Boolean, RoomShortId As Integer, RoomRealId As Integer))
+ '''
+ ''' 获取当前登录用户资产信息
+ '''
+ '''
+ Public Shared Async Function GetCurrentUserNavAsync() As Task(Of HttpResponse)
+ Dim url = "https://api.bilibili.com/x/web-interface/nav"
+ m_HttpHeadersParam("Referer") = "https://www.bilibili.com/"
+
+ Return Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """isLogin"":true", 3)
+ End Function
+
+ '''
+ ''' 获取真正的直播间Id
+ '''
+ ''' 直播间短Id
+ '''
+ Public Shared Async Function GetRoomRealIdFromNetworkAsync(ByVal shortRoomId As String) As Task(Of (Success As Boolean, RoomShortId As Integer, RoomRealId As Integer))
Dim funcRst As Boolean
Dim shortId As Integer
Dim realId As Integer
@@ -739,7 +750,7 @@ Public NotInheritable Class BilibiliApi
'''
'''
'''
- Public Shared Async Function GetUserInfoAsync(ByVal userId As String) As Task(Of HttpResponse)
+ Public Shared Async Function GetMemberInfoAsync(ByVal userId As String) As Task(Of HttpResponse)
Dim url = "https://space.bilibili.com/ajax/member/GetInfo"
Dim postData = $"mid={userId}&csrf={m_User.Token}"
Dim referer = "https://space.bilibili.com/" & userId
@@ -756,5 +767,26 @@ Public NotInheritable Class BilibiliApi
Dim url = $"https://api.live.bilibili.com/fans_medal/v1/fans_medal/get_fans_medal_info?source=1&uid={viewerUid}&target_id={upUid}"
Return Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """code"":0", 3)
End Function
+
+ '''
+ ''' 获取登录Url(暂时是用于生成二维码)
+ '''
+ '''
+ Public Shared Async Function GetLoginUrlAsync() As Task(Of HttpResponse)
+ Dim url = "https://passport.bilibili.com/qrcode/getLoginUrl"
+ Return Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """code"":0", 3)
+ End Function
+
+ '''
+ ''' 获取登录(扫码)结果,data值含义:-2 二维码过期或者已确认授权,登录成功、 -4 未扫码、-5 已扫码未确认、。
+ '''
+ '''
+ '''
+ Public Shared Async Function GetLoginInfoAsync(ByVal oauthKey As String) As Task(Of HttpResponse)
+ Dim url = "https://passport.bilibili.com/qrcode/getLoginInfo"
+ Dim postData = $"oauthKey={oauthKey}&gourl=https://www.bilibili.com/"
+ Dim referer = "https://passport.bilibili.com/login"
+ Return Await DoPostAsync(url, postData, referer)
+ End Function
#End Region
End Class
diff --git a/source/Class/DanmuEntry/DanmuEntry.vb b/source/Class/DanmuEntry/DanmuEntry.vb
index bd358e8..b81d14e 100644
--- a/source/Class/DanmuEntry/DanmuEntry.vb
+++ b/source/Class/DanmuEntry/DanmuEntry.vb
@@ -964,7 +964,7 @@ Public NotInheritable Class DanmuEntry
'''
Private Shared Async Function ConfigureHimesByUserAsync() As Task(Of Boolean)
' 获取当前登录用户信息
- Dim getRst = Await BilibiliApi.GetCurrentUserAsync
+ Dim getRst = Await BilibiliApi.GetCurrentUserInfoAsync
Dim json = getRst.Message
Dim funcRst = getRst.Success
@@ -1124,12 +1124,11 @@ Public NotInheritable Class DanmuEntry
Return status
End Function
-
Protected Friend Shared Async Function GetFansNickAsync(ByVal userId As String) As Task(Of String)
Dim funcRst = String.Empty
Try
- Dim postRst = Await BilibiliApi.GetUserInfoAsync(userId)
+ Dim postRst = Await BilibiliApi.GetMemberInfoAsync(userId)
If Not postRst.Success Then Exit Try
Dim json = postRst.Message
@@ -1236,7 +1235,7 @@ Public NotInheritable Class DanmuEntry
End Function
Private Shared Async Function InternalGetUserIfnoAsync(ByVal viewerId As String) As Task(Of (Uid As String, Uname As String))
- Dim getRst = Await BilibiliApi.GetUserInfoAsync(viewerId)
+ Dim getRst = Await BilibiliApi.GetMemberInfoAsync(viewerId)
If getRst.Success Then
Try
Dim root = MSJsSerializer.Deserialize(Of UserInfoEntity.Root)(getRst.Message)
diff --git a/source/Class/Entity/LoginUrlEntity.vb b/source/Class/Entity/LoginUrlEntity.vb
new file mode 100644
index 0000000..76ebba9
--- /dev/null
+++ b/source/Class/Entity/LoginUrlEntity.vb
@@ -0,0 +1,41 @@
+Namespace LoginUrlEntity
+ Public Class Data
+
+ '''
+ '''
+ '''
+ '''
+ Public Property url As String
+
+ '''
+ '''
+ '''
+ '''
+ Public Property oauthKey As String
+
+ End Class
+
+
+
+ Public Class Root
+ Inherits APIPostResponseBaseEntity.Root
+ '''
+ '''
+ '''
+ '''
+ Public Property status As String
+
+ '''
+ '''
+ '''
+ '''
+ Public Property ts As Integer
+
+ '''
+ '''
+ '''
+ '''
+ Public Property data As Data
+ End Class
+End Namespace
+
diff --git a/source/Class/Tcp/TcpListener.vb b/source/Class/Tcp/TcpListener.vb
index 52c346d..57dcd25 100644
--- a/source/Class/Tcp/TcpListener.vb
+++ b/source/Class/Tcp/TcpListener.vb
@@ -221,16 +221,29 @@ Public Class TcpListener
m_Initialized = True
End Sub
- Private Sub EnsureInitCancellationToken()
- m_Cts = New CancellationTokenSource
- m_Ct = m_Cts.Token
- End Sub
+ '''
+ ''' 连接到弹幕服务器
+ '''
+ Public Async Function ConnectAsync(ByVal roomId As Integer, ByVal userId As String, ByVal upId As String, Optional ByVal serverHost As String = "broadcastlv.chat.bilibili.com", Optional ByVal serverPort As Integer = 2243) As Task
+ If 0 = roomId Then
+ Throw New ArgumentException(String.Format(My.Resources.ArgumentOutOfRange & " 这个房间不存在" & RandomEmoji.Helpless, NameOf(roomId), ">0"))
+ End If
+ If Not Net2.NetHelper.IsConnectedToInternet() Then
+ Throw New ArgumentException("网络异常")
+ End If
- Private Async Function EnsureNetConnectedAsync() As Task
- While Not Net2.NetHelper.IsConnected()
- If m_Ct.IsCancellationRequested Then Exit While
- Await Task.Delay(6180)
- End While
+ _UserId = userId
+ _UpId = upId
+ _RoomId = roomId
+ _ServerHost = serverHost
+ _ServerPort = serverPort
+
+ Await EnsurePreInitAsync()
+ EnsureInitCancellationToken()
+
+ ' 确保网络可用再连接
+ Await EnsureNetConnectedAsync()
+ Await InternalConnectAsync(Me.RoomId, Me.UserId, Me.ServerHost, Me.ServerPort)
End Function
'''
@@ -254,29 +267,16 @@ Public Class TcpListener
m_Initialized = True
End Function
- '''
- ''' 连接到弹幕服务器
- '''
- Public Async Function ConnectAsync(ByVal roomId As Integer, ByVal userId As String, ByVal upId As String, Optional ByVal serverHost As String = "broadcastlv.chat.bilibili.com", Optional ByVal serverPort As Integer = 2243) As Task
- If 0 = roomId Then
- Throw New ArgumentException(String.Format(My.Resources.ArgumentOutOfRange & " 这个房间不存在" & RandomEmoji.Helpless, NameOf(roomId), ">0"))
- End If
- If Not Net2.NetHelper.IsConnected() Then
- Throw New ArgumentException("网络异常")
- End If
-
- _UserId = userId
- _UpId = upId
- _RoomId = roomId
- _ServerHost = serverHost
- _ServerPort = serverPort
-
- Await EnsurePreInitAsync()
- EnsureInitCancellationToken()
+ Private Sub EnsureInitCancellationToken()
+ m_Cts = New CancellationTokenSource
+ m_Ct = m_Cts.Token
+ End Sub
- ' 确保网络可用再连接
- Await EnsureNetConnectedAsync()
- Await InternalConnectAsync(Me.RoomId, Me.UserId, Me.ServerHost, Me.ServerPort)
+ Private Async Function EnsureNetConnectedAsync() As Task
+ While Not Net2.NetHelper.IsConnectedToInternet()
+ If m_Ct.IsCancellationRequested Then Exit While
+ Await Task.Delay(6180)
+ End While
End Function
'''
diff --git a/source/Form/FrmMain.vb b/source/Form/FrmMain.vb
index fb3b6e4..fe9368b 100644
--- a/source/Form/FrmMain.vb
+++ b/source/Form/FrmMain.vb
@@ -70,7 +70,7 @@ Public Class FrmMain
Private Async Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
#If Not DEBUG Then
- ' 检测到被附加到其他进程(比如od?)调试时,强制退出
+ ' 检测到被附加到其他进程(比如od?vs release调试)调试时,强制退出
If Win32API.IsDebuggerPresent Then
Me.Visible = False
MessageBox.Show(ShanXingTechQ2287190283, "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Stop)
@@ -212,6 +212,11 @@ Public Class FrmMain
'''
Private Async Function TryLoginAsync() As Task
Try
+ If Not Net2.NetHelper.IsConnectedToInternet() Then
+ Windows2.DrawTipsTask(Me, "网络异常 " & RandomEmoji.Helpless, 3000, False, False)
+ Return
+ End If
+
AddHandler DanmuEntry.UserEnsured, AddressOf UserEnsuredTask
AddHandler DanmuEntry.RoomRealIdEnsured, AddressOf RoomRealIdEnsuredTask
diff --git a/source/Form/Login/FrmLoginFromBrowser.vb b/source/Form/Login/FrmLoginFromBrowser.vb
index e514f69..6f8c81a 100644
--- a/source/Form/Login/FrmLoginFromBrowser.vb
+++ b/source/Form/Login/FrmLoginFromBrowser.vb
@@ -9,12 +9,6 @@ Imports ShanXingTech.Net2
'''
Public Class FrmLoginFromBrowser
#Region "属性区"
- Public ReadOnly Property IsLogined() As Boolean?
- Get
- Return m_LoginedCookies?.Count > 0
- End Get
- End Property
-
Private m_LoginedUrl As String
Private m_LoginedCookies As CookieContainer
diff --git a/source/Form/Login/FrmLoginFromCookies.vb b/source/Form/Login/FrmLoginFromCookies.vb
index eed3012..8a404a7 100644
--- a/source/Form/Login/FrmLoginFromCookies.vb
+++ b/source/Form/Login/FrmLoginFromCookies.vb
@@ -1,6 +1,8 @@
-Imports ShanXingTech
+Imports System.Net
+Imports ShanXingTech
Public Class FrmLoginFromCookies
+
#Region "属性区"
Private Const CS_NOCLOSE = &H200
@@ -13,12 +15,6 @@ Public Class FrmLoginFromCookies
End Get
End Property
- Public ReadOnly Property IsLogined() As Boolean?
- Get
- Return m_LoginedCookies?.Count > 0
- End Get
- End Property
-
Private m_LoginedCookies As Net.CookieContainer
Public ReadOnly Property LoginedCookies As Net.CookieContainer
Get
@@ -27,6 +23,16 @@ Public Class FrmLoginFromCookies
End Property
#End Region
+ Sub New()
+
+ ' 此调用是设计器所必需的。
+ InitializeComponent()
+
+ ' 在 InitializeComponent() 调用之后添加任何初始化。
+ Me.TopMost = True
+ Me.StartPosition = FormStartPosition.CenterParent
+ End Sub
+
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Dim domain = txtDomain.Text.Trim
If domain.IsNullOrEmpty Then
diff --git a/source/Form/Login/FrmLoginFromQRCode.Designer.vb b/source/Form/Login/FrmLoginFromQRCode.Designer.vb
new file mode 100644
index 0000000..a1b6666
--- /dev/null
+++ b/source/Form/Login/FrmLoginFromQRCode.Designer.vb
@@ -0,0 +1,89 @@
+
+Partial Class FrmLoginFromQRCode
+ Inherits System.Windows.Forms.Form
+
+ ''Form 重写 Dispose,以清理组件列表。
+ ' _
+ 'Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+ ' Try
+ ' If disposing AndAlso components IsNot Nothing Then
+ ' components.Dispose()
+ ' End If
+ ' Finally
+ ' MyBase.Dispose(disposing)
+ ' End Try
+ 'End Sub
+
+ 'Windows 窗体设计器所必需的
+ Private components As System.ComponentModel.IContainer
+
+ '注意: 以下过程是 Windows 窗体设计器所必需的
+ '可以使用 Windows 窗体设计器修改它。
+ '不要使用代码编辑器修改它。
+
+ Private Sub InitializeComponent()
+ Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(FrmLoginFromQRCode))
+ Me.Button1 = New System.Windows.Forms.Button()
+ Me.Button2 = New System.Windows.Forms.Button()
+ Me.TextBox1 = New System.Windows.Forms.TextBox()
+ Me.Button3 = New System.Windows.Forms.Button()
+ Me.SuspendLayout()
+ '
+ 'Button1
+ '
+ Me.Button1.Location = New System.Drawing.Point(12, 340)
+ Me.Button1.Name = "Button1"
+ Me.Button1.Size = New System.Drawing.Size(75, 23)
+ Me.Button1.TabIndex = 0
+ Me.Button1.Text = "Button1"
+ Me.Button1.UseVisualStyleBackColor = True
+ '
+ 'Button2
+ '
+ Me.Button2.Location = New System.Drawing.Point(93, 340)
+ Me.Button2.Name = "Button2"
+ Me.Button2.Size = New System.Drawing.Size(75, 23)
+ Me.Button2.TabIndex = 1
+ Me.Button2.Text = "Button2"
+ Me.Button2.UseVisualStyleBackColor = True
+ '
+ 'TextBox1
+ '
+ Me.TextBox1.ForeColor = System.Drawing.SystemColors.ControlText
+ Me.TextBox1.Location = New System.Drawing.Point(12, 313)
+ Me.TextBox1.Name = "TextBox1"
+ Me.TextBox1.Size = New System.Drawing.Size(298, 21)
+ Me.TextBox1.TabIndex = 2
+ '
+ 'Button3
+ '
+ Me.Button3.Location = New System.Drawing.Point(174, 340)
+ Me.Button3.Name = "Button3"
+ Me.Button3.Size = New System.Drawing.Size(75, 23)
+ Me.Button3.TabIndex = 3
+ Me.Button3.Text = "Button3"
+ Me.Button3.UseVisualStyleBackColor = True
+ '
+ 'FrmLoginFromQRCode
+ '
+ Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
+ Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
+ Me.ClientSize = New System.Drawing.Size(323, 371)
+ Me.Controls.Add(Me.Button3)
+ Me.Controls.Add(Me.TextBox1)
+ Me.Controls.Add(Me.Button2)
+ Me.Controls.Add(Me.Button1)
+ Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
+ Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
+ Me.Name = "FrmLoginFromQRCode"
+ Me.Text = "扫码登录"
+ Me.ResumeLayout(False)
+ Me.PerformLayout()
+
+ End Sub
+
+ Friend WithEvents Button1 As Button
+ Friend WithEvents Button2 As Button
+ Friend WithEvents TextBox1 As TextBox
+ Friend WithEvents Button3 As Button
+End Class
diff --git a/source/Form/Login/FrmLoginFromQRCode.resx b/source/Form/Login/FrmLoginFromQRCode.resx
new file mode 100644
index 0000000..eb315cf
--- /dev/null
+++ b/source/Form/Login/FrmLoginFromQRCode.resx
@@ -0,0 +1,1015 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAEAgGUAAAEAIAB40AAAFgAAACgAAACAAAAAygAAAAEAIAAAAAAAAMoAAHQSAAB0EgAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxt
+ yABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFJ60wA2nfMAMKP6ADCj
+ +gAwo/oAMKP6ADCj+gAvpvoAJbv9AB3M/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO
+ /wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO
+ /wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyAJcbcgNXG3IHVxtyC9cbchDXG3IUVxt
+ yFpcbchjXG3IZlxtyGJdbMdYVHfQTjad8k4up/tnLqb6cC6m+nAupvpwL6b6cC6o+3AntfxwIcP+bhzN
+ /2gczv9nHM7/ZxzO/2cczv9nHM7/ZxzO/2cczv9nHM7/ZxzO/2cczv9nHM7/ZxzO/2cczv9nHM7/ZxzO
+ /2cczv9nHM7/ZxzO/2cczv9nHM7/ZxzO/2Uczv9cHM7/UhzO/0Uczv8xHM7/HhzO/w0czv8BHM7/ABzO
+ /wAczv8AHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgFXG3IH1xt
+ yEhcbch4XG3Io1xtyMZcbcjdXG3I7VxtyPZcbcj8XG3I/VxtyP9cbcj/XG3I/1R30f08lez7MaL5+jCj
+ +v8wo/r/MKP6/zCj+v8up/r/Jbv9/x7J/v8czf//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //4czv/8HM7/9xzO/+4czv/eHM7/xRzO/6Aczv9yHM7/QRzO/xgczv8CHM7/ABzO/wAczv8AHM7/ABzO
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxt
+ yABcbcgAXG3IAFxtyAdcbcguXG3IblxtyK9cbcjeXG3I+FxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9Xc83/Opjv/y+k+/8wo/r/MKP6/zCj+v8wo/r/L6X6/yO+/f8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv/1HM7/1hzO/54czv9ZHM7/HRzO/wAczv8AHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgAXG3IAFxtyBpcbchfXG3IsVxtyOlcbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XGzH/0iH3/8wo/r/MKP6/zCj
+ +v8wo/r/MKP6/zCi+v8qsPz/Hc3//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//sczv/ZHM7/kRzO
+ /z0czv8HHM7/ABzO/wAczv8AHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgAXG3IAFxt
+ yCRcbch8XG3I01xtyPxcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9bbsn/PZTr/y+k+/8wo/r/MKP6/zCj+v8wo/r/MKP6/yW7/f8cz///HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/8BzO/6wczv9JHM7/CBzO/wAczv8AHM7/ABzO
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAXG3IAFxtyABcbcgAXG3IAFxtyB1cbch8XG3I21xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1pvyv87lu7/L6T7/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/JL39/xzP//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//Qczv+rHM7/PRzO/wIczv8AHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyApcbchgXG3I0Vxt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/0CQ5/8vpPv/MKP6/zCj+v8wo/r/MKP6/zCi+v8muPz/HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv/sHM7/jRzO
+ /x4czv8AHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxt
+ yABcbcgAXG3IAFxtyABcbcgtXG3IqVxtyPlcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9dbMf/T37X/zKh
+ +P8wo/r/MKP6/zCj+v8wo/r/MKP6/y2q+/8fyf7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/zhzO/08czv8CHM7/ABzO/wAczv8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyABcbcgEXG3IW1xtyNtcbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9bbsn/R4jg/zKh+P8wo/r/MKP6/zCj+v8wo/r/MKP6/ymx
+ /P8eyf7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8cz///HM///xzP//8cz///HM///xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7/8RzO/4Qczv8QHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxt
+ yABcbcgAXG3IDlxtyIZcbcj0XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9bbsn/S4Lb/zSe9f8wpPv/MKP6/zCj+v8wo/r/MKP6/yut+/8gxf7/HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8cz///Hc3//yDF/v8kvv3/Jrn9/ya5/f8jv/3/H8f+/xzN//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//hzO/60czv8jHM7/ABzO
+ /wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAwo/oAMKP6ADCj+gAwo/oAMKP6ADCj+gAwo/oAMKP6AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyBlcbcikXG3I/lxtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9dbcj/UHzV/zeb8v8vpPv/MKP6/zCj
+ +v8wo/r/MKL6/y2p+/8iwv7/HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//yHD/v8qsPz/L6b6/zCj+v8wovr/MKP6/zCj
+ +v8up/r/KbL8/yDF/v8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO/8cczv80HM7/ABzO/wAczv8AAAAAAAAAAAAwo/oAMKP6ADCj
+ +gAwo/oAMKP6ADCj+gQwo/oDMKP6ADCj+gAwo/oAMKP6ADCj+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxt
+ yABcbcgeXG3Is1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9bbMf/WWrG/1hpxf9XZ8T/VmbD/1Zm
+ w/9WZsP/V2fE/1hpxf9aasb/UnjS/zia8f8wpPv/MKP6/zCj+v8wo/r/MKP6/y6n+/8iwP3/HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzN
+ //8lu/3/L6b6/zCi+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wovr/Lqj7/yO//f8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ /9Yczv87HM7/ABzO/wAczv8AMKP6ADCj+gAwo/oAMKP6DDCj+kwwo/qQMKP6sDCj+q4wo/qHMKP6QTCj
+ +gYwo/oAMKP6ADCj+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgAXG3IHFxtyLZcbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/WmrG/1Vl
+ w/9QX77/S1m7/0dVuP9EUrb/Q1C0/0JPs/9BTrP/QU6z/0FPs/9CT7T/Q1G1/0VTtv9IVbf/Q2fG/zOW
+ 7v8wpPv/MKP6/zCj+v8wo/r/MKP6/y6n+v8iwf7/HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czf//Jbr9/y+k+v8wo/r/MKP6/zCj+v8wo/r/L6X6/y+l
+ +v8wo/r/MKP6/zCj+v8wo/r/L6b6/yLA/f8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO/9gczv87HM7/ABvP/wAynvkAMKP6ADCj
+ +igwo/quMKP69zCj+v8wo/r/MKP6/zCj+v8wo/ryMKP6mTCj+howo/oAMKP6ADCj+gAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxt
+ yBVcbcivXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9aa8b/U2PB/0tau/9FU7b/QU6z/0BNsv9ATLL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BMsv9ATLH/PGPE/zKa8v8wpPv/MKP6/zCj+v8wo/r/MKP6/y2p
+ +/8gxf7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM3//yW6
+ /f8vpfr/MKP6/zCj+v8wo/r/K637/yS9/f8gxP7/IcT+/yW7/f8sq/v/MKP6/zCj+v8wovr/LKv7/x7J
+ /v8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO/9Uczv8yHM7/ADCj+gAwo/otMKP6yTCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj
+ +v8wo/r/MKP6rzCj+hMwo/oAMKP6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgJXG3ImFxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9YacX/T16+/0ZUt/9BTrP/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATLH/Om3M/zGf9/8wo/r/MKP6/zCj+v8wo/r/MKL6/yys+/8eyf7/HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzN//8luv3/L6X6/zCj+v8wo/r/MKP6/ymz/P8eyv//HM///xzP
+ //8cz///HM///x/I/v8rrvv/MKP6/zCj+v8wo/r/Jbr9/xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO/8Yb0P8gMaH6KzCj
+ +sowo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6ezCj+gAwo/oAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxt
+ yHNcbcj7XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9Zasb/T16+/0RStf9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATrP/N3zZ/zCj+v8wo/r/MKP6/zCj
+ +v8wo/r/MKP6/yi0/P8dzf//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czf//Jbr9/y+l
+ +v8wo/r/MKP6/zCj+v8os/z/Hcv//xzO//8czv//HM7//xzO//8czv//HM///yDF/v8up/r/MKP6/zCi
+ +v8rrvv/Hcz//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//x7K/7svpvrLMKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj
+ +v8wo/r/MKP6/zCj+v8wo/rWMKP6GjCj+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyABcbchDXG3I61xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/U2PB/0ZUt/9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BMsf8+Vbj/M5Dp/zCk+/8wo/r/MKP6/zCj+v8wo/r/L6T6/yO+/f8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM3//yW6/f8vpfr/MKP6/zCj+v8wo/r/KLP8/x3L//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM3//ymx/P8wovr/MKP6/y6o+/8fyP7/HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM3//ya5
+ /f8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+vMwo/o5MKP6AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IF1xt
+ yMRcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/WmvG/01c
+ vP9BT7P/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BMsf87Z8f/MZ/2/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/Lar7/x/J/v8czv//HM7//xzO//8czv//HM7//xzN//8luv3/L6X6/zCj
+ +v8wo/r/MKP6/yiz/P8dy///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//J7b8/zCi
+ +v8wo/r/L6b6/yDG/v8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//Hcv//yqw+/8wovr/MKP6/zCj+v8wo/r/MKP6/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/MKP69TCj+jwwo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyABcbciAXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1hoxf9IVrj/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BPs/81hOD/MKT7/zCj+v8wo/r/MKP6/zCj+v8wo/r/Jrf8/xzO
+ //8czv//HM7//xzO//8czf//Jbr9/y+l+v8wo/r/MKP6/zCj+v8ps/z/Hcv//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8otPz/MKL6/zCj+v8up/r/H8f+/xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8cz///IMX+/y6o+/8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r1MKP6PDCj
+ +gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IMVxt
+ yOVcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9XZ8T/RlS3/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QEyx/zxh
+ wv8xnfX/MKP6/zCj+v8wo/r/MKP6/zCj+v8uqPv/H8f+/xzO//8czv//HM///yDF/v8vpvr/MKP6/zCj
+ +v8wo/r/KbP8/x3L//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//Hsr+/y2q
+ +/8wo/r/MKL6/yyr+/8dy///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//Jbr9/zCj+v8wo/r/MKP6/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+uYwo/ooMKP6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyANcbcibXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/V2fE/0VTtv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE+z/zWF4P8wpPv/MKP6/zCj+v8wo/r/MKP6/zCj
+ +v8muPz/HM7//xzO//8cz///IcP+/y+l+v8wovr/MKP6/ymz/P8dy///HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzN//8nt/z/MKP6/zCj+v8wovr/J7X8/xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8eyv//LKz7/zCi+v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+v8wo/r/MKP6ojCj
+ +gUwo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IN1xt
+ yOtcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1lpxf9GVLf/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATLH/O2fH/zCg+P8wo/r/MKP6/zCj+v8wo/r/MKP6/y2q+/8eyv//HM7//xzO//8dzP//Jrj8/yyr
+ +/8ntvz/Hcv//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czf//Jrn9/y+k
+ +v8wo/r/MKP6/y6m+v8gxP7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzP//8jv/3/MKT6/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/MKP6/zCj+twwo/owMKP6ADCj+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbciRXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9bbMf/Sli6/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QEyy/0BNsv9BTrP/Qk+z/0JQtP9CULT/Qk+0/0FP
+ s/9ATbL/QE2y/0BMsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv8/U7f/M5Lr/zCk+/8wo/r/MKP6/zCj
+ +v8wo/r/MKT6/yO//f8cz///HM7//xzO//8czv//Hcv//xzN//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM3//ya5/f8wpPr/MKP6/zCj+v8wo/r/Jrj8/xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//x3M//8rrvv/MKL6/zCj+v8wo/r/MKP6/zCj+v8wo/rjMKP6STCj
+ +gAwo/oAMKP6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IIVxt
+ yN1cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1Bfv/9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QU6z/0VT
+ tv9LWbr/UF+//1Rkwv9WZ8T/V2fE/1doxP9XZ8T/VmbD/1Njwf9PXr7/Sli6/0RStf9BTrL/QE2y/0BN
+ sv9ATbL/QE2y/0BMsf83e9j/MKT7/zCj+v8wo/r/MKP6/zCj+v8wovr/KbP8/xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzN//8muf3/MKT6/zCj
+ +v8wo/r/MKP6/yi0/P8dzP//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///yO/
+ /f8wpPr/MKP6/zCj+v8wo/r/MKP64zCj+kowo/oAMKP6ADCj+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbchjXG3I/lxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9XZ8T/Q1G1/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/Q1C0/0tau/9UZML/WmrG/1xtyP9cbsj/XG7I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG7I/1xtyP9cbcj/WWnG/1Niwf9JWLn/Qk+z/0BNsv9ATbL/QEyx/ztlxv8woPj/MKP6/zCj
+ +v8wo/r/MKP6/zCj+v8tqvv/Hsr+/xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czf//Jrn9/zCk+v8wo/r/MKP6/zCj+v8otPz/Hcv//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//Hsv//yys+/8wovr/MKP6/zCj+uMwo/pLMKP6ADCj
+ +gAwo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IBVxt
+ yKtcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/0xau/9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/Qk+z/0xbu/9XZ8T/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG7I/1ts
+ yP9VZcP/SVe5/0FOs/9ATLH/Ple6/zKX8P8wpPv/MKP6/zCj+v8wo/r/MKP6/y+l+v8hw/7/HM///xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM3//ya5/f8wpPr/MKP6/zCj
+ +v8wo/r/KLT8/x3L//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//Jbr9/zCj+v8wo/rjMKP6SzCj+gAwo/oAMKP6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcghXG3I31xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9WZ8T/QlC0/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0VTtv9UZML/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9bbMf/UWC//0NQtP8/T7P/NIrk/zCk
+ +/8wo/r/MKP6/zCj+v8wo/r/MKP6/yW7/f8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzN//8muf3/MKT6/zCj+v8wo/r/MKP6/yi0/P8dy///HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8gxv7/Lqf74TCi+kswo/oAMKP6ADCj
+ +gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxt
+ yE5cbcj6XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/01cvP9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9IVrj/WGjF/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/VWXC/0VRtf83e9j/MKT7/zCj+v8wo/r/MKP6/zCj+v8wovr/KLP8/xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czf//Jrn9/zCk+v8wo/r/MKP6/zCj
+ +v8otPz/Hcv//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//x3N//8iwf1zG8//ADCi+gAwo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3If1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9aasb/RVO2/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/R1W4/1lpxf9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/VmTC/z10
+ 0f8wo/r/MKP6/zCj+v8wo/r/MKP6/zCi+v8rrvv/Hcz//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM///yHE/v8vpvr/MKP6/zCj+v8wo/r/KLT8/x3L//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzP/5Ihw/4AGtH/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxt
+ yANcbcipXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1Vlwv9BTrP/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0RRtf9XZ8T/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9dbMf/THrU/zGi+f8wo/r/MKP6/zCj+v8wo/r/MKP6/y2q
+ +/8eyv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8cz///IcP+/y+k+v8wovr/MKP6/yi0
+ /P8dy///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7/zRzO/xIczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IDlxtyMhcbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/T16+/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/UF++/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/11s
+ x/9TedL/M6D3/zCj+v8wo/r/MKP6/zCj+v8wo/r/Lqj7/x/I/v8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8dzP//Jrj8/yyr+/8nt/z/Hcv//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv/wHM7/NxzO
+ /wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxt
+ yABcbcgcXG3I3VxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9KWLr/QEyy/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0VStv9Zasb/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XGzH/1V20P8zn/b/MKP6/zCj+v8wo/r/MKP6/zCj
+ +v8vpvr/IMb+/xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//Hcv//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv9mHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyCdcbcjnXG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/W2zH/0dVt/9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/TFq7/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbMj/VnXP/zSe9P8wo/r/MKP6/zCj+v8wo/r/MKP6/y+l+v8hxP7/HM///xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ /5Qczv8AHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABcbcgAXG3INFxtyO9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9aa8b/RVO2/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9RYL//XG7I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9WdM7/NZ30/zCj+v8wo/r/MKP6/zCj
+ +v8wo/r/L6X6/yHE/v8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/uhzO/wgczv8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcg7XG3I9FxtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1pqxv9FUrb/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/1Njwf9cbsj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1d0zv82nfP/MKP6/zCj+v8wo/r/MKP6/zCj+v8vpfr/IcT+/xzP//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv/VHM7/FhzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAXG3IAFxtyDhcbcjyXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/WmrG/0VS
+ tv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/UmLA/1xuyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/V3TO/zad8/8wo/r/MKP6/zCj
+ +v8wo/r/MKP6/y+l+v8hxP7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO/+cczv8oHM7/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3ILlxtyOtcbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9aa8f/RlS2/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9PXr7/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9XdM7/Np3z/zCj+v8wo/r/MKP6/zCj+v8wo/r/L6X6/yHE/v8cz///HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7/8RzO/zcczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFxtyABcbcgiXG3I41xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1ts
+ yP9IVrn/QEyy/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0hWuP9bbMf/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1d0zv82nfP/MKP6/zCj
+ +v8wo/r/MKP6/zCj+v8vpfr/IcT+/xzP//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv/5HM7/SRzO/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyBVcbcjTXG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/0xbvP9ATLL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/Qk+z/1Vlw/9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/V3TO/zad8/8wo/r/MKP6/zCj+v8wo/r/MKP6/y+l+v8hxP7/HM///xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//wczv9RHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAABcbcgAXG3ICFxtyLpcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbsj/UmHA/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/SVi5/1ts
+ x/9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/11tyP9Vcs3/NJvz/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/L6X6/yHE/v8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//BzO/1Qczv8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3Illxt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9XaMT/Q1C0/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9BTrL/T1++/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/W2vH/0lkw/8ymPD/MKT7/zCj+v8wo/r/MKP6/zCj+v8vpfr/IcT+/xzP
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv/8HM7/VRzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbchnXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1tsx/9JV7n/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9CT7P/UWHA/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1tsx/9NW7z/Pli7/zKY
+ 8P8wpPv/MKP6/zCj+v8wo/r/MKP6/y+l+v8hxP7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//wczv9VHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxt
+ yDdcbcjvXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1JiwP9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9CT7P/T16+/1tsx/9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9Zasb/S1q7/0FNsv8+V7r/Mpjw/zCk+/8wo/r/MKP6/zCj+v8wo/r/L6X6/yHE
+ /v8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//BzO/1Uczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IEVxtyMlcbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/WmvG/0ZUt/9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATrL/SVi5/1ZnxP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9bbMj/VGTC/0dVt/9ATbL/QEyx/z5Y
+ uv8ymPD/MKT7/zCj+v8wo/r/MKP6/zCj+v8vpfr/IcT+/xzP//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv/8HM7/VRzO
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxt
+ yABcbcgAXG3IiVxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/UmHA/0FO
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/Q1C0/01c
+ vP9XZ8T/W2zI/1xuyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9bbMf/VWXC/0pZuv9CT7P/QE2y/0BNsv9ATLH/Pli6/zKY8P8wpPv/MKP6/zCj+v8wo/r/MKP6/y+l
+ +v8hxP7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//wczv9VHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbchAXG3I8lxtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9bbMf/SVe5/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0JQtP9JV7n/UWC//1ZnxP9aasb/W2zH/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/W2zH/1lqxv9VZcP/T16+/0dVuP9BT7P/QE2y/0BNsv9ATbL/QE2y/0BM
+ sf8+WLr/Mpjw/zCk+/8wo/r/MKP6/zCj+v8wo/r/L6X6/yHE/v8cz///HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///xvQ//8b0P//G9D//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//BzO
+ /1Uczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAXG3IAFxtyAxcbci8XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9XZ8T/RFG1/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/Qk+z/0VTtv9IVrj/S1m7/0xbvP9MW7z/TFu7/0pZuv9HVbj/RFK1/0FP
+ s/9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QEyx/z5Yuv8ymPD/MKT7/zCj+v8wo/r/MKP6/zCj
+ +v8vpfr/IcT+/xzP//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM///xzP//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///x3L
+ +v8kt93/KqbE/yqkwv8mstb/Hsj2/xvQ//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///xzP
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv/8HM7/VRzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyGJcbcj8XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9SYsD/QU+z/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BM
+ sv9ATLL/QEyy/0BMsv9ATLL/QEyy/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATLH/Pli6/zKY8P8wpPv/MKP6/zCj+v8wo/r/MKP6/y+l+v8hxP7/HM///xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8iveb/I7ng/x3M
+ /P8czv//HM7//xzO//8czv//HM7//xzP//8ltNn/OnZ+/0ZUTP9JSz//SUo+/0dQR/8+bHD/KajH/xzN
+ /v8czv//HM7//xzO//8czv//HM7//xzO//8iveb/I7nh/x3M/P8czv//HM7//xzO//8czv//HM7//xzO
+ //wczv9VHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFxtyABcbcgAXG3IFlxtyMxcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9PXr7/QU6z/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BMsv8+V7r/Mpfw/zCk+/8wo/r/MKP6/zCj
+ +v8wo/r/L6X6/yHE/v8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8cz///KajI/0NbV/9GVE3/MJSq/xzO//8czv//HM7//xzO//8cz///JrDU/0Nc
+ WP9LRjj/Skc6/0pIO/9KSDv/Skc6/0tGOP9HUkn/LKC7/xzP//8czv//HM7//xzO//8cz///KqbF/0Ra
+ Vv9GVU7/L5at/xzO//8czv//HM7//xzO//8czv//HM7//BzO/1Mczv8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IZFxt
+ yPtcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1tsx/9OXb3/QU6z/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/z9VuP8yle7/MKT7/zCj+v8wo/r/MKP6/zCj+v8vpPr/IcP+/xzP//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzN/v85eIL/S0U2/0tG
+ N/9BYmH/H8Xy/xzP//8czv//HM7//xzO//83f4v/S0U3/0pIO/9KRzn/Skc6/0pIO/9KRzn/Skg7/0tF
+ N/8/aWv/Hsn3/xzO//8czv//HM7//xzN/f86dn//S0U2/0tFN/9BZGP/H8b0/xzO//8czv//HM7//xzO
+ //8czv/7HM7/TxzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgQXG3Iu1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1tsx/9PXr7/QU+z/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/P1O3/zOT7P8wpPv/MKP6/zCj
+ +v8wo/r/MKP6/zCk+v8jwP3/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//Hcz8/zxwdv9LRjj/Skc5/0NeW/8gw+//HM///xzO//8czv//HM///zKN
+ oP9KRzn/S0U3/0NdWv8xkab/L5ev/z9oav9KRzn/S0U3/zp3gP8dy/v/HM7//xzO//8czv//Hcz8/zxw
+ df9LRjj/S0c5/0JfXP8gw/D/HM///xzO//8czv//HM7//xzO//Uczv9AHM7/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxt
+ yABcbchEXG3I7lxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9SYsD/RFG1/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv8/T7T/NIvm/zCk+/8wo/r/MKP6/zCj+v8wo/r/MKP6/yS8/f8cz///HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8dzPz/PHJ4/0tG
+ OP9LRzn/Ql5b/yDD7/8cz///HM7//xzO//8cz///H8Tw/zGQpP81hZT/JLbc/xvQ//8b0f//Ib/p/zOM
+ nv80iJn/Irvk/xzP//8czv//HM7//xzO//8dzPz/PHB2/0tGOP9LRjn/Ql9d/x/E8P8cz///HM7//xzO
+ //8czv//HM7/6xzO/y0czv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyAJcbciGXG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9XZ8T/SVe5/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv82gt3/MKT7/zCj
+ +v8wo/r/MKP6/zCj+v8wovr/J7b8/xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzP//8zi53/S0Y5/0tFNv87c3n/Hcr5/xzO//8czv//HM7//xzO
+ //8cz///HM///xzP//8cz///HM7//xzO//8cz///HM///xzP//8cz///HM7//xzO//8czv//HM7//xzP
+ //80iJn/S0Y4/0tFNv87dX3/Hcv6/xzO//8czv//HM7//xzO//8czv/YHM7/GRzO/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABcbcgAXG3IAFxtyBRcbci6XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9ba8f/UWC//0VStv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QUyx/zt31P8wpPv/MKP6/zCj+v8wo/r/MKP6/zCi+v8qsPz/HM3//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///yDD
+ 7v8yjqL/NYaW/yO54P8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///yDC7f8yjaH/NIeX/yO64f8cz///HM7//xzO
+ //8czv//HM7//xzO/7kczv8IHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyDFcbcjaXG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/WWnF/05e
+ vf9FUrb/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATLL/QU6z/0ZUt/9SX77/TnrU/zGi
+ +P8wo/r/MKP6/zCj+v8wo/r/MKP6/y2q+/8eyv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///xzP//8cz///HM///xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM///xzP//8cz///HM///xzO//8czv//HM7//xzO//8czv//HM7/jBzO/wAczv8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyExcbcjqXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1lpxv9RYL//SFa4/0JPtP9ATbL/QEyy/0BN
+ sv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BNsv9ATbL/QE2y/0BM
+ sv9ATbL/Q1C0/0pYuv9TYsH/WmvG/11tyP9XdM7/Npzz/zCj+v8wo/r/MKP6/zCj+v8wo/r/L6X6/yHD
+ /v8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//sczv9VHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxt
+ yGBcbcjvXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9bbMf/VmfE/1Bfvv9JWLn/RVK2/0JPs/9ATbL/QE2y/0BNsv9ATLL/QEyy/0BM
+ sv9ATLL/QEyy/0BNsv9ATbL/QU6y/0JQtP9FU7b/S1m6/1FhwP9YaMX/XGzI/1xtyP9cbcj/XG3I/1tu
+ yf8/ken/L6T7/zCj+v8wo/r/MKP6/zCj+v8wo/r/Jrn9/xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/4BzO/yIczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAVxtyGRcbcjvXG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9Zasb/VmbE/1Niwf9PX77/TVy8/0tau/9KWLr/SVi5/0pYuv9MWrv/TVy9/1Bgv/9UY8H/V2fE/1pr
+ xv9cbcj/XG7I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XWzH/0uC2/8wo/r/MKP6/zCj+v8wo/r/MKP6/zCi
+ +v8rrfv/Hcz//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv+mHM7/BBzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxt
+ yABcbcgAXG3IAVxtyF9cbcjpXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG7I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG7I/1xuyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/VnTO/zac8/8wo/r/MKP6/zCj+v8wo/r/MKP6/y+l+v8hw/7/HM///xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/+hzO/1cczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyEtcbcjZXG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/Q4zk/y+k+/8wo/r/MKP6/zCj
+ +v8wo/r/MKL6/yi0/P8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv/NHM7/FhzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyDBcbci6XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/11sx/9TeNL/NJ/2/zCj+v8wo/r/MKP6/zCj+v8wo/r/Lqf6/yDG/v8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO/3Mczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxt
+ yBRcbciHXG3I71xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xuyP9CjeX/L6T7/zCj
+ +v8wo/r/MKP6/zCj+v8wo/r/J7X8/xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv/RHM7/HBzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxtyABcbcgAXG3IAFxtyAJcbchIXG3IwlxtyP5cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XGzH/1R30f81nfT/MKP6/zCj+v8wo/r/MKP6/zCj+v8upvr/IcT+/xzP
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/+xzO/2Uczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxt
+ yABcbcgAXG3IAFxtyABcbcgUXG3Ic1xtyNpcbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/0iG
+ 3/8wo/r/MKP6/zCj+v8wo/r/MKP6/zCi+v8qsPv/Hcz//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv+zHM7/DRzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyABcbcgAXG3II1xt
+ yIFcbcjbXG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyPtcbcjKVnXPcDCj+bcwo/r/MKP6/zCj+v8wo/r/MKP6/zCk
+ +v8lu/3/HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/4xzO/zYczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgAXG3IAFxtyCFcbchyXG3Ix1xtyPZcbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyO9cbci2XG3IXlxt
+ yBVDjOQALqf7LzCk+tswo/r/MKP6/zCj+v8wo/r/MKP6/y6n+v8hw/7/HM///xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//cczv9mHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxt
+ yABcbcgAXG3IAFxtyABcbcgRXG3ISVxtyJVcbcjUXG3I9lxtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I8VxtyMhcbciEXG3IOlxtyApcbcgAXG3IACm1+gAyn/oAL6b6UTCk+u0wo/r/MKP6/zCj
+ +v8wo/r/MKL6/yyr+/8fx/7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv/+HM7/jRzO/wYczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcbcgAXG3IAFxtyABcbcgAXG3IAFxt
+ yBdcbchFXG3If1xtyLRcbcjbXG3I8lxtyP5cbcj/XG3I/1xtyP9cbcj/XG3I/1xtyP9cbcj/XG3I/1xt
+ yP9cbcj/XG3I/1xtyP9cbcj/XG3I/FxtyO5cbcjUXG3IqlxtyHJcbcg6XG3IEFxtyABcbcgAXG3IAFxt
+ yABcbcgAK677ACyt+wAA//8AL6X6aTCj+vQwo/r/MKP6/zCj+v8wo/r/MKP6/yuu+/8eyf7/HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO/6Mczv8PHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IB1xtyBxcbcg6XG3IXFxt
+ yH1cbciZXG3Ir1xtyL9cbcjGXG3Iy1xtyM1cbcjKXG3IxFxtyL1cbcipXG3IlFxtyHZcbchVXG3IM1xt
+ yBZcbcgDXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAAAAAAAAAAAAAAAAALKz7AC2p+wArrfsDL6T6cTCj
+ +vUwo/r/MKP6/zCj+v8wo/r/MKP6/yqw/P8eyf7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv+rHM7/FxzO/wAczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgEXG3ICVxtyA1cbcgQXG3IEVxt
+ yBBcbcgMXG3ICFxtyANcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAALqb6AC6m+gAsrfsDL6X6ajCk+u4wo/r/MKP6/zCj+v8wo/r/MKP6/yuv
+ +/8fx/7/HM///xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv/9HM7/nRzO/xUczv8AHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXG3IAFxt
+ yABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFxtyABcbcgAXG3IAFxt
+ yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqb6AC2p
+ +wAA//8AL6b6UzCk+twwo/r/MKP6/zCj+v8wo/r/MKP6/yyr+/8hw/7/HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/8xzO/4Mczv8MHM7/ABzO/wAczv8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKz7ACys+wAyn/kALqf6MS+k+rUwo/r+MKP6/zCj
+ +v8wo/r/MKL6/y6n+v8lu/3/Hcz//xzP//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ /9cczv9XHM7/AxzO/wAczv8AHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAK6/7ACa5/QAvpfoALan7ES+l+nYwpPriMKP6/zCj+v8wo/r/MKP6/zCk+v8qsfz/IMX+/xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM///xzO//Iczv+eHM7/JxzO/wAczv8AHM7/ABzO/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKrH8ADCk+gAuqPsAOZD4AC6n
+ +i4vpfqZMKP66zCj+v8wo/r/MKP6/zCi+v8up/r/J7b8/x/H/v8czv//HM///xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//8czv//HM///x3N//8iwv7/JL39fxDp
+ /wQczv8AHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAJrn9ACys+wAqr/sAL6b6ACmx/AMupvo3L6X6kzCk+t4wo/r+MKP6/zCj
+ +v8wo/r/Lqj7/ye2/P8hxP7/Hcz//xzP//8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//x3N//QiwP39KrH8/y+l+v8xovpzLaj7AB7L/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACe2
+ /AAuqPsALKv7AC+l+gAW2v8BLqf6Iy+l+mUvpPqtMKT65DCj+v8wo/r/MKL6/y+m+v8rrvv/Jbr9/yHE
+ /v8eyv//HM3//xzO//8czv//HM7//xzO//8czv/8HM7/6BzO/70cz/94JL39Vy+k+ugwovr/MKP6/zCj
+ +p8wo/oBMKP6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAntvwALar7ACuu+wAup/oAMaL6ACS8
+ /QIvpfpPMKT69TCk+v8wpPr/MKT65DCj+tEwo/reL6b64Sys++EotPzfJL392B/H/sQczv+oHM7/gxzO
+ /1cczv8rHM7/CyHD/gA1mfkMMKP6yDCj+v8wo/r/MKP6zzCj+hQwo/oAMKP6AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAACi0/AA3lPgAL6T6ADCj+iQwo/rkMKP6/zCj+v8wo/qnLar7Fi+l
+ +hwwpPofMaL6IDKe+R0wo/oYK677DB3M/wIczv8AHM7/ABzO/wAczv8ALan7ADCj+gAwo/qVMKP6/zCj
+ +v8wo/r1MKP6RjCj+gAwo/oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAwo/oAMKP6DjCj+scwo/r/MKP6/zCj+s4wovoSL6T6AC+l+gAvpfoAL6T6AC2p+wApsvwAHc3/ABjW
+ /wAczv8AHM7/AAAAAAAwo/oAMKP6ADCj+lEwo/r5MKP6/zCj+v8wo/qdMKP6AzCj+gAwo/oAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCj+gAwo/oAMKP6ljCj+v8wo/r/MKP68zCj
+ +kEwo/oAMKP6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCj+gAwo/oAMKP6FTCj
+ +s0wo/r/MKP6/zCj+u4wo/pDMKP6ADCj+gAwo/oAHM7/ABzO/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAMKP6ADCj+gAwo/pVMKP6+zCj+v8wo/r/MKP6lDCj+gEwo/oAMKP6AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAADCj+gAwo/oAMKP6bzCj+v4wo/r/MKP6/zCj+sUwo/oeMKP6ACDG
+ /gAczv8AHM7/ABzO/wkczv8THM7/DBzO/wAczv8AHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwo/oAMKP6ADCj+hkwo/rTMKP6/zCj
+ +v8wo/rnMKP6NTCj+gAwo/oAMKP6ABzO/wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAAAAAAMKP6ADCj
+ +gAwo/oVMKP6wzCj+v8wo/r/MKP6/zCj+rQwo/ojKrH8ABzP/w0czv9pHM7/uhzO/9Eczv/DHM7/fRzO
+ /xoczv8AHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAwo/oAMKP6ADCj+nswo/r/MKP6/zCj+v8wo/qxMKP6ETCj+gArrfsAHM7/ABzO
+ /wAczv8AHM7/ARzO/wAczv8AHM7/ABzO/wAczv8AMKP6ADCj+gAwo/pCMKP66DCj+v8wo/r/MKP6/zCj
+ +s8tqftgHM3/nRzO//0czv//HM7//xzO//8czv//HM7/vRzO/x8czv8AHM7/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCj+gAwo/oAMKP6HjCj
+ +tEwo/r/MKP6/zCj+v4wo/qWMKP6EC2p+wAY1/8BHM7/NhzO/4Qczv+lHM7/lRzO/1Eczv8KHM7/ABzO
+ /wAwo/oAMKP6ADCj+gAwo/peMKP67jCj+v8wo/r/MKP6/yi1/Pwczv/+HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7/khzO/wIczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAMKP6ADCj+gAwo/oAMKP6VjCj+vMwo/r/MKP6/zCj+v4wo/qvL6T6NhzN
+ /2oczv/oHM7//xzO//8czv//HM7/+BzO/50czv8THM7/ABzO/wAwo/oAMKP6ADCj+gEwo/paMKP64jCj
+ +v8vpfr/IcP+/xzP//8czv//HM7//xzO//8czv//HM7//xzO//8czv/cHM7/HRzO/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKP6ADCj
+ +gAwo/oDMKP6ejCj+vkwo/r/MKP6/zCi+v8qr/vrHc3/9BzO//8czv//HM7//xzO//8czv//HM7//xzO
+ /4Mczv8AHM7/AAAAAAAwo/oAMKP6ADCj+gAwo/o2MKP6sC6n+vcfx/7/HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7//xzO/+4czv8xHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKP6ADCj+gAwo/oHMKP6ezCj+vQwo/r/MKP6/yS+
+ /f8cz///HM7//xzO//8czv//HM7//xzO//8czv//HM7/2xzO/x0czv8AAAAAAAAAAAAwo/oAMKP6ADCj
+ +gAyoPoLLar7UR7K/9sczv//HM7//xzO//8czv//HM7//xzO//8czv//HM7/4xzO/yMczv8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAMKP6ADCj+gAwo/oDMKP6WDCj+tIvpfr/IMX+/xzP//8czv//HM7//xzO//8czv//HM7//xzO
+ //8czv/0HM7/OhzO/wAAAAAAAAAAAAAAAAAwo/oAMKP6AC6m+gAqsPwAHM7/fxzO//8czv//HM7//xzO
+ //8czv//HM7//xzO//8czv+oHM7/BhzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKP6ADCj+gAwo/oAMKL6Hi6n
+ +nofx/7oHM7//xzO//8czv//HM7//xzO//8czv//HM7//xzO//Aczv81HM7/AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHM7/ABzO/wAczv8bHM7/vhzO//8czv//HM7//xzO//8czv//HM7/2RzO/zQczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAMKP6ADCj+gAvpfoAKbL8ABzO/4oczv//HM7//xzO//8czv//HM7//xzO
+ //8czv//HM7/yRzO/xIczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHM7/ABzO/wAczv8hHM7/lRzO
+ /94czv/uHM7/5RzO/6oczv80HM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMKP6ACS9
+ /QAczf8AHM7/JxzO/9Qczv//HM7//xzO//8czv//HM7//xzO//Qczv9bHM7/ABzO/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAczv8AHM7/ABzO/wAczv8DHM7/HxzO/zEczv8lHM7/BxzO/wAczv8AHM7/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHM7/ABzO/wAczv8AHM7/ORzO/70czv/2HM7//xzO
+ //sczv/aHM7/ZBzO/wMczv8AHM7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAczv8AHM7/ABzO
+ /wAczv8AHM7/ABzO/wAczv8AHM7/ABzO/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAHM7/ABzO/wAczv8AHM7/EBzO/0Qczv9iHM7/UhzO/yAczv8AHM7/ABzO/wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHM7/ABzO/wAczv8AHM7/ABzO
+ /wAczv8AHM7/ABzO/wAczv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
+ /////////////////////////////////////////////////////////////8AAAAAAAAD/////////
+ //wAAAAAAAAAD//////////gAAAAAAAAAAH/////////AAAAAAAAAAAAf////////gAAAAAAAAAAAB//
+ //////gAAAAAAAAAAAAH///////gAAAAAAAAAAAAA///////wAAAAAAAAAAAAAD//////wAAAAAAAAAA
+ AAAAf/////4AAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAAfAP//+AAAAAAAAAAAAAAADAA///AAAAAA
+ AAAAAAAAAAAAH//gAAAAAAAAAAAAAAAAAA//4AAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAD/+A
+ AAAAAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAA
+ AA/+AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAA
+ AAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAB/8AAAAAAA
+ AAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAD//AA
+ AAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAA
+ Af/wAAAAAAAAAAAAAAAAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAA
+ AAAAAAH/8AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAH/8AAAAAAA
+ AAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAf/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//gA
+ AAAAAAAAAAAAAAAAAf/8AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAAAAAA
+ Af/+AAAAAAAAAAAAAAAAAAH//gAAAAAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAA
+ AAAAAAH//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//+AAAAAA
+ AAAAAAAAAAAB///wAAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///+
+ AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAAf///+AAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAA
+ D/////AAAAAAAAAAAAAAAB/////8AAAAAAAAAAAAAAAf/////gAAAAAAAAAAAAAAP//////AAAAAAAAA
+ AAAAAH//////8AAAAAcAAAAAAAB///////8AAAB/gAAAAAAA////////8AAH/8AAAAAAAf//////////
+ ///gAAAAAAP/////////////8AAAAAAH//////////////gAAAAAH//////////////8AAAAAD//////
+ /////////wAAAAB////////////////AAAAAP///////////////+AAAAD////////////////4AAIAf
+ ///////////////+AP+AAA///////////////gB/wAAH//////////////4AAEAAA///////////////
+ AAAAAAP//////////////wAAAAAD//////////////8AAAAAA///////////////gAAIAAP/////////
+ /////8AADAAD///////////////gAA4AA///////////////8AAPgAP///////////////gAD8AD////
+ ///////////8AA/AB////////////////gAP4A////////////////8AH///////////////////gD//
+ //////////////////////////////////////////////////////////////////8=
+
+
+
\ No newline at end of file
diff --git a/source/Form/Login/FrmLoginFromQRCode.vb b/source/Form/Login/FrmLoginFromQRCode.vb
new file mode 100644
index 0000000..9440d4b
--- /dev/null
+++ b/source/Form/Login/FrmLoginFromQRCode.vb
@@ -0,0 +1,368 @@
+Imports System.Net
+Imports QRCoder
+Imports ShanXingTech
+Imports ShanXingTech.Net2
+
+Public Class FrmLoginFromQRCode
+#Region "枚举区"
+ Private Enum ScanStatus
+ '''
+ ''' 未扫码
+ '''
+ CantScan
+ '''
+ ''' 已扫码未确认授权
+ '''
+ CantConfirm
+ '''
+ ''' 已确认授权
+ '''
+ Confirmed
+ '''
+ ''' 二维码已失效,需要重新刷新
+ '''
+ NeedRefresh
+ '''
+ ''' 未知情况
+ '''
+ Unknown
+ End Enum
+#End Region
+#Region "字段区"
+ Private ReadOnly m_QRCodeGenerator As QRCodeGenerator
+ Private WithEvents m_PictureBox As PictureBox
+ Private ReadOnly m_Width As Integer
+ Private ReadOnly m_Height As Integer
+ Private WithEvents m_ScanTimer As Timer
+ Private ReadOnly m_ScanStatusDic As Dictionary(Of ScanStatus, String)
+ Private m_ScanStatus As ScanStatus
+ Private m_PreviousLoadQRCodeTime As Date
+ '''
+ ''' 二维码中间的图标
+ '''
+ Private ReadOnly m_Icon As Bitmap
+#End Region
+
+#Region "属性区"
+ Private m_OauthUrl As String
+ '''
+ ''' 认证链接
+ '''
+ '''
+ Public ReadOnly Property OauthUrl As String
+ Get
+ Return m_OauthUrl
+ End Get
+ End Property
+ Private m_OauthKey As String
+ '''
+ ''' 认证Key
+ '''
+ '''
+ Public ReadOnly Property OauthKey As String
+ Get
+ Return m_OauthKey
+ End Get
+ End Property
+
+ Public ReadOnly Property LoginedCookies As Net.CookieContainer
+ Get
+ Return HttpAsync.Cookies
+ End Get
+ End Property
+
+#End Region
+
+#Region "构造函数"
+ Public Sub New()
+ ' 此调用是设计器所必需的。
+ InitializeComponent()
+
+ ' 在 InitializeComponent() 调用之后添加任何初始化。
+ m_ScanStatusDic = New Dictionary(Of ScanStatus, String) From {
+ {ScanStatus.CantScan, "请使用 哔哩哔哩客户端 扫码登录"},
+ {ScanStatus.CantConfirm, "扫描成功,请在手机上确认是否授权"},
+ {ScanStatus.Confirmed, "授权成功,正在跳转..."},
+ {ScanStatus.NeedRefresh, "二维码已失效,点击刷新"},
+ {ScanStatus.Unknown, "未知情况,请向开发者反馈!!!"}
+ }
+ m_Width = 140
+ m_Height = m_Width
+ m_QRCodeGenerator = New QRCodeGenerator
+ m_Icon = New Bitmap("./res/snail_128px.ico")
+ m_PictureBox = New PictureBox With {
+ .Size = New Size(m_Width, m_Height),
+ .SizeMode = PictureBoxSizeMode.AutoSize
+ }
+ Me.Controls.Add(m_PictureBox)
+
+ m_ScanTimer = New Timer With {
+ .Interval = 3000
+ }
+ m_ScanTimer.Start()
+
+ Me.StartPosition = FormStartPosition.CenterScreen
+ Me.FormBorderStyle = FormBorderStyle.FixedSingle
+ Me.MaximizeBox = False
+ Me.MinimizeBox = False
+ Me.TopMost = True
+
+ MeSizeAuto()
+
+ If Not HttpAsync.IsInitialized Then
+ HttpAsync.ReInit(Nothing)
+ End If
+ End Sub
+
+#End Region
+
+#Region "IDisposable Support"
+ ' 要检测冗余调用
+ Dim isDisposed2 As Boolean = False
+
+ '''
+ ''' 重写Dispose 以清理非托管资源
+ '''
+ '''
+ Protected Overrides Sub Dispose(disposing As Boolean)
+ ' 窗体内的控件调用Close或者Dispose方法时,isDisposed2的值为True
+ If isDisposed2 Then Return
+
+ Try
+ ' TODO: 释放托管资源(托管对象)。
+ If disposing Then
+ If components IsNot Nothing Then
+ components.Dispose()
+ components = Nothing
+ End If
+
+ m_QRCodeGenerator?.Dispose()
+ m_Icon?.Dispose()
+
+ m_ScanTimer?.Stop()
+ m_ScanTimer?.Dispose()
+
+ m_PictureBox?.Dispose()
+ End If
+
+ ' TODO: 释放未托管资源(未托管对象)并在以下内容中替代 Finalize()。
+ ' TODO: 将大型字段设置为 null。
+
+ isDisposed2 = True
+ Finally
+ MyBase.Dispose(disposing)
+ End Try
+ End Sub
+
+ '' NOTE: Leave out the finalizer altogether if this class doesn't
+ '' own unmanaged resources itself, but leave the other methods
+ '' exactly as they are.
+ 'Protected Overrides Sub Finalize()
+ ' Try
+ ' ' Finalizer calls Dispose(false)
+ ' Dispose(False)
+ ' Finally
+ ' MyBase.Finalize()
+ ' End Try
+ 'End Sub
+#End Region
+
+ Private Function CreateQRCode() As Bitmap
+ Dim bmp As Bitmap
+ Dim qrData = m_QRCodeGenerator.CreateQrCode(m_OauthUrl, QRCodeGenerator.ECCLevel.H)
+ Using qrCode = New QRCode(qrData)
+ bmp = qrCode.GetGraphic(5, Color.Black, Color.White, m_Icon)
+ End Using
+
+ If bmp Is Nothing Then
+ bmp = New Bitmap(m_Width, m_Height)
+ End If
+ DrawScanTips(DirectCast(bmp, Image))
+
+ Return bmp
+ End Function
+
+ Private Sub DrawScanTips(ByRef bmp As Image)
+ Dim tipsColor As Color
+ Select Case m_ScanStatus
+ Case ScanStatus.CantScan
+ tipsColor = Color.Red
+ Case ScanStatus.CantConfirm
+ tipsColor = Color.Gold
+ Case ScanStatus.Confirmed
+ tipsColor = Color.LimeGreen
+ Case ScanStatus.NeedRefresh
+ tipsColor = Color.Gray
+ Case Else
+ tipsColor = Color.Gray
+ End Select
+
+ Dim tips = m_ScanStatusDic(m_ScanStatus)
+ DrawScanTipsInternal(bmp, tips, tipsColor)
+ End Sub
+
+ Private Sub DrawScanTipsInternal(ByRef bmp As Image, ByVal tips As String, ByVal tipsColor As Color)
+ Using g As Graphics = Graphics.FromImage(bmp)
+ Dim drawBrush As New SolidBrush(tipsColor)
+ Dim drawFont As Font = New Font("宋体", 16, FontStyle.Regular, GraphicsUnit.Pixel)
+ Dim tipsSize = g.MeasureString(tips, drawFont)
+ ' 居中显示
+ Dim tipsAlignX = (bmp.Width - tipsSize.Width) / 2
+ Dim drawPoint As New PointF(tipsAlignX, bmp.Height - tipsSize.Height)
+ ' 把提示区刷白
+ Dim pen As New Pen(Color.White, tipsSize.Height)
+ Dim halfOfCharHeight = tipsSize.Height / 2 + (drawFont.Height - drawFont.Size) / 2
+ g.DrawLine(pen, New PointF(15, bmp.Height - halfOfCharHeight), New PointF(bmp.Width, bmp.Height - halfOfCharHeight))
+ ' 写字
+ g.DrawString(tips, drawFont, drawBrush, drawPoint)
+ End Using
+ End Sub
+
+ Private Async Sub FrmLoginFromQRCode_Load(sender As Object, e As EventArgs) Handles MyBase.Load
+ Await ShowQRCodeAsync()
+ End Sub
+
+ Private Async Function ShowQRCodeAsync() As Task
+ Try
+ Me.BeginInvoke(Sub() m_PictureBox.Enabled = False)
+ If Not m_ScanTimer.Enabled Then m_ScanTimer.Start()
+
+ Await InternalShowQRCodeAsync()
+ m_ScanStatus = ScanStatus.CantScan
+ m_PreviousLoadQRCodeTime = Now
+ Catch ex As Exception
+ Logger.WriteLine(ex)
+ Finally
+ Me.BeginInvoke(Sub() m_PictureBox.Enabled = True)
+ End Try
+ End Function
+
+ Private Async Function InternalShowQRCodeAsync() As Task
+ Dim oauth = Await GetOauthInfoAsync()
+ If oauth Is Nothing Then
+ ShowFailureTips()
+ Return
+ End If
+
+ m_OauthUrl = oauth.url
+ m_OauthKey = oauth.oauthKey
+
+ Me.BeginInvoke(Sub() m_PictureBox.Image = CreateQRCode())
+ End Function
+
+ Private Async Function GetOauthInfoAsync() As Task(Of LoginUrlEntity.Data)
+ Dim getRst = Await BilibiliApi.GetLoginUrlAsync
+ If Not getRst.Success Then
+ ShowFailureTips()
+ Return Nothing
+ End If
+
+ Dim json = getRst.Message
+ Dim root = MSJsSerializer.Deserialize(Of LoginUrlEntity.Root)(json)
+ If root Is Nothing Then
+ ShowFailureTips()
+ Return Nothing
+ End If
+
+ Return root.data
+ End Function
+
+ Private Sub ShowFailureTips()
+ Windows2.DrawTipsTask(Me, "获取登录信息失败 " & RandomEmoji.Helpless, 3000, False, False)
+ End Sub
+
+ Private Sub ShowSuccessTips()
+ Windows2.DrawTipsTask(Me, "扫码成功 " & RandomEmoji.Happy, 3000, False, False)
+ End Sub
+
+ Private Async Sub m_ScanTimer_Tick(sender As Object, e As EventArgs) Handles m_ScanTimer.Tick
+ Dim getRst = Await BilibiliApi.GetLoginInfoAsync(m_OauthKey)
+
+ Dim root = MSJsSerializer.DeserializeObject(getRst.Message)
+ If root Is Nothing Then Return
+
+ Dim data As Integer
+ If Not Integer.TryParse(root("data").ToString, data) Then Return
+
+ Dim previousStatuss = m_ScanStatus
+ Select Case data
+ Case -2
+ ' Can't Match oauthKey~ 有可能也是已经扫码并且确认了,这个时候需要去获取一下用户信息,如果能获取到说明已经是登录成功了
+ m_ScanStatus = ScanStatus.NeedRefresh
+ Case -4
+ m_ScanStatus = ScanStatus.CantScan
+ Case -5
+ m_ScanStatus = ScanStatus.CantConfirm
+ Case Else
+ m_ScanStatus = ScanStatus.Unknown
+ m_ScanTimer.Stop()
+ MessageBox.Show("扫码登录遇到未知情况,请反馈给开发者修复", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
+ End Select
+
+ If m_ScanStatus = ScanStatus.NeedRefresh Then
+ Dim loginSuccess = Await GetLoginResultAsync()
+ If loginSuccess Then
+ m_ScanStatus = ScanStatus.Confirmed
+ m_ScanTimer.Stop()
+ DrawScanTips(m_PictureBox.Image)
+ Await Task.Delay(618)
+ Me.Close()
+ Return
+ End If
+ End If
+
+ ' 超时刷新
+ If m_ScanStatus = ScanStatus.NeedRefresh OrElse
+ (Now - m_PreviousLoadQRCodeTime).TotalSeconds > 3 * 60 Then
+ m_ScanStatus = ScanStatus.NeedRefresh
+ m_PreviousLoadQRCodeTime = Now
+ m_ScanTimer.Stop()
+ End If
+
+ If previousStatuss <> m_ScanStatus Then
+ DrawScanTips(m_PictureBox.Image)
+ End If
+ End Sub
+
+ Private Async Function GetLoginResultAsync() As Task(Of Boolean)
+ Dim getRst = Await BilibiliApi.GetCurrentUserNavAsync
+ Return getRst.Success
+ End Function
+
+ Private Sub m_PictureBox_MouseMove(sender As Object, e As MouseEventArgs) Handles m_PictureBox.MouseMove
+ If m_ScanStatus = ScanStatus.NeedRefresh Then
+ Me.Cursor = Cursors.Hand
+ End If
+ End Sub
+
+ Private Sub m_PictureBox_MouseLeave(sender As Object, e As EventArgs) Handles m_PictureBox.MouseLeave
+ Me.Cursor = Cursors.Default
+ End Sub
+
+ Private Async Sub m_PictureBox_Click(sender As Object, e As EventArgs) Handles m_PictureBox.Click
+ If m_ScanStatus <> ScanStatus.NeedRefresh Then Return
+ Await ShowQRCodeAsync()
+ End Sub
+
+ Private Sub m_PictureBox_Resize(sender As Object, e As EventArgs) Handles m_PictureBox.Resize
+ MeSizeAuto()
+ End Sub
+
+ Private Sub MeSizeAuto()
+#If Not DEBUG Then
+ Me.ClientSize = m_PictureBox.Size
+#End If
+ End Sub
+
+ Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
+ Await ShowQRCodeAsync()
+ End Sub
+
+ Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
+ DrawScanTipsInternal(m_PictureBox.Image, TextBox1.Text.Trim, Color.Gold)
+ End Sub
+
+ Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
+ Await GetLoginResultAsync()
+ End Sub
+End Class
\ No newline at end of file
diff --git a/source/Form/Login/FrmQuickLogin.Designer.vb b/source/Form/Login/FrmQuickLogin.Designer.vb
index bae3b0c..7e8d955 100644
--- a/source/Form/Login/FrmQuickLogin.Designer.vb
+++ b/source/Form/Login/FrmQuickLogin.Designer.vb
@@ -34,10 +34,11 @@ Partial Class FrmQuickLogin
Me.Label5 = New System.Windows.Forms.Label()
Me.ToolTip1 = New System.Windows.Forms.ToolTip(Me.components)
Me.pnlLoginOptions = New System.Windows.Forms.Panel()
+ Me.btnTryDeleteCookies = New System.Windows.Forms.Button()
Me.Label6 = New System.Windows.Forms.Label()
Me.rdbtnLoginUseCookies = New System.Windows.Forms.RadioButton()
Me.rdbtnLoginWithBrowser = New System.Windows.Forms.RadioButton()
- Me.btnTryDeleteCookies = New System.Windows.Forms.Button()
+ Me.rdbtnLoginUseQRCode = New System.Windows.Forms.RadioButton()
Me.pnlLoginOptions.SuspendLayout()
Me.SuspendLayout()
'
@@ -120,6 +121,7 @@ Partial Class FrmQuickLogin
'
'pnlLoginOptions
'
+ Me.pnlLoginOptions.Controls.Add(Me.rdbtnLoginUseQRCode)
Me.pnlLoginOptions.Controls.Add(Me.btnTryDeleteCookies)
Me.pnlLoginOptions.Controls.Add(Me.Label6)
Me.pnlLoginOptions.Controls.Add(Me.rdbtnLoginUseCookies)
@@ -131,6 +133,15 @@ Partial Class FrmQuickLogin
Me.pnlLoginOptions.Size = New System.Drawing.Size(322, 89)
Me.pnlLoginOptions.TabIndex = 124
'
+ 'btnTryDeleteCookies
+ '
+ Me.btnTryDeleteCookies.Location = New System.Drawing.Point(0, 59)
+ Me.btnTryDeleteCookies.Name = "btnTryDeleteCookies"
+ Me.btnTryDeleteCookies.Size = New System.Drawing.Size(96, 23)
+ Me.btnTryDeleteCookies.TabIndex = 125
+ Me.btnTryDeleteCookies.Text = "删除旧Cookies"
+ Me.btnTryDeleteCookies.UseVisualStyleBackColor = True
+ '
'Label6
'
Me.Label6.AutoSize = True
@@ -160,14 +171,15 @@ Partial Class FrmQuickLogin
Me.rdbtnLoginWithBrowser.Text = "浏览器"
Me.rdbtnLoginWithBrowser.UseVisualStyleBackColor = True
'
- 'btnTryDeleteCookies
+ 'rdbtnLoginUseQRCode
'
- Me.btnTryDeleteCookies.Location = New System.Drawing.Point(0, 59)
- Me.btnTryDeleteCookies.Name = "btnTryDeleteCookies"
- Me.btnTryDeleteCookies.Size = New System.Drawing.Size(96, 23)
- Me.btnTryDeleteCookies.TabIndex = 125
- Me.btnTryDeleteCookies.Text = "删除旧Cookies"
- Me.btnTryDeleteCookies.UseVisualStyleBackColor = True
+ Me.rdbtnLoginUseQRCode.AutoSize = True
+ Me.rdbtnLoginUseQRCode.Location = New System.Drawing.Point(208, 15)
+ Me.rdbtnLoginUseQRCode.Name = "rdbtnLoginUseQRCode"
+ Me.rdbtnLoginUseQRCode.Size = New System.Drawing.Size(71, 16)
+ Me.rdbtnLoginUseQRCode.TabIndex = 133
+ Me.rdbtnLoginUseQRCode.Text = "扫码登录"
+ Me.rdbtnLoginUseQRCode.UseVisualStyleBackColor = True
'
'FrmQuickLogin
'
@@ -210,4 +222,5 @@ Partial Class FrmQuickLogin
Friend WithEvents rdbtnLoginUseCookies As RadioButton
Friend WithEvents rdbtnLoginWithBrowser As RadioButton
Friend WithEvents btnTryDeleteCookies As Button
+ Friend WithEvents rdbtnLoginUseQRCode As RadioButton
End Class
diff --git a/source/Form/Login/FrmQuickLogin.vb b/source/Form/Login/FrmQuickLogin.vb
index 2bed1e0..31b000c 100644
--- a/source/Form/Login/FrmQuickLogin.vb
+++ b/source/Form/Login/FrmQuickLogin.vb
@@ -218,7 +218,9 @@ Public Class FrmQuickLogin
If(NotLoginUserId = m_User.Id, LoginResult.NotLogin, LoginResult.Yes))
m_LoginMode = If(rdbtnLoginWithBrowser.Checked,
LoginMode.Browser,
- LoginMode.Cookies)
+ If(rdbtnLoginUseCookies.Checked,
+ LoginMode.Cookies,
+ LoginMode.QRCode))
Me.Close()
End Sub
diff --git a/source/Form/Login/LoginManager.vb b/source/Form/Login/LoginManager.vb
index ad9b037..a5e5154 100644
--- a/source/Form/Login/LoginManager.vb
+++ b/source/Form/Login/LoginManager.vb
@@ -28,8 +28,18 @@ Public Class LoginManager
#Region "枚举区"
Enum LoginMode
+ '''
+ ''' 使用浏览器登录
+ '''
Browser
+ '''
+ ''' 使用cookie登录
+ '''
Cookies
+ '''
+ ''' 扫码登录
+ '''
+ QRCode
End Enum
#End Region
@@ -104,7 +114,13 @@ Public Class LoginManager
loginRst = Await ShowLoginFormAsync(loginWay)
Else
' 如果能获取到之前登录后的cookies并且能用cookie获取到用户信息,那就不需要再登录
- Dim isLogined = Await GetCookiesFromDBAsync()
+ Dim success = GetCookiesFromDB()
+ If Not success Then
+ loginRst = Await ShowLoginFormAsync(loginWay)
+ Exit Try
+ End If
+ Dim cookiesKvp = m_User.Cookies.ToKeyValuePairs
+ Dim isLogined = Await EnsureLoginAsync(cookiesKvp)
If isLogined Then
HttpAsync.ReInit(m_User.Cookies)
Else
@@ -124,25 +140,26 @@ Public Class LoginManager
Private Async Function ShowLoginFormAsync(ByVal loginWay As LoginMode) As Task(Of LoginResult)
Dim loginResult As LoginResult
- Dim isLogined As Boolean?
If loginWay = LoginMode.Browser Then
Using frm As New FrmLoginFromBrowser(NavigateUrl)
frm.ShowDialog()
- isLogined = frm.IsLogined
m_User.Cookies = frm.LoginedCookies
End Using
- Else
+ ElseIf loginWay = LoginMode.Cookies Then
Using frm As New FrmLoginFromCookies
- frm.StartPosition = FormStartPosition.CenterScreen
- frm.TopMost = True
frm.ShowDialog()
- isLogined = frm.IsLogined
+ m_User.Cookies = frm.LoginedCookies
+ End Using
+ Else
+ Using frm As New FrmLoginFromQRCode()
+ frm.ShowDialog()
m_User.Cookies = frm.LoginedCookies
End Using
End If
+ Dim isLogined As Boolean?
' 登录失败 或者 未登录,不需要进行bili组件初始化操作
- If isLogined Then
+ If m_User.Cookies?.Count > 0 Then
Dim cookiesKvp = m_User.Cookies.ToKeyValuePairs
isLogined = Await EnsureLoginAsync(cookiesKvp)
End If
@@ -154,8 +171,7 @@ Public Class LoginManager
'''
''' 获取上一次用IE登录之后保存的cookies
'''
- '''
- Private Async Function GetCookiesFromDBAsync() As Task(Of Boolean)
+ Private Function GetCookiesFromDB() As Boolean
Dim sql = "SELECT Cookies FROM UserInfo WHERE Id = " & m_User.Id
Dim cookiesKvp = IO2.Database.SQLiteHelper.GetFirst(sql)
@@ -163,23 +179,22 @@ Public Class LoginManager
Dim tempCookiesKvp = cookiesKvp.ToString.DecryptCookies
m_User.Cookies.GetFromKeyValuePairs(tempCookiesKvp, NavigateUrl)
-
- Dim isLogined = Await EnsureLoginAsync(tempCookiesKvp)
-
- Return isLogined
+ Return True
End Function
+ '''
+ ''' 确保传入的 cookie 可用于访问登录后的资源(能访问就是已经登录成功啦)
+ '''
+ '''
+ '''
Public Async Function EnsureLoginAsync(ByVal cookiesKvp As String) As Task(Of Boolean)
Dim funcRst As Boolean
- ' 有SESSDATA的不一定是不需要登录的,但是没有SESSDATA一定是需要登录
Dim haveLoginFlag = (cookiesKvp.IndexOf("DedeUserID=") > -1 AndAlso cookiesKvp.IndexOf("bili_jct=") > -1)
If haveLoginFlag Then
HttpAsync.ReInit(m_User.Cookies)
Try
- Dim url = "https://api.live.bilibili.com/User/getUserInfo?ts=" & Date.Now.ToTimestampString(TimePrecision.Millisecond)
- m_HttpHeadersParam("Referer") = "https://live.bilibili.com/"
- Dim getRst = Await HttpAsync.TryGetAsync(url, m_HttpHeadersParam, """code"":""REPONSE_OK""", 3)
+ Dim getRst = Await BilibiliApi.GetCurrentUserNavAsync()
funcRst = getRst.Success
Catch ex As Exception
Logger.WriteLine(ex)
diff --git a/source/packages.config b/source/packages.config
index b21528e..886d00c 100644
--- a/source/packages.config
+++ b/source/packages.config
@@ -1,5 +1,7 @@
+
+
\ No newline at end of file
diff --git "a/source/\345\247\254\345\250\230.vbproj" "b/source/\345\247\254\345\250\230.vbproj"
index 06305ff..96198fb 100644
--- "a/source/\345\247\254\345\250\230.vbproj"
+++ "b/source/\345\247\254\345\250\230.vbproj"
@@ -29,7 +29,7 @@
姬娘
ShanXingTech
Bilibili大数据
- 59
+ 60
1.0.0.%2a
false
true
@@ -78,7 +78,7 @@
res\snail_128px.ico
- 25AA67DB9EA574E4DD7B5CBB4C63F297F4AA4F15
+ A88C2114CB2A34D3DEC6BE1C5B181919E499085A
@@ -103,6 +103,9 @@
ShanXingTech.pfx
+
+ ..\..\..\packages\QRCoder.1.3.6\lib\net40\QRCoder.dll
+
False
..\..\..\ShanXingTech\shanxinglib\bin\Debug\shanxinglib.dll
@@ -115,6 +118,9 @@
+
+ ..\..\..\packages\System.Drawing.Common.4.5.0\lib\net461\System.Drawing.Common.dll
+
@@ -156,6 +162,7 @@
+
@@ -188,6 +195,12 @@
Form
+
+ FrmLoginFromQRCode.vb
+
+
+ Form
+
@@ -447,6 +460,9 @@
FrmLoginFromCookies.vb
+
+ FrmLoginFromQRCode.vb
+
FrmQuickLogin.vb
@@ -515,7 +531,9 @@
PreserveNewest
-
+
+ Always
+
PreserveNewest