├── .gitignore ├── README.md ├── bin └── phs ├── phscanner ├── __init__.py ├── download.py ├── interfaces │ ├── __init__.py │ ├── downloader.py │ ├── icons_rc.py │ ├── main.py │ └── popup.py └── site.py ├── qt-resources ├── downloader.ui ├── icons.qrc ├── icons │ ├── abort.png │ ├── action-unavailable-symbolic.symbolic.png │ ├── download.svg │ ├── logo.png │ └── play.svg ├── main.ui └── popup.ui └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | .\#* 3 | \#*# 4 | 5 | *.py[co] 6 | __pycache__/ 7 | /*.egg 8 | /*.egg-info/ 9 | /*.egg-link 10 | /build/ 11 | /dist/ 12 | /*.patch 13 | /MANIFEST 14 | /venv/ 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Phs (PornHubScanner) 2 | 3 | This is a simple python program to watch videos on pornhub.com in a 4 | safely manner. All the program does is parse a given page of the site mentioned 5 | above and retrieve the available videos for you to play or download them. 6 | 7 | The purpose is to avoid lefting unwanted history and coockies on your 8 | browser and other kind of trouble related to the task. Also it 9 | completely eliminates the need for flashplayer. 10 | 11 | ### Dependencies 12 | 13 | - python3 (obviously) 14 | 15 | - python3 qt4 bindings: 16 | 17 | Unfortunately those cannot be installed with pip, but you have to 18 | use your distro package manager. 19 | 20 | - beautifulsoup4 python3 library; 21 | 22 | This is automatically installed when you install the python package 23 | 24 | 25 | ### Installation 26 | 27 | Simply run 28 | 29 | $ python3 setup.py install --user 30 | 31 | -------------------------------------------------------------------------------- /bin/phs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import os 4 | import platform 5 | import subprocess as sp 6 | import sys 7 | import urllib.request 8 | 9 | from PyQt4 import QtGui 10 | from PyQt4.QtCore import QThread 11 | 12 | import phscanner.download 13 | from phscanner.interfaces import downloader, main, popup 14 | from phscanner.site import PornHub 15 | 16 | 17 | class DownloadWidget(QtGui.QWidget, downloader.Ui_Download): 18 | """Manage the behaviour of the widget used for downloads.""" 19 | 20 | def __init__(self): 21 | super().__init__() 22 | self.setupUi(self) 23 | 24 | def update_progressbar(self, value): 25 | self.progressBar.setValue(value) 26 | 27 | def closeEvent(self, event): 28 | # If widget is closed we abort the download by simulating a 29 | # click event of the abortButton 30 | self.abortButton.click() 31 | 32 | 33 | class PopupDialog(QtGui.QDialog, popup.Ui_Dialog): 34 | """Manage the behaviour of the dialog widget.""" 35 | def __init__(self): 36 | super().__init__() 37 | self.setupUi(self) 38 | 39 | 40 | class MainWindow(QtGui.QMainWindow, main.Ui_MainWindow): 41 | """Manage the behaviour of the main window.""" 42 | 43 | def __init__(self, parent=None): 44 | super().__init__() 45 | self.setupUi(self) 46 | self.site = PornHub() 47 | self.popup = PopupDialog() 48 | 49 | # These are initialized with empty values here only for 50 | # readability, their true use and values are set later 51 | self.catalogue = {} 52 | self.dlthread = None 53 | self.dlproc = None 54 | 55 | # Signal to method connections 56 | self.scanButton.clicked.connect(self.scan) 57 | self.playButton.clicked.connect(self.play) 58 | self.videoList.itemDoubleClicked.connect(self.play) 59 | self.downloadButton.clicked.connect(self.download) 60 | 61 | def scan(self): 62 | """ 63 | Return a dictionary in which each key is a title and its value 64 | is the address of the page containing the direct video url. 65 | """ 66 | self.catalogue.clear() 67 | self.site.page = self.pageBox.value() 68 | try: 69 | self.catalogue = self.site.get_catalogue() 70 | 71 | except (urllib.error.HTTPError, urllib.error.URLError): 72 | print('Cannot reach the given page!') 73 | 74 | else: 75 | self.videoList.addItems(list(self.catalogue.keys())) 76 | self.playButton.setEnabled(True) 77 | self.downloadButton.setEnabled(True) 78 | print('Page scanned succesfully!') 79 | 80 | def get_url(self): 81 | """ 82 | Return the video title and its direct url. The function attempts 83 | 10 times to get a valid url, if it fails an URLError exception 84 | will be raised. 85 | """ 86 | item = self.videoList.currentItem().text() 87 | attempts = 0 88 | while attempts < 10: 89 | try: 90 | url = self.site.get_video_url(self.catalogue[item]) 91 | with urllib.request.urlopen(url) as request: 92 | assert request.code == 200 93 | 94 | except (urllib.error.HTTPError, urllib.error.URLError): 95 | attempts += 1 96 | print("Can't reach page, retrying ... {0}".format(attempts)) 97 | continue 98 | 99 | except AssertionError: 100 | attempts += 1 101 | print("Got an invalid url, retrying ... {0}".format(attempts)) 102 | continue 103 | 104 | else: 105 | return item, url 106 | 107 | msg = 'All attempts to get a valid url failed. Giving up ... ' 108 | raise urllib.error.URLError(msg) 109 | 110 | def play(self): 111 | """ 112 | Open the video url in the vlc media player. If vlc is not 113 | installed or is not in PATH, an exception will be raised, and 114 | the user will be notified with a popup window 115 | """ 116 | if platform.system() == 'Linux': 117 | vlc = '/usr/bin/vlc' 118 | elif platform.system() == 'Windows': 119 | vlc = '' 120 | 121 | try: 122 | sp.Popen([vlc, '--play-and-exit', self.get_url()[1]]) 123 | 124 | except FileNotFoundError: 125 | print('vlc not installed') 126 | self.popup.errorLabel.setText('Vlc is not installed!') 127 | self.popup.show() 128 | 129 | def download(self): 130 | """ 131 | Manages the download of the selected video. The download process 132 | will be launched in a separated thread so it won't block the 133 | main interface. 134 | """ 135 | title, url = self.get_url() 136 | self.dlthread = QThread() 137 | self.dlproc = phscanner.download.DownloadProcess(url, title) 138 | self.dlproc.moveToThread(self.dlthread) 139 | 140 | # Connect thread and process signals 141 | self.dlthread.started.connect(self.dlproc.start_process) 142 | self.dlproc.finished.connect(self.dlthread.quit) 143 | self.dlthread.finished.connect(self.download_done) 144 | 145 | # Initialize Downloader widget 146 | self.dw = DownloadWidget() 147 | self.dlproc.report.connect(self.dw.update_progressbar) 148 | self.dw.abortButton.clicked.connect(self.download_done) 149 | self.dw.show() 150 | 151 | self.videoList.setDisabled(True) 152 | self.dlthread.start() 153 | 154 | def download_done(self): 155 | """ 156 | Manage the end of the interruption of the download process. If 157 | the process is interrupted, the partially downloaded file will 158 | be deleted. 159 | """ 160 | if self.dlthread.isRunning(): 161 | self.dlproc.exiting = True 162 | self.dlthread.quit() 163 | self.dlthread.wait() 164 | try: 165 | os.remove(self.dlproc.title) 166 | 167 | except OSError as error: 168 | print(error.strerror) 169 | 170 | self.videoList.setEnabled(True) 171 | self.dw.close() 172 | 173 | def closeEvent(self, event): 174 | if self.dlthread: 175 | self.download_done() 176 | 177 | 178 | def main(): 179 | app = QtGui.QApplication(sys.argv) 180 | window = MainWindow() 181 | window.show() 182 | sys.exit(app.exec_()) 183 | 184 | if __name__ == '__main__': 185 | main() 186 | -------------------------------------------------------------------------------- /phscanner/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vaginessa/pornhubscanner/92ca717e9b0ceaa09c6522aa5dd295736a4878cf/phscanner/__init__.py -------------------------------------------------------------------------------- /phscanner/download.py: -------------------------------------------------------------------------------- 1 | import urllib.request 2 | from PyQt4.QtCore import pyqtSignal, QObject 3 | 4 | 5 | class DownloadProcess(QObject): 6 | finished = pyqtSignal() 7 | report = pyqtSignal(int) 8 | 9 | def __init__(self, url, title): 10 | super().__init__() 11 | self.url = url 12 | self.title = title + '.mp4' 13 | self.exiting = False 14 | 15 | def _report(self, blocknum, blocksize, totalsize): 16 | readsofar = blocknum * blocksize 17 | if totalsize > 0: 18 | percentage = readsofar * 100 / totalsize 19 | self.report.emit(percentage) 20 | 21 | def start_process(self): 22 | block_size = 4096 23 | written_data = 0 24 | blocks_counter = 0 25 | 26 | with urllib.request.urlopen(self.url) as temp: 27 | headers = temp.info() 28 | totalsize = int(headers['Content-Length']) 29 | with open(self.title, 'wb') as file_to_write: 30 | while written_data < totalsize and self.exiting is False: 31 | file_to_write.write(temp.read(block_size)) 32 | written_data += block_size 33 | blocks_counter += 1 34 | self._report(blocks_counter, block_size, totalsize) 35 | self.finished.emit() 36 | -------------------------------------------------------------------------------- /phscanner/interfaces/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vaginessa/pornhubscanner/92ca717e9b0ceaa09c6522aa5dd295736a4878cf/phscanner/interfaces/__init__.py -------------------------------------------------------------------------------- /phscanner/interfaces/downloader.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'qt-resources/downloader.ui' 4 | # 5 | # Created by: PyQt4 UI code generator 4.11.4 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt4 import QtCore, QtGui 10 | 11 | try: 12 | _fromUtf8 = QtCore.QString.fromUtf8 13 | except AttributeError: 14 | def _fromUtf8(s): 15 | return s 16 | 17 | try: 18 | _encoding = QtGui.QApplication.UnicodeUTF8 19 | def _translate(context, text, disambig): 20 | return QtGui.QApplication.translate(context, text, disambig, _encoding) 21 | except AttributeError: 22 | def _translate(context, text, disambig): 23 | return QtGui.QApplication.translate(context, text, disambig) 24 | 25 | class Ui_Download(object): 26 | def setupUi(self, Download): 27 | Download.setObjectName(_fromUtf8("Download")) 28 | Download.resize(480, 70) 29 | self.gridLayout = QtGui.QGridLayout(Download) 30 | self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 31 | self.progressBar = QtGui.QProgressBar(Download) 32 | self.progressBar.setEnabled(True) 33 | self.progressBar.setProperty("value", 0) 34 | self.progressBar.setObjectName(_fromUtf8("progressBar")) 35 | self.gridLayout.addWidget(self.progressBar, 0, 0, 1, 1) 36 | self.abortButton = QtGui.QPushButton(Download) 37 | self.abortButton.setEnabled(True) 38 | self.abortButton.setMinimumSize(QtCore.QSize(35, 27)) 39 | self.abortButton.setMaximumSize(QtCore.QSize(16777215, 27)) 40 | self.abortButton.setText(_fromUtf8("")) 41 | icon = QtGui.QIcon() 42 | icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/abort.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) 43 | self.abortButton.setIcon(icon) 44 | self.abortButton.setFlat(True) 45 | self.abortButton.setObjectName(_fromUtf8("abortButton")) 46 | self.gridLayout.addWidget(self.abortButton, 0, 1, 1, 1) 47 | 48 | self.retranslateUi(Download) 49 | QtCore.QMetaObject.connectSlotsByName(Download) 50 | 51 | def retranslateUi(self, Download): 52 | Download.setWindowTitle(_translate("Download", "PornHubScanner - Downloader", None)) 53 | 54 | from . import icons_rc 55 | -------------------------------------------------------------------------------- /phscanner/interfaces/icons_rc.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Resource object code 4 | # 5 | # Created by: The Resource Compiler for PyQt4 (Qt v4.8.7) 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt4 import QtCore 10 | 11 | qt_resource_data = b"\ 12 | \x00\x00\x11\x9a\ 13 | \x89\ 14 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ 15 | \x00\x00\x79\x00\x00\x00\x32\x08\x06\x00\x00\x00\x78\x65\x74\xe6\ 16 | \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ 17 | \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ 18 | \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ 19 | \xe0\x03\x12\x17\x0f\x17\x7a\x02\x78\x1b\x00\x00\x00\x1d\x69\x54\ 20 | \x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x00\x00\x00\x00\x43\x72\ 21 | \x65\x61\x74\x65\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x64\ 22 | \x2e\x65\x07\x00\x00\x10\xfe\x49\x44\x41\x54\x78\xda\xed\x9b\x79\ 23 | \x90\x1c\xf5\x75\xc7\x3f\xaf\x7b\x76\xf6\x96\xb4\xab\x1b\xa4\x9d\ 24 | \x96\x06\xc4\x69\x1c\x30\x32\x02\x27\xe2\x74\x05\x62\x6c\x72\x38\ 25 | \x89\x1d\x6c\x8c\x8f\x72\x6c\x5c\x45\x08\x55\x10\xec\x4a\xfe\xb0\ 26 | \x83\x2b\x8e\x93\xb2\x21\x76\x9c\xd8\x14\xe5\xb2\x83\xa3\xb8\xa0\ 27 | \x52\x95\x10\x1b\x9b\x10\xcc\x11\x20\x18\x0c\x11\xa7\x02\x8c\x34\ 28 | \xbb\xab\x63\xb5\x48\x5a\xed\xbd\x73\xfc\x7e\x2f\x7f\xf4\x31\xdd\ 29 | \x3d\x3d\xbb\x92\x8f\x2a\x83\xe7\x55\x4d\xcd\x4c\xff\x8e\xfe\xf5\ 30 | \x7b\xbf\x77\x7d\xdf\xaf\xa1\x4d\x6d\x6a\x53\x9b\xda\xd4\xa6\x36\ 31 | \xb5\xa9\x4d\x6d\x6a\x53\x9b\x7e\x6e\x34\xf5\xdd\x8b\xde\xd4\xcf\ 32 | \x97\xfb\x55\x17\xf0\xe4\x8e\xed\x2c\xfb\xc3\x87\x98\xbe\xfb\xe2\ 33 | \x5e\xb5\xfa\x97\xc0\xb6\x37\x09\x5f\x8e\x28\xdc\x26\x6e\xfe\x87\ 34 | \xd2\xd6\xe3\x50\xd8\x17\x3e\x86\x70\x01\x80\x00\x9a\xfa\x8e\x53\ 35 | \xfc\x9a\x06\xdf\x92\x6a\x3f\x16\x92\x63\xe8\x2f\x8b\xb4\x2f\x36\ 36 | \x5e\x00\x55\x00\x3d\xaf\x2d\x64\xe0\xe8\x77\xb6\x5f\x24\x22\x0f\ 37 | \x00\x6e\x43\x80\x59\xe2\xcd\x16\xf4\x4f\xd3\xbe\xf8\x98\xf8\x2f\ 38 | \x45\x7e\x86\x99\x50\xfd\xee\xcf\x64\x96\x8a\x05\x8f\xd2\x70\xf9\ 39 | \x0d\x2f\x64\x51\x0a\xa8\x55\x5f\x03\x04\x63\xea\x58\x6b\xa3\x76\ 40 | \xd7\x75\x71\x1c\x27\xa1\x26\xa2\xc7\xa6\xa5\x4d\x2a\x2e\x29\xf5\ 41 | \xd7\x6c\xcd\x34\xa6\x8e\xb6\x5a\x43\x96\x69\x69\xba\xbb\x05\x01\ 42 | \x55\xd9\x94\x2b\x16\xbc\x0f\x00\x67\x03\xa6\x95\xfd\x51\x30\x02\ 43 | \x13\x28\x93\x08\x7b\x50\x9e\x2a\x8d\x94\x27\xde\x0c\x02\x06\x50\ 44 | \x6b\xa3\xa7\x35\xc6\x70\x78\xf5\xe5\xe4\x56\x6e\x41\x80\xba\x05\ 45 | \x39\xf0\x28\x2b\xe7\x9e\x43\x42\xe6\xc8\x71\xda\x64\x3d\xbe\x31\ 46 | \x15\xcd\x73\x74\xd5\x15\x74\x0c\x16\x11\x14\x63\x0c\x76\xef\x23\ 47 | \xac\xaa\xbc\x80\x23\x72\x8c\x9a\x1c\xfd\xd6\x1c\x70\x15\xf0\xde\ 48 | \xc5\xec\x8b\x34\xef\xc2\x83\xc5\x21\xef\xcb\x0a\x5f\x2d\x0d\x33\ 49 | \x2b\xf2\xc6\x16\xb6\xaa\x46\x9a\x69\x8c\x61\xe5\x49\xbf\xce\xc0\ 50 | \x29\x17\x23\x40\xcd\xc2\xe1\xc7\x5f\x87\xd2\x73\xbe\xfa\x6a\x86\ 51 | \x42\x66\x39\x68\x4d\x32\x50\x6d\xd0\x4f\xb3\x15\x5b\xe2\xc2\x93\ 52 | \x1c\xab\xb6\x6c\x67\xf0\xa4\x77\x00\x50\xaf\x1b\x0e\x2c\x8c\x61\ 53 | \x47\x5e\xc0\x71\x33\x47\x2f\xea\x24\x1c\x34\x70\xd0\xe9\x85\x69\ 54 | \xc6\xce\x6b\xfc\x5f\x0b\x7c\x41\x84\xbf\x39\xc9\xa3\x07\xa0\x38\ 55 | \xe4\xbd\x71\xa5\x6c\x82\x28\x45\x09\xac\xb6\x66\xf3\xc2\x84\x1b\ 56 | \xc2\x6f\x17\x0d\xc6\x59\x8d\xda\x50\xf5\xe7\x50\x45\x83\x0f\x36\ 57 | \xec\x17\x4c\x1d\x5e\x0f\xe6\x89\xc6\x58\x05\x63\x51\xab\x41\xd0\ 58 | \x94\x62\xbe\xb5\x60\x82\x7e\x16\x30\x8a\x1a\x7f\xac\xff\xa1\x31\ 59 | \x4f\xec\x93\x4b\xec\xc4\xac\xb0\x32\x2b\x7c\x6c\xd0\x27\x81\xdd\ 60 | \xc0\xdf\xe2\xbc\x81\x55\xd9\x2a\x56\x40\x88\x33\x38\x11\xbc\x60\ 61 | \xad\x45\xb0\x88\xf5\xf9\x1b\xaa\xbe\xf8\xc3\x41\xd4\x6f\x93\xc8\ 62 | \x23\xfa\x5d\x24\xf8\x0d\x58\xf5\xfd\x64\x14\x48\x29\x58\xd1\xe0\ 63 | \x9f\x6d\x8c\x49\xb3\x5b\x82\xfd\x60\x15\x2b\x16\x54\xa2\x8d\x28\ 64 | \x08\x88\x4d\x3e\x4e\x53\x9e\xdc\x2c\xd8\x23\xc0\x75\x08\x33\x28\ 65 | \x4e\x70\x7d\x03\xb0\x19\xf8\x18\xb0\x22\x65\x21\x3e\x5b\xf4\xbc\ 66 | \x7f\x28\x95\xcb\xb3\x6f\x5c\x19\xdb\xc0\x12\x4b\x83\x43\xc1\xce\ 67 | \x8f\x4c\x6c\xa8\x71\x31\x01\x25\x8c\x5b\xa8\xfc\x31\x23\xa0\x44\ 68 | \x79\x0c\x1a\x32\x4d\x41\x35\x10\xbb\xa4\xe6\x0c\x7a\xa9\x55\xb2\ 69 | \x14\x59\xad\x06\x0b\x8a\x16\xe9\x8f\x88\xdf\x58\x9a\x35\xd3\xc9\ 70 | \x08\x06\xe6\x81\xfb\x4a\xc3\xe5\xef\xe1\x70\x2f\x70\x2f\xc2\x3f\ 71 | \x96\x86\xcb\x37\x01\xe7\x01\x07\x53\xa6\xbb\x07\xe5\x8a\x9f\x86\ 72 | \xb9\x9b\x63\x26\xbe\x58\xf8\xf9\x99\xfb\xa5\xe6\x2a\x9e\xe8\x25\ 73 | \xfb\x18\x7c\xb3\x67\x2c\x6a\x2c\x71\x5b\xa9\x81\xcf\xf6\xdb\x1a\ 74 | \x7d\xb4\x5e\x47\x4d\x1d\x35\xa6\x71\x2d\xf3\x93\x31\x36\x34\xaf\ 75 | \xe9\xeb\xc1\x3a\xb0\x9a\xe1\x2a\x63\xed\x41\x7f\x5b\x37\xd1\xef\ 76 | \xc8\x6c\x1b\x8d\xfa\x85\xd7\x73\x09\xbb\x90\x32\xc9\xa5\x72\x39\ 77 | \x64\x9a\x06\xe9\xd2\x2b\xc5\x82\xf7\x59\x84\xaf\xa5\xc6\x9c\x01\ 78 | \xdc\x53\xdc\xe8\x51\x1a\x2d\x53\x1c\xf2\x5c\x84\x13\x50\x4e\x07\ 79 | \x2e\x40\x28\x06\x09\xdf\x01\xe0\x7f\x54\x79\x56\x1c\xf6\x97\xca\ 80 | \xe5\x4a\x74\xaf\xe1\x32\xc5\x82\xd7\x83\xb2\x05\xa1\x23\x98\x79\ 81 | \xce\xc2\xff\x39\xb0\x06\xe5\x77\x11\xb6\x01\xe3\x28\xff\x89\xf0\ 82 | \x04\x2e\x47\xa9\x73\x12\xc2\x8a\xd8\xb2\x5f\x2b\x0d\x97\x27\x36\ 83 | \x17\xbc\xf5\xa2\x6c\x45\xb8\x04\x65\x35\xc2\x51\xe0\x31\xe0\x11\ 84 | \x63\xd8\x5f\x1e\x2e\xdb\x30\x05\x0c\xb2\xa7\x90\x97\xcd\x69\x8d\ 85 | \x82\xad\x2b\x55\x77\x19\xf3\xfd\x5b\xa8\xaf\x3d\x87\x9e\x15\x6b\ 86 | \x58\x98\x9d\xc6\x8e\x3f\x4f\xef\xd1\x17\xe8\xaa\x8e\xe3\x04\x9d\ 87 | \xe7\x9d\x65\x98\xfe\x02\xae\xeb\xa2\x08\xa6\x3a\x47\xf7\x6c\x99\ 88 | \x9c\x56\x13\xaa\xa9\xaa\x4c\x74\x7a\x74\xf7\x0d\x02\xd6\xef\x3b\ 89 | \x75\x80\x4e\x3b\x95\x11\x1c\x42\xcd\x40\xad\x6b\x2d\x53\xcb\xcf\ 90 | \x22\xbf\xee\x4c\x9c\x8e\x6e\x16\x26\x0f\xe0\x1e\x7c\x86\xfe\xb9\ 91 | \x12\x1d\xf5\x29\x9a\x83\x6f\x4d\xc1\x77\xa1\x19\x4e\x0b\xdb\x17\ 92 | \x40\xd8\xe7\xd9\xcc\x00\x0e\x7c\x01\x6f\xf4\x56\x23\x7c\x1c\xf8\ 93 | \x28\xb0\xa9\x05\x6c\x34\x86\xe5\xdb\xc5\x82\xf7\xf7\xa5\xe1\xf2\ 94 | \x48\x2c\xdf\x3e\x13\x78\x10\xe8\x0d\xfa\xed\x16\xe5\x46\xe0\xd6\ 95 | \xa0\x2d\xa4\x1b\x80\x6b\x05\xee\x52\xf8\x3a\x70\x71\xac\xed\x03\ 96 | \xc5\x82\x67\x50\x6e\x01\xde\x9a\x4a\x40\xaf\x43\x28\x3b\x0e\x7f\ 97 | \x01\xdc\xd5\x10\xac\x46\x8b\x54\x6b\x9b\x94\xa8\x5e\xaf\x33\xbd\ 98 | \xfc\x6c\x3a\xcf\xbe\x86\x0d\xa7\x6e\xa3\xcb\x89\xfb\xbf\xf7\x33\ 99 | \xbe\x77\x37\x87\x1e\xff\x06\x83\xe3\x3f\x22\x47\x9d\xf9\xc1\xb7\ 100 | \xb0\xf6\xdd\x7f\x45\x6f\x4f\x27\x00\x13\x07\x46\xa8\xfe\xe0\x4f\ 101 | \x70\xe7\xf6\x25\x18\x61\x4d\x9d\xca\xd6\xeb\x38\x79\xeb\x85\x98\ 102 | \xa0\xe5\xb5\x07\xbf\x49\xe7\x4b\x77\xf8\x81\x59\xcc\x28\xcf\x9b\ 103 | \x3c\x6c\xbc\x92\x81\xf3\x3e\xc4\x69\xeb\x37\x26\xd6\x57\x35\x70\ 104 | \x70\xd7\xe3\xcc\xfd\xe4\x4e\x96\x4d\x3d\x1f\x44\xea\x0d\xa6\xe7\ 105 | \x8e\x05\x27\x2b\x0e\x79\xd4\x4c\xd4\x67\x5b\x3a\x3d\x00\xaa\x81\ 106 | \xc6\xaf\x07\xbe\x05\xbc\xb3\x25\xd6\x27\x20\xc2\x3a\x94\x9b\x81\ 107 | \x6d\xc5\x82\x77\x6d\x69\xb8\xbc\x27\xe4\x27\xc2\x64\x4c\xc8\x5d\ 108 | \x02\x5f\x44\xd8\x92\x9a\x67\x4e\x95\x07\x30\x74\x20\xcc\xc6\x36\ 109 | \x68\x15\xf8\x18\xca\xd9\x08\xcb\x5b\x20\x14\x9e\x08\xdf\x28\x16\ 110 | \xbc\x57\x4b\xc3\xe5\x27\x7d\x6e\xdb\x06\x80\x90\xd2\x64\x07\xe8\ 111 | \xf0\x2e\x62\xd9\x39\x7f\xc4\xf2\x95\xeb\x32\x77\xf7\xba\x0d\x9b\ 112 | \xe9\xfa\xcd\x4f\xb3\xef\xee\x03\xac\x9f\xdd\x89\x8b\x92\xb3\x55\ 113 | \x1c\xed\x44\x04\x3a\xa4\x46\x3d\x8c\xae\x63\xfe\x14\xab\xe4\x1d\ 114 | \x9f\xb1\x61\x66\x94\x17\x0b\x56\x93\x06\x56\x1c\x06\xdf\x7a\x15\ 115 | \x7d\x03\xab\xe9\xe9\xe9\x6d\x5a\x43\xde\x85\x8d\x67\x5c\xc0\x91\ 116 | \x55\x43\x8c\xdf\xfb\x19\x56\xcf\xbd\x80\x4a\x2e\x0a\x26\x72\x99\ 117 | \x49\x9b\x9b\x0c\xd0\x4a\x23\xe5\xd0\x87\x9e\x83\x72\x4b\x86\xf0\ 118 | \x76\x06\xff\xbe\x0a\x5c\xd6\x14\xa1\x0b\xa3\x41\xa2\x32\x14\x6a\ 119 | \x7d\x30\xc7\x76\xe0\xae\x62\xc1\xbb\xa4\x34\xdc\x30\xdd\xb1\x4d\ 120 | \xb8\x3e\xd8\xc8\xe9\x94\xf0\xfe\xdd\xc3\xe5\x7d\x45\xcf\xeb\x8d\ 121 | \xf3\x0c\xc8\x03\x17\x06\xe1\xeb\x24\xf0\xa4\xfa\xb1\xca\x3b\xa2\ 122 | \x8d\xe3\xcf\xd1\x0d\x7c\x1a\xf8\xed\x28\x36\x52\x0d\xf2\xd9\xe4\ 123 | \x0e\x77\x04\xd6\x9e\x74\x36\x88\xb0\xaf\xf4\x22\x93\xaf\x3c\x8c\ 124 | \x6b\x16\xe8\xdc\xfc\x1b\x78\xa7\x6f\x8d\xfa\xad\x58\xbe\x9c\xd7\ 125 | \xcf\x7a\x1f\x95\x47\x9e\xf1\xfd\x27\x1a\x99\xce\x46\x8a\xa3\x09\ 126 | \x60\x59\x33\xd2\x54\x8d\x52\xb0\xd8\x1a\x1c\x87\x35\x27\x7a\x28\ 127 | \x30\xfa\xea\xf3\xcc\xbc\xf2\x10\x60\xe9\x29\x6e\x67\xe8\x94\xb3\ 128 | \xa3\xfb\x0c\xae\xdd\xc0\xec\x85\x37\x31\x75\xef\x27\xe8\x77\x2b\ 129 | \xa8\x84\x9a\xdc\x6c\x4a\xbb\x31\xbc\xa7\x58\xf0\x66\x83\x96\x1e\ 130 | \x60\x00\xd8\xaa\xbe\x5f\xec\x4f\x09\xf8\x70\xcf\xb7\xf8\x8f\xe2\ 131 | \xb5\xde\xef\xa1\x5c\x4e\x2c\x43\x40\x78\x19\xb8\x11\x78\x08\x8b\ 132 | \xc5\xe1\x6d\xc0\x97\x20\xb0\x06\xbe\xe0\x2e\x40\xf8\x54\x70\x3d\ 133 | \x5b\xf7\x84\x17\x81\xcf\xab\x30\x27\x70\x0d\xca\x1d\xd9\x18\x62\ 134 | \xf4\xef\x71\xe0\x7d\xa5\xe1\xf2\x68\x60\x61\xce\x53\xb8\x4f\x60\ 135 | \x20\x66\xad\xde\xde\x94\x73\x68\x36\x3e\xa0\x22\xbc\xf6\xf0\xbf\ 136 | \x90\xfb\xf1\x6d\xac\x75\xe6\x41\x60\xea\x85\xbb\x78\x79\xf2\xf3\ 137 | \x9c\x76\x7e\x23\xe6\x5c\x36\xf4\x6b\x54\xe8\x0e\x34\x51\xfc\x9c\ 138 | \x5a\xc4\x37\x9f\xf1\x79\xc3\x6f\x6b\x5b\x03\x4f\xe9\x54\x5e\xe1\ 139 | \xb5\x87\x77\xd0\xf9\xf4\xed\xac\x91\x70\x0d\xdf\xe6\xa5\x73\xae\ 140 | \xe7\xf4\x77\x7e\x28\x7a\xac\x0d\x27\xbf\x85\x17\xd7\x6d\xa7\xef\ 141 | \xc0\xf7\xc1\xcd\xc7\x52\xa8\xe4\x5d\x06\x81\xef\x64\x01\x2a\x92\ 142 | \x91\x3f\x2b\xdc\xb0\x70\x2d\x39\xe0\x77\x10\x1f\x18\x09\xfa\x0c\ 143 | \xa3\x5c\x53\x1a\x29\x3f\x1d\x9b\xfd\x89\x62\xc1\xbb\x12\xe5\x51\ 144 | \xe0\xb4\xd8\x43\x7f\xa6\xb8\xde\xbb\x3d\x9a\x35\x69\x05\x26\x80\ 145 | \xf7\x94\x86\xcb\xbb\x83\xde\xff\x56\xbc\xc0\x83\x91\x16\x98\xb0\ 146 | \x70\x10\xf8\x60\x69\xb8\x3c\x5a\x2c\x7a\x94\x4a\x65\x4a\xc3\xe5\ 147 | \x27\x8b\x05\x6f\x07\x70\x5d\xec\x39\xbb\x37\x0f\x79\xab\x76\x8f\ 148 | \x94\x0f\x61\xb4\xb1\x51\x6c\x33\x87\x5f\xdf\xbb\x9b\xce\x9d\x77\ 149 | \xd2\xeb\xd6\xb0\x74\x00\xb0\xbc\xc3\x30\xb3\x73\x07\xe6\xfc\x2b\ 150 | \x22\x53\xdb\xd7\xbf\x8c\x29\xba\x71\x03\xb0\x23\x44\xb1\x34\x0e\ 151 | \x76\xa4\x13\xda\x0c\x4d\xc6\x2a\xe9\x24\xea\xd0\x9e\xe7\xe9\x7e\ 152 | \xee\x9b\x74\x3b\x8d\x35\xf4\x77\x28\xce\x33\x5f\x61\xd4\x3b\x97\ 153 | \xa1\x93\xcf\x88\x58\xd7\x7f\xea\xa5\x54\x47\xef\x23\x1f\x24\xdd\ 154 | \x4e\x62\x67\x65\xed\x64\x59\x04\x8b\x15\x3e\xe7\xba\xec\x30\xbe\ 155 | \x59\xbd\x30\x36\xd6\xa2\xdc\x1b\x17\x70\x71\xc8\xa3\xe8\x79\x94\ 156 | \x86\xcb\x87\x11\x3e\x97\x8a\xea\x07\xc9\x73\x09\x50\x6b\xba\x8f\ 157 | \xf2\xef\x28\xe5\x62\xb1\x91\xf6\x94\x1e\x2f\x67\x07\x8a\xfe\xf7\ 158 | \x13\xc0\xc1\x62\xc1\x17\x70\x0c\x89\x7b\x21\xc5\x37\x11\xf1\xdd\ 159 | \x95\x86\x51\x75\x80\x1a\xa5\xe1\xa6\xf9\xd1\xff\x25\x5f\x9f\xc1\ 160 | \x5a\x02\x54\x09\x0c\x0e\x7d\xf5\x09\xe6\x2a\x8d\xbe\x1d\x1d\x39\ 161 | \xaa\x74\xfa\xc2\x14\x49\x04\x4f\x21\x60\xa5\xd1\x27\x0e\xba\x24\ 162 | \xa3\x68\x55\x12\x95\x27\x0b\x54\x46\x7f\x42\xae\x36\x89\xb5\x12\ 163 | \x81\x6c\x56\x85\x1e\xd7\x32\xf3\xe2\x7d\x89\x39\xfa\xd6\x78\xd4\ 164 | \xdc\x5e\xff\x79\x14\x1c\x25\xc6\xa8\xf4\x47\x5b\x62\xdf\xbb\x80\ 165 | \xdf\x02\x6e\x7d\x75\x4f\xd9\x88\xd2\x8b\xb2\x21\xc6\xec\x2a\xc2\ 166 | \x33\x4d\x7e\xbd\x31\xdf\x53\x28\x33\xa9\x60\xef\x4c\x14\xd3\x64\ 167 | \xd2\xe0\x19\x04\xa5\x46\x73\xc5\x4b\xb2\x34\x81\xbd\x0a\xf5\xb0\ 168 | \x6f\x18\x4f\x28\x1c\x48\x14\x5d\x94\x84\xcf\x44\xd5\x57\xb4\x94\ 169 | \x80\x2d\x60\x67\x0e\x81\x35\x11\x24\x19\xc2\x90\x79\xea\xd4\x8d\ 170 | \x89\x2d\x47\xb0\xea\x84\xd8\x65\x02\x8f\x6e\xc0\x98\x31\x38\xd3\ 171 | \xb6\xa8\x58\x24\x53\x75\x6c\xdd\xa0\x53\x63\x50\xaf\x45\x30\xaa\ 172 | \x84\x7e\x5e\x85\xdc\xc4\xee\x44\x10\xd5\xd5\xbb\x8c\x8a\xf4\xfb\ 173 | \xa0\x8b\x55\x72\xa2\x4d\x91\xf5\x34\xc2\x9d\xc0\x42\x6c\x3b\xd5\ 174 | \x50\xc6\x11\xf6\x03\x3b\x4b\x23\xe5\xd7\x52\xcc\x76\x53\x8c\xaf\ 175 | \x23\x8c\xa5\xcb\x91\x31\x21\x4d\x07\x51\x71\x5f\x4c\x1b\x87\xa2\ 176 | \x4a\x58\xd2\x82\x1c\x89\x0b\x2b\x2b\xe5\x0b\xb1\x77\xf1\x5d\xca\ 177 | \x7c\x06\xb2\x17\x61\x59\xa1\x70\x45\x62\x8c\x0c\x10\x26\x8d\x04\ 178 | \x9e\x40\x3c\xc9\x9b\x79\xc4\xf8\xc1\x94\x46\xcd\x0d\x8c\xba\x69\ 179 | \x4d\x36\x55\x70\xd0\x70\xb7\x68\x22\x4e\x54\xa3\x99\xcf\xe4\x97\ 180 | \x18\x35\x01\x84\xe4\x4c\x05\xb1\xb6\x09\xbf\x52\x80\xea\x2c\x35\ 181 | \x0b\x9d\x4e\x23\x50\x43\x1c\x7f\x7e\xd1\x18\xac\xd9\x60\xda\x24\ 182 | \xca\x4d\xa5\x91\x72\xfd\x38\x6a\xc9\xb6\xa9\x44\xab\x74\x2d\x52\ 183 | \x09\xcb\x21\x4d\x47\x6c\xa6\x5b\x20\xe4\x73\xba\x54\xed\x56\x9a\ 184 | \xb5\xb3\x55\x05\x4e\x32\xab\x50\xb1\x0d\x93\x09\x29\xda\x86\x2c\ 185 | \x35\xe5\x3f\x53\x13\x5a\x1b\x6e\x04\x4d\xf8\x85\x46\x51\xa2\x71\ 186 | \x18\x40\x51\x72\x6e\xae\xf5\x7a\x1a\xe1\x35\x35\xa7\x8b\x9c\xcd\ 187 | \x42\x2d\x15\x15\x97\x78\xb9\xdb\x5a\x83\x1a\x13\x21\x9d\x4e\x06\ 188 | \x23\x04\x27\x08\xa0\x16\xa1\x94\xe9\xac\x02\x73\x31\xb5\xc9\x0b\ 189 | \x9c\x9c\xee\x17\xf9\x47\xe1\x44\x94\x95\xb1\x80\x49\x15\x5e\x8d\ 190 | \xa5\x8b\xf1\xd8\xa0\xb5\xdc\xd2\x45\xf7\xa5\xce\xd3\x48\x8b\x26\ 191 | \x1b\x0b\x8c\x5a\xb9\xa8\x8c\xea\x8e\xd8\x14\x72\x94\x88\xa2\x1b\ 192 | \xd7\x6b\x38\x58\xeb\x44\xda\x1c\x55\x91\xac\x20\x5d\xcb\x9a\x25\ 193 | \x9c\x4e\xe3\x1c\x17\xa7\x77\xa5\x0f\x6b\x44\xeb\x6c\x98\xed\x7a\ 194 | \xd7\xea\x20\x14\x0b\xea\xd1\x0b\xf3\xe4\x6a\x33\xd1\xfd\x9c\xa5\ 195 | \x4e\x2b\x1c\x23\x4d\x03\x2f\xc7\xfe\x77\x20\x5c\x54\x2c\x78\xfd\ 196 | \x21\x46\x5d\x2c\x78\x71\x93\xfb\xe1\x74\xda\x23\xc2\x43\x40\x07\ 197 | \x7a\x4c\x25\xd2\xd6\x65\xf2\x45\xfa\x27\xe2\xa0\xb4\x4f\xb6\x8d\ 198 | \xb2\x5d\x08\x39\xa6\xa3\xa1\x64\x59\x2f\xec\xa3\xcd\x02\x32\x35\ 199 | \xd0\x86\xe7\xc9\xe5\xbb\x51\xc9\xf9\xe6\x33\x16\x69\x2f\xd4\x1d\ 200 | \xba\x57\x6d\xcc\xd6\x62\x4d\xe6\xea\xb9\x13\xce\xc2\xe6\x7a\x13\ 201 | \x02\xf6\xd7\x6c\x70\xbd\xf3\x13\x73\xcc\x1e\xda\x47\xae\x32\x83\ 202 | \x0d\xfa\x38\x99\x68\xd7\x71\x1c\x29\x2a\x0e\x79\xa0\x4c\xa0\xfc\ 203 | \x28\x15\xa1\x5f\x86\xf2\x91\x62\xc1\xeb\x16\x41\xac\x22\x9b\x86\ 204 | \x3c\x29\x16\xbc\xf7\x02\x7f\x9c\xda\x5c\x8f\x94\xca\xe5\xd1\x48\ 205 | \x93\x65\x89\xd3\x2d\x59\x02\x8d\x55\x85\x16\x3b\x9a\x23\xb1\x74\ 206 | \xb0\xe1\x93\x1b\x75\xde\xf0\xb7\xa4\xec\x47\x84\x69\x87\x6e\xd8\ 207 | \x36\x03\x27\x51\x3e\x5c\x99\x45\x4c\xc3\xdb\x75\xf5\x0d\x50\xeb\ 208 | \xdb\x88\xaa\x44\xf3\x58\x53\xe7\xe8\xa6\x2b\x59\xb7\x66\x55\xb3\ 209 | \x4f\xce\xf0\xd5\xab\xb6\x9c\xcb\x9c\x77\x19\x46\xdd\x46\x74\x6e\ 210 | \x2c\xe3\xfd\x67\x51\xd8\xf6\xee\x44\xdf\xc9\x57\x9e\x20\x6f\xab\ 211 | \x10\xdc\x2f\xb7\x54\xb4\xba\xa4\xd9\xf6\xb5\xb3\x56\x2c\x78\x77\ 212 | \x03\xef\x0f\x4c\x31\x41\x91\xe1\x36\xfc\x22\xc1\xfd\x8e\x50\x09\ 213 | \x30\xe6\x8f\xa0\xb1\xd4\x4d\x98\x01\xae\x6f\x7d\x24\x65\xe9\xf3\ 214 | \x54\x69\x9b\xae\xc7\x5b\xdb\xb6\x1a\x73\x71\x9a\x7d\x58\x22\x16\ 215 | \x64\x85\x5e\x55\x52\x41\x80\x06\x11\x60\xfd\xe8\x7e\x4c\x65\x16\ 216 | \xf0\x05\xd8\xd5\xd5\x49\xef\xf6\x8f\x33\xf7\xe0\x02\xee\xd4\x5e\ 217 | \x70\xf3\x2c\x9c\xf8\x76\x4e\x7d\xd7\xf5\x8b\x98\x1c\x4d\x41\x97\ 218 | \x0e\x43\x57\xdd\xcc\xe8\x7f\xad\x26\x3f\xfc\xdf\x38\xa6\xc2\xfc\ 219 | \xca\x53\xd9\x78\xf9\x9f\xd2\x9d\x6f\x78\xb9\xd7\xc7\xf6\xe3\xbc\ 220 | \xf4\x3d\x5c\xd7\xf5\x35\x39\x01\x86\x1c\xbf\x89\x4e\xfb\xe8\x1f\ 221 | \x17\x87\xbc\xbf\x06\xfe\x2e\xd5\x74\x35\xca\xd5\x99\x85\x0a\xa1\ 222 | \x8a\x72\x7d\x69\xa4\xfc\x5c\x66\x1e\xde\xa2\x60\xb2\xa4\xb0\x75\ 223 | \xe9\x8d\x90\x88\x48\xac\x36\x96\x96\x95\xd6\x44\x50\xa3\x8d\x81\ 224 | \x70\x36\x23\x86\xf7\xe7\xed\x9a\xd9\xcf\xa1\xd2\x4e\xfa\xd7\x16\ 225 | \xa2\xcb\xeb\x8b\x67\x30\xbb\xee\x4b\xcc\x4d\x1c\x24\x97\xef\x62\ 226 | \x68\xf5\x09\x58\x81\x5d\x4f\x3d\xc4\xa9\x5b\x2f\x4a\x45\xd7\xc9\ 227 | \x67\x58\x98\x9d\xe6\xc8\xa1\x83\x9c\x50\x38\x89\x93\xdf\xf5\x09\ 228 | \xe6\xa6\xaf\xc6\xd4\x6b\x9c\xb0\x6c\x80\x0e\xb7\xf1\x50\x73\x55\ 229 | \xc3\x81\xfb\x6e\x67\x55\x65\x1c\xeb\xb8\x51\xf0\xe7\xa0\x8d\xf3\ 230 | \x69\x3f\xad\x36\x6f\xda\x18\x05\x54\x5f\x03\x7e\x1f\x98\xca\x04\ 231 | \x54\x92\x73\x4f\x03\x1f\xc5\xe1\x9f\x9a\x02\x3f\x32\x8e\xde\x2c\ 232 | \x12\x78\xa9\x66\x5b\xf0\xc5\x77\x43\xe3\xb9\x6d\x2c\xf7\xd5\x00\ 233 | \x92\x94\xc4\xc6\x90\xa0\x3d\xe6\x9f\xad\x3f\x2e\x7e\x8a\xd3\x71\ 234 | \x5d\x54\xa1\xd3\x15\xe6\x1e\xb8\x8d\x7d\xa9\xb4\xaf\xb7\xb7\x97\ 235 | \xd5\x1b\x36\x33\xb0\xe6\x04\x2a\x0a\x2f\xfd\xf3\xad\x54\x9e\xbe\ 236 | \x3b\x03\xd6\x4c\xe5\xd8\xd5\x59\x0e\xff\xe0\x36\xf6\x3c\xfb\x28\ 237 | \x0e\xd0\xd7\xdf\xcf\xf2\x81\xc1\xa4\x80\x2b\x75\xca\xff\xfa\x05\ 238 | \x56\xec\xbe\xdf\x4f\x9f\x62\x39\x79\x0e\x61\x4e\x95\x0a\x50\x09\ 239 | \xee\x31\x73\xbc\xd6\x6e\xcf\x68\x50\x8a\xb4\x98\xd2\x68\xf9\x9e\ 240 | \xcd\x05\xef\x01\x51\x6e\x56\xe5\xc3\xc0\xa0\x84\xbe\xd6\x4f\x13\ 241 | \x17\x10\xee\x01\xfe\xbc\x34\x5c\xde\x9f\x12\xa8\x51\x98\x16\xe8\ 242 | \x55\x1f\xdf\x77\x14\x5a\xa7\x72\x7e\x55\x70\x1e\x61\x5a\xfd\x6d\ 243 | \x9b\x17\xa8\xb4\x30\xd7\x35\x55\xaa\x02\x21\x46\x35\xed\x84\x29\ 244 | \x67\x3c\x6d\x52\xe5\xc8\xf8\x18\x66\xdf\x30\x22\x0e\x35\x2b\xcc\ 245 | \x4c\x4e\xd0\x67\x1a\x67\xbf\xfc\xcc\x49\x31\xd5\x1a\x63\x23\xbb\ 246 | \xa9\xf6\x75\x82\x2a\x0b\x95\x0a\xf5\x5a\x15\xab\x0e\x2b\x2a\x07\ 247 | \x99\xfa\xfa\x1f\x70\xe8\xc2\x1b\x29\x6e\xbb\x82\xee\xee\x1e\x10\ 248 | \xa8\x57\xab\xec\x7d\xed\x45\x26\x7f\xf8\x65\xd6\x1e\xd9\xc9\xc1\ 249 | \x55\xe7\x72\x60\x6c\x8c\x9c\xad\x81\xe3\x32\x39\x71\x88\x15\xc6\ 250 | \x72\x68\x7c\x0c\x33\xb0\x17\x54\x99\x3f\x7a\x90\xfc\xc4\x30\x66\ 251 | \xc7\x27\x79\x7a\xd7\x35\x6c\xba\xf4\x83\xac\x18\x5c\xe9\xdb\x13\ 252 | \x63\xd8\xb7\x67\x17\x87\xbf\x7f\x1b\xab\xc7\x9f\xc2\x75\x04\xdb\ 253 | \x64\x30\x8f\x2d\x0f\x3e\xae\x40\x2c\x0e\x5c\x14\x87\xbc\xd3\x10\ 254 | \x0a\x81\x71\x1c\x63\x25\xcf\x96\x9e\x29\x6b\x78\x0f\x05\x76\x0f\ 255 | \x97\x9b\xc6\x1d\xef\x7d\x8e\x23\xa7\x6f\xa2\xd1\x3f\x3b\xe3\x5a\ 256 | \x81\x3b\x42\xf7\xb5\x50\xad\x61\xac\x89\x4c\x43\xbe\xa3\x83\x8e\ 257 | \x9c\x9b\x38\x4b\xad\xea\xe7\xc4\xb3\x95\x2a\x12\x99\x1f\xa1\xb7\ 258 | \x3b\xdf\xd0\x42\x55\xb4\x5e\x61\xc2\x19\x40\x06\x87\x70\xdc\x1c\ 259 | \x95\x89\x31\xfa\xe7\xf6\xf9\x7e\xd4\xed\xa0\x6e\x2c\xf3\x95\x6a\ 260 | \xe4\x66\xf2\x1d\x39\xf2\xb9\x1c\xf3\xc1\x1a\x42\x88\xb3\xb3\x33\ 261 | \x4f\xce\x01\xd7\x54\x39\x6a\x3b\xa9\x0f\x6e\xa6\xa3\xab\x97\xf9\ 262 | \x89\x71\x96\xcf\x0e\xd3\x93\x77\x31\x4e\x47\x02\x1a\x0d\x96\xfa\ 263 | \xe4\x2f\xec\x0d\x8a\xc5\x18\xfb\xcb\x76\x28\x7f\xf4\xa6\xd3\xaf\ 264 | \x05\xee\x40\xc8\x59\x0b\x47\xa7\x0d\x95\x7a\x73\xc2\xa1\xb1\xb8\ 265 | \x68\xa0\xdf\xa1\xbb\x53\x82\xaa\xa1\x72\x64\xda\x52\xad\x65\x67\ 266 | \x04\x0e\x16\xb5\x96\xee\x4e\x61\xa0\x3f\x87\xc5\xaf\x4c\x8d\x4d\ 267 | \x18\xdf\x05\x64\x97\xdd\x51\x60\x79\xaf\xd0\xdb\xe5\x44\xda\x79\ 268 | \x78\xd2\x52\xad\x5b\x24\xd8\x84\x22\x82\x8a\x9b\xb8\x5f\xce\x85\ 269 | \x55\xcb\xdd\x70\xe3\x3c\xf9\x0b\x7b\xb1\x6b\x31\x21\xfe\xb2\x1d\ 270 | \xca\x57\x6d\x1c\x82\x33\x75\x65\xd7\x68\x9d\xa3\x33\xb6\x65\xff\ 271 | \xba\x51\xde\xb6\x25\xcf\x89\x2b\x5d\x2c\x7e\x9a\xf2\xca\x68\x9d\ 272 | \x23\xd3\x76\x91\x00\x5e\x19\x5a\x93\x63\x60\x99\xe3\xa7\x35\x2e\ 273 | \x3c\x5f\xaa\x52\x5d\x04\x57\xb4\x56\x39\xd3\xeb\x60\xd3\x7a\x1f\ 274 | \x48\x71\x5d\x78\x65\xb4\xca\x91\x69\x4d\x21\x44\x26\x31\xae\xbf\ 275 | \x5b\xb8\xe0\x4c\x07\xd7\xf1\x8b\x19\xbf\xf2\x6f\x35\x46\x39\x30\ 276 | \x8d\x22\x85\x31\x4a\xdd\xe8\x22\x42\xf6\x73\x59\x6b\xfd\xa8\x35\ 277 | \x34\xdd\xe9\x31\xf1\x20\xd0\x5a\x7f\x5e\xb5\xd6\xbf\x9f\x11\x6a\ 278 | \xc6\xdf\x30\xad\x82\x45\x13\x8c\x09\xcf\x79\xab\x7f\x86\x8f\xba\ 279 | \xd1\x45\xe1\xdb\xba\x91\x00\x78\xf1\xd7\xd0\x16\x72\x23\xc1\x8d\ 280 | \xaa\xf3\xc7\x02\xba\x69\x0c\x18\x69\x95\x00\x34\x1d\xa0\x89\x0a\ 281 | \x15\x41\x84\xa2\x4b\x04\x46\x29\x3c\x1c\xdb\x1a\x75\xcd\x38\xbf\ 282 | \x17\x64\x0d\x6d\x21\x87\xd6\x6e\x24\xe4\xb6\x23\xb0\x71\xd0\x61\ 283 | \x65\x9f\x34\x6b\x8b\x36\xb0\x93\xfe\xae\xc6\x19\x6d\x51\xe5\xc4\ 284 | \x01\x87\x81\x1e\x41\x63\x2f\xc3\xa9\xc4\x5f\x21\x85\x15\xbd\x42\ 285 | \x18\xcf\x19\xa3\x6c\x5e\xeb\x62\x62\x39\x7a\xba\x70\xa5\x0a\x2b\ 286 | \xba\x9d\x08\x21\xb5\x0a\x1b\x06\x1d\x06\x7b\x9b\xd7\x16\xdf\x90\ 287 | \x9d\x39\xf1\xb5\xdf\x7f\xc5\x6b\xb4\xfd\xea\x2a\x30\x7a\xc3\x16\ 288 | \xd7\x18\x79\x0c\xe5\xbc\x66\xbc\x20\x7e\x34\x86\xc5\xf1\x56\x61\ 289 | \xf1\x97\x97\x75\x11\x55\xcf\x6c\xd7\xd8\x4e\x59\x0a\xb9\x6f\xf9\ 290 | \x22\xdb\xa5\x6d\x21\x07\x54\xfe\xd4\x29\xfd\x8a\xde\x02\x5c\xb4\ 291 | \x14\x4b\x97\xe2\xf9\xb1\xe0\x49\x72\x0c\x7b\x84\x45\xf6\x4a\xab\ 292 | \x37\x62\x63\x7d\x8e\x0a\x7c\x05\x78\xa0\x2d\x5d\x5f\xc0\x6d\x26\ 293 | \xb4\xa9\x4d\x6d\x6a\x53\x9b\xda\xd4\xa6\x36\xb5\xa9\x4d\x6d\x6a\ 294 | \x53\x9b\x00\xfe\x1f\xf7\x46\xac\xd1\xda\xc9\xeb\xc9\x00\x00\x00\ 295 | \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ 296 | \x00\x00\x01\x29\ 297 | \x89\ 298 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ 299 | \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ 300 | \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ 301 | \x00\x00\x00\xe0\x49\x44\x41\x54\x58\x85\xed\x92\xbb\x0a\xc2\x40\ 302 | \x10\x45\x0f\x7e\x9a\x95\x4d\x40\x50\xc4\x68\xa5\x20\x58\x0a\x7e\ 303 | \x80\xfe\xa8\x8d\x12\x2b\xc1\xd2\x77\x62\x91\x08\xeb\x38\x79\x3a\ 304 | \xe9\xf6\xc2\x36\xe1\xee\xde\x33\x77\x02\x5e\x5e\x5e\x5e\xe5\x4a\ 305 | \xb2\xb3\x07\x82\x0a\xfe\x2e\xb0\x73\xee\x99\x01\x24\xc0\x13\x98\ 306 | \x14\x78\x7b\xc0\x45\xdc\xf9\x5b\x27\xf1\xe0\x03\x18\x2a\xbe\x00\ 307 | \xb8\x0a\xef\xd9\x02\x60\x21\x1e\xd5\x20\xfa\xc0\x4d\xf1\xad\x2d\ 308 | \x00\x00\x56\x40\x8c\xbe\x8e\x01\x70\x57\xc2\x37\x56\xe1\x2e\x84\ 309 | \xd6\x84\x16\xbe\xb5\x0e\x77\x21\x64\x13\xad\x4f\x5e\x07\xa2\x76\ 310 | \x78\xa7\x01\xc0\x31\x03\x90\x4a\x80\x43\x83\xf7\x6a\x69\x44\xba\ 311 | \xf7\xbc\xfa\x63\x60\xd9\x56\xf8\x94\xf4\xcf\x77\x03\x5f\xd9\x91\ 312 | \xdf\xe6\xd6\xe1\x21\xbf\x93\x7f\xa6\x9d\x29\x10\xa6\x4d\x8c\x95\ 313 | \x00\x39\xe5\x3c\xc7\x13\x5a\x00\x44\x25\xe1\x45\x10\x91\x05\x40\ 314 | \x9d\x6a\xb5\x75\x98\x01\x44\x54\xab\x34\xe4\xbb\x35\x2f\x2f\x2f\ 315 | \xaf\x42\xbd\x01\x0a\x4e\x92\x95\x2f\x93\x90\xf7\x00\x00\x00\x00\ 316 | \x49\x45\x4e\x44\xae\x42\x60\x82\ 317 | \x00\x00\x05\xe0\ 318 | \x3c\ 319 | \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ 320 | \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x69\x73\x6f\ 321 | \x2d\x38\x38\x35\x39\x2d\x31\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\ 322 | \x20\x47\x65\x6e\x65\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\ 323 | \x65\x20\x49\x6c\x6c\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x38\ 324 | \x2e\x31\x2e\x31\x2c\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\ 325 | \x20\x50\x6c\x75\x67\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\ 326 | \x65\x72\x73\x69\x6f\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\ 327 | \x6c\x64\x20\x30\x29\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x73\x76\x67\ 328 | \x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x69\ 329 | \x64\x3d\x22\x43\x61\x70\x61\x5f\x31\x22\x20\x78\x6d\x6c\x6e\x73\ 330 | \x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ 331 | \x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x78\x6d\ 332 | \x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\ 333 | \x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\ 334 | \x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\x30\x70\x78\x22\ 335 | \x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\x76\x69\x65\x77\ 336 | \x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x36\x31\x32\x2e\x30\x37\x34\ 337 | \x20\x36\x31\x32\x2e\x30\x37\x34\x22\x20\x73\x74\x79\x6c\x65\x3d\ 338 | \x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\x67\x72\x6f\x75\ 339 | \x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x36\x31\x32\x2e\x30\ 340 | \x37\x34\x20\x36\x31\x32\x2e\x30\x37\x34\x3b\x22\x20\x78\x6d\x6c\ 341 | \x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\x65\x72\x76\x65\ 342 | \x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\ 343 | \x64\x3d\x22\x4d\x33\x30\x36\x2e\x30\x33\x37\x2c\x30\x43\x31\x33\ 344 | \x36\x2e\x39\x39\x37\x2c\x30\x2c\x30\x2c\x31\x33\x36\x2e\x39\x39\ 345 | \x37\x2c\x30\x2c\x33\x30\x36\x2e\x30\x33\x37\x73\x31\x33\x36\x2e\ 346 | \x39\x39\x37\x2c\x33\x30\x36\x2e\x30\x33\x37\x2c\x33\x30\x36\x2e\ 347 | \x30\x33\x37\x2c\x33\x30\x36\x2e\x30\x33\x37\x73\x33\x30\x36\x2e\ 348 | \x30\x33\x37\x2d\x31\x33\x36\x2e\x39\x39\x37\x2c\x33\x30\x36\x2e\ 349 | \x30\x33\x37\x2d\x33\x30\x36\x2e\x30\x33\x37\x0d\x0a\x09\x09\x53\ 350 | \x34\x37\x35\x2e\x30\x37\x37\x2c\x30\x2c\x33\x30\x36\x2e\x30\x33\ 351 | \x37\x2c\x30\x7a\x20\x4d\x33\x30\x36\x2e\x30\x33\x37\x2c\x35\x38\ 352 | \x32\x2e\x34\x30\x35\x63\x2d\x31\x35\x32\x2e\x32\x30\x33\x2c\x30\ 353 | \x2d\x32\x37\x36\x2e\x33\x36\x38\x2d\x31\x32\x34\x2e\x31\x36\x35\ 354 | \x2d\x32\x37\x36\x2e\x33\x36\x38\x2d\x32\x37\x36\x2e\x33\x36\x38\ 355 | \x53\x31\x35\x33\x2e\x38\x33\x34\x2c\x32\x39\x2e\x36\x36\x39\x2c\ 356 | \x33\x30\x36\x2e\x30\x33\x37\x2c\x32\x39\x2e\x36\x36\x39\x0d\x0a\ 357 | \x09\x09\x73\x32\x37\x36\x2e\x33\x36\x38\x2c\x31\x32\x34\x2e\x31\ 358 | \x36\x35\x2c\x32\x37\x36\x2e\x33\x36\x38\x2c\x32\x37\x36\x2e\x33\ 359 | \x36\x38\x53\x34\x35\x38\x2e\x32\x34\x2c\x35\x38\x32\x2e\x34\x30\ 360 | \x35\x2c\x33\x30\x36\x2e\x30\x33\x37\x2c\x35\x38\x32\x2e\x34\x30\ 361 | \x35\x7a\x20\x4d\x34\x32\x35\x2e\x33\x38\x31\x2c\x33\x31\x35\x2e\ 362 | \x36\x38\x63\x35\x2e\x36\x33\x37\x2c\x35\x2e\x36\x33\x37\x2c\x35\ 363 | \x2e\x36\x33\x37\x2c\x31\x35\x2e\x32\x30\x35\x2c\x30\x2c\x32\x30\ 364 | \x2e\x38\x34\x33\x0d\x0a\x09\x09\x6c\x2d\x31\x30\x38\x2e\x39\x36\ 365 | \x2c\x31\x30\x39\x2e\x37\x30\x32\x63\x2d\x30\x2e\x38\x31\x36\x2c\ 366 | \x30\x2e\x38\x31\x36\x2d\x31\x2e\x36\x33\x32\x2c\x31\x2e\x36\x33\ 367 | \x32\x2d\x32\x2e\x33\x37\x34\x2c\x31\x2e\x36\x33\x32\x6c\x2d\x30\ 368 | \x2e\x38\x31\x36\x2c\x30\x2e\x38\x31\x36\x63\x2d\x30\x2e\x38\x31\ 369 | \x36\x2c\x30\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2e\x38\x31\x36\x2d\ 370 | \x31\x2e\x36\x33\x32\x2c\x30\x2e\x38\x31\x36\x0d\x0a\x09\x09\x63\ 371 | \x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x30\x2e\x38\x31\x36\x2c\x30\ 372 | \x2d\x31\x2e\x36\x33\x32\x2c\x30\x2e\x38\x31\x36\x63\x2d\x30\x2e\ 373 | \x38\x31\x36\x2c\x30\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x31\x2e\ 374 | \x36\x33\x32\x2c\x30\x63\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x31\ 375 | \x2e\x36\x33\x32\x2c\x30\x2d\x33\x2e\x31\x38\x39\x2c\x30\x63\x2d\ 376 | \x30\x2e\x38\x31\x36\x2c\x30\x2d\x31\x2e\x36\x33\x32\x2c\x30\x2d\ 377 | \x33\x2e\x31\x38\x39\x2c\x30\x0d\x0a\x09\x09\x63\x2d\x30\x2e\x38\ 378 | \x31\x36\x2c\x30\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x31\x2e\x36\ 379 | \x33\x32\x2c\x30\x63\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x30\x2e\ 380 | \x38\x31\x36\x2c\x30\x2d\x31\x2e\x36\x33\x32\x2d\x30\x2e\x38\x31\ 381 | \x36\x63\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x30\x2e\x38\x31\x36\ 382 | \x2d\x30\x2e\x38\x31\x36\x2d\x31\x2e\x36\x33\x32\x2d\x30\x2e\x38\ 383 | \x31\x36\x63\x30\x2c\x30\x2d\x30\x2e\x38\x31\x36\x2c\x30\x2d\x30\ 384 | \x2e\x38\x31\x36\x2d\x30\x2e\x38\x31\x36\x0d\x0a\x09\x09\x63\x2d\ 385 | \x30\x2e\x38\x31\x36\x2d\x30\x2e\x38\x31\x36\x2d\x31\x2e\x36\x33\ 386 | \x32\x2d\x30\x2e\x38\x31\x36\x2d\x32\x2e\x33\x37\x34\x2d\x31\x2e\ 387 | \x36\x33\x32\x4c\x31\x38\x35\x2e\x38\x37\x37\x2c\x33\x33\x35\x2e\ 388 | \x37\x30\x36\x63\x2d\x35\x2e\x36\x33\x37\x2d\x35\x2e\x36\x33\x37\ 389 | \x2d\x35\x2e\x36\x33\x37\x2d\x31\x35\x2e\x32\x30\x35\x2c\x30\x2d\ 390 | \x32\x30\x2e\x38\x34\x33\x73\x31\x35\x2e\x32\x30\x35\x2d\x35\x2e\ 391 | \x36\x33\x37\x2c\x32\x30\x2e\x38\x34\x33\x2c\x30\x6c\x38\x34\x2e\ 392 | \x39\x32\x38\x2c\x38\x34\x2e\x39\x32\x38\x0d\x0a\x09\x09\x56\x31\ 393 | \x36\x35\x2e\x30\x33\x35\x63\x30\x2d\x38\x2e\x30\x31\x31\x2c\x36\ 394 | \x2e\x33\x37\x39\x2d\x31\x34\x2e\x33\x39\x2c\x31\x34\x2e\x33\x39\ 395 | \x2d\x31\x34\x2e\x33\x39\x73\x31\x34\x2e\x33\x39\x2c\x36\x2e\x33\ 396 | \x37\x39\x2c\x31\x34\x2e\x33\x39\x2c\x31\x34\x2e\x33\x39\x76\x32\ 397 | \x33\x34\x2e\x36\x38\x33\x6c\x38\x33\x2e\x33\x37\x2d\x38\x33\x2e\ 398 | \x32\x39\x36\x0d\x0a\x09\x09\x43\x34\x31\x30\x2e\x31\x37\x36\x2c\ 399 | \x33\x31\x30\x2e\x30\x34\x32\x2c\x34\x31\x39\x2e\x38\x31\x38\x2c\ 400 | \x33\x31\x30\x2e\x30\x34\x32\x2c\x34\x32\x35\x2e\x33\x38\x31\x2c\ 401 | \x33\x31\x35\x2e\x36\x38\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\ 402 | \x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\ 403 | \x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\ 404 | \x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\ 405 | \x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\ 406 | \x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\ 407 | \x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\ 408 | \x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\ 409 | \x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\ 410 | \x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\ 411 | \x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\ 412 | \x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\ 413 | \x00\x00\x02\x64\ 414 | \x89\ 415 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ 416 | \x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ 417 | \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ 418 | \x00\x00\x02\x1b\x49\x44\x41\x54\x58\x85\xed\xd7\xbb\x6b\x15\x51\ 419 | \x10\x06\xf0\xdf\x4d\xe7\xab\xd6\xa8\xf8\x20\x82\x0f\x7c\x40\x12\ 420 | \xad\x8c\x10\x2d\x7c\x34\x46\x50\xb1\x10\xed\xb4\xf3\x0f\x10\x05\ 421 | \xff\x0f\x6b\x11\x0b\x41\x8d\x18\x14\xf1\x95\x18\x83\x85\x58\x69\ 422 | \x8c\x8d\x90\x80\x08\x06\x44\x53\x24\x12\x8c\xc5\xde\x2b\x71\x72\ 423 | \x76\xb3\x9b\x7b\x3b\x1d\x98\x62\xf7\x7c\xf3\x7d\x33\x7b\x66\xcf\ 424 | \x83\x7f\xdd\x6a\x15\xf1\x9b\x71\x1c\x07\xd0\x8e\xf5\xf5\xf7\x13\ 425 | \xf8\x8c\x17\xb8\x83\x4f\x2d\xca\xef\x8f\x1d\xc4\x2b\xcc\x95\xf4\ 426 | \x61\xf4\xb6\x42\x78\x0d\x1e\x54\x10\x8e\x7e\x1f\xab\x97\x2a\xbe\ 427 | \x5b\xf6\x29\x97\x2a\xde\xf0\x09\x74\x57\x15\xef\xc2\x54\x82\x6c\ 428 | \x16\x03\xb8\x88\x7d\x58\x87\xb5\x75\xfc\x25\x3c\xcf\x49\x62\x0a\ 429 | \x9d\x65\xc5\xdb\x31\x9e\x20\x79\x88\x9d\x25\xe2\xbb\x31\x92\x88\ 430 | \x1f\x97\x4d\xe9\xa2\xf6\x38\x04\xfe\xc2\x35\xe5\xff\x98\x95\x18\ 431 | \x4c\x24\x30\x87\x47\x8b\x05\x1f\x4b\x04\x5d\x2d\x29\x0c\x2b\xf0\ 432 | \x34\x47\xbc\xe1\x87\x8b\x08\xde\x06\x70\xbf\xe6\x2b\x9f\x0e\xcf\ 433 | \x6f\xf2\x08\x76\x05\xe0\x2c\xb6\x97\x14\xcf\xab\x7c\x08\x7b\x30\ 434 | \x13\xde\xef\x48\x91\x5c\x09\xa0\xdb\x25\xc5\xf3\x2a\x1f\xac\x8f\ 435 | \xc1\xad\x30\x76\x39\x45\x14\x9b\xef\x5c\x8b\xc4\xe1\x44\x18\x4f\ 436 | \x36\xe3\xfb\x00\xda\xda\x22\x71\xb2\xdf\x6f\x3e\xe6\x5d\x8a\xf0\ 437 | \x7b\x00\xad\x2a\x10\x2f\x9a\xf3\x54\x5c\xcd\xdf\x7d\xf0\x2d\x45\ 438 | \x1a\x57\xbe\x65\x39\xe2\x55\x2a\x6f\x58\x5b\x48\xe0\x47\x0a\x34\ 439 | \x16\x08\x37\xb5\x48\x9c\x6c\x43\x9a\x8f\xff\x90\x02\x3d\x0b\xa0\ 440 | \xd3\x2d\x12\x87\x23\x21\xe6\x49\x63\xa0\x6d\x1e\xe8\x65\x08\xea\ 441 | \x0b\xe2\x03\xd8\x1f\x30\x43\x38\x2a\x9b\xbe\x22\xeb\x0b\xcf\x51\ 442 | \x0b\xec\x0d\x59\xce\x60\x83\xe6\x2a\x27\xfb\xfc\xb1\xc1\xbb\x52\ 443 | \xc0\x1a\x3e\x06\x60\x7f\x93\xe2\x70\x3d\xc4\x8e\x29\x58\xde\xcf\ 444 | \x24\xc4\xca\xfe\x6a\x29\x3b\x9f\x88\x3f\x55\x14\x50\xc3\xeb\x02\ 445 | \xf1\x2a\x95\x5f\xb0\x70\x0f\x18\x51\x62\x73\xdb\x82\xc9\x84\xf8\ 446 | \xb4\x72\x47\xab\x8d\xb8\x91\x88\xff\x8a\x8e\x92\xc9\xeb\xc5\xcf\ 447 | \x04\xc9\x2c\xee\xe2\x6c\x9d\x6c\xb9\x6c\x55\xdc\x26\x9b\xbe\x9b\ 448 | \x16\x6e\xbf\x73\x75\xae\xca\xa7\xe4\x1e\x7c\x49\x90\x55\xf5\x49\ 449 | \x1c\xaa\x2a\xde\xb0\x0e\xe9\xf3\x5d\x59\x1f\x96\x5d\x66\x9a\xb2\ 450 | \x9a\xac\x73\x47\x2b\x08\x8f\xe2\xa4\x12\x0d\x57\xf5\x6a\xd6\x29\ 451 | \xbb\x9a\xf5\xc8\xbf\x9a\xdd\x53\x70\xec\xfa\x6f\xd1\x7e\x03\x12\ 452 | \x7e\x6c\x46\x04\x80\x4c\x4c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ 453 | \x42\x60\x82\ 454 | \x00\x00\x05\x80\ 455 | \x3c\ 456 | \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ 457 | \x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x69\x73\x6f\ 458 | \x2d\x38\x38\x35\x39\x2d\x31\x22\x3f\x3e\x0d\x0a\x3c\x21\x2d\x2d\ 459 | \x20\x47\x65\x6e\x65\x72\x61\x74\x6f\x72\x3a\x20\x41\x64\x6f\x62\ 460 | \x65\x20\x49\x6c\x6c\x75\x73\x74\x72\x61\x74\x6f\x72\x20\x31\x37\ 461 | \x2e\x31\x2e\x30\x2c\x20\x53\x56\x47\x20\x45\x78\x70\x6f\x72\x74\ 462 | \x20\x50\x6c\x75\x67\x2d\x49\x6e\x20\x2e\x20\x53\x56\x47\x20\x56\ 463 | \x65\x72\x73\x69\x6f\x6e\x3a\x20\x36\x2e\x30\x30\x20\x42\x75\x69\ 464 | \x6c\x64\x20\x30\x29\x20\x20\x2d\x2d\x3e\x0d\x0a\x3c\x21\x44\x4f\ 465 | \x43\x54\x59\x50\x45\x20\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\ 466 | \x20\x22\x2d\x2f\x2f\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\ 467 | \x47\x20\x31\x2e\x31\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\ 468 | \x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\ 469 | \x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\ 470 | \x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\ 471 | \x3c\x73\x76\x67\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ 472 | \x31\x22\x20\x69\x64\x3d\x22\x43\x61\x70\x61\x5f\x31\x22\x20\x78\ 473 | \x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ 474 | \x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\ 475 | \x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\ 476 | \x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\ 477 | \x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x78\x3d\x22\ 478 | \x30\x70\x78\x22\x20\x79\x3d\x22\x30\x70\x78\x22\x0d\x0a\x09\x20\ 479 | \x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x32\x36\x35\ 480 | \x2e\x34\x30\x34\x20\x32\x36\x35\x2e\x34\x30\x34\x22\x20\x73\x74\ 481 | \x79\x6c\x65\x3d\x22\x65\x6e\x61\x62\x6c\x65\x2d\x62\x61\x63\x6b\ 482 | \x67\x72\x6f\x75\x6e\x64\x3a\x6e\x65\x77\x20\x30\x20\x30\x20\x32\ 483 | \x36\x35\x2e\x34\x30\x34\x20\x32\x36\x35\x2e\x34\x30\x34\x3b\x22\ 484 | \x20\x78\x6d\x6c\x3a\x73\x70\x61\x63\x65\x3d\x22\x70\x72\x65\x73\ 485 | \x65\x72\x76\x65\x22\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x09\x3c\x70\ 486 | \x61\x74\x68\x20\x73\x74\x79\x6c\x65\x3d\x22\x66\x69\x6c\x6c\x3a\ 487 | \x23\x30\x30\x30\x30\x30\x32\x3b\x22\x20\x64\x3d\x22\x4d\x31\x39\ 488 | \x34\x2e\x31\x37\x32\x2c\x31\x32\x33\x2e\x36\x38\x34\x6c\x2d\x37\ 489 | \x38\x2e\x30\x38\x31\x2d\x35\x31\x2e\x31\x32\x32\x63\x2d\x31\x2e\ 490 | \x39\x32\x31\x2d\x31\x2e\x32\x35\x37\x2d\x34\x2e\x30\x33\x32\x2d\ 491 | \x31\x2e\x39\x32\x32\x2d\x36\x2e\x31\x30\x36\x2d\x31\x2e\x39\x32\ 492 | \x32\x0d\x0a\x09\x09\x63\x2d\x35\x2e\x35\x32\x31\x2c\x30\x2d\x39\ 493 | \x2e\x36\x38\x36\x2c\x34\x2e\x34\x39\x36\x2d\x39\x2e\x36\x38\x36\ 494 | \x2c\x31\x30\x2e\x34\x35\x38\x76\x31\x30\x33\x2e\x32\x30\x37\x63\ 495 | \x30\x2c\x35\x2e\x39\x36\x32\x2c\x34\x2e\x31\x36\x34\x2c\x31\x30\ 496 | \x2e\x34\x35\x38\x2c\x39\x2e\x36\x38\x35\x2c\x31\x30\x2e\x34\x35\ 497 | \x38\x63\x32\x2e\x30\x37\x35\x2c\x30\x2c\x34\x2e\x31\x38\x37\x2d\ 498 | \x30\x2e\x36\x36\x35\x2c\x36\x2e\x31\x30\x36\x2d\x31\x2e\x39\x32\ 499 | \x33\x6c\x37\x38\x2e\x30\x38\x32\x2d\x35\x31\x2e\x31\x32\x39\x0d\ 500 | \x0a\x09\x09\x63\x33\x2e\x32\x35\x31\x2d\x32\x2e\x31\x32\x39\x2c\ 501 | \x35\x2e\x31\x31\x37\x2d\x35\x2e\x34\x31\x35\x2c\x35\x2e\x31\x31\ 502 | \x36\x2d\x39\x2e\x30\x31\x34\x43\x31\x39\x39\x2e\x32\x38\x39\x2c\ 503 | \x31\x32\x39\x2e\x30\x39\x38\x2c\x31\x39\x37\x2e\x34\x32\x34\x2c\ 504 | \x31\x32\x35\x2e\x38\x31\x34\x2c\x31\x39\x34\x2e\x31\x37\x32\x2c\ 505 | \x31\x32\x33\x2e\x36\x38\x34\x7a\x20\x4d\x31\x31\x35\x2e\x33\x2c\ 506 | \x31\x37\x35\x2e\x34\x32\x39\x56\x38\x39\x2e\x39\x37\x33\x6c\x36\ 507 | \x35\x2e\x32\x35\x36\x2c\x34\x32\x2e\x37\x32\x35\x0d\x0a\x09\x09\ 508 | \x4c\x31\x31\x35\x2e\x33\x2c\x31\x37\x35\x2e\x34\x32\x39\x7a\x22\ 509 | \x2f\x3e\x0d\x0a\x09\x3c\x70\x61\x74\x68\x20\x73\x74\x79\x6c\x65\ 510 | \x3d\x22\x66\x69\x6c\x6c\x3a\x23\x30\x30\x30\x30\x30\x32\x3b\x22\ 511 | \x20\x64\x3d\x22\x4d\x31\x33\x32\x2e\x37\x30\x32\x2c\x30\x2e\x30\ 512 | \x30\x31\x43\x35\x39\x2e\x35\x33\x2c\x30\x2e\x30\x30\x31\x2c\x30\ 513 | \x2c\x35\x39\x2e\x35\x33\x2c\x30\x2c\x31\x33\x32\x2e\x37\x30\x32\ 514 | \x63\x30\x2c\x37\x33\x2e\x31\x37\x32\x2c\x35\x39\x2e\x35\x33\x2c\ 515 | \x31\x33\x32\x2e\x37\x30\x32\x2c\x31\x33\x32\x2e\x37\x30\x32\x2c\ 516 | \x31\x33\x32\x2e\x37\x30\x32\x0d\x0a\x09\x09\x73\x31\x33\x32\x2e\ 517 | \x37\x30\x32\x2d\x35\x39\x2e\x35\x33\x2c\x31\x33\x32\x2e\x37\x30\ 518 | \x32\x2d\x31\x33\x32\x2e\x37\x30\x32\x43\x32\x36\x35\x2e\x34\x30\ 519 | \x34\x2c\x35\x39\x2e\x35\x33\x2c\x32\x30\x35\x2e\x38\x37\x35\x2c\ 520 | \x30\x2e\x30\x30\x31\x2c\x31\x33\x32\x2e\x37\x30\x32\x2c\x30\x2e\ 521 | \x30\x30\x31\x7a\x20\x4d\x31\x33\x32\x2e\x37\x30\x32\x2c\x32\x35\ 522 | \x30\x2e\x34\x30\x34\x0d\x0a\x09\x09\x43\x36\x37\x2e\x38\x30\x31\ 523 | \x2c\x32\x35\x30\x2e\x34\x30\x34\x2c\x31\x35\x2c\x31\x39\x37\x2e\ 524 | \x36\x30\x33\x2c\x31\x35\x2c\x31\x33\x32\x2e\x37\x30\x32\x43\x31\ 525 | \x35\x2c\x36\x37\x2e\x38\x30\x31\x2c\x36\x37\x2e\x38\x30\x31\x2c\ 526 | \x31\x35\x2e\x30\x30\x31\x2c\x31\x33\x32\x2e\x37\x30\x32\x2c\x31\ 527 | \x35\x2e\x30\x30\x31\x73\x31\x31\x37\x2e\x37\x30\x32\x2c\x35\x32\ 528 | \x2e\x38\x2c\x31\x31\x37\x2e\x37\x30\x32\x2c\x31\x31\x37\x2e\x37\ 529 | \x30\x31\x0d\x0a\x09\x09\x43\x32\x35\x30\x2e\x34\x30\x34\x2c\x31\ 530 | \x39\x37\x2e\x36\x30\x33\x2c\x31\x39\x37\x2e\x36\x30\x34\x2c\x32\ 531 | \x35\x30\x2e\x34\x30\x34\x2c\x31\x33\x32\x2e\x37\x30\x32\x2c\x32\ 532 | \x35\x30\x2e\x34\x30\x34\x7a\x22\x2f\x3e\x0d\x0a\x3c\x2f\x67\x3e\ 533 | \x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\ 534 | \x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\ 535 | \x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\ 536 | \x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\ 537 | \x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\ 538 | \x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\ 539 | \x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\ 540 | \x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\ 541 | \x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\ 542 | \x0a\x3c\x67\x3e\x0d\x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x67\x3e\x0d\ 543 | \x0a\x3c\x2f\x67\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\x0d\x0a\ 544 | " 545 | 546 | qt_resource_name = b"\ 547 | \x00\x05\ 548 | \x00\x6f\xa6\x53\ 549 | \x00\x69\ 550 | \x00\x63\x00\x6f\x00\x6e\x00\x73\ 551 | \x00\x08\ 552 | \x05\xe2\x59\x27\ 553 | \x00\x6c\ 554 | \x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ 555 | \x00\x09\ 556 | \x06\x97\x98\x67\ 557 | \x00\x61\ 558 | \x00\x62\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ 559 | \x00\x0c\ 560 | \x08\x1a\x90\xa7\ 561 | \x00\x64\ 562 | \x00\x6f\x00\x77\x00\x6e\x00\x6c\x00\x6f\x00\x61\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ 563 | \x00\x28\ 564 | \x0e\xb8\xc9\x87\ 565 | \x00\x61\ 566 | \x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2d\x00\x75\x00\x6e\x00\x61\x00\x76\x00\x61\x00\x69\x00\x6c\x00\x61\x00\x62\x00\x6c\ 567 | \x00\x65\x00\x2d\x00\x73\x00\x79\x00\x6d\x00\x62\x00\x6f\x00\x6c\x00\x69\x00\x63\x00\x2e\x00\x73\x00\x79\x00\x6d\x00\x62\x00\x6f\ 568 | \x00\x6c\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\ 569 | \x00\x08\ 570 | \x02\x8c\x54\x27\ 571 | \x00\x70\ 572 | \x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x73\x00\x76\x00\x67\ 573 | " 574 | 575 | qt_resource_struct = b"\ 576 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 577 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x05\x00\x00\x00\x02\ 578 | \x00\x00\x00\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x17\ 579 | \x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 580 | \x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x11\x9e\ 581 | \x00\x00\x00\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x12\xcb\ 582 | \x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x18\xaf\ 583 | " 584 | 585 | def qInitResources(): 586 | QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) 587 | 588 | def qCleanupResources(): 589 | QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) 590 | 591 | qInitResources() 592 | -------------------------------------------------------------------------------- /phscanner/interfaces/main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '/home/egx/git/phs/qt-resources/main.ui' 4 | # 5 | # Created by: PyQt4 UI code generator 4.11.4 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt4 import QtCore, QtGui 10 | 11 | try: 12 | _fromUtf8 = QtCore.QString.fromUtf8 13 | except AttributeError: 14 | def _fromUtf8(s): 15 | return s 16 | 17 | try: 18 | _encoding = QtGui.QApplication.UnicodeUTF8 19 | def _translate(context, text, disambig): 20 | return QtGui.QApplication.translate(context, text, disambig, _encoding) 21 | except AttributeError: 22 | def _translate(context, text, disambig): 23 | return QtGui.QApplication.translate(context, text, disambig) 24 | 25 | class Ui_MainWindow(object): 26 | def setupUi(self, MainWindow): 27 | MainWindow.setObjectName(_fromUtf8("MainWindow")) 28 | MainWindow.resize(786, 500) 29 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Preferred) 30 | sizePolicy.setHorizontalStretch(0) 31 | sizePolicy.setVerticalStretch(0) 32 | sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) 33 | MainWindow.setSizePolicy(sizePolicy) 34 | MainWindow.setMinimumSize(QtCore.QSize(0, 30)) 35 | self.centralwidget = QtGui.QWidget(MainWindow) 36 | self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 37 | self.gridLayout = QtGui.QGridLayout(self.centralwidget) 38 | self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 39 | self.horizontalLayout = QtGui.QHBoxLayout() 40 | self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 41 | self.label_2 = QtGui.QLabel(self.centralwidget) 42 | self.label_2.setObjectName(_fromUtf8("label_2")) 43 | self.horizontalLayout.addWidget(self.label_2) 44 | spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) 45 | self.horizontalLayout.addItem(spacerItem) 46 | self.pageLabel = QtGui.QLabel(self.centralwidget) 47 | self.pageLabel.setObjectName(_fromUtf8("pageLabel")) 48 | self.horizontalLayout.addWidget(self.pageLabel) 49 | self.pageBox = QtGui.QSpinBox(self.centralwidget) 50 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) 51 | sizePolicy.setHorizontalStretch(0) 52 | sizePolicy.setVerticalStretch(0) 53 | sizePolicy.setHeightForWidth(self.pageBox.sizePolicy().hasHeightForWidth()) 54 | self.pageBox.setSizePolicy(sizePolicy) 55 | self.pageBox.setMinimumSize(QtCore.QSize(115, 30)) 56 | self.pageBox.setMaximumSize(QtCore.QSize(16777215, 30)) 57 | font = QtGui.QFont() 58 | font.setPointSize(8) 59 | self.pageBox.setFont(font) 60 | self.pageBox.setMinimum(1) 61 | self.pageBox.setMaximum(1000) 62 | self.pageBox.setObjectName(_fromUtf8("pageBox")) 63 | self.horizontalLayout.addWidget(self.pageBox) 64 | self.scanButton = QtGui.QPushButton(self.centralwidget) 65 | self.scanButton.setMinimumSize(QtCore.QSize(0, 30)) 66 | self.scanButton.setAutoDefault(True) 67 | self.scanButton.setDefault(True) 68 | self.scanButton.setObjectName(_fromUtf8("scanButton")) 69 | self.horizontalLayout.addWidget(self.scanButton) 70 | self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) 71 | self.horizontalLayout_2 = QtGui.QHBoxLayout() 72 | self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) 73 | self.playButton = QtGui.QPushButton(self.centralwidget) 74 | self.playButton.setEnabled(False) 75 | icon = QtGui.QIcon() 76 | icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/play.svg")), QtGui.QIcon.Normal, QtGui.QIcon.Off) 77 | self.playButton.setIcon(icon) 78 | self.playButton.setObjectName(_fromUtf8("playButton")) 79 | self.horizontalLayout_2.addWidget(self.playButton) 80 | self.downloadButton = QtGui.QPushButton(self.centralwidget) 81 | self.downloadButton.setEnabled(False) 82 | icon1 = QtGui.QIcon() 83 | icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/icons/download.svg")), QtGui.QIcon.Normal, QtGui.QIcon.Off) 84 | self.downloadButton.setIcon(icon1) 85 | self.downloadButton.setObjectName(_fromUtf8("downloadButton")) 86 | self.horizontalLayout_2.addWidget(self.downloadButton) 87 | self.gridLayout.addLayout(self.horizontalLayout_2, 2, 0, 1, 1) 88 | self.videoList = QtGui.QListWidget(self.centralwidget) 89 | self.videoList.setMinimumSize(QtCore.QSize(256, 0)) 90 | self.videoList.setStyleSheet(_fromUtf8("QListView {\n" 91 | " show-decoration-selected: 1;\n" 92 | "}\n" 93 | "\n" 94 | "QListView::item {\n" 95 | " padding: 5px;\n" 96 | "}")) 97 | self.videoList.setAlternatingRowColors(True) 98 | self.videoList.setObjectName(_fromUtf8("videoList")) 99 | self.gridLayout.addWidget(self.videoList, 1, 0, 1, 1) 100 | MainWindow.setCentralWidget(self.centralwidget) 101 | self.statusbar = QtGui.QStatusBar(MainWindow) 102 | self.statusbar.setObjectName(_fromUtf8("statusbar")) 103 | MainWindow.setStatusBar(self.statusbar) 104 | self.actionPil = QtGui.QAction(MainWindow) 105 | self.actionPil.setObjectName(_fromUtf8("actionPil")) 106 | 107 | self.retranslateUi(MainWindow) 108 | QtCore.QObject.connect(self.scanButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.videoList.clear) 109 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 110 | 111 | def retranslateUi(self, MainWindow): 112 | MainWindow.setWindowTitle(_translate("MainWindow", "PornHubScanner", None)) 113 | self.label_2.setText(_translate("MainWindow", "

", None)) 114 | self.pageLabel.setText(_translate("MainWindow", "Page:", None)) 115 | self.scanButton.setText(_translate("MainWindow", "Scan", None)) 116 | self.playButton.setText(_translate("MainWindow", "Play", None)) 117 | self.downloadButton.setText(_translate("MainWindow", "Download", None)) 118 | self.actionPil.setText(_translate("MainWindow", "pil", None)) 119 | 120 | from . import icons_rc 121 | -------------------------------------------------------------------------------- /phscanner/interfaces/popup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '/home/egx/git/phs/qt-resources/error.ui' 4 | # 5 | # Created by: PyQt4 UI code generator 4.11.4 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt4 import QtCore, QtGui 10 | 11 | try: 12 | _fromUtf8 = QtCore.QString.fromUtf8 13 | except AttributeError: 14 | def _fromUtf8(s): 15 | return s 16 | 17 | try: 18 | _encoding = QtGui.QApplication.UnicodeUTF8 19 | def _translate(context, text, disambig): 20 | return QtGui.QApplication.translate(context, text, disambig, _encoding) 21 | except AttributeError: 22 | def _translate(context, text, disambig): 23 | return QtGui.QApplication.translate(context, text, disambig) 24 | 25 | class Ui_Dialog(object): 26 | def setupUi(self, Dialog): 27 | Dialog.setObjectName(_fromUtf8("Dialog")) 28 | Dialog.resize(300, 120) 29 | self.gridLayout = QtGui.QGridLayout(Dialog) 30 | self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 31 | self.stopLabel = QtGui.QLabel(Dialog) 32 | self.stopLabel.setText(_fromUtf8("")) 33 | self.stopLabel.setTextFormat(QtCore.Qt.RichText) 34 | self.stopLabel.setPixmap(QtGui.QPixmap(_fromUtf8(":/icons/action-unavailable-symbolic.symbolic.png"))) 35 | self.stopLabel.setScaledContents(False) 36 | self.stopLabel.setAlignment(QtCore.Qt.AlignCenter) 37 | self.stopLabel.setObjectName(_fromUtf8("stopLabel")) 38 | self.gridLayout.addWidget(self.stopLabel, 0, 0, 1, 1) 39 | self.errorLabel = QtGui.QLabel(Dialog) 40 | self.errorLabel.setAlignment(QtCore.Qt.AlignCenter) 41 | self.errorLabel.setObjectName(_fromUtf8("errorLabel")) 42 | self.gridLayout.addWidget(self.errorLabel, 1, 0, 1, 1) 43 | self.buttonBox = QtGui.QDialogButtonBox(Dialog) 44 | self.buttonBox.setMinimumSize(QtCore.QSize(0, 30)) 45 | self.buttonBox.setMaximumSize(QtCore.QSize(16777215, 30)) 46 | self.buttonBox.setStyleSheet(_fromUtf8("QDialogButtonBox {\n" 47 | "dialogbuttonbox-buttons-have-icons: 0;\n" 48 | "}")) 49 | self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 50 | self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) 51 | self.buttonBox.setCenterButtons(True) 52 | self.buttonBox.setObjectName(_fromUtf8("buttonBox")) 53 | self.gridLayout.addWidget(self.buttonBox, 2, 0, 1, 1) 54 | 55 | self.retranslateUi(Dialog) 56 | QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) 57 | QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) 58 | QtCore.QMetaObject.connectSlotsByName(Dialog) 59 | 60 | def retranslateUi(self, Dialog): 61 | Dialog.setWindowTitle(_translate("Dialog", "PornHubScanner - Error!", None)) 62 | self.errorLabel.setText(_translate("Dialog", "TextLabel", None)) 63 | 64 | from . import icons_rc 65 | -------------------------------------------------------------------------------- /phscanner/site.py: -------------------------------------------------------------------------------- 1 | """ 2 | This module contains a class for every supported site (only Pornhub for 3 | now). Each class contains the instructions and the correct values for 4 | retrieving the site informations, like the list of the titles contained 5 | in a page, the address of the page containing a video direct url, and 6 | the direct url itself. 7 | """ 8 | 9 | from bs4 import BeautifulSoup 10 | from urllib.parse import unquote 11 | from urllib.request import urlopen 12 | 13 | import re 14 | 15 | 16 | class PornHub(object): 17 | home = 'http://www.pornhub.com' 18 | path = '/video' 19 | query = 'page=' 20 | tags = 'a', {'class': 'img'} 21 | regex = r'var player[\w_]*\d{3}p = \\\'(http[://\.\w\?=&]*)' 22 | 23 | def __init__(self, page=1): 24 | self.page = page 25 | 26 | def get_page_url(self): 27 | url = ''.join( 28 | [PornHub.home, PornHub.path, '?', PornHub.query + str(self.page)] 29 | ) 30 | return url 31 | 32 | def get_body(self): 33 | with urlopen(self.get_page_url()) as html: 34 | sp = BeautifulSoup(html, 'html.parser') 35 | body = [ 36 | i for i in sp.find_all(*PornHub.tags) 37 | if i.has_attr('title') 38 | ] 39 | return body 40 | 41 | def get_catalogue(self): 42 | video_page_urls = {} 43 | for i in self.get_body(): 44 | video_page_urls[i.get('title')] = i.get('href') 45 | return video_page_urls 46 | 47 | def get_video_url(self, video_page_url): 48 | with urlopen(PornHub.home + video_page_url) as html: 49 | match = re.search(PornHub.regex, str(html.read()), re.IGNORECASE) 50 | video_url = unquote(re.sub('&', '', match.group(1))) 51 | return video_url 52 | -------------------------------------------------------------------------------- /qt-resources/downloader.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Download 4 | 5 | 6 | 7 | 0 8 | 0 9 | 480 10 | 70 11 | 12 | 13 | 14 | PornHubScanner - Downloader 15 | 16 | 17 | 18 | 19 | 20 | true 21 | 22 | 23 | 0 24 | 25 | 26 | 27 | 28 | 29 | 30 | true 31 | 32 | 33 | 34 | 35 35 | 27 36 | 37 | 38 | 39 | 40 | 16777215 41 | 27 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | :/icons/abort.png:/icons/abort.png 50 | 51 | 52 | true 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /qt-resources/icons.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | icons/play.svg 4 | icons/action-unavailable-symbolic.symbolic.png 5 | icons/download.svg 6 | icons/abort.png 7 | icons/logo.png 8 | 9 | 10 | -------------------------------------------------------------------------------- /qt-resources/icons/abort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vaginessa/pornhubscanner/92ca717e9b0ceaa09c6522aa5dd295736a4878cf/qt-resources/icons/abort.png -------------------------------------------------------------------------------- /qt-resources/icons/action-unavailable-symbolic.symbolic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vaginessa/pornhubscanner/92ca717e9b0ceaa09c6522aa5dd295736a4878cf/qt-resources/icons/action-unavailable-symbolic.symbolic.png -------------------------------------------------------------------------------- /qt-resources/icons/download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /qt-resources/icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vaginessa/pornhubscanner/92ca717e9b0ceaa09c6522aa5dd295736a4878cf/qt-resources/icons/logo.png -------------------------------------------------------------------------------- /qt-resources/icons/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /qt-resources/main.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 786 10 | 500 11 | 12 | 13 | 14 | 15 | 0 16 | 0 17 | 18 | 19 | 20 | 21 | 0 22 | 30 23 | 24 | 25 | 26 | PornHubScanner 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | <html><head/><body><p><img src=":/icons/logo.png"/></p></body></html> 36 | 37 | 38 | 39 | 40 | 41 | 42 | Qt::Horizontal 43 | 44 | 45 | 46 | 40 47 | 20 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | Page: 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 0 64 | 0 65 | 66 | 67 | 68 | 69 | 115 70 | 30 71 | 72 | 73 | 74 | 75 | 16777215 76 | 30 77 | 78 | 79 | 80 | 81 | 8 82 | 83 | 84 | 85 | 1 86 | 87 | 88 | 1000 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 0 97 | 30 98 | 99 | 100 | 101 | Scan 102 | 103 | 104 | true 105 | 106 | 107 | true 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | false 119 | 120 | 121 | Play 122 | 123 | 124 | 125 | :/icons/play.svg:/icons/play.svg 126 | 127 | 128 | 129 | 130 | 131 | 132 | false 133 | 134 | 135 | Download 136 | 137 | 138 | 139 | :/icons/download.svg:/icons/download.svg 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 256 150 | 0 151 | 152 | 153 | 154 | QListView { 155 | show-decoration-selected: 1; 156 | } 157 | 158 | QListView::item { 159 | padding: 5px; 160 | } 161 | 162 | 163 | true 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | pil 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | scanButton 182 | clicked() 183 | videoList 184 | clear() 185 | 186 | 187 | 775 188 | 49 189 | 190 | 191 | 496 192 | 397 193 | 194 | 195 | 196 | 197 | 198 | -------------------------------------------------------------------------------- /qt-resources/popup.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 300 10 | 120 11 | 12 | 13 | 14 | PornHubScanner - Error! 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Qt::RichText 24 | 25 | 26 | :/icons/action-unavailable-symbolic.symbolic.png 27 | 28 | 29 | false 30 | 31 | 32 | Qt::AlignCenter 33 | 34 | 35 | 36 | 37 | 38 | 39 | TextLabel 40 | 41 | 42 | Qt::AlignCenter 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 0 51 | 30 52 | 53 | 54 | 55 | 56 | 16777215 57 | 30 58 | 59 | 60 | 61 | QDialogButtonBox { 62 | dialogbuttonbox-buttons-have-icons: 0; 63 | } 64 | 65 | 66 | Qt::Horizontal 67 | 68 | 69 | QDialogButtonBox::Ok 70 | 71 | 72 | true 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | buttonBox 84 | accepted() 85 | Dialog 86 | accept() 87 | 88 | 89 | 248 90 | 254 91 | 92 | 93 | 157 94 | 274 95 | 96 | 97 | 98 | 99 | buttonBox 100 | rejected() 101 | Dialog 102 | reject() 103 | 104 | 105 | 316 106 | 260 107 | 108 | 109 | 286 110 | 274 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from setuptools import setup 4 | 5 | setup( 6 | name='phs', 7 | version='1.0', 8 | description='Watch stuff safely', 9 | url='https://github.com/egdoc/phs', 10 | author='Egidio Docile', 11 | author_email='egidio.docile@gmail.com', 12 | license='GPL2', 13 | packages=['phscanner'], 14 | scripts=['bin/phs'], 15 | install_requires=['BeautifulSoup4'] 16 | ) 17 | --------------------------------------------------------------------------------