From 1791b24f37b822c258758e371e99fbdfd14a8636 Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Tue, 7 Dec 2021 09:52:01 +0300 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .gitignore | 392 +++++ README.md | 57 + SCrawler.sln | 60 + SCrawler/API/Base/SiteSettings.vb | 78 + SCrawler/API/Base/Structures.vb | 81 + SCrawler/API/Base/UserDataBase.vb | 961 ++++++++++++ SCrawler/API/Reddit/Channel.vb | 304 ++++ SCrawler/API/Reddit/ChannelsCollection.vb | 141 ++ SCrawler/API/Reddit/Declarations.vb | 33 + SCrawler/API/Reddit/M3U8.vb | 100 ++ SCrawler/API/Reddit/UserData.vb | 468 ++++++ SCrawler/API/Twitter/Declarations.vb | 9 + SCrawler/API/Twitter/UserData.vb | 264 ++++ SCrawler/API/UserDataBind.vb | 471 ++++++ SCrawler/App.config | 6 + SCrawler/Channels/ChannelViewForm.Designer.vb | 225 +++ SCrawler/Channels/ChannelViewForm.resx | 1280 ++++++++++++++++ SCrawler/Channels/ChannelViewForm.vb | 704 +++++++++ SCrawler/Content/Icons/Rainbow.ico | Bin 0 -> 9662 bytes SCrawler/Content/Icons/RedditIcon.ico | Bin 0 -> 67646 bytes SCrawler/Content/Icons/TwitterIcon.ico | Bin 0 -> 481 bytes SCrawler/Content/Icons/UsersIcon.ico | Bin 0 -> 25214 bytes SCrawler/Content/Pictures/Cloud_01_16.png | Bin 0 -> 384 bytes SCrawler/Content/Pictures/DBPic_32.png | Bin 0 -> 3006 bytes SCrawler/Content/Pictures/Delete.png | Bin 0 -> 1558 bytes SCrawler/Content/Pictures/Folder_32.png | Bin 0 -> 3831 bytes SCrawler/Content/Pictures/GlobeBlue_32.png | Bin 0 -> 929 bytes SCrawler/Content/Pictures/InfoPic_32.png | Bin 0 -> 368 bytes SCrawler/Content/Pictures/NextPIC2.png | Bin 0 -> 434 bytes SCrawler/Content/Pictures/Ok.png | Bin 0 -> 1383 bytes SCrawler/Content/Pictures/PencilPic_01_16.png | Bin 0 -> 3233 bytes SCrawler/Content/Pictures/PicturePic_32.png | Bin 0 -> 4102 bytes SCrawler/Content/Pictures/Pin_32.png | Bin 0 -> 4758 bytes SCrawler/Content/Pictures/PlusPIC.png | Bin 0 -> 888 bytes SCrawler/Content/Pictures/PrevPIC2.png | Bin 0 -> 423 bytes SCrawler/Content/Pictures/RedditPic512.png | Bin 0 -> 22323 bytes SCrawler/Content/Pictures/Refresh.png | Bin 0 -> 1139 bytes SCrawler/Content/Pictures/StarPic_24.png | Bin 0 -> 1164 bytes .../Content/Pictures/StartPic_01_Green_16.png | Bin 0 -> 373 bytes SCrawler/DownloadedInfoForm.Designer.vb | 115 ++ SCrawler/DownloadedInfoForm.resx | 142 ++ SCrawler/DownloadedInfoForm.vb | 124 ++ .../Editors/CollectionEditorForm.Designer.vb | 87 ++ SCrawler/Editors/CollectionEditorForm.resx | 233 +++ SCrawler/Editors/CollectionEditorForm.vb | 81 + .../Editors/GlobalSettingsForm.Designer.vb | 290 ++++ SCrawler/Editors/GlobalSettingsForm.resx | 168 +++ SCrawler/Editors/GlobalSettingsForm.vb | 65 + SCrawler/Editors/LabelsForm.Designer.vb | 92 ++ SCrawler/Editors/LabelsForm.resx | 241 +++ SCrawler/Editors/LabelsForm.vb | 97 ++ SCrawler/Editors/RedditEditorForm.Designer.vb | 134 ++ SCrawler/Editors/RedditEditorForm.resx | 1341 +++++++++++++++++ SCrawler/Editors/RedditEditorForm.vb | 68 + .../Editors/TwitterEditorForm.Designer.vb | 180 +++ SCrawler/Editors/TwitterEditorForm.resx | 238 +++ SCrawler/Editors/TwitterEditorForm.vb | 84 ++ SCrawler/Editors/UserCreatorForm.Designer.vb | 378 +++++ SCrawler/Editors/UserCreatorForm.resx | 591 ++++++++ SCrawler/Editors/UserCreatorForm.vb | 358 +++++ SCrawler/LabelsKeeper.vb | 103 ++ SCrawler/MainFrame.Designer.vb | 578 +++++++ SCrawler/MainFrame.resx | 478 ++++++ SCrawler/MainFrame.vb | 777 ++++++++++ SCrawler/MainMod.vb | 350 +++++ SCrawler/My Project/Application.Designer.vb | 38 + SCrawler/My Project/Application.myapp | 10 + SCrawler/My Project/AssemblyInfo.vb | 37 + SCrawler/My Project/Resources.Designer.vb | 243 +++ SCrawler/My Project/Resources.resx | 175 +++ SCrawler/My Project/Settings.Designer.vb | 73 + SCrawler/My Project/Settings.settings | 7 + SCrawler/My Project/app.manifest | 79 + SCrawler/RedditIcon.ico | Bin 0 -> 67646 bytes SCrawler/SCrawler.vbproj | 307 ++++ SCrawler/SettingsCLS.vb | 243 +++ SCrawler/TDownloader.vb | 191 +++ SCrawler/UserImage.vb | 82 + SCrawler/VideosDownloaderForm.Designer.vb | 158 ++ SCrawler/VideosDownloaderForm.resx | 132 ++ SCrawler/VideosDownloaderForm.vb | 127 ++ 82 files changed, 14931 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 SCrawler.sln create mode 100644 SCrawler/API/Base/SiteSettings.vb create mode 100644 SCrawler/API/Base/Structures.vb create mode 100644 SCrawler/API/Base/UserDataBase.vb create mode 100644 SCrawler/API/Reddit/Channel.vb create mode 100644 SCrawler/API/Reddit/ChannelsCollection.vb create mode 100644 SCrawler/API/Reddit/Declarations.vb create mode 100644 SCrawler/API/Reddit/M3U8.vb create mode 100644 SCrawler/API/Reddit/UserData.vb create mode 100644 SCrawler/API/Twitter/Declarations.vb create mode 100644 SCrawler/API/Twitter/UserData.vb create mode 100644 SCrawler/API/UserDataBind.vb create mode 100644 SCrawler/App.config create mode 100644 SCrawler/Channels/ChannelViewForm.Designer.vb create mode 100644 SCrawler/Channels/ChannelViewForm.resx create mode 100644 SCrawler/Channels/ChannelViewForm.vb create mode 100644 SCrawler/Content/Icons/Rainbow.ico create mode 100644 SCrawler/Content/Icons/RedditIcon.ico create mode 100644 SCrawler/Content/Icons/TwitterIcon.ico create mode 100644 SCrawler/Content/Icons/UsersIcon.ico create mode 100644 SCrawler/Content/Pictures/Cloud_01_16.png create mode 100644 SCrawler/Content/Pictures/DBPic_32.png create mode 100644 SCrawler/Content/Pictures/Delete.png create mode 100644 SCrawler/Content/Pictures/Folder_32.png create mode 100644 SCrawler/Content/Pictures/GlobeBlue_32.png create mode 100644 SCrawler/Content/Pictures/InfoPic_32.png create mode 100644 SCrawler/Content/Pictures/NextPIC2.png create mode 100644 SCrawler/Content/Pictures/Ok.png create mode 100644 SCrawler/Content/Pictures/PencilPic_01_16.png create mode 100644 SCrawler/Content/Pictures/PicturePic_32.png create mode 100644 SCrawler/Content/Pictures/Pin_32.png create mode 100644 SCrawler/Content/Pictures/PlusPIC.png create mode 100644 SCrawler/Content/Pictures/PrevPIC2.png create mode 100644 SCrawler/Content/Pictures/RedditPic512.png create mode 100644 SCrawler/Content/Pictures/Refresh.png create mode 100644 SCrawler/Content/Pictures/StarPic_24.png create mode 100644 SCrawler/Content/Pictures/StartPic_01_Green_16.png create mode 100644 SCrawler/DownloadedInfoForm.Designer.vb create mode 100644 SCrawler/DownloadedInfoForm.resx create mode 100644 SCrawler/DownloadedInfoForm.vb create mode 100644 SCrawler/Editors/CollectionEditorForm.Designer.vb create mode 100644 SCrawler/Editors/CollectionEditorForm.resx create mode 100644 SCrawler/Editors/CollectionEditorForm.vb create mode 100644 SCrawler/Editors/GlobalSettingsForm.Designer.vb create mode 100644 SCrawler/Editors/GlobalSettingsForm.resx create mode 100644 SCrawler/Editors/GlobalSettingsForm.vb create mode 100644 SCrawler/Editors/LabelsForm.Designer.vb create mode 100644 SCrawler/Editors/LabelsForm.resx create mode 100644 SCrawler/Editors/LabelsForm.vb create mode 100644 SCrawler/Editors/RedditEditorForm.Designer.vb create mode 100644 SCrawler/Editors/RedditEditorForm.resx create mode 100644 SCrawler/Editors/RedditEditorForm.vb create mode 100644 SCrawler/Editors/TwitterEditorForm.Designer.vb create mode 100644 SCrawler/Editors/TwitterEditorForm.resx create mode 100644 SCrawler/Editors/TwitterEditorForm.vb create mode 100644 SCrawler/Editors/UserCreatorForm.Designer.vb create mode 100644 SCrawler/Editors/UserCreatorForm.resx create mode 100644 SCrawler/Editors/UserCreatorForm.vb create mode 100644 SCrawler/LabelsKeeper.vb create mode 100644 SCrawler/MainFrame.Designer.vb create mode 100644 SCrawler/MainFrame.resx create mode 100644 SCrawler/MainFrame.vb create mode 100644 SCrawler/MainMod.vb create mode 100644 SCrawler/My Project/Application.Designer.vb create mode 100644 SCrawler/My Project/Application.myapp create mode 100644 SCrawler/My Project/AssemblyInfo.vb create mode 100644 SCrawler/My Project/Resources.Designer.vb create mode 100644 SCrawler/My Project/Resources.resx create mode 100644 SCrawler/My Project/Settings.Designer.vb create mode 100644 SCrawler/My Project/Settings.settings create mode 100644 SCrawler/My Project/app.manifest create mode 100644 SCrawler/RedditIcon.ico create mode 100644 SCrawler/SCrawler.vbproj create mode 100644 SCrawler/SettingsCLS.vb create mode 100644 SCrawler/TDownloader.vb create mode 100644 SCrawler/UserImage.vb create mode 100644 SCrawler/VideosDownloaderForm.Designer.vb create mode 100644 SCrawler/VideosDownloaderForm.resx create mode 100644 SCrawler/VideosDownloaderForm.vb diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ea61cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,392 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates +ffmpeg.exe +ToDo.txt + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ +ffmpeg/ +Info/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Nuget personal access tokens and Credentials +nuget.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +.idea/ +*.sln.iml \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f43622 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# Social networks crawler + +Program for downloading photo and video from Reddit and Twitter + +Enjoying the tool? Considering adding to my coffee fund :) + +[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/andyprogram) + +# What can program do: +- Download pictures and videos from users' profiles: + - Reddit images; + - Reddit galleries of images; + - Redgifs hosted videos (https://www.redgifs.com/); + - Reddit hosted videos (downloading Reddit hosted video is going through ffmpeg); + - Twitter images; + - Twitter videos. +- Parse channel and view data. +- Add users from parsed channel. +- Labeling users. +- Filter exists users by label or group. + +# How does it works: + +## Reddit + +The program parsing all user's posts, gathering pictures' MD5 hash and compare with existing for remove duplicates. Then media will be downloaded. + +## Twitter + +The program parsing all user's posts and compare file names with existing for remove duplicates. Then media will be downloaded. + +# Requirements: + +- Windows 7, 8, 9, 10, 11 with NET Framework 4.6.1 or higher +- Authorization cookies and tokens for Twitter (if you want to download data from Twitter) +- Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder) +- Just unpack program archive in any folder you want, copy ```ffmpeg.exe``` into and enjoy. :-) + +# Settings and usage + +The program has an intuitive interface. + +Just add user profile and press ```Start downloading``` button. + +Users can be added by patterns: +- https://twitter.com/SomeUserName +- https://reddit.com/user/SomeUserName +- u/SomeUserName +- SomeUserName (in this case you must to choose user site) + +More about users adding here + +## Using program as just video downloader + +Create a shortcut for the program. Open shortcut properties. On the ```Shortcut``` tab in ```Target``` field just add ```v``` at the end through the space. + +Example: ```D:\Programs\SCrawler\SCrawler.exe v``` \ No newline at end of file diff --git a/SCrawler.sln b/SCrawler.sln new file mode 100644 index 0000000..6271746 --- /dev/null +++ b/SCrawler.sln @@ -0,0 +1,60 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31515.178 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SCrawler", "SCrawler\SCrawler.vbproj", "{4A016FAD-9F07-4957-8BB2-AE86C88BA342}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PersonalUtilities", "..\..\MyUtilities\PersonalUtilities\PersonalUtilities.vbproj", "{8405896B-2685-4916-BC93-1FB514C323A9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FE5CE5B9-DDBE-4399-A17C-880893635307}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + README.md = README.md + Info\RedditUrlsInfo.txt = Info\RedditUrlsInfo.txt + Info\TwitterNewAlgo.txt = Info\TwitterNewAlgo.txt + Info\TwitterUrlsInfo.txt = Info\TwitterUrlsInfo.txt + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x64.ActiveCfg = Debug|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x64.Build.0 = Debug|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x86.ActiveCfg = Debug|x86 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Debug|x86.Build.0 = Debug|x86 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|Any CPU.Build.0 = Release|Any CPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x64.ActiveCfg = Release|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x64.Build.0 = Release|x64 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x86.ActiveCfg = Release|x86 + {4A016FAD-9F07-4957-8BB2-AE86C88BA342}.Release|x86.Build.0 = Release|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x64.ActiveCfg = Debug|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x64.Build.0 = Debug|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x86.ActiveCfg = Debug|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Debug|x86.Build.0 = Debug|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|Any CPU.Build.0 = Release|Any CPU + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x64.ActiveCfg = Release|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x64.Build.0 = Release|x64 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x86.ActiveCfg = Release|x86 + {8405896B-2685-4916-BC93-1FB514C323A9}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4037B243-B6D7-4DF1-A4CC-4E86F4AD31BB} + EndGlobalSection +EndGlobal diff --git a/SCrawler/API/Base/SiteSettings.vb b/SCrawler/API/Base/SiteSettings.vb new file mode 100644 index 0000000..90d3435 --- /dev/null +++ b/SCrawler/API/Base/SiteSettings.vb @@ -0,0 +1,78 @@ +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.XML.Base +Namespace API.Base + Friend Class SiteSettings : Implements IDisposable + Friend Const Header_Twitter_Authorization As String = "authorization" + Friend Const Header_Twitter_Token As String = "x-csrf-token" + Friend ReadOnly Site As Sites + Friend ReadOnly Responser As WEB.Response + Private ReadOnly _Path As XMLValue(Of SFile) + Friend Property Path As SFile + Get + If _Path.IsEmptyString Then _Path.Value = SFile.GetPath($"{Settings.GlobalPath.Value.PathWithSeparator}{Site}") + Return _Path.Value + End Get + Set(ByVal NewFile As SFile) + _Path.Value = NewFile + End Set + End Property + Private ReadOnly SettingsFile As SFile + Friend Sub New(ByVal s As Sites, ByRef _XML As XmlFile, ByVal GlobalPath As SFile) + Site = s + SettingsFile = $"{SettingsFolderName}\Responser_{s}.xml" + Responser = New WEB.Response(SettingsFile) + + If SettingsFile.Exists Then + Responser.LoadSettings() + Else + If Site = Sites.Twitter Then + With Responser + .ContentType = "application/json" + .Accept = "*/*" + .CookiesDomain = "twitter.com" + .Decoders.Add(SymbolsConverter.Converters.Unicode) + With .Headers + .Add("sec-ch-ua", " Not;A Brand" & Chr(34) & ";v=" & Chr(34) & "99" & Chr(34) & ", " & Chr(34) & + "Google Chrome" & Chr(34) & ";v=" & Chr(34) & "91" & Chr(34) & ", " & Chr(34) & "Chromium" & + Chr(34) & ";v=" & Chr(34) & "91" & Chr(34)) + .Add("sec-ch-ua-mobile", "?0") + .Add("sec-fetch-dest", "empty") + .Add("sec-fetch-mode", "cors") + .Add("sec-fetch-site", "same-origin") + .Add(Header_Twitter_Token, String.Empty) + .Add("x-twitter-active-user", "yes") + .Add("x-twitter-auth-type", "OAuth2Session") + .Add(Header_Twitter_Authorization, String.Empty) + End With + End With + ElseIf Site = Sites.Reddit Then + Responser.CookiesDomain = "reddit.com" + Responser.Decoders.Add(SymbolsConverter.Converters.Unicode) + End If + Responser.SaveSettings() + End If + _Path = New XMLValue(Of SFile)("Path", SFile.GetPath($"{GlobalPath.PathWithSeparator}{Site}"), _XML, {Site.ToString}, XMLValue(Of SFile).ToFilePath) + End Sub + Friend Sub Update() + Responser.SaveSettings() + End Sub +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Responser.Dispose() + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Base/Structures.vb b/SCrawler/API/Base/Structures.vb new file mode 100644 index 0000000..63e77cb --- /dev/null +++ b/SCrawler/API/Base/Structures.vb @@ -0,0 +1,81 @@ +Namespace API.Base + Friend Module Structures + Friend Structure UserMedia : Implements IEquatable(Of UserMedia) + Friend Enum Types As Integer + Undefined = 0 + [Picture] = 1 + [Video] = 2 + [Text] = 3 + VideoPre = 10 + GIF = 50 + m3u8 = 100 + End Enum + Friend Enum States : Unknown : Tried : Downloaded : Skipped : End Enum + Friend Type As Types + Friend URL_BASE As String + Friend URL As String + Friend MD5 As String + Friend [File] As SFile + Friend Post As UserPost + Friend PictureOption As String + Friend State As States + Friend Sub New(ByVal _URL As String) + URL = _URL + URL_BASE = _URL + File = URL + Type = Types.Undefined + End Sub + Friend Sub New(ByVal _URL As String, ByVal _Type As Types) + Me.New(_URL) + Type = _Type + End Sub + Public Shared Widening Operator CType(ByVal _URL As String) As UserMedia + Return New UserMedia(_URL) + End Operator + Public Shared Widening Operator CType(ByVal m As UserMedia) As String + Return m.URL + End Operator + Public Overrides Function ToString() As String + Return URL + End Function + Friend Overloads Function Equals(ByVal Other As UserMedia) As Boolean Implements IEquatable(Of UserMedia).Equals + Return URL = Other.URL + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(CType(Obj, UserMedia)) + End Function + End Structure + Friend Structure UserPost : Implements IEquatable(Of UserPost), IComparable(Of UserPost) + ''' Post ID + Friend ID As String + Friend [Date] As Date? +#Region "Channel compatible fields" + Friend UserID As String + Friend CachedFile As SFile +#End Region + Friend Function GetImage(ByVal s As Size, ByVal e As ErrorsDescriber, ByVal NullArg As Image) As Image + If Not CachedFile.IsEmptyString Then + Return If(PersonalUtilities.Tools.ImageRenderer.GetImage(SFile.GetBytes(CachedFile), s, e), NullArg.Clone) + Else + Return NullArg.Clone + End If + End Function +#Region "IEquatable, IComparable Support" + Friend Overloads Function Equals(ByVal Other As UserPost) As Boolean Implements IEquatable(Of UserPost).Equals + Return ID = Other.ID + End Function + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(DirectCast(Obj, UserPost)) + End Function + Friend Function CompareTo(ByVal Other As UserPost) As Integer Implements IComparable(Of UserPost).CompareTo + Return GetCompareValue(Me).CompareTo(GetCompareValue(Other)) + End Function +#End Region + Private Function GetCompareValue(ByVal Post As UserPost) As Long + Dim v& = 0 + If Post.Date.HasValue Then v = Post.Date.Value.Ticks * -1 + Return v + End Function + End Structure + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb new file mode 100644 index 0000000..84e3e26 --- /dev/null +++ b/SCrawler/API/Base/UserDataBase.vb @@ -0,0 +1,961 @@ +Imports PersonalUtilities.Functions.XML +Imports System.IO +Imports System.Threading +Imports UState = SCrawler.API.Base.UserMedia.States +Namespace API.Base + Friend MustInherit Class UserDataBase : Implements IUserData + Friend Const UserFileAppender As String = "User" + Friend Event OnPictureUpdated As IUserData.OnPictureUpdatedEventHandler Implements IUserData.OnPictureUpdated + Protected Sub Raise_OnPictureUpdated() + RaiseEvent OnPictureUpdated(Me) + End Sub +#Region "Collection buttons" + Friend WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_EDIT As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_DELETE As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_OPEN_PATH As ToolStripMenuItem + Friend WithEvents BTT_CONTEXT_OPEN_SITE As ToolStripMenuItem + Friend Sub CreateButtons(ByVal CollectionIndex As Integer) + Dim tn$ = $"[{Site}] - {Name}" + Dim _tn$ = $"{Site}{Name}" + Dim tnn As Func(Of String, String) = Function(Input) $"{Input}{_tn}" + Dim i As Image = Nothing + Select Case Site + Case Sites.Reddit : i = My.Resources.RedditIcon.ToBitmap + Case Sites.Twitter : i = My.Resources.TwitterIcon.ToBitmap + End Select + BTT_CONTEXT_DOWN = New ToolStripMenuItem(tn, i) With {.Name = tnn("DOWN"), .Tag = CollectionIndex} + BTT_CONTEXT_EDIT = New ToolStripMenuItem(tn, i) With {.Name = tnn("EDIT"), .Tag = CollectionIndex} + BTT_CONTEXT_DELETE = New ToolStripMenuItem(tn, i) With {.Name = tnn("DELETE"), .Tag = CollectionIndex} + BTT_CONTEXT_OPEN_PATH = New ToolStripMenuItem(tn, i) With {.Name = tnn("PATH"), .Tag = CollectionIndex} + BTT_CONTEXT_OPEN_SITE = New ToolStripMenuItem(tn, i) With {.Name = tnn("SITE"), .Tag = CollectionIndex} + End Sub +#End Region +#Region "XML Declarations" + Private Const Name_Site As String = "Site" + Private Const Name_UserName As String = "UserName" + Private Const Name_FriendlyName As String = "FriendlyName" + Private Const Name_UserID As String = "UserID" + Private Const Name_Description As String = "Description" + Private Const Name_ParseUserMediaOnly As String = "ParseUserMediaOnly" + Private Const Name_Temporary As String = "Temporary" + Private Const Name_Favorite As String = "Favorite" + + Private Const Name_SeparateVideoFolder As String = "SeparateVideoFolder" + Private Const Name_CollectionName As String = "Collection" + Private Const Name_LabelsName As String = "Labels" + + Private Const Name_ReadyForDownload As String = "ReadyForDownload" + + Private Const Name_VideoCount As String = "VideoCount" + Private Const Name_PicturesCount As String = "PicturesCount" + Private Const Name_LastUpdated As String = "LastUpdated" + + Private Const Name_DataMerging As String = "DataMerging" +#Region "Downloaded data" + Private Const Name_MediaType As String = "Type" + Private Const Name_MediaURL As String = "URL" + Private Const Name_MediaHash As String = "Hash" + Private Const Name_MediaFile As String = "File" + Private Const Name_MediaPostID As String = "ID" + Private Const Name_MediaPostDate As String = "Date" +#End Region +#End Region +#Region "Declarations" + Friend MustOverride Property Site As Sites Implements IContentProvider.Site + Friend User As UserInfo + Friend Overridable Property Name As String Implements IContentProvider.Name + Get + Return User.Name + End Get + Set(ByVal NewName As String) + User.Name = NewName + User.UpdateUserFile() + Settings.UpdateUsersList(User) + End Set + End Property + Friend Overridable Property ID As String = String.Empty Implements IContentProvider.ID + Friend Overridable Property FriendlyName As String = String.Empty Implements IContentProvider.FriendlyName + Friend Property UserDescription As String = String.Empty Implements IContentProvider.Description + Friend Property ParseUserMediaOnly As Boolean = False Implements IUserData.ParseUserMediaOnly + Protected _Favorite As Boolean = False + Friend Overridable Property Favorite As Boolean Implements IContentProvider.Favorite + Get + Return _Favorite + End Get + Set(ByVal Fav As Boolean) + _Favorite = Fav + If _Favorite Then _Temporary = False + End Set + End Property + Protected _Temporary As Boolean = False + Friend Overridable Property Temporary As Boolean Implements IContentProvider.Temporary + Get + Return _Temporary + End Get + Set(ByVal Temp As Boolean) + _Temporary = Temp + If _Temporary Then _Favorite = False + End Set + End Property + Friend Overridable ReadOnly Property IsChannel As Boolean Implements IUserData.IsChannel + Get + Return User.IsChannel + End Get + End Property + Friend ReadOnly Property Self As IUserData Implements IUserData.Self + Get + Return Me + End Get + End Property +#Region "Images" + Friend Overridable Function GetUserPicture() As Image Implements IUserData.GetPicture + If Settings.ViewModeIsPicture Then + Return GetPicture() + Else + Return Nothing + End If + End Function + Friend Overridable Sub SetPicture(ByVal f As SFile) Implements IUserData.SetPicture + Try + If Not f.IsEmptyString AndAlso f.Exists Then + Using p As New UserImage(f, User.File) : p.Save() : End Using + End If + Catch ex As Exception + End Try + End Sub + Protected Function GetNullPicture(ByVal MaxHeigh As XML.Base.XMLValue(Of Integer)) As Bitmap + Return New Bitmap(CInt(DivideWithZeroChecking(MaxHeigh.Value, 100) * 75), MaxHeigh.Value) + End Function + Private Function GetPicture(Optional ByVal ReturnNullImageOnNothing As Boolean = True) As Image + Dim f As SFile = Nothing + Dim p As UserImage = Nothing + Dim DelPath As Boolean = True +BlockPictureFolder: + On Error GoTo BlockPictureScan + f = SFile.GetPath($"{MyFile.PathWithSeparator}Pictures") + If f.Exists(SFO.Path, False) Then + Dim PicList As List(Of SFile) = SFile.GetFiles(f, $"{UserImage.ImagePrefix}*.jpg") + If PicList.ListExists Then + PicList.Sort() + Dim l As SFile, s As SFile + l = PicList.Find(Function(ff) ff.Name.Contains(UserImage.ImagePostfix_Large)) + If Not l.IsEmptyString Then PicList.Remove(l) + s = PicList.Find(Function(ff) ff.Name.Contains(UserImage.ImagePostfix_Small)) + If Not s.IsEmptyString Then PicList.Remove(s) + If PicList.Count > 0 Then + p = New UserImage(PicList.First, l, s, MyFile) + GoTo BlockReturn + Else + f.Delete(SFO.Path, False, False, EDP.None) + DelPath = False + End If + End If + End If +BlockPictureScan: + On Error GoTo BlockDeletePictureFolder + Dim NewPicFile As SFile = SFile.GetFiles(MyFile.CutPath, "*.jpg|*.png",, + New ErrorsDescriber(EDP.ReturnValue) With { + .ReturnValue = New List(Of SFile), + .ReturnValueExists = True}).FirstOrDefault + If Not NewPicFile.IsEmptyString AndAlso NewPicFile.Exists Then + p = New UserImage(NewPicFile, MyFile) + p.Save() + GoTo BlockReturn + End If +BlockDeletePictureFolder: + On Error GoTo BlockReturn + If DelPath Then + f = SFile.GetPath($"{MyFile.PathWithSeparator}Pictures") + If f.Exists(SFO.Path, False) Then f.Delete(SFO.Path, False, False) + End If +BlockReturn: + On Error GoTo BlockNullPicture + If Not p Is Nothing Then + Dim i As Image = Nothing + Select Case Settings.ViewMode.Value + Case View.LargeIcon : i = p.Large.OriginalImage.Clone + Case View.SmallIcon : i = p.Small.OriginalImage.Clone + End Select + p.Dispose() + Return i + End If +BlockNullPicture: + If ReturnNullImageOnNothing Then + Select Case Settings.ViewMode.Value + Case View.LargeIcon : Return GetNullPicture(Settings.MaxLargeImageHeigh) + Case View.SmallIcon : Return GetNullPicture(Settings.MaxSmallImageHeigh) + End Select + End If + Return Nothing + End Function +#End Region +#Region "Separate folder" + Friend Property SeparateVideoFolder As Boolean? + Protected ReadOnly Property SeparateVideoFolderF As Boolean + Get + Return (SeparateVideoFolder.HasValue AndAlso SeparateVideoFolder.Value) OrElse Settings.SeparateVideoFolder.Value + End Get + End Property +#End Region +#Region "Collections support" + Protected _IsCollection As Boolean = False + Protected Friend ReadOnly Property IsCollection As Boolean Implements IUserData.IsCollection + Get + Return _IsCollection + End Get + End Property + Friend Overridable Property CollectionName As String Implements IUserData.CollectionName + Get + Return User.CollectionName + End Get + Set(ByVal NewCollection As String) + ChangeCollectionName(NewCollection, True) + End Set + End Property + Friend ReadOnly Property IncludedInCollection As Boolean Implements IUserData.IncludedInCollection + Get + Return User.IncludedInCollection + End Get + End Property + Friend Overridable Sub ChangeCollectionName(ByVal NewName As String, ByVal UpdateSettings As Boolean) + Dim u As UserInfo = User + u.CollectionName = NewName + u.IncludedInCollection = Not NewName.IsEmptyString + User = u + If UpdateSettings Then Settings.UpdateUsersList(User) + End Sub + Friend Overridable ReadOnly Property Labels As List(Of String) Implements IUserData.Labels +#End Region +#Region "Downloading params" + Protected _DataLoaded As Boolean = False + Protected _DataParsed As Boolean = False + Friend Property ReadyForDownload As Boolean = True Implements IUserData.ReadyForDownload +#End Region +#Region "Content" + Protected ReadOnly _ContentList As List(Of UserMedia) + Protected ReadOnly _ContentNew As List(Of UserMedia) + Protected ReadOnly _ContentForReparse As List(Of UserMedia) + Protected ReadOnly _TempMediaList As List(Of UserMedia) + Protected ReadOnly _TempPostsList As List(Of String) +#End Region +#Region "Files" + Friend Overridable Property MyFile As SFile Implements IUserData.File + Get + Return User.File + End Get + Set(ByVal f As SFile) + User.File = f + Settings.UpdateUsersList(User) + End Set + End Property + Protected MyFileData As SFile + Protected MyFileDataR As SFile + Protected MyFileDataRV As SFile + Protected MyFilePosts As SFile + Friend Overridable Property FileExists As Boolean = False Implements IUserData.FileExists + Friend Overridable Property DataMerging As Boolean + Get + Return User.Merged + End Get + Set(ByVal IsMerged As Boolean) + If Not User.Merged = IsMerged Then + User.Merged = IsMerged + User.UpdateUserFile() + Settings.UpdateUsersList(User) + End If + End Set + End Property +#End Region +#Region "Information" + Protected _CountVideo As Integer = 0 + Protected _CountPictures As Integer = 0 + Friend Overridable Property LastUpdated As Date? + Friend ReadOnly Property TotalContentCount As Integer + Get + Return _CountVideo + _CountPictures + End Get + End Property + Friend Overridable Property HasError As Boolean = False Implements IUserData.HasError + Private _DownloadedPicturesTotal As Integer = 0 + Private _DownloadedPicturesSession As Integer = 0 + Friend Property DownloadedPictures As Integer Implements IUserData.DownloadedPictures + Get + Return _DownloadedPicturesSession + End Get + Set(ByVal NewValue As Integer) + _DownloadedPicturesSession = NewValue + End Set + End Property + Private _DownloadedVideosTotal As Integer = 0 + Private _DownloadedVideosSession As Integer = 0 + Friend Property DownloadedVideos As Integer Implements IUserData.DownloadedVideos + Get + Return _DownloadedVideosSession + End Get + Set(ByVal NewValue As Integer) + _DownloadedVideosSession = NewValue + End Set + End Property + Friend Overridable ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer Implements IUserData.DownloadedTotal + Get + If Total Then + Return _DownloadedPicturesTotal + _DownloadedVideosTotal + Else + Return _DownloadedPicturesSession + _DownloadedVideosSession + End If + End Get + End Property + Friend ReadOnly Property DownloadedInformation As String Implements IUserData.DownloadedInformation + Get + Dim luv$ = String.Empty + If LastUpdated.HasValue Then luv = $"{LastUpdated.Value.ToStringDate(ADateTime.Formats.BaseDateTime)}: " + Return $"{luv}{Name} [{Site}]{IIf(HasError, " (with errors)", String.Empty)}: P - {_DownloadedPicturesTotal}; V - {_DownloadedVideosTotal}" & + $" (P - {_CountPictures}; V - {_CountVideo})" + End Get + End Property +#End Region + Protected ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly) +#End Region +#Region "LVI" + Friend ReadOnly Property LVIKey As String Implements IUserData.LVIKey + Get + If Not _IsCollection Then + Return $"{IIf(Site = Sites.Reddit, "R", "T")}_{Name}" + Else + Return $"CCCC_{CollectionName}" + End If + End Get + End Property + Private _LVIIndex As Integer = -1 + Private ReadOnly Property LVIIndex As Integer Implements IUserData.LVIIndex + Get + Return _LVIIndex + End Get + End Property + Friend Function GetLVI(ByVal Destination As ListView) As ListViewItem Implements IUserData.GetLVI + _LVIIndex = Destination.Items.Count + If Settings.ViewModeIsPicture Then + Return New ListViewItem(ToString(), LVIKey, GetLVIGroup(Destination)) With {.Name = LVIKey, .Tag = LVIKey} + Else + Return New ListViewItem(ToString(), GetLVIGroup(Destination)) With {.Name = LVIKey, .Tag = LVIKey} + End If + End Function + Friend Overridable ReadOnly Property FitToAddParams As Boolean Implements IUserData.FitToAddParams + Get + Select Case Settings.ShowingMode.Value + Case ShowingModes.Regular : Return Not Temporary And Not Favorite + Case ShowingModes.Temporary : Return Temporary + Case ShowingModes.Favorite : Return Favorite + Case ShowingModes.Labels : Return Settings.Labels.CurrentSelection.ListContains(Labels) + Case ShowingModes.NoLabels : Return Labels.Count = 0 + Case Else : Return True + End Select + End Get + End Property + Friend Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup Implements IUserData.GetLVIGroup + Try + If Settings.ShowingMode.Value = ShowingModes.Labels Then + If Labels.Count > 0 And Settings.Labels.CurrentSelection.Count > 0 Then + For i% = 0 To Labels.Count - 1 + If Settings.Labels.CurrentSelection.Contains(Labels(i)) Then Return Destination.Groups.Item(Labels(i)) + Next + Return Destination.Groups.Item(LabelsKeeper.NoLabeledName) + Else + Return Destination.Groups.Item(LabelsKeeper.NoLabeledName) + End If + Else + Return Destination.Groups.Item(GetLviGroupName(Site, Temporary, Favorite, IsCollection)) + End If + Catch ex As Exception + Return Destination.Groups.Item(LabelsKeeper.NoLabeledName) + End Try + End Function + Friend Overridable Function GetUserInformation() As String + Dim OutStr$ = $"User: {Name}" + OutStr.StringAppendLine($"Path: {MyFile.CutPath.Path}") + OutStr.StringAppendLine($"Total downloaded ({TotalContentCount.NumToString(ANumbers.Formats.Number, 3)}):") + OutStr.StringAppendLine($"Pictures: {_CountPictures.NumToString(ANumbers.Formats.Number, 3)}") + OutStr.StringAppendLine($"Videos: {_CountVideo.NumToString(ANumbers.Formats.Number, 3)}") + If Not UserDescription.IsEmptyString Then + OutStr.StringAppendLine(String.Empty) + OutStr.StringAppendLine(UserDescription) + End If + OutStr.StringAppendLine(String.Empty) + OutStr.StringAppendLine($"Last updated at: {AConvert(Of String)(LastUpdated, ADateTime.Formats.BaseDateTime, "not yet")}") + If _DataParsed Then + OutStr.StringAppendLine("Downloaded now:") + OutStr.StringAppendLine($"Pictures: {_CountPictures.NumToString(ANumbers.Formats.Number, 3)}") + OutStr.StringAppendLine($"Videos: {_CountVideo.NumToString(ANumbers.Formats.Number, 3)}") + End If + Return OutStr + End Function +#End Region +#Region "Initializer" + Private ReadOnly _InvokeImageHandler As Boolean + ''' By using this constructor you must set UserName and MyFile manually + Friend Sub New(Optional ByVal InvokeImageHandler As Boolean = True) + _InvokeImageHandler = InvokeImageHandler + _ContentList = New List(Of UserMedia) + _ContentNew = New List(Of UserMedia) + _ContentForReparse = New List(Of UserMedia) + _TempMediaList = New List(Of UserMedia) + _TempPostsList = New List(Of String) + Labels = New List(Of String) + If InvokeImageHandler Then ImageHandler(Me) + End Sub + ''' + Friend Overloads Shared Function GetInstance(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True) As IUserData + Select Case u.Site + Case Sites.Reddit : Return New Reddit.UserData(u, _LoadUserInformation) + Case Sites.Twitter : Return New Twitter.UserData(u, _LoadUserInformation) + Case Else : Throw New ArgumentOutOfRangeException("Site", $"Site [{u.Site}] information does not recognized by loader") + End Select + End Function +#End Region +#Region "Information & Content data files loader and saver" +#Region "User information" + Friend Overridable Sub LoadUserInformation() Implements IUserData.LoadUserInformation + Try + If MyFile.Exists Then + FileExists = True + Using x As New XmlFile(MyFile) With {.XmlReadOnly = True} + x.DefaultsLoading(False) + User.Site = Site + Site = x.Value(Name_Site).FromXML(Of Integer)(0) + User.Name = x.Value(Name_UserName) + ID = x.Value(Name_UserID) + FriendlyName = x.Value(Name_FriendlyName) + UserDescription = x.Value(Name_Description) + ParseUserMediaOnly = x.Value(Name_ParseUserMediaOnly).FromXML(Of Boolean)(False) + Temporary = x.Value(Name_Temporary).FromXML(Of Boolean)(False) + Favorite = x.Value(Name_Favorite).FromXML(Of Boolean)(False) + SeparateVideoFolder = AConvert(Of Boolean)(x.Value(Name_SeparateVideoFolder), Nothing) + ReadyForDownload = x.Value(Name_ReadyForDownload).FromXML(Of Boolean)(True) + _CountVideo = x.Value(Name_VideoCount).FromXML(Of Integer)(0) + _CountPictures = x.Value(Name_PicturesCount).FromXML(Of Integer)(0) + LastUpdated = AConvert(Of Date)(x.Value(Name_LastUpdated), ADateTime.Formats.BaseDateTime, Nothing) + DataMerging = x.Value(Name_DataMerging).FromXML(Of Boolean)(False) + ChangeCollectionName(x.Value(Name_CollectionName), False) + Labels.ListAddList(x.Value(Name_LabelsName).StringToList(Of String, List(Of String))("|", EDP.ReturnValue), LAP.NotContainsOnly, LAP.ClearBeforeAdd) + End Using + UpdateDataFiles() + _DataForReparseExists = MyFileDataR.Exists + End If + Catch ex As Exception + LogError(ex, "user information loading error") + End Try + End Sub + Friend Overridable Sub UpdateUserInformation() Implements IUserData.UpdateUserInformation + Try + MyFile.Exists(SFO.Path) + Using x As New XmlFile With {.Name = "User"} + x.Add(Name_Site, CInt(Site)) + x.Add(Name_UserName, User.Name) + x.Add(Name_UserID, ID) + x.Add(Name_FriendlyName, FriendlyName) + x.Add(Name_Description, UserDescription) + x.Add(Name_ParseUserMediaOnly, ParseUserMediaOnly.BoolToInteger) + x.Add(Name_Temporary, Temporary.BoolToInteger) + x.Add(Name_Favorite, Favorite.BoolToInteger) + If SeparateVideoFolder.HasValue Then + x.Add(Name_SeparateVideoFolder, SeparateVideoFolder.Value.BoolToInteger) + Else + x.Add(Name_SeparateVideoFolder, String.Empty) + End If + x.Add(Name_ReadyForDownload, ReadyForDownload.BoolToInteger) + x.Add(Name_VideoCount, _CountVideo) + x.Add(Name_PicturesCount, _CountPictures) + x.Add(Name_LastUpdated, AConvert(Of String)(LastUpdated, ADateTime.Formats.BaseDateTime, String.Empty)) + x.Add(Name_CollectionName, CollectionName) + x.Add(Name_LabelsName, Labels.ListToString(, "|", EDP.ReturnValue)) + x.Add(Name_DataMerging, DataMerging.BoolToInteger) + + x.Save(MyFile) + End Using + Settings.UpdateUsersList(User) + Catch ex As Exception + LogError(ex, "user information saving error") + End Try + End Sub +#End Region +#Region "User data" + Friend Overridable Overloads Sub LoadContentInformation() + UpdateDataFiles() + LoadContentInformation(_ContentList, MyFileData) + LoadContentInformation(_ContentForReparse, MyFileDataR) + LoadContentInformation(_TempMediaList, MyFileDataRV) + _DataForReparseExists = False + End Sub + Private Overloads Sub LoadContentInformation(ByRef _CLIST As List(Of UserMedia), ByVal f As SFile) + Try + If Not f.Exists Then Exit Sub + Using x As New XmlFile(f, ProtectionLevels.All, False) With {.XmlReadOnly = True, .AllowSameNames = True} + x.LoadData() + x.DefaultsLoading(False) + If x.Count > 0 Then + Dim fs$ = MyFile.CutPath.PathWithSeparator + Dim gfn As Func(Of String, String) = Function(ByVal Input As String) As String + If Input.IsEmptyString Then + Return String.Empty + Else + If Input.Contains("\") Then + Return New SFile(Input).File + Else + Return Input + End If + End If + End Function + For Each v As EContainer In x + _CLIST.Add(New UserMedia With { + .Type = AConvert(Of Integer)(v.Attribute(Name_MediaType).Value, 0), + .URL = v.Attribute(Name_MediaURL).Value, + .URL_BASE = v.Value, + .MD5 = v.Attribute(Name_MediaHash).Value, + .File = fs & gfn.Invoke(v.Attribute(Name_MediaFile).Value), + .Post = New UserPost With { + .ID = v.Attribute(Name_MediaPostID).Value, + .[Date] = AConvert(Of Date)(v.Attribute(Name_MediaPostDate).Value, ParsersDataDateProvider, Nothing)} + }) + Next + End If + _DataLoaded = True + End Using + Catch ex As Exception + LogError(ex, "history loading error") + End Try + End Sub + Friend Sub UpdateContentInformation(ByRef _CLIST As List(Of UserMedia), ByVal f As SFile) + Try + UpdateDataFiles() + If f.IsEmptyString Then Exit Sub + f.Exists(SFO.Path) + Using x As New XmlFile With {.AllowSameNames = True, .Name = "Data"} + If _CLIST.Count > 0 Then + For Each i As UserMedia In _CLIST + x.Add(New EContainer("MediaData", i.URL_BASE, + {New EAttribute(Name_MediaType, CInt(i.Type)), + New EAttribute(Name_MediaURL, i.URL), + New EAttribute(Name_MediaHash, i.MD5), + New EAttribute(Name_MediaFile, i.File.File), + New EAttribute(Name_MediaPostID, i.Post.ID), + New EAttribute(Name_MediaPostDate, AConvert(Of String)(i.Post.Date, ParsersDataDateProvider, String.Empty)) + })) + Next + End If + x.Save(MyFileData) + End Using + Catch ex As Exception + LogError(ex, "history saving error") + End Try + End Sub +#End Region +#End Region +#Region "Open site, folder" + Friend Overridable Sub OpenSite() Implements IContentProvider.OpenSite + Try + Dim URL$ = String.Empty + Select Case Site + Case Sites.Reddit : URL = $"https://www.reddit.com/user/{Name}/" + Case Sites.Twitter : URL = $"https://twitter.com/{Name}" + Case Else : MsgBoxE($"Site [{Site}] opening does not implemented", MsgBoxStyle.Exclamation) + End Select + If Not URL.IsEmptyString Then Process.Start(URL) + Catch ex As Exception + MsgBoxE($"Error on trying to open [{Site}] page of user [{Name}]", MsgBoxStyle.Critical) + End Try + End Sub + Friend Overridable Sub OpenFolder() Implements IUserData.OpenFolder + MyFile.CutPath.Open(SFO.Path, EDP.None) + End Sub +#End Region +#Region "Download functions and options" + Friend Overridable Property DownloadReparseOnly As Boolean = False Implements IUserData.DownloadReparseOnly + Private _DataForReparseExists As Boolean = False + Friend Overridable ReadOnly Property DataForReparseExists As Boolean Implements IUserData.DataForReparseExists + Get + Return _ContentForReparse.Count > 0 Or _DataForReparseExists + End Get + End Property + Friend Overridable Sub DownloadData(ByVal Token As CancellationToken) Implements IContentProvider.DownloadData + Dim Canceled As Boolean = False + Try + UpdateDataFiles() + Dim UpPic As Boolean = Settings.ViewModeIsPicture AndAlso GetPicture(False) Is Nothing + _DownloadedPicturesSession = 0 + _DownloadedVideosSession = 0 + _TempMediaList.Clear() + _TempPostsList.Clear() + + If Not _DataLoaded Then LoadContentInformation() + + If Not DownloadReparseOnly Then + If MyFilePosts.Exists Then _TempPostsList.ListAddList(File.ReadAllLines(MyFilePosts)) + If _ContentList.Count > 0 Then _TempPostsList.ListAddList(_ContentList.Select(Function(u) u.Post.ID), LNC) + Token.ThrowIfCancellationRequested() + DownloadDataF(Token) + Token.ThrowIfCancellationRequested() + End If + + ReparseVideo(Token) + If Token.IsCancellationRequested Then + If Not DownloadReparseOnly Then + If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(c) c.Type = UserMedia.Types.VideoPre) Then + TextSaver.SaveTextToFile((From c As UserMedia In _TempMediaList + Where c.Type = UserMedia.Types.VideoPre + Select c.URL).ListToString(, Environment.NewLine), MyFileDataRV, True,, EDP.SendInLog) + Else + If MyFileDataRV.Exists Then MyFileDataRV.Delete(,,, EDP.SendInLog) + End If + End If + Else + If Not DownloadReparseOnly And _TempPostsList.Count > 0 Then TextSaver.SaveTextToFile(_TempPostsList.ListToString(, Environment.NewLine), MyFilePosts, True,, EDP.None) + _ContentNew.ListAddList(_TempMediaList, LAP.ClearBeforeAdd) + End If + + Dim r% = 0 + Do While r <= 2 And (_ContentNew.Count > 0 Or _ContentForReparse.Count > 0) And Not Token.IsCancellationRequested + DownloadContent(Token) + If _ContentNew.Count > 0 Then + _ContentForReparse.ListAddList(_ContentNew.Where(Function(c) c.State = UState.Tried Or c.State = UState.Unknown), LNC) + _ContentList.ListAddList(_ContentNew.Where(Function(c) c.State = UState.Downloaded), LNC) + End If + If _ContentForReparse.Count > 0 Then _ContentForReparse.RemoveAll(Function(c) _ContentList.Contains(c)) + _ContentNew.Clear() + If _ContentForReparse.Count > 0 Then _ContentNew.ListAddList(_ContentForReparse, LNC) + r += 1 + Loop + + _CountPictures = _ContentList.LongCount(Function(c) c.Type = UserMedia.Types.Picture) + _CountVideo = _ContentList.LongCount(Function(c) c.Type = UserMedia.Types.Video) + If DownloadedPictures + DownloadedVideos > 0 Then + LastUpdated = Now + If Labels.Contains(LabelsKeeper.NoParsedUser) Then Labels.Remove(LabelsKeeper.NoParsedUser) + UpdateContentInformation(_ContentList, MyFileData) + UpdateUserInformation() + End If + If _ContentForReparse.Count > 0 Then UpdateContentInformation(_ContentForReparse, MyFileDataR) + _DownloadedPicturesTotal += _DownloadedPicturesSession + _DownloadedVideosTotal += _DownloadedVideosSession + If UpPic Then Raise_OnPictureUpdated() + Catch oex As OperationCanceledException When Token.IsCancellationRequested + MyMainLOG = $"{Site} - {Name}: downloading canceled" + Canceled = True + Catch ex As Exception + LogError(ex, "downloading data error") + HasError = True + Finally + If Not Canceled Then _DataParsed = True ': LastUpdated = Now + _ContentNew.Clear() + DownloadReparseOnly = False + If _ContentForReparse.Count = 0 And MyFileDataR.Exists Then MyFileDataR.Delete(,,, EDP.SendInLog) + End Try + End Sub + Private Sub UpdateDataFiles() + If Not User.File.IsEmptyString Then + MyFileData = User.File + MyFileData.Name &= "_Data" + MyFileDataR = MyFileData + MyFileDataR.Name &= "_REPARSE" + MyFileDataRV = MyFileData + MyFileDataRV.Name &= "_RVideo" + MyFilePosts = User.File + MyFilePosts.Name &= "_Posts" + MyFilePosts.Extension = "txt" + Else + Throw New ArgumentNullException("User.File", "User file does not detected") + End If + End Sub + Protected MustOverride Sub DownloadDataF(ByVal Token As CancellationToken) + Protected MustOverride Sub ReparseVideo(ByVal Token As CancellationToken) + Protected MustOverride Sub DownloadContent(ByVal Token As CancellationToken) +#End Region +#Region "Delete, Move, Merge" + Friend Overridable Function Delete() As Integer Implements IUserData.Delete + Dim f As SFile = SFile.GetPath(MyFile.CutPath.Path) + If f.Exists(SFO.Path, False) AndAlso f.Delete(SFO.Path, False, False) Then + ImageHandler(Me, False) + Settings.UsersList.Remove(User) + Settings.UpdateUsersList() + Settings.Users.Remove(Me) + Downloader.UserRemove(Me) + Dispose(True) + Return 1 + Else + Return 0 + End If + End Function + Friend Overridable Function MoveFiles(ByVal __CollectionName As String, ByVal _MergeData As Boolean) As Boolean Implements IUserData.MoveFiles + Dim UserBefore As UserInfo = User + Try + Dim f As SFile + Dim Removed As Boolean + If IncludedInCollection Then + Settings.Users.Add(Me) + Removed = False + User.CollectionName = String.Empty + User.IncludedInCollection = False + Else + Settings.Users.Remove(Me) + Removed = True + User.CollectionName = __CollectionName + User.IncludedInCollection = True + End If + User.UpdateUserFile() + f = User.File.CutPath(, EDP.ThrowException) + If f.Exists(SFO.Path, False) Then + If If(SFile.GetFiles(f,, SearchOption.AllDirectories), New List(Of SFile)).Count > 0 AndAlso + MsgBoxE({$"Destination directory [{f.Path}] already exists and contains files!" & vbCr & + "By continuing, this directory and all files will be deleted", + "Destination directory is not empty!"}, MsgBoxStyle.Exclamation,,, {"Delete", "Cancel"}) = 1 Then + MsgBoxE("Operation canceled", MsgBoxStyle.Exclamation) + User = UserBefore + If Removed Then Settings.Users.Add(Me) Else Settings.Users.Remove(Me) + Return False + End If + f.Delete(SFO.Path, False, False, EDP.ThrowException) + End If + f.CutPath.Exists(SFO.Path) + Directory.Move(UserBefore.File.CutPath(, EDP.ThrowException).Path, f.Path) + Settings.UsersList.Remove(UserBefore) + Settings.UpdateUsersList(User) + UpdateUserInformation() + Return True + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Files moving error") + User = UserBefore + Return False + End Try + End Function + Friend Overloads Sub MergeData() + Dim UserBefore As UserInfo = User + Try + If DataMerging Then + Throw New InvalidOperationException($"{Site} - {Name}: data already merged") With {.HelpLink = 1} + Else + Dim files As List(Of SFile) = Nothing + Dim allFiles As List(Of SFile) = Nothing + Dim fSource As SFile, fDest As SFile + Dim ReplacingPath$ = UserBefore.File.CutPath.Path + Dim dirs As List(Of SFile) = SFile.GetDirectories(UserBefore.File.CutPath,, SearchOption.AllDirectories) + Dim FilesMover As Action = Sub() + If files.ListExists Then + For Each fSource In files + fDest = fSource + fDest.Path = User.File.CutPath.PathWithSeparator & fSource.Path.Replace(ReplacingPath, String.Empty) + fDest.Exists(SFO.Path,, EDP.ThrowException) + fDest = CheckFile(fDest, allFiles) + File.Move(fSource, fDest) + Next + files.Clear() + End If + End Sub + DataMerging = True + If dirs.ListExists Then + For Each dir As SFile In dirs + allFiles = SFile.GetFiles(SFile.GetPath(User.File.CutPath.PathWithSeparator & + dir.Path.Replace(ReplacingPath, String.Empty)),,, EDP.ReturnValue) + files = SFile.GetFiles(dir,,, EDP.ReturnValue) + FilesMover.Invoke + Next + End If + allFiles = SFile.GetFiles(User.File.CutPath,,, EDP.ReturnValue) + + files = SFile.GetFiles(UserBefore.File.CutPath,,, EDP.ReturnValue) + FilesMover.Invoke + If SFile.GetFiles(UserBefore.File.CutPath,, SearchOption.AllDirectories, + New ErrorsDescriber(False, False, False, New List(Of SFile))).Count = 0 Then + UserBefore.File.CutPath.Delete(SFO.Path, False, False, EDP.SendInLog) + End If + UpdateUserInformation() + End If + Catch ex As Exception + LogError(ex, "[UserDataBase.MergeData]") + End Try + End Sub + Private Function CheckFile(ByVal f As SFile, ByRef List As IEnumerable(Of SFile)) As SFile + If List.ListExists Then + Dim p As New RegexStructure(".+?\s{0,1}\((\d+)\)|.+",,,,,,, String.Empty, EDP.ReturnValue) + Dim i% = List.Where(Function(ff) CStr(RegexReplace(ff.Name, p)).Trim.ToLower = f.Name.Trim.ToLower).Count + If i > 0 Then f.Name &= $" ({i + 1})" + End If + Return f + End Function +#End Region +#Region "Errors functions" + Protected Sub LogError(ByVal ex As Exception, ByVal Message As String) + ErrorsDescriber.Execute(EDP.SendInLog, ex, $"{IIf(IncludedInCollection, $"{CollectionName}-", String.Empty)}{Site} - {Name}: {Message}") + End Sub + Protected Sub ErrorDownloading(ByVal f As SFile, ByVal URL As String) + If Not f.Exists Then MyMainLOG = $"Error downloading from [{URL}] to [{f}]" + End Sub +#End Region + Public Overrides Function ToString() As String + If Settings.ViewModeIsPicture Then + If IsCollection Then + Return CollectionName + Else + Return IIf(FriendlyName.IsEmptyString, Name, FriendlyName) + End If + Else + Dim t$ = String.Empty + If Temporary Then + t = " (T)" + ElseIf Favorite Then + t = " (F)" + End If + If IsCollection Then + Return $"Collection [{CollectionName}]{t}" + Else + Return $"[{Site}]{t} {IIf(FriendlyName.IsEmptyString, Name, FriendlyName)}" + End If + End If + End Function +#Region "Buttons actions" + Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click + Downloader.Add(Me) + End Sub + Private Sub BTT_CONTEXT_EDIT_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_EDIT.Click + Using f As New Editors.UserCreatorForm(Me) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then UpdateUserInformation() + End Using + End Sub + Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DELETE.Click + End Sub + Private Sub BTT_CONTEXT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_PATH.Click + OpenFolder() + End Sub + Private Sub BTT_CONTEXT_OPEN_SITE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_SITE.Click + OpenSite() + End Sub +#End Region +#Region "IComparable Support" + Friend Overridable Function CompareTo(ByVal Other As UserDataBase) As Integer Implements IComparable(Of UserDataBase).CompareTo + Dim x% = CompareValue(Me) + Dim y% = CompareValue(Other) + If x.CompareTo(y) = 0 Then + Return Name.CompareTo(Other.Name) + Else + Return x.CompareTo(y) + End If + End Function + Protected Function CompareValue(ByVal x As UserDataBase) As Integer + Dim OutValue% = CInt(x.Site) * 10000 + If x.IsCollection Then OutValue -= 1000 + If x.Temporary Then OutValue += 2000 + If x.Favorite Then OutValue -= 500 + Return OutValue + End Function + Friend Overridable Function CompareTo(ByVal Obj As Object) As Integer Implements IComparable.CompareTo + Return CompareTo(DirectCast(Obj, UserDataBase)) + End Function +#End Region +#Region "IEquatable Support" + Friend Overridable Overloads Function Equals(ByVal Other As UserDataBase) As Boolean Implements IEquatable(Of UserDataBase).Equals + Return Site = Other.Site And Name = Other.Name + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(DirectCast(Obj, UserDataBase)) + End Function +#End Region +#Region "IDisposable Support" + Protected disposedValue As Boolean = False + Friend ReadOnly Property Disposed As Boolean + Get + Return disposedValue + End Get + End Property + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + _ContentList.Clear() + _ContentNew.Clear() + _TempMediaList.Clear() + _TempPostsList.Clear() + If Not BTT_CONTEXT_DOWN Is Nothing Then BTT_CONTEXT_DOWN.Dispose() + If Not BTT_CONTEXT_EDIT Is Nothing Then BTT_CONTEXT_EDIT.Dispose() + If Not BTT_CONTEXT_DELETE Is Nothing Then BTT_CONTEXT_DELETE.Dispose() + If Not BTT_CONTEXT_OPEN_PATH Is Nothing Then BTT_CONTEXT_OPEN_PATH.Dispose() + If Not BTT_CONTEXT_OPEN_SITE Is Nothing Then BTT_CONTEXT_OPEN_SITE.Dispose() + If _InvokeImageHandler Then ImageHandler(Me, False) + End If + disposedValue = True + End If + End Sub + Protected Overloads Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class + Friend Interface IContentProvider + Property Site As Sites + Property Name As String + Property ID As String + Property FriendlyName As String + Property Description As String + Property Favorite As Boolean + Property Temporary As Boolean + Sub OpenSite() + Sub DownloadData(ByVal Token As CancellationToken) + End Interface + Friend Interface IUserData : Inherits IContentProvider, IComparable(Of UserDataBase), IComparable, IEquatable(Of UserDataBase), IDisposable + Event OnPictureUpdated(ByVal User As IUserData) + Property ParseUserMediaOnly As Boolean +#Region "Images" + Function GetPicture() As Image + Sub SetPicture(ByVal f As SFile) +#End Region +#Region "Collection support" + ReadOnly Property IsCollection As Boolean + Property CollectionName As String + ReadOnly Property IncludedInCollection As Boolean + ReadOnly Property Labels As List(Of String) +#End Region + ReadOnly Property IsChannel As Boolean + Property ReadyForDownload As Boolean + Property [File] As SFile + Property FileExists As Boolean + Property DownloadedPictures As Integer + Property DownloadedVideos As Integer + ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer + ReadOnly Property DownloadedInformation As String + Property HasError As Boolean + ReadOnly Property FitToAddParams As Boolean + ReadOnly Property LVIKey As String + ReadOnly Property LVIIndex As Integer + Function GetLVI(ByVal Destination As ListView) As ListViewItem + Function GetLVIGroup(ByVal Destination As ListView) As ListViewGroup + Sub LoadUserInformation() + Sub UpdateUserInformation() + ''' + ''' 0 - Nothing removed
+ ''' 1 - User removed
+ ''' 2 - Collection removed
+ ''' 3 - Collection splitted + '''
+ Function Delete() As Integer + Function MoveFiles(ByVal CollectionName As String, ByVal MergeData As Boolean) As Boolean + Sub OpenFolder() + Property DownloadReparseOnly As Boolean + ReadOnly Property DataForReparseExists As Boolean + ReadOnly Property Self As IUserData + End Interface + Friend Interface IChannelLimits + Property AutoGetLimits As Boolean + Property DownloadLimitCount As Integer? + Property DownloadLimitPost As String + Property DownloadLimitDate As Date? + Overloads Sub SetLimit(Optional ByVal Post As String = "", Optional ByVal Count As Integer? = Nothing, Optional ByVal [Date] As Date? = Nothing) + Overloads Sub SetLimit(ByVal Source As IChannelLimits) + End Interface + Friend Interface IChannelData : Inherits IContentProvider, IChannelLimits + Property SkipExistsUsers As Boolean + Property SaveToCache As Boolean + End Interface +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/Channel.vb b/SCrawler/API/Reddit/Channel.vb new file mode 100644 index 0000000..7d66fce --- /dev/null +++ b/SCrawler/API/Reddit/Channel.vb @@ -0,0 +1,304 @@ +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Functions.XML +Imports SCrawler.API.Base +Namespace API.Reddit + Friend Class Channel : Implements ICollection(Of UserPost), IEquatable(Of Channel), IComparable(Of Channel), + IRangeSwitcherContainer(Of UserPost), ILoaderSaver, IMyEnumerator(Of UserPost), IChannelLimits, IDisposable +#Region "XML Nodes' Names" + Private Const Name_Name As String = "Name" + Private Const Name_ID As String = "ID" + Private Const Name_Date As String = "Date" + Private Const Name_PostsNode As String = "Posts" +#End Region + Friend Const DefaultDownloadLimitCount As Integer = 1000 + Friend Property Name As String = String.Empty + Friend Property ID As String = String.Empty + Friend ReadOnly Property CUser As UserInfo + Get + Return New UserInfo(Me) + End Get + End Property + Friend ReadOnly Property PostsLatest As List(Of UserPost) + Friend ReadOnly Property Posts As List(Of UserPost) + Friend ReadOnly Property PostsAll As List(Of UserPost) + Get + Return ListAddList(Nothing, Posts).ListAddList(PostsLatest).ListSort + End Get + End Property + Private ReadOnly Property Source As IEnumerable(Of UserPost) Implements IRangeSwitcherContainer(Of UserPost).Source + Get + Return Posts + End Get + End Property + Friend Property LatestParsedDate As Date? = Nothing + Private _Downloading As Boolean = False + Friend ReadOnly Property Downloading As Boolean + Get + Return _Downloading + End Get + End Property + Friend ReadOnly Property File As SFile + Get + Return $"{ChannelsCollection.ChannelsPath.PathWithSeparator}{ID}.xml" + End Get + End Property + Friend ReadOnly Property CachePath As SFile + Get + Return $"{ChannelsCollection.ChannelsPathCache.PathWithSeparator}{ID}\" + End Get + End Property + Friend ReadOnly Property Count As Integer Implements ICollection(Of UserPost).Count, IMyEnumerator(Of UserPost).MyEnumeratorCount + Get + Return Posts.Count + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As UserPost Implements IMyEnumerator(Of UserPost).MyEnumeratorObject + Get + Return Posts(Index) + End Get + End Property + Private ReadOnly Property Range As RangeSwitcher(Of UserPost) +#Region "Limits Support" + Private _DownloadLimitCount As Integer? = Nothing + Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Get + If AutoGetLimits Then + If LatestParsedDate.HasValue OrElse Not DownloadLimitPost.IsEmptyString Then + Return Nothing + ElseIf _DownloadLimitCount.HasValue Then + Return _DownloadLimitCount + Else + Return DefaultDownloadLimitCount + End If + Else + Return _DownloadLimitCount + End If + End Get + Set(ByVal NewLimit As Integer?) + _DownloadLimitCount = NewLimit + End Set + End Property + Private _DownloadLimitPost As String = String.Empty + Friend Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Get + Dim PID$ = ListAddList(Nothing, Posts, LAP.NotContainsOnly).ListAddList(PostsLatest, LAP.NotContainsOnly).ListSort.FirstOrDefault.ID + If AutoGetLimits And Not PID.IsEmptyString Then + Return PID + Else + Return _DownloadLimitPost + End If + End Get + Set(ByVal NewLimit As String) + _DownloadLimitPost = NewLimit + End Set + End Property + Private _DownloadLimitDate As Date? = Nothing + Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Get + If AutoGetLimits And LatestParsedDate.HasValue Then + Return LatestParsedDate + Else + Return _DownloadLimitDate + End If + End Get + Set(ByVal NewLimit As Date?) + _DownloadLimitDate = NewLimit + End Set + End Property + Friend Overloads Sub SetLimit(Optional ByVal MaxPost As String = "", Optional ByVal MaxCount As Integer? = Nothing, + Optional ByVal MinDate As Date? = Nothing) Implements IChannelLimits.SetLimit + DownloadLimitPost = MaxPost + DownloadLimitCount = MaxCount + DownloadLimitDate = MinDate + End Sub + Friend Overloads Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + With Source + DownloadLimitCount = .DownloadLimitCount + DownloadLimitPost = .DownloadLimitPost + DownloadLimitDate = .DownloadLimitDate + AutoGetLimits = .AutoGetLimits + End With + End Sub + Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits +#End Region + Friend Sub New() + Posts = New List(Of UserPost) + PostsLatest = New List(Of UserPost) + Range = New RangeSwitcher(Of UserPost)(Me) + End Sub + Friend Sub New(ByVal f As SFile) + Me.New + LoadData(f, False) + End Sub + Public Shared Widening Operator CType(ByVal f As SFile) As Channel + Return New Channel(f) + End Operator + Public Overrides Function ToString() As String + If Not Name.IsEmptyString Then + Return Name + Else + Return ID + End If + End Function + Friend Sub Delete() + If File.Exists Then File.Delete() + End Sub + Friend Sub DownloadData(ByVal Token As Threading.CancellationToken, Optional ByVal SkipExists As Boolean = True, + Optional ByVal p As MyProgress = Nothing) + Try + _Downloading = True + Using d As New UserData(CUser, False, False) With { + .Progress = p, + .SaveToCache = True, + .SkipExistsUsers = SkipExists, + .ChannelInfo = Me + } + d.SetLimit(Me) + d.DownloadData(Token) + Posts.ListAddList(d.GetNewChannelPosts(), LAP.NotContainsOnly) + Posts.Sort() + LatestParsedDate = If(Posts.FirstOrDefault(Function(pp) pp.Date.HasValue).Date, LatestParsedDate) + Token.ThrowIfCancellationRequested() + End Using + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Finally + _Downloading = False + End Try + End Sub +#Region "ICollection Support" + Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of UserPost).IsReadOnly + Friend Sub Add(ByVal _Item As UserPost) Implements ICollection(Of UserPost).Add + If Not Contains(_Item) Then Posts.Add(_Item) + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of UserPost)) + If _Items.ListExists Then + For Each i As UserPost In _Items : Add(i) : Next + End If + End Sub + Friend Sub Clear() Implements ICollection(Of UserPost).Clear + Posts.Clear() + End Sub + Friend Function Contains(ByVal _Item As UserPost) As Boolean Implements ICollection(Of UserPost).Contains + Return Count > 0 AndAlso Posts.Contains(_Item) + End Function + Private Sub CopyTo(ByVal _Array() As UserPost, ByVal ArrayIndex As Integer) Implements ICollection(Of UserPost).CopyTo + Throw New NotImplementedException() + End Sub + Friend Function Remove(ByVal _Item As UserPost) As Boolean Implements ICollection(Of UserPost).Remove + Return Posts.Remove(_Item) + End Function +#End Region +#Region "IEnumerable Support" + Friend Function GetEnumerator() As IEnumerator(Of UserPost) Implements IEnumerable(Of UserPost).GetEnumerator + Return New MyEnumerator(Of UserPost)(Me) + End Function + Friend Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IEquatable Support" + Friend Overloads Function Equals(ByVal Other As Channel) As Boolean Implements IEquatable(Of Channel).Equals + Return ID = Other.ID + End Function + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + If Not Obj Is Nothing Then + If TypeOf Obj Is String Then + Return ID = CStr(Obj) + Else + Return Equals(DirectCast(Obj, Channel)) + End If + Else + Return False + End If + End Function +#End Region +#Region "IComparable Support" + Friend Function CompareTo(ByVal Other As Channel) As Integer Implements IComparable(Of Channel).CompareTo + If Not Name.IsEmptyString And Not Other.Name.IsEmptyString Then + Return Name.CompareTo(Other.Name) + Else + Return ID.CompareTo(Other.ID) + End If + End Function +#End Region +#Region "IXMLContainer Support" + Friend Overloads Function LoadData(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Load + Return LoadData(File, False, e) + End Function + Friend Overloads Function LoadData(ByVal f As SFile, ByVal PartialLoad As Boolean, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean + If f.Exists Then + Using x As New XmlFile(f, ProtectionLevels.All, False) With {.XmlReadOnly = True, .AllowSameNames = True} + x.LoadData() + x.DefaultsLoading(False) + If x.Count > 0 Then + Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Name = x.Value(Name_Name) + ID = x.Value(Name_ID) + LatestParsedDate = AConvert(Of Date)(x.Value(Name_Date), XMLDateProvider, Nothing) + If Not PartialLoad Then + With x(Name_PostsNode).XmlIfNothing + If .Count > 0 Then .ForEach(Sub(ee) PostsLatest.Add(New UserPost With { + .ID = ee.Attribute(Name_ID), + .[Date] = AConvert(Of Date)(ee.Attribute(Name_Date).Value, XMLDateProvider, Nothing)})) + End With + End If + End If + End Using + End If + Return True + End Function + Friend Overloads Function Save(Optional ByVal f As SFile = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Boolean Implements ILoaderSaver.Save + Dim XMLDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Using x As New XmlFile With {.AllowSameNames = True, .Name = "Channel"} + x.DefaultsLoading(False) + x.Add(Name_Name, Name) + x.Add(Name_ID, ID) + If Posts.Count > 0 Or PostsLatest.Count > 0 Then + Dim tmpPostList As List(Of UserPost) = Nothing + tmpPostList.ListAddList(Posts).ListAddList(PostsLatest) + tmpPostList.Sort() + LatestParsedDate = tmpPostList.FirstOrDefault(Function(pd) pd.Date.HasValue).Date + x.Add(Name_Date, AConvert(Of String)(LatestParsedDate, XMLDateProvider, String.Empty)) + x.Add(Name_PostsNode, String.Empty) + With x(Name_PostsNode) + tmpPostList.Take(200).ToList.ForEach(Sub(p) .Add(New EContainer("Post", + String.Empty, + { + New EAttribute(Name_ID, p.ID), + New EAttribute(Name_Date, AConvert(Of String)(p.Date, XMLDateProvider, String.Empty)) + }) + ) + ) + End With + tmpPostList.Clear() + End If + x.Save(File) + End Using + Return True + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + Posts.Clear() + PostsLatest.Clear() + Range.Dispose() + If CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, False, False, EDP.SendInLog) + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/ChannelsCollection.vb b/SCrawler/API/Reddit/ChannelsCollection.vb new file mode 100644 index 0000000..d2fe219 --- /dev/null +++ b/SCrawler/API/Reddit/ChannelsCollection.vb @@ -0,0 +1,141 @@ +Imports PersonalUtilities.Tools +Imports PersonalUtilities.Forms.Toolbars +Imports SCrawler.API.Base +Imports System.Threading +Namespace API.Reddit + Friend Class ChannelsCollection : Implements ICollection(Of Channel), IMyEnumerator(Of Channel), IChannelLimits, IDisposable + Friend Shared ReadOnly Property ChannelsPath As SFile = $"{SettingsFolderName}\Channels\" + Friend Shared ReadOnly Property ChannelsPathCache As SFile = $"{Settings.GlobalPath.Value.PathWithSeparator}_CachedData\" + Private ReadOnly Channels As List(Of Channel) + Friend ReadOnly Property Downloading As Boolean + Get + If Count > 0 Then + Return Channels.Exists(Function(c) c.Downloading) + Else + Return False + End If + End Get + End Property +#Region "Limits Support" + Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Private Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Friend Overloads Sub SetLimit(Optional ByVal MaxPost As String = "", Optional ByVal MaxCount As Integer? = Nothing, + Optional ByVal MinDate As Date? = Nothing) Implements IChannelLimits.SetLimit + 'DownloadLimitPost = MaxPost + DownloadLimitCount = MaxCount + DownloadLimitDate = MinDate + End Sub + Friend Overloads Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + With Source + DownloadLimitCount = .DownloadLimitCount + DownloadLimitDate = .DownloadLimitDate + AutoGetLimits = .AutoGetLimits + End With + End Sub + Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits +#End Region + Friend Sub New() + Channels = New List(Of Channel) + End Sub + Friend Sub Load() + If ChannelsPath.Exists(SFO.Path, False) Then + Dim files As List(Of SFile) = SFile.GetFiles(ChannelsPath, "*.xml") + If files.ListExists Then files.ForEach(Sub(f) Add(f)) + End If + End Sub + Friend Sub Update() + If Count > 0 Then Channels.ForEach(Sub(c) c.Save()) + End Sub + Friend ReadOnly Property Count As Integer Implements ICollection(Of Channel).Count, IMyEnumerator(Of Channel).MyEnumeratorCount + Get + Return Channels.Count + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As Channel Implements IMyEnumerator(Of Channel).MyEnumeratorObject + Get + Return Channels(Index) + End Get + End Property + ''' + Friend ReadOnly Property Find(ByVal ChannelID As String) As Channel + Get + If Count > 0 Then + For i% = 0 To Count - 1 + If Item(i).ID = ChannelID Then Return Item(i) + Next + End If + Throw New ArgumentException($"Channel ID [{ChannelID}] does not found in channels collection", "ChannelID") With {.HelpLink = 1} + 'Return Nothing + End Get + End Property + Friend Sub DownloadData(ByVal Token As CancellationToken, Optional ByVal SkipExists As Boolean = True, + Optional ByVal p As MyProgress = Nothing) + Try + If Count > 0 Then + Dim t As New List(Of Task) + For Each c As Channel In Channels + If Not c.Downloading Then t.Add(Task.Run(Sub() + c.SetLimit(Me) + c.DownloadData(Token, SkipExists, p) + End Sub)) + Next + If t.Count > 0 Then Task.WaitAll(t.ToArray) + Token.ThrowIfCancellationRequested() + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + End Try + End Sub +#Region "ICollection Support" + Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of Channel).IsReadOnly + Friend Sub Add(ByVal _Item As Channel) Implements ICollection(Of Channel).Add + If Not Contains(_Item) Then Channels.Add(_Item) + End Sub + Friend Sub Clear() Implements ICollection(Of Channel).Clear + Channels.ListClearDispose + End Sub + Private Sub CopyTo(ByVal _Array() As Channel, ByVal ArrayIndex As Integer) Implements ICollection(Of Channel).CopyTo + Throw New NotImplementedException() + End Sub + Friend Function Contains(ByVal _Item As Channel) As Boolean Implements ICollection(Of Channel).Contains + Return Count > 0 AndAlso Channels.Contains(_Item) + End Function + Friend Function Remove(ByVal _Item As Channel) As Boolean Implements ICollection(Of Channel).Remove + If Count > 0 Then + Dim i% = Channels.IndexOf(_Item) + If i >= 0 Then + With Channels(i) : .Delete() : .Dispose() : End With + Channels.RemoveAt(i) + Return True + End If + End If + Return False + End Function +#End Region +#Region "IEnumerable Support" + Friend Function GetEnumerator() As IEnumerator(Of Channel) Implements IEnumerable(Of Channel).GetEnumerator + Return New MyEnumerator(Of Channel)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Update() : Clear() + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/Declarations.vb b/SCrawler/API/Reddit/Declarations.vb new file mode 100644 index 0000000..7016975 --- /dev/null +++ b/SCrawler/API/Reddit/Declarations.vb @@ -0,0 +1,33 @@ +Imports PersonalUtilities.Functions.XML.Base +Namespace API.Reddit + Friend Module Declarations + Friend ReadOnly JsonNodesJson() As NodeParams = {New NodeParams("posts", True, True, True, True, 3)} + Friend ReadOnly ChannelJsonNodes() As NodeParams = {New NodeParams("data", True, True, True, True, 1), + New NodeParams("children", True, True, True)} + Friend ReadOnly UrlBasePattern As New RegexStructure("(?<=/)([^/]+?\.[\w]{3,4})(?=(\?|\Z))", True, False) + Friend ReadOnly VideoRegEx As New RegexStructure("http.{0,1}://[^" & Chr(34) & "]+?mp4", True, False) + Friend ReadOnly DateProvider As New JsonDate + Friend ReadOnly DateProviderChannel As New JsonDateChannel + Private ReadOnly EUR_PROVIDER As New ANumbers(ANumbers.Modes.EUR) + Friend Class JsonDate : Implements ICustomProvider + ''' + Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, + Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert + Return ADateTime.ParseUnicodeJS(Value, NothingArg, e) + End Function + Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat + Throw New NotImplementedException("GetFormat does not available in this context") + End Function + End Class + Friend Class JsonDateChannel : Implements ICustomProvider + ''' + Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, + Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert + Return ADateTime.ParseUnicode(AConvert(Of Integer)(Value, EUR_PROVIDER, Value), NothingArg, e) + End Function + Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat + Throw New NotImplementedException("GetFormat does not available in this context") + End Function + End Class + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/M3U8.vb b/SCrawler/API/Reddit/M3U8.vb new file mode 100644 index 0000000..71d60d8 --- /dev/null +++ b/SCrawler/API/Reddit/M3U8.vb @@ -0,0 +1,100 @@ +Imports System.Net +Imports SCrawler.API.Reddit.M3U8_Declarations +Imports PersonalUtilities.Tools.WEB +Namespace API.Reddit.M3U8_Declarations + Friend Module M3U8_Declarations + Friend ReadOnly BaseUrlPattern As New RegexStructure("([htps:/]{7,8}.+?/.+?)(?=/)", True, False,,,,,, EDP.ReturnValue) + Friend ReadOnly PlayListRegEx_1 As New RegexStructure("(#EXT-X-STREAM-INF)(.+)(RESOLUTION=)(\d+)(.+?[\r\n]{1,2})(.+?)([\r\n]{1,2})", True, False,,, + RegexReturn.List,, New List(Of String), + New ErrorsDescriber(False, False, True, New List(Of String))) + Friend ReadOnly PlayListRegEx_2 As New RegexStructure("(?<=#EXT-X-BYTERANGE.+?[\r\n]{1,2})(.+)(?=[\r\n]{0,2})", True, False,,, RegexReturn.List,, + New List(Of String), + New ErrorsDescriber(False, False, True, New List(Of String))) + Friend ReadOnly DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue) + End Module +End Namespace +Namespace API.Reddit + Friend NotInheritable Class M3U8 + Private Sub New() + End Sub + Private Structure Resolution : Implements IRegExCreator, IComparable(Of Resolution) + Friend File As String + Friend Resolution As Integer + Friend Function CreateFromArray(ByVal ParamsArray() As String) As IRegExCreator Implements IRegExCreator.CreateFromArray + If ParamsArray.ArrayExists Then + File = ParamsArray(0) + If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), 0) + End If + Return Me + End Function + Friend Function CompareTo(ByVal Other As Resolution) As Integer Implements IComparable(Of Resolution).CompareTo + Return Resolution.CompareTo(Other.Resolution) * -1 + End Function + End Structure + Private Shared Function GetPlaylistUrls(ByVal PlayListURL As String, ByVal BaseUrl As String) As List(Of String) + Try + If Not BaseUrl.IsEmptyString Then + Using w As New WebClient + Dim r$ = w.DownloadString(PlayListURL) + If Not r.IsEmptyString Then + Dim l As List(Of Resolution) = RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4}) + If l.ListExists Then + l.Sort() + Dim pls$ = $"{BaseUrl}/{l.First.File}" + r = w.DownloadString(pls) + If Not r.IsEmptyString Then + Dim lp As New ListAddParams(LAP.NotContainsOnly) With { + .Converter = Function(input) $"{BaseUrl}/{input}", + .e = New ErrorsDescriber(False, False, True, New List(Of String))} + Return ListAddList(Of String, List(Of String))(Nothing, DirectCast(RegexReplace(r, PlayListRegEx_2), List(Of String)), lp).ListIfNothing + End If + End If + End If + End Using + End If + Return New List(Of String) + Catch ex As Exception + Return ErrorsDescriber.Execute(DPED, ex, "[M3U8.GetPlaylistUrls]", New List(Of String)) + End Try + End Function + Private Shared Function Save(ByVal URLs As List(Of String), ByVal f As SFile) As SFile + Dim CachePath As SFile = Nothing + Try + If URLs.ListExists Then + Dim ConcatFile As SFile = f + ConcatFile.Name = "PlayListFile" + ConcatFile.Extension = "mp4" + CachePath = $"{f.PathWithSeparator}_Cache\{SFile.GetDirectories($"{f.PathWithSeparator}_Cache\",,, EDP.ReturnValue).ListIfNothing.Count + 1}\" + If CachePath.Exists(SFO.Path) Then + Dim p As New SFileNumbers(ConcatFile.Name,,, New ANumbers(ANumbers.Modes.USA) With {.GroupSeparator = String.Empty, .FormatMode = ANumbers.Formats.General}) + ConcatFile = SFile.Indexed_IndexFile(ConcatFile,, p, EDP.ReturnValue) + Dim i% + Dim eFiles As New List(Of SFile) + Dim dFile As SFile = CachePath + dFile.Extension = New SFile(URLs(0)).Extension + If dFile.Extension.IsEmptyString Then dFile.Extension = "ts" + Using w As New WebClient + For i = 0 To URLs.Count - 1 + dFile.Name = $"ConPart_{i}" + w.DownloadFile(URLs(i), dFile) + eFiles.Add(dFile) + Next + End Using + f = FFMPEG.ConcatenateFiles(eFiles, "ffmpeg.exe", ConcatFile, p, DPED) + eFiles.Clear() + Return f + End If + End If + Return Nothing + Catch ex As Exception + Return ErrorsDescriber.Execute(DPED, ex, "[M3U8.Save]", New SFile) + Finally + If Not CachePath.IsEmptyString AndAlso CachePath.Exists(SFO.Path, False) Then CachePath.Delete(SFO.Path, False, False, DPED) + End Try + End Function + Friend Shared Function Download(ByVal URL As String, ByVal f As SFile) As SFile + Dim BaseUrl$ = RegexReplace(URL, BaseUrlPattern) + Return Save(GetPlaylistUrls(URL, BaseUrl), f) + End Function + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Reddit/UserData.vb b/SCrawler/API/Reddit/UserData.vb new file mode 100644 index 0000000..1bba813 --- /dev/null +++ b/SCrawler/API/Reddit/UserData.vb @@ -0,0 +1,468 @@ +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Tools.ImageRenderer +Imports PersonalUtilities.Tools.WebDocuments.JSON +Imports System.Net +Imports System.Threading +Imports SCrawler.API.Base +Imports UStates = SCrawler.API.Base.UserMedia.States +Imports UTypes = SCrawler.API.Base.UserMedia.Types +Namespace API.Reddit + Friend Class UserData : Inherits UserDataBase : Implements IChannelData + Friend Overrides Property Site As Sites = Sites.Reddit +#Region "Channels Support" +#Region "IChannelLimits Support" + Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Friend Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Friend Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Friend Overloads Sub SetLimit(Optional ByVal MaxPost As String = "", Optional ByVal MaxCount As Integer? = Nothing, + Optional ByVal MinDate As Date? = Nothing) Implements IChannelLimits.SetLimit + DownloadLimitPost = MaxPost + DownloadLimitCount = MaxCount + DownloadLimitDate = MinDate + End Sub + Friend Overloads Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + With Source + DownloadLimitCount = .DownloadLimitCount + DownloadLimitPost = .DownloadLimitPost + DownloadLimitDate = .DownloadLimitDate + AutoGetLimits = .AutoGetLimits + End With + End Sub + Friend Property AutoGetLimits As Boolean = True Implements IChannelLimits.AutoGetLimits +#End Region + Friend Property ChannelInfo As Channel + Private ReadOnly ChannelPostsNames As New List(Of String) + Friend Property SkipExistsUsers As Boolean = True Implements IChannelData.SkipExistsUsers + Private ReadOnly _ExistsUsersNames As List(Of String) + Friend Property SaveToCache As Boolean = False Implements IChannelData.SaveToCache + Friend Function GetNewChannelPosts() As IEnumerable(Of UserPost) + If _ContentNew.Count > 0 Then Return (From c As UserMedia In _ContentNew + Where Not c.Post.CachedFile.IsEmptyString And c.State = UStates.Downloaded + Select c.Post) Else Return Nothing + End Function +#End Region + Private _Progress As MyProgress + Friend Property Progress As MyProgress + Get + If _Progress Is Nothing Then Return MainProgress Else Return _Progress + End Get + Set(ByVal p As MyProgress) + _Progress = p + End Set + End Property +#Region "Initializers" + ''' Video downloader initializer + Private Sub New() + End Sub + ''' Default initializer + Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True, Optional ByVal InvokeImageHandler As Boolean = True) + MyBase.New(InvokeImageHandler) + ChannelPostsNames = New List(Of String) + _ExistsUsersNames = New List(Of String) + User = u + If _LoadUserInformation Then LoadUserInformation() + End Sub +#End Region +#Region "Download Overrides" + Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) + If IsChannel Then + ChannelPostsNames.ListAddList(ChannelInfo.PostsAll.Select(Function(p) p.ID), LNC) + If SkipExistsUsers Then _ExistsUsersNames.ListAddList(Settings.UsersList.Select(Function(p) p.Name), LNC) + DownloadDataF(Token) + ReparseVideo(Token) + _ContentNew.ListAddList(_TempMediaList, LAP.ClearBeforeAdd) + DownloadContent(Token) + Else + MyBase.DownloadData(Token) + End If + End Sub + Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + If IsChannel Then + _DownloadedChannelPosts = 0 + DownloadDataChannel(String.Empty, Token) + Else + DownloadDataUser(String.Empty, Token) + End If + End Sub +#End Region +#Region "Download Functions (User, Channel)" + Private Sub DownloadDataUser(ByVal POST As String, ByVal Token As CancellationToken) + Dim URL$ = String.Empty + Try + Dim PostID$ = String.Empty + Dim PostDate$ + Dim n As EContainer, nn As EContainer, s As EContainer + Dim NewPostDetected As Boolean = False + Dim ExistsDetected As Boolean = False + Dim _ItemsBefore% + Dim added As Boolean + Dim __ItemType$ + Dim tmpType As UTypes + Dim CheckNode As Predicate(Of EContainer) = Function(e) e("author").XmlIfNothingValue("/").ToLower.Equals(Name.ToLower) + Dim UPicType As Func(Of String, UTypes) = Function(input) IIf(input = "image", UTypes.Picture, UTypes.GIF) + + URL = $"https://gateway.reddit.com/desktopapi/v1/user/{Name}/posts?rtj=only&allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic" + Token.ThrowIfCancellationRequested() + Dim r$ = GetSiteResponse(URL) + If Not r.IsEmptyString Then + Using w As EContainer = JsonDocument.Parse(r) + If w.Count > 0 Then + n = w.GetNode(JsonNodesJson) + If Not n Is Nothing AndAlso n.Count > 0 Then + For Each nn In n + Token.ThrowIfCancellationRequested() + If nn.Count > 0 Then + PostID = nn.Name + If PostID.IsEmptyString AndAlso nn.Contains("id") Then PostID = nn("id").Value + If nn.Contains("created") Then PostDate = nn("created").Value Else PostDate = String.Empty + If Not _TempPostsList.Contains(PostID) Then + NewPostDetected = True + _TempPostsList.Add(PostID) + Else + ExistsDetected = True + Continue For + End If + If CheckNode(nn) Then + _ItemsBefore = _TempMediaList.Count + added = True + s = nn.ItemF({"source", "url"}) + If s.XmlIfNothingValue("/").Contains("redgifs.com") Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, s.Value, PostID, PostDate,, IsChannel), LNC) + Else + s = nn.ItemF({"media"}).XmlIfNothing + __ItemType = s("type").XmlIfNothingValue + Select Case __ItemType + Case "gallery" : DownloadGallery(s, PostID, PostDate) + Case "image", "gifvideo" + If s.Contains("content") Then _ + _TempMediaList.ListAddValue(MediaFromData(UPicType(__ItemType), s.Value("content"), + PostID, PostDate,, IsChannel), LNC) + Case "video" + If s("hlsUrl").XmlIfNothingValue("/").ToLower.Contains("m3u8") Then _ + _TempMediaList.ListAddValue(MediaFromData(UTypes.m3u8, s.Value("hlsUrl"), + PostID, PostDate,, IsChannel), LNC) + Case Else : added = False + End Select + End If + If Not added Then + s = nn.ItemF({"source", "url"}).XmlIfNothing + If Not s.IsEmptyString AndAlso TryFile(s.Value) Then + With s.Value.ToLower + Select Case True + Case .Contains("redgifs") : tmpType = UTypes.VideoPre + Case .Contains("m3u8") : tmpType = UTypes.m3u8 + Case .Contains(".gif") And TryFile(s.Value) : tmpType = UTypes.GIF + Case TryFile(s.Value) : tmpType = UTypes.Picture + Case Else : tmpType = UTypes.Undefined + End Select + End With + If Not tmpType = UTypes.Undefined Then _ + _TempMediaList.ListAddValue(MediaFromData(tmpType, s.Value, PostID, PostDate,, IsChannel), LNC) + End If + End If + End If + End If + Next + End If + End If + End Using + If POST.IsEmptyString And ExistsDetected Then Exit Sub + If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataUser(PostID, Token) + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, $"data downloading error [{URL}]") + HasError = True + End Try + End Sub + Private _DownloadedChannelPosts As Integer = 0 + Private Sub DownloadDataChannel(ByVal POST As String, ByVal Token As CancellationToken) + Dim URL$ = String.Empty + Try + Dim PostID$ = String.Empty + Dim PostDate$, _UserID$, tmpUrl$ + Dim n As EContainer, nn As EContainer, s As EContainer, ss As EContainer + Dim NewPostDetected As Boolean = False + Dim ExistsDetected As Boolean = False + Dim eCount As Predicate(Of EContainer) = Function(e) e.Count > 0 + Dim lDate As Date? + + URL = $"https://reddit.com/r/{Name}/new.json?allow_quarantined=true&allow_over18=1&include=identity&after={POST}&dist=25&sort=new&t=all&layout=classic" + Token.ThrowIfCancellationRequested() + Dim r$ = GetSiteResponse(URL) + If Not r.IsEmptyString Then + Using w As EContainer = JsonDocument.Parse(r).XmlIfNothing + If w.Count > 0 Then + n = w.GetNode(ChannelJsonNodes) + If Not n Is Nothing AndAlso n.Count > 0 Then + For Each nn In n + Token.ThrowIfCancellationRequested() + s = nn.ItemF({eCount}) + If Not s Is Nothing AndAlso s.Count > 0 Then + PostID = s.Value("name") + If PostID.IsEmptyString AndAlso s.Contains("id") Then PostID = s("id").Value + + If ChannelPostsNames.Contains(PostID) Then ExistsDetected = True : Continue For 'Exit Sub + If DownloadLimitCount.HasValue AndAlso _DownloadedChannelPosts >= DownloadLimitCount.Value Then Exit Sub + If Not DownloadLimitPost.IsEmptyString AndAlso DownloadLimitPost = PostID Then Exit Sub + If DownloadLimitDate.HasValue AndAlso _TempMediaList.Count > 0 Then + With (From __u In _TempMediaList Where __u.Post.Date.HasValue Select __u.Post.Date.Value) + If .Count > 0 Then lDate = .Min Else lDate = Nothing + End With + If lDate.HasValue AndAlso lDate.Value <= DownloadLimitDate.Value Then Exit Sub + End If + NewPostDetected = True + + If s.Contains("created") Then PostDate = s("created").Value Else PostDate = String.Empty + _UserID = s.Value("author") + + If SkipExistsUsers AndAlso _ExistsUsersNames.Count > 0 AndAlso + Not _UserID.IsEmptyString AndAlso _ExistsUsersNames.Contains(_UserID) Then Continue For + + tmpUrl = s.Value("url") + If Not tmpUrl.IsEmptyString AndAlso tmpUrl.Contains("redgifs.com") Then + If SaveToCache Then + tmpUrl = s.Value({"media", "oembed"}, "thumbnail_url") + If Not tmpUrl.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _DownloadedChannelPosts += 1 + End If + Else + _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _DownloadedChannelPosts += 1 + End If + ElseIf s.Item("media_metadata").XmlIfNothing.Count > 0 Then + DownloadGallery(s, PostID, PostDate, _UserID, SaveToCache) + _DownloadedChannelPosts += 1 + ElseIf s.Contains("preview") Then + ss = s.ItemF({"preview", "images", eCount, "source", "url"}).XmlIfNothing + If Not ss.Value.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, ss.Value, PostID, PostDate, _UserID, IsChannel), LNC) + _DownloadedChannelPosts += 1 + End If + End If + End If + Next + End If + End If + End Using + If POST.IsEmptyString And ExistsDetected Then Exit Sub + If Not PostID.IsEmptyString And NewPostDetected Then DownloadDataChannel(PostID, Token) + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, $"channel data downloading error [{URL}]") + HasError = True + End Try + End Sub +#End Region +#Region "Download Base Functions" + Private Sub DownloadGallery(ByVal w As EContainer, ByVal PostID As String, ByVal PostDate As String, + Optional ByVal _UserID As String = Nothing, Optional ByVal FirstOnly As Boolean = False) + Try + Dim cn$ = IIf(IsChannel, "media_metadata", "mediaMetadata") + If Not w Is Nothing AndAlso w(cn).XmlIfNothing.Count > 0 Then + Dim t As EContainer + For Each n As EContainer In w(cn) + t = n.ItemF({"s", "u"}) + If Not t Is Nothing AndAlso Not t.Value.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, t.Value, PostID, PostDate, _UserID, IsChannel), LNC) + If FirstOnly Then Exit For + End If + Next + End If + Catch ex As Exception + LogError(ex, "gallery parsing error") + HasError = True + End Try + End Sub + Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) + Try + Token.ThrowIfCancellationRequested() + If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(p) p.Type = UTypes.VideoPre) Then + Dim r$, v$ + Dim m As UserMedia + For i% = _TempMediaList.Count - 1 To 0 Step -1 + Token.ThrowIfCancellationRequested() + If _TempMediaList(i).Type = UTypes.VideoPre Then + m = _TempMediaList(i) + r = GetSiteResponse(m.URL) + _TempMediaList(i) = New UserMedia + If Not r.IsEmptyString Then + v = RegexReplace(r, VideoRegEx) + If Not v.IsEmptyString Then + _TempMediaList(i) = New UserMedia With {.Type = UTypes.Video, .URL = v, .File = v, .Post = m.Post} + Else + _TempMediaList.RemoveAt(i) + End If + End If + End If + Next + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, "video reparsing error") + End Try + End Sub + Friend Shared Function GetVideoInfo(ByVal URL As String) As UserMedia + Try + If Not URL.IsEmptyString AndAlso URL.Contains("redgifs") Then + Using r As New UserData + r._TempMediaList.Add(MediaFromData(UTypes.VideoPre, URL, String.Empty, String.Empty,, False)) + r.ReparseVideo(Nothing) + If r._TempMediaList.ListExists Then Return r._TempMediaList(0) + End Using + End If + Return Nothing + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.ShowMainMsg + EDP.SendInLog, ex, "Video searching error") + End Try + End Function +#End Region +#Region "Structure creator" + Protected Shared Function MediaFromData(ByVal t As UTypes, ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String, + Optional ByVal _UserID As String = "", Optional ByVal IsChannel As Boolean = False) As UserMedia + If _URL.IsEmptyString And t = UTypes.Picture Then Return Nothing + _URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern)) + Dim m As New UserMedia(_URL, t) With {.Post = New UserPost With {.ID = PostID, .UserID = _UserID}} + If t = UTypes.Picture Or t = UTypes.GIF Then m.File = CStr(RegexReplace(m.URL, FilesPattern)) Else m.File = Nothing + If m.URL.Contains("preview") Then m.URL = $"https://i.redd.it/{m.File.File}" + If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, If(IsChannel, DateProviderChannel, DateProvider), Nothing) Else m.Post.Date = Nothing + Return m + End Function + Private Function TryFile(ByVal URL As String) As Boolean + Try + If Not URL.IsEmptyString AndAlso URL.Contains(".jpg") Then + Dim f As SFile = CStr(RegexReplace(URL, FilesPattern)) + Return Not f.IsEmptyString And Not f.File.IsEmptyString + End If + Return False + Catch ex As Exception + Return False + End Try + End Function +#End Region + Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) + Try + Dim i% + Token.ThrowIfCancellationRequested() + If _ContentNew.Count > 0 Then + _ContentNew.RemoveAll(Function(c) c.URL.IsEmptyString) + If _ContentNew.Count > 0 Then + MyFile.Exists(SFO.Path) + Dim MyDir$ + If IsChannel And SaveToCache Then + MyDir = ChannelInfo.CachePath.PathNoSeparator + Else + MyDir = MyFile.CutPath.PathNoSeparator + End If + Dim HashList As New List(Of String) + If _ContentList.Count > 0 Then HashList.ListAddList((From h In _ContentList Where Not h.MD5.IsEmptyString Select h.MD5), LNC) + Dim f As SFile + Dim v As UserMedia + Dim cached As Boolean = IsChannel And SaveToCache + Dim vsf As Boolean = SeparateVideoFolderF + Dim ImgFormat As Imaging.ImageFormat + Dim bDP As New ErrorsDescriber(EDP.None) + Dim MD5BS As Func(Of String, UTypes, + SFile, Boolean, String) = Function(ByVal __URL As String, ByVal __MT As UTypes, + ByVal __File As SFile, ByVal __IsBase As Boolean) As String + Try + If __MT = UTypes.GIF Then + ImgFormat = Imaging.ImageFormat.Gif + ElseIf __IsBase Then + ImgFormat = GetImageFormat(CStr(RegexReplace(__URL, UrlBasePattern))) + Else + ImgFormat = GetImageFormat(__File) + End If + Return ByteArrayToString(GetMD5(SFile.GetBytesFromNet(__URL, bDP), ImgFormat)) + Catch hash_ex As Exception + Return String.Empty + End Try + End Function + Dim m$ + Using w As New WebClient + If vsf Then SFileShares.SFileExists($"{MyDir}\Video\", SFO.Path) + Progress.TotalCount += _ContentNew.Count + For i = 0 To _ContentNew.Count - 1 + Token.ThrowIfCancellationRequested() + v = _ContentNew(i) + v.State = UStates.Tried + If v.Type = UTypes.Picture Then v.File = v.URL + If v.File.IsEmptyString Then + f = v.URL + Else + f = v.File + End If + f.Separator = "\" + m = String.Empty + If (v.Type = UTypes.Picture Or v.Type = UTypes.GIF) And Not cached Then + m = MD5BS(v.URL, v.Type, f, False) + If m.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString AndAlso Not v.URL_BASE = v.URL Then + m = MD5BS(v.URL_BASE, v.Type, f, True) + If Not m.IsEmptyString Then v.URL = v.URL_BASE + End If + End If + + If (Not m.IsEmptyString AndAlso Not HashList.Contains(m)) Or Not (v.Type = UTypes.Picture Or + v.Type = UTypes.GIF) Or cached Then + If Not cached Then HashList.Add(m) + v.MD5 = m + f.Path = MyDir + Try + If (v.Type = UTypes.Video Or v.Type = UTypes.m3u8) And vsf Then f.Path = $"{f.PathWithSeparator}Video" + If v.Type = UTypes.m3u8 Then + f = M3U8.Download(v.URL, f) + Else + w.DownloadFile(v.URL, f.ToString) + End If + If Not v.Type = UTypes.m3u8 Or Not f.IsEmptyString Then + Select Case v.Type + Case UTypes.Picture : DownloadedPictures += 1 : _CountPictures += 1 + Case UTypes.Video, UTypes.m3u8 : DownloadedVideos += 1 : _CountVideo += 1 + End Select + v.File = f + v.Post.CachedFile = f + v.State = UStates.Downloaded + End If + Catch wex As Exception + If Not IsChannel Then ErrorDownloading(f, v.URL) + End Try + Else + v.State = UStates.Skipped + End If + _ContentNew(i) = v + Progress.Perform() + Next + End Using + End If + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, "content downloading error") + HasError = True + End Try + End Sub + Protected Function GetSiteResponse(ByVal URL As String) As String + Try + Return Settings.Site(Sites.Reddit).Responser.GetResponse(URL,, EDP.ThrowException) + Catch ex As Exception + HasError = True + Dim e As EDP = EDP.SendInLog + Dim OptText$ = String.Empty + If Settings.Site(Sites.Reddit).Responser.StatusCode = HttpStatusCode.NotFound Then + e += EDP.ThrowException + OptText = ": USER NOT FOUND" + Else + e += EDP.ReturnValue + End If + Return ErrorsDescriber.Execute(e, ex, $"[{Site} - {Name}: GetSiteResponse([{URL}])]{OptText}", String.Empty) + End Try + End Function + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue And disposing Then ChannelPostsNames.Clear() : _ExistsUsersNames.Clear() + MyBase.Dispose(disposing) + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Twitter/Declarations.vb b/SCrawler/API/Twitter/Declarations.vb new file mode 100644 index 0000000..b254f7c --- /dev/null +++ b/SCrawler/API/Twitter/Declarations.vb @@ -0,0 +1,9 @@ +Imports PersonalUtilities.Functions.XML.Base +Namespace API.Twitter + Friend Module Declarations + Friend DateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Friend ReadOnly VideoNode As NodeParams() = {New NodeParams("video_info", True, True, True, True, 10)} + Friend ReadOnly VideoSizeRegEx As New RegexStructure("\d+x(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue) + Friend ReadOnly UserIdRegEx As New RegexStructure("user_id.:.(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue) + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/Twitter/UserData.vb b/SCrawler/API/Twitter/UserData.vb new file mode 100644 index 0000000..5d5e3f9 --- /dev/null +++ b/SCrawler/API/Twitter/UserData.vb @@ -0,0 +1,264 @@ +Imports PersonalUtilities.Tools.WebDocuments.JSON +Imports PersonalUtilities.Functions.XML +Imports System.Net +Imports System.Threading +Imports SCrawler.API.Base +Imports UStates = SCrawler.API.Base.UserMedia.States +Namespace API.Twitter + Friend Class UserData : Inherits UserDataBase +#Region "Declarations" + Friend Overrides Property Site As Sites = Sites.Twitter + Private Structure Sizes : Implements IComparable(Of Sizes) + Friend Value As Integer + Friend Name As String + Friend ReadOnly HasError As Boolean + Friend Sub New(ByVal _Value As String, ByVal _Name As String) + Try + Value = _Value + Name = _Name + Catch ex As Exception + HasError = True + End Try + End Sub + Friend Function CompareTo(ByVal Other As Sizes) As Integer Implements IComparable(Of Sizes).CompareTo + Return Value.CompareTo(Other.Value) * -1 + End Function + Friend Shared Function Reparse(ByRef Current As Sizes, ByVal Other As Sizes, ByVal LargeContained As Boolean) As Sizes + If LargeContained And Current.Name.IsEmptyString And Current.Value > Other.Value Then Current.Name = "large" + Return Current + End Function + Friend Shared Function ApplyLarge(ByRef s As Sizes) As Sizes + s.Name = "large" + Return s + End Function + End Structure +#End Region +#Region "Initializer" + Friend Sub New(ByVal u As UserInfo, Optional ByVal _LoadUserInformation As Boolean = True) + User = u + If _LoadUserInformation Then LoadUserInformation() + End Sub +#End Region +#Region "Download functions" + Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + DownloadData(String.Empty, Token) + End Sub + Private Overloads Sub DownloadData(ByVal POST As String, ByVal Token As CancellationToken) + Dim URL$ = String.Empty + Try + Dim PostID$ = String.Empty + Dim PostDate$ + Dim m As EContainer, nn As EContainer, s As EContainer + Dim NewPostDetected As Boolean = False + Dim ExistsDetected As Boolean = False + + Dim PicNode As Predicate(Of EContainer) = Function(e) e.Count > 0 AndAlso e.Contains("media_url") + Dim UID As Func(Of EContainer, String) = Function(e) e.XmlIfNothing.Item({"user", "id"}).XmlIfNothingValue + + URL = $"https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={Name}&count=200&exclude_replies=false&include_rts=1&tweet_mode=extended" + If Not POST.IsEmptyString Then URL &= $"&max_id={POST}" + + Token.ThrowIfCancellationRequested() + Dim r$ = Settings.Site(Sites.Twitter).Responser.GetResponse(URL,, EDP.ThrowException) + If Not r.IsEmptyString Then + Using w As EContainer = JsonDocument.Parse(r) + If Not w Is Nothing AndAlso w.Count > 0 Then + For Each nn In w + Token.ThrowIfCancellationRequested() + If nn.Count > 0 Then + PostID = nn.Value("id") + If ID.IsEmptyString Then + ID = UID(nn) + If Not ID.IsEmptyString Then UpdateUserInformation() + End If + + 'Date Pattern: + 'Sat Jan 01 01:10:15 +0000 2000 + If nn.Contains("created_at") Then PostDate = nn("created_at").Value Else PostDate = String.Empty + + If Not _TempPostsList.Contains(PostID) Then + NewPostDetected = True + _TempPostsList.Add(PostID) + Else + ExistsDetected = True + Continue For + End If + + If Not ParseUserMediaOnly OrElse (Not nn.Contains("retweeted_status") OrElse + (Not ID.IsEmptyString AndAlso UID(nn("retweeted_status")) = ID)) Then + If Not CheckVideoNode(nn, PostID, PostDate) Then + s = nn.ItemF({"extended_entities", "media"}) + If s Is Nothing OrElse s.Count = 0 Then s = nn.ItemF({"retweeted_status", "extended_entities", "media"}) + If Not s Is Nothing AndAlso s.Count > 0 Then + For Each m In s + If m.Count > 0 AndAlso m.Contains("media_url") Then + _TempMediaList.ListAddValue(MediaFromData(m("media_url").Value, + PostID, PostDate, GetPictureOption(m)), LNC) + End If + Next + End If + End If + End If + End If + Next + End If + End Using + If POST.IsEmptyString And ExistsDetected Then Exit Sub + If Not PostID.IsEmptyString And NewPostDetected Then DownloadData(PostID, Token) + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, $"data downloading error [{URL}]") + HasError = True + End Try + End Sub + Friend Shared Function GetVideoInfo(ByVal URL As String) As UserMedia + Try + If URL.Contains("twitter") Then + Dim PostID$ = RegexReplace(URL, New RegexStructure("(?<=/)\d+", True, False,,,,, String.Empty)) + If Not PostID.IsEmptyString Then + Dim r$ = Settings.Site(Sites.Twitter).Responser.GetResponse($"https://api.twitter.com/1.1/statuses/show.json?id={PostID}",, + EDP.ReturnValue) + If Not r.IsEmptyString Then + Using j As EContainer = JsonDocument.Parse(r) + If j.ListExists Then + Dim u$ = GetVideoNodeURL(j) + If Not u.IsEmptyString Then Return MediaFromData(u, PostID, String.Empty) + End If + End Using + End If + End If + End If + Return Nothing + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.ShowMainMsg + EDP.SendInLog, ex, "Video searching error") + End Try + End Function +#Region "Picture options" + Private Function GetPictureOption(ByVal w As EContainer) As String + Try + Dim ww As EContainer = w("sizes") + If Not ww Is Nothing AndAlso ww.Count > 0 Then + Dim l As New List(Of Sizes) + Dim LargeContained As Boolean = ww.Contains("large") + For Each v As EContainer In ww + If v.Count > 0 AndAlso v.Contains("h") Then l.Add(New Sizes(v.Value("h"), v.Name)) + Next + If l.Count > 0 Then + l.Sort() + If l(0).Name.IsEmptyString And LargeContained Then Return "large" Else Return l(0).Name + End If + End If + Return String.Empty + Catch ex As Exception + LogError(ex, "[GetPictureOption]") + Return String.Empty + End Try + End Function +#End Region +#Region "Video options" + Private Function CheckVideoNode(ByVal w As EContainer, ByVal PostID As String, ByVal PostDate As String) As Boolean + Try + Dim URL$ = GetVideoNodeURL(w) + If Not URL.IsEmptyString Then _TempMediaList.ListAddValue(MediaFromData(URL, PostID, PostDate), LNC) : Return True + Return False + Catch ex As Exception + LogError(ex, "[CheckVideoNode]") + Return False + End Try + End Function + Private Shared Function GetVideoNodeURL(ByVal w As EContainer) As String + Dim v As EContainer = w.GetNode(VideoNode) + If Not v Is Nothing AndAlso v.Count > 0 Then + Dim l As New List(Of Sizes) + Dim u$ + Dim nn As EContainer + For Each n As EContainer In v + If n.Count > 0 Then + For Each nn In n + If nn("content_type").XmlIfNothingValue("none").Contains("mp4") AndAlso nn.Contains("url") Then + u = nn.Value("url") + l.Add(New Sizes(RegexReplace(u, VideoSizeRegEx), u)) + End If + Next + End If + Next + If l.Count > 0 Then l.RemoveAll(Function(s) s.HasError) + If l.Count > 0 Then l.Sort() : Return l(0).Name + End If + Return String.Empty + End Function + Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) + End Sub +#End Region + Private Shared Function MediaFromData(ByVal _URL As String, ByVal PostID As String, ByVal PostDate As String, + Optional ByVal _PictureOption As String = "") As UserMedia + _URL = LinkFormatterSecure(RegexReplace(_URL.Replace("\", String.Empty), LinkPattern)) + Dim m As New UserMedia(_URL) With {.PictureOption = _PictureOption, .Post = New UserPost With {.ID = PostID}} + If Not m.URL.IsEmptyString Then m.File = CStr(RegexReplace(m.URL, FilesPattern)) + If Not m.PictureOption.IsEmptyString And Not m.File.IsEmptyString And Not m.URL.IsEmptyString Then + m.URL_BASE = $"{m.URL.Replace($".{m.File.Extension}", String.Empty)}?format={m.File.Extension}&name={m.PictureOption}" + End If + If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, Declarations.DateProvider, Nothing) Else m.Post.Date = Nothing + Return m + End Function +#End Region + Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) + Try + Dim i% + Token.ThrowIfCancellationRequested() + If _ContentNew.Count > 0 Then + _ContentNew.RemoveAll(Function(c) c.URL.IsEmptyString) + If _ContentNew.Count > 0 Then + MyFile.Exists(SFO.Path) + Dim MyDir$ = MyFile.CutPath.Path + Dim vsf As Boolean = SeparateVideoFolderF + Dim f As SFile + Dim v As UserMedia + Using w As New WebClient + If vsf Then SFileShares.SFileExists($"{MyDir}\Video\", SFO.Path) + MainProgress.TotalCount += _ContentNew.Count + For i = 0 To _ContentNew.Count - 1 + Token.ThrowIfCancellationRequested() + v = _ContentNew(i) + v.State = UStates.Tried + If v.File.IsEmptyString Then + f = v.URL + Else + f = v.File + End If + f.Separator = "\" + f.Path = MyDir + + If v.URL_BASE.IsEmptyString Then v.URL_BASE = v.URL + + If Not v.File.IsEmptyString AndAlso Not v.URL_BASE.IsEmptyString Then + Try + If f.Extension = "mp4" And vsf Then f.Path = $"{f.PathWithSeparator}Video" + w.DownloadFile(v.URL_BASE, f.ToString) + Select Case f.Extension + Case "mp4" : v.Type = UserMedia.Types.Video : DownloadedVideos += 1 : _CountVideo += 1 + Case Else : v.Type = UserMedia.Types.Picture : DownloadedPictures += 1 : _CountPictures += 1 + End Select + v.File = f + v.State = UStates.Downloaded + Catch wex As Exception + ErrorDownloading(f, v.URL_BASE) + End Try + Else + v.State = UStates.Skipped + End If + _ContentNew(i) = v + MainProgress.Perform() + Next + End Using + End If + End If + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + LogError(ex, "content downloading error") + HasError = True + End Try + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/API/UserDataBind.vb b/SCrawler/API/UserDataBind.vb new file mode 100644 index 0000000..3efbd3f --- /dev/null +++ b/SCrawler/API/UserDataBind.vb @@ -0,0 +1,471 @@ +Imports PersonalUtilities.Tools +Imports System.Threading +Imports SCrawler.API.Base +Namespace API + Friend Class UserDataBind : Inherits UserDataBase : Implements ICollection(Of IUserData), IMyEnumerator(Of IUserData) + Friend Event OnCollectionSelfRemoved() +#Region "Declarations" + Friend Overrides Property Site As Sites = Sites.Undefined + Friend ReadOnly Property Collections As List(Of IUserData) + Private _CollectionName As String = String.Empty + Friend Overrides Property CollectionName As String + Get + If Count > 0 Then + Return Collections(0).CollectionName + Else + Return _CollectionName + End If + End Get + Set(ByVal NewName As String) + ChangeCollectionName(NewName, True) + End Set + End Property + Friend Overrides Sub ChangeCollectionName(ByVal NewName As String, ByVal UpdateSettings As Boolean) + _CollectionName = NewName + If Count > 0 Then Collections.ForEach(Sub(c) c.CollectionName = NewName) + End Sub + Friend Overrides Property FriendlyName As String + Get + If Count > 0 Then + Return Collections(0).FriendlyName + Else + Return String.Empty + End If + End Get + Set(ByVal NewName As String) + If Count > 0 Then Collections.ForEach(Sub(c) + c.FriendlyName = NewName + c.UpdateUserInformation() + End Sub) + End Set + End Property +#Region "Images" + Friend Overrides Sub SetPicture(ByVal f As SFile) + If Count > 0 Then Collections.ForEach(Sub(c) c.SetPicture(f)) + End Sub + Friend Overrides Function GetUserPicture() As Image + If Count > 0 Then + Return Collections(0).GetPicture + Else + Return GetNullPicture(Settings.MaxLargeImageHeigh) + End If + End Function +#End Region + Friend Overrides ReadOnly Property DownloadedTotal(Optional ByVal Total As Boolean = True) As Integer + Get + If Count > 0 Then + Return Collections.Select(Function(u) u.DownloadedTotal(Total)).Sum + Else + Return 0 + End If + End Get + End Property + Friend ReadOnly Property Count As Integer Implements ICollection(Of IUserData).Count, IMyEnumerator(Of IUserData).MyEnumeratorCount + Get + If Collections Is Nothing Then + Return 0 + Else + Return Collections.Count + End If + End Get + End Property + Friend Overrides Property MyFile As SFile + Get + If Count > 0 Then Return Collections(0).File Else Return Nothing + End Get + Set(ByVal NewFile As SFile) + End Set + End Property + Friend Overrides Property FileExists As Boolean + Get + If Count > 0 Then + Return Collections.Exists(Function(c) c.FileExists) + Else + Return False + End If + End Get + Set(ByVal IsExists As Boolean) + End Set + End Property + Friend Overrides Property DataMerging As Boolean + Get + If Count > 0 Then + Return DirectCast(Collections(0), UserDataBase).DataMerging + Else + Return False + End If + End Get + Set(ByVal IsMerged As Boolean) + MergeData(IsMerged) + End Set + End Property + Friend Overrides Property HasError As Boolean + Get + Return MyBase.HasError Or (Count > 0 AndAlso Collections.Exists(Function(c) c.HasError)) + End Get + Set(ByVal __HasError As Boolean) + MyBase.HasError = __HasError + If Count > 0 Then Collections.ForEach(Sub(c) c.HasError = False) + End Set + End Property + Friend Overrides Property Temporary As Boolean + Get + If Count > 0 Then + Return Collections(0).Temporary + Else + Return False + End If + End Get + Set(ByVal Temp As Boolean) + Collections.ForEach(Sub(c) c.Temporary = Temp) + UpdateUserInformation() + End Set + End Property + Friend Overrides Property Favorite As Boolean + Get + If Count > 0 Then + Return Collections(0).Favorite + Else + Return False + End If + End Get + Set(ByVal Fav As Boolean) + Collections.ForEach(Sub(c) c.Favorite = Fav) + UpdateUserInformation() + End Set + End Property + Friend Overrides ReadOnly Property Labels As List(Of String) + Get + If Count > 0 Then + Return ListAddList(Nothing, Collections.SelectMany(Function(c) c.Labels), LAP.NotContainsOnly) + Else + Return New List(Of String) + End If + End Get + End Property + Friend Overrides Function GetUserInformation() As String + Dim OutStr$ = String.Empty + If Count > 0 Then Collections.ForEach(Sub(c) OutStr.StringAppendLine(DirectCast(c, UserDataBase).GetUserInformation(), $"{vbCrLf}{vbCrLf}")) + Return OutStr + End Function + Friend Overrides Property LastUpdated As Date? + Get + If Count > 0 Then + With If((From c In Collections + Where DirectCast(c, UserDataBase).LastUpdated.HasValue + Select DirectCast(c, UserDataBase).LastUpdated.Value).ToList, New List(Of Date)) + If .Count > 0 Then Return .Max + End With + End If + Return Nothing + End Get + Set(ByVal NewDate As Date?) + End Set + End Property + Friend Overrides ReadOnly Property FitToAddParams As Boolean + Get + Return Count > 0 AndAlso Collections.Exists(Function(c) c.FitToAddParams) + End Get + End Property +#Region "Context buttons" + Friend ReadOnly Property ContextDown As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_DOWN).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextEdit As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_EDIT).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextDelete As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_DELETE).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextPath As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_OPEN_PATH).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property + Friend ReadOnly Property ContextSite As ToolStripMenuItem() + Get + If Count > 0 Then + Return Collections.Select(Function(c) DirectCast(c, UserDataBase).BTT_CONTEXT_OPEN_SITE).ToArray + Else + Return New ToolStripMenuItem() {} + End If + End Get + End Property +#End Region +#End Region + Friend Sub New() + _IsCollection = True + Collections = New List(Of IUserData) + 'ImageHandler(Me, True) + End Sub + Friend Sub New(ByVal _Name As String) + Me.New + CollectionName = _Name + End Sub + Friend Overrides Sub LoadUserInformation() + If Count > 0 Then Collections.ForEach(Sub(c) c.LoadUserInformation()) + End Sub + Friend Overrides Sub UpdateUserInformation() + If Count > 0 Then Collections.ForEach(Sub(c) c.UpdateUserInformation()) + End Sub + Friend Overrides Sub LoadContentInformation() + If Count > 0 Then Collections.ForEach(Sub(c) DirectCast(c, UserDataBase).LoadContentInformation()) + End Sub + Friend Overrides Property DownloadReparseOnly As Boolean + Get + If Count > 0 Then Return Collections(0).DownloadReparseOnly Else Return False + End Get + Set(ByVal DRO As Boolean) + If Count > 0 Then Collections.ForEach(Sub(u) u.DownloadReparseOnly = DRO) + End Set + End Property + Friend Overrides ReadOnly Property DataForReparseExists As Boolean + Get + If Count > 0 Then + Return Collections.Exists(Function(u) u.DataForReparseExists) + Else + Return False + End If + End Get + End Property + Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) + If Count > 0 Then Downloader.AddRange(Collections) + End Sub + Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + End Sub + Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) + End Sub + Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) + End Sub + Private Sub User_OnPictureUpdated(ByVal User As IUserData) + Raise_OnPictureUpdated() + End Sub + Friend Overrides Sub OpenSite() + If Count > 0 Then Collections(0).OpenSite() + End Sub + Friend Overrides Sub OpenFolder() + Try + If Count > 0 Then Collections(0).File.CutPath(2).Open(SFO.Path, EDP.None) + Catch ex As Exception + End Try + End Sub +#Region "ICollection Support" + Default Friend ReadOnly Property Item(ByVal Index As Integer) As IUserData Implements IMyEnumerator(Of IUserData).MyEnumeratorObject + Get + Return Collections(Index) + End Get + End Property + Private ReadOnly Property IsReadOnly As Boolean Implements ICollection(Of IUserData).IsReadOnly + Get + Return False + End Get + End Property + Friend Overloads Sub Add(ByVal _Item As IUserData) Implements ICollection(Of IUserData).Add + With _Item + .Temporary = Temporary + .Favorite = Favorite + ImageHandler(_Item, False) + AddHandler _Item.OnPictureUpdated, AddressOf User_OnPictureUpdated + Dim m As Boolean = DataMerging + If .MoveFiles(CollectionName, m) Then + Collections.Add(_Item) + DirectCast(_Item, UserDataBase).CreateButtons(Count - 1) + End If + End With + End Sub + ''' FOR SETTINGS START LOADING ONLY + Friend Overloads Sub Add(ByVal u As UserInfo, Optional ByVal _LoadData As Boolean = True) + Select Case u.Site + Case Sites.Reddit : Collections.Add(New Reddit.UserData(u, _LoadData)) + Case Sites.Twitter : Collections.Add(New Twitter.UserData(u, _LoadData)) + Case Else : Exit Sub + End Select + With DirectCast(Collections(Count - 1), UserDataBase) + .CreateButtons(Count - 1) + AddHandler .BTT_CONTEXT_DELETE.Click, AddressOf BTT_CONTEXT_DELETE_Click + End With + AddHandler Collections(Count - 1).OnPictureUpdated, AddressOf User_OnPictureUpdated + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData)) + If Not _Items Is Nothing AndAlso _Items.Count > 0 Then + For i% = 0 To _Items.Count - 1 : Add(_Items(i)) : Next + End If + End Sub + Friend Overrides Function MoveFiles(ByVal __CollectionName As String, ByVal _MergeData As Boolean) As Boolean + Throw New NotImplementedException("Files moving does not available if collection context") + End Function + Friend Overloads Sub MergeData(ByVal Merging As Boolean) + If Count > 0 Then + If Merging Then + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data already merged") + Else + If Collections.Count > 1 Then + Collections.ForEach(Sub(c) DirectCast(c, UserDataBase).MergeData()) + MsgBoxE($"Collection [{CollectionName}] data merged") + Else + MsgBoxE($"Collection [{CollectionName}] contains only one user profile" & vbCr & + "Data merging available from two and more profiles in collection!", MsgBoxStyle.Exclamation) + End If + End If + Else + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data is already merged" & vbCr & + "Combined data can not be undone", MsgBoxStyle.Critical) + Else + MsgBoxE($"Collection [{CollectionName}] data was never merged") + End If + End If + End If + End Sub + Friend Sub Clear() Implements ICollection(Of IUserData).Clear + Collections.ListClearDispose + End Sub + Friend Function Contains(ByVal _Item As IUserData) As Boolean Implements ICollection(Of IUserData).Contains + Return Collections.Contains(_Item) + End Function + Private Sub CopyTo(ByVal _Array() As IUserData, ByVal _ArrayIndex As Integer) Implements ICollection(Of IUserData).CopyTo + Throw New NotImplementedException("[CopyTo] method does not supported in collections context") + End Sub + Friend Function Remove(ByVal _Item As IUserData) As Boolean Implements ICollection(Of IUserData).Remove + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data is already merged" & vbCr & + "Combined data can not be undone" & vbCr & + "Operation canceled", MsgBoxStyle.Critical) + Return False + Else + DirectCast(_Item, UserDataBase).MoveFiles(String.Empty, False) + ImageHandler(_Item) + Return Collections.Remove(_Item) + End If + End Function + Friend Overrides Function Delete() As Integer + If Count > 0 Then + If MsgBoxE({$"Collection may contain data{vbCr}Do you really want to delete collection and all of it files?", "Collection deleting"}, + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + Settings.Users.Remove(Me) + Collections.ForEach(Sub(c) c.Delete()) + Downloader.UserRemove(Me) + ImageHandler(Me, False) + Collections.ListClearDispose + Dispose(False) + Return 2 + Else + If DataMerging Then + MsgBoxE($"Collection [{CollectionName}] data are already merged{vbCr}Cannot split merged collection{vbCr}Operation canceled", MsgBoxStyle.Exclamation) + Return 0 + End If + If MsgBoxE({$"Do you want to delete collection only?{vbCr}Users will not be deleted", "Collection deleting"}, + MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + Dim f As SFile = Collections(0).File.CutPath(2) + Settings.Users.Remove(Me) + Collections.ForEach(Sub(c) + c.MoveFiles(String.Empty, False) + ImageHandler(c) + End Sub) + Collections.Clear() + f.Delete(SFO.Path,,, EDP.SendInLog) + Downloader.UserRemove(Me) + ImageHandler(Me, False) + Dispose(False) + Return 3 + Else + MsgBoxE("Operation canceled") + End If + End If + End If + Return 0 + End Function + Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) + With DirectCast(sender, ToolStripMenuItem) + Dim i% = AConvert(Of Integer)(.Tag, -1) + If i >= 0 Then + Dim n$ = Collections(i).Name + Dim s$ = Collections(i).Site.ToString + If MsgBoxE({$"Do you really want to delete user profile [{n}] of site [{s}]?" & vbCr & + "This profile will be removed from collection and all data will be erased", + "Profile removing"}, MsgBoxStyle.Exclamation,,, {"Process", "Cancel"}) = 0 Then + Collections(i).Delete() + Collections(i).Dispose() + Collections.RemoveAt(i) + MsgBoxE($"User profile [{n}] of site [{s}] has been removed") + If Count = 0 Then + Settings.Users.Remove(Me) + ImageHandler(Me, False) + RaiseEvent OnCollectionSelfRemoved() + Dispose(False) + End If + Else + MsgBoxE("Operation canceled") + End If + End If + End With + End Sub +#Region "IEnumerable Support" + Private Function GetEnumerator() As IEnumerator(Of IUserData) Implements IEnumerable(Of IUserData).GetEnumerator + Return New MyEnumerator(Of IUserData)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#End Region + Friend Overrides Function CompareTo(ByVal Other As UserDataBase) As Integer + If TypeOf Other Is UserDataBind Then + Dim x% = CompareValue(Me) + Dim y% = CompareValue(Other) + If x.CompareTo(y) = 0 Then + Return CollectionName.CompareTo(Other.CollectionName) + Else + Return x.CompareTo(y) + End If + Else + Return -1 + End If + End Function + Friend Overrides Function CompareTo(ByVal Obj As Object) As Integer + If TypeOf Obj Is UserDataBind Then + Return CompareTo(DirectCast(Obj, UserDataBind)) + Else + Return -1 + End If + End Function + Friend Overrides Function Equals(ByVal Other As UserDataBase) As Boolean + If Other.IsCollection Then + Return CollectionName = Other.CollectionName + Else + Return Count > 0 AndAlso Collections.Exists(Function(u) u.Equals(Other)) + End If + End Function +#Region "IDisposable Support" + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then Collections.ListClearDispose + End If + MyBase.Dispose(disposing) + End Sub +#End Region + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/App.config b/SCrawler/App.config new file mode 100644 index 0000000..5534e28 --- /dev/null +++ b/SCrawler/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SCrawler/Channels/ChannelViewForm.Designer.vb b/SCrawler/Channels/ChannelViewForm.Designer.vb new file mode 100644 index 0000000..f2a31ba --- /dev/null +++ b/SCrawler/Channels/ChannelViewForm.Designer.vb @@ -0,0 +1,225 @@ + +Partial Friend Class ChannelViewForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim SEP_3 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(ChannelViewForm)) + Me.TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() + Me.BTT_DOWNLOAD = New System.Windows.Forms.ToolStripButton() + Me.BTT_STOP = New System.Windows.Forms.ToolStripButton() + Me.BTT_ADD_USERS = New System.Windows.Forms.ToolStripButton() + Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip() + Me.PR_CN = New System.Windows.Forms.ToolStripProgressBar() + Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() + Me.LIST_POSTS = New System.Windows.Forms.ListView() + Me.LCONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BTT_C_OPEN_USER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_OPEN_POST = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_OPEN_PICTURE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_OPEN_FOLDER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_ADD_TO_BLACKLIST = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_C_REMOVE_FROM_SELECTED = New System.Windows.Forms.ToolStripMenuItem() + SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_2 = New System.Windows.Forms.ToolStripSeparator() + SEP_3 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + Me.ToolbarTOP.SuspendLayout() + Me.ToolbarBOTTOM.SuspendLayout() + Me.LCONTEXT.SuspendLayout() + Me.SuspendLayout() + ' + 'SEP_1 + ' + SEP_1.Name = "SEP_1" + SEP_1.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_2 + ' + SEP_2.Name = "SEP_2" + SEP_2.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_3 + ' + SEP_3.Name = "SEP_3" + SEP_3.Size = New System.Drawing.Size(6, 25) + ' + 'CONTEXT_SEP_1 + ' + CONTEXT_SEP_1.Name = "CONTEXT_SEP_1" + CONTEXT_SEP_1.Size = New System.Drawing.Size(302, 6) + ' + 'ToolbarTOP + ' + Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_DOWNLOAD, Me.BTT_STOP, SEP_1, Me.BTT_ADD_USERS, SEP_2, SEP_3}) + Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) + Me.ToolbarTOP.Name = "ToolbarTOP" + Me.ToolbarTOP.Size = New System.Drawing.Size(744, 25) + Me.ToolbarTOP.TabIndex = 0 + ' + 'BTT_DOWNLOAD + ' + Me.BTT_DOWNLOAD.AutoToolTip = False + Me.BTT_DOWNLOAD.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWNLOAD.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWNLOAD.Name = "BTT_DOWNLOAD" + Me.BTT_DOWNLOAD.Size = New System.Drawing.Size(104, 22) + Me.BTT_DOWNLOAD.Text = "Download (F5)" + ' + 'BTT_STOP + ' + Me.BTT_STOP.Enabled = False + Me.BTT_STOP.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_STOP.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_STOP.Name = "BTT_STOP" + Me.BTT_STOP.Size = New System.Drawing.Size(51, 22) + Me.BTT_STOP.Text = "Stop" + Me.BTT_STOP.ToolTipText = "Stop downloading" + ' + 'BTT_ADD_USERS + ' + Me.BTT_ADD_USERS.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD_USERS.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD_USERS.Name = "BTT_ADD_USERS" + Me.BTT_ADD_USERS.Size = New System.Drawing.Size(49, 22) + Me.BTT_ADD_USERS.Text = "Add" + Me.BTT_ADD_USERS.ToolTipText = "Add pending users to collection (F8)" + ' + 'ToolbarBOTTOM + ' + Me.ToolbarBOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_CN, Me.LBL_STATUS}) + Me.ToolbarBOTTOM.Location = New System.Drawing.Point(0, 439) + Me.ToolbarBOTTOM.Name = "ToolbarBOTTOM" + Me.ToolbarBOTTOM.Size = New System.Drawing.Size(744, 22) + Me.ToolbarBOTTOM.TabIndex = 1 + ' + 'PR_CN + ' + Me.PR_CN.Name = "PR_CN" + Me.PR_CN.Size = New System.Drawing.Size(200, 16) + ' + 'LBL_STATUS + ' + Me.LBL_STATUS.Name = "LBL_STATUS" + Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17) + ' + 'LIST_POSTS + ' + Me.LIST_POSTS.CheckBoxes = True + Me.LIST_POSTS.ContextMenuStrip = Me.LCONTEXT + Me.LIST_POSTS.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_POSTS.HideSelection = False + Me.LIST_POSTS.Location = New System.Drawing.Point(0, 25) + Me.LIST_POSTS.MultiSelect = False + Me.LIST_POSTS.Name = "LIST_POSTS" + Me.LIST_POSTS.Size = New System.Drawing.Size(744, 414) + Me.LIST_POSTS.TabIndex = 2 + Me.LIST_POSTS.UseCompatibleStateImageBehavior = False + ' + 'LCONTEXT + ' + Me.LCONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_C_OPEN_USER, Me.BTT_C_OPEN_POST, Me.BTT_C_OPEN_PICTURE, Me.BTT_C_OPEN_FOLDER, CONTEXT_SEP_1, Me.BTT_C_REMOVE_FROM_SELECTED, CONTEXT_SEP_2, Me.BTT_C_ADD_TO_BLACKLIST}) + Me.LCONTEXT.Name = "LCONTEXT" + Me.LCONTEXT.Size = New System.Drawing.Size(306, 170) + ' + 'BTT_C_OPEN_USER + ' + Me.BTT_C_OPEN_USER.Name = "BTT_C_OPEN_USER" + Me.BTT_C_OPEN_USER.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_USER.Text = "Open user" + ' + 'BTT_C_OPEN_POST + ' + Me.BTT_C_OPEN_POST.Name = "BTT_C_OPEN_POST" + Me.BTT_C_OPEN_POST.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_POST.Text = "Open post" + ' + 'BTT_C_OPEN_PICTURE + ' + Me.BTT_C_OPEN_PICTURE.Name = "BTT_C_OPEN_PICTURE" + Me.BTT_C_OPEN_PICTURE.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_PICTURE.Text = "Open picture" + ' + 'BTT_C_OPEN_FOLDER + ' + Me.BTT_C_OPEN_FOLDER.Name = "BTT_C_OPEN_FOLDER" + Me.BTT_C_OPEN_FOLDER.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_OPEN_FOLDER.Text = "Open folder" + ' + 'BTT_C_ADD_TO_BLACKLIST + ' + Me.BTT_C_ADD_TO_BLACKLIST.Name = "BTT_C_ADD_TO_BLACKLIST" + Me.BTT_C_ADD_TO_BLACKLIST.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_ADD_TO_BLACKLIST.Text = "Add/Remove this user to/from the BlackList" + ' + 'CONTEXT_SEP_2 + ' + CONTEXT_SEP_2.Name = "CONTEXT_SEP_2" + CONTEXT_SEP_2.Size = New System.Drawing.Size(302, 6) + ' + 'BTT_C_REMOVE_FROM_SELECTED + ' + Me.BTT_C_REMOVE_FROM_SELECTED.AutoToolTip = True + Me.BTT_C_REMOVE_FROM_SELECTED.Name = "BTT_C_REMOVE_FROM_SELECTED" + Me.BTT_C_REMOVE_FROM_SELECTED.Size = New System.Drawing.Size(305, 22) + Me.BTT_C_REMOVE_FROM_SELECTED.Text = "Remove user from selected" + Me.BTT_C_REMOVE_FROM_SELECTED.ToolTipText = "Remove this user from selected users if user was added to" + ' + 'ChannelViewForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(744, 461) + Me.Controls.Add(Me.LIST_POSTS) + Me.Controls.Add(Me.ToolbarBOTTOM) + Me.Controls.Add(Me.ToolbarTOP) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(760, 500) + Me.Name = "ChannelViewForm" + Me.Text = "Channels" + Me.ToolbarTOP.ResumeLayout(False) + Me.ToolbarTOP.PerformLayout() + Me.ToolbarBOTTOM.ResumeLayout(False) + Me.ToolbarBOTTOM.PerformLayout() + Me.LCONTEXT.ResumeLayout(False) + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents ToolbarTOP As ToolStrip + Private WithEvents ToolbarBOTTOM As StatusStrip + Private WithEvents LIST_POSTS As ListView + Private WithEvents PR_CN As ToolStripProgressBar + Private WithEvents LBL_STATUS As ToolStripStatusLabel + Private WithEvents BTT_DOWNLOAD As ToolStripButton + Private WithEvents TT_MAIN As ToolTip + Private WithEvents BTT_STOP As ToolStripButton + Private WithEvents BTT_ADD_USERS As ToolStripButton + Private WithEvents LCONTEXT As ContextMenuStrip + Private WithEvents BTT_C_OPEN_USER As ToolStripMenuItem + Private WithEvents BTT_C_OPEN_POST As ToolStripMenuItem + Private WithEvents BTT_C_OPEN_PICTURE As ToolStripMenuItem + Private WithEvents BTT_C_OPEN_FOLDER As ToolStripMenuItem + Private WithEvents BTT_C_ADD_TO_BLACKLIST As ToolStripMenuItem + Private WithEvents BTT_C_REMOVE_FROM_SELECTED As ToolStripMenuItem +End Class \ No newline at end of file diff --git a/SCrawler/Channels/ChannelViewForm.resx b/SCrawler/Channels/ChannelViewForm.resx new file mode 100644 index 0000000..0eaaeec --- /dev/null +++ b/SCrawler/Channels/ChannelViewForm.resx @@ -0,0 +1,1280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + False + + + False + + + False + + + 241, 17 + + + 17, 17 + + + 124, 17 + + + 342, 17 + + + False + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/wMARv8PAEX/IgBF/0AARf9fAEX/fQBF/5wARf+6AEX/zQBF + /90ARf/rAEX/8wBF//gARf/8AEX//ABF//gARf/zAEX/6wBF/90ARf/NAEX/ugBF/5wARf99AEX/XwBF + /0AARf8iAEb/DwBG/wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAR/8DAEb/FABG/zQARf9dAEX/iwBF + /7MARf/RAEX/5wBF//QARf/6AEX//gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF//oARf/0AEX/5wBF/9EARf+zAEX/iwBF/10ARv80AEb/FABH + /wMAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG + /wYARv8iAEX/UwBF/4sARf/AAEX/5QBF//cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9wBF/+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/AwBF/x4ARv9WAEX/mQBF/9MARf/0AEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/+AEX/9ABF/9MARf+ZAEb/VgBF/x4ARv8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAJv8AAEb/DABF/zsARf+FAEX/zABF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/zABF + /4UARf87AEb/DAAm/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAASv8AAEb/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF/+YARf+nAEX/UABG/xMASv8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAT/8AAEb/FABF/1oARf+3AEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/wAEX/twBF/1oARv8UAE//AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI/wAAQ/8AAEX/DgBF + /1QARf+2AEX/8gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8gBF + /7YARf9UAEX/DgBD/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG/wYARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAFP/AABG/yAARf+FAEX/4wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/jAEX/hQBG/yAAU/8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABG/wkARf9SAEX/wwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/7AEX/wwBF + /1IARv8JAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eADz/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8DAEX/QABF/7sARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/7sARf9AAEf/AwBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/CgBF/2MARf/cAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9wARf9jAEb/CgBG + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF + /xUARf+HAEX/7wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEf/AABD/wAARf8hAEX/oQBF//gARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf+hAEX/IQBD/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEb/LQBF + /7UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+1AEX/LQBB/wAAR/8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG/zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/AAEb/MwA9/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARf83AEX/xgBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEX/NwA8 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAAQ/8AAEb/MwBF/8YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEb/MwBD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/ywARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABF/wAARf8hAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEX/IQBF/wAARf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/FQBF/6EARf/9AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//0ARf+hAEX/FQBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//kARf+HAEb/CgBF + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8CAEX/YwBF/+4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+4ARf9jAEj/AgBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEP/AABF/0AARf/cAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AET//wBE//8AQ///AEP//wBC//8AQv//AEP//wBD//8AQ///AEP//wBC//8AQv//AEP//wBD + //8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /9wARf9AAEP/AABG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQ///AUT//wZJ//8QUP//HFn//yxk//87b///SHj//1F/ + //9Xhf//W4f//1uH//9Xhf//UX///0h4//87b///K2T//xxZ//8QUP//Bkn//wFE//8AQ///AEP//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEf/CABF/4oARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///AEP//wNG//8RUf//L2f//1WC + //97n///n7j//7vN///Q3f//4en//+rw///x9f//9ff///b5///3+f//9/n///b5///19///8fX//+rw + ///g6f//0N3//7rM//+euP//e57//1SB//8uZv//EVH//wNG//8AQ///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/4oAR/8IAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABC/wAARf9TAEX/6wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///Bkn//yNe//9Wg///i6r//7vO///h6f//9fj///7+//////////////////////////////// + ///////////////////////////////////////////////////////////////////9/v//9fj//+Hp + //+6zf//iqn//1WC//8iXf//Bkn//wBD//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/1MAQv8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/IABF/8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//8CRf//HVn//1eE//+atf//1N////X3//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9Pf//9Pf//+ZtP//VoP//xxZ + //8CRf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/wwBF/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wUARf+FAEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8GSP//MGf//3uf + ///J1///9Pf///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09///x9b//3qd//8uZv//Bkj//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/hQBG + /wUARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARP8AAEb/PgBF/+IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8FR///MWj//42s///d5v///P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/z//9zl//+Lqv//L2f//wRH//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/iAEX/PgBE/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8BRP//JmD//4Sl///b5f///f7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////39///a5P//gqT//yRf + //8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf+lAEb/DgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAAQv8AAEX/VABF/+8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///DU3//1+K///M2v///P3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/P//ytn//1yI//8MTf//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf9UAEL/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/xQARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//yZf//+ZtP//8fX///////////////////// + //////////////////////////////////////////////////////////////////////////////39 + ///09///6O7//9vl///O2///xNT//77Q//++0P//w9P//87b///b5f//6O7///T3///9/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8PT//5ez//8kXv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/7UARv8UAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARP8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wJF + //9Cdf//xNP///39//////////////////////////////////////////////////////////////// + ///////////////////9/v//7fL//8nX//+dt///dZr//1KA//84bP//JV///xtY//8VVP//ElL//xFS + //8VVP//Glj//yVf//83bP//UoD//3SZ//+dt///yNf//+zx///9/v////////////////////////// + /////////////////////////////////////////////////////////f3//8HS//9Ac///AkX//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/1oARP8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF/xMARf+3AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8FR///WYb//9zl//////////////////////////////// + ///////////////////////////////////////////////////4+v//y9n//4Sl//9Ddf//GVf//wZJ + //8ARP//AEP//wBD//8AQ///AEP//wBD//8ARP//AET//wBD//8AQ///AEP//wBD//8AQv//AET//wZJ + //8ZVv//QnT//4Ok///K2P//9/n///////////////////////////////////////////////////// + /////////////////////////////9rk//9Wg///BEf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/twBF/xMARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAARP8AAEX/UABF//AARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Bkj//2SN + ///m7f////////////////////////////////////////////////////////////////////////// + ///8/f//zNn//2qS//8fW///A0b//wBD//8ARP//AET//wBD//8AQv//AEP//wFF//8ER///CEr//wlL + //8JS///CEn//wRH//8BRf//AEP//wBC//8AQ///AET//wBE//8AQ///A0b//x5a//9okf//ytj///v8 + /////////////////////////////////////////////////////////////////////////////+Tr + //9hi///BUf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/wAEX/UABE + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//9gi///6O7///////////////////////////////////// + ////////////////////////////////////////8vX//5Sw//8lX///AUT//wBD//8ARP//AEP//wJF + //8PT///KGL//0l5//9nkP//gqT//5ay//+kvP//q8H//6vB//+kvP//lrL//4Ok//9nkf//Snr//yli + //8PT///AkX//wBD//8ARP//AEP//wFE//8kXv//ka7///H1//////////////////////////////// + /////////////////////////////////////////////+bt//9diP//A0b//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARf8AAEX/OwBF/+YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Tn3//+Hp + //////////////////////////////////////////////////////////////////////////////H1 + //93m///DE3//wBD//8ARP//AEP//w1O//88cP//faD//7bJ///c5f//8fX///r7//////////////// + //////////////////////////////r8///x9f//3Ob//7bK//9+of//PXH//w5O//8AQ///AET//wBD + //8LTP//dJn///D0//////////////////////////////////////////////////////////////// + /////////////+Do//9Le///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+YARf87AEX/AABG/wAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wMARf+FAEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//zBn///P3P////////////////////////////////////////// + ////////////////////////////////////////uMv//xFQ//8AQ///AET//wpL//9MfP//qsH//+fu + ///9/f////////////////////////////////////////////////////////////////////////// + //////////////3+///o7v//rML//059//8KS///AET//wBD//8QTv//tMj///////////////////// + /////////////////////////////////////////////////////////////8za//8tZf//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//gBF/4UASP8DAEb/AAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8SUf//pr7///// + //////////////////////////////////////////////////////////////////////////////// + //++z///F1T//wBB//8ZVv//i6r//+vw//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////7PH//46s + //8aV///AEL//xVT//+7zf////////////////////////////////////////////////////////// + /////////////////////////////6O8//8QUP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAEb/AABF/wAARf9WAEX/9ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//2eQ///19/////////////////////////////////////////// + //////////////////////////////////////////////X4//+euP//aZH//7DF///5+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+vv//7LH//9pkf//m7b///X3//////////////// + ////////////////////////////////////////////////////////////////////////8/b//2ON + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/VgBF/wAARv8AAAAAAAAA + AAAARv8AAEb/BgBF/5kARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8kXv//zdr///// + //////////////////////////////////////////////////////////////////////////////// + //////////////7+///7/P///v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v8///+/v////////////////////////////////////////////////////////// + ////////////////////////////////////////ytj//yFd//8ARP//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf+ZAEb/BgBG/wAAAAAAAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//3ab///7/P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/P//cpj//wFF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAA + AAAAR/8AAEX/AABF/1MARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8bWP//yNf///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////E1P//GVf//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/1MARf8AAEf/AABG/wAASP8DAEX/iwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//1SB///z9v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////L1//9Qfv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI + /wMARv8AAEb/AABG/xQARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ER///k6////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////46s//8DR///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/FABG/wAARf8AAEb/NABF/+UARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xVU///D0/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////v9D//xNS//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+UARv80AEX/AABF/wAARf9cAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///LmX//+Hp + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////f5///KmP//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/1wARf8AAEj/AwBF/4sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBC//9Gd///8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////X3///Q3f//r8T//6a+ + //+4y///3uf///v8//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+/z//97n//+3y///pr3//67E + ///Q3f//9ff///////////////////////////////////////////////////////////////////// + /////////////////////////////+/z//9DdP//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/iwBI/wMARv8PAEX/swBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1WD + ///2+P////////////////////////////////////////////////////////////////////////// + //////////////3+///H1v//YIv//x9b//8LTP//CEr//w5P//8uZv//gaP//+Lq//////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+Lq//+Bo///Lmb//w5P//8ISv//C0z//x9b//9giv//x9b///39//////////////// + ////////////////////////////////////////////////////////////////////////9ff//1GA + //8AQv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+zAEb/DwBF/yIARf/RAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///XIj///j6//////////////////////////////// + ///////////////////////////////////////////////////9/v//rcP//ydh//8AQ///AEP//wBE + //8ARP//AET//wBD//8ER///S3z//9bh//////////////////////////////////////////////// + ///////////////////////////////////////////////////W4f//S3v//wRH//8AQ///AET//wBE + //8ARP//AEP//wBD//8mYP//rcL///3+//////////////////////////////////////////////// + ///////////////////////////////////3+f//WIX//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/9EARf8iAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Yhf//9/n///////////////////////////////////////////////////////////////////// + /////////////8fW//8nYf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//VoP//+vx + //////////////////////////////////////////////////////////////////////////////// + ////////6/H//1aD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8nYP//x9b///// + //////////////////////////////////////////////////////////////////////////////b4 + //9Ugv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF/0AARf9fAEX/8wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEH//0p5///y9v////////////////////////// + ///////////////////////////////////////////////////1+P//YIv//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8LTP//oLn///////////////////////////////////// + //////////////////////////////////////////////////+guf//C0z//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//9gi///9fj///////////////////////////////////// + ////////////////////////////////////////8fX//0d2//8AQf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/zAEX/XwBF/30ARf/6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //8PT///dZr///X4//////////////////////////////////////////////////////////////// + /////////////9Dd//8fW///AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Ugf//9Pf///////////////////////////////////////////////////////////////////// + ////////9Pf//1SB//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//x9b + ///Q3f////////////////////////////////////////////////////////////////////////// + ///09///dZr//xFQ//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//oARf99AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//K2T//6W9///y9v////////////////////////// + ////////////////////////////////////////////////////////r8T//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y9m///j6/////////////////////////// + ///////////////////////////////////////////////////j6///L2b//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//C0z//6/E//////////////////////////////// + ///////////////////////////////////////////////////z9v//qL///y1l//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf+6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//zBn + ///C0v////////////////////////////////////////////////////////////////////////// + //////////////////+mvv//CEr//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///JmD//97n//////////////////////////////////////////////////////////////// + /////////////97n//8mYP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ISv//pr7///////////////////////////////////////////////////////////////////// + ////////////////////////xNT//zNp//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/ugBF + /84ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8aV///s8f///////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8PT///AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//84bf//6O7///////////////////// + ////////////////////////////////////////////////////////6O7//zht//8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//w9P//+4y/////////////////////////// + ////////////////////////////////////////////////////////////////////////tsr//xxY + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/OAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3Wa + ///6+/////////////////////////////////////////////////////////////////////////// + ////////////////////////3uf//y9m//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//2mR///5+/////////////////////////////////////////////////////////// + ///////////////////5+///aZH//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///L2b//97n//////////////////////////////////////////////////////////////// + ///////////////////////////////////6/P//eZ3//wJG//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /90ARf/rAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8fW///zdr///////////////////////////////////// + ///////////////////////////////////////////////////////////////////8/f//gqP//wRH + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8aVv//vc////////////////////// + //////////////////////////////////////////////////////////////////+9z///Glb//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wRH//+Co////P3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///Q3P//Il3//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1KA + ///09/////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i6v//THz//wBE//8ARP//AEX//wBF//8ARf//AEX//wBF + //8AQ///Ckv//4Kk///5+v////////////////////////////////////////////////////////// + //////////////////////////////n6//+CpP//Ckv//wBD//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ARP//THz//+Lq//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X4//9Wg///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/zAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//faD///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///X4f//VoP//wpM//8AQv//AEP//wBD//8AQ///AEP//xlW//+CpP//7/T///////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+CpP//GVb//wBD//8AQ///AEP//wBD//8AQ///Ckz//1aD///X4f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////4Kj//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//gARf/8AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wRH + //+UsP////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s8f//oLn//1SB//8vZv//JmD//zht + //9okf//vc////j6//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j6//+9z///aJH//zht//8mYP//L2b//1SB + //+guf//6/H///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////mLP//wVH//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//ABF//wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//BEf//5ay//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9Pf//+Pr///e5///6O7///n7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////5+///6O7//97n///j6///9Pf///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+atf//BUj//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/+ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//f6L///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4Ol//8BRf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//gARf/zAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//9Ugv//9Pf///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////2+P//WIT//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//yBc///O2/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Hd//8jXv//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/rAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3ic///6+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/P//e5///wNG//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/90ARf/OAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//G1j//7XJ//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8dWf//AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/zgBF/7oARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Mmn//8TU + /////////////////////////////////////////////////////////////+vw///a5P///P3///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/z//9jj///q7/////////////////////////////////////////// + ///////////////////H1v//NWv//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+6AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//LmX//6i////z9/////////////////////////// + //////////////z9///Q3P//Wob//y1l//+Usf//7fL///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+zx//+Sr///K2T//1eE + ///O2////P3////////////////////////////////////////09///q8H//zBn//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf99AEX/+gBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///ElH//12I//+wxf//4On///P2///3+f//9fj//+rw///H1v//gKL//yli//8BRf//AEP//wtM + //9Ugv//vc7///f5//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////b4//+7zf//UoH//wpL//8AQ///AUX//yhh//9+of//x9b//+rw///1+P//9/n///P2 + ///h6f//ssb//1+K//8TUv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/6AEX/fQBF + /18ARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//w5P//8uZv//THz//1mG + //9Tgf//O2///xlX//8DRv//AEP//wBF//8ARf//AET//wBE//8YVv//aZH//8jX///3+f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////f5///H1v//Z5D//xdV//8ARP//AET//wBF + //8ARf//AEP//wNG//8YVv//O2///1OB//9Zhv//TXz//y9m//8PT///AET//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//MARf9fAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQv//AEP//wBC//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8BRP//Hlr//2WO//+6zP//8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+5zP//ZI3//x1Z//8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEL//wBD + //8AQv//AEP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF + /0AARf8iAEX/0QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//xRT + //9Nff//lbH//9Pf///2+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9vj//9Le//+TsP//THz//xRT//8ARP//AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/RAEX/IgBG/w8ARf+zAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wBD//8FSP//I17//1qG//+Usf//x9b//+rw + ///6/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r7///r8P//x9b//5Sw//9Zhf//I13//wVI + //8AQ///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7MARv8PAEb/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///AEP//wVH//8YVv//PnH//2iR//+Sr///uMv//9fi///p7///9Pf///r7 + ///+/v/////////////////////////////////////////////+/v//+vv///P2///n7v//1uH//7nM + //+Sr///Z5D//z5x//8YVv//BUf//wBD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI/wMARf8AAEX/XABF//gARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///AEP//wRH//8PUP//Il3//zlu//9Qf///ZY///3id//+IqP//kq///8fW///+/v///////+7y + //+guf//iKj//3qd//9mj///Tn3//zZr//8hXP//EFD//wRH//8AQ///AEP//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf9cAEX/AABF/wAARv80AEX/5QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEP//wBC + //8AQ///AET//wFF//8BRf//YIr///j6////////4+v//zNp//8AQ///AET//wBD//8AQv//AEP//wBD + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5QBG/zQARf8AAEb/AABG/xQARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBC//84bf//6O7///// + ///1+P//VYL//wBC//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEb/FABG/wAARv8AAEj/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xpY///M2f////////////9/of//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/4sASP8DAEb/AABH/wAARf8AAEX/UwBF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//CUv//6e+ + /////////////6rA//8KS///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/0AEX/UwBF/wAAR/8AAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//fJ////7+////////ztv//xxZ//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAAAAAAAAAAAEb/AABH + /wYARf+ZAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9SgP//9Pf////////p7///Om///wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/mQBH/wYARv8AAAAAAAAAAAAAR/8AAEX/AABG/1YARf/0AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y5m///h6f////////j6//9hi///AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//QARv9WAEX/AABH/wAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//FFP//8LS/////////////4yr//8CRv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEX/hQBF//4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8GSP//m7b/////////////tcn//w5P + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf+FAEj/AwBG/wAAAAAAAAAAAAAA + AAAAAAAAAEj/AABF/wAARf87AEX/5gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//9vlv///P3////////X4v//JF7//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///Akb//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/5gBF/zsARf8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEL//0d4///w9P///////+/z + //9Fdv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//F1X//1KA//+IqP//nrj//5Sw//9qkv//KmP//wNG//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/1EARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///JV///9nj////////+/z//22U//8AQ///AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//A0b//0V3//+6zP//8/b///// + //////////////r8///V4P//b5X//w5O//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8ABF/1EARP8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/EwBF + /7cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8PT///t8r///// + ////////mbT//wVI//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//9Nff//3eb////////////////////////////////////////09///haX//wtM + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+3AEb/EwBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//+Prf/////////////A0f//E1L//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///JWD//8rZ//////////////// + ///////////////////////////////////v8///Wob//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8wBF/1oAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8UAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//2ON + ///5+////////+Do//8sZf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//92m////P3///////////////////////////////////////////////////// + //+7zf//FFP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEb/FABG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABC/wAARf9UAEX/7wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///PHD//+vw////////9Pf//1B///8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQv//Dk3//7XJ//////////////// + /////////////////////////////////////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/7wBF/1QAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8dWv//0N3////////+/v//ep3//wBE//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//AEP//wBD + //8DRv//Dk///yNe//9Xg///3+f///////////////////////////////////////////////////// + ////////9vj//1aD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+lAEb/DgBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASP8AAET/AABF/z4ARf/iAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wpM//+swv////////////+lvf//CEr//wBE + //8ARP//AEP//wBC//8BRf//Ckz//xxZ//87b///Yoz//42s//+2yv//2OP///D0///+/v////////// + ///////////////////////////////////////////////////2+P//VoP//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/4gBF/z4ARP8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BQBF/4UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AUX//4Kj/////////////8rY//8ZVv//BUj//xZV//8xaP//VoP//4Ci//+rwf//z9z//+rv + ///5+v////////////////////////////////////////////////////////////////////////// + /////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+FAEb/BQBG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/IABF + /8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQv//V4T///b4////////7fL//5Cu + //+dt///xdX//+Tr///1+P///v7///////////////////////////////////v8///u8///5+3///z9 + ////////////////////////////////////////////////////////u83//xRT//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/wwBG/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAP/8AAEX/UwBF/+sARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8yaf//5Ov//////////////v7///////////////////////////////////3+ + ///09///4On//8HR//+atf//bpX//0R2//9Bc///y9n///////////////////////////////////// + /////////////+/z//9ahv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+sARf9TAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAAR/8IAEX/igBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//xZV///F1f////////// + ///////////////////3+f//5+7//8vZ//+mvv//e57//1F///8tZf//FFP//wVI//8AQ///AEL//wBD + //9Nff//3eb////////////////////////////////////////09///haX//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/igBH/wgARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//BEf//3ic///t8v//7fL//9Xg//+xxv//iKj//12I//83bP//Glf//wlK + //8BRP//AEP//wBD//8ARP//AEX//wBF//8ARf//AEX//wNG//9Gd///us3///P3//////////////// + ///6/P//1eD//2+V//8OTv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABD/wAARf9AAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Dk7//0J0 + //9Bc///IVz//wxN//8CRv//AEP//wBD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8YVf//VIL//4io//+dt///lLD//2qS//8qY///A0b//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/cAEX/QABD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABI/wIARf9jAEX/7gBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AEP//wBD//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AkX//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/7gBF/2MASP8CAEb/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //kARf+HAEb/CgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF + /xUARf+hAEX//QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/9AEX/oQBF/xUARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/yEARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7UARf8hAEX/AABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAET/AABG/ywARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEP/AABG/zMARf/GAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/xgBG + /zMAQ/8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AADz/AABF/zcARf/GAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/8YARf83ADz/AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG + /zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/MwA9 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAEH/AABF/y0ARf+1AEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/8AEX/tQBF/y0AQf8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEP/AABF/yEARf+hAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/6EARf8hAEP/AABH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/xUARf+HAEX/7wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/woARf9jAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/cAEX/YwBG/woARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH + /wMARf9AAEX/uwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/uwBF/0AAR/8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAARv8JAEX/UgBF/8MARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+wBF + /8MARf9SAEb/CQBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8AAEX/IABF + /4UARf/jAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+MARf+FAEX/IABI/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG + /wYARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAASP8AAEP/AABF/w4ARf9UAEX/tQBF//IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//IARf+1AEX/VABF/w4AQ/8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABP/wAARv8UAEX/WgBF + /7cARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+3AEX/WgBG/xQAT/8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARP8AAEX/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF + /+YARf+nAEX/UABF/xMARP8AAEX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AACf/AABG/wwARf87AEX/hQBF/8wARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/8wARf+FAEX/OwBG/wwAJ/8AAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEb/HgBF + /1YARf+YAEX/0wBF//QARf/+AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf/0AEX/0wBF/5gARf9WAEb/HgBH + /wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG/wYARv8iAEX/UwBF/4sARf/AAEX/5QBF + //cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/9wBF + /+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAEf/AwBG/xQARv80AEX/XQBF/4sARf+zAEX/0QBF/+cARf/0AEX/+gBF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //4ARf/6AEX/9ABF/+cARf/RAEX/swBF/4sARf9dAEb/NABG/xQAR/8DAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEf/AwBG/w8ARf8iAEX/QABF/18ARf99AEX/nABF/7oARf/NAEX/3QBF/+sARf/zAEX/+ABF + //wARf/8AEX/+ABF//MARf/rAEX/3QBF/80ARf+6AEX/nABF/30ARf9fAEX/QABF/yIARv8PAEf/AwBH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////wAAAA////////////////AAAAAA//////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////8AAAAAAAAA///////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////8AAAAAAAAAAA/////////+AAAAAAAAAAAH/////// + /+AAAAAAAAAAAAf////////AAAAAAAAAAAAD////////AAAAAAAAAAAAAP///////gAAAAAAAAAAAAB/ + //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA + AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA + AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB////AAAAAAAAAAAAAAAAAP///w + AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAA + A///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA + AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///A + AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + D///+AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA + AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA + AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP//////+AAAAAAAAAAAAAH////// + /wAAAAAAAAAAAAD////////AAAAAAAAAAAAD////////4AAAAAAAAAAAB/////////gAAAAAAAAAAB// + ///////8AAAAAAAAAAA//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA + AA////////////wAAAAAAAA/////////////AAAAAAAA/////////////+AAAAAAB//////////////8 + AAAAAD///////////////8AAAAP///////8= + + + \ No newline at end of file diff --git a/SCrawler/Channels/ChannelViewForm.vb b/SCrawler/Channels/ChannelViewForm.vb new file mode 100644 index 0000000..7673c11 --- /dev/null +++ b/SCrawler/Channels/ChannelViewForm.vb @@ -0,0 +1,704 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Tools +Imports System.ComponentModel +Imports System.Threading +Imports SCrawler.API.Base +Imports SCrawler.API.Reddit +Imports CmbDefaultButtons = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons +Imports RButton = PersonalUtilities.Tools.RangeSwitcherButton.Types +Friend Class ChannelViewForm : Implements IChannelLimits + Friend Event OnUsersAdded(ByVal StartIndex As Integer) +#Region "Declarations" + Private ReadOnly MyDefs As DefaultFormProps +#Region "Controls" + Private WithEvents CMB_CHANNELS As ComboBoxExtended + Private WithEvents CH_HIDE_EXISTS_USERS As CheckBox + Private WithEvents TXT_LIMIT As TextBoxExtended + Private ReadOnly LBL_LIMITS As ToolStripLabel + Private ReadOnly LBL_LIMIT_TEXT As ToolStripLabel + Private WithEvents OPT_LIMITS_DEFAULT As RadioButton + Private WithEvents OPT_LIMITS_COUNT As RadioButton + Private WithEvents OPT_LIMITS_POST As RadioButton + Private WithEvents OPT_LIMITS_DATE As RadioButton +#End Region + Private ReadOnly CProvider As ANumbers + Private ReadOnly CProgress As MyProgress + Private ReadOnly LimitProvider As ADateTime + Friend ReadOnly Property ImagesInRow As Integer + Get + Return Settings.ChannelsImagesColumns.Value + End Get + End Property + Friend ReadOnly Property ImagesRows As Integer + Get + Return Settings.ChannelsImagesRows.Value + End Get + End Property +#Region "Limits Support" + Private Property AutoGetLimits As Boolean Implements IChannelLimits.AutoGetLimits + Get + Return OPT_LIMITS_DEFAULT.Checked + End Get + Set(ByVal NewLimit As Boolean) + End Set + End Property + Private Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount + Get + If OPT_LIMITS_COUNT.Checked Then + Return AConvert(Of Integer)(TXT_LIMIT.Text, Nothing) + Else + Return Nothing + End If + End Get + Set(ByVal NewLimit As Integer?) + End Set + End Property + Private Property DownloadLimitPost As String Implements IChannelLimits.DownloadLimitPost + Get + If OPT_LIMITS_POST.Checked Then + Return TXT_LIMIT.Text + Else + Return String.Empty + End If + End Get + Set(ByVal NewLimit As String) + End Set + End Property + Private Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate + Get + If OPT_LIMITS_DATE.Checked Then + Return AConvert(Of Date)(TXT_LIMIT.Value, Nothing) + Else + Return Nothing + End If + End Get + Set(ByVal NewDate As Date?) + End Set + End Property + Private Sub SetLimit(Optional ByVal Post As String = "", Optional ByVal Count As Integer? = Nothing, + Optional ByVal [Date] As Date? = Nothing) Implements IChannelLimits.SetLimit + End Sub + Private Sub SetLimit(ByVal Source As IChannelLimits) Implements IChannelLimits.SetLimit + End Sub +#End Region + Friend ReadOnly PendingUsers As List(Of String) + Private ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly) + Private WithEvents MyRange As RangeSwitcher(Of UserPost) + Private ReadOnly SelectorExpression As Predicate(Of UserPost) = Function(ByVal Post As UserPost) As Boolean + If Post.UserID.ToLower = "[deleted]" Or Settings.BlackList.Contains(Post.UserID) Then + Return False + Else + If CH_HIDE_EXISTS_USERS.Checked Then + Return Not Settings.UsersList.Exists(Function(u) u.Name = Post.UserID) + Else + Return True + End If + End If + End Function +#End Region +#Region "Initializer and form methods" + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + CProgress = New MyProgress(ToolbarBOTTOM, PR_CN, LBL_STATUS, "Downloading data") With {.PerformMod = 10, .DropCurrentProgressOnTotalChange = False} + CProvider = New ANumbers(ANumbers.Modes.USA) With {.GroupSize = 3, .DecimalDigits = 0} + LimitProvider = New ADateTime("dd.MM.yyyy HH:mm") + PendingUsers = New List(Of String) + + CMB_CHANNELS = New ComboBoxExtended With { + .CaptionMode = ICaptionControl.Modes.CheckBox, + .CaptionText = "All Channels", + .Margin = New Padding(3), + .ChangeControlsEnableOnCheckedChange = False, + .CaptionBackColor = Color.Transparent, + .ListMaxDropDownItems = 15, + .CaptionPadding = New Padding(0, 3, 0, 0) + } + CMB_CHANNELS.Buttons.AddRange({CmbDefaultButtons.Refresh, CmbDefaultButtons.Add, CmbDefaultButtons.Delete, + New ActionButton(CmbDefaultButtons.Up) With {.ToolTipText = "Previous item (F1)"}, + New ActionButton(CmbDefaultButtons.Down) With {.ToolTipText = "Next item (F4)"}}) + TXT_LIMIT = New TextBoxExtended With { + .CaptionText = "Limit", + .Margin = New Padding(2), + .CaptionSizeType = SizeType.Absolute, + .CaptionWidth = 50, + .CaptionBackColor = Color.Transparent, + .TextBoxWidthMinimal = 200, + .Width = 200, + .CaptionPadding = New Padding(0, 3, 0, 0) + } + LBL_LIMITS = New ToolStripLabel With {.Text = "Limits:", .Margin = New Padding(2)} + LBL_LIMIT_TEXT = New ToolStripLabel With {.Text = String.Empty, .Margin = New Padding(2)} + OPT_LIMITS_DEFAULT = New RadioButton With {.Text = "Default", .BackColor = Color.Transparent, .Margin = New Padding(2)} + OPT_LIMITS_COUNT = New RadioButton With {.Text = "Count", .BackColor = Color.Transparent, .Margin = New Padding(2)} + OPT_LIMITS_POST = New RadioButton With {.Text = "Post", .BackColor = Color.Transparent, .Margin = New Padding(2)} + OPT_LIMITS_DATE = New RadioButton With {.Text = "Date", .BackColor = Color.Transparent, .Margin = New Padding(2)} + CH_HIDE_EXISTS_USERS = New CheckBox With {.Text = "Hide exists users", .BackColor = Color.Transparent, .Margin = New Padding(2), + .Checked = Settings.ChannelsHideExistsUser} + + TT_MAIN.SetToolTip(CH_HIDE_EXISTS_USERS, "Hide users which already exists in collection") + TT_MAIN.SetToolTip(OPT_LIMITS_COUNT, "Total posts count limit") + TT_MAIN.SetToolTip(OPT_LIMITS_POST, "Looking limit till post(-s) (comma separated)") + ToolbarTOP.Items.AddRange({CMB_CHANNELS.GetControlHost, + New ToolStripSeparator, + LBL_LIMITS, + New ToolStripControlHost(OPT_LIMITS_DEFAULT), + New ToolStripControlHost(OPT_LIMITS_COUNT), + New ToolStripControlHost(OPT_LIMITS_POST), + New ToolStripControlHost(OPT_LIMITS_DATE), + TXT_LIMIT.GetControlHost, + LBL_LIMIT_TEXT, + New ToolStripSeparator, + New ToolStripControlHost(CH_HIDE_EXISTS_USERS)}) + MyRange = New RangeSwitcher(Of UserPost) With {.Selector = Function(p) Not Settings.UserExists(Sites.Reddit, p.UserID)} + With MyRange + .Limit = ImagesInRow * ImagesRows + .InsertButtons(ToolbarTOP, {RButton.Previous, RButton.Next}, 5) + .SetButtonKey(RButton.Previous, Keys.F2) + .SetButtonKey(RButton.Next, Keys.F3) + .BindForm(Me) + .LabelNumbersProvider = CProvider + .UpdateControls() + .Selector = SelectorExpression + End With + AddHandler Settings.ChannelsImagesColumns.OnValueChanged, AddressOf ImagesCountChanged + AddHandler Settings.ChannelsImagesRows.OnValueChanged, AddressOf ImagesCountChanged + End Sub + Private Sub ChannelViewForm_Load(sender As Object, e As EventArgs) Handles Me.Load + MyDefs.MyViewInitialize(Me, Settings.Design) + RefillChannels(Settings.LatestSelectedChannel.Value) + ChangeComboIndex(0) + CMB_CHANNELS_ActionOnCheckedChange(CMB_CHANNELS.Checked) + With LIST_POSTS + Dim s As Size = GetImageSize() + .LargeImageList = New ImageList With {.ColorDepth = ColorDepth.Depth32Bit, .ImageSize = s} + .SmallImageList = New ImageList With {.ColorDepth = ColorDepth.Depth32Bit, .ImageSize = s} + End With + CMB_CHANNELS.Enabled(False) = Not CMB_CHANNELS.Checked + MyDefs.EndLoaderOperations() + End Sub + Private Sub ChannelViewForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + AppendPendingUsers() + e.Cancel = True + Hide() + End Sub + Private Sub ChannelViewForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + CMB_CHANNELS.Dispose() + CH_HIDE_EXISTS_USERS.Dispose() + TXT_LIMIT.Dispose() + LBL_LIMITS.Dispose() + OPT_LIMITS_DEFAULT.Dispose() + OPT_LIMITS_COUNT.Dispose() + OPT_LIMITS_POST.Dispose() + LBL_LIMIT_TEXT.Dispose() + PendingUsers.Clear() + MyDefs.Dispose() + End Sub + Private Sub ChannelViewForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown, CMB_CHANNELS.KeyDown + Dim b As Boolean = True + If Not Working Then + Select Case e.KeyCode + Case Keys.Insert : AddNewChannel() + Case Keys.F1 : ChangeComboIndex(-1) + Case Keys.F4 : ChangeComboIndex(1) + Case Keys.F5 : BTT_DOWNLOAD.PerformClick() + Case Keys.F8 : BTT_ADD_USERS.PerformClick() + Case Else : b = False + End Select + Else + b = False + If e.KeyCode = Keys.F8 Then BTT_ADD_USERS.PerformClick() : b = True + End If + If b Then LIST_POSTS.Select() : e.Handled = True + End Sub +#End Region + Private Sub RefillChannels(Optional ByVal SelectedChannel As String = Nothing) + CMB_CHANNELS.BeginUpdate() + Dim indx%? = Nothing + Dim t$ = If(SelectedChannel.IsEmptyString, CMB_CHANNELS.Text, SelectedChannel) + CMB_CHANNELS.Clear(ComboBoxExtended.ClearMode.Items + ComboBoxExtended.ClearMode.Text) + If Settings.Channels Is Nothing Then Settings.Channels = New ChannelsCollection : Settings.Channels.Load() + With Settings.Channels + If .Count > 0 Then + For i% = 0 To .Count - 1 + CMB_CHANNELS.Items.Add(.Item(i).ID) + If .Item(i).ID = t Then indx = i + Next + If indx >= 0 And indx <= CMB_CHANNELS.Count - 1 Then CMB_CHANNELS.SelectedIndex = indx + End If + End With + CMB_CHANNELS.EndUpdate() + End Sub +#Region "Images refill methods" + Private Sub AppendPendingUsers() + If LIST_POSTS.CheckedIndices.Count > 0 Then + PendingUsers.ListAddList((From p As ListViewItem In LIST_POSTS.Items Where p.Checked Select p.Text), LNC) + Dim a As Action = Sub() BTT_ADD_USERS.Text = $"Add ({PendingUsers.Count.ToString(CProvider)})" + If ToolbarTOP.InvokeRequired Then ToolbarTOP.Invoke(a) Else a.Invoke + End If + End Sub + Friend Function GetImageSize() As Size + Const mhw% = 256 + Dim s As Size = LIST_POSTS.Size + With LIST_POSTS + s.Width -= (.Margin.Left + .Margin.Right) + s.Height -= (.Margin.Top + .Margin.Bottom) + s.Width = s.Width / ImagesInRow - .Padding.Left * ImagesInRow - .Padding.Right * ImagesInRow + s.Height = s.Height / ImagesRows - .Padding.Top * ImagesRows - .Padding.Bottom * ImagesRows + If s.Width = 0 Then s.Width = 50 + If s.Height = 0 Then s.Height = 100 + If s.Width >= mhw Then + s.Width = mhw / 100 * 75 + s.Height = mhw + Else + s.Height = s.Width / 75 * 100 + If s.Height > mhw Then s.Height = mhw + End If + End With + Return s + End Function +#End Region +#Region "Toolbar controls" +#Region "Downloader" + Private TokenSource As CancellationTokenSource + Private Token As CancellationToken + Friend ReadOnly Property Working As Boolean + Get + Return Not TokenSource Is Nothing + End Get + End Property + Private _ShowCancelNotification As Boolean = True + Private _CollectionDownloading As Boolean = False + Private Async Sub BTT_DOWNLOAD_Click(sender As Object, e As EventArgs) Handles BTT_DOWNLOAD.Click + Try + AppendPendingUsers() + If Not TokenSource Is Nothing Then Exit Sub + Dim InvokeToken As Action = Sub() + If TokenSource Is Nothing Then + CProgress.TotalCount = 0 + CProgress.CurrentCounter = 0 + CProgress.Enabled = True + TokenSource = New CancellationTokenSource + Token = TokenSource.Token + BTT_DOWNLOAD.Enabled = False + OPT_LIMITS_DEFAULT.Enabled = False + OPT_LIMITS_COUNT.Enabled = False + OPT_LIMITS_POST.Enabled = False + OPT_LIMITS_DATE.Enabled = False + TXT_LIMIT.Enabled = False + CH_HIDE_EXISTS_USERS.Enabled = False + CMB_CHANNELS.Enabled(True) = False + MyRange.EnableButton(RButton.Previous, False) + MyRange.EnableButton(RButton.Next, False) + End If + End Sub + Dim c As Channel + If CMB_CHANNELS.Count > 0 Then + BTT_DOWNLOAD.Enabled = False + BTT_STOP.Enabled = True + If CMB_CHANNELS.Checked Then + InvokeToken.Invoke() + _CollectionDownloading = True + Settings.Channels.SetLimit(Me) + Await Task.Run(Sub() Settings.Channels.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress)) + Token.ThrowIfCancellationRequested() + c = GetCurrentChannel() + Else + c = GetCurrentChannel() + If Not c Is Nothing Then + InvokeToken.Invoke() + c.SetLimit(Me) + Await Task.Run(Sub() c.DownloadData(Token, CH_HIDE_EXISTS_USERS.Checked, CProgress)) + Token.ThrowIfCancellationRequested() + End If + End If + If Not c Is Nothing Then + SetLimitsByChannel(c) + MyRange.ChangeSource(c) + End If + Else + MsgBoxE("No one channels detected", MsgBoxStyle.Exclamation) + End If + Catch aex As ArgumentException When aex.HelpLink = 1 + ErrorsDescriber.Execute(EDP.ShowAllMsg, aex) + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Dim ee As EDP = EDP.SendInLog + If _ShowCancelNotification Then ee += EDP.ShowMainMsg + ErrorsDescriber.Execute(ee, oex, New MMessage("Downloading operation canceled", "Status...",, MsgBoxStyle.Exclamation)) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Channels downloading error") + Finally + If Not TokenSource Is Nothing AndAlso Not Settings.Channels.Downloading Then + TokenSource = Nothing + CProgress.Enabled = False + BTT_DOWNLOAD.Enabled = True + BTT_STOP.Enabled = False + _CollectionDownloading = False + OPT_LIMITS_DEFAULT.Enabled = True + OPT_LIMITS_COUNT.Enabled = True + OPT_LIMITS_POST.Enabled = True + OPT_LIMITS_DATE.Enabled = True + TXT_LIMIT.Enabled = True + CH_HIDE_EXISTS_USERS.Enabled = True + CMB_CHANNELS.Enabled(True) = True + CMB_CHANNELS_ActionOnCheckedChange(CMB_CHANNELS.Checked) + With MyRange + .EnableButton(RButton.Previous, .Count > 0 AndAlso .CurrentIndex > 0) + .EnableButton(RButton.Next, .Count > 0 AndAlso .CurrentIndex < .Max) + End With + End If + End Try + End Sub + Private Function GetCurrentChannel() As Channel + If CMB_CHANNELS.SelectedIndex >= 0 Then + Dim ChannelID$ = CMB_CHANNELS.Value + If Not ChannelID.IsEmptyString Then Return Settings.Channels.Find(ChannelID) + Else + MsgBoxE("No one channel selected", MsgBoxStyle.Exclamation) + End If + Return Nothing + End Function + Private Sub BTT_STOP_Click(sender As Object, e As EventArgs) Handles BTT_STOP.Click + [Stop]() + End Sub + Friend Sub [Stop](Optional ByVal ShowCancelNotification As Boolean = True) + _ShowCancelNotification = ShowCancelNotification + If Not TokenSource Is Nothing Then TokenSource.Cancel() : BTT_STOP.Enabled = False + End Sub +#End Region + Private Sub BTT_ADD_USERS_Click(sender As Object, e As EventArgs) Handles BTT_ADD_USERS.Click + AppendPendingUsers() + Dim i% + If LIST_POSTS.CheckedItems.Count > 0 Then + For i = 0 To LIST_POSTS.Items.Count - 1 + If LIST_POSTS.Items(i).Checked Then LIST_POSTS.Items(i).Checked = False + Next + End If + If PendingUsers.Count > 0 Then + Dim Added% = 0, Skipped% = 0 + Dim StartIndex% = Settings.Users.Count + Settings.Labels.Add(CannelsLabelName) + Settings.Labels.Add(LabelsKeeper.NoParsedUser) + Dim rUsers$() = UserBanned(PendingUsers.ToArray) + If rUsers.ListExists Then PendingUsers.RemoveAll(Function(u) rUsers.Contains(u)) + If PendingUsers.Count > 0 Then + With PendingUsers.Select(Function(u) New UserInfo(u, Sites.Reddit)) + For i = 0 To .Count - 1 + If Not Settings.UsersList.Contains(.ElementAt(i)) Then + Settings.UpdateUsersList(.ElementAt(i)) + Settings.Users.Add(New UserData(.ElementAt(i), False) With {.Temporary = True}) + With Settings.Users.Last + .Labels.Add(CannelsLabelName) + .UpdateUserInformation() + End With + Added += 1 + Else + Skipped += 1 + End If + Next + End With + End If + PendingUsers.Clear() + BTT_ADD_USERS.Text = "Add" + MsgBoxE($"Added users: {Added.ToString(CProvider)}{vbCr}Skipped users: {Skipped.ToString(CProvider)}{vbCr}Total: {PendingUsers.Count.ToString(CProvider)}") + RaiseEvent OnUsersAdded(StartIndex) + Else + MsgBoxE("No one users selected for add to collection") + End If + End Sub +#Region "Limits changer" + Private Sub OPT_LIMITS_DEFAULT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_DEFAULT.CheckedChanged + If OPT_LIMITS_DEFAULT.Checked Then + TXT_LIMIT.CheckForCompatible = False + TXT_LIMIT.Enabled = False + ChangeLimitMode(TextBoxExtended.ControlModes.TextBox) + End If + End Sub + Private Sub OPT_LIMITS_COUNT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_COUNT.CheckedChanged + If OPT_LIMITS_COUNT.Checked Then + TXT_LIMIT.Enabled = True + TXT_LIMIT.CheckingType = GetType(Integer) + TXT_LIMIT.CheckForCompatible = True + ChangeLimitMode(TextBoxExtended.ControlModes.TextBox) + If Not ACheck(Of Integer)(TXT_LIMIT.Text) Then TXT_LIMIT.Text = Channel.DefaultDownloadLimitCount + End If + End Sub + Private Sub OPT_LIMITS_POST_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_POST.CheckedChanged + If OPT_LIMITS_POST.Checked Then + TXT_LIMIT.Enabled = True + TXT_LIMIT.CheckForCompatible = False + ChangeLimitMode(TextBoxExtended.ControlModes.TextBox) + End If + End Sub + Private Sub OPT_LIMITS_DATE_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_LIMITS_DATE.CheckedChanged + If OPT_LIMITS_DATE.Checked Then + TXT_LIMIT.CheckForCompatible = False + ChangeLimitMode(TextBoxExtended.ControlModes.DateTimePicker) + End If + End Sub + Private Sub ChangeLimitMode(ByVal Mode As TextBoxExtended.ControlModes) + If Not TXT_LIMIT.ControlMode = Mode Then TXT_LIMIT.ControlMode = Mode + End Sub +#End Region +#Region "CMB_CHANNELS" + Private Sub SetLimitsByChannel(Optional ByVal SelectedChannel As Channel = Nothing) + LBL_STATUS.Text = String.Empty + Dim c As Channel = If(SelectedChannel, GetCurrentChannel()) + LBL_LIMIT_TEXT.Text = String.Empty + If Not c Is Nothing Then + Settings.LatestSelectedChannel.Value = c.ID + With c.PostsAll + If .Count > 0 Then + OPT_LIMITS_DEFAULT.Checked = True + Dim d As Date? = .FirstOrDefault(Function(p) p.Date.HasValue).Date + If d.HasValue Then + LBL_LIMIT_TEXT.Text = $"to date {AConvert(Of String)(d, ADateTime.Formats.BaseDateTime, String.Empty)}" + Else + LBL_LIMIT_TEXT.Text = $"to post [{c.First(Function(p) Not p.ID.IsEmptyString).ID}]" + End If + Else + OPT_LIMITS_COUNT.Checked = True + If TXT_LIMIT.Text.IsEmptyString Then TXT_LIMIT.Value = Channel.DefaultDownloadLimitCount + LBL_LIMIT_TEXT.Text = $"first {TXT_LIMIT.Text} posts" + End If + End With + End If + End Sub + Private Sub CMB_CHANNELS_ActionSelectedItemChanged(ByVal _Item As ListViewItem) Handles CMB_CHANNELS.ActionSelectedItemChanged + SetLimitsByChannel() + Dim c As Channel = GetCurrentChannel() + If Not c Is Nothing Then MyRange.ChangeSource(c, EDP.SendInLog) + End Sub + Private Sub CMB_CHANNELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_CHANNELS.ActionOnButtonClick + Select Case Sender.DefaultButton + Case CmbDefaultButtons.Refresh : RefillChannels() + Case CmbDefaultButtons.Add : AddNewChannel() + Case CmbDefaultButtons.Delete + Try + Dim c As Channel = GetCurrentChannel() + If Not c Is Nothing AndAlso MsgBoxE($"Do you really want to delete channel [{c}]?", MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = 0 Then + Settings.Channels.Remove(c) + RefillChannels() + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on trying to delete channel") + End Try + Case CmbDefaultButtons.Up : ChangeComboIndex(-1) + Case CmbDefaultButtons.Down : ChangeComboIndex(1) + End Select + End Sub + Private Sub CMB_CHANNELS_ActionOnCheckedChange(ByVal Mode As Boolean) Handles CMB_CHANNELS.ActionOnCheckedChange + Dim OneChannel As Boolean = Not CMB_CHANNELS.Checked + CMB_CHANNELS.Enabled(False) = OneChannel + If OneChannel Then + OPT_LIMITS_DEFAULT.Checked = True + LBL_LIMIT_TEXT.Text = String.Empty + ChangeComboIndex(0) + Else + CMB_CHANNELS.Button(ActionButton.BTT_UP_NAME).Enabled = False + CMB_CHANNELS.Button(ActionButton.BTT_DOWN_NAME).Enabled = False + End If + End Sub + Private Sub AddNewChannel() + Dim c$ = InputBoxE("Enter Reddit channel:", "New channel") + If Not c.IsEmptyString Then + Dim cc As New Channel With {.Name = c, .ID = c} + If Settings.Channels.Count = 0 OrElse Not Settings.Channels.Contains(cc) Then + Settings.Channels.Add(cc) + Settings.Channels.Last.Save() + RefillChannels() + MsgBoxE($"Channel [{c}] added") + Else + MsgBoxE($"Channel [{c}] already exists") + End If + Else + MsgBoxE("You doesn't enter channel name. Operation canceled.", MsgBoxStyle.Exclamation) + End If + End Sub + Private Sub ChangeComboIndex(ByVal Appender As Integer) + Try + Dim _ComboUpEnabled As Boolean = False + Dim _ComboDownEnabled As Boolean = False + If CMB_CHANNELS.Count > 0 Then + Dim i% = CMB_CHANNELS.SelectedIndex + If i < 0 And Appender = 0 Then + CMB_CHANNELS.SelectedIndex = 0 + Else + If i < 0 Then i = 0 + i += Appender + If i >= 0 And i <= CMB_CHANNELS.Count - 1 And Not CMB_CHANNELS.SelectedIndex = i Then CMB_CHANNELS.SelectedIndex = i + End If + i = CMB_CHANNELS.SelectedIndex + Dim c% = CMB_CHANNELS.Count - 1 + _ComboUpEnabled = i > 0 And c > 0 + _ComboDownEnabled = i < c And c > 0 + End If + CMB_CHANNELS.Button(ActionButton.BTT_UP_NAME).Enabled = _ComboUpEnabled + CMB_CHANNELS.Button(ActionButton.BTT_DOWN_NAME).Enabled = _ComboDownEnabled + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "ComboBox index changing") + End Try + End Sub +#End Region + Private Sub CH_HIDE_EXISTS_USERS_CheckedChanged(sender As Object, e As EventArgs) Handles CH_HIDE_EXISTS_USERS.CheckedChanged + If Not MyDefs.Initializing Then + Settings.ChannelsHideExistsUser.Value = CH_HIDE_EXISTS_USERS.Checked + MyRange.Update() + End If + End Sub +#End Region +#Region "CONTEXT" + Private Sub BTT_C_OPEN_USER_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_USER.Click + Dim p As UserPost = GetPostBySelected() + Try + If Not p.UserID.IsEmptyString Then Process.Start($"https://www.reddit.com/user/{p.UserID}") + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, $"Error on opening user by [https://www.reddit.com/user/{p.UserID}]") + End Try + End Sub + Private Sub BTT_C_OPEN_POST_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_POST.Click + Dim p As UserPost = GetPostBySelected() + Dim URL$ = String.Empty + Try + URL = $"https://www.reddit.com/r/{CMB_CHANNELS.Value}/comments/{p.ID.Split("_").Last}" + If Not p.ID.IsEmptyString Then Process.Start(URL) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, $"Error on opening post by [{URL}]") + End Try + End Sub + Private Sub BTT_C_OPEN_PICTURE_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_PICTURE.Click + OpenPostPicture() + End Sub + Private Sub BTT_C_OPEN_FOLDER_Click(sender As Object, e As EventArgs) Handles BTT_C_OPEN_FOLDER.Click + Dim f As SFile = GetPostBySelected().CachedFile + If Not f.IsEmptyString Then f.Open(SFO.Path) + End Sub + Private Sub BTT_C_REMOVE_FROM_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_C_REMOVE_FROM_SELECTED.Click + Try + Dim u$ = GetPostBySelected().UserID + If Not u.IsEmptyString Then + Dim uRemoved As Boolean = False + If PendingUsers.Contains(u) Then PendingUsers.Remove(u) : uRemoved = True + With LIST_POSTS + If .Items.Count > 0 Then + Dim i% + Dim a As Action = Sub() .Items(i).Checked = False + For i = 0 To .Items.Count - 1 + If .Items(i).Text = u And .Items(i).Checked Then + If LIST_POSTS.InvokeRequired Then LIST_POSTS.Invoke(a) Else a.Invoke + End If + Next + End If + End With + If uRemoved Then + MsgBoxE($"User [{u}] was successfully removed") + Else + MsgBoxE($"User [{u}] was not added to selected users") + End If + BTT_ADD_USERS.Text = $"Add ({PendingUsers.Count.ToString(CProvider)})" + Else + MsgBoxE("User does not selected", MsgBoxStyle.Exclamation) + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on removing user from selected") + End Try + End Sub + Private Sub BTT_C_ADD_TO_BLACKLIST_Click(sender As Object, e As EventArgs) Handles BTT_C_ADD_TO_BLACKLIST.Click + Try + Dim u$ = GetPostBySelected().UserID + If Not u.IsEmptyString Then + Dim result% = MsgBoxE(New MMessage($"Do you really want to add user [{u}] to the BlackList?", + "Adding user to the BlackList", + {"Add", "Add and update ranges", + "Add with the reason", "Add with the reason and update ranges", + "Remove from BlackList", "Cancel"}, + MsgBoxStyle.Exclamation) With {.ButtonsPerRow = 2}) + If result < 4 Then + Dim reason$ = String.Empty + If result = 2 Or result = 3 Then reason = InputBoxE("Enter the ban reason:", "Ban reason") + Settings.BlackList.ListAddValue(New UserBan(u, reason), LAP.NotContainsOnly) + Settings.UpdateBlackList() + If result = 1 Or result = 3 Then MyRange.Update() + MsgBoxE($"User {u} was added to the BlackList") + ElseIf result = 4 Then + If Settings.BlackList.Contains(u) Then + Settings.BlackList.Remove(u) + Settings.UpdateBlackList() + MsgBoxE($"User [{u}] was removed from the BlackList") + Else + MsgBoxE($"User [{u}] was not banned") + End If + End If + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Adding user to the BlackList") + End Try + End Sub +#End Region + Private Sub OpenPostPicture() + Dim f As SFile = GetPostBySelected().CachedFile + If f.Exists Then f.Open() Else MsgBoxE($"Picture file [{f}] does not found", MsgBoxStyle.Critical) + End Sub + Private Function GetPostBySelected() As UserPost + Dim p As UserPost = Nothing + Try + If LIST_POSTS.SelectedItems.Count > 0 Then + Dim t$ = LIST_POSTS.SelectedItems(0).Tag + With Settings.Channels.Find(CMB_CHANNELS.Value) + If .Count > 0 Then p = .Posts.Find(Function(pp) pp.ID = t) + End With + End If + Catch aex As ArgumentException When aex.HelpLink = 1 + ErrorsDescriber.Execute(EDP.LogMessageValue, aex) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "Post searching error") + End Try + Return p + End Function + Private Sub LIST_POSTS_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_POSTS.MouseDoubleClick + OpenPostPicture() + End Sub +#Region "MyRange" + Private Sub ImagesCountChanged(ByVal Sender As Object, ByVal _Name As String, ByVal _Value As Object) + AppendPendingUsers() + MyRange.Update(ImagesInRow * ImagesRows) + MyRange.GoTo(0, EDP.SendInLog) + End Sub + Private Sub MyRange_IndexChanged(ByVal Index As Integer) Handles MyRange.IndexChanged + Try + If MyDefs.Initializing Then Exit Sub + AppendPendingUsers() + LIST_POSTS.LargeImageList.Images.Clear() + LIST_POSTS.Items.Clear() + Dim p As UserPost + With MyRange.Current(EDP.ReturnValue).ListIfNothing + If .Count > 0 Then + Dim s As Size = GetImageSize() + Dim NullImage As Image = New Bitmap(s.Width, s.Height) + Dim ie As New ErrorsDescriber(EDP.ReturnValue) + For i% = 0 To .Count - 1 + p = .Item(i) + With p + LIST_POSTS.LargeImageList.Images.Add(.GetImage(s, ie, NullImage)) + LIST_POSTS.Items.Add(New ListViewItem(.UserID, i) With {.Tag = p.ID}) + With LIST_POSTS.Items(LIST_POSTS.Items.Count - 1) + If PendingUsers.Contains(.Text) Then .Checked = True + End With + End With + Next + End If + End With + Catch aex As ArgumentException When aex.HelpLink = 1 + MsgBoxE(aex.Message, MsgBoxStyle.Critical) + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex) + End Try + End Sub + Private Sub MyRange_RangesChanged(ByVal Sender As RangeSwitcher(Of UserPost)) Handles MyRange.RangesChanged + If Sender.Count > 0 Then MyRange_IndexChanged(0) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/Content/Icons/Rainbow.ico b/SCrawler/Content/Icons/Rainbow.ico new file mode 100644 index 0000000000000000000000000000000000000000..47e29f85d181d3a8c672d95c989b1540b687c101 GIT binary patch literal 9662 zcmchddrVVT9LH=}~E()^P1U&`Wazr4Hja>t=pOeH7LF~J(|1t!zBOk<$d=NYG zEeF3$B-#M+XKvi^2;$#)HNv3NVge|kr9JH)@EF{2&i z@0}Tf_+xThLlD0(q06xx{8{3)MG*fVKYZ2#@o&46-vaXY_&Y)VY^NFGr+t0P!7mew zrXc=g_+t+Aw!{2gKRpk>JYE|C9X+K=U_8x1xy#Gk02YJ=EA)qbp0w>{GQ*UPi^-&S5)RHvs?a;fB*^IGO+sUE5uo=)&A=eHsIOt=d z^@c)WVe>+56hmt6UhtfN;@MfBI!4TW?=*P53f9tzfo6z3R;r(8@0$%W+18-Zyr@QQ z<>l!hPRMtsupm%>Pi@J$Ur2p@J@uLU6jV2)vjWO}{MC_muEZB5`g6R{^5r}ZE^y8k*p&;hXreVl!V4=Z<$rnE%e&Qq8mpnF z(EWIk%gpWmhx$yT=LbTWK>G2TRrTQW+GrLdXBl%IS)b>9x7Q1HxY)+_M z?3weIKAdu2y5plxUGq|44EuX^WcIG958^xCVDoa@Bu=is(s0dJV{Us?IymWrSh+rx zd(KmEZ+sT9W8=mU^PA;9i5>ZclCI5MUT&Yu$?jJf8oV_Yy|H|7)Xn7!)vs{PT9g{! zBIai6(-=vO@i8W1|gOO<$`Cv7(x;a(Zlh^URH-()!rU=7rj_2Crk? zCiof~WS8pmAXdo7egA0t6@#+_h4;q&5HH(TrWvy+i=2z6PFtyUDbIeVOrOuRZzXG2 zL9CE3T3-CR@}W5gUZZSIs9kZ>+k5Fx2ZfCr1NuIbeKv-8xjxJhsg}BDy{c}%6XN9h z3N*feO6_rAZnokW=xfx}hf>{pT)uGqNVrSgbK_NxfKjEJa&Z|+{bH@pTU<3b!e-{S zPi0sZ`0O=MEaCXeJ+rQ={uyIQ`@{%|k>oFH_E`%`oB=K`yPubDf1Gy0vISz}GP zS146A`)nxBeAXlo%VMU?dhujt_bYsOBAtWS*hc5pj9AO-hs`C`LvDcQ>Gd<**!etr z+sTZ6;=M$4AG2VxM1& zwZ=BIXXNA#DC9ZTR8-3^YTx6_7j7O!wFIY7)N!5~oF<@{|6HN|W%^kEq5CTY0&0=b zX+~X)w$Qqg9;XEuUv)|HH|Vstg5YZy&i(iPN_($j*kr-y?|3sU4pnzp3>0WG+y+yDRo literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Icons/RedditIcon.ico b/SCrawler/Content/Icons/RedditIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9ee6a3dd345caaddd87daa550e15164540a35be GIT binary patch literal 67646 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 XWNNiQW`w}W00000NkvXXu0mjf-vh@i literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Icons/UsersIcon.ico b/SCrawler/Content/Icons/UsersIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e00c1ebac42c6d91b72ab6883fb4fce92a230738 GIT binary patch literal 25214 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 Z1fqay0M;3VvkHKLLYOB6VYq3+{|90sYEl3I literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Pictures/Cloud_01_16.png b/SCrawler/Content/Pictures/Cloud_01_16.png new file mode 100644 index 0000000000000000000000000000000000000000..18509207670f651c9eb263715c34880b49c97c50 GIT binary patch literal 384 zcmV-`0e}99P)v@+_41}7F1b-_e|gcWgQH0d8; z?!*Es_9ixAAvQ96&-|Wq?>RTGTCdmaLWCVrY_M9b_JIy?MgV*P^=LHuxy@ixJe^D? znO?8Qa=Apv=kt`yWn!@yKimPfZ@2*1BLHf%*(@_047t7eM?4-!=st8Y3i8^bVQs?9$>c|enZ!F#^bScr1{-EMgUDF8>a?g(DfsUg2V-~ z5&nQg40;lSc`B8n|Jo-k)9D9FDS|WBEz6P;IX)>8hD0KPX_^4G0+34p9Y7--3*a7T e{rAtbyTLb;)pZ!XgN3yK0000KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002#Nklb;@6hz-zuIx*|4XDCa6x6-Rzv2WDY3U(~BE>%t^gr`r#=MyE2ts$V>&WLsiAZ~E z>h|N?D-ifBipX9>TIcOWWN~)T@1UF9p)5;|$IFyKph(jcAP+l>LtU)D)@1M5ptBRV z4BgCq9Gd24w2o7EvbRZ+FdmJ0n@%sdpWO~yTdJxe^p$99i>>YRTX^UaUr!*8V=s44 zAUDRKwZ0;>))->|a^*SW1@H+>9O@TX0h_-80Psj{h5YBqJpcdz07*qoM6N<$f_sOX A&j0`b literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Pictures/Delete.png b/SCrawler/Content/Pictures/Delete.png new file mode 100644 index 0000000000000000000000000000000000000000..e241f3c4a6780ecf00c0e92541f4d6fe70651052 GIT binary patch literal 1558 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 literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Pictures/PencilPic_01_16.png b/SCrawler/Content/Pictures/PencilPic_01_16.png new file mode 100644 index 0000000000000000000000000000000000000000..041e23f453dc41b209a245f6e0047e4055ce5ee6 GIT binary patch literal 3233 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 Ef(vV(ivR!s literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Pictures/Pin_32.png b/SCrawler/Content/Pictures/Pin_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1e36e474e4d182b609c5d039b044412d406794a3 GIT binary patch literal 4758 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 literal 0 HcmV?d00001 diff --git a/SCrawler/Content/Pictures/StarPic_24.png b/SCrawler/Content/Pictures/StarPic_24.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a27414881d573e7a8a1d828def2cf0b259bde7 GIT binary patch literal 1164 zcmV;71atd|P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ=0!c(cRCwB~mRoF8RTPH5wa=bQr-dmkr7(l1wMc8B zXo}$?Rs$vyg+?t9<1GX)(U_p|(b!3hNn65;F`6KW8e)7<0}(<3sXXuk;?iiuw##-Y^=d=Kvm>m?KUajY~A(@|$^dO<; z#bD@~7J%`jGt{ymA}WiOy#lF==-L)k!0K?i?W()=i}T_A2L%(pog4g(Ep6c^o}8%) zM^F>LLN*Ilgi>G?BYSq8N9iPT3t_+@H)QzzdnT(lK3AoKrCY5gs;(6&3}B@akWN7^ z53UOpjhJu;-oy}Cf?!RlDli@tQyyde{UlJxwW5z#YpWB8Xoh0YQ8U0s*A%F(wD& zrSzGjyF{6{BRz@yKZbp~H2v+p#>4ZryuQZ0d=BrI3lLB!zkCEO zPl+l}bC+VxYC?j3Bd9p=KFs z?jwlSP#8men&8}e8zT>w9~FuC@)ZhuOAKbm~%C|ety;H4P^nG?uPc@oVqp%)WD4SsQJsd-v8x9`oh_FqTAwKg1ch$z}{WSfqtm% zg#10h{l(rV8T~uYL281M+UPFTVRuQ5@+>Tm(9XyBoHPn72gum#L)O eZ_EF!KL!BZ0ElR^TdXJm0000KP)RCr#cld(&~KorKG!6}pAEI1XqrRXFCGPxJYlBG@^^9N+= z)IT6&7cD}UAdX!R3QkJggn}SAITSKw_I{9)kltya4<3Pg@Au_9^5sZ6RoC^ch)i@x zosrVL^nL%n4R|f^Tz6T1mv@=UqVOShKFn}I+*46?B?ONTeWNO?l0@3Dc zBaTAA>IMeZvt#|;cyeGJ_W`!Mt<2Pnr`3T9&q61>cwI>HnC!tYum~&(hvlt+2si@; zYm!I`18b1nX?)X39GN7Jv#YFP&=am;e!l{lCflgy*SWdh-kq7T!*0XK!N2nl)7O{M T#0_6I00000NkvXXu0mjfQ&6S4 literal 0 HcmV?d00001 diff --git a/SCrawler/DownloadedInfoForm.Designer.vb b/SCrawler/DownloadedInfoForm.Designer.vb new file mode 100644 index 0000000..1abaa41 --- /dev/null +++ b/SCrawler/DownloadedInfoForm.Designer.vb @@ -0,0 +1,115 @@ + +Partial Friend Class DownloadedInfoForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(DownloadedInfoForm)) + Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() + Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() + Me.MENU_VIEW_SESSION = New System.Windows.Forms.ToolStripMenuItem() + Me.MENU_VIEW_ALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() + Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip() + Me.LIST_DOWN = New System.Windows.Forms.ListBox() + Me.ToolbarTOP.SuspendLayout() + Me.SuspendLayout() + ' + 'ToolbarTOP + ' + Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_VIEW, Me.BTT_REFRESH}) + Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) + Me.ToolbarTOP.Name = "ToolbarTOP" + Me.ToolbarTOP.Size = New System.Drawing.Size(554, 25) + Me.ToolbarTOP.TabIndex = 0 + ' + 'MENU_VIEW + ' + Me.MENU_VIEW.AutoToolTip = False + Me.MENU_VIEW.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.MENU_VIEW.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MENU_VIEW_SESSION, Me.MENU_VIEW_ALL}) + Me.MENU_VIEW.Image = CType(resources.GetObject("MENU_VIEW.Image"), System.Drawing.Image) + Me.MENU_VIEW.ImageTransparentColor = System.Drawing.Color.Magenta + Me.MENU_VIEW.Name = "MENU_VIEW" + Me.MENU_VIEW.Size = New System.Drawing.Size(45, 22) + Me.MENU_VIEW.Text = "View" + ' + 'MENU_VIEW_SESSION + ' + Me.MENU_VIEW_SESSION.AutoToolTip = True + Me.MENU_VIEW_SESSION.Name = "MENU_VIEW_SESSION" + Me.MENU_VIEW_SESSION.Size = New System.Drawing.Size(180, 22) + Me.MENU_VIEW_SESSION.Text = "Session" + Me.MENU_VIEW_SESSION.ToolTipText = "Show downloaded users by this session" + ' + 'MENU_VIEW_ALL + ' + Me.MENU_VIEW_ALL.AutoToolTip = True + Me.MENU_VIEW_ALL.Name = "MENU_VIEW_ALL" + Me.MENU_VIEW_ALL.Size = New System.Drawing.Size(180, 22) + Me.MENU_VIEW_ALL.Text = "All" + Me.MENU_VIEW_ALL.ToolTipText = "Show all users (sorted by latest download)" + ' + 'BTT_REFRESH + ' + Me.BTT_REFRESH.Image = Global.SCrawler.My.Resources.Resources.Refresh + Me.BTT_REFRESH.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_REFRESH.Name = "BTT_REFRESH" + Me.BTT_REFRESH.Size = New System.Drawing.Size(89, 22) + Me.BTT_REFRESH.Text = "Refresh (F5)" + Me.BTT_REFRESH.ToolTipText = "Force list refresh" + ' + 'ToolbarBOTTOM + ' + Me.ToolbarBOTTOM.Location = New System.Drawing.Point(0, 389) + Me.ToolbarBOTTOM.Name = "ToolbarBOTTOM" + Me.ToolbarBOTTOM.Size = New System.Drawing.Size(554, 22) + Me.ToolbarBOTTOM.TabIndex = 1 + ' + 'LIST_DOWN + ' + Me.LIST_DOWN.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_DOWN.FormattingEnabled = True + Me.LIST_DOWN.Location = New System.Drawing.Point(0, 25) + Me.LIST_DOWN.Name = "LIST_DOWN" + Me.LIST_DOWN.Size = New System.Drawing.Size(554, 364) + Me.LIST_DOWN.TabIndex = 2 + ' + 'DownloadedInfoForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(554, 411) + Me.Controls.Add(Me.LIST_DOWN) + Me.Controls.Add(Me.ToolbarBOTTOM) + Me.Controls.Add(Me.ToolbarTOP) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(570, 450) + Me.Name = "DownloadedInfoForm" + Me.ShowIcon = False + Me.Text = "Downloaded items" + Me.ToolbarTOP.ResumeLayout(False) + Me.ToolbarTOP.PerformLayout() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents ToolbarTOP As ToolStrip + Private WithEvents MENU_VIEW As ToolStripDropDownButton + Private WithEvents MENU_VIEW_SESSION As ToolStripMenuItem + Private WithEvents MENU_VIEW_ALL As ToolStripMenuItem + Private WithEvents BTT_REFRESH As ToolStripButton + Private WithEvents ToolbarBOTTOM As StatusStrip + Private WithEvents LIST_DOWN As ListBox +End Class \ No newline at end of file diff --git a/SCrawler/DownloadedInfoForm.resx b/SCrawler/DownloadedInfoForm.resx new file mode 100644 index 0000000..fb52630 --- /dev/null +++ b/SCrawler/DownloadedInfoForm.resx @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 133, 17 + + \ No newline at end of file diff --git a/SCrawler/DownloadedInfoForm.vb b/SCrawler/DownloadedInfoForm.vb new file mode 100644 index 0000000..8214bae --- /dev/null +++ b/SCrawler/DownloadedInfoForm.vb @@ -0,0 +1,124 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Imports SCrawler.API.Base +Friend Class DownloadedInfoForm + Private MyView As FormsView + Private ReadOnly LParams As New ListAddParams(LAP.IgnoreICopier) With {.e = EDP.None} + Friend Enum ViewModes As Integer + Session = 0 + All = 1 + End Enum + Friend Property ViewMode As ViewModes + Get + Return IIf(MENU_VIEW_ALL.Checked, ViewModes.All, ViewModes.Session) + End Get + Set(ByVal SMode As ViewModes) + Settings.InfoViewMode.Value = CInt(SMode) + End Set + End Property + Private ReadOnly _TempUsersList As List(Of IUserData) + Friend Sub New() + InitializeComponent() + _TempUsersList = New List(Of IUserData) + If Settings.InfoViewMode.Value = CInt(ViewModes.All) Then + MENU_VIEW_SESSION.Checked = False + MENU_VIEW_ALL.Checked = True + Else + MENU_VIEW_SESSION.Checked = True + MENU_VIEW_ALL.Checked = False + End If + Settings.InfoViewMode.Value = ViewMode + RefillList() + End Sub + Private Sub DownloadedInfoForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + If MyView Is Nothing Then + MyView = New FormsView(Me) + MyView.ImportFromXML(Settings.Design) + MyView.SetMeSize() + End If + RefillList() + Catch ex As Exception + End Try + End Sub + Private Sub DownloadedInfoForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + e.Cancel = True + Hide() + End Sub + Private Sub DownloadedInfoForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + If Not MyView Is Nothing Then MyView.Dispose(Settings.Design) + _TempUsersList.Clear() + End Sub + Private Sub DownloadedInfoForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.F5 Then RefillList() : e.Handled = True + End Sub + Private Class UsersDateOrder : Implements IComparer(Of IUserData) + Friend Function Compare(ByVal x As IUserData, ByVal y As IUserData) As Integer Implements IComparer(Of IUserData).Compare + Dim xv& = If(DirectCast(x, UserDataBase).LastUpdated.HasValue, DirectCast(x, UserDataBase).LastUpdated.Value.Ticks, 0) + Dim yv& = If(DirectCast(y, UserDataBase).LastUpdated.HasValue, DirectCast(y, UserDataBase).LastUpdated.Value.Ticks, 0) + Return xv.CompareTo(yv) * -1 + End Function + End Class + Private Sub RefillList() + Try + _TempUsersList.Clear() + Dim lClear As Action = Sub() LIST_DOWN.Items.Clear() + If LIST_DOWN.InvokeRequired Then LIST_DOWN.Invoke(lClear) Else lClear.Invoke + If ViewMode = ViewModes.Session Then + _TempUsersList.ListAddList(Downloader.Downloaded, LParams) + Else + _TempUsersList.ListAddList(Settings.Users.SelectMany(Of IUserData) _ + (Function(u) If(u.IsCollection, DirectCast(u, API.UserDataBind).Collections, {u})), LParams) + End If + If _TempUsersList.Count > 0 Then + _TempUsersList.Sort(New UsersDateOrder) + For Each user As IUserData In _TempUsersList + If LIST_DOWN.InvokeRequired Then + LIST_DOWN.Invoke(Sub() LIST_DOWN.Items.Add(user.DownloadedInformation)) + Else + LIST_DOWN.Items.Add(user.DownloadedInformation) + End If + Next + If _LatestSelected >= 0 AndAlso _LatestSelected <= LIST_DOWN.Items.Count - 1 Then + Dim aSel As Action = Sub() LIST_DOWN.SelectedIndex = _LatestSelected + If LIST_DOWN.InvokeRequired Then LIST_DOWN.Invoke(aSel) Else aSel.Invoke + Else + _LatestSelected = -1 + End If + Else + _LatestSelected = -1 + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "[DownloadedInfoForm.RefillList]") + End Try + End Sub + Private Sub MENU_VIEW_SESSION_Click(sender As Object, e As EventArgs) Handles MENU_VIEW_SESSION.Click + MENU_VIEW_SESSION.Checked = True + MENU_VIEW_ALL.Checked = False + ViewMode = ViewModes.Session + RefillList() + End Sub + Private Sub MENU_VIEW_ALL_Click(sender As Object, e As EventArgs) Handles MENU_VIEW_ALL.Click + MENU_VIEW_SESSION.Checked = False + MENU_VIEW_ALL.Checked = True + ViewMode = ViewModes.All + RefillList() + End Sub + Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click + RefillList() + End Sub + Private _LatestSelected As Integer = -1 + Private Sub LIST_DOWN_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_DOWN.SelectedIndexChanged + _LatestSelected = LIST_DOWN.SelectedIndex + End Sub + Private Sub LIST_DOWN_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_DOWN.MouseDoubleClick + Try + If _LatestSelected >= 0 AndAlso _LatestSelected <= _TempUsersList.Count - 1 AndAlso + Not DirectCast(_TempUsersList(_LatestSelected), UserDataBase).Disposed Then _TempUsersList(_LatestSelected).OpenFolder() + Catch ex As Exception + End Try + End Sub + Friend Sub Downloader_OnDownloadCountChange() + If ViewMode = ViewModes.Session Then RefillList() + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/Editors/CollectionEditorForm.Designer.vb b/SCrawler/Editors/CollectionEditorForm.Designer.vb new file mode 100644 index 0000000..f7a9069 --- /dev/null +++ b/SCrawler/Editors/CollectionEditorForm.Designer.vb @@ -0,0 +1,87 @@ +Namespace Editors + + Partial Friend Class CollectionEditorForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(CollectionEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + Me.CMB_COLLECTIONS = New PersonalUtilities.Forms.Controls.ComboBoxExtended() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + CType(Me.CMB_COLLECTIONS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.CMB_COLLECTIONS) + Me.CONTAINER_MAIN.ContentPanel.Padding = New System.Windows.Forms.Padding(2, 0, 2, 0) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(454, 251) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(454, 251) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'CMB_COLLECTIONS + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_COMBOBOX_ARROW" + ActionButton1.Visible = False + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_ADD" + ActionButton2.ToolTipText = "Add new collection" + Me.CMB_COLLECTIONS.Buttons.Add(ActionButton1) + Me.CMB_COLLECTIONS.Buttons.Add(ActionButton2) + Me.CMB_COLLECTIONS.Dock = System.Windows.Forms.DockStyle.Fill + Me.CMB_COLLECTIONS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple + Me.CMB_COLLECTIONS.Location = New System.Drawing.Point(2, 0) + Me.CMB_COLLECTIONS.Name = "CMB_COLLECTIONS" + Me.CMB_COLLECTIONS.Size = New System.Drawing.Size(452, 252) + Me.CMB_COLLECTIONS.TabIndex = 0 + ' + 'CollectionEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(454, 251) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.KeyPreview = True + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(470, 290) + Me.Name = "CollectionEditorForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Collection" + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + CType(Me.CMB_COLLECTIONS, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents CMB_COLLECTIONS As PersonalUtilities.Forms.Controls.ComboBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/CollectionEditorForm.resx b/SCrawler/Editors/CollectionEditorForm.resx new file mode 100644 index 0000000..06161e7 --- /dev/null +++ b/SCrawler/Editors/CollectionEditorForm.resx @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t + 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL + GlAKCkhEC4KgQlsLQkqhKi/lrYWWlxaw3dLddrerz/Q89+7dc2fbfTn3npf5fJJv2rS758z85nnOzJz5 + nZktAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMK3O3r79wVUIz65jfGNVxI/VIX69CvGO9M//a9P+e8o3B/8v + vKn9s+3fyX8dAJgmaWd+fl3E96Wd/E9XdvZHkfbvXNa+Rn45AGCS3bvjj/E/h3box5OrmxjPyy8PAEyS + XXO7zqhCeH/HDnwUOdCE+J6zdux4eH47YIrEGE8uy/Ls9Bnx/LooL0oH9b9Th/I1TVG+rCqKC+q6Xsh/ + FJgmO8vy6WknfdPQTnsjckMdwlPy2wITLO3wF6si/lGas1ekuXvX0Fzuyg9S3psOCl6qDwimQB3ji9Ok + 3btmEm907kpnEa/Mbw9Mlq1pB/6cdHZ/ZcfcPZrcXoXyrVVVFfl1gUmSdsS/libqPUMTd5NSvjktwrbB + kgDjVi1UT26K+Nnu+XrMuaud60uPWHpIfhtg3JqyfEaanHcPTdZNTRPCPy4uLj40LxIwBudt2fKAtOP/ + 0zQnN+5koIg3tpca81sC49J+LZcm5a3rJulYEq6LSV40YBOFEB6V5uFV6+flRiTsSwf9r81vDYzBCSO4 + vjfq/KAuiqfm5QM2QRPjuWnubUbz71DCn6W33zpYCmDT1EX5m92Tcuy5q47xFXkxgQ3UduqnOXfn0Bzc + xJSvz4sCbIb2pzlp8v1w/WScnKSzkjekRT1hsMTAKC0vL5/Ydud3zb1NT1FelBcL2GiDm3d0TMTJy0ea + pjk1LzYwAu3NvtLc+uTQXBtn7tYYCJtja/vQno5JOJFpQrzWb4hhNJoQnpjm1Q3D82wCcnNRFKfnxQQ2 + Qttk1zH5JjzhFmcIcHzyzb6O5aFem5J0sP/OvKjARmg7b7sm3xRkT3vDorwawJHb1t6Ep2NOTVoOtDch + yssMjFr6IPh8x8SbnsT4lrQamgPhCMzPzz+sifHjnXNpMnN5XnRglJaWlk5KE2z/0ISbxnzQQ0bgvlXz + 1ePSXPnG0NyZ+DRF8Zi8CsCo7Azh0V0TbkrzRc2B0G3wIJ9429CcmZLce4MgYJTyff87JtzU5uayLM/J + qwcM7vD5+jQ3DgzNlWnKDXldgFFJZwW/2jHZpj1727uZ5VWE3mofqJXmw4eG5sdUpqqqXXm1gFGoQnhJ + 12SbgRxoYvzjtIruK04vxRjPSvPgK0PzYmqTPqtemVcNGIU6xgu7JtusJH1ovH9ubu6UvLrQC2ncPyuN + /58Mz4fpTvnmvHrAKJQL5dO6J9ssJXxucWFhLq8yzLKtaUf5h2ncb9zz+8eUKsYP53UERmHX/PyOrsk2 + g7nJDUWYZUuPWHpIE8oPdIz92UiMn86rCoxIOmOYta8KD5uftk2Peb1hZtTzdVOHcF3HmJ+ZVCF+Ia8u + MCppcl0+PNlmOG1zYPtYYc2BzIQ0np+ZxvWPh8b5LObqvMrAqEzRo4BHmctijCfnEsBUqkP5u2ksz8Kd + PI8g5SfyagOj0jbIpQk2c01DR5Brmh3NfC4DTI324LWO8V0dY3pm48mAsEGm7OEgo0sRb9wZ4+NzGWDi + lWUZ0ti9Zt1YnvUU8fdyCYBRmsFbAh9xqhDvqEN4Xi4FTKz8s93vD4/hPiSdpJyXywCMWPtrgKuGJ12P + ck/6gPmDXAuYOHVR/lY6UN3XMXb7kDv17MAGqhaqJ6WJ1sdegDUJ726a5oG5JDB2917vL+Kl3eO1N/lQ + LgewUdIO8E0dk69vubosy+25JDA2bYNuFeJnOsZovxLjhbkkwEZZXl4+0QfOvfl2Ogg4O5cFNl1dFE9N + 4/B7Q+Oyj7mh/VzKZQE2UtM0j6iL+LWOidizhN3OPBiHuigvSmPwrvVjsn9pQnh1LguwGQa3Fo3fHp6M + Pcw97c1WcllgQy0tLZ2UDr7/qmMc9jJNiF/WkwNjMHhQ0GzfX/yIU8RLfRCxkdq+kzTfrugcf/3MgZ1l + +fRcHmCztU8Yq2P8h47J2cdcpTmQjdCE8IQ0vnzjdkjKP8nlAcZoWxXin3dP0n4l1eGb9UL92FwXOG51 + Ub48ja09w2Otz2nvTJpKs21QIWDs0lnKb6TJqTEphN3NQvncXBY4VtvSju4N3WOs17l6cXHxoblGwKRo + r8mlHeAtHZO2b9mfDohem8sCR2XX3K4z0hj65NCYklSTGONpuUzApNlVFFWaqP81NHF7mvD2tnM7lwbu + V/vwqTR2vrV+LPU7VSjf4ff+MAU0B65NeWVd12fm0sBhpTnzosHDp7rGUV8T9lVFvDiXCJgSrmEezDea + onhMrgsM25rmyuvSODkwNG56nvZyYvi5XCNg2mgOXM3tVVH9ci4L3KtpmlN9W7Y+VYhfiEkuEzCt8n3L + fzA8yXuY/b7OZEVZlovt3ew6xknf8965ublTcpmAaac5cG3C2zQ09Vv7bVAaC/+7fmz0Og6QYVZpDlyT + GD/dPlgpl4b+2Nru5NIYuGfdmOhxmhB/VBblL+QaATNKc+DBfH1nCI/OdWHGtTewSdv874fGgIT4xfYb + wlwmYNZpDlzNbVUIz85lYUblJ2i6BDacGP/u7O3bH5zLBPSF5sDV7K+L+Nu5LMyYtJP7xbSNfzy0zfue + A+03gak8WwdVAnpHc+CaxHiJ5sCZsnK9f/+6bd3v3JZ2/r+SawT0mebAg0kfjB93v/Pp136t3X693bWN + e56v6nsBhmkOXE24Ph0EnJXrwpSp63qhDuXnu7dtn1P+U1VVP5PLBHAozYGDtD+LchvU6TN4Iqa+lqGs + XO8/YVAlgMPQHLiSsC+dNb0ml4UJVxflRWm73b1+O/Y5YXcVwvNziQDun+bANYnxkvO2bHlALg0TJsZ4 + cl3ESzu3Xa8Trm+KYimXCeDIaQ48mKqIH9McOHl2zc/vaIr42a5t1vN8tCiK03OZAI6J5sCVFPFr7QNk + cl0Ys3yp6nvrtlO/s3K9f9ugSgDHSXPgILk58PxcFsYkX+93J8s1qUK8oynKF+YSAYyO5sCVhH3pgOjV + uSxsoqZpHpjq//bu7dLjFPHGND+Xc5kARk9z4JrE+JZUEl+1bpLFhYW5VPf/WLcd5N/ruj4zlwlg42gO + PCQfdXOVjdeE8MRU6xuGai9uXw2MgebA1YTrFkMoc10YsaYoX5rqfOf6uvc6e9LO/xW5RACbT3Pgam5N + B0Q/m8vCCLT3XnCQ2ZXwnWqhenIuE8D4aA5czV3OykZj19yuM1I9PzlUXwnhirIst+cyAYyf5sA1GTQH + uu/6MdoZ4+NTHb+1rq59j+v9wKTSHHhIPtI0zam5NByhNH5enGr306Fa9j1720ttuUQAE0tz4Epi/FJM + cl24b8ZNd25KdTk31whg8mkOXEm4pX1EbS4LHebn5x+WdnIf765fr3NVCOFRuUwA00Nz4Gr21kX58lwW + 1qjmq8el+nxjqF4S4yVLS0sn5TIBTB/NgWuiOfAQTVE+J9XltnV16nXCvqqIF+cSAUw3zYGH5INnb9/+ + 4Fyavtra7uRSLe4Zqk3f88MmxvNyjQBmhiavg/liVVVFrkuvLC4uPjSt/4eG6iEhXlOWZchlApg9mgNX + c3P6wD8nl6UXqvlqZ1rv/xmqQ+/ThPJv5ufnH5TLBDC7NAeuZm97n/tclplWhfCstL4/GVr/nsf1fqCH + NAeu5kB7aSSVZFabA13v786tVVFckGsE0C+aAw8mnSG/f25u7pRcmpnQbt8mlB/oWt8+pwnxWk+PBNAc + uJoqxC/MSnNgs7BQ1yFc17WePc97Z+1AD+C4aA5czU3T/qjXdED3zLQePx5ar75nf77ev3VQJQBWaQ5c + zZ4qhJfkskyVuigvapvbOtapt2lC/FFTls/IJQKgi+bA1aw0B07FGWOM8eQ6xnd1rEe/E+OX2jGdywTA + fdEcuCYx/u2kXzNudjTz6az/c53L3+NUMX7YI6EBjp7mwIO5pt3J5rpMlHKhfFpavu8PLW/fM+s/7QTY + eJoDV/PduiiWc1kmwuB6f7x7aDn7ntvrGC/MJQLgeGgOHKQK8Y46hOflsoxN0zQPbEJ8Z9cy9jxf3RnC + o3OZABgFzYGrab9efl0qyViaAxcXFubSgchnOpar77k8xnhaLhMAo6Q5cE2K+L7NfoBMHcJT0nvfvG5Z + +h3X+wE2iebAg7m6LMvtuS4bKl/v14txSMLuKoQX5BIBsBk0B64kfCfV4om5LCN33pYtD3DA1ZVwfb1Q + PzaXCYDNpDlwJWH3RnSe75rbdUZ6/X9b/369z0eLojg9lwmAcdAcuJqV5sCRaEJ4QnrNbw+9R9+zcr1/ + 26BKAIyV5sBDcll7W95cmmPSPocgvc6dQ6/b9+xpivJluUQATBDNgQdz1TE2B6phV4p446TdhAmAIens + 9ZXpQ1tz4KA58Am5LPfrrB07Hp7+zr90v1Z/UxXxU3Vdn5nLBMAk0xy4krC7WSifm8tyWGVZnl2F+M3u + 1+hxYrxkeXn5xFwmAKaB5sDV7E9nsRfnsqyTdnIvGtxiuPPv9jV7Ul1ekUsEwLTRHHgwVSjfsbS0dFIu + TWtr+6uB9P8ODP/Znue7ZVmek2sEwBTT2Laa8sr2enb7jHoHRl0JV8QYH5nHDQCzwJ0DV/P1tKO7vuO/ + 9zpVKN/qej/AjNIcKB3Z24TyVXmIADCrNAfKmtzUxHhuHhoAzDrNgZJyVQjhUXlIANAjmgN7m/Du471d + MgBTzp0D+5Sw777uiQBAz2gO7EPCLSnn500OAAOaA2c615RlGfKmBoBDaQ6cvTQhvmd+fv5BeRMDwGFp + DpyJuN4PwDHQHDjVubUqigvypgSAo6M5cPrShHjtYghl3oQAcGw0B05Rivi+ubm5U/KmA4Djozlw4rM/ + X+/fOthiADA6mgMnME2IP2rK8hl5GwHAxtAcOFH5SozxrLxpAGBjaQ4cf6oYP9w0zal5kwDA5tAcOLYc + aC/FpE1wwmBLAMAm0xy46bk91fvCXH4AGCvNgZuRIn6tKYrH5JoDwGTQHLihuTzGeFouNQBMFs2BI4/r + /QBMB82Bo0rYXYXwglxWAJh8mgOPN+H6eqF+bC4nAEwVzYHHkiL+c1EUp+caAsB00hx4FInxLalk2waV + A4AppznwfrOnLsqX53IBwOzQHHiYFPHGaqF6Ui4TAMwezYGHpirip+q6PjOXBwBmmubANjFesry8fGKu + CQD0Q4+bA/dWMf56LgMA9E8PmwO/W5blOXn1AaC/+tMcWF4ZY3xkXm0AYOabA2O8ZGlp6aS8ugDAGrPY + HLi3CeWr8voBAIczQ82BN6UDmnPzagEA92f6mwPLz1dVVeTVAQCO1LQ2B1Yh/PX8/PyD8moAAEdrupoD + w76qiBfnRQcAjtMUNAeGW1LOz8sLAIzKBDcHXlOWZciLCQCM2gQ2B142Nzd3Sl48AGCjTEhz4H7X+wFg + k425OfDWqqh+Pi8KALDJtqWDgDemHfKBoR30hqUJ8dqY5PcHAMalKcrnpJ3z94Z31qNO+/t+1/sBYIKk + k/LT6hD+Mu2oR/4rgXTW/+X02r+U3woAmDTtz/GaIv5F2nH/ZHhHfpS5J+Vf01n/S9LLbhu8OgAw0dpb + 8TYL5XPTmfvb0o78v/MOvWtHvybtzXzKT1Qx/n5d1wv5pQCAaXXvAUFRLLXd+3WMFzZF+cKUl7X/rIri + gsWFhbn8RwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6LEtW/4flgYiLD1qeX0A + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE + QVRIS62WWWxMURjHL220JW1HausmlFrDFKUhnUGH6bRFzJ2idImlC0Vp2mlji1A8iNhCPIjIRES8EU+W + h2oEtbSDTk3HNNM7S01VKsXjkb/vXBo3k1Ee7sMvmZzzzf//ne/+z50RAAxL1MUIG4G/YAv3HSVhF5Vw + IYNdz3LadVj9RgdTB+HQYYPHIJuE1ocSdlEJFzG+1bPRLQLinglIeCkg+XUkKvz56hnkOfQs/rmA8S9H + YEp7FDI64tAQtKhnsMapZ7zzNHsUFnbGY4VzIk70l6hnIH4wsDR7NBZ3apDrSqL5T8eFgUr1DLZ78lim + Q4N8VzK29MxEpZSBa4M16hnU+c3M9CEFpdJsVHsXos63DDcHrf9nQEXD5VymwW/5USLNwl5vJhp7dTgW + NML2pR7jbsUMS+KdMTa5Q8NQxinfBU4dRFcOyjy52OtbhwOBDTgZLKPPmTgY0ON4MBdNfSbYBupxY8Aq + G10dqMG5/nIc7ytGQ6CQRliAamkTN/g1Ai4e95Qy3iogpX0UtBRDnhRzdxq2SXOxz5eFQ70rScCEU335 + ssGxj0YS06HSm4GN3ekwdE2C1hGH1LZR0JDOJof5jwHvnIvzTa0jlooTYfktvt+fhcOBHDQFTWRgxJGP + ObAGsulZLMLWnjlY756K5c4JmNcRi6T2SGheCIihS2l5ozAo6NRhMolnUAcGV6IcwwqvFrX+JTjYuwKH + SfRAYDms/mzs9y1GFe2VSnOw1j0FejqpLN4WCX4ZufiIBwLMLxQGm12rsLQzgWKYgmLPLNTQw6ynpDSS + IBet8y+TqaVRVdFIeJrWuCcj+/0EzH43BomvIhBLI45uFiDcJ+6QwROFwa6+Amb9bGFNg6Xs9Ncd7Oy3 + Knb2eyU7/20nu9y/m136tIvEl6BC0qKoZwby3alo9JVhj7T5R7m/kJVIIityi8zyXmTiW+I10SqyIQNb + uIgNwYuuf25kFd75KPKkI49OmUWnrfYWyXv/wBb2cijhhVf6a9lGei65XclYRDd6mj0GWz2iLBJaH0rY + RSVc5Eywmhm7kuQXHX+bJlBStrh+zTi0PpSwi0q4yNFAOVvgiEcKJWUsxZn/NhT+znlofShhF5VwkRpv + MUtti4KGYjj6sYCIh5QSu4oG27stjItHU+cjeQzvkcFzFQ2KnSKLoc4FukDCXeI2GbSoaFD4ziyPxNxK + 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/SCrawler/Editors/CollectionEditorForm.vb b/SCrawler/Editors/CollectionEditorForm.vb new file mode 100644 index 0000000..c95b2d8 --- /dev/null +++ b/SCrawler/Editors/CollectionEditorForm.vb @@ -0,0 +1,81 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Namespace Editors + Friend Class CollectionEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Private ReadOnly Collections As List(Of String) + Friend Property [Collection] As String = String.Empty + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + Collections = New List(Of String) + End Sub + Friend Sub New(ByVal CollectionName As String) + Me.New + Collection = CollectionName + End Sub + Private Sub CollectionEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design) + .MyOkCancel = New OkCancelToolbar(Me, Me, CONTAINER_MAIN.BottomToolStripPanel) + .MyOkCancel.AddThisToolbar() + Collections.ListAddList((From c In Settings.Users Where c.IsCollection Select c.CollectionName), LAP.NotContainsOnly, EDP.ThrowException) + If Collections.ListExists Then CMB_COLLECTIONS.Items.AddRange(From c In Collections Select New Controls.Base.ListItem(c)) + If Not Collection.IsEmptyString And Collections.Contains(Collection) Then CMB_COLLECTIONS.SelectedIndex = Collections.IndexOf(Collection) + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub CollectionEditorForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not BeforeCloseChecker(MyDefs.ChangesDetected) Then + e.Cancel = True + Else + Collections.Clear() + MyDefs.Dispose() + End If + End Sub + Private Sub CollectionEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.Insert Then + AddNewCollection() + e.Handled = True + Else + e.Handled = False + End If + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If CMB_COLLECTIONS.SelectedIndex >= 0 Then + Collection = CMB_COLLECTIONS.Value.ToString + MyDefs.ChangesDetected = False + DialogResult = DialogResult.OK + Close() + Else + MsgBoxE("Collection does not selected", MsgBoxStyle.Exclamation) + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.ChangesDetected = False + DialogResult = DialogResult.Cancel + Close() + End Sub + Private Sub CMB_COLLECTIONS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_COLLECTIONS.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Add Then AddNewCollection() + End Sub + Private Sub AddNewCollection() + Dim c$ = InputBoxE("Enter new collection name:", "Collection name") + If Not c.IsEmptyString Then + If Not Collections.Contains(c) Then + Collections.Add(c) + CMB_COLLECTIONS.Items.Add(c) + CMB_COLLECTIONS.SelectedIndex = CMB_COLLECTIONS.Count - 1 + Else + Dim i% = Collections.IndexOf(c) + If i >= 0 Then CMB_COLLECTIONS.SelectedIndex = i + End If + End If + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb new file mode 100644 index 0000000..c8e83da --- /dev/null +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -0,0 +1,290 @@ +Namespace Editors + + Partial Friend Class GlobalSettingsForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(GlobalSettingsForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TP_IMAGES As System.Windows.Forms.TableLayoutPanel + Dim TP_CHANNELS_IMGS As System.Windows.Forms.TableLayoutPanel + Dim TT_MAIN As System.Windows.Forms.ToolTip + Me.TXT_GLOBAL_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_SEPARATE_VIDEO_FOLDER = New System.Windows.Forms.CheckBox() + Me.TXT_COLLECTIONS_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_IMAGE_LARGE = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_IMAGE_SMALL = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_DEF_TEMP = New System.Windows.Forms.CheckBox() + Me.TXT_CHANNELS_ROWS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_CHANNELS_COLUMNS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_IMAGES = New System.Windows.Forms.TableLayoutPanel() + TP_CHANNELS_IMGS = New System.Windows.Forms.TableLayoutPanel() + TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + TP_MAIN.SuspendLayout() + CType(Me.TXT_GLOBAL_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_COLLECTIONS_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + TP_IMAGES.SuspendLayout() + CType(Me.TXT_IMAGE_LARGE, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_IMAGE_SMALL, System.ComponentModel.ISupportInitialize).BeginInit() + TP_CHANNELS_IMGS.SuspendLayout() + CType(Me.TXT_CHANNELS_ROWS, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_CHANNELS_COLUMNS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.Controls.Add(Me.TXT_GLOBAL_PATH, 0, 0) + TP_MAIN.Controls.Add(Me.CH_SEPARATE_VIDEO_FOLDER, 0, 2) + TP_MAIN.Controls.Add(Me.TXT_COLLECTIONS_PATH, 0, 4) + TP_MAIN.Controls.Add(TP_IMAGES, 0, 1) + TP_MAIN.Controls.Add(Me.CH_DEF_TEMP, 0, 3) + TP_MAIN.Controls.Add(TP_CHANNELS_IMGS, 0, 5) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 6 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 16.66667!)) + TP_MAIN.Size = New System.Drawing.Size(584, 191) + TP_MAIN.TabIndex = 0 + ' + 'TXT_GLOBAL_PATH + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton1) + Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton2) + Me.TXT_GLOBAL_PATH.CaptionText = "Data Path" + Me.TXT_GLOBAL_PATH.CaptionToolTipEnabled = True + Me.TXT_GLOBAL_PATH.CaptionToolTipText = "Root path for storing users' data" + Me.TXT_GLOBAL_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_GLOBAL_PATH.Location = New System.Drawing.Point(4, 4) + Me.TXT_GLOBAL_PATH.Name = "TXT_GLOBAL_PATH" + Me.TXT_GLOBAL_PATH.Size = New System.Drawing.Size(576, 22) + Me.TXT_GLOBAL_PATH.TabIndex = 0 + ' + 'CH_SEPARATE_VIDEO_FOLDER + ' + Me.CH_SEPARATE_VIDEO_FOLDER.AutoSize = True + Me.CH_SEPARATE_VIDEO_FOLDER.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_SEPARATE_VIDEO_FOLDER.Location = New System.Drawing.Point(4, 66) + Me.CH_SEPARATE_VIDEO_FOLDER.Name = "CH_SEPARATE_VIDEO_FOLDER" + Me.CH_SEPARATE_VIDEO_FOLDER.Padding = New System.Windows.Forms.Padding(100, 0, 0, 0) + Me.CH_SEPARATE_VIDEO_FOLDER.Size = New System.Drawing.Size(576, 24) + Me.CH_SEPARATE_VIDEO_FOLDER.TabIndex = 2 + Me.CH_SEPARATE_VIDEO_FOLDER.Text = "Separate video folders" + TT_MAIN.SetToolTip(Me.CH_SEPARATE_VIDEO_FOLDER, resources.GetString("CH_SEPARATE_VIDEO_FOLDER.ToolTip")) + Me.CH_SEPARATE_VIDEO_FOLDER.UseVisualStyleBackColor = True + ' + 'TXT_COLLECTIONS_PATH + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_CLEAR" + Me.TXT_COLLECTIONS_PATH.Buttons.Add(ActionButton3) + Me.TXT_COLLECTIONS_PATH.CaptionText = "Collections folder" + Me.TXT_COLLECTIONS_PATH.CaptionToolTipEnabled = True + Me.TXT_COLLECTIONS_PATH.CaptionToolTipText = "Set collections folder name (name only)" + Me.TXT_COLLECTIONS_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_COLLECTIONS_PATH.Location = New System.Drawing.Point(4, 128) + Me.TXT_COLLECTIONS_PATH.Name = "TXT_COLLECTIONS_PATH" + Me.TXT_COLLECTIONS_PATH.Size = New System.Drawing.Size(576, 22) + Me.TXT_COLLECTIONS_PATH.TabIndex = 4 + ' + 'TP_IMAGES + ' + TP_IMAGES.ColumnCount = 2 + TP_IMAGES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_IMAGES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_IMAGES.Controls.Add(Me.TXT_IMAGE_LARGE, 0, 0) + TP_IMAGES.Controls.Add(Me.TXT_IMAGE_SMALL, 1, 0) + TP_IMAGES.Dock = System.Windows.Forms.DockStyle.Fill + TP_IMAGES.Location = New System.Drawing.Point(1, 32) + TP_IMAGES.Margin = New System.Windows.Forms.Padding(0) + TP_IMAGES.Name = "TP_IMAGES" + TP_IMAGES.RowCount = 1 + TP_IMAGES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_IMAGES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!)) + TP_IMAGES.Size = New System.Drawing.Size(582, 30) + TP_IMAGES.TabIndex = 1 + ' + 'TXT_IMAGE_LARGE + ' + Me.TXT_IMAGE_LARGE.CaptionText = "Large image size" + Me.TXT_IMAGE_LARGE.CaptionToolTipEnabled = True + Me.TXT_IMAGE_LARGE.CaptionToolTipText = "Maximum large image size by height" + Me.TXT_IMAGE_LARGE.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_IMAGE_LARGE.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_IMAGE_LARGE.Location = New System.Drawing.Point(3, 3) + Me.TXT_IMAGE_LARGE.Name = "TXT_IMAGE_LARGE" + Me.TXT_IMAGE_LARGE.NumberMaximum = New Decimal(New Integer() {1000, 0, 0, 0}) + Me.TXT_IMAGE_LARGE.NumberMinimum = New Decimal(New Integer() {50, 0, 0, 0}) + Me.TXT_IMAGE_LARGE.Size = New System.Drawing.Size(285, 22) + Me.TXT_IMAGE_LARGE.TabIndex = 0 + Me.TXT_IMAGE_LARGE.Text = "50" + Me.TXT_IMAGE_LARGE.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'TXT_IMAGE_SMALL + ' + Me.TXT_IMAGE_SMALL.CaptionText = "Small image size" + Me.TXT_IMAGE_SMALL.CaptionToolTipEnabled = True + Me.TXT_IMAGE_SMALL.CaptionToolTipText = "Maximum small image size by height" + Me.TXT_IMAGE_SMALL.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_IMAGE_SMALL.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_IMAGE_SMALL.Location = New System.Drawing.Point(294, 3) + Me.TXT_IMAGE_SMALL.Name = "TXT_IMAGE_SMALL" + Me.TXT_IMAGE_SMALL.NumberMaximum = New Decimal(New Integer() {500, 0, 0, 0}) + Me.TXT_IMAGE_SMALL.NumberMinimum = New Decimal(New Integer() {10, 0, 0, 0}) + Me.TXT_IMAGE_SMALL.Size = New System.Drawing.Size(285, 22) + Me.TXT_IMAGE_SMALL.TabIndex = 1 + Me.TXT_IMAGE_SMALL.Text = "10" + Me.TXT_IMAGE_SMALL.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'CH_DEF_TEMP + ' + Me.CH_DEF_TEMP.AutoSize = True + Me.CH_DEF_TEMP.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_DEF_TEMP.Location = New System.Drawing.Point(4, 97) + Me.CH_DEF_TEMP.Name = "CH_DEF_TEMP" + Me.CH_DEF_TEMP.Padding = New System.Windows.Forms.Padding(100, 0, 0, 0) + Me.CH_DEF_TEMP.Size = New System.Drawing.Size(576, 24) + Me.CH_DEF_TEMP.TabIndex = 3 + Me.CH_DEF_TEMP.Text = "Temporary default" + TT_MAIN.SetToolTip(Me.CH_DEF_TEMP, "Default value on user creating") + Me.CH_DEF_TEMP.UseVisualStyleBackColor = True + ' + 'TP_CHANNELS_IMGS + ' + TP_CHANNELS_IMGS.ColumnCount = 2 + TP_CHANNELS_IMGS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_CHANNELS_IMGS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_CHANNELS_IMGS.Controls.Add(Me.TXT_CHANNELS_ROWS, 0, 0) + TP_CHANNELS_IMGS.Controls.Add(Me.TXT_CHANNELS_COLUMNS, 1, 0) + TP_CHANNELS_IMGS.Dock = System.Windows.Forms.DockStyle.Fill + TP_CHANNELS_IMGS.Location = New System.Drawing.Point(1, 156) + TP_CHANNELS_IMGS.Margin = New System.Windows.Forms.Padding(0) + TP_CHANNELS_IMGS.Name = "TP_CHANNELS_IMGS" + TP_CHANNELS_IMGS.RowCount = 1 + TP_CHANNELS_IMGS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_CHANNELS_IMGS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 34.0!)) + TP_CHANNELS_IMGS.Size = New System.Drawing.Size(582, 34) + TP_CHANNELS_IMGS.TabIndex = 5 + ' + 'TXT_CHANNELS_ROWS + ' + Me.TXT_CHANNELS_ROWS.CaptionText = "Channels rows" + Me.TXT_CHANNELS_ROWS.CaptionToolTipEnabled = True + Me.TXT_CHANNELS_ROWS.CaptionToolTipText = "How many images' rows should be shown in the channels form" + Me.TXT_CHANNELS_ROWS.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_CHANNELS_ROWS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_CHANNELS_ROWS.Location = New System.Drawing.Point(3, 3) + Me.TXT_CHANNELS_ROWS.Name = "TXT_CHANNELS_ROWS" + Me.TXT_CHANNELS_ROWS.Size = New System.Drawing.Size(285, 22) + Me.TXT_CHANNELS_ROWS.TabIndex = 0 + Me.TXT_CHANNELS_ROWS.Text = "0" + Me.TXT_CHANNELS_ROWS.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'TXT_CHANNELS_COLUMNS + ' + Me.TXT_CHANNELS_COLUMNS.CaptionText = "Channels columns" + Me.TXT_CHANNELS_COLUMNS.CaptionToolTipEnabled = True + Me.TXT_CHANNELS_COLUMNS.CaptionToolTipText = "How many images' columns should be shown in the channels form" + Me.TXT_CHANNELS_COLUMNS.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.TXT_CHANNELS_COLUMNS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_CHANNELS_COLUMNS.Location = New System.Drawing.Point(294, 3) + Me.TXT_CHANNELS_COLUMNS.Name = "TXT_CHANNELS_COLUMNS" + Me.TXT_CHANNELS_COLUMNS.Size = New System.Drawing.Size(285, 22) + Me.TXT_CHANNELS_COLUMNS.TabIndex = 1 + Me.TXT_CHANNELS_COLUMNS.Text = "0" + Me.TXT_CHANNELS_COLUMNS.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(584, 191) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(584, 191) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'GlobalSettingsForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(584, 191) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(600, 230) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(600, 230) + Me.Name = "GlobalSettingsForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Settings" + TP_MAIN.ResumeLayout(False) + TP_MAIN.PerformLayout() + CType(Me.TXT_GLOBAL_PATH, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_COLLECTIONS_PATH, System.ComponentModel.ISupportInitialize).EndInit() + TP_IMAGES.ResumeLayout(False) + CType(Me.TXT_IMAGE_LARGE, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_IMAGE_SMALL, System.ComponentModel.ISupportInitialize).EndInit() + TP_CHANNELS_IMGS.ResumeLayout(False) + CType(Me.TXT_CHANNELS_ROWS, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_CHANNELS_COLUMNS, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_GLOBAL_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents CH_SEPARATE_VIDEO_FOLDER As CheckBox + Private WithEvents TXT_COLLECTIONS_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_IMAGE_LARGE As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_IMAGE_SMALL As PersonalUtilities.Forms.Controls.TextBoxExtended + Friend WithEvents CH_DEF_TEMP As CheckBox + Private WithEvents TXT_CHANNELS_ROWS As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_CHANNELS_COLUMNS As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.resx b/SCrawler/Editors/GlobalSettingsForm.resx new file mode 100644 index 0000000..3a4fff7 --- /dev/null +++ b/SCrawler/Editors/GlobalSettingsForm.resx @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + False + + + 17, 17 + + + This is global setting for new added only users. +This parameter indicates how video will be stored in users' download path. +If checked then videos will be stored in separated folder; otherwise, videos will be stored with pictures together. + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + False + + + False + + \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.vb b/SCrawler/Editors/GlobalSettingsForm.vb new file mode 100644 index 0000000..1159df6 --- /dev/null +++ b/SCrawler/Editors/GlobalSettingsForm.vb @@ -0,0 +1,65 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Namespace Editors + Friend Class GlobalSettingsForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker) + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps(Of FieldsChecker) + End Sub + Private Sub GlobalSettingsForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + .DelegateClosingChecker() + With Settings + TXT_GLOBAL_PATH.Text = .GlobalPath.Value + TXT_IMAGE_LARGE.Value = .MaxLargeImageHeigh.Value + TXT_IMAGE_SMALL.Value = .MaxSmallImageHeigh.Value + TXT_COLLECTIONS_PATH.Text = .CollectionsPath + CH_SEPARATE_VIDEO_FOLDER.Checked = .SeparateVideoFolder.Value + CH_DEF_TEMP.Checked = .DefaultTemporary.Value + TXT_CHANNELS_COLUMNS.Value = .ChannelsImagesColumns.Value + TXT_CHANNELS_ROWS.Value = .ChannelsImagesRows.Value + End With + .MyFieldsChecker = New FieldsChecker + With .MyFieldsChecker + .AddControl(Of String)(TXT_GLOBAL_PATH, TXT_GLOBAL_PATH.CaptionText) + .AddControl(Of String)(TXT_COLLECTIONS_PATH, TXT_COLLECTIONS_PATH.CaptionText) + .EndLoaderOperations() + End With + .AppendDetectors() + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If MyDefs.MyFieldsChecker.AllParamsOK Then + With Settings + .GlobalPath.Value = TXT_GLOBAL_PATH.Text + .MaxLargeImageHeigh.Value = CInt(TXT_IMAGE_LARGE.Value) + .MaxSmallImageHeigh.Value = CInt(TXT_IMAGE_SMALL.Value) + .SeparateVideoFolder.Value = CH_SEPARATE_VIDEO_FOLDER.Checked + .CollectionsPath.Value = TXT_COLLECTIONS_PATH.Text + .DefaultTemporary.Value = CH_DEF_TEMP.Checked + .ChannelsImagesRows.Value = CInt(TXT_CHANNELS_ROWS.Value) + .ChannelsImagesColumns.Value = CInt(TXT_CHANNELS_COLUMNS.Value) + End With + MyDefs.CloseForm() + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_GLOBAL_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_GLOBAL_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath(Settings.GlobalPath.Value) + If Not f.IsEmptyString Then TXT_GLOBAL_PATH.Text = f + End If + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/LabelsForm.Designer.vb b/SCrawler/Editors/LabelsForm.Designer.vb new file mode 100644 index 0000000..6e296b2 --- /dev/null +++ b/SCrawler/Editors/LabelsForm.Designer.vb @@ -0,0 +1,92 @@ + +Partial Friend Class LabelsForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(LabelsForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + Me.CMB_LABELS = New PersonalUtilities.Forms.Controls.ComboBoxExtended() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + CType(Me.CMB_LABELS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.CMB_LABELS) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(374, 421) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(374, 421) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'CMB_LABELS + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_COMBOBOX_ARROW" + ActionButton1.Visible = False + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_ADD" + ActionButton2.ToolTipText = "Add new label (Insert)" + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 2 + ActionButton3.Name = "BTT_CLEAR" + ActionButton3.ToolTipText = "Clear checked labels" + Me.CMB_LABELS.Buttons.Add(ActionButton1) + Me.CMB_LABELS.Buttons.Add(ActionButton2) + Me.CMB_LABELS.Buttons.Add(ActionButton3) + Me.CMB_LABELS.Dock = System.Windows.Forms.DockStyle.Fill + Me.CMB_LABELS.ListCheckBoxes = True + Me.CMB_LABELS.ListDropDownStyle = PersonalUtilities.Forms.Controls.ComboBoxExtended.ListMode.Simple + Me.CMB_LABELS.ListGridVisible = True + Me.CMB_LABELS.ListMultiSelect = True + Me.CMB_LABELS.Location = New System.Drawing.Point(0, 0) + Me.CMB_LABELS.Name = "CMB_LABELS" + Me.CMB_LABELS.Size = New System.Drawing.Size(374, 421) + Me.CMB_LABELS.TabIndex = 0 + ' + 'LabelsForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(374, 421) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(390, 460) + Me.Name = "LabelsForm" + Me.ShowIcon = False + Me.ShowInTaskbar = False + Me.Text = "Labels" + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + CType(Me.CMB_LABELS, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents CMB_LABELS As PersonalUtilities.Forms.Controls.ComboBoxExtended +End Class \ No newline at end of file diff --git a/SCrawler/Editors/LabelsForm.resx b/SCrawler/Editors/LabelsForm.resx new file mode 100644 index 0000000..22fe23b --- /dev/null +++ b/SCrawler/Editors/LabelsForm.resx @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADmUlE + QVRIS62WWWxMURjHL220JW1HausmlFrDFKUhnUGH6bRFzJ2idImlC0Vp2mlji1A8iNhCPIjIRES8EU+W + h2oEtbSDTk3HNNM7S01VKsXjkb/vXBo3k1Ee7sMvmZzzzf//ne/+z50RAAxL1MUIG4G/YAv3HSVhF5Vw + IYNdz3LadVj9RgdTB+HQYYPHIJuE1ocSdlEJFzG+1bPRLQLinglIeCkg+XUkKvz56hnkOfQs/rmA8S9H + YEp7FDI64tAQtKhnsMapZ7zzNHsUFnbGY4VzIk70l6hnIH4wsDR7NBZ3apDrSqL5T8eFgUr1DLZ78lim + Q4N8VzK29MxEpZSBa4M16hnU+c3M9CEFpdJsVHsXos63DDcHrf9nQEXD5VymwW/5USLNwl5vJhp7dTgW + NML2pR7jbsUMS+KdMTa5Q8NQxinfBU4dRFcOyjy52OtbhwOBDTgZLKPPmTgY0ON4MBdNfSbYBupxY8Aq + G10dqMG5/nIc7ytGQ6CQRliAamkTN/g1Ai4e95Qy3iogpX0UtBRDnhRzdxq2SXOxz5eFQ70rScCEU335 + ssGxj0YS06HSm4GN3ekwdE2C1hGH1LZR0JDOJof5jwHvnIvzTa0jlooTYfktvt+fhcOBHDQFTWRgxJGP + ObAGsulZLMLWnjlY756K5c4JmNcRi6T2SGheCIihS2l5ozAo6NRhMolnUAcGV6IcwwqvFrX+JTjYuwKH + SfRAYDms/mzs9y1GFe2VSnOw1j0FejqpLN4WCX4ZufiIBwLMLxQGm12rsLQzgWKYgmLPLNTQw6ynpDSS + IBet8y+TqaVRVdFIeJrWuCcj+/0EzH43BomvIhBLI45uFiDcJ+6QwROFwa6+Amb9bGFNg6Xs9Ncd7Oy3 + Knb2eyU7/20nu9y/m136tIvEl6BC0qKoZwby3alo9JVhj7T5R7m/kJVIIityi8zyXmTiW+I10SqyIQNb + uIgNwYuuf25kFd75KPKkI49OmUWnrfYWyXv/wBb2cijhhVf6a9lGei65XclYRDd6mj0GWz2iLBJaH0rY + RSVc5Eywmhm7kuQXHX+bJlBStrh+zTi0PpSwi0q4yNFAOVvgiEcKJWUsxZn/NhT+znlofShhF5VwkRpv + MUtti4KGYjj6sYCIh5QSu4oG27stjItHU+cjeQzvkcFzFQ2KnSKLoc4FukDCXeI2GbSoaFD4ziyPxNxK + 0AUyNxOP1DOwcaG/8I+/LRB+At7psBnyDBG0AAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/SCrawler/Editors/LabelsForm.vb b/SCrawler/Editors/LabelsForm.vb new file mode 100644 index 0000000..cacbe80 --- /dev/null +++ b/SCrawler/Editors/LabelsForm.vb @@ -0,0 +1,97 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Functions.Messaging +Friend Class LabelsForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Friend ReadOnly Property LabelsList As List(Of String) + Private _AnyLabelAdd As Boolean = False + Friend Property MultiUser As Boolean = False + Public Property MultiUserClearExists As Boolean = False + Friend Sub New(ByVal LabelsArr As IEnumerable(Of String)) + InitializeComponent() + LabelsList = New List(Of String) + LabelsList.ListAddList(LabelsArr) + MyDefs = New DefaultFormProps + End Sub + Private Sub LabelsForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design) + .MyOkCancel = New OkCancelToolbar(Me, Me, CONTAINER_MAIN.BottomToolStripPanel) + .MyOkCancel.AddThisToolbar() + .DelegateClosingChecker() + + If Settings.Labels.Count > 0 Then + Dim items As New List(Of Integer) + CMB_LABELS.BeginUpdate() + For i% = 0 To Settings.Labels.Count - 1 + If LabelsList.Contains(Settings.Labels(i)) Then items.Add(i) + CMB_LABELS.Items.Add(New ListItem(Settings.Labels(i))) + Next + CMB_LABELS.EndUpdate() + CMB_LABELS.ListCheckedIndexes = items + End If + + .AppendDetectors() + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub LabelsForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.Insert Then AddNewLabel() : e.Handled = True + End Sub + Private Sub LabelsForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + LabelsList.Clear() + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + Try + If MultiUser Then + Dim m As New MMessage("You are changing labels for more one user" & vbNewLine & "What do you want to do?", + "MultiUser labels changing", + {New MsgBoxButton("Replace exists") With {.ToolTip = "For each user: all exists labels will be deleted and replaced to these labels"}, + New MsgBoxButton("Add to exists") With {.ToolTip = "For each user: these labels will be appended to exists labels"}, + New MsgBoxButton("Cancel")}, + MsgBoxStyle.Exclamation) + Select Case MsgBoxE(m).Index + Case 0 : MultiUserClearExists = True + Case 1 : MultiUserClearExists = False + Case 2 : Exit Sub + End Select + End If + LabelsList.Clear() + Dim s As List(Of Integer) = CMB_LABELS.ListCheckedIndexes.ListIfNothing + If s.Count > 0 Then + For Each i% In s : LabelsList.Add(Settings.Labels(i)) : Next + End If + If _AnyLabelAdd Then Settings.Labels.Update() + MyDefs.CloseForm() + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Choosing labels") + End Try + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub CMB_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles CMB_LABELS.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Add Then AddNewLabel() + End Sub + Private Sub CMB_LABELS_ActionOnButtonClearClick() Handles CMB_LABELS.ActionOnButtonClearClick + CMB_LABELS.Clear(ComboBoxExtended.ClearMode.CheckedInexes) + End Sub + Private Sub AddNewLabel() + Dim nl$ = InputBoxE("Enter new label name:", "New label") + If Not nl.IsEmptyString Then + If Settings.Labels.Contains(nl) Then + MsgBoxE($"Label [{nl}] already exists") + Else + Settings.Labels.Add(nl) + _AnyLabelAdd = True + CMB_LABELS.Items.Add(New ListItem(nl)) + End If + End If + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/Editors/RedditEditorForm.Designer.vb b/SCrawler/Editors/RedditEditorForm.Designer.vb new file mode 100644 index 0000000..8a0db8a --- /dev/null +++ b/SCrawler/Editors/RedditEditorForm.Designer.vb @@ -0,0 +1,134 @@ +Namespace Editors + + Partial Friend Class RedditEditorForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(RedditEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_MAIN.SuspendLayout() + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0) + TP_MAIN.Controls.Add(Me.TXT_COOKIES, 0, 1) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 2 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_MAIN.Size = New System.Drawing.Size(524, 80) + TP_MAIN.TabIndex = 0 + ' + 'TXT_PATH + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_PATH.Buttons.Add(ActionButton1) + Me.TXT_PATH.Buttons.Add(ActionButton2) + Me.TXT_PATH.CaptionText = "Path" + Me.TXT_PATH.CaptionToolTipEnabled = True + Me.TXT_PATH.CaptionToolTipText = "Specific path to store Reddit files" + Me.TXT_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_PATH.Location = New System.Drawing.Point(3, 3) + Me.TXT_PATH.Name = "TXT_PATH" + Me.TXT_PATH.Size = New System.Drawing.Size(518, 22) + Me.TXT_PATH.TabIndex = 0 + ' + 'TXT_COOKIES + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_EDIT" + ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) + ActionButton4.Index = 1 + ActionButton4.Name = "BTT_CLEAR" + Me.TXT_COOKIES.Buttons.Add(ActionButton3) + Me.TXT_COOKIES.Buttons.Add(ActionButton4) + Me.TXT_COOKIES.CaptionText = "Cookies" + Me.TXT_COOKIES.ClearTextByButtonClear = False + Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 43) + Me.TXT_COOKIES.Name = "TXT_COOKIES" + Me.TXT_COOKIES.Size = New System.Drawing.Size(518, 22) + Me.TXT_COOKIES.TabIndex = 1 + Me.TXT_COOKIES.TextBoxReadOnly = True + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(524, 80) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(524, 80) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'RedditEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(524, 80) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(540, 119) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(540, 119) + Me.Name = "RedditEditorForm" + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Reddit" + TP_MAIN.ResumeLayout(False) + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/RedditEditorForm.resx b/SCrawler/Editors/RedditEditorForm.resx new file mode 100644 index 0000000..5c7bfe6 --- /dev/null +++ b/SCrawler/Editors/RedditEditorForm.resx @@ -0,0 +1,1341 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/wMARv8PAEX/IgBF/0AARf9fAEX/fQBF/5wARf+6AEX/zQBF + /90ARf/rAEX/8wBF//gARf/8AEX//ABF//gARf/zAEX/6wBF/90ARf/NAEX/ugBF/5wARf99AEX/XwBF + /0AARf8iAEb/DwBG/wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAR/8DAEb/FABG/zQARf9dAEX/iwBF + /7MARf/RAEX/5wBF//QARf/6AEX//gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF//oARf/0AEX/5wBF/9EARf+zAEX/iwBF/10ARv80AEb/FABH + /wMAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG + /wYARv8iAEX/UwBF/4sARf/AAEX/5QBF//cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9wBF/+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/AwBF/x4ARv9WAEX/mQBF/9MARf/0AEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/+AEX/9ABF/9MARf+ZAEb/VgBF/x4ARv8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAJv8AAEb/DABF/zsARf+FAEX/zABF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/zABF + /4UARf87AEb/DAAm/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAASv8AAEb/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF/+YARf+nAEX/UABG/xMASv8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAT/8AAEb/FABF/1oARf+3AEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/wAEX/twBF/1oARv8UAE//AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI/wAAQ/8AAEX/DgBF + /1QARf+2AEX/8gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8gBF + /7YARf9UAEX/DgBD/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG/wYARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAFP/AABG/yAARf+FAEX/4wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/jAEX/hQBG/yAAU/8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABG/wkARf9SAEX/wwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/7AEX/wwBF + /1IARv8JAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eADz/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8DAEX/QABF/7sARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/7sARf9AAEf/AwBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/CgBF/2MARf/cAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9wARf9jAEb/CgBG + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF + /xUARf+HAEX/7wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEf/AABD/wAARf8hAEX/oQBF//gARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf+hAEX/IQBD/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEb/LQBF + /7UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+1AEX/LQBB/wAAR/8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG/zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/AAEb/MwA9/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARf83AEX/xgBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEX/NwA8 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAAQ/8AAEb/MwBF/8YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/GAEb/MwBD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/ywARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABF/wAARf8hAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEX/IQBF/wAARf8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/FQBF/6EARf/9AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//0ARf+hAEX/FQBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//kARf+HAEb/CgBF + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8CAEX/YwBF/+4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+4ARf9jAEj/AgBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEP/AABF/0AARf/cAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AET//wBE//8AQ///AEP//wBC//8AQv//AEP//wBD//8AQ///AEP//wBC//8AQv//AEP//wBD + //8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /9wARf9AAEP/AABG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQ///AUT//wZJ//8QUP//HFn//yxk//87b///SHj//1F/ + //9Xhf//W4f//1uH//9Xhf//UX///0h4//87b///K2T//xxZ//8QUP//Bkn//wFE//8AQ///AEP//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARv8AAEf/CABF/4oARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///AEP//wNG//8RUf//L2f//1WC + //97n///n7j//7vN///Q3f//4en//+rw///x9f//9ff///b5///3+f//9/n///b5///19///8fX//+rw + ///g6f//0N3//7rM//+euP//e57//1SB//8uZv//EVH//wNG//8AQ///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/+wBF/4oAR/8IAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABC/wAARf9TAEX/6wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///Bkn//yNe//9Wg///i6r//7vO///h6f//9fj///7+//////////////////////////////// + ///////////////////////////////////////////////////////////////////9/v//9fj//+Hp + //+6zf//iqn//1WC//8iXf//Bkn//wBD//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/1MAQv8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/IABF/8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//8CRf//HVn//1eE//+atf//1N////X3//////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////9Pf//9Pf//+ZtP//VoP//xxZ + //8CRf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/wwBF/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wUARf+FAEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8GSP//MGf//3uf + ///J1///9Pf///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////09///x9b//3qd//8uZv//Bkj//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/hQBG + /wUARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARP8AAEb/PgBF/+IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8FR///MWj//42s///d5v///P3///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////+/z//9zl//+Lqv//L2f//wRH//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/iAEX/PgBE/wAASP8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8BRP//JmD//4Sl///b5f///f7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////39///a5P//gqT//yRf + //8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf+lAEb/DgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAAQv8AAEX/VABF/+8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///DU3//1+K///M2v///P3///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////7/P//ytn//1yI//8MTf//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+8ARf9UAEL/AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/xQARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//yZf//+ZtP//8fX///////////////////// + //////////////////////////////////////////////////////////////////////////////39 + ///09///6O7//9vl///O2///xNT//77Q//++0P//w9P//87b///b5f//6O7///T3///9/f////////// + //////////////////////////////////////////////////////////////////////////////// + ////////8PT//5ez//8kXv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/7UARv8UAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARP8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wJF + //9Cdf//xNP///39//////////////////////////////////////////////////////////////// + ///////////////////9/v//7fL//8nX//+dt///dZr//1KA//84bP//JV///xtY//8VVP//ElL//xFS + //8VVP//Glj//yVf//83bP//UoD//3SZ//+dt///yNf//+zx///9/v////////////////////////// + /////////////////////////////////////////////////////////f3//8HS//9Ac///AkX//wBE + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/1oARP8AAEb/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF/xMARf+3AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8FR///WYb//9zl//////////////////////////////// + ///////////////////////////////////////////////////4+v//y9n//4Sl//9Ddf//GVf//wZJ + //8ARP//AEP//wBD//8AQ///AEP//wBD//8ARP//AET//wBD//8AQ///AEP//wBD//8AQv//AET//wZJ + //8ZVv//QnT//4Ok///K2P//9/n///////////////////////////////////////////////////// + /////////////////////////////9rk//9Wg///BEf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/twBF/xMARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH + /wAARP8AAEX/UABF//AARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Bkj//2SN + ///m7f////////////////////////////////////////////////////////////////////////// + ///8/f//zNn//2qS//8fW///A0b//wBD//8ARP//AET//wBD//8AQv//AEP//wFF//8ER///CEr//wlL + //8JS///CEn//wRH//8BRf//AEP//wBC//8AQ///AET//wBE//8AQ///A0b//x5a//9okf//ytj///v8 + /////////////////////////////////////////////////////////////////////////////+Tr + //9hi///BUf//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/wAEX/UABE + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//9gi///6O7///////////////////////////////////// + ////////////////////////////////////////8vX//5Sw//8lX///AUT//wBD//8ARP//AEP//wJF + //8PT///KGL//0l5//9nkP//gqT//5ay//+kvP//q8H//6vB//+kvP//lrL//4Ok//9nkf//Snr//yli + //8PT///AkX//wBD//8ARP//AEP//wFE//8kXv//ka7///H1//////////////////////////////// + /////////////////////////////////////////////+bt//9diP//A0b//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAABI + /wAARf8AAEX/OwBF/+YARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Tn3//+Hp + //////////////////////////////////////////////////////////////////////////////H1 + //93m///DE3//wBD//8ARP//AEP//w1O//88cP//faD//7bJ///c5f//8fX///r7//////////////// + //////////////////////////////r8///x9f//3Ob//7bK//9+of//PXH//w5O//8AQ///AET//wBD + //8LTP//dJn///D0//////////////////////////////////////////////////////////////// + /////////////+Do//9Le///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+YARf87AEX/AABG/wAAAAAAAAAAAAAAAAAAAAAAAEb/AABH/wMARf+FAEX//gBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//zBn///P3P////////////////////////////////////////// + ////////////////////////////////////////uMv//xFQ//8AQ///AET//wpL//9MfP//qsH//+fu + ///9/f////////////////////////////////////////////////////////////////////////// + //////////////3+///o7v//rML//059//8KS///AET//wBD//8QTv//tMj///////////////////// + /////////////////////////////////////////////////////////////8za//8tZf//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//gBF/4UASP8DAEb/AAAAAAAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8SUf//pr7///// + //////////////////////////////////////////////////////////////////////////////// + //++z///F1T//wBB//8ZVv//i6r//+vw//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////7PH//46s + //8aV///AEL//xVT//+7zf////////////////////////////////////////////////////////// + /////////////////////////////6O8//8QUP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAEb/AABF/wAARf9WAEX/9ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//2eQ///19/////////////////////////////////////////// + //////////////////////////////////////////////X4//+euP//aZH//7DF///5+/////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////+vv//7LH//9pkf//m7b///X3//////////////// + ////////////////////////////////////////////////////////////////////////8/b//2ON + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/0AEX/VgBF/wAARv8AAAAAAAAA + AAAARv8AAEb/BgBF/5kARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8kXv//zdr///// + //////////////////////////////////////////////////////////////////////////////// + //////////////7+///7/P///v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////v8///+/v////////////////////////////////////////////////////////// + ////////////////////////////////////////ytj//yFd//8ARP//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf+ZAEb/BgBG/wAAAAAAAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AUX//3ab///7/P////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///6/P//cpj//wFF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAA + AAAAR/8AAEX/AABF/1MARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8bWP//yNf///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////E1P//GVf//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/1MARf8AAEf/AABG/wAASP8DAEX/iwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEP//1SB///z9v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////L1//9Qfv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI + /wMARv8AAEb/AABG/xQARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ER///k6////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////46s//8DR///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/FABG/wAARf8AAEb/NABF/+UARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xVU///D0/////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////v9D//xNS//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /+UARv80AEX/AABF/wAARf9cAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///LmX//+Hp + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////f5///KmP//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/1wARf8AAEj/AwBF/4sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBC//9Gd///8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////X3///Q3f//r8T//6a+ + //+4y///3uf///v8//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////+/z//97n//+3y///pr3//67E + ///Q3f//9ff///////////////////////////////////////////////////////////////////// + /////////////////////////////+/z//9DdP//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/iwBI/wMARv8PAEX/swBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1WD + ///2+P////////////////////////////////////////////////////////////////////////// + //////////////3+///H1v//YIv//x9b//8LTP//CEr//w5P//8uZv//gaP//+Lq//////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////+Lq//+Bo///Lmb//w5P//8ISv//C0z//x9b//9giv//x9b///39//////////////// + ////////////////////////////////////////////////////////////////////////9ff//1GA + //8AQv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+zAEb/DwBF/yIARf/RAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///XIj///j6//////////////////////////////// + ///////////////////////////////////////////////////9/v//rcP//ydh//8AQ///AEP//wBE + //8ARP//AET//wBD//8ER///S3z//9bh//////////////////////////////////////////////// + ///////////////////////////////////////////////////W4f//S3v//wRH//8AQ///AET//wBE + //8ARP//AEP//wBD//8mYP//rcL///3+//////////////////////////////////////////////// + ///////////////////////////////////3+f//WIX//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/9EARf8iAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Yhf//9/n///////////////////////////////////////////////////////////////////// + /////////////8fW//8nYf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//VoP//+vx + //////////////////////////////////////////////////////////////////////////////// + ////////6/H//1aD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8nYP//x9b///// + //////////////////////////////////////////////////////////////////////////////b4 + //9Ugv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF/0AARf9fAEX/8wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEH//0p5///y9v////////////////////////// + ///////////////////////////////////////////////////1+P//YIv//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8LTP//oLn///////////////////////////////////// + //////////////////////////////////////////////////+guf//C0z//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBD//9gi///9fj///////////////////////////////////// + ////////////////////////////////////////8fX//0d2//8AQf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/zAEX/XwBF/30ARf/6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //8PT///dZr///X4//////////////////////////////////////////////////////////////// + /////////////9Dd//8fW///AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9Ugf//9Pf///////////////////////////////////////////////////////////////////// + ////////9Pf//1SB//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//x9b + ///Q3f////////////////////////////////////////////////////////////////////////// + ///09///dZr//xFQ//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//oARf99AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//K2T//6W9///y9v////////////////////////// + ////////////////////////////////////////////////////////r8T//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y9m///j6/////////////////////////// + ///////////////////////////////////////////////////j6///L2b//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//C0z//6/E//////////////////////////////// + ///////////////////////////////////////////////////z9v//qL///y1l//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf+6AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//zBn + ///C0v////////////////////////////////////////////////////////////////////////// + //////////////////+mvv//CEr//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///JmD//97n//////////////////////////////////////////////////////////////// + /////////////97n//8mYP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ISv//pr7///////////////////////////////////////////////////////////////////// + ////////////////////////xNT//zNp//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/ugBF + /84ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8aV///s8f///////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8PT///AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//84bf//6O7///////////////////// + ////////////////////////////////////////////////////////6O7//zht//8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//w9P//+4y/////////////////////////// + ////////////////////////////////////////////////////////////////////////tsr//xxY + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/OAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3Wa + ///6+/////////////////////////////////////////////////////////////////////////// + ////////////////////////3uf//y9m//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//2mR///5+/////////////////////////////////////////////////////////// + ///////////////////5+///aZH//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///L2b//97n//////////////////////////////////////////////////////////////// + ///////////////////////////////////6/P//eZ3//wJG//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /90ARf/rAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBE//8fW///zdr///////////////////////////////////// + ///////////////////////////////////////////////////////////////////8/f//gqP//wRH + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//8aVv//vc////////////////////// + //////////////////////////////////////////////////////////////////+9z///Glb//wBD + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wRH//+Co////P3///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///Q3P//Il3//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//1KA + ///09/////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////i6v//THz//wBE//8ARP//AEX//wBF//8ARf//AEX//wBF + //8AQ///Ckv//4Kk///5+v////////////////////////////////////////////////////////// + //////////////////////////////n6//+CpP//Ckv//wBD//8ARf//AEX//wBF//8ARf//AEX//wBE + //8ARP//THz//+Lq//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////X4//9Wg///AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/zAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//faD///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///X4f//VoP//wpM//8AQv//AEP//wBD//8AQ///AEP//xlW//+CpP//7/T///////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+CpP//GVb//wBD//8AQ///AEP//wBD//8AQ///Ckz//1aD///X4f////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////4Kj//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//gARf/8AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wRH + //+UsP////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////s8f//oLn//1SB//8vZv//JmD//zht + //9okf//vc////j6//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////j6//+9z///aJH//zht//8mYP//L2b//1SB + //+guf//6/H///////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////mLP//wVH//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//ABF//wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//BEf//5ay//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9Pf//+Pr///e5///6O7///n7//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////5+///6O7//97n///j6///9Pf///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////+atf//BUj//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/8AEX/+ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//f6L///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////4Ol//8BRf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//gARf/zAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD//9Ugv//9Pf///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////2+P//WIT//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/8wBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEP//yBc///O2/////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////9Hd//8jXv//AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/rAEX/3QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//Akb//3ic///6+/////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/P//e5///wNG//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/90ARf/OAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//G1j//7XJ//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////7jL//8dWf//AET//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/zgBF/7oARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Mmn//8TU + /////////////////////////////////////////////////////////////+vw///a5P///P3///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////+/z//9jj///q7/////////////////////////////////////////// + ///////////////////H1v//NWv//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+6AEX/nABF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//LmX//6i////z9/////////////////////////// + //////////////z9///Q3P//Wob//y1l//+Usf//7fL///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+zx//+Sr///K2T//1eE + ///O2////P3////////////////////////////////////////09///q8H//zBn//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//gBF/5wARf99AEX/+gBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8AQ///ElH//12I//+wxf//4On///P2///3+f//9fj//+rw///H1v//gKL//yli//8BRf//AEP//wtM + //9Ugv//vc7///f5//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////b4//+7zf//UoH//wpL//8AQ///AUX//yhh//9+of//x9b//+rw///1+P//9/n///P2 + ///h6f//ssb//1+K//8TUv//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/6AEX/fQBF + /18ARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//w5P//8uZv//THz//1mG + //9Tgf//O2///xlX//8DRv//AEP//wBF//8ARf//AET//wBE//8YVv//aZH//8jX///3+f////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////f5///H1v//Z5D//xdV//8ARP//AET//wBF + //8ARf//AEP//wNG//8YVv//O2///1OB//9Zhv//TXz//y9m//8PT///AET//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//MARf9fAEX/QABF/+cARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//wBD//8AQv//AEP//wBC//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8BRP//Hlr//2WO//+6zP//8PT///////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////+/0 + //+5zP//ZI3//x1Z//8BRP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEL//wBD + //8AQv//AEP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5wBF + /0AARf8iAEX/0QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AET//xRT + //9Nff//lbH//9Pf///2+P////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////9vj//9Le//+TsP//THz//xRT//8ARP//AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/RAEX/IgBG/w8ARf+zAEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wBD//8FSP//I17//1qG//+Usf//x9b//+rw + ///6/P////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////r7///r8P//x9b//5Sw//9Zhf//I13//wVI + //8AQ///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7MARv8PAEb/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///AEP//wVH//8YVv//PnH//2iR//+Sr///uMv//9fi///p7///9Pf///r7 + ///+/v/////////////////////////////////////////////+/v//+vv///P2///n7v//1uH//7nM + //+Sr///Z5D//z5x//8YVv//BUf//wBD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/iwBI/wMARf8AAEX/XABF//gARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8AQ///AEP//wRH//8PUP//Il3//zlu//9Qf///ZY///3id//+IqP//kq///8fW///+/v///////+7y + //+guf//iKj//3qd//9mj///Tn3//zZr//8hXP//EFD//wRH//8AQ///AEP//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //gARf9cAEX/AABF/wAARv80AEX/5QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AEP//wBC + //8AQ///AET//wFF//8BRf//YIr///j6////////4+v//zNp//8AQ///AET//wBD//8AQv//AEP//wBD + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/5QBG/zQARf8AAEb/AABG/xQARf/AAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBC//84bf//6O7///// + ///1+P//VYL//wBC//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/AAEb/FABG/wAARv8AAEj/AwBF/4sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AET//xpY///M2f////////////9/of//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/4sASP8DAEb/AABH/wAARf8AAEX/UwBF + //QARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//CUv//6e+ + /////////////6rA//8KS///AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/0AEX/UwBF/wAAR/8AAAAAAABF/wAARv8iAEX/0wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//fJ////7+////////ztv//xxZ//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/9MARv8iAEX/AAAAAAAAAAAAAEb/AABH + /wYARf+ZAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBD + //9SgP//9Pf////////p7///Om///wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/mQBH/wYARv8AAAAAAAAAAAAAR/8AAEX/AABG/1YARf/0AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//y5m///h6f////////j6//9hi///AEP//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//QARv9WAEX/AABH/wAAAAAAAAAAAAAA + AAAARf8AAEX/HgBF/8wARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARP//FFP//8LS/////////////4yr//8CRv//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/zABG/x4ARv8AAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEX/hQBF//4ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8GSP//m7b/////////////tcn//w5P + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf+FAEj/AwBG/wAAAAAAAAAAAAAA + AAAAAAAAAEj/AABF/wAARf87AEX/5gBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//9vlv///P3////////X4v//JF7//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///Akb//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/5gBF/zsARf8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/wwARf+nAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEL//0d4///w9P///////+/z + //9Fdv//AEL//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARP//F1X//1KA//+IqP//nrj//5Sw//9qkv//KmP//wNG//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+nAEb/DABF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAET/AABF/1EARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8AQ///JV///9nj////////+/z//22U//8AQ///AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//A0b//0V3//+6zP//8/b///// + //////////////r8///V4P//b5X//w5O//8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8ABF/1EARP8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/EwBF + /7cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8PT///t8r///// + ////////mbT//wVI//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//9Nff//3eb////////////////////////////////////////09///haX//wtM + //8ARP//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+3AEb/EwBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAQv8AAEX/WgBF//MARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wNG//+Prf/////////////A0f//E1L//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///JWD//8rZ//////////////// + ///////////////////////////////////v8///Wob//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/8wBF/1oAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAARv8UAEX/tQBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEP//2ON + ///5+////////+Do//8sZf//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//92m////P3///////////////////////////////////////////////////// + //+7zf//FFP//wBE//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+1AEb/FABG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABC/wAARf9UAEX/7wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8AQ///PHD//+vw////////9Pf//1B///8AQ///AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQv//Dk3//7XJ//////////////// + /////////////////////////////////////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/7wBF/1QAQv8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEX/AABG/w4ARf+lAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE + //8dWv//0N3////////+/v//ep3//wBE//8ARf//AEX//wBF//8ARf//AEX//wBE//8ARP//AEP//wBD + //8DRv//Dk///yNe//9Xg///3+f///////////////////////////////////////////////////// + ////////9vj//1aD//8AQ///AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf+lAEb/DgBF/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASP8AAET/AABF/z4ARf/iAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//wpM//+swv////////////+lvf//CEr//wBE + //8ARP//AEP//wBC//8BRf//Ckz//xxZ//87b///Yoz//42s//+2yv//2OP///D0///+/v////////// + ///////////////////////////////////////////////////2+P//VoP//wBD//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/4gBF/z4ARP8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAARv8AAEb/BQBF/4UARf/8AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AUX//4Kj/////////////8rY//8ZVv//BUj//xZV//8xaP//VoP//4Ci//+rwf//z9z//+rv + ///5+v////////////////////////////////////////////////////////////////////////// + /////////////+rw//88cP//AEP//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//wARf+FAEb/BQBG/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEb/IABF + /8MARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8AQv//V4T///b4////////7fL//5Cu + //+dt///xdX//+Tr///1+P///v7///////////////////////////////////v8///u8///5+3///z9 + ////////////////////////////////////////////////////////u83//xRT//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX/wwBG/yAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABH/wAAP/8AAEX/UwBF/+sARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBD//8yaf//5Ov//////////////v7///////////////////////////////////3+ + ///09///4On//8HR//+atf//bpX//0R2//9Bc///y9n///////////////////////////////////// + /////////////+/z//9ahv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/+sARf9TAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG + /wAAR/8IAEX/igBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AET//xZV///F1f////////// + ///////////////////3+f//5+7//8vZ//+mvv//e57//1F///8tZf//FFP//wVI//8AQ///AEL//wBD + //9Nff//3eb////////////////////////////////////////09///haX//wtM//8ARP//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/igBH/wgARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARf8eAEX/uwBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//BEf//3ic///t8v//7fL//9Xg//+xxv//iKj//12I//83bP//Glf//wlK + //8BRP//AEP//wBD//8ARP//AEX//wBF//8ARf//AEX//wNG//9Gd///us3///P3//////////////// + ///6/P//1eD//2+V//8OTv//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF/7sARf8eAEX/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAEb/AABD/wAARf9AAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//Dk7//0J0 + //9Bc///IVz//wxN//8CRv//AEP//wBD//8ARP//AET//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBE//8YVf//VIL//4io//+dt///lLD//2qS//8qY///A0b//wBE//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/cAEX/QABD/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABI/wIARf9jAEX/7gBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARP//AEP//wBD//8AQ///AET//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBE//8AQ///AkX//wZI + //8ER///AEP//wBD//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/7gBF/2MASP8CAEb/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEX/AABG/woARf+HAEX/+QBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //kARf+HAEb/CgBF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEX/AABF + /xUARf+hAEX//QBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/9AEX/oQBF/xUARf8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/yEARf+1AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + /7UARf8hAEX/AABF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAET/AABG/ywARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEX/LABE/wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEP/AABG/zMARf/GAEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/xgBG + /zMAQ/8AAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AADz/AABF/zcARf/GAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/8YARf83ADz/AABH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAD3/AABG + /zMARf/AAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/AAEb/MwA9 + /wAAR/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/8AAEH/AABF/y0ARf+1AEX//ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf/8AEX/tQBF/y0AQf8AAEf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEP/AABF/yEARf+hAEX/+ABF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+ABF/6EARf8hAEP/AABH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARf8AAEX/AABF/xUARf+HAEX/7wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF/+8ARf+HAEX/FQBF/wAARf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAEb/AABG/woARf9jAEX/3ABF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf/cAEX/YwBG/woARv8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEb/AABH + /wMARf9AAEX/uwBF//sARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf/7AEX/uwBF/0AAR/8DAEb/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AAA8/wAARv8eAEX/igBF/+sARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/6wBF/4oARv8eAD//AABH/wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAABG/wAARv8JAEX/UgBF/8MARf/7AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/+wBF + /8MARf9SAEb/CQBG/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAASP8AAEX/IABF + /4UARf/jAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF/+MARf+FAEX/IABI/wAARv8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARv8AAEb/BgBG/z4ARf+mAEX/8ABF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+mAEb/PgBG + /wYARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAASP8AAEP/AABF/w4ARf9UAEX/tQBF//IARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//IARf+1AEX/VABF/w4AQ/8AAEj/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEf/AABP/wAARv8UAEX/WgBF + /7cARf/wAEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//AARf+3AEX/WgBG/xQAT/8AAEf/AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF/wAARP8AAEX/EwBF/1AARf+nAEX/5gBF//0ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//QBF + /+YARf+nAEX/UABF/xMARP8AAEX/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AACf/AABG/wwARf87AEX/hQBF/8wARf/0AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX/9ABF/8wARf+FAEX/OwBG/wwAJ/8AAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABG/wAAR/8DAEb/HgBF + /1YARf+YAEX/0wBF//QARf/+AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//4ARf/0AEX/0wBF/5gARf9WAEb/HgBH + /wMARv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASf8AAD//AABG/wYARv8iAEX/UwBF/4sARf/AAEX/5QBF + //cARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX/9wBF + /+UARf/AAEX/iwBF/1MARv8iAEb/BgA//wAASf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAR/8AAEf/AwBG/xQARv80AEX/XQBF/4sARf+zAEX/0QBF/+cARf/0AEX/+gBF + //4ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF//8ARf//AEX//wBF + //4ARf/6AEX/9ABF/+cARf/RAEX/swBF/4sARf9dAEb/NABG/xQAR/8DAEf/AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAR/8AAEf/AwBG/w8ARf8iAEX/QABF/18ARf99AEX/nABF/7oARf/NAEX/3QBF/+sARf/zAEX/+ABF + //wARf/8AEX/+ABF//MARf/rAEX/3QBF/80ARf+6AEX/nABF/30ARf9fAEX/QABF/yIARv8PAEf/AwBH + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////////wAAAA////////////////AAAAAA//////////////+AAAAAA + B/////////////8AAAAAAAD////////////8AAAAAAAAP///////////8AAAAAAAAA///////////8AA + AAAAAAAD//////////8AAAAAAAAAAP/////////8AAAAAAAAAAA/////////+AAAAAAAAAAAH/////// + /+AAAAAAAAAAAAf////////AAAAAAAAAAAAD////////AAAAAAAAAAAAAP///////gAAAAAAAAAAAAB/ + //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA + AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA + AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB////AAAAAAAAAAAAAAAAAP///w + AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAA + A///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA + AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA + AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAAAA + AAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA + AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA + AAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA+AA + AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAAAAAAAAA + AA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA + AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA + AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///A + AAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAA + D///+AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA + AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA + AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP//////+AAAAAAAAAAAAAH////// + /wAAAAAAAAAAAAD////////AAAAAAAAAAAAD////////4AAAAAAAAAAAB/////////gAAAAAAAAAAB// + ///////8AAAAAAAAAAA//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA + AA////////////wAAAAAAAA/////////////AAAAAAAA/////////////+AAAAAAB//////////////8 + AAAAAD///////////////8AAAAP///////8= + + + \ No newline at end of file diff --git a/SCrawler/Editors/RedditEditorForm.vb b/SCrawler/Editors/RedditEditorForm.vb new file mode 100644 index 0000000..8a4703a --- /dev/null +++ b/SCrawler/Editors/RedditEditorForm.vb @@ -0,0 +1,68 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Tools.WEB +Namespace Editors + Friend Class RedditEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps + End Sub + Private Sub RedditEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + .DelegateClosingChecker() + With Settings.Site(Sites.Reddit) + TXT_PATH.Text = .Path + If .Responser.Cookies Is Nothing Then .Responser.Cookies = New CookieKeeper(.Responser.CookiesDomain) + End With + SetCookieText() + TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector) + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + With Settings.Site(Sites.Reddit) + If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text + .Update() + End With + MyDefs.CloseForm() + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath(Settings.Site(Sites.Reddit).Path) + If Not f.IsEmptyString Then TXT_PATH.Text = f + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then + Using f As New CookieListForm(Settings.Site(Sites.Reddit).Responser.Cookies) : f.ShowDialog() : End Using + SetCookieText() + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick + With Settings.Site(Sites.Reddit).Responser + If Not .Cookies Is Nothing Then .Cookies.Dispose() + .Cookies = New CookieKeeper(.CookiesDomain) + End With + SetCookieText() + End Sub + Private Sub SetCookieText() + Dim c% = 0 + With Settings.Site(Sites.Reddit).Responser + If Not .Cookies Is Nothing Then c = .Cookies.Count + End With + TXT_COOKIES.Text = $"{c} cookies" + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/TwitterEditorForm.Designer.vb b/SCrawler/Editors/TwitterEditorForm.Designer.vb new file mode 100644 index 0000000..b4f8f68 --- /dev/null +++ b/SCrawler/Editors/TwitterEditorForm.Designer.vb @@ -0,0 +1,180 @@ +Namespace Editors + + Partial Friend Class TwitterEditorForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(TwitterEditorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_TOKEN = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_AUTH = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_MAIN.SuspendLayout() + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_AUTH, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + TP_MAIN.Controls.Add(Me.TXT_PATH, 0, 0) + TP_MAIN.Controls.Add(Me.TXT_COOKIES, 0, 1) + TP_MAIN.Controls.Add(Me.TXT_TOKEN, 0, 2) + TP_MAIN.Controls.Add(Me.TXT_AUTH, 0, 3) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 4 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25.0!)) + TP_MAIN.Size = New System.Drawing.Size(544, 107) + TP_MAIN.TabIndex = 0 + ' + 'TXT_PATH + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_OPEN" + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 1 + ActionButton2.Name = "BTT_CLEAR" + Me.TXT_PATH.Buttons.Add(ActionButton1) + Me.TXT_PATH.Buttons.Add(ActionButton2) + Me.TXT_PATH.CaptionText = "Path" + Me.TXT_PATH.CaptionToolTipEnabled = True + Me.TXT_PATH.CaptionToolTipText = "Specific path to store Twitter files" + Me.TXT_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_PATH.Location = New System.Drawing.Point(3, 3) + Me.TXT_PATH.Name = "TXT_PATH" + Me.TXT_PATH.Size = New System.Drawing.Size(538, 22) + Me.TXT_PATH.TabIndex = 0 + ' + 'TXT_COOKIES + ' + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 0 + ActionButton3.Name = "BTT_EDIT" + ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) + ActionButton4.Index = 1 + ActionButton4.Name = "BTT_CLEAR" + Me.TXT_COOKIES.Buttons.Add(ActionButton3) + Me.TXT_COOKIES.Buttons.Add(ActionButton4) + Me.TXT_COOKIES.CaptionText = "Cookies" + Me.TXT_COOKIES.ClearTextByButtonClear = False + Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_COOKIES.Location = New System.Drawing.Point(3, 29) + Me.TXT_COOKIES.Name = "TXT_COOKIES" + Me.TXT_COOKIES.Size = New System.Drawing.Size(538, 22) + Me.TXT_COOKIES.TabIndex = 1 + Me.TXT_COOKIES.TextBoxReadOnly = True + ' + 'TXT_TOKEN + ' + ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) + ActionButton5.Index = 0 + ActionButton5.Name = "BTT_CLEAR" + Me.TXT_TOKEN.Buttons.Add(ActionButton5) + Me.TXT_TOKEN.CaptionText = "Token" + Me.TXT_TOKEN.CaptionToolTipEnabled = True + Me.TXT_TOKEN.CaptionToolTipText = "Set token from [x-csrf-token] response header" + Me.TXT_TOKEN.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_TOKEN.Location = New System.Drawing.Point(3, 55) + Me.TXT_TOKEN.Name = "TXT_TOKEN" + Me.TXT_TOKEN.Size = New System.Drawing.Size(538, 22) + Me.TXT_TOKEN.TabIndex = 2 + ' + 'TXT_AUTH + ' + ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) + ActionButton6.Index = 0 + ActionButton6.Name = "BTT_CLEAR" + Me.TXT_AUTH.Buttons.Add(ActionButton6) + Me.TXT_AUTH.CaptionText = "Authorization" + Me.TXT_AUTH.CaptionToolTipEnabled = True + Me.TXT_AUTH.CaptionToolTipText = "Set authorization from [authorization] response header. This field must start fro" & + "m [Bearer] key word" + Me.TXT_AUTH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_AUTH.Location = New System.Drawing.Point(3, 81) + Me.TXT_AUTH.Name = "TXT_AUTH" + Me.TXT_AUTH.Size = New System.Drawing.Size(538, 22) + Me.TXT_AUTH.TabIndex = 3 + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(544, 107) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(544, 132) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'TwitterEditorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(544, 132) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(560, 171) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(560, 171) + Me.Name = "TwitterEditorForm" + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Twitter" + TP_MAIN.ResumeLayout(False) + CType(Me.TXT_PATH, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_COOKIES, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_TOKEN, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_AUTH, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_COOKIES As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_TOKEN As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_AUTH As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/TwitterEditorForm.resx b/SCrawler/Editors/TwitterEditorForm.resx new file mode 100644 index 0000000..59ee30e --- /dev/null +++ b/SCrawler/Editors/TwitterEditorForm.resx @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + 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 + AAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + AAABAAEAICAAAAEAIADLAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAZJJ + REFUeAFiGDZgFMguBPBazwB6BEAUx2PbttHFqmJ2sW1UsbrY6NLFrmL2sW3jbMz9z1rNqvh9wry3QnQ5 + LMRdRCAez7AVDQ1+3w2lc9+UwXwP4W3wFGIiBhPQANNxDScKDhgDwWIX4XXxCWIjDekQ/EKjgkP2QJCO + DcoCRyAKbzAY07Ewd8hRSAHnUMtBeA0kQxQSIXiM6rmD9kKK+I7pKGlRYAzEhQeoX3DQWIiJJ5iFSgYF + 5kCUHqFy0UHl8QViIQ6nsAjdUBujIUrXzVbncKRCFFIgSheMwtdiClaqh+odNiqwDxKSFWarX0LS16hA + SdyHBCwa5c12wk74DwnQMbszW1c8gwRksF2B2uiIdfgL8dETlLQr0CLAw3CM06vblgDCL2kur6VxAuKT + CDTT3mSUxDx8hHiQipGqcIMi3XEPopSO6V7DR+ApRCkJU9yElkEvrPVwPniLXprQgbiNLx4PwXjsQGW3 + 9/TTcQfpEIVf2KLa023KtMJSHMMj/IEgFf/xEhexGQNQJmMMQxmMAgBkarVAZoTAyQAAAABJRU5ErkJg + gg== + + + \ No newline at end of file diff --git a/SCrawler/Editors/TwitterEditorForm.vb b/SCrawler/Editors/TwitterEditorForm.vb new file mode 100644 index 0000000..6d8690d --- /dev/null +++ b/SCrawler/Editors/TwitterEditorForm.vb @@ -0,0 +1,84 @@ +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Tools.WEB +Namespace Editors + Friend Class TwitterEditorForm : Implements IOkCancelToolbar + Private ReadOnly MyDefs As DefaultFormProps(Of FieldsChecker) + Friend Sub New() + InitializeComponent() + MyDefs = New DefaultFormProps(Of FieldsChecker) + End Sub + Private Sub TwitterEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDefs + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + .DelegateClosingChecker() + With Settings.Site(Sites.Twitter) + TXT_PATH.Text = .Path + With .Responser + If .Cookies Is Nothing Then .Cookies = New CookieKeeper(.CookiesDomain) + SetCookieText() + TXT_TOKEN.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Token) + TXT_AUTH.Text = .Headers(API.Base.SiteSettings.Header_Twitter_Authorization) + End With + End With + .MyFieldsChecker = New FieldsChecker + With .MyFieldsChecker + .AddControl(Of String)(TXT_TOKEN, TXT_TOKEN.CaptionText) + .AddControl(Of String)(TXT_AUTH, TXT_AUTH.CaptionText) + .EndLoaderOperations() + End With + TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector) + .EndLoaderOperations() + End With + Catch ex As Exception + MyDefs.InvokeLoaderError(ex) + End Try + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If MyDefs.MyFieldsChecker.AllParamsOK Then + With Settings.Site(Sites.Twitter) + If TXT_PATH.IsEmptyString Then .Path = Nothing Else .Path = TXT_PATH.Text + With .Responser + .Headers(API.Base.SiteSettings.Header_Twitter_Token) = TXT_TOKEN.Text + .Headers(API.Base.SiteSettings.Header_Twitter_Authorization) = TXT_AUTH.Text + End With + .Update() + End With + MyDefs.CloseForm() + End If + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDefs.CloseForm(DialogResult.Cancel) + End Sub + Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath(Settings.Site(Sites.Twitter).Path) + If Not f.IsEmptyString Then TXT_PATH.Text = f + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then + Using f As New CookieListForm(Settings.Site(Sites.Twitter).Responser.Cookies) : f.ShowDialog() : End Using + SetCookieText() + End If + End Sub + Private Sub TXT_COOKIES_ActionOnButtonClearClick() Handles TXT_COOKIES.ActionOnButtonClearClick + With Settings.Site(Sites.Twitter).Responser + If Not .Cookies Is Nothing Then .Cookies.Dispose() + .Cookies = New CookieKeeper(.CookiesDomain) + End With + SetCookieText() + End Sub + Private Sub SetCookieText() + Dim c% = 0 + With Settings.Site(Sites.Twitter).Responser + If Not .Cookies Is Nothing Then c = .Cookies.Count + End With + TXT_COOKIES.Text = $"{c} cookies" + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/UserCreatorForm.Designer.vb b/SCrawler/Editors/UserCreatorForm.Designer.vb new file mode 100644 index 0000000..a492bad --- /dev/null +++ b/SCrawler/Editors/UserCreatorForm.Designer.vb @@ -0,0 +1,378 @@ +Namespace Editors + + Partial Friend Class UserCreatorForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim TP_MAIN As System.Windows.Forms.TableLayoutPanel + Dim TP_SITE As System.Windows.Forms.TableLayoutPanel + Dim TP_PARAMS As System.Windows.Forms.TableLayoutPanel + Dim TP_OTHER As System.Windows.Forms.TableLayoutPanel + Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(UserCreatorForm)) + Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TT_MAIN As System.Windows.Forms.ToolTip + Me.TXT_USER = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.OPT_REDDIT = New System.Windows.Forms.RadioButton() + Me.OPT_TWITTER = New System.Windows.Forms.RadioButton() + Me.CH_TEMP = New System.Windows.Forms.CheckBox() + Me.CH_FAV = New System.Windows.Forms.CheckBox() + Me.CH_PARSE_USER_MEDIA = New System.Windows.Forms.CheckBox() + Me.CH_READY_FOR_DOWN = New System.Windows.Forms.CheckBox() + Me.TXT_DESCR = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_USER_FRIENDLY = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TP_ADD_BY_LIST = New System.Windows.Forms.TableLayoutPanel() + Me.CH_ADD_BY_LIST = New System.Windows.Forms.CheckBox() + Me.CH_AUTO_DETECT_SITE = New System.Windows.Forms.CheckBox() + Me.TXT_LABELS = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() + TP_MAIN = New System.Windows.Forms.TableLayoutPanel() + TP_SITE = New System.Windows.Forms.TableLayoutPanel() + TP_PARAMS = New System.Windows.Forms.TableLayoutPanel() + TP_OTHER = New System.Windows.Forms.TableLayoutPanel() + TT_MAIN = New System.Windows.Forms.ToolTip(Me.components) + TP_MAIN.SuspendLayout() + CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).BeginInit() + TP_SITE.SuspendLayout() + TP_PARAMS.SuspendLayout() + TP_OTHER.SuspendLayout() + CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_USER_FRIENDLY, System.ComponentModel.ISupportInitialize).BeginInit() + Me.TP_ADD_BY_LIST.SuspendLayout() + CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).BeginInit() + Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() + Me.CONTAINER_MAIN.SuspendLayout() + Me.SuspendLayout() + ' + 'TP_MAIN + ' + TP_MAIN.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_MAIN.ColumnCount = 1 + TP_MAIN.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_MAIN.Controls.Add(Me.TXT_USER, 0, 0) + TP_MAIN.Controls.Add(TP_SITE, 0, 2) + TP_MAIN.Controls.Add(TP_PARAMS, 0, 3) + TP_MAIN.Controls.Add(TP_OTHER, 0, 4) + TP_MAIN.Controls.Add(Me.TXT_DESCR, 0, 7) + TP_MAIN.Controls.Add(Me.TXT_USER_FRIENDLY, 0, 1) + TP_MAIN.Controls.Add(Me.TP_ADD_BY_LIST, 0, 5) + TP_MAIN.Controls.Add(Me.TXT_LABELS, 0, 6) + TP_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + TP_MAIN.Location = New System.Drawing.Point(0, 0) + TP_MAIN.Name = "TP_MAIN" + TP_MAIN.RowCount = 8 + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0005!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 19.99851!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20.0!)) + TP_MAIN.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 150.0!)) + TP_MAIN.Size = New System.Drawing.Size(454, 366) + TP_MAIN.TabIndex = 0 + ' + 'TXT_USER + ' + Me.TXT_USER.CaptionText = "User name" + Me.TXT_USER.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_USER.Location = New System.Drawing.Point(4, 4) + Me.TXT_USER.Name = "TXT_USER" + Me.TXT_USER.PlaceholderEnabled = True + Me.TXT_USER.PlaceholderText = "Enter user name or url here..." + Me.TXT_USER.Size = New System.Drawing.Size(446, 22) + Me.TXT_USER.TabIndex = 0 + ' + 'TP_SITE + ' + TP_SITE.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_SITE.ColumnCount = 2 + TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_SITE.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_SITE.Controls.Add(Me.OPT_REDDIT, 0, 0) + TP_SITE.Controls.Add(Me.OPT_TWITTER, 1, 0) + TP_SITE.Dock = System.Windows.Forms.DockStyle.Fill + TP_SITE.Location = New System.Drawing.Point(1, 59) + TP_SITE.Margin = New System.Windows.Forms.Padding(0) + TP_SITE.Name = "TP_SITE" + TP_SITE.RowCount = 1 + TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_SITE.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!)) + TP_SITE.Size = New System.Drawing.Size(452, 30) + TP_SITE.TabIndex = 2 + ' + 'OPT_REDDIT + ' + Me.OPT_REDDIT.AutoSize = True + Me.OPT_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_REDDIT.Location = New System.Drawing.Point(4, 4) + Me.OPT_REDDIT.Name = "OPT_REDDIT" + Me.OPT_REDDIT.Size = New System.Drawing.Size(218, 22) + Me.OPT_REDDIT.TabIndex = 0 + Me.OPT_REDDIT.TabStop = True + Me.OPT_REDDIT.Text = "Reddit" + Me.OPT_REDDIT.UseVisualStyleBackColor = True + ' + 'OPT_TWITTER + ' + Me.OPT_TWITTER.AutoSize = True + Me.OPT_TWITTER.Dock = System.Windows.Forms.DockStyle.Fill + Me.OPT_TWITTER.Location = New System.Drawing.Point(229, 4) + Me.OPT_TWITTER.Name = "OPT_TWITTER" + Me.OPT_TWITTER.Size = New System.Drawing.Size(219, 22) + Me.OPT_TWITTER.TabIndex = 1 + Me.OPT_TWITTER.TabStop = True + Me.OPT_TWITTER.Text = "Twitter" + Me.OPT_TWITTER.UseVisualStyleBackColor = True + ' + 'TP_PARAMS + ' + TP_PARAMS.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_PARAMS.ColumnCount = 2 + TP_PARAMS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_PARAMS.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_PARAMS.Controls.Add(Me.CH_TEMP, 0, 0) + TP_PARAMS.Controls.Add(Me.CH_FAV, 1, 0) + TP_PARAMS.Dock = System.Windows.Forms.DockStyle.Fill + TP_PARAMS.Location = New System.Drawing.Point(1, 90) + TP_PARAMS.Margin = New System.Windows.Forms.Padding(0) + TP_PARAMS.Name = "TP_PARAMS" + TP_PARAMS.RowCount = 1 + TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_PARAMS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!)) + TP_PARAMS.Size = New System.Drawing.Size(452, 30) + TP_PARAMS.TabIndex = 3 + ' + 'CH_TEMP + ' + Me.CH_TEMP.AutoSize = True + Me.CH_TEMP.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_TEMP.Location = New System.Drawing.Point(4, 4) + Me.CH_TEMP.Name = "CH_TEMP" + Me.CH_TEMP.Size = New System.Drawing.Size(218, 22) + Me.CH_TEMP.TabIndex = 0 + Me.CH_TEMP.Text = "Temporary" + Me.CH_TEMP.UseVisualStyleBackColor = True + ' + 'CH_FAV + ' + Me.CH_FAV.AutoSize = True + Me.CH_FAV.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FAV.Location = New System.Drawing.Point(229, 4) + Me.CH_FAV.Name = "CH_FAV" + Me.CH_FAV.Size = New System.Drawing.Size(219, 22) + Me.CH_FAV.TabIndex = 1 + Me.CH_FAV.Text = "Favorite" + Me.CH_FAV.UseVisualStyleBackColor = True + ' + 'TP_OTHER + ' + TP_OTHER.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + TP_OTHER.ColumnCount = 2 + TP_OTHER.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OTHER.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_OTHER.Controls.Add(Me.CH_PARSE_USER_MEDIA, 1, 0) + TP_OTHER.Controls.Add(Me.CH_READY_FOR_DOWN, 0, 0) + TP_OTHER.Dock = System.Windows.Forms.DockStyle.Fill + TP_OTHER.Location = New System.Drawing.Point(1, 121) + TP_OTHER.Margin = New System.Windows.Forms.Padding(0) + TP_OTHER.Name = "TP_OTHER" + TP_OTHER.RowCount = 1 + TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_OTHER.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 29.0!)) + TP_OTHER.Size = New System.Drawing.Size(452, 30) + TP_OTHER.TabIndex = 4 + ' + 'CH_PARSE_USER_MEDIA + ' + Me.CH_PARSE_USER_MEDIA.AutoSize = True + Me.CH_PARSE_USER_MEDIA.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_PARSE_USER_MEDIA.Location = New System.Drawing.Point(229, 4) + Me.CH_PARSE_USER_MEDIA.Name = "CH_PARSE_USER_MEDIA" + Me.CH_PARSE_USER_MEDIA.Size = New System.Drawing.Size(219, 22) + Me.CH_PARSE_USER_MEDIA.TabIndex = 0 + Me.CH_PARSE_USER_MEDIA.Text = "Get user media only" + TT_MAIN.SetToolTip(Me.CH_PARSE_USER_MEDIA, "For twitter only!" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "If checked then user media only will be downloaded." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "Otherwise" & + " all media (include comments and retwits) will be downloaded.") + Me.CH_PARSE_USER_MEDIA.UseVisualStyleBackColor = True + ' + 'CH_READY_FOR_DOWN + ' + Me.CH_READY_FOR_DOWN.AutoSize = True + Me.CH_READY_FOR_DOWN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_READY_FOR_DOWN.Location = New System.Drawing.Point(4, 4) + Me.CH_READY_FOR_DOWN.Name = "CH_READY_FOR_DOWN" + Me.CH_READY_FOR_DOWN.Size = New System.Drawing.Size(218, 22) + Me.CH_READY_FOR_DOWN.TabIndex = 1 + Me.CH_READY_FOR_DOWN.Text = "Ready for download" + TT_MAIN.SetToolTip(Me.CH_READY_FOR_DOWN, "If checked then this user can be downloaded by [Download All]") + Me.CH_READY_FOR_DOWN.UseVisualStyleBackColor = True + ' + 'TXT_DESCR + ' + ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) + ActionButton1.Dock = System.Windows.Forms.DockStyle.Top + ActionButton1.Index = 0 + ActionButton1.Name = "BTT_CLEAR" + Me.TXT_DESCR.Buttons.Add(ActionButton1) + Me.TXT_DESCR.CaptionDock = System.Windows.Forms.DockStyle.Top + Me.TXT_DESCR.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.None + Me.TXT_DESCR.CaptionVisible = False + Me.TXT_DESCR.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_DESCR.GroupBoxed = True + Me.TXT_DESCR.GroupBoxText = "Description" + Me.TXT_DESCR.Location = New System.Drawing.Point(4, 217) + Me.TXT_DESCR.Multiline = True + Me.TXT_DESCR.Name = "TXT_DESCR" + Me.TXT_DESCR.Size = New System.Drawing.Size(446, 145) + Me.TXT_DESCR.TabIndex = 5 + ' + 'TXT_USER_FRIENDLY + ' + Me.TXT_USER_FRIENDLY.CaptionText = "Friendly name" + Me.TXT_USER_FRIENDLY.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_USER_FRIENDLY.Location = New System.Drawing.Point(4, 33) + Me.TXT_USER_FRIENDLY.Name = "TXT_USER_FRIENDLY" + Me.TXT_USER_FRIENDLY.Size = New System.Drawing.Size(446, 22) + Me.TXT_USER_FRIENDLY.TabIndex = 1 + ' + 'TP_ADD_BY_LIST + ' + Me.TP_ADD_BY_LIST.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.[Single] + Me.TP_ADD_BY_LIST.ColumnCount = 2 + Me.TP_ADD_BY_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + Me.TP_ADD_BY_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + Me.TP_ADD_BY_LIST.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_ADD_BY_LIST, 0, 0) + Me.TP_ADD_BY_LIST.Controls.Add(Me.CH_AUTO_DETECT_SITE, 1, 0) + Me.TP_ADD_BY_LIST.Dock = System.Windows.Forms.DockStyle.Fill + Me.TP_ADD_BY_LIST.Location = New System.Drawing.Point(1, 152) + Me.TP_ADD_BY_LIST.Margin = New System.Windows.Forms.Padding(0) + Me.TP_ADD_BY_LIST.Name = "TP_ADD_BY_LIST" + Me.TP_ADD_BY_LIST.RowCount = 1 + Me.TP_ADD_BY_LIST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.TP_ADD_BY_LIST.Size = New System.Drawing.Size(452, 30) + Me.TP_ADD_BY_LIST.TabIndex = 6 + ' + 'CH_ADD_BY_LIST + ' + Me.CH_ADD_BY_LIST.AutoSize = True + Me.CH_ADD_BY_LIST.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_ADD_BY_LIST.Location = New System.Drawing.Point(4, 4) + Me.CH_ADD_BY_LIST.Name = "CH_ADD_BY_LIST" + Me.CH_ADD_BY_LIST.Size = New System.Drawing.Size(218, 22) + Me.CH_ADD_BY_LIST.TabIndex = 0 + Me.CH_ADD_BY_LIST.Text = "Add by list" + Me.CH_ADD_BY_LIST.UseVisualStyleBackColor = True + ' + 'CH_AUTO_DETECT_SITE + ' + Me.CH_AUTO_DETECT_SITE.AutoSize = True + Me.CH_AUTO_DETECT_SITE.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_AUTO_DETECT_SITE.Location = New System.Drawing.Point(229, 4) + Me.CH_AUTO_DETECT_SITE.Name = "CH_AUTO_DETECT_SITE" + Me.CH_AUTO_DETECT_SITE.Size = New System.Drawing.Size(219, 22) + Me.CH_AUTO_DETECT_SITE.TabIndex = 1 + Me.CH_AUTO_DETECT_SITE.Text = "Auto detect site" + Me.CH_AUTO_DETECT_SITE.UseVisualStyleBackColor = True + ' + 'TXT_LABELS + ' + ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) + ActionButton2.Index = 0 + ActionButton2.Name = "BTT_OPEN" + ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) + ActionButton3.Index = 1 + ActionButton3.Name = "BTT_CLEAR" + Me.TXT_LABELS.Buttons.Add(ActionButton2) + Me.TXT_LABELS.Buttons.Add(ActionButton3) + Me.TXT_LABELS.CaptionText = "Labels" + Me.TXT_LABELS.CaptionWidth = 50.0R + Me.TXT_LABELS.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_LABELS.Location = New System.Drawing.Point(4, 186) + Me.TXT_LABELS.Name = "TXT_LABELS" + Me.TXT_LABELS.Size = New System.Drawing.Size(446, 22) + Me.TXT_LABELS.TabIndex = 7 + Me.TXT_LABELS.TextBoxReadOnly = True + ' + 'CONTAINER_MAIN + ' + ' + 'CONTAINER_MAIN.ContentPanel + ' + Me.CONTAINER_MAIN.ContentPanel.Controls.Add(TP_MAIN) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(454, 366) + Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill + Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False + Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) + Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" + Me.CONTAINER_MAIN.RightToolStripPanelVisible = False + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(454, 366) + Me.CONTAINER_MAIN.TabIndex = 0 + Me.CONTAINER_MAIN.TopToolStripPanelVisible = False + ' + 'UserCreatorForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(454, 366) + Me.Controls.Add(Me.CONTAINER_MAIN) + Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(470, 405) + Me.MinimizeBox = False + Me.MinimumSize = New System.Drawing.Size(470, 405) + Me.Name = "UserCreatorForm" + Me.ShowInTaskbar = False + Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide + Me.Text = "Create User" + TP_MAIN.ResumeLayout(False) + CType(Me.TXT_USER, System.ComponentModel.ISupportInitialize).EndInit() + TP_SITE.ResumeLayout(False) + TP_SITE.PerformLayout() + TP_PARAMS.ResumeLayout(False) + TP_PARAMS.PerformLayout() + TP_OTHER.ResumeLayout(False) + TP_OTHER.PerformLayout() + CType(Me.TXT_DESCR, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_USER_FRIENDLY, System.ComponentModel.ISupportInitialize).EndInit() + Me.TP_ADD_BY_LIST.ResumeLayout(False) + Me.TP_ADD_BY_LIST.PerformLayout() + CType(Me.TXT_LABELS, System.ComponentModel.ISupportInitialize).EndInit() + Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) + Me.CONTAINER_MAIN.ResumeLayout(False) + Me.CONTAINER_MAIN.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Private WithEvents CONTAINER_MAIN As ToolStripContainer + Private WithEvents TXT_USER As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents OPT_REDDIT As RadioButton + Private WithEvents OPT_TWITTER As RadioButton + Private WithEvents CH_TEMP As CheckBox + Private WithEvents CH_FAV As CheckBox + Private WithEvents CH_PARSE_USER_MEDIA As CheckBox + Private WithEvents TXT_USER_FRIENDLY As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents CH_READY_FOR_DOWN As CheckBox + Private WithEvents TXT_DESCR As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TP_ADD_BY_LIST As TableLayoutPanel + Private WithEvents CH_ADD_BY_LIST As CheckBox + Private WithEvents CH_AUTO_DETECT_SITE As CheckBox + Private WithEvents TXT_LABELS As PersonalUtilities.Forms.Controls.TextBoxExtended + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/UserCreatorForm.resx b/SCrawler/Editors/UserCreatorForm.resx new file mode 100644 index 0000000..d566329 --- /dev/null +++ b/SCrawler/Editors/UserCreatorForm.resx @@ -0,0 +1,591 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + False + + + False + + + False + + + False + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + AAABAAkAMDAQAAAAAABoBgAAlgAAACAgEAAAAAAA6AIAAP4GAAAQEBAAAAAAACgBAADmCQAAMDAAAAEA + CACoDgAADgsAACAgAAABAAgAqAgAALYZAAAQEAAAAQAIAGgFAABeIgAAMDAAAAEAIACoJQAAxicAACAg + AAABACAAqBAAAG5NAAAQEAAAAQAgAGgEAAAWXgAAKAAAADAAAABgAAAAAQAEAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAgACAAAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wAiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIiIiIiIiIiIiAAAyIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAADIiIiIiIiIiIiIiIiIiIiIiIiIi + IAC7sAMiIiIiIiIiIiIiIiIiIiIiIiIiIAsHuwAyIiIiIiIiIiIiIiIiIiIiIiIiILuAe7ADIiIiIiIi + IiIiIiIiLMAAAAAAALO4B7sAMiIiIiIiIiIiIiLAAADMZmZmwLs7gHuwAyIiIiIiIiIiLAAAxmZmzMzM + wACzuAe7ADIiIiIiIiIsAAZmzMzMzMzMAAC7u4B7sAMzMzMzIiLABszMzMzMzMzAAAAAC7gHuwAAAAAA + MiIAbMzMzMAAAAwAAAAACzuAe7gzMzMwAyIGzMzMAAODcwAAABEAC7u4C7u7u7uzADIAzMwAODc3NzAB + GRkQAAC7uwuwi7u7MAMgDMCDc3Nzc4ARERERAAALsLsIu3i7swMiAMA3Nzc3NwABODg4AiILC7CLtxe7 + swMiIABzc3NzgwODg4OAIiILuwi7cHu7swMiIgA3Nzc3OAg4ODgCIiILsIu3F7u7swMiIiADc3OAAAAA + g4AiIiILCLtwe3d3swMiIiAINzg4Nzc3CDAiIiI7i7cXswADswMiIiADg3Nzc3N3A4AiIiI7u3B7MIIg + swMiIgAACDc3Nzc3AAAAACI7txe7MIIDswMiIAAAAHNzc3ODA4ODgwI7uHu7MIA7sDIiAAAAADc4Nzc3 + CDg4OAIju7u7MwO7AyIiAAAAA3ODc3NzAIODgwIiO7u7u7uwMiIgAAAIdzc3N3c3Nwg4MAIiI7u7u7sD + IiIAAAADc4Nzd3NzcwODgwIiIjMzMzMyIiIAAAAHdzc3d3c3MDg4OAAiIiIiIiIiIiIAAAADc3Nzc3Nz + cIODg4MCIiIiIiIiIiIAAAAANzg3NzA3MDg4ODgCIiIiIiIiIiIAAAAAAACDc3AAAIODg4AiIiIiIiIi + IiIAAAAAAAA4Nzc3ADg4ODAiIiIiIiIiIiIAAAAAAAADc3NzcIOAg4AiIiIiIiIiIiIAAAAAAAAANzc3 + cDgwAAgiIiIiIiIiIiIAAAAAAAAAA3NzcIODgwgiIiIiIiIiIiIAAAAAAAAAADc3MDg4OAgiIiIiIiIi + IiIgAAAAAAAAAAAAAIODg4AiIiIiIiIiIiIgAAAAAAAAAAAAADg4ODAiIiIiIiIiIiIiAAAAAAAAAAAA + AACDg4ACIiIiIiIiIiIiIAAAAAAAAAAAAAAAAAACIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAACIiIiIiIi + IiIiIiIAAAAAAAAAAAAAAAACIiIiIiIiIiIiIiIiIiAAAAAAAAAAAAAiIiIiIiIiIiIiIiIiIiIAAAAA + AAAAACIiIiIiIiIiIiIiIiIiIiIiAAAAAAAAIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiL///////8AAP///////wAA///+D///AAD///wH//8AAP// + +AP//wAA///4Af//AAD///gA//8AAP+AAAB//wAA/AAAAD//AADgAAAAH/8AAIAAAAAADwAAAAAAAAAH + AAAAAAAAAAMAAAAAAAAAAQAAAAAAAAAAAACAAAAAAAAAAMAAABwAAAAA4AAAPAAAAADwAAB8AAAAAPgA + APwAAAAA+AAA/AAAAAD4AAD8AGAAAPAAAAwAQAAA4AAABAABAADAAAAGAAMAAMAAAAcABwAAgAAAB4AP + AAAAAAAHwB8AAAAAAAP//wAAAAAAAf//AAAAAAAB//8AAAAAAAP//wAAAAAAA///AAAAAAAD//8AAAAA + AAP//wAAAAAAA///AAAAAAAD//8AAIAAAAP//wAAgAAAA///AADAAAAB//8AAOAAAAH//wAA8AAAAf// + AAD8AAAB//8AAP/gAAP//wAA//AAD///AAD//AA///8AAP///////wAA////////AAAoAAAAIAAAAEAA + AAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAICAAIAAAACAAIAAgIAAAMDA + wACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ACIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIAAy + IiIiIiIiIiIiIiIiIgCIAyIiIiIiIiIiIiIiIiIHC4AyIiIiIiIiIiiAAAAAC3C4AyIiIiIiIoAAAAzM + zAC3C4AyIiIiIoAADMzMzMABAHC4AzMzMiIADMzAAMwAERC3C4AAAAMiDMzAA4MAARGRALC7u7uAMiDM + CDc3MAhziRALsws7uAMgAHdzeAGDhzAiCzCzC7sDIgA3N4MAOHMCIgsLMLu7AyIgA3MBAQOAIiI7swgA + iwMiIAc3g4dwMCIiOzCwggsDIgAAd3d38AAAIjt7sIC7gyAAAAd3dzE4NwIju7gLuDIgAAB3c3dwA4cC + Iju7u4MiAAAHdzd/d3A4EiIjMzMyIgAAB3d3938DgwAiIiIiIiIAAAA3d3B3CHdzAiIiIiIiAAAAADdx + AAd3MCIiIiIiIgAAAAADd3ADCHAiIiIiIiIAAAAAADf3CBADIiIiIiIiAAAAAAADdwN3CCIiIiIiIiAA + AAAAAAAIc3AiIiIiIiIgAAAAAAAAADcwAiIiIiIiIgAAAAAAAAAAAAIiIiIiIiIiAAAAAAAAAAACIiIi + IiIiIiIgAAAAAAAAIiIiIiIiIiIiIiAAAAAAIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi + IiIiIiIi///////+H////A////wH//gAA//AAAH/AAAABwAAAAMAAAABgAAAAIAAMADAAHAA4ADwAOAA + 8BDAADAAgAAYAYAAHAMAAB4HAAAP/wAAB/8AAA//AAAP/wAAD/8AAA//gAAP/4AAB//AAAf/8AAH//4A + D///gD////////////8oAAAAEAAAACAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + gAAAAAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////ACIi + IiIAMiIiIiIiIDsDIiIiDMRAsLAyIgzMzMwLCwAyDMAAABCwuwMAB3ARkjuzsCB3gAAiOzCwIgh3cAA7 + uzMgBzdwhwMzMgB3f3cIAiIiAHd3AHOIIiIAAHfwMAIiIgAAB3CHAiIiAAAAADgAIiIgAAAAAAAiIiIg + AAAAAiIi/x/AA/4PARHAB7C7AAGAMgAACDcAQAhzgMALs8AAuAOAAXdzAB+DhwAPCzAAH7sDAB83NwAP + OHOADwsL4B+7AygAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////ABEM + aQAAAAAANBpLAAAAAAB/TG4AYF5eAP1lVAD8ZFMA/WZVAPljUAD9alcA/WtYAL+LhADnWD4A711GAP1y + XAD9dV4A/XhgAPFoTgDzbVMA/XxkANxRMQD4e18A/YRpANJMJwDvdlYA/IttAP2OcADNSCEA4GZCALFl + TQD+knIAwEATAKU/GQDSXDIA1WI3AOuAWQD5km8At0YbAMVXKwDMXS8At1cxAH5AJwCFRy4A6Zp6AGxV + TACMUDYA13RFAGpjXwDViFUAbUkxAP+/kQCsZSsA7riKAJpYGQD/798A/8+cAP/ZpgDf0bwAhWAaAP3j + sAD/9+gAkXkwAP//8gD///wAv9msAICrZwDP4sUAcKlfAEiQNwBtxGIAespvAEyZRgBqqWYAL5gtAAqF + CgAWihYAGpYaAB6PHgAZdxkAKa0pACOQIwAbaBsAPLc8AEO7QwBAs0AAJWYlADmaOQBKvkoAT8FPAESm + RABSwlIATbNNAFC4UABWxFYAW8VbAGPKYwBpzWkAb9FvAGfAZwBFfkUAddJ1AHHLcQB813wAj+CPAICz + gAA1WTgAn7CkADd9VwACaHYAaZquABNyogAYdqYAF2OKACBggQAsWG8AE1+IACR+rgA5n9kAOou3AD+V + wwBHn9AAV6nXAGOr0gCezOYAo9DqAA1zswAkfbYAIm6dAD2i3wBNs/IAU7n5AHq74QCEwOQAlMjnAJfK + 6ACezekAFXm6ACOFxgBDqO0AUbf/AFW7/wBWvP8AWmBkABuBzQAfhdQAS7H/AE2z/wBOtP8AQnOZACeM + 4gAtkuYARKn/AESq/wBHrf8ASa//ACyS8QA6oP8APKH/AD2i/wBApv8AQ6j/ADKW/AAylfsAM5n/ADWb + /wA3nf8AEliiAC+M8wAxkfkANpT3AAkSHAAXY7oAKnziAC2C6gAndNoAJnHXACl64AAod90AIWK1ACNo + zgAkatAAFlOwAB5fwgAgYMYAImXLABBCngAcVrwAI2jdAB5awAAQLFsADhksABtRtwAaTbMADSloAB1W + 0gAWQZ4AGUiuAAUpgwAUP6QAFDyiABQ6oAASNZsADCV+AA8tkwAQL5UABQcOAAgdbAANJo0ABxVbAAYY + ewAuNFcAHyApAAQMcgABAhUAAQRqAKSkpACXl5cAj4+PAISEhAB+fn4AcXFxAG1tbQBmZmYAVFRUAE1N + TQBKSkoARkZGAD8/PwA4ODgANjY2AC8vLwAsLCwAKioqACgoKAAkJCQAISEhAB8fHwAcHBwAGhoaABgY + GAAXFxcAEhISAA0NDQAKCgoAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF4ODhMuEy4TIy4TLh4eDg + 4ODgBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXg4SMsIiMiIyIjIiMjIywsNC/h4eAFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBeAoIiIeGhcPFxALCwkQDyIiIiIjIzTg4QUFBQUFBeDg4ODg4ODg4ODg + 4AUFBQUFBSsiIhoaFw8QCwgIDAwNDygiEAsPGiIjNODg4eEH4eJsWGxYbFhsWGxs4+HgBQUFBSseGhoP + DwsJDA0RERERIjcpDwoJCxcaIjRYVE1UVE1QU1NTU05OT01NTVRY4AUFBSsoGg8XCwkMERMWFhYaKz4z + HhENCAsPFyJRWVZbTU1fWltbVlZVUlJST09N4uAFBTMiFw8LCA0RFhYZGTEoOz47IhYRDQkLDyJKW11Z + TFFZYGFdXVtWVlJSUk9NbOAFBTEiDxAJDRETGRkdGSIuPj4+KxQWEQ0IDyJKYGFObUNNYmJiYF1bVlZV + UlJNWOAFBQUjFwsMERYZGR0hHio7Ozs7MxcZFhEMECJGYWJUPkFKU2hjY2JgXVZWVVJNbOAFBQUxIgsN + ExYZHSEqKTo7Ozs7MykZFhMNCyJiZF9TPz85UV5oZGNiYFtWVVJN4OAFBQUFKx4RFhkdJyYiNzU6OjU6 + Lh4dGRYRFzhkZ1lrQUFBbU1oaWdjYmFbVlJU4AUFBQUFBSIXFhkdJiImNzo3NTo6LiIdGRMfIkRnZ05D + QkJCQmtRaWlkYmFdVk1m4AUFBQUFBQUrKSYbIjEOIAYGDiE3NyIdGR8iQGdpalQ/AQEBAT9TSmlnZGJg + UFTgBQUFBQUFBQUFMTEiIwTX2dfZ19kGJiIxKCNGSGdpak0/Pz8/Pz9DVF5pZGJMVOEFBQUFBQUFBQUF + 4OnvwdPU0tLS0s3ZBCMjIFRcZ2lqaFQ5OTk+OTk+alRlZ0xU4AUFBQUFBQUFBQX1APf3AADTz8/Pz8/S + 1wIFBQVUTmVqZVM+bXdxcXF320RNUVTgBQUFBQUFBQUF8AD29/YA0NPNzMvLy8vMz9nVBQUFTVROWU13 + gJKSkpKSgHZUWOAFBQUFBQUFBQXw9/b19fatzMfHx8fHx8fHy87XBQUFBQUFZnaLk5iTmJOTmJJx4+AF + BQUFBQUFBQX39fX09ADOx8PDw8PDw8PDw8fU1QUFBQUFl5KYmZmenpmZmJiScePgBQUFBQUFBQD19PTw + 9K3Dw729vb25vb29vcPSxAUFBQUFgKWmpqampqampqWeknbgBQUFBQUFBfb08PDw9MC9vbm7u7u7u7u5 + ub3HyAUFBQWAnqenqKioqKiop6empot14AUFBQUFBfXw8O3t9NG6u7q3t7e3t7e3u7q6zcgFBQWAqJ+f + oaGhoaGhn5+op6V24AUFBQUFBfTt7err8cG3t7KytLS0tLSysre7yMgFBQWAoaGhoqKioqKioaGhn5+L + deAFBQUFBfDt6uvo6q2ytLSvsLCwsK+wtLKyvMgFBZeeoqObm5ycnJubo6OioaGYdeAFBQUFBfTq6+jo + 5/e7r7CqqqqqqqqwsLC0vHYFBXmNm5ydnZSUlJSdnZybo6KhduAFBQUFBfTo6Ojn5vHIqqqmpqanpqal + qrCwvMgFBZebnZWVlpaOjpaWlZWdnKOigOAFBQUFBfbo6ebl5ujQtLCqqqefn6inpqWeyAUFBXmUlY6O + j5CQkJCOjo6VlJybkuAFBQUFBfDq5ubl5OTxwcvDt7exsKunpqaYyAUFBZeWjo+QkJCQkJCQkI6OlpWd + kuAFBQUFBQX15uXk4uPi6vT2rdHJvcW3t7LA8gUFBXmNkJCQkJCQkJCQkJCPjpaVi+AFBQUFBQX16OTk + 5uIH4N/f5vHY08TUxK0A6AUFBZeDkJB4jIt4m5WWjo6OlpSMceAFBQUFBQUF9uTi4uLh393a2tsH6fD0 + 8Or3BQUFBXmMjHGLenqMcYuTmKekmItyduAFBQUFBQUF9fXiB+Hg393b2kNt3d8H5PTtBQUFBQVxcXKM + eHx8fYZ6eXFyd3dxc+AFBQUFBQUFBfX04uHf3t3d3Nra294H6/YFBQUFBQUFcXp6fHx9h4d/f399cIGA + dAUFBQUFBQUFBQX19eLe3dzb3d7f4OLt9gUFBQUFBQUFcXp8fX2Hh35/f4d8end24AUFBQUFBQUFBQUF + BfXw4t7b3eDk7vbmBQUFBQUFBQUFBXF8fYeHiYeHfXx8enGXBQUFBQUFBQUFBQUFBQUF9fUAAPXoBQUF + BQUFBQUFBQUFBQVxfYd+f4qHh318cnkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + cXmHf39+fHdyBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBXmXeZd5l3kFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF + BQUFBQUFBQUFBQUFBQUFBQUF////////AAD///////8AAP///////wAA////////AAD///////8AAP// + /////wAA4AAH////AADAAAH///8AAIAAAH4AHwAAgAAAAAAHAACAAAAAAAMAAIAAAAAAAQAAgAAAAAAB + AACAAAAAAAEAAMAAAAAAAQAAwAAAAAABAADgAAAAAAMAAPAAAAAAAwAA+AAAAAAHAAD8AAAAAA8AAPwA + AAAAHwAA+AAOAAA/AADgAAcAAH8AAMAAB+AAfwAAwAAD4AA/AACAAAPgAD8AAIAAA8AAHwAAgAABwAAf + AACAAAHAAA8AAIAAAYAADwAAgAABgAAPAACAAAGAAA8AAIAAA4AADwAAgAADgAAPAADAAAOAAA8AAMAA + A4AADwAA4AAHgAAPAADgAAfAAA8AAPAAD+AAHwAA+AAf4AAfAAD+AD/wAD8AAP+B//gAfwAA/////AH/ + AAD////+A/8AAP///////wAA////////AAD///////8AAP///////wAAKAAAACAAAABAAAAAAQAIAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AEQxpAAAAAAA0GksATCFPAH9MbgBgXl4A/WVUAPxk + UwD9ZlUA+WNQAP1qVwD9a1gAv4uEAOdYPgDvXUYA/XJcAP11XgD9eGAA8WhOAPNtUwD9fGQA3FExAPh7 + XwD9hGkA0kwnAO92VgD8i20A/Y5wAM1IIQDgZkIAsWVNAP6ScgDAQBMApT8ZANJcMgDVYjcA64BZAPmS + bwC3RhsAxVcrAMxdLwC3VzEAfkAnAIVHLgDpmnoAbFVMAIxQNgDXdEUAamNfANWIVQBtSTEA/7+RAKxl + KwDuuIoAmlgZAP/v3wD/z5wA/9mmAN/RvACFYBoA/eOwAP/36ACReTAA///yAP///AC/2awAgKtnAM/i + xQBwqV8ASJA3AG3EYgB6ym8ATJlGAGqpZgAvmC0ACoUKABaKFgAalhoAHo8eABl3GQAprSkAI5AjABto + GwA8tzwAQ7tDAECzQAAlZiUAOZo5AEq+SgBPwU8ARKZEAFLCUgBNs00AULhQAFbEVgBbxVsAY8pjAGnN + aQBv0W8AZ8BnAEV+RQB10nUAcctxAHzXfACP4I8AgLOAADVZOACfsKQAN31XAAJodgBpmq4AE3KiABh2 + pgAXY4oAIGCBACxYbwATX4gAJH6uADmf2QA6i7cAP5XDAEef0ABXqdcAY6vSAJ7M5gCj0OoADXOzACR9 + tgAibp0APaLfAE2z8gBTufkAervhAITA5ACUyOcAl8roAJ7N6QAVeboAI4XGAEOo7QBRt/8AVbv/AFa8 + /wBaYGQAG4HNAB+F1ABLsf8ATbP/AE60/wBCc5kAJ4ziAC2S5gBEqf8ARKr/AEet/wBJr/8ALJLxADqg + /wA8of8APaL/AECm/wBDqP8AMpb8ADKV+wAzmf8ANZv/ADed/wASWKIAL4zzADGR+QA2lPcACRIcABdj + ugAqfOIALYLqACd02gAmcdcAKXrgACh33QAhYrUAI2jOACRq0AAWU7AAHl/CACBgxgAiZcsAEEKeABxW + vAAjaN0AHlrAABAsWwAOGSwAG1G3ABpNswANKWgAHVbSABZBngAZSK4ABSmDABQ/pAAUPKIAFDqgABI1 + mwAMJX4ADy2TABAvlQAFBw4ACB1sAA0mjQAHFVsABhh7AC40VwAfICkABAxyAAECFQABBGoApKSkAJeX + lwCPj48AhISEAH5+fgBxcXEAbW1tAGZmZgBUVFQATU1NAEpKSgBGRkYAPz8/ADg4OAA2NjYALy8vACws + LAAqKioAKCgoACQkJAAhISEAHx8fABwcHAAaGhoAGBgYABcXFwASEhIADQ0NAAoKCgACAgIAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODg4ODg4ODg4OAAAAAAAAAAAAAAAAAA + AAAAAAAAAODgMC0tLS0tLTQvMuDg4AAAAAAAAAAAAAAAAAAAAAAAKyIaFw8QCwgIHhoaIywv4ODg4ODg + 4ODg4ODg4OAAAAAiGhcQCQwREhQzKgoLDyI0WFhUUVNQUFBOUVRs4OAAACIXEAoRExYZKT4zFQwJEDhX + W0xTXV1aVlVSUk1R4AAAKQ8JERMZHCU3PjcfEwwLNmBhRkReYmFdVlVST1HgAAAqDw0TGSEmMzs7OyQZ + Ego2Y1xDP0pnY2JgVlVPUeAAAAAqGxYcJyo6Ojo6MRwTFEBnWUFBRVlpZGJbVVHgAAAAAAAlGxwqLg4O + NzUxHRgoSWlLQgEBa2VpY2FMUQAAAAAAAAAgKAXZ19cCBiQkPUhpaks/Pzk5SmhkX2YAAAAAAAAA5PL3 + 2M3Pz87UBAdLWWRqRDxweXBtR1xmAAAAAAAAAPT29tDEzMrKysvU1QAASkpugJKTkotvbOAAAAAAAADy + 9fT1xMfHw8PDx8nRAAAAAACenp6enpN2B+AAAAAAAPTz8fXCvb+/ub+9vcipAACBpqenp6empph14AAA + AADw8e/twbq7tre3t7u7vHUAcZigoKCgoKCfqIuR4AAAAPDu7Orzt7G0s7OztLK41QBxoaOam5ubo6Kh + mXXgAAAA8Ovp6O21sKqrpauqr7l1AHGbnJSUlJSdnJqidOAAAADw6+fm5sCqq6efp6akrnUAcZSVjo6O + jpaVnZuC4AAAAADw5uXj6sDGxb6wrKupqQBxjo+QkJCQj46WlIvgAAAAAOvm5OQH4ePW09LMxK0AAHGQ + hYN4hI6QhY6NceAAAAAAAOvi4uHd29rf5enr5gAAcYtxjHp5jJKTjHdzAAAAAAAAAO4H393c2tre5PEA + AACLcXp7fIaJfn16cpcAAAAAAAAAAOzh3Nvd4OXpAAAAAABxeXyGh4p+fXpxAAAAAAAAAAAAAOzs7Ozs + 7AAAAAAAAABxe4h/iIZ8dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxcXFxcXEAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////+AH//+AAP//gAAAA4AA + AAGAAAABgAAAAYAAAAHAAAAD4AAAB/AAAA/gAAAfwAMAH4AD4A+AAYAPAAEABwABAAcAAQAHAAEAB4AB + AAeAAwAHwAMAD+AHAA/wD4Af+B/AP///4H////////////////8oAAAAEAAAACAAAAABAAgAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wARDGkAAAAAADQaSwBMIU8Af0xuAGBeXgD9ZVQA/GRTAP1m + VQD5Y1AA/WpXAP1rWAC/i4QA51g+AO9dRgD9clwA/XVeAP14YADxaE4A821TAP18ZADcUTEA+HtfAP2E + aQDSTCcA73ZWAPyLbQD9jnAAzUghAOBmQgCxZU0A/pJyAMBAEwClPxkA0lwyANViNwDrgFkA+ZJvALdG + GwDFVysAzF0vALdXMQB+QCcAhUcuAOmaegBsVUwAjFA2ANd0RQBqY18A1YhVAG1JMQD/v5EArGUrAO64 + igCaWBkA/+/fAP/PnAD/2aYA39G8AIVgGgD947AA//foAJF5MAD///IA///8AL/ZrACAq2cAz+LFAHCp + XwBIkDcAbcRiAHrKbwBMmUYAaqlmAC+YLQAKhQoAFooWABqWGgAejx4AGXcZACmtKQAjkCMAG2gbADy3 + PABDu0MAQLNAACVmJQA5mjkASr5KAE/BTwBEpkQAUsJSAE2zTQBQuFAAVsRWAFvFWwBjymMAac1pAG/R + bwBnwGcARX5FAHXSdQBxy3EAfNd8AI/gjwCAs4AANVk4AJ+wpAA3fVcAAmh2AGmargATcqIAGHamABdj + igAgYIEALFhvABNfiAAkfq4AOZ/ZADqLtwA/lcMAR5/QAFep1wBjq9IAnszmAKPQ6gANc7MAJH22ACJu + nQA9ot8ATbPyAFO5+QB6u+EAhMDkAJTI5wCXyugAns3pABV5ugAjhcYAQ6jtAFG3/wBVu/8AVrz/AFpg + ZAAbgc0AH4XUAEux/wBNs/8ATrT/AEJzmQAnjOIALZLmAESp/wBEqv8AR63/AEmv/wAskvEAOqD/ADyh + /wA9ov8AQKb/AEOo/wAylvwAMpX7ADOZ/wA1m/8AN53/ABJYogAvjPMAMZH5ADaU9wAJEhwAF2O6ACp8 + 4gAtguoAJ3TaACZx1wApeuAAKHfdACFitQAjaM4AJGrQABZTsAAeX8IAIGDGACJlywAQQp4AHFa8ACNo + 3QAeWsAAECxbAA4ZLAAbUbcAGk2zAA0paAAdVtIAFkGeABlIrgAFKYMAFD+kABQ8ogAUOqAAEjWbAAwl + fgAPLZMAEC+VAAUHDgAIHWwADSaNAAcVWwAGGHsALjRXAB8gKQAEDHIAAQIVAAEEagCkpKQAl5eXAI+P + jwCEhIQAfn5+AHFxcQBtbW0AZmZmAFRUVABNTU0ASkpKAEZGRgA/Pz8AODg4ADY2NgAvLy8ALCwsACoq + KgAoKCgAJCQkACEhIQAfHx8AHBwcABoaGgAYGBgAFxcXABISEgANDQ0ACgoKAAICAgAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA39/f4ODg4OAAAAAAAAAA4CAwMDAw + LzLf4ODg4N/f4B8XCxEUMRQabGxMR0xYbOAzCxYcMzoVDEBeS2JdVVPgAB8ZJjo6Gw1EazleZ1tH4AAA + IAXVBiBAaWo/Q2FcAAAA89DEy8/R4kuXi4Fu4wAA5vHAw73Cz+JwnqamnnXdAPTszrGysr+ReqKioqGM + 4ADq6HWrpqy3kXuUlJWdmeEA4OTm5cm6dt58hISPjo3gAADn4dza4+UAfYF8fXtxcAAAAOAHB+EAAAB5 + h397cAAAAAAAAAAAAAAAAHl5eQAAAAAAAAAAAAAAAAAAAAAAAAD//xcQgH8TFgAAPjMAAAkQAABbTIAA + XVrAA1JSgAPgAAABDwkAARkcAAE+NwABDAuBAWFGw4NiYf/HVVL//+AAKAAAADAAAABgAAAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAATAAAAHgAAACUAAAAsAAAALwAA + AC8AAAAvAAAALwAAAC8AAAAvAAAALgAAACkAAAAkAAAAHwAAABgAAAARAAAACQAAAAIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAEAAAADEAAABVAAAAbQAA + AHwAAACJAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjAAAAIMAAAB5AAAAbgAAAGEAAABSAAAAQAAA + AC4AAAAfAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKA0BRm0i + ArWIKgLijy0C67A3A/+wNwP/sDcD/7A3A/+wNwP/sDcD/7A3A/+wNwP/nzID944sAu2FKgLnaSEC11Qa + AckwDwGyAAAAlwAAAIcAAABwAAAAUAAAAC0AAAARAAAABAAAAAAAAAAAAAAAAQAAAAQAAAAKAAAADwAA + ABUAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAFQAAAA0AAAAGAAAAAQAAAAAAAAAAAAAAAAAA + AAB8JwJErDYD9bk8DP/AQBT/ykcf/9RNKf/dUjL/4lU4/+hYPv/uXET/9WBL//diTv/6Y1H/7lxE/+pa + QP++PxH/uTwM/8VDGf+0OQf/qDQD+4UpAulSGgHNAAAAnQAAAH0AAABPAAAAKAAAABwAAAAiAAAALAAA + ADcAAABDAAAATQAAAFkAAABfAAAAXwAAAF8AAABfAAAAXwAAAF8AAABfAAAAWQAAAEoAAAA6AAAAJwAA + ABEAAAAEAAAAAAAAAACjMwOsuj0N/8lGHv/RSyb/104s/+FUNv/lVzv/8F1G//hiT//9ZVT//WZV//1p + V//9alj//WpY/+pdQv+1Qw//tToI//hiT//4Yk//6lk//9BKJf+2Owr/nzID90UWAcwAAACYAAAAdQAA + AGgAAAB2AAwAjwAmAK0AJACzAD8AzwA+ANIAPgDTAD4A0wA+ANMAPgDTAD4A0wA+ANMAPgDTACMAuwAT + AKkAAACSAAAAegAAAEkAAAAWAAAAAQAAAACoNQPIw0IX/9BLJf/XTiz/4VQ2/+hYPv/1YEv//GVT//1o + Vv/9bVn//XBc//1zXv/9dF//+HBZ/7o+Dv/muYb/v1sn/+BYOf/9aFb//GVT//VgS//oWD7/1k4s/7M5 + Bv9iLAHlADwA2ABTAOoAYgD6AGYA/wVsBf8KcQr/H4wf/yORI/8ikCL/IJAg/yCQIP8cjhz/Go0a/xaL + Fv8OgA7/CHcI/wJqAv8AXAD3ACgAzAAAAIUAAAA3AAAACAAAAACqNQPGx0Ub/9ZOK//hVDb/6Fg+//Vg + S//9ZlT//WtY//1xXP/9d2D//Xpi//18ZP/9f2b/0lUt/8RkMf//7rv/3J5r/8hKH//9cVz//WxZ//1m + VP/1YEv/6Fg+/9xRMf+wNwP/I4IY/zGhMf9DtEP/Tb9N/wVsBf8Odw7/UMFQ/0/AT/9Nv03/S75L/0e8 + R/9CukL/PLc8/zSzNP8tsC3/Jawl/xynHP8SlRL/AWoB/wATAK0AAABTAAAAEgAAAACrNQO0xUQa/91S + Mv/lVzv/9WBL//1mVP/9bVr//XNe//16Yv/9f2b//YNp//2Gav/lbkv/tUIO//rbqf//6Lb/9dKf/7A3 + A//9emL//XNe//1tWv/9ZlT/9WBL/+ZXPP+9PxH/ZZ06/06/Tv9Tw1P/NaE1/zCDKP8geRv/Mpwy/1nG + Wf9Yxlj/VcRV/1HBUf9Mv0z/R7xH/z+5P/81tDX/LrAu/yWsJf8cpxz/Cn4K/wA4AM0AAABcAAAAFgAA + AACpNQNkuj0O/+NVOf/wXUb//GVT//1sWf/9c17//Xpi//2CaP/9h2v//o1v//mJav+1PAr/5qt4///h + rv//4q///+Kw/79XI//qb07//Xpi//1zXv/9bVn//GVT//BdRv+9PxH/aqA//1jGWP9eyF7/HoUe/5/G + iv+/2ab/BmwG/2DGYP9ky2T/YMlg/1vHW/9WxFb/T8BP/0i9SP9BuUH/N7U3/y2wLf8kqyT/DoYO/wA+ + ANEAAABVAAAAEwAAAACmNAMRrzcD8dtRMP/4Yk///WhW//1xXP/9emL//YJo//2IbP/+j3D//pR0/8RP + IP/OdED//9uo///bqP//3Kn//9yp/9N/S//XXjb//YJo//16Yv/9cl3//WlX//hiT/+8PhD/caNG/2TL + ZP9ix2L/AGYA/+/11f///+T/YJ9W/ySIJP9v0G//a85r/2XMZf9fyV//WMZY/1HBUf9JvUn/P7k//zW0 + Nf8qrir/DoAO/wA6AMQAAABBAAAACgAAAAAAAAAArDYDg7w+EP/9ZVT//W5a//13YP/9f2b//Ydr//6P + cP/+lnX/12g9/79UIP/6ypf//9Sh///Uof//1qP//9aj/9yQXf/IUiX//Ydr//1/Zv/9d2D//W5a//hi + T/+wNwP/Z8xn/27Qbv9PsE//MIMs////6f///+v/7/Xc/xBwD/9TslP/dtR2/3HRcf9ozWj/Ycph/1jG + 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 + t/8cVbv/HVe9/x1Xvf8eWb//HlrA/x5Yvv8dV73/HVa8/xxUuv8bUbf/CzKQ/wAZZPMAAACOAAAAMwAA + AAMAAAABAEhtWg91uP8wlvn/Mpj9/zOZ//8zmf//M5n//zOZ//8zmf//M5n//zKY/f8wlvn/LpP0/x+F + 1/8AUnvuAAAAnQAAAFMAAAATAAAAAAAAAAAAAAAAAAAAAAAAAIAGBgb/FRUV/xgYGP8bGxv/Hx8f/xIS + Ev8LIEb/HVa8/x5awP8gXsT/IWHH/yFiyP8hYsj/IWLI/yFiyP8hYsj/IGDG/x9dw/8eWb//Fkqr/wAh + d/8AAACYAAAAQQAAAAkAAAAHAF6Ozi6U8v82nP//N53//zie//84nv//OJ7//zie//84nv//OJ7//zac + //81m///NJr//zOY/v8Teb7/AC9G0QAAAH0AAAArAAAAAwAAAAAAAAAAAAAAAAAAAKwNDQ3/Gxsb/x8f + H/8iIiL/JSUl/xMTE/8PLmH/IWHH/yFjyf8iZ83/I2rQ/yRt0/8kbdP/JG3T/yRt0/8kbNL/I2rQ/yJm + zP8hY8n/IF/F/wAmev8ADSu2AAAATQAAAA8AR2ouC3Gs/zie//86oP//O6H//zyi//89o///PaP//z2j + //89o///PKL//zuh//86oP//OJ7//zac//8xl/n/AFyK9wAAAJoAAABJAAAADQAAAAAAAAAAAAAAAAAA + AMgVFRX/ICAg/yQkJP8oKCj/Kioq/x8fH/8IGTP/I2nP/yRt0/8mcdf/J3Ta/yd23P8oeN7/KHje/yh4 + 3v8ndtz/JnPZ/yVw1v8kbNL/I2jO/wQzhv8ADyq7AAAAWQAAABUAWINwIYfS/z2j//8+pP//P6X//0Cm + //9Bp///Qaf//0Gn//9Bp///QKb//z+l//8+pP//PaP//zuh//84nv//FXu//wAiM8EAAABoAAAAHAAA + AAAAAAAAAAAAAAAAAMcZGRn/JSUl/ykpKf8tLS3/MDAw/ykpKf8FDhr/JnHX/yh33f8ped//Kn7k/yuA + 5v8sguj/LIPp/yuB5/8rgOb/Kn3j/yl53/8nddv/JXDW/wlAlP8AHk3SAAAAWwAAABYAXYudL5Xm/0Gn + //9CqP//RKr//0Wr//9GrP//Rqz//0as//9Fq///Rav//0Op//9CqP//Qaf//z6k//89o///KI7f/wBH + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AAD///////8AAP///////wAA////////AADAAAP///8AAIAAAH///wAAgAAAGAAH + AACAAAAAAAEAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAMAA + AAAAAAAA4AAAAAABAADgAAAAAAEAAPAAAAAAAwAA8AAAAAADAADAAAAAAAcAAIAAAAAADwAAgAAAAAAf + AAAAAACAAB8AAAAAAMAADwAAAAAAAAAPAAAAAAAAAAcAAAAAAAAABwAAAAAAAAAHAAAAAAAAAAMAAAAA + AAAAAwAAAAAAAAADAAAAAAAAAAMAAIAAAAAAAwAAgAAAgAADAACAAACAAAMAAMAAAIAAAwAA4AABwAAH + AADgAAHAAAcAAPAAA8AABwAA/AAH4AAPAAD+AB/wAB8AAP////gAPwAA/////AD/AAD///////8AAP// + /////wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAMAAAAFQAAABgAAAAYAAAAGAAA + ABgAAAAYAAAAFgAAABIAAAALAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAJQAAAEUAAABZAAAAXwAA + AF8AAABfAAAAXwAAAF8AAABcAAAAUwAAAEYAAAA2AAAAJgAAABYAAAAJAAAAAQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9RGQGMbyMCy2sh + AtJrIQLTayEC02shAtNrIQLTayEC01QaAcg9EwG5EgYAoAAAAI8AAAB7AAAAXQAAADkAAAAdAAAAFgAA + ABwAAAAjAAAAKQAAAC4AAAAvAAAALwAAAC8AAAAuAAAAKAAAAB4AAAAPAAAABAAAAAAAAAAArTcG18FB + Ff/RSyb/21Ew/+hYP//zX0r/+WNQ//1lVP/9ZVT/zUgh/9JLJv/UTSn/oTYO82ggAtogCgGwAAAAiAAA + AGcAAABeAAAAagAAAHcAAACDAAAAjAAAAI8AAACPAAAAjwAAAIwAAACCAAAAbQAAAEQAAAAWAAAAAQAA + AAC7PQ7/0kwn/91SM//vXUb//GRT//1pV//9cVz//XRe/+9qTv/Ti1f/zVsw//1nVf/5Y1D/5lc8/7c+ + FPtCIwHXADcAzwRPBN0IXwjqFHQU9SKRIv8fjx//H48f/x2OHf8Wihb/C24L9wNVA+kAKQDHAAAAgQAA + ADMAAAAGAAAAAMNDF//bUTD/711G//1mVf/9clz//Xdg//19ZP/9g2j/yFos//rir//ThlP/821T//1r + WP/8ZFP/7FtC/5pYGf9As0D/T8FP/y+SLP8kjiT/UsJS/1LCUv9Kvkr/QLlA/zu3O/8try3/Iakh/wqF + Cv8AFACmAAAAQwAAAAoAAAAAuT0O4uhYP//8ZFP//XJc//15Yf/9hWr//Yxu/9djOv/rt4T//+Ow//DE + kf/gZkL//Xdg//1qV//5Y1D/p2Im/1bEVv9Zw1n/cKlf/4Czbf9Ns03/ZMtk/1zHXP9Tw1P/RbxF/zy3 + PP8try3/Gpka/wAlAK8AAAA9AAAABwAAAACsNgOD5Vc7//1rWP/9d2D//YZq//6Scv/rgFn/2IdU///Z + pv//2ab//9qn/9JaMf/9g2j//XVe//1mVf+wZy//Z81n/0SoRP+/2az////l/0eYQv9003T/as5q/2LK + Yv9WxFb/RbxF/zm2Of8akhr/ACEAlAAAACgAAAACAAAAAAAAAAC7Pg/R+G9X//19ZP/9i27/+ZJv/8li + MP//zpv//8+c///PnP//0J3/13ZH//2JbP/9e2P/82ZO/5F5MP921Hb/Ppo9////8v////L/z+LF/ziY + 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 + U/+AAFj//4FT////Qv8= + + + \ No newline at end of file diff --git a/SCrawler/Editors/UserCreatorForm.vb b/SCrawler/Editors/UserCreatorForm.vb new file mode 100644 index 0000000..980bf88 --- /dev/null +++ b/SCrawler/Editors/UserCreatorForm.vb @@ -0,0 +1,358 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Imports PersonalUtilities.Forms.Controls +Imports PersonalUtilities.Forms.Controls.Base +Imports PersonalUtilities.Forms.Toolbars +Imports SCrawler.API.Base +Namespace Editors + Friend Class UserCreatorForm : Implements IOkCancelToolbar + Private ReadOnly MyDef As DefaultFormProps(Of FieldsChecker) + Friend Property User As UserInfo + Friend Property UserInstance As IUserData + Friend Property StartIndex As Integer = -1 + Friend ReadOnly Property UserTemporary As Boolean + Get + If CH_FAV.Checked Then + Return False + Else + Return CH_TEMP.Checked + End If + End Get + End Property + Friend ReadOnly Property UserFavorite As Boolean + Get + Return CH_FAV.Checked + End Get + End Property + Friend ReadOnly Property UserMediaOnly As Boolean + Get + If User.Site = Sites.Twitter Then + Return CH_PARSE_USER_MEDIA.Checked + Else + Return False + End If + End Get + End Property + Friend ReadOnly Property UserReady As Boolean + Get + Return CH_READY_FOR_DOWN.Checked + End Get + End Property + Friend ReadOnly Property UserDescr As String + Get + Return TXT_DESCR.Text + End Get + End Property + Friend ReadOnly Property UserFriendly As String + Get + Return TXT_USER_FRIENDLY.Text + End Get + End Property + Friend ReadOnly Property UserLabels As List(Of String) + Friend Sub New() + InitializeComponent() + UserLabels = New List(Of String) + MyDef = New DefaultFormProps(Of FieldsChecker) + End Sub + Friend Sub New(ByVal _User As UserInfo) + Me.New + User = _User + End Sub + Friend Sub New(ByVal _Instance As IUserData) + Me.New + If Not _Instance Is Nothing Then + UserInstance = _Instance + User = DirectCast(UserInstance, UserDataBase).User + End If + End Sub + Private Sub UserCreatorForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + With MyDef + .MyViewInitialize(Me, Settings.Design, True) + .AddOkCancelToolbar() + If User.Name.IsEmptyString Then + OPT_REDDIT.Checked = False + OPT_TWITTER.Checked = False + CH_PARSE_USER_MEDIA.Enabled = False + CH_READY_FOR_DOWN.Checked = True + CH_TEMP.Checked = Settings.DefaultTemporary.Value + Else + TP_ADD_BY_LIST.Enabled = False + TXT_USER.Text = User.Name + Select Case User.Site + Case Sites.Reddit : OPT_REDDIT.Checked = True : CH_PARSE_USER_MEDIA.Enabled = False + Case Sites.Twitter : OPT_TWITTER.Checked = True + End Select + OPT_REDDIT.Enabled = False + OPT_TWITTER.Enabled = False + If Not UserInstance Is Nothing Then + TXT_USER.Enabled = False + With UserInstance + TXT_USER_FRIENDLY.Text = .FriendlyName + CH_FAV.Checked = .Favorite + CH_TEMP.Checked = .Temporary + CH_PARSE_USER_MEDIA.Checked = .ParseUserMediaOnly + CH_READY_FOR_DOWN.Checked = .ReadyForDownload + TXT_DESCR.Text = .Description + UserLabels.ListAddList(.Labels) + If UserLabels.ListExists Then TXT_LABELS.Text = UserLabels.ListToString + End With + End If + End If + .MyFieldsChecker = New FieldsChecker + .MyFieldsChecker.AddControl(Of String)(TXT_USER, TXT_USER.CaptionText) + .MyFieldsChecker.EndLoaderOperations() + TextBoxExtended.SetFalseDetector(Me, True, AddressOf .Detector) + .EndLoaderOperations() + End With + Catch ex As Exception + MyDef.InvokeLoaderError(ex) + End Try + End Sub + Private Sub UserCreatorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + If e.KeyCode = Keys.F4 Then ChangeLabels() : e.Handled = True + End Sub + Private Sub UserCreatorForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not BeforeCloseChecker(MyDef.ChangesDetected) Then + e.Cancel = True + Else + MyDef.Dispose() + If Not DialogResult = DialogResult.OK And Not DialogResult = DialogResult.Cancel And StartIndex >= 0 Then DialogResult = DialogResult.OK + End If + End Sub + Private Sub UserCreatorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + UserLabels.Clear() + End Sub + Private Sub ToolbarBttOK() Implements IOkCancelToolbar.ToolbarBttOK + If Not CH_ADD_BY_LIST.Checked Then + If MyDef.MyFieldsChecker.AllParamsOK Then + If OPT_REDDIT.Checked Or OPT_TWITTER.Checked Then + Dim tmpUser As UserInfo = User.Clone + With tmpUser + .Name = TXT_USER.Text + .Site = IIf(OPT_REDDIT.Checked, Sites.Reddit, Sites.Twitter) + .UpdateUserFile() + End With + User = tmpUser + If Not UserInstance Is Nothing Then + With DirectCast(UserInstance, UserDataBase) + .User = User + .FriendlyName = TXT_USER_FRIENDLY.Text + .Favorite = CH_FAV.Checked + .Temporary = CH_TEMP.Checked + .ReadyForDownload = CH_READY_FOR_DOWN.Checked + .UserDescription = TXT_DESCR.Text + Dim l As New ListAddParams(LAP.NotContainsOnly + LAP.ClearBeforeAdd) + If .IsCollection Then + With DirectCast(UserInstance, API.UserDataBind) + If .Count > 0 Then .Collections.ForEach(Sub(c) c.Labels.ListAddList(UserLabels, l)) + End With + Else + .Labels.ListAddList(UserLabels, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + End If + If OPT_TWITTER.Checked Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked + .UpdateUserInformation() + End With + End If + GoTo CloseForm + Else + MsgBoxE("User site does not selected", MsgBoxStyle.Exclamation) + End If + End If + Else + If CreateUsersByList() Then GoTo CloseForm + End If + Exit Sub +CloseForm: + MyDef.CloseForm() + End Sub + Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel + MyDef.CloseForm(IIf(StartIndex >= 0, DialogResult.OK, DialogResult.Cancel)) + End Sub + Private ReadOnly TwitterRegEx As New RegexStructure("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1) + Private ReadOnly RedditRegEx1 As New RegexStructure("[htps:/]{7,8}.*?reddit.com/user/([^/]+)", 1) + Private ReadOnly RedditRegEx2 As New RegexStructure(".?u/([^/]+)", 1) + Private _TextChangeInvoked As Boolean = False + Private Sub TXT_USER_ActionOnTextChange() Handles TXT_USER.ActionOnTextChange + Try + If Not _TextChangeInvoked Then + _TextChangeInvoked = True + If Not CH_ADD_BY_LIST.Checked Then + Select Case GetSiteByText(TXT_USER.Text) + Case Sites.Twitter : OPT_TWITTER.Checked = True + Case Sites.Reddit : OPT_REDDIT.Checked = True + Case Else : OPT_TWITTER.Checked = False : OPT_REDDIT.Checked = False + End Select + End If + MyDef.Detector() + _TextChangeInvoked = False + End If + Catch ex As Exception + End Try + End Sub + Private Function GetSiteByText(ByRef TXT As String) As Sites + If Not TXT.IsEmptyString AndAlso TXT.Length > 8 Then + Dim s$ = RegexReplace(TXT, TwitterRegEx) + If Not s.IsEmptyString Then + TXT = s + Return Sites.Twitter + Else + s = RegexReplace(TXT, RedditRegEx1) + If Not s.IsEmptyString Then + TXT = s + Return Sites.Reddit + Else + s = RegexReplace(TXT, RedditRegEx2) + If Not s.IsEmptyString Then + TXT = s + Return Sites.Reddit + End If + End If + End If + End If + Return Sites.Undefined + End Function + Private Sub OPT_REDDIT_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_REDDIT.CheckedChanged + MyDef.Detector() + End Sub + Private Sub OPT_TWITTER_CheckedChanged(sender As Object, e As EventArgs) Handles OPT_TWITTER.CheckedChanged + MyDef.Detector() + CH_PARSE_USER_MEDIA.Enabled = OPT_TWITTER.Checked + End Sub + Private Sub CH_TEMP_CheckedChanged(sender As Object, e As EventArgs) Handles CH_TEMP.CheckedChanged + If CH_TEMP.Checked Then CH_FAV.Checked = False + MyDef.Detector() + End Sub + Private Sub CH_FAV_CheckedChanged(sender As Object, e As EventArgs) Handles CH_FAV.CheckedChanged + If CH_FAV.Checked Then CH_TEMP.Checked = False + MyDef.Detector() + End Sub + Private Sub CH_READY_FOR_DOWN_CheckedChanged(sender As Object, e As EventArgs) Handles CH_READY_FOR_DOWN.CheckedChanged + MyDef.Detector() + End Sub + Private Sub CH_PARSE_USER_MADIA_CheckedChanged(sender As Object, e As EventArgs) Handles CH_PARSE_USER_MEDIA.CheckedChanged + MyDef.Detector() + End Sub + Private Sub CH_ADD_BY_LIST_CheckedChanged(sender As Object, e As EventArgs) Handles CH_ADD_BY_LIST.CheckedChanged + If CH_ADD_BY_LIST.Checked Then + TXT_DESCR.GroupBoxText = "Users list" + Else + TXT_DESCR.GroupBoxText = "Description" + End If + TXT_USER.Enabled = Not CH_ADD_BY_LIST.Checked + TXT_USER_FRIENDLY.Enabled = Not CH_ADD_BY_LIST.Checked + End Sub + Private Sub CH_AUTO_DETECT_SITE_CheckedChanged(sender As Object, e As EventArgs) Handles CH_AUTO_DETECT_SITE.CheckedChanged + OPT_REDDIT.Enabled = Not CH_AUTO_DETECT_SITE.Checked + OPT_TWITTER.Enabled = Not CH_AUTO_DETECT_SITE.Checked + End Sub + Private Function CreateUsersByList() As Boolean + Try + If CH_ADD_BY_LIST.Checked Then + If Not TXT_DESCR.IsEmptyString Then + Dim u As List(Of String) = TXT_DESCR.Text.StringToList(Of String, List(Of String))(vbNewLine).ListForEach(Function(s, ii) s.Trim,, False) + If u.ListExists Then + Dim NonIdentified As New List(Of String) + Dim UsersForCreate As New List(Of UserInfo) + Dim BannedUsers() As String = Nothing + Dim uu$ + Dim tmpUser As UserInfo + Dim s As Sites + Dim Added% = 0 + Dim Skipped% = 0 + Dim uid% + + Select Case True + Case OPT_REDDIT.Checked : s = Sites.Reddit + Case OPT_TWITTER.Checked : s = Sites.Twitter + Case Else : s = Sites.Undefined + End Select + + For i% = 0 To u.Count - 1 + uu = u(i) + If CH_AUTO_DETECT_SITE.Checked Then s = GetSiteByText(uu) + + If Not s = Sites.Undefined Then + tmpUser = New UserInfo(uu, s) + uid = -1 + If Settings.UsersList.Count > 0 Then uid = Settings.UsersList.IndexOf(tmpUser) + If uid < 0 And Not UsersForCreate.Contains(tmpUser) Then + UsersForCreate.Add(tmpUser) + Else + Skipped += 1 + End If + Else + NonIdentified.Add(u(i)) + End If + Next + + If UsersForCreate.Count > 0 Then + BannedUsers = UserBanned(UsersForCreate.Select(Function(uuu) uuu.Name).ToArray) + If BannedUsers.ListExists Then UsersForCreate.RemoveAll(Function(uuu) BannedUsers.Contains(uuu.Name)) + If UsersForCreate.Count > 0 Then + For Each tmpUser In UsersForCreate + Settings.UpdateUsersList(tmpUser) + If StartIndex = -1 Then StartIndex = Settings.Users.Count + Settings.Users.Add(UserDataBase.GetInstance(tmpUser, False)) + With Settings.Users.Last + .FriendlyName = TXT_USER_FRIENDLY.Text + .Favorite = CH_FAV.Checked + .Temporary = CH_TEMP.Checked + .ReadyForDownload = CH_READY_FOR_DOWN.Checked + .Labels.ListAddList(UserLabels) + If s = Sites.Twitter Then .ParseUserMediaOnly = CH_PARSE_USER_MEDIA.Checked + .UpdateUserInformation() + End With + Added += 1 + Next + End If + End If + + Dim m As New MMessage($"Added {Added} users (skipped (already exists and/or duplicated) {Skipped})") + If BannedUsers.ListExists Or NonIdentified.Count > 0 Then + Dim t$ = String.Empty + If BannedUsers.ListExists Then t.StringAppendLine($"Banned users:{vbNewLine}{BannedUsers.ListToString(, vbNewLine)}") + If NonIdentified.Count > 0 Then t.StringAppendLine($"Non-Identified users:{vbNewLine}{NonIdentified.ListToString(, vbNewLine)}", vbNewLine.StringDup(2)) + m.Style = MsgBoxStyle.Exclamation + m.Text.StringAppendLine("Some of users does not recognized and/or banned") + m.Text.StringAppendLine(t, vbNewLine.StringDup(2)) + TXT_DESCR.Text = t + Else + TXT_DESCR.Clear() + End If + + MsgBoxE(m) + Return Added > 0 And Not BannedUsers.ListExists And NonIdentified.Count = 0 + Else + MsgBoxE("No one user can not recognized", MsgBoxStyle.Exclamation) + End If + Else + MsgBoxE("[Users list] is empty", MsgBoxStyle.Critical) + End If + End If + Return False + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on adding users by list", False) + End Try + End Function + Private Sub TXT_LABELS_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_LABELS.ActionOnButtonClick + Select Case Sender.DefaultButton + Case ActionButton.DefaultButtons.Open : ChangeLabels() + Case ActionButton.DefaultButtons.Clear : UserLabels.Clear() + End Select + End Sub + Private Sub ChangeLabels() + Using fl As New LabelsForm(UserLabels) + fl.ShowDialog() + If fl.DialogResult = DialogResult.OK Then + UserLabels.ListAddList(fl.LabelsList, LAP.NotContainsOnly, LAP.ClearBeforeAdd) + If UserLabels.ListExists Then + TXT_LABELS.Text = UserLabels.ListToString + Else + TXT_LABELS.Clear() + End If + End If + End Using + End Sub + End Class +End Namespace \ No newline at end of file diff --git a/SCrawler/LabelsKeeper.vb b/SCrawler/LabelsKeeper.vb new file mode 100644 index 0000000..136200f --- /dev/null +++ b/SCrawler/LabelsKeeper.vb @@ -0,0 +1,103 @@ +Imports PersonalUtilities.Tools +Friend Class LabelsKeeper : Implements ICollection(Of String), IMyEnumerator(Of String), IDisposable + Friend Event NewLabelAdded() + Friend Const NoLabeledName As String = "No Label" + Friend Const NoParsedUser As String = "No Parsed" + Friend ReadOnly NoLabel As New ListViewGroup(NoLabeledName, NoLabeledName) + Private ReadOnly LabelsList As List(Of String) + Private ReadOnly LabelsFile As SFile = "Settings\Labels.txt" + Friend ReadOnly NewLabels As List(Of String) + Friend ReadOnly Property NewLabelsExists As Boolean + Get + Return NewLabels.Count > 0 + End Get + End Property + Friend ReadOnly Property CurrentSelection As List(Of String) + Friend Sub New() + LabelsList = New List(Of String) + NewLabels = New List(Of String) + CurrentSelection = New List(Of String) + If LabelsFile.Exists Then LabelsList.ListAddList(IO.File.ReadAllLines(LabelsFile), LAP.NotContainsOnly) + End Sub + Friend ReadOnly Property ToList As List(Of String) + Get + Return LabelsList + End Get + End Property + Friend ReadOnly Property Count As Integer Implements ICollection(Of String).Count, IMyEnumerator(Of String).MyEnumeratorCount + Get + Return LabelsList.Count + End Get + End Property + Default Friend ReadOnly Property Item(ByVal Index As Integer) As String Implements IMyEnumerator(Of String).MyEnumeratorObject + Get + Return LabelsList(Index) + End Get + End Property + Friend Sub Clear() Implements ICollection(Of String).Clear + LabelsList.Clear() + NewLabels.Clear() + End Sub + Friend Sub Update() + If LabelsList.Count > 0 Then + LabelsList.Sort() + TextSaver.SaveTextToFile(LabelsList.ListToString(, vbNewLine), LabelsFile, True, False, EDP.SendInLog) + Else + If LabelsFile.Exists Then LabelsFile.Delete(,,, EDP.SendInLog) + End If + End Sub + Friend Overloads Sub Add(ByVal _Item As String) Implements ICollection(Of String).Add + Add(_Item, True) + End Sub + Friend Overloads Sub Add(ByVal _Item As String, ByVal UpdateMainFrame As Boolean) + If Not _Item.IsEmptyString And Not LabelsList.Contains(_Item) Then + LabelsList.Add(_Item) + If Not NewLabels.Contains(_Item) Then NewLabels.Add(_Item) + If UpdateMainFrame Then RaiseEvent NewLabelAdded() + End If + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of String)) + If _Items.ListExists Then + For Each i$ In _Items : Add(i, False) : Next + RaiseEvent NewLabelAdded() + End If + End Sub + Friend Function Contains(ByVal _Item As String) As Boolean Implements ICollection(Of String).Contains + Return LabelsList.Contains(_Item) + End Function + Friend Function Remove(ByVal _Item As String) As Boolean Implements ICollection(Of String).Remove + Return LabelsList.Remove(_Item) + End Function + Private ReadOnly Property IsReadOnly As Boolean = False Implements ICollection(Of String).IsReadOnly + Private Sub CopyTo(ByVal _Array() As String, ByVal ArrayIndex As Integer) Implements ICollection(Of String).CopyTo + Throw New NotImplementedException() + End Sub +#Region "IEnumerable Support" + Private Function GetEnumerator() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator + Return New MyEnumerator(Of String)(Me) + End Function + Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator + Return GetEnumerator() + End Function +#End Region +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + Clear() + CurrentSelection.Clear() + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb new file mode 100644 index 0000000..8869790 --- /dev/null +++ b/SCrawler/MainFrame.Designer.vb @@ -0,0 +1,578 @@ + +Partial Class MainFrame + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + + 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 + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim MENU_SETTINGS As System.Windows.Forms.ToolStripDropDownButton + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(MainFrame)) + Dim MENU_SETTINGS_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_3 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_2 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_3 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_4 As System.Windows.Forms.ToolStripSeparator + Dim CONTEXT_SEP_5 As System.Windows.Forms.ToolStripSeparator + Dim SEP_4 As System.Windows.Forms.ToolStripSeparator + Dim MENU_VIEW_SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim MENU_VIEW_SEP_2 As System.Windows.Forms.ToolStripSeparator + Me.BTT_SETTINGS_REDDIT = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SETTINGS_TWITTER = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SETTINGS = New System.Windows.Forms.ToolStripMenuItem() + Me.Toolbar_TOP = New System.Windows.Forms.ToolStrip() + Me.BTT_ADD_USER = New System.Windows.Forms.ToolStripButton() + Me.BTT_EDIT_USER = New System.Windows.Forms.ToolStripButton() + Me.BTT_DELETE_USER = New System.Windows.Forms.ToolStripButton() + Me.BTT_REFRESH = New System.Windows.Forms.ToolStripButton() + Me.BTT_SHOW_INFO = New System.Windows.Forms.ToolStripButton() + Me.BTT_CHANNELS = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_SELECTED = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_ALL = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_VIDEO = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN_STOP = New System.Windows.Forms.ToolStripButton() + Me.MENU_VIEW = New System.Windows.Forms.ToolStripDropDownButton() + Me.BTT_VIEW_LARGE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_VIEW_SMALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_VIEW_LIST = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_ALL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_REGULAR = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_TEMP = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_FAV = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_LABELS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SHOW_NO_LABELS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_SELECT_LABELS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_LOG = New System.Windows.Forms.ToolStripButton() + Me.BTT_VERSION_INFO = New System.Windows.Forms.ToolStripButton() + Me.Toolbar_BOTTOM = New System.Windows.Forms.StatusStrip() + Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar() + Me.LBL_JOBS_COUNT = New System.Windows.Forms.ToolStripStatusLabel() + Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() + Me.LIST_PROFILES = New System.Windows.Forms.ListView() + Me.USER_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components) + Me.BTT_CONTEXT_DOWN = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_EDIT = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_DELETE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_FAV = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_TEMP = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_GROUPS = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_ADD_TO_COL = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_COL_MERGE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CHANGE_IMAGE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_OPEN_PATH = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_OPEN_SITE = New System.Windows.Forms.ToolStripMenuItem() + Me.BTT_CONTEXT_INFO = New System.Windows.Forms.ToolStripMenuItem() + SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_2 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + MENU_SETTINGS = New System.Windows.Forms.ToolStripDropDownButton() + MENU_SETTINGS_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_3 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_3 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_4 = New System.Windows.Forms.ToolStripSeparator() + CONTEXT_SEP_5 = New System.Windows.Forms.ToolStripSeparator() + SEP_4 = New System.Windows.Forms.ToolStripSeparator() + MENU_VIEW_SEP_1 = New System.Windows.Forms.ToolStripSeparator() + MENU_VIEW_SEP_2 = New System.Windows.Forms.ToolStripSeparator() + Me.Toolbar_TOP.SuspendLayout() + Me.Toolbar_BOTTOM.SuspendLayout() + Me.USER_CONTEXT.SuspendLayout() + Me.SuspendLayout() + ' + 'SEP_1 + ' + SEP_1.Name = "SEP_1" + SEP_1.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_2 + ' + SEP_2.Name = "SEP_2" + SEP_2.Size = New System.Drawing.Size(6, 25) + ' + 'CONTEXT_SEP_1 + ' + CONTEXT_SEP_1.Name = "CONTEXT_SEP_1" + CONTEXT_SEP_1.Size = New System.Drawing.Size(192, 6) + ' + 'MENU_SETTINGS + ' + MENU_SETTINGS.AutoToolTip = False + MENU_SETTINGS.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + MENU_SETTINGS.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_SETTINGS_REDDIT, Me.BTT_SETTINGS_TWITTER, MENU_SETTINGS_SEP_1, Me.BTT_SETTINGS}) + MENU_SETTINGS.Image = CType(resources.GetObject("MENU_SETTINGS.Image"), System.Drawing.Image) + MENU_SETTINGS.ImageTransparentColor = System.Drawing.Color.Magenta + MENU_SETTINGS.Name = "MENU_SETTINGS" + MENU_SETTINGS.Size = New System.Drawing.Size(62, 22) + MENU_SETTINGS.Text = "Settings" + ' + 'BTT_SETTINGS_REDDIT + ' + Me.BTT_SETTINGS_REDDIT.Name = "BTT_SETTINGS_REDDIT" + Me.BTT_SETTINGS_REDDIT.Size = New System.Drawing.Size(116, 22) + Me.BTT_SETTINGS_REDDIT.Text = "Reddit" + ' + 'BTT_SETTINGS_TWITTER + ' + Me.BTT_SETTINGS_TWITTER.Name = "BTT_SETTINGS_TWITTER" + Me.BTT_SETTINGS_TWITTER.Size = New System.Drawing.Size(116, 22) + Me.BTT_SETTINGS_TWITTER.Text = "Twitter" + ' + 'MENU_SETTINGS_SEP_1 + ' + MENU_SETTINGS_SEP_1.Name = "MENU_SETTINGS_SEP_1" + MENU_SETTINGS_SEP_1.Size = New System.Drawing.Size(113, 6) + ' + 'BTT_SETTINGS + ' + Me.BTT_SETTINGS.Name = "BTT_SETTINGS" + Me.BTT_SETTINGS.Size = New System.Drawing.Size(116, 22) + Me.BTT_SETTINGS.Text = "Settings" + ' + 'SEP_3 + ' + SEP_3.Name = "SEP_3" + SEP_3.Size = New System.Drawing.Size(6, 25) + ' + 'CONTEXT_SEP_2 + ' + CONTEXT_SEP_2.Name = "CONTEXT_SEP_2" + CONTEXT_SEP_2.Size = New System.Drawing.Size(192, 6) + ' + 'CONTEXT_SEP_3 + ' + CONTEXT_SEP_3.Name = "CONTEXT_SEP_3" + CONTEXT_SEP_3.Size = New System.Drawing.Size(192, 6) + ' + 'CONTEXT_SEP_4 + ' + CONTEXT_SEP_4.Name = "CONTEXT_SEP_4" + CONTEXT_SEP_4.Size = New System.Drawing.Size(192, 6) + ' + 'CONTEXT_SEP_5 + ' + CONTEXT_SEP_5.Name = "CONTEXT_SEP_5" + CONTEXT_SEP_5.Size = New System.Drawing.Size(192, 6) + ' + 'SEP_4 + ' + SEP_4.Name = "SEP_4" + SEP_4.Size = New System.Drawing.Size(6, 25) + ' + 'MENU_VIEW_SEP_1 + ' + MENU_VIEW_SEP_1.Name = "MENU_VIEW_SEP_1" + MENU_VIEW_SEP_1.Size = New System.Drawing.Size(141, 6) + ' + 'MENU_VIEW_SEP_2 + ' + MENU_VIEW_SEP_2.Name = "MENU_VIEW_SEP_2" + MENU_VIEW_SEP_2.Size = New System.Drawing.Size(141, 6) + ' + 'Toolbar_TOP + ' + Me.Toolbar_TOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.Toolbar_TOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {MENU_SETTINGS, SEP_1, Me.BTT_ADD_USER, Me.BTT_EDIT_USER, Me.BTT_DELETE_USER, Me.BTT_REFRESH, Me.BTT_SHOW_INFO, Me.BTT_CHANNELS, SEP_2, Me.BTT_DOWN_SELECTED, Me.BTT_DOWN_ALL, Me.BTT_DOWN_VIDEO, Me.BTT_DOWN_STOP, SEP_3, Me.MENU_VIEW, SEP_4, Me.BTT_LOG, Me.BTT_VERSION_INFO}) + Me.Toolbar_TOP.Location = New System.Drawing.Point(0, 0) + Me.Toolbar_TOP.Name = "Toolbar_TOP" + Me.Toolbar_TOP.Size = New System.Drawing.Size(934, 25) + Me.Toolbar_TOP.TabIndex = 1 + ' + 'BTT_ADD_USER + ' + Me.BTT_ADD_USER.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD_USER.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD_USER.Name = "BTT_ADD_USER" + Me.BTT_ADD_USER.Size = New System.Drawing.Size(49, 22) + Me.BTT_ADD_USER.Text = "Add" + Me.BTT_ADD_USER.ToolTipText = "Add user (Insert)" + ' + 'BTT_EDIT_USER + ' + Me.BTT_EDIT_USER.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16 + Me.BTT_EDIT_USER.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_EDIT_USER.Name = "BTT_EDIT_USER" + Me.BTT_EDIT_USER.Size = New System.Drawing.Size(47, 22) + Me.BTT_EDIT_USER.Text = "Edit" + Me.BTT_EDIT_USER.ToolTipText = "Edit user (F3)" + ' + 'BTT_DELETE_USER + ' + Me.BTT_DELETE_USER.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_DELETE_USER.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DELETE_USER.Name = "BTT_DELETE_USER" + Me.BTT_DELETE_USER.Size = New System.Drawing.Size(60, 22) + Me.BTT_DELETE_USER.Text = "Delete" + Me.BTT_DELETE_USER.ToolTipText = "Delete user (Del)" + ' + 'BTT_REFRESH + ' + Me.BTT_REFRESH.AutoToolTip = False + Me.BTT_REFRESH.Image = Global.SCrawler.My.Resources.Resources.Refresh + Me.BTT_REFRESH.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_REFRESH.Name = "BTT_REFRESH" + Me.BTT_REFRESH.Size = New System.Drawing.Size(66, 22) + Me.BTT_REFRESH.Text = "Refresh" + ' + 'BTT_SHOW_INFO + ' + Me.BTT_SHOW_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_SHOW_INFO.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_SHOW_INFO.Name = "BTT_SHOW_INFO" + Me.BTT_SHOW_INFO.Size = New System.Drawing.Size(48, 22) + Me.BTT_SHOW_INFO.Text = "Info" + Me.BTT_SHOW_INFO.ToolTipText = "Show download summary" + ' + 'BTT_CHANNELS + ' + Me.BTT_CHANNELS.Image = Global.SCrawler.My.Resources.Resources.RedditPic512 + Me.BTT_CHANNELS.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_CHANNELS.Name = "BTT_CHANNELS" + Me.BTT_CHANNELS.Size = New System.Drawing.Size(76, 22) + Me.BTT_CHANNELS.Text = "Channels" + ' + 'BTT_DOWN_SELECTED + ' + Me.BTT_DOWN_SELECTED.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWN_SELECTED.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_SELECTED.Name = "BTT_DOWN_SELECTED" + Me.BTT_DOWN_SELECTED.Size = New System.Drawing.Size(150, 22) + Me.BTT_DOWN_SELECTED.Text = "Download selected (F5)" + Me.BTT_DOWN_SELECTED.ToolTipText = "Download selected user" + ' + 'BTT_DOWN_ALL + ' + Me.BTT_DOWN_ALL.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWN_ALL.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_ALL.Name = "BTT_DOWN_ALL" + Me.BTT_DOWN_ALL.Size = New System.Drawing.Size(119, 22) + Me.BTT_DOWN_ALL.Text = "Download all (F6)" + Me.BTT_DOWN_ALL.ToolTipText = "Download all users" + ' + 'BTT_DOWN_VIDEO + ' + Me.BTT_DOWN_VIDEO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.BTT_DOWN_VIDEO.Image = CType(resources.GetObject("BTT_DOWN_VIDEO.Image"), System.Drawing.Image) + Me.BTT_DOWN_VIDEO.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_VIDEO.Name = "BTT_DOWN_VIDEO" + Me.BTT_DOWN_VIDEO.Size = New System.Drawing.Size(120, 22) + Me.BTT_DOWN_VIDEO.Text = "Download video (F2)" + Me.BTT_DOWN_VIDEO.ToolTipText = "Download video by URL" + ' + 'BTT_DOWN_STOP + ' + Me.BTT_DOWN_STOP.AutoToolTip = False + Me.BTT_DOWN_STOP.Enabled = False + Me.BTT_DOWN_STOP.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_DOWN_STOP.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN_STOP.Name = "BTT_DOWN_STOP" + Me.BTT_DOWN_STOP.Size = New System.Drawing.Size(51, 22) + Me.BTT_DOWN_STOP.Text = "Stop" + ' + 'MENU_VIEW + ' + Me.MENU_VIEW.AutoToolTip = False + Me.MENU_VIEW.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.MENU_VIEW.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_VIEW_LARGE, Me.BTT_VIEW_SMALL, Me.BTT_VIEW_LIST, MENU_VIEW_SEP_1, Me.BTT_SHOW_ALL, Me.BTT_SHOW_REGULAR, Me.BTT_SHOW_TEMP, Me.BTT_SHOW_FAV, Me.BTT_SHOW_LABELS, Me.BTT_SHOW_NO_LABELS, MENU_VIEW_SEP_2, Me.BTT_SELECT_LABELS}) + Me.MENU_VIEW.Image = CType(resources.GetObject("MENU_VIEW.Image"), System.Drawing.Image) + Me.MENU_VIEW.ImageTransparentColor = System.Drawing.Color.Magenta + Me.MENU_VIEW.Name = "MENU_VIEW" + Me.MENU_VIEW.Size = New System.Drawing.Size(45, 22) + Me.MENU_VIEW.Text = "View" + ' + 'BTT_VIEW_LARGE + ' + Me.BTT_VIEW_LARGE.Name = "BTT_VIEW_LARGE" + Me.BTT_VIEW_LARGE.Size = New System.Drawing.Size(144, 22) + Me.BTT_VIEW_LARGE.Text = "Large images" + ' + 'BTT_VIEW_SMALL + ' + Me.BTT_VIEW_SMALL.Name = "BTT_VIEW_SMALL" + Me.BTT_VIEW_SMALL.Size = New System.Drawing.Size(144, 22) + Me.BTT_VIEW_SMALL.Text = "Small images" + ' + 'BTT_VIEW_LIST + ' + Me.BTT_VIEW_LIST.Name = "BTT_VIEW_LIST" + Me.BTT_VIEW_LIST.Size = New System.Drawing.Size(144, 22) + Me.BTT_VIEW_LIST.Text = "List" + ' + 'BTT_SHOW_ALL + ' + Me.BTT_SHOW_ALL.Name = "BTT_SHOW_ALL" + Me.BTT_SHOW_ALL.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_ALL.Text = "All" + ' + 'BTT_SHOW_REGULAR + ' + Me.BTT_SHOW_REGULAR.Name = "BTT_SHOW_REGULAR" + Me.BTT_SHOW_REGULAR.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_REGULAR.Text = "Regular" + ' + 'BTT_SHOW_TEMP + ' + Me.BTT_SHOW_TEMP.Name = "BTT_SHOW_TEMP" + Me.BTT_SHOW_TEMP.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_TEMP.Text = "Temporary" + ' + 'BTT_SHOW_FAV + ' + Me.BTT_SHOW_FAV.Name = "BTT_SHOW_FAV" + Me.BTT_SHOW_FAV.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_FAV.Text = "Favorites" + ' + 'BTT_SHOW_LABELS + ' + Me.BTT_SHOW_LABELS.Name = "BTT_SHOW_LABELS" + Me.BTT_SHOW_LABELS.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_LABELS.Text = "Labels" + ' + 'BTT_SHOW_NO_LABELS + ' + Me.BTT_SHOW_NO_LABELS.Name = "BTT_SHOW_NO_LABELS" + Me.BTT_SHOW_NO_LABELS.Size = New System.Drawing.Size(144, 22) + Me.BTT_SHOW_NO_LABELS.Text = "No labels" + ' + 'BTT_SELECT_LABELS + ' + Me.BTT_SELECT_LABELS.Name = "BTT_SELECT_LABELS" + Me.BTT_SELECT_LABELS.Size = New System.Drawing.Size(144, 22) + Me.BTT_SELECT_LABELS.Text = "Select labels" + ' + 'BTT_LOG + ' + Me.BTT_LOG.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text + Me.BTT_LOG.Image = CType(resources.GetObject("BTT_LOG.Image"), System.Drawing.Image) + Me.BTT_LOG.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_LOG.Name = "BTT_LOG" + Me.BTT_LOG.Size = New System.Drawing.Size(34, 19) + Me.BTT_LOG.Text = "LOG" + Me.BTT_LOG.ToolTipText = "Show error log" + ' + 'BTT_VERSION_INFO + ' + Me.BTT_VERSION_INFO.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right + Me.BTT_VERSION_INFO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image + Me.BTT_VERSION_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_VERSION_INFO.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_VERSION_INFO.Name = "BTT_VERSION_INFO" + Me.BTT_VERSION_INFO.Size = New System.Drawing.Size(23, 20) + Me.BTT_VERSION_INFO.Text = "Info" + Me.BTT_VERSION_INFO.ToolTipText = "Show program information and check for new version" + ' + 'Toolbar_BOTTOM + ' + Me.Toolbar_BOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_MAIN, Me.LBL_JOBS_COUNT, Me.LBL_STATUS}) + Me.Toolbar_BOTTOM.Location = New System.Drawing.Point(0, 439) + Me.Toolbar_BOTTOM.Name = "Toolbar_BOTTOM" + Me.Toolbar_BOTTOM.Size = New System.Drawing.Size(934, 22) + Me.Toolbar_BOTTOM.TabIndex = 2 + Me.Toolbar_BOTTOM.Text = "StatusStrip1" + ' + 'PR_MAIN + ' + Me.PR_MAIN.Name = "PR_MAIN" + Me.PR_MAIN.Size = New System.Drawing.Size(200, 16) + Me.PR_MAIN.Visible = False + ' + 'LBL_JOBS_COUNT + ' + Me.LBL_JOBS_COUNT.Name = "LBL_JOBS_COUNT" + Me.LBL_JOBS_COUNT.Size = New System.Drawing.Size(0, 17) + ' + 'LBL_STATUS + ' + Me.LBL_STATUS.Name = "LBL_STATUS" + Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17) + ' + 'LIST_PROFILES + ' + Me.LIST_PROFILES.Activation = System.Windows.Forms.ItemActivation.OneClick + Me.LIST_PROFILES.ContextMenuStrip = Me.USER_CONTEXT + Me.LIST_PROFILES.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_PROFILES.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None + Me.LIST_PROFILES.HideSelection = False + Me.LIST_PROFILES.Location = New System.Drawing.Point(0, 25) + Me.LIST_PROFILES.Name = "LIST_PROFILES" + Me.LIST_PROFILES.Size = New System.Drawing.Size(934, 414) + Me.LIST_PROFILES.TabIndex = 3 + Me.LIST_PROFILES.UseCompatibleStateImageBehavior = False + ' + 'USER_CONTEXT + ' + Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO}) + Me.USER_CONTEXT.Name = "USER_CONTEXT" + Me.USER_CONTEXT.Size = New System.Drawing.Size(196, 298) + ' + 'BTT_CONTEXT_DOWN + ' + Me.BTT_CONTEXT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_CONTEXT_DOWN.Name = "BTT_CONTEXT_DOWN" + Me.BTT_CONTEXT_DOWN.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_DOWN.Text = "Download data" + ' + 'BTT_CONTEXT_EDIT + ' + Me.BTT_CONTEXT_EDIT.Image = Global.SCrawler.My.Resources.Resources.PencilPic_01_16 + Me.BTT_CONTEXT_EDIT.Name = "BTT_CONTEXT_EDIT" + Me.BTT_CONTEXT_EDIT.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_EDIT.Text = "Edit user information" + ' + 'BTT_CONTEXT_DELETE + ' + Me.BTT_CONTEXT_DELETE.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_CONTEXT_DELETE.Name = "BTT_CONTEXT_DELETE" + Me.BTT_CONTEXT_DELETE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_DELETE.Text = "Delete user / collection" + ' + 'BTT_CONTEXT_FAV + ' + Me.BTT_CONTEXT_FAV.Image = Global.SCrawler.My.Resources.Resources.StarPic_24 + Me.BTT_CONTEXT_FAV.Name = "BTT_CONTEXT_FAV" + Me.BTT_CONTEXT_FAV.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_FAV.Text = "Change favorite" + ' + 'BTT_CONTEXT_TEMP + ' + Me.BTT_CONTEXT_TEMP.Image = CType(resources.GetObject("BTT_CONTEXT_TEMP.Image"), System.Drawing.Image) + Me.BTT_CONTEXT_TEMP.Name = "BTT_CONTEXT_TEMP" + Me.BTT_CONTEXT_TEMP.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_TEMP.Text = "Change temporary" + ' + 'BTT_CONTEXT_GROUPS + ' + Me.BTT_CONTEXT_GROUPS.Name = "BTT_CONTEXT_GROUPS" + Me.BTT_CONTEXT_GROUPS.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_GROUPS.Text = "Change labels" + ' + 'BTT_CONTEXT_ADD_TO_COL + ' + Me.BTT_CONTEXT_ADD_TO_COL.Image = Global.SCrawler.My.Resources.Resources.DBPic_32 + Me.BTT_CONTEXT_ADD_TO_COL.Name = "BTT_CONTEXT_ADD_TO_COL" + Me.BTT_CONTEXT_ADD_TO_COL.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_ADD_TO_COL.Text = "Add to collection" + ' + 'BTT_CONTEXT_COL_MERGE + ' + Me.BTT_CONTEXT_COL_MERGE.Name = "BTT_CONTEXT_COL_MERGE" + Me.BTT_CONTEXT_COL_MERGE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_COL_MERGE.Text = "Merge collection files" + ' + 'BTT_CHANGE_IMAGE + ' + Me.BTT_CHANGE_IMAGE.Image = Global.SCrawler.My.Resources.Resources.PicturePic_32 + Me.BTT_CHANGE_IMAGE.Name = "BTT_CHANGE_IMAGE" + Me.BTT_CHANGE_IMAGE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CHANGE_IMAGE.Text = "Change image" + ' + 'BTT_CONTEXT_OPEN_PATH + ' + Me.BTT_CONTEXT_OPEN_PATH.Image = Global.SCrawler.My.Resources.Resources.Folder_32 + Me.BTT_CONTEXT_OPEN_PATH.Name = "BTT_CONTEXT_OPEN_PATH" + Me.BTT_CONTEXT_OPEN_PATH.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_OPEN_PATH.Text = "Open contains folder" + ' + 'BTT_CONTEXT_OPEN_SITE + ' + Me.BTT_CONTEXT_OPEN_SITE.Image = Global.SCrawler.My.Resources.Resources.GlobeBlue_32 + Me.BTT_CONTEXT_OPEN_SITE.Name = "BTT_CONTEXT_OPEN_SITE" + Me.BTT_CONTEXT_OPEN_SITE.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_OPEN_SITE.Text = "Open site" + ' + 'BTT_CONTEXT_INFO + ' + Me.BTT_CONTEXT_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_CONTEXT_INFO.Name = "BTT_CONTEXT_INFO" + Me.BTT_CONTEXT_INFO.Size = New System.Drawing.Size(195, 22) + Me.BTT_CONTEXT_INFO.Text = "Information" + ' + 'MainFrame + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(934, 461) + Me.Controls.Add(Me.LIST_PROFILES) + Me.Controls.Add(Me.Toolbar_BOTTOM) + Me.Controls.Add(Me.Toolbar_TOP) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(950, 500) + Me.Name = "MainFrame" + Me.Text = "Social networks crawler" + Me.Toolbar_TOP.ResumeLayout(False) + Me.Toolbar_TOP.PerformLayout() + Me.Toolbar_BOTTOM.ResumeLayout(False) + Me.Toolbar_BOTTOM.PerformLayout() + Me.USER_CONTEXT.ResumeLayout(False) + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents BTT_SETTINGS_REDDIT As ToolStripMenuItem + Private WithEvents BTT_SETTINGS_TWITTER As ToolStripMenuItem + Private WithEvents BTT_SETTINGS As ToolStripMenuItem + Private WithEvents BTT_ADD_USER As ToolStripButton + Private WithEvents BTT_DELETE_USER As ToolStripButton + Private WithEvents BTT_DOWN_SELECTED As ToolStripButton + Private WithEvents BTT_DOWN_ALL As ToolStripButton + Private WithEvents Toolbar_TOP As ToolStrip + Private WithEvents Toolbar_BOTTOM As StatusStrip + Private WithEvents PR_MAIN As ToolStripProgressBar + Private WithEvents LBL_STATUS As ToolStripStatusLabel + Private WithEvents BTT_CONTEXT_DOWN As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_EDIT As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_DELETE As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_FAV As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_TEMP As ToolStripMenuItem + Private WithEvents USER_CONTEXT As ContextMenuStrip + Private WithEvents BTT_VIEW_LARGE As ToolStripMenuItem + Private WithEvents BTT_VIEW_SMALL As ToolStripMenuItem + Private WithEvents BTT_VIEW_LIST As ToolStripMenuItem + Private WithEvents BTT_CHANGE_IMAGE As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_OPEN_PATH As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_INFO As ToolStripMenuItem + Private WithEvents BTT_CONTEXT_OPEN_SITE As ToolStripMenuItem + Private WithEvents BTT_DOWN_STOP As ToolStripButton + Private WithEvents BTT_CONTEXT_COL_MERGE As ToolStripMenuItem + Private WithEvents LBL_JOBS_COUNT As ToolStripStatusLabel + Private WithEvents BTT_DOWN_VIDEO As ToolStripButton + Private WithEvents BTT_SHOW_INFO As ToolStripButton + Private WithEvents BTT_LOG As ToolStripButton + Private WithEvents BTT_CHANNELS As ToolStripButton + Private WithEvents LIST_PROFILES As ListView + Private WithEvents MENU_VIEW As ToolStripDropDownButton + Private WithEvents BTT_CONTEXT_ADD_TO_COL As ToolStripMenuItem + Private WithEvents BTT_REFRESH As ToolStripButton + Private WithEvents BTT_SHOW_ALL As ToolStripMenuItem + Private WithEvents BTT_SHOW_REGULAR As ToolStripMenuItem + Private WithEvents BTT_SHOW_TEMP As ToolStripMenuItem + Private WithEvents BTT_SHOW_FAV As ToolStripMenuItem + Private WithEvents BTT_SHOW_LABELS As ToolStripMenuItem + Private WithEvents BTT_SELECT_LABELS As ToolStripMenuItem + Private WithEvents BTT_SHOW_NO_LABELS As ToolStripMenuItem + Private WithEvents BTT_EDIT_USER As ToolStripButton + Private WithEvents BTT_CONTEXT_GROUPS As ToolStripMenuItem + Private WithEvents BTT_VERSION_INFO As ToolStripButton +End Class diff --git a/SCrawler/MainFrame.resx b/SCrawler/MainFrame.resx new file mode 100644 index 0000000..aa33c66 --- /dev/null +++ b/SCrawler/MainFrame.resx @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + False + + + False + + + False + + + False + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + False + + + 132, 17 + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 239, 17 + + + 387, 17 + + + + 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 + PwHTXv9NiH+iYhJWqDTaidq6+vHly5+ut120uOanq9ewkXwXLATzgC3g2yz7+c8BOx0L8tH6MvgZeAYs + At+48gfYvPlXp/n+iqDm2Lj4f73w4kt1S+yWJa3+1e9fQ5Bp8ZkfwPMCwN9yOBn2+KfAk+ChX8G+Dps/ + r1u/xd3D6+rf/v5+9YqVq6Sv/vF9Xh2XnFf8yCt5XGzeWrdeY+/glPLrtRte+M1bG1dBlPfP4uvT/xKb + N95xYLfifeVScsnnXMZvA+8pi/7fhb+CbP4D9GPXvMEwYYwAAAAASUVORK5CYII= + + + + + AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACOMzL/jjMy/44zMv+OMzL/jjMy/44zMv9Ts2//U7Nv/1Ozb/9Ts2//U7Nv/1Oz + b/891/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8ukuD/LpLg/y6S4P8ukuD/LpLg/y6S4P8vOs7/LzrO/y86 + zv8vOs7/LzrO/y86zv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAI8vLx+OMzL/jjMy/44zMv+OMzL/jjMy/4w4NOJTs2//U7Nv/1Oz + b/9Ts2//U7Nv/1O0cuI91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8ukuD/LpLg/y6S4P8ukuD/LpLg/y6S + 4P8vOs7/LzrO/y86zv8vOs7/LzrO/y86zv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI0yMjeOMzL/jjMy/44zMv+OMzL/jjMy/4tD + N9NTs2//U7Nv/1Ozb/9Ts2//U7Nv/1K1fNM91/H/Pdfx/z3X8f891/H/Pdfx/zzW8OkukuD/LpLg/y6S + 4P8ukuD/LpLg/y6R4PcvOs7/LzrO/y86zv8vOs7/LzrO/y86zuYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwzM0+OMzL/jjMy/44z + Mv+OMzL/jjMy/4hRPcdTs2//U7Nv/1Ozb/9Ts2//U7Nv/1G4h8c91/H/Pdfx/z3X8f891/H/Pdfx/zzV + 8eIukuD/LpLg/y6S4P8ukuD/LpLg/y2R4OIvOs7/LzrO/y86zv8vOs7/LzrO/y46zd4AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4z + MZ6OMzL/jjMy/44zMv+OMzL/jjMy/4NiRMBTs2//U7Nv/1Ozb/9Ts2//U7Nv/067mMA91/H/Pdfx/z3X + 8f891/H/Pdfx/zzR78sukuD/LpLg/y6S4P8ukuD/LpLg/y2Q39cvOs7/LzrO/y86zv8vOs7/LzrO/y86 + ztYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAI0zMu6OMzL/jjMy/44zMv+OMzL/jjMy/26RXMdTs2//U7Nv/1Ozb/9Ts2//U7Nv/0vB + rr491/H/Pdfx/z3X8f891/H/Pdfx/zjI7b8ukuD/LpLg/y6S4P8ukuD/LpLg/y2J3cUvOs7/LzrO/y86 + zv8vOs7/LzrO/y46zq4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAjzMzP44zMv+OMzL/jjMy/44zMv+OMzL/jjIx91SwbvZTs2//U7Nv/1Oz + b/9Ts2//U7Nv/0XM1M491/H/Pdfx/z3X8f891/H/Pdfx/za66cAukuD/LpLg/y6S4P8ukuD/LpLg/y55 + 2b4vOs7/LzrO/y86zv8vOs7/LzrO/y46zo4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjjIxro4zMv+OMzL/jjMy/44zMv+OMzL/iUw7y1Oz + b/9Ts2//U7Nv/1Ozb/9Ts2//U7Nv7z3X8f891/H/Pdfx/z3X8f891/H/Pdfx/zCk49cukuD/LpLg/y6S + 4P8ukuD/LpLg/y1p1ccvOs7/LzrO/y86zv8vOs7/LzrO/y46zWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPNC4vjjMy/44zMv+OMzL/jjMy/44z + Mv+OMzL/dIdXwlOzb/9Ts2//U7Nv/1Ozb/9Ts2//T7qSwj3X8f891/H/Pdfx/z3X8f891/H/PNXx4i6S + 4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y5N0OIvOs7/LzrO/y86zv8vOs7/LzrO/y07zDcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNMjLOjjMy/44z + Mv+OMzL/jjMy/44zMv+NNDLvWqpr6FOzb/9Ts2//U7Nv/1Ozb/9Ts2//RsnKxz3X8f891/H/Pdfx/z3X + 8f891/H/OcvtwC6S4P8ukuD/LpLg/y6S4P8ukuD/LZHg4i86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y4+ + zw8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4z + MHeOMzL/jjMy/44zMv+OMzL/jjMy/44zMv95flG/U7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9Ssm/3PdXt9j3X + 8f891/H/Pdfx/z3X8f891/H/M63myi6S4P8ukuD/LpLg/y6S4P8ukuD/Lobcwi86zv8vOs7/LzrO/y86 + zv8vOs7/LjnNzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAjDMzT44zMv+OMzL/jjMy/44zMv+OMzL/jjMy/441MulUsG72U7Nv/1Ozb/9Ts2//U7Nv/1Oz + b/9PuI3FPdfx/z3X8f891/H/Pdfx/z3X8f881/HvLpTh9i6S4P8ukuD/LpLg/y6S4P8ukuD/LXDXwi86 + zv8vOs7/LzrO/y86zv8vOs7/LjrOjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACvhoQ4jzg39o4zMv+OMzL/jjMy/44zMv+OMzL/jjMy/3SHV8JTs2//U7Nv/1Oz + b/9Ts2//U7Nv/1Ozb/9D0NzXPdfx/z3X8f891/H/Pdfx/z3X8f87zu7FLpLg/y6S4P8ukuD/LpLg/y6S + 4P8ukuD/Lk3Q4i86zv8vOs7/LzrO/y86zv8vOs7/LznMTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALKPjmi5mpn4roaG/485OP+OMzL/jjMy/44zMv+OMzL/i0c5zlOz + b/9Ts2//U7Nv/1Ozb/9Ts2//U7Nv/067mMA91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f82uOjCLpLg/y6S + 4P8ukuD/LpLg/y6S4P8ujt/ULzrO/y86zv8vOs7/LzrO/y86zv8vOs7/Lj7PDwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtJKSkrmamv+5mpr/uZqa/66Ghv+POTj/jjMy/44z + Mv+MODTiWqpr6FOzb/9Ts2//U7Nv/1Ozb/9Ts2//UrJv9z/U5+g91/H/Pdfx/z3X8f891/H/Pdfx/zzW + 8OkulOH2LpLg/y6S4P8ukuD/LpLg/y6S4P8ucdfFLzrO/y86zv8vOs7/LzrO/y86zv8uOs6+AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKPj1+4l5fguZqa/7mamv+5mpr/uZqa/7ma + mv+uhob/jzk4/44yMfdkoGTXU7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9Ts2//Tr2dvz3X8f891/H/Pdfx/z3X + 8f891/H/Pdfx/za46MIukuD/LpLg/y6S4P8ukuD/LpLg/y6R4PcvQ8/2LzrO/y86zv8vOs7/LzrO/y86 + zv8uOs1nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKd+fhuzkJBxtZKS2bmamv+5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/roaG/3GTYMdTs2//U7Nv/1Ozb/9Ts2//U7Nv/1Ozb/9SsnHpP9Tn6D3X + 8f891/H/Pdfx/z3X8f891/H/PNXw1y6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y6C278vOs7/LzrO/y86 + zv8vOs7/LzrO/y85zvYuPs8PAAAAAAAAAACzjY1Ns42NTbOQkHG0kpKSt5aWzLmamv+5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+7nZzzssOu2ZHGnf9WtHH/U7Nv/1Ozb/9Ts2//U7Nv/1Ky + b/dFzNTOPdfx/z3X8f891/H/Pdfx/z3X8f891/H/NLDmxy6S4P8ukuD/LpLg/y6S4P8ukuD/LpHg9y5K + 0OgvOs7/LzrO/y86zv8vOs7/LzrO/y46zq4AAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/72hoOerya7mos2s/6LNrP+Rxp3/VrRx/1Oz + b/9Ts2//U7Nv/0nFusA91/H/Pdfx/z3X8f891/H/Pdfx/z3X8f880vDOLpLg/y6S4P8ukuD/LpLg/y6S + 4P8ukuD/LoDbyS86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y85zE8AAAAAAAAAAAAAAAC5mpr/uZqa/7ma + mv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/vaml2qbMrPOizaz/os2s/6LN + rP+izaz/kcad/1a0cf9Ts2//Tr2dvz3X8f891/H/Pdfx/z3X8f891/H/Pdfx/z3X8f8wpOPXLpLg/y6S + 4P8ukuD/LpLg/y6S4P8ukODpLkDP9i86zv8vOs7/LzrO/y86zv8vOs7/LjnNzgAAAAAAAAAAAAAAAAAA + AAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/72jouOyw67Zos2s/6LN + rP+izaz/os2s/6LNrP+izaz/os2s/5HGnf9VuIbLPdfx/z3X8f891/H/Pdfx/z3X8f891/H/Pdfx/zjG + 7L4ukuD/LpLg/y6S4P8ukuD/LpLg/y6S4P8td9i/LzrO/y86zv8vOs7/LzrO/y86zv8vOs7/LznMTwAA + AAAAAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+8np7vtr6t1KLN + rP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6vUvdeK3/H3Qtfx/z3X8f891/H/Pdfx/z3X + 8f891/H/O9Dvxy6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y6Q4OsuQM/2LzrO/y86zv8vOs7/LzrO/y86 + zv8uOc3OAAAAAAAAAAAAAAAAAAAAAAAAAAC5mpr/uZqa/7mamv+5mpr/uZqa/7mamv+8oJ/qvLGp07LD + rtmizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/rNjL0Zzk9f+c5PX/ieD0/0LX + 8f891/H/Pdfx/z3X8f871O/eLpTh9i6S4P8ukuD/LpLg/y6S4P8ukuD/LpLg/y1p1ccvOs7/LzrO/y86 + zv8vOs7/LzrO/y86zv8vOcxPAAAAAAAAAAAAAAAAAAAAAAAAAAC+p6Tcvqek3L2vqNS6t6vSurms0a3H + reOizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6PNrfmp3dzVnOT1/5zk + 9f+c5PX/nOT1/4ng9P9C1/H/Pdfx/zzX8fAwnuLiLpLg/y6S4P8ukuD/LpLg/y6S4P8ukuD/Lo3e0C86 + zv8vOs7/LzrO/y86zv8vOs7/LzrO/y45zc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LN + rP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/pc6v76Xg + 5d+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+J4PT/Qdbw9zKr5dQukuD/LpLg/y6S4P8ukuD/LpLg/y6S + 4P8tkeDjLkPO7y86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y46zy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6TP + rvOr2tDRnePy+Jzk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+d4/T5j8nt2TST4P8ukuD/LpLg/y6S + 4P8ukuD/LpLg/y6R4PcuVdHkLzrO/y86zv8vOs7/LzrO/y86zv8vOs7/LjnOngAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LN + rP+jza35rNjI0p/j8fOc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5/k9e+hyu7jmbvq/4Wx + 5/80k+D/LpLg/y6S4P8ukuD/LpLg/y5o1cwvOs7/LzrO/y86zv8vOs7/LzrO/y86zv8uOc3uKTTJFwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LNrP+izaz/os2s/6LN + rP+izaz/ptCx6qvXxdOh4e3qnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/ouP15JzD + 6/SZu+r/mbvq/5m76v+Fsef/NJPg/y6S4P8ukuD/LXvZxi86zv8vOs7/LzrO/y86zv8vOs7/LzrO/y86 + zv8uOM1HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACizaz/os2s/6LNrP+izaz/os2s/6LN + rP+izaz/p9Cz56vZztKk4ejjnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+l4PTZmr3q+Jm76v+Zu+r/mbvq/5m76v+Zu+r/hbHn/zST4P8uiN3MLzrO/y86zv8vOs7/LzrO/y86 + zv8vOs7/LzrO/y84zG8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACp0rjcqdK43KvW + wtSr2c7Sq9rQ0aff5Nyh4e3qnOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/6ba8teZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/42z5941Rc/2LzrO/y86 + zv8vOs7/LzrO/y86zv8vOs7/LznOlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+l4fTbncPr75m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/o73p2Zqe + 3/iFiNr/NT/O/y86zv8vOs7/LzrO/y86zv8uOs6+HD2+BwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/pOL13qHK7uOZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+ltufVmZve/5mb3v+Zm97/hYja/zU/zv8vOs7/LzrO/y46zd4uPs8PAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Hj9Oeiz+/fmbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/nL3q86Ku5N6Zm97/mZve/5mb3v+Zm97/mZve/4WI2v81P87/LjnN7iw5zCcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk9f+c5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Hj9eun3vPSoszu4Jm76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+fvurnn6fh5pmb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Fh9n3LjjNRwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACc5PX/nOT1/5zk + 9f+c5PX/nOT1/5zk9f+c5PX/nOT1/6Tk9OCn2PHSoMfs5pm76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/6O/6tqcoN/zmZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5aY + 3fJ/gtlJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACl4/XcpeP13KXj9dyl4/Xcp93z0afY8dKjze7cnMDr85m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+gv+rjoq7j3Jmb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/lJbc2X6A2SUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/nr7q6qWz5dWZm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Sld2+aXDWEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5y96vOmuOfSmp7f+Jmb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/4mL2pYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m76v+Zu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+dvervprrn0pyg3/OZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+WmN34io3aZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZu+r/mbvq/5m7 + 6v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+avOr5pL7q1qOw5NmZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5OW3eyEh9o4AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+Zu+r/mbvq/5m76v+iv+rcprrn0qKu49yZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm974i43al4SLzwgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACiv+rcor/q3KK/6tyiv+rcpL7q16a659KksuXXoKni45mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5SW3cWEh9gvAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Vl93MjY/cTQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/kJLcy42P + 3E0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZm97/mZve/5mb + 3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/lZfd7I2P + 26aEh9o4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mJre7JOV + 3bCHitlUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACZm97/mZve/5mb3v+Zm97/mZve/5mb3v+Zm97/mZve/5mb3v+Ymt3ylJbdvo+R + 23mMj9oxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVl93MlZfdzJWX3cyVl93MlJbdxZGT25KPkdpxjY/cTYSL + zwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//8AAAAAAAP//gAAAAAAA//+AAAAA + AAD//4AAAAAAAP//gAAAAAAA//+AAAAAAAD//wAAAAAAAP//AAAAAAAA//4AAAAAAAD//gAAAAAAAP/8 + AAAAAQAA//gAAAABAAD/8AAAAAEAAP/gAAAAAQAA/8AAAAADAAD/AAAAAAMAAPgAAAAAAwAAAAAAAAAH + AAAAAAAAAAcAAAAAAAAADwAAAAAAAAAPAAAAAAAAAB8AAAAAAAAAHwAAAAAAAAA/AAAAAAAAAD8AAAAA + AAAAfwAAAAAAAAB/AAAAAAAAAP8AAAAAAAAB/wAAAAAAAAP/AAAAAAAAA/8AAAAAAAAH/wAAAAAAAA// + AAAAAAAAH/8AAAAAAAA//wAAAAAAAH//AAAAAAAA//8AAAAAAAP//wAAAAAAB///AAAAAAAP//8AAAAA + AB///wAAAAAAf///AAAAAAH///8AAAAAB////wAAAAAf////AAAAAP////8AAAAH/////wAAAH////// + AAA= + + + \ No newline at end of file diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb new file mode 100644 index 0000000..3f8af8e --- /dev/null +++ b/SCrawler/MainFrame.vb @@ -0,0 +1,777 @@ +Imports System.ComponentModel +Imports System.Globalization +Imports System.Threading +Imports PersonalUtilities.Forms +Imports SCrawler.API +Imports SCrawler.API.Base +Imports SCrawler.Editors +Public Class MainFrame + Private MyView As FormsView + Private ReadOnly _VideoDownloadingMode As Boolean = False + Private MyChannels As ChannelViewForm + Private _UFinit As Boolean = True + Public Sub New() + InitializeComponent() + Dim n As DateTimeFormatInfo = CultureInfo.GetCultureInfo("en-us").DateTimeFormat.Clone + n.FullDateTimePattern = "ddd MMM dd HH:mm:ss +ffff yyyy" + n.TimeSeparator = String.Empty + Twitter.DateProvider = New ADateTime(DirectCast(n.Clone, DateTimeFormatInfo)) With {.DateTimeStyle = DateTimeStyles.AssumeUniversal} + Settings = New SettingsCLS + Dim Args() As String = Environment.GetCommandLineArgs + If Args.ListExists(2) AndAlso Args(1) = "v" Then + Using f As New VideosDownloaderForm : f.ShowDialog() : End Using + _VideoDownloadingMode = True + Else + Downloader = New TDownloader + End If + End Sub + Private Sub MainFrame_Load(sender As Object, e As EventArgs) Handles Me.Load + If _VideoDownloadingMode Then GoTo FormClosingInvoker + InfoForm = New DownloadedInfoForm + AddHandler Downloader.OnJobsChange, AddressOf Downloader_UpdateJobsCount + AddHandler Downloader.OnDownloading, AddressOf Downloader_OnDownloading + AddHandler Downloader.OnDownloadCountChange, AddressOf InfoForm.Downloader_OnDownloadCountChange + Settings.LoadUsers() + MyView = New FormsView(Me) + MyView.ImportFromXML(Settings.Design) + MyView.SetMeSize() + MainProgress = New Toolbars.MyProgress(Toolbar_BOTTOM, PR_MAIN, LBL_STATUS) With {.DropCurrentProgressOnTotalChange = False} + Dim gk$ + With LIST_PROFILES.Groups + gk = GetLviGroupName(Sites.Undefined, False, False, True) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(Sites.Undefined, False, True, True) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(Sites.Undefined, True, False, True) + .Add(New ListViewGroup(gk, gk)) + For Each s In {Sites.Reddit, Sites.Twitter} + gk = GetLviGroupName(s, False, True, False) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(s, False, False, False) + .Add(New ListViewGroup(gk, gk)) + gk = GetLviGroupName(s, True, False, False) + .Add(New ListViewGroup(gk, gk)) + Next + If Settings.Labels.Count > 0 Then Settings.Labels.ToList.ForEach(Sub(l) .Add(New ListViewGroup(l, l))) + .Add(Settings.Labels.NoLabel) + End With + With Settings + LIST_PROFILES.View = .ViewMode + SetViewButtonsCheckers(.ViewMode.Value = View.LargeIcon, .ViewMode.Value = View.SmallIcon, .ViewMode.Value = View.List) + AddHandler .Labels.NewLabelAdded, AddressOf UpdateLabelsGroups + End With + RefillList() + UpdateLabelsGroups() + SetShowButtonsCheckers(Settings.ShowingMode.Value) + CheckForReparse() + CheckVersion(False) + _UFinit = False + GoTo EndFunction +FormClosingInvoker: + Close() +EndFunction: + End Sub + Private _CloseInvoked As Boolean = False + Private Async Sub MainFrame_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + If Not _VideoDownloadingMode Then + If _CloseInvoked Then GoTo CloseResume + Dim ChannelsWorking As Func(Of Boolean) = Function() If(MyChannels?.Working, False) + If (Not Downloader.Working And Not ChannelsWorking.Invoke) OrElse + MsgBoxE({"Program still downloading something..." & vbNewLine & + "Do you really want to stop downloading and exit of program?", + "Downloading in progress"}, + MsgBoxStyle.Exclamation,,, + {"Stop downloading and close", "Cancel"}) = 0 Then + If Downloader.Working Then _CloseInvoked = True : Downloader.Stop() + If ChannelsWorking.Invoke Then _CloseInvoked = True : MyChannels.Stop(False) + If _CloseInvoked Then + e.Cancel = True + Await Task.Run(Sub() + While Downloader.Working Or ChannelsWorking.Invoke : Thread.Sleep(500) : End While + End Sub) + End If + Downloader.Dispose() + InfoForm.Dispose() + If Not MyChannels Is Nothing Then MyChannels.Dispose() + If Not VideoDownloader Is Nothing Then VideoDownloader.Dispose() + MyView.Dispose(Settings.Design) + Settings.Dispose() + Else + e.Cancel = True + Exit Sub + End If + End If + If Not MyMainLOG.IsEmptyString Then SaveLogToFile() + If _CloseInvoked Then Close() +CloseResume: + End Sub + Private Sub MainFrame_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + Dim b As Boolean = True + Select Case e.KeyCode + Case Keys.Insert : BTT_ADD_USER.PerformClick() + Case Keys.Delete : DeleteSelectedUser() + Case Keys.F1 : BTT_VERSION_INFO.PerformClick() + Case Keys.F2 : DownloadVideoByURL() + Case Keys.F3 : EditSelectedUser() + Case Keys.F5 : BTT_DOWN_SELECTED.PerformClick() + Case Keys.F6 : If Settings.ShowingMode.Value = ShowingModes.All Then BTT_DOWN_ALL.PerformClick() + Case Else : b = False + End Select + If b Then e.Handled = True + End Sub + Private Sub BTT_VERSION_INFO_Click(sender As Object, e As EventArgs) Handles BTT_VERSION_INFO.Click + CheckVersion(True) + End Sub + Friend Sub RefillList() + Dim a As Action = Sub() + With LIST_PROFILES + .Items.Clear() + If Not .LargeImageList Is Nothing Then .LargeImageList.Images.Clear() + .LargeImageList = New ImageList + If Not .SmallImageList Is Nothing Then .SmallImageList.Images.Clear() + .SmallImageList = New ImageList + .LargeImageList.ColorDepth = ColorDepth.Depth32Bit + .SmallImageList.ColorDepth = ColorDepth.Depth32Bit + .LargeImageList.ImageSize = New Size(DivideWithZeroChecking(Settings.MaxLargeImageHeigh.Value, 100) * 75, Settings.MaxLargeImageHeigh.Value) + .SmallImageList.ImageSize = New Size(DivideWithZeroChecking(Settings.MaxSmallImageHeigh.Value, 100) * 75, Settings.MaxSmallImageHeigh.Value) + End With + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + If Settings.Users.Count > 0 Then + Settings.Users.Sort() + Dim t As New List(Of Task) + For Each User As IUserData In Settings.Users + If User.FitToAddParams Then + If Settings.ViewModeIsPicture Then + t.Add(Task.Run(Sub() UserListUpdate(User, True))) + Else + UserListUpdate(User, True) + End If + End If + Next + If t.Count > 0 Then Task.WhenAll(t.ToArray) : t.Clear() + End If + End Sub + Private Sub UserListUpdate(ByVal User As IUserData, ByVal Add As Boolean) + Try + Dim a As Action + If Add Then + a = Sub() + With LIST_PROFILES + Select Case Settings.ViewMode.Value + Case View.LargeIcon : .LargeImageList.Images.Add(User.LVIKey, User.GetPicture()) + Case View.SmallIcon : .SmallImageList.Images.Add(User.LVIKey, User.GetPicture()) + End Select + .Items.Add(User.GetLVI(LIST_PROFILES)) + End With + End Sub + Else + a = Sub() + With LIST_PROFILES + Dim i% = .Items.IndexOfKey(User.LVIKey) + Dim ImgIndx% + If i >= 0 Then + Select Case Settings.ViewMode.Value + Case View.LargeIcon + ImgIndx = .LargeImageList.Images.IndexOfKey(User.LVIKey) + If ImgIndx >= 0 Then .LargeImageList.Images(ImgIndx) = User.GetPicture() + Case View.SmallIcon + ImgIndx = .SmallImageList.Images.IndexOfKey(User.LVIKey) + If ImgIndx >= 0 Then .SmallImageList.Images(ImgIndx) = User.GetPicture() + End Select + .Items(i).Text = User.ToString + .Items(i).Group = User.GetLVIGroup(LIST_PROFILES) + End If + End With + End Sub + End If + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + Catch ex As Exception + End Try + End Sub + Private Sub UpdateLabelsGroups() + If Settings.Labels.NewLabelsExists Then + If Settings.Labels.NewLabels.Count > 0 Then + Dim ll As ListViewGroup = Nothing + Dim a As Action = Sub() LIST_PROFILES.Groups.Add(ll) + For Each l$ In Settings.Labels.NewLabels + ll = New ListViewGroup(l, l) + If Not LIST_PROFILES.Groups.Contains(ll) Then + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + End If + Next + End If + Settings.Labels.NewLabels.Clear() + End If + End Sub + Private Sub OnUsersAddedHandler(ByVal StartIndex As Integer) + If StartIndex <= Settings.Users.Count - 1 Then + For i% = StartIndex To Settings.Users.Count - 1 : UserListUpdate(Settings.Users(i), True) : Next + End If + End Sub +#Region "Toolbar buttons" +#Region "Settings" + Private Sub BTT_SETTINGS_REDDIT_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_REDDIT.Click + Using f As New RedditEditorForm : f.ShowDialog() : End Using + End Sub + Private Sub BTT_SETTINGS_TWITTER_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS_TWITTER.Click + Using f As New TwitterEditorForm : f.ShowDialog() : End Using + End Sub + Private Sub BTT_SETTINGS_Click(sender As Object, e As EventArgs) Handles BTT_SETTINGS.Click + Dim mhl% = Settings.MaxLargeImageHeigh.Value + Dim mhs% = Settings.MaxSmallImageHeigh.Value + Using f As New GlobalSettingsForm + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + If Not Settings.MaxLargeImageHeigh = mhl Or Not Settings.MaxSmallImageHeigh = mhs Then RefillList() + End If + End Using + End Sub +#End Region +#Region "User" + Private Sub BTT_ADD_USER_Click(sender As Object, e As EventArgs) Handles BTT_ADD_USER.Click + Using f As New UserCreatorForm + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + Dim i% + If f.StartIndex >= 0 Then + OnUsersAddedHandler(f.StartIndex) + Else + i = Settings.Users.FindIndex(Function(u) u.Site = f.User.Site And u.Name = f.User.Name) + If i < 0 Then + If Not UserBanned(f.User.Name) Then + Settings.UpdateUsersList(f.User) + Settings.Users.Add(UserDataBase.GetInstance(f.User)) + With Settings.Users(Settings.Users.Count - 1) + .Favorite = f.UserFavorite + .Temporary = f.UserTemporary + .ParseUserMediaOnly = f.UserMediaOnly + .ReadyForDownload = f.UserReady + .FriendlyName = f.UserFriendly + .Description = f.UserDescr + .Labels.ListAddList(f.UserLabels, LAP.ClearBeforeAdd, LAP.NotContainsOnly) + .UpdateUserInformation() + End With + UserListUpdate(Settings.Users(Settings.Users.Count - 1), True) + i = LIST_PROFILES.Items.IndexOfKey(Settings.Users(Settings.Users.Count - 1).LVIKey) + If i >= 0 Then + LIST_PROFILES.SelectedIndices.Clear() + With LIST_PROFILES.Items(i) + .Selected = True + .Focused = True + End With + LIST_PROFILES.EnsureVisible(i) + End If + Else + MsgBoxE($"User [{f.User.Name}] was not added") + End If + Else + i = LIST_PROFILES.Items.IndexOfKey(Settings.Users(i).LVIKey) + If i >= 0 Then + LIST_PROFILES.SelectedIndices.Clear() + With LIST_PROFILES.Items(i) + .Selected = True + .Focused = True + End With + LIST_PROFILES.EnsureVisible(i) + End If + MsgBoxE($"User [{f.User.Name}] already exists", MsgBoxStyle.Exclamation) + End If + End If + End If + End Using + End Sub + Private Sub BTT_EDIT_USER_Click(sender As Object, e As EventArgs) Handles BTT_EDIT_USER.Click + EditSelectedUser() + End Sub + Private Sub BTT_DELETE_USER_Click(sender As Object, e As EventArgs) Handles BTT_DELETE_USER.Click + DeleteSelectedUser() + End Sub + Private Sub BTT_REFRESH_Click(sender As Object, e As EventArgs) Handles BTT_REFRESH.Click + RefillList() + End Sub + Private Sub BTT_SHOW_INFO_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_INFO.Click + ShowInfoForm(True) + End Sub + Private Overloads Sub ShowInfoForm() + ShowInfoForm(False) + End Sub + Private Overloads Sub ShowInfoForm(ByVal BringToFrontIfOpen As Boolean) + If InfoForm.Visible Then + If BringToFrontIfOpen Then InfoForm.BringToFront() + Else + InfoForm.Show() + End If + End Sub + Private Sub BTT_CHANNELS_Click(sender As Object, e As EventArgs) Handles BTT_CHANNELS.Click + If MyChannels Is Nothing Then + MyChannels = New ChannelViewForm + AddHandler MyChannels.OnUsersAdded, AddressOf OnUsersAddedHandler + End If + If MyChannels.Visible Then MyChannels.BringToFront() Else MyChannels.Show() + End Sub +#End Region +#Region "Download" + Private Sub BTT_DOWN_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SELECTED.Click + DownloadSelectedUser() + End Sub + Private Sub BTT_DOWN_ALL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_ALL.Click + Downloader.AddRange(Settings.Users.Where(Function(u) u.ReadyForDownload)) + End Sub + Private Sub BTT_DOWN_VIDEO_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_VIDEO.Click + DownloadVideoByURL() + End Sub + Private Sub BTT_DOWN_STOP_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_STOP.Click + Downloader.Stop() + End Sub +#End Region +#Region "View" + Private Sub BTT_VIEW_LARGE_Click(sender As Object, e As EventArgs) Handles BTT_VIEW_LARGE.Click + LIST_PROFILES.View = View.LargeIcon + Dim b As Boolean = Not (Settings.ViewMode.Value = View.LargeIcon) + Settings.ViewMode.Value = View.LargeIcon + SetViewButtonsCheckers(True, False, False) + If b Then RefillList() + End Sub + Private Sub BTT_VIEW_SMALL_Click(sender As Object, e As EventArgs) Handles BTT_VIEW_SMALL.Click + LIST_PROFILES.View = View.SmallIcon + Dim b As Boolean = Not (Settings.ViewMode.Value = View.SmallIcon) + Settings.ViewMode.Value = View.SmallIcon + SetViewButtonsCheckers(False, True, False) + If b Then RefillList() + End Sub + Private Sub BTT_VIEW_LIST_Click(sender As Object, e As EventArgs) Handles BTT_VIEW_LIST.Click + LIST_PROFILES.View = View.List + Dim b As Boolean = Not (Settings.ViewMode.Value = View.List) + Settings.ViewMode.Value = View.List + SetViewButtonsCheckers(False, False, True) + If b Then + With LIST_PROFILES + .LargeImageList.Images.Clear() + .SmallImageList.Images.Clear() + End With + End If + End Sub + Private Sub SetViewButtonsCheckers(ByVal Large As Boolean, ByVal Small As Boolean, ByVal List As Boolean) + BTT_VIEW_LARGE.Checked = Large + BTT_VIEW_SMALL.Checked = Small + BTT_VIEW_LIST.Checked = List + End Sub +#End Region +#Region "Labels" + Private Sub BTT_SHOW_ALL_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_ALL.Click + SetShowButtonsCheckers(ShowingModes.All) + End Sub + Private Sub BTT_SHOW_REGULAR_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_REGULAR.Click + SetShowButtonsCheckers(ShowingModes.Regular) + End Sub + Private Sub BTT_SHOW_TEMP_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_TEMP.Click + SetShowButtonsCheckers(ShowingModes.Temporary) + End Sub + Private Sub BTT_SHOW_FAV_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_FAV.Click + SetShowButtonsCheckers(ShowingModes.Favorite) + End Sub + Private Sub BTT_SHOW_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_LABELS.Click + SetShowButtonsCheckers(ShowingModes.Labels) + End Sub + Private Sub BTT_SHOW_NO_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SHOW_NO_LABELS.Click + SetShowButtonsCheckers(ShowingModes.NoLabels) + End Sub + Private Sub SetShowButtonsCheckers(ByVal m As ShowingModes) + BTT_SHOW_ALL.Checked = m = ShowingModes.All + BTT_SHOW_REGULAR.Checked = m = ShowingModes.Regular + BTT_SHOW_TEMP.Checked = m = ShowingModes.Temporary + BTT_SHOW_FAV.Checked = m = ShowingModes.Favorite + BTT_SHOW_LABELS.Checked = m = ShowingModes.Labels + BTT_SHOW_NO_LABELS.Checked = m = ShowingModes.NoLabels + BTT_SELECT_LABELS.Enabled = BTT_SHOW_LABELS.Checked + If Not Settings.ShowingMode.Value = m Then + If Not m = ShowingModes.Labels Or Settings.Labels.CurrentSelection.Count > 0 Then + Settings.ShowingMode.Value = m + RefillList() + ElseIf m = ShowingModes.Labels And Settings.Labels.CurrentSelection.Count = 0 Then + OpenLabelsForm() + If Settings.Labels.CurrentSelection.Count > 0 Then + Settings.ShowingMode.Value = m + RefillList() + Else + SetShowButtonsCheckers(Settings.ShowingMode.Value) + Exit Sub + End If + ElseIf m = ShowingModes.NoLabels Then + Settings.ShowingMode.Value = m + RefillList() + End If + End If + Settings.ShowingMode.Value = m + If Not m = ShowingModes.All Then BTT_DOWN_ALL.Enabled = False + End Sub + Private Sub BTT_SELECT_LABELS_Click(sender As Object, e As EventArgs) Handles BTT_SELECT_LABELS.Click + OpenLabelsForm() + End Sub + Private Sub OpenLabelsForm() + Using f As New LabelsForm(Settings.Labels.CurrentSelection) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + If f.LabelsList.Count > 0 Then + Settings.Labels.CurrentSelection.ListAddList(f.LabelsList, LAP.ClearBeforeAdd, LAP.NotContainsOnly) + Settings.LatestSelectedLabels.Value = Settings.Labels.CurrentSelection.ListToString(, "|") + Else + Settings.Labels.CurrentSelection.Clear() + Settings.LatestSelectedLabels.Value = String.Empty + End If + End If + End Using + End Sub +#End Region + Private Sub BTT_LOG_Click(sender As Object, e As EventArgs) Handles BTT_LOG.Click + MyMainLOG_ShowForm(Settings.Design) + End Sub +#Region "List functions" + Private _LatestSelected As Integer = -1 + Private Sub LIST_PROFILES_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_PROFILES.SelectedIndexChanged + Dim a As Action = Sub() + If LIST_PROFILES.SelectedIndices.Count > 0 Then + _LatestSelected = LIST_PROFILES.SelectedIndices(0) + Else + _LatestSelected = -1 + End If + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + End Sub + Private Sub LIST_PROFILES_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles LIST_PROFILES.MouseDoubleClick + OpenFolder() + End Sub +#Region "Context" + Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click + DownloadSelectedUser() + End Sub + Private Sub BTT_CONTEXT_EDIT_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_EDIT.Click + EditSelectedUser() + End Sub + Private Sub BTT_CONTEXT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DELETE.Click + DeleteSelectedUser() + End Sub + Private Sub BTT_CONTEXT_FAV_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_FAV.Click + Dim users As List(Of IUserData) = GetSelectedUserArray() + If AskForMassReplace(users, "Favorite") Then + users.ForEach(Sub(u) + u.Favorite = Not u.Favorite + u.UpdateUserInformation() + UserListUpdate(u, False) + End Sub) + End If + End Sub + Private Sub BTT_CONTEXT_TEMP_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_TEMP.Click + Dim users As List(Of IUserData) = GetSelectedUserArray() + If AskForMassReplace(users, "Temporary") Then + users.ForEach(Sub(u) + u.Temporary = Not u.Temporary + u.UpdateUserInformation() + UserListUpdate(u, False) + End Sub) + End If + End Sub + Private Sub BTT_CONTEXT_GROUPS_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_GROUPS.Click + Try + Dim users As List(Of IUserData) = GetSelectedUserArray() + If users.ListExists Then + Dim l As List(Of String) = ListAddList(Nothing, users.SelectMany(Function(u) u.Labels), LAP.NotContainsOnly) + If l.ListExists Then + Using f As New LabelsForm(l) With {.MultiUser = True} + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + Dim _lp As LAP = LAP.NotContainsOnly + If f.MultiUserClearExists Then _lp += LAP.ClearBeforeAdd + Dim lp As New ListAddParams(_lp) + users.ForEach(Sub(ByVal u As IUserData) + If u.IsCollection Then + With DirectCast(u, UserDataBind) + If .Count > 0 Then .Collections.ForEach(Sub(uu) uu.Labels.ListAddList(f.LabelsList, lp)) + End With + Else + u.Labels.ListAddList(f.LabelsList, lp) + End If + u.UpdateUserInformation() + End Sub) + End If + End Using + End If + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.ShowAllMsg, ex, "[ChangeUserGroups]") + End Try + End Sub + Private Function AskForMassReplace(ByVal users As List(Of IUserData), ByVal param As String) As Boolean + Dim u$ = users.ListIfNothing.Take(20).Select(Function(uu) uu.Name).ListToString(, vbCr) + If Not u.IsEmptyString And users.ListExists(21) Then u &= vbCr & "..." + Return users.ListExists AndAlso (users.Count = 1 OrElse MsgBox($"Do you really want to change [{param}] for {users.Count} users?{vbCr}{vbCr}{u}", + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton1, + "Users' change parameter") = MsgBoxResult.Yes) + End Function + Private Sub BTT_CHANGE_IMAGE_Click(sender As Object, e As EventArgs) Handles BTT_CHANGE_IMAGE.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + Dim f As SFile = SFile.SelectFiles(user.File, False, "Select new user picture", "Pictures|*.jpeg;*.jpg;*.png").FirstOrDefault + If Not f.IsEmptyString Then + user.SetPicture(f) + UserListUpdate(user, False) + End If + End If + End Sub + Private Sub BTT_CONTEXT_ADD_TO_COL_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_ADD_TO_COL.Click + If Settings.CollectionsPath.Value.IsEmptyString Then + MsgBoxE("Collection path does not set", MsgBoxStyle.Exclamation) + Else + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + If user.IsCollection Then + MsgBoxE("Collection can not be added to collection!", MsgBoxStyle.Critical) + Else + Using f As New CollectionEditorForm(user.CollectionName) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + With Settings + Dim fCol As Predicate(Of IUserData) = Function(u) u.IsCollection And u.CollectionName = f.Collection + Dim i% = .Users.FindIndex(fCol) + Dim Added As Boolean = i < 0 + If i < 0 Then + .Users.Add(New UserDataBind(f.Collection)) + i = .Users.Count - 1 + End If + DirectCast(.Users(i), UserDataBind).Add(user) + RemoveUserFromList(user) + i = .Users.FindIndex(fCol) + If i >= 0 Then UserListUpdate(.Users(i), Added) Else RefillList() + End With + MsgBoxE($"[{user.Name}] was added to collection [{f.Collection}]") + End If + End Using + End If + End If + End If + End Sub + Private Sub BTT_CONTEXT_COL_MERGE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_COL_MERGE.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + If user.IsCollection Then + If DirectCast(user, UserDataBind).DataMerging Then + MsgBoxE("Collection files are already merged") + Else + If MsgBoxE({"Do you really want to merge collection files into one folder?" & vbNewLine & + "This action is not turnable!", "Merging files"}, + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + DirectCast(user, UserDataBind).DataMerging = True + End If + End If + Else + MsgBoxE("This is not collection!", MsgBoxStyle.Exclamation) + End If + End If + End Sub + Private Sub BTT_CONTEXT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_PATH.Click + OpenFolder() + End Sub + Private Sub BTT_CONTEXT_OPEN_SITE_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_OPEN_SITE.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then user.OpenSite() + End Sub + Private Sub BTT_CONTEXT_INFO_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_INFO.Click + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then MsgBoxE(DirectCast(user, UserDataBase).GetUserInformation()) + End Sub + Private Sub USER_CONTEXT_VisibleChanged(sender As Object, e As EventArgs) Handles USER_CONTEXT.VisibleChanged + Try + If USER_CONTEXT.Visible Then + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing AndAlso user.IsCollection Then + With DirectCast(user, UserDataBind) + BTT_CONTEXT_DOWN.DropDownItems.AddRange(.ContextDown) + BTT_CONTEXT_EDIT.DropDownItems.AddRange(.ContextEdit) + BTT_CONTEXT_DELETE.DropDownItems.AddRange(.ContextDelete) + BTT_CONTEXT_OPEN_PATH.DropDownItems.AddRange(.ContextPath) + BTT_CONTEXT_OPEN_SITE.DropDownItems.AddRange(.ContextSite) + End With + End If + Else + BTT_CONTEXT_DOWN.DropDownItems.Clear() + BTT_CONTEXT_EDIT.DropDownItems.Clear() + BTT_CONTEXT_DELETE.DropDownItems.Clear() + BTT_CONTEXT_OPEN_PATH.DropDownItems.Clear() + BTT_CONTEXT_OPEN_SITE.DropDownItems.Clear() + End If + Catch ex As Exception + End Try + End Sub +#End Region +#End Region + Private Function GetSelectedUser() As IUserData + If _LatestSelected >= 0 And _LatestSelected <= LIST_PROFILES.Items.Count - 1 Then + Dim k$ = LIST_PROFILES.Items(_LatestSelected).Name + Dim i% = Settings.Users.FindIndex(Function(u) u.LVIKey = k) + If i >= 0 Then + Return Settings.Users(i) + Else + MsgBoxE("User not found", MsgBoxStyle.Critical) + End If + End If + Return Nothing + End Function + Private Function GetSelectedUserArray() As List(Of IUserData) + Try + With LIST_PROFILES + If .SelectedIndices.Count > 0 Then + Dim l As New List(Of IUserData) + Dim k$ + Dim indx% + For i% = 0 To .SelectedIndices.Count - 1 + k = .Items(.SelectedIndices(i)).Name + indx = Settings.Users.FindIndex(Function(u) u.LVIKey = k) + If i >= 0 Then l.Add(Settings.Users(indx)) + Next + Return l + End If + End With + Return New List(Of IUserData) + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.SendInLog + EDP.ReturnValue, ex, "[MainFrame.GetSelectedUserArray]", New List(Of IUserData)) + End Try + End Function + Private Overloads Sub RemoveUserFromList(ByVal _User As IUserData) + RemoveUserFromList(LIST_PROFILES.Items.IndexOfKey(_User.LVIKey), _User.LVIKey) + End Sub + Private Overloads Sub RemoveUserFromList(ByVal _Index As Integer, ByVal Key As String) + Dim a As Action = Sub() + With LIST_PROFILES + If _Index >= 0 Then + .Items.RemoveAt(_Index) + If Settings.ViewModeIsPicture Then + Dim ImgIndx% + Select Case Settings.ViewMode.Value + Case View.LargeIcon + ImgIndx = .LargeImageList.Images.IndexOfKey(Key) + If ImgIndx >= 0 Then .LargeImageList.Images.RemoveAt(_Index) + Case View.SmallIcon + ImgIndx = .SmallImageList.Images.IndexOfKey(Key) + If ImgIndx >= 0 Then .SmallImageList.Images.RemoveAt(_Index) + End Select + End If + End If + End With + End Sub + If LIST_PROFILES.InvokeRequired Then LIST_PROFILES.Invoke(a) Else a.Invoke + End Sub + Private Sub EditSelectedUser() + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then + On Error Resume Next + If user.IsCollection Then + If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() + Using f As New CollectionEditorForm(user.CollectionName) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then + user.CollectionName = f.Collection + UserListUpdate(user, False) + End If + End Using + Else + Using f As New UserCreatorForm(user) + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then UserListUpdate(user, False) + End Using + End If + End If + End Sub + Private Sub DeleteSelectedUser() + Try + Dim users As List(Of IUserData) = GetSelectedUserArray() + If users.ListExists Then + If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() + Dim ugn As Func(Of IUserData, String) = Function(u) $"{IIf(u.IsCollection, "Collection", "User")}: {u.Name}" + Dim m As New MMessage(users.Select(ugn).ListToString(, vbNewLine), "Users deleting", + {New Messaging.MsgBoxButton("Delete and ban") With {.ToolTip = "Users will be deleted and added to the blacklist"}, + New Messaging.MsgBoxButton("Delete and ban with reason") With { + .ToolTip = "Users will be deleted and added to the blacklist with set a reason to delete"}, + "Delete", "Cancel"}, MsgBoxStyle.Exclamation) With {.ButtonsPerRow = 2} + m.Text = $"The following users ({users.Count}) will be deleted:{vbNewLine}{m.Text}" + Dim result% = MsgBoxE(m) + If result < 3 Then + Dim removedUsers As New List(Of String) + Dim leftUsers As New List(Of String) + Dim l As New ListAddParams(LAP.NotContainsOnly) + Dim b As Boolean = False + Dim reason$ = String.Empty + If result = 1 Then reason = InputBoxE("Enter a deletion reason:", "Deletion reason") + For Each user In users + If user.Delete > 0 Then + If result < 2 Then Settings.BlackList.ListAddValue(New UserBan(user.Name, reason), l) : b = True + RemoveUserFromList(user) + removedUsers.Add(ugn(user)) + Else + leftUsers.Add(ugn(user)) + End If + Next + m = New MMessage(String.Empty, "Users deleting") + If removedUsers.Count = users.Count Then + If removedUsers.Count = 1 Then + m.Text = "User deleted" + Else + m.Text = "All users were deleted" + End If + ElseIf removedUsers.Count = 0 Then + m.Text = "No one user deleted!" + m.Style = MsgBoxStyle.Critical + Else + m.Text = $"The following users were deleted:{vbNewLine}{removedUsers.ListToString(, vbNewLine)}{vbNewLine.StringDup(2)}" + m.Text &= $"The following users were NOT deleted:{vbNewLine}{leftUsers.ListToString(, vbNewLine)}" + m.Style = MsgBoxStyle.Exclamation + End If + If b Then Settings.UpdateBlackList() + MsgBoxE(m) + Else + MsgBoxE("Operation canceled") + End If + End If + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on trying to delete user / collection") + End Try + End Sub + Private Sub DownloadSelectedUser() + Dim users As List(Of IUserData) = GetSelectedUserArray() + If users.ListExists Then + If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() + If users.Count = 1 Then + Downloader.Add(users(0)) + Else + Dim uStr$ = users.Select(Function(u) u.ToString()).ListToString(, vbNewLine) + If MsgBoxE({$"You are select {users.Count} users' profiles{vbNewLine}Do you want to download all of them?{vbNewLine.StringDup(2)}" & + $"Selected users:{vbNewLine}{uStr}", "A few users selected"}, + MsgBoxStyle.Question + MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then + Downloader.AddRange(users) + End If + End If + End If + End Sub + Private Sub OpenFolder() + Dim user As IUserData = GetSelectedUser() + If Not user Is Nothing Then user.OpenFolder() + End Sub +#End Region + Friend Sub User_OnPictureUpdated(ByVal User As IUserData) + UserListUpdate(User, False) + End Sub + Private _LogVisible As Boolean = False + Private Sub Downloader_UpdateJobsCount(ByVal TotalCount As Integer) + Dim a As Action = Sub() LBL_JOBS_COUNT.Text = IIf(TotalCount = 0, String.Empty, $"[Jobs {TotalCount}]") + If Toolbar_BOTTOM.InvokeRequired Then Toolbar_BOTTOM.Invoke(a) Else a.Invoke + If Not _LogVisible AndAlso Not MyMainLOG.IsEmptyString Then + a = Sub() BTT_LOG.ControlChangeColor(False) + If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke + _LogVisible = True + End If + End Sub + Private Sub Downloader_OnDownloading(ByVal Value As Boolean) + Dim a As Action = Sub() BTT_DOWN_STOP.Enabled = Not Value + If Toolbar_TOP.InvokeRequired Then Toolbar_TOP.Invoke(a) Else a.Invoke + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb new file mode 100644 index 0000000..61d5bc4 --- /dev/null +++ b/SCrawler/MainMod.vb @@ -0,0 +1,350 @@ +Imports PersonalUtilities.Functions.XML +Imports SCrawler.API +Imports SCrawler.API.Base +Friend Module MainMod + Friend Settings As SettingsCLS + Friend Const SettingsFolderName As String = "Settings" + Friend ReadOnly LinkPattern As New RegexStructure("[htps:]{0,6}[/]{0,2}(.+)", 1) + Friend ReadOnly FilesPattern As New RegexStructure("[^\./]+?\.\w+", True, False, 1) + Friend Const LVI_TempOption As String = "Temp" + Friend Const LVI_FavOption As String = "Favorite" + Friend Const CannelsLabelName As String = "Channels" + Friend Const LVI_CollectionOption As String = "Collection" + Friend Enum ViewModes As Integer + IconLarge = 0 + IconSmall = 2 + List = 3 + End Enum + Friend Enum ShowingModes As Integer + All = 0 + Regular = 20 + Temporary = 50 + Favorite = 100 + Labels = 500 + NoLabels = 1000 + End Enum + Friend Downloader As TDownloader + Friend InfoForm As DownloadedInfoForm + Friend VideoDownloader As VideosDownloaderForm + Friend ReadOnly ParsersDataDateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) + Friend Property MainProgress As PersonalUtilities.Forms.Toolbars.MyProgress + Friend Function GetLviGroupName(ByVal Site As Sites, ByVal Temp As Boolean, ByVal Fav As Boolean, ByVal IsCollection As Boolean) As String + Dim Opt$ = String.Empty + If Temp Then + Opt = LVI_TempOption + ElseIf Fav Then + Opt = LVI_FavOption + End If + If Not Opt.IsEmptyString Then Opt = $" ({Opt})" + If IsCollection Then + Return $"{LVI_CollectionOption}{Opt}" + Else + Return $"{Site}{Opt}" + End If + End Function + Friend Enum Sites As Integer + Undefined = 0 + Reddit = 1 + Twitter = 2 + End Enum + Friend Structure UserInfo : Implements IComparable(Of UserInfo), IEquatable(Of UserInfo), ICloneable + Friend Const Name_Site As String = "Site" + Friend Const Name_Collection As String = "Collection" + Friend Const Name_Merged As String = "Merged" + Friend Const Name_IsChannel As String = "IsChannel" + Friend Name As String + Friend Site As Sites + Friend File As SFile + Friend Merged As Boolean + Friend IncludedInCollection As Boolean + Friend CollectionName As String + Friend IsChannel As Boolean + Friend Sub New(ByVal _Name As String, ByVal s As Sites, Optional ByVal Collection As String = Nothing, + Optional ByVal _Merged As Boolean = False) + Name = _Name + Site = s + IncludedInCollection = Not Collection.IsEmptyString + CollectionName = Collection + Merged = _Merged + UpdateUserFile() + End Sub + Friend Sub New(ByVal x As EContainer) + Me.New(x.Value, + x.Attribute(Name_Site).Value.FromXML(Of Integer)(CInt(Sites.Undefined)), + x.Attribute(Name_Collection).Value, x.Attribute(Name_Merged).Value.FromXML(Of Boolean)(False)) + IsChannel = x.Attribute(Name_IsChannel).Value.FromXML(Of Boolean)(False) + End Sub + Friend Sub New(ByVal c As API.Reddit.Channel) + Name = c.Name + Site = Sites.Reddit + File = c.File + IsChannel = True + End Sub + Public Shared Widening Operator CType(ByVal x As EContainer) As UserInfo + Return New UserInfo(x) + End Operator + Public Shared Widening Operator CType(ByVal u As UserInfo) As String + Return u.Name + End Operator + Public Shared Operator =(ByVal x As UserInfo, ByVal y As UserInfo) + Return x.Equals(y) + End Operator + Public Shared Operator <>(ByVal x As UserInfo, ByVal y As UserInfo) + Return Not x.Equals(y) + End Operator + Public Overrides Function ToString() As String + Return Name + End Function + Friend Sub UpdateUserFile() + File = New SFile With { + .Separator = "\", + .Path = GetFilePathByParams(), + .Extension = "xml", + .Name = $"{UserDataBase.UserFileAppender}_{Site}_{Name}" + } + End Sub + Private Function GetFilePathByParams() As String + If Merged And IncludedInCollection Then + Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{SettingsFolderName}" + Else + If IncludedInCollection Then + Return $"{Settings.CollectionsPathF.PathNoSeparator}\{CollectionName}\{Site}_{Name}\{SettingsFolderName}" + Else + Return $"{Settings.Site(Site).Path.PathNoSeparator}\{Name}\{SettingsFolderName}" + End If + End If + End Function + Friend Function GetContainer() As EContainer + Return New EContainer("User", Name, {New EAttribute(Name_Site, CInt(Site)), + New EAttribute(Name_Collection, CollectionName), + New EAttribute(Name_Merged, Merged.BoolToInteger), + New EAttribute(Name_IsChannel, IsChannel.BoolToInteger)}) + End Function + Friend Function CompareTo(ByVal Other As UserInfo) As Integer Implements IComparable(Of UserInfo).CompareTo + If Site = Other.Site Then + Return Name.CompareTo(Other.Name) + Else + Return CInt(Site).CompareTo(CInt(Other.Site)) + End If + End Function + Friend Overloads Function Equals(ByVal Other As UserInfo) As Boolean Implements IEquatable(Of UserInfo).Equals + Return Site = Other.Site And Name = Other.Name + End Function + Public Overloads Overrides Function Equals(ByVal Obj As Object) As Boolean + Return Equals(DirectCast(Obj, UserInfo)) + End Function + Friend Function Clone() As Object Implements ICloneable.Clone + Return New UserInfo With { + .Name = Name, + .Site = Site, + .File = File, + .Merged = Merged, + .IncludedInCollection = IncludedInCollection, + .CollectionName = CollectionName + } + End Function + End Structure + Friend Sub ImageHandler(ByVal User As IUserData) + ImageHandler(User, False) + ImageHandler(User, True) + End Sub + Friend Sub ImageHandler(ByVal User As IUserData, ByVal Add As Boolean) + Try + If Add Then + AddHandler User.OnPictureUpdated, AddressOf MainFrame.User_OnPictureUpdated + Else + RemoveHandler User.OnPictureUpdated, AddressOf MainFrame.User_OnPictureUpdated + End If + Catch ex As Exception + End Try + End Sub + Friend Sub CollectionHandler(ByVal [Collection] As UserDataBind) + Try + AddHandler Collection.OnCollectionSelfRemoved, AddressOf MainFrame.RefillList + Catch ex As Exception + End Try + End Sub + Friend Function GetCurrentBuffer() As String + Dim b$ = BufferText + If Not (Not b.IsEmptyString AndAlso b.Length > 4 AndAlso b.StartsWith("http")) Then b = String.Empty + Return b + End Function + Friend Function GetNewVideoURL() As String + Dim b$ = GetCurrentBuffer() + Dim URL$ = InputBox("Enter video URL:", "Download video by URL", b) + If Not URL.IsEmptyString Then Return URL Else Return String.Empty + End Function + Friend Sub DownloadVideoByURL() + If VideoDownloader Is Nothing Then VideoDownloader = New VideosDownloaderForm + If VideoDownloader.Visible Then + VideoDownloader.BringToFront() + Else + VideoDownloader.Show() + End If + End Sub + Friend Function DownloadVideoByURL(ByVal URL As String, ByVal AskForPath As Boolean, ByVal Silent As Boolean) As Boolean + Dim e As New ErrorsDescriber(Not Silent, Not Silent, True, False) + Try + If Not URL.IsEmptyString Then + Dim u As UserMedia = Nothing + If URL.Contains("twitter") Then + u = Twitter.UserData.GetVideoInfo(URL) + ElseIf URL.Contains("redgifs") Then + u = Reddit.UserData.GetVideoInfo(URL) + Else + MsgBoxE("Site of video URL does not recognized" & vbCr & "Operation canceled", MsgBoxStyle.Exclamation, e) + Return False + End If + + If Not u.URL.IsEmptyString Or Not u.URL_BASE.IsEmptyString Then + Dim f As SFile = u.File + If f.Name.IsEmptyString Then f.Name = $"video_{u.Post.ID}" + If f.Extension.IsEmptyString Then f.Extension = "mp4" + If Not Settings.LatestSavingPath.IsEmptyString And + Settings.LatestSavingPath.Value.Exists(SFO.Path, False) Then f.Path = Settings.LatestSavingPath.Value + If AskForPath OrElse Not f.Exists(SFO.Path, False) Then +#Disable Warning BC40000 + f = SFile.SaveAs(f, "Video file destination", True, "mp4", "Video|*.mp4|All files|*.*", EDP.ReturnValue) +#Enable Warning + End If + If Not f.IsEmptyString Then + Settings.LatestSavingPath.Value = f.PathWithSeparator + Dim dURL$ + Dim FileDownloaded As Boolean = False + Using w As New Net.WebClient + For i% = 0 To 1 + If i = 0 Then dURL = u.URL Else dURL = u.URL_BASE + If Not dURL.IsEmptyString Then + Try + w.DownloadFile(dURL, f) + FileDownloaded = True + Exit For + Catch wex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, wex, "DownloadVideoByURL") + End Try + End If + Next + End Using + If FileDownloaded Then + MsgBoxE($"File downloaded to [{f}]",, e) + Return True + Else + MsgBoxE("File does not downloaded", MsgBoxStyle.Critical, e) + End If + Else + MsgBoxE("File destination does not pointed" & vbCr & "Operation canceled",, e) + End If + Else + MsgBoxE("File URL does not found!", MsgBoxStyle.Critical, e) + End If + Else + MsgBoxE("URL is empty", MsgBoxStyle.Exclamation, e) + End If + Return False + Catch ex As Exception + Return ErrorsDescriber.Execute(e, ex, "Downloading video by URL error", False) + End Try + End Function + Friend Sub CheckForReparse() + Try + Dim p As Func(Of IUserData, Boolean) = Function(u) u.DataForReparseExists + With Settings.Users + If .Count > 0 AndAlso .Exists(Function(u) p.Invoke(u)) Then + If MsgBox("Some users contain not parsed data" & vbCr & + "Do you want to start trying to download?", + MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton1, + "Not parsed data found") = MsgBoxResult.Yes Then + Downloader.AddRange(.Where(p).SelectMany(Function(u) If(u.IsCollection, DirectCast(u, UserDataBind).Collections.Where(p), {u})), True) + End If + End If + End With + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "CheckForReparse") + End Try + End Sub + Friend Structure UserBan + Friend ReadOnly Name As String + Friend ReadOnly Reason As String + Friend ReadOnly Exists As Boolean + Friend Sub New(ByVal Value As String) + If Not Value.IsEmptyString Then + Dim v$() = Value.Split("|") + If v.ListExists Then + Name = v(0) + If v.Length > 1 Then Reason = v(1) + Exists = True + End If + End If + End Sub + Friend Sub New(ByVal _Name As String, ByVal _Reason As String) + Name = _Name + Reason = _Reason + Exists = True + End Sub + Public Shared Widening Operator CType(ByVal Value As String) As UserBan + Return New UserBan(Value) + End Operator + Public Shared Widening Operator CType(ByVal b As UserBan) As String + Return b.ToString + End Operator + Public Overrides Function ToString() As String + Return $"{Name}|{Reason}" + End Function + Friend Function Info() As String + If Not Reason.IsEmptyString Then + Return $"[{Name}] ({Reason})" + Else + Return Name + End If + End Function + Public Overrides Function Equals(ByVal Obj As Object) As Boolean + If Not IsNothing(Obj) Then + If TypeOf Obj Is UserBan Then + Return Name = DirectCast(Obj, UserBan).Name + Else + Return Name = New UserBan(CStr(Obj)).Name + End If + End If + Return False + End Function + End Structure + Friend Function UserBanned(ByVal UserNames() As String) As String() + If UserNames.ListExists Then + Dim i% + Dim Found As New List(Of UserBan) + For Each user In UserNames + i = Settings.BlackList.FindIndex(Function(u) u.Name = user) + If i >= 0 Then Found.Add(Settings.BlackList(i)) + Next + If Found.Count = 0 Then + Return New String() {} + Else + Dim m As New MMessage With { + .Title = "Banned user found", + .Buttons = {"Remove from ban and add", "Leave in ban and add", "Skip"}, + .Style = MsgBoxStyle.Exclamation, + .Exists = True + } + If Found.Count = 1 Then + m.Text = $"This user is banned:{vbNewLine}User: {Found(0).Name}" + If Not Found(0).Reason.IsEmptyString Then m.Text.StringAppendLine($"Reason: {Found(0).Reason}") + Else + m.Text = $"These users was banned:{vbNewLine.StringDup(2)}{Found.Select(Function(u) u.Info).ListToString(, vbNewLine)}" + End If + Dim r% = MsgBoxE(m) + If r = 2 Then + Return Found.Select(Function(u) u.Name).ToArray + Else + If r = 0 Then + Settings.BlackList.ListDisposeRemove(Found, False) + Settings.UpdateBlackList() + End If + End If + End If + End If + Return New String() {} + End Function + Friend Function UserBanned(ByVal UserName As String) As Boolean + Return UserBanned({UserName}).ListExists + End Function +End Module \ No newline at end of file diff --git a/SCrawler/My Project/Application.Designer.vb b/SCrawler/My Project/Application.Designer.vb new file mode 100644 index 0000000..54a4c3f --- /dev/null +++ b/SCrawler/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = true + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = false + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.SCrawler.MainFrame + End Sub + End Class +End Namespace diff --git a/SCrawler/My Project/Application.myapp b/SCrawler/My Project/Application.myapp new file mode 100644 index 0000000..dcc4556 --- /dev/null +++ b/SCrawler/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + true + MainFrame + true + 0 + true + 0 + false + \ No newline at end of file diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..151eda4 --- /dev/null +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -0,0 +1,37 @@ +Imports System.Resources +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + + diff --git a/SCrawler/My Project/Resources.Designer.vb b/SCrawler/My Project/Resources.Designer.vb new file mode 100644 index 0000000..6478cdd --- /dev/null +++ b/SCrawler/My Project/Resources.Designer.vb @@ -0,0 +1,243 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SCrawler.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property DBPic_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("DBPic_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Delete() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Delete", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Folder_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Folder_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property GlobeBlue_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("GlobeBlue_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property InfoPic_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("InfoPic_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property NextPIC2() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("NextPIC2", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PencilPic_01_16() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PencilPic_01_16", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PicturePic_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PicturePic_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Pin_32() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Pin_32", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PlusPIC() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PlusPIC", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property PrevPIC2() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("PrevPIC2", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + ''' + Friend ReadOnly Property Rainbow() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("Rainbow", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + ''' + Friend ReadOnly Property RedditIcon() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("RedditIcon", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property RedditPic512() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("RedditPic512", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property Refresh() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("Refresh", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property StarPic_24() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("StarPic_24", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Bitmap. + ''' + Friend ReadOnly Property StartPic_01_Green_16() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("StartPic_01_Green_16", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Looks up a localized resource of type System.Drawing.Icon similar to (Icon). + ''' + Friend ReadOnly Property TwitterIcon() As System.Drawing.Icon + Get + Dim obj As Object = ResourceManager.GetObject("TwitterIcon", resourceCulture) + Return CType(obj,System.Drawing.Icon) + End Get + End Property + End Module +End Namespace diff --git a/SCrawler/My Project/Resources.resx b/SCrawler/My Project/Resources.resx new file mode 100644 index 0000000..4a9250b --- /dev/null +++ b/SCrawler/My Project/Resources.resx @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Content\Pictures\GlobeBlue_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\StarPic_24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PrevPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PicturePic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\NextPIC2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Folder_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PencilPic_01_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\PlusPIC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\InfoPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\DBPic_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Icons\RedditIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Icons\Rainbow.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\Pin_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\StartPic_01_Green_16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Pictures\RedditPic512.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Content\Icons\TwitterIcon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/SCrawler/My Project/Settings.Designer.vb b/SCrawler/My Project/Settings.Designer.vb new file mode 100644 index 0000000..fcfd812 --- /dev/null +++ b/SCrawler/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.SCrawler.My.MySettings + Get + Return Global.SCrawler.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/SCrawler/My Project/Settings.settings b/SCrawler/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/SCrawler/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/SCrawler/My Project/app.manifest b/SCrawler/My Project/app.manifest new file mode 100644 index 0000000..9ce67d2 --- /dev/null +++ b/SCrawler/My Project/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SCrawler/RedditIcon.ico b/SCrawler/RedditIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9ee6a3dd345caaddd87daa550e15164540a35be GIT binary patch literal 67646 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 + + + + Debug + AnyCPU + {4A016FAD-9F07-4957-8BB2-AE86C88BA342} + WinExe + SCrawler.My.MyApplication + SCrawler + SCrawler + 512 + WindowsForms + v4.6.1 + true + true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + AnyCPU + true + full + true + true + bin\Debug\ + + + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + + + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + false + + + On + + + Binary + + + Off + + + On + + + Content\Icons\Rainbow.ico + + + true + true + true + bin\x86\Debug\ + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + full + x86 + + + true + bin\x86\Release\ + true + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + pdbonly + x86 + + + true + true + true + bin\x64\Debug\ + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + full + x64 + + + true + bin\x64\Release\ + true + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + pdbonly + x64 + + + My Project\app.manifest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ChannelViewForm.vb + + + Form + + + DownloadedInfoForm.vb + + + Form + + + CollectionEditorForm.vb + + + Form + + + GlobalSettingsForm.vb + + + Form + + + LabelsForm.vb + + + Form + + + RedditEditorForm.vb + + + Form + + + TwitterEditorForm.vb + + + Form + + + UserCreatorForm.vb + + + Form + + + + + Form + + + MainFrame.vb + Form + + + + + True + Application.myapp + True + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + VideosDownloaderForm.vb + + + Form + + + + + ChannelViewForm.vb + + + DownloadedInfoForm.vb + + + CollectionEditorForm.vb + + + GlobalSettingsForm.vb + + + LabelsForm.vb + + + RedditEditorForm.vb + + + TwitterEditorForm.vb + + + UserCreatorForm.vb + + + MainFrame.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + VideosDownloaderForm.vb + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + {8405896b-2685-4916-bc93-1fb514c323a9} + PersonalUtilities + + + + + PreserveNewest + + + + + + False + Microsoft .NET Framework 4.6.1 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + \ No newline at end of file diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb new file mode 100644 index 0000000..81fffb6 --- /dev/null +++ b/SCrawler/SettingsCLS.vb @@ -0,0 +1,243 @@ +Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.XML.Base +Imports SCrawler.API +Imports SCrawler.API.Base +Friend Class SettingsCLS : Implements IDisposable + Friend ReadOnly Design As XmlFile + Private ReadOnly MyXML As XmlFile + Private ReadOnly MySites As Dictionary(Of Sites, SiteSettings) + Friend ReadOnly Property Users As List(Of IUserData) + Friend ReadOnly Property UsersList As List(Of UserInfo) + Friend Property Channels As Reddit.ChannelsCollection + Friend ReadOnly Property Labels As LabelsKeeper + Friend ReadOnly Property BlackList As List(Of UserBan) + Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt" + Private ReadOnly UsersSettingsFile As SFile = $"{SettingsFolderName}\Users.xml" + Friend Sub New() + Design = New XmlFile("Settings\Design.xml") + Design.DefaultsLoading(False) + MyXML = New XmlFile(Nothing) With {.AutoUpdateFile = True} + Users = New List(Of IUserData) + UsersList = New List(Of UserInfo) + BlackList = New List(Of UserBan) + GlobalPath = New XMLValue(Of SFile)("GlobalPath", New SFile($"{SFile.GetPath(Application.StartupPath).PathWithSeparator}Data\"), MyXML,, + XMLValue(Of SFile).ToFilePath) + MySites = New Dictionary(Of Sites, SiteSettings) From { + {Sites.Reddit, New SiteSettings(Sites.Reddit, MyXML, GlobalPath.Value)}, + {Sites.Twitter, New SiteSettings(Sites.Twitter, MyXML, GlobalPath.Value)} + } + MySites(Sites.Reddit).Responser.Decoders.Add(SymbolsConverter.Converters.Unicode) + MaxLargeImageHeigh = New XMLValue(Of Integer)("MaxLargeImageHeigh", 150, MyXML) + MaxSmallImageHeigh = New XMLValue(Of Integer)("MaxSmallImageHeigh", 15, MyXML) + ViewMode = New XMLValue(Of Integer)("ViewMode", ViewModes.IconLarge, MyXML) + ShowingMode = New XMLValue(Of Integer)("ShowingMode", ShowingModes.All, MyXML) + SeparateVideoFolder = New XMLValue(Of Boolean)("SeparateVideoFolder", True, MyXML) + CollectionsPath = New XMLValue(Of String)("CollectionsPath", "Collections", MyXML) + DefaultTemporary = New XMLValue(Of Boolean)("DefaultTemporary", False, MyXML) + LatestSavingPath = New XMLValue(Of SFile)("LatestSavingPath", Nothing, MyXML,, XMLValue(Of SFile).ToFilePath) + LatestSelectedLabels = New XMLValue(Of String)("LatestSelectedLabels",, MyXML) + LatestSelectedChannel = New XMLValue(Of String)("LatestSelectedChannel",, MyXML) + ChannelsHideExistsUser = New XMLValue(Of Boolean)("ChannelsHideExistsUser", True, MyXML) + + InfoViewMode = New XMLValue(Of Integer)("InfoViewMode", DownloadedInfoForm.ViewModes.Session, MyXML) + + ChannelsImagesRows = New XMLValue(Of Integer)("ChannelsImagesRows", 2, MyXML) + ChannelsImagesColumns = New XMLValue(Of Integer)("ChannelsImagesColumns", 5, MyXML) + + CheckUpdatesAtStart = New XMLValue(Of Boolean)("CheckUpdatesAtStart", True, MyXML) + ShowNewVersionNotification = New XMLValue(Of Boolean)("ShowNewVersionNotification", True, MyXML) + LatestVersion = New XMLValue(Of String)("LatestVersion", String.Empty, MyXML) + + MyXML.DefaultsLoading(False) + If MyXML.ChangesDetected Then MyXML.UpdateData() + Labels = New LabelsKeeper + If Not LatestSelectedLabels.IsEmptyString Then Labels.CurrentSelection.ListAddList(LatestSelectedLabels.Value.StringToList(Of String, List(Of String))("|")) + If BlackListFile.Exists Then + BlackList.ListAddList(IO.File.ReadAllLines(BlackListFile), LAP.NotContainsOnly) + If BlackList.Count > 0 Then BlackList.RemoveAll(Function(b) Not b.Exists) + End If + End Sub + Friend Sub LoadUsers() + Try + Users.Clear() + If UsersSettingsFile.Exists Then + Using x As New XmlFile(UsersSettingsFile, ProtectionLevels.All, False) With {.AllowSameNames = True} + x.LoadData() + x.DefaultsLoading(False) + If x.Count > 0 Then x.ForEach(Sub(xx) UsersList.Add(xx)) + End Using + Dim PNC As Func(Of UserInfo, Boolean) = Function(u) Not u.IncludedInCollection + If UsersList.Count > 0 Then + Dim cUsers As List(Of UserInfo) = UsersList.Where(Function(u) u.IncludedInCollection).ToList + If cUsers.ListExists Then + Dim d As New Dictionary(Of SFile, List(Of UserInfo)) + cUsers = cUsers.ListForEachCopy(Of List(Of UserInfo))(Function(ByVal f As UserInfo, ByVal f_indx As Integer) As UserInfo + If Not d.ContainsKey(f.File.CutPath(2).Path) Then + d.Add(f.File.CutPath(2).Path, New List(Of UserInfo) From {f}) + Else + d(f.File.CutPath(2).Path).Add(f) + End If + Return f + End Function, True) + Dim v% + If d.Count > 0 Then + For Each kv In d + Users.Add(New UserDataBind(kv.Value(0).CollectionName)) + CollectionHandler(DirectCast(Users(Users.Count - 1), UserDataBind)) + For v = 0 To kv.Value.Count - 1 : DirectCast(Users(Users.Count - 1), UserDataBind).Add(kv.Value(v), False) : Next + Next + d.Clear() + End If + End If + + If UsersList.LongCount(PNC) > 0 Then UsersList.Where(PNC).ToList.ForEach(Sub(u) Users.Add(UserDataBase.GetInstance(u, False))) + End If + If Users.Count > 0 Then + Dim t As New List(Of Task) + For Each user As IUserData In Users : t.Add(Task.Run(AddressOf user.LoadUserInformation)) : Next + Task.WaitAll(t.ToArray) + t.Clear() + Dim du As List(Of UserInfo) = (From u As IUserData In Users + Where Not u.IsCollection AndAlso Not u.FileExists + Select DirectCast(u, UserDataBase).User).ToList + If Not du Is Nothing AndAlso du.Count > 0 Then du.ForEach(Sub(u) UsersList.Remove(u)) : du.Clear() + Users.ListDisposeRemoveAll(Function(ByVal u As IUserData) As Boolean + If u.IsCollection Then + With DirectCast(u, UserDataBind) + If .Count > 0 Then + For i% = .Count - 1 To 0 Step -1 + If Not .Item(i).FileExists Then + .Item(i).Delete() + .Collections.RemoveAt(i) + End If + Next + End If + Return Not .FileExists + End With + Else + Return Not u.FileExists + End If + End Function) + End If + End If + If Users.Count > 0 Then + Labels.ToList.ListAddList(Users.SelectMany(Function(u) u.Labels), LAP.NotContainsOnly) + If Labels.NewLabelsExists Then Labels.Update() : Labels.NewLabels.Clear() + End If + Catch ex As Exception + End Try + End Sub + Friend Overloads Sub UpdateUsersList(ByVal u As UserInfo) + Dim i% = UsersList.IndexOf(u) + If i >= 0 Then + UsersList(i) = u + Else + UsersList.Add(u) + End If + UpdateUsersList() + End Sub + Friend Overloads Sub UpdateUsersList() + If UsersList.Count > 0 Then + Using x As New XmlFile With {.AllowSameNames = True, .Name = "Users"} + x.DefaultsLoading(False) + UsersList.ForEach(Sub(u) x.Add(u.GetContainer())) + x.Save(UsersSettingsFile) + End Using + End If + End Sub + Friend Sub UpdateBlackList() + If BlackList.Count > 0 Then + TextSaver.SaveTextToFile(BlackList.ListToString(, vbNewLine), BlackListFile, True, False, EDP.None) + Else + If BlackListFile.Exists Then BlackListFile.Delete() + End If + End Sub + Friend Overloads Function UserExists(ByVal s As Sites, ByVal UserID As String) As Boolean + Dim UserFinderBase As Predicate(Of IUserData) = Function(user) user.Site = s And user.Name = UserID + Dim UserFinder As Predicate(Of IUserData) = Function(ByVal user As IUserData) As Boolean + If user.IsCollection Then + With DirectCast(user, UserDataBind) + Return .Count > 0 AndAlso .Collections.Exists(UserFinderBase) + End With + Else + Return UserFinderBase.Invoke(user) + End If + End Function + Return Users.Count > 0 AndAlso Users.Exists(UserFinder) + End Function + Friend Overloads Function UserExists(ByVal _User As IUserData) As Boolean + Return UserExists(_User.Site, _User.Name) + End Function + Friend Overloads Function UserExists(ByVal _User As UserInfo) As Boolean + Return UserExists(_User.Site, _User.Name) + End Function + Friend ReadOnly Property Site(ByVal s As Sites) As SiteSettings + Get + Return MySites(s) + End Get + End Property + Friend ReadOnly Property GlobalPath As XMLValue(Of SFile) + Friend ReadOnly Property MaxLargeImageHeigh As XMLValue(Of Integer) + Friend ReadOnly Property MaxSmallImageHeigh As XMLValue(Of Integer) + Friend ReadOnly Property ViewMode As XMLValue(Of Integer) + Friend ReadOnly Property ViewModeIsPicture As Boolean + Get + Select Case ViewMode.Value + Case View.LargeIcon, View.SmallIcon : Return True + Case Else : Return False + End Select + End Get + End Property + Friend ReadOnly Property ShowingMode As XMLValue(Of Integer) + Friend ReadOnly Property SeparateVideoFolder As XMLValue(Of Boolean) + Friend ReadOnly Property CollectionsPath As XMLValue(Of String) + Friend ReadOnly Property CollectionsPathF As SFile + Get + If GlobalPath.IsEmptyString Then + Throw New ArgumentNullException("GlobalPath", "GlobalPath does not set") + Else + Return SFile.GetPath($"{GlobalPath.Value.PathWithSeparator}{CollectionsPath.Value}") + End If + End Get + End Property + Friend ReadOnly Property DefaultTemporary As XMLValue(Of Boolean) + Friend ReadOnly Property LatestSavingPath As XMLValue(Of SFile) + Friend ReadOnly Property LatestSelectedLabels As XMLValue(Of String) + Friend ReadOnly Property LatestSelectedChannel As XMLValue(Of String) + Friend ReadOnly Property InfoViewMode As XMLValue(Of Integer) + Friend ReadOnly Property ChannelsImagesRows As XMLValue(Of Integer) + Friend ReadOnly Property ChannelsImagesColumns As XMLValue(Of Integer) + Friend ReadOnly Property ChannelsHideExistsUser As XMLValue(Of Boolean) + Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean) + Friend ReadOnly Property ShowNewVersionNotification As XMLValue(Of Boolean) + Friend ReadOnly Property LatestVersion As XMLValue(Of String) +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + If Not Channels Is Nothing Then + Channels.Dispose() + If Reddit.ChannelsCollection.ChannelsPathCache.Exists(SFO.Path, False) Then _ + Reddit.ChannelsCollection.ChannelsPathCache.Delete(SFO.Path, False, False, EDP.None) + End If + For Each kv In MySites : kv.Value.Dispose() : Next + MySites.Clear() + Users.ListClearDispose + UsersList.Clear() + Design.Dispose() + MyXML.Dispose() + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Overloads Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/TDownloader.vb b/SCrawler/TDownloader.vb new file mode 100644 index 0000000..d144d77 --- /dev/null +++ b/SCrawler/TDownloader.vb @@ -0,0 +1,191 @@ +Imports System.Threading +Imports EOptions = PersonalUtilities.Forms.Toolbars.MyProgress.EnableOptions +Imports SCrawler.API +Imports SCrawler.API.Base +Friend Class TDownloader : Implements IDisposable + Friend Event OnJobsChange(ByVal JobsCount As Integer) + Friend Event OnDownloadCountChange() + Friend Event OnDownloading(ByVal Value As Boolean) + Private TokenSource As CancellationTokenSource + Private ReadOnly Items As List(Of IUserData) + Friend ReadOnly Property Downloaded As List(Of IUserData) + Private ReadOnly NProv As IFormatProvider + Private _Working As Boolean = False + Friend ReadOnly Property Working As Boolean + Get + Return _Working + End Get + End Property + Private DThread As Thread + Friend ReadOnly Property Count As Integer + Get + Return Items.Count + End Get + End Property + Friend Sub New() + Items = New List(Of IUserData) + Downloaded = New List(Of IUserData) + NProv = New ANumbers(ANumbers.Modes.USA) With { + .FormatMode = ANumbers.Formats.Number, + .GroupSize = 3, + .GroupSeparator = ANumbers.DefaultGroupSeparator, + .DecimalDigits = 0 + } + End Sub + Friend Sub [Start]() + If Not _Working AndAlso Count > 0 AndAlso Not If(DThread?.IsAlive, False) Then + DThread = New Thread(New ThreadStart(AddressOf StartDownloading)) + DThread.SetApartmentState(ApartmentState.MTA) + DThread.Start() + End If + End Sub + Private Sub StartDownloading() + Dim Token As CancellationToken + RaiseEvent OnDownloading(True) + Try + _Working = True + TokenSource = New CancellationTokenSource + Token = TokenSource.Token + MainProgress.TotalCount = 0 + MainProgress.CurrentCounter = 0 + Do While Count > 0 + Token.ThrowIfCancellationRequested() + UpdateJobsLabel() + DownloadData(Token) + Token.ThrowIfCancellationRequested() + Thread.Sleep(500) + Loop + MainProgress.InformationTemporary = "All data downloaded" + Catch oex As OperationCanceledException When Token.IsCancellationRequested + MainProgress.InformationTemporary = "Downloading canceled" + Catch ex As Exception + MainProgress.InformationTemporary = "Downloading error" + ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.Start") + Finally + _Working = False + TokenSource = Nothing + UpdateJobsLabel() + RaiseEvent OnDownloading(False) + End Try + End Sub + Friend Sub [Stop]() + If _Working Then TokenSource.Cancel() + End Sub + Private Sub UpdateJobsLabel() + RaiseEvent OnJobsChange(Count) + End Sub + Private _CurrentDownloadingTasks As Integer = 0 + Private Sub DownloadData(ByVal Token As CancellationToken) + Try + If Items.Count > 0 Then + Const nf As ANumbers.Formats = ANumbers.Formats.Number + Dim t As New List(Of Task) + Dim i% = -1 + For Each _Item As IUserData In Items + i += 1 + If i > 4 Then Exit For + Token.ThrowIfCancellationRequested() + t.Add(Task.Run(Sub() _Item.DownloadData(Token))) + Next + If t.Count > 0 Then + _CurrentDownloadingTasks = t.Count + With MainProgress + .Enabled(EOptions.All) = True + .Information = $"Downloading {_CurrentDownloadingTasks.NumToString(nf, NProv)}/{Items.Count.NumToString(nf, NProv)} profiles' data" + .InformationTemporary = .Information + End With + Token.ThrowIfCancellationRequested() + Task.WaitAll(t.ToArray) + Dim dcc As Boolean = False + If Count > 0 And Count >= t.Count Then + For i = t.Count - 1 To 0 Step -1 + With Items(i) + If Not .IsCollection AndAlso .DownloadedTotal(False) > 0 Then + If Not Downloaded.Contains(.Self) Then Downloaded.Add(GetUserFromMainCollection(.Self)) + dcc = True + End If + Items.RemoveAt(i) + End With + Next + End If + If dcc Then Downloaded.RemoveAll(Function(u) u Is Nothing) + If dcc And Downloaded.Count > 0 Then RaiseEvent OnDownloadCountChange() + t.Clear() + End If + End If + Catch aoex As ArgumentOutOfRangeException + ErrorsDescriber.Execute(EDP.SendInLog, aoex, $"TDownloader.DownloadData: index out of range ({Count})") + Catch oex As OperationCanceledException When Token.IsCancellationRequested + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendInLog, ex, "TDownloader.DownloadData") + Finally + MainProgress.Enabled(EOptions.ProgressBar) = False + End Try + End Sub + Private Function GetUserFromMainCollection(ByVal User As IUserData) As IUserData + Dim uSimple As Predicate(Of IUserData) = Function(u) u.Equals(DirectCast(User, UserDataBase)) + Dim uCol As Predicate(Of IUserData) = Function(ByVal u As IUserData) As Boolean + If u.IsCollection Then + Return DirectCast(u, UserDataBind).Collections.Exists(uSimple) + Else + Return False + End If + End Function + Dim uu As Predicate(Of IUserData) + If User.IncludedInCollection Then uu = uCol Else uu = uSimple + Dim i% = Settings.Users.FindIndex(uu) + If i >= 0 Then + If Settings.Users(i).IsCollection Then + With DirectCast(Settings.Users(i), UserDataBind) + i = .Collections.FindIndex(uSimple) + If i >= 0 Then Return .Collections(i) + End With + Else + Return Settings.Users(i) + End If + End If + Return Nothing + End Function + Friend Sub Add(ByVal Item As IUserData) + If Not Items.Contains(Item) Then + If Item.IsCollection Then Item.DownloadData(Nothing) Else Items.Add(Item) + UpdateJobsLabel() + If Not _Working Then Start() + End If + End Sub + Friend Sub AddRange(ByVal _Items As IEnumerable(Of IUserData), Optional ByVal ReparseOnly As Boolean = False) + If _Items.ListExists Then + For i% = 0 To _Items.Count - 1 + 'If i = 5 Then UpdateJobsLabel() : Start() + If ReparseOnly Then _Items(i).DownloadReparseOnly = True + If _Items(i).IsCollection Then _Items(i).DownloadData(Nothing) Else Items.Add(_Items(i)) + Next + UpdateJobsLabel() + Start() + End If + End Sub + Friend Sub UserRemove(ByVal _Item As IUserData) + If Downloaded.Count > 0 AndAlso Downloaded.Contains(_Item) Then Downloaded.Remove(_Item) : RaiseEvent OnDownloadCountChange() + End Sub +#Region "IDisposable Support" + Private disposedValue As Boolean = False + Protected Overridable Sub Dispose(ByVal disposing As Boolean) + If Not disposedValue Then + If disposing Then + [Stop]() + Items.Clear() + Downloaded.Clear() + End If + disposedValue = True + End If + End Sub + Protected Overrides Sub Finalize() + Dispose(False) + MyBase.Finalize() + End Sub + Friend Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub +#End Region +End Class \ No newline at end of file diff --git a/SCrawler/UserImage.vb b/SCrawler/UserImage.vb new file mode 100644 index 0000000..31bdd3f --- /dev/null +++ b/SCrawler/UserImage.vb @@ -0,0 +1,82 @@ +Imports PersonalUtilities.Tools +Friend Class UserImage : Inherits ImageRenderer + Friend Const ImagePrefix As String = "UserPicture" + Friend Const ImagePostfix_Large As String = "_Large" + Friend Const ImagePostfix_Small As String = "_Small" + Private _LargeAddress As SFile + Private _SmallAddress As SFile + Friend Sub New(ByVal _ImgOriginal As SFile, ByVal Destination As SFile, Optional ByVal GenerateLargeSmallPictures As Boolean = True) + MyBase.New(_ImgOriginal) + Dim f As SFile = Destination + f.Path = f.PathWithSeparator & "Pictures" + f.Name = ImagePrefix + f.Extension = "jpg" + Address = f + _LargeAddress = Address + _LargeAddress.Name &= ImagePostfix_Large + _SmallAddress = Address + _SmallAddress.Name &= ImagePostfix_Small + If GenerateLargeSmallPictures Then + GetImage(Settings.MaxSmallImageHeigh.Value, True) + GetImage(Settings.MaxLargeImageHeigh.Value, False) + End If + End Sub + Friend Sub New(ByVal _ImgOriginal As SFile, ByVal _ImgLarge As SFile, ByVal _ImgSmall As SFile, ByVal Destination As SFile) + Me.New(_ImgOriginal, Destination, False) + Dim i As New ImageRenderer(_ImgLarge) + ResizedImages.Add(i.Size, i) + i = New ImageRenderer(_ImgSmall) + ResizedImages.Add(i.Size, i) + _LargeAddress = _ImgLarge + _SmallAddress = _ImgSmall + End Sub + ''' + Friend ReadOnly Property SmallSize As Size + Get + Return GetImage(Settings.MaxSmallImageHeigh.Value, True).Size + End Get + End Property + ''' + Friend ReadOnly Property Small As ImageRenderer + Get + Return GetImage(Settings.MaxSmallImageHeigh.Value, True) + End Get + End Property + ''' + Friend ReadOnly Property LargeSize As Size + Get + Return GetImage(Settings.MaxLargeImageHeigh.Value, False).Size + End Get + End Property + ''' + Friend ReadOnly Property Large As ImageRenderer + Get + Return GetImage(Settings.MaxLargeImageHeigh.Value, False) + End Get + End Property + ''' + ''' + Private Shadows Function GetImage(ByVal h As Integer, ByVal IsSmall As Boolean) As ImageRenderer + With ResizedImages + If .Count > 0 Then + Dim ki% = .Keys.ToList.FindIndex(Function(s) s.Height = h) + If ki >= 0 Then Return .Item(.Keys(ki)) + End If + FitToHeight(h) + If .Count = 0 Then + Throw New ArgumentOutOfRangeException("ResizedImages", "No resized images found") + Else + With .Item(.Keys(.Keys.Count - 1)) + .Address = IIf(IsSmall, _SmallAddress, _LargeAddress) + .Save() + End With + Return .Item(.Keys(.Keys.Count - 1)) + End If + End With + End Function + Public Overrides Sub Save() + MyBase.Save() + Small.Save(_SmallAddress) + Large.Save(_LargeAddress) + End Sub +End Class \ No newline at end of file diff --git a/SCrawler/VideosDownloaderForm.Designer.vb b/SCrawler/VideosDownloaderForm.Designer.vb new file mode 100644 index 0000000..dbd8770 --- /dev/null +++ b/SCrawler/VideosDownloaderForm.Designer.vb @@ -0,0 +1,158 @@ + +Partial Friend Class VideosDownloaderForm : Inherits System.Windows.Forms.Form + + 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 + Private components As System.ComponentModel.IContainer + + Private Sub InitializeComponent() + Dim SEP_1 As System.Windows.Forms.ToolStripSeparator + Dim SEP_2 As System.Windows.Forms.ToolStripSeparator + Me.ToolbarTOP = New System.Windows.Forms.ToolStrip() + Me.BTT_ADD = New System.Windows.Forms.ToolStripButton() + Me.BTT_ADD_LIST = New System.Windows.Forms.ToolStripButton() + Me.BTT_DELETE = New System.Windows.Forms.ToolStripButton() + Me.BTT_DOWN = New System.Windows.Forms.ToolStripButton() + Me.BTT_OPEN_PATH = New System.Windows.Forms.ToolStripButton() + Me.ToolbarBOTTOM = New System.Windows.Forms.StatusStrip() + Me.PR_V = New System.Windows.Forms.ToolStripProgressBar() + Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() + Me.LIST_VIDEOS = New System.Windows.Forms.ListBox() + SEP_1 = New System.Windows.Forms.ToolStripSeparator() + SEP_2 = New System.Windows.Forms.ToolStripSeparator() + Me.ToolbarTOP.SuspendLayout() + Me.ToolbarBOTTOM.SuspendLayout() + Me.SuspendLayout() + ' + 'SEP_1 + ' + SEP_1.Name = "SEP_1" + SEP_1.Size = New System.Drawing.Size(6, 25) + ' + 'SEP_2 + ' + SEP_2.Name = "SEP_2" + SEP_2.Size = New System.Drawing.Size(6, 25) + ' + 'ToolbarTOP + ' + Me.ToolbarTOP.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden + Me.ToolbarTOP.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_ADD, Me.BTT_ADD_LIST, Me.BTT_DELETE, SEP_1, Me.BTT_DOWN, SEP_2, Me.BTT_OPEN_PATH}) + Me.ToolbarTOP.Location = New System.Drawing.Point(0, 0) + Me.ToolbarTOP.Name = "ToolbarTOP" + Me.ToolbarTOP.Size = New System.Drawing.Size(524, 25) + Me.ToolbarTOP.TabIndex = 0 + ' + 'BTT_ADD + ' + Me.BTT_ADD.AutoToolTip = False + Me.BTT_ADD.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD.Name = "BTT_ADD" + Me.BTT_ADD.Size = New System.Drawing.Size(75, 22) + Me.BTT_ADD.Text = "Add (Ins)" + ' + 'BTT_ADD_LIST + ' + Me.BTT_ADD_LIST.AutoToolTip = False + Me.BTT_ADD_LIST.Image = Global.SCrawler.My.Resources.Resources.PlusPIC + Me.BTT_ADD_LIST.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_ADD_LIST.Name = "BTT_ADD_LIST" + Me.BTT_ADD_LIST.Size = New System.Drawing.Size(67, 22) + Me.BTT_ADD_LIST.Text = "Add list" + ' + 'BTT_DELETE + ' + Me.BTT_DELETE.AutoToolTip = False + Me.BTT_DELETE.Image = Global.SCrawler.My.Resources.Resources.Delete + Me.BTT_DELETE.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DELETE.Name = "BTT_DELETE" + Me.BTT_DELETE.Size = New System.Drawing.Size(83, 22) + Me.BTT_DELETE.Text = "Delete (F8)" + ' + 'BTT_DOWN + ' + Me.BTT_DOWN.AutoToolTip = False + Me.BTT_DOWN.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_DOWN.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_DOWN.Name = "BTT_DOWN" + Me.BTT_DOWN.Size = New System.Drawing.Size(104, 22) + Me.BTT_DOWN.Text = "Download (F5)" + ' + 'BTT_OPEN_PATH + ' + Me.BTT_OPEN_PATH.AutoToolTip = False + Me.BTT_OPEN_PATH.Image = Global.SCrawler.My.Resources.Resources.Folder_32 + Me.BTT_OPEN_PATH.ImageTransparentColor = System.Drawing.Color.Magenta + Me.BTT_OPEN_PATH.Name = "BTT_OPEN_PATH" + Me.BTT_OPEN_PATH.Size = New System.Drawing.Size(120, 22) + Me.BTT_OPEN_PATH.Text = "Open saving path" + ' + 'ToolbarBOTTOM + ' + Me.ToolbarBOTTOM.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.PR_V, Me.LBL_STATUS}) + Me.ToolbarBOTTOM.Location = New System.Drawing.Point(0, 339) + Me.ToolbarBOTTOM.Name = "ToolbarBOTTOM" + Me.ToolbarBOTTOM.Size = New System.Drawing.Size(524, 22) + Me.ToolbarBOTTOM.TabIndex = 1 + ' + 'PR_V + ' + Me.PR_V.Name = "PR_V" + Me.PR_V.Size = New System.Drawing.Size(200, 16) + Me.PR_V.Visible = False + ' + 'LBL_STATUS + ' + Me.LBL_STATUS.Name = "LBL_STATUS" + Me.LBL_STATUS.Size = New System.Drawing.Size(0, 17) + ' + 'LIST_VIDEOS + ' + Me.LIST_VIDEOS.Dock = System.Windows.Forms.DockStyle.Fill + Me.LIST_VIDEOS.FormattingEnabled = True + Me.LIST_VIDEOS.Location = New System.Drawing.Point(0, 25) + Me.LIST_VIDEOS.Name = "LIST_VIDEOS" + Me.LIST_VIDEOS.Size = New System.Drawing.Size(524, 314) + Me.LIST_VIDEOS.TabIndex = 2 + ' + 'VideosDownloaderForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(524, 361) + Me.Controls.Add(Me.LIST_VIDEOS) + Me.Controls.Add(Me.ToolbarBOTTOM) + Me.Controls.Add(Me.ToolbarTOP) + Me.KeyPreview = True + Me.MinimumSize = New System.Drawing.Size(540, 400) + Me.Name = "VideosDownloaderForm" + Me.ShowIcon = False + Me.Text = "Download Videos" + Me.ToolbarTOP.ResumeLayout(False) + Me.ToolbarTOP.PerformLayout() + Me.ToolbarBOTTOM.ResumeLayout(False) + Me.ToolbarBOTTOM.PerformLayout() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Private WithEvents ToolbarTOP As ToolStrip + Private WithEvents BTT_ADD As ToolStripButton + Private WithEvents BTT_ADD_LIST As ToolStripButton + Private WithEvents BTT_DELETE As ToolStripButton + Private WithEvents ToolbarBOTTOM As StatusStrip + Private WithEvents PR_V As ToolStripProgressBar + Private WithEvents LBL_STATUS As ToolStripStatusLabel + Private WithEvents LIST_VIDEOS As ListBox + Private WithEvents BTT_DOWN As ToolStripButton + Private WithEvents BTT_OPEN_PATH As ToolStripButton +End Class \ No newline at end of file diff --git a/SCrawler/VideosDownloaderForm.resx b/SCrawler/VideosDownloaderForm.resx new file mode 100644 index 0000000..d0894be --- /dev/null +++ b/SCrawler/VideosDownloaderForm.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + False + + + False + + + 17, 17 + + + 124, 17 + + \ No newline at end of file diff --git a/SCrawler/VideosDownloaderForm.vb b/SCrawler/VideosDownloaderForm.vb new file mode 100644 index 0000000..47f57d7 --- /dev/null +++ b/SCrawler/VideosDownloaderForm.vb @@ -0,0 +1,127 @@ +Imports System.ComponentModel +Imports PersonalUtilities.Forms +Friend Class VideosDownloaderForm + Private MyView As FormsView + Private ReadOnly MyPR As Toolbars.MyProgress + Private ReadOnly UrlList As List(Of String) + Private ReadOnly DownloadingUrlsFile As SFile = $"{SettingsFolderName}\VideosUrls.txt" + Friend Sub New() + InitializeComponent() + UrlList = New List(Of String) + MyPR = New Toolbars.MyProgress(ToolbarBOTTOM, PR_V, LBL_STATUS, "Downloading video") + If DownloadingUrlsFile.Exists Then + UrlList.ListAddList(DownloadingUrlsFile.GetText.StringToList(Of String, List(Of String))(Environment.NewLine), LAP.NotContainsOnly) + End If + End Sub + Private Sub VideosDownloaderForm_Load(sender As Object, e As EventArgs) Handles Me.Load + Try + MyView = New FormsView(Me) + MyView.ImportFromXML(Settings.Design) + MyView.SetMeSize() + RefillList() + Catch ex As Exception + End Try + End Sub + Private Sub VideosDownloaderForm_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing + e.Cancel = True + Hide() + End Sub + Private Sub VideosDownloaderForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed + If Not MyView Is Nothing Then MyView.Dispose(Settings.Design) + If UrlList.Count > 0 Then + TextSaver.SaveTextToFile(UrlList.ListToString(, Environment.NewLine), DownloadingUrlsFile, True,, EDP.SendInLog) + End If + UrlList.Clear() + End Sub + Private Sub VideosDownloaderForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown + Dim b As Boolean = True + Select Case e.KeyCode + Case Keys.Insert : AddVideo() + Case Keys.F5 : DownloadVideos() + Case Keys.F8 : BTT_DELETE_Click(Nothing, EventArgs.Empty) + Case Else : b = False + End Select + If b Then e.Handled = True + End Sub + Private Sub RefillList() + Try + With LIST_VIDEOS + .Items.Clear() + If UrlList.Count > 0 Then UrlList.ForEach(Sub(u) .Items.Add(u)) + If .Items.Count > 0 And _LatestSelected >= 0 And _LatestSelected <= .Items.Count - 1 Then .SelectedIndex = _LatestSelected + End With + Catch ex As Exception + ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Error on list refill") + End Try + End Sub + Private Sub BTT_ADD_Click(sender As Object, e As EventArgs) Handles BTT_ADD.Click + AddVideo() + End Sub + Private Sub AddVideo() + Dim URL$ = GetNewVideoURL() + If Not URL.IsEmptyString Then + If Not UrlList.Contains(URL) Then + UrlList.Add(URL) + RefillList() + Else + MsgBoxE("This URL already added to list") + End If + End If + End Sub + Private Sub BTT_ADD_LIST_Click(sender As Object, e As EventArgs) Handles BTT_ADD_LIST.Click + Dim l$ = InputBoxE("Enter URLs (new line as delimiter):", "URLs list", GetCurrentBuffer(),,,,,, True) + If Not l.IsEmptyString Then + Dim ub% = UrlList.Count + UrlList.ListAddList(l.StringToList(Of String, List(Of String))(Environment.NewLine)) + If Not UrlList.Count = ub Then RefillList() + End If + End Sub + Private Sub BTT_DELETE_Click(sender As Object, e As EventArgs) Handles BTT_DELETE.Click + If _LatestSelected >= 0 And _LatestSelected <= UrlList.Count - 1 Then + If MsgBoxE({$"Do you really want to delete video URL:{vbCr}{UrlList(_LatestSelected)}", "Deleting URL..."}, + MsgBoxStyle.Exclamation + MsgBoxStyle.YesNo).DialogResult = MsgBoxResult.Yes Then + UrlList.RemoveAt(_LatestSelected) + RefillList() + End If + Else + MsgBoxE("URL does not selected", MsgBoxStyle.Exclamation) + End If + End Sub + Private Sub BTT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_DOWN.Click + DownloadVideos() + End Sub + Private Sub DownloadVideos() + If UrlList.Count > 0 Then + MyPR.TotalCount = UrlList.Count + MyPR.Enabled = True + Dim IsFirst As Boolean = True + For i% = UrlList.Count - 1 To 0 Step -1 + If DownloadVideoByURL(UrlList(i), IsFirst, True) Then UrlList.RemoveAt(i) + MyPR.Perform() + IsFirst = False + Next + MyPR.Done() + RefillList() + MyPR.Enabled = False + Else + MsgBoxE("No one video added", MsgBoxStyle.Exclamation) + End If + End Sub + Private _LatestSelected As Integer = -1 + Private Sub LIST_VIDEOS_SelectedIndexChanged(sender As Object, e As EventArgs) Handles LIST_VIDEOS.SelectedIndexChanged + _LatestSelected = LIST_VIDEOS.SelectedIndex + End Sub + Private Sub BTT_OPEN_PATH_Click(sender As Object, e As EventArgs) Handles BTT_OPEN_PATH.Click + With Settings.LatestSavingPath + If Not .Value.IsEmptyString Then + If .Value.Exists(SFO.Path, False) Then + .Value.Open(SFO.Path, EDP.ShowMainMsg) + Else + MsgBoxE($"Path [{ .Value}] does not exists!", MsgBoxStyle.Exclamation) + End If + Else + MsgBoxE("Saving path does not set!", MsgBoxStyle.Exclamation) + End If + End With + End Sub +End Class \ No newline at end of file