From d65666cdfcae2d98f59afdd069ebd8fa9773e5cc Mon Sep 17 00:00:00 2001 From: Iristyle Date: Thu, 4 Apr 2013 08:54:47 -0400 Subject: [PATCH] feat(SublimeText2.UtilPackages): cache packages --- .../PackageCache/AdvancedNewFile/.gitignore | 2 + .../AdvancedNewFile/AdvancedNewFile.py | 581 ++ .../AdvancedNewFile.sublime-settings | 80 + .../PackageCache/AdvancedNewFile/CHANGELOG.md | 51 + .../Default (Linux).sublime-keymap | 15 + .../Default (OSX).sublime-keymap | 15 + .../Default (Windows).sublime-keymap | 16 + .../PackageCache/AdvancedNewFile/LICENSE.txt | 18 + .../AdvancedNewFile/Main.sublime-menu | 90 + .../PackageCache/AdvancedNewFile/README.md | 181 + .../AdvancedNewFile/messages.json | 7 + .../AdvancedNewFile/messages/1.txt | 1 + .../AdvancedNewFile/messages/2.txt | 10 + .../AdvancedNewFile/messages/3.txt | 12 + .../AdvancedNewFile/messages/4.txt | 12 + .../AdvancedNewFile/messages/install.txt | 9 + .../AdvancedNewFile/package-metadata.json | 1 + .../tools/PackageCache/ConsoleExec/.gitignore | 7 + .../tools/PackageCache/ConsoleExec/LICENSE | 19 + .../tools/PackageCache/ConsoleExec/README.md | 74 + .../PackageCache/ConsoleExec/console_exec.py | 107 + .../ConsoleExec/package-metadata.json | 1 + .../PackageCache/ConsoleExec/packages.json | 20 + .../PackageCache/EncodingHelper/.gitignore | 4 + .../EncodingHelper/EncodingHelper.py | 299 + .../EncodingHelper.sublime-settings | 13 + .../EncodingHelper/Main.sublime-menu | 291 + .../EncodingHelper/Settings/Main.sublime-menu | 39 + .../EncodingHelper/chardet/COPYING | 504 ++ .../EncodingHelper/chardet/__init__.py | 26 + .../EncodingHelper/chardet/big5freq.py | 923 ++++ .../EncodingHelper/chardet/big5prober.py | 41 + .../chardet/chardistribution.py | 200 + .../chardet/charsetgroupprober.py | 96 + .../EncodingHelper/chardet/charsetprober.py | 60 + .../chardet/codingstatemachine.py | 56 + .../EncodingHelper/chardet/constants.py | 47 + .../EncodingHelper/chardet/escprober.py | 79 + .../EncodingHelper/chardet/escsm.py | 240 + .../EncodingHelper/chardet/eucjpprober.py | 85 + .../EncodingHelper/chardet/euckrfreq.py | 594 ++ .../EncodingHelper/chardet/euckrprober.py | 41 + .../EncodingHelper/chardet/euctwfreq.py | 426 ++ .../EncodingHelper/chardet/euctwprober.py | 41 + .../EncodingHelper/chardet/gb2312freq.py | 471 ++ .../EncodingHelper/chardet/gb2312prober.py | 41 + .../EncodingHelper/chardet/hebrewprober.py | 269 + .../EncodingHelper/chardet/jisfreq.py | 567 ++ .../EncodingHelper/chardet/jpcntx.py | 210 + .../chardet/langbulgarianmodel.py | 228 + .../chardet/langcyrillicmodel.py | 329 ++ .../EncodingHelper/chardet/langgreekmodel.py | 225 + .../EncodingHelper/chardet/langhebrewmodel.py | 201 + .../chardet/langhungarianmodel.py | 225 + .../EncodingHelper/chardet/langthaimodel.py | 200 + .../EncodingHelper/chardet/latin1prober.py | 136 + .../EncodingHelper/chardet/mbcharsetprober.py | 82 + .../EncodingHelper/chardet/mbcsgroupprober.py | 50 + .../EncodingHelper/chardet/mbcssm.py | 514 ++ .../EncodingHelper/chardet/sbcharsetprober.py | 106 + .../EncodingHelper/chardet/sbcsgroupprober.py | 64 + .../EncodingHelper/chardet/sjisprober.py | 85 + .../EncodingHelper/chardet/test.py | 20 + .../chardet/universaldetector.py | 154 + .../EncodingHelper/chardet/utf8prober.py | 76 + .../PackageCache/EncodingHelper/license.txt | 19 + .../PackageCache/EncodingHelper/readme.md | 63 + .../Default (Linux).sublime-keymap | 8 + .../Default (OSX).sublime-keymap | 8 + .../Default (Windows).sublime-keymap | 8 + .../KeymapManager/KeymapManager.py | 138 + .../KeymapManager.sublime-settings | 4 + .../KeymapManager/Main.sublime-menu | 13 + .../PackageCache/KeymapManager/README.md | 4 + .../KeymapManager/package-metadata.json | 1 + .../tools/PackageCache/MoveTab/.gitignore | 2 + .../MoveTab/Default (Linux).sublime-keymap | 22 + .../MoveTab/Default (OSX).sublime-keymap | 22 + .../MoveTab/Default (Windows).sublime-keymap | 22 + .../MoveTab/Default.sublime-commands | 22 + .../tools/PackageCache/MoveTab/LICENSE.txt | 18 + .../tools/PackageCache/MoveTab/README.md | 33 + .../tools/PackageCache/MoveTab/move_tab.py | 62 + .../MoveTab/package-metadata.json | 1 + .../Default (Linux).sublime-keymap | 4 + .../Default (OSX).sublime-keymap | 4 + .../Default (Windows).sublime-keymap | 4 + .../PackageCache/Navigation History/README.md | 44 + .../Navigation History/navigation-history.py | 179 + .../Navigation History/package-metadata.json | 1 + .../Open Recent Files/Default.sublime-keymap | 3 + .../PackageCache/Open Recent Files/README.md | 8 + .../Open Recent Files/open_recent_files.py | 14 + .../Open Recent Files/package-metadata.json | 1 + .../PackageCache/OpenSearchResult/.gitignore | 2 + .../Base File (OSX).sublime-settings | 5 + .../OpenSearchResult/CONTRIBUTORS.md | 5 + .../OpenSearchResult/Default.sublime-keymap | 7 + .../PackageCache/OpenSearchResult/LICENSE.txt | 18 + .../PackageCache/OpenSearchResult/README.md | 26 + .../OpenSearchResult/open_search_result.py | 126 + .../OpenSearchResult/package-metadata.json | 1 + .../PackageCache/OpenSearchResult/util.py | 36 + .../Package Control/Default.sublime-commands | 64 + .../Package Control/Main.sublime-menu | 45 + .../Package Control/Package Control.py | 4810 +++++++++++++++++ .../Package Control.sublime-settings | 138 + .../certs/1c5282418e2cb4989cd6beddcdbab0b5 | 113 + .../certs/7f4f8622b4fd001c7f648e09aae7edaa | 165 + .../certs/897abe0b41fd2f64e9e2e351cbc36d76 | 285 + .../Package Control/certs/ca-bundle.crt | 563 ++ .../certs/d867a7b2aecc46f9c31afc4f2f50de05 | 197 + .../Package Control/example-messages.json | 5 + .../Package Control/example-packages.json | 54 + .../Package Control/example-repositories.json | 60 + .../Package Control/lib/all/semver.py | 86 + .../Package Control/lib/windows/ntlm/U32.py | 113 + .../lib/windows/ntlm/__init__.py | 0 .../Package Control/lib/windows/ntlm/des.py | 92 + .../Package Control/lib/windows/ntlm/des_c.py | 328 ++ .../lib/windows/ntlm/des_data.py | 348 ++ .../Package Control/lib/windows/ntlm/ntlm.py | 466 ++ .../Package Control/messages.json | 4 + .../Package Control/messages/1.3.0.txt | 16 + .../Package Control/messages/1.6.0.txt | 95 + .../Package Control/package-metadata.json | 5 + .../Package Control/readme.creole | 43 + .../Default (Linux).sublime-keymap | 6 + .../Default (OSX).sublime-keymap | 6 + .../Default (Windows).sublime-keymap | 6 + .../Default.sublime-commands | 6 + .../PackageCache/RecentActiveFiles/README.md | 18 + .../RecentActiveFiles/RecentActiveFiles.py | 40 + .../RecentActiveFiles/package-metadata.json | 1 + .../Search Anywhere/Context.sublime-menu | 47 + .../Search Anywhere/Default.sublime-commands | 26 + .../Search Anywhere/Main.sublime-menu | 55 + .../PackageCache/Search Anywhere/README.md | 25 + .../Search Anywhere/messages.json | 3 + .../Search Anywhere/messages/install.txt | 9 + .../Search Anywhere/package-metadata.json | 1 + .../Search Anywhere/searchanywhere.py | 160 + .../Search Anywhere/searchengines.json | 55 + .../SideBarEnhancements/.gitignore | 3 + .../Commands.sublime-commands | 84 + .../Default.sublime-keymap | 10 + .../SideBarEnhancements/Main.sublime-menu | 88 + .../SideBarEnhancements/Side Bar.sublime-menu | 116 + .../Side Bar.sublime-settings | 32 + .../SideBar Results.hidden-tmLanguage | 50 + .../SideBarEnhancements/SideBar.py | 1502 +++++ .../SideBarEnhancements/StatusBarFileSize.py | 24 + .../StatusBarModifiedTime.py | 25 + .../Side Bar Mount Point.sublime-menu.txt | 4 + .../disable_default/Side Bar.sublime-menu.txt | 11 + .../SideBarEnhancements/hurry/PKG-INFO | 71 + .../SideBarEnhancements/hurry/README.txt | 47 + .../SideBarEnhancements/hurry/__init__.py | 0 .../SideBarEnhancements/hurry/filesize.py | 110 + .../SideBarEnhancements/license.txt | 19 + .../messages/11.13.2012.1305.0.txt | 21 + .../SideBarEnhancements/package-metadata.json | 1 + .../SideBarEnhancements/readme.md | 193 + .../send2trash/__init__.py | 14 + .../send2trash/plat_osx.py | 44 + .../send2trash/plat_other.py | 154 + .../send2trash/plat_win.py | 56 + .../sidebar/SideBarItem.py | 480 ++ .../sidebar/SideBarProject.py | 119 + .../sidebar/SideBarSelection.py | 186 + .../SideBarEnhancements/sidebar/__init__.py | 0 .../sidebar/desktop/__init__.py | 281 + .../sidebar/desktop/dialog.py | 549 ++ .../sidebar/desktop/windows.py | 273 + .../Default (Linux).sublime-keymap | 7 + .../Default (OSX).sublime-keymap | 7 + .../Default (Windows).sublime-keymap | 7 + .../Sublime Files/Default.sublime-commands | 7 + .../Sublime Files/Main.sublime-menu | 83 + .../PackageCache/Sublime Files/README.md | 66 + .../SublimeFiles.sublime-settings | 10 + .../PackageCache/Sublime Files/messages.json | 3 + .../Sublime Files/package-metadata.json | 1 + .../Sublime Files/sublime_files.py | 176 + .../tools/PackageCache/Theme - Soda/README.md | 102 + .../Theme - Soda/Soda Dark.sublime-theme | 969 ++++ .../Theme - Soda/Soda Dark/.gitignore | 1 + .../Soda Dark/Widget - Soda Dark.stTheme | 30 + .../Widget - Soda Dark.sublime-settings | 4 + .../Soda Dark/autocomplete-row-selected.png | Bin 0 -> 172 bytes .../autocomplete-row-selected@2x.png | Bin 0 -> 310 bytes .../Theme - Soda/Soda Dark/bookmark.png | Bin 0 -> 2855 bytes .../Soda Dark/btn-group-left-on.png | Bin 0 -> 298 bytes .../Soda Dark/btn-group-left-on@2x.png | Bin 0 -> 721 bytes .../Theme - Soda/Soda Dark/btn-group-left.png | Bin 0 -> 325 bytes .../Soda Dark/btn-group-left@2x.png | Bin 0 -> 721 bytes .../Soda Dark/btn-group-middle-on.png | Bin 0 -> 185 bytes .../Soda Dark/btn-group-middle-on@2x.png | Bin 0 -> 345 bytes .../Soda Dark/btn-group-middle.png | Bin 0 -> 206 bytes .../Soda Dark/btn-group-middle@2x.png | Bin 0 -> 352 bytes .../Soda Dark/btn-group-right-on.png | Bin 0 -> 328 bytes .../Soda Dark/btn-group-right-on@2x.png | Bin 0 -> 718 bytes .../Soda Dark/btn-group-right.png | Bin 0 -> 334 bytes .../Soda Dark/btn-group-right@2x.png | Bin 0 -> 748 bytes .../Theme - Soda/Soda Dark/btn-large-on.png | Bin 0 -> 387 bytes .../Soda Dark/btn-large-on@2x.png | Bin 0 -> 1072 bytes .../Theme - Soda/Soda Dark/btn-large.png | Bin 0 -> 458 bytes .../Theme - Soda/Soda Dark/btn-large@2x.png | Bin 0 -> 1116 bytes .../Theme - Soda/Soda Dark/btn-small-on.png | Bin 0 -> 425 bytes .../Soda Dark/btn-small-on@2x.png | Bin 0 -> 1046 bytes .../Theme - Soda/Soda Dark/btn-small.png | Bin 0 -> 458 bytes .../Theme - Soda/Soda Dark/btn-small@2x.png | Bin 0 -> 1116 bytes .../Theme - Soda/Soda Dark/circle.png | Bin 0 -> 320 bytes .../Soda Dark/classic/tab-active.png | Bin 0 -> 886 bytes .../Soda Dark/classic/tab-active@2x.png | Bin 0 -> 2018 bytes .../Soda Dark/classic/tab-hover.png | Bin 0 -> 797 bytes .../Soda Dark/classic/tab-hover@2x.png | Bin 0 -> 1827 bytes .../Soda Dark/classic/tab-inactive.png | Bin 0 -> 802 bytes .../Soda Dark/classic/tab-inactive@2x.png | Bin 0 -> 1801 bytes .../Theme - Soda/Soda Dark/dot.png | Bin 0 -> 261 bytes .../Soda Dark/file-close-hover.png | Bin 0 -> 393 bytes .../Soda Dark/file-close-hover@2x.png | Bin 0 -> 799 bytes .../Soda Dark/file-close-selected.png | Bin 0 -> 370 bytes .../Soda Dark/file-close-selected@2x.png | Bin 0 -> 868 bytes .../Theme - Soda/Soda Dark/file-close.png | Bin 0 -> 425 bytes .../Theme - Soda/Soda Dark/file-close@2x.png | Bin 0 -> 828 bytes .../Soda Dark/file-dirty-selected.png | Bin 0 -> 349 bytes .../Soda Dark/file-dirty-selected@2x.png | Bin 0 -> 713 bytes .../Theme - Soda/Soda Dark/file-dirty.png | Bin 0 -> 320 bytes .../Theme - Soda/Soda Dark/file-dirty@2x.png | Bin 0 -> 637 bytes .../Soda Dark/fold-closed-hover.png | Bin 0 -> 319 bytes .../Soda Dark/fold-closed-hover@2x.png | Bin 0 -> 658 bytes .../Theme - Soda/Soda Dark/fold-closed.png | Bin 0 -> 311 bytes .../Theme - Soda/Soda Dark/fold-closed@2x.png | Bin 0 -> 658 bytes .../Soda Dark/fold-open-hover.png | Bin 0 -> 305 bytes .../Soda Dark/fold-open-hover@2x.png | Bin 0 -> 578 bytes .../Theme - Soda/Soda Dark/fold-open.png | Bin 0 -> 293 bytes .../Theme - Soda/Soda Dark/fold-open@2x.png | Bin 0 -> 592 bytes .../Theme - Soda/Soda Dark/fold.png | Bin 0 -> 1156 bytes .../Soda Dark/group-closed-hover.png | Bin 0 -> 356 bytes .../Soda Dark/group-closed-hover@2x.png | Bin 0 -> 705 bytes .../Soda Dark/group-closed-selected.png | Bin 0 -> 415 bytes .../Soda Dark/group-closed-selected@2x.png | Bin 0 -> 821 bytes .../Theme - Soda/Soda Dark/group-closed.png | Bin 0 -> 340 bytes .../Soda Dark/group-closed@2x.png | Bin 0 -> 740 bytes .../Soda Dark/group-open-hover.png | Bin 0 -> 313 bytes .../Soda Dark/group-open-hover@2x.png | Bin 0 -> 628 bytes .../Soda Dark/group-open-selected.png | Bin 0 -> 380 bytes .../Soda Dark/group-open-selected@2x.png | Bin 0 -> 853 bytes .../Theme - Soda/Soda Dark/group-open.png | Bin 0 -> 311 bytes .../Theme - Soda/Soda Dark/group-open@2x.png | Bin 0 -> 612 bytes .../Soda Dark/icon-buffer-off.png | Bin 0 -> 423 bytes .../Soda Dark/icon-buffer-off@2x.png | Bin 0 -> 950 bytes .../Theme - Soda/Soda Dark/icon-buffer-on.png | Bin 0 -> 524 bytes .../Soda Dark/icon-buffer-on@2x.png | Bin 0 -> 1215 bytes .../Theme - Soda/Soda Dark/icon-case-off.png | Bin 0 -> 556 bytes .../Soda Dark/icon-case-off@2x.png | Bin 0 -> 1328 bytes .../Theme - Soda/Soda Dark/icon-case-on.png | Bin 0 -> 685 bytes .../Soda Dark/icon-case-on@2x.png | Bin 0 -> 1721 bytes .../Soda Dark/icon-context-off.png | Bin 0 -> 251 bytes .../Soda Dark/icon-context-off@2x.png | Bin 0 -> 454 bytes .../Soda Dark/icon-context-on.png | Bin 0 -> 310 bytes .../Soda Dark/icon-context-on@2x.png | Bin 0 -> 642 bytes .../Soda Dark/icon-highlight-off.png | Bin 0 -> 385 bytes .../Soda Dark/icon-highlight-off@2x.png | Bin 0 -> 726 bytes .../Soda Dark/icon-highlight-on.png | Bin 0 -> 422 bytes .../Soda Dark/icon-highlight-on@2x.png | Bin 0 -> 827 bytes .../Soda Dark/icon-preserve-off.png | Bin 0 -> 413 bytes .../Soda Dark/icon-preserve-off@2x.png | Bin 0 -> 817 bytes .../Soda Dark/icon-preserve-on.png | Bin 0 -> 498 bytes .../Soda Dark/icon-preserve-on@2x.png | Bin 0 -> 1077 bytes .../Theme - Soda/Soda Dark/icon-regex-off.png | Bin 0 -> 486 bytes .../Soda Dark/icon-regex-off@2x.png | Bin 0 -> 1084 bytes .../Theme - Soda/Soda Dark/icon-regex-on.png | Bin 0 -> 594 bytes .../Soda Dark/icon-regex-on@2x.png | Bin 0 -> 1390 bytes .../Soda Dark/icon-reverse-off.png | Bin 0 -> 365 bytes .../Soda Dark/icon-reverse-off@2x.png | Bin 0 -> 764 bytes .../Soda Dark/icon-reverse-on.png | Bin 0 -> 461 bytes .../Soda Dark/icon-reverse-on@2x.png | Bin 0 -> 1003 bytes .../Soda Dark/icon-selection-off.png | Bin 0 -> 321 bytes .../Soda Dark/icon-selection-off@2x.png | Bin 0 -> 601 bytes .../Soda Dark/icon-selection-on.png | Bin 0 -> 385 bytes .../Soda Dark/icon-selection-on@2x.png | Bin 0 -> 755 bytes .../Theme - Soda/Soda Dark/icon-word-off.png | Bin 0 -> 332 bytes .../Soda Dark/icon-word-off@2x.png | Bin 0 -> 696 bytes .../Theme - Soda/Soda Dark/icon-word-on.png | Bin 0 -> 410 bytes .../Soda Dark/icon-word-on@2x.png | Bin 0 -> 898 bytes .../Theme - Soda/Soda Dark/icon-wrap-off.png | Bin 0 -> 502 bytes .../Soda Dark/icon-wrap-off@2x.png | Bin 0 -> 1170 bytes .../Theme - Soda/Soda Dark/icon-wrap-on.png | Bin 0 -> 588 bytes .../Soda Dark/icon-wrap-on@2x.png | Bin 0 -> 1473 bytes .../overlay-dark-puck-horizontal.png | Bin 0 -> 182 bytes .../overlay-dark-puck-horizontal@2x.png | Bin 0 -> 294 bytes .../Soda Dark/overlay-dark-puck-vertical.png | Bin 0 -> 182 bytes .../overlay-dark-puck-vertical@2x.png | Bin 0 -> 305 bytes .../Soda Dark/overlay-puck-horizontal.png | Bin 0 -> 188 bytes .../Soda Dark/overlay-puck-horizontal@2x.png | Bin 0 -> 308 bytes .../Soda Dark/overlay-puck-vertical.png | Bin 0 -> 187 bytes .../Soda Dark/overlay-puck-vertical@2x.png | Bin 0 -> 316 bytes .../overlay-scrollbar-horizontal.png | Bin 0 -> 243 bytes .../overlay-scrollbar-horizontal@2x.png | Bin 0 -> 479 bytes .../Soda Dark/overlay-scrollbar-vertical.png | Bin 0 -> 238 bytes .../overlay-scrollbar-vertical@2x.png | Bin 0 -> 465 bytes .../Soda Dark/panel-background.png | Bin 0 -> 137 bytes .../Soda Dark/panel-background@2x.png | Bin 0 -> 190 bytes .../Soda Dark/quick-panel-background-fix.png | Bin 0 -> 161 bytes .../quick-panel-background-fix@2x.png | Bin 0 -> 207 bytes .../Soda Dark/quick-panel-background.png | Bin 0 -> 559 bytes .../Soda Dark/quick-panel-background@2x.png | Bin 0 -> 1193 bytes .../Soda Dark/quick-panel-row-selected.png | Bin 0 -> 108 bytes .../Soda Dark/quick-panel-row-selected@2x.png | Bin 0 -> 124 bytes .../Soda Dark/quick-panel-row.png | Bin 0 -> 105 bytes .../Soda Dark/quick-panel-row@2x.png | Bin 0 -> 120 bytes .../Soda Dark/quick-panel-sections-fix.png | Bin 0 -> 146 bytes .../Soda Dark/quick-panel-sections-fix@2x.png | Bin 0 -> 244 bytes .../Soda Dark/quick-panel-sections.png | Bin 0 -> 199 bytes .../Soda Dark/quick-panel-sections@2x.png | Bin 0 -> 393 bytes .../Theme - Soda/Soda Dark/sidebar-bg.png | Bin 0 -> 411 bytes .../Theme - Soda/Soda Dark/sidebar-bg@2x.png | Bin 0 -> 1284 bytes .../Soda Dark/sidebar-row-selected.png | Bin 0 -> 110 bytes .../Soda Dark/sidebar-row-selected@2x.png | Bin 0 -> 140 bytes .../Soda Dark/standard-puck-horizontal.png | Bin 0 -> 414 bytes .../Soda Dark/standard-puck-horizontal@2x.png | Bin 0 -> 884 bytes .../Soda Dark/standard-puck-vertical.png | Bin 0 -> 408 bytes .../Soda Dark/standard-puck-vertical@2x.png | Bin 0 -> 849 bytes .../Soda Dark/standard-scrollbar-corner.png | Bin 0 -> 118 bytes .../standard-scrollbar-corner@2x.png | Bin 0 -> 237 bytes .../standard-scrollbar-horizontal.png | Bin 0 -> 113 bytes .../standard-scrollbar-horizontal@2x.png | Bin 0 -> 143 bytes .../Soda Dark/standard-scrollbar-vertical.png | Bin 0 -> 106 bytes .../standard-scrollbar-vertical@2x.png | Bin 0 -> 160 bytes .../Soda Dark/status-bar-background.png | Bin 0 -> 109 bytes .../Soda Dark/status-bar-background@2x.png | Bin 0 -> 135 bytes .../Theme - Soda/Soda Dark/tab-active.png | Bin 0 -> 309 bytes .../Theme - Soda/Soda Dark/tab-active@2x.png | Bin 0 -> 578 bytes .../Soda Dark/tab-close-hover.png | Bin 0 -> 544 bytes .../Soda Dark/tab-close-hover@2x.png | Bin 0 -> 1309 bytes .../Soda Dark/tab-close-inactive.png | Bin 0 -> 412 bytes .../Soda Dark/tab-close-inactive@2x.png | Bin 0 -> 787 bytes .../Soda Dark/tab-close-pressed.png | Bin 0 -> 552 bytes .../Soda Dark/tab-close-pressed@2x.png | Bin 0 -> 1317 bytes .../Theme - Soda/Soda Dark/tab-close.png | Bin 0 -> 412 bytes .../Theme - Soda/Soda Dark/tab-close@2x.png | Bin 0 -> 787 bytes .../Soda Dark/tab-dirty-inactive.png | Bin 0 -> 286 bytes .../Soda Dark/tab-dirty-inactive@2x.png | Bin 0 -> 606 bytes .../Theme - Soda/Soda Dark/tab-dirty.png | Bin 0 -> 297 bytes .../Theme - Soda/Soda Dark/tab-dirty@2x.png | Bin 0 -> 613 bytes .../Soda Dark/tab-highlight-inactive.png | Bin 0 -> 316 bytes .../Soda Dark/tab-highlight-inactive@2x.png | Bin 0 -> 706 bytes .../Theme - Soda/Soda Dark/tab-highlight.png | Bin 0 -> 330 bytes .../Soda Dark/tab-highlight@2x.png | Bin 0 -> 711 bytes .../Theme - Soda/Soda Dark/tab-hover.png | Bin 0 -> 215 bytes .../Theme - Soda/Soda Dark/tab-hover@2x.png | Bin 0 -> 336 bytes .../Theme - Soda/Soda Dark/tab-inactive.png | Bin 0 -> 228 bytes .../Soda Dark/tab-inactive@2x.png | Bin 0 -> 302 bytes .../Soda Dark/tabset-background.png | Bin 0 -> 140 bytes .../Soda Dark/tabset-background@2x.png | Bin 0 -> 166 bytes .../Theme - Soda/Soda Dark/text-field.png | Bin 0 -> 235 bytes .../Theme - Soda/Soda Dark/text-field@2x.png | Bin 0 -> 380 bytes .../Theme - Soda/Soda Dark/tooltip.png | Bin 0 -> 81 bytes .../Theme - Soda/Soda Dark/tooltip@2x.png | Bin 0 -> 93 bytes .../Theme - Soda/Soda Light.sublime-theme | 974 ++++ .../Theme - Soda/Soda Light/.gitignore | 1 + .../Soda Light/Widget - Soda Light.stTheme | 30 + .../Widget - Soda Light.sublime-settings | 4 + .../Soda Light/autocomplete-row-selected.png | Bin 0 -> 200 bytes .../autocomplete-row-selected@2x.png | Bin 0 -> 364 bytes .../Theme - Soda/Soda Light/bookmark.png | Bin 0 -> 2855 bytes .../Soda Light/btn-group-left-on.png | Bin 0 -> 326 bytes .../Soda Light/btn-group-left-on@2x.png | Bin 0 -> 707 bytes .../Soda Light/btn-group-left.png | Bin 0 -> 339 bytes .../Soda Light/btn-group-left@2x.png | Bin 0 -> 787 bytes .../Soda Light/btn-group-middle-on.png | Bin 0 -> 196 bytes .../Soda Light/btn-group-middle-on@2x.png | Bin 0 -> 430 bytes .../Soda Light/btn-group-middle.png | Bin 0 -> 191 bytes .../Soda Light/btn-group-middle@2x.png | Bin 0 -> 356 bytes .../Soda Light/btn-group-right-on.png | Bin 0 -> 336 bytes .../Soda Light/btn-group-right-on@2x.png | Bin 0 -> 734 bytes .../Soda Light/btn-group-right.png | Bin 0 -> 339 bytes .../Soda Light/btn-group-right@2x.png | Bin 0 -> 767 bytes .../Theme - Soda/Soda Light/btn-large-on.png | Bin 0 -> 456 bytes .../Soda Light/btn-large-on@2x.png | Bin 0 -> 1090 bytes .../Theme - Soda/Soda Light/btn-large.png | Bin 0 -> 481 bytes .../Theme - Soda/Soda Light/btn-large@2x.png | Bin 0 -> 1137 bytes .../Theme - Soda/Soda Light/btn-small-on.png | Bin 0 -> 453 bytes .../Soda Light/btn-small-on@2x.png | Bin 0 -> 965 bytes .../Theme - Soda/Soda Light/btn-small.png | Bin 0 -> 481 bytes .../Theme - Soda/Soda Light/btn-small@2x.png | Bin 0 -> 1137 bytes .../Theme - Soda/Soda Light/circle.png | Bin 0 -> 320 bytes .../Soda Light/classic/tab-active.png | Bin 0 -> 912 bytes .../Soda Light/classic/tab-active@2x.png | Bin 0 -> 2159 bytes .../Soda Light/classic/tab-hover.png | Bin 0 -> 802 bytes .../Soda Light/classic/tab-hover@2x.png | Bin 0 -> 1855 bytes .../Soda Light/classic/tab-inactive.png | Bin 0 -> 808 bytes .../Soda Light/classic/tab-inactive@2x.png | Bin 0 -> 1907 bytes .../Theme - Soda/Soda Light/dot.png | Bin 0 -> 261 bytes .../Soda Light/file-close-hover.png | Bin 0 -> 375 bytes .../Soda Light/file-close-hover@2x.png | Bin 0 -> 852 bytes .../Soda Light/file-close-selected.png | Bin 0 -> 369 bytes .../Soda Light/file-close-selected@2x.png | Bin 0 -> 865 bytes .../Theme - Soda/Soda Light/file-close.png | Bin 0 -> 420 bytes .../Theme - Soda/Soda Light/file-close@2x.png | Bin 0 -> 953 bytes .../Soda Light/file-dirty-selected.png | Bin 0 -> 340 bytes .../Soda Light/file-dirty-selected@2x.png | Bin 0 -> 726 bytes .../Theme - Soda/Soda Light/file-dirty.png | Bin 0 -> 320 bytes .../Theme - Soda/Soda Light/file-dirty@2x.png | Bin 0 -> 735 bytes .../Soda Light/fold-closed-hover.png | Bin 0 -> 325 bytes .../Soda Light/fold-closed-hover@2x.png | Bin 0 -> 732 bytes .../Theme - Soda/Soda Light/fold-closed.png | Bin 0 -> 329 bytes .../Soda Light/fold-closed@2x.png | Bin 0 -> 747 bytes .../Soda Light/fold-open-hover.png | Bin 0 -> 324 bytes .../Soda Light/fold-open-hover@2x.png | Bin 0 -> 682 bytes .../Theme - Soda/Soda Light/fold-open.png | Bin 0 -> 326 bytes .../Theme - Soda/Soda Light/fold-open@2x.png | Bin 0 -> 681 bytes .../Theme - Soda/Soda Light/fold.png | Bin 0 -> 1156 bytes .../Soda Light/group-closed-hover.png | Bin 0 -> 355 bytes .../Soda Light/group-closed-hover@2x.png | Bin 0 -> 761 bytes .../Soda Light/group-closed-selected.png | Bin 0 -> 414 bytes .../Soda Light/group-closed-selected@2x.png | Bin 0 -> 810 bytes .../Theme - Soda/Soda Light/group-closed.png | Bin 0 -> 363 bytes .../Soda Light/group-closed@2x.png | Bin 0 -> 784 bytes .../Soda Light/group-open-hover.png | Bin 0 -> 322 bytes .../Soda Light/group-open-hover@2x.png | Bin 0 -> 700 bytes .../Soda Light/group-open-selected.png | Bin 0 -> 386 bytes .../Soda Light/group-open-selected@2x.png | Bin 0 -> 829 bytes .../Theme - Soda/Soda Light/group-open.png | Bin 0 -> 348 bytes .../Theme - Soda/Soda Light/group-open@2x.png | Bin 0 -> 788 bytes .../Soda Light/icon-buffer-off.png | Bin 0 -> 453 bytes .../Soda Light/icon-buffer-off@2x.png | Bin 0 -> 1023 bytes .../Soda Light/icon-buffer-on.png | Bin 0 -> 460 bytes .../Soda Light/icon-buffer-on@2x.png | Bin 0 -> 1146 bytes .../Theme - Soda/Soda Light/icon-case-off.png | Bin 0 -> 603 bytes .../Soda Light/icon-case-off@2x.png | Bin 0 -> 1477 bytes .../Theme - Soda/Soda Light/icon-case-on.png | Bin 0 -> 642 bytes .../Soda Light/icon-case-on@2x.png | Bin 0 -> 1687 bytes .../Soda Light/icon-context-off.png | Bin 0 -> 167 bytes .../Soda Light/icon-context-off@2x.png | Bin 0 -> 336 bytes .../Soda Light/icon-context-on.png | Bin 0 -> 248 bytes .../Soda Light/icon-context-on@2x.png | Bin 0 -> 546 bytes .../Soda Light/icon-highlight-off.png | Bin 0 -> 376 bytes .../Soda Light/icon-highlight-off@2x.png | Bin 0 -> 728 bytes .../Soda Light/icon-highlight-on.png | Bin 0 -> 348 bytes .../Soda Light/icon-highlight-on@2x.png | Bin 0 -> 712 bytes .../Soda Light/icon-preserve-off.png | Bin 0 -> 430 bytes .../Soda Light/icon-preserve-off@2x.png | Bin 0 -> 864 bytes .../Soda Light/icon-preserve-on.png | Bin 0 -> 454 bytes .../Soda Light/icon-preserve-on@2x.png | Bin 0 -> 1053 bytes .../Soda Light/icon-regex-off.png | Bin 0 -> 511 bytes .../Soda Light/icon-regex-off@2x.png | Bin 0 -> 1204 bytes .../Theme - Soda/Soda Light/icon-regex-on.png | Bin 0 -> 545 bytes .../Soda Light/icon-regex-on@2x.png | Bin 0 -> 1291 bytes .../Soda Light/icon-reverse-off.png | Bin 0 -> 377 bytes .../Soda Light/icon-reverse-off@2x.png | Bin 0 -> 829 bytes .../Soda Light/icon-reverse-on.png | Bin 0 -> 408 bytes .../Soda Light/icon-reverse-on@2x.png | Bin 0 -> 953 bytes .../Soda Light/icon-selection-off.png | Bin 0 -> 337 bytes .../Soda Light/icon-selection-off@2x.png | Bin 0 -> 679 bytes .../Soda Light/icon-selection-on.png | Bin 0 -> 332 bytes .../Soda Light/icon-selection-on@2x.png | Bin 0 -> 682 bytes .../Theme - Soda/Soda Light/icon-word-off.png | Bin 0 -> 322 bytes .../Soda Light/icon-word-off@2x.png | Bin 0 -> 724 bytes .../Theme - Soda/Soda Light/icon-word-on.png | Bin 0 -> 382 bytes .../Soda Light/icon-word-on@2x.png | Bin 0 -> 852 bytes .../Theme - Soda/Soda Light/icon-wrap-off.png | Bin 0 -> 522 bytes .../Soda Light/icon-wrap-off@2x.png | Bin 0 -> 1302 bytes .../Theme - Soda/Soda Light/icon-wrap-on.png | Bin 0 -> 592 bytes .../Soda Light/icon-wrap-on@2x.png | Bin 0 -> 1437 bytes .../overlay-dark-puck-horizontal.png | Bin 0 -> 182 bytes .../overlay-dark-puck-horizontal@2x.png | Bin 0 -> 294 bytes .../Soda Light/overlay-dark-puck-vertical.png | Bin 0 -> 182 bytes .../overlay-dark-puck-vertical@2x.png | Bin 0 -> 305 bytes .../Soda Light/overlay-puck-horizontal.png | Bin 0 -> 188 bytes .../Soda Light/overlay-puck-horizontal@2x.png | Bin 0 -> 308 bytes .../Soda Light/overlay-puck-vertical.png | Bin 0 -> 187 bytes .../Soda Light/overlay-puck-vertical@2x.png | Bin 0 -> 316 bytes .../overlay-scrollbar-horizontal.png | Bin 0 -> 243 bytes .../overlay-scrollbar-horizontal@2x.png | Bin 0 -> 479 bytes .../Soda Light/overlay-scrollbar-vertical.png | Bin 0 -> 238 bytes .../overlay-scrollbar-vertical@2x.png | Bin 0 -> 465 bytes .../Soda Light/panel-background.png | Bin 0 -> 131 bytes .../Soda Light/panel-background@2x.png | Bin 0 -> 186 bytes .../Soda Light/quick-panel-background-fix.png | Bin 0 -> 148 bytes .../quick-panel-background-fix@2x.png | Bin 0 -> 216 bytes .../Soda Light/quick-panel-background.png | Bin 0 -> 528 bytes .../Soda Light/quick-panel-background@2x.png | Bin 0 -> 1152 bytes .../Soda Light/quick-panel-row-selected.png | Bin 0 -> 106 bytes .../quick-panel-row-selected@2x.png | Bin 0 -> 125 bytes .../Soda Light/quick-panel-row.png | Bin 0 -> 104 bytes .../Soda Light/quick-panel-row@2x.png | Bin 0 -> 121 bytes .../Soda Light/quick-panel-sections-fix.png | Bin 0 -> 146 bytes .../quick-panel-sections-fix@2x.png | Bin 0 -> 244 bytes .../Soda Light/quick-panel-sections.png | Bin 0 -> 199 bytes .../Soda Light/quick-panel-sections@2x.png | Bin 0 -> 393 bytes .../Theme - Soda/Soda Light/sidebar-bg.png | Bin 0 -> 578 bytes .../Theme - Soda/Soda Light/sidebar-bg@2x.png | Bin 0 -> 1499 bytes .../Soda Light/sidebar-row-selected.png | Bin 0 -> 131 bytes .../Soda Light/sidebar-row-selected@2x.png | Bin 0 -> 169 bytes .../Soda Light/standard-puck-horizontal.png | Bin 0 -> 269 bytes .../standard-puck-horizontal@2x.png | Bin 0 -> 531 bytes .../Soda Light/standard-puck-vertical.png | Bin 0 -> 290 bytes .../Soda Light/standard-puck-vertical@2x.png | Bin 0 -> 554 bytes .../Soda Light/standard-scrollbar-corner.png | Bin 0 -> 152 bytes .../standard-scrollbar-corner@2x.png | Bin 0 -> 265 bytes .../standard-scrollbar-horizontal.png | Bin 0 -> 129 bytes .../standard-scrollbar-horizontal@2x.png | Bin 0 -> 172 bytes .../standard-scrollbar-vertical.png | Bin 0 -> 124 bytes .../standard-scrollbar-vertical@2x.png | Bin 0 -> 172 bytes .../Soda Light/status-bar-background.png | Bin 0 -> 122 bytes .../Soda Light/status-bar-background@2x.png | Bin 0 -> 138 bytes .../Theme - Soda/Soda Light/tab-active.png | Bin 0 -> 346 bytes .../Theme - Soda/Soda Light/tab-active@2x.png | Bin 0 -> 607 bytes .../Soda Light/tab-close-hover.png | Bin 0 -> 591 bytes .../Soda Light/tab-close-hover@2x.png | Bin 0 -> 1410 bytes .../Soda Light/tab-close-inactive.png | Bin 0 -> 417 bytes .../Soda Light/tab-close-inactive@2x.png | Bin 0 -> 871 bytes .../Soda Light/tab-close-pressed.png | Bin 0 -> 596 bytes .../Soda Light/tab-close-pressed@2x.png | Bin 0 -> 1436 bytes .../Theme - Soda/Soda Light/tab-close.png | Bin 0 -> 421 bytes .../Theme - Soda/Soda Light/tab-close@2x.png | Bin 0 -> 855 bytes .../Soda Light/tab-dirty-inactive.png | Bin 0 -> 323 bytes .../Soda Light/tab-dirty-inactive@2x.png | Bin 0 -> 734 bytes .../Theme - Soda/Soda Light/tab-dirty.png | Bin 0 -> 328 bytes .../Theme - Soda/Soda Light/tab-dirty@2x.png | Bin 0 -> 720 bytes .../Soda Light/tab-highlight-inactive.png | Bin 0 -> 338 bytes .../Soda Light/tab-highlight-inactive@2x.png | Bin 0 -> 737 bytes .../Theme - Soda/Soda Light/tab-highlight.png | Bin 0 -> 336 bytes .../Soda Light/tab-highlight@2x.png | Bin 0 -> 728 bytes .../Theme - Soda/Soda Light/tab-hover.png | Bin 0 -> 207 bytes .../Theme - Soda/Soda Light/tab-hover@2x.png | Bin 0 -> 330 bytes .../Theme - Soda/Soda Light/tab-inactive.png | Bin 0 -> 225 bytes .../Soda Light/tab-inactive@2x.png | Bin 0 -> 370 bytes .../Soda Light/tabset-background.png | Bin 0 -> 147 bytes .../Soda Light/tabset-background@2x.png | Bin 0 -> 179 bytes .../Theme - Soda/Soda Light/text-field.png | Bin 0 -> 253 bytes .../Theme - Soda/Soda Light/text-field@2x.png | Bin 0 -> 441 bytes .../Theme - Soda/Soda Light/tooltip.png | Bin 0 -> 81 bytes .../Theme - Soda/Soda Light/tooltip@2x.png | Bin 0 -> 93 bytes .../Theme - Soda/package-metadata.json | 1 + .../Default (Windows).sublime-keymap | 56 + .../README.md | 36 + .../package-metadata.json | 1 + 541 files changed, 26347 insertions(+) create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/__init__.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.3.0.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/__init__.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/__init__.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/bookmark.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/circle.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/dot.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-preserve-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/panel-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background-fix@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tooltip@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light.sublime-theme create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/.gitignore create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.stTheme create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/bookmark.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/circle.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/dot.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-open@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-off@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-corner@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/status-bar-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip@2x.png create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/package-metadata.json create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/Default (Windows).sublime-keymap create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/README.md create mode 100644 EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ZZZ.EthanBrown.SublimeKeyMap.Util/package-metadata.json diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore new file mode 100644 index 0000000..0205d62 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/.gitignore @@ -0,0 +1,2 @@ +*.pyc +.DS_Store diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py new file mode 100644 index 0000000..164d7de --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.py @@ -0,0 +1,581 @@ +import os +import sublime +import sublime_plugin +import re +import logging +import errno + +SETTINGS = [ + "alias", + "default_initial", + "use_cursor_text", + "show_files", + "show_path", + "default_root", + "default_path", + "default_folder_index", + "os_specific_alias", + "ignore_case", + "alias_root", + "alias_path", + "alias_folder_index", + "debug", + "auto_refresh_sidebar" +] +VIEW_NAME = "AdvancedNewFileCreation" +WIN_ROOT_REGEX = r"[a-zA-Z]:(/|\\)" +NIX_ROOT_REGEX = r"^/" +HOME_REGEX = r"^~" + +# Set up logger +logging.basicConfig(format='[AdvancedNewFile] %(levelname)s %(message)s') +logger = logging.getLogger() + + +class AdvancedNewFileCommand(sublime_plugin.WindowCommand): + def run(self, is_python=False): + self.PLATFORM = sublime.platform().lower() + self.root = None + self.alias_root = None + self.top_level_split_char = ":" + self.is_python = is_python + self.view = self.window.active_view() + + # Settings will be based on the view + settings = get_settings(self.view) + self.aliases = self.get_aliases(settings) + self.show_path = settings.get("show_path") + self.auto_refresh_sidebar = settings.get("auto_refresh_sidebar") + self.default_folder_index = settings.get("default_folder_index") + self.alias_folder_index = settings.get("alias_folder_index") + default_root = self.get_default_root(settings.get("default_root")) + if default_root == "path": + self.root = os.path.expanduser(settings.get("default_path")) + default_root = "" + self.root, path = self.split_path(default_root) + + # Set some default values for the auto complete + PathAutocomplete.set_show_files(settings.get("show_files")) + PathAutocomplete.set_aliases(self.aliases) + PathAutocomplete.set_ignore_case(settings.get("ignore_case")) + + # Search for initial string + path = settings.get("default_initial", "") + if settings.get("use_cursor_text", False): + tmp = self.get_cursor_path() + if tmp != "": + path = tmp + + alias_root = self.get_default_root(settings.get("alias_root"), True) + if alias_root == "path": + self.alias_root = os.path.expanduser(settings.get("alias_path")) + alias_root = "" + self.alias_root, tmp = self.split_path(alias_root, True) + + debug = settings.get("debug") or False + if debug: + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.ERROR) + # Get user input + self.show_filename_input(path) + + def get_aliases(self, settings): + aliases = settings.get("alias") + all_os_aliases = settings.get("os_specific_alias") + for key in all_os_aliases: + if self.PLATFORM in all_os_aliases.get(key): + aliases[key] = all_os_aliases.get(key).get(self.PLATFORM) + + return aliases + + def get_default_root(self, string, is_alias=False): + root = "" + + if string == "home": + root = "~/" + elif string == "current": + root = self.top_level_split_char + elif string == "project_folder": + if is_alias: + folder_index = self.alias_folder_index + else: + folder_index = self.default_folder_index + if len(self.window.folders()) <= folder_index: + if is_alias: + self.alias_folder_index = 0 + else: + self.default_folder_index = 0 + elif string == "top_folder": + if is_alias: + self.alias_folder_index = 0 + else: + self.default_folder_index = 0 + elif string == "path": + root = "path" + else: + logger.error("Invalid specifier for \"default_root\"") + return root + + def split_path(self, path="", is_alias=False): + HOME_REGEX = r"^~[/\\]" + root = None + try: + # Parse windows root + if self.PLATFORM == "windows": + if re.match(WIN_ROOT_REGEX, path): + root = path[0:3] + path = path[3:] + + # Parse if alias + if self.top_level_split_char in path and root == None: + parts = path.rsplit(self.top_level_split_char, 1) + root, path = self.translate_alias(parts[0]) + path_list = [] + if path != "": + path_list.append(path) + if parts[1] != "": + path_list.append(parts[1]) + path = self.top_level_split_char.join(path_list) + # Parse if tilde used + elif re.match(HOME_REGEX, path) and root == None: + root = os.path.expanduser("~") + path = path[2:] + + # Default + if root == None: + if is_alias: + root = self.alias_root + folder_index = self.alias_folder_index + else: + root = self.root + folder_index = self.default_folder_index + root = root or self.window.folders()[folder_index] + except IndexError: + root = os.path.expanduser("~") + return root, path + + def translate_alias(self, path): + root = None + split_path = None + if path == "" and self.view is not None: + filename = self.view.file_name() + if filename is not None: + root = os.path.dirname(filename) + else: + split_path = path.split(self.top_level_split_char) + join_index = len(split_path) - 1 + target = path + root_found = False + while join_index >= 0 and not root_found: + # Folder aliases + for folder in self.window.folders(): + basename = os.path.basename(folder) + if basename == target: + root = folder + root_found = True + break + # Aliases from settings. + for alias in self.aliases.keys(): + if alias == target: + alias_path = self.aliases.get(alias) + if re.search(HOME_REGEX, alias_path) is None: + if self.PLATFORM == "windows": + if re.search(WIN_ROOT_REGEX, alias_path) is None: + root = os.path.join(self.alias_root, alias_path) + break + else: + if re.search(NIX_ROOT_REGEX, alias_path) is None: + root = os.path.join(self.alias_root, alias_path) + break + root = os.path.expanduser(alias_path) + root_found = True + break + remove = re.escape(split_path[join_index]) + target = re.sub(r":%s$" % remove, "", target) + join_index -= 1 + + if root is None: + return None, path + elif split_path is None: + return os.path.abspath(root), "" + else: + # Add to index so we re + join_index += 2 + return os.path.abspath(root), self.top_level_split_char.join(split_path[join_index:]) + + def show_filename_input(self, initial=''): + caption = 'Enter a path for a new file' + if self.is_python: + caption = '%s (creates __init__.py in new dirs)' % caption + view = self.window.show_input_panel( + caption, initial, + self.entered_filename, self.update_filename_input, self.clear + ) + + view.set_name(VIEW_NAME) + temp = view.settings().get("word_separators") + temp = temp.replace(".", "") + view.settings().set("word_separators", temp) + view.settings().set("auto_complete_commit_on_tab", True) + view.settings().set("tab_completion", True) + + PathAutocomplete.set_view_id(view.id()) + PathAutocomplete.set_root(self.root, True) + + def update_filename_input(self, path_in): + base, path = self.split_path(path_in) + if self.top_level_split_char in path_in or re.match(r"^~[/\\]", path_in): + PathAutocomplete.set_root(base, False) + else: + PathAutocomplete.set_root(base, True) + + creation_path = self.generate_creation_path(base, path) + if self.show_path: + if self.view != None: + self.view.set_status("AdvancedNewFile", "Creating file at %s " % \ + creation_path) + else: + sublime.status_message("Creating file at %s " % creation_path) + logger.debug("Creation path is '%s'" % creation_path) + PathAutocomplete.set_path(path) + + def generate_creation_path(self, base, path): + if self.PLATFORM == "windows": + if not re.match(WIN_ROOT_REGEX, base): + return base + self.top_level_split_char + path + else: + if not re.match(NIX_ROOT_REGEX, base): + return base + self.top_level_split_char + path + + return os.path.abspath(os.path.join(base, path)) + + def entered_filename(self, filename): + # Check if valid root specified for windows. + if self.PLATFORM == "windows": + if re.match(WIN_ROOT_REGEX, filename): + root = filename[0:3] + if not os.path.isdir(root): + sublime.error_message(root + " is not a valid root.") + self.clear() + return + + base, path = self.split_path(filename) + file_path = os.path.join(base, path) + # Check for invalid alias specified. + if self.top_level_split_char in filename and \ + not (self.PLATFORM == "windows" and re.match(WIN_ROOT_REGEX, base)) and \ + not (self.PLATFORM != "windows" and re.match(NIX_ROOT_REGEX, base)): + if base == "": + error_message = "Current file cannot be resolved." + else: + error_message = "'" + base + "' is an invalid alias." + sublime.error_message(error_message) + else: + attempt_open = True + logger.debug("Creating file at %s", file_path) + if not os.path.exists(file_path): + try: + self.create(file_path) + except OSError as e: + attempt_open = False + sublime.error_message("Cannot create '" + file_path + "'. See console for details") + logger.error("Exception: %s '%s'" % (e.strerror, e.filename)) + if attempt_open: + if os.path.isdir(file_path): + if not re.search(r"(/|\\)$", file_path): + sublime.error_message("Cannot open view for '" + file_path + "'. It is a directory. ") + else: + self.window.open_file(file_path) + self.clear() + self.refresh_sidebar() + + def refresh_sidebar(self): + if self.auto_refresh_sidebar: + try: + self.window.run_command("refresh_folder_list") + except: + pass + + + def clear(self): + if self.view != None: + self.view.erase_status("AdvancedNewFile") + PathAutocomplete.clear() + + def create(self, filename): + base, filename = os.path.split(filename) + self.create_folder(base) + if filename != "": + open(os.path.join(base, filename), "a").close() + + def create_folder(self, path): + try: + os.makedirs(path) + except OSError as ex: + if ex.errno != errno.EEXIST: + raise + if self.is_python: + open(os.path.join(base, '__init__.py'), 'a').close() + + def get_cursor_path(self): + if self.view == None: + return "" + + view = self.view + path = "" + for region in view.sel(): + syntax = view.syntax_name(region.begin()) + if region.begin() != region.end(): + path = view.substr(region) + break + if re.match(".*string.quoted.double", syntax) or re.match(".*string.quoted.single", syntax): + path = view.substr(view.extract_scope(region.begin())) + path = re.sub('^"|\'', '', re.sub('"|\'$', '', path.strip())) + break + + return path + + +class PathAutocomplete(sublime_plugin.EventListener): + aliases = {} + show_files = False + ignore_case = False + + path = "" + root = "" + default_root = True + view_id = None + + prev_suggestions = [] + prev_base = "" + prev_directory = "" + path_empty = True + prev_root = "" + prev_prefix = "" + prev_locations = [] + + def on_query_context(self, view, key, operator, operand, match_all): + if key == "advanced_new_file_completion" and PathAutocomplete.view_id != None and view.id() == PathAutocomplete.view_id: + return True + return None + + def continue_previous_autocomplete(self): + pac = PathAutocomplete + sep = os.sep + root_path = pac.root + sep + prev_base = pac.prev_base + prev_directory = pac.prev_directory + prev_root = pac.prev_root + + base = os.path.basename(pac.path) + directory = os.path.dirname(pac.path) + + # If base is empty, we may be cycling through directory options + if base == "": + return True + + # Ensures the correct directory is used if the default root is specified + # using an alias. + if base == prev_base and \ + directory == prev_directory and \ + prev_root == root_path and \ + pac.default_root: + return True + # Continue completions if file names are completed. + if os.path.isfile(os.path.join(root_path, pac.path)): + return True + return False + + def on_query_completions(self, view, prefix, locations): + self.suggestion_entries = [] + pac = PathAutocomplete + if pac.view_id == None or view.id() != pac.view_id: + return [] + + auto_complete_prefix = "" + if self.continue_previous_autocomplete() and prefix != "": + logger.debug("(Prev) Suggestions") + logger.debug(pac.prev_suggestions) + if len(pac.prev_suggestions) > 1: + return (pac.prev_suggestions, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS) + elif len(pac.prev_suggestions) == 1: + auto_complete_prefix = pac.prev_suggestions[0][1] + + suggestions = [] + suggestions_w_spaces = [] + root_path = pac.root + os.sep + directory, base = os.path.split(pac.path) + + if directory == "" and pac.default_root: + # Project folders + sugg, sugg_w_spaces = self.generate_project_auto_complete(base) + suggestions += sugg + suggestions_w_spaces += sugg_w_spaces + # Aliases + sugg, sugg_w_spaces = self.generate_alias_auto_complete(base) + suggestions += sugg + suggestions_w_spaces += sugg_w_spaces + + # Directories + path = os.path.join(root_path, directory) + if os.path.exists(path): + sugg, sugg_w_spaces = self.generate_relative_auto_complete(path, base, auto_complete_prefix) + suggestions += sugg + suggestions_w_spaces += sugg_w_spaces + # If suggestions exist, use complete name + # else remove base prefix + if len(suggestions) > 0: + for name in suggestions_w_spaces: + suggestions.append((" " + name, name)) + else: + for name in suggestions_w_spaces: + temp = name + name = name[len(base) - 1:] + suggestions.append((" " + temp, name)) + + if len(suggestions) == 0 and locations == pac.prev_locations: + return (pac.prev_suggestions, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS) + # Previous used to determine cycling through entries. + pac.prev_directory = directory + pac.prev_base = base + pac.prev_suggestions = suggestions + pac.prev_root = root_path + pac.prev_prefix = prefix + pac.prev_locations = locations + logger.debug("Suggestions:") + logger.debug(suggestions) + return (suggestions, sublime.INHIBIT_WORD_COMPLETIONS | sublime.INHIBIT_EXPLICIT_COMPLETIONS) + + def generate_project_auto_complete(self, base): + folders = sublime.active_window().folders() + if len(folders) > 1: + folders = map(lambda f: os.path.basename(f), folders) + return self.generate_auto_complete(base, folders) + return [], [] + + def generate_alias_auto_complete(self, base): + return self.generate_auto_complete(base, PathAutocomplete.aliases) + + def generate_auto_complete(self, base, iterable_var): + sugg = [] + sugg_w_spaces = [] + + for entry in iterable_var: + if entry in self.suggestion_entries: + continue + self.suggestion_entries.append(entry) + compare_entry = entry + compare_base = base + if PathAutocomplete.ignore_case: + compare_entry = compare_entry.lower() + compare_base = compare_base.lower() + + if compare_entry.find(compare_base) == 0: + if " " in base: + sugg_w_spaces.append(entry + ":") + else: + sugg.append((entry + ":", entry + ":")) + return sugg, sugg_w_spaces + + def generate_relative_auto_complete(self, path, base, auto_complete_prefix): + sep = os.sep + sugg = [] + sugg_w_spaces = [] + + # Attempt to prevent searching the same path when a path has been specified + # Problems occur when using tab to complete entry with single completion + # followed by ctrl + space + if ":" in auto_complete_prefix: + compare_prefix = auto_complete_prefix.split(":", 1)[1] + else: + compare_prefix = auto_complete_prefix + + if re.search(r"[/\\]$", auto_complete_prefix) and not path.endswith(compare_prefix[0:-1]): + path = os.path.join(path, compare_prefix) + + for filename in os.listdir(path): + if PathAutocomplete.show_files or os.path.isdir(os.path.join(path, filename)): + compare_base = base + compare_filename = filename + if PathAutocomplete.ignore_case: + compare_base = compare_base.lower() + compare_filename = filename.lower() + + if compare_filename.find(compare_base) == 0: + # Need to find a better way to do the auto complete. + if " " in compare_base: + if os.path.isdir(os.path.join(path, filename)): + sugg_w_spaces.append(auto_complete_prefix + filename + sep) + else: + sugg_w_spaces.append(auto_complete_prefix + filename) + else: + if os.path.isdir(os.path.join(path, filename)): + sugg.append((" " + auto_complete_prefix + filename + sep, auto_complete_prefix + filename + sep)) + else: + sugg.append((" " + auto_complete_prefix + filename, auto_complete_prefix + filename)) + + return sugg, sugg_w_spaces + + @staticmethod + def set_path(path_input): + PathAutocomplete.path = path_input + + @staticmethod + def set_root(root_input, default_root): + PathAutocomplete.root = root_input + PathAutocomplete.default_root = default_root + + @staticmethod + def clear(): + PathAutocomplete.path = "" + PathAutocomplete.root = "" + PathAutocomplete.prev_suggestions = [] + PathAutocomplete.prev_base = "" + PathAutocomplete.prev_directory = "" + PathAutocomplete.aliases = {} + PathAutocomplete.path_empty = True + PathAutocomplete.prev_root = "" + PathAutocomplete.default_root = True + PathAutocomplete.show_files = False + PathAutocomplete.prev_prefix = "" + PathAutocomplete.prev_locations = [] + PathAutocomplete.view_id = None + + @staticmethod + def set_aliases(aliases): + PathAutocomplete.aliases = aliases + + @staticmethod + def set_show_files(show_files): + PathAutocomplete.show_files = show_files + + @staticmethod + def set_ignore_case(ignore_case): + PathAutocomplete.ignore_case = ignore_case + + @staticmethod + def set_view_id(view_id): + PathAutocomplete.view_id = view_id + + +def get_settings(view): + settings = sublime.load_settings("AdvancedNewFile.sublime-settings") + project_settings = {} + local_settings = {} + if view != None: + project_settings = view.settings().get('AdvancedNewFile', {}) + + for setting in SETTINGS: + local_settings[setting] = settings.get(setting) + + for key in project_settings: + if key in SETTINGS: + if key == "alias": + local_settings[key] = dict(local_settings[key].items() + project_settings.get(key).items()) + else: + local_settings[key] = project_settings[key] + else: + logger.error("AdvancedNewFile[Warning]: Invalid key '%s' in project settings.", key) + + return local_settings diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings new file mode 100644 index 0000000..76cdf33 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/AdvancedNewFile.sublime-settings @@ -0,0 +1,80 @@ +{ + // This setting contains a dictionary of aliases. The keys represent the + // alias names, the values represent the paths. + // NOTE: These should be absolute paths. Also, these paths should + // match your systems convention. For example, Windows machines should + // have paths similar to "C:\\Users\\username\\Desktop". *nix systems should + // have paths similar to "/home/username/desktop". + "alias": {}, + + // This is a secondary field for aliases. These aliases will be platform specific. + // The key for the entry will still represent the name to be used for the alias. + // Rather than being just a string path, the value will be a nested dictionary. + // The dictionary may have one of three keys, "windows", "linux", or "osx". + // The path used for this alias will be based on the operating system being used. + "os_specific_alias": {}, + + // A default initial value to fill the create new file input path with. + "default_initial": "", + + // A boolean defining if cursor text should be used. Text bound by single or + // double quotes or within a region will be used. If multiple cursors + // are used, the earliest selection containing a region or existing + // within quotes will be used. + // NOTE: A value read from cursor will override the default + // initial string setting. + "use_cursor_text": false, + + // A boolean value specifying if regular files should be included in the auto + // complete options. + "show_files": false, + + // A boolean specifying if the file path being created should be displayed in + // the status bar. + "show_path": true, + + // This value specifies the default directory when using AdvancedNewFile. + // Note it must be one of these values: + // project_folder - Default will be the folder index specified by the "default_folder_index" setting. + // current - Default will be the directory of the current view. + // home - Default will be the home folder (~/) + // path - Default will be defined by the setting "default_path" + // If the current view or top folder cannot be resolved, the home directory + // will be used. + "default_root": "project_folder", + + // A string specifying the default root to use. For this to be utilized, + // "default_root" must be set to "path" + "default_path": "~", + + // An integer value representing a folder index to be used when "folder" is specified + // for "default_root". If an index outside of the range of existing folders is used, + // it will default to 0 (the top level folder). + "default_folder_index": 0, + + + // This value specifies the root that will be used when resolving relative paths + // defined in aliases. For more information about valid values, see "default_root". + // Note that if "default_path" or "default_folder_index" is used, + // "alias_path" and "alias_folder_index" must be used for the respective entries. + "alias_root": "current", + + // A string specifying the path to use for the alias root. For this to be + // utilized, "alias_root" must be set to "path" + "alias_path": "~", + + // An integer value representing the folder index to use when "folder" is specified + // for "alias_root". If an index outside of the range of the existing folders is used, + // it will default to 0. + "alias_folder_index": 0, + + // A boolean specifying if case should be ignored when building + // auto complete list. + "ignore_case": false, + + // A boolean specifying if folders should automatically refresh and update the sidebar. + // In some builds, the sidebar does not refresh when contents of project folder are updated. + // This setting is required to refresh the sidebar in these circumstances. + // false by default + "auto_refresh_sidebar": false +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md new file mode 100644 index 0000000..55b5f3a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/CHANGELOG.md @@ -0,0 +1,51 @@ +# Changelog for AdvancedNewFile +- 2 February 2013 + - Update to be compatible with Sublime Text 3. +- 14 January 2013 + - Add `alias_root` setting, used with aliases with relative paths. + - Add setting to allow user to specify which folder from the project should be used. + - Bug fixes + - Do not require relative alias paths to begin with `./` + - Prevent duplicate entries from appearing in auto complete list. + +- 17 December 2012 + - Allow selected text to fill entry window. + - Basic work for continued autocompletion (Only applies if there is a single completion option) + - Bug fixes + - Properly display completions when using "ctrl+space" to manually display auto complete options. + - Prevent error pop up from occuring when explicitly creating a directory structure. + - Fix bug where using cursor text causes an error. + - Prevent spaces from being inserted when tab is without a possible completion. + +- 26 November 2012 + - Add setting to display path for file to be created in status bar. + - Add setting to set default base path (home, current, top_folder, path). + - Add setting to ignore case for auto completion. + - Add support for relative paths in alias. + - Add OS Specific Aliases to settings. + - Display an error when attempting to use an invalid alias. + - Display an error when attempting to open a directory in a view. + - Display an error if path creation fails. + - Bug Fixes + - Auto complete bug for files with spaces in their name + - Status bar update causing errors when no view is present. + - Specifying absolute paths for Windows produced unexpected behavior. + +- 30 October 2012 + - Initial work for tab autocompletion + - Files created when path entered + - Add setting to fill with a default value. + - Setting to prefill entry box with text in quotes. + - Add setting to display non directory files + - Add user defined aliases. + - Bug fixes. + - Prevent buffer from being opened when a directory is specified. + +- 20 April 2012 + - Add ability to specify top level folders + - Bug fixes + - Fix Windows keybindings + - Fix save issue on Windows + +- 29 October 2011 + - Initial release of AdvancedNewFile plugin diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap new file mode 100644 index 0000000..2ea7bc1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Linux).sublime-keymap @@ -0,0 +1,15 @@ +[ + { "keys": ["super+alt+n"], "command": "advanced_new_file"}, + { "keys": ["shift+super+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap new file mode 100644 index 0000000..2ea7bc1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (OSX).sublime-keymap @@ -0,0 +1,15 @@ +[ + { "keys": ["super+alt+n"], "command": "advanced_new_file"}, + { "keys": ["shift+super+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap new file mode 100644 index 0000000..11a180a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Default (Windows).sublime-keymap @@ -0,0 +1,16 @@ +[ + { "keys": ["ctrl+alt+n"], "command": "advanced_new_file"}, + { "keys": ["shift+ctrl+alt+n"], "command": "advanced_new_file", "args": {"is_python": true}}, + // Forces insert best autocomplete to run for advanced new file + { + "keys": ["tab"], + "command": "insert_best_completion", + "args": {"default": "", "exact": false}, + "context": [ + { "key": "advanced_new_file_completion"}, + { "key": "setting.tab_completion", "operator": "equal", "operand": true }, + { "key": "last_command", "operator": "not_equal", "operand": "insert_best_completion" }, + { "key": "auto_complete_visible" , "operator": "equal", "operand": false} + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt new file mode 100644 index 0000000..b086861 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/LICENSE.txt @@ -0,0 +1,18 @@ +The MIT License (MIT) + +Copyright (c) 2012 AdvancedNewFile authors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +sOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu new file mode 100644 index 0000000..1c773f6 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/Main.sublime-menu @@ -0,0 +1,90 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "AdvancedNewFile", + "children": + [ + { + "command": "open_file", + "args": {"file": "${packages}/AdvancedNewFile/README.md"}, + "caption": "README" + }, + { "caption": "-" }, + { + "command": "open_file", + "args": {"file": "${packages}/AdvancedNewFile/AdvancedNewFile.sublime-settings"}, + "caption": "Settings – Default" + }, + { + "command": "open_file", + "args": {"file": "${packages}/User/AdvancedNewFile.sublime-settings"}, + "caption": "Settings – User" + }, + { "caption": "-" }, + { + "command": "open_file", + "args": { + "file": "${packages}/AdvancedNewFile/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/AdvancedNewFile/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/AdvancedNewFile/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md new file mode 100644 index 0000000..d128cbf --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/README.md @@ -0,0 +1,181 @@ +# AdvancedNewFile +Advanced file creation for Sublime Text 2 and Sublime Text 3. + +## Overview + +This plugin allows for faster file creation within a project. Please see the [Features](https://github.com/skuroda/Sublime-AdvancedNewFile#features) section for more detailed information about advanced features. + +## Installation +Note with either method, you may need to restart Sublime Text 2 for the plugin to load. + +### Package Control +Installation through [package control](http://wbond.net/sublime_packages/package_control) is recommended. It will handle updating your packages as they become available. To install, do the following. + +* In the Command Palette, enter `Package Control: Install Package` +* Search for `AdvancedNewFile` +* In the Command Palette, enter `Package Control :Enable Package` -> select AdvancedNewFile + +### Manual +Clone or copy this repository into the packages directory. By default, they are located at: + +* OS X: ~/Library/Application Support/Sublime Text 2/Packages/ +* Windows: %APPDATA%/Roaming/Sublime Text 2/Packages/ +* Linux: ~/.config/sublime-text-2/Packages/ + +## Usage +Simply bring up the AdvancedNewFile input through the appropriate [key binding](https://github.com/skuroda/Sublime-AdvancedNewFile). Then, enter the path, along with the file name into the input field. Upon pressing enter, the file will be created. In addition, if the directories specified do not yet exists, they will also be created. For more advanced usage of this plugin, be sure to look at [Advanced Path Usage](https://github.com/skuroda/Sublime-AdvancedNewFile#advanced-path-usage). By default, the path to the file being created will be filled shown in the status bar as you enter the path information. + +**Default directory:** +The default directory is specified by the `default_root` setting. By default, it will be the top directory of the folders listed in the window. If this cannot be resolved, the home directory will be used. See [Settings](https://github.com/skuroda/Sublime-AdvancedNewFile#settings) (`default_root`) for more information. + +## Keymaps +If you have issues with keymaps, consider running [FindKeyConflicts](https://github.com/skuroda/FindKeyConflicts), also available through the package manager. Alternatively, set command logging to true by entering `sublime.log_commands(True)` in the Sublime Text console. + +### Windows +`ctrl+alt+n`: General keymap to create new files. + +`ctrl+shift+alt+n`: In addition to creating the folders specified, new folders will also contain an `__init__.py` file. + +### OS X and Linux +The super keys for Linux and OS X are the Windows and command key respectively. + +`super+alt+n`: General keymap to create new files. + +`shift+super+alt+n`: In addition to creating the folders specified, new folders will also contain an `__init__.py` file. + +## Settings +`alias`: + +A dictionary that contains a set of aliases tied to a directory. For more information, see [Aliases](https://github.com/skuroda/Sublime-AdvancedNewFile#aliases) + +`os_specific_alias`: + +A dictionary containing a set of aliases tied to a directory. These aliases will be platform specific. For more information, see [Platform Specific Aliases](https://github.com/skuroda/Sublime-AdvancedNewFile#platform-specific-aliases) + +`default_initial`: + +A string that will be automatically inserted into the new file creation input. + +`use_cursor_text`: + +A boolean value determining if text from a buffer, bound by quotes or a selected region, will be auto inserted into the new file generation input field. If multiple cursors are used, the first entry either contained in quotes, are a selected region, will be used. + +`show_files`: + +A boolean value determining if regular files should be included in the autocompletion list. + +`show_path`: + +A boolean value used to determine if the path of the file to be created should be displayed in the status bar. + +`default_root`: + +This value is used to determine the default root when using AdvancedNewFile. It must be one of the following values: + +* `project_folder`- The default path will be the folder specified by the 'default_folder_index' setting. +* `current` - The default path will be the directory of the current active view. +* `home` - The default path will be your home directory. +* `path` - The default path will be defined by the setting `default_path` + +If the current view's directory cannot be resolved, the top level folder in the window will be used. If the top level folder in the window cannot be resolved either, the home directory will be used. + +`default_path`: + +This path is used as the default if `path` has been specified for the setting `default_root`. This path should be absolute. If a relative path is specified, it will be relative to the AdvancedNewFile package directory. + +`default_folder_index`: + +An integer value representing a folder index to be used when "folder" is specified for "default_root". If an index outside of the range of existing folders is used, it will default to 0 (the top level folder). + +`alias_root`: + +This entry defines the root that will be used when resolving aliases defined as relative paths. For more information about valid entries, see `default_root`. Note that for path, `alias_path` will be specified. + +`alias_path`: + +This path is used as the default if `path` has been specified for the setting `alias_root`. + +`alias_folder_index`: + +An integer value representing the folder index to use when "folder" is specified for "alias_root". If an index outside of the range of the existing folders is used, it will default to 0. + +`ignore_case`: + +A boolean specifying if case should be ignored when building auto complete list. + +`auto_refresh_sidebar`: + +A boolean specifying if folders should automatically refresh and update the sidebar. In some builds, the sidebar does not refresh when contents of project folder are updated. This setting is required to refresh the sidebar in these circumstances. False by default. + +### Project Specific Settings +All of the above settings can also be specified as part of the project specific settings. These values override any previous values set by higher level settings, with aliases being an exception. Alias settings will be merged with higher level configurations for alias. In addition, if the same alias exist for both default/user settings and project settings, the project setting will take precedence. + + "settings": + { + "AdvancedNewFile": + { + "default_initial": "/project/specific/path" + } + } + + +## Features +#### __init__.py creation: +This plugin may optionally create `__init__` in the created directories. Please reference [Key Maps](https://github.com/skuroda/Sublime-AdvancedNewFile#keymaps) to see the default key bindings to do this. + +#### Tab Autocompletion: +After typing in a partial path, simply press tab to autocomplete it. Continue to press tab to cycle through the options. + +### Advanced Path Usage +#### Home directory: +To begin at the home directory simply start with `~/` like you would in the shell. + +#### Aliases: +You can create an alias to quickly navigate to a directory. Simply type in the alias followed by a colon. Then specify the path as you would normally. Note, in an event a specified alias conflicts with a [predefined alias](https://github.com/skuroda/Sublime-AdvancedNewFile#predefined-aliases), the specified alias will take precedence. + +Alias paths may be relative or absolute. If a relative path is specified, the `alias_root` setting will be used as the base. When specifying absolute paths, be sure to use the system specific style (e.g. Windows `C:\\Users\\username\\Desktop`, OS X and Linix `/home/username/desktop/`). In addition, you may specify an alias from the home directory by using `~/`. + +If an invalid alias is specified, an error pop up will be displayed when trying to create the file. + +Sample aliases: + + { + "alias": { + "Desktop": "~/Desktop/" + } + } + +To use the above alias, when specifying a new file enter `Desktop:testDir/testFile`, which would then create a file at `/Desktop/testDir/testFile`. + +##### Platform Specific Aliases +You can also create aliases that are platform specific. These follow a similar set of rules as aliases. However, rather than specifying a string path to use, a dictionary is specified. This dictionary may contain the following keys: `windows`, `linux`, and `osx`. The path for this particular alias will be used based on the operating system in use. If the same alias is specified in both `alias` and `os_specific_alias`, the path in `os_specific_alias` will be used. + +Sample OS Specific Aliases: + + { + "os_specific_alias": { + "subl_packages" { + "windows": "~\\AppData\\Roaming\\Sublime Text 2\\Packages", + "linux": "~/.config/sublime-text-2/Packages", + "osx": "~/Library/Application Support/Sublime Text 2/Packages" + } + } + } + +##### Predefined Aliases +###### Top level folders in window +Top level folders can be specified by typing in the name of the folder followed by a colon. Then specify the path as you would normally. + +###### Current Working Directory +To specify the current working directory, simply type a colon, without any preceding text. + +## Notes +Thanks to Dima Kukushkin ([xobb1t](https://github.com/xobb1t)) for the original work on this plugin. Also, thank you to [facelessuser](https://github.com/facelessuser), and by extension biermeester and matthjes for the idea of platform specific settings. + +### Contributors +* [xobb1t](https://github.com/xobb1t) +* [edmundask](https://github.com/edmundask) +* [alirezadot](https://github.com/alirezadot) +* [aventurella](https://github.com/aventurella) +* [skuroda](https://github.com/skuroda) + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json new file mode 100644 index 0000000..5fb2ced --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages.json @@ -0,0 +1,7 @@ +{ + "install": "messages/install.txt", + "2012.11.08.20.00.00": "messages/1.txt", + "2012.11.12.11.00.00": "messages/2.txt", + "2012.11.26.11.00.00": "messages/3.txt", + "2012.12.17.11.00.00": "messages/4.txt" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt new file mode 100644 index 0000000..ce62ab0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/1.txt @@ -0,0 +1 @@ +The repository has now been transferred to the proper URL. If you experienced any issues while this transition was occuring, my apologies. Please take a look at the README for new enhancments if you have not done so already. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt new file mode 100644 index 0000000..65d14f3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/2.txt @@ -0,0 +1,10 @@ +New Features/Enhancements: + +- Add setting to display path for file to be created in status bar. - Default true +- Add setting to set default base path (home, current, top_folder, path). - Default "top_folder" +- Add support for relative paths in alias. + +Please see the README for more information about the new settings. + +Bug Fixes: +- Auto complete bug for files with spaces in their name diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt new file mode 100644 index 0000000..06c1553 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/3.txt @@ -0,0 +1,12 @@ +New Features/Enhancements: + +- Add OS Specific Aliases to settings. +- Display an error when attempting to use an invalid alias. +- Display an error when attempting to open a directory in a view. +- Display an error if path creation fails. + +Please see the README for more information about the new settings. + +Bug Fixes: +- Status bar update causing errors when no view is present. +- Specifying absolute paths for Windows produced unexpected behavior. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt new file mode 100644 index 0000000..5e24c4c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/4.txt @@ -0,0 +1,12 @@ +New Features/Enhancements: + +- Enabling "use_cursor_text" will fill with selected regions. The first cursor/region to match the conditions (region or quoted section) will be used. +- Autocompleting with tab where there is only a single completion option will continue completion on subsequent directories. + +Please see the README for more information about the new settings. + +Bug Fixes: +- Properly display completions when using "ctrl+space" to manually display auto complete options. +- Prevent error pop up from occuring when explicitly creating a directory structure. +- Fix bug where using cursor text causes an error. +- Prevent spaces from being inserted when tab is without a possible completion. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt new file mode 100644 index 0000000..871cba0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/messages/install.txt @@ -0,0 +1,9 @@ +Thank you for installing the AdvancedNewFile plugin. + +For more information please visit https://github.com/skuroda/Sublime-AdvancedNewFile. + +Note you may need to restart Sublime Text 2 after installing this plugin. + +If you have any questions, comments, or run into issues, please let me know! Hope you enjoy the plugin. + +Thank you! \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json new file mode 100644 index 0000000..c8ced63 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/AdvancedNewFile/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/skuroda/Sublime-AdvancedNewFile", "version": "2013.04.02.21.22.36", "description": "File creation plugin for Sublime Text 2 and Sublime Text 3."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore new file mode 100644 index 0000000..298d177 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/.gitignore @@ -0,0 +1,7 @@ +# Environment-specific files such as configuration, logs, and setup +*.pyc + +# Misc and OS files +Desktop.ini # Directory atttributes in Windows. +Thumbs.db # Picture thumbnail cache in Windows 98. +.DS_Store # Directory attributes in Mac OS X. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE new file mode 100644 index 0000000..6dd5395 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Joe Esposito + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md new file mode 100644 index 0000000..2632673 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/README.md @@ -0,0 +1,74 @@ +Console Exec +============ + +Plugin for [Sublime Text 2][sublime] to execute a command in a console +window. After the process exits, the console remains open and displays +**"Press any key to exit"** before closing. + +This plugin is based on the exec command shipped with Sublime Text, and +uses the launcher that ships with [Crimson Editor][crimson] +to wait for a keypress before closing the window. + +![Running a Flask application screenshot][example] + +Source [available on Github][repo]. + +[sublime]: http://www.sublimetext.com +[crimson]: http://crimsoneditor.com +[example]: https://raw.github.com/joeyespo/sublimetext-console-exec/master/examples/flask_application_screenshot.png +[repo]: http://github.com/joeyespo/sublimetext-console-exec + + +Why? +---- + +Aside from personal preference of having an external console in web projects, + +- Sublime leaves your background process running when you quit +- Rebuilding a project overwrites your running process, leaking processes if you're not careful +- Certain environments such as [Pyglet][] will not run within the integrated console window + +This plugin ties these loose ends in a familiar way. + +[Pyglet]: http://www.pyglet.org + + +Usage +----- + +In any **.sublime-build** file add the following line to run it in a console: + + "target": "console_exec" + +For example, here's a modified **Python.sublime-build** file: + + { + "cmd": ["python", "-u", "$file"], + "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", + "selector": "source.python", + "target": "console_exec" + } + +Note: you can find the appropriate build file from **"Browse Packages..."** + + +Installation +------------ + +With [Sublime Package Control][package_control], simply + +1. Select **Package Control: Install Package** from the command palette +2. Locate **ConsoleExec** and press enter to install it + +[package_control]: http://wbond.net/sublime_packages/package_control + +#### Manual installation (advanced) + +Clone this repository into the Packages directory. +To see where it's located enter `print sublime.packages_path()` in the console. + + +Notes +----- + +This plugin is Windows-only for the moment. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py new file mode 100644 index 0000000..40b0a51 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/console_exec.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +""" +Console Exec + +Plugin for Sublime Text 2 to execute a command and redirect its output +into a console window. This is based on the default exec command. +""" + +import sublime +import sublime_plugin +import os +import sys +import subprocess +import time + + +class Process(object): + def __init__(self, arg_list, env, listener, + # "path" is an option in build systems + path='', + # "shell" is an options in build systems + shell=False): + + self.listener = listener + self.killed = False + + self.start_time = time.time() + + # Set temporary PATH to locate executable in arg_list + if path: + old_path = os.environ["PATH"] + # The user decides in the build system whether he wants to append $PATH + # or tuck it at the front: "$PATH;C:\\new\\path", "C:\\new\\path;$PATH" + os.environ["PATH"] = os.path.expandvars(path).encode(sys.getfilesystemencoding()) + + proc_env = os.environ.copy() + proc_env.update(env) + for k, v in proc_env.iteritems(): + proc_env[k] = os.path.expandvars(v).encode(sys.getfilesystemencoding()) + + self.proc = subprocess.Popen(arg_list, env=proc_env, shell=shell) + + if path: + os.environ["PATH"] = old_path + + def kill(self): + if not self.killed: + self.killed = True + self.proc.terminate() + self.listener = None + + def poll(self): + return self.proc.poll() == None + + +class ConsoleExecCommand(sublime_plugin.WindowCommand): + def run(self, cmd=[], file_regex='', line_regex='', working_dir='', encoding='utf-8', env={}, quiet=False, kill=False, **kwargs): + launcher = os.path.join(sublime.packages_path(), 'ConsoleExec', 'launch.exe') + if not os.path.exists(launcher): + if not quiet: + print 'Error: Could not find the ConsoleExec package.' + return + cmd = [launcher] + map(lambda s: '"%s"' % s if ' ' in s else s, cmd) + + if kill: + if self.proc: + self.proc.kill() + self.proc = None + return + + # Default the to the current files directory if no working directory was given + if (working_dir == '' and self.window.active_view() + and self.window.active_view().file_name()): + working_dir = os.path.dirname(self.window.active_view().file_name()) + + # Call get_output_panel a second time after assigning the above + # settings, so that it'll be picked up as a result buffer + self.window.get_output_panel("exec") + + self.encoding = encoding + self.quiet = quiet + + self.proc = None + if not self.quiet: + print "Running " + " ".join(cmd) + sublime.status_message("Building") + + merged_env = env.copy() + if self.window.active_view(): + user_env = self.window.active_view().settings().get('build_env') + if user_env: + merged_env.update(user_env) + + # Change to the working dir, rather than spawning the process with it, + # so that emitted working dir relative path names make sense + if working_dir != '': + os.chdir(working_dir) + + # Forward kwargs to Process + self.proc = Process(cmd, merged_env, self, **kwargs) + + def is_enabled(self, kill=False): + if kill: + return hasattr(self, 'proc') and self.proc and self.proc.poll() + else: + return True diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json new file mode 100644 index 0000000..d14d21c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/joeyespo/sublimetext-console-exec", "version": "1.0.0", "description": "Plugin for Sublime Text 2 to execute a command in a console window."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json new file mode 100644 index 0000000..3cb0263 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/ConsoleExec/packages.json @@ -0,0 +1,20 @@ +{ + "schema_version": "1.2", + "packages": [ + { + "name": "ConsoleExec", + "description": "Plugin for Sublime Text 2 to execute a command in a console window.", + "author": "Joe Esposito", + "homepage": "https://github.com/joeyespo/sublimetext-console-exec", + "last_modified": "2012-12-12 20:00:00", + "platforms": { + "windows": [ + { + "version": "1.0.0", + "url": "https://nodeload.github.com/joeyespo/sublimetext-console-exec/zipball/master" + } + ] + } + } + ] +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore new file mode 100644 index 0000000..00c4ea8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/.gitignore @@ -0,0 +1,4 @@ +*.pyc +*.cache +*.sublime-project +package-metadata.json \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py new file mode 100644 index 0000000..a2e8f93 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.py @@ -0,0 +1,299 @@ +# coding=utf8 +import sublime, sublime_plugin +import codecs +import sys +import os +# sys.path.append(os.path.join(sublime.packages_path(), 'EncodingHelper', 'chardet')) +from chardet.universaldetector import UniversalDetector +import re +import threading +import time + +# don't parse binary files, just mark these as binary + #IMAGES-------------------------------------#sublime---------------#fonts-----------#compressed----------------#audio-video--------------------------------------------------#docs------------------------------#misc +BINARY = re.compile('\.(apng|png|jpg|gif|jpeg|bmp|psd|ai|cdr|ico|cache|sublime-package|eot|svgz|ttf|woff|zip|tar|gz|rar|bz2|jar|xpi|mov|mpeg|avi|mpg|flv|wmv|mp3|wav|aif|aiff|snd|wma|asf|asx|pcm|pdf|doc|docx|xls|xlsx|ppt|pptx|rtf|sqlite|sqlitedb|fla|swf|exe)$', re.I); + +SETTINGS = sublime.load_settings('EncodingHelper.sublime-settings') + +class EncodingOnStatusBarListener(sublime_plugin.EventListener): + + def on_load(self, v, ok = True): + + if not v: + return + if v.encoding() == 'Undefined' and ok: + # give time to sublime just one time + sublime.set_timeout(lambda:self.on_load(v, False), 120) + return + elif v.encoding() == 'Undefined' and not ok: + v.settings().set('encoding_helper_encoding_sublime', 'UTF-8') + + # if enabled, show encoding on status bar + if bool(SETTINGS.get('show_encoding_on_status_bar', True)): + + # mark as loading + v.settings().set('encoding_helper_loading', True) + + if not v.settings().has('encoding_helper_encoding_sublime'): + v.settings().set('encoding_helper_encoding_sublime', v.encoding()) + + #has cached state? + if v.settings().has('encoding_helper_encoding'): + v.settings().erase('encoding_helper_loading') + encoding = v.settings().get('encoding_helper_encoding') + encoding_sublime = v.settings().get('encoding_helper_encoding_sublime') + v.set_status('encoding_helper_statusbar', encoding) + if encoding_sublime != '' and encoding_sublime != encoding and encoding != 'BINARY' and encoding != 'Unknown': + v.set_status('encoding_helper_statusbar_convertion_status', 'Opened as '+encoding_sublime+' (document maybe broken)') + else: + # is the file is there + file_name = v.file_name() + if not file_name or file_name == '' or os.path.isfile(file_name) == False: + v.settings().erase('encoding_helper_loading') + v.set_status('encoding_helper_statusbar', ''); + #guess + else: + v.set_status('encoding_helper_statusbar', ''); + #print 'GuessEncoding' + GuessEncoding(file_name, SETTINGS.get('fallback_encodings'), v).start() + else: + v.erase_status('encoding_helper_statusbar') + + def on_activated(self, v): + if bool(SETTINGS.get('show_encoding_on_status_bar', True)): + if v.settings().has('encoding_helper_loading'): + pass + else: + if not v.is_loading(): + self.on_load(v) + else: + v.erase_status('encoding_helper_statusbar') + +SETTINGS.add_on_change('reload', lambda: EncodingOnStatusBarListener().on_load(sublime.active_window().active_view())) + +class GuessEncoding(threading.Thread): + + def __init__(self, file_name, fallback_encodings = [], v = False, callback = False): + threading.Thread.__init__(self) + self.file_name = file_name + + encoding_list = [] + for encoding in fallback_encodings: + if encoding != 'ISO88591' and encoding != 'iso88591' and encoding != 'iso-8859-1' and encoding != 'ISO-8859-1': + encoding_list.append(encoding) + self.fallback_encodings = encoding_list + + self.v = v + if callback == False: + self.callback = self.on_done + else: + self.callback = callback + + def run(self): + confidence = 0 + size = os.stat(self.file_name).st_size + if BINARY.search(self.file_name): + encoding = 'BINARY' + confidence = 1 + elif size > 1048576 and maybe_binary(self.file_name): + encoding = 'BINARY' + confidence = 0.7 + elif size > 1048576: # skip files > 1Mb + encoding = 'Unknown' + confidence = 1 + else: + started_at = time.time() + timeout = False + + detector = UniversalDetector() + fp = open(self.file_name, 'rb') + line = fp.readline(500) + while line != '': + detector.feed(line) + if time.time() - started_at > 8: + timeout = True + break + line = fp.readline(8000) + fp.close() + detector.close() + if timeout == False or (timeout == True and detector.done): + encoding = str(detector.result['encoding']).upper() + confidence = detector.result['confidence'] + else: + encoding = 'Unknown' + confidence = 1 + + if encoding == 'ASCII': + encoding = 'UTF-8' + elif encoding == None or encoding == 'NONE' or encoding == '' or encoding == 'Unknown' or confidence < 0.7: + if encoding == 'ISO-8859-2' and confidence > 0.69: + workaround = self.test_fallback_encodings(['UTF-8', 'ISO-8859-1']) + if workaround != False: + encoding = workaround + else: + encoding = 'Unknown' + elif encoding != 'ISO-8859-2' and confidence > 0.49: + if encoding == 'WINDOWS-1252': + encoding = 'ISO-8859-1' + else: + fallback = self.test_fallback_encodings() + if fallback == False: + encoding = 'Unknown' + else: + encoding = fallback + + # workarounds here + if encoding == 'ISO-8859-2' or encoding == 'MACCYRILLIC': + workaround = self.test_fallback_encodings(['UTF-8', 'ISO-8859-1']) + if workaround != False: + encoding = workaround + + del detector + sublime.set_timeout(lambda:self.callback(encoding, confidence), 0) + + def test_fallback_encodings(self, encodings = False): + if encodings == False: + encodings = self.fallback_encodings + for encoding in encodings: + _encoding = translateCodec(encoding.lower()) + try: + fp = codecs.open(self.file_name, "rb", _encoding, errors='strict') + line = fp.readline(500) + while line != '': + line = fp.readline(8000) + fp.close() + return encoding + except UnicodeDecodeError: + fp.close() + return False + + def on_done(self, encoding, confidence): + if self.v: + self.v.settings().set('encoding_helper_encoding', encoding) + self.v.settings().set('encoding_helper_confidence', confidence) + self.v.set_status('encoding_helper_statusbar', encoding) + + if not self.v.settings().has('encoding_helper_encoding_sublime'): + self.v.settings().set('encoding_helper_encoding_sublime', self.v.encoding()) + encoding_sublime = self.v.settings().get('encoding_helper_encoding_sublime') + + if encoding in SETTINGS.get('open_automatically_as_utf8', []) and self.v.is_dirty() == False: + ConvertToUTF8(self.file_name, encoding, self.v).start() + else: + if encoding_sublime != '' and encoding_sublime != encoding and encoding != 'BINARY' and encoding != 'Unknown': + self.v.set_status('encoding_helper_statusbar_convertion_status', 'Opened as '+encoding_sublime+' (document maybe broken)') + self.v.settings().erase('encoding_helper_loading') + +class Toutf8fromBestGuessCommand(sublime_plugin.WindowCommand): + + def run(self): + encoding = sublime.active_window().active_view().settings().get('encoding_helper_encoding') + if encoding != None and encoding != 'UTF-8' and encoding != 'BINARY' and encoding != 'Unknown' and encoding != '': + Toutf8fromCommand(sublime_plugin.WindowCommand).run(encoding) + + def description(self): + try: + encoding = sublime.active_window().active_view().settings().get('encoding_helper_encoding') + if encoding != None and encoding != 'UTF-8' and encoding != 'BINARY' and encoding != 'Unknown' and encoding != '': + return 'Convert to UTF-8 From '+encoding + else: + return 'Convert to UTF-8 From Best Guess' + except: + return 'Convert to UTF-8 From Best Guess' + + def is_enabled(self): + try: + encoding = sublime.active_window().active_view().settings().get('encoding_helper_encoding') + if encoding != None and encoding != 'UTF-8' and encoding != 'BINARY' and encoding != 'Unknown' and encoding != '': + return True + except: + return False + +class Toutf8fromCommand(sublime_plugin.WindowCommand): + + def run(self, encoding = ''): + try: + if encoding == None or encoding == 'UTF-8' or encoding == 'BINARY' or encoding == 'Unknown' or encoding == '': + return False + v = sublime.active_window().active_view() + file_name = v.file_name() + if not file_name or file_name == '' or os.path.isfile(file_name) == False: + return False + else: + ConvertToUTF8(file_name, encoding, v).start() + return True + except: + return False + + def is_enabled(self, encoding = ''): + try: + file_name = sublime.active_window().active_view().file_name() + if not file_name or file_name == '' or os.path.isfile(file_name) == False: + return False + else: + return True + except: + return False + +class ConvertToUTF8(threading.Thread): + + def __init__(self, file_name, encoding, v = False, callback = False): + threading.Thread.__init__(self) + self.file_name = file_name + + self.encoding = encoding + self.v = v + if callback == False: + self.callback = self.on_done + else: + self.callback = callback + + def run(self): + _encoding = translateCodec(self.encoding.lower()) + try: + content = codecs.open(self.file_name, "rb", _encoding, errors='strict').read() + if len(content) != 0: + sublime.set_timeout(lambda:self.callback(content, self.encoding), 0) + except UnicodeDecodeError, e: + print e + sublime.set_timeout(lambda:self.on_error(self.file_name, self.encoding), 0) + except LookupError, e: + print e + sublime.set_timeout(lambda:self.on_lookup_error(self.file_name, self.encoding), 0) + + def on_done(self, content, encoding): + if self.v: + edit = self.v.begin_edit() + self.v.replace(edit, sublime.Region(0, self.v.size()), content); + self.v.end_edit(edit) + self.v.settings().set('encoding_helper_encoding_sublime', 'UTF-8') + self.v.settings().set('encoding_helper_encoding', 'UTF-8') + if bool(SETTINGS.get('show_encoding_on_status_bar', True)): + self.v.set_status('encoding_helper_statusbar', 'UTF-8') + self.v.set_status('encoding_helper_statusbar_convertion_status', 'Converted to UTF-8 from '+encoding) + + def on_error(self, file_name, encoding): + sublime.error_message('Unable to convert to UTF-8 from encoding "'+encoding+'" the file: \n'+file_name); + + def on_lookup_error(self, file_name, encoding): + sublime.error_message('The encoding "'+encoding+'" is unknown in this system.\n Unable to convert to UTF-8 the file: \n'+file_name); + +def maybe_binary(file_name): + fp = open(file_name, 'rb') + line = fp.readline(500) + read = 500 + while line != '': + if '\0' in line: + fp.close() + return True + read += 8000 + if read > 1048576: + fp.close() + return False + line = fp.readline(8000) + fp.close() + return False + +# should map different codecs to what codec.open except to receive +def translateCodec(encoding): + return str(encoding) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings new file mode 100644 index 0000000..91a9b46 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/EncodingHelper.sublime-settings @@ -0,0 +1,13 @@ +{ + // To show encoding on status bar + "show_encoding_on_status_bar" : true, + + // Additional encodings to test when no acurrated guess can be done + // NOTE: Don't add ISO-8859-1 + "fallback_encodings": [ ], + + // Automatically opens as UTF-8 the following encodings list + // NOTE: Encoding detection is not acurrated + // don't abuse of this feature + "open_automatically_as_utf8": [ ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu new file mode 100644 index 0000000..39ef36b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Main.sublime-menu @@ -0,0 +1,291 @@ +[ + { + "caption": "Edit", + "mnemonic": "E", + "id": "edit", + "children":[ + { "caption": "-", "id": "encoding-separator" }, + + {"command":"toutf8from_best_guess"}, + {"caption": "Convert to UTF-8 From Encoding", + "children": + [ + //ALL + {"caption":"Complete List Sorted", "children": + [ + {"caption":"BIG5", "command":"toutf8from","args": {"encoding":"BIG5" } }, + {"caption":"BIG5HKSCS", "command":"toutf8from","args": {"encoding":"BIG5HKSCS" } }, + {"caption":"-"}, + {"caption": "CP", "children": + [ + {"caption":"CP037", "command":"toutf8from","args": {"encoding":"CP037" } }, + {"caption":"CP424", "command":"toutf8from","args": {"encoding":"CP424" } }, + {"caption":"CP437", "command":"toutf8from","args": {"encoding":"CP437" } }, + {"caption":"CP500", "command":"toutf8from","args": {"encoding":"CP500" } }, + {"caption":"CP720", "command":"toutf8from","args": {"encoding":"CP720" } }, + {"caption":"CP737", "command":"toutf8from","args": {"encoding":"CP737" } }, + {"caption":"CP775", "command":"toutf8from","args": {"encoding":"CP775" } }, + {"caption":"CP850", "command":"toutf8from","args": {"encoding":"CP850" } }, + {"caption":"CP852", "command":"toutf8from","args": {"encoding":"CP852" } }, + {"caption":"CP855", "command":"toutf8from","args": {"encoding":"CP855" } }, + {"caption":"CP856", "command":"toutf8from","args": {"encoding":"CP856" } }, + {"caption":"CP857", "command":"toutf8from","args": {"encoding":"CP857" } }, + {"caption":"CP858", "command":"toutf8from","args": {"encoding":"CP858" } }, + {"caption":"CP860", "command":"toutf8from","args": {"encoding":"CP860" } }, + {"caption":"CP861", "command":"toutf8from","args": {"encoding":"CP861" } }, + {"caption":"CP862", "command":"toutf8from","args": {"encoding":"CP862" } }, + {"caption":"CP863", "command":"toutf8from","args": {"encoding":"CP863" } }, + {"caption":"CP864", "command":"toutf8from","args": {"encoding":"CP864" } }, + {"caption":"CP865", "command":"toutf8from","args": {"encoding":"CP865" } }, + {"caption":"CP866", "command":"toutf8from","args": {"encoding":"CP866" } }, + {"caption":"CP869", "command":"toutf8from","args": {"encoding":"CP869" } }, + {"caption":"CP874", "command":"toutf8from","args": {"encoding":"CP874" } }, + {"caption":"CP875", "command":"toutf8from","args": {"encoding":"CP875" } }, + {"caption":"CP932", "command":"toutf8from","args": {"encoding":"CP932" } }, + {"caption":"CP949", "command":"toutf8from","args": {"encoding":"CP949" } }, + {"caption":"CP950", "command":"toutf8from","args": {"encoding":"CP950" } }, + {"caption":"CP1006", "command":"toutf8from","args": {"encoding":"CP1006" } }, + {"caption":"CP1026", "command":"toutf8from","args": {"encoding":"CP1026" } }, + {"caption":"CP1140", "command":"toutf8from","args": {"encoding":"CP1140" } }, + {"caption":"CP1250", "command":"toutf8from","args": {"encoding":"CP1250" } }, + {"caption":"CP1251", "command":"toutf8from","args": {"encoding":"CP1251" } }, + {"caption":"CP1252", "command":"toutf8from","args": {"encoding":"CP1252" } }, + {"caption":"CP1253", "command":"toutf8from","args": {"encoding":"CP1253" } }, + {"caption":"CP1254", "command":"toutf8from","args": {"encoding":"CP1254" } }, + {"caption":"CP1255", "command":"toutf8from","args": {"encoding":"CP1255" } }, + {"caption":"CP1256", "command":"toutf8from","args": {"encoding":"CP1256" } }, + {"caption":"CP1257", "command":"toutf8from","args": {"encoding":"CP1257" } }, + {"caption":"CP1258", "command":"toutf8from","args": {"encoding":"CP1258" } } + ]}, + {"caption":"-"}, + {"caption":"EUC JIS 2004", "command":"toutf8from","args": {"encoding":"EUC_JIS_2004" } }, + {"caption":"EUC JISX0213", "command":"toutf8from","args": {"encoding":"EUC_JISX0213" } }, + {"caption":"EUC JP", "command":"toutf8from","args": {"encoding":"EUC_JP" } }, + {"caption":"EUC KR", "command":"toutf8from","args": {"encoding":"EUC_KR" } }, + {"caption":"-"}, + {"caption":"GB2312", "command":"toutf8from","args": {"encoding":"GB2312" } }, + {"caption":"GB18030", "command":"toutf8from","args": {"encoding":"GB18030" } }, + {"caption":"GBK", "command":"toutf8from","args": {"encoding":"GBK" } }, + {"caption":"-"}, + {"caption":"HZ", "command":"toutf8from","args": {"encoding":"HZ" } }, + {"caption":"-"}, + {"caption": "ISO", "children": + [ + {"caption":"ISO2022 JP 1", "command":"toutf8from","args": {"encoding":"ISO2022_JP_1" } }, + {"caption":"ISO2022 JP 2", "command":"toutf8from","args": {"encoding":"ISO2022_JP_2" } }, + {"caption":"ISO2022 JP 3", "command":"toutf8from","args": {"encoding":"ISO2022_JP_3" } }, + {"caption":"ISO2022 JP 2004", "command":"toutf8from","args": {"encoding":"ISO2022_JP_2004" } }, + {"caption":"ISO2022 JP EXT", "command":"toutf8from","args": {"encoding":"ISO2022_JP_EXT" } }, + {"caption":"ISO2022 JP", "command":"toutf8from","args": {"encoding":"ISO2022_JP" } }, + {"caption":"ISO2022 KR", "command":"toutf8from","args": {"encoding":"ISO2022_KR" } }, + {"caption":"-"}, + {"caption":"ISO8859 1", "command":"toutf8from","args": {"encoding":"ISO8859_1" } }, + {"caption":"ISO8859 2", "command":"toutf8from","args": {"encoding":"ISO8859_2" } }, + {"caption":"ISO8859 3", "command":"toutf8from","args": {"encoding":"ISO8859_3" } }, + {"caption":"ISO8859 4", "command":"toutf8from","args": {"encoding":"ISO8859_4" } }, + {"caption":"ISO8859 5", "command":"toutf8from","args": {"encoding":"ISO8859_5" } }, + {"caption":"ISO8859 6", "command":"toutf8from","args": {"encoding":"ISO8859_6" } }, + {"caption":"ISO8859 7", "command":"toutf8from","args": {"encoding":"ISO8859_7" } }, + {"caption":"ISO8859 8", "command":"toutf8from","args": {"encoding":"ISO8859_8" } }, + {"caption":"ISO8859 9", "command":"toutf8from","args": {"encoding":"ISO8859_9" } }, + {"caption":"ISO8859 10", "command":"toutf8from","args": {"encoding":"ISO8859_10" } }, + {"caption":"ISO8859 13", "command":"toutf8from","args": {"encoding":"ISO8859_13" } }, + {"caption":"ISO8859 14", "command":"toutf8from","args": {"encoding":"ISO8859_14" } }, + {"caption":"ISO8859 15", "command":"toutf8from","args": {"encoding":"ISO8859_15" } }, + {"caption":"ISO8859 16", "command":"toutf8from","args": {"encoding":"ISO8859_16" } } + ]}, + {"caption":"-"}, + {"caption":"JOHAB", "command":"toutf8from","args": {"encoding":"JOHAB" } }, + {"caption":"KOI8 R", "command":"toutf8from","args": {"encoding":"KOI8_R" } }, + {"caption":"KOI8 U", "command":"toutf8from","args": {"encoding":"KOI8_U" } }, + {"caption":"LATIN 1", "command":"toutf8from","args": {"encoding":"LATIN_1" } }, + {"caption":"-"}, + {"caption":"MAC CYRILLIC", "command":"toutf8from","args": {"encoding":"MAC_CYRILLIC" } }, + {"caption":"MAC GREEK", "command":"toutf8from","args": {"encoding":"MAC_GREEK" } }, + {"caption":"MAC ICELAND", "command":"toutf8from","args": {"encoding":"MAC_ICELAND" } }, + {"caption":"MAC LATIN2", "command":"toutf8from","args": {"encoding":"MAC_LATIN2" } }, + {"caption":"MAC ROMAN", "command":"toutf8from","args": {"encoding":"MAC_ROMAN" } }, + {"caption":"MAC TURKISH", "command":"toutf8from","args": {"encoding":"MAC_TURKISH" } }, + {"caption":"-"}, + {"caption":"PTCP154", "command":"toutf8from","args": {"encoding":"PTCP154" } }, + {"caption":"-"}, + {"caption":"SHIFT JIS", "command":"toutf8from","args": {"encoding":"SHIFT_JIS" } }, + {"caption":"SHIFT JIS 2004", "command":"toutf8from","args": {"encoding":"SHIFT_JIS_2004" } }, + {"caption":"SHIFT JISX0213", "command":"toutf8from","args": {"encoding":"SHIFT_JISX0213" } }, + {"caption":"-"}, + {"caption": "UTF", "children": + [ + {"caption":"UTF 7", "command":"toutf8from","args": {"encoding":"UTF_7" } }, + {"caption":"UTF 16", "command":"toutf8from","args": {"encoding":"UTF_16" } }, + {"caption":"UTF 16 LE", "command":"toutf8from","args": {"encoding":"UTF_16_LE" } }, + {"caption":"UTF 16 BE", "command":"toutf8from","args": {"encoding":"UTF_16_BE" } }, + {"caption":"UTF 32", "command":"toutf8from","args": {"encoding":"UTF_32" } }, + {"caption":"UTF 32 LE", "command":"toutf8from","args": {"encoding":"UTF_32_LE" } }, + {"caption":"UTF 32 BE", "command":"toutf8from","args": {"encoding":"UTF_32_BE" } } + ] + } + ] + }, + {"caption":"-"}, + {"caption": "UTF", "children": + [ + {"caption":"UTF 7" ,"command":"toutf8from","args": {"encoding":"UTF_7" } }, + {"caption":"UTF 16" , "command": "toutf8from", "args": {"encoding": "UTF_16" } }, + {"caption":"UTF 16 BE (BMP only)" ,"command":"toutf8from","args": {"encoding":"UTF_16_BE" } }, + {"caption":"UTF 16 LE (BMP only)" ,"command":"toutf8from","args": {"encoding":"UTF_16_LE" } }, + {"caption":"UTF 32" ,"command":"toutf8from","args": {"encoding":"UTF_32" } }, + {"caption":"UTF 32 BE" ,"command":"toutf8from","args": {"encoding":"UTF_32_BE" } }, + {"caption":"UTF 32 LE" ,"command":"toutf8from","args": {"encoding":"UTF_32_LE" } } + ] + }, + {"caption":"-"}, + {"caption": "Chinese, Japanese, Korean", "children": + [ + {"caption":"Traditional Chinese (BIG5)" ,"command":"toutf8from","args": {"encoding":"BIG5" } }, + {"caption":"Traditional Chinese (BIG5HKSCS)" ,"command":"toutf8from","args": {"encoding":"BIG5HKSCS" } }, + {"caption":"Traditional Chinese (CP950)" ,"command":"toutf8from","args": {"encoding":"CP950" } }, + {"caption":"-"}, + {"caption":"Simplified Chinese (GB2312)" ,"command":"toutf8from","args": {"encoding":"GB2312" } }, + {"caption":"Simplified Chinese (HZ)" ,"command":"toutf8from","args": {"encoding":"HZ" } }, + {"caption":"-"}, + {"caption":"Unified Chinese (GB18030)" ,"command":"toutf8from","args": {"encoding":"GB18030" } }, + {"caption":"Unified Chinese (GBK)" ,"command":"toutf8from","args": {"encoding":"GBK" } }, + {"caption":"-"}, + {"caption":"Japanese (CP932)" ,"command":"toutf8from","args": {"encoding":"CP932" } }, + {"caption":"Japanese (EUC JIS 2004)" ,"command":"toutf8from","args": {"encoding":"EUC_JIS_2004" } }, + {"caption":"Japanese (EUC JISX0213)" ,"command":"toutf8from","args": {"encoding":"EUC_JISX0213" } }, + {"caption":"Japanese (EUC JP)" ,"command":"toutf8from","args": {"encoding":"EUC_JP" } }, + {"caption":"Japanese (ISO2022 JP)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP" } }, + {"caption":"Japanese (ISO2022 JP 1)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_1" } }, + {"caption":"Japanese, Korean, Simplified Chinese, Western Europe, Greek (ISO2022 JP 2)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_2" } }, + {"caption":"Japanese (ISO2022 JP 3)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_3" } }, + {"caption":"Japanese (ISO2022 JP 2004)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_2004" } }, + {"caption":"Japanese (ISO2022 JP EXT)" ,"command":"toutf8from","args": {"encoding":"ISO2022_JP_EXT" } }, + {"caption":"Japanese (SHIFT JIS)" ,"command":"toutf8from","args": {"encoding":"SHIFT_JIS" } }, + {"caption":"Japanese (SHIFT JIS 2004)" ,"command":"toutf8from","args": {"encoding":"SHIFT_JIS_2004" } }, + {"caption":"Japanese (SHIFT JISX0213)" ,"command":"toutf8from","args": {"encoding":"SHIFT_JISX0213" } }, + {"caption":"-"}, + {"caption":"Korean (CP949)" ,"command":"toutf8from","args": {"encoding":"CP949" } }, + {"caption":"Korean (EUC KR)" ,"command":"toutf8from","args": {"encoding":"EUC_KR" } }, + {"caption":"Korean (ISO2022 KR)" ,"command":"toutf8from","args": {"encoding":"ISO2022_KR" } }, + {"caption":"Korean (JOHAB)" ,"command":"toutf8from","args": {"encoding":"JOHAB" } } + ] + }, + {"caption": "Russian, Ukrainian", "children": + [ + {"caption":"CP855" ,"command":"toutf8from","args": {"encoding":"CP855" } }, + {"caption":"CP1251" ,"command":"toutf8from","args": {"encoding":"CP1251" } }, + {"caption":"ISO8859 5" ,"command":"toutf8from","args": {"encoding":"ISO8859_5" } }, + {"caption":"MAC CYRILLIC" ,"command":"toutf8from","args": {"encoding":"MAC_CYRILLIC" } }, + {"caption":"-"}, + {"caption":"Russian (CP866)" ,"command":"toutf8from","args": {"encoding":"CP866" } }, + {"caption":"Russian (KOI8 R)" ,"command":"toutf8from","args": {"encoding":"KOI8_R" } }, + {"caption":"-"}, + {"caption":"Ukrainian (KOI8 U)" ,"command":"toutf8from","args": {"encoding":"KOI8_U" } } + ] + }, + + {"caption":"-"}, + {"caption": "Arabic", "children": + [ + {"caption":"CP720" ,"command":"toutf8from","args": {"encoding":"CP720" } }, + {"caption":"CP864" ,"command":"toutf8from","args": {"encoding":"CP864" } }, + {"caption":"CP1256" ,"command":"toutf8from","args": {"encoding":"CP1256" } }, + {"caption":"ISO8859 6" ,"command":"toutf8from","args": {"encoding":"ISO8859_6" } } + ] + }, + {"caption":"Canadian (CP863)" ,"command":"toutf8from","args": {"encoding":"CP863" } }, + {"caption":"Danish, Norwegian (CP865)" ,"command":"toutf8from","args": {"encoding":"CP865" } }, + {"caption": "English", "children": + [ + {"caption":"CP037" ,"command":"toutf8from","args": {"encoding":"CP037" } }, + {"caption":"CP437" ,"command":"toutf8from","args": {"encoding":"CP437" } } + ] + }, + {"caption":"Esperanto, Maltese (ISO8859 3)" ,"command":"toutf8from","args": {"encoding":"ISO8859_3" } }, + {"caption": "Greek", "children": + [ + {"caption":"CP737" ,"command":"toutf8from","args": {"encoding":"CP737" } }, + {"caption":"CP869" ,"command":"toutf8from","args": {"encoding":"CP869" } }, + {"caption":"CP875" ,"command":"toutf8from","args": {"encoding":"CP875" } }, + {"caption":"CP1253" ,"command":"toutf8from","args": {"encoding":"CP1253" } }, + {"caption":"ISO8859 7" ,"command":"toutf8from","args": {"encoding":"ISO8859_7" } }, + {"caption":"MAC GREEK" ,"command":"toutf8from","args": {"encoding":"MAC_GREEK" } } + ] + }, + { "caption": "Hebrew", "children": + [ + {"caption":"CP424" ,"command":"toutf8from","args": {"encoding":"CP424" } }, + {"caption":"CP856" ,"command":"toutf8from","args": {"encoding":"CP856" } }, + {"caption":"CP862" ,"command":"toutf8from","args": {"encoding":"CP862" } }, + {"caption":"CP1255" ,"command":"toutf8from","args": {"encoding":"CP1255" } }, + {"caption":"ISO8859 8" ,"command":"toutf8from","args": {"encoding":"ISO8859_8" } } + ] + }, + {"caption": "Icelandic", "children": + [ + {"caption":"CP861" ,"command":"toutf8from","args": {"encoding":"CP861" } }, + {"caption":"MAC ICELAND" ,"command":"toutf8from","args": {"encoding":"MAC_ICELAND" } } + ] + }, + {"caption":"Kazakh (PTCP154)" ,"command":"toutf8from","args": {"encoding":"PTCP154" } }, + {"caption":"Portuguese (CP860)" ,"command":"toutf8from","args": {"encoding":"CP860" } }, + {"caption":"Thai (CP874)" ,"command":"toutf8from","args": {"encoding":"CP874" } }, + {"caption": "Turkish", "children": + [ + {"caption":"CP857" ,"command":"toutf8from","args": {"encoding":"CP857" } }, + {"caption":"CP1026" ,"command":"toutf8from","args": {"encoding":"CP1026" } }, + {"caption":"CP1254" ,"command":"toutf8from","args": {"encoding":"CP1254" } }, + {"caption":"ISO8859 9" ,"command":"toutf8from","args": {"encoding":"ISO8859_9" } }, + {"caption":"MAC TURKISH" ,"command":"toutf8from","args": {"encoding":"MAC_TURKISH" } } + ] + }, + {"caption":"Urdu (CP1006)" ,"command":"toutf8from","args": {"encoding":"CP1006" } }, + {"caption":"Vietnamese (CP1258)" ,"command":"toutf8from","args": {"encoding":"CP1258" } }, + + + + //REGION + {"caption":"-"}, + {"caption": "Baltic languages", "children": + [ + {"caption":"CP775" ,"command":"toutf8from","args": {"encoding":"CP775" } }, + {"caption":"CP1257" ,"command":"toutf8from","args": {"encoding":"CP1257" } }, + {"caption":"ISO8859 13" ,"command":"toutf8from","args": {"encoding":"ISO8859_13" } }, + {"caption":"ISO8859 4" ,"command":"toutf8from","args": {"encoding":"ISO8859_4" } } + ] + }, + {"caption":"Celtic languages (ISO8859 14)" ,"command":"toutf8from","args": {"encoding":"ISO8859_14" } }, + {"caption":"Nordic languages (ISO8859 10)" ,"command":"toutf8from","args": {"encoding":"ISO8859_10" } }, + + + //LOCATION + {"caption":"-"}, + {"caption": "Central and Eastern Europe", "children": + [ + {"caption":"CP852" ,"command":"toutf8from","args": {"encoding":"CP852" } }, + {"caption":"CP1250" ,"command":"toutf8from","args": {"encoding":"CP1250" } }, + {"caption":"ISO8859 2" ,"command":"toutf8from","args": {"encoding":"ISO8859_2" } }, + {"caption":"CMAC LATIN2" ,"command":"toutf8from","args": {"encoding":"MAC_LATIN2" } } + ] + }, + {"caption":"South-Eastern Europe (ISO8859 16)" ,"command":"toutf8from","args": {"encoding":"ISO8859_16" } }, + {"caption":"West Europe (LATIN 1)" ,"command":"toutf8from","args": {"encoding":"LATIN_1" } }, + {"caption": "Western Europe", "children": + [ + {"caption":"CP500" ,"command":"toutf8from","args": {"encoding":"CP500" } }, + {"caption":"CP850" ,"command":"toutf8from","args": {"encoding":"CP850" } }, + {"caption":"CP858" ,"command":"toutf8from","args": {"encoding":"CP858" } }, + {"caption":"CP1140" ,"command":"toutf8from","args": {"encoding":"CP1140" } }, + {"caption":"CP1252" ,"command":"toutf8from","args": {"encoding":"CP1252" } }, + {"caption":"ISO8859 15" ,"command":"toutf8from","args": {"encoding":"ISO8859_15" } }, + {"caption":"MAC ROMAN" ,"command":"toutf8from","args": {"encoding":"MAC_ROMAN" } } + ] + } + ] + } + ] + + + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu new file mode 100644 index 0000000..c6b637c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/Settings/Main.sublime-menu @@ -0,0 +1,39 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "Encoding Helper", + "children": + [ + { + "command": "open_file", "args": + { + "file": "${packages}/EncodingHelper/EncodingHelper.sublime-settings" + }, + "caption": "Settings – Default" + }, + { + "command": "open_file", "args": + { + "file": "${packages}/User/EncodingHelper.sublime-settings" + }, + "caption": "Settings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING new file mode 100644 index 0000000..8add30a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py new file mode 100644 index 0000000..953b399 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/__init__.py @@ -0,0 +1,26 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +__version__ = "2.0.1" + +def detect(aBuf): + import universaldetector + u = universaldetector.UniversalDetector() + u.reset() + u.feed(aBuf) + u.close() + return u.result diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py new file mode 100644 index 0000000..c1b0f3c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5freq.py @@ -0,0 +1,923 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +Big5CharToFreqOrder = ( \ + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 +#Everything below is of no interest for detection purpose +2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 +2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 +5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 +5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 +5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 +5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 +5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 +5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 +5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 +5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 +5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 +5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 +5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 +6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 +6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 +6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 +6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 +6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 +6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 +6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 +6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 +6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 +6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 +6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 +6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 +6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 +6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 +6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 +6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 +6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 +6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 +6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 +6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 +6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 +6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 +6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 +6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 +6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 +6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 +6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 +6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 +6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 +6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 +6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 +6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 +6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 +6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 +6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 +6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 +6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 +6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 +6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 +6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 +3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 +6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 +6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 +3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 +6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 +6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 +6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 +6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 +6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 +4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 +6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 +3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 +6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 +6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 +6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 +6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 +6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 +6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 +6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 +7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 +7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 +7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 +7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 +7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 +7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 +7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 +7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 +7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 +7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 +7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 +7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 +7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 +7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 +7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 +7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 +7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 +7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 +7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 +7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 +7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 +7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 +7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 +7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 +7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 +7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 +7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 +7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 +7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 +7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 +7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 +7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 +7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 +7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 +7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 +7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 +7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 +7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 +7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 +7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 +7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 +7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 +7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 +7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 +3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 +7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 +7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 +7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 +7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 +4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 +7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 +7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 +7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 +7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 +7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 +7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 +7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 +7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 +7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 +7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 +7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 +8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 +8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 +8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 +8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 +8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 +8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 +8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 +8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 +8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 +8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 +8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 +8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 +8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 +8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 +8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 +8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 +8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 +8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 +8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 +8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 +8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 +8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 +8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 +8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 +8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 +8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 +8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 +8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 +8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 +8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 +8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 +8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 +8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 +8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 +8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 +8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 +8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 +8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 +8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 +8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 +8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 +8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 +8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 +8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 +8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 +8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 +8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 +8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 +8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 +8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 +8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 +8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 +8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 +8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 +8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 +8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 +8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 +8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 +8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 +4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 +8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 +8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 +9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 +9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 +9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 +9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 +9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 +9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 +9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 +9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 +9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 +9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 +9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 +9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 +9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 +9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 +9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 +9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 +9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 +9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 +9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 +9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 +9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 +9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 +9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 +9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 +9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 +9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 +9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 +9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 +9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 +9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 +9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 +9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 +9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 +9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 +9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 +9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 +9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 +9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 +3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 +9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 +9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 +9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 +4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 +9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 +9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 +9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 +9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 +9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 +9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 +9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 +9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 +9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 +9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 +9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 +9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 +9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 +9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 +9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 +9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 +9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 +9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 +9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 +9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 +9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 +9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 +9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 +10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 +10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 +10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 +10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 +10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 +10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 +10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 +10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 +4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 +10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 +10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 +10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 +10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 +10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 +10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 +10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 +10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 +4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 +10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 +10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 +10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 +10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 +10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 +10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 +10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 +10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 +10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 +10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 +10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 +10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 +10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 +10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 +10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 +10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 +10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 +4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 +10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 +10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 +10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 +10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 +10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 +10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 +10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 +10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 +10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 +10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 +10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 +10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 +10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 +10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 +10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 +10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 +10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 +10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 +10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 +10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 +10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 +10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 +10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 +10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 +10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 +10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 +10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 +10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 +10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 +11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 +11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 +11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 +4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 +11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 +11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 +11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 +11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 +11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 +11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 +11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 +11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 +11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 +11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 +11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 +11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 +11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 +11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 +11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 +11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 +11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 +11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 +11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 +11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 +11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 +11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 +11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 +11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 +11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 +11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 +11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 +11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 +11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 +11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 +11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 +4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 +11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 +11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 +11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 +11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 +11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 +11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 +11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 +11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 +11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 +11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 +11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 +11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 +11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 +11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 +11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 +11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 +11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 +11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 +11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 +11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 +11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 +11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 +11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 +11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 +11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 +12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 +12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 +12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 +12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 +12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 +12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 +12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 +12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 +12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 +12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 +12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 +12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 +12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 +12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 +4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 +4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 +4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 +12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 +12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 +12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 +12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 +12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 +12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 +12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 +12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 +12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 +12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 +12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 +12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 +12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 +12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 +12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 +12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 +12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 +12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 +12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 +12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 +12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 +12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 +12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 +12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 +12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 +12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 +12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 +12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 +12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 +12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 +12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 +12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 +12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 +12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 +12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 +12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 +12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 +12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 +12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 +12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 +12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 +12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 +12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 +12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 +12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 +4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 +13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 +13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 +13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 +13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 +13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 +13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 +4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 +13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 +13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 +13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 +13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 +13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 +13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 +13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 +13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 +13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 +13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 +13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 +13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 +13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 +13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 +13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 +5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 +13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 +13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 +13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 +13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 +13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 +13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 +13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 +13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 +13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 +13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 +13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 +13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 +13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 +13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 +13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 +13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 +13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 +13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 +13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 +13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 +13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 +13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 +13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 +13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 +13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 +13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 +13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 +13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 +13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 +13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 +13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 +13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 +13968,13969,13970,13971,13972) #13973 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py new file mode 100644 index 0000000..e6b52aa --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/big5prober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import Big5DistributionAnalysis +from mbcssm import Big5SMModel + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(Big5SMModel) + self._mDistributionAnalyzer = Big5DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "Big5" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py new file mode 100644 index 0000000..b893341 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/chardistribution.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants +from euctwfreq import EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO +from euckrfreq import EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO +from gb2312freq import GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO +from big5freq import Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO +from jisfreq import JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO + +ENOUGH_DATA_THRESHOLD = 1024 +SURE_YES = 0.99 +SURE_NO = 0.01 + +class CharDistributionAnalysis: + def __init__(self): + self._mCharToFreqOrder = None # Mapping table to get frequency order from char order (get from GetOrder()) + self._mTableSize = None # Size of above table + self._mTypicalDistributionRatio = None # This is a constant value which varies from language to language, used in calculating confidence. See http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html for further detail. + self.reset() + + def reset(self): + """reset analyser, clear any state""" + self._mDone = constants.False # If this flag is set to constants.True, detection is done and conclusion has been made + self._mTotalChars = 0 # Total characters encountered + self._mFreqChars = 0 # The number of characters whose frequency order is less than 512 + + def feed(self, aStr, aCharLen): + """feed a character with known length""" + if aCharLen == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(aStr) + else: + order = -1 + if order >= 0: + self._mTotalChars += 1 + # order is valid + if order < self._mTableSize: + if 512 > self._mCharToFreqOrder[order]: + self._mFreqChars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, return negative answer + if self._mTotalChars <= 0: + return SURE_NO + + if self._mTotalChars != self._mFreqChars: + r = self._mFreqChars / ((self._mTotalChars - self._mFreqChars) * self._mTypicalDistributionRatio) + if r < SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. For charset detection, + # certain amount of data is enough + return self._mTotalChars > ENOUGH_DATA_THRESHOLD + + def get_order(self, aStr): + # We do not handle characters based on the original encoding string, but + # convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency table. + return -1 + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCTWCharToFreqOrder + self._mTableSize = EUCTW_TABLE_SIZE + self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xC4': + return 94 * (ord(aStr[0]) - 0xC4) + ord(aStr[1]) - 0xA1 + else: + return -1 + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCKRCharToFreqOrder + self._mTableSize = EUCKR_TABLE_SIZE + self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xB0': + return 94 * (ord(aStr[0]) - 0xB0) + ord(aStr[1]) - 0xA1 + else: + return -1; + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = GB2312CharToFreqOrder + self._mTableSize = GB2312_TABLE_SIZE + self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if (aStr[0] >= '\xB0') and (aStr[1] >= '\xA1'): + return 94 * (ord(aStr[0]) - 0xB0) + ord(aStr[1]) - 0xA1 + else: + return -1; + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = Big5CharToFreqOrder + self._mTableSize = BIG5_TABLE_SIZE + self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xA4': + if aStr[1] >= '\xA1': + return 157 * (ord(aStr[0]) - 0xA4) + ord(aStr[1]) - 0xA1 + 63 + else: + return 157 * (ord(aStr[0]) - 0xA4) + ord(aStr[1]) - 0x40 + else: + return -1 + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + if (aStr[0] >= '\x81') and (aStr[0] <= '\x9F'): + order = 188 * (ord(aStr[0]) - 0x81) + elif (aStr[0] >= '\xE0') and (aStr[0] <= '\xEF'): + order = 188 * (ord(aStr[0]) - 0xE0 + 31) + else: + return -1; + order = order + ord(aStr[1]) - 0x40 + if aStr[1] > '\x7F': + order =- 1 + return order + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aStr): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + if aStr[0] >= '\xA0': + return 94 * (ord(aStr[0]) - 0xA1) + ord(aStr[1]) - 0xa1 + else: + return -1 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py new file mode 100644 index 0000000..5188069 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetgroupprober.py @@ -0,0 +1,96 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from charsetprober import CharSetProber + +class CharSetGroupProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mActiveNum = 0 + self._mProbers = [] + self._mBestGuessProber = None + + def reset(self): + CharSetProber.reset(self) + self._mActiveNum = 0 + for prober in self._mProbers: + if prober: + prober.reset() + prober.active = constants.True + self._mActiveNum += 1 + self._mBestGuessProber = None + + def get_charset_name(self): + if not self._mBestGuessProber: + self.get_confidence() + if not self._mBestGuessProber: return None +# self._mBestGuessProber = self._mProbers[0] + return self._mBestGuessProber.get_charset_name() + + def feed(self, aBuf): + for prober in self._mProbers: + if not prober: continue + if not prober.active: continue + st = prober.feed(aBuf) + if not st: continue + if st == constants.eFoundIt: + self._mBestGuessProber = prober + return self.get_state() + elif st == constants.eNotMe: + prober.active = constants.False + self._mActiveNum -= 1 + if self._mActiveNum <= 0: + self._mState = constants.eNotMe + return self.get_state() + return self.get_state() + + def get_confidence(self): + st = self.get_state() + if st == constants.eFoundIt: + return 0.99 + elif st == constants.eNotMe: + return 0.01 + bestConf = 0.0 + self._mBestGuessProber = None + for prober in self._mProbers: + if not prober: continue + if not prober.active: + if constants._debug: + sys.stderr.write(prober.get_charset_name() + ' not active\n') + continue + cf = prober.get_confidence() + if constants._debug: + sys.stderr.write('%s confidence = %s\n' % (prober.get_charset_name(), cf)) + if bestConf < cf: + bestConf = cf + self._mBestGuessProber = prober + if not self._mBestGuessProber: return 0.0 + return bestConf +# else: +# self._mBestGuessProber = self._mProbers[0] +# return self._mBestGuessProber.get_confidence() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py new file mode 100644 index 0000000..3ac1683 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/charsetprober.py @@ -0,0 +1,60 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, re + +class CharSetProber: + def __init__(self): + pass + + def reset(self): + self._mState = constants.eDetecting + + def get_charset_name(self): + return None + + def feed(self, aBuf): + pass + + def get_state(self): + return self._mState + + def get_confidence(self): + return 0.0 + + def filter_high_bit_only(self, aBuf): + aBuf = re.sub(r'([\x00-\x7F])+', ' ', aBuf) + return aBuf + + def filter_without_english_letters(self, aBuf): + aBuf = re.sub(r'([A-Za-z])+', ' ', aBuf) + return aBuf + + def filter_with_english_letters(self, aBuf): + # TODO + return aBuf diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py new file mode 100644 index 0000000..452d3b0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/codingstatemachine.py @@ -0,0 +1,56 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from constants import eStart, eError, eItsMe + +class CodingStateMachine: + def __init__(self, sm): + self._mModel = sm + self._mCurrentBytePos = 0 + self._mCurrentCharLen = 0 + self.reset() + + def reset(self): + self._mCurrentState = eStart + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byteCls = self._mModel['classTable'][ord(c)] + if self._mCurrentState == eStart: + self._mCurrentBytePos = 0 + self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] + # from byte's class and stateTable, we get its next state + self._mCurrentState = self._mModel['stateTable'][self._mCurrentState * self._mModel['classFactor'] + byteCls] + self._mCurrentBytePos += 1 + return self._mCurrentState + + def get_current_charlen(self): + return self._mCurrentCharLen + + def get_coding_state_machine(self): + return self._mModel['name'] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py new file mode 100644 index 0000000..e94e226 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/constants.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +_debug = 0 + +eDetecting = 0 +eFoundIt = 1 +eNotMe = 2 + +eStart = 0 +eError = 1 +eItsMe = 2 + +SHORTCUT_THRESHOLD = 0.95 + +import __builtin__ +if not hasattr(__builtin__, 'False'): + False = 0 + True = 1 +else: + False = __builtin__.False + True = __builtin__.True diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py new file mode 100644 index 0000000..572ed7b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escprober.py @@ -0,0 +1,79 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from escsm import HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, ISO2022KRSMModel +from charsetprober import CharSetProber +from codingstatemachine import CodingStateMachine + +class EscCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = [ \ + CodingStateMachine(HZSMModel), + CodingStateMachine(ISO2022CNSMModel), + CodingStateMachine(ISO2022JPSMModel), + CodingStateMachine(ISO2022KRSMModel) + ] + self.reset() + + def reset(self): + CharSetProber.reset(self) + for codingSM in self._mCodingSM: + if not codingSM: continue + codingSM.active = constants.True + codingSM.reset() + self._mActiveSM = len(self._mCodingSM) + self._mDetectedCharset = None + + def get_charset_name(self): + return self._mDetectedCharset + + def get_confidence(self): + if self._mDetectedCharset: + return 0.99 + else: + return 0.00 + + def feed(self, aBuf): + for c in aBuf: + for codingSM in self._mCodingSM: + if not codingSM: continue + if not codingSM.active: continue + codingState = codingSM.next_state(c) + if codingState == constants.eError: + codingSM.active = constants.False + self._mActiveSM -= 1 + if self._mActiveSM <= 0: + self._mState = constants.eNotMe + return self.get_state() + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + self._mDetectedCharset = codingSM.get_coding_state_machine() + return self.get_state() + + return self.get_state() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py new file mode 100644 index 0000000..9fa2295 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/escsm.py @@ -0,0 +1,240 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from constants import eStart, eError, eItsMe + +HZ_cls = ( \ +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_st = ( \ +eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 + 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f + 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 + 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +) + +HZCharLenTable = (0, 0, 0, 0, 0, 0) + +HZSMModel = {'classTable': HZ_cls, + 'classFactor': 6, + 'stateTable': HZ_st, + 'charLenTable': HZCharLenTable, + 'name': "HZ-GB-2312"} + +ISO2022CN_cls = ( \ +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_st = ( \ +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 + 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 +eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +) + +ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CNSMModel = {'classTable': ISO2022CN_cls, + 'classFactor': 9, + 'stateTable': ISO2022CN_st, + 'charLenTable': ISO2022CNCharLenTable, + 'name': "ISO-2022-CN"} + +ISO2022JP_cls = ( \ +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_st = ( \ +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f +eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 +eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f +eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f +eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +) + +ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JPSMModel = {'classTable': ISO2022JP_cls, + 'classFactor': 10, + 'stateTable': ISO2022JP_st, + 'charLenTable': ISO2022JPCharLenTable, + 'name': "ISO-2022-JP"} + +ISO2022KR_cls = ( \ +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_st = ( \ +eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 +eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f +eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +) + +ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) + +ISO2022KRSMModel = {'classTable': ISO2022KR_cls, + 'classFactor': 6, + 'stateTable': ISO2022KR_st, + 'charLenTable': ISO2022KRCharLenTable, + 'name': "ISO-2022-KR"} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py new file mode 100644 index 0000000..46a8b38 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/eucjpprober.py @@ -0,0 +1,85 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from constants import eStart, eError, eItsMe +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import EUCJPDistributionAnalysis +from jpcntx import EUCJPContextAnalysis +from mbcssm import EUCJPSMModel + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCJPSMModel) + self._mDistributionAnalyzer = EUCJPDistributionAnalysis() + self._mContextAnalyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "EUC-JP" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar, charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i-1:i+1], charLen) + self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if self._mContextAnalyzer.got_enough_data() and \ + (self.get_confidence() > constants.SHORTCUT_THRESHOLD): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py new file mode 100644 index 0000000..1463fa1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrfreq.py @@ -0,0 +1,594 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKRCharToFreqOrder = ( \ + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +#Everything below is of no interest for detection purpose +2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, +2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, +2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, +2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, +2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, +2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, +2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, +2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, +2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, +2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, +2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, +2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, +2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, +2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, +1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, +2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, +2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, +2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, +2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, +2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, +2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, +2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, +2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, +2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, +3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, +3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, +3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, +3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, +3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, +3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, +3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, +3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, +3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, +3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, +3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, +3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, +3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, +3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, +3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, +3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, +3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, +3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, +3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, +3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, +3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, +3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, +3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, +3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, +3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, +3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, +3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, +3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, +3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, +3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, +1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, +1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, +3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, +3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, +3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, +3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, +3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, +3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, +3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, +3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, +3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, +3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, +3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, +3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, +1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, +3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, +3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, +3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, +3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, +3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, +3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, +1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, +3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, +3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, +3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, +3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, +1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, +3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, +3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, +3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, +3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, +3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, +3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, +3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, +4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, +4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, +1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, +4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, +4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, +4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, +4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, +4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, +4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, +4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, +4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, +4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, +4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, +4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, +4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, +4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, +4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, +4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, +4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, +4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, +4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, +4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, +4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, +4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, +4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, +4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, +4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, +4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, +4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, +4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, +4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, +4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, +4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, +4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, +4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, +4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, +4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, +4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, +4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, +4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, +4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, +4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, +4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, +4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, +4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, +1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, +4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, +4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, +4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, +4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, +4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, +4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, +4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, +4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, +4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, +4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, +4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, +4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, +4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, +4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, +4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, +4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, +4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, +4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, +4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, +4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, +5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, +5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, +1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, +5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, +5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, +5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, +5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, +1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, +5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, +5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, +5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, +5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, +5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, +1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, +5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, +5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, +5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, +5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, +5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, +5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, +5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, +5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, +5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, +5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, +5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, +5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, +5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, +5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, +5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, +5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, +5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, +5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, +5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, +5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, +5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, +5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, +5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, +1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, +5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, +5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, +5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, +5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, +1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, +5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, +5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, +5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, +5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, +5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, +1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, +5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, +1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, +5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, +5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, +5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, +5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, +5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, +5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, +5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, +5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, +5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, +5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, +5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, +5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, +6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, +6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, +6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, +6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, +6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, +6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, +6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, +6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, +6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, +6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, +6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, +6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, +6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, +6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, +6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 +6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, +6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, +6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, +6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, +6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, +6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, +6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, +6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, +6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, +6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, +6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, +6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, +6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, +6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, +6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, +6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, +6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, +1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, +6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, +6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, +6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, +6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, +6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, +1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, +6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, +1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, +6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, +6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, +6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, +1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, +6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, +6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, +6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, +6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, +6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, +6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, +6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, +6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, +6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, +6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, +6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, +6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, +6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, +6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, +6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, +6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, +6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, +7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, +7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, +7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, +7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, +7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, +7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, +7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, +7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, +7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, +7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, +7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, +7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, +7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, +7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, +7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, +7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, +7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, +7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, +7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, +7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, +7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, +7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, +7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, +7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, +7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, +7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, +7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, +7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, +7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, +7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, +7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, +7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, +7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, +7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, +7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, +7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, +7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, +7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, +7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, +7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, +7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, +7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, +7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, +7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, +7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, +7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, +7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, +7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, +7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, +7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, +7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, +7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, +7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, +7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, +8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, +8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, +8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, +8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, +8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, +8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, +8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, +8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, +8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, +8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, +8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, +8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, +8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, +8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, +8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, +8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, +8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, +8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, +8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, +8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, +8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, +8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, +8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, +8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, +8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, +8736,8737,8738,8739,8740,8741) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py new file mode 100644 index 0000000..bd697eb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euckrprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import EUCKRDistributionAnalysis +from mbcssm import EUCKRSMModel + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCKRSMModel) + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-KR" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py new file mode 100644 index 0000000..c057209 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwfreq.py @@ -0,0 +1,426 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 8102 + +EUCTWCharToFreqOrder = ( \ + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +#Everything below is of no interest for detection purpose +2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 +2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 +8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 +8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 +8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 +8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 +8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 +8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 +8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 +8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 +8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 +8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 +8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 +8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 +8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 +8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 +8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 +8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 +8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 +8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 +8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 +8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 +8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 +8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 +8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 +8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 +8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 +8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 +8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 +8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 +8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 +8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 +8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 +8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 +8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 +8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py new file mode 100644 index 0000000..b073f13 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/euctwprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import EUCTWDistributionAnalysis +from mbcssm import EUCTWSMModel + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCTWSMModel) + self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-TW" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py new file mode 100644 index 0000000..7a4d5a1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312freq.py @@ -0,0 +1,471 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312CharToFreqOrder = ( \ +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 +#Everything below is of no interest for detection purpose +5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, +5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, +5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, +3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, +4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, +5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, +5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, +4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, +4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, +4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, +4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, +3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, +6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, +4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, +6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, +4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, +4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, +4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, +5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, +3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, +4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, +3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, +4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, +4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, +6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, +6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, +5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, +4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, +6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, +4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, +5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, +5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, +5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, +6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, +3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, +6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, +4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, +5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, +6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, +6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, +4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, +5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, +4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, +5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, +5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, +4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, +4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, +5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, +4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, +4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, +5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, +4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, +4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, +4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, +5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, +5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, +4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, +3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, +4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, +6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, +5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, +5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, +4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, +6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, +5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, +6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, +4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, +5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, +5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, +3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, +5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, +6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, +4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, +6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, +4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, +4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, +6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, +3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, +6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, +4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, +3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, +3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, +3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, +4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, +2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, +5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, +4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, +5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, +5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, +5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, +4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, +5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, +4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, +5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, +1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, +3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, +4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, +4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, +6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, +4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, +5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, +3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, +5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, +5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, +5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, +3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, +5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, +5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, +3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, +5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, +5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, +5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, +6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, +4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, +6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, +4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, +3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, +4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, +5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, +5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, +5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, +3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, +3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, +6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, +6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, +5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, +6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, +6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, +6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, +6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, +6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, +5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, +6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, +6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, +3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, +3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, +4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, +4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, +3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, +5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, +5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, +5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, +5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, +5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, +4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, +5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, +6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, +5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, +4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, +4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, +6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, +3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, +4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, +4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, +5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, +6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, +6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, +4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, +6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, +5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, +5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, +5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, +5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, +5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, +4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, +5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, +5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, +5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, +5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, +6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, +4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, +5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, +4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, +4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, +6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, +4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, +6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, +3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, +5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, +6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, +6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, +6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, +5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, +6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, +6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, +3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, +5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, +4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py new file mode 100644 index 0000000..91eb392 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/gb2312prober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import GB2312DistributionAnalysis +from mbcssm import GB2312SMModel + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(GB2312SMModel) + self._mDistributionAnalyzer = GB2312DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "GB2312" diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py new file mode 100644 index 0000000..a2b1eaa --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/hebrewprober.py @@ -0,0 +1,269 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from charsetprober import CharSetProber +import constants + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +# windows-1255 / ISO-8859-8 code points of interest +FINAL_KAF = '\xea' +NORMAL_KAF = '\xeb' +FINAL_MEM = '\xed' +NORMAL_MEM = '\xee' +FINAL_NUN = '\xef' +NORMAL_NUN = '\xf0' +FINAL_PE = '\xf3' +NORMAL_PE = '\xf4' +FINAL_TSADI = '\xf5' +NORMAL_TSADI = '\xf6' + +# Minimum Visual vs Logical final letter score difference. +# If the difference is below this, don't rely solely on the final letter score distance. +MIN_FINAL_CHAR_DISTANCE = 5 + +# Minimum Visual vs Logical model score difference. +# If the difference is below this, don't rely at all on the model score distance. +MIN_MODEL_DISTANCE = 0.01 + +VISUAL_HEBREW_NAME = "ISO-8859-8" +LOGICAL_HEBREW_NAME = "windows-1255" + +class HebrewProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mLogicalProber = None + self._mVisualProber = None + self.reset() + + def reset(self): + self._mFinalCharLogicalScore = 0 + self._mFinalCharVisualScore = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate a word + # delimiter at the beginning of the data + self._mPrev = ' ' + self._mBeforePrev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._mLogicalProber = logicalProber + self._mVisualProber = visualProber + + def is_final(self, c): + return c in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters causing + # the Non-Final tsadi to appear at an end of a word even though this is not + # the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being a + # good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for + # example legally end with a Non-Final Pe or Kaf. However, the benefit of + # these letters as Non-Final letters outweighs the damage since these words + # are quite rare. + return c in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + + def feed(self, aBuf): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew or + # visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is an + # indication that the text is laid out "naturally" since the final letter + # really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In normal + # Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with + # the Non-Final form of that letter. Exceptions to this rule are mentioned + # above in isNonFinal(). This is an indication that the text is laid out + # backwards. +1 for visual score + # 3) A word longer than 1 letter, starting with a final letter. Final letters + # should not appear at the beginning of a word. This is an indication that + # the text is laid out backwards. +1 for visual score. + # + # The visual score and logical score are accumulated throughout the text and + # are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since that case + # is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with spaces) + # so the word boundary detection works properly. [MAP] + + if self.get_state() == constants.eNotMe: + # Both model probers say it's not them. No reason to continue. + return constants.eNotMe + + aBuf = self.filter_high_bit_only(aBuf) + + for cur in aBuf: + if cur == ' ': + # We stand on a space - a word just ended + if self._mBeforePrev != ' ': + # next-to-last char was not a space so self._mPrev is not a 1 letter word + if self.is_final(self._mPrev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._mFinalCharLogicalScore += 1 + elif self.is_non_final(self._mPrev): + # case (2) [-2:not space][-1:Non-Final letter][cur:space] + self._mFinalCharVisualScore += 1 + else: + # Not standing on a space + if (self._mBeforePrev == ' ') and (self.is_final(self._mPrev)) and (cur != ' '): + # case (3) [-2:space][-1:final letter][cur:not space] + self._mFinalCharVisualScore += 1 + self._mBeforePrev = self._mPrev + self._mPrev = cur + + # Forever detecting, till the end or until both model probers return eNotMe (handled above) + return constants.eDetecting + + def get_charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore + if finalsub >= MIN_FINAL_CHAR_DISTANCE: + return LOGICAL_HEBREW_NAME + if finalsub <= -MIN_FINAL_CHAR_DISTANCE: + return VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = self._mLogicalProber.get_confidence() - self._mVisualProber.get_confidence() + if modelsub > MIN_MODEL_DISTANCE: + return LOGICAL_HEBREW_NAME + if modelsub < -MIN_MODEL_DISTANCE: + return VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the day. + if finalsub < 0.0: + return VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to Logical. + return LOGICAL_HEBREW_NAME + + def get_state(self): + # Remain active as long as any of the model probers are active. + if (self._mLogicalProber.get_state() == constants.eNotMe) and \ + (self._mVisualProber.get_state() == constants.eNotMe): + return constants.eNotMe + return constants.eDetecting diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py new file mode 100644 index 0000000..5fe4a5c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jisfreq.py @@ -0,0 +1,567 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JISCharToFreqOrder = ( \ + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +#Everything below is of no interest for detection purpose +2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 +6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 +6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 +6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 +6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 +4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 +4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 +3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 +3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 +4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 +3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 +6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 +4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 +6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 +6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 +6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 +6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 +6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 +6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 +3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 +3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 +6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 +2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 +4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 +4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 +4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 +6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 +3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 +4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 +4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 +6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 +4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 +6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 +3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 +2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 +4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 +2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 +6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 +4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 +6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 +6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 +6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 +4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 +6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 +2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 +6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 +4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 +6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 +4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 +4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 +6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 +6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 +6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 +3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 +1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 +3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 +3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 +4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 +6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 +3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 +6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 +3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 +3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 +2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 +6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 +6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 +3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 +6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 +3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 +6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 +6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 +6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 +4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 +6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 +4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 +3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 +3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 +6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 +6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 +4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 +6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 +6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 +6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 +6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 +6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 +6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 +4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 +4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 +3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 +6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 +4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 +2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 +6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 +6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 +4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 +2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 +4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 +2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 +4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 +4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 +4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 +6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 +3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 +6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 +3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 +6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 +2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 +3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 +7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 +2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 +3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 +3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 +3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 +3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 +7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 +7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 +7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 +7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 +7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 +4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 +3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 +3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 +4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 +3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 +3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 +7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 +4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 +7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 +7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 +7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 +7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 +7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 +4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 +4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 +7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 +3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 +4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 +7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 +7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 +4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 +3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 +3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 +7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 +4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 +4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 +4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 +4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 +4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 +4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 +7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 +7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 +7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 +7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 +7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 +2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 +3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 +7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 +7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 +3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 +4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 +3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 +3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 +2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 +7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 +7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 +4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 +3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 +3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 +7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 +7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 +7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 +4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 +7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 +2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 +3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 +4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 +7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 +4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 +4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 +7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 +7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 +5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 +7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 +7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 +7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 +7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 +7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 +5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 +5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 +7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 +3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 +7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 +7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 +3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 +7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 +7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 +1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 +3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 +4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 +2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 +3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 +2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 +5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 +4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 +4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 +5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 +7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 +7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 +7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 +7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 +3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 +7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 +3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 +7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 +4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 +7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 +7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 +7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 +7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 +7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 +7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 +7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 +7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py new file mode 100644 index 0000000..93db4a9 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/jpcntx.py @@ -0,0 +1,210 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +NUM_OF_CATEGORY = 6 +DONT_KNOW = -1 +ENOUGH_REL_THRESHOLD = 100 +MAX_REL_THRESHOLD = 1000 +MINIMUM_DATA_THRESHOLD = 4 + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( \ +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis: + def __init__(self): + self.reset() + + def reset(self): + self._mTotalRel = 0 # total sequence received + self._mRelSample = [0] * NUM_OF_CATEGORY # category counters, each interger counts sequence in its category + self._mNeedToSkipCharNum = 0 # if last byte in current buffer is not the last byte of a character, we need to know how many bytes to skip in next buffer + self._mLastCharOrder = -1 # The order of previous char + self._mDone = constants.False # If this flag is set to constants.True, detection is done and conclusion has been made + + def feed(self, aBuf, aLen): + if self._mDone: return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not complete, we + # record how many byte needed to complete that character and skip these bytes here. + # We can choose to record those bytes as well and analyse the character once it + # is complete, but since a character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._mNeedToSkipCharNum + while i < aLen: + order, charLen = self.get_order(aBuf[i:i+2]) + i += charLen + if i > aLen: + self._mNeedToSkipCharNum = i - aLen + self._mLastCharOrder = -1 + else: + if (order != -1) and (self._mLastCharOrder != -1): + self._mTotalRel += 1 + if self._mTotalRel > MAX_REL_THRESHOLD: + self._mDone = constants.True + break + self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 + self._mLastCharOrder = order + + def got_enough_data(self): + return self._mTotalRel > ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._mTotalRel > MINIMUM_DATA_THRESHOLD: + return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + else: + return DONT_KNOW + + def get_order(self, aStr): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aStr): + if not aStr: return -1, 1 + # find out current char's byte length + if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \ + ((aStr[0] >= '\xE0') and (aStr[0] <= '\xFC')): + charLen = 2 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aStr) > 1: + if (aStr[0] == '\202') and \ + (aStr[1] >= '\x9F') and \ + (aStr[1] <= '\xF1'): + return ord(aStr[1]) - 0x9F, charLen + + return -1, charLen + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aStr): + if not aStr: return -1, 1 + # find out current char's byte length + if (aStr[0] == '\x8E') or \ + ((aStr[0] >= '\xA1') and (aStr[0] <= '\xFE')): + charLen = 2 + elif aStr[0] == '\x8F': + charLen = 3 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aStr) > 1: + if (aStr[0] == '\xA4') and \ + (aStr[1] >= '\xA1') and \ + (aStr[1] <= '\xF3'): + return ord(aStr[1]) - 0xA1, charLen + + return -1, charLen diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..bf5641e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { \ + 'charToOrderMap': Latin5_BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': constants.False, + 'charsetName': "ISO-8859-5" +} + +Win1251BulgarianModel = { \ + 'charToOrderMap': win1251BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1251" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e604cc7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langcyrillicmodel.py @@ -0,0 +1,329 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# KOI8-R language model +# Character Mapping Table: +KOI8R_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { \ + 'charToOrderMap': KOI8R_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "KOI8-R" +} + +Win1251CyrillicModel = { \ + 'charToOrderMap': win1251_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1251" +} + +Latin5CyrillicModel = { \ + 'charToOrderMap': latin5_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "ISO-8859-5" +} + +MacCyrillicModel = { \ + 'charToOrderMap': macCyrillic_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "MacCyrillic" +}; + +Ibm866Model = { \ + 'charToOrderMap': IBM866_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "IBM866" +} + +Ibm855Model = { \ + 'charToOrderMap': IBM855_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': constants.False, + 'charsetName': "IBM855" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py new file mode 100644 index 0000000..ec6d49e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( \ +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { \ + 'charToOrderMap': Latin7_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': constants.False, + 'charsetName': "ISO-8859-7" +} + +Win1253GreekModel = { \ + 'charToOrderMap': win1253_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1253" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py new file mode 100644 index 0000000..a8bcc65 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhebrewmodel.py @@ -0,0 +1,201 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +win1255_CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HebrewLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { \ + 'charToOrderMap': win1255_CharToOrderMap, + 'precedenceMatrix': HebrewLangModel, + 'mTypicalPositiveRatio': 0.984004, + 'keepEnglishLetter': constants.False, + 'charsetName': "windows-1255" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py new file mode 100644 index 0000000..d635f03 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( \ +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { \ + 'charToOrderMap': Latin2_HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': constants.True, + 'charsetName': "ISO-8859-2" +} + +Win1250HungarianModel = { \ + 'charToOrderMap': win1250HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': constants.True, + 'charsetName': "windows-1250" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py new file mode 100644 index 0000000..96ec054 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/langthaimodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( \ +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( \ +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { \ + 'charToOrderMap': TIS620CharToOrderMap, + 'precedenceMatrix': ThaiLangModel, + 'mTypicalPositiveRatio': 0.926386, + 'keepEnglishLetter': constants.False, + 'charsetName': "TIS-620" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py new file mode 100644 index 0000000..b46129b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/latin1prober.py @@ -0,0 +1,136 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from charsetprober import CharSetProber +import constants +import operator + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( \ + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( \ +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + +class Latin1Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self.reset() + + def reset(self): + self._mLastCharClass = OTH + self._mFreqCounter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + def get_charset_name(self): + return "windows-1252" + + def feed(self, aBuf): + aBuf = self.filter_with_english_letters(aBuf) + for c in aBuf: + charClass = Latin1_CharToClass[ord(c)] + freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + charClass] + if freq == 0: + self._mState = constants.eNotMe + break + self._mFreqCounter[freq] += 1 + self._mLastCharClass = charClass + + return self.get_state() + + def get_confidence(self): + if self.get_state() == constants.eNotMe: + return 0.01 + + total = reduce(operator.add, self._mFreqCounter) + if total < 0.01: + confidence = 0.0 + else: + confidence = (self._mFreqCounter[3] / total) - (self._mFreqCounter[1] * 20.0 / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate detector + # can take priority. + confidence = confidence * 0.5 + return confidence diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py new file mode 100644 index 0000000..a813144 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcharsetprober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from constants import eStart, eError, eItsMe +from charsetprober import CharSetProber + +class MultiByteCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mDistributionAnalyzer = None + self._mCodingSM = None + self._mLastChar = ['\x00', '\x00'] + + def reset(self): + CharSetProber.reset(self) + if self._mCodingSM: + self._mCodingSM.reset() + if self._mDistributionAnalyzer: + self._mDistributionAnalyzer.reset() + self._mLastChar = ['\x00', '\x00'] + + def get_charset_name(self): + pass + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mDistributionAnalyzer.feed(aBuf[i-1:i+1], charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if self._mDistributionAnalyzer.got_enough_data() and \ + (self.get_confidence() > constants.SHORTCUT_THRESHOLD): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + return self._mDistributionAnalyzer.get_confidence() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..941cc3e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcsgroupprober.py @@ -0,0 +1,50 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from charsetgroupprober import CharSetGroupProber +from utf8prober import UTF8Prober +from sjisprober import SJISProber +from eucjpprober import EUCJPProber +from gb2312prober import GB2312Prober +from euckrprober import EUCKRProber +from big5prober import Big5Prober +from euctwprober import EUCTWProber + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ \ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + Big5Prober(), + EUCTWProber()] + self.reset() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py new file mode 100644 index 0000000..e46c1ff --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/mbcssm.py @@ -0,0 +1,514 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from constants import eStart, eError, eItsMe + +# BIG5 + +BIG5_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0) # f8 - ff + +BIG5_st = ( \ + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart)#10-17 + +Big5CharLenTable = (0, 1, 1, 2, 0) + +Big5SMModel = {'classTable': BIG5_cls, + 'classFactor': 5, + 'stateTable': BIG5_st, + 'charLenTable': Big5CharLenTable, + 'name': 'Big5'} + +# EUC-JP + +EUCJP_cls = ( \ + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5) # f8 - ff + +EUCJP_st = ( \ + 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 + eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f + 3,eError,eError,eError,eStart,eStart,eStart,eStart)#20-27 + +EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) + +EUCJPSMModel = {'classTable': EUCJP_cls, + 'classFactor': 6, + 'stateTable': EUCJP_st, + 'charLenTable': EUCJPCharLenTable, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0) # f8 - ff + +EUCKR_st = ( + eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 + eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart)#08-0f + +EUCKRCharLenTable = (0, 1, 2, 0) + +EUCKRSMModel = {'classTable': EUCKR_cls, + 'classFactor': 4, + 'stateTable': EUCKR_st, + 'charLenTable': EUCKRCharLenTable, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_cls = ( \ + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0) # f8 - ff + +EUCTW_st = ( \ + eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 + eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f + 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 + eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f + +EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) + +EUCTWSMModel = {'classTable': EUCTW_cls, + 'classFactor': 7, + 'stateTable': EUCTW_st, + 'charLenTable': EUCTWCharLenTable, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0) # f8 - ff + +GB2312_st = ( \ + eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 + 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f + eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart)#28-2f + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validing +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) + +GB2312SMModel = {'classTable': GB2312_cls, + 'classFactor': 7, + 'stateTable': GB2312_st, + 'charLenTable': GB2312CharLenTable, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,3,3,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 4,4,4,4,4,4,4,4, # f0 - f7 + 4,4,4,4,4,0,0,0) # f8 - ff + +SJIS_st = ( \ + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart)#10-17 + +SJISCharLenTable = (0, 1, 1, 2, 0, 0) + +SJISSMModel = {'classTable': SJIS_cls, + 'classFactor': 6, + 'stateTable': SJIS_st, + 'charLenTable': SJISCharLenTable, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_cls = ( \ + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5) # f8 - ff + +UCS2BE_st = ( \ + 5, 7, 7,eError, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 + 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,eError,#20-27 + 5, 8, 6, 6,eError, 6, 6, 6,#28-2f + 6, 6, 6, 6,eError,eError,eStart,eStart)#30-37 + +UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) + +UCS2BESMModel = {'classTable': UCS2BE_cls, + 'classFactor': 6, + 'stateTable': UCS2BE_st, + 'charLenTable': UCS2BECharLenTable, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_cls = ( \ + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5) # f8 - ff + +UCS2LE_st = ( \ + 6, 6, 7, 6, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 + 5, 5, 5,eError, 5,eError, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,eError,#20-27 + 5, 5, 5,eError,eError,eError, 5, 5,#28-2f + 5, 5, 5,eError, 5,eError,eStart,eStart)#30-37 + +UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) + +UCS2LESMModel = {'classTable': UCS2LE_cls, + 'classFactor': 6, + 'stateTable': UCS2LE_st, + 'charLenTable': UCS2LECharLenTable, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_cls = ( \ + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0) # f8 - ff + +UTF8_st = ( \ + eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + eError,eError,eError,eError,eError,eError,eError,eError,#10-17 + eError,eError,eError,eError,eError,eError,eError,eError,#18-1f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f + eError,eError, 5, 5, 5, 5,eError,eError,#30-37 + eError,eError,eError,eError,eError,eError,eError,eError,#38-3f + eError,eError,eError, 5, 5, 5,eError,eError,#40-47 + eError,eError,eError,eError,eError,eError,eError,eError,#48-4f + eError,eError, 7, 7, 7, 7,eError,eError,#50-57 + eError,eError,eError,eError,eError,eError,eError,eError,#58-5f + eError,eError,eError,eError, 7, 7,eError,eError,#60-67 + eError,eError,eError,eError,eError,eError,eError,eError,#68-6f + eError,eError, 9, 9, 9, 9,eError,eError,#70-77 + eError,eError,eError,eError,eError,eError,eError,eError,#78-7f + eError,eError,eError,eError,eError, 9,eError,eError,#80-87 + eError,eError,eError,eError,eError,eError,eError,eError,#88-8f + eError,eError, 12, 12, 12, 12,eError,eError,#90-97 + eError,eError,eError,eError,eError,eError,eError,eError,#98-9f + eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 + eError,eError,eError,eError,eError,eError,eError,eError,#a8-af + eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 + eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf + eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 + eError,eError,eError,eError,eError,eError,eError,eError)#c8-cf + +UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8SMModel = {'classTable': UTF8_cls, + 'classFactor': 16, + 'stateTable': UTF8_st, + 'charLenTable': UTF8CharLenTable, + 'name': 'UTF-8'} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py new file mode 100644 index 0000000..da07116 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcharsetprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from charsetprober import CharSetProber + +SAMPLE_SIZE = 64 +SB_ENOUGH_REL_THRESHOLD = 1024 +POSITIVE_SHORTCUT_THRESHOLD = 0.95 +NEGATIVE_SHORTCUT_THRESHOLD = 0.05 +SYMBOL_CAT_ORDER = 250 +NUMBER_OF_SEQ_CAT = 4 +POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 +#NEGATIVE_CAT = 0 + +class SingleByteCharSetProber(CharSetProber): + def __init__(self, model, reversed=constants.False, nameProber=None): + CharSetProber.__init__(self) + self._mModel = model + self._mReversed = reversed # TRUE if we need to reverse every pair in the model lookup + self._mNameProber = nameProber # Optional auxiliary prober for name decision + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mLastOrder = 255 # char order of last character + self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT + self._mTotalSeqs = 0 + self._mTotalChar = 0 + self._mFreqChar = 0 # characters that fall in our sampling range + + def get_charset_name(self): + if self._mNameProber: + return self._mNameProber.get_charset_name() + else: + return self._mModel['charsetName'] + + def feed(self, aBuf): + if not self._mModel['keepEnglishLetter']: + aBuf = self.filter_without_english_letters(aBuf) + aLen = len(aBuf) + if not aLen: + return self.get_state() + for c in aBuf: + order = self._mModel['charToOrderMap'][ord(c)] + if order < SYMBOL_CAT_ORDER: + self._mTotalChar += 1 + if order < SAMPLE_SIZE: + self._mFreqChar += 1 + if self._mLastOrder < SAMPLE_SIZE: + self._mTotalSeqs += 1 + if not self._mReversed: + self._mSeqCounters[self._mModel['precedenceMatrix'][(self._mLastOrder * SAMPLE_SIZE) + order]] += 1 + else: # reverse the order of the letters in the lookup + self._mSeqCounters[self._mModel['precedenceMatrix'][(order * SAMPLE_SIZE) + self._mLastOrder]] += 1 + self._mLastOrder = order + + if self.get_state() == constants.eDetecting: + if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: + cf = self.get_confidence() + if cf > POSITIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, we have a winner\n' % (self._mModel['charsetName'], cf)) + self._mState = constants.eFoundIt + elif cf < NEGATIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, below negative shortcut threshhold %s\n' % (self._mModel['charsetName'], cf, NEGATIVE_SHORTCUT_THRESHOLD)) + self._mState = constants.eNotMe + + return self.get_state() + + def get_confidence(self): + r = 0.01 + if self._mTotalSeqs > 0: +# print self._mSeqCounters[POSITIVE_CAT], self._mTotalSeqs, self._mModel['mTypicalPositiveRatio'] + r = (1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs / self._mModel['mTypicalPositiveRatio'] +# print r, self._mFreqChar, self._mTotalChar + r = r * self._mFreqChar / self._mTotalChar + if r >= 1.0: + r = 0.99 + return r diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..d19160c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sbcsgroupprober.py @@ -0,0 +1,64 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from charsetgroupprober import CharSetGroupProber +from sbcharsetprober import SingleByteCharSetProber +from langcyrillicmodel import Win1251CyrillicModel, Koi8rModel, Latin5CyrillicModel, MacCyrillicModel, Ibm866Model, Ibm855Model +from langgreekmodel import Latin7GreekModel, Win1253GreekModel +from langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +from langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from langthaimodel import TIS620ThaiModel +from langhebrewmodel import Win1255HebrewModel +from hebrewprober import HebrewProber + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ \ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + SingleByteCharSetProber(Latin2HungarianModel), + SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + ] + hebrewProber = HebrewProber() + logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, constants.False, hebrewProber) + visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, constants.True, hebrewProber) + hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) + self._mProbers.extend([hebrewProber, logicalHebrewProber, visualHebrewProber]) + + self.reset() diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py new file mode 100644 index 0000000..fea2690 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/sjisprober.py @@ -0,0 +1,85 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from mbcharsetprober import MultiByteCharSetProber +from codingstatemachine import CodingStateMachine +from chardistribution import SJISDistributionAnalysis +from jpcntx import SJISContextAnalysis +from mbcssm import SJISSMModel +import constants, sys +from constants import eStart, eError, eItsMe + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(SJISSMModel) + self._mDistributionAnalyzer = SJISDistributionAnalysis() + self._mContextAnalyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "SHIFT_JIS" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar[2 - charLen :], charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i + 1 - charLen : i + 3 - charLen], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1 : i + 1], charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if self._mContextAnalyzer.got_enough_data() and \ + (self.get_confidence() > constants.SHORTCUT_THRESHOLD): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py new file mode 100644 index 0000000..2ebf3a4 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/test.py @@ -0,0 +1,20 @@ +import sys, glob +sys.path.insert(0, '..') +from chardet.universaldetector import UniversalDetector + +count = 0 +u = UniversalDetector() +for f in glob.glob(sys.argv[1]): + print f.ljust(60), + u.reset() + for line in file(f, 'rb'): + u.feed(line) + if u.done: break + u.close() + result = u.result + if result['encoding']: + print result['encoding'], 'with confidence', result['confidence'] + else: + print '******** no result' + count += 1 +print count, 'tests' diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py new file mode 100644 index 0000000..809df22 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/universaldetector.py @@ -0,0 +1,154 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from latin1prober import Latin1Prober # windows-1252 +from mbcsgroupprober import MBCSGroupProber # multi-byte character sets +from sbcsgroupprober import SBCSGroupProber # single-byte character sets +from escprober import EscCharSetProber # ISO-2122, etc. +import re + +MINIMUM_THRESHOLD = 0.20 +ePureAscii = 0 +eEscAscii = 1 +eHighbyte = 2 + +class UniversalDetector: + def __init__(self): + self._highBitDetector = re.compile(r'[\x80-\xFF]') + self._escDetector = re.compile(r'(\033|~{)') + self._mEscCharSetProber = None + self._mCharSetProbers = [] + self.reset() + + def reset(self): + self.result = {'encoding': None, 'confidence': 0.0} + self.done = constants.False + self._mStart = constants.True + self._mGotData = constants.False + self._mInputState = ePureAscii + self._mLastChar = '' + if self._mEscCharSetProber: + self._mEscCharSetProber.reset() + for prober in self._mCharSetProbers: + prober.reset() + + def feed(self, aBuf): + if self.done: return + + aLen = len(aBuf) + if not aLen: return + + if not self._mGotData: + # If the data starts with BOM, we know it is UTF + if aBuf[:3] == '\xEF\xBB\xBF': + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8", 'confidence': 1.0} + elif aBuf[:4] == '\xFF\xFE\x00\x00': + # FF FE 00 00 UTF-32, little-endian BOM + self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} + elif aBuf[:4] == '\x00\x00\xFE\xFF': + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} + elif aBuf[:4] == '\xFE\xFF\x00\x00': + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0} + elif aBuf[:4] == '\x00\x00\xFF\xFE': + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0} + elif aBuf[:2] == '\xFF\xFE': + # FF FE UTF-16, little endian BOM + self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} + elif aBuf[:2] == '\xFE\xFF': + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} + + self._mGotData = constants.True + if self.result['encoding'] and (self.result['confidence'] > 0.0): + self.done = constants.True + return + + if self._mInputState == ePureAscii: + if self._highBitDetector.search(aBuf): + self._mInputState = eHighbyte + elif (self._mInputState == ePureAscii) and self._escDetector.search(self._mLastChar + aBuf): + self._mInputState = eEscAscii + + self._mLastChar = aBuf[-1] + + if self._mInputState == eEscAscii: + if not self._mEscCharSetProber: + self._mEscCharSetProber = EscCharSetProber() + if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': self._mEscCharSetProber.get_charset_name(), + 'confidence': self._mEscCharSetProber.get_confidence()} + self.done = constants.True + elif self._mInputState == eHighbyte: + if not self._mCharSetProbers: + self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), Latin1Prober()] + for prober in self._mCharSetProbers: + if prober.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': prober.get_charset_name(), + 'confidence': prober.get_confidence()} + self.done = constants.True + break + + def close(self): + if self.done: return + if not self._mGotData: + if constants._debug: + sys.stderr.write('no data received!\n') + return + self.done = constants.True + + if self._mInputState == ePureAscii: + self.result = {'encoding': 'ascii', 'confidence': 1.0} + return self.result + + if self._mInputState == eHighbyte: + proberConfidence = None + maxProberConfidence = 0.0 + maxProber = None + for prober in self._mCharSetProbers: + if not prober: continue + proberConfidence = prober.get_confidence() + if proberConfidence > maxProberConfidence: + maxProberConfidence = proberConfidence + maxProber = prober + if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): + self.result = {'encoding': maxProber.get_charset_name(), + 'confidence': maxProber.get_confidence()} + return self.result + + if constants._debug: + sys.stderr.write('no probers hit minimum threshhold\n') + for prober in self._mCharSetProbers[0].mProbers: + if not prober: continue + sys.stderr.write('%s confidence = %s\n' % \ + (prober.get_charset_name(), \ + prober.get_confidence())) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py new file mode 100644 index 0000000..c1792bb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/chardet/utf8prober.py @@ -0,0 +1,76 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import constants, sys +from constants import eStart, eError, eItsMe +from charsetprober import CharSetProber +from codingstatemachine import CodingStateMachine +from mbcssm import UTF8SMModel + +ONE_CHAR_PROB = 0.5 + +class UTF8Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(UTF8SMModel) + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mCodingSM.reset() + self._mNumOfMBChar = 0 + + def get_charset_name(self): + return "utf-8" + + def feed(self, aBuf): + for c in aBuf: + codingState = self._mCodingSM.next_state(c) + if codingState == eError: + self._mState = constants.eNotMe + break + elif codingState == eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == eStart: + if self._mCodingSM.get_current_charlen() >= 2: + self._mNumOfMBChar += 1 + + if self.get_state() == constants.eDetecting: + if self.get_confidence() > constants.SHORTCUT_THRESHOLD: + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + unlike = 0.99 + if self._mNumOfMBChar < 6: + for i in range(0, self._mNumOfMBChar): + unlike = unlike * ONE_CHAR_PROB + return 1.0 - unlike + else: + return unlike diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt new file mode 100644 index 0000000..ed95cfe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/license.txt @@ -0,0 +1,19 @@ +"None are so hopelessly enslaved as those who falsely believe they are free." + Johann Wolfgang von Goethe + +Copyright (C) 2012 Tito Bouzout + +This license apply to all the files inside this program unless noted +different for some files or portions of code inside these files. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation. http://www.gnu.org/licenses/gpl.html + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see http://www.gnu.org/licenses/gpl.html \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md new file mode 100644 index 0000000..6b8e26e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/EncodingHelper/readme.md @@ -0,0 +1,63 @@ +Description +------------------ + +Encoding Helper is a [Sublime Text](http://www.sublimetext.com/ ) plug-in which provides the following features: + + * attempts to guess encoding of files + * show encoding on status bar + * show when the current document is maybe broken because was opened with an incorrect encoding + * convert to UTF-8 from a variete of encodings organized in a menu. + * convert to UTF-8 quickly from guessed encoding via menuitem + * convert to UTF-8 automatically when opening a file via some defined encodings found on User preferences + +You should know that attempt to guess the encoding of a file is hard and the results for some encodings is not 100% acurrated. Also, is a task that consume CPU, for this reason this plug-in includes a lot of optimizations. + + + +Some more info +------------------ + +* I'm not an expert on encodings, don't talk to me as an expert. I just like a lot to build software compatible with every language using UTF-8 +* python chardet library is a port of chardet by Mozilla http://www-archive.mozilla.org/projects/intl/chardet.html +* python chardet library is a 'Gone' project http://feedparser.org/ +* By looking for the null character '\0' on files, means that every UTF16 file will be marked as binary ( same as in git source ) +* When converting a file to UTF-8 from some other encoding, the plugin calls to codecs.open with the selected encoding as argument. See http://docs.python.org/library/codecs.html +* If you are going to report that some file is reported with an incorrect encoding, please upload the file as is to some reliable resource and provide detailed information. Please be informed that even doing this I'm unable to look into the low levels on why this is happening. This is just to collect data that maybe is informative to someone curious on this topic. +* Just for fun, It would be nice if someone can create a dataset of pure txt files with every char found in a complete list of character sets. This: http://www.mauvecloud.net/charsets/manual/index.html but with the files in this format: http://vancouver-webpages.com/multilingual/russian-koi.html ( without html, without imgs, just text ) + +Resources +------------------ + +chardet library: +http://pypi.python.org/pypi/chardet + +dataset small: +http://vancouver-webpages.com/multilingual/ +http://charsetplus.tripod.com/HTMLs/index.html + +dataset huge: +http://www.mauvecloud.net/charsets/index.html + +codecs: +http://docs.python.org/library/codecs.html + +Installation +------------------ + +Install this repository via "Package Control" http://wbond.net/sublime_packages/package_control + +Source-code +------------------ + +https://github.com/SublimeText/EncodingHelper + +Forum Thread +------------------ + +http://www.sublimetext.com/forum/viewtopic.php?f=5&t=3453 + + +License +------------------ + +See license.txt \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap new file mode 100644 index 0000000..2a8b9ca --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Linux).sublime-keymap @@ -0,0 +1,8 @@ +[ + { + "command": "keymap_manager", + "keys": [ + "ctrl+alt+k" + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap new file mode 100644 index 0000000..2a8b9ca --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (OSX).sublime-keymap @@ -0,0 +1,8 @@ +[ + { + "command": "keymap_manager", + "keys": [ + "ctrl+alt+k" + ] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap new file mode 100644 index 0000000..e6e0cb7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Default (Windows).sublime-keymap @@ -0,0 +1,8 @@ +[ + { + "command": "keymap_manager", + "keys": [ + "ctrl+alt+k" + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py new file mode 100644 index 0000000..3d0ae0d --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.py @@ -0,0 +1,138 @@ +import sublime, sublime_plugin +import os +import json + +settings = sublime.load_settings("KeymapManager.sublime-settings") + +class KeymapManagerCommand(sublime_plugin.TextCommand): + """ + keymap manager for plugins + """ + osname = sublime.platform() + ctrlname = "ctrl" + #ctrlname is cmd on macos + if osname.lower() == "osx": + ctrlname = "cmd" + #add some default very usefull commands + defaultCommand = [ + {"name": "Goto Anything...", "keys": [ctrlname + "+p"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": True} }, + {"name": "Command Palette", "keys": [ctrlname + "+shift+p"], "command": "show_overlay", "args": {"overlay": "command_palette"} }, + {"name": "Goto Symbol...", "keys": [ctrlname + "+r"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} }, + {"name": "Goto Line...", "keys": [ctrlname + "+g"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} }, + {"name": "Search Keywords", "keys": [ctrlname + "+;"], "command": "show_overlay", "args": {"overlay": "goto", "text": "#"} }, + {"name": "Show Console", "keys": [ctrlname + "+`"], "command": "show_panel", "args": {"panel": "console", "toggle": True} } + ] + #installed plugins list + plugins = None + + plugins_keys = None + + def run(self, edit): + self.defaultCommand.sort(key=lambda x: x["name"].lower()) + + if self.plugins == None: + self.plugins = [] + if self.plugins_keys == None: + self.plugins_keys = {} + path = sublime.packages_path() + dirs = os.listdir(path) + #sort with insensitive + dirs.sort(key=lambda x: x.lower()) + plugins = [] + ignored_packages = settings.get("ignored_packages") or [] + single_max_nums = int(settings.get("single_max_nums") or 3) + for name in dirs: + if name in ignored_packages: + continue + dir = path + '/' + name + '/' + if not os.path.isdir(dir): + continue + platform = sublime.platform() + platform = platform[0].upper() + platform[1:].lower() + keymapFile = dir + "Default (" + platform + ").sublime-keymap" + if not os.path.isfile(keymapFile): + continue + #plugins.append(keymapFile) + with open(keymapFile) as f: + content = open(keymapFile).read() + try: + jsonData = json.loads(content) + except (ValueError): + continue + + if not isinstance(jsonData, list): + continue + i = 0 + for item in jsonData: + if "keys" not in item or "command" not in item: + continue + if single_max_nums <= 0 or i <= single_max_nums : + keys = item["keys"] + if not isinstance(keys, list): + keys = [keys] + for key in keys: + if key not in self.plugins_keys: + self.plugins_keys[key] = [] + if item["command"] not in self.plugins_keys[key]: + self.plugins_keys[key].append(item["command"]) + + if isinstance(keys, list): + keys = ", " . join(keys) + command = item["command"] + item["name"] = name + plugins.append([name, command + " : " + keys]) + self.plugins.append(item) + i += 1 + + for item in self.defaultCommand: + plugins.append([item['name'], item['command'] + " : " + ",".join(item['keys'])]) + self.plugins.append(item) + + plugins.append(["KeymapConflict", "check plugins keymap conflict"]) + self.plugins.append({"name": "KeymapConflict"}) + + self.view.window().show_quick_panel(plugins, self.panel_done) + + #panel done + def panel_done(self, picked): + if picked == -1: + return + item = self.plugins[picked] + if item["name"] == "KeymapConflict": + self.checkKeymapConflict() + return + if self.checkContext(item) == False: + return + args = {} + if "args" in item: + args = item['args'] + #thanks wuliang + self.view.run_command(item['command'], args) + self.view.window().run_command(item['command'], args) + sublime.run_command(item['command'], args) + + #check context condition + def checkContext(self, plugin): + return True + if "context" not in plugin: + return True + if "window" in plugin and plugin["window"]: + return True + context = plugin["context"] + name = plugin["name"] + path = path = sublime.packages_path() + '/' + name + '/' + import glob + pyFiles = glob.glob("*.py") + sublime.status_message(",".join(pyFiles)) + return True + + def checkKeymapConflict(self): + keymapConflict=[] + for key,item in self.plugins_keys.items(): + if len(item) > 1: + keymapConflict.append([key, "Conflict in \""+", ".join(item) + "\" commands"]) + if len(keymapConflict) > 0: + self.view.window().show_quick_panel(keymapConflict, self.check_panel_done) + + def check_panel_done(self, picked): + pass \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings new file mode 100644 index 0000000..aa63c1b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/KeymapManager.sublime-settings @@ -0,0 +1,4 @@ +{ + "ignored_packages": ["CSS", "Vintage", "User", "Default", "KeymapManager"], + "single_max_nums": 3 +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu new file mode 100644 index 0000000..b5c1344 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/Main.sublime-menu @@ -0,0 +1,13 @@ +[ + { + "id": "view", + "children": + [ + { + "caption": "Keymap Manager", + "id": "keymap-manager", + "command": "keymap_manager" + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md new file mode 100644 index 0000000..34872d2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/README.md @@ -0,0 +1,4 @@ +## about +KeymapManager plugin can manage all plugins keymap what user installed. +## how to use +view -> Keymap Manager or ctrl+alt+K diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json new file mode 100644 index 0000000..56a13b3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/KeymapManager/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/welefen/KeymapManager", "version": "2012.08.19.23.05.38", "description": "KeymapManager for sublime text 2"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore new file mode 100644 index 0000000..0205d62 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/.gitignore @@ -0,0 +1,2 @@ +*.pyc +.DS_Store diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap new file mode 100644 index 0000000..c84fbfb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Linux).sublime-keymap @@ -0,0 +1,22 @@ +[ + { + "keys": ["ctrl+shift+end"], + "command": "move_tab", + "args": { "position": "999" } + }, + { + "keys": ["ctrl+shift+home"], + "command": "move_tab", + "args": { "position": "0" } + }, + { + "keys": ["ctrl+shift+pageup"], + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "keys": ["ctrl+shift+pagedown"], + "command": "move_tab", + "args": { "position": "+1" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap new file mode 100644 index 0000000..d6a47bf --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (OSX).sublime-keymap @@ -0,0 +1,22 @@ +[ + { + "keys": ["super+alt+shift+down"], + "command": "move_tab", + "args": { "position": "999" } + }, + { + "keys": ["super+alt+shift+up"], + "command": "move_tab", + "args": { "position": "0" } + }, + { + "keys": ["super+alt+shift+left"], + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "keys": ["super+alt+shift+right"], + "command": "move_tab", + "args": { "position": "+1" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap new file mode 100644 index 0000000..c84fbfb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default (Windows).sublime-keymap @@ -0,0 +1,22 @@ +[ + { + "keys": ["ctrl+shift+end"], + "command": "move_tab", + "args": { "position": "999" } + }, + { + "keys": ["ctrl+shift+home"], + "command": "move_tab", + "args": { "position": "0" } + }, + { + "keys": ["ctrl+shift+pageup"], + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "keys": ["ctrl+shift+pagedown"], + "command": "move_tab", + "args": { "position": "+1" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands new file mode 100644 index 0000000..fab32c3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/Default.sublime-commands @@ -0,0 +1,22 @@ +[ + { + "caption": "Move Tab: To the left", + "command": "move_tab", + "args": { "position": "-1" } + }, + { + "caption": "Move Tab: To the right", + "command": "move_tab", + "args": { "position": "+1" } + }, + { + "caption": "Move Tab: To first position", + "command": "move_tab", + "args": { "position": "0" } + }, + { + "caption": "Move Tab: To last position", + "command": "move_tab", + "args": { "position": "999" } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt new file mode 100644 index 0000000..b699169 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) 2012 Frédéric Massart - FMCorz.net + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md new file mode 100644 index 0000000..aee5e46 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/README.md @@ -0,0 +1,33 @@ +Move Tab +======== + +Plugin for Sublime Text 2 to move tabs around. + +Usage +----- + +The following commands are accessible via the command palette: + +- Move Tab: To the left +- Move Tab: To the right +- Move Tab: To first position +- Move Tab: To last position + +The shortcuts are: + +- Linux/Windows: CTRL + Shift + (Page up / Page down / Home / End) +- MacOS X: Command + Alt + Shift + (Left / Right / Up / Down) + +Installation +------------ + +Clone this repository into the Packages directory. If you don't know where it is, enter the following command in the console: + + print sublime.packages_path() + +_To access the console press CTRL + `_ + +License +------- + +Licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php) \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py new file mode 100644 index 0000000..104c84b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/move_tab.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +""" +Move Tab + +Plugin for Sublime Text 2 to move tabs around + +Copyright (c) 2012 Frédéric Massart - FMCorz.net + +Licensed under The MIT License +Redistributions of files must retain the above copyright notice. + +http://github.com/FMCorz/MoveTab +""" + +import sublime, sublime_plugin + +class MoveTabCommand(sublime_plugin.WindowCommand): + + def run(self, position): + position = str(position) + view = self.window.active_view() + (group, index) = self.window.get_view_index(view) + if index < 0: + return + count = len(self.window.views_in_group(group)) + + direction = None + if position.startswith('-') or position.startswith('+'): + direction = position[0] + steps = int(position[1:]) + if direction == '-': + position = index - steps + else: + position = index + steps + + position = int(position) + if position < 0: + position = count - 1 + elif position > count - 1: + if direction: position = 0 + else: position = count - 1 + + # Avoid flashing tab when moving to same index + if position == index: + return + + self.window.set_view_index(view, group, position) + self.window.focus_view(view) + + def is_enabled(self): + view = self.window.active_view() + if view == None: + return False + (group, index) = self.window.get_view_index(view) + return len(self.window.views_in_group(group)) > 1 + + def is_visible(self): + return True + + def description(self): + return None diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json new file mode 100644 index 0000000..00de1ed --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/MoveTab/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/SublimeText/MoveTab", "version": "2012.08.24.06.11.17", "description": "Plugin for Sublime Text 2 to move tabs around"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap new file mode 100644 index 0000000..c2559ab --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Linux).sublime-keymap @@ -0,0 +1,4 @@ +[ + { "keys": ["ctrl+alt+left"], "command": "navigation_history_back"}, + { "keys": ["ctrl+alt+right"], "command": "navigation_history_forward"} +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap new file mode 100644 index 0000000..fc80b91 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (OSX).sublime-keymap @@ -0,0 +1,4 @@ +[ + { "keys": ["super+ctrl+alt+left"], "command": "navigation_history_back"}, + { "keys": ["super+ctrl+alt+right"], "command": "navigation_history_forward"} +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap new file mode 100644 index 0000000..c2559ab --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/Default (Windows).sublime-keymap @@ -0,0 +1,4 @@ +[ + { "keys": ["ctrl+alt+left"], "command": "navigation_history_back"}, + { "keys": ["ctrl+alt+right"], "command": "navigation_history_forward"} +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md new file mode 100644 index 0000000..51720fd --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/README.md @@ -0,0 +1,44 @@ +Sublime Navigation History +======================== + +A Sublime Text plugin to jump forward and back around your code. + +### Installation ### + +**ST2** + +1. Install package control if you haven't already http://wbond.net/sublime_packages/package_control). +2. Search for package "Sublime Navigation History" +3. Install and enjoy. + +**ST3** + +This plugin is no longer needed for ST3, as of build 3019 Navigation History has been natively added via the new Jump Back and Jump Forward commands. They are called "jump_back" and "jump_forward" and you can add them to your key bindings (Preferences -> Key Bindings - User) with the following snippet: + + { "keys": ["ctrl+alt+left"], "command": "jump_back" }, + { "keys": ["ctrl+alt+right"], "command": "jump_forward" } + + +### Controls ### + +**OSX** +* Command + Control + Alt + Left - Navigate Backwards +* Command + Control + Alt + Right - Navigate Forwards + +**Windows / Linux** +* Control + Alt + Left - Navigate Backwards +* Control + Alt + Right - Navigate Forwards + + +### Issues ### + +This plugin does not track small navigation changes such as moving one line or character, this is so it's easier to go back to the last big block of code you were working on and moving one line or character backwards via a hotkey is not something most users want to do. + + +### Credits ### + +This was not originally created by me, it was created by Martin Aspeli (https://github.com/optilude) and came from this forum thread: http://www.sublimetext.com/forum/viewtopic.php?f=5&t=2738 + +I'm hosting this repository to keep it updated for Sublime Text 3 and also to add it to Package Control (because everyone should have access to such an awesome plugin). + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py new file mode 100644 index 0000000..df0d698 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/navigation-history.py @@ -0,0 +1,179 @@ +# Forked from: https://github.com/optilude/SublimeTextMisc/blob/master/navigationHistory.py +import sublime, sublime_plugin +from collections import deque + +MAX_SIZE = 64 +LINE_THRESHOLD = 2 + +class Location(object): + """A location in the history + """ + + def __init__(self, path, line, col): + self.path = path + self.line = line + self.col = col + + def __eq__(self, other): + return self.path == other.path and self.line == other.line + + def __ne__(self, other): + return not self.__eq__(other) + + def __nonzero__(self): + return (self.path is not None and self.line is not None) + + def near(self, other): + return self.path == other.path and abs(self.line - other.line) <= LINE_THRESHOLD + + def copy(self): + return Location(self.path, self.line, self.col) + +class History(object): + """Keep track of the history for a single window + """ + + def __init__(self, max_size=MAX_SIZE): + self._current = None # current location as far as the + # history is concerned + self._back = deque([], max_size) # items before self._current + self._forward = deque([], max_size) # items after self._current + + self._last_movement = None # last recorded movement + + def record_movement(self, location): + """Record movement to the given location, pushing history if + applicable + """ + + if location: + if self.has_changed(location): + #Push the current location if it hasn't been added already, so when going back after using goto it goes to the correct location + if self._back and self._last_movement is not self._back[-1]: + self.push(self._last_movement) + self.push(location) + self.mark_location(location) + + def mark_location(self, location): + """Remember the current location, for the purposes of being able + to do a has_changed() check. + """ + self._last_movement = location.copy() + + def has_changed(self, location): + """Determine if the given location combination represents a + significant enough change to warrant pushing history. + """ + + return self._last_movement is None or not self._last_movement.near(location) + + def push(self, location): + """Push the given location to the back history. Clear the forward + history. + """ + + if self._current is not None: + self._back.append(self._current.copy()) + self._current = location.copy() + self._forward.clear() + + def back(self): + """Move backward in history, returning the location to jump to. + Returns None if no history. + """ + + if not self._back: + return None + + self._forward.appendleft(self._current) + self._current = self._back.pop() + self._last_movement = self._current # preempt, so we don't re-push + return self._current + + def forward(self): + """Move forward in history, returning the location to jump to. + Returns None if no history. + """ + + if not self._forward: + return None + + self._back.append(self._current) + self._current = self._forward.popleft() + self._last_movement = self._current # preempt, so we don't re-push + return self._current + +_histories = {} # window id -> History + +def get_history(): + """Get a History object for the current window, + creating a new one if required + """ + + window = sublime.active_window() + if window is None: + return None + + window_id = window.id() + history = _histories.get(window_id, None) + if history is None: + _histories[window_id] = history = History() + return history + +class NavigationHistoryRecorder(sublime_plugin.EventListener): + """Keep track of history + """ + + def on_selection_modified(self, view): + """When the selection is changed, possibly record movement in the + history + """ + history = get_history() + if history is None: + return + + path = view.file_name() + row, col = view.rowcol(view.sel()[0].a) + history.record_movement(Location(path, row + 1, col + 1)) + + # def on_close(self, view): + # """When a view is closed, check to see if the window was closed too + # and clean up orphan histories + # """ + # + # # XXX: This doesn't work - event runs before window is removed + # # from sublime.windows() + # + # windows_with_history = set(_histories.keys()) + # window_ids = set([w.id() for w in sublime.windows()]) + # closed_windows = windows_with_history.difference(window_ids) + # for window_id in closed_windows: + # del _histories[window_id] + +class NavigationHistoryBack(sublime_plugin.TextCommand): + """Go back in history + """ + + def run(self, edit): + history = get_history() + if history is None: + return + + location = history.back() + if location: + window = sublime.active_window() + window.open_file("{0}:{1}:{2}".format(location.path, location.line, location.col), sublime.ENCODED_POSITION) + +class NavigationHistoryForward(sublime_plugin.TextCommand): + """Go forward in history + """ + + def run(self, edit): + history = get_history() + if history is None: + return + + location = history.forward() + if location: + window = sublime.active_window() + window.open_file("{0}:{1}:{2}".format(location.path, location.line, location.col), sublime.ENCODED_POSITION) \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json new file mode 100644 index 0000000..345fe4a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Navigation History/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/timjrobinson/SublimeNavigationHistory", "version": "2013.03.17.15.51.45", "description": "SublimeText 2/3 Navigation History - jump forward and back around your code. "} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap new file mode 100644 index 0000000..0b4309b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/Default.sublime-keymap @@ -0,0 +1,3 @@ +[ + { "keys": ["ctrl+shift+t"], "command": "open_recent_files" } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md new file mode 100644 index 0000000..fc8332c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/README.md @@ -0,0 +1,8 @@ +This package adds a shortcut to open the most recently closed files. + +Keyboard shortcut is `Ctrl+Shift+T`. Press it multiple times to go further back through previously closed files. + +Version 1.01 +------------ + +- Plugin now will open up to the 20 latest files. There may be a brief flicker when opening subsequent files (by repeatedly pressing the shortcut key) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py new file mode 100644 index 0000000..46aa485 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/open_recent_files.py @@ -0,0 +1,14 @@ +import sublime +import sublime_plugin + + +class OpenRecentFilesCommand(sublime_plugin.WindowCommand): + def run(self): + w = sublime.active_window() + counter = 0 + numViews = len(w.views()) + while (counter < 20): + w.run_command('open_recent_file', {"index": counter}) + if numViews < len(w.views()): + break + counter += 1 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json new file mode 100644 index 0000000..fdec3ca --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Open Recent Files/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/spadgos/sublime-OpenRecentFiles", "version": "2011.10.03.10.20.08", "description": "A package which adds Ctrl+Shift+T to open the most recent files."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore new file mode 100644 index 0000000..99ec428 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/.gitignore @@ -0,0 +1,2 @@ +*.pyc +.idea diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings new file mode 100644 index 0000000..0ed3659 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Base File (OSX).sublime-settings @@ -0,0 +1,5 @@ +{ + "highlight_search_icon": "bookmark", + "highlight_search_scope": "entity.name.function", + "highlight_search_results": false +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md new file mode 100644 index 0000000..86fdce1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/CONTRIBUTORS.md @@ -0,0 +1,5 @@ +# Contributors + +The following people have contributed code to the OpenSearchResult plugin. + +Chris Barnett diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap new file mode 100644 index 0000000..2018feb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/Default.sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["g", "o"], + "command": "open_search_result", + "context": [{"key": "setting.command_mode"}] + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt new file mode 100644 index 0000000..49a9c3f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) 2012 Andrew Brookins + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md new file mode 100644 index 0000000..ed2ce2a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/README.md @@ -0,0 +1,26 @@ +# Open Search Result Plugin for Sublime Text 2 + +This plugin creates a command that allows you to open files listed in the search +results of the 'Find in Files' command. + +- When run on a line in the search results that includes a line number, e.g., +"102: print 'foo'" it opens the file at the correct line number. + +- When run on a line that contains a file path like '/path/to/somewhere:' +in the search listing, it opens the file without a line number specified. + +## Key Binding + +- The default key binding is a Vintage command mode key: "g, o". + +## Customizing + +You can change various things about the plugin by adding user settings: + +- 'highlight_search_results': Set to false to disable highlighting openable +paths (the open command will still work) +- 'highlight_search_scope': The scope that will be used to color the outline for +openable paths or the icon. See your theme file for examples of colors. +- 'highlight_search_icon': If you want an icon to show up in the gutter next to +openable paths, include a valid icon name as a string (e.g., 'circle', 'dot' or +'bookmark') diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py new file mode 100644 index 0000000..ccaa753 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/open_search_result.py @@ -0,0 +1,126 @@ +import os +import sublime, sublime_plugin +import util + + +class HighlightFilePaths(sublime_plugin.EventListener): + HIGHLIGHT_REGION_NAME = 'HighlightFilePaths' + HIGHLIGHT_ENABLED_KEY = 'highlight_search_results' + SCOPE_SETTINGS_KEY = 'highlight_search_scope' + ICON_SETTINGS_KEY = 'highlight_search_icon' + DEFAULT_SCOPE = 'search_result_highlight' + DEFAULT_ICON = '' + + def show_highlight(self, view): + valid_regions = [] + show_highlight = view.settings().get(self.HIGHLIGHT_ENABLED_KEY, False) + scope = view.settings().get(self.SCOPE_SETTINGS_KEY, self.DEFAULT_SCOPE) + icon = view.settings().get(self.ICON_SETTINGS_KEY, self.DEFAULT_ICON) + + if view.name() != 'Find Results': + return + + for s in view.sel(): + line = view.line(s) + line_str = view.substr(view.line(s)) + line_num = util.parse_line_number(line_str) + + if util.is_file_path(line_str) or line_num: + valid_regions.append(line) + + if valid_regions: + if show_highlight: + options = sublime.DRAW_EMPTY | sublime.DRAW_OUTLINED + else: + options = sublime.HIDDEN + + view.add_regions( + self.HIGHLIGHT_REGION_NAME, valid_regions, scope, icon, options) + else: + view.erase_regions(self.HIGHLIGHT_REGION_NAME) + + def on_selection_modified(self, view): + highlight_enabled = (view.settings().get(self.HIGHLIGHT_ENABLED_KEY) + or view.settings().get(self.ICON_SETTINGS_KEY)) + + if view.settings().get('is_widget') \ + or not view.settings().get('command_mode') \ + or not highlight_enabled: + view.erase_regions(self.HIGHLIGHT_REGION_NAME) + return + + self.show_highlight(view) + + def on_deactivated(self, view): + view.erase_regions(self.HIGHLIGHT_REGION_NAME) + + def on_activated(self, view): + if view.settings().get('highlight_file_paths'): + self.show_highlight(view) + + +class OpenSearchResultCommand(sublime_plugin.TextCommand): + """ + Open a file listed in the Find In File search results at the line the + cursor is on, or just open the file if the cursor is on the file path. + """ + + def open_file_from_line(self, line, line_num): + """ + Attempt to parse a file path from the string `line` and open it in a + new buffer. + """ + if ':' not in line: + return + + file_path = line[0:-1] + + if os.path.exists(file_path): + self.view.window().open_file( + "%s:%s" % (file_path, line_num), sublime.ENCODED_POSITION) + + def previous_line(self, region): + """ `region` should be a Region covering the entire hard line """ + if region.begin() == 0: + return None + else: + return self.view.full_line(region.begin() - 1) + + def open_file_path(self, line_str): + """ + Parse a file path from a string `line_str` of the format: ":" + """ + file_path = line_str[0:-1] + + if os.path.exists(file_path): + self.view.window().open_file(file_path) + + def open_file_at_line_num(self, cur_line, line_num): + """ + Starting at the position `cur_line` (a `Region`), count backwards + until we find a path or the beginning of the file. If we find a file + path, open it in a new tab at `line_num`. + """ + prev = cur_line + while True: + prev = self.previous_line(prev) + if prev is None: + break + + line = self.view.substr(prev).strip() + if util.is_file_path(line): + return self.open_file_from_line(line, line_num) + + def run(self, edit): + for cursor in self.view.sel(): + cur_line = self.view.line(cursor) + line_str = self.view.substr(cur_line).strip() + line_num = util.parse_line_number(line_str) + + if self.view.name() != 'Find Results': + return + + if util.is_file_path(line_str): + self.open_file_path(line_str) + elif line_num: + self.open_file_at_line_num(cur_line, line_num) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json new file mode 100644 index 0000000..898c230 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/abrookins/OpenSearchResult", "version": "2012.09.11.15.18.59", "description": "a Sublime Text 2 plugin that opens files listed in the Find in File output"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py new file mode 100644 index 0000000..1196191 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/OpenSearchResult/util.py @@ -0,0 +1,36 @@ +""" +util.py: Utility functions for opening Sublime Text 2 search results. +""" +import re + + +def parse_line_number(line_str): + """ + In a line of the format ": "or " " + this grabs line_num. + + >>> parse_line_number('5: def parse_line_number(line_str):') + '5' + >>> parse_line_number('43 line = view.line(s)') + '43' + >>> parse_line_number('136: line_num = parse_line_number(line_str)') + '136' + """ + parts = line_str.split() + line_num = parts[0].strip().replace(':', '') + return line_num + + +def is_file_path(line_str): + """ + Test if `line_str` is a file path. + + >>> is_file_path('/Users/me/code/OpenSearchResult/open_search_result.py:') + True + >>> is_file_path('C:\Users\me\\test.txt:') + True + >>> is_file_path('5: def parse_line_number(line_str):') + False + """ + return re.match("^(/|\w:\\\).*:$", line_str) is not None + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands new file mode 100644 index 0000000..7d823ee --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Default.sublime-commands @@ -0,0 +1,64 @@ +[ + { + "caption": "Package Control: Add Repository", + "command": "add_repository" + }, + { + "caption": "Package Control: Add Channel", + "command": "add_repository_channel" + }, + { + "caption": "Package Control: Create Binary Package File", + "command": "create_binary_package" + }, + { + "caption": "Package Control: Create Package File", + "command": "create_package" + }, + { + "caption": "Package Control: Disable Package", + "command": "disable_package" + }, + { + "caption": "Package Control: Discover Packages", + "command": "discover_packages" + }, + { + "caption": "Package Control: Enable Package", + "command": "enable_package" + }, + { + "caption": "Package Control: Install Package", + "command": "install_package" + }, + { + "caption": "Package Control: List Packages", + "command": "list_packages" + }, + { + "caption": "Package Control: Remove Package", + "command": "remove_package" + }, + { + "caption": "Package Control: Upgrade Package", + "command": "upgrade_package" + }, + { + "caption": "Package Control: Upgrade/Overwrite All Packages", + "command": "upgrade_all_packages" + }, + { + "caption": "Preferences: Package Control Settings – Default", + "command": "open_file", "args": + { + "file": "${packages}/Package Control/Package Control.sublime-settings" + } + }, + { + "caption": "Preferences: Package Control Settings – User", + "command": "open_file", "args": + { + "file": "${packages}/User/Package Control.sublime-settings" + } + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu new file mode 100644 index 0000000..cbe83d1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Main.sublime-menu @@ -0,0 +1,45 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "Package Control", + "children": + [ + { + "command": "open_file", "args": + { + "file": "${packages}/Package Control/Package Control.sublime-settings" + }, + "caption": "Settings – Default" + }, + { + "command": "open_file", "args": + { + "file": "${packages}/User/Package Control.sublime-settings" + }, + "caption": "Settings – User" + }, + { "caption": "-" } + ] + } + ] + }, + { + "caption": "Package Control", + "mnemonic": "C", + "command": "show_overlay", + "args": {"overlay": "command_palette", "text": "Package Control: "} + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py new file mode 100644 index 0000000..4b62978 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.py @@ -0,0 +1,4810 @@ +# coding=utf-8 +import sublime +import sublime_plugin +import os +import sys +import subprocess +import zipfile +import urllib +import urllib2 +import json +from fnmatch import fnmatch +import re +import threading +import datetime +import time +import shutil +import tempfile +import httplib +import socket +import hashlib +import base64 +import locale +import urlparse +import gzip +import StringIO +import zlib + + +if os.name == 'nt': + from ctypes import windll, create_unicode_buffer + + +def add_to_path(path): + # Python 2.x on Windows can't properly import from non-ASCII paths, so + # this code added the DOC 8.3 version of the lib folder to the path in + # case the user's username includes non-ASCII characters + if os.name == 'nt': + buf = create_unicode_buffer(512) + if windll.kernel32.GetShortPathNameW(path, buf, len(buf)): + path = buf.value + + if path not in sys.path: + sys.path.append(path) + + +lib_folder = os.path.join(sublime.packages_path(), 'Package Control', 'lib') +add_to_path(os.path.join(lib_folder, 'all')) + + +import semver + + +if os.name == 'nt': + add_to_path(os.path.join(lib_folder, 'windows')) + from ntlm import ntlm + + +def unicode_from_os(e): + # This is needed as some exceptions coming from the OS are + # already encoded and so just calling unicode(e) will result + # in an UnicodeDecodeError as the string isn't in ascii form. + try: + # Sublime Text on OS X does not seem to report the correct encoding + # so we hard-code that to UTF-8 + encoding = 'UTF-8' if os.name == 'darwin' else locale.getpreferredencoding() + return unicode(str(e), encoding) + + # If the "correct" encoding did not work, try some defaults, and then just + # obliterate characters that we can't seen to decode properly + except UnicodeDecodeError: + encodings = ['utf-8', 'cp1252'] + for encoding in encodings: + try: + return unicode(str(e), encoding, errors='strict') + except: + pass + return unicode(str(e), errors='replace') + + +def create_cmd(args, basename_binary=False): + if basename_binary: + args[0] = os.path.basename(args[0]) + + if os.name == 'nt': + return subprocess.list2cmdline(args) + else: + escaped_args = [] + for arg in args: + if re.search('^[a-zA-Z0-9/_^\\-\\.:=]+$', arg) == None: + arg = u"'" + arg.replace(u"'", u"'\\''") + u"'" + escaped_args.append(arg) + return u' '.join(escaped_args) + + +# Monkey patch AbstractBasicAuthHandler to prevent infinite recursion +def non_recursive_http_error_auth_reqed(self, authreq, host, req, headers): + authreq = headers.get(authreq, None) + + if not hasattr(self, 'retried'): + self.retried = 0 + + if self.retried > 5: + raise urllib2.HTTPError(req.get_full_url(), 401, "basic auth failed", + headers, None) + else: + self.retried += 1 + + if authreq: + mo = urllib2.AbstractBasicAuthHandler.rx.search(authreq) + if mo: + scheme, quote, realm = mo.groups() + if scheme.lower() == 'basic': + return self.retry_http_basic_auth(host, req, realm) + +urllib2.AbstractBasicAuthHandler.http_error_auth_reqed = non_recursive_http_error_auth_reqed + + +class DebuggableHTTPResponse(httplib.HTTPResponse): + """ + A custom HTTPResponse that formats debugging info for Sublime Text + """ + + _debug_protocol = 'HTTP' + + def __init__(self, sock, debuglevel=0, strict=0, method=None): + # We have to use a positive debuglevel to get it passed to here, + # however we don't want to use it because by default debugging prints + # to the stdout and we can't capture it, so we use a special -1 value + if debuglevel == 5: + debuglevel = -1 + httplib.HTTPResponse.__init__(self, sock, debuglevel, strict, method) + + def begin(self): + return_value = httplib.HTTPResponse.begin(self) + if self.debuglevel == -1: + print '%s: Urllib2 %s Debug Read' % (__name__, self._debug_protocol) + headers = self.msg.headers + versions = { + 9: 'HTTP/0.9', + 10: 'HTTP/1.0', + 11: 'HTTP/1.1' + } + status_line = versions[self.version] + ' ' + str(self.status) + ' ' + self.reason + headers.insert(0, status_line) + for line in headers: + print u" %s" % line.rstrip() + return return_value + + def read(self, *args): + try: + return httplib.HTTPResponse.read(self, *args) + except (httplib.IncompleteRead) as (e): + return e.partial + + +class DebuggableHTTPSResponse(DebuggableHTTPResponse): + """ + A version of DebuggableHTTPResponse that sets the debug protocol to HTTPS + """ + + _debug_protocol = 'HTTPS' + + +class DebuggableHTTPConnection(httplib.HTTPConnection): + """ + A custom HTTPConnection that formats debugging info for Sublime Text + """ + + response_class = DebuggableHTTPResponse + _debug_protocol = 'HTTP' + + def __init__(self, host, port=None, strict=None, + timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kwargs): + self.passwd = kwargs.get('passwd') + + # Python 2.6.1 on OS X 10.6 does not include these + self._tunnel_host = None + self._tunnel_port = None + self._tunnel_headers = {} + + httplib.HTTPConnection.__init__(self, host, port, strict, timeout) + + def connect(self): + if self.debuglevel == -1: + print '%s: Urllib2 %s Debug General' % (__name__, self._debug_protocol) + print u" Connecting to %s on port %s" % (self.host, self.port) + httplib.HTTPConnection.connect(self) + + def send(self, string): + # We have to use a positive debuglevel to get it passed to the + # HTTPResponse object, however we don't want to use it because by + # default debugging prints to the stdout and we can't capture it, so + # we temporarily set it to -1 for the standard httplib code + reset_debug = False + if self.debuglevel == 5: + reset_debug = 5 + self.debuglevel = -1 + httplib.HTTPConnection.send(self, string) + if reset_debug or self.debuglevel == -1: + if len(string.strip()) > 0: + print '%s: Urllib2 %s Debug Write' % (__name__, self._debug_protocol) + for line in string.strip().splitlines(): + print ' ' + line + if reset_debug: + self.debuglevel = reset_debug + + def request(self, method, url, body=None, headers={}): + original_headers = headers.copy() + + # Handles the challenge request response cycle before the real request + proxy_auth = headers.get('Proxy-Authorization') + if os.name == 'nt' and proxy_auth and proxy_auth.lstrip()[0:4] == 'NTLM': + # The default urllib2.AbstractHTTPHandler automatically sets the + # Connection header to close because of urllib.addinfourl(), but in + # this case we are going to do some back and forth first for the NTLM + # proxy auth + headers['Connection'] = 'Keep-Alive' + self._send_request(method, url, body, headers) + + response = self.getresponse() + + content_length = int(response.getheader('content-length', 0)) + if content_length: + response._safe_read(content_length) + + proxy_authenticate = response.getheader('proxy-authenticate', None) + if not proxy_authenticate: + raise URLError('Invalid NTLM proxy authentication response') + ntlm_challenge = re.sub('^\s*NTLM\s+', '', proxy_authenticate) + + if self.host.find(':') != -1: + host_port = self.host + else: + host_port = "%s:%s" % (self.host, self.port) + username, password = self.passwd.find_user_password(None, host_port) + domain = '' + user = username + if username.find('\\') != -1: + domain, user = username.split('\\', 1) + + challenge, negotiate_flags = ntlm.parse_NTLM_CHALLENGE_MESSAGE(ntlm_challenge) + new_proxy_authorization = 'NTLM %s' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(challenge, user, + domain, password, negotiate_flags) + original_headers['Proxy-Authorization'] = new_proxy_authorization + response.close() + + httplib.HTTPConnection.request(self, method, url, body, original_headers) + + +class DebuggableHTTPHandler(urllib2.HTTPHandler): + """ + A custom HTTPHandler that formats debugging info for Sublime Text + """ + + def __init__(self, debuglevel=0, debug=False, **kwargs): + # This is a special value that will not trigger the standard debug + # functionality, but custom code where we can format the output + if debug: + self._debuglevel = 5 + else: + self._debuglevel = debuglevel + self.passwd = kwargs.get('passwd') + + def http_open(self, req): + def http_class_wrapper(host, **kwargs): + kwargs['passwd'] = self.passwd + return DebuggableHTTPConnection(host, **kwargs) + + return self.do_open(http_class_wrapper, req) + + +class RateLimitException(httplib.HTTPException, urllib2.URLError): + """ + An exception for when the rate limit of an API has been exceeded. + """ + + def __init__(self, host, limit): + httplib.HTTPException.__init__(self) + self.host = host + self.limit = limit + + def __str__(self): + return ('Rate limit of %s exceeded for %s' % (self.limit, self.host)) + + +if os.name == 'nt': + class ProxyNtlmAuthHandler(urllib2.BaseHandler): + + handler_order = 300 + auth_header = 'Proxy-Authorization' + + def __init__(self, password_manager=None): + if password_manager is None: + password_manager = HTTPPasswordMgr() + self.passwd = password_manager + self.retried = 0 + + def http_error_407(self, req, fp, code, msg, headers): + proxy_authenticate = headers.get('proxy-authenticate') + if os.name != 'nt' or proxy_authenticate[0:4] != 'NTLM': + return None + + type1_flags = ntlm.NTLM_TYPE1_FLAGS + + if req.host.find(':') != -1: + host_port = req.host + else: + host_port = "%s:%s" % (req.host, req.port) + username, password = self.passwd.find_user_password(None, host_port) + if not username: + return None + + if username.find('\\') == -1: + type1_flags &= ~ntlm.NTLM_NegotiateOemDomainSupplied + + negotiate_message = ntlm.create_NTLM_NEGOTIATE_MESSAGE(username, type1_flags) + auth = 'NTLM %s' % negotiate_message + if req.headers.get(self.auth_header, None) == auth: + return None + req.add_unredirected_header(self.auth_header, auth) + return self.parent.open(req, timeout=req.timeout) + + +# The following code is wrapped in a try because the Linux versions of Sublime +# Text do not include the ssl module due to the fact that different distros +# have different versions +try: + import ssl + + class InvalidCertificateException(httplib.HTTPException, urllib2.URLError): + """ + An exception for when an SSL certification is not valid for the URL + it was presented for. + """ + + def __init__(self, host, cert, reason): + httplib.HTTPException.__init__(self) + self.host = host + self.cert = cert + self.reason = reason + + def __str__(self): + return ('Host %s returned an invalid certificate (%s) %s\n' % + (self.host, self.reason, self.cert)) + + + class ValidatingHTTPSConnection(DebuggableHTTPConnection): + """ + A custom HTTPConnection class that validates SSL certificates, and + allows proxy authentication for HTTPS connections. + """ + + default_port = httplib.HTTPS_PORT + + response_class = DebuggableHTTPSResponse + _debug_protocol = 'HTTPS' + + def __init__(self, host, port=None, key_file=None, cert_file=None, + ca_certs=None, strict=None, **kwargs): + passed_args = {} + if 'timeout' in kwargs: + passed_args['timeout'] = kwargs['timeout'] + DebuggableHTTPConnection.__init__(self, host, port, strict, **passed_args) + + self.passwd = kwargs.get('passwd') + self.key_file = key_file + self.cert_file = cert_file + self.ca_certs = ca_certs + if 'user_agent' in kwargs: + self.user_agent = kwargs['user_agent'] + if self.ca_certs: + self.cert_reqs = ssl.CERT_REQUIRED + else: + self.cert_reqs = ssl.CERT_NONE + + def get_valid_hosts_for_cert(self, cert): + """ + Returns a list of valid hostnames for an SSL certificate + + :param cert: A dict from SSLSocket.getpeercert() + + :return: An array of hostnames + """ + + if 'subjectAltName' in cert: + return [x[1] for x in cert['subjectAltName'] + if x[0].lower() == 'dns'] + else: + return [x[0][1] for x in cert['subject'] + if x[0][0].lower() == 'commonname'] + + def validate_cert_host(self, cert, hostname): + """ + Checks if the cert is valid for the hostname + + :param cert: A dict from SSLSocket.getpeercert() + + :param hostname: A string hostname to check + + :return: A boolean if the cert is valid for the hostname + """ + + hosts = self.get_valid_hosts_for_cert(cert) + for host in hosts: + host_re = host.replace('.', '\.').replace('*', '[^.]*') + if re.search('^%s$' % (host_re,), hostname, re.I): + return True + return False + + def _tunnel(self, ntlm_follow_up=False): + """ + This custom _tunnel method allows us to read and print the debug + log for the whole response before throwing an error, and adds + support for proxy authentication + """ + + self._proxy_host = self.host + self._proxy_port = self.port + self._set_hostport(self._tunnel_host, self._tunnel_port) + + self._tunnel_headers['Host'] = u"%s:%s" % (self.host, self.port) + self._tunnel_headers['User-Agent'] = self.user_agent + self._tunnel_headers['Proxy-Connection'] = 'Keep-Alive' + + request = "CONNECT %s:%d HTTP/1.1\r\n" % (self.host, self.port) + for header, value in self._tunnel_headers.iteritems(): + request += "%s: %s\r\n" % (header, value) + self.send(request + "\r\n") + + response = self.response_class(self.sock, strict=self.strict, + method=self._method) + (version, code, message) = response._read_status() + + status_line = u"%s %s %s" % (version, code, message.rstrip()) + headers = [status_line] + + if self.debuglevel in [-1, 5]: + print '%s: Urllib2 %s Debug Read' % (__name__, self._debug_protocol) + print u" %s" % status_line + + content_length = 0 + close_connection = False + while True: + line = response.fp.readline() + if line == '\r\n': break + + headers.append(line.rstrip()) + + parts = line.rstrip().split(': ', 1) + name = parts[0].lower() + value = parts[1].lower().strip() + if name == 'content-length': + content_length = int(value) + + if name in ['connection', 'proxy-connection'] and value == 'close': + close_connection = True + + if self.debuglevel in [-1, 5]: + print u" %s" % line.rstrip() + + # Handle proxy auth for SSL connections since regular urllib2 punts on this + if code == 407 and self.passwd and ('Proxy-Authorization' not in self._tunnel_headers or ntlm_follow_up): + if content_length: + response._safe_read(content_length) + + supported_auth_methods = {} + for line in headers: + parts = line.split(': ', 1) + if parts[0].lower() != 'proxy-authenticate': + continue + details = parts[1].split(' ', 1) + supported_auth_methods[details[0].lower()] = details[1] if len(details) > 1 else '' + + username, password = self.passwd.find_user_password(None, "%s:%s" % ( + self._proxy_host, self._proxy_port)) + + do_ntlm_follow_up = False + + if 'digest' in supported_auth_methods: + response_value = self.build_digest_response( + supported_auth_methods['digest'], username, password) + if response_value: + self._tunnel_headers['Proxy-Authorization'] = u"Digest %s" % response_value + + elif 'basic' in supported_auth_methods: + response_value = u"%s:%s" % (username, password) + response_value = base64.b64encode(response_value).strip() + self._tunnel_headers['Proxy-Authorization'] = u"Basic %s" % response_value + + elif 'ntlm' in supported_auth_methods and os.name == 'nt': + ntlm_challenge = supported_auth_methods['ntlm'] + if not len(ntlm_challenge): + type1_flags = ntlm.NTLM_TYPE1_FLAGS + if username.find('\\') == -1: + type1_flags &= ~ntlm.NTLM_NegotiateOemDomainSupplied + + negotiate_message = ntlm.create_NTLM_NEGOTIATE_MESSAGE(username, type1_flags) + self._tunnel_headers['Proxy-Authorization'] = 'NTLM %s' % negotiate_message + do_ntlm_follow_up = True + else: + domain = '' + user = username + if username.find('\\') != -1: + domain, user = username.split('\\', 1) + + challenge, negotiate_flags = ntlm.parse_NTLM_CHALLENGE_MESSAGE(ntlm_challenge) + self._tunnel_headers['Proxy-Authorization'] = 'NTLM %s' % ntlm.create_NTLM_AUTHENTICATE_MESSAGE(challenge, user, + domain, password, negotiate_flags) + + if 'Proxy-Authorization' in self._tunnel_headers: + self.host = self._proxy_host + self.port = self._proxy_port + + # If the proxy wanted the connection closed, we need to make a new connection + if close_connection: + self.sock.close() + self.sock = socket.create_connection((self.host, self.port), self.timeout) + + return self._tunnel(do_ntlm_follow_up) + + if code != 200: + self.close() + raise socket.error("Tunnel connection failed: %d %s" % (code, + message.strip())) + + def build_digest_response(self, fields, username, password): + """ + Takes a Proxy-Authenticate: Digest header and creates a response + header + + :param fields: + The string portion of the Proxy-Authenticate header after + "Digest " + + :param username: + The username to use for the response + + :param password: + The password to use for the response + + :return: + None if invalid Proxy-Authenticate header, otherwise the + string of fields for the Proxy-Authorization: Digest header + """ + + fields = urllib2.parse_keqv_list(urllib2.parse_http_list(fields)) + + realm = fields.get('realm') + nonce = fields.get('nonce') + qop = fields.get('qop') + algorithm = fields.get('algorithm') + if algorithm: + algorithm = algorithm.lower() + opaque = fields.get('opaque') + + if algorithm in ['md5', None]: + def hash(string): + return hashlib.md5(string).hexdigest() + elif algorithm == 'sha': + def hash(string): + return hashlib.sha1(string).hexdigest() + else: + return None + + host_port = u"%s:%s" % (self.host, self.port) + + a1 = "%s:%s:%s" % (username, realm, password) + a2 = "CONNECT:%s" % host_port + ha1 = hash(a1) + ha2 = hash(a2) + + if qop == None: + response = hash(u"%s:%s:%s" % (ha1, nonce, ha2)) + elif qop == 'auth': + nc = '00000001' + cnonce = hash(urllib2.randombytes(8))[:8] + response = hash(u"%s:%s:%s:%s:%s:%s" % (ha1, nonce, nc, cnonce, qop, ha2)) + else: + return None + + response_fields = { + 'username': username, + 'realm': realm, + 'nonce': nonce, + 'response': response, + 'uri': host_port + } + if algorithm: + response_fields['algorithm'] = algorithm + if qop == 'auth': + response_fields['nc'] = nc + response_fields['cnonce'] = cnonce + response_fields['qop'] = qop + if opaque: + response_fields['opaque'] = opaque + + return ', '.join([u"%s=\"%s\"" % (field, response_fields[field]) for field in response_fields]) + + def connect(self): + """ + Adds debugging and SSL certification validation + """ + + if self.debuglevel == -1: + print '%s: Urllib2 HTTPS Debug General' % __name__ + print u" Connecting to %s on port %s" % (self.host, self.port) + + self.sock = socket.create_connection((self.host, self.port), self.timeout) + if self._tunnel_host: + self._tunnel() + + if self.debuglevel == -1: + print u"%s: Urllib2 HTTPS Debug General" % __name__ + print u" Connecting to %s on port %s" % (self.host, self.port) + print u" CA certs file at %s" % (self.ca_certs) + + self.sock = ssl.wrap_socket(self.sock, keyfile=self.key_file, + certfile=self.cert_file, cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs) + + if self.debuglevel == -1: + print u" Successfully upgraded connection to %s:%s with SSL" % ( + self.host, self.port) + + # This debugs and validates the SSL certificate + if self.cert_reqs & ssl.CERT_REQUIRED: + cert = self.sock.getpeercert() + + if self.debuglevel == -1: + subjectMap = { + 'organizationName': 'O', + 'commonName': 'CN', + 'organizationalUnitName': 'OU', + 'countryName': 'C', + 'serialNumber': 'serialNumber', + 'commonName': 'CN', + 'localityName': 'L', + 'stateOrProvinceName': 'S' + } + subject_list = list(cert['subject']) + subject_list.reverse() + subject_parts = [] + for pair in subject_list: + if pair[0][0] in subjectMap: + field_name = subjectMap[pair[0][0]] + else: + field_name = pair[0][0] + subject_parts.append(field_name + '=' + pair[0][1]) + + print u" Server SSL certificate:" + print u" subject: " + ','.join(subject_parts) + if 'subjectAltName' in cert: + print u" common name: " + cert['subjectAltName'][0][1] + if 'notAfter' in cert: + print u" expire date: " + cert['notAfter'] + + hostname = self.host.split(':', 0)[0] + + if not self.validate_cert_host(cert, hostname): + if self.debuglevel == -1: + print u" Certificate INVALID" + + raise InvalidCertificateException(hostname, cert, + 'hostname mismatch') + + if self.debuglevel == -1: + print u" Certificate validated for %s" % hostname + + if hasattr(urllib2, 'HTTPSHandler'): + class ValidatingHTTPSHandler(urllib2.HTTPSHandler): + """ + A urllib2 handler that validates SSL certificates for HTTPS requests + """ + + def __init__(self, **kwargs): + # This is a special value that will not trigger the standard debug + # functionality, but custom code where we can format the output + self._debuglevel = 0 + if 'debug' in kwargs and kwargs['debug']: + self._debuglevel = 5 + elif 'debuglevel' in kwargs: + self._debuglevel = kwargs['debuglevel'] + self._connection_args = kwargs + + def https_open(self, req): + def http_class_wrapper(host, **kwargs): + full_kwargs = dict(self._connection_args) + full_kwargs.update(kwargs) + return ValidatingHTTPSConnection(host, **full_kwargs) + + try: + return self.do_open(http_class_wrapper, req) + except urllib2.URLError, e: + if type(e.reason) == ssl.SSLError and e.reason.args[0] == 1: + raise InvalidCertificateException(req.host, '', + e.reason.args[1]) + raise + + https_request = urllib2.AbstractHTTPHandler.do_request_ + +except (ImportError): + pass + + +def preferences_filename(): + """:return: The appropriate settings filename based on the version of Sublime Text""" + + if int(sublime.version()) >= 2174: + return 'Preferences.sublime-settings' + return 'Global.sublime-settings' + + +class ThreadProgress(): + """ + Animates an indicator, [= ], in the status area while a thread runs + + :param thread: + The thread to track for activity + + :param message: + The message to display next to the activity indicator + + :param success_message: + The message to display once the thread is complete + """ + + def __init__(self, thread, message, success_message): + self.thread = thread + self.message = message + self.success_message = success_message + self.addend = 1 + self.size = 8 + sublime.set_timeout(lambda: self.run(0), 100) + + def run(self, i): + if not self.thread.is_alive(): + if hasattr(self.thread, 'result') and not self.thread.result: + sublime.status_message('') + return + sublime.status_message(self.success_message) + return + + before = i % self.size + after = (self.size - 1) - before + + sublime.status_message('%s [%s=%s]' % \ + (self.message, ' ' * before, ' ' * after)) + + if not after: + self.addend = -1 + if not before: + self.addend = 1 + i += self.addend + + sublime.set_timeout(lambda: self.run(i), 100) + + +class PlatformComparator(): + def get_best_platform(self, platforms): + ids = [sublime.platform() + '-' + sublime.arch(), sublime.platform(), + '*'] + + for id in ids: + if id in platforms: + return id + + return None + + +class ChannelProvider(PlatformComparator): + """ + Retrieves a channel and provides an API into the information + + The current channel/repository infrastructure caches repository info into + the channel to improve the Package Control client performance. This also + has the side effect of lessening the load on the GitHub and BitBucket APIs + and getting around not-infrequent HTTP 503 errors from those APIs. + + :param channel: + The URL of the channel + + :param package_manager: + An instance of :class:`PackageManager` used to download the file + """ + + def __init__(self, channel, package_manager): + self.channel_info = None + self.channel = channel + self.package_manager = package_manager + self.unavailable_packages = [] + + def match_url(self): + """Indicates if this provider can handle the provided channel""" + + return True + + def fetch_channel(self): + """Retrieves and loads the JSON for other methods to use""" + + if self.channel_info != None: + return + + channel_json = self.package_manager.download_url(self.channel, + 'Error downloading channel.') + if channel_json == False: + self.channel_info = False + return + + try: + channel_info = json.loads(channel_json) + except (ValueError): + print '%s: Error parsing JSON from channel %s.' % (__name__, + self.channel) + channel_info = False + + self.channel_info = channel_info + + def get_name_map(self): + """:return: A dict of the mapping for URL slug -> package name""" + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info.get('package_name_map', {}) + + def get_renamed_packages(self): + """:return: A dict of the packages that have been renamed""" + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info.get('renamed_packages', {}) + + def get_repositories(self): + """:return: A list of the repository URLs""" + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info['repositories'] + + def get_certs(self): + """ + Provides a secure way for distribution of SSL CA certificates + + Unfortunately Python does not include a bundle of CA certs with urllib2 + to perform SSL certificate validation. To circumvent this issue, + Package Control acts as a distributor of the CA certs for all HTTPS + URLs of package downloads. + + The default channel scrapes and caches info about all packages + periodically, and in the process it checks the CA certs for all of + the HTTPS URLs listed in the repositories. The contents of the CA cert + files are then hashed, and the CA cert is stored in a filename with + that hash. This is a fingerprint to ensure that Package Control has + the appropriate CA cert for a domain name. + + Next, the default channel file serves up a JSON object of the domain + names and the hashes of their current CA cert files. If Package Control + does not have the appropriate hash for a domain, it may retrieve it + from the channel server. To ensure that Package Control is talking to + a trusted authority to get the CA certs from, the CA cert for + sublime.wbond.net is bundled with Package Control. Then when downloading + the channel file, Package Control can ensure that the channel file's + SSL certificate is valid, thus ensuring the resulting CA certs are + legitimate. + + As a matter of optimization, the distribution of Package Control also + includes the current CA certs for all known HTTPS domains that are + included in the channel, as of the time when Package Control was + last released. + + :return: A dict of {'Domain Name': ['cert_file_hash', 'cert_file_download_url']} + """ + + self.fetch_channel() + if self.channel_info == False: + return False + return self.channel_info.get('certs', {}) + + def get_packages(self, repo): + """ + Provides access to the repository info that is cached in a channel + + :param repo: + The URL of the repository to get the cached info of + + :return: + A dict in the format: + { + 'Package Name': { + # Package details - see example-packages.json for format + }, + ... + } + or False if there is an error + """ + + self.fetch_channel() + if self.channel_info == False: + return False + if self.channel_info.get('packages', False) == False: + return False + if self.channel_info['packages'].get(repo, False) == False: + return False + + output = {} + for package in self.channel_info['packages'][repo]: + copy = package.copy() + + platforms = copy['platforms'].keys() + best_platform = self.get_best_platform(platforms) + + if not best_platform: + self.unavailable_packages.append(copy['name']) + continue + + copy['downloads'] = copy['platforms'][best_platform] + + del copy['platforms'] + + copy['url'] = copy['homepage'] + del copy['homepage'] + + output[copy['name']] = copy + + return output + + def get_unavailable_packages(self): + """ + Provides a list of packages that are unavailable for the current + platform/architecture that Sublime Text is running on. + + This list will be empty unless get_packages() is called first. + + :return: A list of package names + """ + + return self.unavailable_packages + + +# The providers (in order) to check when trying to download a channel +_channel_providers = [ChannelProvider] + + +class PackageProvider(PlatformComparator): + """ + Generic repository downloader that fetches package info + + With the current channel/repository architecture where the channel file + caches info from all includes repositories, these package providers just + serve the purpose of downloading packages not in the default channel. + + The structure of the JSON a repository should contain is located in + example-packages.json. + + :param repo: + The URL of the package repository + + :param package_manager: + An instance of :class:`PackageManager` used to download the file + """ + def __init__(self, repo, package_manager): + self.repo_info = None + self.repo = repo + self.package_manager = package_manager + self.unavailable_packages = [] + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + return True + + def fetch_repo(self): + """Retrieves and loads the JSON for other methods to use""" + + if self.repo_info != None: + return + + repository_json = self.package_manager.download_url(self.repo, + 'Error downloading repository.') + if repository_json == False: + self.repo_info = False + return + + try: + self.repo_info = json.loads(repository_json) + except (ValueError): + print '%s: Error parsing JSON from repository %s.' % (__name__, + self.repo) + self.repo_info = False + + def get_packages(self): + """ + Provides access to the repository info that is cached in a channel + + :return: + A dict in the format: + { + 'Package Name': { + # Package details - see example-packages.json for format + }, + ... + } + or False if there is an error + """ + + self.fetch_repo() + if self.repo_info == False: + return False + + output = {} + + for package in self.repo_info['packages']: + + platforms = package['platforms'].keys() + best_platform = self.get_best_platform(platforms) + + if not best_platform: + self.unavailable_packages.append(package['name']) + continue + + # Rewrites the legacy "zipball" URLs to the new "zip" format + downloads = package['platforms'][best_platform] + rewritten_downloads = [] + for download in downloads: + download['url'] = re.sub( + '^(https://nodeload.github.com/[^/]+/[^/]+/)zipball(/.*)$', + '\\1zip\\2', download['url']) + rewritten_downloads.append(download) + + info = { + 'name': package['name'], + 'description': package.get('description'), + 'url': package.get('homepage', self.repo), + 'author': package.get('author'), + 'last_modified': package.get('last_modified'), + 'downloads': rewritten_downloads + } + + output[package['name']] = info + + return output + + def get_renamed_packages(self): + """:return: A dict of the packages that have been renamed""" + + return self.repo_info.get('renamed_packages', {}) + + def get_unavailable_packages(self): + """ + Provides a list of packages that are unavailable for the current + platform/architecture that Sublime Text is running on. + + This list will be empty unless get_packages() is called first. + + :return: A list of package names + """ + + return self.unavailable_packages + + +class NonCachingProvider(): + """ + Base for package providers that do not need to cache the JSON + """ + + def fetch_json(self, url): + """ + Retrieves and parses the JSON from a URL + + :return: A dict or list from the JSON, or False on error + """ + + repository_json = self.package_manager.download_url(url, + 'Error downloading repository.') + if repository_json == False: + return False + try: + return json.loads(repository_json) + except (ValueError): + print '%s: Error parsing JSON from repository %s.' % (__name__, + url) + return False + + def get_unavailable_packages(self): + """ + Method for compatibility with PackageProvider class. These providers + are based on API calls, and thus do not support different platform + downloads, making it impossible for there to be unavailable packages. + + :return: An empty list + """ + + return [] + + +class GitHubPackageProvider(NonCachingProvider): + """ + Allows using a public GitHub repository as the source for a single package + + :param repo: + The public web URL to the GitHub repository. Should be in the format + `https://github.com/user/package` for the master branch, or + `https://github.com/user/package/tree/{branch_name}` for any other + branch. + + :param package_manager: + An instance of :class:`PackageManager` used to access the API + """ + + def __init__(self, repo, package_manager): + # Clean off the trailing .git to be more forgiving + self.repo = re.sub('\.git$', '', repo) + self.package_manager = package_manager + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + master = re.search('^https?://github.com/[^/]+/[^/]+/?$', self.repo) + branch = re.search('^https?://github.com/[^/]+/[^/]+/tree/[^/]+/?$', + self.repo) + return master != None or branch != None + + def get_packages(self): + """Uses the GitHub API to construct necessary info for a package""" + + branch = 'master' + branch_match = re.search( + '^https?://github.com/[^/]+/[^/]+/tree/([^/]+)/?$', self.repo) + if branch_match != None: + branch = branch_match.group(1) + + api_url = re.sub('^https?://github.com/([^/]+)/([^/]+)($|/.*$)', + 'https://api.github.com/repos/\\1/\\2', self.repo) + + repo_info = self.fetch_json(api_url) + if repo_info == False: + return False + + # In addition to hitting the main API endpoint for this repo, we + # also have to list the commits to get the timestamp of the last + # commit since we use that to generate a version number + commit_api_url = api_url + '/commits?' + \ + urllib.urlencode({'sha': branch, 'per_page': 1}) + + commit_info = self.fetch_json(commit_api_url) + if commit_info == False: + return False + + # We specifically use nodeload.github.com here because the download + # URLs all redirect there, and some of the downloaders don't follow + # HTTP redirect headers + download_url = 'https://nodeload.github.com/' + \ + repo_info['owner']['login'] + '/' + \ + repo_info['name'] + '/zip/' + urllib.quote(branch) + + commit_date = commit_info[0]['commit']['committer']['date'] + timestamp = datetime.datetime.strptime(commit_date[0:19], + '%Y-%m-%dT%H:%M:%S') + utc_timestamp = timestamp.strftime( + '%Y.%m.%d.%H.%M.%S') + + homepage = repo_info['homepage'] + if not homepage: + homepage = repo_info['html_url'] + + package = { + 'name': repo_info['name'], + 'description': repo_info['description'] if \ + repo_info['description'] else 'No description provided', + 'url': homepage, + 'author': repo_info['owner']['login'], + 'last_modified': timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'downloads': [ + { + 'version': utc_timestamp, + 'url': download_url + } + ] + } + return {package['name']: package} + + def get_renamed_packages(self): + """For API-compatibility with :class:`PackageProvider`""" + + return {} + + +class GitHubUserProvider(NonCachingProvider): + """ + Allows using a GitHub user/organization as the source for multiple packages + + :param repo: + The public web URL to the GitHub user/org. Should be in the format + `https://github.com/user`. + + :param package_manager: + An instance of :class:`PackageManager` used to access the API + """ + + def __init__(self, repo, package_manager): + self.repo = repo + self.package_manager = package_manager + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + return re.search('^https?://github.com/[^/]+/?$', self.repo) != None + + def get_packages(self): + """Uses the GitHub API to construct necessary info for all packages""" + + user_match = re.search('^https?://github.com/([^/]+)/?$', self.repo) + user = user_match.group(1) + + api_url = 'https://api.github.com/users/%s/repos?per_page=100' % user + + repo_info = self.fetch_json(api_url) + if repo_info == False: + return False + + packages = {} + for package_info in repo_info: + # All packages for the user are made available, and always from + # the master branch. Anything else requires a custom packages.json + commit_api_url = ('https://api.github.com/repos/%s/%s/commits' + \ + '?sha=master&per_page=1') % (user, package_info['name']) + + commit_info = self.fetch_json(commit_api_url) + if commit_info == False: + return False + + commit_date = commit_info[0]['commit']['committer']['date'] + timestamp = datetime.datetime.strptime(commit_date[0:19], + '%Y-%m-%dT%H:%M:%S') + utc_timestamp = timestamp.strftime( + '%Y.%m.%d.%H.%M.%S') + + homepage = package_info['homepage'] + if not homepage: + homepage = package_info['html_url'] + + package = { + 'name': package_info['name'], + 'description': package_info['description'] if \ + package_info['description'] else 'No description provided', + 'url': homepage, + 'author': package_info['owner']['login'], + 'last_modified': timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'downloads': [ + { + 'version': utc_timestamp, + # We specifically use nodeload.github.com here because + # the download URLs all redirect there, and some of the + # downloaders don't follow HTTP redirect headers + 'url': 'https://nodeload.github.com/' + \ + package_info['owner']['login'] + '/' + \ + package_info['name'] + '/zip/master' + } + ] + } + packages[package['name']] = package + return packages + + def get_renamed_packages(self): + """For API-compatibility with :class:`PackageProvider`""" + + return {} + + +class BitBucketPackageProvider(NonCachingProvider): + """ + Allows using a public BitBucket repository as the source for a single package + + :param repo: + The public web URL to the BitBucket repository. Should be in the format + `https://bitbucket.org/user/package`. + + :param package_manager: + An instance of :class:`PackageManager` used to access the API + """ + + def __init__(self, repo, package_manager): + self.repo = repo + self.package_manager = package_manager + + def match_url(self): + """Indicates if this provider can handle the provided repo""" + + return re.search('^https?://bitbucket.org', self.repo) != None + + def get_packages(self): + """Uses the BitBucket API to construct necessary info for a package""" + + api_url = re.sub('^https?://bitbucket.org/', + 'https://api.bitbucket.org/1.0/repositories/', self.repo) + api_url = api_url.rstrip('/') + + repo_info = self.fetch_json(api_url) + if repo_info == False: + return False + + # Since HG allows for arbitrary main branch names, we have to hit + # this URL just to get that info + main_branch_url = api_url + '/main-branch/' + main_branch_info = self.fetch_json(main_branch_url) + if main_branch_info == False: + return False + + # Grabbing the changesets is necessary because we construct the + # version number from the last commit timestamp + changeset_url = api_url + '/changesets/' + main_branch_info['name'] + last_commit = self.fetch_json(changeset_url) + if last_commit == False: + return False + + commit_date = last_commit['timestamp'] + timestamp = datetime.datetime.strptime(commit_date[0:19], + '%Y-%m-%d %H:%M:%S') + utc_timestamp = timestamp.strftime( + '%Y.%m.%d.%H.%M.%S') + + homepage = repo_info['website'] + if not homepage: + homepage = self.repo + package = { + 'name': repo_info['name'], + 'description': repo_info['description'] if \ + repo_info['description'] else 'No description provided', + 'url': homepage, + 'author': repo_info['owner'], + 'last_modified': timestamp.strftime('%Y-%m-%d %H:%M:%S'), + 'downloads': [ + { + 'version': utc_timestamp, + 'url': self.repo + '/get/' + \ + last_commit['node'] + '.zip' + } + ] + } + return {package['name']: package} + + def get_renamed_packages(self): + """For API-compatibility with :class:`PackageProvider`""" + + return {} + + +# The providers (in order) to check when trying to download repository info +_package_providers = [BitBucketPackageProvider, GitHubPackageProvider, + GitHubUserProvider, PackageProvider] + + +class BinaryNotFoundError(Exception): + """If a necessary executable is not found in the PATH on the system""" + + pass + + +class NonCleanExitError(Exception): + """ + When an subprocess does not exit cleanly + + :param returncode: + The command line integer return code of the subprocess + """ + + def __init__(self, returncode): + self.returncode = returncode + + def __str__(self): + return repr(self.returncode) + + +class NonHttpError(Exception): + """If a downloader had a non-clean exit, but it was not due to an HTTP error""" + + pass + + +class Downloader(): + """ + A base downloader that actually performs downloading URLs + + The SSL module is not included with the bundled Python for Linux + users of Sublime Text, so Linux machines will fall back to using curl + or wget for HTTPS URLs. + """ + + def check_certs(self, domain, timeout): + """ + Ensures that the SSL CA cert for a domain is present on the machine + + :param domain: + The domain to ensure there is a CA cert for + + :param timeout: + The int timeout for downloading the CA cert from the channel + + :return: + The CA cert bundle path on success, or False on error + """ + + cert_match = False + + certs_list = self.settings.get('certs', {}) + certs_dir = os.path.join(sublime.packages_path(), 'Package Control', + 'certs') + ca_bundle_path = os.path.join(certs_dir, 'ca-bundle.crt') + + cert_info = certs_list.get(domain) + if cert_info: + cert_match = self.locate_cert(certs_dir, cert_info[0], cert_info[1]) + + wildcard_info = certs_list.get('*') + if wildcard_info: + cert_match = self.locate_cert(certs_dir, wildcard_info[0], wildcard_info[1]) or cert_match + + if not cert_match: + print '%s: No CA certs available for %s.' % (__name__, domain) + return False + + return ca_bundle_path + + def locate_cert(self, certs_dir, cert_id, location): + """ + Makes sure the SSL cert specified has been added to the CA cert + bundle that is present on the machine + + :param certs_dir: + The path of the folder that contains the cert files + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param location: + An http(s) URL, or absolute filesystem path to the CA cert(s) + + :return: + If the cert specified (by cert_id) is present on the machine and + part of the ca-bundle.crt file in the certs_dir + """ + + cert_path = os.path.join(certs_dir, cert_id) + if not os.path.exists(cert_path): + if str(location) != '': + if re.match('^https?://', location): + contents = self.download_cert(cert_id, location) + else: + contents = self.load_cert(cert_id, location) + if contents: + self.save_cert(certs_dir, cert_id, contents) + return True + return False + return True + + def download_cert(self, cert_id, url): + """ + Downloads CA cert(s) from a URL + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param url: + An http(s) URL to the CA cert(s) + + :return: + The contents of the CA cert(s) + """ + + cert_downloader = self.__class__(self.settings) + return cert_downloader.download(url, + 'Error downloading CA certs for %s.' % (domain), timeout, 1) + + def load_cert(self, cert_id, path): + """ + Copies CA cert(s) from a file path + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param path: + The absolute filesystem path to a file containing the CA cert(s) + + :return: + The contents of the CA cert(s) + """ + + if os.path.exists(path): + with open(path, 'rb') as f: + return f.read() + + def save_cert(self, certs_dir, cert_id, contents): + """ + Saves CA cert(s) to the certs_dir (and ca-bundle.crt file) + + :param certs_dir: + The path of the folder that contains the cert files + + :param cert_id: + The identifier for CA cert(s). For those provided by the channel + system, this will be an md5 of the contents of the cert(s). For + user-provided certs, this is something they provide. + + :param contents: + The contents of the CA cert(s) + """ + + ca_bundle_path = os.path.join(certs_dir, 'ca-bundle.crt') + cert_path = os.path.join(certs_dir, cert_id) + with open(cert_path, 'wb') as f: + f.write(contents) + with open(ca_bundle_path, 'ab') as f: + f.write("\n" + contents) + + def decode_response(self, encoding, response): + if encoding == 'gzip': + return gzip.GzipFile(fileobj=StringIO.StringIO(response)).read() + elif encoding == 'deflate': + decompresser = zlib.decompressobj(-zlib.MAX_WBITS) + return decompresser.decompress(response) + decompresser.flush() + return response + + +class CliDownloader(Downloader): + """ + Base for downloaders that use a command line program + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + + def clean_tmp_file(self): + if os.path.exists(self.tmp_file): + os.remove(self.tmp_file) + + def find_binary(self, name): + """ + Finds the given executable name in the system PATH + + :param name: + The exact name of the executable to find + + :return: + The absolute path to the executable + + :raises: + BinaryNotFoundError when the executable can not be found + """ + + for dir in os.environ['PATH'].split(os.pathsep): + path = os.path.join(dir, name) + if os.path.exists(path): + return path + + raise BinaryNotFoundError('The binary %s could not be located' % name) + + def execute(self, args): + """ + Runs the executable and args and returns the result + + :param args: + A list of the executable path and all arguments to be passed to it + + :return: + The text output of the executable + + :raises: + NonCleanExitError when the executable exits with an error + """ + + if self.settings.get('debug'): + print u"%s: Trying to execute command %s" % ( + __name__, create_cmd(args)) + + proc = subprocess.Popen(args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + output = proc.stdout.read() + self.stderr = proc.stderr.read() + returncode = proc.wait() + if returncode != 0: + error = NonCleanExitError(returncode) + error.stderr = self.stderr + error.stdout = output + raise error + return output + + +class UrlLib2Downloader(Downloader): + """ + A downloader that uses the Python urllib2 module + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + + def download(self, url, error_message, timeout, tries): + """ + Downloads a URL and returns the contents + + Uses the proxy settings from the Package Control.sublime-settings file, + however there seem to be a decent number of proxies that this code + does not work with. Patches welcome! + + :param url: + The URL to download + + :param error_message: + A string to include in the console error that is printed + when an error occurs + + :param timeout: + The int number of seconds to set the timeout to + + :param tries: + The int number of times to try and download the URL in the case of + a timeout or HTTP 503 error + + :return: + The string contents of the URL, or False on error + """ + + http_proxy = self.settings.get('http_proxy') + https_proxy = self.settings.get('https_proxy') + if http_proxy or https_proxy: + proxies = {} + if http_proxy: + proxies['http'] = http_proxy + if https_proxy: + proxies['https'] = https_proxy + proxy_handler = urllib2.ProxyHandler(proxies) + else: + proxy_handler = urllib2.ProxyHandler() + + password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm() + proxy_username = self.settings.get('proxy_username') + proxy_password = self.settings.get('proxy_password') + if proxy_username and proxy_password: + if http_proxy: + password_manager.add_password(None, http_proxy, proxy_username, + proxy_password) + if https_proxy: + password_manager.add_password(None, https_proxy, proxy_username, + proxy_password) + + handlers = [proxy_handler] + if os.name == 'nt': + ntlm_auth_handler = ProxyNtlmAuthHandler(password_manager) + handlers.append(ntlm_auth_handler) + + basic_auth_handler = urllib2.ProxyBasicAuthHandler(password_manager) + digest_auth_handler = urllib2.ProxyDigestAuthHandler(password_manager) + handlers.extend([digest_auth_handler, basic_auth_handler]) + + debug = self.settings.get('debug') + + if debug: + print u"%s: Urllib2 Debug Proxy" % __name__ + print u" http_proxy: %s" % http_proxy + print u" https_proxy: %s" % https_proxy + print u" proxy_username: %s" % proxy_username + print u" proxy_password: %s" % proxy_password + + secure_url_match = re.match('^https://([^/]+)', url) + if secure_url_match != None: + secure_domain = secure_url_match.group(1) + bundle_path = self.check_certs(secure_domain, timeout) + if not bundle_path: + return False + bundle_path = bundle_path.encode(sys.getfilesystemencoding()) + handlers.append(ValidatingHTTPSHandler(ca_certs=bundle_path, + debug=debug, passwd=password_manager, + user_agent=self.settings.get('user_agent'))) + else: + handlers.append(DebuggableHTTPHandler(debug=debug, + passwd=password_manager)) + urllib2.install_opener(urllib2.build_opener(*handlers)) + + while tries > 0: + tries -= 1 + try: + request = urllib2.Request(url, headers={ + "User-Agent": self.settings.get('user_agent'), + # Don't be alarmed if the response from the server does not + # select one of these since the server runs a relatively new + # version of OpenSSL which supports compression on the SSL + # layer, and Apache will use that instead of HTTP-level + # encoding. + "Accept-Encoding": "gzip,deflate"}) + http_file = urllib2.urlopen(request, timeout=timeout) + self.handle_rate_limit(http_file, url) + result = http_file.read() + encoding = http_file.headers.get('Content-Encoding') + return self.decode_response(encoding, result) + + except (httplib.HTTPException) as (e): + print '%s: %s HTTP exception %s (%s) downloading %s.' % ( + __name__, error_message, e.__class__.__name__, + unicode_from_os(e), url) + + except (urllib2.HTTPError) as (e): + # Make sure we obey Github's rate limiting headers + self.handle_rate_limit(e, url) + + # Bitbucket and Github return 503 a decent amount + if unicode_from_os(e.code) == '503': + print ('%s: Downloading %s was rate limited, ' + + 'trying again') % (__name__, url) + continue + print '%s: %s HTTP error %s downloading %s.' % (__name__, + error_message, unicode_from_os(e.code), url) + + except (urllib2.URLError) as (e): + + # Bitbucket and Github timeout a decent amount + if unicode_from_os(e.reason) == 'The read operation timed out' \ + or unicode_from_os(e.reason) == 'timed out': + print (u'%s: Downloading %s timed out, trying ' + + u'again') % (__name__, url) + continue + print u'%s: %s URL error %s downloading %s.' % (__name__, + error_message, unicode_from_os(e.reason), url) + break + return False + + def handle_rate_limit(self, response, url): + """ + Checks the headers of a respone object to make sure we are obeying the + rate limit + + :param response: + The response object that has a headers dict + + :param url: + The URL that was requested + + :raises: + RateLimitException when the rate limit has been hit + """ + + limit_remaining = response.headers.get('X-RateLimit-Remaining', 1) + if str(limit_remaining) == '0': + hostname = urlparse.urlparse(url).hostname + limit = response.headers.get('X-RateLimit-Limit', 1) + raise RateLimitException(hostname, limit) + + +class WgetDownloader(CliDownloader): + """ + A downloader that uses the command line program wget + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + self.debug = settings.get('debug') + self.wget = self.find_binary('wget') + + def download(self, url, error_message, timeout, tries): + """ + Downloads a URL and returns the contents + + :param url: + The URL to download + + :param error_message: + A string to include in the console error that is printed + when an error occurs + + :param timeout: + The int number of seconds to set the timeout to + + :param tries: + The int number of times to try and download the URL in the case of + a timeout or HTTP 503 error + + :return: + The string contents of the URL, or False on error + """ + + if not self.wget: + return False + + self.tmp_file = tempfile.NamedTemporaryFile().name + command = [self.wget, '--connect-timeout=' + str(int(timeout)), '-o', + self.tmp_file, '-O', '-', '-U', + self.settings.get('user_agent'), '--header', + # Don't be alarmed if the response from the server does not select + # one of these since the server runs a relatively new version of + # OpenSSL which supports compression on the SSL layer, and Apache + # will use that instead of HTTP-level encoding. + 'Accept-Encoding: gzip,deflate'] + + secure_url_match = re.match('^https://([^/]+)', url) + if secure_url_match != None: + secure_domain = secure_url_match.group(1) + bundle_path = self.check_certs(secure_domain, timeout) + if not bundle_path: + return False + command.append(u'--ca-certificate=' + bundle_path) + + if self.debug: + command.append('-d') + else: + command.append('-S') + + http_proxy = self.settings.get('http_proxy') + https_proxy = self.settings.get('https_proxy') + proxy_username = self.settings.get('proxy_username') + proxy_password = self.settings.get('proxy_password') + + if proxy_username: + command.append(u"--proxy-user=%s" % proxy_username) + if proxy_password: + command.append(u"--proxy-password=%s" % proxy_password) + + if self.debug: + print u"%s: Wget Debug Proxy" % __name__ + print u" http_proxy: %s" % http_proxy + print u" https_proxy: %s" % https_proxy + print u" proxy_username: %s" % proxy_username + print u" proxy_password: %s" % proxy_password + + command.append(url) + + if http_proxy: + os.putenv('http_proxy', http_proxy) + if https_proxy: + os.putenv('https_proxy', https_proxy) + + while tries > 0: + tries -= 1 + try: + result = self.execute(command) + + general, headers = self.parse_output() + encoding = headers.get('content-encoding') + if encoding: + result = self.decode_response(encoding, result) + + return result + + except (NonCleanExitError) as (e): + + try: + general, headers = self.parse_output() + self.handle_rate_limit(headers, url) + + if general['status'] == '503': + # GitHub and BitBucket seem to rate limit via 503 + print ('%s: Downloading %s was rate limited' + + ', trying again') % (__name__, url) + continue + + error_string = 'HTTP error %s %s' % (general['status'], + general['message']) + + except (NonHttpError) as (e): + + error_string = unicode_from_os(e) + + # GitHub and BitBucket seem to time out a lot + if error_string.find('timed out') != -1: + print ('%s: Downloading %s timed out, ' + + 'trying again') % (__name__, url) + continue + + print (u'%s: %s %s downloading %s.' % (__name__, error_message, + error_string, url)).encode('UTF-8') + + break + return False + + def parse_output(self): + with open(self.tmp_file, 'r') as f: + output = f.read().splitlines() + self.clean_tmp_file() + + error = None + header_lines = [] + if self.debug: + section = 'General' + last_section = None + for line in output: + if section == 'General': + if self.skippable_line(line): + continue + + # Skip blank lines + if line.strip() == '': + continue + + # Error lines + if line[0:5] == 'wget:': + error = line[5:].strip() + if line[0:7] == 'failed:': + error = line[7:].strip() + + if line == '---request begin---': + section = 'Write' + continue + elif line == '---request end---': + section = 'General' + continue + elif line == '---response begin---': + section = 'Read' + continue + elif line == '---response end---': + section = 'General' + continue + + if section != last_section: + print "%s: Wget HTTP Debug %s" % (__name__, section) + + if section == 'Read': + header_lines.append(line) + + print ' ' + line + last_section = section + + else: + for line in output: + if self.skippable_line(line): + continue + + # Check the resolving and connecting to lines for errors + if re.match('(Resolving |Connecting to )', line): + failed_match = re.search(' failed: (.*)$', line) + if failed_match: + error = failed_match.group(1).strip() + + # Error lines + if line[0:5] == 'wget:': + error = line[5:].strip() + if line[0:7] == 'failed:': + error = line[7:].strip() + + if line[0:2] == ' ': + header_lines.append(line.lstrip()) + + if error: + raise NonHttpError(error) + + return self.parse_headers(header_lines) + + def skippable_line(self, line): + # Skip date lines + if re.match('--\d{4}-\d{2}-\d{2}', line): + return True + if re.match('\d{4}-\d{2}-\d{2}', line): + return True + # Skip HTTP status code lines since we already have that info + if re.match('\d{3} ', line): + return True + # Skip Saving to and progress lines + if re.match('(Saving to:|\s*\d+K)', line): + return True + # Skip notice about ignoring body on HTTP error + if re.match('Skipping \d+ byte', line): + return True + + def parse_headers(self, output=None): + if not output: + with open(self.tmp_file, 'r') as f: + output = f.read().splitlines() + self.clean_tmp_file() + + general = { + 'version': '0.9', + 'status': '200', + 'message': 'OK' + } + headers = {} + for line in output: + # When using the -S option, headers have two spaces before them, + # additionally, valid headers won't have spaces, so this is always + # a safe operation to perform + line = line.lstrip() + if line.find('HTTP/') == 0: + match = re.match('HTTP/(\d\.\d)\s+(\d+)\s+(.*)$', line) + general['version'] = match.group(1) + general['status'] = match.group(2) + general['message'] = match.group(3) + else: + name, value = line.split(':', 1) + headers[name.lower()] = value.strip() + + return (general, headers) + + def handle_rate_limit(self, headers, url): + limit_remaining = headers.get('x-ratelimit-remaining', '1') + limit = headers.get('x-ratelimit-limit', '1') + + if str(limit_remaining) == '0': + hostname = urlparse.urlparse(url).hostname + raise RateLimitException(hostname, limit) + + +class CurlDownloader(CliDownloader): + """ + A downloader that uses the command line program curl + + :param settings: + A dict of the various Package Control settings. The Sublime Text + Settings API is not used because this code is run in a thread. + """ + + def __init__(self, settings): + self.settings = settings + self.curl = self.find_binary('curl') + + def download(self, url, error_message, timeout, tries): + """ + Downloads a URL and returns the contents + + :param url: + The URL to download + + :param error_message: + A string to include in the console error that is printed + when an error occurs + + :param timeout: + The int number of seconds to set the timeout to + + :param tries: + The int number of times to try and download the URL in the case of + a timeout or HTTP 503 error + + :return: + The string contents of the URL, or False on error + """ + + if not self.curl: + return False + + self.tmp_file = tempfile.NamedTemporaryFile().name + command = [self.curl, '--user-agent', self.settings.get('user_agent'), + '--connect-timeout', str(int(timeout)), '-sSL', + # Don't be alarmed if the response from the server does not select + # one of these since the server runs a relatively new version of + # OpenSSL which supports compression on the SSL layer, and Apache + # will use that instead of HTTP-level encoding. + '--compressed', + # We have to capture the headers to check for rate limit info + '--dump-header', self.tmp_file] + + secure_url_match = re.match('^https://([^/]+)', url) + if secure_url_match != None: + secure_domain = secure_url_match.group(1) + bundle_path = self.check_certs(secure_domain, timeout) + if not bundle_path: + return False + command.extend(['--cacert', bundle_path]) + + debug = self.settings.get('debug') + if debug: + command.append('-v') + + http_proxy = self.settings.get('http_proxy') + https_proxy = self.settings.get('https_proxy') + proxy_username = self.settings.get('proxy_username') + proxy_password = self.settings.get('proxy_password') + + if debug: + print u"%s: Curl Debug Proxy" % __name__ + print u" http_proxy: %s" % http_proxy + print u" https_proxy: %s" % https_proxy + print u" proxy_username: %s" % proxy_username + print u" proxy_password: %s" % proxy_password + + if http_proxy or https_proxy: + command.append('--proxy-anyauth') + + if proxy_username or proxy_password: + command.extend(['-U', u"%s:%s" % (proxy_username, proxy_password)]) + + if http_proxy: + os.putenv('http_proxy', http_proxy) + if https_proxy: + os.putenv('HTTPS_PROXY', https_proxy) + + command.append(url) + + while tries > 0: + tries -= 1 + try: + output = self.execute(command) + + with open(self.tmp_file, 'r') as f: + headers = f.read() + self.clean_tmp_file() + + limit = 1 + limit_remaining = 1 + status = '200 OK' + for header in headers.splitlines(): + if header[0:5] == 'HTTP/': + status = re.sub('^HTTP/\d\.\d\s+', '', header) + if header.lower()[0:22] == 'x-ratelimit-remaining:': + limit_remaining = header.lower()[22:].strip() + if header.lower()[0:18] == 'x-ratelimit-limit:': + limit = header.lower()[18:].strip() + + if debug: + self.print_debug(self.stderr) + + if str(limit_remaining) == '0': + hostname = urlparse.urlparse(url).hostname + raise RateLimitException(hostname, limit) + + if status != '200 OK': + e = NonCleanExitError(22) + e.stderr = status + raise e + + return output + + except (NonCleanExitError) as (e): + # Stderr is used for both the error message and the debug info + # so we need to process it to extra the debug info + if self.settings.get('debug'): + e.stderr = self.print_debug(e.stderr) + + self.clean_tmp_file() + + if e.returncode == 22: + code = re.sub('^.*?(\d+)([\w\s]+)?$', '\\1', e.stderr) + if code == '503': + # GitHub and BitBucket seem to rate limit via 503 + print ('%s: Downloading %s was rate limited' + + ', trying again') % (__name__, url) + continue + error_string = 'HTTP error ' + code + elif e.returncode == 6: + error_string = 'URL error host not found' + elif e.returncode == 28: + # GitHub and BitBucket seem to time out a lot + print ('%s: Downloading %s timed out, trying ' + + 'again') % (__name__, url) + continue + else: + error_string = e.stderr.rstrip() + + print '%s: %s %s downloading %s.' % (__name__, error_message, + error_string, url) + break + + return False + + def print_debug(self, string): + section = 'General' + last_section = None + + output = '' + + for line in string.splitlines(): + # Placeholder for body of request + if line and line[0:2] == '{ ': + continue + + if len(line) > 1: + subtract = 0 + if line[0:2] == '* ': + section = 'General' + subtract = 2 + elif line[0:2] == '> ': + section = 'Write' + subtract = 2 + elif line[0:2] == '< ': + section = 'Read' + subtract = 2 + line = line[subtract:] + + # If the line does not start with "* ", "< ", "> " or " " + # then it is a real stderr message + if subtract == 0 and line[0:2] != ' ': + output += line + continue + + if line.strip() == '': + continue + + if section != last_section: + print "%s: Curl HTTP Debug %s" % (__name__, section) + + print ' ' + line + last_section = section + + return output + + +# A cache of channel and repository info to allow users to install multiple +# packages without having to wait for the metadata to be downloaded more +# than once. The keys are managed locally by the utilizing code. +_channel_repository_cache = {} + + +class RepositoryDownloader(threading.Thread): + """ + Downloads information about a repository in the background + + :param package_manager: + An instance of :class:`PackageManager` used to download files + + :param name_map: + The dict of name mapping for URL slug -> package name + + :param repo: + The URL of the repository to download info about + """ + + def __init__(self, package_manager, name_map, repo): + self.package_manager = package_manager + self.repo = repo + self.packages = {} + self.name_map = name_map + threading.Thread.__init__(self) + + def run(self): + for provider_class in _package_providers: + provider = provider_class(self.repo, self.package_manager) + if provider.match_url(): + break + packages = provider.get_packages() + if packages == False: + self.packages = False + return + + mapped_packages = {} + for package in packages.keys(): + mapped_package = self.name_map.get(package, package) + mapped_packages[mapped_package] = packages[package] + mapped_packages[mapped_package]['name'] = mapped_package + packages = mapped_packages + + self.packages = packages + self.renamed_packages = provider.get_renamed_packages() + self.unavailable_packages = provider.get_unavailable_packages() + + +class VcsUpgrader(): + """ + Base class for updating packages that are a version control repository on local disk + + :param vcs_binary: + The full filesystem path to the executable for the version control + system. May be set to None to allow the code to try and find it. + + :param update_command: + The command to pass to the version control executable to update the + repository. + + :param working_copy: + The local path to the working copy/package directory + + :param cache_length: + The lenth of time to cache if incoming changesets are available + """ + + def __init__(self, vcs_binary, update_command, working_copy, cache_length, debug): + self.binary = vcs_binary + self.update_command = update_command + self.working_copy = working_copy + self.cache_length = cache_length + self.debug = debug + + def execute(self, args, dir): + """ + Creates a subprocess with the executable/args + + :param args: + A list of the executable path and all arguments to it + + :param dir: + The directory in which to run the executable + + :return: A string of the executable output + """ + + startupinfo = None + if os.name == 'nt': + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + + if self.debug: + print u"%s: Trying to execute command %s" % ( + __name__, create_cmd(args)) + proc = subprocess.Popen(args, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + startupinfo=startupinfo, cwd=dir) + + return proc.stdout.read().replace('\r\n', '\n').rstrip(' \n\r') + + def find_binary(self, name): + """ + Locates the executable by looking in the PATH and well-known directories + + :param name: + The string filename of the executable + + :return: The filesystem path to the executable, or None if not found + """ + + if self.binary: + if self.debug: + print u"%s: Using \"%s_binary\" from settings \"%s\"" % ( + __name__, self.vcs_type, self.binary) + return self.binary + + # Try the path first + for dir in os.environ['PATH'].split(os.pathsep): + path = os.path.join(dir, name) + if os.path.exists(path): + if self.debug: + print u"%s: Found %s at \"%s\"" % (__name__, self.vcs_type, + path) + return path + + # This is left in for backwards compatibility and for windows + # users who may have the binary, albeit in a common dir that may + # not be part of the PATH + if os.name == 'nt': + dirs = ['C:\\Program Files\\Git\\bin', + 'C:\\Program Files (x86)\\Git\\bin', + 'C:\\Program Files\\TortoiseGit\\bin', + 'C:\\Program Files\\Mercurial', + 'C:\\Program Files (x86)\\Mercurial', + 'C:\\Program Files (x86)\\TortoiseHg', + 'C:\\Program Files\\TortoiseHg', + 'C:\\cygwin\\bin'] + else: + dirs = ['/usr/local/git/bin'] + + for dir in dirs: + path = os.path.join(dir, name) + if os.path.exists(path): + if self.debug: + print u"%s: Found %s at \"%s\"" % (__name__, self.vcs_type, + path) + return path + + if self.debug: + print u"%s: Could not find %s on your machine" % (__name__, + self.vcs_type) + return None + + +class GitUpgrader(VcsUpgrader): + """ + Allows upgrading a local git-repository-based package + """ + + vcs_type = 'git' + + def retrieve_binary(self): + """ + Returns the path to the git executable + + :return: The string path to the executable or False on error + """ + + name = 'git' + if os.name == 'nt': + name += '.exe' + binary = self.find_binary(name) + if binary and os.path.isdir(binary): + full_path = os.path.join(binary, name) + if os.path.exists(full_path): + binary = full_path + if not binary: + sublime.error_message(('%s: Unable to find %s. ' + + 'Please set the git_binary setting by accessing the ' + + 'Preferences > Package Settings > %s > ' + + u'Settings – User menu entry. The Settings – Default entry ' + + 'can be used for reference, but changes to that will be ' + + 'overwritten upon next upgrade.') % (__name__, name, __name__)) + return False + + if os.name == 'nt': + tortoise_plink = self.find_binary('TortoisePlink.exe') + if tortoise_plink: + os.environ.setdefault('GIT_SSH', tortoise_plink) + return binary + + def run(self): + """ + Updates the repository with remote changes + + :return: False or error, or True on success + """ + + binary = self.retrieve_binary() + if not binary: + return False + args = [binary] + args.extend(self.update_command) + self.execute(args, self.working_copy) + return True + + def incoming(self): + """:return: bool if remote revisions are available""" + + cache_key = self.working_copy + '.incoming' + working_copy_cache = _channel_repository_cache.get(cache_key) + if working_copy_cache and working_copy_cache.get('time') > \ + time.time(): + return working_copy_cache.get('data') + + binary = self.retrieve_binary() + if not binary: + return False + self.execute([binary, 'fetch'], self.working_copy) + args = [binary, 'log'] + args.append('..' + '/'.join(self.update_command[-2:])) + output = self.execute(args, self.working_copy) + incoming = len(output) > 0 + + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.cache_length, + 'data': incoming + } + return incoming + + +class HgUpgrader(VcsUpgrader): + """ + Allows upgrading a local mercurial-repository-based package + """ + + vcs_type = 'hg' + + def retrieve_binary(self): + """ + Returns the path to the hg executable + + :return: The string path to the executable or False on error + """ + + name = 'hg' + if os.name == 'nt': + name += '.exe' + binary = self.find_binary(name) + if binary and os.path.isdir(binary): + full_path = os.path.join(binary, name) + if os.path.exists(full_path): + binary = full_path + if not binary: + sublime.error_message(('%s: Unable to find %s. ' + + 'Please set the hg_binary setting by accessing the ' + + 'Preferences > Package Settings > %s > ' + + u'Settings – User menu entry. The Settings – Default entry ' + + 'can be used for reference, but changes to that will be ' + + 'overwritten upon next upgrade.') % (__name__, name, __name__)) + return False + return binary + + def run(self): + """ + Updates the repository with remote changes + + :return: False or error, or True on success + """ + + binary = self.retrieve_binary() + if not binary: + return False + args = [binary] + args.extend(self.update_command) + self.execute(args, self.working_copy) + return True + + def incoming(self): + """:return: bool if remote revisions are available""" + + cache_key = self.working_copy + '.incoming' + working_copy_cache = _channel_repository_cache.get(cache_key) + if working_copy_cache and working_copy_cache.get('time') > \ + time.time(): + return working_copy_cache.get('data') + + binary = self.retrieve_binary() + if not binary: + return False + args = [binary, 'in', '-q'] + args.append(self.update_command[-1]) + output = self.execute(args, self.working_copy) + incoming = len(output) > 0 + + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.cache_length, + 'data': incoming + } + return incoming + + +def clear_directory(directory, ignore_paths=None): + was_exception = False + for root, dirs, files in os.walk(directory, topdown=False): + paths = [os.path.join(root, f) for f in files] + paths.extend([os.path.join(root, d) for d in dirs]) + + for path in paths: + try: + # Don't delete the metadata file, that way we have it + # when the reinstall happens, and the appropriate + # usage info can be sent back to the server + if ignore_paths and path in ignore_paths: + continue + if os.path.isdir(path): + os.rmdir(path) + else: + os.remove(path) + except (OSError, IOError) as (e): + was_exception = True + + return not was_exception + + + +class PackageManager(): + """ + Allows downloading, creating, installing, upgrading, and deleting packages + + Delegates metadata retrieval to the _channel_providers and + _package_providers classes. Uses VcsUpgrader-based classes for handling + git and hg repositories in the Packages folder. Downloader classes are + utilized to fetch contents of URLs. + + Also handles displaying package messaging, and sending usage information to + the usage server. + """ + + def __init__(self): + # Here we manually copy the settings since sublime doesn't like + # code accessing settings from threads + self.settings = {} + settings = sublime.load_settings(__name__ + '.sublime-settings') + for setting in ['timeout', 'repositories', 'repository_channels', + 'package_name_map', 'dirs_to_ignore', 'files_to_ignore', + 'package_destination', 'cache_length', 'auto_upgrade', + 'files_to_ignore_binary', 'files_to_keep', 'dirs_to_keep', + 'git_binary', 'git_update_command', 'hg_binary', + 'hg_update_command', 'http_proxy', 'https_proxy', + 'auto_upgrade_ignore', 'auto_upgrade_frequency', + 'submit_usage', 'submit_url', 'renamed_packages', + 'files_to_include', 'files_to_include_binary', 'certs', + 'ignore_vcs_packages', 'proxy_username', 'proxy_password', + 'debug', 'user_agent']: + if settings.get(setting) == None: + continue + self.settings[setting] = settings.get(setting) + + # https_proxy will inherit from http_proxy unless it is set to a + # string value or false + no_https_proxy = self.settings.get('https_proxy') in ["", None] + if no_https_proxy and self.settings.get('http_proxy'): + self.settings['https_proxy'] = self.settings.get('http_proxy') + if self.settings['https_proxy'] == False: + self.settings['https_proxy'] = '' + + self.settings['platform'] = sublime.platform() + self.settings['version'] = sublime.version() + + def compare_versions(self, version1, version2): + """ + Compares to version strings to see which is greater + + Date-based version numbers (used by GitHub and BitBucket providers) + are automatically pre-pended with a 0 so they are always less than + version 1.0. + + :return: + -1 if version1 is less than version2 + 0 if they are equal + 1 if version1 is greater than version2 + """ + + def date_compat(v): + # We prepend 0 to all date-based version numbers so that developers + # may switch to explicit versioning from GitHub/BitBucket + # versioning based on commit dates + date_match = re.match('(\d{4})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})\.(\d{2})$', v) + if date_match: + v = '0.%s.%s.%s.%s.%s.%s' % date_match.groups() + return v + + def semver_compat(v): + # When translating dates into semver, the way to get each date + # segment into the version is to treat the year and month as + # minor and patch, and then the rest as a numeric build version + # with four different parts. The result looks like: + # 0.2012.11+10.31.23.59 + date_match = re.match('(\d{4}(?:\.\d{2}){2})\.(\d{2}(?:\.\d{2}){3})$', v) + if date_match: + v = '%s+%s' % (date_match.group(1), date_match.group(2)) + + # Semver must have major, minor, patch + elif re.match('^\d+$', v): + v += '.0.0' + elif re.match('^\d+\.\d+$', v): + v += '.0' + return v + + def cmp_compat(v): + return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")] + + version1 = date_compat(version1) + version2 = date_compat(version2) + try: + return semver.compare(semver_compat(version1), semver_compat(version2)) + except (ValueError): + return cmp(cmp_compat(version1), cmp_compat(version2)) + + def download_url(self, url, error_message): + """ + Downloads a URL and returns the contents + + :param url: + The string URL to download + + :param error_message: + The error message to include if the download fails + + :return: + The string contents of the URL, or False on error + """ + + has_ssl = 'ssl' in sys.modules and hasattr(urllib2, 'HTTPSHandler') + is_ssl = re.search('^https://', url) != None + downloader = None + + if (is_ssl and has_ssl) or not is_ssl: + downloader = UrlLib2Downloader(self.settings) + else: + for downloader_class in [CurlDownloader, WgetDownloader]: + try: + downloader = downloader_class(self.settings) + break + except (BinaryNotFoundError): + pass + + if not downloader: + sublime.error_message(('%s: Unable to download %s due to no ' + + 'ssl module available and no capable program found. Please ' + + 'install curl or wget.') % (__name__, url)) + return False + + url = url.replace(' ', '%20') + hostname = urlparse.urlparse(url).hostname.lower() + timeout = self.settings.get('timeout', 3) + + rate_limited_cache = _channel_repository_cache.get('rate_limited_domains', {}) + if rate_limited_cache.get('time') and rate_limited_cache.get('time') > time.time(): + rate_limited_domains = rate_limited_cache.get('data', []) + else: + rate_limited_domains = [] + + if self.settings.get('debug'): + try: + ip = socket.gethostbyname(hostname) + except (socket.gaierror) as (e): + ip = unicode_from_os(e) + + print u"%s: Download Debug" % __name__ + print u" URL: %s" % url + print u" Resolved IP: %s" % ip + print u" Timeout: %s" % str(timeout) + + if hostname in rate_limited_domains: + if self.settings.get('debug'): + print u" Skipping due to hitting rate limit for %s" % hostname + return False + + try: + return downloader.download(url, error_message, timeout, 3) + except (RateLimitException) as (e): + + rate_limited_domains.append(hostname) + _channel_repository_cache['rate_limited_domains'] = { + 'data': rate_limited_domains, + 'time': time.time() + self.settings.get('cache_length', + 300) + } + + print ('%s: Hit rate limit of %s for %s, skipping all futher ' + + 'download requests for this domain') % (__name__, + e.limit, e.host) + return False + + def get_metadata(self, package): + """ + Returns the package metadata for an installed package + + :return: + A dict with the keys: + version + url + description + or an empty dict on error + """ + + metadata_filename = os.path.join(self.get_package_dir(package), + 'package-metadata.json') + if os.path.exists(metadata_filename): + with open(metadata_filename) as f: + try: + return json.load(f) + except (ValueError): + return {} + return {} + + def list_repositories(self): + """ + Returns a master list of all repositories pulled from all sources + + These repositories come from the channels specified in the + "repository_channels" setting, plus any repositories listed in the + "repositories" setting. + + :return: + A list of all available repositories + """ + + repositories = self.settings.get('repositories') + repository_channels = self.settings.get('repository_channels') + for channel in repository_channels: + channel = channel.strip() + + channel_repositories = None + + # Caches various info from channels for performance + cache_key = channel + '.repositories' + repositories_cache = _channel_repository_cache.get(cache_key) + if repositories_cache and repositories_cache.get('time') > \ + time.time(): + channel_repositories = repositories_cache.get('data') + + name_map_cache_key = channel + '.package_name_map' + name_map_cache = _channel_repository_cache.get( + name_map_cache_key) + if name_map_cache and name_map_cache.get('time') > \ + time.time(): + name_map = name_map_cache.get('data') + name_map.update(self.settings.get('package_name_map', {})) + self.settings['package_name_map'] = name_map + + renamed_cache_key = channel + '.renamed_packages' + renamed_cache = _channel_repository_cache.get( + renamed_cache_key) + if renamed_cache and renamed_cache.get('time') > \ + time.time(): + renamed_packages = renamed_cache.get('data') + renamed_packages.update(self.settings.get('renamed_packages', + {})) + self.settings['renamed_packages'] = renamed_packages + + unavailable_cache_key = channel + '.unavailable_packages' + unavailable_cache = _channel_repository_cache.get( + unavailable_cache_key) + if unavailable_cache and unavailable_cache.get('time') > \ + time.time(): + unavailable_packages = unavailable_cache.get('data') + unavailable_packages.extend(self.settings.get('unavailable_packages', + [])) + self.settings['unavailable_packages'] = unavailable_packages + + certs_cache_key = channel + '.certs' + certs_cache = _channel_repository_cache.get(certs_cache_key) + if certs_cache and certs_cache.get('time') > time.time(): + certs = self.settings.get('certs', {}) + certs.update(certs_cache.get('data')) + self.settings['certs'] = certs + + # If any of the info was not retrieved from the cache, we need to + # grab the channel to get it + if channel_repositories == None or \ + self.settings.get('package_name_map') == None or \ + self.settings.get('renamed_packages') == None: + + for provider_class in _channel_providers: + provider = provider_class(channel, self) + if provider.match_url(): + break + + channel_repositories = provider.get_repositories() + + if channel_repositories == False: + continue + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': channel_repositories + } + + for repo in channel_repositories: + if provider.get_packages(repo) == False: + continue + packages_cache_key = repo + '.packages' + _channel_repository_cache[packages_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': provider.get_packages(repo) + } + + # Have the local name map override the one from the channel + name_map = provider.get_name_map() + name_map.update(self.settings.get('package_name_map', {})) + self.settings['package_name_map'] = name_map + _channel_repository_cache[name_map_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': name_map + } + + renamed_packages = provider.get_renamed_packages() + _channel_repository_cache[renamed_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': renamed_packages + } + if renamed_packages: + self.settings['renamed_packages'] = self.settings.get( + 'renamed_packages', {}) + self.settings['renamed_packages'].update(renamed_packages) + + unavailable_packages = provider.get_unavailable_packages() + _channel_repository_cache[unavailable_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': unavailable_packages + } + if unavailable_packages: + self.settings['unavailable_packages'] = self.settings.get( + 'unavailable_packages', []) + self.settings['unavailable_packages'].extend(unavailable_packages) + + certs = provider.get_certs() + _channel_repository_cache[certs_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', + 300), + 'data': certs + } + if certs: + self.settings['certs'] = self.settings.get('certs', {}) + self.settings['certs'].update(certs) + + repositories.extend(channel_repositories) + return [repo.strip() for repo in repositories] + + def list_available_packages(self): + """ + Returns a master list of every available package from all sources + + :return: + A dict in the format: + { + 'Package Name': { + # Package details - see example-packages.json for format + }, + ... + } + """ + + repositories = self.list_repositories() + packages = {} + downloaders = [] + grouped_downloaders = {} + + # Repositories are run in reverse order so that the ones first + # on the list will overwrite those last on the list + for repo in repositories[::-1]: + repository_packages = None + + cache_key = repo + '.packages' + packages_cache = _channel_repository_cache.get(cache_key) + if packages_cache and packages_cache.get('time') > \ + time.time(): + repository_packages = packages_cache.get('data') + packages.update(repository_packages) + + if repository_packages == None: + downloader = RepositoryDownloader(self, + self.settings.get('package_name_map', {}), repo) + domain = re.sub('^https?://[^/]*?(\w+\.\w+)($|/.*$)', '\\1', + repo) + + # downloaders are grouped by domain so that multiple can + # be run in parallel without running into API access limits + if not grouped_downloaders.get(domain): + grouped_downloaders[domain] = [] + grouped_downloaders[domain].append(downloader) + + # Allows creating a separate named function for each downloader + # delay. Not having this contained in a function causes all of the + # schedules to reference the same downloader.start() + def schedule(downloader, delay): + downloader.has_started = False + + def inner(): + downloader.start() + downloader.has_started = True + sublime.set_timeout(inner, delay) + + # Grabs every repo grouped by domain and delays the start + # of each download from that domain by a fixed amount + for domain_downloaders in grouped_downloaders.values(): + for i in range(len(domain_downloaders)): + downloader = domain_downloaders[i] + downloaders.append(downloader) + schedule(downloader, i * 150) + + complete = [] + + # Wait for all of the downloaders to finish + while downloaders: + downloader = downloaders.pop() + if downloader.has_started: + downloader.join() + complete.append(downloader) + else: + downloaders.insert(0, downloader) + + # Grabs the results and stuff if all in the cache + for downloader in complete: + repository_packages = downloader.packages + if repository_packages == False: + continue + cache_key = downloader.repo + '.packages' + _channel_repository_cache[cache_key] = { + 'time': time.time() + self.settings.get('cache_length', 300), + 'data': repository_packages + } + packages.update(repository_packages) + + renamed_packages = downloader.renamed_packages + if renamed_packages == False: + continue + renamed_cache_key = downloader.repo + '.renamed_packages' + _channel_repository_cache[renamed_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', 300), + 'data': renamed_packages + } + if renamed_packages: + self.settings['renamed_packages'] = self.settings.get( + 'renamed_packages', {}) + self.settings['renamed_packages'].update(renamed_packages) + + unavailable_packages = downloader.unavailable_packages + unavailable_cache_key = downloader.repo + '.unavailable_packages' + _channel_repository_cache[unavailable_cache_key] = { + 'time': time.time() + self.settings.get('cache_length', 300), + 'data': unavailable_packages + } + if unavailable_packages: + self.settings['unavailable_packages'] = self.settings.get( + 'unavailable_packages', []) + self.settings['unavailable_packages'].extend(unavailable_packages) + + return packages + + def list_packages(self): + """ :return: A list of all installed, non-default, package names""" + + package_names = os.listdir(sublime.packages_path()) + package_names = [path for path in package_names if + os.path.isdir(os.path.join(sublime.packages_path(), path))] + + # Ignore things to be deleted + ignored = [] + for package in package_names: + cleanup_file = os.path.join(sublime.packages_path(), package, + 'package-control.cleanup') + if os.path.exists(cleanup_file): + ignored.append(package) + + packages = list(set(package_names) - set(ignored) - + set(self.list_default_packages())) + packages = sorted(packages, key=lambda s: s.lower()) + + return packages + + def list_all_packages(self): + """ :return: A list of all installed package names, including default packages""" + + packages = os.listdir(sublime.packages_path()) + packages = sorted(packages, key=lambda s: s.lower()) + return packages + + def list_default_packages(self): + """ :return: A list of all default package names""" + + files = os.listdir(os.path.join(os.path.dirname( + sublime.packages_path()), 'Pristine Packages')) + files = list(set(files) - set(os.listdir( + sublime.installed_packages_path()))) + packages = [file.replace('.sublime-package', '') for file in files] + packages = sorted(packages, key=lambda s: s.lower()) + return packages + + def get_package_dir(self, package): + """:return: The full filesystem path to the package directory""" + + return os.path.join(sublime.packages_path(), package) + + def get_mapped_name(self, package): + """:return: The name of the package after passing through mapping rules""" + + return self.settings.get('package_name_map', {}).get(package, package) + + def create_package(self, package_name, package_destination, + binary_package=False): + """ + Creates a .sublime-package file from the running Packages directory + + :param package_name: + The package to create a .sublime-package file for + + :param package_destination: + The full filesystem path of the directory to save the new + .sublime-package file in. + + :param binary_package: + If the created package should follow the binary package include/ + exclude patterns from the settings. These normally include a setup + to exclude .py files and include .pyc files, but that can be + changed via settings. + + :return: bool if the package file was successfully created + """ + + package_dir = self.get_package_dir(package_name) + '/' + + if not os.path.exists(package_dir): + sublime.error_message(('%s: The folder for the package name ' + + 'specified, %s, does not exist in %s') % + (__name__, package_name, sublime.packages_path())) + return False + + package_filename = package_name + '.sublime-package' + package_path = os.path.join(package_destination, + package_filename) + + if not os.path.exists(sublime.installed_packages_path()): + os.mkdir(sublime.installed_packages_path()) + + if os.path.exists(package_path): + os.remove(package_path) + + try: + package_file = zipfile.ZipFile(package_path, "w", + compression=zipfile.ZIP_DEFLATED) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred creating the ' + + 'package file %s in %s. %s') % (__name__, package_filename, + package_destination, unicode_from_os(exception))) + return False + + dirs_to_ignore = self.settings.get('dirs_to_ignore', []) + if not binary_package: + files_to_ignore = self.settings.get('files_to_ignore', []) + files_to_include = self.settings.get('files_to_include', []) + else: + files_to_ignore = self.settings.get('files_to_ignore_binary', []) + files_to_include = self.settings.get('files_to_include_binary', []) + + package_dir_regex = re.compile('^' + re.escape(package_dir)) + for root, dirs, files in os.walk(package_dir): + [dirs.remove(dir) for dir in dirs if dir in dirs_to_ignore] + paths = dirs + paths.extend(files) + for path in paths: + full_path = os.path.join(root, path) + relative_path = re.sub(package_dir_regex, '', full_path) + + ignore_matches = [fnmatch(relative_path, p) for p in files_to_ignore] + include_matches = [fnmatch(relative_path, p) for p in files_to_include] + if any(ignore_matches) and not any(include_matches): + continue + + if os.path.isdir(full_path): + continue + package_file.write(full_path, relative_path) + + package_file.close() + + return True + + def install_package(self, package_name): + """ + Downloads and installs (or upgrades) a package + + Uses the self.list_available_packages() method to determine where to + retrieve the package file from. + + The install process consists of: + + 1. Finding the package + 2. Downloading the .sublime-package/.zip file + 3. Extracting the package file + 4. Showing install/upgrade messaging + 5. Submitting usage info + 6. Recording that the package is installed + + :param package_name: + The package to download and install + + :return: bool if the package was successfully installed + """ + + packages = self.list_available_packages() + + if package_name in self.settings.get('unavailable_packages', []): + print ('%s: The package "%s" is not available ' + + 'on this platform.') % (__name__, package_name) + return False + + if package_name not in packages.keys(): + sublime.error_message(('%s: The package specified, %s, is ' + + 'not available.') % (__name__, package_name)) + return False + + download = packages[package_name]['downloads'][0] + url = download['url'] + + package_filename = package_name + \ + '.sublime-package' + package_path = os.path.join(sublime.installed_packages_path(), + package_filename) + pristine_package_path = os.path.join(os.path.dirname( + sublime.packages_path()), 'Pristine Packages', package_filename) + + package_dir = self.get_package_dir(package_name) + + package_metadata_file = os.path.join(package_dir, + 'package-metadata.json') + + if os.path.exists(os.path.join(package_dir, '.git')): + if self.settings.get('ignore_vcs_packages'): + sublime.error_message(('%s: Skipping git package %s since ' + + 'the setting ignore_vcs_packages is set to true') % + (__name__, package_name)) + return False + return GitUpgrader(self.settings['git_binary'], + self.settings['git_update_command'], package_dir, + self.settings['cache_length'], self.settings['debug']).run() + elif os.path.exists(os.path.join(package_dir, '.hg')): + if self.settings.get('ignore_vcs_packages'): + sublime.error_message(('%s: Skipping hg package %s since ' + + 'the setting ignore_vcs_packages is set to true') % + (__name__, package_name)) + return False + return HgUpgrader(self.settings['hg_binary'], + self.settings['hg_update_command'], package_dir, + self.settings['cache_length'], self.settings['debug']).run() + + is_upgrade = os.path.exists(package_metadata_file) + old_version = None + if is_upgrade: + old_version = self.get_metadata(package_name).get('version') + + package_bytes = self.download_url(url, 'Error downloading package.') + if package_bytes == False: + return False + with open(package_path, "wb") as package_file: + package_file.write(package_bytes) + + if not os.path.exists(package_dir): + os.mkdir(package_dir) + + # We create a backup copy incase something was edited + else: + try: + backup_dir = os.path.join(os.path.dirname( + sublime.packages_path()), 'Backup', + datetime.datetime.now().strftime('%Y%m%d%H%M%S')) + if not os.path.exists(backup_dir): + os.makedirs(backup_dir) + package_backup_dir = os.path.join(backup_dir, package_name) + shutil.copytree(package_dir, package_backup_dir) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying ' + + 'to backup the package directory for %s. %s') % + (__name__, package_name, unicode_from_os(exception))) + shutil.rmtree(package_backup_dir) + return False + + try: + package_zip = zipfile.ZipFile(package_path, 'r') + except (zipfile.BadZipfile): + sublime.error_message(('%s: An error occurred while ' + + 'trying to unzip the package file for %s. Please try ' + + 'installing the package again.') % (__name__, package_name)) + return False + + root_level_paths = [] + last_path = None + for path in package_zip.namelist(): + last_path = path + if path.find('/') in [len(path) - 1, -1]: + root_level_paths.append(path) + if path[0] == '/' or path.find('../') != -1 or path.find('..\\') != -1: + sublime.error_message(('%s: The package specified, %s, ' + + 'contains files outside of the package dir and cannot ' + + 'be safely installed.') % (__name__, package_name)) + return False + + if last_path and len(root_level_paths) == 0: + root_level_paths.append(last_path[0:last_path.find('/') + 1]) + + os.chdir(package_dir) + + overwrite_failed = False + + # Here we don’t use .extractall() since it was having issues on OS X + skip_root_dir = len(root_level_paths) == 1 and \ + root_level_paths[0].endswith('/') + extracted_paths = [] + for path in package_zip.namelist(): + dest = path + try: + if not isinstance(dest, unicode): + dest = unicode(dest, 'utf-8', 'strict') + except (UnicodeDecodeError): + dest = unicode(dest, 'cp1252', 'replace') + + if os.name == 'nt': + regex = ':|\*|\?|"|<|>|\|' + if re.search(regex, dest) != None: + print ('%s: Skipping file from package named %s due to ' + + 'an invalid filename') % (__name__, path) + continue + + # If there was only a single directory in the package, we remove + # that folder name from the paths as we extract entries + if skip_root_dir: + dest = dest[len(root_level_paths[0]):] + + if os.name == 'nt': + dest = dest.replace('/', '\\') + else: + dest = dest.replace('\\', '/') + + dest = os.path.join(package_dir, dest) + + def add_extracted_dirs(dir): + while dir not in extracted_paths: + extracted_paths.append(dir) + dir = os.path.dirname(dir) + if dir == package_dir: + break + + if path.endswith('/'): + if not os.path.exists(dest): + os.makedirs(dest) + add_extracted_dirs(dest) + else: + dest_dir = os.path.dirname(dest) + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) + add_extracted_dirs(dest_dir) + extracted_paths.append(dest) + try: + open(dest, 'wb').write(package_zip.read(path)) + except (IOError) as (e): + message = unicode_from_os(e) + if re.search('[Ee]rrno 13', message): + overwrite_failed = True + break + print ('%s: Skipping file from package named %s due to ' + + 'an invalid filename') % (__name__, path) + + except (UnicodeDecodeError): + print ('%s: Skipping file from package named %s due to ' + + 'an invalid filename') % (__name__, path) + package_zip.close() + + + # If upgrading failed, queue the package to upgrade upon next start + if overwrite_failed: + reinstall_file = os.path.join(package_dir, 'package-control.reinstall') + open(reinstall_file, 'w').close() + + # Don't delete the metadata file, that way we have it + # when the reinstall happens, and the appropriate + # usage info can be sent back to the server + clear_directory(package_dir, [reinstall_file, package_metadata_file]) + + sublime.error_message(('%s: An error occurred while trying to ' + + 'upgrade %s. Please restart Sublime Text to finish the ' + + 'upgrade.') % (__name__, package_name)) + return False + + + # Here we clean out any files that were not just overwritten. It is ok + # if there is an error removing a file. The next time there is an + # upgrade, it should be cleaned out successfully then. + clear_directory(package_dir, extracted_paths) + + + self.print_messages(package_name, package_dir, is_upgrade, old_version) + + with open(package_metadata_file, 'w') as f: + metadata = { + "version": packages[package_name]['downloads'][0]['version'], + "url": packages[package_name]['url'], + "description": packages[package_name]['description'] + } + json.dump(metadata, f) + + # Submit install and upgrade info + if is_upgrade: + params = { + 'package': package_name, + 'operation': 'upgrade', + 'version': packages[package_name]['downloads'][0]['version'], + 'old_version': old_version + } + else: + params = { + 'package': package_name, + 'operation': 'install', + 'version': packages[package_name]['downloads'][0]['version'] + } + self.record_usage(params) + + # Record the install in the settings file so that you can move + # settings across computers and have the same packages installed + def save_package(): + settings = sublime.load_settings(__name__ + '.sublime-settings') + installed_packages = settings.get('installed_packages', []) + if not installed_packages: + installed_packages = [] + installed_packages.append(package_name) + installed_packages = list(set(installed_packages)) + installed_packages = sorted(installed_packages, + key=lambda s: s.lower()) + settings.set('installed_packages', installed_packages) + sublime.save_settings(__name__ + '.sublime-settings') + sublime.set_timeout(save_package, 1) + + # Here we delete the package file from the installed packages directory + # since we don't want to accidentally overwrite user changes + os.remove(package_path) + # We have to remove the pristine package too or else Sublime Text 2 + # will silently delete the package + if os.path.exists(pristine_package_path): + os.remove(pristine_package_path) + + os.chdir(sublime.packages_path()) + return True + + def print_messages(self, package, package_dir, is_upgrade, old_version): + """ + Prints out package install and upgrade messages + + The functionality provided by this allows package maintainers to + show messages to the user when a package is installed, or when + certain version upgrade occur. + + :param package: + The name of the package the message is for + + :param package_dir: + The full filesystem path to the package directory + + :param is_upgrade: + If the install was actually an upgrade + + :param old_version: + The string version of the package before the upgrade occurred + """ + + messages_file = os.path.join(package_dir, 'messages.json') + if not os.path.exists(messages_file): + return + + messages_fp = open(messages_file, 'r') + try: + message_info = json.load(messages_fp) + except (ValueError): + print '%s: Error parsing messages.json for %s' % (__name__, package) + return + messages_fp.close() + + output = '' + if not is_upgrade and message_info.get('install'): + install_messages = os.path.join(package_dir, + message_info.get('install')) + message = '\n\n%s:\n%s\n\n ' % (package, + ('-' * len(package))) + with open(install_messages, 'r') as f: + message += unicode(f.read(), 'utf-8', errors='replace').replace('\n', '\n ') + output += message + '\n' + + elif is_upgrade and old_version: + upgrade_messages = list(set(message_info.keys()) - + set(['install'])) + upgrade_messages = sorted(upgrade_messages, + cmp=self.compare_versions, reverse=True) + for version in upgrade_messages: + if self.compare_versions(old_version, version) >= 0: + break + if not output: + message = '\n\n%s:\n%s\n' % (package, + ('-' * len(package))) + output += message + upgrade_messages = os.path.join(package_dir, + message_info.get(version)) + message = '\n ' + with open(upgrade_messages, 'r') as f: + message += unicode(f.read(), 'utf-8', errors='replace').replace('\n', '\n ') + output += message + '\n' + + if not output: + return + + def print_to_panel(): + window = sublime.active_window() + + views = window.views() + view = None + for _view in views: + if _view.name() == 'Package Control Messages': + view = _view + break + + if not view: + view = window.new_file() + view.set_name('Package Control Messages') + view.set_scratch(True) + + def write(string): + edit = view.begin_edit() + view.insert(edit, view.size(), string) + view.end_edit(edit) + + if not view.size(): + view.settings().set("word_wrap", True) + write('Package Control Messages\n' + + '========================') + + write(output) + sublime.set_timeout(print_to_panel, 1) + + def remove_package(self, package_name): + """ + Deletes a package + + The deletion process consists of: + + 1. Deleting the directory (or marking it for deletion if deletion fails) + 2. Submitting usage info + 3. Removing the package from the list of installed packages + + :param package_name: + The package to delete + + :return: bool if the package was successfully deleted + """ + + installed_packages = self.list_packages() + + if package_name not in installed_packages: + sublime.error_message(('%s: The package specified, %s, is not ' + + 'installed.') % (__name__, package_name)) + return False + + os.chdir(sublime.packages_path()) + + # Give Sublime Text some time to ignore the package + time.sleep(1) + + package_filename = package_name + '.sublime-package' + package_path = os.path.join(sublime.installed_packages_path(), + package_filename) + installed_package_path = os.path.join(os.path.dirname( + sublime.packages_path()), 'Installed Packages', package_filename) + pristine_package_path = os.path.join(os.path.dirname( + sublime.packages_path()), 'Pristine Packages', package_filename) + package_dir = self.get_package_dir(package_name) + + version = self.get_metadata(package_name).get('version') + + try: + if os.path.exists(package_path): + os.remove(package_path) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying to ' + + 'remove the package file for %s. %s') % (__name__, + package_name, unicode_from_os(exception))) + return False + + try: + if os.path.exists(installed_package_path): + os.remove(installed_package_path) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying to ' + + 'remove the installed package file for %s. %s') % (__name__, + package_name, unicode_from_os(exception))) + return False + + try: + if os.path.exists(pristine_package_path): + os.remove(pristine_package_path) + except (OSError, IOError) as (exception): + sublime.error_message(('%s: An error occurred while trying to ' + + 'remove the pristine package file for %s. %s') % (__name__, + package_name, unicode_from_os(exception))) + return False + + # We don't delete the actual package dir immediately due to a bug + # in sublime_plugin.py + can_delete_dir = True + if not clear_directory(package_dir): + # If there is an error deleting now, we will mark it for + # cleanup the next time Sublime Text starts + open(os.path.join(package_dir, 'package-control.cleanup'), + 'w').close() + can_delete_dir = False + + params = { + 'package': package_name, + 'operation': 'remove', + 'version': version + } + self.record_usage(params) + + # Remove the package from the installed packages list + def clear_package(): + settings = sublime.load_settings('%s.sublime-settings' % __name__) + installed_packages = settings.get('installed_packages', []) + if not installed_packages: + installed_packages = [] + installed_packages.remove(package_name) + settings.set('installed_packages', installed_packages) + sublime.save_settings('%s.sublime-settings' % __name__) + sublime.set_timeout(clear_package, 1) + + if can_delete_dir: + os.rmdir(package_dir) + + return True + + def record_usage(self, params): + """ + Submits install, upgrade and delete actions to a usage server + + The usage information is currently displayed on the Package Control + community package list at http://wbond.net/sublime_packages/community + + :param params: + A dict of the information to submit + """ + + if not self.settings.get('submit_usage'): + return + params['package_control_version'] = \ + self.get_metadata('Package Control').get('version') + params['sublime_platform'] = self.settings.get('platform') + params['sublime_version'] = self.settings.get('version') + url = self.settings.get('submit_url') + '?' + urllib.urlencode(params) + + result = self.download_url(url, 'Error submitting usage information.') + if result == False: + return + + try: + result = json.loads(result) + if result['result'] != 'success': + raise ValueError() + except (ValueError): + print '%s: Error submitting usage information for %s' % (__name__, + params['package']) + + +class PackageCreator(): + """ + Abstract class for commands that create .sublime-package files + """ + + def show_panel(self): + """ + Shows a list of packages that can be turned into a .sublime-package file + """ + + self.manager = PackageManager() + self.packages = self.manager.list_packages() + if not self.packages: + sublime.error_message(('%s: There are no packages available to ' + + 'be packaged.') % (__name__)) + return + self.window.show_quick_panel(self.packages, self.on_done) + + def get_package_destination(self): + """ + Retrieves the destination for .sublime-package files + + :return: + A string - the path to the folder to save .sublime-package files in + """ + + destination = self.manager.settings.get('package_destination') + + # We check destination via an if statement instead of using + # the dict.get() method since the key may be set, but to a blank value + if not destination: + destination = os.path.join(os.path.expanduser('~'), 'Desktop') + + return destination + + +class CreatePackageCommand(sublime_plugin.WindowCommand, PackageCreator): + """ + Command to create a regular .sublime-package file + """ + + def run(self): + self.show_panel() + + def on_done(self, picked): + """ + Quick panel user selection handler - processes the user package + selection and create the package file + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package_name = self.packages[picked] + package_destination = self.get_package_destination() + + if self.manager.create_package(package_name, package_destination): + self.window.run_command('open_dir', {"dir": + package_destination, "file": package_name + + '.sublime-package'}) + + +class CreateBinaryPackageCommand(sublime_plugin.WindowCommand, PackageCreator): + """ + Command to create a binary .sublime-package file. Binary packages in + general exclude the .py source files and instead include the .pyc files. + Actual included and excluded files are controlled by settings. + """ + + def run(self): + self.show_panel() + + def on_done(self, picked): + """ + Quick panel user selection handler - processes the user package + selection and create the package file + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package_name = self.packages[picked] + package_destination = self.get_package_destination() + + if self.manager.create_package(package_name, package_destination, + binary_package=True): + self.window.run_command('open_dir', {"dir": + package_destination, "file": package_name + + '.sublime-package'}) + + +class PackageRenamer(): + """ + Class to handle renaming packages via the renamed_packages setting + gathered from channels and repositories. + """ + + def load_settings(self): + """ + Loads the list of installed packages from the + Package Control.sublime-settings file. + """ + + self.settings_file = '%s.sublime-settings' % __name__ + self.settings = sublime.load_settings(self.settings_file) + self.installed_packages = self.settings.get('installed_packages', []) + if not isinstance(self.installed_packages, list): + self.installed_packages = [] + + def rename_packages(self, installer): + """ + Renames any installed packages that the user has installed. + + :param installer: + An instance of :class:`PackageInstaller` + """ + + # Fetch the packages since that will pull in the renamed packages list + installer.manager.list_available_packages() + renamed_packages = installer.manager.settings.get('renamed_packages', {}) + if not renamed_packages: + renamed_packages = {} + + # These are packages that have been tracked as installed + installed_pkgs = self.installed_packages + # There are the packages actually present on the filesystem + present_packages = installer.manager.list_packages() + + # Rename directories for packages that have changed names + for package_name in renamed_packages: + package_dir = os.path.join(sublime.packages_path(), package_name) + metadata_path = os.path.join(package_dir, 'package-metadata.json') + if not os.path.exists(metadata_path): + continue + + new_package_name = renamed_packages[package_name] + new_package_dir = os.path.join(sublime.packages_path(), + new_package_name) + + changing_case = package_name.lower() == new_package_name.lower() + case_insensitive_fs = sublime.platform() in ['windows', 'osx'] + + # Since Windows and OSX use case-insensitive filesystems, we have to + # scan through the list of installed packages if the rename of the + # package is just changing the case of it. If we don't find the old + # name for it, we continue the loop since os.path.exists() will return + # true due to the case-insensitive nature of the filesystems. + if case_insensitive_fs and changing_case: + has_old = False + for present_package_name in present_packages: + if present_package_name == package_name: + has_old = True + break + if not has_old: + continue + + if not os.path.exists(new_package_dir) or (case_insensitive_fs and changing_case): + + # Windows will not allow you to rename to the same name with + # a different case, so we work around that with a temporary name + if os.name == 'nt' and changing_case: + temp_package_name = '__' + new_package_name + temp_package_dir = os.path.join(sublime.packages_path(), + temp_package_name) + os.rename(package_dir, temp_package_dir) + package_dir = temp_package_dir + + os.rename(package_dir, new_package_dir) + installed_pkgs.append(new_package_name) + + print '%s: Renamed %s to %s' % (__name__, package_name, + new_package_name) + + else: + installer.manager.remove_package(package_name) + print ('%s: Removed %s since package with new name (%s) ' + + 'already exists') % (__name__, package_name, + new_package_name) + + try: + installed_pkgs.remove(package_name) + except (ValueError): + pass + + sublime.set_timeout(lambda: self.save_packages(installed_pkgs), 10) + + def save_packages(self, installed_packages): + """ + Saves the list of installed packages (after having been appropriately + renamed) + + :param installed_packages: + The new list of installed packages + """ + + installed_packages = list(set(installed_packages)) + installed_packages = sorted(installed_packages, + key=lambda s: s.lower()) + + if installed_packages != self.installed_packages: + self.settings.set('installed_packages', installed_packages) + sublime.save_settings(self.settings_file) + + +class PackageInstaller(): + """ + Provides helper functionality related to installing packages + """ + + def __init__(self): + self.manager = PackageManager() + + def make_package_list(self, ignore_actions=[], override_action=None, + ignore_packages=[]): + """ + Creates a list of packages and what operation would be performed for + each. Allows filtering by the applicable action or package name. + Returns the information in a format suitable for displaying in the + quick panel. + + :param ignore_actions: + A list of actions to ignore packages by. Valid actions include: + `install`, `upgrade`, `downgrade`, `reinstall`, `overwrite`, + `pull` and `none`. `pull` andd `none` are for Git and Hg + repositories. `pull` is present when incoming changes are detected, + where as `none` is selected if no commits are available. `overwrite` + is for packages that do not include version information via the + `package-metadata.json` file. + + :param override_action: + A string action name to override the displayed action for all listed + packages. + + :param ignore_packages: + A list of packages names that should not be returned in the list + + :return: + A list of lists, each containing three strings: + 0 - package name + 1 - package description + 2 - action; [extra info;] package url + """ + + packages = self.manager.list_available_packages() + installed_packages = self.manager.list_packages() + + package_list = [] + for package in sorted(packages.iterkeys(), key=lambda s: s.lower()): + if ignore_packages and package in ignore_packages: + continue + package_entry = [package] + info = packages[package] + download = info['downloads'][0] + + if package in installed_packages: + installed = True + metadata = self.manager.get_metadata(package) + if metadata.get('version'): + installed_version = metadata['version'] + else: + installed_version = None + else: + installed = False + + installed_version_name = 'v' + installed_version if \ + installed and installed_version else 'unknown version' + new_version = 'v' + download['version'] + + vcs = None + package_dir = self.manager.get_package_dir(package) + settings = self.manager.settings + + if override_action: + action = override_action + extra = '' + + else: + if os.path.exists(os.path.join(sublime.packages_path(), + package, '.git')): + if settings.get('ignore_vcs_packages'): + continue + vcs = 'git' + incoming = GitUpgrader(settings.get('git_binary'), + settings.get('git_update_command'), package_dir, + settings.get('cache_length'), settings.get('debug') + ).incoming() + elif os.path.exists(os.path.join(sublime.packages_path(), + package, '.hg')): + if settings.get('ignore_vcs_packages'): + continue + vcs = 'hg' + incoming = HgUpgrader(settings.get('hg_binary'), + settings.get('hg_update_command'), package_dir, + settings.get('cache_length'), settings.get('debug') + ).incoming() + + if installed: + if not installed_version: + if vcs: + if incoming: + action = 'pull' + extra = ' with ' + vcs + else: + action = 'none' + extra = '' + else: + action = 'overwrite' + extra = ' %s with %s' % (installed_version_name, + new_version) + else: + res = self.manager.compare_versions( + installed_version, download['version']) + if res < 0: + action = 'upgrade' + extra = ' to %s from %s' % (new_version, + installed_version_name) + elif res > 0: + action = 'downgrade' + extra = ' to %s from %s' % (new_version, + installed_version_name) + else: + action = 'reinstall' + extra = ' %s' % new_version + else: + action = 'install' + extra = ' %s' % new_version + extra += ';' + + if action in ignore_actions: + continue + + description = info.get('description') + if not description: + description = 'No description provided' + package_entry.append(description) + package_entry.append(action + extra + ' ' + + re.sub('^https?://', '', info['url'])) + package_list.append(package_entry) + return package_list + + def disable_package(self, package): + """ + Disables a package before installing or upgrading to prevent errors + where Sublime Text tries to read files that no longer exist, or read a + half-written file. + + :param package: The string package name + """ + + # Don't disable Package Control so it does not get stuck disabled + if package == 'Package Control': + return False + + settings = sublime.load_settings(preferences_filename()) + ignored = settings.get('ignored_packages') + if not ignored: + ignored = [] + if not package in ignored: + ignored.append(package) + settings.set('ignored_packages', ignored) + sublime.save_settings(preferences_filename()) + return True + return False + + def reenable_package(self, package): + """ + Re-enables a package after it has been installed or upgraded + + :param package: The string package name + """ + + settings = sublime.load_settings(preferences_filename()) + ignored = settings.get('ignored_packages') + if not ignored: + return + if package in ignored: + settings.set('ignored_packages', + list(set(ignored) - set([package]))) + sublime.save_settings(preferences_filename()) + + def on_done(self, picked): + """ + Quick panel user selection handler - disables a package, installs or + upgrades it, then re-enables the package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + name = self.package_list[picked][0] + + if self.disable_package(name): + on_complete = lambda: self.reenable_package(name) + else: + on_complete = None + + thread = PackageInstallerThread(self.manager, name, on_complete) + thread.start() + ThreadProgress(thread, 'Installing package %s' % name, + 'Package %s successfully %s' % (name, self.completion_type)) + + +class PackageInstallerThread(threading.Thread): + """ + A thread to run package install/upgrade operations in so that the main + Sublime Text thread does not get blocked and freeze the UI + """ + + def __init__(self, manager, package, on_complete): + """ + :param manager: + An instance of :class:`PackageManager` + + :param package: + The string package name to install/upgrade + + :param on_complete: + A callback to run after installing/upgrading the package + """ + + self.package = package + self.manager = manager + self.on_complete = on_complete + threading.Thread.__init__(self) + + def run(self): + try: + self.result = self.manager.install_package(self.package) + finally: + if self.on_complete: + sublime.set_timeout(self.on_complete, 1) + + +class InstallPackageCommand(sublime_plugin.WindowCommand): + """ + A command that presents the list of available packages and allows the + user to pick one to install. + """ + + def run(self): + thread = InstallPackageThread(self.window) + thread.start() + ThreadProgress(thread, 'Loading repositories', '') + + +class InstallPackageThread(threading.Thread, PackageInstaller): + """ + A thread to run the action of retrieving available packages in. Uses the + default PackageInstaller.on_done quick panel handler. + """ + + def __init__(self, window): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the available package list in. + """ + + self.window = window + self.completion_type = 'installed' + threading.Thread.__init__(self) + PackageInstaller.__init__(self) + + def run(self): + self.package_list = self.make_package_list(['upgrade', 'downgrade', + 'reinstall', 'pull', 'none']) + + def show_quick_panel(): + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'available for installation.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + sublime.set_timeout(show_quick_panel, 10) + + +class DiscoverPackagesCommand(sublime_plugin.WindowCommand): + """ + A command that opens the community package list webpage + """ + + def run(self): + self.window.run_command('open_url', + {'url': 'http://wbond.net/sublime_packages/community'}) + + +class UpgradePackageCommand(sublime_plugin.WindowCommand): + """ + A command that presents the list of installed packages that can be upgraded. + """ + + def run(self): + package_renamer = PackageRenamer() + package_renamer.load_settings() + + thread = UpgradePackageThread(self.window, package_renamer) + thread.start() + ThreadProgress(thread, 'Loading repositories', '') + + +class UpgradePackageThread(threading.Thread, PackageInstaller): + """ + A thread to run the action of retrieving upgradable packages in. + """ + + def __init__(self, window, package_renamer): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the list of upgradable packages in. + + :param package_renamer: + An instance of :class:`PackageRenamer` + """ + self.window = window + self.package_renamer = package_renamer + self.completion_type = 'upgraded' + threading.Thread.__init__(self) + PackageInstaller.__init__(self) + + def run(self): + self.package_renamer.rename_packages(self) + + self.package_list = self.make_package_list(['install', 'reinstall', + 'none']) + + def show_quick_panel(): + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'ready for upgrade.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + sublime.set_timeout(show_quick_panel, 10) + + def on_done(self, picked): + """ + Quick panel user selection handler - disables a package, upgrades it, + then re-enables the package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + name = self.package_list[picked][0] + + if self.disable_package(name): + on_complete = lambda: self.reenable_package(name) + else: + on_complete = None + + thread = PackageInstallerThread(self.manager, name, on_complete) + thread.start() + ThreadProgress(thread, 'Upgrading package %s' % name, + 'Package %s successfully %s' % (name, self.completion_type)) + + +class UpgradeAllPackagesCommand(sublime_plugin.WindowCommand): + """ + A command to automatically upgrade all installed packages that are + upgradable. + """ + + def run(self): + package_renamer = PackageRenamer() + package_renamer.load_settings() + + thread = UpgradeAllPackagesThread(self.window, package_renamer) + thread.start() + ThreadProgress(thread, 'Loading repositories', '') + + +class UpgradeAllPackagesThread(threading.Thread, PackageInstaller): + """ + A thread to run the action of retrieving upgradable packages in. + """ + + def __init__(self, window, package_renamer): + self.window = window + self.package_renamer = package_renamer + self.completion_type = 'upgraded' + threading.Thread.__init__(self) + PackageInstaller.__init__(self) + + def run(self): + self.package_renamer.rename_packages(self) + package_list = self.make_package_list(['install', 'reinstall', 'none']) + + disabled_packages = {} + + def do_upgrades(): + # Pause so packages can be disabled + time.sleep(0.5) + + # We use a function to generate the on-complete lambda because if + # we don't, the lambda will bind to info at the current scope, and + # thus use the last value of info from the loop + def make_on_complete(name): + return lambda: self.reenable_package(name) + + for info in package_list: + if disabled_packages.get(info[0]): + on_complete = make_on_complete(info[0]) + else: + on_complete = None + thread = PackageInstallerThread(self.manager, info[0], on_complete) + thread.start() + ThreadProgress(thread, 'Upgrading package %s' % info[0], + 'Package %s successfully %s' % (info[0], self.completion_type)) + + # Disabling a package means changing settings, which can only be done + # in the main thread. We then create a new background thread so that + # the upgrade process does not block the UI. + def disable_packages(): + for info in package_list: + disabled_packages[info[0]] = self.disable_package(info[0]) + threading.Thread(target=do_upgrades).start() + + sublime.set_timeout(disable_packages, 1) + + +class ExistingPackagesCommand(): + """ + Allows listing installed packages and their current version + """ + + def __init__(self): + self.manager = PackageManager() + + def make_package_list(self, action=''): + """ + Returns a list of installed packages suitable for displaying in the + quick panel. + + :param action: + An action to display at the beginning of the third element of the + list returned for each package + + :return: + A list of lists, each containing three strings: + 0 - package name + 1 - package description + 2 - [action] installed version; package url + """ + + packages = self.manager.list_packages() + + if action: + action += ' ' + + package_list = [] + for package in sorted(packages, key=lambda s: s.lower()): + package_entry = [package] + metadata = self.manager.get_metadata(package) + package_dir = os.path.join(sublime.packages_path(), package) + + description = metadata.get('description') + if not description: + description = 'No description provided' + package_entry.append(description) + + version = metadata.get('version') + if not version and os.path.exists(os.path.join(package_dir, + '.git')): + installed_version = 'git repository' + elif not version and os.path.exists(os.path.join(package_dir, + '.hg')): + installed_version = 'hg repository' + else: + installed_version = 'v' + version if version else \ + 'unknown version' + + url = metadata.get('url') + if url: + url = '; ' + re.sub('^https?://', '', url) + else: + url = '' + + package_entry.append(action + installed_version + url) + package_list.append(package_entry) + + return package_list + + +class ListPackagesCommand(sublime_plugin.WindowCommand): + """ + A command that shows a list of all installed packages in the quick panel + """ + + def run(self): + ListPackagesThread(self.window).start() + + +class ListPackagesThread(threading.Thread, ExistingPackagesCommand): + """ + A thread to prevent the listing of existing packages from freezing the UI + """ + + def __init__(self, window): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the list of installed packages in. + """ + + self.window = window + threading.Thread.__init__(self) + ExistingPackagesCommand.__init__(self) + + def run(self): + self.package_list = self.make_package_list() + + def show_quick_panel(): + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'to list.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + sublime.set_timeout(show_quick_panel, 10) + + def on_done(self, picked): + """ + Quick panel user selection handler - opens the homepage for any + selected package in the user's browser + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package_name = self.package_list[picked][0] + + def open_dir(): + self.window.run_command('open_dir', + {"dir": os.path.join(sublime.packages_path(), package_name)}) + sublime.set_timeout(open_dir, 10) + + +class RemovePackageCommand(sublime_plugin.WindowCommand, + ExistingPackagesCommand): + """ + A command that presents a list of installed packages, allowing the user to + select one to remove + """ + + def __init__(self, window): + """ + :param window: + An instance of :class:`sublime.Window` that represents the Sublime + Text window to show the list of installed packages in. + """ + + self.window = window + ExistingPackagesCommand.__init__(self) + + def run(self): + self.package_list = self.make_package_list('remove') + if not self.package_list: + sublime.error_message(('%s: There are no packages ' + + 'that can be removed.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + + def on_done(self, picked): + """ + Quick panel user selection handler - deletes the selected package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package = self.package_list[picked][0] + + # Don't disable Package Control so it does not get stuck disabled + if package != 'Package Control': + settings = sublime.load_settings(preferences_filename()) + ignored = settings.get('ignored_packages') + if not ignored: + ignored = [] + if not package in ignored: + ignored.append(package) + settings.set('ignored_packages', ignored) + sublime.save_settings(preferences_filename()) + + ignored.remove(package) + thread = RemovePackageThread(self.manager, package, + ignored) + thread.start() + ThreadProgress(thread, 'Removing package %s' % package, + 'Package %s successfully removed' % package) + + +class RemovePackageThread(threading.Thread): + """ + A thread to run the remove package operation in so that the Sublime Text + UI does not become frozen + """ + + def __init__(self, manager, package, ignored): + self.manager = manager + self.package = package + self.ignored = ignored + threading.Thread.__init__(self) + + def run(self): + self.result = self.manager.remove_package(self.package) + + def unignore_package(): + settings = sublime.load_settings(preferences_filename()) + settings.set('ignored_packages', self.ignored) + sublime.save_settings(preferences_filename()) + sublime.set_timeout(unignore_package, 10) + + +class AddRepositoryChannelCommand(sublime_plugin.WindowCommand): + """ + A command to add a new channel (list of repositories) to the user's machine + """ + + def run(self): + self.window.show_input_panel('Channel JSON URL', '', + self.on_done, self.on_change, self.on_cancel) + + def on_done(self, input): + """ + Input panel handler - adds the provided URL as a channel + + :param input: + A string of the URL to the new channel + """ + + settings = sublime.load_settings('%s.sublime-settings' % __name__) + repository_channels = settings.get('repository_channels', []) + if not repository_channels: + repository_channels = [] + repository_channels.append(input) + settings.set('repository_channels', repository_channels) + sublime.save_settings('%s.sublime-settings' % __name__) + sublime.status_message(('Channel %s successfully ' + + 'added') % input) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + + +class AddRepositoryCommand(sublime_plugin.WindowCommand): + """ + A command to add a new repository to the user's machine + """ + + def run(self): + self.window.show_input_panel('GitHub or BitBucket Web URL, or Custom' + + ' JSON Repository URL', '', self.on_done, + self.on_change, self.on_cancel) + + def on_done(self, input): + """ + Input panel handler - adds the provided URL as a repository + + :param input: + A string of the URL to the new repository + """ + + settings = sublime.load_settings('%s.sublime-settings' % __name__) + repositories = settings.get('repositories', []) + if not repositories: + repositories = [] + repositories.append(input) + settings.set('repositories', repositories) + sublime.save_settings('%s.sublime-settings' % __name__) + sublime.status_message('Repository %s successfully added' % input) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + + +class DisablePackageCommand(sublime_plugin.WindowCommand): + """ + A command that adds a package to Sublime Text's ignored packages list + """ + + def run(self): + manager = PackageManager() + packages = manager.list_all_packages() + self.settings = sublime.load_settings(preferences_filename()) + ignored = self.settings.get('ignored_packages') + if not ignored: + ignored = [] + self.package_list = list(set(packages) - set(ignored)) + self.package_list.sort() + if not self.package_list: + sublime.error_message(('%s: There are no enabled packages' + + 'to disable.') % __name__) + return + self.window.show_quick_panel(self.package_list, self.on_done) + + def on_done(self, picked): + """ + Quick panel user selection handler - disables the selected package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package = self.package_list[picked] + ignored = self.settings.get('ignored_packages') + if not ignored: + ignored = [] + ignored.append(package) + self.settings.set('ignored_packages', ignored) + sublime.save_settings(preferences_filename()) + sublime.status_message(('Package %s successfully added to list of ' + + 'disabled packages - restarting Sublime Text may be required') % + package) + + +class EnablePackageCommand(sublime_plugin.WindowCommand): + """ + A command that removes a package from Sublime Text's ignored packages list + """ + + def run(self): + self.settings = sublime.load_settings(preferences_filename()) + self.disabled_packages = self.settings.get('ignored_packages') + self.disabled_packages.sort() + if not self.disabled_packages: + sublime.error_message(('%s: There are no disabled packages ' + + 'to enable.') % __name__) + return + self.window.show_quick_panel(self.disabled_packages, self.on_done) + + def on_done(self, picked): + """ + Quick panel user selection handler - enables the selected package + + :param picked: + An integer of the 0-based package name index from the presented + list. -1 means the user cancelled. + """ + + if picked == -1: + return + package = self.disabled_packages[picked] + ignored = self.settings.get('ignored_packages') + self.settings.set('ignored_packages', + list(set(ignored) - set([package]))) + sublime.save_settings(preferences_filename()) + sublime.status_message(('Package %s successfully removed from list ' + + 'of disabled packages - restarting Sublime Text may be required') % + package) + + +class AutomaticUpgrader(threading.Thread): + """ + Automatically checks for updated packages and installs them. controlled + by the `auto_upgrade`, `auto_upgrade_ignore`, `auto_upgrade_frequency` and + `auto_upgrade_last_run` settings. + """ + + def __init__(self, found_packages): + """ + :param found_packages: + A list of package names for the packages that were found to be + installed on the machine. + """ + + self.installer = PackageInstaller() + self.manager = self.installer.manager + + self.load_settings() + + self.package_renamer = PackageRenamer() + self.package_renamer.load_settings() + + self.auto_upgrade = self.settings.get('auto_upgrade') + self.auto_upgrade_ignore = self.settings.get('auto_upgrade_ignore') + + self.next_run = int(time.time()) + self.last_run = None + last_run_file = os.path.join(sublime.packages_path(), 'User', + 'Package Control.last-run') + + if os.path.isfile(last_run_file): + with open(last_run_file) as fobj: + try: + self.last_run = int(fobj.read()) + except ValueError: + pass + + frequency = self.settings.get('auto_upgrade_frequency') + if frequency: + if self.last_run: + self.next_run = int(self.last_run) + (frequency * 60 * 60) + else: + self.next_run = time.time() + + # Detect if a package is missing that should be installed + self.missing_packages = list(set(self.installed_packages) - + set(found_packages)) + + if self.auto_upgrade and self.next_run <= time.time(): + with open(last_run_file, 'w') as fobj: + fobj.write(str(int(time.time()))) + + threading.Thread.__init__(self) + + def load_settings(self): + """ + Loads the list of installed packages from the + Package Control.sublime-settings file + """ + + self.settings_file = '%s.sublime-settings' % __name__ + self.settings = sublime.load_settings(self.settings_file) + self.installed_packages = self.settings.get('installed_packages', []) + self.should_install_missing = self.settings.get('install_missing') + if not isinstance(self.installed_packages, list): + self.installed_packages = [] + + def run(self): + self.install_missing() + + if self.next_run > time.time(): + self.print_skip() + return + + self.upgrade_packages() + + def install_missing(self): + """ + Installs all packages that were listed in the list of + `installed_packages` from Package Control.sublime-settings but were not + found on the filesystem and passed as `found_packages`. + """ + + if not self.missing_packages or not self.should_install_missing: + return + + print '%s: Installing %s missing packages' % \ + (__name__, len(self.missing_packages)) + for package in self.missing_packages: + if self.installer.manager.install_package(package): + print '%s: Installed missing package %s' % \ + (__name__, package) + + def print_skip(self): + """ + Prints a notice in the console if the automatic upgrade is skipped + due to already having been run in the last `auto_upgrade_frequency` + hours. + """ + + last_run = datetime.datetime.fromtimestamp(self.last_run) + next_run = datetime.datetime.fromtimestamp(self.next_run) + date_format = '%Y-%m-%d %H:%M:%S' + print ('%s: Skipping automatic upgrade, last run at ' + + '%s, next run at %s or after') % (__name__, + last_run.strftime(date_format), next_run.strftime(date_format)) + + def upgrade_packages(self): + """ + Upgrades all packages that are not currently upgraded to the lastest + version. Also renames any installed packages to their new names. + """ + + if not self.auto_upgrade: + return + + self.package_renamer.rename_packages(self.installer) + + packages = self.installer.make_package_list(['install', + 'reinstall', 'downgrade', 'overwrite', 'none'], + ignore_packages=self.auto_upgrade_ignore) + + # If Package Control is being upgraded, just do that and restart + for package in packages: + if package[0] != __name__: + continue + + def reset_last_run(): + settings = sublime.load_settings(self.settings_file) + settings.set('auto_upgrade_last_run', None) + sublime.save_settings(self.settings_file) + sublime.set_timeout(reset_last_run, 1) + packages = [package] + break + + if not packages: + print '%s: No updated packages' % __name__ + return + + print '%s: Installing %s upgrades' % (__name__, len(packages)) + for package in packages: + self.installer.manager.install_package(package[0]) + version = re.sub('^.*?(v[\d\.]+).*?$', '\\1', package[2]) + if version == package[2] and version.find('pull with') != -1: + vcs = re.sub('^pull with (\w+).*?$', '\\1', version) + version = 'latest %s commit' % vcs + print '%s: Upgraded %s to %s' % (__name__, package[0], version) + + +class PackageCleanup(threading.Thread, PackageRenamer): + """ + Cleans up folders for packages that were removed, but that still have files + in use. + """ + + def __init__(self): + self.manager = PackageManager() + self.load_settings() + threading.Thread.__init__(self) + + def run(self): + found_pkgs = [] + installed_pkgs = self.installed_packages + for package_name in os.listdir(sublime.packages_path()): + package_dir = os.path.join(sublime.packages_path(), package_name) + metadata_path = os.path.join(package_dir, 'package-metadata.json') + + # Cleanup packages that could not be removed due to in-use files + cleanup_file = os.path.join(package_dir, 'package-control.cleanup') + if os.path.exists(cleanup_file): + try: + shutil.rmtree(package_dir) + print '%s: Removed old directory for package %s' % \ + (__name__, package_name) + except (OSError) as (e): + if not os.path.exists(cleanup_file): + open(cleanup_file, 'w').close() + print ('%s: Unable to remove old directory for package ' + + '%s - deferring until next start: %s') % (__name__, + package_name, unicode_from_os(e)) + + # Finish reinstalling packages that could not be upgraded due to + # in-use files + reinstall = os.path.join(package_dir, 'package-control.reinstall') + if os.path.exists(reinstall): + if not clear_directory(package_dir, [metadata_path]): + if not os.path.exists(reinstall): + open(reinstall, 'w').close() + # Assigning this here prevents the callback from referencing the value + # of the "package_name" variable when it is executed + restart_message = ('%s: An error occurred while trying to ' + + 'finish the upgrade of %s. You will most likely need to ' + + 'restart your computer to complete the upgrade.') % ( + __name__, package_name) + def show_still_locked(): + sublime.error_message(restart_message) + sublime.set_timeout(show_still_locked, 10) + else: + self.manager.install_package(package_name) + + # This adds previously installed packages from old versions of PC + if os.path.exists(metadata_path) and \ + package_name not in self.installed_packages: + installed_pkgs.append(package_name) + params = { + 'package': package_name, + 'operation': 'install', + 'version': \ + self.manager.get_metadata(package_name).get('version') + } + self.manager.record_usage(params) + + found_pkgs.append(package_name) + + sublime.set_timeout(lambda: self.finish(installed_pkgs, found_pkgs), 10) + + def finish(self, installed_pkgs, found_pkgs): + """ + A callback that can be run the main UI thread to perform saving of the + Package Control.sublime-settings file. Also fires off the + :class:`AutomaticUpgrader`. + + :param installed_pkgs: + A list of the string package names of all "installed" packages, + even ones that do not appear to be in the filesystem. + + :param found_pkgs: + A list of the string package names of all packages that are + currently installed on the filesystem. + """ + + self.save_packages(installed_pkgs) + AutomaticUpgrader(found_pkgs).start() + + +# Start shortly after Sublime starts so package renames don't cause errors +# with keybindings, settings, etc disappearing in the middle of parsing +sublime.set_timeout(lambda: PackageCleanup().start(), 2000) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings new file mode 100644 index 0000000..2726c3f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/Package Control.sublime-settings @@ -0,0 +1,138 @@ +{ + // A list of URLs that each contain a JSON file with a list of repositories. + // The repositories from these channels are placed in order after the + // repositories from the "repositories" setting + "repository_channels": [ + "https://sublime.wbond.net/repositories.json" + ], + + // A list of URLs that contain a packages JSON file. These repositories + // are placed in order before repositories from the "repository_channels" + // setting + "repositories": [], + + // A list of CA certs needed for domains. The default channel provides a + // list of domains and an identifier (the md5 hash) for the CA cert(s) + // necessary for each. + // + // If a custom cert is required for a proxy or for an alternate channel + // or repository domain name, it should be added in one of the two forms: + // + // "*": ["my_identifier", "https://example.com/url/of/cert_file"] + // "*": ["my_identifier_2", "/absolute/filesystem/path/to/cert_file"] + // + // In both cases the literal "*" means the cert will be checked to ensure + // it is present for accessing any URL. This is necessary for proxy + // connections, but also useful if you want to provide you own + // ca-bundle.crt file. + // + // The "my_identifier" and "my_identifier_2" can be any unique string + // that Package Control can use as a filename, and ensures that it has + // merged the cert file with the ca-bundle.crt file in the certs/ directory + // since that is what is passed to the downloaders. + "certs": { + "api.bitbucket.org": ["d867a7b2aecc46f9c31afc4f2f50de05", ""], + "api.github.com": ["1c5282418e2cb4989cd6beddcdbab0b5", ""], + "bitbucket.org": ["897abe0b41fd2f64e9e2e351cbc36d76", ""], + "nodeload.github.com": ["1c5282418e2cb4989cd6beddcdbab0b5", ""], + "raw.github.com": ["1c5282418e2cb4989cd6beddcdbab0b5", ""], + "sublime.wbond.net": ["7f4f8622b4fd001c7f648e09aae7edaa", ""] + }, + + // If debugging information for HTTP/HTTPS connections should be printed + // to the Sublime Text console + "debug": false, + + // This helps solve naming issues where a repository it not named the + // same as the package should be. This is primarily only useful for + // GitHub and BitBucket repositories. This mapping will override the + // mapping that is retrieved from the repository channels. + "package_name_map": {}, + + // If package install, upgrade and removal info should be submitted to + // the channel for aggregated statistics + "submit_usage": true, + + // The URL to post install, upgrade and removal notices to + "submit_url": "https://sublime.wbond.net/submit", + + // If packages should be automatically upgraded when ST2 starts + "auto_upgrade": true, + + // If missing packages should be automatically installed when ST2 starts + "install_missing": true, + + // The minimum frequency in hours in which to check for automatic upgrades, + // setting this to 0 will always check for automatic upgrades + "auto_upgrade_frequency": 1, + + // Packages to not auto upgrade + "auto_upgrade_ignore": [], + + // Timeout for downloading channels, repositories and packages + "timeout": 30, + + // The number of seconds to cache repository and package info for + "cache_length": 300, + + // An HTTP proxy server to use for requests + "http_proxy": "", + // An HTTPS proxy server to use for requests - this will inherit from + // http_proxy if it is set to "" or null and http_proxy has a value. You + // can set this to false to prevent inheriting from http_proxy. + "https_proxy": "", + + // Username and password for both http_proxy and https_proxy + "proxy_username": "", + "proxy_password": "", + + // User agent for HTTP requests + "user_agent": "Sublime Package Control", + + // Setting this to true will cause Package Control to ignore all git + // and hg repositories - this may help if trying to list packages to install + // hangs + "ignore_vcs_packages": false, + + // Custom paths to VCS binaries for when they can't be automatically + // found on the system and a package includes a VCS metadata directory + "git_binary": "", + "git_update_command": ["pull", "origin", "master", "--ff", "--commit"], + + "hg_binary": "", + + // Be sure to keep the remote name as the last argument + "hg_update_command": ["pull", "--update", "default"], + + // Directories to ignore when creating a package + "dirs_to_ignore": [ + ".hg", ".git", ".svn", "_darcs", "CVS" + ], + + // Files to ignore when creating a package + "files_to_ignore": [ + ".hgignore", ".gitignore", ".bzrignore", "*.pyc", "*.sublime-project", + "*.sublime-workspace", "*.tmTheme.cache" + ], + + // Files to include, even if they match a pattern in files_to_ignore + "files_to_include": [], + + // Files to ignore when creating a binary package. By default binary + // packages ship with .pyc files instead of .py files. If an __init__.py + // file exists, it will always be included, even if it matches one of + // these patterns. + "files_to_ignore_binary": [ + ".hgignore", ".gitignore", ".bzrignore", "*.py", "*.sublime-project", + "*.sublime-workspace", "*.tmTheme.cache" + ], + + // Files to include for a binary package, even if they match a pattern i + // files_to_ignore_binary + "files_to_include_binary": [ + "__init__.py" + ], + + // When a package is created, copy it to this folder - defaults to Desktop + "package_destination": "" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 new file mode 100644 index 0000000..432b087 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/1c5282418e2cb4989cd6beddcdbab0b5 @@ -0,0 +1,113 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0a:5f:11:4d:03:5b:17:91:17:d2:ef:d4:03:8c:3f:3b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Apr 2 12:00:00 2008 GMT + Not After : Apr 3 00:00:00 2022 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:bf:61:0a:29:10:1f:5e:fe:34:37:51:08:f8:1e: + fb:22:ed:61:be:0b:0d:70:4c:50:63:26:75:15:b9: + 41:88:97:b6:f0:a0:15:bb:08:60:e0:42:e8:05:29: + 10:87:36:8a:28:65:a8:ef:31:07:74:6d:36:97:2f: + 28:46:66:04:c7:2a:79:26:7a:99:d5:8e:c3:6d:4f: + a0:5e:ad:bc:3d:91:c2:59:7b:5e:36:6c:c0:53:cf: + 00:08:32:3e:10:64:58:10:13:69:c7:0c:ee:9c:42: + 51:00:f9:05:44:ee:24:ce:7a:1f:ed:8c:11:bd:12: + a8:f3:15:f4:1c:7a:31:69:01:1b:a7:e6:5d:c0:9a: + 6c:7e:09:9e:e7:52:44:4a:10:3a:23:e4:9b:b6:03: + af:a8:9c:b4:5b:9f:d4:4b:ad:92:8c:ce:b5:11:2a: + aa:37:18:8d:b4:c2:b8:d8:5c:06:8c:f8:ff:23:bd: + 35:5e:d4:7c:3e:7e:83:0e:91:96:05:98:c3:b2:1f: + e3:c8:65:eb:a9:7b:5d:a0:2c:cc:fc:3c:d9:6d:ed: + cc:fa:4b:43:8c:c9:d4:b8:a5:61:1c:b2:40:b6:28: + 12:df:b9:f8:5f:fe:d3:b2:c9:ef:3d:b4:1e:4b:7c: + 1c:4c:99:36:9e:3d:eb:ec:a7:68:5e:1d:df:67:6e: + 5e:fb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.1.3.0.2 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + Full Name: + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + X509v3 Subject Key Identifier: + 50:EA:73:89:DB:29:FB:10:8F:9E:E5:01:20:D4:DE:79:99:48:83:F7 + Signature Algorithm: sha1WithRSAEncryption + 1e:e2:a5:48:9e:6c:db:53:38:0f:ef:a6:1a:2a:ac:e2:03:43: + ed:9a:bc:3e:8e:75:1b:f0:fd:2e:22:59:ac:13:c0:61:e2:e7: + fa:e9:99:cd:87:09:75:54:28:bf:46:60:dc:be:51:2c:92:f3: + 1b:91:7c:31:08:70:e2:37:b9:c1:5b:a8:bd:a3:0b:00:fb:1a: + 15:fd:03:ad:58:6a:c5:c7:24:99:48:47:46:31:1e:92:ef:b4: + 5f:4e:34:c7:90:bf:31:c1:f8:b1:84:86:d0:9c:01:aa:df:8a: + 56:06:ce:3a:e9:0e:ae:97:74:5d:d7:71:9a:42:74:5f:de:8d: + 43:7c:de:e9:55:ed:69:00:cb:05:e0:7a:61:61:33:d1:19:4d: + f9:08:ee:a0:39:c5:25:35:b7:2b:c4:0f:b2:dd:f1:a5:b7:0e: + 24:c4:26:28:8d:79:77:f5:2f:f0:57:ba:7c:07:d4:e1:fc:cd: + 5a:30:57:7e:86:10:47:dd:31:1f:d7:fc:a2:c2:bf:30:7c:5d: + 24:aa:e8:f9:ae:5f:6a:74:c2:ce:6b:b3:46:d8:21:be:29:d4: + 8e:5e:15:d6:42:4a:e7:32:6f:a4:b1:6b:51:83:58:be:3f:6d: + c7:fb:da:03:21:cb:6a:16:19:4e:0a:f0:ad:84:ca:5d:94:b3: + 5a:76:f7:61 +-----BEGIN CERTIFICATE----- +MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR +CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv +KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 +BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf +1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs +zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d +32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w +ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 +LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH +AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy +AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj +AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg +AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ +AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt +AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj +AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl +AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm +MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB +hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME +GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB +INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a +vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j +CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X +dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE +JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY +Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa new file mode 100644 index 0000000..cb680c1 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/7f4f8622b4fd001c7f648e09aae7edaa @@ -0,0 +1,165 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 145105 (0x236d1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: Feb 19 22:45:05 2010 GMT + Not After : Feb 18 22:45:05 2020 GMT + Subject: C=US, O=GeoTrust, Inc., CN=RapidSSL CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c7:71:f8:56:c7:1e:d9:cc:b5:ad:f6:b4:97:a3: + fb:a1:e6:0b:50:5f:50:aa:3a:da:0f:fc:3d:29:24: + 43:c6:10:29:c1:fc:55:40:72:ee:bd:ea:df:9f:b6: + 41:f4:48:4b:c8:6e:fe:4f:57:12:8b:5b:fa:92:dd: + 5e:e8:ad:f3:f0:1b:b1:7b:4d:fb:cf:fd:d1:e5:f8: + e3:dc:e7:f5:73:7f:df:01:49:cf:8c:56:c1:bd:37: + e3:5b:be:b5:4f:8b:8b:f0:da:4f:c7:e3:dd:55:47: + 69:df:f2:5b:7b:07:4f:3d:e5:ac:21:c1:c8:1d:7a: + e8:e7:f6:0f:a1:aa:f5:6f:de:a8:65:4f:10:89:9c: + 03:f3:89:7a:a5:5e:01:72:33:ed:a9:e9:5a:1e:79: + f3:87:c8:df:c8:c5:fc:37:c8:9a:9a:d7:b8:76:cc: + b0:3e:e7:fd:e6:54:ea:df:5f:52:41:78:59:57:ad: + f1:12:d6:7f:bc:d5:9f:70:d3:05:6c:fa:a3:7d:67: + 58:dd:26:62:1d:31:92:0c:79:79:1c:8e:cf:ca:7b: + c1:66:af:a8:74:48:fb:8e:82:c2:9e:2c:99:5c:7b: + 2d:5d:9b:bc:5b:57:9e:7c:3a:7a:13:ad:f2:a3:18: + 5b:2b:59:0f:cd:5c:3a:eb:68:33:c6:28:1d:82:d1: + 50:8b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 6B:69:3D:6A:18:42:4A:DD:8F:02:65:39:FD:35:24:86:78:91:16:30 + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 CRL Distribution Points: + URI:http://crl.geotrust.com/crls/gtglobal.crl + + Authority Information Access: + OCSP - URI:http://ocsp.geotrust.com + + Signature Algorithm: sha1WithRSAEncryption + ab:bc:bc:0a:5d:18:94:e3:c1:b1:c3:a8:4c:55:d6:be:b4:98: + f1:ee:3c:1c:cd:cf:f3:24:24:5c:96:03:27:58:fc:36:ae:a2: + 2f:8f:f1:fe:da:2b:02:c3:33:bd:c8:dd:48:22:2b:60:0f:a5: + 03:10:fd:77:f8:d0:ed:96:67:4f:fd:ea:47:20:70:54:dc:a9: + 0c:55:7e:e1:96:25:8a:d9:b5:da:57:4a:be:8d:8e:49:43:63: + a5:6c:4e:27:87:25:eb:5b:6d:fe:a2:7f:38:28:e0:36:ab:ad: + 39:a5:a5:62:c4:b7:5c:58:2c:aa:5d:01:60:a6:62:67:a3:c0: + c7:62:23:f4:e7:6c:46:ee:b5:d3:80:6a:22:13:d2:2d:3f:74: + 4f:ea:af:8c:5f:b4:38:9c:db:ae:ce:af:84:1e:a6:f6:34:51: + 59:79:d3:e3:75:dc:bc:d7:f3:73:df:92:ec:d2:20:59:6f:9c: + fb:95:f8:92:76:18:0a:7c:0f:2c:a6:ca:de:8a:62:7b:d8:f3: + ce:5f:68:bd:8f:3e:c1:74:bb:15:72:3a:16:83:a9:0b:e6:4d: + 99:9c:d8:57:ec:a8:01:51:c7:6f:57:34:5e:ab:4a:2c:42:f6: + 4f:1c:89:78:de:26:4e:f5:6f:93:4c:15:6b:27:56:4d:00:54: + 6c:7a:b7:b7 +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM +IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0 +l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e +6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb +ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8 +N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5 +HI7PynvBZq+odEj7joLCniyZXHstXZu8W1eefDp6E63yoxhbK1kPzVw662gzxigd +gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC +St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w +EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js +Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw +JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B +AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x +/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O +SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61 +04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4 +knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK +LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 144470 (0x23456) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: May 21 04:00:00 2002 GMT + Not After : May 21 04:00:00 2022 GMT + Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df: + 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8: + 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29: + bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4: + 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3: + ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92: + 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d: + 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14: + 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd: + d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6: + d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5: + 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39: + 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05: + 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2: + fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32: + eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07: + 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b: + e4:f9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + Signature Algorithm: sha1WithRSAEncryption + 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f: + 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf: + dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb: + 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2: + b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20: + 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5: + ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db: + 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f: + b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1: + c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52: + b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9: + 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5: + e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17: + b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80: + a1:cb:e6:33 +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 new file mode 100644 index 0000000..591907f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/897abe0b41fd2f64e9e2e351cbc36d76 @@ -0,0 +1,285 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 03:37:b9:28:34:7c:60:a6:ae:c5:ad:b1:21:7f:38:60 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Nov 9 12:00:00 2007 GMT + Not After : Nov 10 00:00:00 2021 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV CA-1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:f3:96:62:d8:75:6e:19:ff:3f:34:7c:49:4f:31: + 7e:0d:04:4e:99:81:e2:b3:85:55:91:30:b1:c0:af: + 70:bb:2c:a8:e7:18:aa:3f:78:f7:90:68:52:86:01: + 88:97:e2:3b:06:65:90:aa:bd:65:76:c2:ec:be:10: + 5b:37:78:83:60:75:45:c6:bd:74:aa:b6:9f:a4:3a: + 01:50:17:c4:39:69:b9:f1:4f:ef:82:c1:ca:f3:4a: + db:cc:9e:50:4f:4d:40:a3:3a:90:e7:86:66:bc:f0: + 3e:76:28:4c:d1:75:80:9e:6a:35:14:35:03:9e:db: + 0c:8c:c2:28:ad:50:b2:ce:f6:91:a3:c3:a5:0a:58: + 49:f6:75:44:6c:ba:f9:ce:e9:ab:3a:02:e0:4d:f3: + ac:e2:7a:e0:60:22:05:3c:82:d3:52:e2:f3:9c:47: + f8:3b:d8:b2:4b:93:56:4a:bf:70:ab:3e:e9:68:c8: + 1d:8f:58:1d:2a:4d:5e:27:3d:ad:0a:59:2f:5a:11: + 20:40:d9:68:04:68:2d:f4:c0:84:0b:0a:1b:78:df: + ed:1a:58:dc:fb:41:5a:6d:6b:f2:ed:1c:ee:5c:32: + b6:5c:ec:d7:a6:03:32:a6:e8:de:b7:28:27:59:88: + 80:ff:7b:ad:89:58:d5:1e:14:a4:f2:b0:70:d4:a0: + 3e:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, Code Signing, E-mail Protection, Time Stamping + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.2.1 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + CA Issuers - URI:http://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt + + X509v3 CRL Distribution Points: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Subject Key Identifier: + 4C:58:CB:25:F0:41:4F:52:F4:28:C8:81:43:9B:A6:A8:A0:E6:92:E5 + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + Signature Algorithm: sha1WithRSAEncryption + 4c:7a:17:87:28:5d:17:bc:b2:32:73:bf:cd:2e:f5:58:31:1d: + f0:b1:71:54:9c:d6:9b:67:93:db:2f:03:3e:16:6f:1e:03:c9: + 53:84:a3:56:60:1e:78:94:1b:a2:a8:6f:a3:a4:8b:52:91:d7: + dd:5c:95:bb:ef:b5:16:49:e9:a5:42:4f:34:f2:47:ff:ae:81: + 7f:13:54:b7:20:c4:70:15:cb:81:0a:81:cb:74:57:dc:9c:df: + 24:a4:29:0c:18:f0:1c:e4:ae:07:33:ec:f1:49:3e:55:cf:6e: + 4f:0d:54:7b:d3:c9:e8:15:48:d4:c5:bb:dc:35:1c:77:45:07: + 48:45:85:bd:d7:7e:53:b8:c0:16:d9:95:cd:8b:8d:7d:c9:60: + 4f:d1:a2:9b:e3:d0:30:d6:b4:73:36:e6:d2:f9:03:b2:e3:a4: + f5:e5:b8:3e:04:49:00:ba:2e:a6:4a:72:83:72:9d:f7:0b:8c: + a9:89:e7:b3:d7:64:1f:d6:e3:60:cb:03:c4:dc:88:e9:9d:25: + 01:00:71:cb:03:b4:29:60:25:8f:f9:46:d1:7b:71:ae:cd:53: + 12:5b:84:8e:c2:0f:c7:ed:93:19:d9:c9:fa:8f:58:34:76:32: + 2f:ae:e1:50:14:61:d4:a8:58:a3:c8:30:13:23:ef:c6:25:8c: + 36:8f:1c:80 +-----BEGIN CERTIFICATE----- +MIIG5jCCBc6gAwIBAgIQAze5KDR8YKauxa2xIX84YDANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA3MTEwOTEyMDAwMFoXDTIxMTExMDAwMDAwMFowaTEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTEoMCYGA1UEAxMfRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPOWYth1bhn/ +PzR8SU8xfg0ETpmB4rOFVZEwscCvcLssqOcYqj9495BoUoYBiJfiOwZlkKq9ZXbC +7L4QWzd4g2B1Rca9dKq2n6Q6AVAXxDlpufFP74LByvNK28yeUE9NQKM6kOeGZrzw +PnYoTNF1gJ5qNRQ1A57bDIzCKK1Qss72kaPDpQpYSfZ1RGy6+c7pqzoC4E3zrOJ6 +4GAiBTyC01Li85xH+DvYskuTVkq/cKs+6WjIHY9YHSpNXic9rQpZL1oRIEDZaARo +LfTAhAsKG3jf7RpY3PtBWm1r8u0c7lwytlzs16YDMqbo3rcoJ1mIgP97rYlY1R4U +pPKwcNSgPqcCAwEAAaOCA4UwggOBMA4GA1UdDwEB/wQEAwIBhjA7BgNVHSUENDAy +BggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUH +AwgwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5o +dG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0 +AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1 +AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABp +AGcAaQBDAGUAcgB0ACAARQBWACAAQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBl +AGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBo +AGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAg +AGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAg +AGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wEgYDVR0TAQH/BAgwBgEB/wIBADCB +gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy +dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NBQ2Vy +dHMvRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0MIGPBgNVHR8EgYcw +gYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hB +c3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0 +LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHQYDVR0OBBYE +FExYyyXwQU9S9CjIgUObpqig5pLlMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoI +Au9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQBMeheHKF0XvLIyc7/NLvVYMR3wsXFU +nNabZ5PbLwM+Fm8eA8lThKNWYB54lBuiqG+jpItSkdfdXJW777UWSemlQk808kf/ +roF/E1S3IMRwFcuBCoHLdFfcnN8kpCkMGPAc5K4HM+zxST5Vz25PDVR708noFUjU +xbvcNRx3RQdIRYW9135TuMAW2ZXNi419yWBP0aKb49Aw1rRzNubS+QOy46T15bg+ +BEkAui6mSnKDcp33C4ypieez12Qf1uNgywPE3IjpnSUBAHHLA7QpYCWP+UbRe3Gu +zVMSW4SOwg/H7ZMZ2cn6j1g0djIvruFQFGHUqFijyDATI+/GJYw2jxyA +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1116160165 (0x428740a5) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: Oct 1 05:00:00 2006 GMT + Not After : Jul 26 18:15:15 2014 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: + e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: + a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: + a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: + cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: + 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: + f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: + 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: + be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: + ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: + 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: + 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: + 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: + 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: + 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: + a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: + 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: + 4b:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection + Authority Information Access: + OCSP - URI:http://ocsp.entrust.net + + X509v3 CRL Distribution Points: + URI:http://crl.entrust.net/server1.crl + + X509v3 Subject Key Identifier: + B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + 1.2.840.113533.7.65.0: + 0 +..V7.1.... + Signature Algorithm: sha1WithRSAEncryption + 48:0e:2b:6f:20:62:4c:28:93:a3:24:3d:58:ab:21:cf:80:f8: + 9a:97:90:6a:22:ed:5a:7c:47:36:99:e7:79:84:75:ab:24:8f: + 92:0a:d5:61:04:ae:c3:6a:5c:b2:cc:d9:e4:44:87:6f:db:8f: + 38:62:f7:44:36:9d:ba:bc:6e:07:c4:d4:8d:e8:1f:d1:0b:60: + a3:b5:9c:ce:63:be:ed:67:dc:f8:ba:de:6e:c9:25:cb:5b:b5: + 9d:76:70:0b:df:42:72:f8:4f:41:11:64:a5:d2:ea:fc:d5:af: + 11:f4:15:38:67:9c:20:a8:4b:77:5a:91:32:42:32:e7:85:b3: + df:36 +-----BEGIN CERTIFICATE----- +MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw +MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV +BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD +1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt +cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 +OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd +HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm +t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET +MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo +dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v +Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU +mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 +UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF +BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu +w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1 +nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 927650371 (0x374ad243) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: May 25 16:09:40 1999 GMT + Not After : May 25 16:39:40 2019 GMT + Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cd:28:83:34:54:1b:89:f3:0f:af:37:91:31:ff: + af:31:60:c9:a8:e8:b2:10:68:ed:9f:e7:93:36:f1: + 0a:64:bb:47:f5:04:17:3f:23:47:4d:c5:27:19:81: + 26:0c:54:72:0d:88:2d:d9:1f:9a:12:9f:bc:b3:71: + d3:80:19:3f:47:66:7b:8c:35:28:d2:b9:0a:df:24: + da:9c:d6:50:79:81:7a:5a:d3:37:f7:c2:4a:d8:29: + 92:26:64:d1:e4:98:6c:3a:00:8a:f5:34:9b:65:f8: + ed:e3:10:ff:fd:b8:49:58:dc:a0:de:82:39:6b:81: + b1:16:19:61:b9:54:b6:e6:43 + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority/CN=CRL1 + URI:http://www.entrust.net/CRL/net1.crl + + X509v3 Private Key Usage Period: + Not Before: May 25 16:09:40 1999 GMT, Not After: May 25 16:09:40 2019 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + X509v3 Subject Key Identifier: + F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 90:dc:30:02:fa:64:74:c2:a7:0a:a5:7c:21:8d:34:17:a8:fb: + 47:0e:ff:25:7c:8d:13:0a:fb:e4:98:b5:ef:8c:f8:c5:10:0d: + f7:92:be:f1:c3:d5:d5:95:6a:04:bb:2c:ce:26:36:65:c8:31: + c6:e7:ee:3f:e3:57:75:84:7a:11:ef:46:4f:18:f4:d3:98:bb: + a8:87:32:ba:72:f6:3c:e2:3d:9f:d7:1d:d9:c3:60:43:8c:58: + 0e:22:96:2f:62:a3:2c:1f:ba:ad:05:ef:ab:32:78:87:a0:54: + 73:19:b5:5c:05:f9:52:3e:6d:2d:45:0b:f7:0a:93:ea:ed:06: + f9:b2 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt new file mode 100644 index 0000000..1681842 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/ca-bundle.crt @@ -0,0 +1,563 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 145105 (0x236d1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: Feb 19 22:45:05 2010 GMT + Not After : Feb 18 22:45:05 2020 GMT + Subject: C=US, O=GeoTrust, Inc., CN=RapidSSL CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c7:71:f8:56:c7:1e:d9:cc:b5:ad:f6:b4:97:a3: + fb:a1:e6:0b:50:5f:50:aa:3a:da:0f:fc:3d:29:24: + 43:c6:10:29:c1:fc:55:40:72:ee:bd:ea:df:9f:b6: + 41:f4:48:4b:c8:6e:fe:4f:57:12:8b:5b:fa:92:dd: + 5e:e8:ad:f3:f0:1b:b1:7b:4d:fb:cf:fd:d1:e5:f8: + e3:dc:e7:f5:73:7f:df:01:49:cf:8c:56:c1:bd:37: + e3:5b:be:b5:4f:8b:8b:f0:da:4f:c7:e3:dd:55:47: + 69:df:f2:5b:7b:07:4f:3d:e5:ac:21:c1:c8:1d:7a: + e8:e7:f6:0f:a1:aa:f5:6f:de:a8:65:4f:10:89:9c: + 03:f3:89:7a:a5:5e:01:72:33:ed:a9:e9:5a:1e:79: + f3:87:c8:df:c8:c5:fc:37:c8:9a:9a:d7:b8:76:cc: + b0:3e:e7:fd:e6:54:ea:df:5f:52:41:78:59:57:ad: + f1:12:d6:7f:bc:d5:9f:70:d3:05:6c:fa:a3:7d:67: + 58:dd:26:62:1d:31:92:0c:79:79:1c:8e:cf:ca:7b: + c1:66:af:a8:74:48:fb:8e:82:c2:9e:2c:99:5c:7b: + 2d:5d:9b:bc:5b:57:9e:7c:3a:7a:13:ad:f2:a3:18: + 5b:2b:59:0f:cd:5c:3a:eb:68:33:c6:28:1d:82:d1: + 50:8b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Subject Key Identifier: + 6B:69:3D:6A:18:42:4A:DD:8F:02:65:39:FD:35:24:86:78:91:16:30 + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 CRL Distribution Points: + URI:http://crl.geotrust.com/crls/gtglobal.crl + + Authority Information Access: + OCSP - URI:http://ocsp.geotrust.com + + Signature Algorithm: sha1WithRSAEncryption + ab:bc:bc:0a:5d:18:94:e3:c1:b1:c3:a8:4c:55:d6:be:b4:98: + f1:ee:3c:1c:cd:cf:f3:24:24:5c:96:03:27:58:fc:36:ae:a2: + 2f:8f:f1:fe:da:2b:02:c3:33:bd:c8:dd:48:22:2b:60:0f:a5: + 03:10:fd:77:f8:d0:ed:96:67:4f:fd:ea:47:20:70:54:dc:a9: + 0c:55:7e:e1:96:25:8a:d9:b5:da:57:4a:be:8d:8e:49:43:63: + a5:6c:4e:27:87:25:eb:5b:6d:fe:a2:7f:38:28:e0:36:ab:ad: + 39:a5:a5:62:c4:b7:5c:58:2c:aa:5d:01:60:a6:62:67:a3:c0: + c7:62:23:f4:e7:6c:46:ee:b5:d3:80:6a:22:13:d2:2d:3f:74: + 4f:ea:af:8c:5f:b4:38:9c:db:ae:ce:af:84:1e:a6:f6:34:51: + 59:79:d3:e3:75:dc:bc:d7:f3:73:df:92:ec:d2:20:59:6f:9c: + fb:95:f8:92:76:18:0a:7c:0f:2c:a6:ca:de:8a:62:7b:d8:f3: + ce:5f:68:bd:8f:3e:c1:74:bb:15:72:3a:16:83:a9:0b:e6:4d: + 99:9c:d8:57:ec:a8:01:51:c7:6f:57:34:5e:ab:4a:2c:42:f6: + 4f:1c:89:78:de:26:4e:f5:6f:93:4c:15:6b:27:56:4d:00:54: + 6c:7a:b7:b7 +-----BEGIN CERTIFICATE----- +MIID1TCCAr2gAwIBAgIDAjbRMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMTAwMjE5MjI0NTA1WhcNMjAwMjE4MjI0NTA1WjA8MQswCQYDVQQG +EwJVUzEXMBUGA1UEChMOR2VvVHJ1c3QsIEluYy4xFDASBgNVBAMTC1JhcGlkU1NM +IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3H4Vsce2cy1rfa0 +l6P7oeYLUF9QqjraD/w9KSRDxhApwfxVQHLuverfn7ZB9EhLyG7+T1cSi1v6kt1e +6K3z8Buxe037z/3R5fjj3Of1c3/fAUnPjFbBvTfjW761T4uL8NpPx+PdVUdp3/Jb +ewdPPeWsIcHIHXro5/YPoar1b96oZU8QiZwD84l6pV4BcjPtqelaHnnzh8jfyMX8 +N8iamte4dsywPuf95lTq319SQXhZV63xEtZ/vNWfcNMFbPqjfWdY3SZiHTGSDHl5 +HI7PynvBZq+odEj7joLCniyZXHstXZu8W1eefDp6E63yoxhbK1kPzVw662gzxigd +gtFQiwIDAQABo4HZMIHWMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUa2k9ahhC +St2PAmU5/TUkhniRFjAwHwYDVR0jBBgwFoAUwHqYaI2J+6sFZAwRfap9ZbjKzE4w +EgYDVR0TAQH/BAgwBgEB/wIBADA6BgNVHR8EMzAxMC+gLaArhilodHRwOi8vY3Js +Lmdlb3RydXN0LmNvbS9jcmxzL2d0Z2xvYmFsLmNybDA0BggrBgEFBQcBAQQoMCYw +JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmdlb3RydXN0LmNvbTANBgkqhkiG9w0B +AQUFAAOCAQEAq7y8Cl0YlOPBscOoTFXWvrSY8e48HM3P8yQkXJYDJ1j8Nq6iL4/x +/torAsMzvcjdSCIrYA+lAxD9d/jQ7ZZnT/3qRyBwVNypDFV+4ZYlitm12ldKvo2O +SUNjpWxOJ4cl61tt/qJ/OCjgNqutOaWlYsS3XFgsql0BYKZiZ6PAx2Ij9OdsRu61 +04BqIhPSLT90T+qvjF+0OJzbrs6vhB6m9jRRWXnT43XcvNfzc9+S7NIgWW+c+5X4 +knYYCnwPLKbK3opie9jzzl9ovY8+wXS7FXI6FoOpC+ZNmZzYV+yoAVHHb1c0XqtK +LEL2TxyJeN4mTvVvk0wVaydWTQBUbHq3tw== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 144470 (0x23456) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Validity + Not Before: May 21 04:00:00 2002 GMT + Not After : May 21 04:00:00 2022 GMT + Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df: + 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8: + 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29: + bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4: + 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3: + ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92: + 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d: + 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14: + 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd: + d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6: + d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5: + 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39: + 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05: + 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2: + fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32: + eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07: + 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b: + e4:f9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + X509v3 Authority Key Identifier: + keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E + + Signature Algorithm: sha1WithRSAEncryption + 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f: + 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf: + dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb: + 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2: + b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20: + 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5: + ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db: + 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f: + b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1: + c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52: + b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9: + 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5: + e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17: + b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80: + a1:cb:e6:33 +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 03:37:b9:28:34:7c:60:a6:ae:c5:ad:b1:21:7f:38:60 + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Nov 9 12:00:00 2007 GMT + Not After : Nov 10 00:00:00 2021 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV CA-1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:f3:96:62:d8:75:6e:19:ff:3f:34:7c:49:4f:31: + 7e:0d:04:4e:99:81:e2:b3:85:55:91:30:b1:c0:af: + 70:bb:2c:a8:e7:18:aa:3f:78:f7:90:68:52:86:01: + 88:97:e2:3b:06:65:90:aa:bd:65:76:c2:ec:be:10: + 5b:37:78:83:60:75:45:c6:bd:74:aa:b6:9f:a4:3a: + 01:50:17:c4:39:69:b9:f1:4f:ef:82:c1:ca:f3:4a: + db:cc:9e:50:4f:4d:40:a3:3a:90:e7:86:66:bc:f0: + 3e:76:28:4c:d1:75:80:9e:6a:35:14:35:03:9e:db: + 0c:8c:c2:28:ad:50:b2:ce:f6:91:a3:c3:a5:0a:58: + 49:f6:75:44:6c:ba:f9:ce:e9:ab:3a:02:e0:4d:f3: + ac:e2:7a:e0:60:22:05:3c:82:d3:52:e2:f3:9c:47: + f8:3b:d8:b2:4b:93:56:4a:bf:70:ab:3e:e9:68:c8: + 1d:8f:58:1d:2a:4d:5e:27:3d:ad:0a:59:2f:5a:11: + 20:40:d9:68:04:68:2d:f4:c0:84:0b:0a:1b:78:df: + ed:1a:58:dc:fb:41:5a:6d:6b:f2:ed:1c:ee:5c:32: + b6:5c:ec:d7:a6:03:32:a6:e8:de:b7:28:27:59:88: + 80:ff:7b:ad:89:58:d5:1e:14:a4:f2:b0:70:d4:a0: + 3e:a7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, Code Signing, E-mail Protection, Time Stamping + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.2.1 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + CA Issuers - URI:http://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt + + X509v3 CRL Distribution Points: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Subject Key Identifier: + 4C:58:CB:25:F0:41:4F:52:F4:28:C8:81:43:9B:A6:A8:A0:E6:92:E5 + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + Signature Algorithm: sha1WithRSAEncryption + 4c:7a:17:87:28:5d:17:bc:b2:32:73:bf:cd:2e:f5:58:31:1d: + f0:b1:71:54:9c:d6:9b:67:93:db:2f:03:3e:16:6f:1e:03:c9: + 53:84:a3:56:60:1e:78:94:1b:a2:a8:6f:a3:a4:8b:52:91:d7: + dd:5c:95:bb:ef:b5:16:49:e9:a5:42:4f:34:f2:47:ff:ae:81: + 7f:13:54:b7:20:c4:70:15:cb:81:0a:81:cb:74:57:dc:9c:df: + 24:a4:29:0c:18:f0:1c:e4:ae:07:33:ec:f1:49:3e:55:cf:6e: + 4f:0d:54:7b:d3:c9:e8:15:48:d4:c5:bb:dc:35:1c:77:45:07: + 48:45:85:bd:d7:7e:53:b8:c0:16:d9:95:cd:8b:8d:7d:c9:60: + 4f:d1:a2:9b:e3:d0:30:d6:b4:73:36:e6:d2:f9:03:b2:e3:a4: + f5:e5:b8:3e:04:49:00:ba:2e:a6:4a:72:83:72:9d:f7:0b:8c: + a9:89:e7:b3:d7:64:1f:d6:e3:60:cb:03:c4:dc:88:e9:9d:25: + 01:00:71:cb:03:b4:29:60:25:8f:f9:46:d1:7b:71:ae:cd:53: + 12:5b:84:8e:c2:0f:c7:ed:93:19:d9:c9:fa:8f:58:34:76:32: + 2f:ae:e1:50:14:61:d4:a8:58:a3:c8:30:13:23:ef:c6:25:8c: + 36:8f:1c:80 +-----BEGIN CERTIFICATE----- +MIIG5jCCBc6gAwIBAgIQAze5KDR8YKauxa2xIX84YDANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA3MTEwOTEyMDAwMFoXDTIxMTExMDAwMDAwMFowaTEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTEoMCYGA1UEAxMfRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPOWYth1bhn/ +PzR8SU8xfg0ETpmB4rOFVZEwscCvcLssqOcYqj9495BoUoYBiJfiOwZlkKq9ZXbC +7L4QWzd4g2B1Rca9dKq2n6Q6AVAXxDlpufFP74LByvNK28yeUE9NQKM6kOeGZrzw +PnYoTNF1gJ5qNRQ1A57bDIzCKK1Qss72kaPDpQpYSfZ1RGy6+c7pqzoC4E3zrOJ6 +4GAiBTyC01Li85xH+DvYskuTVkq/cKs+6WjIHY9YHSpNXic9rQpZL1oRIEDZaARo +LfTAhAsKG3jf7RpY3PtBWm1r8u0c7lwytlzs16YDMqbo3rcoJ1mIgP97rYlY1R4U +pPKwcNSgPqcCAwEAAaOCA4UwggOBMA4GA1UdDwEB/wQEAwIBhjA7BgNVHSUENDAy +BggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUH +AwgwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5o +dG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0 +AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1 +AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABp +AGcAaQBDAGUAcgB0ACAARQBWACAAQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBl +AGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBo +AGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAg +AGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAg +AGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wEgYDVR0TAQH/BAgwBgEB/wIBADCB +gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy +dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NBQ2Vy +dHMvRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0MIGPBgNVHR8EgYcw +gYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hB +c3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0 +LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHQYDVR0OBBYE +FExYyyXwQU9S9CjIgUObpqig5pLlMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoI +Au9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQBMeheHKF0XvLIyc7/NLvVYMR3wsXFU +nNabZ5PbLwM+Fm8eA8lThKNWYB54lBuiqG+jpItSkdfdXJW777UWSemlQk808kf/ +roF/E1S3IMRwFcuBCoHLdFfcnN8kpCkMGPAc5K4HM+zxST5Vz25PDVR708noFUjU +xbvcNRx3RQdIRYW9135TuMAW2ZXNi419yWBP0aKb49Aw1rRzNubS+QOy46T15bg+ +BEkAui6mSnKDcp33C4ypieez12Qf1uNgywPE3IjpnSUBAHHLA7QpYCWP+UbRe3Gu +zVMSW4SOwg/H7ZMZ2cn6j1g0djIvruFQFGHUqFijyDATI+/GJYw2jxyA +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1116160165 (0x428740a5) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: Oct 1 05:00:00 2006 GMT + Not After : Jul 26 18:15:15 2014 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: + e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: + a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: + a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: + cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: + 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: + f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: + 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: + be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: + ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: + 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: + 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: + 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: + 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: + 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: + a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: + 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: + 4b:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection + Authority Information Access: + OCSP - URI:http://ocsp.entrust.net + + X509v3 CRL Distribution Points: + URI:http://crl.entrust.net/server1.crl + + X509v3 Subject Key Identifier: + B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + 1.2.840.113533.7.65.0: + 0 +..V7.1.... + Signature Algorithm: sha1WithRSAEncryption + 48:0e:2b:6f:20:62:4c:28:93:a3:24:3d:58:ab:21:cf:80:f8: + 9a:97:90:6a:22:ed:5a:7c:47:36:99:e7:79:84:75:ab:24:8f: + 92:0a:d5:61:04:ae:c3:6a:5c:b2:cc:d9:e4:44:87:6f:db:8f: + 38:62:f7:44:36:9d:ba:bc:6e:07:c4:d4:8d:e8:1f:d1:0b:60: + a3:b5:9c:ce:63:be:ed:67:dc:f8:ba:de:6e:c9:25:cb:5b:b5: + 9d:76:70:0b:df:42:72:f8:4f:41:11:64:a5:d2:ea:fc:d5:af: + 11:f4:15:38:67:9c:20:a8:4b:77:5a:91:32:42:32:e7:85:b3: + df:36 +-----BEGIN CERTIFICATE----- +MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw +MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV +BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD +1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt +cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 +OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd +HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm +t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET +MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo +dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v +Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU +mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 +UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF +BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu +w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1 +nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 927650371 (0x374ad243) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: May 25 16:09:40 1999 GMT + Not After : May 25 16:39:40 2019 GMT + Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cd:28:83:34:54:1b:89:f3:0f:af:37:91:31:ff: + af:31:60:c9:a8:e8:b2:10:68:ed:9f:e7:93:36:f1: + 0a:64:bb:47:f5:04:17:3f:23:47:4d:c5:27:19:81: + 26:0c:54:72:0d:88:2d:d9:1f:9a:12:9f:bc:b3:71: + d3:80:19:3f:47:66:7b:8c:35:28:d2:b9:0a:df:24: + da:9c:d6:50:79:81:7a:5a:d3:37:f7:c2:4a:d8:29: + 92:26:64:d1:e4:98:6c:3a:00:8a:f5:34:9b:65:f8: + ed:e3:10:ff:fd:b8:49:58:dc:a0:de:82:39:6b:81: + b1:16:19:61:b9:54:b6:e6:43 + Exponent: 3 (0x3) + X509v3 extensions: + Netscape Cert Type: + SSL CA, S/MIME CA, Object Signing CA + X509v3 CRL Distribution Points: + DirName:/C=US/O=Entrust.net/OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Secure Server Certification Authority/CN=CRL1 + URI:http://www.entrust.net/CRL/net1.crl + + X509v3 Private Key Usage Period: + Not Before: May 25 16:09:40 1999 GMT, Not After: May 25 16:09:40 2019 GMT + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + X509v3 Subject Key Identifier: + F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + X509v3 Basic Constraints: + CA:TRUE + 1.2.840.113533.7.65.0: + 0 +..V4.0.... + Signature Algorithm: sha1WithRSAEncryption + 90:dc:30:02:fa:64:74:c2:a7:0a:a5:7c:21:8d:34:17:a8:fb: + 47:0e:ff:25:7c:8d:13:0a:fb:e4:98:b5:ef:8c:f8:c5:10:0d: + f7:92:be:f1:c3:d5:d5:95:6a:04:bb:2c:ce:26:36:65:c8:31: + c6:e7:ee:3f:e3:57:75:84:7a:11:ef:46:4f:18:f4:d3:98:bb: + a8:87:32:ba:72:f6:3c:e2:3d:9f:d7:1d:d9:c3:60:43:8c:58: + 0e:22:96:2f:62:a3:2c:1f:ba:ad:05:ef:ab:32:78:87:a0:54: + 73:19:b5:5c:05:f9:52:3e:6d:2d:45:0b:f7:0a:93:ea:ed:06: + f9:b2 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0a:5f:11:4d:03:5b:17:91:17:d2:ef:d4:03:8c:3f:3b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Apr 2 12:00:00 2008 GMT + Not After : Apr 3 00:00:00 2022 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:bf:61:0a:29:10:1f:5e:fe:34:37:51:08:f8:1e: + fb:22:ed:61:be:0b:0d:70:4c:50:63:26:75:15:b9: + 41:88:97:b6:f0:a0:15:bb:08:60:e0:42:e8:05:29: + 10:87:36:8a:28:65:a8:ef:31:07:74:6d:36:97:2f: + 28:46:66:04:c7:2a:79:26:7a:99:d5:8e:c3:6d:4f: + a0:5e:ad:bc:3d:91:c2:59:7b:5e:36:6c:c0:53:cf: + 00:08:32:3e:10:64:58:10:13:69:c7:0c:ee:9c:42: + 51:00:f9:05:44:ee:24:ce:7a:1f:ed:8c:11:bd:12: + a8:f3:15:f4:1c:7a:31:69:01:1b:a7:e6:5d:c0:9a: + 6c:7e:09:9e:e7:52:44:4a:10:3a:23:e4:9b:b6:03: + af:a8:9c:b4:5b:9f:d4:4b:ad:92:8c:ce:b5:11:2a: + aa:37:18:8d:b4:c2:b8:d8:5c:06:8c:f8:ff:23:bd: + 35:5e:d4:7c:3e:7e:83:0e:91:96:05:98:c3:b2:1f: + e3:c8:65:eb:a9:7b:5d:a0:2c:cc:fc:3c:d9:6d:ed: + cc:fa:4b:43:8c:c9:d4:b8:a5:61:1c:b2:40:b6:28: + 12:df:b9:f8:5f:fe:d3:b2:c9:ef:3d:b4:1e:4b:7c: + 1c:4c:99:36:9e:3d:eb:ec:a7:68:5e:1d:df:67:6e: + 5e:fb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.1.3.0.2 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + + X509v3 CRL Distribution Points: + + Full Name: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + Full Name: + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + X509v3 Subject Key Identifier: + 50:EA:73:89:DB:29:FB:10:8F:9E:E5:01:20:D4:DE:79:99:48:83:F7 + Signature Algorithm: sha1WithRSAEncryption + 1e:e2:a5:48:9e:6c:db:53:38:0f:ef:a6:1a:2a:ac:e2:03:43: + ed:9a:bc:3e:8e:75:1b:f0:fd:2e:22:59:ac:13:c0:61:e2:e7: + fa:e9:99:cd:87:09:75:54:28:bf:46:60:dc:be:51:2c:92:f3: + 1b:91:7c:31:08:70:e2:37:b9:c1:5b:a8:bd:a3:0b:00:fb:1a: + 15:fd:03:ad:58:6a:c5:c7:24:99:48:47:46:31:1e:92:ef:b4: + 5f:4e:34:c7:90:bf:31:c1:f8:b1:84:86:d0:9c:01:aa:df:8a: + 56:06:ce:3a:e9:0e:ae:97:74:5d:d7:71:9a:42:74:5f:de:8d: + 43:7c:de:e9:55:ed:69:00:cb:05:e0:7a:61:61:33:d1:19:4d: + f9:08:ee:a0:39:c5:25:35:b7:2b:c4:0f:b2:dd:f1:a5:b7:0e: + 24:c4:26:28:8d:79:77:f5:2f:f0:57:ba:7c:07:d4:e1:fc:cd: + 5a:30:57:7e:86:10:47:dd:31:1f:d7:fc:a2:c2:bf:30:7c:5d: + 24:aa:e8:f9:ae:5f:6a:74:c2:ce:6b:b3:46:d8:21:be:29:d4: + 8e:5e:15:d6:42:4a:e7:32:6f:a4:b1:6b:51:83:58:be:3f:6d: + c7:fb:da:03:21:cb:6a:16:19:4e:0a:f0:ad:84:ca:5d:94:b3: + 5a:76:f7:61 +-----BEGIN CERTIFICATE----- +MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR +CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv +KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 +BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf +1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs +zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d +32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w +ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 +LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH +AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy +AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj +AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg +AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ +AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt +AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj +AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl +AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm +MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB +hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME +GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB +INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a +vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j +CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X +dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE +JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY +Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 new file mode 100644 index 0000000..4ebe436 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/certs/d867a7b2aecc46f9c31afc4f2f50de05 @@ -0,0 +1,197 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 0a:5f:11:4d:03:5b:17:91:17:d2:ef:d4:03:8c:3f:3b + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Validity + Not Before: Apr 2 12:00:00 2008 GMT + Not After : Apr 3 00:00:00 2022 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance CA-3 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:bf:61:0a:29:10:1f:5e:fe:34:37:51:08:f8:1e: + fb:22:ed:61:be:0b:0d:70:4c:50:63:26:75:15:b9: + 41:88:97:b6:f0:a0:15:bb:08:60:e0:42:e8:05:29: + 10:87:36:8a:28:65:a8:ef:31:07:74:6d:36:97:2f: + 28:46:66:04:c7:2a:79:26:7a:99:d5:8e:c3:6d:4f: + a0:5e:ad:bc:3d:91:c2:59:7b:5e:36:6c:c0:53:cf: + 00:08:32:3e:10:64:58:10:13:69:c7:0c:ee:9c:42: + 51:00:f9:05:44:ee:24:ce:7a:1f:ed:8c:11:bd:12: + a8:f3:15:f4:1c:7a:31:69:01:1b:a7:e6:5d:c0:9a: + 6c:7e:09:9e:e7:52:44:4a:10:3a:23:e4:9b:b6:03: + af:a8:9c:b4:5b:9f:d4:4b:ad:92:8c:ce:b5:11:2a: + aa:37:18:8d:b4:c2:b8:d8:5c:06:8c:f8:ff:23:bd: + 35:5e:d4:7c:3e:7e:83:0e:91:96:05:98:c3:b2:1f: + e3:c8:65:eb:a9:7b:5d:a0:2c:cc:fc:3c:d9:6d:ed: + cc:fa:4b:43:8c:c9:d4:b8:a5:61:1c:b2:40:b6:28: + 12:df:b9:f8:5f:fe:d3:b2:c9:ef:3d:b4:1e:4b:7c: + 1c:4c:99:36:9e:3d:eb:ec:a7:68:5e:1d:df:67:6e: + 5e:fb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Certificate Policies: + Policy: 2.16.840.1.114412.1.3.0.2 + CPS: http://www.digicert.com/ssl-cps-repository.htm + User Notice: + Explicit Text: + + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + Authority Information Access: + OCSP - URI:http://ocsp.digicert.com + + X509v3 CRL Distribution Points: + URI:http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl + URI:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl + + X509v3 Authority Key Identifier: + keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + + X509v3 Subject Key Identifier: + 50:EA:73:89:DB:29:FB:10:8F:9E:E5:01:20:D4:DE:79:99:48:83:F7 + Signature Algorithm: sha1WithRSAEncryption + 1e:e2:a5:48:9e:6c:db:53:38:0f:ef:a6:1a:2a:ac:e2:03:43: + ed:9a:bc:3e:8e:75:1b:f0:fd:2e:22:59:ac:13:c0:61:e2:e7: + fa:e9:99:cd:87:09:75:54:28:bf:46:60:dc:be:51:2c:92:f3: + 1b:91:7c:31:08:70:e2:37:b9:c1:5b:a8:bd:a3:0b:00:fb:1a: + 15:fd:03:ad:58:6a:c5:c7:24:99:48:47:46:31:1e:92:ef:b4: + 5f:4e:34:c7:90:bf:31:c1:f8:b1:84:86:d0:9c:01:aa:df:8a: + 56:06:ce:3a:e9:0e:ae:97:74:5d:d7:71:9a:42:74:5f:de:8d: + 43:7c:de:e9:55:ed:69:00:cb:05:e0:7a:61:61:33:d1:19:4d: + f9:08:ee:a0:39:c5:25:35:b7:2b:c4:0f:b2:dd:f1:a5:b7:0e: + 24:c4:26:28:8d:79:77:f5:2f:f0:57:ba:7c:07:d4:e1:fc:cd: + 5a:30:57:7e:86:10:47:dd:31:1f:d7:fc:a2:c2:bf:30:7c:5d: + 24:aa:e8:f9:ae:5f:6a:74:c2:ce:6b:b3:46:d8:21:be:29:d4: + 8e:5e:15:d6:42:4a:e7:32:6f:a4:b1:6b:51:83:58:be:3f:6d: + c7:fb:da:03:21:cb:6a:16:19:4e:0a:f0:ad:84:ca:5d:94:b3: + 5a:76:f7:61 +-----BEGIN CERTIFICATE----- +MIIGWDCCBUCgAwIBAgIQCl8RTQNbF5EX0u/UA4w/OzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA4MDQwMjEyMDAwMFoXDTIyMDQwMzAwMDAwMFowZjEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTElMCMGA1UEAxMcRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +Q0EtMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9hCikQH17+NDdR +CPge+yLtYb4LDXBMUGMmdRW5QYiXtvCgFbsIYOBC6AUpEIc2iihlqO8xB3RtNpcv +KEZmBMcqeSZ6mdWOw21PoF6tvD2Rwll7XjZswFPPAAgyPhBkWBATaccM7pxCUQD5 +BUTuJM56H+2MEb0SqPMV9Bx6MWkBG6fmXcCabH4JnudSREoQOiPkm7YDr6ictFuf +1EutkozOtREqqjcYjbTCuNhcBoz4/yO9NV7UfD5+gw6RlgWYw7If48hl66l7XaAs +zPw82W3tzPpLQ4zJ1LilYRyyQLYoEt+5+F/+07LJ7z20Hkt8HEyZNp496+ynaF4d +32duXvsCAwEAAaOCAvowggL2MA4GA1UdDwEB/wQEAwIBhjCCAcYGA1UdIASCAb0w +ggG5MIIBtQYLYIZIAYb9bAEDAAIwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3 +LmRpZ2ljZXJ0LmNvbS9zc2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUH +AgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQBy +AHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBj +AGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAg +AEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQ +AGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBt +AGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBj +AG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBl +AHIAZQBuAGMAZQAuMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm +MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wgY8GA1UdHwSB +hzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDovL2NybDQuZGlnaWNl +cnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDAfBgNVHSME +GDAWgBSxPsNpA/i/RwHUmCYaCALvY2QrwzAdBgNVHQ4EFgQUUOpzidsp+xCPnuUB +INTeeZlIg/cwDQYJKoZIhvcNAQEFBQADggEBAB7ipUiebNtTOA/vphoqrOIDQ+2a +vD6OdRvw/S4iWawTwGHi5/rpmc2HCXVUKL9GYNy+USyS8xuRfDEIcOI3ucFbqL2j +CwD7GhX9A61YasXHJJlIR0YxHpLvtF9ONMeQvzHB+LGEhtCcAarfilYGzjrpDq6X +dF3XcZpCdF/ejUN83ulV7WkAywXgemFhM9EZTfkI7qA5xSU1tyvED7Ld8aW3DiTE +JiiNeXf1L/BXunwH1OH8zVowV36GEEfdMR/X/KLCvzB8XSSq6PmuX2p0ws5rs0bY +Ib4p1I5eFdZCSucyb6Sxa1GDWL4/bcf72gMhy2oWGU4K8K2Eyl2Us1p292E= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1116160165 (0x428740a5) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority + Validity + Not Before: Oct 1 05:00:00 2006 GMT + Not After : Jul 26 18:15:15 2014 GMT + Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (2048 bit) + Modulus (2048 bit): + 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: + e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: + a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: + a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: + cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: + 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: + f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: + 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: + be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: + ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: + 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: + 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: + 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: + 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: + 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: + a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: + 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: + 4b:cb + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection + Authority Information Access: + OCSP - URI:http://ocsp.entrust.net + + X509v3 CRL Distribution Points: + URI:http://crl.entrust.net/server1.crl + + X509v3 Subject Key Identifier: + B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 + X509v3 Key Usage: + Certificate Sign, CRL Sign + X509v3 Authority Key Identifier: + keyid:F0:17:62:13:55:3D:B3:FF:0A:00:6B:FB:50:84:97:F3:ED:62:D0:1A + + 1.2.840.113533.7.65.0: + 0 +..V7.1.... + Signature Algorithm: sha1WithRSAEncryption + 48:0e:2b:6f:20:62:4c:28:93:a3:24:3d:58:ab:21:cf:80:f8: + 9a:97:90:6a:22:ed:5a:7c:47:36:99:e7:79:84:75:ab:24:8f: + 92:0a:d5:61:04:ae:c3:6a:5c:b2:cc:d9:e4:44:87:6f:db:8f: + 38:62:f7:44:36:9d:ba:bc:6e:07:c4:d4:8d:e8:1f:d1:0b:60: + a3:b5:9c:ce:63:be:ed:67:dc:f8:ba:de:6e:c9:25:cb:5b:b5: + 9d:76:70:0b:df:42:72:f8:4f:41:11:64:a5:d2:ea:fc:d5:af: + 11:f4:15:38:67:9c:20:a8:4b:77:5a:91:32:42:32:e7:85:b3: + df:36 +-----BEGIN CERTIFICATE----- +MIIEQjCCA6ugAwIBAgIEQodApTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEw +MDEwNTAwMDBaFw0xNDA3MjYxODE1MTVaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV +BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD +1ZQ0Z6IKHLBfaaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80lt +cZF+Y7arpl/DpIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46 +OFBbdzEbjbPHJEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZd +HFMsfpjNGgYWpGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdm +t4i3ePLKCqg4qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjggET +MIIBDzASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggr +BgEFBQcDAgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdo +dHRwOi8vb2NzcC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v +Y3JsLmVudHJ1c3QubmV0L3NlcnZlcjEuY3JsMB0GA1UdDgQWBBSxPsNpA/i/RwHU +mCYaCALvY2QrwzALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7 +UISX8+1i0BowGQYJKoZIhvZ9B0EABAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEF +BQADgYEASA4rbyBiTCiToyQ9WKshz4D4mpeQaiLtWnxHNpnneYR1qySPkgrVYQSu +w2pcsszZ5ESHb9uPOGL3RDadurxuB8TUjegf0Qtgo7WczmO+7Wfc+Lrebskly1u1 +nXZwC99CcvhPQRFkpdLq/NWvEfQVOGecIKhLd1qRMkIy54Wz3zY= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json new file mode 100644 index 0000000..09c7626 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-messages.json @@ -0,0 +1,5 @@ +{ + "install": "messages/install.txt", + "1.1.1": "messages/1.1.1.txt", + "1.2.0": "messages/1.2.0.txt" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json new file mode 100644 index 0000000..96945cc --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-packages.json @@ -0,0 +1,54 @@ +{ + "schema_version": "1.2", + "packages": [ + { + "name": "GitHub Example", + "description": "An example from GitHub, be sure to use the zipball URL", + "author": "John Smith", + "homepage": "http://example.com", + "last_modified": "2011-12-12 05:04:31", + "platforms": { + "*": [ + { + "version": "1.1", + "url": "http://nodeload.github.com/john_smith/github_example/zipball/master" + } + ] + } + }, + { + "name": "BitBucket Example", + "description": "An example from BitBucket, be sure to use the zip URL", + "author": "John Smith", + "homepage": "http://example.com", + "last_modified": "2011-08-12 12:21:09", + "platforms": { + "*": [ + { + "version": "1.0", + "url": "https://bitbucket.org/john_smith/bitbucket_example/get/tip.zip" + } + ] + } + }, + { + "name": "Tortoise", + "description": "Keyboard shortcuts and menu entries to execute TortoiseSVN, TortoiseHg and TortoiseGit commands", + "author": "Will Bond", + "homepage": "http://sublime.wbond.net", + "last_modified": "2011-11-30 22:55:52", + "platforms": { + "windows": [ + { + "version": "1.0", + "url": "http://sublime.wbond.net/Tortoise.sublime-package" + } + ] + } + } + ], + "renamed_packages": { + "sublime-old-package": "NewPackage", + "OldPackage": "NewName" + } +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json new file mode 100644 index 0000000..9e03b1e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/example-repositories.json @@ -0,0 +1,60 @@ +{ + "schema_version": "1.2", + "repositories": [ + "http://sublime.wbond.net/packages.json", + "https://github.com/buymeasoda/soda-theme", + "https://github.com/SublimeText" + ], + "package_name_map": { + "soda-theme": "Theme - Soda" + }, + "renamed_packages": { + "old-name": "New Name" + }, + "packages": { + "http://sublime.wbond.net/packages.json": [ + { + "name": "GitHub Example", + "description": "An example from GitHub, be sure to use the zipball URL", + "author": "John Smith", + "homepage": "http://example.com", + "platforms": { + "*": [ + { + "version": "1.1", + "url": "http://nodeload.github.com/john_smith/github_example/zipball/master" + } + ] + } + }, + { + "name": "BitBucket Example", + "description": "An example from BitBucket, be sure to use the zip URL", + "author": "John Smith", + "homepage": "http://example.com", + "platforms": { + "*": [ + { + "version": "1.0", + "url": "https://bitbucket.org/john_smith/bitbucket_example/get/tip.zip" + } + ] + } + }, + { + "name": "Tortoise", + "description": "Keyboard shortcuts and menu entries to execute TortoiseSVN, TortoiseHg and TortoiseGit commands", + "author": "Will Bond", + "homepage": "http://sublime.wbond.net", + "platforms": { + "windows": [ + { + "version": "1.0", + "url": "http://sublime.wbond.net/Tortoise.sublime-package" + } + ] + } + } + ] + } +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py new file mode 100644 index 0000000..73d4ea2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/all/semver.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# This code is copyright Konstantine Rybnikov , and is +# available at https://github.com/k-bx/python-semver and is licensed under the +# BSD License + +import re + +_REGEX = re.compile('^(?P[0-9]+)' + '\.(?P[0-9]+)' + '\.(?P[0-9]+)' + '(\-(?P[0-9A-Za-z]+(\.[0-9A-Za-z]+)*))?' + '(\+(?P[0-9A-Za-z]+(\.[0-9A-Za-z]+)*))?$') + +if 'cmp' not in __builtins__: + cmp = lambda a,b: (a > b) - (a < b) + +def parse(version): + """ + Parse version to major, minor, patch, pre-release, build parts. + """ + match = _REGEX.match(version) + if match is None: + raise ValueError('%s is not valid SemVer string' % version) + + verinfo = match.groupdict() + + verinfo['major'] = int(verinfo['major']) + verinfo['minor'] = int(verinfo['minor']) + verinfo['patch'] = int(verinfo['patch']) + + return verinfo + + +def compare(ver1, ver2): + def nat_cmp(a, b): + a, b = a or '', b or '' + convert = lambda text: text.isdigit() and int(text) or text.lower() + alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] + return cmp(alphanum_key(a), alphanum_key(b)) + + def compare_by_keys(d1, d2): + for key in ['major', 'minor', 'patch']: + v = cmp(d1.get(key), d2.get(key)) + if v: + return v + rc1, rc2 = d1.get('prerelease'), d2.get('prerelease') + build1, build2 = d1.get('build'), d2.get('build') + rccmp = nat_cmp(rc1, rc2) + buildcmp = nat_cmp(build1, build2) + if not (rc1 or rc2): + return buildcmp + elif not rc1: + return 1 + elif not rc2: + return -1 + return rccmp or buildcmp or 0 + + v1, v2 = parse(ver1), parse(ver2) + + return compare_by_keys(v1, v2) + + +def match(version, match_expr): + prefix = match_expr[:2] + if prefix in ('>=', '<=', '=='): + match_version = match_expr[2:] + elif prefix and prefix[0] in ('>', '<', '='): + prefix = prefix[0] + match_version = match_expr[1:] + else: + raise ValueError("match_expr parameter should be in format , " + "where is one of ['<', '>', '==', '<=', '>=']. " + "You provided: %r" % match_expr) + + possibilities_dict = { + '>': (1,), + '<': (-1,), + '==': (0,), + '>=': (0, 1), + '<=': (-1, 0) + } + + possibilities = possibilities_dict[prefix] + cmp_res = compare(version, match_version) + + return cmp_res in possibilities \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py new file mode 100644 index 0000000..7b3e4c8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/U32.py @@ -0,0 +1,113 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + + +C = 0x1000000000L + +def norm(n): + return n & 0xFFFFFFFFL + + +class U32: + v = 0L + + def __init__(self, value = 0): + self.v = C + norm(abs(long(value))) + + def set(self, value = 0): + self.v = C + norm(abs(long(value))) + + def __repr__(self): + return hex(norm(self.v)) + + def __long__(self): return long(norm(self.v)) + def __int__(self): return int(norm(self.v)) + def __chr__(self): return chr(norm(self.v)) + + def __add__(self, b): + r = U32() + r.v = C + norm(self.v + b.v) + return r + + def __sub__(self, b): + r = U32() + if self.v < b.v: + r.v = C + norm(0x100000000L - (b.v - self.v)) + else: r.v = C + norm(self.v - b.v) + return r + + def __mul__(self, b): + r = U32() + r.v = C + norm(self.v * b.v) + return r + + def __div__(self, b): + r = U32() + r.v = C + (norm(self.v) / norm(b.v)) + return r + + def __mod__(self, b): + r = U32() + r.v = C + (norm(self.v) % norm(b.v)) + return r + + def __neg__(self): return U32(self.v) + def __pos__(self): return U32(self.v) + def __abs__(self): return U32(self.v) + + def __invert__(self): + r = U32() + r.v = C + norm(~self.v) + return r + + def __lshift__(self, b): + r = U32() + r.v = C + norm(self.v << b) + return r + + def __rshift__(self, b): + r = U32() + r.v = C + (norm(self.v) >> b) + return r + + def __and__(self, b): + r = U32() + r.v = C + norm(self.v & b.v) + return r + + def __or__(self, b): + r = U32() + r.v = C + norm(self.v | b.v) + return r + + def __xor__(self, b): + r = U32() + r.v = C + norm(self.v ^ b.v) + return r + + def __not__(self): + return U32(not norm(self.v)) + + def truth(self): + return norm(self.v) + + def __cmp__(self, b): + if norm(self.v) > norm(b.v): return 1 + elif norm(self.v) < norm(b.v): return -1 + else: return 0 + + def __nonzero__(self): + return norm(self.v) \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py new file mode 100644 index 0000000..6a59964 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des.py @@ -0,0 +1,92 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +import des_c + +#--------------------------------------------------------------------- +class DES: + + des_c_obj = None + + #----------------------------------------------------------------- + def __init__(self, key_str): + "" + k = str_to_key56(key_str) + k = key56_to_key64(k) + key_str = '' + for i in k: + key_str += chr(i & 0xFF) + self.des_c_obj = des_c.DES(key_str) + + #----------------------------------------------------------------- + def encrypt(self, plain_text): + "" + return self.des_c_obj.encrypt(plain_text) + + #----------------------------------------------------------------- + def decrypt(self, crypted_text): + "" + return self.des_c_obj.decrypt(crypted_text) + +#--------------------------------------------------------------------- +#Some Helpers +#--------------------------------------------------------------------- + +DESException = 'DESException' + +#--------------------------------------------------------------------- +def str_to_key56(key_str): + "" + if type(key_str) != type(''): + #rise DESException, 'ERROR. Wrong key type.' + pass + if len(key_str) < 7: + key_str = key_str + '\000\000\000\000\000\000\000'[:(7 - len(key_str))] + key_56 = [] + for i in key_str[:7]: key_56.append(ord(i)) + + return key_56 + +#--------------------------------------------------------------------- +def key56_to_key64(key_56): + "" + key = [] + for i in range(8): key.append(0) + + key[0] = key_56[0]; + key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1); + key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2); + key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3); + key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4); + key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5); + key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6); + key[7] = (key_56[6] << 1) & 0xFF; + + key = set_key_odd_parity(key) + + return key + +#--------------------------------------------------------------------- +def set_key_odd_parity(key): + "" + for i in range(len(key)): + for k in range(7): + bit = 0 + t = key[i] >> k + bit = (t ^ bit) & 0x1 + key[i] = (key[i] & 0xFE) | bit + + return key diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py new file mode 100644 index 0000000..61af403 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_c.py @@ -0,0 +1,328 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +from U32 import U32 + +# --NON ASCII COMMENT ELIDED-- +#typedef unsigned char des_cblock[8]; +#define HDRSIZE 4 + +def c2l(c): + "char[4] to unsigned long" + l = U32(c[0]) + l = l | (U32(c[1]) << 8) + l = l | (U32(c[2]) << 16) + l = l | (U32(c[3]) << 24) + return l + +def c2ln(c,l1,l2,n): + "char[n] to two unsigned long???" + c = c + n + l1, l2 = U32(0), U32(0) + + f = 0 + if n == 8: + l2 = l2 | (U32(c[7]) << 24) + f = 1 + if f or (n == 7): + l2 = l2 | (U32(c[6]) << 16) + f = 1 + if f or (n == 6): + l2 = l2 | (U32(c[5]) << 8) + f = 1 + if f or (n == 5): + l2 = l2 | U32(c[4]) + f = 1 + if f or (n == 4): + l1 = l1 | (U32(c[3]) << 24) + f = 1 + if f or (n == 3): + l1 = l1 | (U32(c[2]) << 16) + f = 1 + if f or (n == 2): + l1 = l1 | (U32(c[1]) << 8) + f = 1 + if f or (n == 1): + l1 = l1 | U32(c[0]) + return (l1, l2) + +def l2c(l): + "unsigned long to char[4]" + c = [] + c.append(int(l & U32(0xFF))) + c.append(int((l >> 8) & U32(0xFF))) + c.append(int((l >> 16) & U32(0xFF))) + c.append(int((l >> 24) & U32(0xFF))) + return c + +def n2l(c, l): + "network to host long" + l = U32(c[0] << 24) + l = l | (U32(c[1]) << 16) + l = l | (U32(c[2]) << 8) + l = l | (U32(c[3])) + return l + +def l2n(l, c): + "host to network long" + c = [] + c.append(int((l >> 24) & U32(0xFF))) + c.append(int((l >> 16) & U32(0xFF))) + c.append(int((l >> 8) & U32(0xFF))) + c.append(int((l ) & U32(0xFF))) + return c + +def l2cn(l1, l2, c, n): + "" + for i in range(n): c.append(0x00) + f = 0 + if f or (n == 8): + c[7] = int((l2 >> 24) & U32(0xFF)) + f = 1 + if f or (n == 7): + c[6] = int((l2 >> 16) & U32(0xFF)) + f = 1 + if f or (n == 6): + c[5] = int((l2 >> 8) & U32(0xFF)) + f = 1 + if f or (n == 5): + c[4] = int((l2 ) & U32(0xFF)) + f = 1 + if f or (n == 4): + c[3] = int((l1 >> 24) & U32(0xFF)) + f = 1 + if f or (n == 3): + c[2] = int((l1 >> 16) & U32(0xFF)) + f = 1 + if f or (n == 2): + c[1] = int((l1 >> 8) & U32(0xFF)) + f = 1 + if f or (n == 1): + c[0] = int((l1 ) & U32(0xFF)) + f = 1 + return c[:n] + +# array of data +# static unsigned long des_SPtrans[8][64]={ +# static unsigned long des_skb[8][64]={ +from des_data import des_SPtrans, des_skb + +def D_ENCRYPT(tup, u, t, s): + L, R, S = tup + #print 'LRS1', L, R, S, u, t, '-->', + u = (R ^ s[S]) + t = R ^ s[S + 1] + t = ((t >> 4) + (t << 28)) + L = L ^ (des_SPtrans[1][int((t ) & U32(0x3f))] | \ + des_SPtrans[3][int((t >> 8) & U32(0x3f))] | \ + des_SPtrans[5][int((t >> 16) & U32(0x3f))] | \ + des_SPtrans[7][int((t >> 24) & U32(0x3f))] | \ + des_SPtrans[0][int((u ) & U32(0x3f))] | \ + des_SPtrans[2][int((u >> 8) & U32(0x3f))] | \ + des_SPtrans[4][int((u >> 16) & U32(0x3f))] | \ + des_SPtrans[6][int((u >> 24) & U32(0x3f))]) + #print 'LRS:', L, R, S, u, t + return ((L, R, S), u, t, s) + + +def PERM_OP (tup, n, m): + "tup - (a, b, t)" + a, b, t = tup + t = ((a >> n) ^ b) & m + b = b ^ t + a = a ^ (t << n) + return (a, b, t) + +def HPERM_OP (tup, n, m): + "tup - (a, t)" + a, t = tup + t = ((a << (16 - n)) ^ a) & m + a = a ^ t ^ (t >> (16 - n)) + return (a, t) + +shifts2 = [0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0] + +class DES: + KeySched = None # des_key_schedule + + def __init__(self, key_str): + # key - UChar[8] + key = [] + for i in key_str: key.append(ord(i)) + #print 'key:', key + self.KeySched = des_set_key(key) + #print 'schedule:', self.KeySched, len(self.KeySched) + + def decrypt(self, str): + # block - UChar[] + block = [] + for i in str: block.append(ord(i)) + #print block + block = des_ecb_encrypt(block, self.KeySched, 0) + res = '' + for i in block: res = res + (chr(i)) + return res + + def encrypt(self, str): + # block - UChar[] + block = [] + for i in str: block.append(ord(i)) + block = des_ecb_encrypt(block, self.KeySched, 1) + res = '' + for i in block: res = res + (chr(i)) + return res + + + + + + +#------------------------ +def des_encript(input, ks, encrypt): + # input - U32[] + # output - U32[] + # ks - des_key_shedule - U32[2][16] + # encrypt - int + # l, r, t, u - U32 + # i - int + # s - U32[] + + l = input[0] + r = input[1] + t = U32(0) + u = U32(0) + + r, l, t = PERM_OP((r, l, t), 4, U32(0x0f0f0f0fL)) + l, r, t = PERM_OP((l, r, t), 16, U32(0x0000ffffL)) + r, l, t = PERM_OP((r, l, t), 2, U32(0x33333333L)) + l, r, t = PERM_OP((l, r, t), 8, U32(0x00ff00ffL)) + r, l, t = PERM_OP((r, l, t), 1, U32(0x55555555L)) + + t = (r << 1)|(r >> 31) + r = (l << 1)|(l >> 31) + l = t + + s = ks # ??????????????? + #print l, r + if(encrypt): + for i in range(0, 32, 4): + rtup, u, t, s = D_ENCRYPT((l, r, i + 0), u, t, s) + l = rtup[0] + r = rtup[1] + rtup, u, t, s = D_ENCRYPT((r, l, i + 2), u, t, s) + r = rtup[0] + l = rtup[1] + else: + for i in range(30, 0, -4): + rtup, u, t, s = D_ENCRYPT((l, r, i - 0), u, t, s) + l = rtup[0] + r = rtup[1] + rtup, u, t, s = D_ENCRYPT((r, l, i - 2), u, t, s) + r = rtup[0] + l = rtup[1] + #print l, r + l = (l >> 1)|(l << 31) + r = (r >> 1)|(r << 31) + + r, l, t = PERM_OP((r, l, t), 1, U32(0x55555555L)) + l, r, t = PERM_OP((l, r, t), 8, U32(0x00ff00ffL)) + r, l, t = PERM_OP((r, l, t), 2, U32(0x33333333L)) + l, r, t = PERM_OP((l, r, t), 16, U32(0x0000ffffL)) + r, l, t = PERM_OP((r, l, t), 4, U32(0x0f0f0f0fL)) + + output = [l] + output.append(r) + l, r, t, u = U32(0), U32(0), U32(0), U32(0) + return output + +def des_ecb_encrypt(input, ks, encrypt): + # input - des_cblock - UChar[8] + # output - des_cblock - UChar[8] + # ks - des_key_shedule - U32[2][16] + # encrypt - int + + #print input + l0 = c2l(input[0:4]) + l1 = c2l(input[4:8]) + ll = [l0] + ll.append(l1) + #print ll + ll = des_encript(ll, ks, encrypt) + #print ll + l0 = ll[0] + l1 = ll[1] + output = l2c(l0) + output = output + l2c(l1) + #print output + l0, l1, ll[0], ll[1] = U32(0), U32(0), U32(0), U32(0) + return output + +def des_set_key(key): + # key - des_cblock - UChar[8] + # schedule - des_key_schedule + + # register unsigned long c,d,t,s; + # register unsigned char *in; + # register unsigned long *k; + # register int i; + + #k = schedule + # in = key + + k = [] + c = c2l(key[0:4]) + d = c2l(key[4:8]) + t = U32(0) + + d, c, t = PERM_OP((d, c, t), 4, U32(0x0f0f0f0fL)) + c, t = HPERM_OP((c, t), -2, U32(0xcccc0000L)) + d, t = HPERM_OP((d, t), -2, U32(0xcccc0000L)) + d, c, t = PERM_OP((d, c, t), 1, U32(0x55555555L)) + c, d, t = PERM_OP((c, d, t), 8, U32(0x00ff00ffL)) + d, c, t = PERM_OP((d, c, t), 1, U32(0x55555555L)) + + d = (((d & U32(0x000000ffL)) << 16)|(d & U32(0x0000ff00L))|((d & U32(0x00ff0000L)) >> 16)|((c & U32(0xf0000000L)) >> 4)) + c = c & U32(0x0fffffffL) + + for i in range(16): + if (shifts2[i]): + c = ((c >> 2)|(c << 26)) + d = ((d >> 2)|(d << 26)) + else: + c = ((c >> 1)|(c << 27)) + d = ((d >> 1)|(d << 27)) + c = c & U32(0x0fffffffL) + d = d & U32(0x0fffffffL) + + s= des_skb[0][int((c ) & U32(0x3f))]|\ + des_skb[1][int(((c>> 6) & U32(0x03))|((c>> 7) & U32(0x3c)))]|\ + des_skb[2][int(((c>>13) & U32(0x0f))|((c>>14) & U32(0x30)))]|\ + des_skb[3][int(((c>>20) & U32(0x01))|((c>>21) & U32(0x06)) | ((c>>22) & U32(0x38)))] + + t= des_skb[4][int((d ) & U32(0x3f) )]|\ + des_skb[5][int(((d>> 7) & U32(0x03))|((d>> 8) & U32(0x3c)))]|\ + des_skb[6][int((d>>15) & U32(0x3f) )]|\ + des_skb[7][int(((d>>21) & U32(0x0f))|((d>>22) & U32(0x30)))] + #print s, t + + k.append(((t << 16)|(s & U32(0x0000ffffL))) & U32(0xffffffffL)) + s = ((s >> 16)|(t & U32(0xffff0000L))) + s = (s << 4)|(s >> 28) + k.append(s & U32(0xffffffffL)) + + schedule = k + + return schedule diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py new file mode 100644 index 0000000..9867876 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/des_data.py @@ -0,0 +1,348 @@ +# This file is part of 'NTLM Authorization Proxy Server' http://sourceforge.net/projects/ntlmaps/ +# Copyright 2001 Dmitry A. Rozmanov +# +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +from U32 import U32 + +# static unsigned long des_SPtrans[8][64]={ + +des_SPtrans =\ +[ +#nibble 0 +[ +U32(0x00820200L), U32(0x00020000L), U32(0x80800000L), U32(0x80820200L), +U32(0x00800000L), U32(0x80020200L), U32(0x80020000L), U32(0x80800000L), +U32(0x80020200L), U32(0x00820200L), U32(0x00820000L), U32(0x80000200L), +U32(0x80800200L), U32(0x00800000L), U32(0x00000000L), U32(0x80020000L), +U32(0x00020000L), U32(0x80000000L), U32(0x00800200L), U32(0x00020200L), +U32(0x80820200L), U32(0x00820000L), U32(0x80000200L), U32(0x00800200L), +U32(0x80000000L), U32(0x00000200L), U32(0x00020200L), U32(0x80820000L), +U32(0x00000200L), U32(0x80800200L), U32(0x80820000L), U32(0x00000000L), +U32(0x00000000L), U32(0x80820200L), U32(0x00800200L), U32(0x80020000L), +U32(0x00820200L), U32(0x00020000L), U32(0x80000200L), U32(0x00800200L), +U32(0x80820000L), U32(0x00000200L), U32(0x00020200L), U32(0x80800000L), +U32(0x80020200L), U32(0x80000000L), U32(0x80800000L), U32(0x00820000L), +U32(0x80820200L), U32(0x00020200L), U32(0x00820000L), U32(0x80800200L), +U32(0x00800000L), U32(0x80000200L), U32(0x80020000L), U32(0x00000000L), +U32(0x00020000L), U32(0x00800000L), U32(0x80800200L), U32(0x00820200L), +U32(0x80000000L), U32(0x80820000L), U32(0x00000200L), U32(0x80020200L), +], + +#nibble 1 +[ +U32(0x10042004L), U32(0x00000000L), U32(0x00042000L), U32(0x10040000L), +U32(0x10000004L), U32(0x00002004L), U32(0x10002000L), U32(0x00042000L), +U32(0x00002000L), U32(0x10040004L), U32(0x00000004L), U32(0x10002000L), +U32(0x00040004L), U32(0x10042000L), U32(0x10040000L), U32(0x00000004L), +U32(0x00040000L), U32(0x10002004L), U32(0x10040004L), U32(0x00002000L), +U32(0x00042004L), U32(0x10000000L), U32(0x00000000L), U32(0x00040004L), +U32(0x10002004L), U32(0x00042004L), U32(0x10042000L), U32(0x10000004L), +U32(0x10000000L), U32(0x00040000L), U32(0x00002004L), U32(0x10042004L), +U32(0x00040004L), U32(0x10042000L), U32(0x10002000L), U32(0x00042004L), +U32(0x10042004L), U32(0x00040004L), U32(0x10000004L), U32(0x00000000L), +U32(0x10000000L), U32(0x00002004L), U32(0x00040000L), U32(0x10040004L), +U32(0x00002000L), U32(0x10000000L), U32(0x00042004L), U32(0x10002004L), +U32(0x10042000L), U32(0x00002000L), U32(0x00000000L), U32(0x10000004L), +U32(0x00000004L), U32(0x10042004L), U32(0x00042000L), U32(0x10040000L), +U32(0x10040004L), U32(0x00040000L), U32(0x00002004L), U32(0x10002000L), +U32(0x10002004L), U32(0x00000004L), U32(0x10040000L), U32(0x00042000L), +], + +#nibble 2 +[ +U32(0x41000000L), U32(0x01010040L), U32(0x00000040L), U32(0x41000040L), +U32(0x40010000L), U32(0x01000000L), U32(0x41000040L), U32(0x00010040L), +U32(0x01000040L), U32(0x00010000L), U32(0x01010000L), U32(0x40000000L), +U32(0x41010040L), U32(0x40000040L), U32(0x40000000L), U32(0x41010000L), +U32(0x00000000L), U32(0x40010000L), U32(0x01010040L), U32(0x00000040L), +U32(0x40000040L), U32(0x41010040L), U32(0x00010000L), U32(0x41000000L), +U32(0x41010000L), U32(0x01000040L), U32(0x40010040L), U32(0x01010000L), +U32(0x00010040L), U32(0x00000000L), U32(0x01000000L), U32(0x40010040L), +U32(0x01010040L), U32(0x00000040L), U32(0x40000000L), U32(0x00010000L), +U32(0x40000040L), U32(0x40010000L), U32(0x01010000L), U32(0x41000040L), +U32(0x00000000L), U32(0x01010040L), U32(0x00010040L), U32(0x41010000L), +U32(0x40010000L), U32(0x01000000L), U32(0x41010040L), U32(0x40000000L), +U32(0x40010040L), U32(0x41000000L), U32(0x01000000L), U32(0x41010040L), +U32(0x00010000L), U32(0x01000040L), U32(0x41000040L), U32(0x00010040L), +U32(0x01000040L), U32(0x00000000L), U32(0x41010000L), U32(0x40000040L), +U32(0x41000000L), U32(0x40010040L), U32(0x00000040L), U32(0x01010000L), +], + +#nibble 3 +[ +U32(0x00100402L), U32(0x04000400L), U32(0x00000002L), U32(0x04100402L), +U32(0x00000000L), U32(0x04100000L), U32(0x04000402L), U32(0x00100002L), +U32(0x04100400L), U32(0x04000002L), U32(0x04000000L), U32(0x00000402L), +U32(0x04000002L), U32(0x00100402L), U32(0x00100000L), U32(0x04000000L), +U32(0x04100002L), U32(0x00100400L), U32(0x00000400L), U32(0x00000002L), +U32(0x00100400L), U32(0x04000402L), U32(0x04100000L), U32(0x00000400L), +U32(0x00000402L), U32(0x00000000L), U32(0x00100002L), U32(0x04100400L), +U32(0x04000400L), U32(0x04100002L), U32(0x04100402L), U32(0x00100000L), +U32(0x04100002L), U32(0x00000402L), U32(0x00100000L), U32(0x04000002L), +U32(0x00100400L), U32(0x04000400L), U32(0x00000002L), U32(0x04100000L), +U32(0x04000402L), U32(0x00000000L), U32(0x00000400L), U32(0x00100002L), +U32(0x00000000L), U32(0x04100002L), U32(0x04100400L), U32(0x00000400L), +U32(0x04000000L), U32(0x04100402L), U32(0x00100402L), U32(0x00100000L), +U32(0x04100402L), U32(0x00000002L), U32(0x04000400L), U32(0x00100402L), +U32(0x00100002L), U32(0x00100400L), U32(0x04100000L), U32(0x04000402L), +U32(0x00000402L), U32(0x04000000L), U32(0x04000002L), U32(0x04100400L), +], + +#nibble 4 +[ +U32(0x02000000L), U32(0x00004000L), U32(0x00000100L), U32(0x02004108L), +U32(0x02004008L), U32(0x02000100L), U32(0x00004108L), U32(0x02004000L), +U32(0x00004000L), U32(0x00000008L), U32(0x02000008L), U32(0x00004100L), +U32(0x02000108L), U32(0x02004008L), U32(0x02004100L), U32(0x00000000L), +U32(0x00004100L), U32(0x02000000L), U32(0x00004008L), U32(0x00000108L), +U32(0x02000100L), U32(0x00004108L), U32(0x00000000L), U32(0x02000008L), +U32(0x00000008L), U32(0x02000108L), U32(0x02004108L), U32(0x00004008L), +U32(0x02004000L), U32(0x00000100L), U32(0x00000108L), U32(0x02004100L), +U32(0x02004100L), U32(0x02000108L), U32(0x00004008L), U32(0x02004000L), +U32(0x00004000L), U32(0x00000008L), U32(0x02000008L), U32(0x02000100L), +U32(0x02000000L), U32(0x00004100L), U32(0x02004108L), U32(0x00000000L), +U32(0x00004108L), U32(0x02000000L), U32(0x00000100L), U32(0x00004008L), +U32(0x02000108L), U32(0x00000100L), U32(0x00000000L), U32(0x02004108L), +U32(0x02004008L), U32(0x02004100L), U32(0x00000108L), U32(0x00004000L), +U32(0x00004100L), U32(0x02004008L), U32(0x02000100L), U32(0x00000108L), +U32(0x00000008L), U32(0x00004108L), U32(0x02004000L), U32(0x02000008L), +], + +#nibble 5 +[ +U32(0x20000010L), U32(0x00080010L), U32(0x00000000L), U32(0x20080800L), +U32(0x00080010L), U32(0x00000800L), U32(0x20000810L), U32(0x00080000L), +U32(0x00000810L), U32(0x20080810L), U32(0x00080800L), U32(0x20000000L), +U32(0x20000800L), U32(0x20000010L), U32(0x20080000L), U32(0x00080810L), +U32(0x00080000L), U32(0x20000810L), U32(0x20080010L), U32(0x00000000L), +U32(0x00000800L), U32(0x00000010L), U32(0x20080800L), U32(0x20080010L), +U32(0x20080810L), U32(0x20080000L), U32(0x20000000L), U32(0x00000810L), +U32(0x00000010L), U32(0x00080800L), U32(0x00080810L), U32(0x20000800L), +U32(0x00000810L), U32(0x20000000L), U32(0x20000800L), U32(0x00080810L), +U32(0x20080800L), U32(0x00080010L), U32(0x00000000L), U32(0x20000800L), +U32(0x20000000L), U32(0x00000800L), U32(0x20080010L), U32(0x00080000L), +U32(0x00080010L), U32(0x20080810L), U32(0x00080800L), U32(0x00000010L), +U32(0x20080810L), U32(0x00080800L), U32(0x00080000L), U32(0x20000810L), +U32(0x20000010L), U32(0x20080000L), U32(0x00080810L), U32(0x00000000L), +U32(0x00000800L), U32(0x20000010L), U32(0x20000810L), U32(0x20080800L), +U32(0x20080000L), U32(0x00000810L), U32(0x00000010L), U32(0x20080010L), +], + +#nibble 6 +[ +U32(0x00001000L), U32(0x00000080L), U32(0x00400080L), U32(0x00400001L), +U32(0x00401081L), U32(0x00001001L), U32(0x00001080L), U32(0x00000000L), +U32(0x00400000L), U32(0x00400081L), U32(0x00000081L), U32(0x00401000L), +U32(0x00000001L), U32(0x00401080L), U32(0x00401000L), U32(0x00000081L), +U32(0x00400081L), U32(0x00001000L), U32(0x00001001L), U32(0x00401081L), +U32(0x00000000L), U32(0x00400080L), U32(0x00400001L), U32(0x00001080L), +U32(0x00401001L), U32(0x00001081L), U32(0x00401080L), U32(0x00000001L), +U32(0x00001081L), U32(0x00401001L), U32(0x00000080L), U32(0x00400000L), +U32(0x00001081L), U32(0x00401000L), U32(0x00401001L), U32(0x00000081L), +U32(0x00001000L), U32(0x00000080L), U32(0x00400000L), U32(0x00401001L), +U32(0x00400081L), U32(0x00001081L), U32(0x00001080L), U32(0x00000000L), +U32(0x00000080L), U32(0x00400001L), U32(0x00000001L), U32(0x00400080L), +U32(0x00000000L), U32(0x00400081L), U32(0x00400080L), U32(0x00001080L), +U32(0x00000081L), U32(0x00001000L), U32(0x00401081L), U32(0x00400000L), +U32(0x00401080L), U32(0x00000001L), U32(0x00001001L), U32(0x00401081L), +U32(0x00400001L), U32(0x00401080L), U32(0x00401000L), U32(0x00001001L), +], + +#nibble 7 +[ +U32(0x08200020L), U32(0x08208000L), U32(0x00008020L), U32(0x00000000L), +U32(0x08008000L), U32(0x00200020L), U32(0x08200000L), U32(0x08208020L), +U32(0x00000020L), U32(0x08000000L), U32(0x00208000L), U32(0x00008020L), +U32(0x00208020L), U32(0x08008020L), U32(0x08000020L), U32(0x08200000L), +U32(0x00008000L), U32(0x00208020L), U32(0x00200020L), U32(0x08008000L), +U32(0x08208020L), U32(0x08000020L), U32(0x00000000L), U32(0x00208000L), +U32(0x08000000L), U32(0x00200000L), U32(0x08008020L), U32(0x08200020L), +U32(0x00200000L), U32(0x00008000L), U32(0x08208000L), U32(0x00000020L), +U32(0x00200000L), U32(0x00008000L), U32(0x08000020L), U32(0x08208020L), +U32(0x00008020L), U32(0x08000000L), U32(0x00000000L), U32(0x00208000L), +U32(0x08200020L), U32(0x08008020L), U32(0x08008000L), U32(0x00200020L), +U32(0x08208000L), U32(0x00000020L), U32(0x00200020L), U32(0x08008000L), +U32(0x08208020L), U32(0x00200000L), U32(0x08200000L), U32(0x08000020L), +U32(0x00208000L), U32(0x00008020L), U32(0x08008020L), U32(0x08200000L), +U32(0x00000020L), U32(0x08208000L), U32(0x00208020L), U32(0x00000000L), +U32(0x08000000L), U32(0x08200020L), U32(0x00008000L), U32(0x00208020L), +], +] + +#static unsigned long des_skb[8][64]={ + +des_skb = \ +[ +#for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 +[ +U32(0x00000000L),U32(0x00000010L),U32(0x20000000L),U32(0x20000010L), +U32(0x00010000L),U32(0x00010010L),U32(0x20010000L),U32(0x20010010L), +U32(0x00000800L),U32(0x00000810L),U32(0x20000800L),U32(0x20000810L), +U32(0x00010800L),U32(0x00010810L),U32(0x20010800L),U32(0x20010810L), +U32(0x00000020L),U32(0x00000030L),U32(0x20000020L),U32(0x20000030L), +U32(0x00010020L),U32(0x00010030L),U32(0x20010020L),U32(0x20010030L), +U32(0x00000820L),U32(0x00000830L),U32(0x20000820L),U32(0x20000830L), +U32(0x00010820L),U32(0x00010830L),U32(0x20010820L),U32(0x20010830L), +U32(0x00080000L),U32(0x00080010L),U32(0x20080000L),U32(0x20080010L), +U32(0x00090000L),U32(0x00090010L),U32(0x20090000L),U32(0x20090010L), +U32(0x00080800L),U32(0x00080810L),U32(0x20080800L),U32(0x20080810L), +U32(0x00090800L),U32(0x00090810L),U32(0x20090800L),U32(0x20090810L), +U32(0x00080020L),U32(0x00080030L),U32(0x20080020L),U32(0x20080030L), +U32(0x00090020L),U32(0x00090030L),U32(0x20090020L),U32(0x20090030L), +U32(0x00080820L),U32(0x00080830L),U32(0x20080820L),U32(0x20080830L), +U32(0x00090820L),U32(0x00090830L),U32(0x20090820L),U32(0x20090830L), +], + +#for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 +[ +U32(0x00000000L),U32(0x02000000L),U32(0x00002000L),U32(0x02002000L), +U32(0x00200000L),U32(0x02200000L),U32(0x00202000L),U32(0x02202000L), +U32(0x00000004L),U32(0x02000004L),U32(0x00002004L),U32(0x02002004L), +U32(0x00200004L),U32(0x02200004L),U32(0x00202004L),U32(0x02202004L), +U32(0x00000400L),U32(0x02000400L),U32(0x00002400L),U32(0x02002400L), +U32(0x00200400L),U32(0x02200400L),U32(0x00202400L),U32(0x02202400L), +U32(0x00000404L),U32(0x02000404L),U32(0x00002404L),U32(0x02002404L), +U32(0x00200404L),U32(0x02200404L),U32(0x00202404L),U32(0x02202404L), +U32(0x10000000L),U32(0x12000000L),U32(0x10002000L),U32(0x12002000L), +U32(0x10200000L),U32(0x12200000L),U32(0x10202000L),U32(0x12202000L), +U32(0x10000004L),U32(0x12000004L),U32(0x10002004L),U32(0x12002004L), +U32(0x10200004L),U32(0x12200004L),U32(0x10202004L),U32(0x12202004L), +U32(0x10000400L),U32(0x12000400L),U32(0x10002400L),U32(0x12002400L), +U32(0x10200400L),U32(0x12200400L),U32(0x10202400L),U32(0x12202400L), +U32(0x10000404L),U32(0x12000404L),U32(0x10002404L),U32(0x12002404L), +U32(0x10200404L),U32(0x12200404L),U32(0x10202404L),U32(0x12202404L), +], + +#for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 +[ +U32(0x00000000L),U32(0x00000001L),U32(0x00040000L),U32(0x00040001L), +U32(0x01000000L),U32(0x01000001L),U32(0x01040000L),U32(0x01040001L), +U32(0x00000002L),U32(0x00000003L),U32(0x00040002L),U32(0x00040003L), +U32(0x01000002L),U32(0x01000003L),U32(0x01040002L),U32(0x01040003L), +U32(0x00000200L),U32(0x00000201L),U32(0x00040200L),U32(0x00040201L), +U32(0x01000200L),U32(0x01000201L),U32(0x01040200L),U32(0x01040201L), +U32(0x00000202L),U32(0x00000203L),U32(0x00040202L),U32(0x00040203L), +U32(0x01000202L),U32(0x01000203L),U32(0x01040202L),U32(0x01040203L), +U32(0x08000000L),U32(0x08000001L),U32(0x08040000L),U32(0x08040001L), +U32(0x09000000L),U32(0x09000001L),U32(0x09040000L),U32(0x09040001L), +U32(0x08000002L),U32(0x08000003L),U32(0x08040002L),U32(0x08040003L), +U32(0x09000002L),U32(0x09000003L),U32(0x09040002L),U32(0x09040003L), +U32(0x08000200L),U32(0x08000201L),U32(0x08040200L),U32(0x08040201L), +U32(0x09000200L),U32(0x09000201L),U32(0x09040200L),U32(0x09040201L), +U32(0x08000202L),U32(0x08000203L),U32(0x08040202L),U32(0x08040203L), +U32(0x09000202L),U32(0x09000203L),U32(0x09040202L),U32(0x09040203L), +], + +#for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 +[ +U32(0x00000000L),U32(0x00100000L),U32(0x00000100L),U32(0x00100100L), +U32(0x00000008L),U32(0x00100008L),U32(0x00000108L),U32(0x00100108L), +U32(0x00001000L),U32(0x00101000L),U32(0x00001100L),U32(0x00101100L), +U32(0x00001008L),U32(0x00101008L),U32(0x00001108L),U32(0x00101108L), +U32(0x04000000L),U32(0x04100000L),U32(0x04000100L),U32(0x04100100L), +U32(0x04000008L),U32(0x04100008L),U32(0x04000108L),U32(0x04100108L), +U32(0x04001000L),U32(0x04101000L),U32(0x04001100L),U32(0x04101100L), +U32(0x04001008L),U32(0x04101008L),U32(0x04001108L),U32(0x04101108L), +U32(0x00020000L),U32(0x00120000L),U32(0x00020100L),U32(0x00120100L), +U32(0x00020008L),U32(0x00120008L),U32(0x00020108L),U32(0x00120108L), +U32(0x00021000L),U32(0x00121000L),U32(0x00021100L),U32(0x00121100L), +U32(0x00021008L),U32(0x00121008L),U32(0x00021108L),U32(0x00121108L), +U32(0x04020000L),U32(0x04120000L),U32(0x04020100L),U32(0x04120100L), +U32(0x04020008L),U32(0x04120008L),U32(0x04020108L),U32(0x04120108L), +U32(0x04021000L),U32(0x04121000L),U32(0x04021100L),U32(0x04121100L), +U32(0x04021008L),U32(0x04121008L),U32(0x04021108L),U32(0x04121108L), +], + +#for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 +[ +U32(0x00000000L),U32(0x10000000L),U32(0x00010000L),U32(0x10010000L), +U32(0x00000004L),U32(0x10000004L),U32(0x00010004L),U32(0x10010004L), +U32(0x20000000L),U32(0x30000000L),U32(0x20010000L),U32(0x30010000L), +U32(0x20000004L),U32(0x30000004L),U32(0x20010004L),U32(0x30010004L), +U32(0x00100000L),U32(0x10100000L),U32(0x00110000L),U32(0x10110000L), +U32(0x00100004L),U32(0x10100004L),U32(0x00110004L),U32(0x10110004L), +U32(0x20100000L),U32(0x30100000L),U32(0x20110000L),U32(0x30110000L), +U32(0x20100004L),U32(0x30100004L),U32(0x20110004L),U32(0x30110004L), +U32(0x00001000L),U32(0x10001000L),U32(0x00011000L),U32(0x10011000L), +U32(0x00001004L),U32(0x10001004L),U32(0x00011004L),U32(0x10011004L), +U32(0x20001000L),U32(0x30001000L),U32(0x20011000L),U32(0x30011000L), +U32(0x20001004L),U32(0x30001004L),U32(0x20011004L),U32(0x30011004L), +U32(0x00101000L),U32(0x10101000L),U32(0x00111000L),U32(0x10111000L), +U32(0x00101004L),U32(0x10101004L),U32(0x00111004L),U32(0x10111004L), +U32(0x20101000L),U32(0x30101000L),U32(0x20111000L),U32(0x30111000L), +U32(0x20101004L),U32(0x30101004L),U32(0x20111004L),U32(0x30111004L), +], + +#for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 +[ +U32(0x00000000L),U32(0x08000000L),U32(0x00000008L),U32(0x08000008L), +U32(0x00000400L),U32(0x08000400L),U32(0x00000408L),U32(0x08000408L), +U32(0x00020000L),U32(0x08020000L),U32(0x00020008L),U32(0x08020008L), +U32(0x00020400L),U32(0x08020400L),U32(0x00020408L),U32(0x08020408L), +U32(0x00000001L),U32(0x08000001L),U32(0x00000009L),U32(0x08000009L), +U32(0x00000401L),U32(0x08000401L),U32(0x00000409L),U32(0x08000409L), +U32(0x00020001L),U32(0x08020001L),U32(0x00020009L),U32(0x08020009L), +U32(0x00020401L),U32(0x08020401L),U32(0x00020409L),U32(0x08020409L), +U32(0x02000000L),U32(0x0A000000L),U32(0x02000008L),U32(0x0A000008L), +U32(0x02000400L),U32(0x0A000400L),U32(0x02000408L),U32(0x0A000408L), +U32(0x02020000L),U32(0x0A020000L),U32(0x02020008L),U32(0x0A020008L), +U32(0x02020400L),U32(0x0A020400L),U32(0x02020408L),U32(0x0A020408L), +U32(0x02000001L),U32(0x0A000001L),U32(0x02000009L),U32(0x0A000009L), +U32(0x02000401L),U32(0x0A000401L),U32(0x02000409L),U32(0x0A000409L), +U32(0x02020001L),U32(0x0A020001L),U32(0x02020009L),U32(0x0A020009L), +U32(0x02020401L),U32(0x0A020401L),U32(0x02020409L),U32(0x0A020409L), +], + +#for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 +[ +U32(0x00000000L),U32(0x00000100L),U32(0x00080000L),U32(0x00080100L), +U32(0x01000000L),U32(0x01000100L),U32(0x01080000L),U32(0x01080100L), +U32(0x00000010L),U32(0x00000110L),U32(0x00080010L),U32(0x00080110L), +U32(0x01000010L),U32(0x01000110L),U32(0x01080010L),U32(0x01080110L), +U32(0x00200000L),U32(0x00200100L),U32(0x00280000L),U32(0x00280100L), +U32(0x01200000L),U32(0x01200100L),U32(0x01280000L),U32(0x01280100L), +U32(0x00200010L),U32(0x00200110L),U32(0x00280010L),U32(0x00280110L), +U32(0x01200010L),U32(0x01200110L),U32(0x01280010L),U32(0x01280110L), +U32(0x00000200L),U32(0x00000300L),U32(0x00080200L),U32(0x00080300L), +U32(0x01000200L),U32(0x01000300L),U32(0x01080200L),U32(0x01080300L), +U32(0x00000210L),U32(0x00000310L),U32(0x00080210L),U32(0x00080310L), +U32(0x01000210L),U32(0x01000310L),U32(0x01080210L),U32(0x01080310L), +U32(0x00200200L),U32(0x00200300L),U32(0x00280200L),U32(0x00280300L), +U32(0x01200200L),U32(0x01200300L),U32(0x01280200L),U32(0x01280300L), +U32(0x00200210L),U32(0x00200310L),U32(0x00280210L),U32(0x00280310L), +U32(0x01200210L),U32(0x01200310L),U32(0x01280210L),U32(0x01280310L), +], + +#for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 +[ +U32(0x00000000L),U32(0x04000000L),U32(0x00040000L),U32(0x04040000L), +U32(0x00000002L),U32(0x04000002L),U32(0x00040002L),U32(0x04040002L), +U32(0x00002000L),U32(0x04002000L),U32(0x00042000L),U32(0x04042000L), +U32(0x00002002L),U32(0x04002002L),U32(0x00042002L),U32(0x04042002L), +U32(0x00000020L),U32(0x04000020L),U32(0x00040020L),U32(0x04040020L), +U32(0x00000022L),U32(0x04000022L),U32(0x00040022L),U32(0x04040022L), +U32(0x00002020L),U32(0x04002020L),U32(0x00042020L),U32(0x04042020L), +U32(0x00002022L),U32(0x04002022L),U32(0x00042022L),U32(0x04042022L), +U32(0x00000800L),U32(0x04000800L),U32(0x00040800L),U32(0x04040800L), +U32(0x00000802L),U32(0x04000802L),U32(0x00040802L),U32(0x04040802L), +U32(0x00002800L),U32(0x04002800L),U32(0x00042800L),U32(0x04042800L), +U32(0x00002802L),U32(0x04002802L),U32(0x00042802L),U32(0x04042802L), +U32(0x00000820L),U32(0x04000820L),U32(0x00040820L),U32(0x04040820L), +U32(0x00000822L),U32(0x04000822L),U32(0x00040822L),U32(0x04040822L), +U32(0x00002820L),U32(0x04002820L),U32(0x00042820L),U32(0x04042820L), +U32(0x00002822L),U32(0x04002822L),U32(0x00042822L),U32(0x04042822L), +] + +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py new file mode 100644 index 0000000..79d6dfe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/lib/windows/ntlm/ntlm.py @@ -0,0 +1,466 @@ +# This library is free software: you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation, either +# version 3 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see or . + +import struct +import base64 +import string +import des +import hashlib +import hmac +import random +from socket import gethostname + +NTLM_NegotiateUnicode = 0x00000001 +NTLM_NegotiateOEM = 0x00000002 +NTLM_RequestTarget = 0x00000004 +NTLM_Unknown9 = 0x00000008 +NTLM_NegotiateSign = 0x00000010 +NTLM_NegotiateSeal = 0x00000020 +NTLM_NegotiateDatagram = 0x00000040 +NTLM_NegotiateLanManagerKey = 0x00000080 +NTLM_Unknown8 = 0x00000100 +NTLM_NegotiateNTLM = 0x00000200 +NTLM_NegotiateNTOnly = 0x00000400 +NTLM_Anonymous = 0x00000800 +NTLM_NegotiateOemDomainSupplied = 0x00001000 +NTLM_NegotiateOemWorkstationSupplied = 0x00002000 +NTLM_Unknown6 = 0x00004000 +NTLM_NegotiateAlwaysSign = 0x00008000 +NTLM_TargetTypeDomain = 0x00010000 +NTLM_TargetTypeServer = 0x00020000 +NTLM_TargetTypeShare = 0x00040000 +NTLM_NegotiateExtendedSecurity = 0x00080000 +NTLM_NegotiateIdentify = 0x00100000 +NTLM_Unknown5 = 0x00200000 +NTLM_RequestNonNTSessionKey = 0x00400000 +NTLM_NegotiateTargetInfo = 0x00800000 +NTLM_Unknown4 = 0x01000000 +NTLM_NegotiateVersion = 0x02000000 +NTLM_Unknown3 = 0x04000000 +NTLM_Unknown2 = 0x08000000 +NTLM_Unknown1 = 0x10000000 +NTLM_Negotiate128 = 0x20000000 +NTLM_NegotiateKeyExchange = 0x40000000 +NTLM_Negotiate56 = 0x80000000 + +# we send these flags with our type 1 message +NTLM_TYPE1_FLAGS = (NTLM_NegotiateUnicode | \ + NTLM_NegotiateOEM | \ + NTLM_RequestTarget | \ + NTLM_NegotiateNTLM | \ + NTLM_NegotiateOemDomainSupplied | \ + NTLM_NegotiateOemWorkstationSupplied | \ + NTLM_NegotiateAlwaysSign | \ + NTLM_NegotiateExtendedSecurity | \ + NTLM_NegotiateVersion | \ + NTLM_Negotiate128 | \ + NTLM_Negotiate56 ) +NTLM_TYPE2_FLAGS = (NTLM_NegotiateUnicode | \ + NTLM_RequestTarget | \ + NTLM_NegotiateNTLM | \ + NTLM_NegotiateAlwaysSign | \ + NTLM_NegotiateExtendedSecurity | \ + NTLM_NegotiateTargetInfo | \ + NTLM_NegotiateVersion | \ + NTLM_Negotiate128 | \ + NTLM_Negotiate56) + +NTLM_MsvAvEOL = 0 # Indicates that this is the last AV_PAIR in the list. AvLen MUST be 0. This type of information MUST be present in the AV pair list. +NTLM_MsvAvNbComputerName = 1 # The server's NetBIOS computer name. The name MUST be in Unicode, and is not null-terminated. This type of information MUST be present in the AV_pair list. +NTLM_MsvAvNbDomainName = 2 # The server's NetBIOS domain name. The name MUST be in Unicode, and is not null-terminated. This type of information MUST be present in the AV_pair list. +NTLM_MsvAvDnsComputerName = 3 # The server's Active Directory DNS computer name. The name MUST be in Unicode, and is not null-terminated. +NTLM_MsvAvDnsDomainName = 4 # The server's Active Directory DNS domain name. The name MUST be in Unicode, and is not null-terminated. +NTLM_MsvAvDnsTreeName = 5 # The server's Active Directory (AD) DNS forest tree name. The name MUST be in Unicode, and is not null-terminated. +NTLM_MsvAvFlags = 6 # A field containing a 32-bit value indicating server or client configuration. 0x00000001: indicates to the client that the account authentication is constrained. 0x00000002: indicates that the client is providing message integrity in the MIC field (section 2.2.1.3) in the AUTHENTICATE_MESSAGE. +NTLM_MsvAvTimestamp = 7 # A FILETIME structure ([MS-DTYP] section 2.3.1) in little-endian byte order that contains the server local time.<12> +NTLM_MsAvRestrictions = 8 #A Restriction_Encoding structure (section 2.2.2.2). The Value field contains a structure representing the integrity level of the security principal, as well as a MachineID created at computer startup to identify the calling machine. <13> + + +""" +utility functions for Microsoft NTLM authentication + +References: +[MS-NLMP]: NT LAN Manager (NTLM) Authentication Protocol Specification +http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-NLMP%5D.pdf + +[MS-NTHT]: NTLM Over HTTP Protocol Specification +http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-NTHT%5D.pdf + +Cntlm Authentication Proxy +http://cntlm.awk.cz/ + +NTLM Authorization Proxy Server +http://sourceforge.net/projects/ntlmaps/ + +Optimized Attack for NTLM2 Session Response +http://www.blackhat.com/presentations/bh-asia-04/bh-jp-04-pdfs/bh-jp-04-seki.pdf +""" +def dump_NegotiateFlags(NegotiateFlags): + if NegotiateFlags & NTLM_NegotiateUnicode: + print "NTLM_NegotiateUnicode set" + if NegotiateFlags & NTLM_NegotiateOEM: + print "NTLM_NegotiateOEM set" + if NegotiateFlags & NTLM_RequestTarget: + print "NTLM_RequestTarget set" + if NegotiateFlags & NTLM_Unknown9: + print "NTLM_Unknown9 set" + if NegotiateFlags & NTLM_NegotiateSign: + print "NTLM_NegotiateSign set" + if NegotiateFlags & NTLM_NegotiateSeal: + print "NTLM_NegotiateSeal set" + if NegotiateFlags & NTLM_NegotiateDatagram: + print "NTLM_NegotiateDatagram set" + if NegotiateFlags & NTLM_NegotiateLanManagerKey: + print "NTLM_NegotiateLanManagerKey set" + if NegotiateFlags & NTLM_Unknown8: + print "NTLM_Unknown8 set" + if NegotiateFlags & NTLM_NegotiateNTLM: + print "NTLM_NegotiateNTLM set" + if NegotiateFlags & NTLM_NegotiateNTOnly: + print "NTLM_NegotiateNTOnly set" + if NegotiateFlags & NTLM_Anonymous: + print "NTLM_Anonymous set" + if NegotiateFlags & NTLM_NegotiateOemDomainSupplied: + print "NTLM_NegotiateOemDomainSupplied set" + if NegotiateFlags & NTLM_NegotiateOemWorkstationSupplied: + print "NTLM_NegotiateOemWorkstationSupplied set" + if NegotiateFlags & NTLM_Unknown6: + print "NTLM_Unknown6 set" + if NegotiateFlags & NTLM_NegotiateAlwaysSign: + print "NTLM_NegotiateAlwaysSign set" + if NegotiateFlags & NTLM_TargetTypeDomain: + print "NTLM_TargetTypeDomain set" + if NegotiateFlags & NTLM_TargetTypeServer: + print "NTLM_TargetTypeServer set" + if NegotiateFlags & NTLM_TargetTypeShare: + print "NTLM_TargetTypeShare set" + if NegotiateFlags & NTLM_NegotiateExtendedSecurity: + print "NTLM_NegotiateExtendedSecurity set" + if NegotiateFlags & NTLM_NegotiateIdentify: + print "NTLM_NegotiateIdentify set" + if NegotiateFlags & NTLM_Unknown5: + print "NTLM_Unknown5 set" + if NegotiateFlags & NTLM_RequestNonNTSessionKey: + print "NTLM_RequestNonNTSessionKey set" + if NegotiateFlags & NTLM_NegotiateTargetInfo: + print "NTLM_NegotiateTargetInfo set" + if NegotiateFlags & NTLM_Unknown4: + print "NTLM_Unknown4 set" + if NegotiateFlags & NTLM_NegotiateVersion: + print "NTLM_NegotiateVersion set" + if NegotiateFlags & NTLM_Unknown3: + print "NTLM_Unknown3 set" + if NegotiateFlags & NTLM_Unknown2: + print "NTLM_Unknown2 set" + if NegotiateFlags & NTLM_Unknown1: + print "NTLM_Unknown1 set" + if NegotiateFlags & NTLM_Negotiate128: + print "NTLM_Negotiate128 set" + if NegotiateFlags & NTLM_NegotiateKeyExchange: + print "NTLM_NegotiateKeyExchange set" + if NegotiateFlags & NTLM_Negotiate56: + print "NTLM_Negotiate56 set" + +def create_NTLM_NEGOTIATE_MESSAGE(user, type1_flags=NTLM_TYPE1_FLAGS): + BODY_LENGTH = 40 + Payload_start = BODY_LENGTH # in bytes + protocol = 'NTLMSSP\0' #name + + type = struct.pack(' 40: + TargetInfoLen = struct.unpack(" Package Settings > Package Control > Settings - User and + set the key "submit_usage" to false. + + - Added local tracking of installed packages in + User/Package Control.sublime-settings via the "installed_packages" key. + This allows distributing a settings file that will automatically install + packages. + + - repositories.json schema version was increased to 1.1 and the + "last_modified" key was added. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt new file mode 100644 index 0000000..0a055a0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/messages/1.6.0.txt @@ -0,0 +1,95 @@ +Package Control 1.6.0 Changelog: + +Wow! It has been 9 months since the last stable release of Package Control. +Quite a lot has happened since then, including the release of Sublime Text 2 +stable, and hundreds upon hundreds of new packages from the community! + +A quick thank you to Kevin Yank (@sentience) for recently volunteering to help +review packages for inclusion in the default channel, and ninj0x +(https://github.com/ninj0x) for rewriting the Package Control Community +Packages search functionality so it is nice and fast once again! The lists +below include specific thanks for code contributions. + +As Sublime Text has become increasingly more popular, and the number of +packages has increased so rapidly, the bandwidth requirements have also +significantly increased. This month the default channel will very likely serve +over 1TB of JSON data. If you feel so inclined, consider pitching in a small +amount to help cover the cost: +http://wbond.net/sublime_packages/package_control/say_thanks. A big thank you +to all of the users who have already contributed! + + +Enhancements + + + - Added full (custom) proxy authentication support for HTTPS connections + + - Added NTLM authentication for proxies on Windows + + - Proxy authentication information is now set via the new proxy_username and + proxy_password settings. + + - If the https_proxy setting it set to false, it will not inherit from the + http_proxy setting (thanks planardothum!) + + - The time of the last successful run is no longer stored in + Packages/User/Package Control.sublime-settings, but rather in + Packages/User/Package Control.last-run making it easier to ignore via git, + hg, etc. (thanks schlamar!) + + - Packages are now ignored during install and upgrade to help prevents errors + where Sublime Text tries to read a file as it is being extracted + + - Packages that include DLLs for Windows can now be upgraded. In-use + DLLs will be detected and the user prompted to restart. + + - Package version numbers may now include non-numeric components, and semantic + versioning (http://semver.org) is fully supported + + - JSON parsing messages are now printed to the console instead of being shown + in an error popup + + - Added support for changes to the BitBucket API + + - Added support for changes to GitHub URLs + + - Added the debug setting to help track down HTTP connection issues + + - All of the downloaders will now try to use HTTP compression + + - All of the downloaders will now follow redirects + + - Added new install_missing setting to control if Package Control should try + to install any packages that appear to be missing from the current machine. + This defaults to true, and is really only useful if you want to prevent + Package Control from connecting to the internet without explicitly asking + it to. + + - Added lots of code comments as a first step towards making contributions + by other developers easier + + +Bug Fixes + + + - Added support for the new preferences filename (thanks titoBouzout!) + + - If a package is missing from a machine, but not available for that + platform, it is no longer considered an error (thanks schlamar!) + + - Updated CA certs + + - Fixed handling of install and upgrade messages that contain non-ASCII + characters + + - Fixed a unicode error trying to load the CA cert bundle file on Windows when + the install path to Sublime Text contains non-ASCII characters + + - Better handling for edge case HTTP errors (thanks tgecho!) + + - Fixed a number of errors related to non-ASCII error messages being created + by the operating system (thanks quarnster!) + + - GitHub URLs will now automatically be trimmed of trailing .git suffixes + + - Badly formatted messages.json files will no longer break the install process \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json new file mode 100644 index 0000000..6dbaeb0 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/package-metadata.json @@ -0,0 +1,5 @@ +{ + "version": "1.6.3", + "url": "http://wbond.net/sublime_packages/package_control", + "description": "A full-featured package manager" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole new file mode 100644 index 0000000..eb37565 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Package Control/readme.creole @@ -0,0 +1,43 @@ += Sublime Package Control + +A Sublime Text 2 (http://www.sublimetext.com/2) package manager for easily +discovering, install, upgrading and removing packages. Also includes an +automatic updater and package creation tool. + +Packages can be installed from GitHub, BitBucket or custom package repositories. +The plugin uses a channel and repository system to allow users to find new +packages over time without any work. It also supports working with packages that +were manually installed. + +Please see http://wbond.net/sublime_packages/package_control for install +instructions, screenshots and documentation. + +== License + +Sublime Package Control (except for the ntlm library) is licensed under the MIT +license. + + Copyright (c) 2011-2012 Will Bond + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + +The ntlm library (for Windows) is from the python-ntlm project +(http://code.google.com/p/python-ntlm/) and is licensed under the GNU Lesser +General Public License (LGPL). Details can be found in the source files +located in lib/windows/ntlm/. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap new file mode 100644 index 0000000..d086f83 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Linux).sublime-keymap @@ -0,0 +1,6 @@ +[ + { + "keys": ["super+k", "super+t"], + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap new file mode 100644 index 0000000..d086f83 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (OSX).sublime-keymap @@ -0,0 +1,6 @@ +[ + { + "keys": ["super+k", "super+t"], + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap new file mode 100644 index 0000000..d086f83 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default (Windows).sublime-keymap @@ -0,0 +1,6 @@ +[ + { + "keys": ["super+k", "super+t"], + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands new file mode 100644 index 0000000..a1cb933 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/Default.sublime-commands @@ -0,0 +1,6 @@ +[ + { + "caption": "RecentActiveFiles: recent_active_files", + "command": "recent_active_files" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md new file mode 100644 index 0000000..f6a1aff --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/README.md @@ -0,0 +1,18 @@ +RecentActiveFiles +======== + +Sublime Text 2 plugin that shows and opens recent activated files. + +![Screenshot](http://i.imgur.com/T6kIQ.png) + +The idea was got from here: [GotoRecent](https://github.com/paccator/GotoRecent) + +## Installation + +``` +$ cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages +$ git clone https://github.com/jugyo/SublimeRecentActiveFiles.git RecentActiveFiles +``` +## Usage + +The `recent_active_files` command is binded to `super+k + super+t`. diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py new file mode 100644 index 0000000..e8cc71d --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/RecentActiveFiles.py @@ -0,0 +1,40 @@ +import sublime_plugin +import os + +class RecentActiveFilesEventListener(sublime_plugin.EventListener): + def on_activated(self, view): + if view.file_name(): + view.window().run_command("recent_active_files", { "file_name": view.file_name() }) + +class RecentActiveFilesCommand(sublime_plugin.WindowCommand): + def __init__(self, window): + sublime_plugin.WindowCommand.__init__(self, window) + self.recent_active_files = [] + + def unshift(self, file_name): + if file_name in self.recent_active_files: + self.recent_active_files.remove(file_name) + self.recent_active_files.insert(0, file_name) + + def path_form_project(self, path): + for folder in self.window.folders(): + path = path.replace(folder + '/', '', 1) + return path + + def run(self, file_name=None): + if file_name: + self.unshift(file_name) + else: + if self.window.active_view() is not None: + active_file = self.window.active_view().file_name() + files = filter(lambda f: f != active_file, self.recent_active_files) + else: + files = self.recent_active_files + + items = [[os.path.basename(f), self.path_form_project(f)] for f in files] + + def on_done(index): + if index >= 0: + self.window.open_file(files[index]) + + self.window.show_quick_panel(items, on_done) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json new file mode 100644 index 0000000..5d0ccb2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/RecentActiveFiles/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/jugyo/SublimeRecentActiveFiles", "version": "2013.01.17.03.59.02", "description": "Sublime Text 2 plugin that shows and opens recent activated files."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu new file mode 100644 index 0000000..f2a1b5e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Context.sublime-menu @@ -0,0 +1,47 @@ +[ + { + "caption": "Search Anywhere", + "mnemonic": "w", + "id": "searchanywhere", + "children": + [ + { + "command": "search_anywhere_from_selection", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input", + "caption": "Search From Input" + }, + { + "caption": "-" + }, + { + "caption": "Select Search Engine Then", + "children": + [ + { + "command": "search_anywhere_from_selection_ask", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input_ask", + "caption": "Search From Input" + } + + ] + }, + { + "caption": "-" + }, + { + "command": "search_anywhere_select_default_search_engine", + "caption": "Set Default Search Engine" + }, + { + "command": "search_anywhere_select_search_engine_for_type", + "caption": "Set Search Engine For File Type" + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands new file mode 100644 index 0000000..0ea3a93 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Default.sublime-commands @@ -0,0 +1,26 @@ +[ + { + "caption": "Search Anywhere: From Selection", + "command": "search_anywhere_from_selection" + }, + { + "caption": "Search Anywhere: From Input", + "command": "search_anywhere_from_input" + }, + { + "caption": "Search Anywhere: Set Default Search Engine", + "command": "search_anywhere_select_default_search_engine" + }, + { + "caption": "Search Anywhere: Set Search Engine For File Type", + "command": "search_anywhere_select_search_engine_for_type" + }, + { + "caption": "Search Anywhere: From Selection (ask Search Engine)", + "command": "search_anywhere_from_selection_ask" + }, + { + "caption": "Search Anywhere: From Input (ask Search Engine)", + "command": "search_anywhere_from_input_ask" + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu new file mode 100644 index 0000000..5e06caf --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/Main.sublime-menu @@ -0,0 +1,55 @@ +[ + { + "caption": "Tools", + "mnemonic": "t", + "id": "tools", + "children": + [ + { + "caption": "Search Anywhere", + "mnemonic": "w", + "id": "searchanywhere", + "children": + [ + { + "command": "search_anywhere_from_selection", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input", + "caption": "Search From Input" + }, + { + "caption": "-" + }, + { + "caption": "Select Search Engine Then", + "children": + [ + { + "command": "search_anywhere_from_selection_ask", + "caption": "Search From Selection" + }, + { + "command": "search_anywhere_from_input_ask", + "caption": "Search From Input" + } + + ] + }, + { + "caption": "-" + }, + { + "command": "search_anywhere_select_default_search_engine", + "caption": "Set Default Search Engine" + }, + { + "command": "search_anywhere_select_search_engine_for_type", + "caption": "Set Search Engine For File Type" + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md new file mode 100644 index 0000000..392943b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/README.md @@ -0,0 +1,25 @@ +# Sublime Text 2 Search Anywhere Plugin + +A plugin that allows the user to search the web through multiple search engines. Each file type can have its own search engine. + +## Install + +The preferred method is to use the [Sublime Package Manager](http://wbond.net/sublime_packages/package_control). Alternatively, the files can be obtained on github: + + $ https://github.com/ericmartel/Sublime-Text-2-Search-Anywhere-Plugin + +## Complete Documentation + +A website is currently under construction to explain the usage of the plugin in details. In the meantime, please visit this [Web Site](http://www.ericmartel.com/sublime-text-2-search-anywhere/). + +# License + +All of Sublime Text 2 Search Anywhere Plugin is licensed under the MIT license. + +Copyright (c) 2012 Eric Martel + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json new file mode 100644 index 0000000..d04c6d8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages.json @@ -0,0 +1,3 @@ +{ + "install": "messages/install.txt" +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt new file mode 100644 index 0000000..9e8ff3c --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/messages/install.txt @@ -0,0 +1,9 @@ +Search Anywhere by Eric Martel (emartel@gmail.com / www.ericmartel.com) + +Thank you for installing Search Anywhere. For detailed instructions please visit http://www.ericmartel.com/sublime-text-2-search-anywhere/. All commands are available through menus, context menus and the command palette. + +Please direct any feedback to emartel@gmail.com or through github at https://github.com/ericmartel/Sublime-Text-2-Search-Anywhere-Plugin. + +Thank you for your support. + +Eric Martel \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json new file mode 100644 index 0000000..0de4b03 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/package-metadata.json @@ -0,0 +1 @@ +{"url": "http://www.ericmartel.com/sublime-text-2-search-anywhere/", "version": "2012.03.20.16.35.46", "description": "Utility to quickly search on multiple search engines from the current selection or custom input. Default search engine configurable per file type. Search Engines defined through JSON including Google, Yahoo, Bing, Stack Overflow, PHP.net, sitepoint and caniuse.com "} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py new file mode 100644 index 0000000..2b33061 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchanywhere.py @@ -0,0 +1,160 @@ +# Written by Eric Martel (emartel@gmail.com / www.ericmartel.com) + +import sublime +import sublime_plugin + +import subprocess +import webbrowser +import threading +import os +import json + +searchanywhere_dir = os.getcwdu() + +# Helper functions +def SearchFor(view, text, searchurl): + if not searchurl: + # see if we have an extension match first, then use default + settings = sublime.load_settings(__name__ + '.sublime-settings') + + filename, ext = os.path.splitext(view.file_name()) + typesettings = settings.get('searchanywhere_type_searchengine', []) + + foundsetting = False + for typesetting in typesettings: + if typesetting['extension'] == ext: + foundsetting = True + searchurl = typesetting['searchurl'] + + if not foundsetting: + if settings.has('searchanywhere_searchurl'): + searchurl = settings.get('searchanywhere_searchurl') + else: + sublime.error_message(__name__ + ': No Search Engine selected') + return + else: + # search url is provided by the caller + pass + + url = searchurl.replace('{0}', text.replace(' ','%20')) + webbrowser.open_new_tab(url) + +def ShowSearchEnginesList(window, callback): + searchengines = [] + if os.path.exists(searchanywhere_dir + os.sep + 'searchengines.json'): + f = open(searchanywhere_dir + os.sep + 'searchengines.json') + searchengineslist = json.load(f) + f.close() + + for entry in searchengineslist.get('searchengines'): + formattedentry = [] + formattedentry.append(entry.get('name')) + formattedentry.append(entry.get('baseurl')) + searchengines.append(formattedentry) + + window.show_quick_panel(searchengines, callback) + +def GetSearchEngineEntry(picked): + f = open(searchanywhere_dir + os.sep + 'searchengines.json') + searchengineslist = json.load(f) + entry = searchengineslist.get('searchengines')[picked] + f.close() + return entry + +class SearchAnywhereFromSelectionAskCommand(sublime_plugin.TextCommand): + def run(self, edit): + ShowSearchEnginesList(self.view.window(), self.on_select_done) + + def on_select_done(self, picked): + entry = GetSearchEngineEntry(picked) + + for selection in self.view.sel(): + # if the user didn't select anything, search the currently highlighted word + if selection.empty(): + selection = self.view.word(selection) + + text = self.view.substr(selection) + SearchFor(self.view, text, entry.get('searchurl')) + +class SearchAnywhereFromInputAskCommand(sublime_plugin.WindowCommand): + def run(self): + ShowSearchEnginesList(self.window, self.on_select_done) + + def on_select_done(self, picked): + self.entry = GetSearchEngineEntry(picked) + + self.window.show_input_panel('Search on ' + self.entry.get('name') + ' for', '', self.on_done, self.on_change, self.on_cancel) + + def on_done(self, input): + SearchFor(self.window.active_view(), input, self.entry.get('searchurl')) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + + +class SearchAnywhereFromSelectionCommand(sublime_plugin.TextCommand): + def run(self, edit): + for selection in self.view.sel(): + # if the user didn't select anything, search the currently highlighted word + if selection.empty(): + selection = self.view.word(selection) + + text = self.view.substr(selection) + SearchFor(self.view, text, None) + +class SearchAnywhereFromInputCommand(sublime_plugin.WindowCommand): + def run(self): + settings = sublime.load_settings(__name__ + '.sublime-settings') + if settings.has('searchanywhere_searchengine'): + engine = settings.get('searchanywhere_searchengine') + self.window.show_input_panel('Search on ' + engine + ' for', '', self.on_done, self.on_change, self.on_cancel) + else: + sublime.error_message(__name__ + ': No Search Engine selected') + + def on_done(self, input): + SearchFor(self.window.active_view(), input, None) + + def on_change(self, input): + pass + + def on_cancel(self): + pass + +# Sets the default Search Engine to use +class SearchAnywhereSelectDefaultSearchEngineCommand(sublime_plugin.WindowCommand): + def run(self): + ShowSearchEnginesList(self.window, self.on_select_done) + + def on_select_done(self, picked): + entry = GetSearchEngineEntry(picked) + + settings = sublime.load_settings(__name__ + '.sublime-settings') + settings.set('searchanywhere_searchengine', entry.get('name')) + settings.set('searchanywhere_searchurl', entry.get('searchurl')) + sublime.save_settings(__name__ + '.sublime-settings') + +# Sets the default Search Engine to use for files sharing the view's extension +class SearchAnywhereSelectSearchEngineForTypeCommand(sublime_plugin.WindowCommand): + def run(self): + self.filename, self.ext = os.path.splitext(self.window.active_view().file_name()) + ShowSearchEnginesList(self.window, self.on_select_done) + + def on_select_done(self, picked): + entry = GetSearchEngineEntry(picked) + + settings = sublime.load_settings(__name__ + '.sublime-settings') + + typesettings = settings.get('searchanywhere_type_searchengine', []) + + newsetting = {} + newsetting['extension'] = self.ext + newsetting['name'] = entry.get('name') + newsetting['searchurl'] = entry.get('searchurl') + + typesettings.append(newsetting) + + settings.set('searchanywhere_type_searchengine', typesettings) + sublime.save_settings(__name__ + '.sublime-settings') \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json new file mode 100644 index 0000000..6e77d7f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Search Anywhere/searchengines.json @@ -0,0 +1,55 @@ +{ + "schema_version": "1.2", + "searchengines": [ + { + "name": "Google", + "baseurl": "www.google.com", + "searchurl": "http://www.google.com/search?q={0}" + }, + { + "name": "Stack Overflow", + "baseurl": "www.stackoverflow.com", + "searchurl": "http://stackoverflow.com/search?tab=relevance&q={0}" + }, + { + "name": "PHP", + "baseurl": "www.php.net", + "searchurl": "http://ca3.php.net/manual-lookup.php?pattern={0}&scope=quickref" + }, + { + "name": "Bing", + "baseurl": "www.bing.com", + "searchurl": "http://www.bing.com/search?q={0}" + }, + { + "name": "Yahoo", + "baseurl": "www.yahoo.com", + "searchurl": "http://search.yahoo.com/search?p={0}" + }, + { + "name": "sitepoint", + "baseurl": "reference.sitepoint.com", + "searchurl": "http://reference.sitepoint.com/html/{0}" + }, + { + "name": "When can I use...", + "baseurl": "caniuse.com", + "searchurl": "http://caniuse.com/#search={0}" + }, + { + "name": "Mozilla Developer Network", + "baseurl": "developer.mozilla.org", + "searchurl": "https://developer.mozilla.org/en-US/search?q={0}" + }, + { + "name": "Ruby on Rails", + "baseurl": "api.rubyonrails.org", + "searchurl": "http://api.rubyonrails.org/?q={0}" + }, + { + "name": "Ruby Doc", + "baseurl": "www.ruby-doc.org", + "searchurl": "http://www.ruby-doc.org/search.html?cx=011815814100681837392%3Awnccv6st5qk&q={0}&sa=Search&cof=FORID%3A9" + } + ] +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore new file mode 100644 index 0000000..a1ba83b --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*.cache +*.sublime-project \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands new file mode 100644 index 0000000..dd290f6 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Commands.sublime-commands @@ -0,0 +1,84 @@ +[ + { + "caption": "File: New File Relative to Current View", + "command": "side_bar_new_file" + }, + { + "caption": "File: Rename", + "command": "side_bar_rename" + }, + { + "caption": "File: Duplicate", + "command": "side_bar_duplicate" + }, + { + "caption": "File: Reveal", + "command": "side_bar_reveal" + }, + { + "caption": "File: Move", + "command": "side_bar_move" + }, + { + "caption": "File: Delete", + "command": "side_bar_delete" + }, + { + "caption": "Project: Edit", + "command": "side_bar_project_open_file" + }, + { + "caption": "File: Copy Name", + "command": "side_bar_copy_name" + }, + { + "caption": "File: Copy Name Encoded", + "command": "side_bar_copy_name_encoded" + }, + { + "caption": "File: Copy Path", + "command": "side_bar_copy_path" + }, + { + "caption": "File: Copy Path as URI", + "command": "side_bar_copy_path_encoded" + }, + { + "caption": "File: Copy Path From Project", + "command": "side_bar_copy_path_absolute_from_project" + }, + { + "caption": "File: Copy Path From Project Encoded", + "command": "side_bar_copy_path_absolute_from_project_encoded" + }, + { + "caption": "File: Copy as Tag a", + "command": "side_bar_copy_tag_ahref" + }, + { + "caption": "File: Copy as Tag script", + "command": "side_bar_copy_tag_script" + }, + { + "caption": "File: Copy as Tag style", + "command": "side_bar_copy_tag_style" + }, + { + "caption": "File: Copy URL", + "command": "side_bar_copy_url" + }, + { + "caption": "File: Search Files", + "command": "side_bar_find_files_path_containing" + }, + { + "caption": "File: Open In Browser - Testing Server", + "command": "side_bar_open_in_browser", + "args":{"paths":[], "type":"testing"} + }, + { + "caption": "File: Open In Browser - Production Server", + "command": "side_bar_open_in_browser", + "args":{"paths":[], "type":"production"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap new file mode 100644 index 0000000..a49123e --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Default.sublime-keymap @@ -0,0 +1,10 @@ +[ + { "keys": ["f12"], + "command": "side_bar_open_in_browser" , + "args":{"paths":[], "type":"testing"} + }, + { "keys": ["alt+f12"], + "command": "side_bar_open_in_browser", + "args":{"paths":[], "type":"production"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu new file mode 100644 index 0000000..81896f2 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Main.sublime-menu @@ -0,0 +1,88 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "Side Bar", + "children": + [ + { + "command": "open_file", "args": + { + "file": "${packages}/SideBarEnhancements/Side Bar.sublime-settings" + }, + "caption": "Settings – Default" + }, + { + "command": "open_file", "args": + { + "file": "${packages}/User/Side Bar.sublime-settings" + }, + "caption": "Settings – User" + }, + { "caption": "-" }, + { + "command": "open_file", + "args": { + "file": "${packages}/SideBarEnhancements/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/SideBarEnhancements/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/SideBarEnhancements/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu new file mode 100644 index 0000000..2670ed9 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-menu @@ -0,0 +1,116 @@ +[ + {"caption":"-", "id":"side-bar-start-separator"}, + { "caption": "New File…", "id": "side-bar-new-file", "command": "side_bar_new_file", "args": {"paths": []} }, + { "caption": "New Folder…", "id": "side-bar-new-directory", "command": "side_bar_new_directory", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-new-separator"}, + + { "caption": "Edit", "id": "side-bar-edit", "command": "side_bar_edit", "args": {"paths": []} }, + { "caption": "Open / Run", "id": "side-bar-open", "command": "side_bar_open", "args": {"paths": []} }, + { "caption": "Open In Browser", "id": "side-bar-open-in-browser", "command": "side_bar_open_in_browser", "args": {"paths": []} }, + { "caption": "Open In New Window", "id": "side-bar-open-in-new-window", "command": "side_bar_open_in_new_window", "args": {"paths": []} }, + { "caption": "Open With Finder", "id": "side-bar-open-with-finde", "command": "side_bar_open_with_finder", "args": {"paths": []} }, + { "caption": "Open With", "id": "side-bar-files-open-with", + + "children": + [ + + { "caption": "-", "id": "side-bar-files-open-with-edit-application-separator"}, + { "caption": "Edit Applications…", "id": "side-bar-files-open-with-edit-applications", "command":"side_bar_files_open_with_edit_applications","args": {"paths": []} }, + { "caption": "-", "id": "side-bar-files-open-with-edit-applications-separator"} + + ] + }, + { "caption": "Reveal", "id": "side-bar-reveal", "command": "side_bar_reveal", "args": {"paths": []} }, + + { "caption": "-", "id": "side-bar-edit-open-separator" }, + + { "caption": "Find & Replace…", "id": "side-bar-find-selected", "command": "side_bar_find_in_selected", "args": {"paths": []} }, + { "caption": "Find In Project…", "id": "side-bar-find-in-project", "command": "side_bar_find_in_project", "args": {"paths": []} }, + { "caption": "Find Advanced", "id": "side-bar-find-advanced", + "children": + [ + { "caption": "In Parent Folder…", "id": "side-bar-find-parent", "command": "side_bar_find_in_parent", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-find-parent-separator"}, + { "caption": "In Project Folder…", "id": "side-bar-find-project-folder", "command": "side_bar_find_in_project_folder", "args": {"paths": []} }, + { "caption": "In Project Folders…", "id": "side-bar-find-project-folders", "command": "side_bar_find_in_project_folders"}, + { "caption": "-", "id": "side-bar-find-project-separator"}, + { "id": "side-bar-find-in-files-with-extension", "command": "side_bar_find_in_files_with_extension", "args": {"paths": []}}, + { "caption": "In Paths Containing…", "id": "side-bar-find-files-path-containing", "command": "side_bar_find_files_path_containing", "args": {"paths": []} } + + ] + }, + { "caption": "-", "id": "side-bar-find-separator"}, + { "caption": "Cut", "id": "side-bar-clip-cut", "command": "side_bar_cut", "args": {"paths": []} }, + { "caption": "Copy", "id": "side-bar-clip-copy", "command": "side_bar_copy", "args": {"paths": []} }, + { "caption": "Copy Name", "id": "side-bar-clip-copy-name", "command": "side_bar_copy_name", "args": {"paths": []} }, + { "caption": "Copy Path", "id": "side-bar-clip-copy-path", "command": "side_bar_copy_path_absolute_from_project_encoded", "args": {"paths": []} }, + { "caption": "Copy Dir Path", "id": "side-bar-clip-copy-dir-path", "command": "side_bar_copy_dir_path", "args": {"paths": []} }, + { "caption": "Copy as Text", "id": "side-bar-clip-copy-as", + "children": + [ + { "caption": "Relative Path From View Encoded", "id": "side-bar-clip-copy-path-relative-from-view-encoded", "command": "side_bar_copy_path_relative_from_view_encoded", "args": {"paths": []} }, + { "caption": "Relative Path From View", "id": "side-bar-clip-copy-path-relative-from-view", "command": "side_bar_copy_path_relative_from_view", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-relative-from-view-separator"}, + + { "caption": "Relative Path From Project Encoded", "id": "side-bar-clip-copy-path-relative-from-project-encoded", "command": "side_bar_copy_path_relative_from_project_encoded", "args": {"paths": []} }, + { "caption": "Relative Path From Project", "id": "side-bar-clip-copy-path-relative-from-project", "command": "side_bar_copy_path_relative_from_project", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-relative-from-project-separator"}, + + { "caption": "Absolute Path From Project Encoded", "id": "side-bar-clip-copy-path-absolute-from-project-encoded", "command": "side_bar_copy_path_absolute_from_project_encoded", "args": {"paths": []} }, + { "caption": "Absolute Path From Project", "id": "side-bar-clip-copy-path-absolute-from-project", "command": "side_bar_copy_path_absolute_from_project", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-absolute-from-project-separator"}, + + { "caption": "Path as URI", "id": "side-bar-clip-copy-path-encoded", "command": "side_bar_copy_path_encoded", "args": {"paths": []} }, + { "caption": "Path", "id": "side-bar-clip-copy-path", "command": "side_bar_copy_path", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-path-separator"}, + + { "caption": "Name Encoded", "id": "side-bar-clip-copy-name-encoded", "command": "side_bar_copy_name_encoded", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-name-encoded-separator"}, + + { "caption": "URL", "id": "side-bar-clip-copy-url", "command": "side_bar_copy_url", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-url-separator"}, + + { "caption": "Tag a", "id": "side-bar-clip-copy-tag-a", "command": "side_bar_copy_tag_ahref", "args": {"paths": []} }, + { "caption": "Tag img", "id": "side-bar-clip-copy-tag-img", "command": "side_bar_copy_tag_img", "args": {"paths": []} }, + { "caption": "Tag script", "id": "side-bar-clip-copy-tag-script", "command": "side_bar_copy_tag_script", "args": {"paths": []} }, + { "caption": "Tag style", "id": "side-bar-clip-copy-tag-style", "command": "side_bar_copy_tag_style", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-tag-separator"}, + { "caption": "Project Folders", "id": "side-bar-clip-copy-project-directories", "command": "side_bar_copy_project_directories", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-clip-copy-project-directories-separator"}, + { "caption": "Content as UTF-8", "id": "side-bar-clip-copy-content-utf8", "command": "side_bar_copy_content_utf8", "args": {"paths": []} }, + { "caption": "Content as Data URI", "id": "side-bar-clip-copy-content-base-64", "command": "side_bar_copy_content_base64", "args": {"paths": []} } + ] + }, + + { "caption": "Paste", "id": "side-bar-clip-paste", "command": "side_bar_paste", "args": {"paths": [], "in_parent":"False"} }, + { "caption": "Paste in Parent", "id": "side-bar-clip-paste-in-parent", "command": "side_bar_paste", "args": {"paths": [], "in_parent":"True"} }, + { "caption": "-", "id": "side-bar-clip-separator" }, + { "caption": "Duplicate…", "id": "side-bar-duplicate", "command": "side_bar_duplicate", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-duplicate-separator" }, + + { "caption": "Rename…", "id": "side-bar-rename", "command": "side_bar_rename", "args": {"paths": []} }, + { "caption": "Move…", "id": "side-bar-move", "command": "side_bar_move", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-rename-move-separator" }, + + { "caption": "Delete", "id": "side-bar-delete", "command": "side_bar_delete", "args": {"paths": []} }, + { "caption": "Empty", "id": "side-bar-emptry", "command": "side_bar_empty", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-delete-separator" }, + + { "caption": "Refresh", "id": "side-bar-refresh", "command": "refresh_folder_list" }, + { "caption": "-", "id": "side-bar-refresh-separator" }, + { "caption": "Project", "id": "side-bar-project", + "children": + [ + { "caption": "Edit Project", "id": "side-bar-project-open-file", "command": "side_bar_project_open_file", "args": {"paths": []} }, + { "caption": "Edit Projects Preview URLs", "id": "side-bar-project-preview-url", "command": "side_bar_project_open_project_preview_urls_file", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-project-open-file-separator" }, + { "caption": "Promote as Project Folder", "id": "side-bar-project-item-add", "command": "side_bar_project_item_add", "args": {"paths": []} }, + { "caption": "Exclude From Project", "id": "side-bar-project-item-exclude", "command": "side_bar_project_item_exclude", "args": {"paths": []} }, + { "caption": "-", "id": "side-bar-project-item-separator" }, + { "caption": "Remove Folder from Project", "id": "side-bar-project-item-remove-folder", "command": "side_bar_project_item_remove_folder", "args": { "paths": []} }, + { "command": "prompt_add_folder", "caption": "Add Folder to Project…", "mnemonic": "d" } + + ] + }, + { "caption": "-", "id": "side-bar-end-separator" } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings new file mode 100644 index 0000000..a5f7958 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/Side Bar.sublime-settings @@ -0,0 +1,32 @@ +{ + "statusbar_modified_time" : false, + "statusbar_modified_time_format" : "%A %b %d %H:%M:%S %Y", + + "statusbar_file_size" : false, + + "close_affected_buffers_when_deleting_even_if_dirty" : false, + + "hide_open_with_entries_when_there_are_no_applicable" : false, + + "confirm_before_deleting" : true, + + "new_files_relative_to_project_root": false, + + "disabled_menuitem_edit": false, + "disabled_menuitem_open_run": false, + "disabled_menuitem_open_in_browser": false, + "disabled_menuitem_open_in_new_window": false, + "disabled_menuitem_find_in_project": false, + "disabled_menuitem_copy_name": false, + "disabled_menuitem_copy_path": false, + "disabled_menuitem_copy_dir_path": true, + "disabled_menuitem_paste_in_parent": false, + "disabled_menuitem_empty": true, + + //if installed in a default location maybe this works. + "default_browser": "chrome", //one of this list: firefox, chrome, chromium, opera, safari + + "portable_browser": "" // for example: C:/Program Files (x86)/Nightly/firefox.exe + + +} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage new file mode 100644 index 0000000..982444a --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar Results.hidden-tmLanguage @@ -0,0 +1,50 @@ + + + + + name + SideBar Results + + patterns + + + match + (Type to search\:).* + captures + + 1 + + name + entity.name.function + + + + + match + ([0-9]+) match.* + captures + + 1 + + name + entity.name.function + + + + + match + ^(.*(\:|/).*)$ + captures + + 1 + + name + entity.name.filename.find-in-files + + + + + scopeName + text.find-in-files + + \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py new file mode 100644 index 0000000..c0400dd --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/SideBar.py @@ -0,0 +1,1502 @@ +# coding=utf8 +import sublime, sublime_plugin +import os + +import threading, time + +from sidebar.SideBarItem import SideBarItem +from sidebar.SideBarSelection import SideBarSelection +from sidebar.SideBarProject import SideBarProject + +from send2trash import send2trash + +# needed for getting local app data path on windows +if sublime.platform() == 'windows': + import _winreg + +def disable_default(): + default = sublime.packages_path()+'/Default/Side Bar.sublime-menu' + desired = sublime.packages_path()+'/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt' + if file(default, 'r').read() == file(desired, 'r').read(): + file(default, 'w+').write('[/*'+file(desired, 'r').read()+'*/]') + + default = sublime.packages_path()+'/Default/Side Bar Mount Point.sublime-menu' + desired = sublime.packages_path()+'/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt' + if file(default, 'r').read() == file(desired, 'r').read(): + file(default, 'w+').write('[/*'+file(desired, 'r').read()+'*/]') + +try: + disable_default(); +except: + pass + +def expand_vars(path): + for k, v in os.environ.iteritems(): + # dirty hack, this should be autofixed in python3 + try: + k = unicode(k.encode('utf8')) + v = unicode(v.encode('utf8')) + path = path.replace('%'+k+'%', v).replace('%'+k.lower()+'%', v) + except: + pass + return path +#NOTES +# A "directory" for this plugin is a "directory" +# A "directory" for a user is a "folder" + +s = sublime.load_settings('Side Bar.sublime-settings') + +def check_version(): + version = '11.13.2012.1305.0'; + if s.get('version') != version: + SideBarItem(sublime.packages_path()+'/SideBarEnhancements/messages/'+version+'.txt', False).edit(); + s.set('version', version); + sublime.save_settings('Side Bar.sublime-settings') + +sublime.set_timeout(lambda:check_version(), 3000); + +class SideBarNewFile2Command(sublime_plugin.WindowCommand): + def run(self, paths = [], name = ""): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("File Name:", name, functools.partial(SideBarNewFileCommand(sublime_plugin.WindowCommand).on_done, paths, True), None, None) + +class SideBarNewFileCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], name = ""): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("File Name:", name, functools.partial(self.on_done, paths, False), None, None) + + def on_done(self, paths, relative_to_project, name): + if relative_to_project and s.get('new_files_relative_to_project_root'): + paths = SideBarProject().getDirectories() + if paths: + paths = [SideBarItem(paths[0], False)] + if not paths: + paths = SideBarSelection(paths).getSelectedDirectoriesOrDirnames() + else: + paths = SideBarSelection(paths).getSelectedDirectoriesOrDirnames() + if not paths: + paths = SideBarProject().getDirectories() + if paths: + paths = [SideBarItem(paths[0], False)] + if not paths: + sublime.active_window().new_file() + else: + for item in paths: + item = SideBarItem(item.join(name), False) + if item.exists(): + sublime.error_message("Unable to create file, file or folder exists.") + self.run(paths, name) + return + else: + try: + item.create() + item.edit() + except: + sublime.error_message("Unable to create file:\n\n"+item.path()) + self.run(paths, name) + return + SideBarProject().refresh(); + +class SideBarNewDirectoryCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], name = ""): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("Folder Name:", name, functools.partial(self.on_done, paths), None, None) + + def on_done(self, paths, name): + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + item = SideBarItem(item.join(name), True) + if item.exists(): + sublime.error_message("Unable to create folder, folder or file exists.") + self.run(paths, name) + return + else: + item.create() + if not item.exists(): + sublime.error_message("Unable to create folder:\n\n"+item.path()) + self.run(paths, name) + return + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarEditCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + for item in SideBarSelection(paths).getSelectedFiles(): + item.edit() + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_edit') + +class SideBarOpenCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + for item in SideBarSelection(paths).getSelectedFiles(): + item.open() + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_open_run') + +class SideBarFilesOpenWithEditApplicationsCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + item = SideBarItem(os.path.join(sublime.packages_path(), 'User', 'SideBarEnhancements', 'Open With', 'Side Bar.sublime-menu'), False) + if not item.exists(): + item.create() + item.write("""[ + {"id": "side-bar-files-open-with", + "children": + [ + + //application 1 + { + "caption": "Photoshop", + "id": "side-bar-files-open-with-photoshop", + + "command": "side_bar_files_open_with", + "args": { + "paths": [], + "application": "Adobe Photoshop CS5.app", // OSX + "extensions":"psd|png|jpg|jpeg" //any file with these extensions + } + }, + + //separator + {"caption":"-"}, + + //application 2 + { + "caption": "SeaMonkey", + "id": "side-bar-files-open-with-seamonkey", + + "command": "side_bar_files_open_with", + "args": { + "paths": [], + "application": "C:\\\\Archivos de programa\\\\SeaMonkey\\\\seamonkey.exe", // WINNT + "extensions":"" //open all even folders + } + }, + //application n + { + "caption": "Chrome", + "id": "side-bar-files-open-with-chrome", + + "command": "side_bar_files_open_with", + "args": { + "paths": [], + "application": "C:\\\\Documents and Settings\\\\tito\\\\Configuración local\\\\Datos de programa\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe", + "extensions":".*" //any file with extension + } + }, + + {"caption":"-"} + ] + } +]"""); + item.edit() + + def is_enabled(self, paths = []): + return True + +class SideBarFilesOpenWithCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], application = "", extensions = ""): + import sys + application_dir, application_name = os.path.split(application) + application_dir = application_dir.encode(sys.getfilesystemencoding()) + application_name = application_name.encode(sys.getfilesystemencoding()) + application = application.encode(sys.getfilesystemencoding()) + + if extensions == '*': + extensions = '.*' + if extensions == '': + items = SideBarSelection(paths).getSelectedItems() + else: + items = SideBarSelection(paths).getSelectedFilesWithExtension(extensions) + + import subprocess + for item in items: + if sublime.platform() == 'osx': + subprocess.Popen(['open', '-a', application, item.nameSystem()], cwd=item.dirnameSystem()) + elif sublime.platform() == 'windows': + subprocess.Popen([application_name, item.pathSystem()], cwd=expand_vars(application_dir), shell=True) + else: + subprocess.Popen([application_name, item.nameSystem()], cwd=item.dirnameSystem()) + + def is_enabled(self, paths = [], application = "", extensions = ""): + if extensions == '*': + extensions = '.*' + if extensions == '': + return SideBarSelection(paths).len() > 0 + else: + return SideBarSelection(paths).hasFilesWithExtension(extensions) + + def is_visible(self, paths = [], application = "", extensions = ""): + if extensions == '*': + extensions = '.*' + if extensions == '': + return SideBarSelection(paths).len() > 0 + else: + has = SideBarSelection(paths).hasFilesWithExtension(extensions) + return has or (not has and not s.get("hide_open_with_entries_when_there_are_no_applicable")) + +class SideBarFindInSelectedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(item.path()) + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items) }) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":",".join(items) }) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarFindInParentCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.dirname()) + items = list(set(items)) + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items) }) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":",".join(items) }) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarFindInProjectFoldersCommand(sublime_plugin.WindowCommand): + def run(self): + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2137: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2136: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":""}) + +class SideBarFindInProjectCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2137: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2136: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + elif int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":""}) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":""}) + + def is_visible(self, paths = []): + return not s.get('disabled_menuitem_find_in_project') + +class SideBarFindInProjectFolderCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(SideBarProject().getDirectoryFromPath(item.path())) + items = list(set(items)) + if items: + self.window.run_command('hide_panel'); + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items)}) + +class SideBarFindInFilesWithExtensionCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append('*'+item.extension()) + items = list(set(items)) + self.window.run_command('hide_panel'); + if int(sublime.version()) >= 2134: + self.window.run_command("show_panel", {"panel": "find_in_files", "where":",".join(items) }) + else: + self.window.run_command("show_panel", {"panel": "find_in_files", "location":",".join(items) }) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + + def description(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFiles(): + items.append('*'+item.extension()) + items = list(set(items)) + if len(items) > 1: + return 'In Files With Extensions '+(",".join(items))+u'…' + elif len(items) > 0: + return 'In Files With Extension '+(",".join(items))+u'…' + else: + return u'In Files With Extension…' + + +sidebar_instant_search = 0 + +class SideBarFindFilesPathContainingCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + global sidebar_instant_search + if paths == [] and SideBarProject().getDirectories(): + paths = SideBarProject().getDirectories() + else: + paths = [item.path() for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames()] + if paths == []: + return + view = self.window.new_file() + view.settings().set('word_wrap', False) + view.set_name('Instant File Search') + view.set_syntax_file('Packages/SideBarEnhancements/SideBar Results.hidden-tmLanguage') + view.set_scratch(True) + edit = view.begin_edit() + view.settings().set('sidebar_instant_search_paths', paths) + view.replace(edit, sublime.Region(0, view.size()), "Type to search: ") + view.end_edit(edit) + view.sel().clear() + view.sel().add(sublime.Region(16)) + sidebar_instant_search += 1 + + def is_enabled(self, paths=[]): + return True + +class SideBarFindResultsViewListener(sublime_plugin.EventListener): + + def on_modified(self, view): + global sidebar_instant_search + if sidebar_instant_search > 0 and view.settings().has('sidebar_instant_search_paths'): + row, col = view.rowcol(view.sel()[0].begin()) + if row != 0 or not view.sel()[0].empty(): + return + paths = view.settings().get('sidebar_instant_search_paths') + searchTerm = view.substr(view.line(0)).replace("Type to search:", "").strip() + start_time = time.time() + view.settings().set('sidebar_search_paths_start_time', start_time) + if searchTerm: + sublime.set_timeout(lambda:SideBarFindFilesPathContainingSearchThread(paths, searchTerm, view, start_time).start(), 300) + + def on_close(self, view): + if view.settings().has('sidebar_instant_search_paths'): + global sidebar_instant_search + sidebar_instant_search -= 1 + +class SideBarFindFilesPathContainingSearchThread(threading.Thread): + def __init__(self, paths, searchTerm, view, start_time): + if view.settings().get('sidebar_search_paths_start_time') != start_time: + self.should_run = False + else: + self.should_run = True + self.view = view + self.searchTerm = searchTerm + self.paths = paths + self.start_time = start_time + threading.Thread.__init__(self) + + def run(self): + if not self.should_run: + return + # print 'run forrest run' + self.total = 0 + self.highlight_from = 0 + self.match_result = u'' + self.match_result += 'Type to search: '+self.searchTerm+'\n' + for item in SideBarSelection(self.paths).getSelectedDirectoriesOrDirnames(): + self.files = [] + self.num_files = 0 + self.find(item.path()) + self.match_result += '\n' + length = len(self.files) + if length > 1: + self.match_result += str(length)+' matches' + elif length > 0: + self.match_result += '1 match' + else: + self.match_result += 'No match' + self.match_result += ' in '+str(self.num_files)+' files for term "'+self.searchTerm+'" under \n"'+item.path()+'"\n\n' + if self.highlight_from == 0: + self.highlight_from = len(self.match_result) + self.match_result += ('\n'.join(self.files)) + self.total = self.total + length + self.match_result += '\n' + sublime.set_timeout(lambda:self.on_done(), 0) + + def on_done(self): + if self.start_time == self.view.settings().get('sidebar_search_paths_start_time'): + view = self.view; + edit = view.begin_edit() + sel = sublime.Region(view.sel()[0].begin(), view.sel()[0].end()) + view.replace(edit, sublime.Region(0, view.size()), self.match_result); + view.end_edit(edit) + view.erase_regions("sidebar_search_instant_highlight") + if self.total < 30000 and len(self.searchTerm) > 1: + regions = [item for item in view.find_all(self.searchTerm, sublime.LITERAL|sublime.IGNORECASE) if item.begin() >= self.highlight_from] + view.add_regions("sidebar_search_instant_highlight", regions, 'string', sublime.DRAW_EMPTY|sublime.DRAW_OUTLINED|sublime.DRAW_EMPTY_AS_OVERWRITE) + view.sel().clear() + view.sel().add(sel) + + def find(self, path): + if os.path.isfile(path) or os.path.islink(path): + self.num_files = self.num_files+1 + if self.match(path): + self.files.append(path) + elif os.path.isdir(path): + for content in os.listdir(path): + file = os.path.join(path, content) + if os.path.isfile(file) or os.path.islink(file): + self.num_files = self.num_files+1 + if self.match(file): + self.files.append(file) + else: + self.find(file) + + def match(self, path): + return False if path.lower().find(self.searchTerm.lower()) == -1 else True + +class SideBarCutCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(item.path()) + + if len(items) > 0: + s.set('cut', "\n".join(items)) + s.set('copy', '') + if len(items) > 1 : + sublime.status_message("Items cut") + else : + sublime.status_message("Item cut") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasProjectDirectories() == False + + +class SideBarCopyCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + items = [] + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + items.append(item.path()) + + if len(items) > 0: + s.set('cut', '') + s.set('copy', "\n".join(items)) + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarPasteCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], in_parent = 'False', test = 'True', replace = 'False'): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + + cut = s.get('cut', '') + copy = s.get('copy', '') + + already_exists_paths = [] + + if SideBarSelection(paths).len() > 0: + if in_parent == 'False': + location = SideBarSelection(paths).getSelectedItems()[0].path() + else: + location = SideBarSelection(paths).getSelectedDirectoriesOrDirnames()[0].dirname() + + if os.path.isdir(location) == False: + location = SideBarItem(os.path.dirname(location), True) + else: + location = SideBarItem(location, True) + + if cut != '': + cut = cut.split("\n") + for path in cut: + path = SideBarItem(path, os.path.isdir(path)) + new = os.path.join(location.path(), path.name()) + if test == 'True' and os.path.exists(new): + already_exists_paths.append(new) + elif test == 'False': + if os.path.exists(new) and replace == 'False': + pass + else: + try: + if not path.move(new, replace == 'True'): + sublime.error_message("Unable to cut and paste, destination exists.") + return + except: + sublime.error_message("Unable to move:\n\n"+path.path()+"\n\nto\n\n"+new) + return + + if copy != '': + copy = copy.split("\n") + for path in copy: + path = SideBarItem(path, os.path.isdir(path)) + new = os.path.join(location.path(), path.name()) + if test == 'True' and os.path.exists(new): + already_exists_paths.append(new) + elif test == 'False': + if os.path.exists(new) and replace == 'False': + pass + else: + try: + if not path.copy(new, replace == 'True'): + sublime.error_message("Unable to copy and paste, destination exists.") + return + except: + sublime.error_message("Unable to copy:\n\n"+path.path()+"\n\nto\n\n"+new) + return + + if test == 'True' and len(already_exists_paths): + self.confirm(paths, in_parent, already_exists_paths) + elif test == 'True' and not len(already_exists_paths): + self.run(paths, in_parent, 'False', 'False') + elif test == 'False': + cut = s.set('cut', '') + SideBarProject().refresh(); + + def confirm(self, paths, in_parent, data): + import functools + window = sublime.active_window() + # window.show_input_panel("BUG!", '', '', None, None) + # window.run_command('hide_panel'); + + yes = [] + yes.append('Yes, Replace the following items:'); + for item in data: + yes.append(SideBarItem(item, os.path.isdir(item)).pathWithoutProject()) + + no = [] + no.append('No'); + no.append('Continue without replacing'); + + window.show_quick_panel([yes, no], functools.partial(self.on_done, paths, in_parent)) + + def on_done(self, paths, in_parent, result): + if result != -1: + if result == 0: + self.run(paths, in_parent, 'False', 'True') + else: + self.run(paths, in_parent, 'False', 'False') + + def is_enabled(self, paths = [], in_parent = False): + s = sublime.load_settings("SideBarEnhancements/Clipboard.sublime-settings") + return s.get('cut', '') + s.get('copy', '') != '' and len(SideBarSelection(paths).getSelectedDirectoriesOrDirnames()) == 1 + + def is_visible(self, paths = [], in_parent = False): + if in_parent == 'True': + return not s.get('disabled_menuitem_paste_in_parent') + else: + return True + +class SideBarCopyNameCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.name()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_copy_name') + +class SideBarCopyNameEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.nameEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + +class SideBarCopyPathCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.path()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyDirPathCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + items.append(item.path()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_copy_dir_path') + +class SideBarCopyPathEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.uri()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyPathRelativeFromProjectCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromProject()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + + + +class SideBarCopyPathRelativeFromProjectEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromProjectEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyPathRelativeFromViewCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromView()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyPathRelativeFromViewEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathRelativeFromViewEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarCopyPathAbsoluteFromProjectCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathAbsoluteFromProject()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyPathAbsoluteFromProjectEncodedCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(item.pathAbsoluteFromProjectEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_copy_path') + +class SideBarCopyTagAhrefCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedItems(): + items.append(''+item.namePretty()+'') + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyTagImgCommand(sublime_plugin.WindowCommand): + + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedImages(): + try: + image_type, width, height = self.getImageInfo(item.contentBinary()) + items.append('') + except: + items.append('') + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + #Project:http://code.google.com/p/bfg-pages/ + #License:http://www.opensource.org/licenses/bsd-license.php + def getImageInfo(self, data): + import StringIO + import struct + data = str(data) + size = len(data) + height = -1 + width = -1 + content_type = '' + + # handle GIFs + if (size >= 10) and data[:6] in ('GIF87a', 'GIF89a'): + # Check to see if content_type is correct + content_type = 'image/gif' + w, h = struct.unpack("= 24) and data.startswith('\211PNG\r\n\032\n') + and (data[12:16] == 'IHDR')): + content_type = 'image/png' + w, h = struct.unpack(">LL", data[16:24]) + width = int(w) + height = int(h) + + # Maybe this is for an older PNG version. + elif (size >= 16) and data.startswith('\211PNG\r\n\032\n'): + # Check to see if we have the right content type + content_type = 'image/png' + w, h = struct.unpack(">LL", data[8:16]) + width = int(w) + height = int(h) + + # handle JPEGs + elif (size >= 2) and data.startswith('\377\330'): + content_type = 'image/jpeg' + jpeg = StringIO.StringIO(data) + jpeg.read(2) + b = jpeg.read(1) + try: + while (b and ord(b) != 0xDA): + while (ord(b) != 0xFF): b = jpeg.read(1) + while (ord(b) == 0xFF): b = jpeg.read(1) + if (ord(b) >= 0xC0 and ord(b) <= 0xC3): + jpeg.read(3) + h, w = struct.unpack(">HH", jpeg.read(4)) + break + else: + jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2) + b = jpeg.read(1) + width = int(w) + height = int(h) + except struct.error: + pass + except ValueError: + pass + return content_type, width, height + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasImages() and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyTagStyleCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFilesWithExtension('css'): + items.append('') + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFilesWithExtension('css') and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyTagScriptCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFilesWithExtension('js'): + items.append('') + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFilesWithExtension('js') and SideBarSelection(paths).hasItemsUnderProject() + +class SideBarCopyProjectDirectoriesCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for directory in SideBarProject().getDirectories(): + items.append(directory) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items copied") + else : + sublime.status_message("Item copied") + + def is_enabled(self, paths = []): + return True + +class SideBarCopyContentUtf8Command(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFiles(): + items.append(item.contentUTF8()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items content copied") + else : + sublime.status_message("Item content copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + +class SideBarCopyContentBase64Command(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + for item in SideBarSelection(paths).getSelectedFiles(): + items.append(item.contentBase64()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items content copied") + else : + sublime.status_message("Item content copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasFiles() + +class SideBarCopyUrlCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + items = [] + project = SideBarProject() + url = project.getPreference('url_production') + if url: + if url[-1:] != '/': + url = url+'/' + for item in SideBarSelection(paths).getSelectedItems(): + if item.isUnderCurrentProject(): + items.append(url + item.pathRelativeFromProjectEncoded()) + + if len(items) > 0: + sublime.set_clipboard("\n".join(items)); + if len(items) > 1 : + sublime.status_message("Items URL copied") + else : + sublime.status_message("Item URL copied") + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasItemsUnderProject() + +class SideBarDuplicateCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], new = False): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("Duplicate As:", new or SideBarSelection(paths).getSelectedItems()[0].path(), functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path()), None, None) + + def on_done(self, old, new): + item = SideBarItem(old, os.path.isdir(old)) + try: + if not item.copy(new): + sublime.error_message("Unable to duplicate, destination exists.") + self.run([old], new) + return + except: + sublime.error_message("Unable to copy:\n\n"+old+"\n\nto\n\n"+new) + self.run([old], new) + return + item = SideBarItem(new, os.path.isdir(new)) + if item.isFile(): + item.edit(); + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == False + +class SideBarRenameCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], newLeaf = False): + import functools + branch, leaf = os.path.split(SideBarSelection(paths).getSelectedItems()[0].path()) + self.window.run_command('hide_panel'); + self.window.show_input_panel("New Name:", newLeaf or leaf, functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path(), branch), None, None) + + def on_done(self, old, branch, leaf): + self.window.run_command('hide_panel'); + leaf = leaf.strip(); + new = os.path.join(branch, leaf) + item = SideBarItem(old, os.path.isdir(old)) + try: + if not item.move(new): + sublime.error_message("Unable to rename, destination exists.") + self.run([old], leaf) + return + except: + sublime.error_message("Unable to rename:\n\n"+old+"\n\nto\n\n"+new) + self.run([old], leaf) + raise + return + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == False + +class SideBarMoveCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], new = False): + import functools + self.window.run_command('hide_panel'); + self.window.show_input_panel("New Location:", new or SideBarSelection(paths).getSelectedItems()[0].path(), functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path()), None, None) + + def on_done(self, old, new): + item = SideBarItem(old, os.path.isdir(old)) + try: + if not item.move(new): + sublime.error_message("Unable to move, destination exists.") + self.run([old], new) + return + except: + sublime.error_message("Unable to move:\n\n"+old+"\n\nto\n\n"+new) + self.run([old], new) + return + SideBarProject().refresh(); + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == False + +class SideBarDeleteCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], confirmed = 'False'): + + if confirmed == 'False' and s.get('confirm_before_deleting', True): + if sublime.platform() == 'osx': + if sublime.ok_cancel_dialog('delete the selected items?'): + self.run(paths, 'True') + else: + self.confirm([item.path() for item in SideBarSelection(paths).getSelectedItems()], [item.pathWithoutProject() for item in SideBarSelection(paths).getSelectedItems()]) + else: + try: + for item in SideBarSelection(paths).getSelectedItemsWithoutChildItems(): + if s.get('close_affected_buffers_when_deleting_even_if_dirty', False): + item.close_associated_buffers() + send2trash(item.path()) + SideBarProject().refresh(); + except: + import functools + self.window.show_input_panel("BUG!", '', '', None, None) + self.window.run_command('hide_panel'); + self.window.show_input_panel("Permanently Delete:", SideBarSelection(paths).getSelectedItems()[0].path(), functools.partial(self.on_done, SideBarSelection(paths).getSelectedItems()[0].path()), None, None) + + def confirm(self, paths, display_paths): + import functools + window = sublime.active_window() + window.show_input_panel("BUG!", '', '', None, None) + window.run_command('hide_panel'); + + yes = [] + yes.append('Yes, delete the selected items.'); + for item in display_paths: + yes.append(item); + + no = [] + no.append('No'); + no.append('Cancel the operation.'); + if sublime.platform() == 'osx': + sublime.set_timeout(lambda:window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)), 200); + else: + window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)) + + def on_confirm(self, paths, result): + if result != -1: + if result == 0: + self.run(paths, 'True') + + def on_done(self, old, new): + if s.get('close_affected_buffers_when_deleting_even_if_dirty', False): + item = SideBarItem(new, os.path.isdir(new)) + item.close_associated_buffers() + self.remove(new) + SideBarProject().refresh(); + + def remove(self, path): + if os.path.isfile(path) or os.path.islink(path): + self.remove_safe_file(path) + else: + for content in os.listdir(path): + file = os.path.join(path, content) + if os.path.isfile(file) or os.path.islink(file): + self.remove_safe_file(file) + else: + self.remove(file) + self.remove_safe_dir(path) + + def remove_safe_file(self, path): + if not SideBarSelection().isNone(path): + try: + os.remove(path) + except: + print "Unable to remove file:\n\n"+path + else: + print 'path is none' + print path + + def remove_safe_dir(self, path): + if not SideBarSelection().isNone(path): + try: + os.rmdir(path) + except: + print "Unable to remove folder:\n\n"+path + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 and SideBarSelection(paths).hasProjectDirectories() == False + + +class SideBarEmptyCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], confirmed = 'False'): + + if confirmed == 'False' and s.get('confirm_before_deleting', True): + if sublime.platform() == 'osx': + if sublime.ok_cancel_dialog('empty the content of the folder?'): + self.run(paths, 'True') + else: + self.confirm([item.path() for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames()], [item.pathWithoutProject() for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames()]) + else: + try: + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + for content in os.listdir(item.path()): + file = os.path.join(item.path(), content) + if not SideBarSelection().isNone(file): + send2trash(file) + if s.get('close_affected_buffers_when_deleting_even_if_dirty', False): + item.close_associated_buffers() + except: + pass + SideBarProject().refresh(); + + def confirm(self, paths, display_paths): + import functools + window = sublime.active_window() + window.show_input_panel("BUG!", '', '', None, None) + window.run_command('hide_panel'); + + yes = [] + yes.append('Yes, empty the selected items.'); + for item in display_paths: + yes.append(item); + + no = [] + no.append('No'); + no.append('Cancel the operation.'); + if sublime.platform() == 'osx': + sublime.set_timeout(lambda:window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)), 200); + else: + window.show_quick_panel([yes, no], functools.partial(self.on_confirm, paths)) + + def on_confirm(self, paths, result): + if result != -1: + if result == 0: + self.run(paths, 'True') + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_empty') + +class SideBarRevealCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + for item in SideBarSelection(paths).getSelectedItems(): + item.reveal() + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarProjectOpenFileCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + project = SideBarProject() + if project.hasOpenedProject(): + SideBarItem(project.getProjectFile(), False).edit(); + +class SideBarProjectOpenProjectPreviewUrlsFileCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + SideBarItem(sublime.packages_path()+'/../Settings/SideBarEnhancements.json', False).edit(); + +class SideBarProjectItemAddCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + project = SideBarProject() + if project.hasOpenedProject(): + for item in SideBarSelection(paths).getSelectedDirectories(): + project.rootAdd(item.path()) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).hasDirectories() + +class SideBarProjectItemExcludeCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + project = SideBarProject() + if project.hasOpenedProject(): + for item in SideBarSelection(paths).getSelectedItems(): + if item.isDirectory(): + project.excludeDirectory(item.path()) + else: + project.excludeFile(item.path()) + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + +class SideBarOpenInBrowserCommand(sublime_plugin.WindowCommand): + def run(self, paths = [], type = False): + + browser = s.get("default_browser") + if browser == '': + browser = 'firefox' + + if type == False or type == 'testing': + type = 'url_testing' + elif type == 'production': + type = 'url_production' + else: + type = 'url_testing' + + for item in SideBarSelection(paths).getSelectedItems(): + if item.projectURL(type): + self.try_open(item.projectURL(type), browser) + else: + self.try_open(item.uri(), browser) + + # def run(self, paths = [], type = False): + # import webbrowser + # try: + # browser = webbrowser.get(s.get("default_browser")) + # except: + # browser = webbrowser + + # if type == False or type == 'testing': + # type = 'url_testing' + # elif type == 'production': + # type = 'url_production' + # else: + # type = 'url_testing' + + # for item in SideBarSelection(paths).getSelectedItems(): + # if item.projectURL(type): + # browser.open_new_tab(item.projectURL(type) + item.pathRelativeFromProjectEncoded()) + # else: + # browser.open_new_tab(item.uri()) + + def try_open(self, url, browser): + import subprocess + + browser = browser.lower().strip(); + items = [] + + if browser == 'chrome': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Google Chrome.app', url] + elif sublime.platform() == 'windows': + # read local app data path from registry + aKey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") + reg_value, reg_type = _winreg.QueryValueEx (aKey, "Local AppData") + + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '%HOMEPATH%\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe' + + ,reg_value+'\\Chrome\\Application\\chrome.exe' + ,reg_value+'\\Google\\Chrome\\Application\\chrome.exe' + ,'%HOMEPATH%\\Google\\Chrome\\Application\\chrome.exe' + ,'%PROGRAMFILES%\\Google\\Chrome\\Application\\chrome.exe' + ,'%PROGRAMFILES(X86)%\\Google\\Chrome\\Application\\chrome.exe' + ,'%USERPROFILE%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\chrome.exe' + ,'%HOMEPATH%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES(X86)%\\Chromium\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe' + ,'chrome.exe' + ]) + + + commands = ['-new-tab', url] + else: + + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/google-chrome' + ,'chrome' + ,'google-chrome' + ]) + commands = ['-new-tab', url] + + elif browser == 'chromium': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Chromium.app', url] + elif sublime.platform() == 'windows': + # read local app data path from registry + aKey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") + reg_value, reg_type = _winreg.QueryValueEx (aKey, "Local AppData") + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '%HOMEPATH%\\AppData\\Local\\Google\\Chrome SxS\\Application\\chrome.exe' + + , reg_value+'\\Chromium\\Application\\chromium.exe' + ,'%USERPROFILE%\\Local Settings\\Application Data\\Google\\Chrome\\chromium.exe' + ,'%USERPROFILE%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\chromium.exe' + ,'%HOMEPATH%\\Chromium\\Application\\chromium.exe' + ,'%PROGRAMFILES%\\Chromium\\Application\\chromium.exe' + ,'%PROGRAMFILES(X86)%\\Chromium\\Application\\chromium.exe' + ,'%HOMEPATH%\\Local Settings\\Application\ Data\\Google\\Chrome\\Application\\chromium.exe' + ,'%HOMEPATH%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chromium.exe' + ,'chromium.exe' + + , reg_value+'\\Chromium\\Application\\chrome.exe' + ,'%USERPROFILE%\\Local Settings\\Application Data\\Google\\Chrome\\chrome.exe' + ,'%USERPROFILE%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\chrome.exe' + ,'%HOMEPATH%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES%\\Chromium\\Application\\chrome.exe' + ,'%PROGRAMFILES(X86)%\\Chromium\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local\ Settings\\Application\ Data\\Google\\Chrome\\Application\\chrome.exe' + ,'%HOMEPATH%\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe' + ,'chrome.exe' + + ]) + commands = ['-new-tab', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/chromium' + ,'chromium' + ]) + commands = ['-new-tab', url] + elif browser == 'firefox': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Firefox.app', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/firefox' + + ,'%PROGRAMFILES%\\Nightly\\firefox.exe' + ,'%PROGRAMFILES(X86)%\\Nightly\\firefox.exe' + + ,'%PROGRAMFILES%\\Mozilla Firefox\\firefox.exe' + ,'%PROGRAMFILES(X86)%\\Mozilla Firefox\\firefox.exe' + + ,'firefox' + ,'firefox.exe' + ]) + commands = ['-new-tab', url] + elif browser == 'opera': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', '/Applications/Opera.app', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/opera' + ,'/usr/bin/opera-next' + ,'/usr/bin/operamobile' + + ,'%PROGRAMFILES%\\Opera\\opera.exe' + ,'%PROGRAMFILES(X86)%\\Opera\\opera.exe' + + ,'%PROGRAMFILES%\\Opera Next\\opera.exe' + ,'%PROGRAMFILES(X86)%\\Opera Next\\opera.exe' + + ,'%PROGRAMFILES%\\Opera Mobile Emulator\\OperaMobileEmu.exe' + ,'%PROGRAMFILES(X86)%\\Opera Mobile Emulator\\OperaMobileEmu.exe' + + ,'opera' + ,'opera.exe' + ]) + commands = ['-newtab', url] + elif browser == 'safari': + if sublime.platform() == 'osx': + items.extend(['open']) + commands = ['-a', 'Safari', url] + else: + if s.get('portable_browser') != '': + items.extend([s.get('portable_browser')]) + items.extend([ + '/usr/bin/safari' + + ,'%PROGRAMFILES%\\Safari\\Safari.exe' + ,'%PROGRAMFILES(X86)%\\Safari\\Safari.exe' + + ,'Safari' + ,'Safari.exe' + ]) + commands = ['-new-tab', '-url', url] + else: + sublime.error_message('Browser "'+browser+'" not found!\nUse any of the following: firefox, chrome, chromium, opera, safari') + return + + for item in items: + try: + command2 = list(commands) + command2.insert(0, expand_vars(item)) + subprocess.Popen(command2) + return + except: + try: + command2 = list(commands) + command2.insert(0, item) + subprocess.Popen(command2) + return + except: + pass + + sublime.error_message('Browser "'+browser+'" not found!\nIs installed? Which location...?') + + def is_enabled(self, paths = []): + return SideBarSelection(paths).len() > 0 + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_open_in_browser') + +class SideBarOpenInNewWindowCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + import subprocess + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + if sublime.platform() == 'osx': + try: + subprocess.Popen(['subl', '.'], cwd=item.pathSystem()) + except: + try: + subprocess.Popen(['sublime', '.'], cwd=item.pathSystem()) + except: + subprocess.Popen(['/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl', '.'], cwd=item.pathSystem()) + elif sublime.platform() == 'windows': + try: + subprocess.Popen(['subl', '.'], cwd=item.pathSystem(), shell=True) + except: + try: + subprocess.Popen(['sublime', '.'], cwd=item.pathSystem(), shell=True) + except: + subprocess.Popen(['sublime_text.exe', '.'], cwd=item.pathSystem(), shell=True) + else: + try: + subprocess.Popen(['subl', '.'], cwd=item.pathSystem()) + except: + subprocess.Popen(['sublime', '.'], cwd=item.pathSystem()) + + def is_visible(self, paths =[]): + return not s.get('disabled_menuitem_open_in_new_window') + +class SideBarOpenWithFinderCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + import subprocess + for item in SideBarSelection(paths).getSelectedDirectoriesOrDirnames(): + subprocess.Popen(['open', item.nameSystem()], cwd=item.dirnameSystem()) + + def is_visible(self, paths =[]): + return sublime.platform() == 'osx' + +class SideBarProjectItemRemoveFolderCommand(sublime_plugin.WindowCommand): + def run(self, paths = []): + self.window.run_command('remove_folder', {"dirs":paths}) + + def is_enabled(self, paths =[]): + return SideBarSelection(paths).len() == 1 and SideBarSelection(paths).hasProjectDirectories() == True diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py new file mode 100644 index 0000000..0c0caa7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarFileSize.py @@ -0,0 +1,24 @@ +import sublime, sublime_plugin +from hurry.filesize import size +from os.path import getsize + +s = sublime.load_settings('Side Bar.sublime-settings') + +class StatusBarFileSize(sublime_plugin.EventListener): + + def on_load(self, v): + if s.get('statusbar_file_size') and v.file_name(): + try: + self.show(v, size(getsize(v.file_name()))) + except: + pass + + def on_post_save(self, v): + if s.get('statusbar_file_size') and v.file_name(): + try: + self.show(v, size(getsize(v.file_name()))) + except: + pass + + def show(self, v, size): + v.set_status('statusbar_file_size', size); \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py new file mode 100644 index 0000000..6336365 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/StatusBarModifiedTime.py @@ -0,0 +1,25 @@ +import sublime, sublime_plugin, time +from os.path import getmtime + +s = sublime.load_settings('Side Bar.sublime-settings') + +class StatusBarModifiedTime(sublime_plugin.EventListener): + + def on_load(self, v): + if s.get('statusbar_modified_time') and v.file_name(): + try: + self.show(v, getmtime(v.file_name())) + except: + pass + + def on_post_save(self, v): + if s.get('statusbar_modified_time') and v.file_name(): + try: + self.show(v, getmtime(v.file_name())) + except: + pass + + def show(self, v, mtime): + v.set_status('statusbar_modified_time', time.strftime(s.get('statusbar_modified_time_format'), time.localtime(mtime))); + + \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt new file mode 100644 index 0000000..3411b67 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar Mount Point.sublime-menu.txt @@ -0,0 +1,4 @@ +[ + { "caption": "-", "id": "folder_commands" }, + { "caption": "Remove Folder from Project", "command": "remove_folder", "args": { "dirs": []} } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt new file mode 100644 index 0000000..3d308b9 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/disable_default/Side Bar.sublime-menu.txt @@ -0,0 +1,11 @@ +[ + { "caption": "New File", "command": "new_file_at", "args": {"dirs": []} }, + { "caption": "Rename…", "command": "rename_path", "args": {"paths": []} }, + { "caption": "Delete File", "command": "delete_file", "args": {"files": []} }, + { "caption": "Open Containing Folder…", "command": "open_containing_folder", "args": {"files": []} }, + { "caption": "-", "id": "folder_commands" }, + { "caption": "New Folder…", "command": "new_folder", "args": {"dirs": []} }, + { "caption": "Delete Folder", "command": "delete_folder", "args": {"dirs": []} }, + { "caption": "Find in Folder…", "command": "find_in_folder", "args": {"dirs": []} }, + { "caption": "-", "id": "end" } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO new file mode 100644 index 0000000..fe3aadb --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/PKG-INFO @@ -0,0 +1,71 @@ +Metadata-Version: 1.0 +Name: hurry.filesize +Version: 0.9 +Summary: A simple Python library for human readable file sizes (or anything sized in bytes). +Home-page: UNKNOWN +Author: Martijn Faassen, Startifact +Author-email: faassen@startifact.com +License: ZPL 2.1 +Description: hurry.filesize + ============== + + hurry.filesize a simple Python library that can take a number of bytes and + returns a human-readable string with the size in it, in kilobytes (K), + megabytes (M), etc. + + The default system it uses is "traditional", where multipliers of 1024 + increase the unit size:: + + >>> from hurry.filesize import size + >>> size(1024) + '1K' + + An alternative, slightly more verbose system:: + + >>> from hurry.filesize import alternative + >>> size(1, system=alternative) + '1 byte' + >>> size(10, system=alternative) + '10 bytes' + >>> size(1024, system=alternative) + '1 KB' + + A verbose system:: + + >>> from hurry.filesize import verbose + >>> size(10, system=verbose) + '10 bytes' + >>> size(1024, system=verbose) + '1 kilobyte' + >>> size(2000, system=verbose) + '1 kilobyte' + >>> size(3000, system=verbose) + '2 kilobytes' + >>> size(1024 * 1024, system=verbose) + '1 megabyte' + >>> size(1024 * 1024 * 3, system=verbose) + '3 megabytes' + + You can also use the SI system, where multipliers of 1000 increase the unit + size:: + + >>> from hurry.filesize import si + >>> size(1000, system=si) + '1K' + + + Changes + ======= + + 0.9 (2009-03-11) + ---------------- + + * Initial public release. + + Download + ======== + +Keywords: file size bytes +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt new file mode 100644 index 0000000..f5aa749 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/README.txt @@ -0,0 +1,47 @@ +hurry.filesize +============== + +hurry.filesize a simple Python library that can take a number of bytes and +returns a human-readable string with the size in it, in kilobytes (K), +megabytes (M), etc. + +The default system it uses is "traditional", where multipliers of 1024 +increase the unit size:: + + >>> from hurry.filesize import size + >>> size(1024) + '1K' + +An alternative, slightly more verbose system:: + + >>> from hurry.filesize import alternative + >>> size(1, system=alternative) + '1 byte' + >>> size(10, system=alternative) + '10 bytes' + >>> size(1024, system=alternative) + '1 KB' + +A verbose system:: + + >>> from hurry.filesize import verbose + >>> size(10, system=verbose) + '10 bytes' + >>> size(1024, system=verbose) + '1 kilobyte' + >>> size(2000, system=verbose) + '1 kilobyte' + >>> size(3000, system=verbose) + '2 kilobytes' + >>> size(1024 * 1024, system=verbose) + '1 megabyte' + >>> size(1024 * 1024 * 3, system=verbose) + '3 megabytes' + +You can also use the SI system, where multipliers of 1000 increase the unit +size:: + + >>> from hurry.filesize import si + >>> size(1000, system=si) + '1K' + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py new file mode 100644 index 0000000..32065fe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/hurry/filesize.py @@ -0,0 +1,110 @@ + +traditional = [ + (1024 ** 5, 'P'), + (1024 ** 4, 'T'), + (1024 ** 3, 'G'), + (1024 ** 2, 'M'), + (1024 ** 1, 'K'), + (1024 ** 0, 'B'), + ] + +alternative = [ + (1024 ** 5, ' PB'), + (1024 ** 4, ' TB'), + (1024 ** 3, ' GB'), + (1024 ** 2, ' MB'), + (1024 ** 1, ' KB'), + (1024 ** 0, (' byte', ' bytes')), + ] + +verbose = [ + (1024 ** 5, (' petabyte', ' petabytes')), + (1024 ** 4, (' terabyte', ' terabytes')), + (1024 ** 3, (' gigabyte', ' gigabytes')), + (1024 ** 2, (' megabyte', ' megabytes')), + (1024 ** 1, (' kilobyte', ' kilobytes')), + (1024 ** 0, (' byte', ' bytes')), + ] + +iec = [ + (1024 ** 5, 'Pi'), + (1024 ** 4, 'Ti'), + (1024 ** 3, 'Gi'), + (1024 ** 2, 'Mi'), + (1024 ** 1, 'Ki'), + (1024 ** 0, ''), + ] + +si = [ + (1000 ** 5, 'P'), + (1000 ** 4, 'T'), + (1000 ** 3, 'G'), + (1000 ** 2, 'M'), + (1000 ** 1, 'K'), + (1000 ** 0, 'B'), + ] + + + +def size(bytes, system=traditional): + """Human-readable file size. + + Using the traditional system, where a factor of 1024 is used:: + + >>> size(10) + '10B' + >>> size(100) + '100B' + >>> size(1000) + '1000B' + >>> size(2000) + '1K' + >>> size(10000) + '9K' + >>> size(20000) + '19K' + >>> size(100000) + '97K' + >>> size(200000) + '195K' + >>> size(1000000) + '976K' + >>> size(2000000) + '1M' + + Using the SI system, with a factor 1000:: + + >>> size(10, system=si) + '10B' + >>> size(100, system=si) + '100B' + >>> size(1000, system=si) + '1K' + >>> size(2000, system=si) + '2K' + >>> size(10000, system=si) + '10K' + >>> size(20000, system=si) + '20K' + >>> size(100000, system=si) + '100K' + >>> size(200000, system=si) + '200K' + >>> size(1000000, system=si) + '1M' + >>> size(2000000, system=si) + '2M' + + """ + for factor, suffix in system: + if bytes >= factor: + break + amount = int(bytes/factor) + if isinstance(suffix, tuple): + singular, multiple = suffix + if amount == 1: + suffix = singular + else: + suffix = multiple + return str(amount) + suffix + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt new file mode 100644 index 0000000..ed95cfe --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/license.txt @@ -0,0 +1,19 @@ +"None are so hopelessly enslaved as those who falsely believe they are free." + Johann Wolfgang von Goethe + +Copyright (C) 2012 Tito Bouzout + +This license apply to all the files inside this program unless noted +different for some files or portions of code inside these files. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation. http://www.gnu.org/licenses/gpl.html + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see http://www.gnu.org/licenses/gpl.html \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt new file mode 100644 index 0000000..36d23ff --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/messages/11.13.2012.1305.0.txt @@ -0,0 +1,21 @@ + + +SideBarEnhancements Changelog: + + ## Shorcuts collisioning with Sublime2's built-in shortcuts have been removed. + + If you miss these + + - Go to "Preferences" -> "Browse Packages" -> "User" + - Open or create file "Default.sublime-keymap" + + - Add this content: + + , { "keys": ["ctrl+t"], "command": "side_bar_new_file2" }, + { "keys": ["f2"], "command": "side_bar_rename" }, + { "keys": ["ctrl+alt+f"], "command": "side_bar_find_files_path_containing" } + + + ## If you have problems configuring F12 key + + - https://github.com/titoBouzout/SideBarEnhancements#f12-key \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json new file mode 100644 index 0000000..28bde61 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/titoBouzout/SideBarEnhancements", "version": "2013.03.24.15.45.28", "description": "Enhancements to Sublime Text sidebar. Files and folders."} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md new file mode 100644 index 0000000..90e7f3d --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/readme.md @@ -0,0 +1,193 @@ +# Sublime Text 3 Compatibilty + +Please see: https://github.com/titoBouzout/SideBarEnhancements/tree/st3atyourownrisk + +# Description + + +Provides enhancements to the operations on Side Bar of Files and Folders for Sublime Text 2. See: http://www.sublimetext.com/ + +Notably provides delete as "move to trash", open with.. a and clipboard. Close, move, open and restore buffers affected by a rename/move command. + +Provides the basics: new file/folder, edit, open/run, reveal, find in selected/parent/project, cut, copy, paste, paste in parent, rename, move, delete, refresh.... + +The not so basic: copy paths as URIs, URLs, content as UTF8, content as data:uri base64 ( nice for embedding into CSS! ), copy as tags img/a/script/style, duplicate + + +Preference to control if a buffer should be closed when affected by a deletion operation. + +Allows to display "file modified date" and "file size" on statusbar. + +All commands available for files and folders(when applicable) . + +[img]http://dl.dropbox.com/u/43596449/tito/sublime/SideBar/screenshot.png[/img] + + + +# F12 key + +F12 key allows you to open the current file in browser. +If you want to add a url to that feature: + + * Right click any file on sidebar and select: "Project -> Edit Projects Preview URLs" + * Edit this file, and add your paths and URLs with the following structure: + +``` +{ + "S:/www/domain.tld":{ + "url_testing":"http://testing", + "url_production":"http://domain.tld" + }, + "C:/Users/luna/some/domain2.tld":{ + "url_testing":"http://testing1", + "url_production":"http://productiontld2" + } +} +``` + +```url_testing``` allows you to set the url of your local server, opened via F12 + +```url_production``` allows you to set the url of your production server, opened via ALT+F12 + +# Notes on configuring the `Open With` menu: + +Definitions file: `User/SidebarEnhancements/Open With/Side Bar.sublime-menu` (note the extra subfolder levels). +To open it, right-click on any file in an open project and select `Open With > Edit Applications...` + +- On OSX, the 'application' property simply takes the *name* of an application, to which the file at hand's full path will be passed as if with `open ...`, e.g.: "application": "Google Chrome" +- On OSX, invoking *shell* commands is NOT supported. + +# Todo + + * Use a real clipboard integrated with the OS + +# Installation + +Install this repository via "Package Control" http://wbond.net/sublime_packages/package_control + +# FAQ + +Q: Uninstall? + + * Follow the instructions here: https://github.com/titoBouzout/SideBarEnhancements/issues/18 + +Q: Why the menu is not shown on `Open Files`? + +- It should be mentioned that the package's context menu is only available for files and folders **in a project (section `Folders` in the side bar)**, and _not_ on the open files listed at the top of the side bar, due to a limitation of ST2. + +# Using the External Libraries + + + * "getImageInfo" to get width and height for images from "bfg-pages". See: http://code.google.com/p/bfg-pages/ + * "desktop" to be able to open files with system handlers. See: http://pypi.python.org/pypi/desktop + * "send2trash" to be able to send to the trash instead of deleting for ever!. See: http://pypi.python.org/pypi/Send2Trash + * "hurry.filesize" to be able to format file sizes. See: http://pypi.python.org/pypi/hurry.filesize/ + +# Source-code + + +https://github.com/titoBouzout/SideBarEnhancements + +# Forum Thread + + +http://www.sublimetext.com/forum/viewtopic.php?f=5&t=3331 + +# Contributors: + + - Leif Ringstad + - Sven Axelsson + - Dalibor Simacek + - Stephen Horne + +# Update v1.2: + +* Improved: Feature "find advanced -> in paths containing" or CTRL+ALT+F now provides instant search, contribution by @ryecroft, thanks a lot! +* Fix: When only 1 tab is open and setting "close_windows_when_empty" is true. If the user renames or delete the current file will cause the application to close by itself (it will be perceived as a crash but is not). +* New: Add to the command palette useful commands as duplicate, reveal, move, open project file, open in browser, refresh, rename +* New: added keybindings F12 to open in local server, ALT+F12 to open in production server. +* New: Allows to copy the URL of the selected items. +* Improved: When renaming/moving remember the tab position and syntax. +* small fixes: +- Correct display of commands that are available only for projects +- Be sure to return None if there is no open project +- only display a message when using the clipboard if something was copied. + +# Update v1.1: + +* New: Add boolean preference "confirm_before_deleting" which controls if a the package should ask the user to delete files and folders +* New: When using copy, cut or paste the editor will ask for "replace items" when these items exists. Note: When a folder exists the package will merge the two as in the OS. + +# Update v1.0: + +* New: Add boolean preference "close_affected_buffers_when_deleting_even_if_dirty" which controls if a buffer should be closed when affected by a deletion operation- + +# Update v0.9: + + +* Minor tweaks and fixes. +* Fix: Re-enable move to trash for OSX +* New: Allow to display "file modified time" and "file size" on statusbar via preferences. +* Fix: Disable of built-in function is now automatic. +* On the way: exclude from project, promote as project folder. ( requires restart to apply changes, looks like there is no way to reload project files.) +* Fix: Many appends of same directory to "sys.path" + +# Update v0.8: + + +* Full review for when the user has selection of multiples items. +* New: Added support for bookmarks and marks for when a view is moved. + +# Update v0.7: + + +* New: After a rename of a file or folder, the affected views will update(reload) to reflect the new location keeping intact content, selections, folded regions and scroll position. +* New: File path search + +# Update v0.6: + + +* Fix: Paste was pasting on parent folder (Misinterpretation of boolean) +* Fix: "Open with" works on Linux +* Improved: Allow case change on Windows when renaming a file or folder +* Improved: Update to "find commands" for version 2134 + +# Update v0.5: + + +* Change: Removed "files" prefix from commands. +* New: Ability to copy a path relative to the current view +* New: Ability to "paste in parent" +* New: Ctrl+T will ask for a new file on same folder as current view +* Improved: Context menu open faster + +# Update v0.4: + + +* Fix: "Open / Run" fixed on Linux thanks to project [desktop](http://pypi.python.org/pypi/desktop ) +* Improved: "Paste" command copy permission bits, last access time, last modification time, and flags +* Improved: "Delete" command send files to trash thanks to [Send2Trash](http://pypi.python.org/pypi/Send2Trash ) . NOTE: If "Delete" fails to send to trash it will ask for "Permanently Delete" On confirmation it delete the item forever. + +# Update v0.3: + + +* Fixed: Open should run correctly with some strange characters on paths +* New: "Open with.." is enabled and allows to set custom applications for different file extensions. +* New: "Copy content as Data URI" ( handy for embedding images on CSS files ) +* Improved: Copy img tags now add attributes width and height thanks to project [bfg-pages](http://code.google.com/p/bfg-pages/ ) and suggestion from nobleach. + +# Update v0.2: + + + * Copy paths and names in various formats. + * Removed license to not conflict with sublime + +# Update v0.1: + + + * Tweaks here, tweaks there. + * Renamed repository + * New: "edit" will open the file with sublime text. + * New: "open" will call to the command line with the file path + * New: a disabled "open with" for future use + * Tweaks: ids to all context elements diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py new file mode 100644 index 0000000..ea77870 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +import sys + +if sys.platform == 'darwin': + from .plat_osx import send2trash +elif sys.platform == 'win32': + from .plat_win import send2trash +else: + from .plat_other import send2trash \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py new file mode 100644 index 0000000..ba58b6f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_osx.py @@ -0,0 +1,44 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import cdll, byref, Structure, c_char, c_char_p +from ctypes.util import find_library + +Foundation = cdll.LoadLibrary(find_library('Foundation')) +CoreServices = cdll.LoadLibrary(find_library('CoreServices')) + +GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString +GetMacOSStatusCommentString.restype = c_char_p +FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions +FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync + +kFSPathMakeRefDefaultOptions = 0 +kFSPathMakeRefDoNotFollowLeafSymlink = 0x01 + +kFSFileOperationDefaultOptions = 0 +kFSFileOperationOverwrite = 0x01 +kFSFileOperationSkipSourcePermissionErrors = 0x02 +kFSFileOperationDoNotMoveAcrossVolumes = 0x04 +kFSFileOperationSkipPreflight = 0x08 + +class FSRef(Structure): + _fields_ = [('hidden', c_char * 80)] + +def check_op_result(op_result): + if op_result: + msg = GetMacOSStatusCommentString(op_result).decode('utf-8') + raise OSError(msg) + +def send2trash(path): + if not isinstance(path, bytes): + path = path.encode('utf-8') + fp = FSRef() + opts = kFSPathMakeRefDoNotFollowLeafSymlink + op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None) + check_op_result(op_result) + opts = kFSFileOperationDefaultOptions + op_result = FSMoveObjectToTrashSync(byref(fp), None, opts) + check_op_result(op_result) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py new file mode 100644 index 0000000..6c9b438 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_other.py @@ -0,0 +1,154 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +# This is a reimplementation of plat_other.py with reference to the +# freedesktop.org trash specification: +# [1] http://www.freedesktop.org/wiki/Specifications/trash-spec +# [2] http://www.ramendik.ru/docs/trashspec.html +# See also: +# [3] http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html +# +# For external volumes this implementation will raise an exception if it can't +# find or create the user's trash directory. + +#import sys +import os +import os.path as op +from datetime import datetime +import stat +from urllib import quote + +FILES_DIR = 'files' +INFO_DIR = 'info' +INFO_SUFFIX = '.trashinfo' + +# Default of ~/.local/share [3] +XDG_DATA_HOME = op.expanduser(os.environ.get('XDG_DATA_HOME', '~/.local/share')) +HOMETRASH = op.join(XDG_DATA_HOME, 'Trash') + +uid = os.getuid() +TOPDIR_TRASH = '.Trash' +TOPDIR_FALLBACK = '.Trash-' + str(uid) + +def is_parent(parent, path): + path = op.realpath(path) # In case it's a symlink + parent = op.realpath(parent) + return path.startswith(parent) + +def format_date(date): + return date.strftime("%Y-%m-%dT%H:%M:%S") + +def info_for(src, topdir): + # ...it MUST not include a ".."" directory, and for files not "under" that + # directory, absolute pathnames must be used. [2] + if topdir is None or not is_parent(topdir, src): + src = op.abspath(src) + else: + src = op.relpath(src, topdir) + + info = "[Trash Info]\n" + info += "Path=" + quote(src) + "\n" + info += "DeletionDate=" + format_date(datetime.now()) + "\n" + return info + +def check_create(dir): + # use 0700 for paths [3] + if not op.exists(dir): + os.makedirs(dir, 0o700) + +def trash_move(src, dst, topdir=None): + filename = op.basename(src) + filespath = op.join(dst, FILES_DIR) + infopath = op.join(dst, INFO_DIR) + base_name, ext = op.splitext(filename) + + counter = 0 + destname = filename + while op.exists(op.join(filespath, destname)) or op.exists(op.join(infopath, destname + INFO_SUFFIX)): + counter += 1 + destname = '%s %s%s' % (base_name, counter, ext) + + check_create(filespath) + check_create(infopath) + + os.rename(src, op.join(filespath, destname)) + f = open(op.join(infopath, destname + INFO_SUFFIX), 'w') + f.write(info_for(src, topdir)) + f.close() + +def find_mount_point(path): + # Even if something's wrong, "/" is a mount point, so the loop will exit. + # Use realpath in case it's a symlink + path = op.realpath(path) # Required to avoid infinite loop + while not op.ismount(path): + path = op.split(path)[0] + return path + +def find_ext_volume_global_trash(volume_root): + # from [2] Trash directories (1) check for a .Trash dir with the right + # permissions set. + trash_dir = op.join(volume_root, TOPDIR_TRASH) + if not op.exists(trash_dir): + return None + + mode = os.lstat(trash_dir).st_mode + # vol/.Trash must be a directory, cannot be a symlink, and must have the + # sticky bit set. + if not op.isdir(trash_dir) or op.islink(trash_dir) or not (mode & stat.S_ISVTX): + return None + + trash_dir = op.join(trash_dir, str(uid)) + try: + check_create(trash_dir) + except OSError: + return None + return trash_dir + +def find_ext_volume_fallback_trash(volume_root): + # from [2] Trash directories (1) create a .Trash-$uid dir. + trash_dir = op.join(volume_root, TOPDIR_FALLBACK) + # Try to make the directory, if we can't the OSError exception will escape + # be thrown out of send2trash. + check_create(trash_dir) + return trash_dir + +def find_ext_volume_trash(volume_root): + trash_dir = find_ext_volume_global_trash(volume_root) + if trash_dir is None: + trash_dir = find_ext_volume_fallback_trash(volume_root) + return trash_dir + +# Pull this out so it's easy to stub (to avoid stubbing lstat itself) +def get_dev(path): + return os.lstat(path).st_dev + +def send2trash(path): + #if not isinstance(path, str): + # path = str(path, sys.getfilesystemencoding()) + #if not op.exists(path): + # raise OSError("File not found: %s" % path) + # ...should check whether the user has the necessary permissions to delete + # it, before starting the trashing operation itself. [2] + #if not os.access(path, os.W_OK): + # raise OSError("Permission denied: %s" % path) + # if the file to be trashed is on the same device as HOMETRASH we + # want to move it there. + path_dev = get_dev(path) + + # If XDG_DATA_HOME or HOMETRASH do not yet exist we need to stat the + # home directory, and these paths will be created further on if needed. + trash_dev = get_dev(op.expanduser('~')) + + if path_dev == trash_dev: + topdir = XDG_DATA_HOME + dest_trash = HOMETRASH + else: + topdir = find_mount_point(path) + trash_dev = get_dev(topdir) + if trash_dev != path_dev: + raise OSError("Couldn't find mount point for %s" % path) + dest_trash = find_ext_volume_trash(topdir) + trash_move(path, dest_trash, topdir) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py new file mode 100644 index 0000000..8f56817 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/send2trash/plat_win.py @@ -0,0 +1,56 @@ +# Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +from ctypes import windll, Structure, byref, c_uint +from ctypes.wintypes import HWND, UINT, LPCWSTR, BOOL +#import os.path as op + +shell32 = windll.shell32 +SHFileOperationW = shell32.SHFileOperationW + +class SHFILEOPSTRUCTW(Structure): + _fields_ = [ + ("hwnd", HWND), + ("wFunc", UINT), + ("pFrom", LPCWSTR), + ("pTo", LPCWSTR), + ("fFlags", c_uint), + ("fAnyOperationsAborted", BOOL), + ("hNameMappings", c_uint), + ("lpszProgressTitle", LPCWSTR), + ] + +FO_MOVE = 1 +FO_COPY = 2 +FO_DELETE = 3 +FO_RENAME = 4 + +FOF_MULTIDESTFILES = 1 +FOF_SILENT = 4 +FOF_NOCONFIRMATION = 16 +FOF_ALLOWUNDO = 64 +FOF_NOERRORUI = 1024 + +def send2trash(path): + # + #if not isinstance(path, str): + # path = str(path, 'mbcs') + #if not op.isabs(path): + # path = op.abspath(path) + fileop = SHFILEOPSTRUCTW() + fileop.hwnd = 0 + fileop.wFunc = FO_DELETE + fileop.pFrom = LPCWSTR(path + '\0') + fileop.pTo = None + fileop.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT + fileop.fAnyOperationsAborted = 0 + fileop.hNameMappings = 0 + fileop.lpszProgressTitle = None + result = SHFileOperationW(byref(fileop)) + if result: + msg = "Couldn't perform operation. Error code: %d" % result + raise OSError(msg) + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py new file mode 100644 index 0000000..8b08881 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarItem.py @@ -0,0 +1,480 @@ +# coding=utf8 +import sublime +import os +import re +import shutil + +from SideBarProject import SideBarProject + +try: + import desktop +except: + pass + +class Object(): + pass + +def expand_vars(path): + for k, v in os.environ.iteritems(): + try: + # dirty hack, this should be autofixed in python3 + k = unicode(k.encode('utf8')) + v = unicode(v.encode('utf8')) + path = path.replace(u'%'+k+'%', v).replace(u'%'+k.lower()+'%', v) + except: + pass + return path + +class SideBarItem: + + def __init__(self, path, is_directory): + self._path = path + self._is_directory = is_directory + + def path(self, path = ''): + if path == '': + return self._path + else: + self._path = path + self._is_directory = os.path.isdir(path) + return path + + def pathSystem(self): + import sys + return self.path().encode(sys.getfilesystemencoding()) + + def pathWithoutProject(self): + path = self.path() + for directory in SideBarProject().getDirectories(): + path = path.replace(directory, '', 1) + return path.replace('\\', '/') + + def pathProject(self): + path = self.path() + for directory in SideBarProject().getDirectories(): + path2 = path.replace(directory, '', 1) + if path2 != path: + return directory + return False + + def projectURL(self, type): + filename = os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'SideBarEnhancements.json')) + if os.path.lexists(filename): + #try: + import json + data = file(filename, 'r').read() + data = data.replace('\t', ' ').replace('\\', '/').replace('\\', '/').replace('//', '/').replace('//', '/').replace('http:/', 'http://').replace('https:/', 'https://') + data = json.loads(data, strict=False) + + for path in data.keys(): + path2 = expand_vars(path) + print '-------------------------------------------------------' + print 'searching:' + path2 = path2.replace('\\', '/').replace('\\', '/').replace('//', '/').replace('//', '/') + print path2 + print 'in:' + path3 = self.path().replace('\\', '/').replace('\\', '/').replace('//', '/').replace('//', '/') + print path3 + print '-------------------------------------------------------' + path4 = re.sub(re.compile("^"+re.escape(path2), re.IGNORECASE), '', path3); + print path4 + if path4 != path3: + url = data[path][type] + if url: + if url[-1:] != '/': + url = url+'/' + import urllib + return url+(re.sub("^/", '', urllib.quote(path4.encode('utf-8')))); + + #except: + # return False + else: + return False + + def isUnderCurrentProject(self): + path = self.path() + path2 = self.path() + for directory in SideBarProject().getDirectories(): + path2 = path2.replace(directory, '', 1) + return path != path2 + + def pathRelativeFromProject(self): + return re.sub('^/+', '', self.pathWithoutProject()) + + def pathRelativeFromProjectEncoded(self): + import urllib + return urllib.quote(self.pathRelativeFromProject().encode('utf-8')) + + def pathRelativeFromView(self): + return os.path.relpath(self.path(), os.path.dirname(sublime.active_window().active_view().file_name())).replace('\\', '/') + + def pathRelativeFromViewEncoded(self): + import urllib + return urllib.quote(os.path.relpath(self.path(), os.path.dirname(sublime.active_window().active_view().file_name())).replace('\\', '/').encode('utf-8')) + + def pathAbsoluteFromProject(self): + return self.pathWithoutProject() + + def pathAbsoluteFromProjectEncoded(self): + import urllib + return urllib.quote(self.pathAbsoluteFromProject().encode('utf-8')) + + def uri(self): + import urllib + return 'file:'+urllib.pathname2url(self.path().encode('utf-8')); + + def join(self, name): + return os.path.join(self.path(), name) + + def dirname(self): + branch, leaf = os.path.split(self.path()) + return branch; + + def forCwdSystemPath(self): + if self.isDirectory(): + return self.pathSystem() + else: + return self.dirnameSystem() + + def forCwdSystemName(self): + if self.isDirectory(): + return '.' + else: + path = self.pathSystem() + branch = self.dirnameSystem() + leaf = path.replace(branch, '', 1).replace('\\', '').replace('/', '') + return leaf + + def forCwdSystemPathRelativeFrom(self, relativeFrom): + relative = SideBarItem(relativeFrom, os.path.isdir(relativeFrom)) + path = self.pathSystem().replace(relative.pathSystem(), '', 1).replace('\\', '/') + if path == '': + return '.' + else: + return re.sub('^/+', '', path) + + def forCwdSystemPathRelativeFromRecursive(self, relativeFrom): + relative = SideBarItem(relativeFrom, os.path.isdir(relativeFrom)) + path = self.pathSystem().replace(relative.pathSystem(), '', 1).replace('\\', '/') + if path == '': + return '.' + else: + if self.isDirectory(): + return re.sub('^/+', '', path)+'/' + else: + return re.sub('^/+', '', path) + + def dirnameSystem(self): + import sys + return self.dirname().encode(sys.getfilesystemencoding()) + + def dirnameCreate(self): + try: + os.makedirs(self.dirname()) + except: + pass + + def name(self): + branch, leaf = os.path.split(self.path()) + return leaf; + + def nameSystem(self): + import sys + return self.name().encode(sys.getfilesystemencoding()) + + def nameEncoded(self): + import urllib + return urllib.quote(self.name().encode('utf-8')); + + def namePretty(self): + return self.name().replace(self.extension(), '').replace('-', ' ').replace('_', ' ').strip(); + + def open(self): + if sublime.platform() == 'osx': + import subprocess + subprocess.Popen(['open', self.nameSystem()], cwd=self.dirnameSystem()) + elif sublime.platform() == 'windows': + import subprocess + subprocess.Popen([self.nameSystem()], cwd=self.dirnameSystem(), shell=True) + else: + desktop.open(self.path()) + + def edit(self): + return sublime.active_window().open_file(self.path()) + + def isDirectory(self): + return self._is_directory + + def isFile(self): + return self.isDirectory() == False + + def contentUTF8(self): + import codecs + return codecs.open(self.path(), 'r', 'utf-8').read() + + def contentBinary(self): + return file(self.path(), "rb").read() + + def contentBase64(self): + return 'data:'+self.mime()+';base64,'+(file(self.path(), "rb").read().encode("base64").replace('\n', '')) + + def reveal(self): + sublime.active_window().run_command("open_dir", {"dir": self.dirname(), "file": self.name()} ) + + def write(self, content): + file(self.path(), 'w+').write(content) + + def mime(self): + import mimetypes + return mimetypes.guess_type(self.path())[0] or 'application/octet-stream' + + def extension(self): + return os.path.splitext('name'+self.name())[1].lower() + + def exists(self): + return os.path.isdir(self.path()) or os.path.isfile(self.path()) + + def create(self): + if self.isDirectory(): + self.dirnameCreate() + os.makedirs(self.path()) + else: + self.dirnameCreate() + self.write('') + + def copy(self, location, replace = False): + location = SideBarItem(location, os.path.isdir(location)); + if location.exists() and replace == False: + return False + elif location.exists() and location.isFile(): + os.remove(location.path()) + + location.dirnameCreate(); + if self.isDirectory(): + if location.exists(): + self.copy_recursive(self.path(), location.path()) + else: + shutil.copytree(self.path(), location.path()) + else: + shutil.copy2(self.path(), location.path()) + return True + + def copy_recursive(self, _from, _to): + + if os.path.isfile(_from) or os.path.islink(_from): + try: + os.makedirs(os.path.dirname(_to)); + except: + pass + if os.path.exists(_to): + os.remove(_to) + shutil.copy2(_from, _to) + else: + try: + os.makedirs(_to); + except: + pass + for content in os.listdir(_from): + __from = os.path.join(_from, content) + __to = os.path.join(_to, content) + self.copy_recursive(__from, __to) + + def move(self, location, replace = False): + location = SideBarItem(location, os.path.isdir(location)); + if location.exists() and replace == False: + if self.path().lower() == location.path().lower(): + pass + else: + return False + elif location.exists() and location.isFile(): + os.remove(location.path()) + + if self.path().lower() == location.path().lower(): + location.dirnameCreate(); + os.rename(self.path(), location.path()+'.sublime-temp') + os.rename(location.path()+'.sublime-temp', location.path()) + self._move_moveViews(self.path(), location.path()) + else: + location.dirnameCreate(); + if location.exists(): + self.move_recursive(self.path(), location.path()) + else: + os.rename(self.path(), location.path()) + self._move_moveViews(self.path(), location.path()) + return True + + def move_recursive(self, _from, _to): + if os.path.isfile(_from) or os.path.islink(_from): + try: + os.makedirs(os.path.dirname(_to)); + except: + pass + if os.path.exists(_to): + os.remove(_to) + os.rename(_from, _to) + else: + try: + os.makedirs(_to); + except: + pass + for content in os.listdir(_from): + __from = os.path.join(_from, content) + __to = os.path.join(_to, content) + self.move_recursive(__from, __to) + os.rmdir(_from) + + def _move_moveViews(self, old, location): + for window in sublime.windows(): + active_view = window.active_view() + views = [] + for view in window.views(): + if view.file_name(): + views.append(view) + views.reverse(); + for view in views: + if old == view.file_name(): + active_view = self._move_moveView(window, view, location, active_view) + elif view.file_name().find(old+'\\') == 0: + active_view = self._move_moveView(window, view, view.file_name().replace(old+'\\', location+'\\', 1), active_view) + elif view.file_name().find(old+'/') == 0: + active_view = self._move_moveView(window, view, view.file_name().replace(old+'/', location+'/', 1), active_view) + + def _move_moveView(self, window, view, location, active_view): + if active_view == view: + is_active_view = True + else: + is_active_view = False + + options = Object() + + options.scroll = view.viewport_position() + + options.selections = [[item.a, item.b] for item in view.sel()] + + options.marks = [[item.a, item.b] for item in view.get_regions("mark")] + + options.bookmarks = [[item.a, item.b] for item in view.get_regions("bookmarks")] + + if int(sublime.version()) >= 2167: + options.folds = [[item.a, item.b] for item in view.folded_regions()] + else: + options.folds = [[item.a, item.b] for item in view.unfold(sublime.Region(0, view.size()))] + + options.syntax = view.settings().get('syntax') + + try: + _window = window or view.window() or sublime.active_window() + options.position = _window.get_view_index(view) + except: + options.position = False + + window.focus_view(view) + if view.is_dirty(): + options.content = view.substr(sublime.Region(0, view.size())) + view.window().run_command('revert') + else: + options.content = False + + _view = view + view = window.open_file(location) + window.focus_view(_view) + window.run_command('close') + + sublime.set_timeout(lambda: self._move_restoreView(view, options, window), 200) + + if is_active_view: + window.focus_view(view) + return view + else: + window.focus_view(active_view) + return active_view + + def _move_restoreView(self, view, options, window): + if view.is_loading(): + sublime.set_timeout(lambda: self._move_restoreView(view, options, window), 100) + else: + if options.content != False: + edit = view.begin_edit() + view.replace(edit, sublime.Region(0, view.size()), options.content); + view.sel().clear() + view.sel().add(sublime.Region(0)) + view.end_edit(edit) + + if options.position != False: + try: + _window = window or view.window() or sublime.active_window() + group, index = options.position + _window.set_view_index(view, group, index) + except: + pass + + if options.syntax: + view.settings().set('syntax', options.syntax); + + for r in options.folds: + view.fold(sublime.Region(r[0], r[1])) + + view.sel().clear() + for r in options.selections: + view.sel().add(sublime.Region(r[0], r[1])) + + rs = [] + for r in options.marks: + rs.append(sublime.Region(r[0], r[1])) + if len(rs): + view.add_regions("mark", rs, "mark", "dot", sublime.HIDDEN | sublime.PERSISTENT) + + rs = [] + for r in options.bookmarks: + rs.append(sublime.Region(r[0], r[1])) + if len(rs): + view.add_regions("bookmarks", rs, "bookmarks", "bookmark", sublime.HIDDEN | sublime.PERSISTENT) + + view.set_viewport_position(options.scroll, False) + + def close_associated_buffers(self): + path = self.path() + closed_items = [] + for window in sublime.windows(): + active_view = window.active_view() + views = [] + for view in window.views(): + if view.file_name(): + views.append(view) + views.reverse(); + for view in views: + if path == view.file_name(): + if view.window(): + closed_items.append([view.file_name(), view.window(), view.window().get_view_index(view)]) + if len(window.views()) == 1: + window.new_file() + window.focus_view(view) + window.run_command('revert') + window.run_command('close') + elif view.file_name().find(path+'\\') == 0: + if view.window(): + closed_items.append([view.file_name(), view.window(), view.window().get_view_index(view)]) + if len(window.views()) == 1: + window.new_file() + window.focus_view(view) + window.run_command('revert') + window.run_command('close') + elif view.file_name().find(path+'/') == 0: + if view.window(): + closed_items.append([view.file_name(), view.window(), view.window().get_view_index(view)]) + if len(window.views()) == 1: + window.new_file() + window.focus_view(view) + window.run_command('revert') + window.run_command('close') + + # try to repaint + try: + window.focus_view(active_view) + window.focus_view(window.active_view()) + except: + try: + window.focus_view(window.active_view()) + except: + pass + return closed_items diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py new file mode 100644 index 0000000..7ceae07 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarProject.py @@ -0,0 +1,119 @@ +import sublime +import re +import os + +class SideBarProject: + + def getDirectories(self): + return sublime.active_window().folders() + + def hasOpenedProject(self): + return self.getProjectFile() != None + + def getDirectoryFromPath(self, path): + for directory in self.getDirectories(): + maybe_path = path.replace(directory, '', 1) + if maybe_path != path: + return directory + + def getProjectFile(self): + if not self.getDirectories(): + return None + import json + data = file(os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'Session.sublime_session')), 'r').read() + data = data.replace('\t', ' ') + data = json.loads(data, strict=False) + projects = data['workspaces']['recent_workspaces'] + + if os.path.lexists(os.path.join(sublime.packages_path(), '..', 'Settings', 'Auto Save Session.sublime_session')): + data = file(os.path.normpath(os.path.join(sublime.packages_path(), '..', 'Settings', 'Auto Save Session.sublime_session')), 'r').read() + data = data.replace('\t', ' ') + data = json.loads(data, strict=False) + if 'workspaces' in data and 'recent_workspaces' in data['workspaces'] and data['workspaces']['recent_workspaces']: + projects += data['workspaces']['recent_workspaces'] + projects = list(set(projects)) + for project_file in projects: + project_file = re.sub(r'^/([^/])/', '\\1:/', project_file); + project_json = json.loads(file(project_file, 'r').read(), strict=False) + if 'folders' in project_json: + folders = project_json['folders'] + found_all = True + for directory in self.getDirectories(): + found = False + for folder in folders: + folder_path = re.sub(r'^/([^/])/', '\\1:/', folder['path']); + if folder_path == directory.replace('\\', '/'): + found = True + break; + if found == False: + found_all = False + break; + if found_all: + return project_file + return None + + def getProjectJson(self): + if not self.hasOpenedProject(): + return None + import json + return json.loads(file(self.getProjectFile(), 'r').read(), strict=False) + + def excludeDirectory(self, path): + import json + project_file = self.getProjectFile(); + project = self.getProjectJson() + + path = re.sub(r'^([^/])\:/', '/\\1/', path.replace('\\', '/')) + + for folder in project['folders']: + if path.find(folder['path']) == 0: + try: + folder['folder_exclude_patterns'].append(re.sub(r'/+$', '', path.replace(folder['path']+'/', '', 1))) + except: + folder['folder_exclude_patterns'] = [re.sub(r'/+$', '', path.replace(folder['path']+'/', '', 1))] + file(project_file, 'w+').write(json.dumps(project, indent=1)) + return + + def excludeFile(self, path): + import json + project_file = self.getProjectFile(); + project = self.getProjectJson() + + path = re.sub(r'^([^/])\:/', '/\\1/', path.replace('\\', '/')) + + for folder in project['folders']: + if path.find(folder['path']) == 0: + try: + folder['file_exclude_patterns'].append(path.replace(folder['path']+'/', '', 1)) + except: + folder['file_exclude_patterns'] = [path.replace(folder['path']+'/', '', 1)] + file(project_file, 'w+').write(json.dumps(project, indent=1)) + return + + def rootAdd(self, path): + import json + project_file = self.getProjectFile(); + project = self.getProjectJson() + + path = re.sub(r'^([^/])\:/', '/\\1/', path.replace('\\', '/')) + project['folders'].append({'path':path}); + + file(project_file, 'w+').write(json.dumps(project, indent=1)) + + def refresh(self): + try: + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 200); + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 600); + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 1300); + sublime.set_timeout(lambda:sublime.active_window().run_command('refresh_folder_list'), 2300); + except: + pass + + def getPreference(self, name): + if not self.hasOpenedProject(): + return None + project = self.getProjectJson() + try: + return project[name] + except: + return None \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py new file mode 100644 index 0000000..00748e7 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/SideBarSelection.py @@ -0,0 +1,186 @@ +# coding=utf8 +import sublime +import os +import re + +from SideBarProject import SideBarProject +from SideBarItem import SideBarItem + +class SideBarSelection: + + def __init__(self, paths = []): + + if len(paths) < 1: + try: + path = sublime.active_window().active_view().file_name() + if self.isNone(path): + paths = [] + else: + paths = [path] + except: + paths = [] + self._paths = paths + self._paths.sort() + self._obtained_selection_information_basic = False + self._obtained_selection_information_extended = False + + def len(self): + return len(self._paths) + + def hasDirectories(self): + self._obtainSelectionInformationBasic() + return self._has_directories + + def hasFiles(self): + self._obtainSelectionInformationBasic() + return self._has_files + + def hasOnlyDirectories(self): + self._obtainSelectionInformationBasic() + return self._only_directories + + def hasOnlyFiles(self): + self._obtainSelectionInformationBasic() + return self._only_files + + def hasProjectDirectories(self): + if self.hasDirectories(): + project_directories = SideBarProject().getDirectories() + for item in self.getSelectedDirectories(): + if item.path() in project_directories: + return True + return False + else: + return False + + def hasItemsUnderProject(self): + for item in self.getSelectedItems(): + if item.isUnderCurrentProject(): + return True + return False + + def hasImages(self): + return self.hasFilesWithExtension('gif|jpg|jpeg|png') + + def hasFilesWithExtension(self, extensions): + extensions = re.compile('('+extensions+')$', re.I); + for item in self.getSelectedFiles(): + if extensions.search(item.path()): + return True; + return False + + def getSelectedItems(self): + self._obtainSelectionInformationExtended() + return self._files + self._directories; + + def getSelectedItemsWithoutChildItems(self): + self._obtainSelectionInformationExtended() + items = [] + for item in self._items_without_containing_child_items: + items.append(SideBarItem(item, os.path.isdir(item))) + return items + + def getSelectedDirectories(self): + self._obtainSelectionInformationExtended() + return self._directories; + + def getSelectedFiles(self): + self._obtainSelectionInformationExtended() + return self._files; + + def getSelectedDirectoriesOrDirnames(self): + self._obtainSelectionInformationExtended() + return self._directories_or_dirnames; + + def getSelectedImages(self): + return self.getSelectedFilesWithExtension('gif|jpg|jpeg|png') + + def getSelectedFilesWithExtension(self, extensions): + items = [] + extensions = re.compile('('+extensions+')$', re.I); + for item in self.getSelectedFiles(): + if extensions.search(item.path()): + items.append(item) + return items + + def _obtainSelectionInformationBasic(self): + if not self._obtained_selection_information_basic: + self._obtained_selection_information_basic = True + + self._has_directories = False + self._has_files = False + self._only_directories = False + self._only_files = False + + for path in self._paths: + if self._has_directories == False and os.path.isdir(path): + self._has_directories = True + if self._has_files == False and os.path.isdir(path) == False: + self._has_files = True + if self._has_files and self._has_directories: + break + + if self._has_files and self._has_directories: + self._only_directories = False + self._only_files = False + elif self._has_files: + self._only_files = True + elif self._has_directories: + self._only_directories = True + + def _obtainSelectionInformationExtended(self): + if not self._obtained_selection_information_extended: + self._obtained_selection_information_extended = True + + self._directories = [] + self._files = [] + self._directories_or_dirnames = [] + self._items_without_containing_child_items = [] + + _directories = [] + _files = [] + _directories_or_dirnames = [] + _items_without_containing_child_items = [] + + for path in self._paths: + if os.path.isdir(path): + item = SideBarItem(path, True) + if item.path() not in _directories: + _directories.append(item.path()) + self._directories.append(item) + if item.path() not in _directories_or_dirnames: + _directories_or_dirnames.append(item.path()) + self._directories_or_dirnames.append(item) + _items_without_containing_child_items = self._itemsWithoutContainingChildItems(_items_without_containing_child_items, item.path()) + else: + item = SideBarItem(path, False) + if item.path() not in _files: + _files.append(item.path()) + self._files.append(item) + _items_without_containing_child_items = self._itemsWithoutContainingChildItems(_items_without_containing_child_items, item.path()) + item = SideBarItem(os.path.dirname(path), True) + if item.path() not in _directories_or_dirnames: + _directories_or_dirnames.append(item.path()) + self._directories_or_dirnames.append(item) + + self._items_without_containing_child_items = _items_without_containing_child_items + + def _itemsWithoutContainingChildItems(self, items, item): + new_list = [] + add = True + for i in items: + if i.find(item+'\\') == 0 or i.find(item+'/') == 0: + continue + else: + new_list.append(i) + if (item+'\\').find(i+'\\') == 0 or (item+'/').find(i+'/') == 0: + add = False + if add: + new_list.append(item) + return new_list + + def isNone(self, path): + if path == None or path == '' or path == '.' or path == '..' or path == './' or path == '/' or path == '//' or path == '\\' or path == '\\\\' or path == '\\\\\\\\': + return True + else: + return False diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py new file mode 100644 index 0000000..d8bfcc8 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/__init__.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python + +""" +Simple desktop integration for Python. This module provides desktop environment +detection and resource opening support for a selection of common and +standardised desktop environments. + +Copyright (C) 2005, 2006, 2007, 2008, 2009 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +You should have received a copy of the GNU Lesser General Public License along +with this program. If not, see . + +-------- + +Desktop Detection +----------------- + +To detect a specific desktop environment, use the get_desktop function. +To detect whether the desktop environment is standardised (according to the +proposed DESKTOP_LAUNCH standard), use the is_standard function. + +Opening URLs +------------ + +To open a URL in the current desktop environment, relying on the automatic +detection of that environment, use the desktop.open function as follows: + +desktop.open("http://www.python.org") + +To override the detected desktop, specify the desktop parameter to the open +function as follows: + +desktop.open("http://www.python.org", "KDE") # Insists on KDE +desktop.open("http://www.python.org", "GNOME") # Insists on GNOME + +Without overriding using the desktop parameter, the open function will attempt +to use the "standard" desktop opening mechanism which is controlled by the +DESKTOP_LAUNCH environment variable as described below. + +The DESKTOP_LAUNCH Environment Variable +--------------------------------------- + +The DESKTOP_LAUNCH environment variable must be shell-quoted where appropriate, +as shown in some of the following examples: + +DESKTOP_LAUNCH="kdialog --msgbox" Should present any opened URLs in + their entirety in a KDE message box. + (Command "kdialog" plus parameter.) +DESKTOP_LAUNCH="my\ opener" Should run the "my opener" program to + open URLs. + (Command "my opener", no parameters.) +DESKTOP_LAUNCH="my\ opener --url" Should run the "my opener" program to + open URLs. + (Command "my opener" plus parameter.) + +Details of the DESKTOP_LAUNCH environment variable convention can be found here: +http://lists.freedesktop.org/archives/xdg/2004-August/004489.html + +Other Modules +------------- + +The desktop.dialog module provides support for opening dialogue boxes. +The desktop.windows module permits the inspection of desktop windows. +""" + +__version__ = "0.4" + +import os +import sys + +# Provide suitable process creation functions. + +try: + import subprocess + def _run(cmd, shell, wait): + opener = subprocess.Popen(cmd, shell=shell) + if wait: opener.wait() + return opener.pid + + def _readfrom(cmd, shell): + opener = subprocess.Popen(cmd, shell=shell, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + opener.stdin.close() + return opener.stdout.read() + + def _status(cmd, shell): + opener = subprocess.Popen(cmd, shell=shell) + opener.wait() + return opener.returncode == 0 + +except ImportError: + import popen2 + def _run(cmd, shell, wait): + opener = popen2.Popen3(cmd) + if wait: opener.wait() + return opener.pid + + def _readfrom(cmd, shell): + opener = popen2.Popen3(cmd) + opener.tochild.close() + opener.childerr.close() + return opener.fromchild.read() + + def _status(cmd, shell): + opener = popen2.Popen3(cmd) + opener.wait() + return opener.poll() == 0 + +import commands + +# Private functions. + +def _get_x11_vars(): + + "Return suitable environment definitions for X11." + + if not os.environ.get("DISPLAY", "").strip(): + return "DISPLAY=:0.0 " + else: + return "" + +def _is_xfce(): + + "Return whether XFCE is in use." + + # XFCE detection involves testing the output of a program. + + try: + return _readfrom(_get_x11_vars() + "xprop -root _DT_SAVE_MODE", shell=1).strip().endswith(' = "xfce4"') + except OSError: + return 0 + +def _is_x11(): + + "Return whether the X Window System is in use." + + return os.environ.has_key("DISPLAY") + +# Introspection functions. + +def get_desktop(): + + """ + Detect the current desktop environment, returning the name of the + environment. If no environment could be detected, None is returned. + """ + + if os.environ.has_key("KDE_FULL_SESSION") or \ + os.environ.has_key("KDE_MULTIHEAD"): + return "KDE" + elif os.environ.has_key("GNOME_DESKTOP_SESSION_ID") or \ + os.environ.has_key("GNOME_KEYRING_SOCKET"): + return "GNOME" + elif sys.platform == "darwin": + return "Mac OS X" + elif hasattr(os, "startfile"): + return "Windows" + elif _is_xfce(): + return "XFCE" + + # KDE, GNOME and XFCE run on X11, so we have to test for X11 last. + + if _is_x11(): + return "X11" + else: + return None + +def use_desktop(desktop): + + """ + Decide which desktop should be used, based on the detected desktop and a + supplied 'desktop' argument (which may be None). Return an identifier + indicating the desktop type as being either "standard" or one of the results + from the 'get_desktop' function. + """ + + # Attempt to detect a desktop environment. + + detected = get_desktop() + + # Start with desktops whose existence can be easily tested. + + if (desktop is None or desktop == "standard") and is_standard(): + return "standard" + elif (desktop is None or desktop == "Windows") and detected == "Windows": + return "Windows" + + # Test for desktops where the overriding is not verified. + + elif (desktop or detected) == "KDE": + return "KDE" + elif (desktop or detected) == "GNOME": + return "GNOME" + elif (desktop or detected) == "XFCE": + return "XFCE" + elif (desktop or detected) == "Mac OS X": + return "Mac OS X" + elif (desktop or detected) == "X11": + return "X11" + else: + return None + +def is_standard(): + + """ + Return whether the current desktop supports standardised application + launching. + """ + + return os.environ.has_key("DESKTOP_LAUNCH") + +# Activity functions. + +def open(url, desktop=None, wait=0): + + """ + Open the 'url' in the current desktop's preferred file browser. If the + optional 'desktop' parameter is specified then attempt to use that + particular desktop environment's mechanisms to open the 'url' instead of + guessing or detecting which environment is being used. + + Suggested values for 'desktop' are "standard", "KDE", "GNOME", "XFCE", + "Mac OS X", "Windows" where "standard" employs a DESKTOP_LAUNCH environment + variable to open the specified 'url'. DESKTOP_LAUNCH should be a command, + possibly followed by arguments, and must have any special characters + shell-escaped. + + The process identifier of the "opener" (ie. viewer, editor, browser or + program) associated with the 'url' is returned by this function. If the + process identifier cannot be determined, None is returned. + + An optional 'wait' parameter is also available for advanced usage and, if + 'wait' is set to a true value, this function will wait for the launching + mechanism to complete before returning (as opposed to immediately returning + as is the default behaviour). + """ + + # Decide on the desktop environment in use. + + desktop_in_use = use_desktop(desktop) + + if desktop_in_use == "standard": + arg = "".join([os.environ["DESKTOP_LAUNCH"], commands.mkarg(url)]) + return _run(arg, 1, wait) + + elif desktop_in_use == "Windows": + # NOTE: This returns None in current implementations. + return os.startfile(url) + + elif desktop_in_use == "KDE": + cmd = ["kfmclient", "exec", url] + + elif desktop_in_use == "GNOME": + cmd = ["gnome-open", url] + + elif desktop_in_use == "XFCE": + cmd = ["exo-open", url] + + elif desktop_in_use == "Mac OS X": + cmd = ["open", url] + + elif desktop_in_use == "X11" and os.environ.has_key("BROWSER"): + cmd = [os.environ["BROWSER"], url] + + # Finish with an error where no suitable desktop was identified. + + else: + raise OSError, "Desktop '%s' not supported (neither DESKTOP_LAUNCH nor os.startfile could be used)" % desktop_in_use + + return _run(cmd, 0, wait) + +# vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py new file mode 100644 index 0000000..9525004 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/dialog.py @@ -0,0 +1,549 @@ +#!/usr/bin/env python + +""" +Simple desktop dialogue box support for Python. + +Copyright (C) 2007, 2009 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +You should have received a copy of the GNU Lesser General Public License along +with this program. If not, see . + +-------- + +Opening Dialogue Boxes (Dialogs) +-------------------------------- + +To open a dialogue box (dialog) in the current desktop environment, relying on +the automatic detection of that environment, use the appropriate dialogue box +class: + +question = desktop.dialog.Question("Are you sure?") +result = question.open() + +To override the detected desktop, specify the desktop parameter to the open +function as follows: + +question.open("KDE") # Insists on KDE +question.open("GNOME") # Insists on GNOME + +The dialogue box options are documented in each class's docstring. + +Available dialogue box classes are listed in the desktop.dialog.available +attribute. + +Supported desktop environments are listed in the desktop.dialog.supported +attribute. +""" + +from desktop import use_desktop, _run, _readfrom, _status + +class _wrapper: + def __init__(self, handler): + self.handler = handler + +class _readvalue(_wrapper): + def __call__(self, cmd, shell): + return self.handler(cmd, shell).strip() + +class _readinput(_wrapper): + def __call__(self, cmd, shell): + return self.handler(cmd, shell)[:-1] + +class _readvalues_kdialog(_wrapper): + def __call__(self, cmd, shell): + result = self.handler(cmd, shell).strip().strip('"') + if result: + return result.split('" "') + else: + return [] + +class _readvalues_zenity(_wrapper): + def __call__(self, cmd, shell): + result = self.handler(cmd, shell).strip() + if result: + return result.split("|") + else: + return [] + +class _readvalues_Xdialog(_wrapper): + def __call__(self, cmd, shell): + result = self.handler(cmd, shell).strip() + if result: + return result.split("/") + else: + return [] + +# Dialogue parameter classes. + +class String: + + "A generic parameter." + + def __init__(self, name): + self.name = name + + def convert(self, value, program): + return [value or ""] + +class Strings(String): + + "Multiple string parameters." + + def convert(self, value, program): + return value or [] + +class StringPairs(String): + + "Multiple string parameters duplicated to make identifiers." + + def convert(self, value, program): + l = [] + for v in value: + l.append(v) + l.append(v) + return l + +class StringKeyword: + + "A keyword parameter." + + def __init__(self, keyword, name): + self.keyword = keyword + self.name = name + + def convert(self, value, program): + return [self.keyword + "=" + (value or "")] + +class StringKeywords: + + "Multiple keyword parameters." + + def __init__(self, keyword, name): + self.keyword = keyword + self.name = name + + def convert(self, value, program): + l = [] + for v in value or []: + l.append(self.keyword + "=" + v) + return l + +class Integer(String): + + "An integer parameter." + + defaults = { + "width" : 40, + "height" : 15, + "list_height" : 10 + } + scale = 8 + + def __init__(self, name, pixels=0): + String.__init__(self, name) + if pixels: + self.factor = self.scale + else: + self.factor = 1 + + def convert(self, value, program): + if value is None: + value = self.defaults[self.name] + return [str(int(value) * self.factor)] + +class IntegerKeyword(Integer): + + "An integer keyword parameter." + + def __init__(self, keyword, name, pixels=0): + Integer.__init__(self, name, pixels) + self.keyword = keyword + + def convert(self, value, program): + if value is None: + value = self.defaults[self.name] + return [self.keyword + "=" + str(int(value) * self.factor)] + +class Boolean(String): + + "A boolean parameter." + + values = { + "kdialog" : ["off", "on"], + "zenity" : ["FALSE", "TRUE"], + "Xdialog" : ["off", "on"] + } + + def convert(self, value, program): + values = self.values[program] + if value: + return [values[1]] + else: + return [values[0]] + +class MenuItemList(String): + + "A menu item list parameter." + + def convert(self, value, program): + l = [] + for v in value: + l.append(v.value) + l.append(v.text) + return l + +class ListItemList(String): + + "A radiolist/checklist item list parameter." + + def __init__(self, name, status_first=0): + String.__init__(self, name) + self.status_first = status_first + + def convert(self, value, program): + l = [] + for v in value: + boolean = Boolean(None) + status = boolean.convert(v.status, program) + if self.status_first: + l += status + l.append(v.value) + l.append(v.text) + if not self.status_first: + l += status + return l + +# Dialogue argument values. + +class MenuItem: + + "A menu item which can also be used with radiolists and checklists." + + def __init__(self, value, text, status=0): + self.value = value + self.text = text + self.status = status + +# Dialogue classes. + +class Dialogue: + + commands = { + "KDE" : "kdialog", + "GNOME" : "zenity", + "XFCE" : "zenity", # NOTE: Based on observations with Xubuntu. + "X11" : "Xdialog" + } + + def open(self, desktop=None): + + """ + Open a dialogue box (dialog) using a program appropriate to the desktop + environment in use. + + If the optional 'desktop' parameter is specified then attempt to use + that particular desktop environment's mechanisms to open the dialog + instead of guessing or detecting which environment is being used. + + Suggested values for 'desktop' are "standard", "KDE", "GNOME", + "Mac OS X", "Windows". + + The result of the dialogue interaction may be a string indicating user + input (for Input, Password, Menu, Pulldown), a list of strings + indicating selections of one or more items (for RadioList, CheckList), + or a value indicating true or false (for Question, Warning, Message, + Error). + + Where a string value may be expected but no choice is made, an empty + string may be returned. Similarly, where a list of values is expected + but no choice is made, an empty list may be returned. + """ + + # Decide on the desktop environment in use. + + desktop_in_use = use_desktop(desktop) + + # Get the program. + + try: + program = self.commands[desktop_in_use] + except KeyError: + raise OSError, "Desktop '%s' not supported (no known dialogue box command could be suggested)" % desktop_in_use + + # The handler is one of the functions communicating with the subprocess. + # Some handlers return boolean values, others strings. + + handler, options = self.info[program] + + cmd = [program] + for option in options: + if isinstance(option, str): + cmd.append(option) + else: + value = getattr(self, option.name, None) + cmd += option.convert(value, program) + + return handler(cmd, 0) + +class Simple(Dialogue): + def __init__(self, text, width=None, height=None): + self.text = text + self.width = width + self.height = height + +class Question(Simple): + + """ + A dialogue asking a question and showing response buttons. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "question" + info = { + "kdialog" : (_status, ["--yesno", String("text")]), + "zenity" : (_status, ["--question", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--yesno", String("text"), Integer("height"), Integer("width")]), + } + +class Warning(Simple): + + """ + A dialogue asking a question and showing response buttons. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "warning" + info = { + "kdialog" : (_status, ["--warningyesno", String("text")]), + "zenity" : (_status, ["--warning", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--yesno", String("text"), Integer("height"), Integer("width")]), + } + +class Message(Simple): + + """ + A message dialogue. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "message" + info = { + "kdialog" : (_status, ["--msgbox", String("text")]), + "zenity" : (_status, ["--info", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--msgbox", String("text"), Integer("height"), Integer("width")]), + } + +class Error(Simple): + + """ + An error dialogue. + Options: text, width (in characters), height (in characters) + Response: a boolean value indicating an affirmative response (true) or a + negative response + """ + + name = "error" + info = { + "kdialog" : (_status, ["--error", String("text")]), + "zenity" : (_status, ["--error", StringKeyword("--text", "text")]), + "Xdialog" : (_status, ["--stdout", "--msgbox", String("text"), Integer("height"), Integer("width")]), + } + +class Menu(Simple): + + """ + A menu of options, one of which being selectable. + Options: text, width (in characters), height (in characters), + list_height (in items), items (MenuItem objects) + Response: a value corresponding to the chosen item + """ + + name = "menu" + info = { + "kdialog" : (_readvalue(_readfrom), ["--menu", String("text"), MenuItemList("items")]), + "zenity" : (_readvalue(_readfrom), ["--list", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + MenuItemList("items")] + ), + "Xdialog" : (_readvalue(_readfrom), ["--stdout", "--menubox", + String("text"), Integer("height"), Integer("width"), Integer("list_height"), MenuItemList("items")] + ), + } + item = MenuItem + number_of_titles = 2 + + def __init__(self, text, titles, items=None, width=None, height=None, list_height=None): + + """ + Initialise a menu with the given heading 'text', column 'titles', and + optional 'items' (which may be added later), 'width' (in characters), + 'height' (in characters) and 'list_height' (in items). + """ + + Simple.__init__(self, text, width, height) + self.titles = ([""] * self.number_of_titles + titles)[-self.number_of_titles:] + self.items = items or [] + self.list_height = list_height + + def add(self, *args, **kw): + + """ + Add an item, passing the given arguments to the appropriate item class. + """ + + self.items.append(self.item(*args, **kw)) + +class RadioList(Menu): + + """ + A list of radio buttons, one of which being selectable. + Options: text, width (in characters), height (in characters), + list_height (in items), items (MenuItem objects), titles + Response: a list of values corresponding to chosen items (since some + programs, eg. zenity, appear to support multiple default + selections) + """ + + name = "radiolist" + info = { + "kdialog" : (_readvalues_kdialog(_readfrom), ["--radiolist", String("text"), ListItemList("items")]), + "zenity" : (_readvalues_zenity(_readfrom), + ["--list", "--radiolist", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + ListItemList("items", 1)] + ), + "Xdialog" : (_readvalues_Xdialog(_readfrom), ["--stdout", "--radiolist", + String("text"), Integer("height"), Integer("width"), Integer("list_height"), ListItemList("items")] + ), + } + number_of_titles = 3 + +class CheckList(Menu): + + """ + A list of checkboxes, many being selectable. + Options: text, width (in characters), height (in characters), + list_height (in items), items (MenuItem objects), titles + Response: a list of values corresponding to chosen items + """ + + name = "checklist" + info = { + "kdialog" : (_readvalues_kdialog(_readfrom), ["--checklist", String("text"), ListItemList("items")]), + "zenity" : (_readvalues_zenity(_readfrom), + ["--list", "--checklist", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + ListItemList("items", 1)] + ), + "Xdialog" : (_readvalues_Xdialog(_readfrom), ["--stdout", "--checklist", + String("text"), Integer("height"), Integer("width"), Integer("list_height"), ListItemList("items")] + ), + } + number_of_titles = 3 + +class Pulldown(Menu): + + """ + A pull-down menu of options, one of which being selectable. + Options: text, width (in characters), height (in characters), + items (list of values) + Response: a value corresponding to the chosen item + """ + + name = "pulldown" + info = { + "kdialog" : (_readvalue(_readfrom), ["--combobox", String("text"), Strings("items")]), + "zenity" : (_readvalue(_readfrom), + ["--list", "--radiolist", StringKeyword("--text", "text"), StringKeywords("--column", "titles"), + StringPairs("items")] + ), + "Xdialog" : (_readvalue(_readfrom), + ["--stdout", "--combobox", String("text"), Integer("height"), Integer("width"), Strings("items")]), + } + item = unicode + number_of_titles = 2 + +class Input(Simple): + + """ + An input dialogue, consisting of an input field. + Options: text, input, width (in characters), height (in characters) + Response: the text entered into the dialogue by the user + """ + + name = "input" + info = { + "kdialog" : (_readinput(_readfrom), + ["--inputbox", String("text"), String("data")]), + "zenity" : (_readinput(_readfrom), + ["--entry", StringKeyword("--text", "text"), StringKeyword("--entry-text", "data")]), + "Xdialog" : (_readinput(_readfrom), + ["--stdout", "--inputbox", String("text"), Integer("height"), Integer("width"), String("data")]), + } + + def __init__(self, text, data="", width=None, height=None): + Simple.__init__(self, text, width, height) + self.data = data + +class Password(Input): + + """ + A password dialogue, consisting of a password entry field. + Options: text, width (in characters), height (in characters) + Response: the text entered into the dialogue by the user + """ + + name = "password" + info = { + "kdialog" : (_readinput(_readfrom), + ["--password", String("text")]), + "zenity" : (_readinput(_readfrom), + ["--entry", StringKeyword("--text", "text"), "--hide-text"]), + "Xdialog" : (_readinput(_readfrom), + ["--stdout", "--password", "--inputbox", String("text"), Integer("height"), Integer("width")]), + } + +class TextFile(Simple): + + """ + A text file input box. + Options: filename, text, width (in characters), height (in characters) + Response: any text returned by the dialogue program (typically an empty + string) + """ + + name = "textfile" + info = { + "kdialog" : (_readfrom, ["--textbox", String("filename"), Integer("width", pixels=1), Integer("height", pixels=1)]), + "zenity" : (_readfrom, ["--text-info", StringKeyword("--filename", "filename"), IntegerKeyword("--width", "width", pixels=1), + IntegerKeyword("--height", "height", pixels=1)] + ), + "Xdialog" : (_readfrom, ["--stdout", "--textbox", String("filename"), Integer("height"), Integer("width")]), + } + + def __init__(self, filename, text="", width=None, height=None): + Simple.__init__(self, text, width, height) + self.filename = filename + +# Available dialogues. + +available = [Question, Warning, Message, Error, Menu, CheckList, RadioList, Input, Password, Pulldown, TextFile] + +# Supported desktop environments. + +supported = Dialogue.commands.keys() + +# vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py new file mode 100644 index 0000000..2b19e85 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/SideBarEnhancements/sidebar/desktop/windows.py @@ -0,0 +1,273 @@ +#!/usr/bin/env python + +""" +Simple desktop window enumeration for Python. + +Copyright (C) 2007, 2008, 2009 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. + +You should have received a copy of the GNU Lesser General Public License along +with this program. If not, see . + +-------- + +Finding Open Windows on the Desktop +----------------------------------- + +To obtain a list of windows, use the desktop.windows.list function as follows: + +windows = desktop.windows.list() + +To obtain the root window, typically the desktop background, use the +desktop.windows.root function as follows: + +root = desktop.windows.root() + +Each window object can be inspected through a number of methods. For example: + +name = window.name() +width, height = window.size() +x, y = window.position() +child_windows = window.children() + +See the desktop.windows.Window class for more information. +""" + +from desktop import _is_x11, _get_x11_vars, _readfrom, use_desktop +import re + +# System functions. + +def _xwininfo(identifier, action): + if identifier is None: + args = "-root" + else: + args = "-id " + identifier + + s = _readfrom(_get_x11_vars() + "xwininfo %s -%s" % (args, action), shell=1) + + # Return a mapping of keys to values for the "stats" action. + + if action == "stats": + d = {} + for line in s.split("\n"): + fields = line.split(":") + if len(fields) < 2: + continue + key, value = fields[0].strip(), ":".join(fields[1:]).strip() + d[key] = value + + return d + + # Otherwise, return the raw output. + + else: + return s + +def _get_int_properties(d, properties): + results = [] + for property in properties: + results.append(int(d[property])) + return results + +# Finder functions. + +def find_all(name): + return 1 + +def find_named(name): + return name is not None + +def find_by_name(name): + return lambda n, t=name: n == t + +# Window classes. +# NOTE: X11 is the only supported desktop so far. + +class Window: + + "A window on the desktop." + + _name_pattern = re.compile(r':\s+\(.*?\)\s+[-0-9x+]+\s+[-0-9+]+$') + _absent_names = "(has no name)", "(the root window) (has no name)" + + def __init__(self, identifier): + + "Initialise the window with the given 'identifier'." + + self.identifier = identifier + + # Finder methods (from above). + + self.find_all = find_all + self.find_named = find_named + self.find_by_name = find_by_name + + def __repr__(self): + return "Window(%r)" % self.identifier + + # Methods which deal with the underlying commands. + + def _get_handle_and_name(self, text): + fields = text.strip().split(" ") + handle = fields[0] + + # Get the "" part, stripping off the quotes. + + name = " ".join(fields[1:]) + if len(name) > 1 and name[0] == '"' and name[-1] == '"': + name = name[1:-1] + + if name in self._absent_names: + return handle, None + else: + return handle, name + + def _get_this_handle_and_name(self, line): + fields = line.split(":") + return self._get_handle_and_name(":".join(fields[1:])) + + def _get_descendant_handle_and_name(self, line): + match = self._name_pattern.search(line) + if match: + return self._get_handle_and_name(line[:match.start()].strip()) + else: + raise OSError, "Window information from %r did not contain window details." % line + + def _descendants(self, s, fn): + handles = [] + adding = 0 + for line in s.split("\n"): + if line.endswith("child:") or line.endswith("children:"): + if not adding: + adding = 1 + elif adding and line: + handle, name = self._get_descendant_handle_and_name(line) + if fn(name): + handles.append(handle) + return [Window(handle) for handle in handles] + + # Public methods. + + def children(self, all=0): + + """ + Return a list of windows which are children of this window. If the + optional 'all' parameter is set to a true value, all such windows will + be returned regardless of whether they have any name information. + """ + + s = _xwininfo(self.identifier, "children") + return self._descendants(s, all and self.find_all or self.find_named) + + def descendants(self, all=0): + + """ + Return a list of windows which are descendants of this window. If the + optional 'all' parameter is set to a true value, all such windows will + be returned regardless of whether they have any name information. + """ + + s = _xwininfo(self.identifier, "tree") + return self._descendants(s, all and self.find_all or self.find_named) + + def find(self, callable): + + """ + Return windows using the given 'callable' (returning a true or a false + value when invoked with a window name) for descendants of this window. + """ + + s = _xwininfo(self.identifier, "tree") + return self._descendants(s, callable) + + def name(self): + + "Return the name of the window." + + d = _xwininfo(self.identifier, "stats") + + # Format is 'xwininfo: Window id: "" + + return self._get_this_handle_and_name(d["xwininfo"])[1] + + def size(self): + + "Return a tuple containing the width and height of this window." + + d = _xwininfo(self.identifier, "stats") + return _get_int_properties(d, ["Width", "Height"]) + + def position(self): + + "Return a tuple containing the upper left co-ordinates of this window." + + d = _xwininfo(self.identifier, "stats") + return _get_int_properties(d, ["Absolute upper-left X", "Absolute upper-left Y"]) + + def displayed(self): + + """ + Return whether the window is displayed in some way (but not necessarily + visible on the current screen). + """ + + d = _xwininfo(self.identifier, "stats") + return d["Map State"] != "IsUnviewable" + + def visible(self): + + "Return whether the window is displayed and visible." + + d = _xwininfo(self.identifier, "stats") + return d["Map State"] == "IsViewable" + +def list(desktop=None): + + """ + Return a list of windows for the current desktop. If the optional 'desktop' + parameter is specified then attempt to use that particular desktop + environment's mechanisms to look for windows. + """ + + root_window = root(desktop) + window_list = [window for window in root_window.descendants() if window.displayed()] + window_list.insert(0, root_window) + return window_list + +def root(desktop=None): + + """ + Return the root window for the current desktop. If the optional 'desktop' + parameter is specified then attempt to use that particular desktop + environment's mechanisms to look for windows. + """ + + # NOTE: The desktop parameter is currently ignored and X11 is tested for + # NOTE: directly. + + if _is_x11(): + return Window(None) + else: + raise OSError, "Desktop '%s' not supported" % use_desktop(desktop) + +def find(callable, desktop=None): + + """ + Find and return windows using the given 'callable' for the current desktop. + If the optional 'desktop' parameter is specified then attempt to use that + particular desktop environment's mechanisms to look for windows. + """ + + return root(desktop).find(callable) + +# vim: tabstop=4 expandtab shiftwidth=4 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap new file mode 100644 index 0000000..f5ba726 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Linux).sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["ctrl+super+n"], + "command": "sublime_files", + "args": {"command":"navigate"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap new file mode 100644 index 0000000..f5ba726 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (OSX).sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["ctrl+super+n"], + "command": "sublime_files", + "args": {"command":"navigate"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap new file mode 100644 index 0000000..3e53fd3 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default (Windows).sublime-keymap @@ -0,0 +1,7 @@ +[ + { + "keys": ["ctrl+alt+n"], + "command": "sublime_files", + "args": {"command":"navigate"} + } +] \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands new file mode 100644 index 0000000..3b2e67f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Default.sublime-commands @@ -0,0 +1,7 @@ +[ + { + "caption": "Sublime Files: Open Navigator", + "command": "sublime_files", + "args": {"command":"navigate"} + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu new file mode 100644 index 0000000..d11fdf6 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/Main.sublime-menu @@ -0,0 +1,83 @@ +[ + { + "caption": "Preferences", + "mnemonic": "n", + "id": "preferences", + "children": + [ + { + "caption": "Package Settings", + "mnemonic": "P", + "id": "package-settings", + "children": + [ + { + "caption": "SublimeFiles", + "children": + [ + { + "command": "open_file", + "args": {"file": "${packages}/Sublime Files/SublimeFiles.sublime-settings"}, + "caption": "Settings – Default" + }, + { + "command": "open_file", + "args": {"file": "${packages}/User/SublimeFiles.sublime-settings"}, + "caption": "Settings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/Sublime Files/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/Sublime Files/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/Sublime Files/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – Default" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Windows).sublime-keymap", + "platform": "Windows" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (OSX).sublime-keymap", + "platform": "OSX" + }, + "caption": "Key Bindings – User" + }, + { + "command": "open_file", + "args": { + "file": "${packages}/User/Default (Linux).sublime-keymap", + "platform": "Linux" + }, + "caption": "Key Bindings – User" + }, + { "caption": "-" } + ] + } + ] + } + ] + } +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md new file mode 100644 index 0000000..bff337f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/README.md @@ -0,0 +1,66 @@ +Sublime Files +------------- + +__A keyboard driven file navigation/opening plugin for Sublime Text 2__ + + +Sublime Files works entirely through the command palette. By running the +Sublime Files Navigator, you can "cd" around directories similar to how +you would on a command line in order to open up files. New files will open up in new tabs. + + +Because Sublime Files actually navigates the file system by changing directories, +the navigator remembers and starts from last visited directory on subsequent uses. +To open the navigator, you can either just invoke the command palette command or +use the keybinding ctrl+super+n + + +Built with Mac OS X, but all the calls have been designed to be platform agnostic and thus should work regardless of system. However, this is untested on Windows. + +---------- + +__Installation__ + +Sublime Files can be installed through Sublime Package Control. + +---------- + +__Usage__ + +Sublime files an be activated with the command palette command: "Sublime Files: Open Navigator", or with the key command ctrl+super+n (or ctrl+alt+n for windows). +The first option will always show the current directory. Selecting another directory will navigate to that directory and selecting a file will open that file. + + +There are a few notable options: + + +- Selecting "Directory actions" will pop up a small list of actions that can be applied onto the current directory. Mainly, a user can create new files, add the directory to the current project, and open a terminal at the directory. + +- Selecting "~/" navigates to the home directory. + +- Selecting "../" navigates to the parent directory. + +- Selecting "To current View" navigates to the directory of the current file being edited. + +---------- +__Ignore file types__ + + +SublimeFiles by default will ignore \*.pyc files and \*.class files. You can modify the list of ignored files by changing the ignore\_list in SublimeFiles.sublime-settings. + + +---------- + +__Open Terminal__ + + +For OS X/Linux systems, Sublime Files can open up a terminal at the current directory navigated to. +In order for this feature to work properly, you will have to modify the term\_command field in the +SublimeFiles.sublime-settings text file +located in the SublimeFiles plugin directory. As a default, it is set to open up Terminal.app for OS X systems. + +For example, Gnome Terminal and iTerm2 users respectively will want to change term\_command in SublimeFiles.sublime-settings to: + + - "term_command": "gnome-terminal --working-directory=" + - "term_command" : "open -a iTerm\ 2 " + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings new file mode 100644 index 0000000..4184c09 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/SublimeFiles.sublime-settings @@ -0,0 +1,10 @@ +{ + //The command to execute to open a terminal. + //Program will append the directory to open to the end of term_command. + "term_command": "open -a Terminal ", + + //list of Unix shell-style wildcard matches for file types to + //ignore when listing files in the navigator. + //By default, ignores *.pyc and *.class files. + "ignore_list": ["*.pyc", "*.class"] +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json new file mode 100644 index 0000000..d7c7b05 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/messages.json @@ -0,0 +1,3 @@ +{ + "install": "README.md" +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json new file mode 100644 index 0000000..2edf95f --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/package-metadata.json @@ -0,0 +1 @@ +{"url": "https://github.com/al63/SublimeFiles", "version": "2013.03.29.16.32.31", "description": "Sublime Text 2 plugin for keyboard driven file navigation"} \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py new file mode 100644 index 0000000..3136215 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Sublime Files/sublime_files.py @@ -0,0 +1,176 @@ +import sublime, sublime_plugin +import os, sys, glob +import shlex +from fnmatch import fnmatch +from subprocess import Popen + + +bullet = u'\u2022' +class SublimeFilesCommand(sublime_plugin.WindowCommand): + def run(self, command): + try: + self.home + except: + # first time starting up. ugly, but works + settings = sublime.load_settings('SublimeFiles.sublime-settings') + if os.name == 'nt': + self.home = 'USERPROFILE' + else: + self.home = 'HOME' + try: + os.chdir(os.path.dirname(sublime.active_window().active_view().file_name())) + except: + os.chdir(os.getenv(self.home)) + self.bookmark = None + self.term_command = settings.get('term_command') + self.ignore_list = settings.get('ignore_list') + self.drives = [] # for windows machines + + if command == 'navigate': + self.open_navigator() + + # function for showing panel for changing directories / opening files + def open_navigator(self): + self.dir_files = ['[' + os.getcwdu() + ']', + bullet + ' Directory actions', '..' + os.sep, '~' + os.sep] + + # annoying way to deal with windows + if sublime.platform() == 'windows': + if len(self.drives) == 0: + for i in range(ord('A'), ord('Z') + 1): + drive = chr(i) + if (os.path.exists(drive + ':\\')): + self.drives.append(drive + ':\\') + self.dir_files += self.drives + + for element in os.listdir(os.getcwdu()): + ignore_element = False + for ignore_pattern in self.ignore_list: + if fnmatch(element, ignore_pattern): + ignore_element = True + break + if not ignore_element: + fullpath = os.path.join(os.getcwdu(), element) + if os.path.isdir(fullpath): + self.dir_files.append(element + os.sep) + else: + self.dir_files.append(element) + + self.dir_files = self.dir_files[:4] + sorted(self.dir_files[4:], key=sort_files) + if self.bookmark: + self.dir_files.insert(2, bullet + ' To bookmark (' + self.bookmark + ')') + if self.window.active_view() and self.window.active_view().file_name(): + self.dir_files.insert(2, bullet + ' To current view') + self.window.show_quick_panel(self.dir_files, self.handle_navigator_option, sublime.MONOSPACE_FONT) + + # handles user's selection from open_navigator + def handle_navigator_option(self, call_value): + if call_value != -1: + option = self.dir_files[call_value] + if call_value == 0: + self.open_navigator() + elif call_value == 1: + self.open_directory_options() + elif option == '~' + os.sep: + os.chdir(os.getenv(self.home)) + elif option == '..' + os.sep: + os.chdir(os.path.pardir) + elif sublime.platform() == 'windows' and option in self.drives: + os.chdir(option) + elif option == bullet + ' To current view': + os.chdir(os.path.dirname(self.window.active_view().file_name())) + elif option.startswith(bullet + ' To bookmark'): + os.chdir(self.bookmark) + else: + fullpath = os.path.join(os.getcwdu(), self.dir_files[call_value]) + if os.path.isdir(fullpath): # navigate to directory + os.chdir(self.dir_files[call_value]) + else: # open file + self.window.open_file(os.path.join(os.getcwdu(), fullpath)) + return + self.open_navigator() + + # options for when a user selects current directory + def open_directory_options(self): + self.directory_options = [bullet + ' Add folder to project', bullet + ' Create new file', + bullet + ' Create new directory', bullet + ' Set bookmark here', bullet + ' Navigate to specific directory', bullet + ' Back'] + # terminal opening. only for osx/linux right now + if os.name == 'posix' and self.term_command: + self.directory_options.insert(0, bullet + ' Open terminal here') + self.window.show_quick_panel(self.directory_options, self.handle_directory_option, sublime.MONOSPACE_FONT) + + # handle choice for when user selects option from current directory + def handle_directory_option(self, call_value): + if call_value != -1: + selection = self.directory_options[call_value] + if selection == bullet + ' Create new file': + self.window.show_input_panel('File name: ', '', self.handle_new_file, None, None) + elif selection == bullet + ' Back': + self.open_navigator() + elif selection == bullet + ' Set bookmark here': + self.bookmark = os.getcwdu() + self.open_navigator() + elif selection == bullet + ' Open terminal here': + command = shlex.split(str(self.term_command)) + command.append(os.getcwdu()) + try: + Popen(command) + except: + sublime.error_message('Unable to open terminal') + elif selection == bullet + ' Add folder to project': + sublime_command_line(['-a', os.getcwdu()]) + elif selection == bullet + ' Create new directory': + self.window.show_input_panel('Directory name: ', '', self.handle_new_directory, None, None) + elif selection == bullet + ' Navigate to specific directory': + self.window.show_input_panel("Navigate to: ", os.getcwdu(), self.handle_cwd, None, None); + + + def handle_new_file(self, file_name): + if os.path.isfile(os.getcwdu() + os.sep + file_name): + sublime.error_message(file_name + ' already exists') + return + if os.path.isdir(os.getcwdu() + os.sep + file_name): + sublime.error_message(file_name + ' is already a directory') + return + FILE = open(os.getcwdu() + os.sep + file_name, 'a') + FILE.close() + self.window.open_file(os.getcwdu() + os.sep + file_name) + + def handle_new_directory(self, dir_name): + if os.path.isfile(os.getcwdu() + os.sep + dir_name): + sublime.error_message(dir_name + ' is already a file') + return + if os.path.isdir(os.getcwdu() + os.sep + dir_name): + sublime.error_message(dir_name + ' already exists') + return + os.makedirs(os.getcwdu() + os.sep + dir_name) + + def handle_cwd(self, new_dir): + try: + if new_dir[0] == "~": + new_dir = os.getenv(self.home) + new_dir[1:] + os.chdir(new_dir) + except: + sublime.error_message(new_dir + " does not exist") + + +def sort_files(filename): + total_weight = 0 + if filename[0] == '.': + total_weight += 2 + if filename[-1] == os.sep: + total_weight += 1 + return total_weight + +# hack to add folders to sidebar (stolen from wbond) +def get_sublime_path(): + if sublime.platform() == 'osx': + return '/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl' + elif sublime.platform() == 'linux': + return open('/proc/self/cmdline').read().split(chr(0))[0] + else: + return sys.executable + +def sublime_command_line(args): + args.insert(0, get_sublime_path()) + return Popen(args) diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md new file mode 100644 index 0000000..14f3ae4 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/README.md @@ -0,0 +1,102 @@ +# Soda Theme + +Dark and light custom UI themes for Sublime Text 2. + +Project site: [http://buymeasoda.github.com/soda-theme/](http://buymeasoda.github.com/soda-theme/) + +## Design + +![Soda Light Theme](http://buymeasoda.github.com/soda-theme/images/screenshots/soda-2-light-theme.png?v=4) + +![Soda Dark Theme](http://buymeasoda.github.com/soda-theme/images/screenshots/soda-2-dark-theme.png?v=2) + +## Installation + +Soda theme is designed to work with the latest [development build](http://www.sublimetext.com/dev) of Sublime Text 2. + +### Using Sublime Package Control + +If you are using Will Bond's excellent [Sublime Package Control](http://wbond.net/sublime_packages/package_control), you can easily install Soda Theme via the `Package Control: Install Package` menu item. The Soda Theme package is listed as `Theme - Soda` in the packages list. + +### Using Git + +Alternatively, if you are a git user, you can install the theme and keep up to date by cloning the repo directly into your `Packages` directory in the Sublime Text 2 application settings area. + +You can locate your Sublime Text 2 `Packages` directory by using the menu item `Preferences -> Browse Packages...`. + +While inside the `Packages` directory, clone the theme repository using the command below: + + git clone https://github.com/buymeasoda/soda-theme/ "Theme - Soda" + +### Download Manually + +* Download the files using the GitHub .zip download option +* Unzip the files and rename the folder to `Theme - Soda` +* Copy the folder to your Sublime Text 2 `Packages` directory + +## Activating the theme + +To configure Sublime Text 2 to use the theme: + +* Open your User Settings Preferences file `Sublime Text 2 -> Preferences -> Settings - User` +* Add (or update) your theme entry to be `"theme": "Soda Light.sublime-theme"` or `"theme": "Soda Dark.sublime-theme"` + +### Example User Settings + + { + "theme": "Soda Light.sublime-theme" + } + +## Additional Features + +### Alternate Tab Styles + +Soda Theme ships with two alternate UI tab styles. + +By default, a square tab style is used. If you'd prefer to use the original curved tab style, add the following custom setting to your `Settings - User` file: + + "soda_classic_tabs": true + +![Soda Tab Styles](http://buymeasoda.github.com/soda-theme/images/features/multiple-tab-styles.png) + +### Retina Resolution UI + +Soda Theme has been designed to take advantage of retina resolution (high-dpi) displays. Both Soda Light and Soda Dark support retina displays. + +![Soda Retina](http://buymeasoda.github.com/soda-theme/images/features/soda-retina.png) + +### Theme Customisation + +Sublime Text 2 provides an elegant way to tweak existing themes without having to duplicate or maintain a separate copy of the original theme. If there are aspects of Soda Theme that you would like to adjust, take a look at the [theme customisation](https://github.com/buymeasoda/soda-theme/wiki/Theme-customisation) wiki page. + +## Bonus Options + +### Syntax Highlighting Colour Schemes + +The Soda Light screenshot uses a modified version of Espresso Tutti Colori and the Soda Dark screenshot uses a modified version of Monokai. + +If you'd like to use the syntax highlighting schemes shown in the screenshots: + +* Download [colour-schemes.zip](http://buymeasoda.github.com/soda-theme/extras/colour-schemes.zip) +* Unzip and place the extracted `tmtheme` files in the Sublime Text 2 `Packages/User` folder +* Enable the colour scheme via `Preferences -> Color Scheme -> User` + +### Code Font + +The code font shown in the screenshot is Menlo. + +## Development + +Please note, Sublime Text dev builds move quickly and changes can occur with the theme API between releases, so there may be occasions where the theme doesn't quite work with a brand new dev release. + +While developing the theme, I have documented some [theme challenges and ideas](https://github.com/buymeasoda/soda-theme/wiki/Theme-challenges-and-ideas) encountered along the way. + +## License + +Soda Theme is licensed under the [Creative Commons Attribution-ShareAlike 3.0 License](http://creativecommons.org/licenses/by-sa/3.0/). You are free to share and remix the theme, however please abide by the license terms when doing so. + +The following details apply to the Creative Commons license "author specified" components: + +* Attribution example: Based on Soda Theme by Ian Hill (http://buymeasoda.com/) + +* Naming guidelines: If you create and distribute a derivative theme, please give your theme a unique and original name that does not directly include "Soda Theme" (or a close variant) in the main project title, repo name or Package Control name. \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme new file mode 100644 index 0000000..6c4a634 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark.sublime-theme @@ -0,0 +1,969 @@ +[ + +// +// TABS (REGULAR) +// + + // Tab set + { + "class": "tabset_control", + "layer0.texture": "Theme - Soda/Soda Dark/tabset-background.png", + "layer0.inner_margin": [1, 7], + "layer0.opacity": 1.0, + "content_margin": [-4, 0, -4, 3], + "tab_overlap": 5, + "tab_width": 180, + "tab_min_width": 45, + "tab_height": 25, + "mouse_wheel_switch": false + }, + { + "class": "tabset_control", + "settings": ["mouse_wheel_switches_tabs"], + "mouse_wheel_switch": true + }, + // Tab element + { + "class": "tab_control", + "content_margin": [12, 3, 12, 3], + "max_margin_trim": 0, + "hit_test_level": 0.0, + "layer0.texture": "Theme - Soda/Soda Dark/tab-inactive.png", + "layer0.inner_margin": [5, 5], + "layer0.opacity": 1.0 + }, + // Tab close state + { + "class": "tab_control", + "settings": ["show_tab_close_buttons"], + "content_margin": [12, 3, 7, 3] + }, + // Tab hover state + { + "class": "tab_control", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-hover.png" + }, + // Tab active state + { + "class": "tab_control", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-active.png" + }, + // Tab dirty state (close button hidden) + { + "class": "tab_control", + "settings": ["!show_tab_close_buttons"], + "attributes": ["dirty"], + "content_margin": [12, 3, 7, 3] + }, + +// +// TABS (CLASSIC) +// + + // Tab set + { + "class": "tabset_control", + "settings": ["soda_classic_tabs"], + "content_margin": [3, 4, 3, 3], + "tab_overlap": 24, + "tab_height": 28 + }, + // Tab element + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "content_margin": [22, 6, 22, 4], + "hit_test_level": 0.5, + "layer0.texture": "Theme - Soda/Soda Dark/classic/tab-inactive.png", + "layer0.inner_margin": [18, 4] + }, + // Tab close state + { + "class": "tab_control", + "settings": ["soda_classic_tabs", "show_tab_close_buttons"], + "content_margin": [22, 6, 15, 4] + }, + // Tab hover state + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/classic/tab-hover.png" + }, + // Tab active state + { + "class": "tab_control", + "settings": ["soda_classic_tabs"], + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/classic/tab-active.png" + }, + // Tab dirty state (close button hidden) + { + "class": "tab_control", + "settings": ["soda_classic_tabs", "!show_tab_close_buttons"], + "attributes": ["dirty"], + "content_margin": [22, 6, 15, 4] + }, + +// +// TAB BUTTONS +// + + // Tab close button + { + "class": "tab_close_button", + "content_margin": [0, 0], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close-inactive.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0 + }, + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "content_margin": [8, 8] + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close.png", + "layer0.opacity": 1.0 + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close.png", + "layer0.opacity": 1.0 + }, + // Tab dirty button + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-dirty-inactive.png" + }, + { + "class": "tab_close_button", + "settings": ["!show_tab_close_buttons"], + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "content_margin": [8, 8] + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty", "hover"]}], + "layer0.opacity": 1.0 + }, + { + "class": "tab_close_button", + "parents": [{"class": "tab_control", "attributes": ["dirty", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-dirty.png" + }, + // Tab highlight button + { + "class": "tab_close_button", + "settings": ["highlight_modified_tabs"], + "parents": [{"class": "tab_control", "attributes": ["dirty"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-highlight-inactive.png" + }, + { + "class": "tab_close_button", + "settings": ["highlight_modified_tabs"], + "parents": [{"class": "tab_control", "attributes": ["dirty", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/tab-highlight.png" + }, + // Tab close button hover + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close-hover.png" + }, + // Tab close button pressed + { + "class": "tab_close_button", + "settings": ["show_tab_close_buttons"], + "attributes": ["pressed"], + "layer0.texture": "Theme - Soda/Soda Dark/tab-close-pressed.png" + }, + +// +// TAB LABELS +// + + { + "class": "tab_label", + "fade": true, + "fg": [170, 170, 170], + "shadow_color": [25, 25, 25], + "shadow_offset": [0, -1] + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["hover"]}], + "fg": [200, 200, 200], + "shadow_color": [30, 30, 30] + }, + { + "class": "tab_label", + "parents": [{"class": "tab_control", "attributes": ["selected"]}], + "fg": [230, 230, 230], + "shadow_color": [35, 35, 35] + }, + +// +// FOLD BUTTONS +// + + { + "class": "fold_button_control", + "layer0.texture": "Theme - Soda/Soda Dark/fold-closed.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0, + "content_margin": [8, 8] + }, + { + "class": "fold_button_control", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/fold-closed-hover.png" + }, + { + "class": "fold_button_control", + "attributes": ["expanded"], + "layer0.texture": "Theme - Soda/Soda Dark/fold-open.png" + }, + { + "class": "fold_button_control", + "attributes": ["expanded", "hover"], + "layer0.texture": "Theme - Soda/Soda Dark/fold-open-hover.png" + }, + +// +// STANDARD SCROLLBARS +// + + // Standard vertical scroll bar + { + "class": "scroll_bar_control", + "layer0.texture": "Theme - Soda/Soda Dark/standard-scrollbar-vertical.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [2, 6], + "blur": false + }, + // Standard horizontal scroll bar + { + "class": "scroll_bar_control", + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png", + "layer0.inner_margin": [6, 2], + "blur": false + }, + // Standard scroll bar corner + { + "class": "scroll_corner_control", + "layer0.texture": "Theme - Soda/Soda Dark/standard-scrollbar-corner.png", + "layer0.inner_margin": [2, 2], + "layer0.opacity": 1.0 + }, + // Standard vertical scroll puck + { + "class": "puck_control", + "layer0.texture": "Theme - Soda/Soda Dark/standard-puck-vertical.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [0, 10], + "content_margin": [8, 12], + "blur": false + }, + // Standard horizontal scroll puck + { + "class": "puck_control", + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/standard-puck-horizontal.png", + "layer0.inner_margin": [10, 0], + "content_margin": [12, 8], + "blur": false + }, + +// +// OVERLAY SCROLLBARS +// + + // Overlay toggle scroll bar + { + "class": "scroll_area_control", + "settings": ["overlay_scroll_bars"], + "overlay": true + }, + { + "class": "scroll_area_control", + "settings": ["!overlay_scroll_bars"], + "overlay": false + }, + // Overlay vertical scroll bar + { + "class": "scroll_bar_control", + "settings": ["overlay_scroll_bars"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-scrollbar-vertical.png", + "layer0.inner_margin": [0, 5], + "blur": true + }, + // Overlay horizontal scroll bar + { + "class": "scroll_bar_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png", + "layer0.inner_margin": [5, 0], + "blur": true + }, + // Overlay vertical puck + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-puck-vertical.png", + "layer0.inner_margin": [0, 5], + "content_margin": [5, 20], + "blur": true + }, + // Overlay horizontal puck + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-puck-horizontal.png", + "layer0.inner_margin": [5, 0], + "content_margin": [20, 5], + "blur": true + }, + // Overlay light puck (for dark content) + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["dark"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-dark-puck-vertical.png" + }, + // Overlay light horizontal puck (for dark content) + { + "class": "puck_control", + "settings": ["overlay_scroll_bars"], + "attributes": ["horizontal", "dark"], + "layer0.texture": "Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png" + }, + +// +// EMPTY WINDOW BACKGROUND +// + + { + "class": "sheet_container_control", + "layer0.tint": [25, 25, 25], + "layer0.opacity": 1.0 + }, + +// +// GRID LAYOUT +// + + { + "class": "grid_layout_control", + "border_size": 1, + "border_color": [70, 70, 70] + }, + +// +// MINI MAP +// + + { + "class": "minimap_control", + "viewport_color": [255, 255, 255, 35] + }, + +// +// LABELS +// + + // General labels + { + "class": "label_control", + "color": [204, 204, 204] + }, + // Text field labels + { + "class": "label_control", + "parents": [{"class": "panel_control"}], + "shadow_color": [50, 50, 50], + "shadow_offset": [0, -1] + }, + // Button labels + { + "class": "label_control", + "parents": [{"class": "button_control"}], + "shadow_color": [55, 55, 55], + "shadow_offset": [0, -1] + }, + +// +// TOOLTIP +// + + // Tooltip container + { + "class": "tool_tip_control", + "layer0.texture": "Theme - Soda/Soda Dark/tooltip.png", + "layer0.inner_margin": [1, 1], + "layer0.opacity": 0.95, + "content_margin": [3, 3] + }, + // Tooltip content + { + "class": "tool_tip_label_control", + "color": [0, 0, 0] + }, + +// +// STATUS BAR +// + + // Status bar container + { + "class": "status_bar", + "layer0.texture": "Theme - Soda/Soda Dark/status-bar-background.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [2, 2], + "content_margin": [8, 4, 8, 4] + }, + // Status bar button + { + "class": "status_button", + "min_size": [100, 0] + }, + // Status bar label + { + "class": "label_control", + "parents": [{"class": "status_bar"}], + "color": [150, 150, 150], + "shadow_color": [25, 25, 25], + "shadow_offset": [0, -1] + }, + +// +// SIDEBAR +// + + // Sidebar container + { + "class": "sidebar_container", + "layer0.texture": "Theme - Soda/Soda Dark/sidebar-bg.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [1, 1, 2, 1], + "content_margin": [0, 0, 1, 0] + }, + // Sidebar tree + { + "class": "sidebar_tree", + "row_padding": [8, 3], + "indent": 15, + "indent_offset": 15, + "indent_top_level": false, + "dark_content": true + }, + // Sidebar rows + { + "class": "tree_row", + "layer0.texture": "Theme - Soda/Soda Dark/sidebar-row-selected.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": [1, 1] + }, + // Sidebar row selected + { + "class": "tree_row", + "attributes": ["selected"], + "layer0.opacity": 1.0 + }, + // Sidebar heading + { + "class": "sidebar_heading", + "color": [210, 210, 210], + "font.bold": true, + "shadow_color": [0, 0, 0], + "shadow_offset": [0, -1] + }, + // Sidebar entry + { + "class": "sidebar_label", + "color": [125, 125, 125], + "shadow_color": [0, 0, 0], + "shadow_offset": [0, -1] + }, + // Sidebar folder entry + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable"]}], + "color": [190, 190, 190] + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable", "hover"]}], + "color": [235, 235, 235] + }, + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["expandable"]}], + "settings": ["bold_folder_labels"], + "font.bold": true + }, + // Sidebar entry selected + { + "class": "sidebar_label", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "color": [210, 210, 210], + "shadow_color": [0, 0, 0], + "shadow_offset": [0, 1] + }, + +// +// SIDEBAR - OPEN FILE ICONS +// + + // Sidebar file close + { + "class": "close_button", + "layer0.texture": "Theme - Soda/Soda Dark/file-close.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": 0, + "content_margin": [8, 8] + }, + { + "class": "close_button", + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.opacity": 1.0 + }, + // Sidebar file dirty + { + "class": "close_button", + "attributes": ["dirty"], + "layer0.texture": "Theme - Soda/Soda Dark/file-dirty.png", + "layer0.opacity": 1.0 + }, + { + "class": "close_button", + "attributes": ["dirty"], + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/file-dirty-selected.png" + }, + { + "class": "close_button", + "attributes": ["dirty"], + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/file-close.png" + }, + // Sidebar file close hover + { + "class": "close_button", + "attributes": ["hover"], + "layer0.texture": "Theme - Soda/Soda Dark/file-close-hover.png" + }, + { + "class": "close_button", + "parents": [{"class": "tree_row", "attributes": ["hover", "selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/file-close-selected.png" + }, + +// +// SIDEBAR - GENERAL FILE ICONS +// + + // Sidebar group closed + { + "class": "disclosure_button_control", + "content_margin": [8, 8], + "layer0.texture": "Theme - Soda/Soda Dark/group-closed.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": 0 + }, + { + "class": "disclosure_button_control", + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-closed-hover.png" + }, + { + "class": "disclosure_button_control", + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-closed-selected.png" + }, + // Sidebar group open + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "layer0.texture": "Theme - Soda/Soda Dark/group-open.png" + }, + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "parents": [{"class": "tree_row", "attributes": ["hover"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-open-hover.png" + }, + { + "class": "disclosure_button_control", + "attributes": ["expanded"], + "parents": [{"class": "tree_row", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/group-open-selected.png" + }, + +// +// STANDARD TEXT BUTTONS +// + + // Default button state + { + "class": "button_control", + "content_margin": [6, 5, 6, 6], + "min_size": [75, 0], + "layer0.texture": "Theme - Soda/Soda Dark/btn-large.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [6, 6] + }, + // Pressed button state + { + "class": "button_control", + "attributes": ["pressed"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-large-on.png" + }, + +// +// TEXT INPUT FIELD +// + + // Text input field item + { + "class": "text_line_control", + "layer0.texture": "Theme - Soda/Soda Dark/text-field.png", + "layer0.opacity": 1.0, + "layer0.inner_margin": [4, 5, 4, 3], + "content_margin": [3, 3] + }, + +// +// PANEL BACKGROUNDS +// + + // Bottom panel background + { + "class": "panel_control", + "layer0.texture": "Theme - Soda/Soda Dark/panel-background.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0, + "content_margin": [2, 3, 2, 1] + }, + // Quick panel background + { + "class": "overlay_control", + "settings": ["!soda_retina_fix"], + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-background.png", + "layer0.inner_margin": [12, 6, 12, 15], + "layer0.opacity": 1.0, + "layer1.texture": "Theme - Soda/Soda Dark/quick-panel-sections.png", + "layer1.inner_margin": [12, 40, 12, 19], + "layer1.opacity": 1.0, + "content_margin": [11, 8, 11, 17] + }, + // Quick panel background (Retina fix) + { + "class": "overlay_control", + "settings": ["soda_retina_fix"], + "layer0.tint": [67, 67, 67], + "layer0.opacity": 1.0, + "content_margin": [6, 8, 6, 6] + }, + +// +// QUICK PANEL +// + + { + "class": "quick_panel", + "row_padding": [5, 2], + "layer0.tint": [33, 33, 33], + "layer0.opacity": 1.0, + "dark_content": true + }, + { + "class": "quick_panel_row", + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0 + }, + { + "class": "quick_panel_row", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row-selected.png" + }, + { + "class": "quick_panel_label", + "fg": [210, 210, 210, 255], + "match_fg": [126, 199, 239, 255], + "selected_fg": [255, 255, 255, 255], + "selected_match_fg": [166, 229, 255, 255] + }, + { + "class": "quick_panel_path_label", + "fg": [130, 130, 130, 255], + "match_fg": [220, 220, 220, 255], + "selected_fg": [175, 175, 175, 255], + "selected_match_fg": [220, 220, 220, 255] + }, + { + "class": "quick_panel_score_label", + "fg": [126, 199, 239, 255], + "selected_fg": [166, 229, 255, 255] + }, + +// +// MINI QUICK PANEL +// + + { + "class": "mini_quick_panel_row", + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row.png", + "layer0.inner_margin": [2, 2, 2, 2], + "layer0.opacity": 1.0 + }, + { + "class": "mini_quick_panel_row", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/quick-panel-row-selected.png" + }, + +// +// CODE COMPLETION DROPDOWN +// + + { + "class": "popup_control", + "content_margin": [2, 2], + "layer0.tint": [30, 30, 30], + "layer0.opacity": 1.0 + }, + { + "class": "auto_complete", + "row_padding": [4, 2] + }, + { + "class": "auto_complete_label", + "fg": [140, 140, 140], + "match_fg": [220, 220, 220], + "selected_fg": [180, 180, 180], + "selected_match_fg": [245, 245, 245] + }, + { + "class": "table_row", + "layer0.texture": "Theme - Soda/Soda Dark/autocomplete-row-selected.png", + "layer0.opacity": 0.0, + "layer0.inner_margin": [3, 1] + }, + { + "class": "table_row", + "attributes": ["selected"], + "layer0.opacity": 1.0 + }, + +// +// BOTTOM PANEL BUTTONS +// + + // Button group middle + { + "class": "icon_button_control", + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-middle.png", + "layer0.inner_margin": [6, 6], + "layer0.opacity": 1.0, + "content_margin": [3, 3] + }, + { + "class": "icon_button_control", + "attributes": ["selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-middle-on.png" + }, + // Button group left + { + "class": "icon_button_control", + "attributes": ["left"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-left.png", + "content_margin": [4, 3, 3, 3] + }, + { + "class": "icon_button_control", + "attributes": ["left", "selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-left-on.png" + }, + // Button group right + { + "class": "icon_button_control", + "attributes": ["right"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-right.png", + "content_margin": [3, 3, 4, 3] + }, + { + "class": "icon_button_control", + "attributes": ["right", "selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-group-right-on.png" + }, + // Button single + { + "class": "icon_button_control", + "attributes": ["left", "right"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-small.png", + "content_margin": [4, 3] + }, + { + "class": "icon_button_control", + "attributes": ["left", "right", "selected"], + "layer0.texture": "Theme - Soda/Soda Dark/btn-small-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 1 +// + + // Regex search button + { + "class": "icon_regex", + "layer0.texture": "Theme - Soda/Soda Dark/icon-regex-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_regex", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-regex-on.png" + }, + // Case sensitive search button + { + "class": "icon_case", + "layer0.texture": "Theme - Soda/Soda Dark/icon-case-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_case", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-case-on.png" + }, + // Match whole word search button + { + "class": "icon_whole_word", + "layer0.texture": "Theme - Soda/Soda Dark/icon-word-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_whole_word", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-word-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 1 (EXTENDED: FIND IN FILES) +// + + // Show search context button + { + "class": "icon_context", + "layer0.texture": "Theme - Soda/Soda Dark/icon-context-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_context", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-context-on.png" + }, + // Use search buffer + { + "class": "icon_use_buffer", + "layer0.texture": "Theme - Soda/Soda Dark/icon-buffer-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_use_buffer", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-buffer-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 2 +// + + // Reverse search direction button + { + "class": "icon_reverse", + "layer0.texture": "Theme - Soda/Soda Dark/icon-reverse-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_reverse", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-reverse-on.png" + }, + // Search wrap button + { + "class": "icon_wrap", + "layer0.texture": "Theme - Soda/Soda Dark/icon-wrap-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_wrap", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-wrap-on.png" + }, + // Search in selection button + { + "class": "icon_in_selection", + "layer0.texture": "Theme - Soda/Soda Dark/icon-selection-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_in_selection", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-selection-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 3 +// + + // Preserve case button + { + "class": "icon_preserve_case", + "layer0.texture": "Theme - Soda/Soda Dark/icon-preserve-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_preserve_case", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-preserve-on.png" + }, + +// +// BOTTOM PANEL ICONS - GROUP 4 +// + + // Highlight results button + { + "class": "icon_highlight", + "layer0.texture": "Theme - Soda/Soda Dark/icon-highlight-off.png", + "layer0.opacity": 1.0, + "content_margin": [9, 9] + }, + { + "class": "icon_highlight", + "parents": [{"class": "icon_button_control", "attributes": ["selected"]}], + "layer0.texture": "Theme - Soda/Soda Dark/icon-highlight-on.png" + } + +] diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore new file mode 100644 index 0000000..f05fcdc --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/.gitignore @@ -0,0 +1 @@ +*.cache \ No newline at end of file diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme new file mode 100644 index 0000000..42cbb94 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme @@ -0,0 +1,30 @@ + + + + + author + Ian Hill + comment + A widget theme for the UI components of the Soda Dark theme. + name + Soda Dark - Widget Theme + settings + + + settings + + background + #383838 + caret + #F8F8F8 + foreground + #F8F8F8 + invisibles + #3B3B3B + selection + #222222 + + + + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings new file mode 100644 index 0000000..d5787af --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/Widget - Soda Dark.sublime-settings @@ -0,0 +1,4 @@ +{ + "color_scheme": "Packages/Theme - Soda/Soda Dark/Widget - Soda Dark.stTheme", + "draw_shadows": false +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/autocomplete-row-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..336555c5b649e71f4bdd8985c35b4e7bdc864c45 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^96&6ho7wf|4-4|$iUFhv#7ZEeCp3XKQ}-5|NnoWisPL9_5Y0; zojx8Mp(?aEkUG^a}JKo#6tV8GC@90ftnqRQ1JgBoISs3v4KnqFAv% zJGQJ?48uTS7_Nj62O`>GYwW3IpiIFT6*Wym z{GzD^dvaZuJkRqT$B9+jwp(Ki^?g6ZJ#`$QuIqa+t@T!xWvQ3KPcIOdVOA}9_AB@* zGpoLd{&2$SsJWs&jNhHs0ofv=IezLyZZ6wMwg&&w2gt+VW1X9aobK2vB);`@Ota(; zfm4b37D3=ad7q0PoL8`WnPpjy`M5#E6JSnf&QSrIBbYU_HyKX$sx61pcK`qY07*qo IM6N<$g7NZ&TL1t6 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/bookmark.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..8d15c638167a541d6fae466dadefb25f54ad86dd GIT binary patch literal 2855 zcmV+?3)u9DP)KLZ*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=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0000&NklP000;W1^@s654Bdt0002-NklVr9(pyp{+K>be$6DR#)R zED1skc`(K#2&)YWhQv{>lsyIzcSHF%5PaZn8wduwLUNgQg=81SLVkZ2I@wM66JNBG zKb(_1AH}W{B%Ze2yiT~+2;u>PT{u$bL+@s zJ&qbd5QUi;2Jl}5LL~SW&McWz_yqO^aN@*A*u+Qh4KR^&=Z?6510oV+WQ6#0z1jJC zM>9CEgQZ$xq^7#7d$sSY*F9*}o1D+*7EfYN*-tIfSE|}Cm-q^8({8uFne@bB ztJCSU%#A=&?T4g;&f#zZLIf08AS!!i37v_SAhJxywKqvwW z7<-Qa1fe%asKk|GaD=TCy(9HP0#?s^8>2INM<{Fqgb7F)dyVL9fM|kAui`K13Ly2# zSYXf@Ku9Rkufus9qqPBoSQaq$9s>wMZ;nujM~>{A;0TG>9HDLv5GDX)>@}jZ@rTvT zkt7tyPRbY^|eRhW^;^_b;s# z*Ke`Fpi_>VtQ`k~!50~#>)zdN*E*d}g*%pu;^D1zoJ=O)=kxj9X0!QVt|W3MrYE&C zp*PlPxm^C5PN$#8&Kp66yvnrydQ_b`6|v)yT-u89|w00000NkvXXu0mjf D$W%%o literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left.png new file mode 100644 index 0000000000000000000000000000000000000000..17bd507f948228cc47530457cee467ce6e7acf98 GIT binary patch literal 325 zcmV-L0lNN)P)P000;W1^@s654Bdt0003DNklAiao(Z%Eebt#GQclA5MPK6T~InlNErgM8)?+s`1!(fJnv#Z9tIGgAS`q z^4sO4=c(m3kngh;OYh2H&s?L4iU#4j~(9MjE@Db7=bzQe<+t$%f#Fk>?wL+j5 XYbCZ=yR_HS00000NkvXXu0mjfgtw4h literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-left@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..34efcdfd90539b2dc0513b924a2af26767e684a1 GIT binary patch literal 721 zcmV;?0xtcDP) zv2Gec5QcB>IE$D>2!SjiA-@6*u80(#!cUOA0B+Lc5z_cg2vz#@spwG(DjF2vgy10a zpYGqRedpRUl22OCdTtT_xBtu*Uc1ZX67g~Jl=E03=SYR~a*3|cpqvr{07)EcBtYioTF?`XciJqTlaF;!3d~JPeA2vLDn35Ga<7 zPwt=*Zr~*sAgB4EPM%s$5;t%mj^pTjK5N$gMB8%^l+ra<0EDH*oYokE6b;V=qgLTB z>0)X5_W*$#)_`zgRUS(a(2C(5p?Jm$o$^G*5vw5Hk#NH;!c;&2VX4`<>Atj(2uJ9U zg?Yshh$f{40BWp&ScCwK2O$8W=^mj)h=dAr+UK>7Xct|l&x7!#wbG()fBZ555KE;+ zz21>fd^jhd_UJ(<)FK45*Me9&erbRQp%aLlbCKpqt(9hnXui}8@LZdBgfA>YK)VMa z0HVbnF<)BPcnt5zTWN6zUOAdCE$*NB(&8cIL6|^%JGJQZD@5-IznjkRcPkOij{9lR z|NqZH5N{30J0g9t7xC8wveGBqaDu>g2(zjrb;>#t~w zrCCr~=hbTUcRHOu4hDmJ>5(6DyZcAn$SR*un!vSmAx%WP*=+W{+wFc>uh)r;SbD~x z)Rby}BFlpy3z)@Xk;;ETyxVLxSK^Eq6T2+S)WiG(3P4uybm>kC00000NkvXXu0mjf DNV`^D literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1126fc04fe7ef67ec46a004f7671e547a4f9ac GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj4W2HJAs)PMLkzhNCbP0l+XkK^&CY? literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-middle-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..268e9f5f58af7e9377e323f1d4466d9933bfa440 GIT binary patch literal 345 zcmV-f0jBXc2&!wov1y`b6tKT=J zO_|x*XUK9^ zOAdlC6h*<*f!lBkjF_<$R!&$3BM>m>4G4}%s>hVXTwBqe`#!CS)>T#A*N65>EBQl9 zzk=6Y*DYoPH#7Xko|>lFJxtT2@-mL&&YPCyT|ubD1-xmV=bafX1~Nq;GQblw)B2Z} zfmhoDL|{9}_6tXhEgBiH0K-YZ!vGW9U{U``Oyp5Z!VE0FHD90M;4+ z9L3PDE4)!czYhF~PrD0YC^A4wc)_A!zyb^>0S^OAaDzol4}3dQ+7hDV%h%~rLKhP000;W1^@s654Bdt0003GNkl(oJ{Xp(p6R*XX`@jb5ryi)ZK!L?}Yh{Pa!G;xaq#Fz}Mq+&r z2BE{Bjv*L?QWZR1t3iGzUH?d&3&U!+>-$dT&)?Zi2g7+J(L{6Dx5#9K*hUqstWZC} z6>i~~2?C+wh_1+zBzXX$MAI~j(%@o@RCQ>%_o65+RaHq*mgU}M;}RS6cb%r`yRPdN aQRxpIPgYnJM>F^U0000Ai7|Mips8Qwn$x-Eq7o!hv)%%1vc%vJpm_R*#$GBxkW)Eq*25Sf8wO? z^W=+OEe_y^CF?nkBYnSo&yK)OlO*X#jlER0Ktx|FDOz+U7k%9kX`7-;(TD2NG<9eb zC>@W-926PP9_uY z$mIgK_=<>ZM2YwWI*Xz}UvWGhzwY;Y?@ZQewfsQF=BbDpgn`C(yPcd)C%|OAUhht1 zK1nSy+(2;-b0_WsAk=QR>s=ABFQOPuq$V8U>!mZi7LbpC@F21h`2Ltvi^2(lSnK{! zgCvb31mZ(6MrZ^CU%J+e527!+lYOy9Xbtsd>|l&lyw*jnjJWr{_Ucha+8P3qO*z6z z4hUAhcT#uOeoI0SQ>lfw9|AOv;06b-e3n0^uXb`iGXb97eK)i-A?T7|3JxAaQi)lv)foRqd zh}WrgGmbPrtUzd?zy(&V*Q_HN0&R1S5Fm7=0nrnOgJX;O?;vQ?np+`RY~r;ZEnK%T z#_aMN8gMg{-JBy#wK}!l-pSeBlMx)Vh5sh8kDwBQcr~$5t6F1yoF!(;3%^p{)l|T8=q}H_uBI`TI-r+XO zvU@pp@@uhJJg(R4Tr?uJl61LTevVA=RXGAsbvm7DI2@Kz-QjR}na}61l5T$0N;jL$ zr>jp!)Y=SV$w2{^=Q+-ryiTXnf)J4U4@+zLhAZF(8UO$Q07*qoM6N<$f|UYB A%K!iX literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right.png new file mode 100644 index 0000000000000000000000000000000000000000..60a7aa0e8bb0cdcffff81634a6d355b66ac3477e GIT binary patch literal 334 zcmV-U0kQsxP)P000;W1^@s654Bdt0003MNklQ<%AF()^&XW;2pxR z7C(qnI+~`TWm%q~TUnGvoEm|CJVMu4EL0%3gWvJtk4hLM9juvkk4o}J5>#rcLD;Sg zQtL?uuseU(6O9r6Wmmb8ZhW>(ttX{BYSYD4{8Ylkk}73c*#^~0@_|($|H`i8=2fwa zZSvj|UdA)}l8$Rd`eo$Fa?VjzRbPMvJI`|-0u0&af_C0p3~yn;Z%XTmS$707*qoM6N<$f-5bJSpWb4 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-group-right@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad4f407bd1a599398a8351b0e69b89f27872441 GIT binary patch literal 748 zcmVM#=tM4B?nIztiY`PSdLBhl zjxm9v>2%7Q0%f?#62V6qeJ_gQ>-l{CwApN)xBbUo1Xqr6FO_pV5x7(Theh;nJ)C?QwzgAx59p%8?KS`!xC7z@UKPO5MuLbR+(CSxUK;zQ_BS)lsZQsoT=r$ zek%}?g&qk(AnH|_T7>XA;>$bIh7?^#TwSVCix2xT0;mGvqDvX#m^u;vNG*!x4ZIFD zLZ?rwN=FF7h=;BYgqZ>eH?`FL8xH{234*C}#07DI)PcYO!l+Lzrjr}hIYKw+3}MuQ z07z|Wxy4N<7}YwWKDFq8>eQkOz7$iPT671o`i1CDhB|hgaK{#e6O5rkP#1J^cTHZu zXPLKqhm|9mK(H}-Z$IxKrOFyf)6{a*>-8rYU=y^g_7FpN1nC4PPN$Q(Z>8sh!QhKP zz@9SMZnqM3HK~of+wFdoLjy0X)ykfHsA?p16cK-t{v%0}r_pHic|M=Ntk-KC>#+Ol z(Q>(b6*>g;2|y_|QTF@&LV7MK_G>nqrBV|1trf}Plws%~tyZg)8Yvr%MlQ!TaF8Y) ekH=R+K>u%G93X-CtPrjM0000NklBJ99JpjAvMxLO2h<_5jlWiJVMemJ&WV`3F{3uVhIW~J^*;> zy6zUb@2tX0lH@sxqRTK0S)B;S7<1D1{T1{cA$V=u<+|<$6)CN?7>FaG9$*&$X@Xe7 zvG4l|Kv59&5T|4iWW`DU-rys#Kbl;M@dZTVWB@0Sz#aeq002ovPDHLkV1oQtvo`<$ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f4bddc93d682c098eadc2790b2e4d0575f16ca3f GIT binary patch literal 1072 zcmV-01kd}4P)?{a2#NNV2i3KeI z3S#jZ^5F6H_O0g(d&Y70EeVb9zDX{3_RcK)&YYR0*iG|1Pt;PhqF+N+pQW&0Oc_cN zEVB#ntLA`GT^C{~q#lHXD7%}6_(Sl0Ffg(r`V!^@6=Eo)xwyFapkA*(t<`GxaD5js zg|O5*fd7s7etCKM{_ybdC*ZCS8AWmB8FZ$#w6ydRLS7X$B-;%}^scV1UhM7dy#whb z^kfo5XCAg%t*;nJk(05pv4ls8VW|N+>G%7|#l=MeF+}U3zq-G_@0@C&;Lc66*?fk+ z6Eih+z00hLAw3&KH5!ei+wCUUcIY;qp!^Hbqaa#P2RzSAGC4V!VB2|jEQz8JHfF~7 z_&5b6IP>>WrZFi6v4K0~1HdT{1r>u#LvOJlUUR_b@KB6IYRpR3wi8dtIZzNM zhLd!ol`J;pkjo1iG#E~_+K;)fPgO)4Pl|@kU531s4uzAfDc~6*pCaTdIb>Ogz+=Yn zy3!%tY(0l!$XarU#ds2H)*2bbsZ7R7hr&tL#E?h-i(<}_L-7QQVs2upbm*p=ERE5C z(1emhgbgQHf)80@AsQ<=Br(dGXf20lC}bVzkTv+*@RS_l&7tDk{IdT!myBWPZ+k&1 zC|ee#?IzYR`z<#}Z8*_VKU{2ai_Z&EVbrtVaA9aSxZ|k9JB&|8xHT# zC<-C7LZV9!abOh0RWVjNRCR+^V%S+{DCVR??)A6;;|Z!;&LOkkawv8QE#;O4#B5+c zBRcC6l;hPzn@agYHdGwnZ0TC8;BAA;?KEw<3@=`H2z!2hZi%^)g^SKN;cR%}{R4>~ zV&oL$zQ~xFnfb^91)ZFnIHz#!AB+427J^J!mN`bUf+?Gwo&CfzBG*$cTU}lKw!OXm z=JfRRIVPr~;1tD7Pfx#ISy|cH+}w0ulGN}J;NI&W9UXNxHa6bQ&(A-GgmxGksN=P@wQga|UqMbCJlx&gZQ_H5iR0tr7H-61)Y7xFGZUgFCMI$` q*>bp(bvhk>7t>u{UhYW@HT(fP%SJU^wjqQ70000GDL!o`8h7vOL3H$)TI8d8*@K4VX zk#Oi}dFh3VElWP1&Xuqw`@R=aN=FFcAzh?I+K3(^EwTZl^9WfkmzQxIzdDYyLPubQ z()V9o*S(iz`3Oc%7akyQNs`>o=X2q@G&Mfjw!J8d;tr4(sNJh_p|OghNU3AMc*;>B z3`4Qs@2}Bx3F4ZZbFEr8r6X!-#J57NIW7>?NrgB8_;X_-n;lxi$ zhfQINp>$X}4LfmUdoySVsm9S%rPDA2vh9X0{*+F;(R2>75n7j8W{swDq$g}jH>B&% zvDcxd0ZrvdFNZ1JkUrLleqTe_HjbtOX_x{1htjDpH68Kh8$Z06&2Jq`)-(;zBL^}F zYH?QBR#kNq1cAUk9*qw!MP1iC8f>A~64Wdfi!9IcXLMX)CbRJv{8FW?0r^PN^l7u% zG#-Sz^?Lo8W!VEd&QL-tmY~)7zW=k^?G9x80=k$T6ZnJ{Gynhq07*qoM6N<$f;215 A4*&oF literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-large@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..046438a23f5c1f9da882fcde6634073f731b6159 GIT binary patch literal 1116 zcmV-i1f%Jz?~O<<`NPD{{+MWjdXM-HvR!dJ1R_!jg7sHl{OZ}&VnG7y(AV0v7j}< zf>0a*a=C+ew|Blb?3;{tdw|u>8Yh|kX21Cs-kbM*bHz;9>-7S)5G@|(U^S-89mgT5 z7=fiV9r)!lfI_{;WJo0MbP-}`U`v_5u!5pDwWD-OoWq@lflf)OaO8Ll=6yI6h#3@1jon6!O6)9v2_}a#@$^s zjN1h~Ox+;Oo?vXq%+AgRPzkT7ygzHs_|kmja=Bn+WF#O)Vmm!OEtJdUN5J$Qy+cAo z4k7YOumRO!pl?Kot-no7Ops6jlD9EOVL}pO zVobtm71E?^>WHraAe^*ry$>j)z-#`V7t_KjOHfuJ7oi*A`h6M`V-n5*LJZ2nrjSI2 z3vN?RjAeaNV;GhstOE-1<6-QF{oyqHE=G4eK**g;1L#fvCvhfWwS+WDn}r%8agn-m z+g9LBS1PSIk?F^qs8CuU|K|VpXOzCRgyhId%DD;&JFVTej>qk; z!GNS-_ro;DF1CJRwuVqQElidb;Cmerrw- zaU*t@VPtP(W5e7e$w4}%T=($su(7_r{(5e1?ja=n1Z954#pV?sU}^%}k5Z}h zabaQM!P?r|yMu!RUY9XP_x7+Df#K%n=B?@J>1w@R&!gv1Qz149lY+jmLaq0(;62=Q z>7qx-sI%48RqoIf#@tV^SV?Msf4_)ZC1Yo2XC-`y#mI%KD;t>7U~FuxhZ^cZoe0-q icwwo9D?J^NA*|oDIGp7UlMLPf0000WFuk)cq@(TmFZ;BU|sgs5*-xTJ z+cUhlD>^M*2(m@je#x@zt}M$z0eH&u{H-X8YxMXdOf62@EU+dFJ6}~*t;z8X_`GUe T-9k(m00000NkvXXu0mjf`fb9j literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..978b14099abe7a3993d7feed60b4d30d8c31a70d GIT binary patch literal 1046 zcmV+x1nK*UP) zzfTlF9L4v3!lBYY4jK%91ja^@j@rgQz-UK>iLtS&J_(S4H(7+xheI&3LD1jkJt=VkeD3{Ckkh_NKCgLST zGY!JK(DZFI8oft~yBSyuADfFprZQg6#(VLqI(|JUo03rQdNK z3W(0!s#dFSaifG7)a&&CGm#Rx<23mf2N0Wn8X$tfU=R$4L*|BOXJ^fnRV?IR%O=LkUSdtGceVa}omo)%2O3-e|FMiiqV@}|T}!8;^ksl_W6~_BrpTy&i+rHWlJg6S z6g}y)$LX9phcZCp$S2KK5%;81Q5sSpB@|g`xoHpi8dD$v_{9DLR<5N}QMxifx*7C3zfGL@epEiQmNW^L+_d&3>){Xz>l zYIM6a5hy+$S3)p~%3F)$UJCA#JGBmxH>ru{KJLYbumXy3*3#w!+HiRfTgnkcF5%RX z+T)d`B^Tn*_!CZ+ukv)6$CB3FA`H)0sS|oX0El12i0DxKjf};`#aB$Qh^NauI@b&! zZ>CWbwIwIu)D8edf|8 Qpa1{>07*qoM6N<$g4+4-;s5{u literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small.png new file mode 100644 index 0000000000000000000000000000000000000000..d4042c91bcf17051294093f9c2d9ea6cf8fcfce0 GIT binary patch literal 458 zcmV;*0X6=KP)GDL!o`8h7vOL3H$)TI8d8*@K4VX zk#Oi}dFh3VElWP1&Xuqw`@R=aN=FFcAzh?I+K3(^EwTZl^9WfkmzQxIzdDYyLPubQ z()V9o*S(iz`3Oc%7akyQNs`>o=X2q@G&Mfjw!J8d;tr4(sNJh_p|OghNU3AMc*;>B z3`4Qs@2}Bx3F4ZZbFEr8r6X!-#J57NIW7>?NrgB8_;X_-n;lxi$ zhfQINp>$X}4LfmUdoySVsm9S%rPDA2vh9X0{*+F;(R2>75n7j8W{swDq$g}jH>B&% zvDcxd0ZrvdFNZ1JkUrLleqTe_HjbtOX_x{1htjDpH68Kh8$Z06&2Jq`)-(;zBL^}F zYH?QBR#kNq1cAUk9*qw!MP1iC8f>A~64Wdfi!9IcXLMX)CbRJv{8FW?0r^PN^l7u% zG#-Sz^?Lo8W!VEd&QL-tmY~)7zW=k^?G9x80=k$T6ZnJ{Gynhq07*qoM6N<$f;215 A4*&oF literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/btn-small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..046438a23f5c1f9da882fcde6634073f731b6159 GIT binary patch literal 1116 zcmV-i1f%Jz?~O<<`NPD{{+MWjdXM-HvR!dJ1R_!jg7sHl{OZ}&VnG7y(AV0v7j}< zf>0a*a=C+ew|Blb?3;{tdw|u>8Yh|kX21Cs-kbM*bHz;9>-7S)5G@|(U^S-89mgT5 z7=fiV9r)!lfI_{;WJo0MbP-}`U`v_5u!5pDwWD-OoWq@lflf)OaO8Ll=6yI6h#3@1jon6!O6)9v2_}a#@$^s zjN1h~Ox+;Oo?vXq%+AgRPzkT7ygzHs_|kmja=Bn+WF#O)Vmm!OEtJdUN5J$Qy+cAo z4k7YOumRO!pl?Kot-no7Ops6jlD9EOVL}pO zVobtm71E?^>WHraAe^*ry$>j)z-#`V7t_KjOHfuJ7oi*A`h6M`V-n5*LJZ2nrjSI2 z3vN?RjAeaNV;GhstOE-1<6-QF{oyqHE=G4eK**g;1L#fvCvhfWwS+WDn}r%8agn-m z+g9LBS1PSIk?F^qs8CuU|K|VpXOzCRgyhId%DD;&JFVTej>qk; z!GNS-_ro;DF1CJRwuVqQElidb;Cmerrw- zaU*t@VPtP(W5e7e$w4}%T=($su(7_r{(5e1?ja=n1Z954#pV?sU}^%}k5Z}h zabaQM!P?r|yMu!RUY9XP_x7+Df#K%n=B?@J>1w@R&!gv1Qz149lY+jmLaq0(;62=Q z>7qx-sI%48RqoIf#@tV^SV?Msf4_)ZC1Yo2XC-`y#mI%KD;t>7U~FuxhZ^cZoe0-q icwwo9D?J^NA*|oDIGp7UlMLPf0000rV z$!L&f_#`Z;=U~|Ig29FB1XGHB0YfY!mqbtlla~(zuZBXHdBEGMn9M|LMdt+17sXzA0CYQpr>mdK II;Vst0BEmgNB{r; literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-active.png new file mode 100644 index 0000000000000000000000000000000000000000..ef782f9ca104b21896117e494809c5eb73fb45d1 GIT binary patch literal 886 zcmV-+1Bv{JP)NgqBv&IC26Wu~KH(0o20hwx3r=ThF3 z-lbQmL9MB#Azs6v!{P8zJRWz@o8$3VH+dwOTCy)Ss6|aflxSoa6bbMU8EeU#5}ID6 z7Bz8ee<_p^7y`wTRP_7(R~-(AV2oM4s6j1iW-^)UM)VAUN^jDD^orGzTJ$P_k5>X( zEEc^0z0U-YYo}F6_NNv#@qCXq^k8*8+G@3KL2z?48VLmd$~;OfYEqjvEQ3Pem{VkB z?VJZeO={D|yf*Upg&swqU%|BBK+vyr+GXf)`l(GDv?Zam%7vhIyZs~r;x)qHgA9WSD0bU@d~@CWq%q6+#rW5d(gTF$ zhJ{D$X0u6_0Zy%#CVxQS*z0CPe%5&OWdi-LiwRv#3>C(#El|AL4Q^}#n^ zM4x@~0)h`kl+qfoU;~9hq4WlA)AW+2e!tzlrqfC~=d#b4$z{Wyb7tn8wZ8S8wbowe zoV`o;@86FWTQ~;F;Y2M;f`LUs1N*@up@9jl1eTXb+|bZaM_XIlJ38q#^-=ZCL;@Zj zJf+<~)xW!U@7_1#4_U+q;OQq8HGIubr$^XcvgQrfN`a7`PSmK&O zsK|UlWd10G)!yFTXw8~6(aM!8qjEW22AY|fiLP9^5?#1(A-Z<$8ir4*zjX5C$zSm)M`^?Ccyle*Cy| z+cdJ1o|7)dl4|kC-@JMA3&)wr<_(?87ssrWl~ZG-M%@wq?r}my^+n?l2k}ODTlVv9U4AvoC?Oe*JnEo_Fuw zbzapNVzMLfRAiF^&_z>JeC07D6PDuWLI}Nl`SR<+Hq_nS9c|dK0RvrlvdyCt`p89B zPft%IFWn{#Z>8WT@hQ0zif1UyKLHt|It_#IqP!ZiEuWfBk@_h&5_#z~xw#W6&p0e^ z8NgF84$rYXXCU&}q61x26X;gkRH;;s=Ao-zX0C+FE6VE5J28xg=jiq@mr#d5>*#pg zOZDG}V5%n|^nR|wbw~7~0QZwSArxcp+$ruh8!x4#TD59b1O~8pOrd$K$;*{cY54$6 zz9y`BXH9#~JCJGV#V|;v!<3im+z932hd}QI_}aB=9sVM{(<#)4=>!9%l-fRz%?=5= z&5cmys`rGn#Dfp*yHS05db*b5EZ60|MJHYg20u8l54K!dE`;jNq$;8gffzz*7JBYW z!5>zl85XdCF%KBI5Gug0$_sk9XV=3CH>yKu-rhKyd~`GFg9S`r1LK?_RDjagPh`p-T8Xf#1UbV5L$s!`+Cm2mzBHoc4IEc1VzIa6*OZ z4UjEcw#)&vaGNb0i~60Aw+n07lu!#HtM@E#6&2QT^jO#%M#EfV zB;!snLI(#2y9MrL@bCtcX7!)@(jp&*$uNQ$?4jTVBUB?NbzPM!-_gu-DVarJUqNt$~RHlRjbvOt378U214;vFoPW%ye+ex z66^QOgi6aJx0E)zxHVbgvTXYtJlKw;AVJ*qaU5 zgl%cDq$X4k74}Q%GbDB1DDsBU-h-zF(~R@L40de57HsmirGmpGu2fCaYu@KX5<1DA zQ4?Tutr>P6I%CV^RnVKF6?|Ey8oa+n5+y zDneDieI`w1Mn|pUaD$P7N{pZdP5?WD6SnvfzwB*Hj4tt%aOIZ)DLyStZF=nGMo7ZM z?mQABXps|`PEHPm+|#EqFPc&451u%2;@>0?6MLx0{9Fp!7!|Eln(Jgj7&cf5kK@9R zH7LpLS^4&}gjP0h-t6XDvf_dT0`swTb#=LEJ2!6Jh|Zopi;2^U!2Me8_*)};8+xe7 zWKHG|5>z2sGjWy2ULlvmGy+-l|Ja6&6#9OEs=xtUG{W*kLU-=mIVM5BNJt+K4+sNt zB?{Tj*H&*MHv0!BeQ*IMPqO=eA$$=K}eHBQZ$fsnn>pW&lT{*S8v> z^+ZAB(RON!JDH_SztF<0bSVs?q6=|A1*ziNjf@E5517Sl{0)M?z(3Gd zT^~Qa#k)?Y^F1h^8Z`B_T5TV`Ukio8Ryv&)@(+hYrQh$*G3jBu-To$= z>|zWg6e4#Z@<*vuN<^bkWjr3cz@I#h#bU~2GEutS?mtAg+-kLc3mqJczH1ajT-=vj zE@y}wjYbNyBI=yO1<{AT#Bk6eeB@gw>T*AsOztt=6d>C;mp-XfYOh+YK9KdZ=J^&1 z$HPn}qfDn$3q$&sKDw?m`tPNk%!$5)mdoWki9}-8syR`*oouXA`U2x7vHXbjB~;V2 zw~WYaHuJ-AW-fh+L98t2C;}Kiz6)*fX}dF18pL^7z!m8F=by>QbOzXdLtf>-#`S6`jknrXb$U? zSj5D~JkVhsos%;T6#)-gjCU(X^sYY;r(h(^Vx5u0qWMf5C$1%EM~JCI{L} z(WY`0io@_L9Luh9&vua3$94$9z72iQi(cOWP{YCjRqK&43IB1706KpdVXha4K{YL}6l_OMRGR b>tO!}-w^oId#PO(00000NkvXXu0mjfZ(ei2 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/classic/tab-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..85d983288caaf558c17a2f6841b1c754e8d70907 GIT binary patch literal 1827 zcmV+;2i*9HP)&g~r5{(S^@{V2lf0xN~E4 z?Q&eXAoAEq;>tB7YQ?%RF4>YVRh9dh$w^Qv z{us#n6IGK$25N+Q_JbOso(U~@mKRIh;NW0GQ&ZD@G5(Cu~o9Hu+D;yScEi@P}u)k;GMm(20qO7mkmQe*wbQ zmX?;FqoX5eYikQ~xm+aB;YxIh?d|PgeSJOH+1cUczwzJ8i;IiDhU=z%o;ji8_xjP$-Pd&CQt;b1~&zrn5YV`wI5- zx3;#Pl1U;lkpu_ZQ%_HiF^-ZEROO3DbzgwW~f=>iPCQnVheL=eFuYT?p@#~o6KcKl z6Jq5=#6p9Qj*iT68av8Xhe;>A^i$qQq@k}=X6l5(Gj2g)KRtzM5(|f9+C{OHgjz3s z5_e^H)7G0Rq40`4HshV`?d`@Ed1u_2JZ^o?{9!KzfDef&O;S@8j@!$Z0RAdtC%u!T z$aB&(O0uboI_agvKr9xMs(AlRl~ADlfQW5QXvn1JWL2n39ViUYZ7`*UAvHp|_yO;j zA#mQS(^ImDonfM=le&q4sT7W{+l85MRWIkM5ejtgVasu-BW{^lJg%wuAxv&W|x;CL)yY zDgnf+RIC|O0pA5o)@_7U*l7#yoE|=!bp(@$PynKLBAsh7c^w12?w1|$WZF!4OL9`a z6=CKBS0K)WB7pN{PV*>1J*>Edp04^yNfZPxWDzmW+=Dp8Mk`7MN+ zRV60Fm&H3pl)RL-*$FB~n`yi1l>3cLC_M8c2peFo#&_45Zd`;_CE|>;$tK!p^HOFs zAD1Ii*CP?iFW&&_OE%(*0xVRlA!7cxBsV`HPSaBXc( zALbt8j~@^Mzgt>b`W?SKKP`_CdU~aH;KaaVhrE--|9PVtp`IO}MyO{({{;sj^#Bcsq zgp$tKxS+vrn{y&>wBD@mUa#XQ8EIwTduPs^otd4T)n>DqxC-LC3M9$VzYfttp>PxS zA2dzdlVFW;{(U-~zG^m`U%mR%yr#ZXDjmS~b0(9~qtU1U8AlGp@AZ13)9Fm0@SxFX zd~sBC+4MvdBzHmJTQ-}G>bfolgMrjdC=?Qt$waimj2QJdBm5HJ*4L{NvRawa>(@424%8eEEexu zj+FkcOcbbZ5{ZNujYdiitV*(52?m4L z+5T8#>k2W5MNGUrZmHlY5ye~OkUfxZ7q@7so)e3h&_6mCqLoS|g1djb?n7iJV?Izj zA)IHK{#L8?2kmO7R;%@#{49+qhT&&u9|r4dQzS{qd`RIdL!VA0x#t*B)XNsmei(+a z&D3l%^(4WGiWfdteq*_d&y~O2w~Av#5ykhIaJH$qX_8hS@R`H)j#1p&U)6~z?{TvGK(&==7iWfeALJUrZS^ytwy_0Y>Y#&jIZCE!8lb$y)E z@y*7@##ajq3tJCvmHVmEtfVwHHg;B~ey8IJ&nEvVc~|G==Kk<3H<*~ z?hiuPB@d0dySt;#&d#V(sbm6O-wCIgtLH2M4{{xVX3&t*xyg^B)b+lQ(bPT=1$OMOdkXUc7j*cV}m3UYJfN z$=ur7ia3gfA3VFGqa!}BH$m!OwOVa-W@ct3g$Hl9OU?4z+uNTC`Dv!PdFJNkX2emH zOqk$VlfyN#(V=$A>Ev@MtuzlkfByU>dD72#)A8fSBY93FV=d-+GZrG-+uI|}gy{C| z+cDW9e5$N?T8f8GPEOWDzjDMeM{o@tBZPy`HF~mx2K-4pV(sZ`VNy70P!(dhFQ! zJr6vF3=FYl9LxmsQo~@Fz!jneBb3b#k#-5tJv}|8d#91bj9~DiI2=&o4h>cJ)Du@*+LTw-oi@Hxcj44m% zza4~7O|2INr5BH28AvQ^CZXsC16Z7w_BxFD8B2L02%#!X-axOFO3ftG>^BUC$uQb| zUuW-xD&VsNKS2VpRSL$Gk=6IpVT6JSY+!U)eQ_Df@lL3uzKUe(J`AL6DWi~&t=Z>~ zl~7=EH7UKX@AF8ZTV4rus}MFq_Po;)LLqdXA2KX9b0q$n@0F8RLN$e^1o8wPzz%w| zlTrP6FzvwvHs_@$9OnA2g|EF5DirY)vME*OGBYa!hRHA*=B&@B_47vP#Kc68;?wge zv`lKNl>L%L+4qc4!w6=urxBI)zBfX(i$v`ie=STFC0-f$tYFIM2PUwA(bc3~+U39M zOSd;dHPWvEicJW-&dL;DKz+)wGA^-U5?3ZZba)~3+_`g)3(N$7Y$_c@?=->;n_<=e zpK>->m%?W+gtoP{k&G$^kSTQ#YR^Zp0yZn59OjC%;Zcud{(r-Sx;ie-?nbChsj?GJ z9(@*)46_)!?xQAcm{7f1b4g%MQigCa`nIW?d03m!(N=JV8ylQ04WVh6PgCzl+27LaP4!T@`&kvg-%C)9X@D|{;loNMgxOoxkm{y>4G!QU zjnI8PR01X?;9DJ!v3bzn-yh3U20WD0JxLZXmf8A#d3o7>0`#}~@Wb3+lYNt)A0m`r zZRm#vV~Uw?sUtftl_Z&r-eLC6Bst7RTaG43-Bq8j6=%P^b?erw&Rp-chX~!f)A~?| rfz%jUNb3Lip%$T@2fszAXF~r4bN_O4W~J?R00000NkvXXu0mjfvGH!k literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/dot.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..0216b468755e38d3fa3e65620d872a887677954a GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$4c_&1<88ib_3Q978PplM^IZE1Vzv|Noya;EZEX0HdkopWol#TTNhNR`_i@flJ|( zzyc?}1#Q0#&U&=fux}FOkYd`z8EZUAk@bkggoe`$3o2L***qBbG8E~VJ#e_dFo9_S zqh!RP1@kq|8n`+*>ol~PG#E^H>p1C|;4%q@*=&0w{m#yr40Hg4r>mdKI;Vst0Fzl# A+yDRo literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..29057617273647da2746d4fc07ed7ab36fa2879d GIT binary patch literal 393 zcmV;40e1e0P)^8X6en<>k$P{P-af z7Z+EzfB*j3j*gD0yu7?Z3JMD5T3T8#yiWB{pQV`IC- z!NFk{8XEc$*#xX%0Q3U?{Q2`&05$yQ=H_Mq(I7rZ99c7njo}4Q7?_%x2E@d~lmIm| z3JMDTe*gYGD~SK)%a^Y}`6J4#zrP1Bcq!@g(^S;&iwuRH<+23dF|J)Urm4- z@0>e#PQAXq9v+Ao27sJ(x9@>UOs*h=fEUiY_rCMv`_4J{Ufb2xmAK1cze{jp zj|kkq3fOG6N4K3D6&ovtZID}lz)#>f2l)fPuU3%G88$Dle+c;jo1dM!>(a+QmGU-Bn{ zudc4%n7MSqN9h(=#+=vI)&lu_ehUY!#eR1R|4~PqPM@3B0}(*Bd}Or6#l@#irxVx? zfmw>Vc2Gwf)AlB8sZ(x&1)j-d^iU`iCoo$O2>eg>gJi3>9`ig+9ns Q;s5{u07*qoM6N<$f=cbCW&i*H literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90e2578415eaea4f449d5cbdeca85a91212adee8 GIT binary patch literal 868 zcmV-q1DpJbP)7cu*9)Wkge;kUszq#U zY%D7HRbXzC8(lu1-%2DBG1;Sy6ws{zaXrmzZSAp!K&}fcC59m_$Khdml*YjUuE8Pd2-G#i}>p5>RW9y$E+^c(4cjFLf%-l^B~92 zG?~Hm_4SuZV3WjfaByIQxp%KNS`|RoWY>I)2vPuDus@T@Eb@+pV^CsiVq)SGFgNS& z)y4;3;oA*^6c9}&lS8>&?z@_iW7yx{wYM@B}T zsL%gVcXLQIH8sW8z9gQyEU|_S4O)Eg6+N}@-rNV-frtX|6yvd2?2Y>U-t_eJn(kBL zu^4k{#kq#yGmTv_0$N`2RPS%#ZSTSz_zXh@muT&Y>bLPyC)65AG_k0z|MNzaqbS_ zrCn&#g;x<394i8{3lw64^Drbv!@MZal=SqzjVMq73S$1_p%AbIL2U)EwnO(nA9@CM uuGlS^(fW?S1^7m2&_JaZI+_JEciFF6SEG+E2fB$}NApe+xf`Wscon76VH*a_2t*oqaI5;>M1O)~EzkBzN(b3Vd@bl--pMYU7A7}{fFqk%N8V@kA?gDKQ zma)U@u?r%ww1{{4Fjj1ASo!a{f$U_@h9R@N7wtqnkhmswa?9EysH&I4&% zAt9kVA|fKK$eO`k0ouTT4L3A2upx^BL!J|v4`X8uMC3ps#K!OfAr0vA18)ETh~%+7 TN5a5Y00000NkvXXu0mjfY7 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5181e703b07276b1b3475b9ae3d54e2792fde306 GIT binary patch literal 828 zcmV-C1H=4@P)x1gkCNcvkw_#Cn|I-G_!(@7#D)&; z{g&_*Boc{_4u|87!C;UEgMrj)wa%*5>IFPqqMOj21n%*86o5*arVZQe_WSem^SAeC zIujuRhlhuoIQygD@5?tgHxlIy0HkKKc~+@Zh=imlN_>5NT`?Ms5)oKkU6o8GQy+w% z9vvP1)WK$3LIlVXPEt!tOKPXnk*}|>nF^!?k-)x+Pl>Kw`TG7t#t5CMvs+Ff1@>-Bo6R;yiLt@}@tE^2cg64^cLo z{j##MvP~c)KhJg~UJ~RSxC)k-yhQP4NSLd|Vll(z)*FSc;Pmu#6H+}+(BD>c}# zcLJa=k-H%LDwD~umr^f!+7nWMA1;+j+i?B~SFn>#r^mp#jjF0C%s+r=Y!Wy-14EX@ zqGO>@*qCH1V#9q*r2vm|mZMM^&JysUuLXgH0t*G^uE1|smZBc05g3F30000{NK literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..7513aefcf7c59047266d9f6813c6591585810657 GIT binary patch literal 349 zcmV-j0iyniP)$hB({L#z>l1@MV$$|Dc(`=~&iN2)kAMTJ^N4a!7_WnRpo1M&9LLMDEWhiz zJ_#YdqA2>Hd}nVb!Pqzmf>qNrQYQ?<6-=Jm8q?{EEX#IPRY{#Z&v!6bv<*y6oY}TL z$LUPRvaC4_WV3?-qFKTBxl!uaQ&eODtk4ayaUnqx#8hKD z6@_8O^N~kV^$qhzn{>lXPG&N5?>%SkyYIg7q9|HBO*?a%0ZG!BVs_L6J=bzE4>kmHSZy&xtS`+&d@{q~a9>@%mIkBI=qs^8EKlqUL(XMB;hN3n z-l7Vw*H){ww}?NM@3&hQ0W{CJTCKj+vw)n`lnj0_NLeCb>;WgV4&-f1kg)=S)u?UB!Vhj7TDJ} zg&P8b7&4p_7-jw@K=@vGCwvqRMLyNlYA$ntz(6<@NC?pv0RdM8s>6uncW z46(81Q~{#R&j^C~C!iV}GFgENAb?J1*({+VngU{!%%m-#`Ufi#vZ00000NkvXXu0mjfZ>~h8 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/file-dirty.png new file mode 100644 index 0000000000000000000000000000000000000000..8edd2e1d0d344a12fe25a357b80a357cdbf74c20 GIT binary patch literal 320 zcmV-G0l)rzkeXFJb`J1(O3-tx}XB6VFfVo7(g091_3pL^i;w$!e~&a z!q_PE)TvV=fPq*G)T{zDY(=7d Su!kA|0000()J|Pu*K;Hk%nA*?b=fPHc~Wr$FF6NvM=c z;oKJbCv+WSjCl|J29?#tC~C@W83MeF$ZP1z0fBY>2XPw?`wM2xe!=Lpcm-cir_=Fb zvAB~;r8dLi@CyA0gTYg`+r4czo4-1p&N_Sz2??eGq{dT64;B-hc=M-hv7=^ z+l^uZ*=%+-pU)qKLLue%```ZD8k8hJPSLmBZr@q=t!wc+P%4#nBWRG`Ac19_KJ>+z zJu9GfEmk0t$rK?kC3gIK9h@q#@r<@PjbZ}vczlKTzD#}%q6s7tiFt)+yWJ=z5R1i( z;c)1R0Ip(W2Wqy72}GmOdz9IRUG|#;a!v(Uo*?~b-LtO61n}UTP~ivuO!fPH zKEDQt%>xq{pe#SWh_mr{d|0hkf7+s&jIIdq97!O#&H(t?oDaNrN)JLWc#gkGz!}dq z0UoN?>lpwZgTy|P?F;4um>&RsiS9tAQ?Akeize*9M(f z6&3x-#Kg2fOiXNbXlUqPWKAe+kpHmZxpU`AVG~CeV+09M0&u28VhtU50{}uzY!o!5 RniT*5002ovPDHLkV1jm3c^m)$ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc28bf774207e28b6bc3e7b03b68f883881c032 GIT binary patch literal 658 zcmV;D0&V??P)@PkI9 zac?r2ydI54pRiWL{8zl@f7s8tUBv*QP)Jc#RS5+Cr5q3nAauhpo@BGx%kg;pW;&g! zfJj34GeG`q4ZwC_8Gyn0Q6mUy%x1GIz+Phfr#3npEDH;+1pwI~L67T(2tyb$wq~x;L=doB_ s9^ZUed7o{GI2F|ff4*&oF07*qoM6N<$f~y)V-v9sr literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..4b156366001790df2c08df6f1ed1d88718d4f227 GIT binary patch literal 311 zcmV-70m%M|P)la?pW@XI=qEbcrE5W_t{pqM9z6C7E11m&hJ`DF zhXw|hap%n-;<~QUn2^Ra^IjoKjN*^>4z4U#5Ygrbdl%4^(!MA#J z-4z0wrXgL|m!@g@MN!NFxdLzph_xXhAj>jR6on&GLde>-ZIb8t5ug(w&jt|!k|ZIx z{7$}27>0`|iZ+H}T%fre1aO2myRKWo)B|H|pCrkrnIpX$IF5s0A}z~u2SJ;u?WYh3 zf`F;2y3exgkfv$XZu&aIYN#vYICi`0zctJYV?y{R4n_YDya3>-Z-gU_;9>v(002ov JPDHLkV1jY5fw=$x literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-closed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f9092e7910fe591a3a5de041c062dfa9eebcc8d4 GIT binary patch literal 658 zcmV;D0&V??P)l-zn~F8NQqiP0Q-&AGkzlAJ;y(Eb5! zDFtszD)i7m4lU{`+V2Y)u*pj1Nx+K(&s}ETyzghfGdr$pI-Sxoo3TuB)?NXK9B^H? z`&>2=0E9h=ZE!reF9;DpHk&ovZuj~%L>?fb`A*QH0>xs{ESJl>u~;mQVp+rsKsIfTt#p$3uR-205@$DjJ|C^2<#M^5N~Q7|w-Mx(kn;=?P;;EF3pv2z z9Ng4BJ7O3H;SG5l4u>CMU!1ku?T<(qUM0@?5d*LY$81wD>;{hkz{Fefs#>kaFt(4} z-?RC%_hJAw`6dMSb078tVL#AdFt8_+$ro(YOEt&oDh5!NtEc9o{7r$UrerdCrD5Cl zSBxK^{d5wY?OPZ?6=B;`sT6NQ8jVJOAb!|twT=O$^`-OwVydbdS9Ty8jS|iQ!WqDp ze}d(E&1UmRSDahQr~-cszdBXf!@+aNkN116Y2#W3ziGeU zKZ5OS`QKZWH9JHA_$M60YJTc-IB`&~*S~4%%uN#kpvnZo?{V^dsMTur+^T{Bm*!>_ sl$50|{1(V$=4Y<}Rt~HjSh@rM0Ps|bw~_k2#Q*>R07*qoM6N<$f-M9tE&u=k literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcb4812196b8e41b6f55f3deaed86d856309b2d GIT binary patch literal 305 zcmV-10nYx3P)))%G-M1#}`2?_1)>gsAk7RPV_ND`=U zHqa|}U%q_d2hw28TwGk=1O)}BBWnh+QQZiYEh{VgEFd5-lb@fTft#C~ftQz;0qFF( zK$pEI$^eiepyC~3Vq#Z;HZuU}dy0yR8__j`_*h*4k^uVoKhOpJ;^N|efUcPk8XEc+ zB#r?sx$~(r-u+@Hf&~q)DM=K&)((G?qaU#403>q%n{Wut=Xq@&O@`N)*K+ z5aPNyR~#8+b~C#cHoGv)?45h>Irq+)(Jaei$NU1v1Sf2tfZqYX10j`bsA*areuj## z#ODWZ%|v3~m{gBo0dFra7RAi%z{#%EfqK1uJ)h6Z%jJ@x8&3Ild-TF45($>i=id=? zg@0)QN(9#H^=+Y0IK><_O;edfu~;<0sA~sKY&9EVyGrFqsngb|ssUCim7Zd;*jFl*+7JkZLd$Fe{Z^~>O$(<_nE)k0!Z)=4HJiOdJHBPN!Kk8XdRW z?U55O-%}DHccvMDJpi0R4~9%XAZNnvC_FKrs}4|LqtTe4(ns8iO&9oaQ1x^?fk5CH zJ|7~8)7muwO14-mh7i~%36dW{JRWBlGmHl(!2LZ>1fYc#D!su~vv>!#y68i!{|Zke z;fVkxsMTs?w0%UPqZbdI7z12Mcp?GUA{2um#vVwNAv&F|C}!z%E5_`vm0!aBK>j}% z49)?5QmIsW+~#IJr~?E94ZL8AxB(S?5AJ}N%*)!d2)%&GVtfLA2mB8F0T6GD*cUs9 Q0000007*qoM6N<$f?!AZJpcdz literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open.png new file mode 100644 index 0000000000000000000000000000000000000000..55c3a34155b73f8fd877a81d6e84f975009911db GIT binary patch literal 293 zcmV+=0owkFP)b({4+Q?Il%@14P*fF=eD=EzbDE7kRqTV zJH*7qu7kV?wEY1PY(Uox;$w9INCK$wKhVj&($dm@d3kyJR;^m~7bK1WKsMmRwY9az r_~fz10){Pk1aNu*j~*1Mfj0mEokMYBc%B^p00000NkvXXu0mjfsEvIB literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/fold-open@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d4c8945808adddb011bcc209a2aaa7d70b6f05 GIT binary patch literal 592 zcmV-W0lLQH!8WQ4i3fO{+FSEnGwdL6X=; zDsh~d&Y4iAVeWVx12=QwI(N=J^PTU0=bS62sw!FMaIG^q#&!re3OEYzEN#ef+&1`a zviO?#e863EXJXe(tSNW|Z-oY8VaHqU!D624GI4Z+*98nbC!1t_BC=dW7 zJkMKB^vUINNaCtquRmcR+F&ApACE?(bHCsJ8i_;*o)8B}`)6uK_z468Boqn_gTdhO z%tm`M6XAft+hMp2y?qf{m&0{)GU7U_n9}J`;(Aj4f() zb(BDDVSqhN@KxU-m!%0000KLZ*U+eW*=@Xluu=l{Oe_niMBOswU%Wd&tdrdS{$I)CKB>9W97G z;vrW20Tt?kT~{cTs)CRz)>H^osi+%N%)*bEmOweHbHDSQ?|k=MUC4dvhM~#`*bHLr zR7;| zWY2q{j={VO%w3AZ7;?LTyl$+nL2f^gZx3=C$gdCbGLYBH&I05bz)N1oZ9=XCOs}W# zb}Aou03ctLfz-YyoN7tbb+_d!nX>zW^8buY)f>%w8JG;?k^>w7{%GmbE5H;Og{z(A zcY!@%l>B&cd5AZH_1ZfFzVX3E_pCGIeBG4g3NQ`E?P%*r}v z3%<8~@koAHds5^2bb{JH+P~TN?a%G6>|g(7NA2f!R7}m61UtHyC{|Hp zhdZ-;6h12i_*_DwiEvQ_TtTFFG3qv7GY^@I=A1c?Fi)DN%oAqWoHO4vmqrY$VwJ5T z!g|A+w+>lntYUH#>!4M(=BTMe$?+wAT4-R-dNnE^6y~J-o{Ei$~x_0F+YEW`H!^ zVXaMoX)gokMmRT$*1(zht+eiU;x7$I4=|r^_>cZMqxb%`ECqi911kV2wej@p9Nh2#J9AxOgA<* z4m^7F=rW)o3P7Ptz_7Xlq%i;^wm|Ib>-);V!NK+S?_Y+OFJE5VxpU{TGiT1+0O~#o zRR0p$6s!hJnKI=o7Z89H{`>cj;rH*~|L@T+T z&JI(<0CWwbk&%&uiHV6mFl_e2C4da92C%ZSGJp&L0T3H#z(1gO765Io^YQU{3YLHp zSPcMa=H%pL0Qmx_X$Q~?<-nM^gsc(9#%h3ofWSXKKE8{;e*G$Oc6QzaQ;d}c+5oZz z1s^(eCdb0O1J8vTXk! z*Ch-9@f|>f;O0$&2m`oWE(OA;;1>aL9xiVJL>M5ENTlNN_>RqHV+2maFN5Lix)8Ex z9Y`jVU8B*c^m@JTwOZ|Qu~>XP8jV;)dhqwy=hJaugaJ~iRM%`aD~vpZrB0{wxl*a* z%H{IM1K}>7ZvfI-1wr!Whm-yu!Spy5KJ#!T{N9b_T#} zAOKAZg8b;!>-F7yKL4!UZvV#c2)>6oZ#j3785VUe>f_1j2E+UkLeP<Z@{ zK%zd)<#OeIzrSd^S>OC_v!SC6-u)Ef=*ZzW!tq*=tj=&ad?gxg0OAFSq0JKGrp{G$4MM}L2h=0Q`mnPv#01UA< z2PkebnIya2E)fbR{t3SezY~kaek_aBbZjMn={0aM+Y}}c1V>1=2k5>TiA26~T-1aC zn1pm>x*BSpoc9djU4;93C=~i2Dyp3)41kkP91e$iYF0o9SMj_W2n3#MH(a$X4B&RV zhX<$LL&$IVe7=VeW5rv`gaL5p`#AA!MB*OAf32meSu6~IDtjgv4Dv;@Q4@X_Y*baV nneaa%&6YU7{!}f5Gk%59L!(_hpru@iy$siUqCR=kTp0YQ2GuoaqANVnngsSE=3TMAV}um zqUj(3Oa6Jj*jt)hi-CS{a+7<{`Q_%z74kf9Y*Nil!j$Cz!f&>(kL{Ze~cDpxW7(Q5*bp}Wq+FH9KY9bR%t$x3Mnx<*KP!-Em#IL=o!pU-38_s6=fAHuWE!ZiN*jSCn7i=tkLqIjVw$_XY0cz%H= zr9}>atv9kPD}wBjBuO@zOkRh>;kE0!pO{}B9u7bu2B4kTw*9VY+TCq1c^Xll=QMi4pT-9+m9kSEuv~WT+8vTt%hA4`tbz3An#$faS zC)^@)AP|_U)oNSGWb%R8Y`)HKzz87gtrh()QUk-;Y}RZv8prH*`=fk5|6*-z%?WZ7 zpdcH=fD!#uSuX(+yehd|?ur_b$z;0aa5#d6LLn3k2B$FIDWsRbVk*Xu1kRIAnfOeW)ZyWQiM zPq7rk(<5p5?ffQ^fuTmDVdz|Rw2!DqZ8qD?%F4>CL?SVRTDc5z1z<+Ho-`o=aHM-u zI>pGce05@C;$b`5?J!sm05rAV`T3%j$>ht-Yfb|2wdqOjUz6vN7i`Av2rIgp} zeT|dx5v07XtH57C)A}NyQmHgnS64H0b8~NTLFK@d1wI3tKmni#O*@l-X0zFfL?Stl z$MYtgPH%yM-TM0aCpahB7l6bRu>l!Yi!?9Emw*ZGpjHXku@FEiNu5{C@u? z1d*62XT)s310|pgFyba!A#2~&dNU86*)gltdK*=3N0sxA=bn<7QGWw|0{cMiB*d8C zwq62wQ(gmX2awQ`@GDRRxX-L`ZnN$_V_esI2_PXK75)JcBw@5_fi+J{3?FS15x^|4 zR@hPie@wepHpYdms{mmyXPC&S25RR52A+X`4FvNmOl-xH00000NkvXXu0mjf$}Dmi literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b08c71a19feef2c6b9a2ef98b5af1b45bd2ae3 GIT binary patch literal 340 zcmV-a0jvIrP)fVsJOI8bv4&dFj%n zWk5qzfNIVG!|EY6wT##TF)J(UKPxLM!=FEY{=a$i=Jc5}XI9+1ckedPfTKY5?~x6{ z>H?5vHa0c}Ak8Q(Eo~+)E^hSf*|WU|4<3{Nx@a@dke4t+uo}R^!omQ;FaR`+MN3P| z-N3*=3uwT0m^g?=s6rA2xd4Pg0OS%*PR>6-=5!!#DlRU50}_V;tOkH=2Wn#A;^G3S zTMM+cGA}O=6b2Xos{w+7f*=Eq|NHl^G$$wLD26U%0Z=TU<7v~Tg#yLEF@!FM&c_;! m$QBS{V@-*KG$G3mya51%VRauE*xzaZ0000m`h3&hRQf2KKq`_7|tD)BN(&s2gm#PoqN8Y-#NeEQ8k@Tg{vIus}v{gEdVP6 zDwRrv8U9DPSO5?M5=V0QtF8 zWyJ&=z~k{q8jVIk`UPY_=ytnDfY`0oYRBjC+qmWda|Tdh{ER4VN?o6SFnPHpuUEC-*_CA9@F*Z_XNUk0Eu&>#ph$_79NjYi{LKA(Tv zZnw`cJ%$}){(yW}4RO`v{2U3BQ5k5EI1PG6X0Ca?-g^#*<4(O^f0NB-KMn>1AIjx| z%UAeTW#%m~~0bnAPN@cfDD13sSYTj3Q&jug?vPA&1paepu z)9G%6!{ME1G@3^ic4qU7u518h36#M|n0(N%1ifBQ`$9InU)k(f00x8MU;US5z-TlI zWCQ~7ZvcFpPN(;kpvq?!0DYv)0145c)tb#_`5q_Y_i#9T+UxaRWHK4nF=PYG>Q5jf zjylW2^d2idLtl7~xo4?Vsw>klf7k%C3{W$&SS+;TsRvB3;#b&cPZEj552oe?H#PvR z)M~ZLn~a(d>;umF!(=k~`9j1sA6Ni^K;YD7v&qL0={|xzipS&c*VJ0*&H}L8?PH|5 ziB)HC|1uVfQLEj^U;%VGofDkzTi9T|ji}BAVf`7+`EUGoWtZBx+Jb;vfNci08Tbo_ W3>Zwg!?1V&0000WD7Nq&C*>>odV z90F;A0gz!F92{B5nn7|1D_|;tbWBXlVW4fhftZ1vogHK|11l@*9*{VaGB6XH3&0X0 zA|iR;zJ0p_^a?W&{N>`}%0<@<;$w9INW#a*=LXQ`r9jOLK<6(7@j>F~0H+H;3WbD( z%7J0w2@L%Tbd7L6C>HSH!-o$m;giP}jc~(>Vc-k{Vl;!)47>pVz7KPf80m`H00000 LNkvXXu0mjfLtKH) literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..07234e5e23742bde27c1d1638ec6f32dbf39a0cd GIT binary patch literal 628 zcmV-)0*n2LP)#Pt)4#U5(4nqigb z$Urum4cF`S=6F0l;6DQ+v8wgrT*hWHnfpj2@(#|e3}`ApqE@SQyjU!nlgUK*d}@+yKpkhdq@H2DtY8~9Ye$OcZUYXGHE=@uX^_=%ZE!9CB={E{(F zjiui;0473&=Mb50zWKB8bO1S*#Z^{M0E)%pBh>y4VtZnNx96T`g+gJh(pbiL0>I>S zI{iHy4&O-)KzKu*$-=6uX8^fe?jKZt20;oMemY-yrrKD>c?Q4&gTdej7`UQwFN?Za zUH=DO7w`A`@1cAxpU?k!?NfPwGXRw)b}?@nfn8x$-yXo8fjt8|XW&1$3$&uqD1Qq8 O0000EotgLE4zMuJ`Notrn<6IdWP^Es0>;=5YTNy~lrQnv#VV(FAb{c` z48wcmgUk2*JMa_`8r@1v1u{?+zA5j#2f}@QYY@vB>+xBZ!Ra{0{mfW(e z7xd47`PvEEDGoun4T2yck$~rUAE@5|`$F9C<)k&(1nJZ?&F4JN>!K)lnx=ocu0NrE z0?cGh=N*U!NPEDw>$>k*mT|{%-jEx>uHc9`WI*@hSktt}BuRc%ReeBy1awX(leGp- z1E)c7X&45HFMx$ORgSDBqu*V)P&CCsi*LjqaGP%}GY1Wb)S57CNn6W8u^%-Mq_H^p aXZi;|j#1^$dI#$O0000gu{g@B})xB$Y~iZ*6ToiLd=QD2Y|_ zLMas!IKX&ja&q#yt>_qyjg39RhwTKs7+-E|Y`hnb$Jg@tys;Ca(dfL(>|)r3;S14Gz=eU@#cxJQzAm zOicX1?jc--Bj7FTjo`TT^oMC|22wHSOV#QLMa%xOS!Df@6eW3 z^}#jpPfblNWilC~5~HJ|L3AI$6*vSgvrqHfvI~?F#?p=ra1rizbacF=wesn7+9*dN zk;pVRH@`sl4x9xK6fQjF(>zxD1d^a!qbc|a(ed%|Pw>s`#5^Aw8u~mpH}?fyIRkM> z7kw}-BW7c(Ic8D?*~vM$+tSh!V5ixwtu4dM^78UupU?Lco!f8<>aBdL_f;!^6IF#Y z(_gSKGcz+gGBPr&oTzbNVBo{*>S|bYU=2#IUS4h!Wn68z;Naj#6{N4P?>(Pmp0!1g)-B(5 zENm0yKzGD=FPwl|Uaz+&91d?xPfy2qmOKAC90jf2OHAqUor+wm>#&$iCc}Y1;8i3N zk*dh<<el9#TKGodakxpednA4VeolYmp~i-<2tg7}4-Q=YZNb^==7HI%gP0S#Za fRCW`nc?JFfplb3DplR#Q00000NkvXXu0mjf8Zehx literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/group-open.png new file mode 100644 index 0000000000000000000000000000000000000000..60e87355909cc289ee043c65c483f49591d40a23 GIT binary patch literal 311 zcmV-70m%M|P)6sPtKVCoLIL^GhOsv9wWQJi4? z6T@x}ixC3gp?T~}!ycBr_l>wyt5_jGp-^}$m&-=8*_^XVVs}3r4nHOm3Cj>6fMFO5 z@p$~GR;!KN2A9jF#A2~Ks4rR(s4^d-TrQ_K8jW1NURN*^R=NJ%H%(KCMx%<;>0BHQe6}rL1A_x}c_xt(Wg|6$C;><1e8s_u)4PFj{enzTUuz9>icPe%rK{&1Rn`4uFI(p{=369e}~=`Pu~n zfm*B8+L94xjC2dS2~pWKgw7z;nFT_0T_70Vk`kPH@5YOcBLgrYTv&(I-~HkoPPFC; zU(9`xX#e_H0Gg&fVA>Bk?VNf#!0NGOP<^vsKy*G90F$EnO|+p-aj)0QkIrp6ojwr> z4z7<4kV>Uq(TZ(OJ)OY$Dw2=<2XkxyR)VT`QT+>s@*F@{gVo7g{|g|QOnyQni^*S; y5gQgG^=mln!Aafwmjjc4m;uZjm^mPa7qNcp+$&_C!R;Q>92=A$fsIdYjZ1=~7r6*Tf=_JitA}StPL#h12}A z5YV}c;ougA-JSXOV|Hd_*LC6)OFIRG7$*biV;Q-w+f61DvD@uLQ514aI|{NaOPHo9 z>bf3dsMzS&C>u@F1nvJV$-6e6&+nv^w}xQ|+qP!}YTH(nW%=1Oje!1fyWQS%@Loon z&1MPM3g4RPx~{UJo$m0zApXE1bl(Fxj`N))$u+*SQUYW|Sx=|a=Pb)^D1Hc}L?mP; z(=_#iAb49W7F`&IS)S+TOfz^hxOkrT>ia(Q3M`S?WgN#(>-G8qK2=YO!*UKCfRI5K zMbR&aVjAoWrXbh_#Yso!z76JxI>lPuq8?xUnxIx{B>Fx&4?t+U8bGQGwVW>+1r%FU zRmDR?5FWo{imzy*|5`NV(0%YYA4nGhgNqK_8~BR8pM(0bqt1H+dDQEk_y-BW;J3Hm Rem?*J002ovPDHLkV1hNlz4!nC literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3f08ebc95bc84b0daede358f589107d4099b1a0c GIT binary patch literal 950 zcmV;n14;aeP)Ca$t?_a!Juao{m;-@N(e+j(zh*JqlhagoG-k;stC zB_Xd9xy+DPhJs!jRQ6abX8L?S!|y*zaG)PDb<_nuKT>c zW$}3YCBPmrFoVj7L?Thng%ELAY59CUM=gWv*puGf-F=}$%99Yl0wDDU8A%3%L5mPc zgu~%F841MTg+ifDh8G>gUW3duY+7G&&rS`T@Y>qilg`f053DQ_L3ZjTFBzleG1A7- z(a~Xab#=X6UtfO?jEIo-(w>9>us=37mQSbC50IG+9tAU`8VtxiAoqTCb@g$7e}4f> zf4QzBI)sRmo0yo$&Ck!@!~C-}K$4OSan4hr4fBsHD=QC2M@RSRO8{NbCB*apJv%$Q za~FaPWbC9!hEgN5kxHfRkB^U&NJC_Zp-YH+Em8{$3*RRvC+{G5mPf;^NM^9-)7;$L zbTXOzh52612dV)Pzy@>xd#}vQ%-kFq8R7jhIdDARmY0{W!PbM}Zve0UQuI0TUb=O+y_E`j-JLi%>3?OB`FAXG%hB zf^2jYsUio664rQmD;SPHL-b{9pb*nbl!OREFgu_E%rSkkSNat1jt~=@lUA0!oeb|l zvqE3{%X#4_GbDs~Z2U7sS(|Kpd{Z5vKYhEqyDd#Wu6c=)kOU?Ozw&%j>PAF-#YZsZ z*-0xS!1-sTQi&6kgVoZENLGQxkM52ahLR8(-qX#^%~$9_Jvx`sEf7C3Br`NL^vrD^ zZOX<78+*o4-E-&J2wQ_|mXuWn$3Ga3y`@QR#3H7vxMj%I@w|*~89J|+uDF+kT+;*N YKT}rch5+8|3;+NC07*qoM6N<$f=y$&NB{r; literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-buffer-on.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea1d87c84bf76e3a41061844815f7a14d60ac82 GIT binary patch literal 524 zcmV+n0`vWeP)CXg$dkVVh-9L~APo5OovmLzk7sT*T)aD@!T#@pS zP%7){_KoJX$zizbXbUGCn&=~bM^ZC+^Fb?G*Kmjxo;Y|Oo!tH zk^gEa3>k)Tt!df?&I6Jp$*kD6?GgByWm!f#oz8*(VjTIE(K4CLO{>*kwI9Ed};u$X_;34M(u72xP_yShrJ6;-Xh*3JKs?u%NTEE|?F^7DSw~*Kq+S+sA z5Lmh?-+-8|P5)dSkLFGQbz2cT{C?-!0dn;{wj0|?pd)DvO{|MfqvAK;*)^{%-9 O0000GA#8fk_hSHWoVTP_;xzL5HSq%OMNqPIx#f9g6 z65sno1}^^-suz)_dJCNMUauFg`UP}>S3pR{;w4JT%`$_HO2dS-0c1W9J``Gndjj&W zkQL5^obb*F1+-Z>5{c~TStZ@w-48XG5FpsF+$5dtgM)+1vURPzszt~mnaN~4BO@cr2L}g#5vE2EjYfYT9v=QyUSpq%*DS*> ze`*oJKtXtuPN$ROwjSaCcsy7kw^t^z`&RnwXdv zY;JC5GtcSi>Fe3q*=O?5jz0es{t?hahc%RYM!@5FdCPeBmN@AfF)nKcNr7hPp<@$9pj9V8&s2(AMyyf7c|%*H|<}Udc7(pLKq6X6)IZ;L)_qO z%)MrLNKY>;L<(PAt6>Jrj2kZjc;F|-_YP(`-bMOBY1=^&;155W0%&r@#Msp zJBz-8GQEY+x|XWuY6%{)o2h-dy5^86WNZup`UM`W**7$Q9f1@i2pvz?e}}3FY4M$k dsmkt@(0?oSnZiA{20Z`(002ovPDHLkV1n(5NF@LO literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off.png new file mode 100644 index 0000000000000000000000000000000000000000..98cfe0b478a7fbb66dc249a38f8a4285f806bd2b GIT binary patch literal 556 zcmV+{0@MA8P)~}AoSRn+tba3y!yYKFI_q*?D+U+*$hj9G>A&h?jLB%bLyRGbR!8`MfNOVwU5$6ehjG zM5D+XESJm5%PQ26xClxEgpN)OFGmYknqewOyli8 z^cl`~swNVNBgCKJFT~^VOB9|!N3fe=06nx?EnIyH?TDrlpl{H}&v55U{HYPy2Ph9E u&N7thh#NI#%ChP3S5bEKR}iZ28_)*&~ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-case-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2711931c8e35bc5bb098ac955e0c03499872e5 GIT binary patch literal 1328 zcmV-01<(44P)Wo6}!RIv}Uf8-Ig%mRc`h?EvkbM|ZnuC~dwYA<*4CE4xVZR5l7Ew` z!2jJpk|C1yq^GCHz$m#ui7n(+{dv^lO7_33va&J@HvZ1e&dwJ*=)8(!s}f7$a5&`g zcmfLx3z0_&Dk($JX!I4BFkl2aH#c|K=ktB7wE)7LZ+mP`WEiKJCj&D*x6zx^J z?73-fZXRlAXc!SYvK_RtCs~n-ii)C=l9KlUave2jFn?{y;u5xucKIp# z7mQ?x5kUMlGc)rPNnG{y^;6umGXfO~g(3`iV0n2tj|ANGA3etazEFocFt zD<>z%;?{ZqdpQsYJQ*LG5D@K%wTt9?ot>T62;4>A{bCvSy?PS@5BQ-)UxvO@+wa72kpAgv1Q$woSb}t zK)Wq@O-)TxBs-&I8yg!tNGZ2%)sZ}twcqi*cd&N1w6tgrFK8Cm*4BQXpP#RH_*sb_ z#vTB90p35%aHumUy|5YTH#u;w{!ubf>qs*E2dg zdI3h8^YZcn_&;XPmDY|JvpmF5b#?Wxe!u^m0I4<1lZMxTQ=6nDR;$b!cC6La)gR~P z=AL&Z*E>f1N7&v3K(6)#gc&q*C5AZE`tvJLo!kB=a^y_?--K mvT`C2odQbLhEs-8G4vln1nz;dpwH6)0000*Oe8antZ=AZWQtaU<4Vz0>B3#mpWxC(D>to`3Z!<@LU5r% zq~wGPOBBj%B5c4$%+FDK&(sVCfs66LWqm0ZJdBoogpT5TVs6GnvdAKA*qV>-F|+Hrp2Bb%;&oDb1F)914ZDxm@nr zcsyosI2>6p7~FvXt!}Q(3ayyUX7^|`Vw6gyI<+Q~={^)zuqrYxkN_3f05U)^CVk~d z2>m6gRJy*oxw+Ntc1PiG_%%v9Bp+oeF^(Mw1TMwn@n@-2>SH>c{+vi8Qf{~V26D8o zC#S~qcs%!5ES8{LE>{|j#%`rjsgdvV`5YL>uU4x(lzlm$&+op2357zl%jJ54oRox) zH(O#b7@UK_fRW4P@`xYM1hray(P%U};m2_Z-@zlqbb7u10_8*^kr6o(+GC?Ewnn2l zFPF>B!{LzO^?Dx?NHWM*DwWsp^>giZ`$r@ac>sZ1&1UoKWHRC4P^c_EjinWxbvPVu zO3=jr7=H)W@Ato{RI0nNSnO#snfw%uMjuNgl2wdfqB$fa)oQhO=#-FrQ79DNBX$Tl zcDwzi-|yen>2$Xd&(RpG)#|iZEc-kjPeMNI9}Ar^}btyb%2u~29*fk~{LDAIMw2djXoYDn7rt=bFF%j^B z2(T1{0?8zJ2*$uT5WxkLR}m6{m{X@teYf$CMHHvajjUfB40Yx(*U23fOFbxg4(Pitu@q2q$7vsgwAL%P+o`- zlX4KgW5`5zKq@>(LN7@Yy4c91gPgz;n`^FlbGWx%OA#9(}%6SNgDk&*R z-?nYrCq#KeczF1GY``-$HT7tCc)0n(g$pN+A3uH$y%C`3I#IXD?*_I0|OJZUZXcLG4U8ons3tX&dtsJa_7#SrRXW;rpBKB{IJud9YtqmW`1al z3G?ikGiNR`eh2soccYn8i|z)-6)~k+gxp7t9QgxM*QvS7hYuhAkxR55e1H1%>9fXG zq>74)K0`kmIGJ)fas+(E#l>qlNf{8~69#^Ne@91$$SBwD^XJcZ?b);Eeq>~%9Jvw_ z60%8gYG-GsbRL6AY#;90wd))DDr(*MBD$1RHW8VuaU0nsCcD^3~y>)7bz%+!TDk>^6 zQ&Lhgbjf!`U7JijndN6N?}g@>EA$|jEoGW?F6_B z6xzoWylemd{hw028@bu7;%3|uV{30*sdj3}q)Y?hH8nK_9PJciFlYYyzl1)MD_~Vy zTiXEI6QQA@5r+;P`i}8DSq}{j_1wI9vzx>Eh}*w7K0ZECL>7qiEYNq1iG(&{38`66=O-}1FN6}~r@On`&zM%$p$LJ*teG<{ zSwyN(_``Wy4l+@!XpiqKbIUti1OdJ0@zmg(!(t;^y9?W0&7 zKT1)5fB)a3qoX5h*RIVXUCYcGrnP-qjRq24sfC4wahxVUm*5XX>NbRDD8(rr z)ql?-SFc`eG5VA#Zd`h1oX1rK8Vk~ZZp{=R=?9%agzjT#9S8cBa1c~?vRehRfKH8e zD&n%$O8VLH4$$Q%(S<2LDifuA9H`*+PWH0KeOhZ$j&!r?4v~`B{sVN$>Dvh>eIw@7 z3^Jesx17-q1KDZuF`yrHdgqi0)uEui>Q;T}t45`7i6SJnKA;y{eJ!S+5^|>hD4cNe z?FdoQPW2;ScCwc*ge4$HFe61mw??QC&=ixy+VXu~iFV6F9GWoWGH z+QAGLn`q8C(t!Cbl2BouXI>)zC)#0|FB%vAX|k1|%Oc%$UKzz}V~Q;usRa`8ITSUyA_`kN(FC zWhO7U{{7#r;b(GX&&jo$%>zXe4=uXfHQA}zcw76yjguX`G~az`DHn2%+M{s2?+4dU zuAN#BKK+&}3e|YVbZXNSM*$7%BDZc9^eZ!H;vN4o+)qKb>6N zF{^C-%EtOVE4vp7m;`>|IlQ2r17`0wrz>wRo2)F@{IM}!Fy&K()t5ZHznGFc%gtBvgLZJ*r#I7{b8fPA`5rNAnO44x`&@pRq^*Y& zCrC_g=T2v}mE)iIeCMgxzvG@WAD_5DmaqApAz0#~e4@|EW6Uz&WeTp(e&j2sch6rk uT=IdtsM8tu``fMCfnoUXH#7|YGxSb68GQcqpH5)>FnGH9xvXp|$2VnSuXfS{q1muaIIdkR# zNYuo{#16$-diw96oYo{+I15o;pXP%4P$BV?q zW)4UUB_dE<1eBzX*A_2c4E9=VY^*nsjn`{HHMqU@>(?)sH+YfQFfnu*r`P0xDy^WZ zp8#nYAeMsi(Wz%Zfn&hHhNmOsFap^?cFKkugl;9N{K1#|0rpF74c%Z*cmMzZ07*qo IM6N<$g8cY^DgXcg literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-context-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f04193b953dae3f7416bb2c9bdbb16b30720613e GIT binary patch literal 642 zcmV-|0)737P)NklCFzCxZMhe~inLRGneD4@2f+Bo6=w!0~g zXKlxgM36kvWOx5v|2rP<>`apBblO@aSz9Gzu%$7m?29xWYCKftfwK9H`2|UmaIV&+ z%!T=}`l%ENbIIRfXj6;#hr{8e+L?4Zof8Ja&u3tbj(Fbcv1=&?=EU-lGiWl&y}$ua8+eYi1lZU7 zz4V8*&N7Hkv14q!3xR=KyhYfKCZnI*GRS4yG!17s%N@hBt4c@FjGoMAdqo*8eJA}W zJ@V9F)qe5)V~=y_7ZDCKJfEc(+V|Fa*zypEhbXv{5>W{K@2>X`|K-P38=i+J8etGw z27$K*gTW`)@ju;e_te6luBp-&&xfLQmO<_w8jrcZGP2Fcz%z>~4DdR8m=ZInZEUCi;xf@L@)$ATGOz| z5Gq7?D9%RmkXbQW28AM@4Z{^raTE$9Ff@@aBAgpIFeH^hxsnvJoI!xkDa~K$GVeDY cdT}0l1VX0Jl)7LHQ2+n{07*qoM6N<$g3?ee?f?J) literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e5498df849f245e22ea1b70225cfabaa8f20f1 GIT binary patch literal 385 zcmV-{0e=38P)6gfyPkaOf9)HF!hjkZ83CSdf4=b1q9_u>F#HX|N(c+X@T;Lrxh}NE zboI*-zLBb`F7~J_%j-Q_n|QHDW~0$8bA)z1&l5#aEa>c9pau@E==+{+GY~ZR1j1dC zBur#3;8bIZxn>}ETMtdsJc0F{c{5!D=#ZxABh9f-1U5VvH!%2Vqj!AI(b7AN54~lA fbpGGh&3+@Fo6BQA;IPH200000NkvXXu0mjf5=Wux literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d1a847c8a01e274fc01409a25bc67dde3ea760 GIT binary patch literal 726 zcmV;{0xA88P)H>zIqUs?{~nmQt}D+xKJi3=iVoF?>$)^k9YTQ0WPEiAoV%v&qUC5>!vsCu)5KFnh3+9OPG=VkYpFLiHq-y2<08)x)!>r+I(vh` zAi9ULwvT+G)oMj^?qiQ53Zzho5m|<|Nbj+BXri4NXgnU@%DeB+^?L1XHk(KYvAlr>TB7-DG#cGnK<0lPlF*t= zCeLQG*&Bg)AM|d_9pc+v*ZLV~w}HZxTD# z-XtLQ1H}t@O`<3mAZrN@ixWoHy)+>9{MS*m>Wjl(fzmAf3ztJJ(*H0=ZU6uP07*qo IM6N<$f{XoJYXATM literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on.png new file mode 100644 index 0000000000000000000000000000000000000000..42cd598aad8ba721fdb851f3992135f7ebcc9c39 GIT binary patch literal 422 zcmV;X0a^ZuP)<+7{sOPNM?e=~z$&97PQx&~`3X}kYm+l#MN#nh zE1VZTSo)t!JaHkiP=^!7M8kyuZcGTUp6|<6nG|}MOwYKj|m<4P4|C7sO~9|5d{8a-`fkS6JC)} Q!vFvP07*qoM6N<$f`b;g&Hw-a literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-highlight-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..28fde6b1886a721eb5a3ef3ad39eea5d2fba1075 GIT binary patch literal 827 zcmV-B1H}A^P)Dq{jf`Y~c zN)g2;5JrFk!O8i9_l%SHc4u|xy9)$~k)G~$ZfExG?CjpGHJi<1r%B?ci43{?C*-vv zXG|R|%VP8h_93hV@K{-xsKj`IDROrzd9kFVUXVEpgA2e#AO!>^wM=FNKRhokWxfYm(VCXo`Zmm{(&}=qe2w;467)&m90TB3 zE@3oOVW)L0(`_lg)XqWL^vyAVA;5e(5{Xa}UoXYu@$-z#NeF#&41i;~L?T38>ZHgl zjefXumsG#EvP*%+{OnN)<@5Px_{MF!uNru?&*6Kj*Xuo0`f=h~4oeZDorP_x*vCFW z@d4OXKX|mcORow3c+hHMA~fGwO7D+oZvmeby;t)pI#_DNO-4pS!i*e~6CZj<@F$uX z38^#ccDqkS4?dNuKa-h}klz`Z90%3^JB0j(IA|nHcD^H2C=^1SL+y53J%>b2z6rrP z>T_r{Lc)^$-E&AF6zUuj{H+!tb=x-@jZo*1>Q7_?r74GIerIHI>_ac!P$fbvg2ww0 zl&}0#M=s;>_yA7%_tpw7i4betk!{;s*=+V^+TfW*q4%P)N~4(*@8sR!!|xEgKdc zX_)bR-psQx#&Kjzh`9s^Vf;U!wMxzR{ljXtI+>;!s_|hM%D(TPZnxWu8drToz3eay z%gtu9rx=<=9YC337_4cU*Rm|N0VN`*lX z94yN^?RGl`%c3Y6X;aV?R5|Ap)v1#jaX*ZxNWm6o*LC+4C&3*G3!t#7sxuA~RSgKV zI3@>4l8C?5^E{?(DM08$F~@N8Z`tzpl>pXi{2in*;)On?jOoNEY9Z zeBWhf8LxB3*A`niaCYvUd*;kS zeEtjmFAs$h6+-YDko08ve)QVI$w z?wpIU4?+=!3KBXNiz&Xtx4N;?jsqeP)bX@31nKwt&s;If}mTnZorHcoGWgx zUawyu0dHXbg~;Qfv6^TMe28%aE>%T^+U@o?On%$xbj~M}$tyf(xf=%4Ri%M~yL7#C zj!RYXpDThA_9@J&Vx>~K<^@Q&eHs-XjYg{1>silQR0xaAVLxF^KwiCTV7&C$T=M%4 zfj=&F=;{LEcS8Nm8MH#a{qigg`o889E4&E{7Gv8KW?K+Y=E)Rvyrz+z#3ZnR^77>rQXD%@B}DS}L3ECwqK=Nt>f v7!TSGPU;7xFoKgCh=vm4Sr8)fh(?)4g%%bjm2 zn|zF-=o3K>z<=X@G3OZ-6h+A)x>PEaE%@?GzE~_?z;Oq}J>x=No@So z*5TO&b^tp5E!(!K$uq51s~zGL?}@-m3$T6y-T{iV@4D_u8ix6V1wlZ)N$O5YgYpRI z0UrQ~J-1q|Ym^#NsT|Zx$8m1K@kNBBG~o~tvc(gr|VmW1A@7aAEH8XCG=C|KHD%?{_%29N|8Pc4g#kQ1}}fF62A zlj-T{SLicnv(+&z>lpC8J3Bj%tK)2XfDzyXG0AMx2R?UcnuRh#9P36bpfSh~JSBiL zfMlpgZ(av(CK3syE@MYAo&rc%D+#qM1W{?g%Lr9!kL0-GF#H)f0qDi6v$L~zmY0_w zj*X2?baffSWp{V?C3I>c%R(6`86g_6Nj$_fJ_f!619Nk8-nF&0=ODu4RZ6ACbr6g9 z4i67ct*opBvDsP{aw_L*BFnPMJ9IAx;-Wga}Sa^ck)Mq6FsoN|I%{)|=c!-7Z z2Egp`Ad@B~$BI|YrBN2j2+@UwOeT{>QM{~~4+ev;*-xcXN<1FtPAm0EdvCF27V@a+ zZG*@NF)dXr`qks{+%{ z`uh4I`r5t34e+uZnVFgKqwToJ2=TsPH9i8^Cpi*gfRhljEKAS)r?7+wA`s$76^a;F zt9;L({RwCRNJ1_ki!96`3ytL&FIo}ATn>8Ntf44!u0V)`AXNk@?tqhcTT@Sqw+#CI zu~_V2e0+QYeapfO#w6MiJ}0zA1f%p6kOx%Y4ERGpksdq7mtjbjh5F!^_2F4H6bgl5 zgJB_@yYR&brG^5}v8as#lU}d)f#2`@P)t!XL2^uxBHi>pO!o$AyK-MSV9gNp@M7cpBmaS$g55d{B0e}UrKAxr5P zCqZ$mB~+S763-J-(j;JqE?zji_wIf7ymQZ^UDu^n5wTT}5RQLHB#PoVo6Y`dBpc-s zP16iM!6vm#CKC&Oh`;Xjhde423fs9{PKSy^G|&vgPy{6M`TP!QPr$iH;H`A*NKbIlAbvF( zjTRI>qbA^i{dT+k`>P%iMa=f2-|vgfW>XywhZ6E@^?H3$tJSb|Ibglh=^QAEB4fYM z7a9#O&;Sp70dBQgonXz3MkA6ZkpLWEJ{Czv5s|z+lI-?#64=X}5Kcg}aN>ay9aaFj%U zl)w;68IW2=$_$kmQe!~PZcy8xX0NHK`K8zEk8$7r{{Chp5;?BsQ_Oy7Kma2c41dC; z)9GSoX|f#}kkx9{%K#nv)oKpV*w|R5bVZ#`Cy*s7=Y^z@fBt?=fa)R1Wb%j8>3r#M zIBMiU2tuxM8|SsPwddgX3I3z`Hl^R10O14t+-Nj9p@UUbRo`&HAV5?yU`0hmjv=xn zNkc=!Y20HRJ`2!J?7IeVmnD0lQK$B`udAzLusNH}CguY-6*8HO0Ke~eRUR-l3Lw=y z0PEYZpNhxhLjZgmerDDe012s7N{Gc`U&7(=S@`b_5I{KobL3R#plGg#*rD z%_lL$0|3IZx3~8ddz@s;WHN~i@&f#g^;KMuZ6V10O7fRuB`elKq0r34#KcAPo2Piz zJ77gT$ZofbBN-s512qy1(kg&aagD72jI6Y^wOtJa0yl!eV5q=R;<9SWu*(E>Kn-56 z_r%!P*xf`T;RX-`Z_R?1i&O$+1-b!7o=r_n`79O-{}PNtH=+A-ANgDhAnxa>R;UfC zcez{_{C@vyuwuvu1Uox6hn1nBp)0+;y*rqvpxe*{w5VtWBnD}3Z+C#5M*wjP^<-9J zh#Lur3?W^sAkwq6wB##_LT1zi2mlOdY&Q}730SFTv7$rg`i~S(N*6~0ibkUZMg0i9 zx4ypqS=w7@R0Y)3)N~2XUNF+iS7tVw#g`@pl(Ph8($E9|S*28>1qfi3uQCgeA)z#G^n1fq~(D?4-0M>{o0JGcQ-`|0kHVyz8GQ}5n@FIax z*8$y?_A8C5fY#R5-UG-xvcojspgn+lH9S1rF*!N;25Y(hqgXow0|UW@g@p%QU0vNc z@B@1m1t5jy=H`cpSG2HI0U?&IudnYh0!L9pZ{2Qp=luNqi=LhyGP6k#Ob?ZeK-gzu zBO@dJ#l^+zEiElBT*8kF&CJfu&cK$t05|80mQJ1Ucs#54Hl0U0ejxw@Mh{dBPB1dz zo8N*mHFlrRH-|skx~He7?fA{7UlfpPQ6m7Q0_udav5}b!R1|dJEu>KVmf^Fpy}Z24 zCMp*;R@&(kksFleS{R}qgE1BVbXca0FNwmrg0N=7P%Y&lXk|#@oZQk$*jsF;oVmlqUIFnISnFO7q{zzN4uSVI6P)00007 zbMT4K8Jo>E1FPvq148h4Fc^HF&1O%d(dZ|m(P#sRgAz#g`~7RVT<&`~9R7m!G&z}Y ze_uaNd6i5i_w0823I#Nq%_~Wg<^kkOrIO-sI2IAZsj7M#2n60$tJU*iAc^PsH(syz zgWK(1o`SGIvS_haC=`woiA1bcs~y61jY0+wQPU?j)NZ$XnaN}hOeWJ5!3e;lTrOAR z@%Yzzy?z2;i$Q2#-`Zp-6xwh)ouAES^8y2qr6g(#^HKrKqN?pmrSgNt=!Y#>ES4of z5Ed|>yL3AJt=(?_h8QA|$Q}Tf;E7hNb*0g0OcI!Z=%gowa~hykpU<~1ieeD!tynB} zpGu`@4x7+*kH@p?a=AX@n<^f3L=63mezjVyGnBo9pf+?KGozO9X`mabeG8=#D9}2T9o_}!0qcSM17aIw0Ud{-hest*1w;R}XF*7Q gvFLB@#fkdBM?T-@gU@en{r~^~07*qoM6N<$f;Q?8;Q#;t literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-regex-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a500a3bba566f7b3526ccd8ca7bec86deef58e9 GIT binary patch literal 1390 zcmV-!1(EuRP)1i{9(f^MW65g8E|YF$V{x=^UAS`dVx z3&HT#iElYWBeJ-#6;8Yd%lRHc`r?755?YK& zKq5fd2X@7g#G;m$Aryzx40CgH57lb5jwc5KfoFMnd2ewlg3D3K%M`Uh2$@kbJ0h4y z13+C&5-~z36_O@cC#;JjfVILyuOTW|Aeagf;^Z125E6aq$Mq9mke95lPh5b)=h3hssLW~~sZ312cUQJ6& z%c!lbEy~T!edDCpp^y?pcF%6N&!ZWBMrs|fdkm}sZs2(=gxI=l^H+eIz%9U1Qc{xH z(9rOa94WWk{S-y~J<{|9J`NF#49V;PhtU!WeLQ)0Fm*RlQ&Zopsi~>X$;o*iwIkOM zFjpwHx3@Q^rl#(p+wS4wy4R7M8 zWNT~d(ag-u*TciZKf#d^+6SSqA742_Eb6NW`^Q$RwL`1bGG(%YItiki0wB#)pOqle zIE|~~b6k`wAoTpK0iPqaeVotdGorC>o^D^xQLy`CV`KNdUavo-gRQ@{we`D&g@r%y zjU&0!SA{Y$G4buCr6r!pPYW|}P9oKTs;8&tSF_o?hz`r5Hx3ER&(Hsc&Y9oY*$I}G zmcGk_MO|=XW8+CzSJw|nueqwK>O+ggk}fFmGd(>$xVpN^kF%u65#kq_dG_`7^$p?8 zUtd{S`DVY65_mLPH*;&_pNJ>fyiBR_p zko=1)M~It~&?evj8U8h8{z>R5!0RA^(K!<#wl(h_+Is+}-|tU=KlgG1^bgzeSeO3l z^3p=x(UBW-*LV|?0C50Y660QcmX(MRlJdqGOatqPk>W^UI#?rKoXsMRS|UbBW=E!u1bA?0 wAJz#$T}%>lgkn1Fe>kz&E|gpnijpF literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-off.png new file mode 100644 index 0000000000000000000000000000000000000000..91a13b6865b739eb47deca0c253cc4d48d676a5e GIT binary patch literal 365 zcmV-z0h0cSP)7M@8c2pI7Nwup#`G&3{vS|B!m_UsuWKEqgWNs5Y! z+Ox5-t>EV7mcVBjOg~l^iHV8jb8>Qa0}WvXx`yH3zkdv$KYs?(AdP?i{9${D5)y)0&hX>M4>%jfKrsjyCX7Hu96&EIu&}Ve z4T33#(IA7-0ZKZ$c=6)5n>TN!2?`3<1D*c|2A2iGnnqJ$qIfP4hDpJ}5?TV78{FCPQOm<8!*YxyZp8G(Z&*#cjYL2S}hFJE1WEt5r zv}Z`hfNbA34XLW?2?m4jWC3OSsvQqwC=`mp&nbf4>vTG*EU0MTDcUr%7Y>K-I~II7BgPjF#f(_?Q%)R z(B(l4`mkTQT<%+;P!Y?O@0XAOhp>!a3}sSS+4pGMNVeQ?~=q zTB)vpd6 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-reverse-on.png new file mode 100644 index 0000000000000000000000000000000000000000..cadfdf7a53f17f48a1c0dbda65ccbb288ab6a073 GIT binary patch literal 461 zcmV;;0W$uHP)ot_3%7$X_A&Cxk#JGbwZxI(1S+ zK^%-^$S;iFOPdheUbFOrFYoT&yYKG3dtp%&6&3+u5hA3qFrnqV8!^UK5JL=5hJY8( zy%7Wm#cH*>Z<^*k1WG)Sc%6zpNjT_$&1SQC((Cnx{eGWb+ai%wd z2&>g<+pSjXu2QKShhdn+@N5~5X(22!+qTyo$B{hG<898ai`hx`)uO>*@YQa&Zw;RlDgb06P#=6l_#&*$@X=SfWG zi43`15Gogu3lEj^P-D3bm8{o8uulcc7R4)9zEu+f7lz#oP#4D;1z9`|OI0}pG7Ye3 z1)ROTz3#28tqqJ@01F@`QiK>H2tCpSw2zLC4z91SzjHdBkMQ0GNE0#~GBSZdp0fk( z^YioLlarG#tyZfum&;+Q?lSO;0~s+y2wc>BX@;@RwY9Zp0|Nt3O(s)=LWUf;W=Jm& zsZ#MlkYTZOOS0{V|-^&J6+Knf^HsQ#>Wp^%~CO91ob-q_gK z3$xiwqf+Ac`@3=Q0Cx2rEa=mJMbQYzsQJ=ju~=LyD=Xpt{{F|D*M+EfrosV}{x?uL zA&qC6eLkOOVPRp_<#G)PLR2A-;x;En!nPpv5Du9GfxxYik&!ocyS=MQuN2u}z+7Zb zmJ|`8La#|ClTDdSrt$cg#Zfb%P3kWxXLjn%&CO^i6neh9yZebAss&22&`gR5sXgN; z9*^&Z!{H6wQy<`|e6^%to9-6=$csWo&g>hkhObCw3+}47J3Bl3)6>&;Z8jS(R9Q*m z;HgfkRV3^~O4+j-*mJG`T|kf5>%BQUJNuxcqoW<~|H;(U)N4%A=wIC;8{!w>BM?O& zDtX@tJ%j@}kfKs{RJxhtG`y5rTwMGyH#hgNudmOGIlUZUVjuXUTVR*|4v@${-CFTg zNQgT?Di2Z&T>_w+sVJRDBvQ-E%L#^WczAdSm#a1xW7zWKsJ-%p!iL9RIv!tBqA@u}FVVs4x)Py9dLI}6F zx6`p$>{~DxypO!PhIxA65J#9Z#)Y+7~cjujp)?w z6;>IP3I(1bDfO3xchhx%1Q`leQXEF;DZ^4x$n;uajLA;pOj0#3_)ANYB*Jh?iIj)5 zmOzXZ#t;(p99u*NoTVbiayV}1?Ajy%tc9mi47ZE!*OPOu4TP|NEAgaWjpD0W;l9_M*}BQ4b? zAnXWsC&64q2p*4{0Kr8o*L78vW&K!4i?C4;1gdEoN)1tfK=g!eQ5=ioiv>8rI|QxR zwE(4QdMwNG3_FV^t62g-chH_#N{Q!(!UlW`ZgbJhxP{yc{7tnni1L5O6@S_fSd~qB T08dvf00000NkvXXu0mjfexrh# literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6f0fafab3d86c5d55c7f0a6e822d16c89d89e0 GIT binary patch literal 601 zcmV-f0;c_mP)iXNN*7BG#71qnLye}lFuZq3VMXV*0qrSQ7%kJr|&ZkxR^87 znTc>Q7fx61-1GH2-?`(}3B%Cr(kSc_3|Vp@TSsz-a))dV*q-NS$mWn6x1rH!94?p3 zYsYa;5j8~IcJ&!=1H>odrdTXqOeT{@ZL_0Y9fVn}R`;&!`h~)8XR`ni0D2|}f>-Dr zYf!2~NFI8g=aB!V099jP~5t>%bA+g*7mDF0z(nP;Bc?c06!-g%x6*5+x)C)s6b*b zMR*v;eb8oVB603<+O| zDyyM@@B5m@*6SMuO|>Ky2#(yLMQ0QdC{1LWb?UI?3~FmR>hGa;yWL+b7Vo%s)^`x^ zAqKx7lZ51PrWQ0my4`MH15$5$B<%Hiy`#}+bP2H&w5=M~d+i@^o$er}c*|}9b2S(Y z9KEq1+*x1GeWsAno@v!XSgE00000NkvXXu0mjfi#-mj literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-selection-on.png new file mode 100644 index 0000000000000000000000000000000000000000..c71ae654d30ac0d160edb0602b8d5361a771ecbf GIT binary patch literal 385 zcmV-{0e=38P)qoVT_jP04wK}i8mV6BPq1uPEG%kq;beuFMf zvWFLQ6i)JOW@o?sGCMOM+P2*p!*<6IA&vhhw5OgXgrMy9fdgOy2w$WXA*<^;OOnL*Jnt5qSKrs=(9S+gMl9xuzXux4yidb1H1tT~_wO{%Ku6kON6hV#;G^yN5?*54 zDB60;czr{-P^$<*5Zq|jSwQg+>OTuE)Z}@-Lb0dp&Y&x$q;A!Uz$bedhT)`a=VWuwi43^}guGTH zP$*EyO98LODT*c~Mw?6&4hz5{5Cf(qHA<$7 zIR5|xxRyvMght4`DijLua=F~+L?ZDv91fG*)Yk9!jdr_zP^;CxmdoWI2y_7`q$EOA zVl|)7zb_VxyOBs_d1@AdqiLF#rBdl*rBeBh*XK})%Xn*29^z81WV6{XP-WS&tdO5z zOvdIM0OxWT)o>dJt;XZ=Ey(PC=S!QhIS0@NxSwuKA{4>fCG4e_k41>FIS0VG93~NB zU#!=2EUm-Ir^e06b%c`$4Rep1P$rZ422UQ_D@O$H#yp0^8jZ#$*HF%_>|u!z{WLcr z^qm67z$Gw=@sz$1;xW-Gb|0aT5a0yfhrpQ<<>8LkcrAUP=rsu;Q;aZPrzw1(=s7l_ zYPGr}Mi{emRzicvI`Sj@#eWx)Laf5QPN#E)vcVJLyFsmM1ZCD$D!xRB38<^<`e7=S z+VGtX0=8N$9*z#6Bs(P!U=TO&UsUCqVHjO5ou7d6U4*W34tp*{<7 zx;>41h5P0YpaZ{v-)w`BBb`Wlh?|Xa9s&H#ixdfRgU>>UC5MEVUWF;O99)Dw2h l`qjQu4G4Kj8YtwY(0_7Pa{TqP literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-word-off.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf69c0382b67e78afa1c8853e2d606263d0088f GIT binary patch literal 332 zcmV-S0ki&zP)nouAyJNhAd*tPq-lDh?`wH%TgFW|Ns{+4439w&$Z;IM|C%XI z-%+0D+bD_-aU4tP&rQ?3L1fFoXc6t;LkO{T9EVj^^;y^T6_70hv%xzm%kn~^{V)uD z+qQy$J0M#IM(>F3<<;{%=KFp?g}0(8^h>p65b4Y2oJUHeT9#$3>pC#ZmH{$F%ynI? z&&DL0%}ovkTBJe~SdN!-2+(U$-}g-YF*G$tvt?lPU!#Q`7L6XS+m`*{rpTy&e)xNq e=WAybtBD@9C|$|YN1A{D00004;chuhzA>$BAhXmZY7Ka##gsRnQvrs5}Co(5w4Ov4+X6Exba5MZ! zO^f4LiSJN8pT8wVPD-VcRR(0J-S>LE%h70b&H+NJ#c>=_p=Psroy+B}KnBWC&0zn} z!C>&Q-|zpXvG_&S;+PDqNQg*$DHe-X8Eir!Q?hSF<`+#tNIWtv4mr5Rj;!5opOQLf zB)vf))7xPQb-Ud=0zFU{$!Kv*gl&uvIc`wIAVb&P5+eIJ91icvXA6nJfz{%?FtH;e zWj>HXo;ozgF+F<7V4}qZVd6DJH|xEt&Ia(d)9K7{(@@~BhR~tf=9MneV%_Iu`x5r&Sk~Ru!V`oi^b3!~1<;Nzr?e!Kyg7r6S8Vi_mS z(vIpq(R90>=Uqin^cctS2lC_pIPMn{)qk7%zJG1o_MNWllRVGANf_K4d@G0gD;e2cAmd0w7%zL@ zFpLXaM=8s4l_bd%*e`${nT!)6^igS9nB+VR!?~tuqlQ6%eVxJ`baCi?;qyGv2$K-F z&i)X=P{REY8ql>`jNViw;hGknNTnrrn2c*$SZLWHBwn?QV@4aWQph45oyHfuS2=!pXrufP^+3nr^QC2gJnPq-zr=5}VGN z4i37Nm=2I?6s=I{0sel+-Su(zD81)k2fpOTyLSRhtcSMOSL0gN6S z(){xnXl#ZMlwxOrC@^2CRC4)z{#i1ae1iK;cS_W2!tmfK-qbGz6!)OeXVS zdwcuE($dnpP3m+yU0gF`EqjimDo>2z5rm)`9GIE;LZR?@YisLOG#b6v@3U-%W*7#S zikWlxsyr*CGdKaAnc+*~xm<2#b93``BobK^#n7+Y?Ov$6ATpK;?;--OMg&=m4rb*-o9&>{f(YxQ*Z| zySux4*j;nDzSN4v;xZgg0M?yv9^U&~_5yc?BB4+y?#_^mh&lcNp47~c3U9n1Yo`QK zsni@!VV=}iF}4n7M_1snElEwxP#_o#&R#J)3>F5s!*oR+V|Yvyq(O}CLlC+AB2eLt zT?Jc^>3~9GaF6Oq6RJE}Tw4&InWDsYAtOlURC$t6uI5S)l??q0&#g+#P+!+|!$*dA zQ1W|PmFL!C-iv~I5On545L*aEf##bxwouKJ+B%1L(A@_f0VyB`$c!!H82AX(0oIUT z-VrtezZN_uW{CZYUAzvQ0{l>u89&Uv0t{$>52^Az@x=_8EdU;IfMR$rvvW+csj_Ww zWQOSPi-!y`j>p92%0rGPFNJV4w=+h!v5;8<3~1MaZyp3)-tFCQ{a^RY%C)koph?T| Y7tGbBk1u2A4FCWD07*qoM6N<$g0Rb-vH$=8 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-off.png new file mode 100644 index 0000000000000000000000000000000000000000..b9facd8c2023e3d46f2a5a7840d476f9134ca92b GIT binary patch literal 502 zcmV$noL3Ihb6hXJHDqj2tymzWhf-d4E z)3MU^e1pk0e}Eu;@a}uRchB=|@AH0)VHji)i(P~W)%YJF1}hSYsPTCGGnq^p*xzt2 zP3nS~AptF?+FgXre-d9KsxYzBit zYTdgHW~L4yih!wy9*<|6WmyG?C5wPp#P9c;$3!A=Vb!hOA(Tp`jwMMtBd)FBiI1h!x>!58;j#PfWZwxFu& zJuqKr(~k*thr?kXeu*~TSn3!*ym^Kp;1=xlX`1^m@HS zfrr)s0Yvioe3IYqr!>G*_hLb9+e7foF@wP{nwpxbAq>4ifoFU$s)d(y1f(o4FH2sp z7i_-L+1c42YEav*GI-{K(P-2FN)8VIzExIM){c#h6%G#%7nPQlUS=LKbjiud680Go z)&?~gt|bC=f-p+H6crWS>hA6yh0ai3UY@_dzyBqmt`mq}0=$HWsNFRn7&%Ji;l!1y zs;b`O@;78MEVE9h^A*ll2+gENXp3>JI&`Y5DvL0ZwX(7z?_ly)S66?>#p=ZBecq|5 zsX4+>IN+hc>XP_(+dvZ&6GxynDMGb3;#@whtE;QY$jHz$WP}C~p;gDWfuJ=y|ALAo zw1Yzk&uIX(Le}yO75PTlBRa+fgd{x)1()D@8{{w~oeGsuL@S43Ig!~8m^<_i#8XpK z^B{U}^tEaqDl029xZQ3il-5%*T`z)&RLni}46BeykNy+N&(FU$I5_wO`xYYiMxU#C z2uI zli1kQ)WrC&b2|VmtfYvf=c^;3Aq0Ym1B8G{j-~B7q;FhdMes zUcf_N5f-^2qT(_E@EoPQ2sk&+9|OR|{2>fpv|gLd_ACJw`BouNNlD3~)oQ&8Lmoo$ zbpX%E`NEvxHHB;ZOoc~Vo12@*69p1B#<1c84u|9T$jHbegw4Y6u<|&VUxWd0AT2Ge zZD?rdE~cj-F+VYQzi7k)Vy>761_n$mEiD)4=jZJRPYLFN0GouT-d0ppJZ*1p|AINb zqZT0vjaWcbPN-~%sK2o3{edJ5107O4K=MBPq(Y1kr7{^B{=;A=_Ct1L#0#_|#^O;T ktg?7+-iB5JBLDyZ07*qoM6N<$f-y8A^Z)<= literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on.png new file mode 100644 index 0000000000000000000000000000000000000000..5df3e461d5e4e557ac50e3433c560f893fddf51a GIT binary patch literal 588 zcmV-S0<-;zP)Hry771y{ zQKx9BDd+>W&y&v6{tw(8cg0CV5Bz!G_j#W8cklbZJEqs`8U7;%{sTgcp?)BSVW>VP ziRJ?I4t?S#B1R>2L4XXJOs1J+GP&b)I+u+`<0Q}XkM(-}FdPo=q5iCfF?t@M(UM3c zc0C@?y7E|QQmIt-B9X`r_O|3&KaZ>qhhs?;MMEl;I^{TSJDpCS)7s^71pt_mAvE>_ zjUZ+OK`;~wg`-ZVbDGIyinK<48haY~RaZFt24;eei7+aThK5EIUp7yKklGwNb_%DtqBE0S-=J{j6h`kFw}u$b7`&{8jx<+ a9}3_5T=w*ajmf|O0000BDL literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/icon-wrap-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..447dccfcd2af24ed5b200c3efc6422cdfd52dfbd GIT binary patch literal 1473 zcmV;y1wQ(TP)&7YvuRaE3hG7+ ziXvzyv=LJNJ z(2&HdfDN#6o}8R)Nl8gDFE1}2;5h(12mHVhaHdBrDnbewGd>UpB(=A!lfU|<2NeSpL+^;Wcm=$ZKR^z=8oySu+hO-+3t&r*R$ zf=f$F-!?Wj-h#mna7dlh7|LrCQoO?uIfsUZy0WvgKhoMOk2*B51FWtC%NgBm9%CqW2v<($5tprEm`vhrQ71-OS)q9Md^ISLC4YtGKj zjDUgI-QD%IwziIzl$3m3T3XuG+1YvL;Naj;yvG_-b#-+EM&=mzkc#FDsr5ffCUZP) z(>wf_kpBMuA7*A|e#Y}2yks07AAgE@u%)G?O4y{OrM-uF0`Mom8yF$cddOn4*-{Z2 zgTUhA;(hGC3M?vkFgZDSPYGez&T6%$;2lH8LrEnX53&A)OeT|6?V;`MZ4dO1fNdaL zAaMblY8&Pj-mz|J=8!HSY)UT@wB<%DfQIt&@-HxC06Z25`0J{AI@B#GLGk~NM0b6l#aVC=cVgvAVkY05dV$_cISP z1y}uKZ*R}%@pvAMj*iaxd_IzR2>byY0@unR=8hvTFYl&^Kb{ST5V-wEx7)o6JqfYD zVIuPYOl%5o7*Ea|p$%J*UEp`%3BX%+4DV?6MluhPP`tz8cw0@Vx3~As?CdOyp1R7$ z;+f&)NFfP&fY+bN%iBj1Y&}GOMADj~Maag!MuZFFDaf!AGbtYf>}xFOe^SwYOkyr1 zR9jp7As*-zlHu<`fL_yW(CG4u67B?%i~)LxK%$%Mb~{hZDopn?7oO$hju53w8#CC1MMjA64WirIQh%(briQJ9$Qg#nUQ|?6rncGN-`|3s2O$)1t)(;(yFT0ryHpvO=aG8QeKZhL-yeijLBt*fj14E+y17a<@Q znwy*ZsjshZ7%!Rh|A~++WK2pXEkl(JyoIpkR8>`dkei!(BOxInktA3sH#ax8rl+Ux zt*x!GB>V!b18hY!n|QptR3Zq`TKS(@FeRxBAQND>X9w7hkTk=>A}A{HCgvpb9DI2( zq7qrixDjs&t1jyZH)jZ0R~!I|k`Vvc)UyhclowzP()>^1ovuhd#8vPTKT7ad!v2RK z86JXq5+x~;AUMBP&4GP{Xc7{Z3NcX-Nk-gE79e_q;GC%yb^XEmu;>yJhA(Oqr+rc1 b)BVohyq>)~Zw84Z00000NkvXXu0mjf9T~Gm literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..762e5a7df5369eeccd8a0a15c00f30f51fc97053 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~g!3HGv?z=Y!NY#3}IEHA5Cja^W-=0~ufpyhP zNsrx(8|?&&9gY?R&TkaD-cTVf@ISR>*8$-ZhU`f}2Q(Kv%Jm75RhaF`TBX2iz|3JO zJ^NvTtpT&cKPAyW44Dm*3|t~X2URDqMd&m*O%d#H{HOFpcEVYOv(}9>7{$01%pw_{ fv2HSHHeqC#(=XQOxl-aI&>;+-u6{1-oD!M0oneEP)x-hOc}K zz_Qn>TvNMX9PL{Sz@BHxSusFH^;V#>Vt}dtcAI?6)mbsXm56-q^Xf-NpTCj4 sj97LmcQ}&`1zjbQJAq<`kLe2g*pBRO_@OUgY~bYkg=N!ON2ZJiA`|xWsvKjP$}qEq_r*b$L@vi` ziOdCsGn{g|0*<(Ca|)P}$ZVg`wBZ5cQEjsVPBjj1kp(BxS&{;#G$t{p2zgxeQ($9` fSk&;b@DjrbF0o#{Y?+@xhcI}$`njxgN@xNAk`X)G literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-dark-puck-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f22be620da803ef4395b973033828c3bd7f52fd GIT binary patch literal 305 zcmV-10nYx3P)DeiZ!k*cpqVZknc=Qi~~J zuvR_5rS2W&y}XszGJ48)`6^%Jx9n7BEpL=K$$)+d@L7K3A=@%18v=vD1IfA$Es!>& zlPS`Q?4iB-ez8DiRw`FxfhDI)4|X*cnEuTa9`fmGEN}=Q%*?=WL}6f_VK|~NFwZa? zQ5g8I8M4(%b$O3s2V0jOLk|Fz&JIdc2 z_>tw!j^4>^wX}%Rs|am!G6&PWst?Hh(XuU%hS=9qr-v4a!GyMC)fN|%ymJ`{ZSaEhLY|Bb~z zmG>|*iOKkAY6aasxbAFt!t)?r79EB1w-Gyx#18EADiz+qVCS`xkLee8gsqOj^HaTt n&$XD}c&T3ytS!B8TDiXLWSPc^&5Ff9=P-D>`njxgN@xNAsO>>n literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee8feefc991b16b56e68ee7437785d07c06f494 GIT binary patch literal 308 zcmV-40n7f0P)H*|TFirj){*TFeP2 zd-Z7`#<)b=5wS;X5o<(_Zs>eLoDdyG{Na;DKLvnq@UlS=TtYO`f_b&%nu5Oal5jFv zSOb~<3YUyksZ=ge?oY@Bju4It)k__~Fbc@!KCYYOB@%@btVQ?0(vEL@S zEA9|nuUay=pCUVqIP5%(1ZT1@15*e&eKZ9*NpkxB4Lkvr9ylA`^Qy`k&0N`S6m@O1TaS?83{1OUV;LQeny literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-puck-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7aebfa6caa9f714db52eca8f34a5bd5362e2134f GIT binary patch literal 316 zcmV-C0mJ@@P)v6i3Q!p|jQ21X;A}5w`qIN-wC99&sp&woMW&$l z&}@+@=sh%BWD5SPhn#Ayp**r=PO{ce9tq^UZH;?rkiZEa)sCe>tf{3Ziv$cefe~M8 zpww{CzcU&Z+0B6;!|>*eJ|j8R;vkAw5thlTh=Sq02J+>SNF^_UNbeWZWH>WnsMCl5 O0000oPzNH literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2ca6ef7a76733335c7a82d920f589bfda7d368 GIT binary patch literal 243 zcmV5oW zF%E&k&24e%G%C*a3kXlSC3%g0W1s&(bYc~EG1b@CXgZT@h8ZS<6v*T55axk zXIkrqb6!DMB!mv<^Rg^s*LA-jFvc`WsT#$E5Rd%6@5(t>7e%<|8w7ctS4i*(#zVS* z;BDI~^e%yv61`ONsJK>QXcrOyb|{sK9~BsbQutd?mgS6Qm@6eA*n7{wOt)YdhOup1 twytaP74T9XH4$U2W&G`bkj1(FT~F?DKe7bcNKgO(002ovPDHLkV1nsTV_X0L literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5bb0710ea9efddeda1cedf73350d31c45dc0a5 GIT binary patch literal 479 zcmV<50U-W~P)_#JkQI@vfNl} zSJUaVYU15y3Fh;82=F5=5_dijP=@PmGMVJ!Tm>-lIF6qgb-&+t!Z37bkqN>6$s%&+ za5y-5p4XPy*lxEkk_j!ra5x-;!I0P(b2hQ4WdIUTmSq%SPFzc3bQ173a~cY;Y^UDut~x}_=zLh9o@~ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/overlay-scrollbar-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3ff15c7804de01fb73be7a697edf4a87177771 GIT binary patch literal 465 zcmV;?0WSWDP)X%qhn5(ZY#1TGc}FG-SV5Cmi2_f@ag3rISi=biffeqL48ZnN2J z=ks~p^u^khS6(icQ5c3Z*L4*jn6x&M*N_w}-|zQdX_}TzsLc?WjYgwcUDqm#B4;=p zI*<}X**Skx4F-c5!9HkSWNK>|$MKY|rI3+Q%48;^1I&S7gTU+cdMa(8TOc`%vB6nE zZyNvuh(XXv)5Zc35r=HtG?Z&$6U%+*7D&3OCo;HU*f(Gw3FN)I!O9e5Adsp~k`CaFFM%y09@m(#Qg-o&MmUEX#kh#0?loP0jeU0=3p# z>MJ>n^E|gsYzz>B6-B{k0qyju$978MwlXdj;{+(}Ni-_A- z)2Vjkz=2Qy?c1E#)Ob=I7`a$Aw{$qYjga-e#!#`o~n4)cUR4;yis{3yZM*ztnRx-}P-3(+Uc8VVTvj;Co!+_xPeM$EMFzH1>An z2<~0Fd5-$6oUPxDFUm9gF59weUvWpu*WbE(avhIJY?ZcaFZeA!-ORoIFPj)U&`t(V LS3j3^P6*zXz%y*)-BgqY;T@a;Z28>t zZGN6qL9G9@#>-bX@4DMkD8K^Zt3~v87=+0tGTh2*sD3EMD)x>ok26@ESEW&90?Q-@ z&LcLBd-}uY=Q|3W@Rjg$$X=UX-@48C|Ma%GOtUH(mnyZLc_Db*59Cl!S3j3^P6<=RU%553bR(L)v#*K_^%Zrd<9~Z+EFE%UiImmLU@&+OIjqw4`~5d1_!P1U5oOBiq1)}=r)m03mLW%9 zhYhy!xx-gyrH>Wc$i|Gu2c#|GP&g4{;ZnE|(616k&a3b!B*Lda3#W?jMp2dMK!;4z zW8qAI@JN7&>F$P^Ruea}^Z*fq6oL%$D!_+l zV$=>*vhy>v`@;zmNKL1$lWJnFT{^L$THIA#MK*&7L|cr6imWP2%qPPZ-};Kw%Pjvt z!IAQ8}4!5~h-=b~CF2&jz(KmuY1Ea;R@lF5$002ovPDHLkV1lw_2EYIS literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e6cd417d6a428d79cb4fcea3ebcd2e3bd5eec243 GIT binary patch literal 1193 zcmV;a1XlZrP)6orW$s%C)zDN?1ZA{15Sr?6zhuVKZ{VbLv{{)H@{2vC!v2&th(37~e71ji2N zd-gH+jo*8oaT0?Xu5>f=X6~GG&)o6Yc`IjUXV;>w$n@NkUze}RZ^&Jq zr8{*|a!Yxyt|0yFxu{Jq!YSpwx)mz@a2A!JBe<0J>Q<=qw&~dPqN!5e>(RDerQBIu}VL}z&hzo{ z@rPXS^TxpiC)~MM*@Co7Zva0yIM~SrKX2UO;o&ZvaOYxW3(_wA4(QI#&dZaNllQp< zi^jpRySw|6_2Pb>i_;}2{%1)4Z|&4mfseMgx1U_5D6rue3I38du@Q=M3-ZDd|3Utv{DIyp+|lc${?^vk-SzeLt+lna+ZrQgVbjqX9335f(2@RA zm3g6!<2}Y}0X~-VVv&o13kl~v9q%}1UNp7|;>AIK;;A4+-IM(erO|&iBvqpX9gXIams7HFo`@{2%!r^1tNfGk^U!DIm43BqE6W zCZL6wD;x|v$CT>kz8Z?S@pUi9D{?t5whEcGEEh30@#%7cJ!Kcr-`OQPi_fyrEIwFx4^ivc1r+9ol?MKS&yX?U)& z)`B8_tP-3t#(6b@cL`#F7n=-W-gV}@dr?q~0mJe1G1l24zBzo%Xx+Cc$9w%u+a<`v z1~DNZjPZ;R$b8gdby6V;t69Vc%kE8zEpyJpZ4Jy1je^3(K%A5J8Uw}zEX38BCnm*e z!UW%yF&A-_HC+fyGzuCo8Lta{Krxdeg0UtsiwXkU$-DKKd1+g1=BH1LoLt`w#hrJ* zO-Qa7Q^iDMA3^ci{l@FsV4Z>pN<>vd3@7gK*wW8262)Tc%ut-o` z=zdZ?4=>!7B;Q1GZb40;UvrF`>VIY51%2z~{9d7Ny+WS>7!;Q^#r_K@00000NkvXX Hu0mjf@2yMw literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ba57bba5d671670269bd203fd1b53498453e01 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XKYJzX3_IAoJULPGxhe|VUkEk!{= z;lKeVp@j5wcQN+OGYwo8FfH+Jc>Ck$XZ5bmIdkUlFzlPm-g~T{B@C#Y!PC{xWt~$( F69E0%A&dY3 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..753e68f9a03e5df7325a2a4a7746a0f99f217c62 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kXHOT$5Dn4fkdTl+=NVY!?P?eT zEgBmd7$W*OmvhMo=@=B2m6b^d>-%ovT`cvXO+7?Nj^Doi-;vexCQlaD@h{rI#9&#^ VKGP(6>wKVb44$rjF6*2Ung9j!A>#l5 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-row.png new file mode 100644 index 0000000000000000000000000000000000000000..6caef9dab7a4253da5caf4cc11531089c40bf4f7 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XI?JY5_^IAoJULPGxNYiOKk;JLTI z{`>(Zp&$SLT5qzLakfQ~NmL=0Dd%{ SdT|(N6oaR$pUXO@geCx`E+#<$ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix.png new file mode 100644 index 0000000000000000000000000000000000000000..5f108067d115f08caedf1c3711d1d2f7804ebc08 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6MV3!3HFEy?b;CNJVBM9VeoYIb6Mw<&;$VQ9xUDf literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections-fix@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3632e343de22395a0fd3383227c9681ef6547d27 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^azGrx!3HEB8M5QvdU2CQR#%2) zR`0ZWf;OT6jg|V$l^T-R{N9I;JhYmJumq>bgZ{tJ~>ED>N59 zU11s}=I$$~>%JC;5&zbhowuyFl2NVQcF6Nx@ z-1C3to-W0?t~V0JZoZ0URXcp@@~MdI*txIY$$UGT^q{cNLvbtX4imGPS`MpP-pB;a z_7PPGbt>aq>AQ?;f|jCn`xUidR*$I@<~nChUg>20a&g&~=gB?y)%z{e-~3O#e{i$s zvEY-p^m&=Jk54I6@U7HRTq3%43v=eFV9t2fO0G=yX_7yIE@SX?^>bP0l+XkKB9lvC literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/quick-panel-sections@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..184c5122bdf40164ba60f5ed21acb150c3fd7792 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^7C@ZG!3HFY0xx`FU|&eY}@aTqexT=NG>qiSY_4;hd60X|wfPK>yuIpD;+Uy4gF@vY8pUXO@ GgeCyIX_7Pm literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..70abafa5f8a4839036b4c51e6b764e1755900ebc GIT binary patch literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^KsHkZ2OE$T{klAZfq^l})5S5Qg7NKzg}et01dd+V z(tPKiHQSamCxQ|>n%B&Cem`?&zU;kw)qC5e_gS|bQj!Z!>}KccuJCEqmDA99WGK3= pV!?)v;~_U5HI7PR2?V`Qe+pDNeti=@_Xrs144$rjF6*2UngC*UrWF7H literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..68c131546e1dca1e69fdd1beafb78c2732d90452 GIT binary patch literal 1284 zcmeAS@N?(olHy`uVBq!ia0vp^A`A>H8#vg2tl!>Q&w!lMo-U3d6^w5$EaW}lz;pD% zw&s-oviw^v83w<0XgthQcVKt=v%P$GqO$8N`TiX0mTPi$ZR_G)%yV#|lJn8Fz_teg z6Bi~O)^ILZaUx)2;uJ-TkdzfS3{DBiXc>j%NThP`iArjj^%$|VckzfyyGf2}9}T+E kWHXv&s9s$B%m2Z+?kn%A*<{9 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..53a5a67f6a8f1e1fe95ebaafa8217eb61b96c6f5 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTn!3HE+s}|F17GWK-i2T)@z(mAP=PSlXo{@BQc5{A`w6#_+>ibJOP86L$a&VDNPH Kb6Mw<&;$S)4<^h2 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/sidebar-row-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4be24fdd8b1855ee0936baeb12eddee4149d3037 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^Ahrev8<0F6mfZlPf<0XvLo5W7dwP2QoONJHP;%mp z;5>bOeSBm`pwFJp|NsB1A9G+^2$QgF z+orr8EhK!6?-WJp5`Vicv(9ES0;c}zgeL%1RRNXjl0w(Z3r}E^rs+!4G~Pe@KFcz~ zd}F{p0X(_C-ELR&`5Z)1Wd2b#^#bM~OrHVwQ$Pk9L%gH4VHkkpI2sX3oaZ_0b~|du z-^Y+K;vS+~v|Tg%nfen)`W-R;eu&OYGANvX2L=J08#FnAFFm%u{xUCYbN~PV07*qo IM6N<$g8d<}NB{r; literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4de61745401fe4077848feb79c68e51db43c7e GIT binary patch literal 884 zcmV-)1B?8LP)#c!sRlukyyZooO0f?u{R??)TGNM=(*B&5rg>=6rhlUlicktt`~gXj zilD@VB#4O`W6zoF23J?34=uauh1r?A^Wi<`-q|~&qt$B3IE!A!Mz{<+X3uKHZ82=b0hT=i7k~CmU4khhyIQ9_C5|E1h*u0swXogP*%xE{VtE5{tz;=UQ6N<#LkEW~JF|(#~%nVcpDN zQv#Njmfj-d-+MeBNhXsL3FMbOe)-8X_thu}u@Dn7!U8cC3WchU%Rqqsl6AdaS0uE*vum4CpgS`h4)er#Ck6t@ z4Dx>wOg*@~ycDn3dpFR|4HCd8fD|&BOm6}-kZIIw=jZ1t|7-7TT@ecfBoLcH3=yF9 zd`G=jEEZ*MZq6{+u1cv?Ql{e^u-}Qn^dyK2&~LDnK;E={6r7x#2u^^+oyBqZ_Egly zf>{Kx`xD9*&(r)4`2GI2DfVgd3_uJNcz;VZIv%DGz%lUtE+)O?tuGplsz`v|G2NOf zKX~+fKA%@#f9PKj1t~LYdlJCG$Ot>AQf%`I%p)bEftL-dk-;>_)J?DB*sHF_v>URE z(BHUic0cTlFt7p6>p@#x$bg z2SR>Nx4mCIFaiA*v2&l}*hVvKSB~62=F!uZa0000< KMNUMnLSTYubesJE literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-puck-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5401ecf87bf404d9494d3eb3378363ee450ff3 GIT binary patch literal 408 zcmV;J0cZY+P)_7$w8(-W+}+-j zQ5F=_pGmU>W8b3vO0X7j{gM8j%K8@W-$F|LkmI=7W-ZfGCRNm|>r$ zE!G;6lCL&L*coYUzI- z#w%Y3)hjD2vg$^oK^GSne-sS^fDVAgVo^c8W+pzGKv+LRF8&IEi;Igw{mID*U0zt3l<05I z(b5e@S(T`?0YLwsYPFigjEoo?UD2F98+~OA?yyO&-iwf81F!`@?skj&=;-J`+km#- z!NGx++EgVfjR3gtcXr-6Iyxfmb`v`00O2~&wr{uFaNp+mAEr1XfFR&KWT8-ytw<)5 zHYnm4i=h({|w4@7fp`z_koFe9-SJxMBMK b;U2&*CpAj>uB9xf00000NkvXXu0mjf=Ouzx literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdedde3138a55be728539d09dea35b6dd674578 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^{2)YwSD0$}Dk<`FT!P&N3HchKbHhqQ%qI Ro&XJE@O1TaS?83{1OU4`C7u8P literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-corner@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..919474b2152159750f1b115e04e98b1a972ca9f7 GIT binary patch literal 237 zcmVb2Z_Fh?(Ma5(za6-SOMcg(ieR$2Gk7Yz|{gd@z5rygpx(`$)g7 zwb8$gyA)myq^q^{h>@d|n27E?r~f7At|Tle@Z_r+Y9^mG_9O=F4D!8+XOK4&OSf3H zszJ&&Z99paHxuI!Qsm9V5SAkECdL6qt(tIms7Fb$|0hNyhHOjAsfAii_}f)o%DGyo n)r9qO%y*g9gLA$-)F`wQ*TE(?clqw_00000NkvXXu0mjf(FSO3 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..a57c13fab77560a75e05ba91a4c9902b518e1ddd GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^{2FVdQ&MBb@0O|ZTn*aa+ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..1c958be9c6dc48304282fd68669543bffeb57e2e GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^{2@{p8rK)2o-8%PFK)~^Cs-sH?z=K>3tg%>52%^J)78&qol`;+ E0Jp#&O8@`> literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/standard-scrollbar-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f560c3f077de919a47ba79db0d188a2ac48af5aa GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3>7Fi*As)PMFFA4@P~c&4nCu)k z@qhhhGscB)j$XditewI0f~$Gj%<~oQE+LX>*NWekZ$0-|^30EK@9zD)x4kan%Ll`f z!0uUU3(mVPKAI4?m}9NDX|GtbYp>FlxGN@6JYuF@7k>R-p`O9QcwO-KB}t%_44$rj JF6*2UngBoLK5hU2 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background.png new file mode 100644 index 0000000000000000000000000000000000000000..4eab5f39af6f75cacac5f3f1297f6ce97d5caad5 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTr!3HEbbi*zHDHBf@#}En0v|PWv?wx(B>em@f7pX9YQ>TZiyE)`bu%zBY>rdi!g(akAE=+f)78&q Iol`;+08N1+lK=n! literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/status-bar-background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d8126c8404d040ba411c8de475615edfb4371b90 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr$%8<31St~m`z`FXlHhFAzDU%7nw_jw1F1SKcl z2+r;uJ1hdTI?X?ReSQ6k>BNlHona?F{kIQ1c*0>z=aq1ahCG?AQu$1Bz1go=&Y$o} jb6Gx*k!Rk*2W||Xt5qNTHkx(>XflJRtDnm{r-UW|TmLca literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active.png new file mode 100644 index 0000000000000000000000000000000000000000..72fd2e9f330421831f644f0e867c32aeb094a0cf GIT binary patch literal 309 zcmV-50m}Y~P)X1^@s6IQ*`u0002|NklGlGMDszJ#<) zDFuu%QI_Q+%QD!qx~_w^ZO=Madh3KZjzLPf{`KMuApi-?IvHoLwG?1E__-F1AFseF z0i{!ku5vJDm9Qn5Vk`w1qyVab#w`K_QvfBPdy8O?f`1PHeyoXy%)!@s!03o>*e^LJ z{h;zZ&o7?m!935)T`(j4&LRe}X_{u3i^)Y8hPNn+uDOKIp-!`Xreo-s!9bx z07;U-FbpR6(dttH@qORJIF7)~^{wk#yY2_oup&v*G)oVjnP|J(@yt)q00000NkvXX Hu0mjfhMtAI literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-active@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7829925066817412b518b319b80dda3cf0bc93 GIT binary patch literal 578 zcmV-I0=@l-P)rb~6rw!OzwkaDj}a;x^Z8t1&1SQN9=61Lz=Wq}9o~E$_h2wkpEjF~ zF6E~AcDt?eSb^(B&J}Q8fYt(*ikp<*tB%?Nsv#Ym-PZE7OUvyIvUsvV2 z+BTVKy>kVe7w{Yw&?%`Tk7cjdi{Z8BU4$|DcS~O|24jv!Bb=0i5}d;Oc>tr|@Auy^ z*=n^A#QA(y@tzxFFlHRb;DGXqyFm{juHkU_k|fCo6_inuD&lxNiqq*tpX~>Bjthn0 z)RmrdLi=2=*ISCRL9)M2CX<3lLH-s+k>F$6{eCZ4LfaCsJ_rJ}q1|pLXj56I(<#z4 zT{fG|rKHpG%W*j|Adx&0zV8c=9}en3+m`!x9dN@iRBA33i$AzNdI5yEy4|jdkiIH% zQ~@m50FErn#A>yI66%uI5*I~LV)u_2P+>Zqs_tj}%m2o26dy$nivO^`0fMUYKByGT QssI2007*qoM6N<$g0(vdZU6uP literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..0d37ca32802e5779205ff789826f163910c8c55b GIT binary patch literal 544 zcmV+*0^j|KP)3KpzS&lB68S2E;^30!g7oB`CP8O{;d%!etRuZXys{g%E9~ zh5dm3fQy7ym9z=WQ9Czsn2|QogUfw$?>Xn5`-bcH`|Ll*I!xv`ZVa_4gdM>lXu>C= ziDB=^rehKSc`6tT&V@puO;HpVY&P3Or_*_DwOSALdcBPPBSe};1zmt9r_<@xKp=4F zbUL|iw>yd&b2uCxh%I|O9>weR?xA*RbYdB($+A4}_xq2~JVW?+o`1GjEX-=PHsE5q z*Xx~ApKt>XWnBQaw=s>?YBjY`D7->s2?F;JSSl8aZB7Znra+%QcxwrFIEKWH@25SZp74Q4j=1 zxL*Ze_l0)G^ahNi!Ig0LA&-N!hE<+%XN3Dz0L5Fp{71Q5&Sf&0b|R6GOQq74q9}{m zZ1$~EsqCQNCY(_~e*;WCfZg?IG@5g}-Bk!2*XNP)%E-N48&pqo-~S!!V@!5OKFmRdn6@exh>eYYNa<4t1PO*cL8=bn4c|9}7YKhC)^ zgu`L!a}ML@bWY#Ni4rgv3})!sAr?py!~kLXC?QAyvW|@Iz$&aqVJ7HqXi;Sv?CM>Nv9In z*w}b9J3IT^&d$yubXG1R5tYDc+OJkrR20?J)J$b&W|o-EW(m4#(vClM27MqEN5k9rMAFt^X~3$ z8IC-3NFo%@kB*LH?0KLPUR+$fyScgf2MGehNi3{8Xdi9p2$YtV7O>$M86ti$F)=X% z!!iJ>N020#3BFP=mwS7A>74Jzxw*MAuh%<;Oso-uSirPJbIvs#f$HjN7iwx@no)u) z0|Ntn0AdqFkYHILB68I^bjp!>lPt?Wpcfp(AePJJa?@F~p}Prj&cCH0h23ql*&0DY z8Xq6`BHA*5JSR|BSC=dR5jnG?I`8lASAgNB{rhD}%FD~UDRj?2bs1pY1OYzTP=$qs zje~=OeTe4dJOJN8G>mM8K~%}l&v%PcA#jKp&5moj48UOy8;iohCnIq<9E~$GGq17K zt8Qq16h$#kPfz!uByQ@nIYsn*2caB|dc;(h0T={nq!mU)0q9F%jkyt`Hs;XKPzd^K z%og>uwwyB)v4)NSFkcA(;?tNBAbVn&FmzC`)a5kL)nFnG%d4h{}pjE#*wqEo!{Pl)P# zbaYfbYCIj7Ye}%!{1;D9%(mB@& zPT|~cw>M5sPWC~^gtB;Zb8~NT9c5T1RxIaSkNSUr8$O@!GE(;#DYUbmhlht-c(>vG z>~5eQh^qe)*e^)?796WO_-L(T?G~c{pL(%IOae3@2>||ya$Kcj?Vw{0)>%6z5jbB4 z;kxGL=2cZG&X2AKw7LY?-QBG~WC}pv(h-j)$%qngF33@by0l5eIeo>=fR+qCv)RbR zZA9#X!)w?RpV%!#{S4&(#+t98q2Z0z?xK0Z1TF&l)cv?6_*Br3vHL>cO9tKn+!g8u TLz?t{00000NkvXXu0mjfaw27S literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..865956a08cb943d16d8b9a66763cac2e0b063af5 GIT binary patch literal 412 zcmV;N0b~A&P)$mc-jBeO9K04mmyl9Dn7(tIF=Kw3~iLBSj(j;s;J zW`Qw4G*A&+K|w*5u&{8zrcImDfc(q0wzekj?(VbRym_+{$S($l*>4m*$bmR*+B6;@ z{~}O<()aJ*AD=yYw#CH6q?wbGQw%76_1CXoriF!t-*FlMl9)4Rj?BM*{|*CfQvmTn z0I2yoD=VvgVq)TJhzNqj2!qtr)UQX59BBh;U;x_80HptK-@d&$DJkhELK}jG5e6 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-inactive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0e711454fdbf73cd671e87aa7b3ba5a60d0fd656 GIT binary patch literal 787 zcmV+u1MK{XP)0_F5cT;Hku<@&XsaO=1fd^vk*)v1omNQ~N+C9;1_Bl=sI=IHgf2u#sEDN56ynFK z|Dfv6cd7j|JUJ&?y zGN34mTd!V>_*{>n80i88euRU|&~x~=uLt28K2KmA(BJU+$vq>Y`ve+zFc^G>fXmbM zmDn2i)MpiI{}l(xLP`LE?h$l%cQ+mg1U}PpeVK#?o=&Gz@HyJv-VVWsB<{lMitZES za=DK#m+OtiVlj=!V^gQoIVhLQ$B29mJ9_{Az4#Ys=8h|DK%TzW{;1wcG7| zzB5zKbW^8f#%E_|?-Pl{sTSC%mA0W41fXKbtgNg&AmC*s8K~Lmbl!*ml@`^`%d9Q| z4ZKh&q}JEhMYWTF-EJ4k-^_&1=SyX?+4!s^qyzxYLF6E~*XxZFlwc@GW>qR1wPq_7Ke4Ee*z61xhJ~+=yGe8GQtJQh|a|C@E3WfgJ=gnp_3Gfnl zJO}t!o--skAZEOtZ8RDWZ^P$$3_}?(bdwu8No(MSF=slqAh5{5A_H^Jz#j$fb>r}# Rr#Jur002ovPDHLkV1k7mYqJ0V literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf06333b704f56ea9f1ded55737ec62da8766d2 GIT binary patch literal 552 zcmV+@0@wYCP)HkL5sz*Y_r*t(49*=kqv2HuXoYma2z6d0$Wh2R86^D&cN4kp6mDf zrxYjMFo(PdaJgJN5HpoZ}=~Cm4-JUaeMZ1wkmH z&FxGka|NM*JsSuF)_9&jMw|nXmjc8Nv|6nh6&MW95{X3iNJPmGXxq=kuph zsn>G3yo*7$0l1L@#2Mhz{(vr;NF;8Ddh#Oxx+oM1vk>p$FI)k@3cwTo#%tUi#N+Wt q(n!}YfHXMHUi^&Xi2u?|4EO}GxvnP|<~g7M0000$7j8;74!98C8YNAA_3mP6&~9wCPU~jq zP`i*qp>*j`7+e(<$}qInF^Do&P=`1*n)LfF_c)37-WaBf+021I=iYPv|NFlGKaU$z zJRX-`Wi!7@a&l*;E5Kwj+2C6av%@lACK$^{i@_qWFe-YAKJ8|@ZV5n4kuDeokTg}J z7z%g{-1Ah9VlJfskmtkk9hkYYvNEr>w)VrKqM{Eh7K})ABGgFF0 zBGU2k@#EFiRp0vhdKfqx@G)GD7fA3-XfBV(Q{LR%e7B&WKq1H6LzG^kv56|M=NJW` zJ+#~H5(K+iT3Qx~fidnM!=@1cKpWP%ps}&>3uOJK)oPVuu~=|yZ0tR(caT}CWD2Or z9CLy3@$vUBE-t=ewHVvf)D$8XF^v>x1i-PpwYBw5PEO7Z2JPSC?E^Smjstg~k(Wo2dU!C>$y1aw~&A)Jiz;QK3ylX0efT$p4uL6kk|3n0WzzkDZrlzK1Al>1S<((knIL&7Y zGHQAP_C+9rSWd1dvJ3eA{>$BtDL3qLV~&oF29SM_{xmj{t5^rhfXV^ZAmFDEWv5%-?mml_8A)sQy`GfD1<2+S>YZWMt%X6^#CFTrie_ zfdLsO#t+{l5%3)khr{18mW^1%R9dU1xS6o2Zh}B&#_+CT-`CeC z7Z(?M)p_1@?Wl$j;mOO(v%zN?^A+?#B|^kZTL2yL1>`Na0YZsngM))IfU^N4BWo|# zRN0u^oP2gVo$bTJ!+zWW76_ikMby9#5;2HnM9y)|O(>jaXJ_9=`5xd1mGd?`Jw4sS zyOT#s>~8w<+@oU5l>Zg>K8` b*A@5=(;NS=GL$mc-jBeO9K04mmyl9Dn7(tIF=Kw3~iLBSj(j;s;J zW`Qw4G*A&+K|w*5u&{8zrcImDfc(q0wzekj?(VbRym_+{$S($l*>4m*$bmR*+B6;@ z{~}O<()aJ*AD=yYw#CH6q?wbGQw%76_1CXoriF!t-*FlMl9)4Rj?BM*{|*CfQvmTn z0I2yoD=VvgVq)TJhzNqj2!qtr)UQX59BBh;U;x_80HptK-@d&$DJkhELK}jG5e6 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0e711454fdbf73cd671e87aa7b3ba5a60d0fd656 GIT binary patch literal 787 zcmV+u1MK{XP)0_F5cT;Hku<@&XsaO=1fd^vk*)v1omNQ~N+C9;1_Bl=sI=IHgf2u#sEDN56ynFK z|Dfv6cd7j|JUJ&?y zGN34mTd!V>_*{>n80i88euRU|&~x~=uLt28K2KmA(BJU+$vq>Y`ve+zFc^G>fXmbM zmDn2i)MpiI{}l(xLP`LE?h$l%cQ+mg1U}PpeVK#?o=&Gz@HyJv-VVWsB<{lMitZES za=DK#m+OtiVlj=!V^gQoIVhLQ$B29mJ9_{Az4#Ys=8h|DK%TzW{;1wcG7| zzB5zKbW^8f#%E_|?-Pl{sTSC%mA0W41fXKbtgNg&AmC*s8K~Lmbl!*ml@`^`%d9Q| z4ZKh&q}JEhMYWTF-EJ4k-^_&1=SyX?+4!s^qyzxYLF6E~*XxZFlwc@GW>qR1wPq_7Ke4Ee*z61xhJ~+=yGe8GQtJQh|a|C@E3WfgJ=gnp_3Gfnl zJO}t!o--skAZEOtZ8RDWZ^P$$3_}?(bdwu8No(MSF=slqAh5{5A_H^Jz#j$fb>r}# Rr#Jur002ovPDHLkV1k7mYqJ0V literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..95003f0a7bf40ed452b79c5133faeb686b990ef6 GIT binary patch literal 286 zcmV+(0pb3MP)@~ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-dirty-inactive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aed1da123bd7995a13715fc67c804253d4f8aa81 GIT binary patch literal 606 zcmV-k0-^nhP)Ja~2i4jVA_e*D z^?mZLJVf8UF9Mf$;CSD=_q_9c_dEAog=w0;WtxAP;KcR_cnSpF96}*P4Dp-ri0%B0 z@%#gSM@M~ObY()f4FSH5%&Ty*0D=AdiF~gM*5^)ZDPV!GrPJxPd_I31kH`1I;qVqS z_WS*}Znyi`YPGI9oen~U&kYHs0!T>NGsR-DkV>V_LZML9@Avx%M5BV^@z^&Q489G+ zIBzza_n2;D{(BOj_|YMd1NcEUo4o+I2m}HXa618#7>!0GVYb`tQ;@jB+_M6EvaBpY zE|=Q?_*o6k|6W0HS0BT+Wcoe%Qz(N94!BQn!C=^N{@Gwhq z-n&wPWHPx&aHrkN#3V>dBog~_PBkhC#A2~6g41=4-{{6Fv!dN5(zC`oW|d-~6U!JK z0xxK@U8nj>FoH7|RfO;U88sY_9cOlM@PC^(qhMi5wW14y2 zycT5JwqnY%rkK$?88915Af;Tu{@e`sfWG0V&#_(xKy#L58>Lj?x~|e%zhIqV{|1o9 z5W)a?p0Cq1tsTb^U=l$PEWrl45Aank9&$NYQjM z;HQQ(it4^H0GJziRv4d_`BxgM`^o@t=7VKf7i=<Y6uixMA}PFpVC4n!f#OdH+E|LD5wW&O5xW$2f|b1~()a_!CILIaLQ-0bLLl1O zSR4vRKF*nt4HE8r7YNwg!e%dT-_Fd~_01{eB;*%2-5%=l}p|d%0Sz?pc;~9*@T}kx0ZK5eFR{kH^MfF!+Xm zi%zF=kMIlP-;)I4Cy0P8kna}?g-ejDXf!$_*Vq&>8jUEz?e%(R?RNVPv1h&i*D98v zR4T0(i^cOqBH>A{!RZR7Vs5!yenNaX0#Nf~kZ17rB+z`G>vTWEGe~&wOqvUd4&-vV z9g=%lKZi9djcJ;@^Lu{(MFHt_+9G)@CZ^6fcxLuTco0!>-6n5Fdv)jgVX_&gP7VBW z=HsFO)c+M7zD;0hPyi=N){}Dez9<01Z2)fbnn_K_?*aP-xgAX)t$(*QP6O-;#5PMo z0i1N>_tf!ejtwDAiCFK80ve6R2LMk%;-*q510|V|Yf=hfjC;&sF3)HJX%)YO8lc&1 z9)j!|w;@Y%-H@y~tsf4DHrzU?*Xy_XOprCO0D`qztu+vy;_(0?HnBP&XT#k=&{eHg z3;gCdGZ_mB(1(_}iaoGQGB2!9KDzs0IIk^ar3aK6>x-Y@qlmpdt6r4Z$#ALkL@#qqa;tBbNXJBNGb)$G<;H-ohW+*Ks}v>Fq!_ zfDt_wKGw+Hv_?Q=zIF_*DQoUz^Qef|Es_kQC8p1nE%g$hhVLaP8JWZ5r0T``uIFXS82F4!zk=)f10|JttshAPfQ*!vRtr zl*c5xP@O}y_vz=owH;@d2z=IovtRoOZe5gTtCfX@nLjCzCNYfEpb1E7f6-B{kOr#) zDMhuS8aMZUeI(z}5O{b!SI^Ea*dmh$QYKX%(u0a>Ng0sBwKtZ!bt3R?z%cr%RiJ!& zcG1idcsk=(ADPZe5y3plX9`P^abr#`0lQc%!6I;zWDcFcAR`lSVHXRf;E8V65*HPQv8od+aCO!d9wzql;j(HbGx&}jD22>BqZNmMx3)$a9bvt(D0k`Q01aBST ouJ3^(1e=s9A&@ALD3B=dAC(xh&wis#tpET307*qoM6N<$f`k@6zW@LL literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a28b8aca12e9ff2dc944648b96b2b10c6e3226 GIT binary patch literal 330 zcmV-Q0k!^#P)Dzs0IIk^ar3xdY@qlmpdt6r4Z$#ALkMS>qqbx_BbOipBNHFq!_ zfDt_wKGwqlST#lYxPg0||37 zu=BFl!gV1rFbrUb*tU{^>1QMZE5kJgcD7$&n( literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-highlight@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d53da887643e816ccff925cfe246535c2a2e57d GIT binary patch literal 711 zcmV;&0yzDNP)hOkV4T~1S@** zCU{jW1gaMgqEs4^=5Kd=FF$PzU1tMEEihvrW z2!#+y(!WSEK2SeCts6AIQ%6R0T#MVT=G7cT{OiH;R(qQWd@*2m#KsidxvVbabJHa&bymQpV36k==D|T=fMo+piF{6% zZtwp7MDpB9}^*8l!OwVyE1!mY9=ID6_dEeIFt2%!Wvs)xd?w^D-h@YXww9KmlF#TSOhFQ8zaBX6 zev_`_!wTBf6%;l%j?RQwgeSnpc9zbeZQX~A7wAU3N`Ha|v{#1L+=gncA-@^g^FFuH t2=q^l@olbwF@l|BDk2a?Ac{Z~fxj{qvDSCojUE61002ovPDHLkV1jl>M(h9p literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tab-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c4c7cfed171a6c7b250afba2e530f178a09105 GIT binary patch literal 215 zcmV;|04V>7P)X1^@s6IQ*`u0001<%GM4#RD|Qele*qJ@ya>(l+ta#eQK>#N^y)k zB{;@Ntu^U-*xq|$g0U1q2x0h_J7SI{(il)3aL&-gm`|z$OEO{$;Yr=Xu^Lt{R~P=6NoKe@FB$8{n{elt4RjD_D}blp4+7K!kp8X-fx{vt(5tY*86I#~KzcyUkeLhT>b|=Ig8=nF>kN@+jg){g zPisMiGdw^?0Ev}^$g@UDpjTmqRjQtE8tFG{E$!ulzCb|JB8!!0e1qE ilBiW`Yo5CTgTNO;CuF4xCT_U^0000X1^@s6IQ*`u00021NklJsPYBmsXS*_Xi z&+Fg+;6MESP2##scvuP}R$qLZSamaHx3yo~q9sw+zfS$1)T4Rvd+oe^HuIKgX7U^k zc$)OSW>Wv`Wha+UKW?x=bP?OGb>3S)+vHc*&Dx$j`_=KnJ8u`WIV40*yL)W0=Zg(h zSqs*^z9Q_Du($owg~X%xmv5+-KXJN&qXUYp8LJczh9*>Jy6y`pQGbxvkmsoRW!ky_ zLI)H#hc)cld~t5WZpQD<9=r+urECt5)_H7SAX4SsE_I+wm+{Kn-YVX$tX9lc%u^gz y@=sXm%=_SU8s~y{IVJVnt9FNHOe|DaV3toQ2#R=IP`m{g01Te4elF{r5}E*;#e=i} literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa87b5855ab1a65d9a8da200dcb798a48dc5bdc GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&7!3HGVO5{3#RIsOuV~B+0)(IQ=4g|2c3f3R~ zUqAJ(!o{+h?QAatX3u^skdr1ZyHu%Yi_57q^2{POhYuTe2)mdKI;Vst04nz`xc~qF literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/tabset-background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6999daded28e7bb8dd4f00523f056c017c4b6d GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^96)Tr!3HD`ljNvz=!kbez ReFj?0;OXk;vd$@?2>`E;LSp~` literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Dark/text-field.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f3ea3c1a6188f59cfc16a168ef366bed7e7964 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)h!3HFsG`&3vq&9iFIEHxezMbaC*P_7Vswq$w z*Rt61`NYMAg5^318Og%Oc@=|W1R^?oAJqPz9)Kj$PQ|50ZE=TToA<|=Iv(z2^=z7D jdv);|X@#Z}!us)d^40!q{1y5Y=z0cES3j3^P6;Ct);GKm^%`xxV0`7nJ z-%;l%>l3f~mc`I2HHR-^shRj + + + + author + Ian Hill + comment + A widget theme for the UI components of the Soda Light theme. + name + Soda Light - Widget Theme + settings + + + settings + + background + #FFFFFF + caret + #000000 + foreground + #000000 + invisibles + #E0E0E0 + selection + #b5d5ff + + + + + diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings new file mode 100644 index 0000000..5cf1379 --- /dev/null +++ b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/Widget - Soda Light.sublime-settings @@ -0,0 +1,4 @@ +{ + "color_scheme": "Packages/Theme - Soda/Soda Light/Widget - Soda Light.stTheme", + "draw_shadows": false +} diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/autocomplete-row-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f34dcea1ee3096b679e2b6b40fcfea9a3f4749be GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96&6yJ<4EZ!dXJSO{f%KL*`PtLn%y5H$z)RaeO1LjKJ z5vz~b+?n#?z5h3D#%u#4^NTs163#B+0`KG_HwIqN{P|J<=rjgTS3j3^P6KLZ*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=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}0000&NklP000;W1^@s654Bdt0003ENklcGPvbiTZK zU{uSpQ0g)Ov~7DTisEjJX|gQaNkcuPuIs0@_LAp0F@%&-Vw_k^uC=qP-L35F`yjUk?E-NE#BI;N&Mx00B(8qLTo? zQM%AGW`c{PkN`*u!Q4Xl|8Z?i01?FC!^pNC{`UR~62kws+17h2NGd1jyBZg$(iNTX zXa3E*p~j9VxhrD9(MeTRuX&yixG4<+MB#6x@B2sBb=Pqm_kc^g@epo&WZhV2mSc(5 Y2cN|xP1=~A&;S4c07*qoM6N<$f;}6GQ~&?~ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-left-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..942fb8cbe4fbf7611e609e3391370ec8d7f57bef GIT binary patch literal 707 zcmV;!0zCbRP) zJ+9h76oqa6L8eN0iIg(b^el!>x|tl;e;i%F3!poo%^E>uV$$URQJ(HJ{V z!iAYZ8R>HIFk_!@&K)R*^n5-i_t0AR03n9XCCGd}e{8i{pW5yAyEIK-TV$7GLcC7> z(poGQU%TDzQ>W8O4J0w3#6WW01F%g27d|D)IIr3RB2Od=QogbcCU?eevC zrDYJG2ZKRskr+%gAjjje2$E&ld$}+i4s#H>;+IxFI>49xeqRJJh*#!HLI}z)t5C~J z)uZN0%U0j|dWoD+u-Wrb0l!G6ngdaXf=$kVfEjXWREh)9ejxmkiWWo=F>G=cxa0^f zkOdP%L#Hb(0Q?*Si1ezJKqxB)gbstw0tgV~&>^I+5=5N@wHG=JItz{fK@J_F(h-$2*ZkNoEz(FX!yz}0tdc*3)e0MoFhT90GF zOPigtg0$A%8=QpB0*E?s1JVXH)p}G31OOkV)}0%k#DbR`5eU(+rdp3HIikA&K(2M? zh9{Lk5KqRkhIL*2ICS1$Y2k#QuU?)TOpsnR=ZGCAoUF4IJ;-P@I@k$sUvyBC)fZ|* zqjO|3nf%&rw+{%$8LmUkfVi`R*=+XnbUG!3fBqgSgmkgs&XMVK`rRCPyIQT@=-5pI z__b$3h(P1P000;W1^@s654Bdt0003RNklyzp1i`J$!j;7NpF?D1+TF9z2S0=? z-k0|$Au;nji!sKENGKh0Wz^2rb?vIEx>{?`3Vh=tL}Eakb9GskpG8qf9Ak>7rfGg5 zy83gT=aM7|&;5_nvTW~t5=D_L2EZV*i(s6Dhv^3o72K5YD^U5Loi-F7hn zSm@m(yFp+KA{&4t@LcZ+AbRsLPu0J6?E!h1gxR)-Ntlr5CIJnx^wFZ9ur&z)D2Umr z;I|xMP2i_#vf))^fm>2xw~@uWx_7YgIKrTAx_Y>t30Ib5y~hN+ec zMV=%8pBoGYA8WPR*IX|5LGlf`?qH$4a78fNx#4j5qg*ckl)CEKPnuK!hZ6mM|DoAz z{*g1|wOTFHZnsUTR5G$MN%yJAjYgx81uFs(zh19@gM`SKZntY>ONEyj;wvCH7bsq# zPT@Zz>TE=FJ+T6(L*{I@;zqEs=aygoz*sjPIZS;4`NMI*EgfF%fjIlQHQ7wB*S6 z`b0RxSz8fuUtAF`83$^OY zN5{Q%n_Q_yUK;R!f1efMjWpzIQ|7fs@>&rl7y<6qwTh67BEo!r1CQvg2J^f@TO=Pv zp7F60Nw@xNkdg-Ztcd)d9vqKH|8O{%eBP!*Tn<*ko``|B4A@gA`KD@*5xd>a-~|NW zc_FX0kdae=s#dH2w%hIfd_FgwPDlNg;>2>dKm;oi2>jp0VsXD*E<=e%qhaI=Qu}I% zH)@L%@lcVcl)u?*evQZDFO$jSy*Ai1JQVR(t5vU3sr;VJX4UC*`gXlu-^qC?-~o{4 zgKj-06aj>+iYMTorTSeCyZ3b9Z9m3nE-}#ke&3U?s6UBFPr%>ERn{y(wnw|1-p;e- Rl>7hy002ovPDHLkV1ns{ZWRCk literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6311c3e6844fd25fb62b9fec997871a3035484 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj-JULvAs)PUr)}gtsvzLZZ^5ax zEJ1bKIfITawuu(jd-VSX1lT1Vp<9(iZ$-}#Bo^$}6#o+1c=d#Wzp$PyJ=SW`w literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc633c0b4a5beacbfd4752f8ae24e3e54becc0b GIT binary patch literal 430 zcmV;f0a5;mP) zONxXr5QZlj6ckV3p}hE<#)T*<_DqJaHqNFX>7p8YQ$fQ2ETN%0T-WvG`BQlo|EoPr z)8x8>*!R8b65=?H$-q3%u8g2Jc3qc*pXceyz;PT&Z*1E(9rk^9Wnf*`KLbtEqyt90 zxIlNT>pE#>dNF|B7(z&znO+Q__c37A*sX!8^7X9(z5Z7SCsbm!5?WsL`fmUyG@(tx z>OOiurvaLs~>-bfWpEs)iH^nT6?;m9gcEiZayh1e-Akkx(k$_nAgN|2TpyZ{NB{r;07*qoM6N<$g42b;;Q#;t literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..016d334508ae2fbf74aab276589b9832dce7533e GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjZJsWUAs)PUCwX%nP~dS9*4X>M z^+@aMd&hfkxfrN_;LJU6KkeAh6&-iBZMZn+^MMPz5z*O)*&b>vJ+X8Z#}B5xf4)y) zI&SNHp*p^6+q{JjHnaTuII}UdbhRlr&-M(h551=pbQW=(i+G~5f{A^3)R)CPHtb0s r#O5jL literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-middle@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa640c487a471d7a3f5a0626520289231583de52 GIT binary patch literal 356 zcmV-q0h|7bP) z%?g4*6h@treE%2Hh5Meyt(pqwE(~fB4EKaWd^1kb_ctk3X`1G~J+w!=F@I>;Z^X+m z469kd%}jphUgmi|5?EJP5aT!=-nXR`bqM+j=>@cOAGGudzWa6HI5@%Ff+4^{7@ioe ztq?*Y0Ti*29pS4@KreuXTouBJ+NiHk2*9~zSs1F&|0#ssM8Z5f!q=YwO2F*S!wi|No3gJX;)K@43FaT>i`Rn^>H!+6CCbr#5yb0jMuaVYzJ$$tl!lP000;W1^@s654Bdt0003ONkl>O6(93a4uPp4D&B|+CntR=omd@PFM z&1$u}wnfNivzcoUKwv=+hXbS7@Aog4%jH|b_e|G@MvemdJYAG1jD=yCS8X;LTkY^ zE5a625SE9^1Fs67Cubx=MOclKtrejn@K}do=jgCUstD)9CSO79LsELvlNDhlB7h*V z@M(j|)`}2_2VNC30O+RBu(V ze&7-R5`r>#9&XstISiY8osp;3Vr?Hm&#tvNAAhtKUr-+*u@CwY7Q%YgVSk#D2j%zw zzZg|O(pedP2d#)L6AwKq0qTB3f*`>Fk=rZ1FAN7l2xzz4-9fQJg5ZNAqTlcTxWh0Y zeBfDO9-p-kvMCU}d1%zC+9pn~w zKNt*tjYgyIqCds(2b#|1O`rH8km7pxwZuDmPTT}g%)mE^D~b0Kw-UO319oW#MKxg| QLI3~&07*qoM6N<$g5VQKfdBvi literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-group-right.png new file mode 100644 index 0000000000000000000000000000000000000000..6662bb504cefc340483f6930f9ca0e604ec11afe GIT binary patch literal 339 zcmV-Z0j&OsP)P000;W1^@s654Bdt0003RNkl#Z^7;)b zu`G~PE)qiTNFn90FQ{@n9^G!YbFF z!C-(~a?9m1ZZ?~*Wb7M&SV}F2Nk{E;I-a#wtG$p0oQO<;c=hrDci>97T)xUcT+Fq> z$ibn;48Y5ivluTOQB1+1gCM1-5fN4T@&#@twTcilfYD@XK|H~75H^ZC*dJPiPF<BE6M+m@Z7KEcCiD3YXxnyi@oTISx2-RrX7KJ4fFUM0bz(m&pP#S zedv9r9Koqri`Q*aAaLZ88|XK4`lTBhh;{(rO~L=mw`&-h29qmwrC_ zN%Pd=pb(>W0PX#L?`6uHD>VGyytyNx-ZT~`79gwD$~)3%H2!2DX-ojd;uk~NMmil1 z2M@8?Z19{b?e%&;MW0WvcruxUqV>)?05Kd6f45q#PXG~@(mb{9e3ST x>t2Wde}e_$Mt*HAy1xm;hibL@D`W5?{sKzxZ3HFD0zv=)002ovPDHLkV1lBUX(j*w literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large-on.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc3770e2c13def966aa967a3f45bca97b93a044 GIT binary patch literal 456 zcmV;(0XP1MP)-a>qV{sRe9p4$D$jG}I1U`nVxdZX-$w+w_B`*2#BK}-PFAax3d7KVW>NMJ z55r*ex~{vVlns!g5qMD)sUQdxK}8%<*%Y~fvlB232&IA>faaDBq6mPXMTeOO1A+^7 zA_ZbioDrtwq!a|g&|+O&PmcH|&XU27CJ;s-=?H^mSLjcrlZG6Ej3fS&O2eQBZNyYM z9)ZaUHbo$I>T*B$B7Ve|8S|HsS~H9Aex zPuh0P9)hGq0May#N|K}@J&nbntEzh4Y&N&s?KY+#{Jk?~(&*JQkb$qVEMG`!u<#*K y*L4xc@jdm=DH$R+C-zhDO&afQ+ddRUQU3yc3~^Jov&lgK0000q-GGGQ0p0EM^YhBq)>akO z9q@Futx}tto9l4q3lfRx>1k6a6b#@@DwP`k%C}Sj!KT~onv07Ib8>QGPESwyo7>07 z#}Bu+x4+}M!!1XsWHy_91>(fa%#4|zpEuZYc3=rnM@{g%^~J}3D+S3L0hh`&pKqU z()tSILb%uebjVkbur9&4CPX@C+!qX$^o>phO(zsD~d3q(WbzMmiMY;FKP?JL};`I;3PAWZk&VtffBv80W z#Xil_s9D+ufLIWx7zz|e7}tbIhr-l8LJA_RbpXgm@i%GuuYd$2w+J5TkP2^lGULt( zBCJ(FJ-1-oVn_M?VW7*8siVAtN3~HV$RV~+I%rR%)N@g>NBRRP`oEmCqFd7LCwp|r z_WaScYY~Dy7vDn-G8_tYy$`_UD@y zP>nWZhwqu$+1bX@($ZnMT&`m`eMZVQVXu9835jQL>jfa}I_>o_^eL5aFy$Q%w2yR$ zS_2>nZ?#&hI0m00zlu@7dR93fW<2mFbks2azz+HZm|w20znaTf0vi10r~m)}07*qo IM6N<$f{v>8zyJUM literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large.png new file mode 100644 index 0000000000000000000000000000000000000000..acef5245c08c49c69ad5f39fb69e682d3d60b4c8 GIT binary patch literal 481 zcmV<70UrK|P)YU7{zaH6A+BWE`_v1OXiZnv4ig7;CuK6zChnV9P$hfzJjY$>DWaGggA+X3~l~+ zPVft?3=_r0Llf`uMJU^jk1tLI}Nzk{ZRfFJ2ahWcHM7MS%H%!8)Nf_&I zK_oXFNf*buh3sd3z6ms+lj78HVu-bwj7y)h%4%e<`zh@l^5F{cR&)|Z-Dkj zCm^wVtfQumXjReubR-W=fd0o39gvK{SN|o)y5TR+w`c_tR0)?RG!oI6m+9`+QJaKNP_CB{mE^l_ZIBUH5~G3N)Ea zo)?S7?R-9Wkt@f0>tag1UT+ly!4t%CiyfqC>cPo9&M#oQ8og~v&`P28y4h@IaP|HL XL(D%*mAI(~00000NkvXXu0mjf6B^yH literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-large@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ff24b20092e568955b6ef03c019818fac7afae GIT binary patch literal 1137 zcmV-%1djWOP)q^@(2~-G##SwiF(ILm z@K|DkxFoQT37z8~k#FqylBBuOIM3TT+Kv&o*#!ugbF z$nOLwXl_7?(9Leah>|y)AgG07_PE_WSQ(C}4MT|1>gwv9!NI{trBdk@{Nw2T%n7I+ z#c{mTYPH_iYPDC(%gZ03tqGkGsa%CHAxwFFef@b~U*8Li^RC8a|9;JSz5Z-zY3Vf% zXn`lzvMQ~ttSnAUOuQrH=I7_R#G<{uz4Fk|&_jrP zir(T@!YR7;)eR^vYbWQ*W| zL}`Qag=n*?L!BN-AhIDsSWNAw(c*((|0OTAkMpNR`NfVax-i6FIl!iicpOD{ZOG z1KA+Qnuh>zkp}6sS}z2;=u1NK3&?8nKyqd!DHfVlWn`((1Ic;afYN&ZUm#U5uVtqv z1bhB;bvl+@I?>KK&KoGL$7-_LGMC(+4$g|@sbKsl@}yDVr90kw2Yxm2+xJ>$)`1RSL~IS6Vo81Y~0#NME9$9?|6w$)>eQGc|f3 zIb|8NW6ncr)TVBA2?(*@?~LtVKz@5ro?~efjI1;XNONZ`gdKMz1u)6d=7I1YA;!*f zk$afj^0O`LKpVfRv8ton9NUB&k{P(mP*#en#V9pzE{ zn878DkB^hwztReYi_5IhXgHXIg9E++N~Wi$Ka+tP%OFj-2C<{Of$jX+&CSglOk@we z5oTdw;ajCr*?`uVEPlyhJ+4)&)q5i&BR{vcwnh#Q5BuTk;*BCCFl=hay}iAsSZ4Lv z+1c9I*w_(tzJ*424R!o@34sR)Ji!H5Xx|uoJQOHY#Vs?w-343=I$z><3TvzmHJ%fU z^;t#YeI!;9ub^woocXyo0M#L)2K^tP@eS_IU#zHKcl=H?ls=}V00000NkvXXu0mjf D|1m3c literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small-on.png new file mode 100644 index 0000000000000000000000000000000000000000..395332edbff2a97a2ec35e70cf2b6c77c1e56b62 GIT binary patch literal 453 zcmV;$0XqJPP)H%bF>&_$z50*x0ja9$EJ>1k-}hIZ=N-)jV|dbM*LBaE&E{skUcYM4 za=Cm6g5V;GB1ItOIL<5{V2?(Z;2q1|92shLBeQbjiy^odz1RfZe=7;n<=tOuImJ|p+wx1G4E-Ab3td z48bW`> zxKwb6AQ(l+x6c#%yq?_TVkUEL4;;?Ty{GW}-sjvmrElZma2TDZ$ekw`vgDIM+uPe) zxm@nS!otGMIF7F%E6JXDedaVFTgWfSx4mBP#lgYB2dgJ$lVWFQ=V_r(c$UxSV*o_} zivTowtg7DsU8R$?-|s7X-EQ~s{{H?;=?Or)ySrPZQt4f>Sd0M`0V*OCLFNr3v4j~6 z1|t}_69FdbbUM9uyM1GCZ|@`f!pH&U;o{eQ4_DB_1Xjw+`yz2 zBa(}r4tWf|M-0O7T>@BHI)g*Bk4a~AttM}k`UoSPxc;*hLude^8%jHB-e9ChTF>Cp zfe6E9R?lH|TCKq$-n2<5ufcJX*5u-+0$FNrVAPg`lEw)j5qk!rcsZmx6-Y3uYVueG zl3e%+htxllz+5}cYmRxNr`>ll!llGNUSM~>q84p|eX0%c|7C|(W;YATRzVx!kc?r{GcIe~cvqQ03% zj*YVLTsb5t&kpfVS(+qP#n>(<5H+gFW2IJQDi9wCiq&h(v?&P0LU{$E#+gQrjW)dk zQI|DUJ zhG(nD;pXP%=e4!9Lji?4lS%lS{2utAdl}0#;(QQRoNeSqX#1?qdV% zE-x?tTwh=Ry1Kgh1Dft4KT(?n;^%wFN65dwOW=d!;BokKYU7{zaH6A+BWE`_v1OXiZnv4ig7;CuK6zChnV9P$hfzJjY$>DWaGggA+X3~l~+ zPVft?3=_r0Llf`uMJU^jk1tLI}Nzk{ZRfFJ2ahWcHM7MS%H%!8)Nf_&I zK_oXFNf*buh3sd3z6ms+lj78HVu-bwj7y)h%4%e<`zh@l^5F{cR&)|Z-Dkj zCm^wVtfQumXjReubR-W=fd0o39gvK{SN|o)y5TR+w`c_tR0)?RG!oI6m+9`+QJaKNP_CB{mE^l_ZIBUH5~G3N)Ea zo)?S7?R-9Wkt@f0>tag1UT+ly!4t%CiyfqC>cPo9&M#oQ8og~v&`P28y4h@IaP|HL XL(D%*mAI(~00000NkvXXu0mjf6B^yH literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/btn-small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ff24b20092e568955b6ef03c019818fac7afae GIT binary patch literal 1137 zcmV-%1djWOP)q^@(2~-G##SwiF(ILm z@K|DkxFoQT37z8~k#FqylBBuOIM3TT+Kv&o*#!ugbF z$nOLwXl_7?(9Leah>|y)AgG07_PE_WSQ(C}4MT|1>gwv9!NI{trBdk@{Nw2T%n7I+ z#c{mTYPH_iYPDC(%gZ03tqGkGsa%CHAxwFFef@b~U*8Li^RC8a|9;JSz5Z-zY3Vf% zXn`lzvMQ~ttSnAUOuQrH=I7_R#G<{uz4Fk|&_jrP zir(T@!YR7;)eR^vYbWQ*W| zL}`Qag=n*?L!BN-AhIDsSWNAw(c*((|0OTAkMpNR`NfVax-i6FIl!iicpOD{ZOG z1KA+Qnuh>zkp}6sS}z2;=u1NK3&?8nKyqd!DHfVlWn`((1Ic;afYN&ZUm#U5uVtqv z1bhB;bvl+@I?>KK&KoGL$7-_LGMC(+4$g|@sbKsl@}yDVr90kw2Yxm2+xJ>$)`1RSL~IS6Vo81Y~0#NME9$9?|6w$)>eQGc|f3 zIb|8NW6ncr)TVBA2?(*@?~LtVKz@5ro?~efjI1;XNONZ`gdKMz1u)6d=7I1YA;!*f zk$afj^0O`LKpVfRv8ton9NUB&k{P(mP*#en#V9pzE{ zn878DkB^hwztReYi_5IhXgHXIg9E++N~Wi$Ka+tP%OFj-2C<{Of$jX+&CSglOk@we z5oTdw;ajCr*?`uVEPlyhJ+4)&)q5i&BR{vcwnh#Q5BuTk;*BCCFl=hay}iAsSZ4Lv z+1c9I*w_(tzJ*424R!o@34sR)Ji!H5Xx|uoJQOHY#Vs?w-343=I$z><3TvzmHJ%fU z^;t#YeI!;9ub^woocXyo0M#L)2K^tP@eS_IU#zHKcl=H?ls=}V00000NkvXXu0mjf D|1m3c literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/circle.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..a007d544fe553b18fdc6a9db76d81209af784dd4 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ$4c_&1<88iZ*zrV z$!L&f_#`Z;=U~|Ig29FB1XGHB0YfY!mqbtlla~(zuZBXHdBEGMn9M|LMdt+17sXzA0CYQpr>mdK II;Vst0BEmgNB{r; literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-active.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa12385eccd4975866a1f2559a778468e44668f GIT binary patch literal 912 zcmV;B18@9^P)o+zw<~2?Gme1#-*=$ze+>wF$`}_N1 zXJ@B@Hjj(NV#Tpxi;ICk;p8m<{3sL(sovgR(P%V0(?p|Dad2=Twzs#dfV~6QU!DOD zH-n5(KHS%tnHeQW=H!E9G8w@b#^RE*{SJWgl5bGBIX^HkFgrdzE)2sE>{^u{+cIWw zaB#L^mJRh&fUL1jF(sM(UxZr}%WVR(4BEjJ}JU8NR47r>!Z zs+2%cPVT4E>1=0br{IL}Gl87iQiEF5g!VlZSCv2^WVy-mB3)_sNG;pd#ZW-k*4B~` zdNwpPB=ou-8Ys1>i3fga=kVlh>1aG2e~6cku1F*jsK~oHPe-XqZRYT##LbqV5L>h+ zk&fjub3AEkpz@S=3p-5yn)ak!>Y(;!UJULw64srPVP*f@v9S`sk3qg5lY3YzjEl@l` z4Hpv}C!?dI*5LlvkkSFd8Vy72?d^%(-CdTiI=))3SfE&UO)a8XHSMH&Vik88_&<)A m{UVu43YaI%rYYiyxb_F?6v(z=vu1n%0000o{sAE4^CDbvYA;FMb)J9q9h6%`d(flfbZetzEEy?fW(ym`~yyLXR2Pl41|KX9oud|8%P03Br6Oba;5U z9$xr6FtxR}x0}O<4+}gHY`Ekbegc7j0eP}e;Pva*&F$N_4UYdEi^ZNkd-m+VqR5Ap zuUQ^seg&J_cI?=ZBy&D)*k$u2lN|9{%HYB_Ffd@K1IJsfPC4$!$~QuhgxI%F!9a89 z&>^vnUO69MB*BHT>gkk49n^((%IfC6=gk*FQ67cRCBLRM`}XZK4Gj&_#nBzbyXaxA z7Rn^C)InWrAa+q!kDIdI^Bm_(z!YATz$wr$(So7Dph?|7vz zRj%iRTF>~DN}1K!80*w%IpBCj*&0u~x)#e^B&g3gkZ`POnK;i0-LPT9321Gjr*wCB z3jiAHs*68PjuOh7$XXZYHE-Iq>C`d?93SwMPKQ{nK=mta^cy;HlMbahU_`mn@Nl9AZ386JLHLpQ-J;&4Q*RMAc%VHQ}`jChorDGntiGf&%iP$Vg z?mKOs5DJ9v5@l;^tALfdvq;{l{;GAUVp5C((BaBCp$PaKnjB;T&{9e3L5H|=7Nr=7 z$tI_R7HiJ3GF{-DP?RNaQ6b0eY&3*1jP+nK7fnvYq}Y(0PV&3U=9Ex73gJXZV%#nX z!6o7XWGR-8jt-H68+^j`$jK?88#ito0MaIUz?Lmr#3N&K82%M08Kvtb7WNY2vtHU{ zF&A)~mR{Z&JCy6LFk1keXA7WxGB}QT;W?(;7Fq2k* zGeXgI-loi5yLO4_Qi`4Fy+W`7rPidtE|rM@FL33A(94%Ew*$vPV$oUox!7EZ`DU`O z5F49@ChR_EZII)Iteg;vF2rOMV9|`bz4(ZOGfO3s-P3V!28tsmVzq;hfVH6zF6G*S z3AJ^cWOu#ebJ5cEPW4k_WK+!8J?Ww*EtpU|r|Cy+*UY+(GxH4i(Yd0%{3ax2vm!=f zC1zr$4YVbjYcriwFrfe<0bS-A(Z%QHaOX?3tEb~qtU6DswqzpgNxv0DDBo3rf}>Q@ z+0hBScreD%NSS;TE3w;l^vabh4f-XYZ9# z3;C;wMx&As@*$Jg6hdeKGfRBTktmfIm&(OE6{p7gj?Tpi6Khj|cIDIZCiLRPi+mTc zn*p80JmQbR-7TB=i90V?iJ91GgPkzxwzlQNXZ{|F?*0KaYCw<9E@n-=^X0OYssz|m zZBg6gV2-Q2JQT^O2YOznuD;$rQ7NO3GKrn)ox0VLliEVttc_w@E~~r<4TVCVLrIYD zDy><&MrP%8e4LB&QaP8{nV@Kkeg7(GZOj>B&V*jNbg2z7hcioN|Ni}=aCUZ9;t*p| zxh}LJ)h5{SdOqX(oC!sI`2vb7I0+IChvm*PewKTq4fImlWG8rn81K{8oLWwVBKtj$ zJ15VKmUw5`6-$p!nX@xXy%bCyr_H%Anl+&qK~$nf8-efu|5wBbTE-p$QKrdAlag-P z?P(Kjqm8tcHq-WONzIy2bcc`OojsgP&_5l_%*^~xd^72>w26&2(pK7xG5;q{3FSZE zAn;2H-Me=$HzqP2F%roCC*GOrrL>JrZAIP~vK+|qOsgk)C|~`{=);E(f5l(P$rLKpbY~_x*mJ-}C%_Gh>?1=hAf;=Ia1SM$1(|tJUfq zi^cKBHNmxCv)SytR4V;2>Sr>#^tD>;$ZR%$&t|iGkw`?su_^-qrCzTmb-Udu zydD>e#k%T^Yfc&hZ8n>?VEQwk&+oh4ZfQIoYuZ??R;l0bOYL_1ugPS}6$*vlngJ>o z)zhGIqv8}N_brpj?7Lj9wUCVCM0hV_7>iRTg`Uu%ZqRzYeiRG_52MlO0szL6$d9m$ z35UanjYi{<5S`*C-Jn>y_wjgKnog%efXYcQCKiiH(0Hd{5IWQaifrEZ`Fsc5my-#L zS>Ip`w}98{y-h7W(YioU*>9K;BiWQQD`%BjTLDF-M_~5Q@AogVDI4qkXI7~}EozFw z3TG7k@HCZ5?XfQs&gft)HI`bZqB_E$SgPYtD5R^>S7nvtR`ry)rv#l zfyd+7=&~!9pW5_TdadNu1Vwe8rPFCMo3t#x>3?d|gI+5sabYDWH#qjtb5{FkG};;{ zwdsNJLaV4&g5qWOC7$bkZuo6ylpc5^yFt%YSycta%vj~;>~q`9ro4^lvFxdD>8%E< z3Tn68KP8jN5I-SUncE)ppcg!YXjPxp{4RmwqpggYzD^_((r`H3+TN72DgO@!1Bsp( zXLwhA_CM^!#~o9SS-rxNf6V1_Rz8avyvyNqIu~25)9H*cfe*;^*K)c1hYS~>y96@g gb!q91i0mTfAGaD~3Q7!!`~Uy|07*qoM6N<$f(mnpwEzGB literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..82e931f804dd732d1f75b31f7d666895510f9972 GIT binary patch literal 1855 zcmV-F2f+A=P)foYuK{iY!SlA(hH%&c_cM8*w?LNGy0#z7rjXiQugUHCwLfiW&L#GMrMA)j8ky-E;0ex4J5F ze0=O=n>hud=1gTRQGu+WhT|YBs9`~4hVA(>H#$1{7}}dS>1Av;uod_+aR1=O?x#qmCZ&mqi6=nydu-PYQ(l0*f!^NUIm326nahZvj<>ch#cmn<4L5GKj&dSP)v$(kEtgfzd_uofHM?HOgeLp^UtnKfi z3kosYAm+~?cCD_i>mrFv@XucGg*1TB6OrAnH>Pb>6507h|CcIyE(Q6=U3Qz|>q@ zTdTz6kaKWwptf{}pGYL)#9}eE@iRqTUS1~k-!Vo%+1=g!r;858c85C4@9*z_2IS4< z<>g9DM395u)RwN8RD$Qy4m!)BO-4O^pfzcq{2WRPO;DtI7l_|Ox;x2a(&4x#k!gyl z*yKBX&=-Buw<#ZPc0v(!W@aV^a-S1SQ&W>uP*9*EiBZMqGP%(vqm(}Aiw(ZNAO`it z@=GX!ZftD40v>H8B_$^$8J)J8*ruSYBG8iS>+7%E@|SAYx}b~}pN1OS{s-Q^4cL`J1geTE?R*KsAjZrEcC>R8j8Tn3Iu_ma#_|Zj| zT&uGQIrSx^7x769@pznGZ)9I3CbceorRF`F~{dFsemN(?&fiHF#% zG%JEmPfy2@T6c(;g0e{&VF$9BP5{$Cn)Vpy($HvC4Bc*O~ z0!S^D+|ttaei4+Ih>aMD)s&E8$GD(ajl4?ZMMXuSEHj0O+q+Co>^Nd$%gxOlbUV-Q zexriwRR}MHgu2Z18r>45vINF?cTKOHj0)P`-hLZe))f~Q|0hEI_Oh+xrP5%85+ku{ z%*I?A6%>E6sT7iWj|47S6HJ0pFq^_@Owh^6$;XjGeFP>KLYQJ+(=n{$B<%$wF%$cR z6BIyMd&XJk<>%+Cm63oq1=fTeV&X=Ox+di!WWa=N+AtQOsOw&%!HS9szGZY}wYw(VP6^ni8dhCTh~ag5suvE{K=7sI}*L z9m}+5=cm-93C-oaQ#}11SWp?zb)kH67f7bk*^ghzB*89RJSlh1L4gG2y-FbPB5h0R z$k=p_zYF!VU={4-g1?%t1pygI(B0i#mK#@6YfnifKarBDV~LfbrqrZYf=*6B1Vx7Y z`&R<*?W8DDjs)r9u+NnMAO|+hDUvRZv<1ZtSkJ*}D+hHJ^AuEO&P+vII(`K+Iq1uJ zt(sd}nx-u%E-Ji3k8+WLz*yg1wnoe{ISCixmJXM+1jXO5Nkqd7bSPKlFJrokV1iw^ zkQ+J5en0PN2?_@vV~Y|125~j8%UG07+GYA2V&~*UE?QLTLXN(hZ$WXXs~KK+Wyxu1 zXi#G(?;O7DjU3pq8$U43ks*7z+nz+x4gVO)w2R7(~%a$KRGZ;$w{y8qlj2? z_0@a{is*a>*42MTjg5`U(Zdj(qL^@zC`AX|(VXQF*LTl?j*N`t!oioY7~$hEauHc( zNLNpn-~e)wLZ2MTm7K}lD}2v_;$rOkFq&j((bB@ppN@l-k{Wk{q}oM0mz>zhQI}Ck z)Tke*A3eNy5)_5*E!g^$_IMW?McCQdIjP_H`@_;0rQ}AAa@QbMPeWP*SDLPZ^432T zx}&fZV;XQZ!D3i?($&KyJb>KDkz94^$Ebmq+aUk$bMGs-D~4 z-c}D;T|%uqL&g($>d_oTr?arIpq?eg=RaUzpr@zjr}GS*5|mGEtgWrxz%4azLC8Uz z7@?SLZEfn}2YZhx@hCJ-yey;m*yH^Cyb=|>k09(fSPXnMH#hgo(9qCPsurgNP2HLO t>|X)bG1R}wNBfMdpoaTDE2v>X{{h|Xur+jgOAY`4002ovPDHLkV1j&}iYEX7 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/classic/tab-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..c24ff88f33c69ce6a000de380753ea3d31292af4 GIT binary patch literal 808 zcmV+@1K0eCP)3_xg&SXhgiCw^ z-vDvJLLY&p3rx6s4xtEP8mR7q#dOjXbXT48)&JLDbQ{y@R9uI{aUCGZ=+XggHk)^m zkuT6V+MqSUyUX5~I;ba4e#FsR}6jSpr1?JqU$DM_iXQwR&)JUawa` z<2JRdjJE`e%6^+jBm@e=ax`URIhGpK+6!p4T1`RtQ7{;sMN=AEZJ7ybP;0KK#H$=p zm&^4$o6R~I5#5M#JhiB)M2Swyph(qOI2_iBri?zLN-b)FL20W}0>#3=9|#0)apPt| z=pNLd7B!)LPeo4&6x+#JBoeW;CCMnRwuFsFqm1hLPC&6adtmYuTgpz-E`gVd>Iprz z!Ky^`6#pmz%v`I8B%o|rP}HP0AWyYHk@oXl6_JFLtt={fXn`UnHzDxQ@AvOC?aQFl zrpMfCE$_zEW2P6_?;KqCI(w%CTWzUHZFwHX~@G-LhQt`V`C?q&=pP2x}d_VW_o;_DSq{H0ZJ_YEJ#_zIy5 zp*o&k^hEy)yhS`)5YE3WQqOc_jl9PBF`v)h;0(9Dw5^Ki{&u_Fv)u(tUso%GuUH$)ml0TrIcQ|DL0000J!(6Y(DpP!!(fz&0-auX7l7D7Sh9gz7Q5C$qM zD^+uIv#PDFRXCOq=;(_;pxW5jP^+t}YG-GMr~kpRmq6+d(bsytpK?NHXJ>E1*q>ln zX=7uf>hA8gYUASKqFP&9qs+h2LC^H{_5Eg5K^$QzC3JFfvZS!E@K<2!XlQ6qJv}|@ z^z>96A0O+*Y5GA9R{8n)ddbbrRSOFXYJGj3rvG(#c=+`2@bF$79;}^q7Gn<8gUrux zYe!X8mFnv1QU?bIYJY!U9UUDhr(_Ze@1+dNqD;!B4zzZoliMk2DI*klvlkYPFi!@9 zK?Tpz-g$O*X3bE_qQ_GZ+@&6EzMr5v1$m$o4EN4z3ZrRw;N2+ms;ERlu(4&yF^Mt*(7(y3RBz1 zC6`jS344zC8WWFs(L5s*13(u5_Y!n{eZ9_|UJgXD$e~Vl6fqPP74fpW23xFKTpjm} zPP6OI)q35sEkEtm^`-^9l+I!nJ2Q zz41x9NhotEF`Ak*fRBVju2_t?*&3mc`5NWQO9%-q9?P^Q*rX;!*z3x~22Lx4qMqvn znA-#t8SYQ=kW4rxVQ;>SGCe(OY;et~6+%rt=i^IcHilFtl}phqMdCAU*^jj=FDkuR8OgN>ThHKCYP&bk2yrZ6U01-sZH=bfxw5z4trP})z$5<2YlSYeiF$B8u(JGT4r zHvhl3(E3dBKduNxEl2Mx;s-EJ*5c?XB}wv7Qh$fwC3aJj7P%dq+z`rYq!BqupSlBS!)5jd}uw(RZg@l!Kx``!s8M;?kE3_;mFDwJYgLdOY+bl)S` z#TMYXXKYLwnj=E-J?3L*@)H1imVg9Q(g-r(2Ek8T45@x&W76o7o)V6p>p)2S0Zloa z(w&!=r>ApY#rzq`7Rlsj&-taCQjW%&DmXAO@Mq+8@wSupQ1sj<5Sqi6AS9D{^Qx0c zl4J~^P2#0EOk0y`NfA0TGxHphxc+7&lLow)h0K8>9Sdz?ldrYd9H!0sV1hph6FNRV zo(CfzLavVrrI5c4-YHzs7UomhW=Lg9d`R2nnt1Dk2}R-iK7@t%RK%&)Y}d&*SrDV9ol~PG#E^H>p1C|;4%q@*=&0w{m#yr40Hg4r>mdKI;Vst0Fzl# A+yDRo literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0c183c94075955fa090e7446562224ec8678b9 GIT binary patch literal 375 zcmV--0f_#IP)0VK#TYph~mVt7JcK|z?8hv)z2FJBlRK6voxqCtF+I7|(g#u^4FP9(rV^$!8X*rW&E002NC VxOn3#b^-tZ002ovPDHLkV1m`wo}mB$ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e8badf2ea0c3f2530e0da8e4e571091c999f1e90 GIT binary patch literal 852 zcmV-a1FQUrP)1M19~x4=Uc343T?OXKur3QuRHI}H#6Ux-S;Y}s!BUK z3_DpIwd(@v9r*t`AXxY9sdjSoa0)qU>VV)pFhCYDCb&Ang#@Kf%?A#+I)`iDgUCqtpcDsnwJlQNJ z<>tuH*rni^vc(aos{_n)GoDP(#65Q&jQ5a16f#Y~h} zl!~pX@rtSOI6dp;rK6gN&i~A7@>6A5HWqc@j4^vXog{)AC9d3zm}631;EA{ zeBgkK7$FcaRT7~~fI2s~KKmy6t+&gc5{>-6xzNbPbFo7Q|9h%#>?M= znlStq=zxPc(dE_5)UELS1-=X3@qCgIEQ*Ca2_HD%@;u706>+xIs^uQQ@p{a#GxCh> zj+%B)un(PGW(+cL8c73O;baE%j}g*V2LVyZ8r>u8;5^@>dP5 e3#fOX-htn|e!`kKFR%�7Lz0Z literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..12032b2acfb70144b1177499dceda333d9245662 GIT binary patch literal 369 zcmV-%0gnEOP)#}_jIpz{p|ya@g5JVfO20q~TS_}Vf?wee3}>*o=n0`B0s)Ta%;_0W zBbQumlgaGNzTHO_kc1FBo5b!W&FtOI07;Ve48u4g^Om2Q-gj^ZU7#=ug5W04^Qq@~ zI& z8ld3Nxoz9`RaLcsAXC!^l%WA5$8j!_BzY~%QWQnelBwxq!2dhYG;I>c@f1rFQ54NB z%X%PF(`S9?3C6DL-i2ZKtn2zMZoDK@(}(WuK>Au7{LjEUKSXvW%kpv4G&AIHzy$gf zdXD@FJ@4RU{561I=K;Wvs01otAK-Fppum6@yo_H1R)uwWJO9GExAWWw;e0_s%<#4m P00000NkvXXu0mjf+ElB} literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-close-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..672ed1f3f285d47b0c7987804ae3bdfe87d60348 GIT binary patch literal 865 zcmV-n1D^beP)xKnO7Dg6O!Js=ZOxn`V>5T7F?~vhRV3LNg=}n%_opaxF?wNb%+-ZyBIH9X-;j5gSxtj?z zSKwOEm#{@m+K6ZsHDRfOY+a9=*wQ8+||ivcVuK_P~*`?65#0uR#sM$l}e>*S(f9$-rU@L53<=FyMq=Vd__ki z3Giaw6;Brz7e8ugt!lOEc(B!nBO4mD_y`j4eGh_c0q?*q@ld>+pP&EC1bRZA@)V4r zL2G=dnugv1YC0;|%O_%DZfnwf5mke9v*HB zhr=xd^)_sb$#x)q3ViS-#@Wp;Gp}8q)cFlDu(r1LLCb6lO6@FcG-!=a*c+A2d%(ie`^7*_4?!CF%Xq5mZN)`Dg5hMYYv}a>uV?lLo3&$mw%URRY(_ewU zYd2RLAAChaRS+E=9lf8)WWF699y%`BY}T5YnfapNuYo=`cbqFeu~=+K;|(1|oeD6R zNF<)`?Ck7nxg92&ot<5leNwzIOk!gU4O;m;(-@V|d2;XF`=DEJM?uEo@%XEBI=z=n zCO_$ZLL|fk1N{lc(4f`*n84R}3r>}i#K)RGr4_~}Pqm=uKvA9}4BFKYjhd`Ssg(1|DuM1_55KuNkpHCxwLsLV#-C<1+vxXMFDR z^%=VkpEu#;%euaiSOk3Pdz4 zzGl;|>y6zrzPx?^X)jPN_~om&2WvW~ep|I^=QSW-5LrFCW*EQc=g;3efeO{3ijBYj z_^}(v?m^ZJVq-)jlJmHMY-B$R0{QUJhpEG7089;D8fz@z)qy5Su>k;nCBH1yaX6#^ O0000@~$1%L)+y0*TI<3u_yxB z<&FA8xnd?gJ)KgiRIrZ(>~=eB{MhJRu=EB<h zwYAMxm*(}~z0=YpBn#JzCD4YOAN385YbR$Hbu7z*d*1^NrxSK|eges;QYt~6oCH#q zAy>rLmgU>(DogFS?-|-CTG)0WtoLtc54y^lu2+I2J|3)dOFFqcF(5U$51H=#vsu@Zp#_WOt9 zpT1lsk%{ya-oIdk)ZmykqptOyCu-(nKuiP*>e|f;rNSta%7CV6@E!S3_5`uqy@O-;5>;waQz)9I_!@)WR#B=KzV<{6T=-%9v(_@R zp!56vu!#@R%^Jf%b3;vIXwpCC6Zk=5ub2Jm0u)mA=hCW)C zpFZzCvP^xQ$N4Z?O%O)Fp7f#>K-MO-YWt>x}z&mk_*+)!2+AFlk?O*J| zteMb9PDT2YQ-q9(5(Lu`;tz`t>x{CoG|D=ODFzeB9m^F&mhluTqRQ|T@uO}%CvdL7 bnJe%M>H<3F%^g;`00000NkvXXu0mjfP`krz literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..d882c1d0f6f9ee5978f77a7dee2b7f85e442a3ec GIT binary patch literal 340 zcmV-a0jvIrP)K=d_W&sGw%_Z)`HNTrnM5)WO()OI%L|91i@fpB2|9*x9Df!?v1yv- z$c*)j^;U1IAjBXH!#RY?B#NR1Oa{8f_V#I(W!tK%lnLtJFqrBFwi!$u$9cuu(R&-H zzo0S!Ki3`GU+AT2x~uD2n6M6E?7uXqBJAPCmbl)8a!24ggQc%Ju_B*`w% z^NQJZ-6iW_tj|Dlp$GmykN6DU!5bKX1K5HM_=ToMK1a)d)r*OPN1lckiWg`PN?nY# muo`gV-mnevUhTQBv%w!m5CLIcCyd4b0000wa literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/file-dirty-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..39dc46bf63f26157915962a6b5e7be41a65f0992 GIT binary patch literal 726 zcmV;{0xA88P)H;(W7iHo#L7fBBHTEKb*Hvgpv z9miqiHi8;*f*iDyC%Eb?o>u0>X+sf1c3FTN@dydG5mGP{T;W8ySNAwRHc&#yuL?KH z*g6?AVB~6|hCZ zTCMggMY9q9{w8{nJEGYmrw*_On8z&az(01F&Wb!UV zaf}#Zg>R-f8v*qESs|GcMUAUgI1?yfazvWV7SR72{eJ&gRi220!C>%}SRp(u{}5p# zV1B|i8jSzKIS0;*D>BbozOGqE!8^Ye?r1)vP9u^=MI_Zg&@nVA`mL41%n zQ3hBU>s|Qu;|Eafe+FhIkSqQ(fcPMBbOW%4fvbb%8lb;fj-9)t^XiFPMIkN@)aRYdPp SCm(+R0000O2E4U`AYSxV@@vFf^&onw-h@g{ijbDx z3nCOTL2F4tG>JBw-JSKlO$<$%Z6`tKWe2|O&YN%F``(*3o29PnlH(lgID=#CKtND| zpaRk;$IzI2kmAfKgrv|N7GhV?2Y2{K$9CQ@9(r6VKCg=UrNh36rtf}V0$a0u4C_M!M`++uGLk@Deq!jw%9heFWP&I8aGoJP` zXOs~J!3TqR9OTBL(ZvH1`wYUTAfd-|ayU#voy`0E^h~J>l>n};>z8{L226wnXsSxF zo8hvhrw;*{sUL)uj9PQutf%g~;J~NVftl<;4YZexen;iej z9UC;b?Y)N#*&sk~AP2b@v*~Z$NIo~h0_JCoP1og?V_RMT%)H%<*pO|Y4THBi+`2t$ zZ2H9QnuP_NN$BPIThklO<{q&u6Ebwb32ceCC+H8ecDyy@AUB!Nzu?MYL%0dS$@0yq zYiV>=e7}C(vF)$~osLb3gX62%vWNre=Vy%#;FiJs)LT5{NBB+H@v#I~&d$ zLq-vR&*cD*0A~R*0Ke^90Q?(X25bR@#;5{>oQshB$|&;ef8hiIf(ir`_zQtqJ4ZmtZrc6RnWTpS%bIy!7b8NkiO#lXqI$-v6W%JA<$<9{1Viz~->ZQOq4%9X#! z2H^ApCkHzNBNGz?D-+w>Ku_zVx|%A7fEq6XF>wa``^Wf4QAYZrhoi+|Ha4~+K#gya zZHBW!Nf{e{^yFnGP+SLy8L`R3#K4kp(@+__K<;N$Axs`V129!%5y2UaSkz(_qSycc XRt{y!ge=1q00000NkvXXu0mjfkFSKu literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e49848e0dcb5149294dd3b6113e3456d25a4249f GIT binary patch literal 732 zcmV<20wev2P);UQ@&R305DMXV5Qc@&~C5Ee!k?EM06T)HuCOmsUgllw3q%E6Kj%V`keTEQl1qoq-Y` z87+cknu;FPmOI_p+tl^qXc!1707_(8CX~w+ux%UkSoCU4Xs^2Z$DVW)3i^3Kq>X@&W#J$C8dSs>&A&;h|! z5aOf~aRaK=S*TRX5O34tToq3G zVJ2Z?W5fCUY45{sSM1w~iKlKP0jLSFa>N4pjB_(eeiH*y(4A*z-jxacc|~Eh9M20qV-DT_s9M9Ue+)_kFks+evr*+{!l*6HPi?lfwK%xuF6ups95{2x0T^)9 zY;dFthh;W~yUu=n^V;B!UgK!$)>EXuc;pXHmBrmqW z(J#sdmm!R}VqxL>J^Mujcp1KY`NnYk_z8yVckdkpDxS1s)tq<8hT(Jp3kxd)3kwT_ zfB+wZtD7r>tCN#GD;sA=SXdYvvH>i}9Aq{dD;ond(11UG{xN*}`Tf6=vhvmRsDORE zyqtfL)!{UNk&%hv_n-ej&41n+sw*By!0cZm+5Pyc-goA<4032FSg>gnBsxsU> biVXk&z*BfZtWguW00000NkvXXu0mjf8vKYg literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold-closed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec71148ff39e38cd34d8177b4a80f676638f9a7 GIT binary patch literal 747 zcmV6<*+Y8!AP|KpV zH0R!RfO-N#31l)Eno6bEQ8um+!0hZN*Vhd;6;4j{92JBRfErK;W2{G#q^Y6g?a5Fo z<**AP1aQ$Gk|U7__}bf8vqwp{n~kpq;}hrYKuDrDx3+pA*xd#Bl{_qeT<&l> zJ8$HI^>SwB^`_{2LJ9E68D$_l9B?)ifH4bI0Sw;nu?rXRNa4MeaB z)!mivCvae5{Hhz&0-wJV6n7K6&1UtL{O1qwE%)=lxQY`&0N#Xjw+9F&u~#NoCYpl< zddYyztsMYKT6^+nGV5>i{=hMOuPBuV|8WooAWYir0Y(U*FIW}@!!)2!)M0bGP(10? z7Oq_mRi4c z3_!Rs-dsZS!j2BO=&dgQiMjs1(_irCB5EGR6R4_$0dxb6izP4&6CARX8yh+|uecg? zbX!HeNAU!zE+GKihwwS;m;hP76!c|-fm8e$Z=tv`Pe8bY0EouSK!BBJK z>CH25S|-f8_4Vs_b#`_(21Z7pQlPdUzke}su(I8&FUfof(+r}q1>&1fU-wmvOiVvO z25@k2FtC9PVqp3e>g%=!sOJ?S0~pkm<&PR@tDj(EVrJk18o}p z5F48dK;l2c{M?rD^YXr8VPR$9=Hzec@vVJoRE zU82xZ50;!nq#?xY+jVA3mqohm+ijtjeK2A2_RW0X%zkf{x~@x3axG#PFPz?0&{k4yS4ll{_i_-l?Vt*J~)(BbRkYLMhV(M z%W+)d03KjUm&v6taLl1ZV9Q!AFMa%EZT$E-F_1Bc5Q2m?0_(JGNp?CNGI*}={oR|z zQNY;K~y%S@EU-Crtg{%9J&tGg97Jj4;!3w6VCU2 zq!1?x0Zg$yeBr!RE{&|XpaljMYtR8r)4&&a^%fmCbC{ScT+3 zPHn{@fSIj{@zS?KKEElU?+&OklQG(NCaaIFFgzJf_$3&c0JCOWIW|NQfViIJIs zg@uIyM1TAF=a-d%<{D(pAVaVjz#uOzepF1D|HQAq{}`B=SQ!2QX(0jLGs+4w2VpkD zXsiYRC4aiv7%ltvpYhcnU^@HrpXr^gvBq+s_;;8_7>&ySko;{mIf-qr-+%k3ASJq+ zhll4XOcM$X3Pe0u=-U0~y))NynoKf9+s+gcHgl5G-p9G;`{ui6&M>7EoTa7C5}dFT0*L~N0*L}z zlt%P$b^SFcSj-q{&^V8B1Uyec+qNlo`}4-TSJ-j?+j1ij@HO_E@yqj;)vn}oBcN;jc}pqb&yj`M+4uFAD;t>X z)A5ACJZcfvUOZj+<_iB%NDprVdpKjj8SiphBg3bLwj-?7XUku4TI($K_=!s3$k6rr zT={0LZ3|F%zl^1Tan|if$oBy($AziVb@P1I*hbv_9@w4bs01i@=lySk?TbWjD< z7ggY0PC+j1G1gq3FE?;nr?q|-hXA2gA3vy=mLsIZLSra-il;hGV-yA}U#O+ZOpSAH zV!Y@FPJ3|(Q2eh;7juom_}Hf72DN|$@H(h2s6O(!(Z=LNVHc-+bYPIhB|!PiM+>uC zp05r_1(c!V9^O3)W34RSA=#^gfP?*E2()z0>$6kEs_jT1VB+Dp5^h|(Y-SB(3zHuN z0E7OAAwW4B)00~m zMlQTCf&MKm9Qp6KIhN1vl&+4KEL)6B6fQ(Ayl|?htvGxpJkH>|x#rly$Qt?w+=zVl zL6Vaapghy)qv-VB$F|cTKpz15Mq?$$x6>dHA2oDh*tZ~*;$*{wK%&53A5-BQpN%n7 P00000NkvXXu0mjf=g&*v literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/fold.png new file mode 100644 index 0000000000000000000000000000000000000000..8008475a34cbeaf1e66d635e269de45e3564b87d GIT binary patch literal 1156 zcmV-~1bh35P)KLZ*U+eW*=@Xluu=l{Oe_niMBOswU%Wd&tdrdS{$I)CKB>9W97G z;vrW20Tt?kT~{cTs)CRz)>H^osi+%N%)*bEmOweHbHDSQ?|k=MUC4dvhM~#`*bHLr zR7;| zWY2q{j={VO%w3AZ7;?LTyl$+nL2f^gZx3=C$gdCbGLYBH&I05bz)N1oZ9=XCOs}W# zb}Aou03ctLfz-YyoN7tbb+_d!nX>zW^8buY)f>%w8JG;?k^>w7{%GmbE5H;Og{z(A zcY!@%l>B&cd5AZH_1ZfFzVX3E_pCGIeBG4g3NQ`E?P%*r}v z3%<8~@koAHds5^2bb{JH+P~TN?a%G6>|g(7NA2f!R7}m61UtHyC{|Hp zhdZ-;6h12i_*_DwiEvQ_TtTFFG3qv7GY^@I=A1c?Fi)DN%oAqWoHO4vmqrY$VwJ5T z!g|A+w+>lntYUH#>!4M(=BTMe$?+wAT4-R-dNnE^6y~J-o{Ei$~x_0F+YEW`H!^ zVXaMoX)gokMmRT$*1(zht+eiU;x7$I4=|r^_>cZMqxb%`ECnVRZou6Eg!h7Z-!PoE(F)l9DGMzsLnGQ^z^#23FGO zhF~>-iHV7UiJ6IknVFe^kB^T*NkM^0R#rNhlbidBo{6IdvLP(U92gs>nE{wY{{8#Q z@b}N}|AxAn7gBp$_bMyOv%}PZXzT_sGBPj#6WE_WzZpb@gzm&d1nxF7HoOH?zY&P< zgEYbbRs;V2{lmb=!}B5_*k_lgoAXtm;{8B;8m0+_2E_t8UcP3-ir;_#Rs+S|(dE$j z7@DC90)aF$x?*g6tmy#7i3B)Uqmh6f6lsbL000|ur8q3#IV1o8002ovPDHLkV1k0M BoF@PP literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c0d5cc508b995fa0199c48f0f0235af0d90d12a7 GIT binary patch literal 761 zcmV}_iN6?w%4CYLyLj^=c=GPWKR^#2 zJb3a)5oCy>u<1c?1NAi69P3zr$dV>L&t{)zPNE`8ujlQ!@B{k-4zNm9-phyyp%WpL_a;a~zf( zAROz1=**=nmGxrTT`HA9(>2gF{ez}yw-)AR^38xSC*TkS*b@vwcXt#5fdEL7G$_f^ z%l+x&PZNE^segrF2B5@wo&%RCLPsbB(P$U=R3AvPd{&m_*<^a;LGsYih*c0v0362y zhY$oJNp9$j>_tVu+vau1vUFW^xxXaS$L^$3S%nqEA^-=QNgxPM;(1UM4@A2 z9mt$G_cw?g32TFEhO`BZieP*`6=d9=<>enxC=__zG#U@Ui7W%~f4KeWRwfzMD(Jcn zPC+P5TpW9KZF1tRD2hfSVEWz?05u;a0YKXNBV!l_kjU6Hs@lN8-Z#@zlQVw5x`7vw zxt$4Y?LSV6E5_LkS}{t~%*4Lf?2W6rd^{E{;?Gsochp0ahH6-r5~!tb(uyf=Z3Dug z_W9iSg%_E@{v~vw71QSmDSa|LBF3Gip=Lxk5SZYO%-zjXkJ05MHDqysVUdG!ORKZm>_DUZmcbb rRsd`<+&&5O%V_&RyUtqxtpt7nFK5Q5P}Ec200000NkvXXu0mjfC^=(( literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5a87741f90c81d44c87da1064269f98c002b45 GIT binary patch literal 414 zcmV;P0b%}$P)mZ_&QxPG%li--C50Na{%-{<|hYW%bV3tC`ba0Drx}N7< zV7d+c3910_RUwY!-CnPE6Nce>~TED2n3gbb71n`aWtlxS7VKXDna@%!7I%Nz&zTI6M_aQO5f- zYEnwp07;Ux(lpP_-FV_SY%-ZVs;YYJIL=3zz@!GCBnQw=T-SZkH0{o|?I)yOp&3-( zzD9uW`)`I}+?%F3hQWv43v&!`38*!(-|rt>Ay9k{9YS4*{(wNfMdgb~=7Hu2nCw7% z&=>RxeZy333Kn@R1JLE7i^E`Kys&Ak0Gf(ctuJ2XRkcfVKZG^bHc^6zk^lez07*qo IM6N<$f??sexc~qF literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..20e918ddda09143bfbf6958f0e9803dc8776cde1 GIT binary patch literal 810 zcmV+_1J(SAP)oSbRR;4K6r1IB24=fD}n|wKfUQF&Q<$34hV` zy}iASZnvAy<#I2UmzP&K23P@$+FsFdks2_UN+p}wY`*7qyI-H4o*t!AsV4|-Ckd#r z1enpkkm(UH!Ru1FT)rk}WVhQNdcEE^wOZ|MB9Yj@Jc-yOB6|M*At|!KQm@yq{=L)T za6I<={U4!Dba!`mO(G&ILgHd3XQtG`1Eswa2n3$>dcC0(cdHCqt=2V<#}h-LzDp*PkFabJN+`zClxNaEGo95? z8;g}ng(@(PVqyLl0@Z4@w7%1p-?CyL@({Yz`z3(uwwR@8^81Ht6IO`AJ5^&D}=-0 zWHcJhV31idTL!1>a$x><&A^x+nUDfF!^1|SQH{l7@3*(NKjUVUrDkB_7jOeA-+pDXq58Cba-D0uGw}H|!YoZRE0dn90`ZJjb0p9DkfSUmSB@64P z)V9%%Dtwl#v1e?01bBP#RpY}#kN~q~W%G>5ANP3lQx*X57ytkO07*qoM6N<$f~W|6ssI20 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-closed.png new file mode 100644 index 0000000000000000000000000000000000000000..819803d5f7468562f640d6c05504e803a2f0385d GIT binary patch literal 363 zcmV-x0hIoUP)RR=dOy^YN z27tWx=g%L8Kfiwd)7Mfx(_L4zS6oz>4WJL20ssH~WBB>=2ZOKx-}TTazuoG} zig$qO*8uTzkVY85YQV2wKN{eqk_2E39_Sj^yX#wFL)HMy4yrl zaE^%%1Q9nyFK&!^s{=i3IJcxpe4f&3H%j)abnMaxzK~yDexGl?zn6q_90zu@_}zpP zyKbPK08;{qL_#>0PB-qvgk>@S0bLRE%KX{>p;2yZjO`glw@jVwYmaz6f+y~-0-z$Aba;zDyzBDDqO6>003G*6CChpM3&`(iPqK#Xj(v0H0_Ss*f5VqZqll$ zz^Ztv3Ihn{&;%t>NCVp*9{idg^o|&W!(mW0tp$zT^EB=Md@gXr-c$x==JCi4Bm;@73^u{LSO*7xsslOe$(m&%@RRfKi zs4u9A@|UP|%$`7D;t`y{7C~`0G@Q0b=+o6qYO13(vWfr;^$qn9MJBc_W&Rp9J!!;WYp#`OneTYN4u<+!K&OW@d;TDvEMX9qp_afaF2qFo59#sKn~H z$k3zz|Ns5Z2y_LAj*kgF0+d?~(+Hz+8Ni^Yqd8SiTjTEEKYtiNw4RpcRG20d8k7=o z;fIf(&W=pV`VOLTslllkszLqE-TUi-Yz=Y^09jy)OEXBE5kyb|a0Vi=hEi+*0MFpo UZIPS2MgRZ+07*qoM6N<$g3TR=_YP)rR)khcG4%r_;-X7`NI(i*xp3jOn+jbv ztFByVM6@(e5*1op1S3|cnGf$tc;I3t^Cq*%CO6#V<-T+8J@3q&8O5?J)=J~8Y>wV- z0&N9au7K)x7o<`twRp)o-EfWehkMv{E|=5oFs=kn%H&!H*KPTmX32JUjz_r@nd|n?Jj%P!m5DSMREE0`MIk3n zxKX*fzUfxgAR{#>47W22r)IidWnG=o%J%1Ml297?e>=3R0+dt^27`y`cW?5BZZKAR zbSq3z?7c>eFu;DG9OR;gU30`_2mrS^^K$xkd~o2xG>zKXod`e|VB!x4E|7y<6mT+G z0+8=VW+}aI7zT-8kpje?zV16>*aIfBoZd$cxvlhqkSqbUMY4q!r0BUX1^*vGp{8r3@xb}!;R_2d@0Z_)8 zA+XmU>npx^{_I!`q!>KJ`eU&YHQtkH4oouykoRd}e(q;9+;L;l#KW;h40`~`TC)U7 zS|svo_SN)ZwR+3oSR+P_i?YpuYnA|Vvu|f#7kYcTFX31th7B(!^Dc0zSK*u=EWDo^ zr1_`!1IMjbaRNKV6%3FM3sA0j*sRgI{)F;S(2oLWgNEP9@e1(VoN}071yIA6`58iA ijYV>sKwE*9D{u$qqUs7ofe_UI0000um4J>>I3JWR&i48$Z3o59L;ZKBh zK8_{01ak>rGTD5yGZXgPMP`gib80ciOy1c6JK`6}vb+awDe{B<8^ObzMuA zWj(^20S&Mzp2SzM3UC>Q;d@n8jKlZ+SMV3WnrmtObA*=I+|03Qnh!-$G-X+`EX#g$ zUB83*2w40Z(1q+nsJgEElIJ;d9OoJRIj|as^$Ps~AdC9Z z5x4+idJm_DVO(RS$@f>sHMF*g*c=relninW&`?t#gJJaJOa{Opbs-c)-jTW0Oz^a~ gRf!L2E7MT)3o}7Q=S7F2g#Z8m07*qoM6N<$f=#ZXVE_OC literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/group-open-selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f9650f6fa4a30cef7c14a88cc6d66aae64068ccf GIT binary patch literal 829 zcmV-D1H$}?P) zfoBg`F?i(kWU$e7ce>T!nFW5=V3aFJJ?G5*5qu4q>*>*YS9~ zU8z)L=*$IRp$cdLVJf>l5D09I$K&6SS!ne8{jYAf`yy;@z`&fZxf`m`K>!<=FBA%e z*9&=vQYMpm1smtUx@w!9%>r15;$^4Pd9T%KiId4hISh?Pqap}`7d9>d8|zqIn;pY3 z6vwq%tsjfU-l|Hxb2uE{8I490vH`SDf{`&O(I!0wZrW_NrwC*h1{EHP#o}k^Jp$Lj z39zc=i>CrzC^rX#K_e20B(XLfcukXFFt`mt5&Qx@K$VyuT2Zn0ps@;0g6rUMsZ{zh z91ayDvf1oM$UXp9z$RE>ZL({#3P5)nIc4w@h@ntuhc+T>gk9s<4g7w8oMaDlNLTy) z-Bp5ola-a z>-7{CQ54%avM(TW2b=|KY$94~o>xFYQVB<(4WxWNUrDFaxmkmWMB*JzN}Xgt2at~O zm^Gqz4J%Xy`Z!T$ZkNmTQj#RO+wCd@9Piof_Gfr@3!Damo-Ou1R|Q~9tpYU^%1o+O ztKU+o)O*!fG#Y&)%kmFAYXUmDBx^oY1H3aVQgb>3ZaW-~=kpWh5j zjEoG-OiT=nK>E+`-~WSsT#f-O-5M?gK1^@s-+q1b<(5|rn0000WP)KQVEfU1_@|wNQ1;kAljtTNUJHu1k!~|6I~dW>?Fa&9pFY|bZK14 zp6EswZj43?0)7xBP>d$T1tK%;%)Ig5wj|TL=ja(Y~VzZe3%CbbT zu~?kV*{Rk5|FR^J?hfa=yZd+?VxM4wVoNW8-zJV*3Hk>YBvB+(p#;Yuj{(pj{faEh z(JP@v5a)^&-q-5|fd13|bN%0&58JmXoDgZq1^^m3J+{f~>H6B%+Oi2wFEFswDhGhT zvh15k&>s_#1?V%$ZiGg7f(b3Qnh>uGZ-nW$l0An8Zc|9BL$6Dg)SpXLB z2S5~P3!Z-PjCc9qfyQ<4#TIC;asl9NHa|Wx9K$Kcey0Wxl+bo!F`ITHp$nfuyr)?? z<4`UD44dm{Z;QLTT;Fio0Yz%#a0bqwU4UUl06#PNHUBCBfJvW@hcA9qC_n((vG^go z?N7irum-ki&8jMgN&&of9BJC@>pA%;AqYfB@FX(qe-C-z!roKm*LJ>4fzHZPjtGr!SEb*!B4I_DEC><$0#>O zEjNQO0~=|-t~Tg>u7&}ufhWiJ{T&LGtZEskq-Iu3HA9${s8XR0pw2+e8Tbz}y>B literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off.png new file mode 100644 index 0000000000000000000000000000000000000000..20cc171ff8f2f73622f70767a0121feb847abb14 GIT binary patch literal 453 zcmV;$0XqJPP)As=6vv-Qijg=(!Jvbq;+zj4I-2ULLnu@_Nk2rp6uM<{?8oTdLc4VBQsPjng+K-) zn4uEo`tIo2#H68u2giH&{{QzQ_i`CR2pnSx$AD1A(Lhq#7gZ`1lF#SC_kD02CzIw) z1-094sMqUY+jbg*X{lGs<#No#V;U_6DwRst<#O4p)oNa`SY*94(lf22ew74_fp8X& zhGD$7S}j$UW!96;W}(?^s=Z!sLiK-vBuRR(EbDf&*-VzpB?LhLi^T%4{yH9yZ!ji; zfIi5CExN9IZkpx?ZZaGW-w@hIpOD~X{SgS>|4Gv{^fLI#bUM8pjYcn?=bd3qq;;yJ z@A=2G>)$0*=yW<{Fc@IE`$`$}Q`{1-QJwnuna9XGQdJf9e)Sg)_C7pZMNvQyV*dyt zARI6h3I%918f3fOhWlAAiXwEoU0AJFF)adGuh;Y0Y*y8EJ!a$u)B$~;{LEv9-Z8W; vFt3Krf2DI2?!w|eD6Acn$ES8s`>**M?~v+lI_3Sf00000NkvXXu0mjf(;m`C literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1644a77383b5611dbae3746bc74118a81c11e015 GIT binary patch literal 1023 zcmVm>33Q1NBdXC8lXR zYA2`e8f#li2b+e!5(E)M`hH*gAt3jCr#P6#mpr)d?!Djr?%lh4r^)4V>?TRoO(Fv> zw}jMoR3(9Ux?GwQgv1~+UToPRC9<<(+is92_{4Ycq|-EO0mT8JD2vHJRYth{InU=ab9NF;C{f#kNw<5{8q&t$k+WX$;x z$)QbJ^`6V+dQ0Iyh{a;kc3>+?1>1zkz=pQ)+v4KlI+6K8cArXZdEX+0F!MU)$F9@q zT%pwm!{M+Li9%8!b9{WvXp2Gk=luM(tcL(&6D@ zEE0+2NfnYgIXO9)ot=GSFc@~p$47cGl+?)+Q9|%fldksl^?i3Z9Iq)7N!-qe3gs9> z)F^s^>FMcJlgWf_@{(d9mlBbrE(J7DhkavX!#X!NXKQY5)?(|3RAgpm=2cHm56CQ& zrb-=!zHu_jX=`iigZB3J-)6HpM{P1GvNO{6bDz)W9vmFZjEs!Lc6N4NQr}ZjU7;;} zfdMRF7LJu`bMGN41q)40O(q;|Y)OfP>3d~tZ0s?Ot@Zc!hpbkspZb2>NH4rU@G9u)>SC1a zY-?-FL^g`TCDhs3DP4ey-i-aA@io#AX^dx!!i&okm}@?^q75=Oo9&|-j#BA(M$URQfJ=@eLQW+grBn8S9E)yUB_M$@ tkf|s_0&`ryiBg2Fe>MTcTS96<`UCs^!W3?27`y-g002ovPDHLkV1nJZ>i5QP&7)k?uoL`W42QbBR!rXu<#ZbVmt4XPtaYvkQTe^&#EG57jm1dx=V0A&>4akrq?;$wAwVF&XbRA z98c9Ea{gLvZQ{|Bae_{)#yW~KU>W2RN@95B-UO!jNbnlV03y?9G_Ip4dJV&HKt49b z$~T+ME9oHOI{C=}f#-S0wOZ{i?qE5UO63;*XqHA=E${pOX}w;*w|WfA<#H>XPM^SU z0uL@Zgh@cAz$#b=dqEIfwA<~jnlWLA=4a%0$GmhYQ>!!X3X$vedQBDLZ-bpep>SC$ zm8#in_MEsNh)37L&q-?V<2cT~L^4E0po^&DL$C!FL2;z`)<_@M>zx?WCpWf%^9)?j z2fA+oP~MoWpZ<&Rq#L82^|WvHpwsC*&Qgf(3EjZfx}#UZ4x?Lp0GS8&%C=sxRFWx_xu9<3s#XxADVjr0000 CuGX{w literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-buffer-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c71ee4e7d5fe77f52a2cc60830ee4142c7313e38 GIT binary patch literal 1146 zcmV-=1cm#FP)@y+H+~;9H`m*pO|J-@bz2}_&J@?#mA+x=` zedu12!}k&yx%^LPw-dQG(m zC{Q-R8YqKxaK{K`33h@ETxDz$GT4i98Ax!?vY(=^6H1A6f;rdhOZH3Xp_FLO-BCi; zP}wy3?-ry-FLP9)^K0YtR( zM{j*I1jV(dfc7`R23P^!Knp#U&>;zjfT3iLFD@>AzPY(ssnu#L5vtYdsyhvdbJ03S zZ5I|6KEs!7;s`duc#%GFQe*Hia&~TR?%PoCR&+BnGv8#h*}T3Egb+^7Lh3w@XIde! zbIsJ$)Rm5oj<@mgEb#XIrwm!d)`N}i&F=2*_vh#5uk8$&_8T(uot>SRuzdsc0DT?C zCh=69OPs{mqO_l!1kZtUeSLi&EiEk-(}*}XJw5$fS69~u*t`YIjy`;1G6qdU`sBZ) z+Hmv;7z7sv1_s8KmzOIB4$187Y$2D+eaPB#;Cavm+}N&U@E6Vy#vYeWd_3(Zp8sj^ zB6w$LXz0^&xx5}H#BD0}_xFFyn)AR7JO;FV5a>&vsmIooAq{}9xmoD}Pk|h;|2zR+ z0`CqF4_{teTdPK-3WY)`pU;mncL7M|ai9-v_0a?T)^{SQ5FvMQYJ7bB5rbORsRGm*W%^oh=Ql<9x z_LuosLT~qOk`N(x){nt=J6A*Kb-sTDe*&M8C|i>AiTDFt1Cpr%k0+0xuNfPHpI7+! z3H|kka>tL*TjupNOL2+bG9OFdry}rel88EYTmjbA7J=>b+QdcQ(O;SIx%zt*SL(<* zii?iCaR$x+i{Dq=N7DyWQnrYrkYT8=4Q)){#t2F%LwXAtcx^4#xJ^Ae`uHpEk!lkc zeMdI&xhCgL3nB%_a5?&YJ4e$V7k6rr-Y(I1Je!SJAwn9|DwWD=W7Prupu1c2HITUB z5Frb7Wps4(OGw#s4n#_&((2gQ*jG67Qg}Oq66!z zb?K2M)==ok3@icrg@jZ42J@|mq$J_dIVS!))I^BIcU3~S?5+~}2X+Fr#-|^yX8-^I M07*qoM6N<$g5c#LjsO4v literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off.png new file mode 100644 index 0000000000000000000000000000000000000000..281ae05dc8129e3411c1a0f51d2a981a7caa2a29 GIT binary patch literal 603 zcmV-h0;K(kP)fQ2sEo8eD9YFp`y(P3Pj`VqjxqyUEGP$pGXh;nIjM4mSws3s!!9{(v7pe*6jz z4ekH_{revt9-aW8I5S9-sHmuAH36XJ z>$#vuU}t1bLPxypi3A`OiUOA1qHo8-UjA?Z$NeG%*@PfKy??5jg49P`1m+L zhJXOrYuw!2!9YKA0BvCaI-dckh(Sh1hT+SXFAN|{fQEVk4xfD!0-ZXmN5h(7@FWFST^4nR>~1jMXB+yle`K&%GDFMyZ}h=qW- p0f-qu27zdb0V1?0G>U2l0RVDdoiXyF8zcY#002ovPDHLkV1fjO1F`@B literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-case-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2f176748101c10c1821d03f51a24ee810f48d7 GIT binary patch literal 1477 zcmV;$1v>hPP)yCxwWJh)=z|yl!}Vdkcj^A$E6n#s2>Omy3&w z*FD)@WL@E|F(LqEbab>iARs`eR;#7|y}doLv9V#Dot=$_?cPN;b!X!ip|G&9XH!#C zb-B5@0zpYX2u2JI4TS=!3Vis{o%4&Vxh;F7=~`S|oKUG$g2+%fkByBLSbO~<8+x*F z8BlzDyl-e|=&MBL;NXC=OaXs{zrVi#dNtJXw88&fcNvh)W_tzv2>_wV84(#7IT9Wo zet&awQ=$|V73GJtz4Wjf!k7QU=(-FDBsMTLB>n2@swgNZxRaBUW8|EJYY6t5t4)yV zFjVM=I-Tw=khHiO(*WX`QSSSe$3=}ajF&dQr6@32&ax#GGB1o^rrVN^a5FrKpsS&7{ zoSan6&(F8wFh=kB=;-)3FE8&liv;Nx2?+@*sMepgJ=YjfSqX`WiIate zg>nt)nQCuuH^A`DvGH>TgW1R{^Nw6sizgoFfBIy*aOGBYzrnNI2e zNiRH^HpelFmkEfmySw{a5P1-?Q&UrufRt&KN+tUkD>u^7i1Tv@B_$>OU0za8u z39N~UiHYr=o*q9(yHljbDV{{SGQbOIOefph+kylJ%rXF8u>8goat^);koRfynMjMp zvLH{1I}nw23)S^JgMiK-IOs5tx1x7lMWx1355Y2xr^cy(uqo3egW;{t@&@_ji5#u$ zfifrx$gP~2nIXAbsR#6~Fc=(8WM^j&x3;#P+V-_+S-1A6PKg5w)Q#}V@Yn<7qLRER_io6vYs5|cknB>xw*Lo=v#qoNl{Tz z9DED*BWL5J4P{y{tzP=ZrpduRJ4ez$knwpyW z>gwvMfmRT!ab;yi{%Im0fsVb4cQxoBC})R62z+@NQ3v805GY@fl9Dn4Ln7pMfOB`j zxqqgnrUWXC#qbmYNJ&mk9!Kx`3e{x7)o_S(?!)JNWo6}UyNkl7{+IIc58}Is7T4$tOyT6V6m_mC`6a85vf-Xbua@VN%j;X7~(~JI! zxr_DGVzF3&c_gNNe_Br)u;FAbms_VwKA*4CXS3OL=79+K*hj%Ba2gy3%!z0fc7+f~ zMx${>QIwvlszZy#@_0BLju`9p`b(%Ug~MT6wOUOh-`6y4r`c@2_51x!)Z|&ABgtg) zA*aAp?@+v5EEYd7j>qF`i1lu_+urGPHq+_!MkbSa&04KiE1_n>ayrp+xm?b(7z%}+ zqUef7qt6*ba0Br&I0tT8t=5p&>wVVkcE4jfp6o@m!3n~m&1Q3M!?t0bp-rh&Dj$(o*^B(@p2OIwR4TDwU^Y%95|41A_m~R?gHN#eL8H<5${6b_bi6yq z>~{M#c){gzy}+dmf%{-B5D2_v-r;au#UYrv_W69*3x&chOvw|Z@k9l|JCVA1Jx9$Zj`k8LuU?vzTU_oLD1N4;Kev|6q1WTF*LL^W=@3^?W+@EHXS z6G>Q`feo;>33zu-OyUFZTY!i3i9&|}zb_5^_H99o-yCbS0ayae(YSX6xJTW)l}!Jq c&Fwex6NC~HHt=3V7XYra+O<`isG_2`hEZY^SdBhFY#d?Jju5+bLN~g zXU;h@^Kant@^XMbk;3i2fo2$E}zG6bVZo=b+4El%lEJ*GY# z!eVql2ZRC70a}1$2kruQfO`NPe0szUt_7?R0vOC@^N);zHw_I9{f4<1Stby3Yub1c z{+foc5Tg?w8XCG|adC0Z+ZpzkmX;QxqN3h_Oax`0WMN-AzD}7M3x!ozS7(QWgmBRn zq}6KmRaI3vU^1Qmm-ZEUk1}|`A-R}?p}gK`G-mrUlAfOa4rKtXtm8}c@%XDl2W>jJ zF)l7{KT@-Zd5NZ`rfw5rY`5EOkjbPhb--8Bk1A(v>6cD|0=gvg7 z05`zM>L43L1@!Ne@Qf{plQguwzrX)FcnW1?Wc+a8z=3*&feub!CuLT-j;Dk5`p zbJH(gy!g%R>}-$A<#JHZ;c(owSS;-)PoDe`GFt$yrN-3#=&l%e!W_A4*RJ=SPN!sq zhDJt4rlEKOsG6Rho+pol1?(v)DJJkY0d$7ZiMV?8Y8B@0d88ivb-UdzM7svEF9A%c zlD^d`W9Y-m%F0Y?wOTnnt*xzpfj>sHx3~AAl_)4ENK;W!!NTWGDbFZrhlhu4m}8_Q zLcJ{kyig@VmQ;xN(dz2zx4~e_xe*V+e<@rT(HL`^Haa@mFZPAqxcBVY^Evogz`KQo zgchztgC7a-RI!j>2Mz&8fTKVu za18hg_9lex{QUea@X~I;T*J#mP8#L9es(3iJ@U(VH=^OT3A@n zUAb~)z+^Jh**_SR|>c;Rkz|^pv1zfSQvFnS9ie3gK;?zcjhleXCSEtjh zgACtEuI(Xu2BHHSfH!d}#>5UDwMBYZSBwf%&IPt?-MTdcj{kzv@mbvWK#dB%Yh!F|>}Eql!|$g~o%$Ka{+7^{ z9pWk7Og{+EkLT!ZYinz35Wt&nG=HLJ_QeN4IqEcV@8ekDil$Ms3j?Q<0Eh#C9 z2SB20*RD;V;|3N1jkhgHVAT(cnsA72gWqy5`4L35rz&9 z4jxKKNZ?ZtU@#aGa&mG~kQz&HaIj)0FE4L*Z*T7)E>vq~W@bu!eEcTahR=pY_$qdC zL4=ZRadGia;4{=80fnpZF~*zqG-z8?JCvuDr#>dp7nUn^zM57-bB6SEiT zQC@bd)p`eyCv(0ZcnwHdh3y!dl9Q89;E8dH1t%vbE#T)N3PA;Vq(ZViXu(1@bI?eSPMxuCANtON6h;Ed>Py&*Kw! z0vBvucX#(FE>1UWIdSTyPoF;h=b1BSZU}j~wV_o?f(6Pi!Z;uqco87+-7*7oh>t0Y zQXv#3>yCQy0HeoSn*T!RICXgl_}O6qc=?fdVbTukmY*lQgIMr^dHKoB)jxh@frXC002ovPDHLkV1fxS94P<* literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-off.png new file mode 100644 index 0000000000000000000000000000000000000000..19d04e2c52c1d113f76acf69f09706312146dbe4 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@RheJWm(L5DUTNKmY&RGn+C9oANNu zH0#MF literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-context-on.png new file mode 100644 index 0000000000000000000000000000000000000000..6330e231061ef173d9b6ac658a89dc819d5447ac GIT binary patch literal 248 zcmVj-kd*{kV0c$ZH3K0aIqSGZhTS5q3i|AX3 zP~-oE4rw(JIRam_UXfYzDFyo<_{;nYnyrS9$T85lC+uZ#M)cw=v-Rk#+Duo2J!tt| zUJdLO>%DYpQ9L**Z}K<2^m}-D1C9awNZ8BDFRo^dJ#D^LE-Zg9tIas6r`j5gyXf7l}gJCJy&&%D; zJK{t7^RcppAU}s%b|VI0ja-BZKsC!O+cUa0s*V;th@aeI2Z*ECHpaU~*G7f!=yAJ; z@i(e%bPpFHvT2~RKGk?ohTuvg7c#5px%Bf8ml;0;amd)(dIyNxPZr#Z$tVc9S4a~* zj^`oP<0qP7ICFr|lTBxZQ2r<~Cr)3rX(G$d@ppC(PuNyXrk3G{62cyq z+{5@H%RBLZ;6leV4n>{S$s##wq6ajh_o_G46P+Td9MYY!m z5cJWWMstqn5b;B#``Xubj1Ca5H%~hoh9{nOA+!wW;5JP@J^(TlAlp;d0Ll1I$6gjLftFbo4&EfoYu3{sXQ#Buyg zi>7%LMMqXkF9Ae^6Ump-<8*TdVzwQ}8M>~U){ggzqCgM?#p{Q0(d?H z{kKOPz}Fe*M>z3STph@|uGw^dQj!3| z)3_u_@`N+8ljY^lkhx|MbakO1Y4RI+Krz6$r$r0-2kyOKym4&`;`=wR%l>c10DJ>E WwQ?lp69GT~0000LS6n*2@U_?O$K@rvzYcE*1Y-bUJ+@a$h)7b_(6aVzGEGmlNr9S_A?CSA^#Cx#;)%qSx!iiOe0H z;G60cETM2XTr3m{BAHAIuh*-Jb-V{ifA+{pCAZq&R9ZL znxG8GwA<|)4#dfRwOYLbIhcj5iqj58qzMYSHDCZsXRJbsz-z_cE?ZYloV5y}AW;Ku z4H&@Enbrf{fr89tvl~c`BHzVOFCbDbmu08vnnFv+QV8veiOWrPjwEIf*1;6AeyCI` zxtc>3j_#>d$m+5~%^}x>K4K2pki9p=al}d%faJ-KxkFF(b_8W%nGP*AQO(qjDo6Y2PvFn81W{Fsk z0oHgt##Qup`~CLctU|R~?Xl5ld?M#yBodML5I(NK;DE#7@U_`&K5{the;pL? zz1!`6ZM9k#G^NjpjOm6D(gbDd_4-pjpZ`Vp4=Pf2gyIx%N$X4%=wk1cV()3as4(mZ z!5^e9Xr0rN1y0X>?TrFaJI}O~WB{xq1fTzE`&H=&QalmTiTe&0_A$u9VG8;H0000< KMNUMnLSTYFY*3&8 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-highlight-on.png new file mode 100644 index 0000000000000000000000000000000000000000..347240417caee9a0f8300dbcdf12d408b0d7e159 GIT binary patch literal 348 zcmV-i0i*tjP)V zv8t*ndPQ_zAwn8GFQk+r(KlcS^Z^Bgg064`egTUcoofnV|sq7IJ$d@|c*AkPhOYesXPO)%{ z+#`jgxf>AI_X;kbiFNLgLR`m=Uz{|YNRJw}glWMOweW~lgF>h_^(ZLBkFJGB+#@|Y zmSt&pi+?6XQIwz@JWUGeG)-3^SYP~W)LNS?%f3>SX5o*3cWz~NN|eYAX1V$blqM7uE8QVNEVe*B2R{FC5R6*l#o%N8|DMZ!Q(eU~-Zhg7$$GkzY8TUsKKZ z{f@#{h>P41Qv)_de&MK8b`khBilVTP>OB`_Nn59@QM$ zKE&I=1CE;We$|s=WgwJ;1v&1Ulir1yaQ=(=ZG1o7xv1CHzU`u9$!a}E;Tp>o-9IE=vMlat&ghdAVm ziz0Spo^yAAFJ{nZ)8@rdt0>%=#<{|I^9Q&9egOlv@h`0^X*)G18_W3{;O|?20(lh8 zBZ!NHg1EsFyup&+GEpJ+qDsqnuu|?-I**{~VgYAzm5x!J*#uz_MKL*r5v=5E#bD^v u_}VCnA|4@zZDDGKMAREP^8V|>rTzm9=Fal;s1P&&0000%Ds;a~_LcazCjQxZ%xyDrt~yTlOycm@pycv zyxVTKuUyY-1=R2Nmy^k)cRHO!Q4~_w>2!o)7+#iTOKQ0MV_qwuAP6L6u~US^<%zdL<7KGOGesecvaizgty6=kr-umi7HJSdF5n=Qxf8VF1u>xAWHPwPIBP z(T483-L5?t463p$#c((j90CwlhF;UEa*yITPB)v)el!}1@pvp?wLU#S>Oc=O9vYU) z!lyc>yg@HXl6e@0KVbMK&vTKc>E(`)Rcp0?2eaO}V&fjn7akR@v}_>K95lkkJOJb*)e3)LPYl2(AYD Y0(7T~Wit~q0RR9107*qoM6N<$g5H?Gm;e9( literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9816b427e95950333f2dd54ce4dfb224cf051312 GIT binary patch literal 864 zcmV-m1E2hfP)Y!_1({(^RKF!c{`stsE^ z)I>*PlH)o!=xIhp%8fdQ5= zAg2=%y10uKEO)i&9nF~4Y@9&8LQLR?HVsNhp1!ZDrZ+3RpT3K14`T2PP=I-uJ zJXl5rpc4}l1W*?j7j$-ZW-*vO_IWG&^*h%B3I>CzL?S_!Wl_Cer*gTBe^1S3vn%)H z4wE}r1Ha>_KQ&$Ag#aSm+9+lHoL)}C(GPle7YtHKsY8algVU$uvmU^ z9%U&E1IXf}?|B3yko`<=*a__f_4&w#0fb}#wZUVVhmVKJpj6b(F%Kme1P==cIYw#& qt8Anwq-0}25*f@H(f=y?)Up@7B)8v5z&~L&_Z@1t+j}*fHklPG!T>C6X1i0QGDTl zo6Kl1r*f;+x{ji#!@gh=lN{A$5-ESwn;@jUAPAg-LT)2D;fxAod(#@E%~Gkfj#sp4 z;og9>yY2gajRMK-kbA*PdmrFa{)J}%!`7-26eD~I4x7zp4H5SzI{YR{^4e~O}`Fqr{EbAVz5Q5_P z;{G$aCaGyr6k~{G+zB`a8=yk&20zxQIfe6(60)PQnFp(&0(QYgzEyYyBiDs$jfg1*{9^IF8q7H0}tdW00h2t-zFo*78&i29P_He=>48ZGrq8 wKT$|pT?UihUW`z0qL3t~F*BoSivHq$1FmSG0AN7lE&u=k07*qoM6N<$f)c05m;e9( literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-preserve-on@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b515dcbd51601307fbbdd4307d3e2d08e9ecf875 GIT binary patch literal 1053 zcmV+&1mgRNP)O1BoWY$rz1`lMW;_CL|^%t~#)}Fu>x+5saVC(oeCL^E!u(6>m zM?~V>`1tt!LZPs=FAK{eHrV0=Utt7->o!6h(_kuuQK)54BWBcb1lP!h@_ zN^3AlG3SMpFA5_ldqs0kgge5Ja80;AHa7NfWo704uEeWrd#+R}*-R$$dS+(krfg{? z$Awzkk$#;+{lT4-5`>aLrL4~oZV3(XR` zA}4)9BArgZ4colY`o_k_8^=#fIzA4z9FlH533+yfH=^MY?!Ny1eyXS?iO1u&WOzy- z;mN7G*a%SxWi_}$r^MCNo4n*Xo6Sbly(6kZcd6;$j*bpqu2=XSG^SF5!Uegzw6v58 zE-+ROM8ws$)a)EDYXrnbh!Ad1Oia8|Dbsg+Qms~Nq`(GdMI#dx8T~?#Glvk#NVWa1m|a>P4MJjE6?^gsA{^Bpfvdzl^IG(RRjBm? ziyA7q2_b`&^&CZtC_yGGaEJX6z6)Q4Z$f%?b@iiuTM~VqEX$B;HVFB;q=87%Lz%H5bg~R4?kO6TwLDS*(vyTwG33L zg@uKMWo)n&5<*vS59>$16dQ_Dg?v_U2`7XL0%LNF?<3$9H&-~KErH|zB9H=nB8Ofb z(%Vv~j}PhuY}BX;(*t!b0{J XSK5o&b$p%>00000NkvXXu0mjf;Wpmc literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off.png new file mode 100644 index 0000000000000000000000000000000000000000..61ff9322f3843388d742bf1fac0eb0221c691904 GIT binary patch literal 511 zcmVBO@a-FcSWPf< zZ}a*2`N3*{Vhey?jFp#{XS#d$uCA)8YR~Q4w|~M6Vnk0zKY#x8n>KA)(v>S$oS2!J zc|}D<89-jUfB!xM7Z=xGphc&0b91-K%F1>E4f%u9AfN=}n>TNa7c5v%^Wwz|e;ytl zu-ae0elY+oy&fDKTxVipvK1)!9cBoK#&8kP|8BrA=~Gr#*4EL{Vc_NEW%&2+AH(O* zpZ`C5_KflB)vF)hzklBb^maec;NLLAFajHBfTy~;x;8L8-kY17um1Gu(@$V{F~r2g zOcxLkxTC45$uBJ}ow$Ghe$*rZ3L|9v^5sjHj*gBkU%q@P0*Y%#MMZs&h=>3(|BC~0 z%(7+67O!8wz8S~{`vypZ^`jU96=VU@ra%m$8EkEBzgt^d1DS9ORe)?sBtF;-j4*=v z8Hom^84e(BKoY}X5@QgCCTs#2fsIWOF=A9R2moel>dq73$2I@}002ovPDHLkV1o0` B)gS-> literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-regex-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cf88632df581ad6bccedb23d948fce2f3583db43 GIT binary patch literal 1204 zcmV;l1WWsgP)MxvKvV&lvYTlfXuFuO_15mX0uLCXx9{z6sLVfMTIeiAE`;{dPRgv&=4Q1 zh?mdv^70DechAVkAeBlbhGNfndr?u5t+=@O=WsauP5gMW|B49V1^gM}#GIR(dk=)% zAa)O%>)2^#W+tiCY5{}c<&Bkh$!KR#sN%Sp^R2Si{C#97T{H9v%{K)ZEd>Q8Sn#;v|uSA#E!Ip z4X^|H+1Xjk+}zxUP(#gE5#RXgSQ%DjU|`?@t}Fz*2lxqCiJyDbf2D-P+M%JL5|_(0 zhSR6yPiU=XaH3-O$kh=E~uw0g?wY60Q zYJ43!KR+i1lk)rhw6L%sGBOYd%!6b<-gAFQ_>hzkB)gyu3_XTU&&Z5ru6U^FQ9$*w}sHAmNX+FhU&z;^cN!RTZ_h zwTbLOy&(klabsiSL)4@Y>JBmRat%8ij&T&irzi_i9&2c5pq7>vLUzKHstq_z;P6UU zN(gE1ve|5l1qB7PzrRnLo0}1&^pnZS$#JCepNN$x#|(q(O-)UWA0=X@zrX)WjJctP zuyGma>+AatME`rwyh7t;M@k4&H3;U%UavQdD_a~M9-bH(8F`$apYMn5A%Ajk-0+og zB}W?vp4#npkJIU#?(Xh(qK*eVS^r%%&u$Wj?OeejN&3E1?^wP@0hJe$xuc6#5s!=jB4J SNJF#$0000)0|Ca&V(CI}6NOB8Jm73v_4(I15h zN*bEJET4Vn;rrVPMiSp*m-T2?*mBi)9w;1c?IU@AdyI1+ibQSOtb)s*k@)v zM=AhxOBRE{upJ78F1iEsyi%#ujn!&BLeDZdp_(u)mk5F(7K`nb%jM^ux*N3HZT4BR zEH{$LWZ3C+nm8?&;Ed1|C2grxs``As(?+B5PPxnFie|Ifdx~-350WG;Vk*r~lgwuG zdL$A#HX4lwXxxX9Ok%{lpxf*9hCLq7A!6=~m?Me|cpD=K=D-=S4$kBD&qo35ts=hz zr@$syfd3m-2F{2o-G`<_*apqu3P_Lg3VZ_9hxiF21v$enBXxsTn2utRCot_*iI6jEO|T#t>Lo9X19N zc1;Wz2#F>mE+k=LFv>t6fusWki#T+6jq`xP-+#P!(!#wnFx{}=Oa3|ceCK@U{Ll9| z_ulNiy}hjCB&UuO8F4uwlrADC9!lpSN4g1i1gbZq^39l#L85^6 zEGPt$5ZE+Y5j(Ox3ZYzfJ0FY1d=7`>jCS7H+1bj;$$3$a2BbccJW5h02oV{DE+NMA zc{&=)NYZ+UR1s-Gd7`|C1LcY~EsDqE$wL{>MaEc`VJkb$N!q5$ujFDF91tUMa~L>N zUtfQb_5wHu@_`5`hxUuc9N5ZEx%C*h(9qEEB(3JBc7lq*4j60E;^yY&SEAAA{i&&` z+jVty*U>!#UI1_Yi|E7>J)?UaJP%61<({6N8-YOJ&!wfMpXfgaR0OA(Zn>|eQj-zo zhLW{%c6QdQ4J8oU9336?l$4azGS*~4=pFReT3cJ+n46m$#Uw5}NpElO2aL&6xpXb} zwp3~|qS!k<9?wns$whfi$i~LTz3%RA4}`*|PUI>pE8XMc;{#M&)YO}8Fc`dBQBk2P zEJSCyx1~~(4ML@TeSIIVudfHpMN_qq*bRk3n|5>N=jVTKY;07>&uR}VSSmHqAXH3y zmGHPB_6rV(*lm_dzp${d>UO*PSnDlt1t=A=k4i`ts1nu!uY&gp$E~5EA>S^Nihwz` zwzjs_(b3`M;`{>p8^8sg2CBA<2<2g@YN-bGzzx1^X=(XE;W0P1YW;ryKV@ZQ9_D`z zn!t5X0dz=}{*ei(%2f8ccb)~;%FD}J1_uX!rqW_oB=+l8R#pP-?d{)U`x>YLPXKx6 zG;=M}#ZsxshzQ9;#igaCFAWb5e?<-j_iuWb{_^tjRA*=ByR4;qNC$LeLP%wQZeU=b zk#hAPW@Ew_4~N4C%H6Py6UHCg+S(NUd^xhi3n%?Y)pIV)slQEKQM^UczK8|WI*OV_f>5=sUS z2p*MdWvI9O<*KTxE7Q}{QJy!zUqB(bNXWj)M|jSHbhx0PpoK?2&?ib6D9y{uE2KhW zGcz-j^yk6f971aykW`-n+Aspvz#Yiw(^MoyC;(Kx2_m!)$~v8UK=bc|6~dek8LhPf zWG}LoVoOM2z)LdJ!fLg+M0ujm3|(+qe7|g?*aAVId1`f^>9bbf+|ubI&r)ndX3jQ3 zrz=2^*F;VW>OQ#yl%!7q$z7nZ+yU~GDoKZyXOp&^)s~R0hgcvXhH)HX5B=KER}RQ) z$`_qnvI?Y2+(on^5oNB3siM_SDQP`qXU!f8gYrn8QY%q76h?hTChsQ=99GhLD8)hw zod{@Sa~<>dM`IaD#vaOOw?h~y*^ZT*5K0%0{{TcdB_=Ab6~zDm002ovPDHLkV1f(@ BUts_M literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ec59580a2569358aaf4dfabc766cbe1f81739c GIT binary patch literal 377 zcmV-<0fzpGP)|y6`e^a2=IDML_|dT=g*&q6ciNF2pPnJO99Xo_QJx# zD{X9S#Q**Khf5h;9IHWMVq*Dna&kSkwze$%{QL~xzkg@Y(9rn*_wQe@#xGyKFg$<$ zoDpsckim$Yj-;ifxqkinHA6>7C)UEkf`Of#9a$}$ee2dOhGol^p%{eXA|D?g)`t%t z%1cU0GB7ftsDm4Vi-F=IpdwZv_HAitNd?;K1~ia~gM$O?wYP8If@zRJj~_o~IDGgp zicRPSfz*M3#rpN@Q&+EE9WEgu!TtXIdxrV*=Ql#6;A8`w1!9202nSZUa^*^MOiauZ z7Z(?x5}fM5`f(Wo6X*Nz;X_7hYU)`^4FVa+0>r+A48j#gDBdTAgExy1V*pGI)eHgv Xa&+{KUk0B700000NkvXXu0mjfrUakS literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-off@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..503e6bb67a33cb7dd7accfbe95f7f04a5ffcf878 GIT binary patch literal 829 zcmV-D1H$}?P)){(mA%&UuMauh;1!ndu^d zVJuxhvJ>et)MZG6V zYzffd;NXuq_A~0+_4Vd>Puf&Q%nNL{z=-5uKL_UlX(|(1TySv2m8l9hUOlDG1V*?xf9{gG|nY@xprDjlRb}n(QD6Q-@ zFbskd^SIIY8F%v4)m5PY^#J01d6S#)+l4~GpGYKT(T@UL`rHh;hUle8bhLFdSZGRYTV0*!7MxwkH=%VTy6>< zSrcmr8l#n!72%OIZgkqc5kS0;6@C{UNvG47Ao}~bca};e%4V}|0s7PCwRYd)^#Up=#S$ZCae700000NkvXX Hu0mjfeVBjo literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-reverse-on.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ebbb486a478ddec47bd1adf308768167171913 GIT binary patch literal 408 zcmV;J0cZY+P)HLrcCeMt*B__)j6_rBh{cV%T+DqYxC7b2w5nNY8-BgWVcID{$2FqQG89YKIh zH4I}IMbQWXnoMMtr(rJx1^R(Q+qQ4wI1W*#7r9vGiQlV4wsGjlah#_t%Tf{{L+%bZ zuW$;lQkr8P{Bf0C5C)#-y%k0AgPhdB(@~tCUj&N6EX&e^Aecx`3k3*Wi9+JAS&}6E zJkR$*TF3TkB(91i15SW@*LBCZS|K#>F9fgFQSE9d(u~f4TfEqNnx@}e0l8P;xxxdy zj@sh9_(3s@mh>37Hcj&-48s`t&0dX*LS(i_@RypVJ^H@?fw*yxSk(o1b)&ULMg<1I z0q_a#7yL?-3UM~{Xl``f#{XKY5EpFo;vThe8|%N#2YC|p|Mm+20000+SmHO$aVJ_9CEM>aV8|r*&<4X$Ue0+3_$a z3kHMLb8~Y;^p67{@Mfy4TdBg22GQ zz@u0!wkR?(##+EBb-ln<5F6=;bwqw}Wqf@6MLZtg5D{aHw}Z3zu5z38IR~+c^im8e z&`Zno^z>Up!rC(51ulaVHb`5FS9J>w0ehR35W!Zx)b#fDb}lR|gsmj3eb)DY5NNPL z+NuU3T4X0;{EUPM6dC=ZGH`xyaPaBc+FH~~z-^yAb)du$u(xRm5oGjI?(_K?CMG6c zB@&6aTLSj=_4NQeMcMsJC~t*xzPW@hG{J+W7xoHxK3L%`lZFjP(P%N(I`7X51gxff%I|E3nYCr5i0a|H76=3$OioUI zVt!YQoOeJK$sA87U4``GZh%-g9RA+i+&nZqJp3L}Ydl|5-t>8#m=a(_T~0p;?t&-0 zL2s6qmsj&C6?rm>xEA36MZ_eI?wLsi~=zrlzJZV`F2T_|lH% zJXux^Ic2rz>In1FRVC0vsz3I+Nk1Sjt++N<6*Ad%G?3Ef5~*4VRQiz4M8tmO8OqH( zRmhqeV$zj_DoFe~u5~zjI<~wCvAKB~L`IOXRYd0(m&r`FD}*v_;C627L311Uzt-;) b%2wHbF>X+bvypn600000NkvXXu0mjfb4<`< literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-off.png new file mode 100644 index 0000000000000000000000000000000000000000..91378b16dcab1a4cb8ba9923ab593917830d5206 GIT binary patch literal 337 zcmV-X0j~auP)q)ROa*ZCq>DjW!c2|=+?GaE3>E=wSg z;<$xj$N7IgW_MgRO%uFhY43n=#y>$sPxGBaQeRg#Yn2E`kn;= z0T}hpm7}UZTr4I4Z|RN@87zvLl}lo6osG*Ae_V%r?QOW z_~~W0ZObQjp(FtmMbRnCvK^j(scGt;o_Eb5*wu-GnDl5rP>e8E)TGGISo^~GnKckN2LzJF zN(rK%AwDx_L9p1lt6maP+<|3fcIJ5Y%WUl{223#CMx{5doIST0%(49Ly zq*KUa6%dQX4(a^H>-FY69#6V za}9go43fK9|dhcswrLZnr9TV;__?O;e;&DY-YB%{-UP5=tZzLBHQG^Kd)J zO;StgIWUzUrKZvglpPlXCa_hp@UetQA=x+c`5bi@{eEBWAh(U7)YOL}91hDJ1cA*N zOK4RlC<8K$M&p_T*~DKel`cUJw!&8BX$K?91cmGxFo2~qRv|^=mBP1;>vEG|twLx> z^nhIh2C#Idjlk1xpB%6$^m49iA&DE;rdZl9)kQ zzyQ{2YIE^cgudy8nMlOzC>Dzx#>RfAi&sk*WoHN5LsX`Z;czI%V=s*MGALmCNOaYPGsg!TwMvBj`=&(n&J!&q835}DA?8nQw=VrfiVh*2xQ;@OLOKO>=RZWv^BAYiv04BC N002ovPDHLkV1n_VEcyTd literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-selection-on.png new file mode 100644 index 0000000000000000000000000000000000000000..d303c5c66a0c676a268a35043d9ac6ee18e8f12c GIT binary patch literal 332 zcmV-S0ki&zP)p^=^EW{1A-_lskGa53D_Qk_RAkS|5RuLU-HlfEuPoMLW@ zZiWkSb9W$aUlmL~W_35ih1@5OJ1!ZyYU^gWN0%(iRMiykrD>WWKie7?l2H_`K+v}N zZk1B1IF8roA1p`E>!X0d0hTE+0R~h8%7O+YupwZcPUdl;Ch`vO&6jnnAVv~n;=;J%3SNM{iJrn6kN|gZtyj=%xZnn`Fk>LbXpD)!8DIv*_n=9f z?iw2%Ff68$mtm@_Up;ENtJ@h4hnYpPr9~1$EvX>e7fCCWR>)QX+jurEz;PU|FM=_I zqkzY+jm?f2D14&-eM&5j)EJeR6->wj8^9XyS5e=^^uXf*J`jkaDCj#7$f{7lZoOVV zY`5E2VHkRdNo3^cbUIh$B)7`31kz}J!!fSJPNh;g>i7GviBt%a$w_Vq+5xgge#0^T zOeNQK8v@@h937f8s>96(XeFLml10t>lZZXM6LnBp#g zoVg+<3F2f;XD3iq)O7Z z=VD_y?*RUO1}Kn6KoUXRBoxF3OYr7M{)ibB;wY-Lj0Y>FUtyC78f_MEPOh*asxzG+ zOrj_zr!az*{HqvD9T`6xMNz~D#PHoPu|h`FKRS~B>zPYU1=&iPR>)SNFHvm0te=wN Q-2eap07*qoM6N<$g7@$&W&i*H literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-word-off.png new file mode 100644 index 0000000000000000000000000000000000000000..b0af0cab0a86f0f382a4c154d0d259ccefd5e0c3 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@TGqFmigjIEGjVCja^W-=5i&LD-as zai$>)kC3o%@Wd%o?kH(#{o=WM`^S@r38KuRw>UXDbHl>Jpa1^x@o{<5Q-@a%*gUfI%F^4gVS~W0-{19}9UKn$EO@=_u*k#7 z%_|#^&zdtQX2pU93d{kQ<;%;zA9Y~0Pwax|5)u%YkPZY7o<2>zc;P|?GfzQ<*HLwL zV~%&Getv#sX=!O}a&mHQ9UUBP(cAM5UNLwuxmmMmH%AJGUV}g1GWI+HpN1HzcUzD5 z%P*eMc*Z@gS!Cg7$D|&Qo%9o;kG)UKV8jr`cTCKi!yWQ({yZy-` z5Jy#<#UmBOLY{ICJgL{~#3RjSGn¨U}cPmCNORF<9y$Rh%UTqf`(l?@NRUd9&N? zAcm^d>IW8c!>MF4}B1s48kUn;#i?#r-RH*E@?U z&MpRXmmv1Yvr?%<;c%Gv-Z4GIU26Lb~GAMzu$N8sNx(X zw+lxOaY+0K5d2&IPriv4ZG~vH}gbiMZ zMhDifZ2PJ>8^xdL+2xSvA(!G)Z=9WnE`q#L;Nl@K5B&yQ_cX91P))@E0000Q&&awUgFQ9LT8TGVvk_bqBypjQ(U<6#~_5NBC-+jZRsa$Qx` zYmy`jn4E)Njk7}etdp`VpJ_s*Y5D|%Yj7X*YH0mqblEgbO_MJG!w+Br&OooW$>?Sn z21TQFz~ln-YUp(4S1$}cZiyU81NVSFs8W~S&=!t zuDS|*b$0yF#At~ta1Zfpo zL^BB!%*Z1kIt-rEP;GU0F?83$u;3;q)pe`Rty6XD0mghjk8F~enwu07WWV=G^ zRw%Zv1KSP5;7Stg&+-zu0A@I)E03uT@5+=RAdMmtz-?fk$mjD1OJ5YF&la@sJUb94 zr~(=(_BwDE$kuAL<956KaXOuzPbQO7_|m{lFBd*7o``dmm>URwzfdT=q!17s8;wR? zv^@v*;B;av#f0X$V#pPK!wi5cb5N;N-V6qVZ}7XU-|zR({sOp%23rumwRnOrN@sSC zBNDlW;QOUg=?G#@;rCgu*E>@P(&8bwOM|b5Yep56MR=GuMkg3GLy+XarHoDJRVO` z@Tu4V?f~QsfC-?>;&_cKF{;S1+V~e z!}2;9_Z&Q*$t%S7im$i@i~#=AP}vwx{)A<~-^&iVye0i#A+M1A1fYpe2gR(qB>$j| zk7|Eea)sDG6b~!JI6kul(Tl8cgY)L45SFWsGdD8#00WA>5Sj-;%Gcfzgy0)t^0D6v eQmw$otigP)C7Kmmo5ssUeWW9D~+EXcVHhHWwEsk%r_p zHi$Nq4@kqu_4Zv*=v?cxc;MsQ^Z0)J&v(vMh@wbV(UhxzNQ{+%I95dpG?U46rq}Ba z)oQhAJRZLehr>dv)w+@Um>`SAk`4p{IfuhRz$DY@)Y@n?uFYoiq}^`c{)90>PNy^N za=D1l=etWJ5`3{(^lLPl$Y?am0z!e983}^0$@4r3hr@Y}GC>IO z6nPZvb~^!NGMmjN3j>aXw=2GfLZNChnY>)gFM8@|ZnyggAc9+ZNTpJBz=Xv{^fTxK zszN+OH421^*6>zHEEdZH@`N{}MIN81=BwFkYAL5|K!IR-Ll#?pzke6UdNCLb$I)n% zbUK}$%(pb8u0I$I-oqq%z1}OM(Ktk?g?_&;U3YoODVtEp{(f7jR5~x0%lo*&bsVpU z+-jLjMtXpCnU@;MLDJ$jvUP)-4;)nwk>0(y1D0Lxp)l#}D1xcZc z(nTpP!ptyjDQXc4E+mcBb~4j4GW9vWO*EQ^$$aNB2^w;*nWVx{=7+=0|G4M>?sv}l z{y#!67^Ih}DPATpjO7)eiz4#>XGjnPRY5^P+C@xA%?tlUl@%2gbzy_SguY4$6{#-0jjB~QSa>Re52KBds9>iVIrt!)kL2on<%hMAd}xAXJ!wT+F9gs`dS=jU(1 z=WSWPa+7j%2+vh!hV$j%;DB0MT7F_Mc*hS`{C$0We}la{`}_Oinudl30;3i=pF9^g zLkLL)zFJJ)wY4>BYHC`9zpr7dFxEFiPfyP~larIzP{~SEAnEn`GK|Z%xBR|!mzSqcNlCFlpFZVEWAR1V6DspjXpPh}CP2`eH{oCa z$!do9y^b%|@>fT+G4As?0Fg?iqLPvl0x&V@x3;!?qobp&+_Fs;&~qiWg6hGL5_8T( z0dsB>UJEv;y1H7-ujS=sYHx493z?WZw=haa77&hwFG2Z@;^JarHO|S&5rvKcMLPp| zj1A`)c|0D%aX~11x5Z+)J1{V?fc+QQ=3z;OkcjKJO5|_}Ycv|_?Cg94<@?WB z&tT?Vgp$CfSl-*)+ng^6HAz6VwY9%5EG%3>r4hg}3t!->>PL0m14tE~-2n0tv%^ff zTrSq0hY6v<%aS1*9v;4rOVfRY2me)X`MxGQU{R;$V3a2O#0 zItXJBVRYhp`lPqF*M`g4HrD+D`wf;*y9f|FFM{>KGPo0^@ullm*i4kU7aocQ5Ia@F zOfVx%2V)Q}*b^A%O~U#EA7YCYP-y+7KPAil(s!2F;1wVVV#34E09N|%V?G%m7ytkO M07*qoM6N<$f+q2Iw*UYD literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/icon-wrap-on.png new file mode 100644 index 0000000000000000000000000000000000000000..09161a21b1d078a1631f535aa5bf8f24b1954f38 GIT binary patch literal 592 zcmV-W0nT>)Q1;I@b!7AC=Y`W-9ND0-Q zLh&z@xG;!G>vU{IW+tGWnVus$&ZHW;@WA2S`|i2N_pWb5(=>&3U}GI7^muTektm9+ z`(|W30TocgO?0da@M_Bl#iqyOdD?2V&NNN?4UMTNO21aCy+iE@>-N5-CKLdndcA&1 zgS)6!t2BFzeXHLJ?3;{%s3b`}nxs;x&u+Inlgs74FdqyC-&sd!^;>~`lQHmo0w6Yh zKHm}Ymwvzh*f0!J*Y!WhckMlnVb6x^g@^+VxLmFitkm3u!(p*dDC|Qc;G{$BIp59P zl?@zjv)McyjYc>4Wu2#4hI~H%5&8&f){Pc{AZ#@njk9^<7`U}TRaLFsZeORGEnkN1%fcbDuW&H68weU#ao)YqVR$TKyG@y z-nYniVzJl(bIg2;x1c_k(MD$*-CqX1sDwX|cG#V-vi-*i*S^kMdMMED{ zz{N=@Am~N{&k~8md;GNqatF%g@+Z_C!-c@=Wo#u72EbRzWb#9&)A@nV;T> ej8>}tqwp8j;sOKTJ?uOH0000z0n(Y)&97y<)6xCXI=lzI5Yj8+4+W1zt0)HSoWe99=|i^yyu+fyyrd7 zIobk&K-|M*@edOjarvK6v>mZWbBNY%v)L5o1fa3>HKOjPydQ#(T#YGNZ87>W?m>fy zjT(_i0?FV}m9w+69a&jfiBnTkclo^ww!seA1OBMQMChboV3BzQI6?04@bE{=%gYmc zdwXt8DBIoLbuBC`jI_12y^GItAO&av!64vbIq=E#TE$6jtur_FS3(@HC6)ng8jH!(5sb>xKW>+5$a zDk{FD?USUWq)!_g8^3kAT=yb zKoQ#nA}ygzuB@y)TT@f>c6oXE`}_{u^z`&E{E%XYw=vvk6wH!~HcetEaZX=fU;W(N z+*P;ReVb#w9hs=HmQitUQBl!l#=QV6liKu@(Ls@u62FA}e;@0lR(_;TptG~{E5_6{ zk_%!#_Bbo_+LpZe`T0?+Nn)+v+}zx5X=xFeOW;-TG_Vv#vm8?1r1bRkT+GkUe}nP? zBlI37Q65+t7pr$=WyL)?IeDwAtLtY(^LLzo18ZOlSmux!A)T7El9G~l_=XMD-Qv{z z2+Om841ynOD0f50C=qNr2mQFQs5niZjx%*@OeB6~D6G+Z4T z8j|SgcL=2ccI1J^an~Lf5cX@_NkPr=cs%=* z+o`_^mVq8zjx*Tm>gqR?gQk_o$H%|P4@E^}M8JTe7WILqkRLXM-@dc6V?-e?F)`7e zo}R81ONAAF<-%rhaq&}p!$u#G5Lppg2a1mB_TU=RGuDid_Sd(xw6wxEXhbcpy}iAV zA4bk-i&ATAYu~!>asMyLt3Fzg2x&ZWBxymGNh`l&jTIaaN1Syn6fpUvwY9Yk+G8^E%*z&j zOy8G53Y`v&8|&{Qofu5paTb(SRaJc^$&ZE6z`(!{^pR9N4=j~98Zk3M(v>HGa^}72 z>gq4Jqz}COA_?-`@ed9T{)F!b;5DFAdhA2~I8tWEUP-AaJqgZ%{EUo@Jd*nL($dmg z{^xQ+A^^#)nVFfD-rnBpBO@bvoGpM~fu15t=u_p<5kd?W7kUFZD2h}z&=%^omkRV8 z5ozg)M9@&;+muB{uK^v5Q<>Q*(?D9CR98Bp!KEeAl{6rtBIE(8mkNv29Uu*|yr*c3 zYNioVuh0Wc6YFl1VhbXpMW|jxMM@+Dl~1HO_#ZJ#LWXCEm?4NFqq0nQlA*8$-ZhU`f}2Q(Kv%Jm75RhaF`TBX2iz|3JO zJ^NvTtpT&cKPAyW44Dm*3|t~X2URDqMd&m*O%d#H{HOFpcEVYOv(}9>7{$01%pw_{ fv2HSHHeqC#(=XQOxl-aI&>;+-u6{1-oD!M0oneEP)x-hOc}K zz_Qn>TvNMX9PL{Sz@BHxSusFH^;V#>Vt}dtcAI?6)mbsXm56-q^Xf-NpTCj4 sj97LmcQ}&`1zjbQJAq<`kLe2g*pBRO_@OUgY~bYkg=N!ON2ZJiA`|xWsvKjP$}qEq_r*b$L@vi` ziOdCsGn{g|0*<(Ca|)P}$ZVg`wBZ5cQEjsVPBjj1kp(BxS&{;#G$t{p2zgxeQ($9` fSk&;b@DjrbF0o#{Y?+@xhcI}$`njxgN@xNAk`X)G literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-dark-puck-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f22be620da803ef4395b973033828c3bd7f52fd GIT binary patch literal 305 zcmV-10nYx3P)DeiZ!k*cpqVZknc=Qi~~J zuvR_5rS2W&y}XszGJ48)`6^%Jx9n7BEpL=K$$)+d@L7K3A=@%18v=vD1IfA$Es!>& zlPS`Q?4iB-ez8DiRw`FxfhDI)4|X*cnEuTa9`fmGEN}=Q%*?=WL}6f_VK|~NFwZa? zQ5g8I8M4(%b$O3s2V0jOLk|Fz&JIdc2 z_>tw!j^4>^wX}%Rs|am!G6&PWst?Hh(XuU%hS=9qr-v4a!GyMC)fN|%ymJ`{ZSaEhLY|Bb~z zmG>|*iOKkAY6aasxbAFt!t)?r79EB1w-Gyx#18EADiz+qVCS`xkLee8gsqOj^HaTt n&$XD}c&T3ytS!B8TDiXLWSPc^&5Ff9=P-D>`njxgN@xNAsO>>n literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee8feefc991b16b56e68ee7437785d07c06f494 GIT binary patch literal 308 zcmV-40n7f0P)H*|TFirj){*TFeP2 zd-Z7`#<)b=5wS;X5o<(_Zs>eLoDdyG{Na;DKLvnq@UlS=TtYO`f_b&%nu5Oal5jFv zSOb~<3YUyksZ=ge?oY@Bju4It)k__~Fbc@!KCYYOB@%@btVQ?0(vEL@S zEA9|nuUay=pCUVqIP5%(1ZT1@15*e&eKZ9*NpkxB4Lkvr9ylA`^Qy`k&0N`S6m@O1TaS?83{1OUV;LQeny literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-puck-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7aebfa6caa9f714db52eca8f34a5bd5362e2134f GIT binary patch literal 316 zcmV-C0mJ@@P)v6i3Q!p|jQ21X;A}5w`qIN-wC99&sp&woMW&$l z&}@+@=sh%BWD5SPhn#Ayp**r=PO{ce9tq^UZH;?rkiZEa)sCe>tf{3Ziv$cefe~M8 zpww{CzcU&Z+0B6;!|>*eJ|j8R;vkAw5thlTh=Sq02J+>SNF^_UNbeWZWH>WnsMCl5 O0000oPzNH literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2ca6ef7a76733335c7a82d920f589bfda7d368 GIT binary patch literal 243 zcmV5oW zF%E&k&24e%G%C*a3kXlSC3%g0W1s&(bYc~EG1b@CXgZT@h8ZS<6v*T55axk zXIkrqb6!DMB!mv<^Rg^s*LA-jFvc`WsT#$E5Rd%6@5(t>7e%<|8w7ctS4i*(#zVS* z;BDI~^e%yv61`ONsJK>QXcrOyb|{sK9~BsbQutd?mgS6Qm@6eA*n7{wOt)YdhOup1 twytaP74T9XH4$U2W&G`bkj1(FT~F?DKe7bcNKgO(002ovPDHLkV1nsTV_X0L literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5bb0710ea9efddeda1cedf73350d31c45dc0a5 GIT binary patch literal 479 zcmV<50U-W~P)_#JkQI@vfNl} zSJUaVYU15y3Fh;82=F5=5_dijP=@PmGMVJ!Tm>-lIF6qgb-&+t!Z37bkqN>6$s%&+ za5y-5p4XPy*lxEkk_j!ra5x-;!I0P(b2hQ4WdIUTmSq%SPFzc3bQ173a~cY;Y^UDut~x}_=zLh9o@~ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/overlay-scrollbar-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3ff15c7804de01fb73be7a697edf4a87177771 GIT binary patch literal 465 zcmV;?0WSWDP)X%qhn5(ZY#1TGc}FG-SV5Cmi2_f@ag3rISi=biffeqL48ZnN2J z=ks~p^u^khS6(icQ5c3Z*L4*jn6x&M*N_w}-|zQdX_}TzsLc?WjYgwcUDqm#B4;=p zI*<}X**Skx4F-c5!9HkSWNK>|$MKY|rI3+Q%48;^1I&S7gTU+cdMa(8TOc`%vB6nE zZyNvuh(XXv)5Zc35r=HtG?Z&$6U%+*7D&3OCo;HU*f(Gw3FN)I!O9e5Adsp~k`CaFFM%y09@m(#Qg-o&MmUEX#kh#0?loP0jeU0=3p# z>MJ>n^E|gsYzz>B6-B{k0q`W*`978MwlVdigovmjxIq>7{ zZF3$+H51naz0?2yOK?eUShXZzf|yuf#xstKe&+d?&MK|(oLF(YGu(5b>tTOu-I|uG fK5LqexXUnbia7XiM2EElO=a+O^>bP0l+XkK8I~(@ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/panel-background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d47ea33a2232e267d4da46ef70a8c52791469a GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^Aa)H08;}g}R7?a?jh-%!ArYK!rx0j2W+_Wocv9;HZv+WJ}A1}PD zoV{g?<>`A|T4t;|CDF`vU|TU?Yh%Lg xd$ait++*Ko|FEiAo@G_nKlTl6hR>HM>pu?nich*e@g>k222WQ%mvv4FO#u8mHK+gp literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-background-fix@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1bdd5fb119125aaa207086c84518d12da862e4aa GIT binary patch literal 216 zcmV;}04M*6P)P<#Ub&pTPA1Zou9E z+CjS&z_mAke$+MquDt>5g|-23-GCc#1NJu}^rP8-;BNx--nAt>p4l0|*M0!;D1PpIkAf|wNv_+vC0y;y{O zvEgv|EZlbsV+oa6mW^Aj*8N~Gc$6~#>>pkMLoy^15m0qE|bAb79~afIM#uiL3A6jBi` zG#4j1#u}_8#9kpz1#noam`vB^3vmMfgnECFz#*zJnK}y(<{p>qz|njT=nD~0A}7RH z^H@}binJPpxym5(SzNkls@5QU9xz=((?QdUuJzy*?ZPLVAFA+chgEo)Y6bBVA`xB!R)L|Fx)$dMp{;NR3Y z_>r3Nc-(D|9R!rruIcXT_v&@E2iyz&e!t>v!OZ$qYqddZm|xx7+k10+dt2Y!-27<$ zx!K|2;ro@9mG=Jr{;`o>Tl-_JJ7_)2KP8}U6XT2py=t}EwN_bLS{fH$>b!AwY>yE@ z9;xK>h(ZN*>-BmYVB4)coSBSqSQ?E+t5&P^j6k9axk3f?5Cib?@^T?y*^|aeg_2WZ z*rim69Q*BdJ1Myll$~=SUZ>NcI@nk-1cg+HxJs+lO8mS(VtIoF*&A-&S`xlk-lr=l zw)AC{GnV)1Rw(u?msO!y-rx$wmcA@OvAn^8Vt1-6L9x8Sf?{{7EJ3ln!GdCUsw_dV zyupIHUH&(mzs2$f3yR&TvZTlIK3zevr7x>OvAmD2Lfjn$nf)HJ&FWU{_X)r0=VEZd z33n)AjG!C-CR|-zeG3JjHV!U0P0&p!Rh*d}%D=O-b98xmIrAz}o!#BtBRJtMLy-Rs-?v@5w(|dMHk+O8?d=b<6b1Iy*4Bsf z^Yb>GaAySh+)`5unR~j5-LUAQk?QdlTpTnm_pr;CdVuFW{+Uk#KO5tkb6LF<_3@?_|uag-oL>E<*g$i_+h zrL`Bz$Zznz)Ju@;uAl< z(2D-BdJsK}0FNL%7-}3-goTRpxEv!jj+f_Boc9(oY(;_;Ef5i?+;|dD^2Di98WYAS zFYGL)?~7Nlqp*_kAwitU!HYovc!5epHgUxgH)(~0%_ec|R4vBEFCKg)`~6{TNDzZ& zEFduf00=NgO2n!HG0Y>9d74Zy>dPky4LV8|Tv}F)#)(rtEcF=l6B{LnNi7D5#PE4y zi1T9fJ+k4k###yT_`XVT`WWSv3tl9M1zIdJglX5A)9!geJ_ZcM^Ng`h=JCaW7;T)M zB}(yHKje!9iC7>a1cWjA2!TvT%~vNY#KKbM@xfBlCV9`C@{mt~sgom7@>(N6 zpMZp@I^)D-vGOp%S7pRSTw-}I1SWC?-7UFW=biz@M2-l?^2AIk2y7)UuQBoBN7~T8 zK0b2r`ew-Qyq-r12^AwMpQwLEknig`_jN6>LO}#&L?uHEXPU;n=Q+ek6!Tum%iqtB zI%)}meT)@Epc9pJ`7l!@vi@%N-@N)+F98}?f0Qq*j6i|}-3Oa8Jr8`g&v4#YW?8B$ z0e&zwHm)juVU!@hP|um_X?S8ElYAb@)PnLr|K}KQsz+tdf*yJ~pDXmxEA$t*2X+wo S+qwM!0000FwopXhy`#etG+*qn_ImLzu69a1m}f&a5-%;uFIiD(u<} YF4{aza;tc4faWoHy85}Sb4q9e054%FiU0rr literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0a4a9e86b337917d3bbb63cd8bee27e7197fcd GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XLrJzX3_IAoJ|l)Sw3zyANfg$WZR zxS0iN{{NG8S;(L!A}7>d!nr|K-oDPoh~*Fq!=>diQ#~u3i-1}gJYD@<);T3K0RW2) B9zg&A literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-row@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1ecf5434fe995e0fe10e41c2cbbf5e9fc6500f GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&k2TvEr5Dn4fJtZ$M)w3yFxOkB< z(Bj}!?eGIdJ{F-5CL}a=*8l$}d+dn!#Hr>mdKI;Vst0H+r#LI3~& literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections-fix.png new file mode 100644 index 0000000000000000000000000000000000000000..9c911db8f5b40455d584b85fce6096e22c6091ae GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^{6MV3!3HFEy?b;CNJVFMbYX_MBi(^EDp?OE)rnRBoynup am*4k~Yqi*9lLnwS7(8A5T-G@yGyworTxy2^ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba85849ca1adbc309928b534225a2826db81dfa GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^GC*w3!3HGd)3g$SRG+7dV@L$&+Z%>l2NVQcF6Nvl z-SgkkW`g2e*BgmqH(y1wsvSOc`BX%9?A+JyWWJqEdQe#Cp}3WGhl$xtEr(StZ)AdI z`-m!pI+gLQ^j*d^K}*rP{fb&JtH;y{bDgs$uXM70xwvf0^Wt;&)%y+I-uzF!e{i$s zvEY-p^m&=Jk54I6@U7HRTq3%43v=eFV9t1RN3P79PH_u>E@SX?^>bP0l+XkK*yT${ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/quick-panel-sections@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb59d2a57badd84b9505bebcb039cb753628654 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^7C@ZG!3HFY0xx`FU|0dUCTKJi4JAu4-ZQ`q4s8y*^vAgsb*EU>7Uqx_)ulT5n(wGkCiCxvX3Kj$p zqk>!qJRQuw1INNOE_D_ba`aD~gB@PT0zYtn#rPxJIpqAn_pBHXM@z9_)20xA+sZj`eQC1kR}T{G_HS*@o?4)$oYZG6=jo(uCZM#kb!3)!-rh(00j$V zJb!Z4ZsKx9|3KM${8OhQ>n`Mi2PjzJ$CJ~QaYjxCE?Y`&q=3r;8F+_*5f|HHHf(IyA&;id2y3RXNw#koN;a&5;d>fDG&9vq{BepW-Q&R%@9}W-_oM%u@vkuzr`;0| zpW-R(p4i@h-I>Cs$kb_y6M@2}=x_sA>WIs!aBBbOM4=Qi_47uY;yv;F0-UHt9MZGS Q;{X5v07*qoM6N<$g3}WaB>(^b literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..80ff9e343e89a04f55023ac1af860b1892bc6254 GIT binary patch literal 1499 zcmeAS@N?(olHy`uVBq!ia0vp^A`A>H8#vg2tl!>Q&lnh37kRokhEy=Vy=&Mf<1WH- zap{Kd_L91iyO?+*tr%HPcpTZ$XymnG!qnuH#lQdByIt2=A;16MzvthtH~#+|#a z@Sl$lY_-$7$ZBtKrJYCgw!7wGe!j1Y&PTrmp8C-2Tzev5W9<~9KMw-rjY4wdm-3(} zd${A__lf1vHm5&YziGNK^`qnA_v;VO{<|QtUuS>*3R&|%|E%`hJpO(IchWzjG>wM= zrv)U4rtLCrT-C!`rJmKKs6TU?Y_UESh~miSlxn& z1uO3U_kGD{s3&PWrC>!W2M-2qZ4Z>#+J0aH$fdUm5BG5_(0=@JVTq$9C)j~7hl1!n z=`sVpSjm3=rQD}H7fe$$NI4U5Xkpp@ht2BVd-ao@Q}@(w-0f@`g`pATQ)GkWOl;~> zZr#=p^E#&feZzmpsduJb1qE2;@c(4bZ;8aL1o`eqh3`Z6qs-+kfX!ozi6u5XU`_#vaZE2sCca+C{p>rD&{kU!Ktg~V5kDXsORf%b* zS#Zf3T`7Un_v&X{n|Zixsq=jiq?lQsw)nzATO?)Z+CY3@dg)l0zVXq=g?H)?{=Wb9 zoxS}YV1jpQe@JztYYi)G&Pijp; zZdJ-oZIqNPZ?flq?azY?znu8Q-2=*d8|@7zA<{TV1ePmd^v4~E&uf!y> z`}^)EiXZut3QF9tL=K~`{RF1^9DY@qEJ-HkV?1c|Z{FXR`GD#F-Tb2Rj>3~O7PdI+ zIwzc{*q>;B;l#y7W&fw_b_Qllm^Pp%%BJmZy49S0SveU|)ZELz@p6ugZq|4Ioz_Qo zfb$s4dP4NK1&Q`6fkxTwF#B#_WPkW%t{bq#v9D;Cy$j5q*g^|ex$vJ=C(iR655xAS Qz(SkB)78&qol`;+09%c=zW@LL literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/sidebar-row-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..02d7e6864a24e12b1a53058d0313a49ca0330431 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTn!3HErq*ul&m%{I8eTB^mKAQTR{yN`ZE-H@7y<{K?6q7QKb|EI=Jxv^rS+9?OtBlybmu-)r$##{qr(L4dpVbH$hIR=}WSZ)?#%GDf z+2o4`|Gu(!$OegL@40*H*T=vq$2;F_bnd_A_h+^Ho(EHZZJqg1gTe~DWM4fRKr1+ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..826080eafcb3b8ef5596de2bda109d117f3c40bc GIT binary patch literal 269 zcmV+o0rLKdP)asjr~_EgqhQ*!X_~C8tnI+G;RKZ9MVBX&|Cy1Iao@jx|Eki{)2|_$ z!HAp)XV0Fk4dfpMD&R*}L`C*TphK)vQ&X?P%tTKEoj?WrK+HfR4Dwhv%yJNo5(Pj@ zU63Vd#0Etz9H2OWnVA_bK`#bM6aYhD7mb1*IZF2+dk)0`zyw$Ul>CUSfXeKTKs(Bi z%|vlPVqzjFi&y~hMqo&MK~_i!8*0`@kl9c>;Kre3L%1j%87Lt@M|XP)W1HWLr=t;krGTAWQnY{OQX1m3RqG%<}Ba>$Gg1Z(#S3t@Y&@GVi0?>!x>Y^3U zXf$>W!#IZ(5mSJz!ICuo0OlR{nl9|hah$hBz!~!{LZ0WX=ks|V>ntSXa%P0ss8+w< zckA`~uSy7|0KV^UWwY5kBsfqdN$N9*@G=|@PhHpjrZ6g7AeYNsb0t3^yg%V^MhQSx zK(pCAL{OIsWacl{YPAO$X0ifMKDI1?sZVf`3ZOdFPMDIF!6vy#TObI64bwCSvP@ik zbk#QB z%L17Cx)g3wfG`X%s32~B++r^&%%lL-YV{etb4vws@e2-?Wj#@NNdZIv4nhZ0j|yhs z?@c(6P?Z9dN~OVQG&)A~4UE&@#}RhEC9n$)Bzrs{-vZM?ola*DJ{$dXgt-7q+UKx% z$A5tMBj%u7F27=)I~EpTZYHJ+lr6xNQ!Ln8fLL-Z;bL6@OSq}ADCr7_CD#%z{s-?P VfJ|1QfdK#j002ovPDHLkV1mKW>2d%7 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..e86fe1472e79fe0e345cd666741090a102f01560 GIT binary patch literal 290 zcmV+-0p0$IP)uyYmEb-gvloRm^I_C#xa>-&CRmgOVNS78rC48a}Z6e|&c?6BuB z47(6Qj{xxz$!U0!+_Tn7%rgR@qTI{y9f}bEW#&J9V(9S?wjCF~5Mu4iS8YE`Ox?oAk9Zo(2oE1gU ocxpKGV+j+Me5znc5XPecFHB88<&9`*4FCWD07*qoM6N<$g5LyoGXMYp literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-puck-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f995b6763fb5849f888cbae736f8bb81b39e6049 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2d_Ffe}fba4#HV0{~T){7}nq|D7} z1$&01t%G&;#bp^2_d0Q3?BP*dD5qAER`7IDJBN~Z?x9dyhX?D{hMnO!_eHjFS+-U2 zyBP`xcNXmYK5zc}n!4}1ER$IrCqzCq2#=hT#ohRSZA0$u*Cziz_4RD|&vd--8}H#A zP8XHe%wCq6wqakg-GQ=bt*P@a30zXUkhk4D=6WeZU02d$sV#mSE~bgQo8K;q(5Z7f z*3v7+I7#wA|ACvTYgCwo>#u*_)10;Sm+SK-3%_y%ZfIOBCGO9}UE6W?dC^X{3csjG zR-MzQnhzK|Z205hzo6t_EvwhY1K3HG33+tQ{w0Zn?KhoW>(~9NVC9$waH)CX(xbA)0?&KgM!0N&nh@En8e7LAr zvgD-Qj+ki-R?X(kE!SFp(-ihz z5Vm@+18cRG_u~ec)iHYeix%oIG94&y%4R6DFgSYu<@ev_r!31>yDo@ZU#$?xz?pSW zJ(m6FtmcCY94t46in8Bc7oK!Hx@OOflWCiuTg*wwTdZuyvQh5amj_W+o0RpWR&u(` o^uCo5dvH?L*;YZOMF-5y4%Tq)+YxdJmq6&=vwI3$KdLB{dQDF??|JMVgb=BXt?~BkniORD9N6vue-J`7`+K{C~dtbU3Z; d@w;O`7)@vMa((fT6$P5f;OXk;vd$@?2>|S#F0}vv literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-horizontal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b074beb3717c8bb957d6e85424dd9a244ed8870e GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3#hxyXAs)PMr|%YJP~>2Fdb#26 zcNa&t3h~LOS+d+7*_2Ih_i}l|C?hV&VBL1!QgXv8yMk_}yfobfT!m+n*Cglk8Lo^! zZu)I`R-R{qoc)KD23M=!bBlle^P_Y>|C^bS%-4g8AMBmj&myiDpS`srO7Vt8t-FPQ Vo$0#s5TUH|a<`27+y9GIRo1)f!DyOYt-+rz-jAjiV< VVeW!UCP3pDJYD@<);T3K0RWZ-C58Y1 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/standard-scrollbar-vertical@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf5138b45f523b7635210014d26f17fc78891d3 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3#hxyXAs)PMFFA5CC~~j{Y!xo~ zZ(X@S%<@K(K;pFhXa6`{;c9k&^={!Rqvs;V)yX}Dug+A?OE*pbD;jj|UbKy9m- zyRtJD3O`X~S^0j#w=X1^@s6IQ*`u0003YNklE6Q(f2nsqtRMFm}P{q1AOg99n%Tr8Z{~pm#{yGdi#c)Jz7O;GC1u zQ-_Nd!AuA2B;FJP%knGh&`Ygvu3I6P8#MHV!JPmXWW1@6_#RB%1!G-Pfs1HLMzhc~ z0+xA-z$}ITK;V#3T-6seP2WAwL)*5j!{|dFUbwD{BuU-~D<25FjpO(; zilW!e^9HByQ}4;O*FsX>sTSl?eh}Ht$@5$VL4Ys}ao8UwWfVeS{j^3=6e!CQPSZ51 sswy16j-bE7wS%>JL6Q5ukJaM}Kaq#B!qcJ0$^ZZW07*qoM6N<$f^HL+!vFvP literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-active@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b359129b880c49e0b19d749b40b83546c4fda247 GIT binary patch literal 607 zcmV-l0-*hgP)22g5S|U}k}OE1i2#A_Qh*c*1O+Wc5K)9C2*t82m&MI=I{l6B&dx~(q}MtFvR_nbGNFD6QceU~2U5oW{zPOLFbo(5&Nvmz{{vD+ zJ#94OPsV_J6OuAIez*rG9Z-Pb<5jn)iq?U+4CoxwI$#bX!$8^$oN*>R?jQ47{*??^ z%sOh?_avVoYj4`f(b;P8Lqk`6}e!qW@ zUgdHbf_8hpq{LwqqY4{rLfX9N!e6hrI>5%v3tWqxPUmO6UVmnts?{n4#l0o{--fi= zXf&R>-R>>7f$ailzZ;E4kAuPB7gPVER;y93*TY!yJ)aJ52cbuPFnhVn9Ff|^EoY-OJy#LfU8t0g7$X1 zP1ttZ?KUxRAc4tjCM%p64u`Z@ENHb_(R#fmYro$s1^|xEp6@9SlT`9^UeD{@ALkAAH80$sf&QQNHWP)pB0Ei zBD)5I;fcj!xu?}?9ik}y8I4BoXS3OhMx$|ZmQO23xC6Lcu6G`fM`yR&RVI^(5(I(b zd49=poY?R8?|%f8BJv2)Xml5-B@&5wKA%6)>-9^WPDdGyMyXIJaLHtHPU3{ORlw)- zy#hfK3Wa{4`lEO}&P^th84{1pX7htUAn+4$E#WBz#9 zMUW5D>9oMI>{STRtJP{xDIkx4c6BzJjdD7jR_x&|NFQL=Xqx`&a5!r4?T|R(DFx&X zu=ynxs=-$(7D-`>LNZx0-Rt${^?IGe)r6-MkUOwit-^RbUZqm0V^n$=i^W*jcl=*L z^~X4Kh_4AxDIi}XuINj-T)w_oENZP*>#5i4{S5NXU@+i2oz9J5F!+*Tn7i3*_8Z2$ zxe<{C;JAh5y{=R$m+^qsZns;F$3zW>L#o^DijpL$GMUV8zu&(P?x$@6#CL>>`^{$4 zGM!FMD&QZ0w=fBZ!#p~A1I{x-+(6mE#&;WsL)ayl1}4G&!k)wA$~gbWHi1p-TwnPX d&c)tBItBBA(=O;SZ3h4V002ovPDHLkV1f|g8UD&Rs?PBOg+|8ziE{1|=2Nf5( z>9iEOu;`-T-qK1tRUD#@sJGWwG{$J`_g!*B>P<9uGn+Z^lbd_~^ZnodJXd#peJ$SP z(!WXLwEdQVAo1j-U*()y1Eh$heMp6o{FQRBOBx^kb1hbv~(T_ zky{DW*Vm`R>lblxaU~XuMMOnKiSY1nfp;DPFec8=&&A2fi8wqw6tXOf{r&wF5b6Ml zS9g){O8}l{L`O&e8Xq5@0?$QGP7We$H}N?%G*lr#a1x;R$H&JcW?x@lH<8HR-rm;1 z!NGfXk?`3C3_HC2J}D_lF;K2h$bUK|t{zXYii8M4c zv{_nOddNueEFAcOShq#NCxNiAuqVmM$x7I1yuH0$0*I}lp+QPZOOxp#q9M-C&Xlm{ z=H^P()zvb{*t)v9_R7l24r60u1u%+R<9|cm;csJO zqm+`8BJb|*3JOvq)zs9m@>d{bAhFrm*|~=ZIEg_lVq(wd(zGF44S6@m#Kh1;4YusY&Sobc4&wcsDJKkB_&YL##+uFfkA*GYaz&ww`hS=F$*IOib+N zK^7a^Yi(^Uy{D(=89e(GBzSQsB;b{bMb8!E-QC?mF#a4VNzBN|5SST)-GeB62%W$P zpn%HQYOHhuFqf$C5!8XWNdll}-o`4T;^zY7p!L+t@s~I&jube1mFoT7-hn-2r=6Q29VU!(!y5rTr?~=gjVMUqk-d& zjt(g+D@*27JRJad9WiWtNK zsbh_0_X`aHOtBpll#BBngk8xHz+O-eu#lqB(z*PJP_)d}_7BFA?BcSO5 zw9W7N`T3a}8yhhQrEy|nB4lA<;nDp3ykOXolq&9RTwWe*}EphPlY!kCT&=8DMYZ^}4mSH4AS(Mn!*zHtS1GO;rXA32@(PwThjc zoo|tr$B4{4X2C-aAhfe%aB%PyBKZ&mUiu>8ivaarz_a4%>FHFY!oYNZlocJ4#`%s> ztqd9}+H5vny~@1+l2#Z^W9zb;`uqDg@h$Ni)Hy2ievx3~8-CL)Wk7IHvcU&|i>>efNN0ibblanZ86x*83y^dzBv z5mAY)hEypZB#3~ku(0r;uC7kT@L}schWtW3f9o~^JVO#+LrgHDUs+j+*xueYvo>Hj zhzh8SD-d#E44)Pi6`f${T;a7H@)=|ia_hQ_01q=A&mnmbP21v~_j2LSUyzR=e#7p4 zAP@qoel8xqgpf!WL>=%>Jlh~N{1oyhB;a))0s({GNAa$Z-UsV{>AofKFDuG^O*6>7 Qng9R*07*qoM6N<$f)VJPod5s; literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..17d53d21f82826ea22730686a386be0b575fa6f3 GIT binary patch literal 417 zcmV;S0bc%zP)nFST3ffrpka60u58)=jXo) z5=YhuV>2QLBFJW8Vc}b1Vq%gXKYo1h=FOW#AbU9N%fQUc%<$vKkEcF9KHZX%lCywnPz*r#!WTtF#pT-C z+6%e3xELfPBp877e^XP_IY737_5J(zRG>mpsA6fLD>8s= zFLccyK6)&`T*wAw{DN_SG|1^Fp%0V8WdKZ`AdM1;1XW{EK(PS;l5xYH&zD#o00000 LNkvXXu0mjfH;B7j literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-inactive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..89a063f91d3349a5fe887a9f0c1ab50e64fe512e GIT binary patch literal 871 zcmV-t1DO1YP) z2)Q(u_RxaRdrM0jO+_)LiN+t$xas#T4QNPqHy}tM1GD>f_Ioqmn|U)*E|(M6DW>ZT z&e#0yM&6R%Ao6;> za!X4~prN5boSdA9y}iAKU@-XNqH~|m7iev5m1}BhL?)BT?eFjVfC*m2lv-;NK=6U; z>gq2JheK*^ZWd=}XCxqYc6Jt)mX=f!e!oA^(a|A;fT*gf5~);5Y;A32fpr1%qg3F$ zU6TMo;c)m3oIYu5Ym*q@@bFM1lSz?Irx#2n(@lsPyuQ9(C74Jg6r0WVYI1UNE+0he ztw*3AoA0fzuDaoPqN%A#qO;@UW3?Py*VWaD+S*#dQXU)}C|zA$A&LCuexS%WF*(#-u`ZQc(|h2B{St0I{~10x z{ZNb&5V9=a-`(ByFd&5|r&4Ic&3`mMKYvFxl<_b`V0LykfG&_Z3mEM5^i&)j9Vtvb z*X$154FOC5ZCP?y72~B#fWgsLYOC?KXR}$hpn{r*&=t!lOO7_)3lI>%mPJC7z|73d z0BSwQ(=h;3j#{g?eQ0QCePm?hgVkzX=JaD55(82K6Y)8wV^6UY7us~YU}a_Hbvzz_ zib-g~NfoEl85$iO&EIwl9Ck(`5%>1?_5{i!p-Zye-Q6$8$H$))1}pY$UR+!(X3yLD z`}+EBAkB$bEOy)Fa)mDhXPyB|QE zo12?fOu0W;7i%?jPW;0pf%yjg2-OuM1n7h$Zb4(vQWK6O>`=qOffYsx5bJ=(xzG?J xm`mHsA#iEqRefl-;Z+6E@>3yD$-uQ|;4iRJSV!6;HmU#s002ovPDHLkV1iZNmmmND literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-close-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1d49426a5af855a2c5d51f0a14d2fbc0207e6ec6 GIT binary patch literal 596 zcmV-a0;~OrP)K5qoZ=g(S3iL5nafXl3NeRju4b;G(ca zo61^=1fiRlhd-b&g78vf#+=S4%`iM%Ja`xGd^6uY_uO;u9a@%U>O6MgJjoBwTS+%XsoE>RSxi^byoa=Cob@Ar>S<7sUR(P;FR%jJ3(2m}snHk;09G*YY8 ziUPrg=Xr59o89g8dLOkUY74Pgj6-58o6W8(mC7;8vKvBRwOXZWwaSxw5+}I51d&MO zRWKN2(&_XMx7%IH=kxq_yImCugrBWy1aQKVg?`H);_*1XfFDWEy3k<^?pc3VDIvrlG_bmV);8$sy{su)Y z%!Va#f>V;oscyk+Hg5oCFntLXb{KpUg)~&Ho6Y8i;0bOQ{QpoDK;8*#OL|7N`;Z+; zBobYmm(lyfTrS5WE)$%VK%K#OJpNj%)vigB)WWKsa2)p;8(`=2xiA`yQXqQ?HMh&< z@^_!lcU>V-32u2M4zO z{rxX(HrwO1wY6hkh}=jZJ3BkoU@$y08jbmpk&yx<1W1UWpdgt510Vz9`1n{Ls6cRG zwOYl_&d!U&!^6gvm6cbwk?=~Opr9a4uh;(;9UYw<9v&{Tva;-ZdwY5kz`W3EwHFz1 z?_NYiMA#8j4?iJE(qDGFy?k+T@kSCJtAJ@okniK;5gwt!K3jKpw}3ds{QP_b{^x<*Af8{qJPuU`%F4=&Nc-n8F)<<| zBg4_w*2dtguy^@vZf=%v92TUQXDtc~3#Iz{dIo<1D@Jg0S6A2HDJdyVY(x-?n0V)L zs4@V6hX`(f@Wk%!u5NsMT-V><|Dn5D8i4W>NXWZ~7+nnw4NCA2)J96Y>Bt4G2yldmX48nKUI zc6Dt{V`HN2L%Ukg(U;*cXoD4xw*L(wq>qWaN^?P9PVYRhl&9D{~py(!?_Ezjxj(8c}^AvtPlYOd8e zcTTlqR~_!^P?11a+`+j!-6UMV-0(&~RRz$%GP+wj>OTr?RyR628ua}6^S0^fX~E!| zo10Uqsi|_Q@x0Lud-z>IBIFW<&qv6b2@NQK$pMxXn7?}?;OT349~t;@WMm`_Up1Y@ zVi6k~8{e8trf!tjH?WSRq$FAGB*4$_`ue)q+S>XW_k>3%y=lCEzy<{IIR*v>UV-2P z5P0c{geL;@dj`O~v9YlfkkC?8AZ0>%-Qzcc#%4tVe7C*5EgO!_g#K}l?@*SfeSLjq z9Mux=8a)N)oHqiIc=szvgiTCLBqGf^)-!>XiwSQ<9K4Ju7ZF@SWaXn1I(mD1HxQiS zdk( zpFYh7)WGoh^JfNITiYKpGBUP6xic`0Fd8Ea{Qdp!uUxtECnF;x!@qz3!0P7DpZ~?n z%j*S96Eclr04NN^#KcYjZRQ1OHa9nC`1|)S10Nrsh@_dm0Wf)jG)f>6RE!SalrOV)> zI|D5~B0h>zC;=%N5u=DNj3L+gPPv$-H}~FxAcY*5oO|ZX%=eu+Gbbilmgzo+`98sc zT_I4(!2gqhp`oFtdL3iLrZk433=9ts$1E1hH_W90lr`^3Z1a`pmx|8FY|?v(Mn*Do%+}uo8S68&Rw?{iWJMo#B89`!vd|c}8?v8bIbWnA5H60!vQaYW^pP!$* zW@l%AmIGGwngn2!NF>rLD=QBHU^1Bm!0zrY=D68xwzsyn#=5$?2m}j-0%bB88WL*Vn1OzMk^=ytoczq^72ZI1|Jvr~dwa@_M}h|IG4?MRyn> zfFOdz#>NJ1ZEX>X4d56k;>*iR^7(w^a=HEq9R7ydknMsjU%0vjAd1auwF*J%arZ|@ zM~G+mCtL^eSH9zLBiwl(An9U$O3F&%b9vJIy(AD?Zl-z z-7es}{gq56A8>lb=?4b~0jgBHodX6|S669yd0BME!NCCq0)Zdgl8;NlRM%)D4VmJ- z!rI!JJUu-vZ*Fe#QZBH3Vp06&q2zZ$*lcfaV+ot*EQ(Fpx$H)fGr$V``tkG^xZ*EJ z6xngtBXH}(&vmn9x;**#9f&@-(7#ujILA2H(IOvEGn?GXc7NKh4+@Vsl4et=A hY^Vx>N(Syd12?^yl$ivJ;X(ia002ovPDHLkV1i&_mIVL+ literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..c633b56325d9351e4a199026f419ba1f9c1fd4db GIT binary patch literal 323 zcmV-J0lfZ+P)!O$jAt`9pnNK z2Ju1SL>Zu@thD;`m#<)_gEWA=0OBhuDy+d~07f7J6Un;Aen+DbP!$FP8@k;teD56g z2glZOyF+5 z^BNkuv6(Uq(6nS&`iTKDL47(8v@KdP3B*kq`eqby;xH?qs_Lq`pauehAk555F*1RC z!j+lCsQ}Xel~%$PlE9?wQ#rz)#1SPCWLb8@K}LtU1&X44!`m99Ap`#dk&poiMd>hf z!!XmpqPh4U4_0u{0)ZJOC`N~oxMtS;5GpV_OasM@(%!&!Y<%rt^zZ9wx(b0f#)w1Q zQn9qh&<(>(1BHCPwRUxN8y_0qwry}dFEla{rZI{Uhq#48z7;AkI?RU%=bMP){{F#@ z=I7=EJmCud7l6Rijqt(4vIi^2muO{qWqWL>8y% z^B5pLZO3(lhM+fuL_LIsc!!8ocI1U^UIXF8v+6K!!C48-$`c!iD-c)UFQ^Cb8ZD-@ QlmGw#07*qoM6N<$g5VfR*#H0l literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfac0dff2d7fa2ff24e8c1a2bd55dab58c03fd8 GIT binary patch literal 328 zcmV-O0k{5%P)&<8)v~d%ss8%)>-OibUz*mhS+fe8T1NCh3=4}4 zmy(uTAtoxq05pIBXaK{j*KZh}K7SUudc}$r=!RgpKuK9?ikPS{0}l@m0}~Sy!@qz3 z7&tgMfS7YKP&0-B7=g&j$|B6m%geyZ%F4jZ%nYU>d=_DJ+d+H`7YGUp{$ONeppC2DT zef|%kZLF>DSz4N}gK0vhF=7EK*#@NTfS4VKe**DAAg%^t41mi3428G^FuZ_EAujQO aHvj-0lu|{0;uk;w0000 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-dirty@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2a744298033a3a51a4c84157727936af65719f GIT binary patch literal 720 zcmV;>0x$iEP)t$tia(Aa@{l zfLo>wo6Tk|WURw;{3DLzuG3oI_rH0*_m+j>n_jOsSY|)s;<{`X(c@NYQz^+?a;c<> zq6kH<808B5036o=+di>Q?8&oUZ+m+g5t#(ETJ6oUrgkfa&SXUaQ4pY5JQWa-02l1> z7=Ha8hJQv@dv~|HlT}2j0J2@vjqkPEWmVTSkR%Dvekc_F)$eRJqho-{WCFv{2nK^= z%N|?Ty4~(^77?j6AW5Z8rDCXtZh)dHz+>|H*Uu9K=mN*{z)%#5Q5|>M!Pv`rJn5M# zKsStbxm*TCkt6HpUmo9--bJFYo?JW*$8n#Wn*c!&%o5s;&;PzWE`kIQ=ag&4V@dN= z2Y8-mWG^LPj3w9&%S!%wa4?;xtvjdgI=ak7YicdO$6=NC3r%gVbQX(Kt%X8VjZh&~^Rb z{>H|kHMX(Br`Toz#BWcU(>sb0hq#)i9mH}ZPE#);Tzvzv^<{s*y0`b?Di&q&5*FIL z9iuPzJn%d(SX;Y$cyo32C-R>nz9Ldb76G)$E5t*~vbc|*KG*vFzHZyLh{qAivh39B z_0gT%w+5=J`pA2Sc!9_?vI?NhNW=rgqGOw3>^&lLa^z$#&$Ojb$7-TXde2MRuNNj>Nrk0l5RY1AhSwHuXPKUtP)VMJZ@mhuTJ%6<3_cxh zpvAL7L70t!m6?&@_uqdE58nP}xNzfZI+R)1 z89w}CYX>q38^F)YE6d5r!oZ9ayd2C74E(%oGU&F0_!utu&&vJsKMRvI3o9dB{h#0e z8UC~WdkGgnVj$TA5w%d~S^fM67sDSWP6kF+PB0DPo2&7xLDC0jGNK0}P{t}}D?`ND zrwl>BU=aWHkKv_>G{d^d-V7^&a!27hp$u#WfTXN}SQ?0dzGwIg#7}_u7!YFsTn1n$ k#3g_c2DlXB5+8U206z&#TnTqVcK`qY07*qoM6N<$f={oC5&!@I literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight-inactive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e35e0611f3cdd340e15e51781d0737d92ec5193 GIT binary patch literal 737 zcmV<70v`Q|P)1KDw_gYy-{Y<6wV&Y4ff zh7CJ2z`@WDchB=fsP6@^Uh^7_ns-kwPd)9&L@Wbr_T5~em|8lQH&`Y`;tV)r2RZ@X zq@FLKz8k>zO;1)fcJIpP*Pg{Sp)|lsU-Ov)|8cQs*~4iLf-}$#wIhuXZ}V0lq2>ng zWuw`sZ+YW#>C#q2=rK{Bf|Mwq&8O^a+5poKz;zuMZwIYWYzR5T1!0wYXtsrv2ArH( zqQs_&;wY?XM}uM(a)@i68Ys1?^mtI70%y=VPl*LK-T!Uxnoi))F-;Cmie2bR>If(e zaNPurbA;Le^@7Gj5Q6y~I$a-?26V&x<1;oQvGX`}Uq=H*nNd7M2LY471+PZyiiy%d zF>8Hv{cvOml?6xrE(Yj-4PFW0;*l(7;gdo)3M-p%enwxZ?io$j7x?Q0Fil{Y+d*p- zBMx!rXN;9dK`~Jpm>h-QHz#26mkYA)0qj$$sS5Nag66bFG2#%H-cjgAVdX`H%pBsz zgO@P5`V;OK2ElSnIM@!#(hBfz~wN6GuRI;EI{>i8a_XohF4b#u#LQR#2ZAc5!V1EBNL;DE^Ub4N!$fQY;okq z{~8h*2W`hyL>fUSh(vJ{z(u@A#40=TqR~$UqL+?yqC5r1DRxw@#6VJkqyql{$pOpt TS+1^&00000NkvXXu0mjfE!s+M literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-highlight.png new file mode 100644 index 0000000000000000000000000000000000000000..3425d314eed3ff28e26e07cc9d99ef6bf84e7e7b GIT binary patch literal 336 zcmV-W0k8gvP)VMJZ@mhuTJ%6<3_cxh zpvAL7L70t!m6?&@_uqdE58nP}xNzfZNbs-$bttp2 zGyG*@p9*9WHh_hlQ;3t3m4O*4csZCE7+BbU3!>W&;$yggkC*rNe-=hI7FI^M`ai$_ zGw|_p{Duo4F_7$mh{joQKY#v%i{TFwCj%oZCzuBD<1D$KBk6-PF4$a iBMfjU#3erP1^@tf=tg~qr@W5<0000Q?t0mjge3)xu6Cr+rq{d~DwJy>K5aFs zm7O53R<7+tggz7fEl6602|wwbN!f603(_JHaX2{U5{J2?XA_G(Dt*3aZ$UEQ=3U2xMNPMV>_?`v=;t_&#HoaF=}6LnfYyL% z+QN_$hSVG2UNB^vOlS)m+0YvBN8F$#;3(=m$=!FL0i#SL-X;g3P{^jOX0)!EXszCu zaB8)dg%+$%^BLR+hkzTCIn15TyH$;D6xJG8o-s>*0=vzLLqR4CiwyLF*Eq%;<}S_1 zQly}nXbqf8HlC4DA&HkV0B3kcm@U;HpKl=Z@h4Kh z>zx-_Wn46`pGWQC6e?pWkR7ZMmI$#%TmzhpP23^u|8`#L87%&u5L=vg4`P7%d>l^* z7YHtaP9F`zCgCw5R@sRcjX@1W8;@(Ey#>c5bX1<9fnf!P75ERZU&kz!fRJ+l0000< KMNUMnLSTYMs7@jP literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9f8ec5b9c9cc6d2908ca238fd0d275f0f4dc74 GIT binary patch literal 207 zcmV;=05JcFP)X1^@s6IQ*`u0001%NklYO|E(UDT35Q1Xd z-h;jOR7&YxH(hH@OwdFSSZgWg++vTnF-G{e-fHFaKGYE-GGH(QkO1vvf{&HJ^^bah z@#P)}fLEA;t|b`ak&IF`ywuq$N+;t|Fd?oJVG&leN002ov JPDHLkV1ho*SAPHi literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-hover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa6b2846397944cdbe05f2921056e187ae60b69 GIT binary patch literal 330 zcmV-Q0k!^#P)%Q;f?d>%PoPj8TaU4VKzVGLrpZ0CrhWce$l6{l_Ca`T=vN1Q= zb=_qtC4k1WM=sG4hrmf3h18oJ{3}le&KlhVRDx2YS2&aaG*tkovqtv-m7vt<6^={b6R2)NN&r6=X1^@s6IQ*`u0001}Nkl(E{hYSRoOp9$5q%QnP;v@N|2OvG*QIDf`ghU26>}K#K`jYa!=Mxx>>K!{QrzJ$SGVkOwh2(~@~6fS+W+nGnU9 zz;Fk{0!v0NBk(S?%F0r bhCBEIPg#@})o;xF00000NkvXXu0mjf>TFoi literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tab-inactive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..df248b1fa9add093d490ed20da0be020c93013c1 GIT binary patch literal 370 zcmV-&0ge8NP)!NJ9f-96JPfITR2M6rYC(1jr~nL&@(^)W zEO!P_InY|6$}hJAs905iI4ja2Om(s1p#o5mB0!uK%bkH#l`Ed?7El37`CZQy4;6q5 z6anI_SgwFnl`Edwf$SZqf5K`3?Et=Cp!H9u^2;4URIDmMoE4=7R$}C-0;qty1cL}0+OYmR-nt<8 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background.png new file mode 100644 index 0000000000000000000000000000000000000000..54d9a5002f74313bdcf21463f349f35492915eeb GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&7!3HGVO5{3#RFtQSV~B)g@|~T<&+FM#4jeju zy!}XOLPBD4va-T~Q>VICHBFp2v4KHYSeQ}N#IRZFT9QT2hK2X{*Q-CceRXyC;uQ&h wzP=XE+Owzbuaqk*H#2jT!u>s!%&x2q$Cd~M7(BW2A7~4Mr>mdKI;Vst05+F2rvLx| literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tabset-background@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8ae030f045c0a1f8ce9359d1f28bd4180a749d GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^96)Tr!3HD`l835kK*a1&0^u02NA<`mq7iQ}+9^QkP+El3VS6qaDg`44|v398mgGu8@7 z2;s9o9wz}e@BOoZ0CCRIvMi#kQVPWwQNRzRlp<>_X{|*;IcI`4R;vgBAjTL`5X2bN zyy8Hda($5WwDm1u?YTW-YJU=`J!`j$IFJ(Wby)khu6O0o{?9rN4!t>;#M&3_(fv^! znFn@j+Ay>~>^_29O6io#3AEvW>aJVw5laSgU&#Fe{{$O=FJ6|`00000NkvXXu0mjf D;b~~2 literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field@2x.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/text-field@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3b55fda7e630f85b3bb7899a28b547924b72585a GIT binary patch literal 441 zcmV;q0Y?6bP)|L&L?>#(&`;3u3GkA~mZoG|uCmuqDpbh~7$pCH84H;2k-s2;gBC-3v zn=3upmB;{>0tpSn@RR5H!@X|t>?HQNu4~_Q-2`~OLMJ5y9NHIl@ZSnS01ld_G1gje z#Xm6r<2V9N-&MZl5Peye#xXWo=EcL1D7$T&ajh0$@`O;8x~>h93T_KJ05bDD2i@ce zAyyz$Rh216TN4 z4z7T<+`$EoPR|w6wH;m3#0j`Uy0#M+I656yNM|Uzq=^%7g)TQk+H#3ICORE&IaMgS zq=^%#LWv8SJRMiauWk36|I-EAY5My^M)D6nG9h5c{B$YwG=LYR+ZW~@aawnPKH57v jC$Tq*lPW~dPwW2z=MFn}Vi7rv00000NkvXXu0mjf92>c) literal 0 HcmV?d00001 diff --git a/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip.png b/EthanBrown.SublimeText2.UtilPackages/tools/PackageCache/Theme - Soda/Soda Light/tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..63faab612acb39c533891090c659bf15cb4fe67c GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFq5}q!OArg|wfByf!QqN}7z}YVo dkyW9=!0