diff --git a/.gitignore b/.gitignore
index 5b4b6e9..258a432 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,4 +128,5 @@ tmp
.project
.pydevproject
.README.md.html
-README.md.html
\ No newline at end of file
+README.md.html
+shape_predictor_68_face_landmarks.dat
\ No newline at end of file
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
index ff2f474..262f325 100644
--- a/.settings/org.eclipse.core.resources.prefs
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -1,4 +1,20 @@
eclipse.preferences.version=1
+encoding//Demo/EmbedWindow.py=utf-8
+encoding//Demo/FacePoints.py=utf-8
+encoding//Demo/FollowWindow.py=utf-8
+encoding//Demo/FramelessWindow.py=utf-8
+encoding//Demo/Lib/Application.py=utf-8
+encoding//Demo/NativeEvent.py=utf-8
+encoding//Demo/Notification.py=utf-8
+encoding//Demo/ProbeWindow.py=utf-8
+encoding//Demo/RestartWindow.py=utf-8
+encoding//Demo/SharedMemory.py=utf-8
+encoding//Demo/SingleApplication.py=utf-8
+encoding//Demo/VerificationCode.py=utf-8
+encoding//Demo/WeltHideWindow.py=utf-8
+encoding//Demo/WindowNotify.py=utf-8
+encoding//QFont/AwesomeFont.py=utf-8
+encoding//QFont/Lib/FontAwesome.py=utf-8
encoding//QListView/CustomWidgetSortItem.py=utf-8
encoding//QListView/SortItemByRole.py=utf-8
encoding//QMessageBox/CustomColorIcon.py=utf-8
@@ -22,3 +38,5 @@ encoding//QWebView/DreamTree.py=utf-8
encoding//QWidget/Lib/CustomPaintWidget.py=utf-8
encoding//QWidget/Lib/CustomWidget.py=utf-8
encoding//QWidget/WidgetStyle.py=utf-8
+encoding//Test/\u5168\u5C40\u70ED\u952E/HotKey.py=utf-8
+encoding//Test/\u81EA\u52A8\u66F4\u65B0/test.py=utf-8
diff --git a/Demo/程序重启/AutoRestart.py b/Demo/AutoRestart.py
similarity index 100%
rename from Demo/程序重启/AutoRestart.py
rename to Demo/AutoRestart.py
diff --git a/Demo/消息提示/BubbleTips.py b/Demo/BubbleTips.py
similarity index 100%
rename from Demo/消息提示/BubbleTips.py
rename to Demo/BubbleTips.py
diff --git a/Demo/自定义属性测试/自定义属性测试.py b/Demo/CustomProperties.py
similarity index 100%
rename from Demo/自定义属性测试/自定义属性测试.py
rename to Demo/CustomProperties.py
diff --git a/Demo/Data/AutoRestart.exe b/Demo/Data/AutoRestart.exe
new file mode 100644
index 0000000..f633913
Binary files /dev/null and b/Demo/Data/AutoRestart.exe differ
diff --git a/Demo/无边框自定义标题栏窗口/Qt.ico b/Demo/Data/Qt.ico
similarity index 100%
rename from Demo/无边框自定义标题栏窗口/Qt.ico
rename to Demo/Data/Qt.ico
diff --git a/Demo/调用截图dll(只能用32位)/ScreenShot.dll b/Demo/Data/ScreenShot.dll
similarity index 100%
rename from Demo/调用截图dll(只能用32位)/ScreenShot.dll
rename to Demo/Data/ScreenShot.dll
diff --git a/Demo/验证码控件/itckrist.ttf b/Demo/Data/itckrist.ttf
similarity index 100%
rename from Demo/验证码控件/itckrist.ttf
rename to Demo/Data/itckrist.ttf
diff --git a/Demo/人脸描点检测/data/lbpcascades/lbpcascade_frontalface.xml b/Demo/Data/lbpcascades/lbpcascade_frontalface.xml
similarity index 100%
rename from Demo/人脸描点检测/data/lbpcascades/lbpcascade_frontalface.xml
rename to Demo/Data/lbpcascades/lbpcascade_frontalface.xml
diff --git a/Demo/右下角弹出框/notify.ui b/Demo/Data/notify.ui
similarity index 100%
rename from Demo/右下角弹出框/notify.ui
rename to Demo/Data/notify.ui
diff --git a/Demo/嵌入外部窗口.py b/Demo/EmbedWindow.py
similarity index 91%
rename from Demo/嵌入外部窗口.py
rename to Demo/EmbedWindow.py
index 574f9bf..c3360d7 100644
--- a/Demo/嵌入外部窗口.py
+++ b/Demo/EmbedWindow.py
@@ -1,3 +1,19 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Created on 2018年3月1日
+@author: Irony
+@site: https://pyqt5.com , https://github.com/892768447
+@email: 892768447@qq.com
+@file: EmbedWindow
+@description: 嵌入外部窗口
+"""
+
+__Author__ = 'By: Irony\nQQ: 892768447\nEmail: 892768447@qq.com'
+__Copyright__ = 'Copyright (c) 2018 Irony'
+__Version__ = 1.0
+
from PyQt5.QtGui import QWindow
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QListWidget,\
QLabel
diff --git a/Demo/人脸描点检测/OpencvWidget.py b/Demo/FacePoints.py
similarity index 59%
rename from Demo/人脸描点检测/OpencvWidget.py
rename to Demo/FacePoints.py
index 6b42225..7ebea2b 100644
--- a/Demo/人脸描点检测/OpencvWidget.py
+++ b/Demo/FacePoints.py
@@ -6,13 +6,17 @@ Created on 2018年1月29日
@author: Irony."[讽刺]
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
-@file: OpencvWidget
-@description:
+@file: FacePoints
+@description: 人脸特征点
'''
+from bz2 import BZ2Decompressor
+import cgitb
+import os
import sys
-from PyQt5.QtCore import QTimer
+from PyQt5.QtCore import QTimer, QUrl, QFile, QIODevice
from PyQt5.QtGui import QImage, QPixmap
+from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest
from PyQt5.QtWidgets import QLabel, QMessageBox, QApplication
import cv2 # @UnresolvedImport
import dlib
@@ -24,23 +28,66 @@ __Copyright__ = "Copyright (c) 2018 Irony.\"[讽刺]"
__Version__ = "Version 1.0"
DOWNSCALE = 4
+URL = 'http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2'
class OpencvWidget(QLabel):
def __init__(self, *args, **kwargs):
super(OpencvWidget, self).__init__(*args, **kwargs)
+ self.httpRequestAborted = False
self.fps = 24
self.resize(800, 600)
- self.setText("请稍候,正在初始化数据和摄像头。。。")
- def start(self):
+ if not os.path.exists("Data/shape_predictor_68_face_landmarks.dat"):
+ self.setText("正在下载数据文件。。。")
+ self.outFile = QFile(
+ "Data/shape_predictor_68_face_landmarks.dat.bz2")
+ if not self.outFile.open(QIODevice.WriteOnly):
+ QMessageBox.critical(self, '错误', '无法写入文件')
+ return
+ self.qnam = QNetworkAccessManager(self)
+ self._reply = self.qnam.get(QNetworkRequest(QUrl(URL)))
+ self._reply.finished.connect(self.httpFinished)
+ self._reply.readyRead.connect(self.httpReadyRead)
+ self._reply.downloadProgress.connect(self.updateDataReadProgress)
+ else:
+ self.startCapture()
+
+ def httpFinished(self):
+ self.outFile.close()
+ if self.httpRequestAborted or self._reply.error():
+ self.outFile.remove()
+ self._reply.deleteLater()
+ del self._reply
+ # 下载完成解压文件并加载摄像头
+ self.setText("正在解压数据。。。")
+ try:
+ bz = BZ2Decompressor()
+ data = bz.decompress(
+ open('Data/shape_predictor_68_face_landmarks.dat.bz2', 'rb').read())
+ open('Data/shape_predictor_68_face_landmarks.dat', 'wb').write(data)
+ except Exception as e:
+ self.setText('解压失败:' + str(e))
+ return
+ self.setText('正在开启摄像头。。。')
+ self.startCapture()
+
+ def httpReadyRead(self):
+ self.outFile.write(self._reply.readAll())
+ self.outFile.flush()
+
+ def updateDataReadProgress(self, bytesRead, totalBytes):
+ self.setText('已下载:{} %'.format(round(bytesRead / 64040097 * 100, 2)))
+
+ def startCapture(self):
+ self.setText("请稍候,正在初始化数据和摄像头。。。")
try:
# 检测相关
self.detector = dlib.get_frontal_face_detector()
self.predictor = dlib.shape_predictor(
- "data/shape_predictor_68_face_landmarks.dat")
- cascade_fn = "data/lbpcascades/lbpcascade_frontalface.xml"
+ "Data/shape_predictor_68_face_landmarks.dat")
+ cascade_fn = "Data/lbpcascades/lbpcascade_frontalface.xml"
self.cascade = cv2.CascadeClassifier(cascade_fn)
if not self.cascade:
return QMessageBox.critical(self, "错误", cascade_fn + " 无法找到")
@@ -54,6 +101,17 @@ class OpencvWidget(QLabel):
QMessageBox.critical(self, "错误", str(e))
def closeEvent(self, event):
+ if hasattr(self, "_reply") and self._reply:
+ self.httpRequestAborted = True
+ self._reply.abort()
+ try:
+ os.unlink("Data/shape_predictor_68_face_landmarks.dat.bz2")
+ except:
+ pass
+ try:
+ os.unlink("Data/shape_predictor_68_face_landmarks.dat")
+ except:
+ pass
if hasattr(self, "timer"):
self.timer.stop()
self.timer.deleteLater()
@@ -105,9 +163,8 @@ class OpencvWidget(QLabel):
if __name__ == "__main__":
+ sys.excepthook = cgitb.enable(1, None, 5, '')
app = QApplication(sys.argv)
w = OpencvWidget()
w.show()
- # 5秒后启动
- QTimer.singleShot(5000, w.start)
sys.exit(app.exec_())
diff --git a/Demo/外部窗口跟随.py b/Demo/FollowWindow.py
similarity index 98%
rename from Demo/外部窗口跟随.py
rename to Demo/FollowWindow.py
index 558495a..5e54287 100644
--- a/Demo/外部窗口跟随.py
+++ b/Demo/FollowWindow.py
@@ -7,7 +7,7 @@ Created on 2018年10月22日
@site: https://github.com/892768447
@email: 892768447@qq.com
@file: FollowWindow
-@description:
+@description: 跟随外部窗口
"""
import os
diff --git a/Demo/无边框自定义标题栏窗口/无边框自定义标题栏窗口.py b/Demo/FramelessWindow.py
similarity index 93%
rename from Demo/无边框自定义标题栏窗口/无边框自定义标题栏窗口.py
rename to Demo/FramelessWindow.py
index 97ca549..aef6c26 100644
--- a/Demo/无边框自定义标题栏窗口/无边框自定义标题栏窗口.py
+++ b/Demo/FramelessWindow.py
@@ -3,7 +3,7 @@
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QTextEdit
-from FramelessWindow import FramelessWindow # @UnresolvedImport
+from Lib.FramelessWindow import FramelessWindow # @UnresolvedImport
# Created on 2018年4月30日
@@ -68,7 +68,7 @@ if __name__ == '__main__':
app.setStyleSheet(StyleSheet)
w = FramelessWindow()
w.setWindowTitle('测试标题栏')
- w.setWindowIcon(QIcon('Qt.ico'))
+ w.setWindowIcon(QIcon('Data/Qt.ico'))
w.setWidget(MainWindow(w)) # 把自己的窗口添加进来
w.show()
sys.exit(app.exec_())
diff --git a/Demo/单实例应用/Application.py b/Demo/Lib/Application.py
similarity index 100%
rename from Demo/单实例应用/Application.py
rename to Demo/Lib/Application.py
diff --git a/Demo/无边框自定义标题栏窗口/FramelessWindow.py b/Demo/Lib/FramelessWindow.py
similarity index 100%
rename from Demo/无边框自定义标题栏窗口/FramelessWindow.py
rename to Demo/Lib/FramelessWindow.py
diff --git a/Demo/右下角弹出框/UiNotify.py b/Demo/Lib/UiNotify.py
similarity index 100%
rename from Demo/右下角弹出框/UiNotify.py
rename to Demo/Lib/UiNotify.py
diff --git a/Demo/自动更新/mylibs/__init__.py b/Demo/Lib/__init__.py
similarity index 100%
rename from Demo/自动更新/mylibs/__init__.py
rename to Demo/Lib/__init__.py
diff --git a/Demo/无边框自定义标题栏窗口/win无边框调整大小.py b/Demo/NativeEvent.py
similarity index 86%
rename from Demo/无边框自定义标题栏窗口/win无边框调整大小.py
rename to Demo/NativeEvent.py
index 018f22d..2ccf169 100644
--- a/Demo/无边框自定义标题栏窗口/win无边框调整大小.py
+++ b/Demo/NativeEvent.py
@@ -1,22 +1,24 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+"""Created on 2018年8月2日
+author: Irony
+site: https://pyqt5.com , https://github.com/892768447
+email: 892768447@qq.com
+file: win无边框调整大小
+description:
+"""
+
from ctypes.wintypes import POINT
import ctypes.wintypes
from PyQt5.QtCore import Qt
-from PyQt5.QtWidgets import QWidget
+from PyQt5.QtWidgets import QWidget, QPushButton
from PyQt5.QtWinExtras import QtWin
import win32api
import win32con
import win32gui
-# Created on 2018年8月2日
-# author: Irony
-# site: https://pyqt5.com , https://github.com/892768447
-# email: 892768447@qq.com
-# file: win无边框调整大小
-# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
@@ -64,6 +66,12 @@ class Window(QWidget):
retval, result = super(Window, self).nativeEvent(eventType, message)
if eventType == "windows_generic_MSG":
msg = ctypes.wintypes.MSG.from_address(message.__int__())
+ # 获取鼠标移动经过时的坐标
+ x = win32api.LOWORD(msg.lParam) - self.frameGeometry().x()
+ y = win32api.HIWORD(msg.lParam) - self.frameGeometry().y()
+ # 判断鼠标位置是否有其它控件
+ if self.childAt(x, y) != None:
+ return retval, result
if msg.message == win32con.WM_NCCALCSIZE:
# 拦截不显示顶部的系统自带的边框
return True, 0
@@ -77,9 +85,6 @@ class Window(QWidget):
# 修改放置点的x,y坐标为0,0
info.ptMaxPosition.x, info.ptMaxPosition.y = 0, 0
if msg.message == win32con.WM_NCHITTEST:
- # 获取鼠标移动经过时的坐标
- x = win32api.LOWORD(msg.lParam) - self.frameGeometry().x()
- y = win32api.HIWORD(msg.lParam) - self.frameGeometry().y()
w, h = self.width(), self.height()
lx = x < self.BorderWidth
rx = x > w - self.BorderWidth
@@ -119,5 +124,7 @@ if __name__ == '__main__':
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
w = Window()
+ btn = QPushButton('exit', w, clicked=app.quit)
+ btn.setGeometry(10, 10, 100, 40)
w.show()
sys.exit(app.exec_())
diff --git a/Demo/消息提示/Notification.py b/Demo/Notification.py
similarity index 100%
rename from Demo/消息提示/Notification.py
rename to Demo/Notification.py
diff --git a/Demo/简单探测窗口和放大截图.py b/Demo/ProbeWindow.py
similarity index 95%
rename from Demo/简单探测窗口和放大截图.py
rename to Demo/ProbeWindow.py
index 0510c40..7bc4b0b 100644
--- a/Demo/简单探测窗口和放大截图.py
+++ b/Demo/ProbeWindow.py
@@ -1,17 +1,20 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
+"""
+Created on 2018年6月8日
+author: Irony
+site: https://pyqt5.com , https://github.com/892768447
+email: 892768447@qq.com
+file: ProbeWindow
+description: 简单探测窗口和放大截图
+"""
+
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import QPainter, QPen, QCursor, QColor
from PyQt5.QtWidgets import QLabel, QWidget, QApplication
import win32gui
-# Created on 2018年6月8日
-# author: Irony
-# site: https://pyqt5.com , https://github.com/892768447
-# email: 892768447@qq.com
-# file: 简单探测窗口和放大截图
-# description:
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
diff --git a/Demo/QRC资源文件使用/README.md b/Demo/QRC资源文件使用/README.md
deleted file mode 100644
index 15f4a8e..0000000
--- a/Demo/QRC资源文件使用/README.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# 图片加载测试
-
-### [Python3.4.4 or Python3.5][PyQt5]
-
-### 分别通过2种情况加载图片文件和资源文件
-
-1. 通过pyrcc5转换res.qrc为res_rc.py文件,可以直接import加载
- - 转换命令pyrcc5 res.qrc -o res_rc.py
- - import res_rc
- - 此时可以通过QPixmap(":/images/head.jpg")来加载
-
-2. 通过rcc命令转成为二进制文件res.rcc
- - 转换命令cd tools
- - rcc.exe -binary ../res.qrc -o ../res.data
- - 通过QResource.registerResource("res.data")注册
- - 此时可以通过QPixmap(":/images/head.jpg")来加载
-
-3. 文本资源读取
-
-```
-def readText(path):
- file = QFile(path)
- if not file.open(QIODevice.ReadOnly):
- return ''
- stream = QTextStream(file)
- #下面这句设置编码根据文件的编码自行确定
- stream.setCodec(QTextCodec.codecForName('UTF-8'))
- data = stream.readAll()
- file.close()
- del stream
- return data
-```
-
-其它方式见https://github.com/892768447/PyQt/tree/master/%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD
\ No newline at end of file
diff --git a/Demo/QRC资源文件使用/images/head.jpg b/Demo/QRC资源文件使用/images/head.jpg
deleted file mode 100644
index 8d3e8a4..0000000
Binary files a/Demo/QRC资源文件使用/images/head.jpg and /dev/null differ
diff --git a/Demo/QRC资源文件使用/qrctest1.py b/Demo/QRC资源文件使用/qrctest1.py
deleted file mode 100644
index 0184001..0000000
--- a/Demo/QRC资源文件使用/qrctest1.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-'''
-Created on 2018年05月01日
-@author: Irony."[讽刺]
-@site: https://pyqt5.com , https://github.com/892768447
-@email: 892768447@qq.com
-@file: qrctest1
-@description:
-'''
-
-from PyQt5.QtGui import QPixmap
-from PyQt5.QtWidgets import QLabel
-
-import res_rc # @UnusedImport @UnresolvedImport
-
-
-__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
-__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
-__Version__ = "Version 1.0"
-
-
-class ImageView(QLabel):
-
- def __init__(self, *args, **kwargs):
- super(ImageView, self).__init__(*args, **kwargs)
- self.resize(800, 600)
-
- # 从资源文件res_rc.py中加载
- # 转换命令pyrcc5 res.qrc -o res_rc.py
- # 这种方式是从通过pyrcc5转换res.qrc为res_rc.py文件,可以直接import加载
- # 此时可以通过路径:/images/head.jpg来访问
- self.setPixmap(QPixmap(":/images/head.jpg"))
-
-
-if __name__ == "__main__":
- import sys
- from PyQt5.QtWidgets import QApplication
- app = QApplication(sys.argv)
- app.aboutToQuit.connect(res_rc.qCleanupResources) # 退出时要清理资源
- w = ImageView()
- w.show()
- sys.exit(app.exec_())
diff --git a/Demo/QRC资源文件使用/qrctest2.py b/Demo/QRC资源文件使用/qrctest2.py
deleted file mode 100644
index 1a8a635..0000000
--- a/Demo/QRC资源文件使用/qrctest2.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-'''
-Created on 2018年05月01日
-@author: Irony."[讽刺]
-@site: https://pyqt5.com , https://github.com/892768447
-@email: 892768447@qq.com
-@file: qrctest2
-@description:
-'''
-
-
-from PyQt5.QtCore import QResource
-from PyQt5.QtGui import QPixmap
-from PyQt5.QtWidgets import QLabel
-
-
-__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
-__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
-__Version__ = "Version 1.0"
-
-
-class ImageView(QLabel):
-
- def __init__(self, *args, **kwargs):
- super(ImageView, self).__init__(*args, **kwargs)
- self.resize(800, 600)
- self.setPixmap(QPixmap(":/images/head.jpg"))
-
-
-if __name__ == "__main__":
- import sys
- from PyQt5.QtWidgets import QApplication
- app = QApplication(sys.argv)
- # 从二进制资源文件res.data中加载
- # 转换命令cd tools
- # rcc.exe -binary ../res.qrc -o ../res.data
- # 此时需要注册
- QResource.registerResource("res.data")
- app.aboutToQuit.connect(lambda: QResource.unregisterResource("res.data"))
- w = ImageView()
- w.show()
- sys.exit(app.exec_())
diff --git a/Demo/QRC资源文件使用/res.data b/Demo/QRC资源文件使用/res.data
deleted file mode 100644
index 7d40c17..0000000
Binary files a/Demo/QRC资源文件使用/res.data and /dev/null differ
diff --git a/Demo/QRC资源文件使用/res.qrc b/Demo/QRC资源文件使用/res.qrc
deleted file mode 100644
index 291a836..0000000
--- a/Demo/QRC资源文件使用/res.qrc
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- images/head.jpg
- README.md
-
-
diff --git a/Demo/QRC资源文件使用/res_rc.py b/Demo/QRC资源文件使用/res_rc.py
deleted file mode 100644
index 15bb681..0000000
--- a/Demo/QRC资源文件使用/res_rc.py
+++ /dev/null
@@ -1,545 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Resource object code
-#
-# Created by: The Resource Compiler for PyQt5 (Qt v5.10.1)
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt5 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x04\x0e\
-\x23\
-\x20\xe5\x9b\xbe\xe7\x89\x87\xe5\x8a\xa0\xe8\xbd\xbd\xe6\xb5\x8b\
-\xe8\xaf\x95\x0d\x0a\x0d\x0a\x23\x23\x23\x20\x5b\x50\x79\x74\x68\
-\x6f\x6e\x33\x2e\x34\x2e\x34\x20\x6f\x72\x20\x50\x79\x74\x68\x6f\
-\x6e\x33\x2e\x35\x5d\x5b\x50\x79\x51\x74\x35\x5d\x0d\x0a\x0d\x0a\
-\x23\x23\x23\x20\xe5\x88\x86\xe5\x88\xab\xe9\x80\x9a\xe8\xbf\x87\
-\x32\xe7\xa7\x8d\xe6\x83\x85\xe5\x86\xb5\xe5\x8a\xa0\xe8\xbd\xbd\
-\xe5\x9b\xbe\xe7\x89\x87\xe6\x96\x87\xe4\xbb\xb6\xe5\x92\x8c\xe8\
-\xb5\x84\xe6\xba\x90\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x0d\x0a\x31\
-\x2e\x20\xe9\x80\x9a\xe8\xbf\x87\x70\x79\x72\x63\x63\x35\xe8\xbd\
-\xac\xe6\x8d\xa2\x72\x65\x73\x2e\x71\x72\x63\xe4\xb8\xba\x72\x65\
-\x73\x5f\x72\x63\x2e\x70\x79\xe6\x96\x87\xe4\xbb\xb6\xef\xbc\x8c\
-\xe5\x8f\xaf\xe4\xbb\xa5\xe7\x9b\xb4\xe6\x8e\xa5\x69\x6d\x70\x6f\
-\x72\x74\xe5\x8a\xa0\xe8\xbd\xbd\x0d\x0a\x20\x2d\x20\xe8\xbd\xac\
-\xe6\x8d\xa2\xe5\x91\xbd\xe4\xbb\xa4\x70\x79\x72\x63\x63\x35\x20\
-\x72\x65\x73\x2e\x71\x72\x63\x20\x2d\x6f\x20\x72\x65\x73\x5f\x72\
-\x63\x2e\x70\x79\x0d\x0a\x20\x2d\x20\x69\x6d\x70\x6f\x72\x74\x20\
-\x72\x65\x73\x5f\x72\x63\x0d\x0a\x20\x2d\x20\xe6\xad\xa4\xe6\x97\
-\xb6\xe5\x8f\xaf\xe4\xbb\xa5\xe9\x80\x9a\xe8\xbf\x87\x51\x50\x69\
-\x78\x6d\x61\x70\x28\x22\x3a\x2f\x69\x6d\x61\x67\x65\x73\x2f\x68\
-\x65\x61\x64\x2e\x6a\x70\x67\x22\x29\xe6\x9d\xa5\xe5\x8a\xa0\xe8\
-\xbd\xbd\x0d\x0a\x0d\x0a\x32\x2e\x20\xe9\x80\x9a\xe8\xbf\x87\x72\
-\x63\x63\xe5\x91\xbd\xe4\xbb\xa4\xe8\xbd\xac\xe6\x88\x90\xe4\xb8\
-\xba\xe4\xba\x8c\xe8\xbf\x9b\xe5\x88\xb6\xe6\x96\x87\xe4\xbb\xb6\
-\x72\x65\x73\x2e\x72\x63\x63\x0d\x0a\x20\x2d\x20\xe8\xbd\xac\xe6\
-\x8d\xa2\xe5\x91\xbd\xe4\xbb\xa4\x63\x64\x20\x74\x6f\x6f\x6c\x73\
-\x0d\x0a\x20\x2d\x20\x72\x63\x63\x2e\x65\x78\x65\x20\x2d\x62\x69\
-\x6e\x61\x72\x79\x20\x2e\x2e\x2f\x72\x65\x73\x2e\x71\x72\x63\x20\
-\x2d\x6f\x20\x2e\x2e\x2f\x72\x65\x73\x2e\x64\x61\x74\x61\x0d\x0a\
-\x20\x2d\x20\xe9\x80\x9a\xe8\xbf\x87\x51\x52\x65\x73\x6f\x75\x72\
-\x63\x65\x2e\x72\x65\x67\x69\x73\x74\x65\x72\x52\x65\x73\x6f\x75\
-\x72\x63\x65\x28\x22\x72\x65\x73\x2e\x64\x61\x74\x61\x22\x29\xe6\
-\xb3\xa8\xe5\x86\x8c\x0d\x0a\x20\x2d\x20\xe6\xad\xa4\xe6\x97\xb6\
-\xe5\x8f\xaf\xe4\xbb\xa5\xe9\x80\x9a\xe8\xbf\x87\x51\x50\x69\x78\
-\x6d\x61\x70\x28\x22\x3a\x2f\x69\x6d\x61\x67\x65\x73\x2f\x68\x65\
-\x61\x64\x2e\x6a\x70\x67\x22\x29\xe6\x9d\xa5\xe5\x8a\xa0\xe8\xbd\
-\xbd\x0d\x0a\x0d\x0a\x33\x2e\x20\xe6\x96\x87\xe6\x9c\xac\xe8\xb5\
-\x84\xe6\xba\x90\xe8\xaf\xbb\xe5\x8f\x96\x0d\x0a\x0d\x0a\x60\x60\
-\x60\x0d\x0a\x64\x65\x66\x20\x72\x65\x61\x64\x54\x65\x78\x74\x28\
-\x70\x61\x74\x68\x29\x3a\x0d\x0a\x20\x20\x20\x20\x66\x69\x6c\x65\
-\x20\x3d\x20\x51\x46\x69\x6c\x65\x28\x70\x61\x74\x68\x29\x0d\x0a\
-\x20\x20\x20\x20\x69\x66\x20\x6e\x6f\x74\x20\x66\x69\x6c\x65\x2e\
-\x6f\x70\x65\x6e\x28\x51\x49\x4f\x44\x65\x76\x69\x63\x65\x2e\x52\
-\x65\x61\x64\x4f\x6e\x6c\x79\x29\x3a\x0d\x0a\x20\x20\x20\x20\x20\
-\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x27\x27\x0d\x0a\x20\x20\
-\x20\x20\x73\x74\x72\x65\x61\x6d\x20\x3d\x20\x51\x54\x65\x78\x74\
-\x53\x74\x72\x65\x61\x6d\x28\x66\x69\x6c\x65\x29\x0d\x0a\x20\x20\
-\x20\x20\x23\xe4\xb8\x8b\xe9\x9d\xa2\xe8\xbf\x99\xe5\x8f\xa5\xe8\
-\xae\xbe\xe7\xbd\xae\xe7\xbc\x96\xe7\xa0\x81\xe6\xa0\xb9\xe6\x8d\
-\xae\xe6\x96\x87\xe4\xbb\xb6\xe7\x9a\x84\xe7\xbc\x96\xe7\xa0\x81\
-\xe8\x87\xaa\xe8\xa1\x8c\xe7\xa1\xae\xe5\xae\x9a\x0d\x0a\x20\x20\
-\x20\x20\x73\x74\x72\x65\x61\x6d\x2e\x73\x65\x74\x43\x6f\x64\x65\
-\x63\x28\x51\x54\x65\x78\x74\x43\x6f\x64\x65\x63\x2e\x63\x6f\x64\
-\x65\x63\x46\x6f\x72\x4e\x61\x6d\x65\x28\x27\x55\x54\x46\x2d\x38\
-\x27\x29\x29\x0d\x0a\x20\x20\x20\x20\x64\x61\x74\x61\x20\x3d\x20\
-\x73\x74\x72\x65\x61\x6d\x2e\x72\x65\x61\x64\x41\x6c\x6c\x28\x29\
-\x0d\x0a\x20\x20\x20\x20\x66\x69\x6c\x65\x2e\x63\x6c\x6f\x73\x65\
-\x28\x29\x0d\x0a\x20\x20\x20\x20\x64\x65\x6c\x20\x73\x74\x72\x65\
-\x61\x6d\x0d\x0a\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x64\
-\x61\x74\x61\x0d\x0a\x60\x60\x60\x0d\x0a\x0d\x0a\xe5\x85\xb6\xe5\
-\xae\x83\xe6\x96\xb9\xe5\xbc\x8f\xe8\xa7\x81\x68\x74\x74\x70\x73\
-\x3a\x2f\x2f\x67\x69\x74\x68\x75\x62\x2e\x63\x6f\x6d\x2f\x38\x39\
-\x32\x37\x36\x38\x34\x34\x37\x2f\x50\x79\x51\x74\x2f\x74\x72\x65\
-\x65\x2f\x6d\x61\x73\x74\x65\x72\x2f\x25\x45\x35\x25\x39\x42\x25\
-\x42\x45\x25\x45\x37\x25\x38\x39\x25\x38\x37\x25\x45\x35\x25\x38\
-\x41\x25\x41\x30\x25\x45\x38\x25\x42\x44\x25\x42\x44\
-\x00\x00\x19\xf0\
-\xff\
-\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x78\x00\
-\x78\x00\x00\xff\xe1\x00\x3a\x45\x78\x69\x66\x00\x00\x4d\x4d\x00\
-\x2a\x00\x00\x00\x08\x00\x03\x51\x10\x00\x01\x00\x00\x00\x01\x01\
-\x00\x00\x00\x51\x11\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x51\
-\x12\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\
-\xdb\x00\x43\x00\x02\x01\x01\x02\x01\x01\x02\x02\x02\x02\x02\x02\
-\x02\x02\x03\x05\x03\x03\x03\x03\x03\x06\x04\x04\x03\x05\x07\x06\
-\x07\x07\x07\x06\x07\x07\x08\x09\x0b\x09\x08\x08\x0a\x08\x07\x07\
-\x0a\x0d\x0a\x0a\x0b\x0c\x0c\x0c\x0c\x07\x09\x0e\x0f\x0d\x0c\x0e\
-\x0b\x0c\x0c\x0c\xff\xdb\x00\x43\x01\x02\x02\x02\x03\x03\x03\x06\
-\x03\x03\x06\x0c\x08\x07\x08\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
-\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
-\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
-\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\x78\
-\x00\x78\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\
-\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\
-\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\xff\xc4\x00\
-\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\
-\x01\x7d\x01\x02\x03\x00\x04\x11\x05\x12\x21\x31\x41\x06\x13\x51\
-\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23\x42\xb1\xc1\x15\x52\
-\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17\x18\x19\x1a\x25\x26\
-\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\
-\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\
-\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x83\x84\x85\x86\x87\
-\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\
-\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\
-\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\
-\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\
-\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\
-\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\
-\x07\x08\x09\x0a\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\
-\x03\x04\x07\x05\x04\x04\x00\x01\x02\x77\x00\x01\x02\x03\x11\x04\
-\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81\x08\x14\
-\x42\x91\xa1\xb1\xc1\x09\x23\x33\x52\xf0\x15\x62\x72\xd1\x0a\x16\
-\x24\x34\xe1\x25\xf1\x17\x18\x19\x1a\x26\x27\x28\x29\x2a\x35\x36\
-\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\
-\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\
-\x77\x78\x79\x7a\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\
-\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\
-\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\
-\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\
-\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\
-\x03\x01\x00\x02\x11\x03\x11\x00\x3f\x00\xfd\xfc\xa2\xbc\x87\xf6\
-\xf5\xf8\xc3\xe2\xef\x80\x1f\xb1\xff\x00\x8f\x3c\x65\xe0\x5d\x36\
-\xcf\x53\xf1\x3f\x87\xb4\xef\xb5\xda\xa5\xdd\xb4\xb7\x50\x5b\xa0\
-\x74\x13\x5c\xc9\x0c\x4c\xb2\x4c\xb0\x42\x64\x98\xc6\x8c\x19\xc4\
-\x5b\x41\x04\x8a\xf0\x6f\x1f\x7f\xc1\x4c\xbe\x20\x7e\xc7\xdf\x04\
-\x34\xef\x88\x9f\x1a\x3e\x1e\x68\x3e\x22\xf8\x67\x34\x30\xdd\x5c\
-\xf8\xf7\xe1\xae\xb0\x6f\xb4\xf8\x2d\xa7\x09\xe4\x5d\x49\x63\x74\
-\xb1\xcf\x1c\x72\x17\x5e\x52\x49\x80\x2c\xa3\x71\xc8\xc8\x07\xda\
-\xf4\x57\x8e\x7e\xca\xdf\xf0\x50\x4f\x82\xff\x00\xb6\xbf\x83\xe1\
-\xd6\xbe\x18\xfc\x47\xf0\xb7\x8a\xad\xe4\x00\xbd\xbd\xbd\xea\xa5\
-\xed\xa9\x3f\xc3\x2d\xbb\xe2\x58\xdb\xd9\x94\x67\xb6\x6b\xd8\xe8\
-\x00\xa2\xbe\x49\xff\x00\x82\x80\x7f\xc1\x6e\xff\x00\x67\x5f\xf8\
-\x26\xfc\x37\x16\x7e\x3c\xf1\xc5\xad\xf7\x8a\xa1\x52\x57\xc3\x1a\
-\x16\xdd\x43\x56\x27\x9e\x1e\x35\x60\xb0\xfd\x66\x64\xf6\xcd\x7c\
-\x51\xf1\x37\xfe\x0f\x47\xfd\x9f\x7c\x3a\x92\x7f\xc2\x2b\xf0\xff\
-\x00\xe2\x47\x89\xda\x34\x8d\x81\xb8\x5b\x6d\x35\x19\x9b\xef\x28\
-\xcc\x8e\xdf\x2f\xae\xdc\x1e\xd4\x01\xfb\x1b\x45\x7f\x3b\x7f\x19\
-\xff\x00\xe0\xf7\x3f\x19\x5d\xeb\x93\x2f\xc3\xef\x82\xde\x18\xd3\
-\xb4\xd5\x38\x8a\x4d\x7b\x52\x9e\xf6\x77\x1e\xac\xb0\xf9\x2a\xa7\
-\xd8\x16\xfa\xd7\x07\xa3\xff\x00\xc1\xec\x3f\x1f\x6d\x2e\xc3\x5e\
-\xfc\x2e\xf8\x4b\x79\x06\x79\x48\xe3\xbf\x85\xb1\xec\xdf\x68\x61\
-\xfa\x50\x07\xf4\xc1\x58\x3f\x14\x7c\x7f\x67\xf0\xab\xe1\xbe\xbd\
-\xe2\x6b\xf0\xcd\x67\xa0\xd8\x4d\x7f\x2a\xa9\xf9\xa4\x11\xa1\x6d\
-\xa3\xfd\xa6\xc6\x07\xb9\x15\xf8\x63\xf0\x37\xfe\x0f\x74\xd3\xef\
-\xee\xa3\x87\xe2\x27\xc0\xd9\xac\xe3\x66\x02\x4b\x9d\x03\x5f\x12\
-\x32\x8e\xe4\x45\x3c\x4a\x0f\xd0\xca\x2b\xf4\x53\xe1\xc7\xfc\x15\
-\x07\xe0\xbf\xfc\x15\x1b\xe0\x8f\x86\xed\x7e\x18\xf8\x9a\x3b\xfb\
-\x8f\x11\x78\x97\x4a\xb4\xd5\x34\x0b\xf4\xfb\x26\xaf\x61\x6e\x97\
-\x2b\x73\x2f\x9b\x6e\xc7\x26\x36\x8e\xdd\xd7\xcc\x42\xf1\x90\xd8\
-\x0c\x7a\x50\x07\x5d\xf0\x87\xf6\xd1\xf1\x27\xc2\xcf\xda\x83\x41\
-\xf8\x33\xf1\xc3\xfb\x3a\xc7\xc4\x5f\x11\x34\x81\xae\xf8\x27\x5c\
-\xb6\x87\xec\xd6\x3a\xbc\xca\xa1\xaf\xb4\x56\x19\x21\x6e\xed\x09\
-\x0c\x87\x3f\xbe\x85\x95\xb8\x75\x60\x7e\xaa\xaf\x8b\x3f\xe0\xe0\
-\x0f\xd9\xbe\xf3\xf6\x82\xff\x00\x82\x63\xf8\xea\xff\x00\x41\x4b\
-\x98\xfc\x69\xf0\xc7\xc9\xf1\xdf\x86\xef\x2c\xdc\xc5\x79\x65\x75\
-\xa7\x38\x9d\xde\x09\x17\xe6\x49\x0c\x02\x65\x05\x79\xc9\x15\xc3\
-\x7f\xc1\xbd\xff\x00\xf0\x59\xbb\x5f\xf8\x2a\x7f\xec\xfb\x7d\xa3\
-\x78\x9a\xea\xc9\x7e\x2d\x7c\x3d\x58\xa0\xd6\x96\x30\x21\xfe\xdc\
-\xb5\x60\x04\x5a\x94\x71\x7f\x06\xe3\x94\x95\x57\x2a\x92\x0c\x8c\
-\x2c\x88\x28\x03\xf4\x32\x8a\x28\xa0\x02\x8a\x28\xa0\x06\x5c\x5b\
-\xc7\x79\x6f\x24\x33\x46\xb2\x45\x2a\x94\x74\x61\x95\x75\x3c\x10\
-\x47\xa1\xaf\x92\x7f\xe0\x99\x1f\x0f\x74\x2f\x8c\x5f\xf0\x4b\xcd\
-\x33\xe1\xbf\x8b\xf4\xcb\x4d\x7f\x41\xd3\x64\xd7\x7c\x0d\xaa\x69\
-\x97\xa9\xe6\x45\x2d\xb5\x9e\xa9\x79\x64\x20\x60\x7b\x08\x62\x40\
-\x31\xd3\x00\x8c\x60\x57\xd7\x35\xf2\x7f\xc0\x2b\xc9\x3f\x63\xcf\
-\xdb\x87\xc7\x9f\x0c\xf5\x80\x6d\xfc\x23\xf1\xa3\x55\xb8\xf1\xd7\
-\x81\x6f\xdb\x88\x4e\xa5\x24\x6a\x75\x7d\x24\xb7\x41\x2f\x98\x9f\
-\x6c\x8d\x7f\x8d\x27\x9f\x19\xf2\x9a\x80\x3f\x9f\xcf\xf8\x2c\xe7\
-\xfc\x10\x8b\xe2\x67\xfc\x11\xe7\xe2\x95\xd7\xc5\x4f\x84\x7a\x86\
-\xbd\xa9\x7c\x20\x6b\x8f\x36\xcf\x59\xb3\x99\x86\xa1\xe1\x62\xef\
-\x81\x6d\x78\x57\xac\x7b\x88\x55\x9b\xee\xb8\x20\x30\x0d\xc1\xf2\
-\x0f\x08\x7f\xc1\xc3\xdf\xb4\xce\x91\xfb\x3d\x6b\x1f\x0e\xb5\x2f\
-\x88\xfe\x20\xbc\xd1\xef\x97\x6d\xb4\xb6\xaf\x1d\x9d\xf4\x00\xae\
-\xd6\x8b\xed\x4a\xbe\x6a\xc2\x7a\x94\x8c\xa9\x27\x20\x32\x82\x6b\
-\xee\x6f\xf8\x3b\x97\xfe\x0b\x01\x75\xe3\x7f\x88\xb2\x7e\xcb\xfe\
-\x03\xd4\xb6\x68\x3e\x1d\x68\xee\x7c\x6d\x73\x03\x7f\xc7\xf5\xef\
-\x0f\x15\x96\x7f\xbb\x08\xda\xee\x3f\xe7\xa1\x00\xf2\x95\xf8\x5f\
-\x40\x16\x35\x6d\x5a\xe7\x5d\xd4\xa7\xbc\xbc\x9a\x5b\x8b\xab\xa9\
-\x1a\x59\x65\x91\x8b\x34\x8e\xc7\x25\x89\x3c\x92\x7d\x4d\x57\xa2\
-\x8a\x00\x28\xa2\x8a\x00\x2b\xf4\x47\xfe\x0d\x7e\xf8\xdd\xa4\x7c\
-\x2d\xff\x00\x82\xbe\xfc\x35\xb7\xf1\x46\xa8\x2c\xf4\x8d\x59\x2f\
-\xb4\xeb\x2f\xb4\x49\x88\x63\xbe\x9a\xd6\x44\x83\xaf\x00\xb3\x31\
-\x41\xd0\x65\xc7\xb5\x7e\x77\x55\xef\x0d\x78\x8e\xf7\xc1\xfe\x22\
-\xb0\xd5\xb4\xdb\x89\x2d\x35\x0d\x2e\xe2\x3b\xbb\x59\xe3\x38\x68\
-\x65\x46\x0c\xac\x3d\xc3\x00\x68\x03\xfb\xe1\xd5\x34\xdb\x1f\x18\
-\x78\x72\xe2\xce\xe1\x61\xbd\xd3\x75\x4b\x66\x86\x55\xc8\x68\xe7\
-\x8a\x45\x20\x8f\x42\xac\xa7\xf1\x06\xbf\x8c\x4f\xd9\xe7\xf6\x8f\
-\xf1\x37\xfc\x11\x8f\xfe\x0a\xc7\x79\xe2\x2d\x0d\x6e\x1b\xfe\x15\
-\xaf\x8b\x2f\xf4\x4d\x4f\x4f\x0f\xb4\x6a\xda\x62\xdc\x3c\x33\xdb\
-\xb7\x6f\x9e\x21\x95\x27\x21\x5d\x51\xba\xa8\xaf\x70\xfd\x85\x3f\
-\xe0\xe5\xef\x8f\x5f\xb2\xcc\x27\x45\xd4\xf5\xcb\x7d\x5f\x43\x68\
-\xed\x2d\x2d\x5e\xea\xd4\xdc\x7f\x64\xda\xc1\x34\x92\x0b\x78\x60\
-\xde\x23\x58\xd9\x65\x74\x24\x28\x90\x05\x8f\x0d\x84\xda\x7c\x5f\
-\xfe\x0a\x91\xf1\xf3\xc0\x9f\xb7\x4f\xc6\xe3\xf1\x5f\xc2\xf7\xba\
-\x7e\x9f\xe2\x2f\x14\x41\x68\x3c\x41\x65\x24\x0b\x61\xe6\x5e\x6c\
-\x21\xa6\x75\xc0\x8f\xcc\x2a\x14\x4b\x24\x78\x8d\x99\x77\xe1\x0c\
-\x8c\x8a\x01\xfd\x8e\x7c\x1e\xf8\xb5\xa0\x7c\x7a\xf8\x53\xe1\xcf\
-\x1b\x78\x57\x50\x87\x56\xf0\xdf\x8a\xf4\xe8\x35\x5d\x36\xee\x23\
-\x95\x9e\x09\x90\x3a\x37\xb1\xc3\x0c\x83\xc8\x39\x07\x91\x5d\x25\
-\x7e\x1b\xff\x00\xc1\xa6\xdf\xf0\x54\x4d\x23\x48\xf8\x67\xa4\x7e\
-\xcb\x7e\x32\x76\xd2\xf5\xfb\x67\xbc\xbe\xf0\xb4\xb7\x53\xb3\x7d\
-\xb4\x3b\xb5\xc4\x96\xca\x49\xda\x32\xa5\xe4\x8c\x2e\x01\x0b\x20\
-\xe4\xed\x2d\xfb\x91\x40\x05\x14\x51\x40\x05\x7c\xc7\xff\x00\x05\
-\x87\xf8\xe7\xe0\xcf\xd9\x9b\xfe\x09\xe9\xf1\x03\xc7\xfe\x34\xd3\
-\xe1\xd4\xa1\xf0\xa5\xb4\x77\xda\x24\x26\x53\x0c\xeb\xac\x07\x0b\
-\x60\xf0\x4a\xa4\x3c\x72\xac\xec\x84\x3a\x10\xc1\x43\x76\xc8\x3f\
-\x4e\x57\xe1\xbf\xfc\x1e\xbb\xfb\x55\x2f\x86\xbe\x03\xfc\x2c\xf8\
-\x37\x6b\x20\x37\x1e\x28\xd4\xa5\xf1\x2e\xa0\x81\xb0\x52\x1b\x51\
-\xe5\x41\x9f\x50\xcf\x2c\xbf\x8c\x7e\xd4\x01\xfc\xf0\xf8\xfb\xc7\
-\x5a\xb7\xc5\x0f\x1c\x6b\x1e\x24\xd7\xaf\xae\x35\x4d\x73\x5e\xbd\
-\x9b\x50\xbf\xbc\x9d\xb7\x49\x73\x3c\xae\x5e\x47\x63\xea\x59\x89\
-\xfc\x6b\x26\x8a\xfd\x0c\xff\x00\x82\x00\x7f\xc1\x1c\x97\xfe\x0a\
-\x5f\xf1\xa7\x56\xf1\x67\x8e\x05\xc5\x8f\xc1\x5f\x86\x2a\x2f\xbc\
-\x45\x32\x13\x1b\xeb\x12\xaa\x99\x12\xc2\x37\xfe\x1d\xca\xa5\xa4\
-\x61\xca\xa0\xc0\xc3\x32\x9a\x00\xfc\xf3\xa2\xba\x2f\x8b\xbe\x28\
-\xb7\xf1\xb7\xc5\x4f\x11\xea\xf6\x76\x96\xba\x7d\x96\xa5\xa9\x5c\
-\x5c\x5b\x5a\xdb\x46\x23\x86\xda\x26\x91\x8a\x46\x8a\x38\x0a\xab\
-\x85\x03\xd0\x57\x3b\x40\x16\x34\xbd\x22\xef\x5b\xba\x30\x59\xda\
-\xdc\x5e\x4c\xb1\xbc\xc6\x38\x63\x32\x30\x44\x42\xee\xd8\x1c\xed\
-\x54\x56\x62\x7a\x00\xa4\x9e\x05\x57\xaf\xbb\xbf\xe0\xda\xbf\x87\
-\x31\xfc\x51\xff\x00\x82\xc8\xfc\x2a\xd2\xee\x6c\xe1\xbe\xd3\x5e\
-\x3d\x55\xb5\x0b\x79\xa3\xf3\x22\x9e\xd8\xe9\x97\x4b\x2a\x38\xe8\
-\x55\x95\x8a\x9c\xff\x00\x7a\xb8\x6f\xf8\x2d\x1f\xfc\x13\xff\x00\
-\x4b\xff\x00\x82\x79\xfe\xdc\x7e\x28\xf0\x9f\x85\x75\x9b\x3f\x10\
-\x78\x1a\xf2\xe5\xee\xf4\x3b\xab\x69\xbc\xef\xb1\xc6\xcc\x77\x59\
-\x4c\xc3\x8f\x3a\x06\xca\x11\xd4\x80\xad\xc6\x71\x40\x1f\x25\x51\
-\x45\x14\x00\x51\x45\x14\x01\xd5\x7c\x1d\xf8\xc7\xe2\x0f\x81\xff\
-\x00\x14\x3c\x37\xe2\xef\x0d\xea\x37\x1a\x7e\xbd\xe1\x3d\x46\x0d\
-\x53\x4c\xb9\x47\x39\xb6\x9e\x19\x04\x88\x47\xb6\xe0\x32\x3b\x8c\
-\x8e\xf5\xfd\xc1\x7e\xc5\x5f\xb4\xde\x97\xfb\x66\x7e\xc9\xbf\x0f\
-\xbe\x29\x68\xfb\x56\xcb\xc6\xda\x25\xbe\xa4\x62\x5f\xf9\x76\x99\
-\x97\x13\x43\xf5\x8e\x51\x22\x1f\x74\xaf\xe1\x51\x4e\x18\x57\xf5\
-\x01\xff\x00\x06\x71\x7e\xd2\x8f\xf1\x27\xf6\x06\xf1\x77\xc3\x9b\
-\xb9\xcc\x97\x5f\x0e\x3c\x42\x2e\x2d\x15\x9f\x25\x2c\xb5\x08\xfc\
-\xe5\x00\x7a\x0b\x88\xee\xbf\x3a\x00\xfd\x7b\xa2\x8a\x28\x00\xaf\
-\xe4\x5b\xfe\x0e\x87\xfd\xab\x47\xed\x37\xff\x00\x05\x65\xf1\xa5\
-\x9d\xac\x8d\x26\x97\xf0\xee\x38\xbc\x2f\x6a\x77\xee\x52\x61\x5d\
-\xd3\x15\xf6\xf3\x9e\x4a\xfe\xb2\xfe\x28\xf8\xc5\x7e\x1d\xfc\x33\
-\xf1\x17\x88\x1b\x69\x5d\x0f\x4c\xb9\xbf\x20\xf4\x3e\x54\x4c\xf8\
-\xff\x00\xc7\x6b\xf8\x79\xfd\xbb\x3c\x49\xff\x00\x09\x6f\xed\x8d\
-\xf1\x2b\x50\xf3\x1a\x66\xb9\xf1\x05\xdb\x33\xb1\xcb\x3b\x07\x20\
-\x93\xf5\x20\x9a\x00\xf3\x5f\x0c\x78\x6e\xfb\xc6\x5e\x24\xd3\xf4\
-\x8d\x36\xde\x5b\xcd\x47\x54\xb9\x8e\xd2\xd6\x08\xd7\x73\xcd\x2c\
-\x8c\x15\x14\x0e\xe4\xb1\x03\xf1\xaf\xeb\xeb\xf6\x64\xff\x00\x82\
-\x5b\x78\x4f\xf6\x15\xff\x00\x82\x5a\x58\xf8\x5e\xdf\x4f\x92\xf3\
-\xc7\x9e\x0b\xf0\x4e\xad\x79\x73\x3c\x37\xb3\x2a\x4b\xac\x5d\xd8\
-\xcb\xf6\x99\x0c\x48\xe2\x39\x1b\x27\xca\x47\x75\x2c\x12\x35\x00\
-\x8a\xfe\x57\x3f\x61\x4f\x88\xf6\x1f\x02\x3e\x3f\xe9\x7f\x11\xb5\
-\x38\x74\x8b\x9b\x7f\x01\x93\xaa\xdb\xc1\xa9\x43\x24\xf0\xdd\x5d\
-\xaf\x16\xf1\x88\xa3\x64\x69\x1b\xcc\x2a\xc1\x77\xa2\xfc\x84\xb3\
-\x00\x39\xf7\xfb\x0f\xf8\x38\x6b\xf6\x94\xf0\xb7\xc4\x4d\x67\x5e\
-\xf0\xe6\xbd\xe1\x3f\x0f\x7f\x6e\x42\xf6\x77\x50\x59\x78\x47\x4d\
-\x8d\x2e\x2d\x98\x9c\xc7\x21\xf2\x77\x37\xd4\xb6\x73\xde\x80\x3e\
-\x1e\xb9\x84\xdb\xdc\x49\x19\xeb\x1b\x15\x3f\x85\x32\xa6\xd4\x2e\
-\xda\xfe\xfe\x69\xdf\x6e\xf9\xa4\x69\x1b\x68\xc0\xc9\x39\xe0\x54\
-\x34\x01\xfb\x29\xff\x00\x06\x5e\xfe\xcf\x32\x78\xdb\xf6\xec\xf1\
-\xe7\xc4\x8b\x88\x5b\xfb\x3b\xe1\xff\x00\x85\xda\xd5\x27\x23\xe5\
-\x4b\xab\xd9\x02\x28\xcf\x6f\xdc\xc5\x71\x5f\xae\xdf\xf0\x56\xe9\
-\xff\x00\x66\x7f\xdb\x6b\xf6\x67\xd4\xbe\x15\xfc\x46\xd7\x22\x5b\
-\x5b\xe9\xc7\xf6\x57\x88\xac\x6d\xc3\x43\xe1\xdb\xf0\x76\xa5\xd4\
-\x77\x2e\x56\x16\x08\x49\x12\x22\x39\xca\x6f\x07\x1d\x47\x85\x7f\
-\xc1\x0d\x3f\xe0\x98\x7e\x3c\xfd\x9d\xbf\xe0\x91\xbe\x1d\xf0\xf6\
-\x9c\xf6\x3e\x11\xf1\x57\xc7\x8b\xa3\xe2\x4f\x18\x6b\x57\x96\xcb\
-\x71\x75\xa1\x69\x4f\x12\x8b\x6b\x78\x2d\xdf\xe5\x7b\x86\x80\x29\
-\x1e\x68\x29\x13\x4f\x29\x65\x72\xa1\x1b\xf0\x03\xfe\x0a\x81\xfb\
-\x4c\x69\xbf\x1b\xff\x00\x6b\x1f\x19\x47\xe1\x3f\xed\x01\xe1\x3d\
-\x1f\x50\x9b\x48\xd2\xee\x75\x0b\xd9\x2f\xaf\xf5\x0b\x68\x1c\xc6\
-\x2e\x26\x9e\x42\x58\xb4\xc5\x4c\x85\x53\x6a\x28\x65\x55\x55\x55\
-\x02\x80\x3c\xbb\xf6\xab\xfd\x9b\x75\x4f\xd9\x3b\xe3\x96\xb9\xe0\
-\x9d\x53\x54\xf0\xff\x00\x88\x1b\x49\x9c\xad\xb6\xad\xa1\x6a\x31\
-\x6a\x1a\x6e\xab\x01\xe6\x39\xe1\x9a\x36\x2a\x55\x97\x07\x07\x0c\
-\xa7\x20\x80\x41\x15\xe7\x55\x7d\x3c\x43\x33\x68\xc3\x4f\x99\x63\
-\x9a\xd5\x18\xbc\x41\x94\x6f\x85\x8f\x52\xad\xd4\x03\x8e\x47\x43\
-\xe9\x9e\x6b\xd1\xfe\x32\xfe\xc5\x3f\x12\xfe\x05\xfc\x27\xf0\x4f\
-\x8f\xb5\xff\x00\x09\xea\xf6\xbe\x07\xf8\x89\xa7\xae\xa5\xa0\x6b\
-\x62\x02\xf6\x77\x88\x49\x05\x0c\x83\x84\x91\x4a\x9c\xa3\x60\x91\
-\x86\x00\xa9\x06\x80\x3c\xa6\x8a\x28\xa0\x02\xbf\x6c\xff\x00\xe0\
-\xcb\x5f\x89\xb3\x69\x3f\xb6\x5f\xc4\x0f\x0c\x33\xb0\xb7\xd7\xbc\
-\x12\x6e\x0a\xe7\xe5\x69\x2d\x2f\xa3\xd8\x71\xea\x12\xe6\x41\xf8\
-\xd7\xe2\x65\x7e\xb7\x7f\xc1\xa0\x1e\x26\xb5\xd0\x7f\xe0\xa5\x9a\
-\x7c\x12\x17\xfb\x56\xb5\xa1\x6b\x5a\x6c\x63\xf8\x71\xe5\x5a\xdc\
-\x8f\xfd\x27\x7f\xce\x80\x3f\xa8\xea\x28\xa2\x80\x3c\xbf\xf6\xcf\
-\x2f\x27\xec\xc3\xe2\xeb\x78\xdb\x6b\x5f\xdb\x25\x89\x27\xd2\x79\
-\xa3\x84\xfe\x8e\x6b\xf8\x9c\xfd\xb2\x34\x1b\x8f\x0c\x7e\xd6\xff\
-\x00\x14\x34\xeb\xa4\x68\xe7\xb1\xf1\x66\xab\x6e\xea\x47\x2a\x52\
-\xf2\x55\x23\xf4\xaf\xee\x27\xe3\x6f\x80\x24\xf8\xa3\xf0\xab\x5a\
-\xd0\xa1\x99\x60\xb8\xbe\x80\x79\x12\x30\xf9\x52\x54\x61\x22\x13\
-\xed\xb9\x57\x3e\xd5\xfc\x93\xff\x00\xc1\xc5\xbf\xb2\x56\xa5\xfb\
-\x3e\xff\x00\xc1\x4f\xfe\x32\x6a\x1f\x63\x92\x2d\x1f\x5c\xf1\x02\
-\x6b\xd0\x36\xcc\x2f\x97\xa9\xc6\xd7\x4a\x47\xb7\x9c\xb7\x49\xec\
-\x63\x22\x80\x3e\x78\x87\xf6\x5b\xd6\x13\xfe\x09\xd9\x2f\xc6\x2f\
-\x29\xbf\xb1\x24\xf1\xbf\xfc\x23\x3e\x66\x38\xf3\x56\xd1\x66\xc7\
-\xe2\x1b\xff\x00\x1d\x35\x3f\xed\x57\xe0\xef\x80\xfe\x1f\xfd\x9e\
-\x7e\x06\x6a\x1f\x0a\x7c\x4d\xe2\x0d\x63\xe2\x06\xb1\xa1\x5c\xc9\
-\xf1\x27\x4f\xd4\x22\x65\x83\x48\xd4\x16\x65\x11\x2c\x04\xc6\xa0\
-\xab\x29\x93\x85\x67\x1b\x52\x32\x48\x66\x22\xbf\x63\x3f\xe0\xdd\
-\xff\x00\xd9\xb3\xc1\x5f\xf0\x54\x7f\xf8\x22\x57\xc6\x2f\xd9\xaf\
-\xc6\x30\xff\x00\x67\x9d\x1f\xc5\x11\xea\x76\xfa\x9d\xaa\x06\xb9\
-\xd3\xee\x2e\xad\xa3\x9a\xd6\xed\x73\xc1\x64\x78\x64\x52\x38\xdd\
-\x1e\xe5\x38\xc9\x35\xf2\xb7\x89\xff\x00\xe0\xce\x8f\xda\xc7\x4b\
-\xf8\x91\x75\xa4\xe9\xb7\x5f\x0d\x75\x5d\x0e\x36\xcc\x1a\xe9\xd7\
-\x1a\xde\x09\x97\x23\xac\x2d\x11\x99\x58\x0e\x48\xda\x47\x1c\x31\
-\xe3\x20\x1f\x9e\xfa\xbf\xec\xbb\xab\x69\x1f\x03\x5b\xc7\x53\xc7\
-\x71\x0e\x9a\xda\x55\x86\xa5\x13\x3a\x61\x66\xfb\x55\xed\xdd\xa2\
-\x80\x7b\xf3\x67\x31\xff\x00\x80\x9a\xfb\xcf\xfe\x0d\xc3\xff\x00\
-\x82\x20\x6a\x1f\xf0\x50\x5f\xda\x07\x4c\xf8\x8d\xe3\xad\x26\x64\
-\xf8\x3b\xe0\x3b\xe4\xbb\xbd\xfb\x44\x65\x62\xf1\x15\xe4\x78\x78\
-\xb4\xf4\xcf\xdf\x4c\xed\x79\x88\xe1\x50\x04\xce\xe9\x3e\x5f\xde\
-\xef\x86\x9f\xf0\x44\x4f\x82\x5a\x7f\xec\x65\xf0\xd3\xe1\x0f\x8e\
-\x3c\x37\x6b\xe3\x0b\x3f\x02\xe9\xba\x75\xad\xe5\xcb\x49\x2d\xb0\
-\xd6\xe6\xb4\x69\xe6\xcc\xc1\x18\x16\x84\xdc\x5d\x5c\xc8\x22\x62\
-\x47\xef\x30\x73\x8a\xfa\xbb\xe1\xf7\xc3\xcd\x07\xe1\x3f\x83\x34\
-\xff\x00\x0e\xf8\x67\x47\xd3\x7c\x3f\xa0\xe9\x30\x88\x2c\xb4\xfb\
-\x0b\x75\xb7\xb7\xb6\x41\xfc\x28\x8a\x00\x1d\xcf\xb9\x24\xf5\x34\
-\x01\x37\x8a\x74\x99\xb5\x5f\x08\xea\x56\x36\x6e\xb6\xd3\xdc\xd9\
-\xcb\x04\x0e\x38\x11\x33\x21\x55\x3f\x81\x23\xf2\xaf\xe1\x87\xe1\
-\x77\x8a\xee\xff\x00\x64\x0f\xda\xfb\xc3\xfa\xdf\x88\x34\x1b\x5d\
-\x77\x50\xf8\x65\xe2\xe8\x2e\xf5\x3d\x16\xf7\xfd\x4d\xec\xb6\x37\
-\x81\xa5\xb6\x90\x90\x78\x66\x89\x94\x92\x0f\x5e\x87\xa5\x7f\x76\
-\x15\xf8\xef\xff\x00\x05\x75\xff\x00\x83\x4e\xfc\x3d\xfb\x73\xfc\
-\x7b\xd6\xbe\x2a\x7c\x29\xf1\xb5\xa7\xc3\xbf\x15\x78\xaa\xe0\xde\
-\x6b\xba\x4e\xa5\x62\xd7\x1a\x55\xfd\xd3\x7f\xac\xb9\x8d\xa3\x22\
-\x48\x1d\xcf\xcc\xe3\x6b\xab\x31\x66\x1b\x49\x39\x00\xfe\x7b\x3f\
-\x6f\xff\x00\xda\x8a\xc7\xf6\xd4\xfd\xb2\xbe\x21\x7c\x54\xd3\x3c\
-\x2b\x67\xe0\x8b\x1f\x1b\x6a\x87\x50\x87\x45\xb6\x90\x4a\x96\x43\
-\x62\x21\xcb\xaa\x20\x67\x62\xa5\xd9\x82\x8c\xb3\xb1\xc5\x7e\xec\
-\xfc\x7b\xf8\x13\xac\x37\xfc\x19\x93\xe1\x7b\x3d\x69\x6e\xad\x75\
-\x6d\x07\xc3\x9a\x77\x89\xa1\x07\x2a\xe9\x0b\x6a\xa2\xe2\x1c\xf7\
-\xc1\xb7\x9d\x7e\x99\xaf\x31\xf8\x2b\xff\x00\x06\xa1\xfc\x25\xfd\
-\x91\x3e\x2a\x78\x27\x50\xfd\xa6\x7e\x3a\x59\xeb\x50\xea\xd7\x8e\
-\xd6\xbe\x15\xd0\xf4\x99\x6d\xe1\xd5\x3e\xce\xbe\x6c\xa6\x6b\x92\
-\xcd\x22\xda\x46\x83\x74\xd2\x18\xe2\x54\x53\xcc\x89\x90\x4f\xe9\
-\x77\xfc\x16\x2f\xc7\x3e\x0c\xf8\xb1\xff\x00\x04\x3e\xf8\xf1\x75\
-\xe0\xbd\x57\x43\xd6\x3c\x33\x67\xe1\x79\xac\xe0\x9b\x4a\x95\x24\
-\xb3\x88\xdb\xcb\x1a\x98\x90\xa7\xcb\x84\x2a\x17\x03\x81\x8c\x76\
-\xa0\x0f\xe3\xa6\xea\xe9\xef\x27\x69\x24\x21\xa4\x73\x96\x20\x01\
-\x93\xf8\x54\x74\x51\x40\x05\x7e\xc4\x7f\xc1\xaa\xbf\x09\x5b\x4d\
-\xfd\xaa\xfe\x10\xf8\xf3\xec\xf2\x08\xf5\x0f\x13\x78\x97\x42\x69\
-\x73\xf2\xb3\x27\x87\xfc\xe5\x1f\x80\x2f\x5f\x8e\xf5\xfd\x49\x7f\
-\xc1\xae\xdf\xb1\x43\x78\x63\xfe\x09\xbd\xf0\xc3\xc5\x1a\xe6\x9f\
-\x2d\x8e\xb1\x63\xe3\xad\x73\xc5\x10\x09\x17\x6c\x83\x7d\x9c\x9a\
-\x56\xd3\xe9\xc6\xf3\x8f\xf6\x45\x00\x7e\xb5\x51\x45\x14\x00\x57\
-\xc7\xdf\xf0\x57\x2f\xf8\x25\x0f\x87\x7f\xe0\xa5\xdf\x06\xf5\x6b\
-\x36\xfb\x35\x8f\x8b\x7f\xb0\x6e\xb4\xbb\x1b\xb9\x23\x1b\x64\x62\
-\xc9\x3d\xb6\xf6\xea\x3c\xab\x88\x94\x83\xd9\x65\x9c\x63\xe7\x35\
-\xf6\x0d\x14\x01\xf8\x37\xff\x00\x06\x65\x49\x6f\xf0\xaf\xe2\xc7\
-\xed\x49\xf0\xd3\x56\xba\x6b\x7f\x16\xe8\xf7\x9a\x52\xc9\x61\x32\
-\xf9\x72\xb2\x59\xc9\x7b\x6b\x3b\x6c\xc9\xff\x00\x57\x2b\x22\xb7\
-\x27\x05\xd7\xd6\xbf\x79\x2b\xf9\x65\xfd\xbb\x3e\x2a\xf8\xeb\xfe\
-\x08\x8f\xff\x00\x07\x0d\xfc\x50\xf8\x9f\xe0\xdb\x1b\x7b\xff\x00\
-\x33\x56\x3e\x23\x96\xc2\xf0\xed\xb7\xd6\x74\x8d\x5c\x09\x2e\x21\
-\x2c\x06\x55\x44\xec\xc8\x24\x19\xd8\xe8\x84\x86\xc1\x07\xf6\x23\
-\xe0\xd7\xfc\x1c\x4f\xf0\x9f\xf6\xd6\xf8\x0c\x63\xf8\x23\x71\x0d\
-\xf7\xc7\x8d\x68\xc1\xa6\x68\x9f\x0f\x7c\x46\x4d\x8d\xd7\xf6\x84\
-\xec\xa9\xe6\x3b\x80\x52\x6b\x58\x01\x79\xa5\x92\x16\x27\xca\x85\
-\xb8\x56\x20\x50\x07\xd2\x3f\xb6\x4f\xed\xdf\x6b\xfb\x3a\x6b\x9a\
-\x47\x80\xfc\x1b\xe1\xfb\xaf\x89\x5f\x1b\x3c\x61\x13\x3f\x87\x7c\
-\x19\xa7\xcc\x23\x73\x10\x3b\x5a\xfe\xfa\x63\x95\xb3\xb0\x8c\x9f\
-\x9e\x79\x3a\x9f\x95\x03\xb7\x03\xc9\x3e\x14\xfe\xc4\x1f\xb5\x9f\
-\x83\x34\x8b\xdd\x62\xe3\xf6\xaa\xd3\x63\xf1\x37\x89\xb5\x3b\xad\
-\x63\x55\xd1\xe6\xf0\x34\x5a\xa6\x81\xa5\x49\x75\xb3\x75\xbd\x89\
-\x92\x74\xb9\x11\x5b\x88\xd4\x45\xba\x40\xa4\xf9\x8c\xc8\x7c\xc2\
-\x07\xb6\xfe\xc5\x9f\xb1\x56\x9b\xfb\x2a\x68\x1a\xa6\xad\xaa\x6a\
-\x52\x78\xcb\xe2\xa7\x8d\xa4\x5b\xef\x1a\x78\xce\xf6\x31\xf6\xcd\
-\x76\xeb\x1f\x71\x3f\xe7\x8d\xa4\x5f\x72\x0b\x74\xc2\x44\x80\x70\
-\x58\xb3\x37\xb7\xd0\x07\xc6\x5e\x0a\xf8\x55\xfb\x44\x7e\xc1\x1e\
-\x23\xd7\xbc\x49\x71\xe3\xad\x73\xf6\x9e\xf0\x16\xb4\xd1\xdf\xeb\
-\x5a\x6e\xa7\x04\x56\x7e\x2a\xd0\xa4\x8e\x20\x92\xc9\xa5\x47\x0a\
-\xad\xb5\xcc\x2c\x15\x58\xda\x30\x89\xc6\xcf\x91\xdd\xd8\x87\xfa\
-\x7b\xe0\x4f\xc7\xaf\x08\xfe\xd2\xff\x00\x0c\x74\xef\x18\xf8\x1f\
-\x5b\xb4\xd7\xfc\x3f\xaa\x06\xf2\xae\x20\xc8\x68\xdd\x4e\xd9\x22\
-\x95\x18\x07\x8a\x54\x60\x55\xe3\x70\x1d\x18\x10\xc0\x11\x8a\xeb\
-\xeb\xe2\xbf\xdb\x0b\xc0\x3a\x9f\xfc\x13\xc7\xe2\x86\xab\xfb\x4c\
-\x7c\x37\xb2\xba\x9f\xc1\xf7\x8e\xb3\xfc\x63\xf0\x75\x92\x6e\x8b\
-\x55\xb2\x5c\x2b\xf8\x82\xd2\x21\xc2\xea\x16\xa9\xf3\xca\x17\x1f\
-\x69\x81\x18\x37\xce\x88\xc4\x03\xec\x6d\x53\xc3\x5a\x6e\xb8\xec\
-\xd7\xda\x7d\x8d\xe3\x34\x0f\x6a\x4c\xf0\x2c\x84\xc4\xfb\x4b\xc7\
-\xc8\x3f\x23\x6d\x5c\xaf\x43\xb4\x67\xa0\xaf\x89\xff\x00\xe0\xe2\
-\x2d\x7b\x4d\xf8\x41\xff\x00\x04\x44\xf8\xe5\x1d\xad\xbd\xae\x9d\
-\x6b\x3e\x91\x6f\xa5\xdb\xdb\xc1\x12\xc5\x1a\xb5\xcd\xfd\xbc\x58\
-\x55\x50\x00\xcf\x98\xc7\x8f\x7a\xfb\x5f\xc2\xbe\x29\xd3\xbc\x73\
-\xe1\x7d\x37\x5a\xd1\xef\x2d\xf5\x2d\x27\x58\xb5\x8a\xf6\xca\xee\
-\x07\xdf\x15\xd4\x12\x20\x78\xe4\x46\xee\xac\xac\x08\x3d\xc1\xaf\
-\xc9\xef\xf8\x3b\xfb\xe3\xee\x97\x61\xff\x00\x04\xfd\xd0\x7e\x12\
-\xe9\xba\x95\xad\xe7\x8c\xfe\x20\x78\xc3\x4b\x8c\x68\x96\xf2\xac\
-\x97\xcf\x68\x9e\x7c\xa2\x4f\x24\x1d\xfb\x5a\x68\xa2\x55\x38\xc1\
-\x6e\x07\x34\x01\xfc\xba\x30\xda\x68\x55\xdd\x9f\x61\x9a\xbb\xe2\
-\x4d\x3a\x4d\x1f\x5a\xb8\xb3\x9a\x36\x86\x7b\x57\x68\x65\x8d\xbe\
-\xf4\x6e\xa4\xab\x29\xf7\x04\x11\x56\x3c\x2f\xe0\xdb\xcf\x16\xcd\
-\x75\x15\xa7\x93\xbe\xde\x23\x21\x12\x48\x13\x79\x1d\x11\x73\xd5\
-\xce\x0e\x14\x72\x48\xc0\xe7\x02\x80\x13\xc0\xba\x1d\xd7\x89\xfc\
-\x6d\xa3\xe9\xb6\x36\xf2\x5e\x5f\x6a\x17\xb0\xdb\x5b\xdb\xa2\xee\
-\x69\xe4\x77\x0a\x88\x07\x72\xcc\x40\xfc\x6b\xfb\x98\xfd\x8b\x3e\
-\x01\xa7\xec\xb9\xfb\x26\xfc\x3d\xf8\x7e\x36\x99\xbc\x2f\xa2\x5b\
-\xda\x5d\xba\xf4\x96\xeb\x6e\xeb\x89\x3f\xe0\x53\x34\x8d\xff\x00\
-\x02\xaf\xe5\xe3\xfe\x08\x93\xff\x00\x04\xee\xf1\x17\x87\xff\x00\
-\xe0\xbe\x5f\x0d\x7e\x1b\xfc\x42\xd0\x66\xd3\x75\x2f\x87\xb7\x2d\
-\xe2\x7d\x5a\xc6\xe9\x39\x85\xed\x6c\xbe\xd7\x06\x47\x71\xe7\xb5\
-\xbf\xb5\x7f\x5a\xd4\x00\x51\x45\x14\x00\x51\x45\x14\x01\xf2\x07\
-\xfc\x14\xa3\xfe\x09\x07\xe0\xbf\xf8\x28\x4f\x8e\x3c\x27\xe3\x0b\
-\xa9\x21\xd2\xfc\x5d\xe1\xdb\x79\x74\x3b\xc9\xe5\x8b\xcd\xb7\xd6\
-\xf4\x3b\x9c\xad\xd5\x8c\xe8\x30\x72\x15\xdd\xe1\x90\x10\x63\x93\
-\x9e\x87\x8f\xcd\x8f\xf8\x20\xbf\xec\x79\xe0\x9f\xf8\x24\x07\xfc\
-\x14\x97\xe2\xc6\x87\xf1\xc3\xc4\xd3\x78\x37\xc7\x92\x33\x78\x63\
-\xc0\x57\x3a\xd5\xa7\xd8\x74\x3f\x15\xe9\x8e\xeb\x37\xda\xed\xaf\
-\xe4\x1e\x53\xdd\x48\x12\x20\x60\x0e\xac\xbf\x30\xc3\x92\x42\x7e\
-\xf3\x57\xc8\x5f\xf0\x5c\xed\x02\x1f\x19\xff\x00\xc1\x39\xfc\x4f\
-\xe1\xd9\x74\x3d\x3f\x58\xff\x00\x84\xb7\x56\xd1\xfc\x3a\x67\xbe\
-\xb1\x4b\xa8\x74\x48\xef\xb5\x1b\x7b\x59\xb5\x03\xbd\x48\x8b\xc8\
-\x86\x59\x5c\x4b\xc7\x96\x40\x6c\x8c\x66\x80\x3e\xbb\x8e\x45\x9a\
-\x35\x65\x65\x65\x61\x90\x41\xc8\x22\x9d\x5c\xef\xc2\x6b\xaf\x0c\
-\x4d\xf0\xe7\x48\x83\xc1\xb7\x9a\x4d\xf7\x86\x74\xdb\x64\xd3\xf4\
-\xf7\xd3\x2e\x52\xe2\xd6\x38\xa0\x1e\x50\x8d\x1d\x09\x5f\x93\x66\
-\xdc\x03\xc1\x5c\x57\x45\x40\x05\x56\xd6\x34\x8b\x5f\x10\x69\x17\
-\x5a\x7d\xf4\x11\xdd\x59\xdf\x42\xf6\xf3\xc3\x22\xee\x49\x63\x75\
-\x2a\xca\xc0\xf5\x04\x12\x08\xf7\xab\x35\xf9\x1f\xff\x00\x07\x3a\
-\xfe\xdf\xbe\x32\xfd\x89\x6e\x7c\x0f\xa7\xe8\xfe\x32\xf1\xff\x00\
-\x87\x34\x3f\x1e\xe8\x5a\x85\xaa\xa7\x85\xef\x21\xd3\x5e\xdb\x50\
-\x82\xea\xcc\xa4\xf3\x5d\x18\x24\x95\x63\x68\x26\x99\x36\xc6\x54\
-\xe4\x2b\x73\x82\x08\x07\x3b\xfb\x01\x2f\xc6\x4b\x5f\xda\x0a\x1f\
-\xd8\xf4\xfc\x66\xf1\x86\x9b\xe1\x3f\x84\xba\x87\x89\x74\x7d\x46\
-\x1f\x0e\xe9\xf6\x36\x7a\xd6\x99\xa1\x59\x8b\x19\x74\x3b\x96\xbd\
-\x96\x39\x64\x54\xb9\x8e\xfc\xc2\x36\xaa\x90\x6d\xf0\xad\x85\x26\
-\xbc\x0f\xe2\x64\x3f\x0b\x7f\x65\x7f\xf8\x28\x47\xc7\x1f\x10\x7c\
-\x4c\x97\xce\xf8\x95\xfb\x33\x78\x72\x3b\xaf\x87\xfa\x25\xf4\x93\
-\xea\xba\xa7\xc4\x5d\x5e\xfd\x47\xd9\x75\xdb\xbb\x89\x9e\x57\x9a\
-\x78\xbc\xeb\x45\x16\xca\x76\xc5\x82\xe8\xaa\xaa\x45\x74\x1f\xf0\
-\x4d\x6f\xf8\x28\x17\x83\x7f\x63\x3f\xd9\xdb\x51\xd0\xff\x00\x65\
-\x3f\x82\xdf\x16\xbf\x69\xef\x8f\x5e\x3f\x75\xbf\xf1\x67\x8b\xce\
-\x87\x79\x6f\xa2\x4d\x7d\x83\xb5\x5e\xf2\xe3\x33\x9b\x58\x0b\xb0\
-\x40\xe1\x0b\xfc\xce\xce\x8c\xe7\x17\xbf\x64\x5f\xf8\x37\x47\xf6\
-\x9c\xf8\xf9\xfb\x52\xf8\x93\xf6\x9a\xf8\xff\x00\xf1\x2b\x4f\xf8\
-\x77\xf1\x63\x53\x9e\x6d\x7b\x41\xb4\xd1\x4a\x5f\x5c\xe9\xda\xbe\
-\xc1\xf6\x39\x27\x2a\x4c\x11\xdb\x40\x56\x34\xf2\x11\xa5\x2f\x1a\
-\x6c\x2c\xbc\xe4\x03\xf3\xb7\xe0\x27\xfc\x11\x7f\xe2\x89\xfd\xa8\
-\xfc\x1f\xe0\xad\x6f\xc3\x70\xeb\xdf\x17\xbc\x51\x69\x1f\x89\x21\
-\xf0\x8d\xd8\x97\xca\xd0\xad\x26\x67\xf2\xaf\xf5\xc9\x02\xec\xb6\
-\xb7\x42\x04\xaf\x0e\xe6\x96\x43\xb2\x10\xa1\x9d\xb1\xfb\x19\xfb\
-\x1a\xff\x00\xc1\xa7\xbf\x0b\xff\x00\x67\x76\xf8\x5b\xe2\x6f\x12\
-\x78\xa6\xfb\xc4\x9f\x10\x3c\x17\xe2\x2b\x1f\x12\xeb\x13\x0b\x48\
-\xdb\x4b\xd4\xa4\xb7\xf3\x9c\xda\x45\x11\x0a\x52\x26\x9e\x48\x1c\
-\xbb\xef\x62\x2d\x55\x40\x50\xc6\xbe\xc9\xff\x00\x82\x61\x7c\x4f\
-\xf0\xf7\xc6\xef\x87\xfe\x2e\xf1\x35\xc7\x85\x2c\xbc\x23\xf1\x9a\
-\x2d\x72\x4d\x13\xe2\x9d\x87\x98\xd3\xdd\x5b\xeb\x76\x8a\xa8\xca\
-\x24\x72\x5d\xad\x1a\x32\x92\xdb\x00\x76\x08\x66\x5d\xa0\x12\xd5\
-\xf4\xed\x00\x78\x3e\xb3\xff\x00\x04\xe5\xf8\x6b\xab\xfe\xdf\x9a\
-\x37\xed\x28\xb6\xba\xad\x8f\xc4\xdd\x23\x44\x97\x40\x79\xad\x6e\
-\xfc\xbb\x3d\x4a\xd9\xd1\x90\x1b\x88\xb6\x9f\x31\xd1\x5b\x0a\x77\
-\x0c\x6d\x5c\x83\xb5\x71\xe9\x5f\x18\x3e\x3e\xf8\x17\xf6\x7b\xd0\
-\x23\xd5\x7c\x7b\xe3\x2f\x0a\xf8\x2b\x4c\x99\x8a\x47\x75\xae\xea\
-\xb0\x69\xf0\xca\xc3\xaa\xab\x4a\xca\x18\xf2\x38\x1c\xf3\x5a\x9f\
-\x11\xfc\x7d\xa6\xfc\x2a\xf8\x7b\xaf\x78\xa3\x5a\x9b\xec\xda\x3f\
-\x86\xf4\xeb\x8d\x52\xfa\x6c\x7f\xaa\x82\x08\xda\x59\x1b\xf0\x55\
-\x26\xbf\x89\xdf\xf8\x29\x5f\xfc\x14\x4b\xc7\x1f\xf0\x53\x0f\xda\
-\xab\xc4\x1f\x12\x3c\x65\x7d\x70\xd6\xf7\x53\xc9\x06\x87\xa4\x97\
-\xdd\x6d\xa0\xe9\xe1\x8f\x95\x6d\x12\xf4\x18\x5c\x17\x61\xcb\xb9\
-\x66\x3c\x9a\x00\xfe\xd7\x7e\x19\xfc\x56\xf0\xbf\xc6\x8f\x09\x41\
-\xaf\xf8\x3f\xc4\x9a\x0f\x8a\xb4\x3b\xa2\x56\x1d\x47\x47\xbf\x8a\
-\xfa\xd6\x52\x3a\x81\x24\x4c\xca\x48\xc8\xc8\xcf\x14\x57\xf3\xa9\
-\xff\x00\x06\x4f\x6a\x1f\x10\x8f\xed\x77\xf1\x52\xd7\x4f\x93\x52\
-\x6f\x85\xeb\xe1\x75\x97\x5a\x8c\xbb\x7d\x8a\x3d\x50\xdc\xc4\x2c\
-\xdb\x1d\x3c\xe3\x12\xdd\x80\x47\x25\x03\x67\xa0\xa2\x80\x3f\xa4\
-\xaa\x28\xa2\x80\x0a\xf9\x17\xf6\x9f\xf8\xa7\xe1\xbf\x10\xff\x00\
-\xc1\x43\x3c\x2d\xf0\xb7\xe2\x86\xa9\xa4\x69\x7f\x0d\x57\xc0\x97\
-\x3e\x30\xb5\xb3\xd5\xae\x52\xdb\x4e\xf1\x1e\xa5\x15\xfa\x41\x24\
-\x57\x0d\x23\x04\x99\x6d\xa1\x64\x94\x40\xd9\x52\x67\xde\xc0\xf9\
-\x63\x05\x14\x00\xdf\xf8\x26\x86\xa5\xe0\xbd\x33\xf6\x80\xfd\xa7\
-\xbc\x3b\xe0\xfd\x4a\xc6\xf2\x2b\x7f\x1a\xd8\xeb\xad\x0e\x8c\x22\
-\x1a\x1d\xad\xbd\xf6\x93\x68\xd6\xe2\xd8\x44\x4a\x09\x58\x43\x23\
-\x4d\x8c\x16\x76\x57\x20\x6f\x15\xf5\xe5\x14\x50\x07\x01\xfb\x55\
-\xfc\x6d\x87\xf6\x6c\xfd\x9a\x3c\x7b\xf1\x02\x68\x5a\xe2\x3f\x06\
-\xe8\x37\x9a\xbf\x94\xab\x9f\x30\xc3\x0b\x3a\x83\xe8\x09\x03\x27\
-\xb0\xc9\xed\x5f\x9b\xdf\x1d\xbf\xe0\x84\xbf\x0f\xfc\x4d\xff\x00\
-\x04\xbf\xd6\x3c\x59\xe2\x9b\x7d\x3f\xe2\x07\xed\x01\x6f\xa3\x47\
-\xe3\xad\x53\xc6\x5a\x8e\xa9\x7b\xab\x41\xe2\x0d\x4e\xda\x3f\xb5\
-\xc9\x07\xcd\x27\x36\x13\x05\x78\x84\x51\x85\x5d\x8e\xa4\x0c\xa8\
-\x34\x51\x40\x1b\x9f\x02\x3f\xe0\xe5\x6f\x80\x7a\x4e\x81\xa3\xea\
-\xfe\x32\xb0\xf1\x47\xc1\x4f\x86\x3a\x96\x83\x6c\xbe\x0b\x8f\x50\
-\xf0\x7d\xda\xda\xeb\x8d\x11\xf2\xee\xda\xd6\x5b\x68\xde\x2f\x26\
-\xde\x41\xe4\x22\x2e\x09\x11\xbb\x1c\x02\x82\xba\xdf\x8d\xbf\xf0\
-\x75\x2f\xec\x65\xf0\x93\xc1\xd2\xea\x3a\x5f\xc4\x4d\x4b\xc7\x9a\
-\x87\x94\x64\x83\x4a\xd0\x74\x2b\xc3\x71\x33\x63\x85\x2f\x71\x1c\
-\x51\x26\x4f\xf7\x9c\x63\xde\x8a\x28\x03\xe1\xaf\xf8\x24\xb7\xfc\
-\x15\x03\xe2\xe7\xc6\x5f\xf8\x29\x27\x8c\x7f\x6a\x4f\x14\x78\x6d\
-\x7c\x33\xf0\x07\xe3\x77\x8b\x34\xdf\x85\xd7\x51\x22\x15\x83\x4e\
-\xbc\x30\xc8\x34\x99\xcc\x98\x02\x67\x89\x92\x3b\x79\xa6\x38\x1b\
-\xaf\xd4\x60\x00\xaa\xbf\xbf\x94\x51\x40\x1f\x2f\x7f\xc1\x6b\xf5\
-\x2b\xcd\x27\xfe\x09\x23\xfb\x45\x4d\x63\xe6\x0b\x81\xe0\x3d\x51\
-\x33\x1f\xde\x08\xd0\x32\xb9\xfc\x10\xb7\xe1\x5f\xc5\x34\x60\x06\
-\x56\x65\x2c\x99\x19\xf7\xa2\x8a\x00\xfe\xc0\xff\x00\xe0\xda\x2f\
-\xd9\x7f\x4e\xfd\x99\xff\x00\xe0\x8f\xdf\x0b\x64\x87\x4f\x8a\xd3\
-\x59\xf1\xfd\xb4\x9e\x2e\xd5\xe7\x09\x89\x2e\xe4\xbb\x72\xd0\x33\
-\x1e\xa7\x6d\xa8\xb7\x41\xec\xbe\xe6\x8a\x28\xa0\x0f\xff\xd9\
-"
-
-qt_resource_name = b"\
-\x00\x09\
-\x05\x91\xe8\x14\
-\x00\x52\
-\x00\x45\x00\x41\x00\x44\x00\x4d\x00\x45\x00\x2e\x00\x6d\x00\x64\
-\x00\x06\
-\x07\x03\x7d\xc3\
-\x00\x69\
-\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
-\x00\x08\
-\x0b\x77\x5c\xa7\
-\x00\x68\
-\x00\x65\x00\x61\x00\x64\x00\x2e\x00\x6a\x00\x70\x00\x67\
-"
-
-qt_resource_struct_v1 = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x00\x18\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
-\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x04\x12\
-"
-
-qt_resource_struct_v2 = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x63\x19\x74\xf8\x4b\
-\x00\x00\x00\x18\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x04\x12\
-\x00\x00\x01\x60\x83\x46\x10\xc7\
-"
-
-qt_version = QtCore.qVersion().split('.')
-if qt_version < ['5', '8', '0']:
- rcc_version = 1
- qt_resource_struct = qt_resource_struct_v1
-else:
- rcc_version = 2
- qt_resource_struct = qt_resource_struct_v2
-
-def qInitResources():
- QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
- QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
diff --git a/Demo/QRC资源文件使用/textread.py b/Demo/QRC资源文件使用/textread.py
deleted file mode 100644
index df3cf03..0000000
--- a/Demo/QRC资源文件使用/textread.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-from PyQt5.QtCore import QFile, QIODevice, QTextStream, QTextCodec
-from PyQt5.QtWidgets import QTextBrowser
-
-import res_rc # @UnresolvedImport @UnusedImport
-
-
-# Created on 2018年5月1日
-# author: Irony
-# site: https://pyqt5.com , https://github.com/892768447
-# email: 892768447@qq.com
-# file: QRC资源文件使用.textread
-# description:
-__Author__ = """By: Irony
-QQ: 892768447
-Email: 892768447@qq.com"""
-__Copyright__ = 'Copyright (c) 2018 Irony'
-__Version__ = 1.0
-
-
-class TextBrowser(QTextBrowser):
-
- def __init__(self, *args, **kwargs):
- super(TextBrowser, self).__init__(*args, **kwargs)
- self.setText(self.readText(':/README.md'))
-
- def readText(self, path):
- file = QFile(path)
- if not file.open(QIODevice.ReadOnly):
- return ''
- stream = QTextStream(file)
- # 下面这句设置编码根据文件的编码自行确定
- stream.setCodec(QTextCodec.codecForName('UTF-8'))
- data = stream.readAll()
- file.close()
- del stream
- return data
-
-
-if __name__ == '__main__':
- import sys
- from PyQt5.QtWidgets import QApplication
- app = QApplication(sys.argv)
- app.aboutToQuit.connect(res_rc.qCleanupResources) # 退出时要清理资源
- w = TextBrowser()
- w.show()
- sys.exit(app.exec_())
diff --git a/Demo/QRC资源文件使用/tools/rcc.exe b/Demo/QRC资源文件使用/tools/rcc.exe
deleted file mode 100644
index e912e75..0000000
Binary files a/Demo/QRC资源文件使用/tools/rcc.exe and /dev/null differ
diff --git a/Demo/README.md b/Demo/README.md
index 3ea9316..4816dee 100644
--- a/Demo/README.md
+++ b/Demo/README.md
@@ -1,21 +1,14 @@
-# 窗口案例
+# Demo
-## [1、重启窗口Widget](窗口重启.py)
+## 1、重启窗口Widget
+[运行 RestartWindow.py](RestartWindow.py)
利用类变量对窗口的变量进行引用,防止被回收(导致窗口一闪而过),重启时先显示新窗口后关闭自己
-![截图](ScreenShot/窗口重启.gif)
+![RestartWindow](ScreenShot/RestartWindow.gif)
-## [2、分割窗口的分割条重绘](分割窗口的分割条重写.py)
-
-1. 原理在于`QSplitter`在创建分割条的时候会调用`createHandle`函数
-1. 通过重新写`createHandle`返回自己的`QSplitterHandle`类
-1. 通过`QSplitterHandle`的`paintEvent`实现绘制其它形状,
-1. 重写`mousePressEvent`和`mouseMoveEvent`来实现鼠标的其它事件
-
-![截图](ScreenShot/分割窗口的分割条重写.gif)
-
-## [3、简单的窗口贴边隐藏](简单的窗口贴边隐藏.py)
+## 2、简单的窗口贴边隐藏
+[运行 WeltHideWindow.py](WeltHideWindow.py)
1. 大概思路
1. 思路是当窗口进入左边,顶部,右边一半时,此时判断窗口的坐标
@@ -29,61 +22,120 @@
1. `mouseReleaseEvent`,鼠标弹起事件,用于判断是否需要隐藏窗口
1. `enterEvent`,鼠标进入事件,用于窗口隐藏后,是否需要暂时显示预览
1. `leaveEvent`,鼠标离开事件,用于窗口暂时显示后自动隐藏效果
-
-## [4、嵌入外部窗口](嵌入外部窗口.py)
+
+![WeltHideWindow](ScreenShot/WeltHideWindow.gif)
+
+## 3、嵌入外部窗口
+[运行 EmbedWindow.py](EmbedWindow.py)
1. 使用`SetParent`函数设置外部窗口的`parent`为Qt的窗口
1. Qt使用`QWidget.createWindowContainer(QWindow.fromWinId(窗口ID))`生成QWidget
1. 使用`GetWindowLong`得到原来窗口的样式属性`style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)`和`exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)`
1. 这里还原窗口后不会显示,用spy++发现没有了WS_VISIBLE样式(未解决)
-![截图](ScreenShot/嵌入外部窗口.gif)
+![EmbedWindow](ScreenShot/EmbedWindow.gif)
-## [5、简单跟随其它窗口](外部窗口跟随.py)
+## 4、简单跟随其它窗口
+[运行 FollowWindow.py](FollowWindow.py)
1. 利用win32gui模块获取目标窗口的句柄
1. 通过句柄获取目标窗口的大小位置,并设置自己的位置
1. 当句柄失效时关闭自己
1. 主要是检测时间,在10毫秒以下很流畅
-![截图](ScreenShot/外部窗口跟随.gif)
+![FollowWindow](ScreenShot/FollowWindow.gif)
-## [6、简单探测窗口和放大截图](简单探测窗口和放大截图.py)
+## 5、简单探测窗口和放大截图
+[运行 ProbeWindow.py](ProbeWindow.py)
1. 利用`win32gui`模块获取鼠标所在位置的窗口大小(未去掉边框)和rgb颜色
1. 利用一个全屏的全透明鼠标穿透的窗口(目的在于绘制矩形框和截图)
-![截图](ScreenShot/简单探测窗口和放大截图.gif)
+![ProbeWindow](ScreenShot/ProbeWindow.gif)
-## [7、消息对话框倒计时关闭](消息对话框倒计时关闭.py)
+## 6、无边框自定义标题栏窗口
+[运行 FramelessWindow.py](FramelessWindow.py) | [运行 NativeEvent.py](NativeEvent.py)
-1. 通过继承`QMessageBox`实现倒计时关闭的对话框
-1. `QTimer`定时器关闭窗口
-
-![截图](ScreenShot/消息对话框倒计时关闭.gif)
-
-## [8、无边框自定义标题栏窗口](无边框自定义标题栏窗口/)
-
-1. 方式一(QWidget)
+1. 重写鼠标事件
1. 使用一个`QWidget`(`FramelessWindow`)作为父窗口, 一个`TitleBar`作为标题栏, 一个`QWidget`作为底部容器
1. 父窗口`FramelessWindow`设置为背景透明,但是需要绘制一定宽度的透明度很高的矩形边框用来接受鼠标事件(变形鼠标样式进行调整窗口大小)
1. `TitleBar`的最小化最大化关闭等按钮事件关联到父窗口里
1. `TitleBar`中的鼠标按下移动事件得到坐标也传递到父窗口调用move方法进行窗口移动
-![截图](无边框自定义标题栏窗口/ScreenShot/无边框自定义标题栏窗口.gif)
-
-1. 方式二(windows api)
+2. windows api
1. 使用`win32gui`设置薄边框
1. 重写`nativeEvent`事件拦截边框的系统边框的显示,并返回各个方向
-## 截图
-![截图](无边框自定义标题栏窗口/ScreenShot/win无边框调整大小1.jpg)
+![FramelessWindow](ScreenShot/FramelessWindow.gif)
-![截图](无边框自定义标题栏窗口/ScreenShot/win无边框调整大小2.jpg)
+## 7、右下角弹出框
+[运行 WindowNotify.py](WindowNotify.py)
-![截图](无边框自定义标题栏窗口/ScreenShot/win无边框调整大小3.gif)
\ No newline at end of file
+![WindowNotify](ScreenShot/WindowNotify.gif)
+
+## 8、程序重启
+[运行 AutoRestart.py](AutoRestart.py)
+
+![AutoRestart](ScreenShot/AutoRestart.png)
+
+## 9、自定义属性
+[运行 CustomProperties.py](CustomProperties.py)
+
+![CustomProperties](ScreenShot/CustomProperties.png)
+
+## 10、调用截图DLL
+[运行 ScreenShotDll.py](ScreenShotDll.py)
+
+![ScreenShotDll](ScreenShot/ScreenShotDll.gif)
+
+## 11、单实例应用
+[运行 SingleApplication.py](SingleApplication.py) | [运行 SharedMemory.py](SharedMemory.py)
+
+1. QSharedMemory
+2. QLocalSocket, QLocalServer
+
+## 12、简单的右下角气泡提示
+[运行 BubbleTips.py](BubbleTips.py)
+
+1. 使用 `QWidget` 包含一个 `QLabel`, 其中 `QWidget` 通过 `paintEvent` 绘制气泡形状
+2. 使用 `QPropertyAnimation` 属性动画来移动气泡和改变气泡的透明度
+3. 使用 `QParallelAnimationGroup` 动画组来同时运行两个动画
+
+![BubbleTips](ScreenShot/BubbleTips.gif)
+
+## 13、右侧消息通知栏
+[运行 Notification.py](Notification.py)
+
+![Notification](ScreenShot/Notification.gif)
+
+## 14、验证码
+[运行 VerificationCode.py](VerificationCode.py)
+
+1. 更新为paintEvent方式,采用上下跳动
+2. 参考网上一些代码,都是采用paintEvent绘制,这里采用QLabel显示html结合字体来显示文字
+然后在paintEvent中绘制噪点和线条
+
+![VerificationCode](ScreenShot/VerificationCode.gif)
+
+## 15、人脸特征点
+[运行 FacePoints.py](FacePoints.py)
+
+PyQt 结合 Opencv 进行人脸检测;
+由于直接在主线程中进行特征点获取,效率比较低
+
+ 依赖文件
+
+1. [opencv](https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)
+2. [numpy](https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy)
+3. [dlib](http://dlib.net/)
+ 1. [dlib-19.4.0.win32-py2.7.exe](dist/dlib-19.4.0.win32-py2.7.exe)
+ 2. [dlib-19.4.0.win32-py3.4.exe](dist/dlib-19.4.0.win32-py3.4.exe)
+ 3. [dlib-19.4.0.win32-py3.5.exe](dist/dlib-19.4.0.win32-py3.5.exe)
+4. [shape-predictor-68-face-landmarks.dat.bz2](http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2)
+
+![FacePoints](ScreenShot/FacePoints.png)
\ No newline at end of file
diff --git a/Demo/窗口重启.py b/Demo/RestartWindow.py
similarity index 84%
rename from Demo/窗口重启.py
rename to Demo/RestartWindow.py
index 2737fd8..9eec224 100644
--- a/Demo/窗口重启.py
+++ b/Demo/RestartWindow.py
@@ -6,8 +6,8 @@ Created on 2018年1月17日
@author: Irony."[讽刺]
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
-@file: RestartMainWindow
-@description:
+@file: RestartWindow
+@description: 窗口重启
'''
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton, QLineEdit,\
@@ -19,14 +19,14 @@ __Copyright__ = "Copyright (c) 2018 Irony.\"[讽刺]"
__Version__ = "Version 1.0"
-class RestartMainWindow(QWidget):
+class RestartWindow(QWidget):
restarted = pyqtSignal(QWidget, str)
_Self = None # 很重要,保留窗口引用
def __init__(self, path, *args, **kwargs):
- super(RestartMainWindow, self).__init__(*args, **kwargs)
- RestartMainWindow._Self = self
+ super(RestartWindow, self).__init__(*args, **kwargs)
+ RestartWindow._Self = self
layout = QVBoxLayout(self)
layout.addWidget(QLabel("当前工作目录:" + path, self))
self.dirEdit = QLineEdit(
@@ -34,7 +34,7 @@ class RestartMainWindow(QWidget):
layout.addWidget(self.dirEdit)
layout.addWidget(QPushButton(
"点我切换工作目录", self, clicked=self.onChangeDir))
- self.restarted.connect(RestartMainWindow.onRestart)
+ self.restarted.connect(RestartWindow.onRestart)
def onChangeDir(self):
path = self.dirEdit.text().strip()
@@ -46,7 +46,7 @@ class RestartMainWindow(QWidget):
@classmethod
def onRestart(cls, widget, path):
- w = RestartMainWindow(path)
+ w = RestartWindow(path)
w.show()
widget.close()
widget.deleteLater()
@@ -57,6 +57,6 @@ if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
- w = RestartMainWindow("test")
+ w = RestartWindow("test")
w.show()
sys.exit(app.exec_())
diff --git a/Demo/程序重启/ScreenShot/1.png b/Demo/ScreenShot/AutoRestart.png
similarity index 100%
rename from Demo/程序重启/ScreenShot/1.png
rename to Demo/ScreenShot/AutoRestart.png
diff --git a/Demo/消息提示/ScreenShot/1.gif b/Demo/ScreenShot/BubbleTips.gif
similarity index 100%
rename from Demo/消息提示/ScreenShot/1.gif
rename to Demo/ScreenShot/BubbleTips.gif
diff --git a/Demo/自定义属性测试/ScreenShot/1.png b/Demo/ScreenShot/CustomProperties.png
similarity index 100%
rename from Demo/自定义属性测试/ScreenShot/1.png
rename to Demo/ScreenShot/CustomProperties.png
diff --git a/Demo/ScreenShot/嵌入外部窗口.gif b/Demo/ScreenShot/EmbedWindow.gif
similarity index 100%
rename from Demo/ScreenShot/嵌入外部窗口.gif
rename to Demo/ScreenShot/EmbedWindow.gif
diff --git a/Demo/人脸描点检测/ScreenShot/1.png b/Demo/ScreenShot/FacePoints.png
similarity index 100%
rename from Demo/人脸描点检测/ScreenShot/1.png
rename to Demo/ScreenShot/FacePoints.png
diff --git a/Demo/ScreenShot/外部窗口跟随.gif b/Demo/ScreenShot/FollowWindow.gif
similarity index 100%
rename from Demo/ScreenShot/外部窗口跟随.gif
rename to Demo/ScreenShot/FollowWindow.gif
diff --git a/Demo/无边框自定义标题栏窗口/ScreenShot/无边框自定义标题栏窗口.gif b/Demo/ScreenShot/FramelessWindow.gif
similarity index 100%
rename from Demo/无边框自定义标题栏窗口/ScreenShot/无边框自定义标题栏窗口.gif
rename to Demo/ScreenShot/FramelessWindow.gif
diff --git a/Demo/消息提示/ScreenShot/2.gif b/Demo/ScreenShot/Notification.gif
similarity index 100%
rename from Demo/消息提示/ScreenShot/2.gif
rename to Demo/ScreenShot/Notification.gif
diff --git a/Demo/ScreenShot/简单探测窗口和放大截图.gif b/Demo/ScreenShot/ProbeWindow.gif
similarity index 100%
rename from Demo/ScreenShot/简单探测窗口和放大截图.gif
rename to Demo/ScreenShot/ProbeWindow.gif
diff --git a/Demo/ScreenShot/窗口重启.gif b/Demo/ScreenShot/RestartWindow.gif
similarity index 100%
rename from Demo/ScreenShot/窗口重启.gif
rename to Demo/ScreenShot/RestartWindow.gif
diff --git a/Demo/调用截图dll(只能用32位)/ScreenShot/1.gif b/Demo/ScreenShot/ScreenShotDll.gif
similarity index 100%
rename from Demo/调用截图dll(只能用32位)/ScreenShot/1.gif
rename to Demo/ScreenShot/ScreenShotDll.gif
diff --git a/Demo/验证码控件/ScreenShot/1.gif b/Demo/ScreenShot/VerificationCode.gif
similarity index 100%
rename from Demo/验证码控件/ScreenShot/1.gif
rename to Demo/ScreenShot/VerificationCode.gif
diff --git a/Demo/ScreenShot/WeltHideWindow.gif b/Demo/ScreenShot/WeltHideWindow.gif
new file mode 100644
index 0000000..3625d02
Binary files /dev/null and b/Demo/ScreenShot/WeltHideWindow.gif differ
diff --git a/Demo/ScreenShot/WindowNotify.gif b/Demo/ScreenShot/WindowNotify.gif
new file mode 100644
index 0000000..264e80d
Binary files /dev/null and b/Demo/ScreenShot/WindowNotify.gif differ
diff --git a/Demo/调用截图dll(只能用32位)/截图DLL测试.py b/Demo/ScreenShotDll.py
similarity index 52%
rename from Demo/调用截图dll(只能用32位)/截图DLL测试.py
rename to Demo/ScreenShotDll.py
index bad08d9..964df60 100644
--- a/Demo/调用截图dll(只能用32位)/截图DLL测试.py
+++ b/Demo/ScreenShotDll.py
@@ -1,3 +1,3 @@
from ctypes import CDLL
-dll = CDLL('ScreenShot.dll')
+dll = CDLL('Data/ScreenShot.dll')
dll.PrScrn()
diff --git a/Demo/单实例应用/TestQSharedMemory.py b/Demo/SharedMemory.py
similarity index 90%
rename from Demo/单实例应用/TestQSharedMemory.py
rename to Demo/SharedMemory.py
index bd5610c..0ec5919 100644
--- a/Demo/单实例应用/TestQSharedMemory.py
+++ b/Demo/SharedMemory.py
@@ -12,7 +12,7 @@ Created on 2017年3月30日
from PyQt5.QtWidgets import QWidget
-from Application import SharedApplication # @UnresolvedImport
+from Lib.Application import SharedApplication # @UnresolvedImport
__version__ = "0.0.1"
diff --git a/Demo/单实例应用/TestQSingleApplication.py b/Demo/SingleApplication.py
similarity index 91%
rename from Demo/单实例应用/TestQSingleApplication.py
rename to Demo/SingleApplication.py
index 0c97573..d452e16 100644
--- a/Demo/单实例应用/TestQSingleApplication.py
+++ b/Demo/SingleApplication.py
@@ -11,7 +11,7 @@ Created on 2017年3月30日
'''
from PyQt5.QtWidgets import QTextEdit
-from Application import QSingleApplication # @UnresolvedImport
+from Lib.Application import QSingleApplication # @UnresolvedImport
__version__ = "0.0.1"
diff --git a/Demo/验证码控件/WidgetCode.py b/Demo/VerificationCode.py
similarity index 98%
rename from Demo/验证码控件/WidgetCode.py
rename to Demo/VerificationCode.py
index 1ce368e..df25ba7 100644
--- a/Demo/验证码控件/WidgetCode.py
+++ b/Demo/VerificationCode.py
@@ -114,7 +114,7 @@ if __name__ == "__main__":
from PyQt5.QtWidgets import QLineEdit
app = QApplication(sys.argv)
app.setApplicationName("Validate Code")
- QFontDatabase.addApplicationFont("itckrist.ttf")
+ QFontDatabase.addApplicationFont("Data/itckrist.ttf")
w = QWidget()
layout = QHBoxLayout(w)
diff --git a/Demo/简单的窗口贴边隐藏.py b/Demo/WeltHideWindow.py
similarity index 98%
rename from Demo/简单的窗口贴边隐藏.py
rename to Demo/WeltHideWindow.py
index 9542e27..73ba7b0 100644
--- a/Demo/简单的窗口贴边隐藏.py
+++ b/Demo/WeltHideWindow.py
@@ -7,7 +7,7 @@ Created on 2018年3月1日
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
@file: WeltHideWindow
-@description:
+@description: 简单的窗口贴边隐藏
"""
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton
diff --git a/Demo/右下角弹出框/WindowNotify.py b/Demo/WindowNotify.py
similarity index 98%
rename from Demo/右下角弹出框/WindowNotify.py
rename to Demo/WindowNotify.py
index 694cde2..408ff5e 100644
--- a/Demo/右下角弹出框/WindowNotify.py
+++ b/Demo/WindowNotify.py
@@ -7,14 +7,14 @@ Created on 2017年3月30日
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
@file: WindowNotify
-@description:
+@description: 右下角弹窗
'''
import webbrowser
from PyQt5.QtCore import Qt, QPropertyAnimation, QPoint, QTimer, pyqtSignal
from PyQt5.QtWidgets import QWidget, QPushButton
-from UiNotify import Ui_NotifyForm # @UnresolvedImport
+from Lib.UiNotify import Ui_NotifyForm # @UnresolvedImport
__version__ = "0.0.1"
diff --git a/Demo/人脸描点检测/README.md b/Demo/人脸描点检测/README.md
deleted file mode 100644
index ec96acb..0000000
--- a/Demo/人脸描点检测/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Opencv 人脸描点检测
-
-简单联系PyQt 结合 Opencv 进行人脸检测;
-由于直接在主线程中进行特征点获取,效率比较低
-
-### 依赖文件
- - [opencv](https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)
- - [numpy](https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy)
- - [dlib](http://dlib.net/)
- - [dlib-19.4.0.win32-py2.7.exe](dist/dlib-19.4.0.win32-py2.7.exe)
- - [dlib-19.4.0.win32-py3.4.exe](dist/dlib-19.4.0.win32-py3.4.exe)
- - [dlib-19.4.0.win32-py3.5.exe](dist/dlib-19.4.0.win32-py3.5.exe)
- - [shape-predictor-68-face-landmarks.dat.bz2](http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2)
-
-截图
-
-![1](ScreenShot/1.png)
\ No newline at end of file
diff --git a/Demo/人脸描点检测/data/.gitignore b/Demo/人脸描点检测/data/.gitignore
deleted file mode 100644
index d943463..0000000
--- a/Demo/人脸描点检测/data/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/shape_predictor_68_face_landmarks.dat
diff --git a/Demo/人脸描点检测/data/readme.txt b/Demo/人脸描点检测/data/readme.txt
deleted file mode 100644
index 46ff0aa..0000000
--- a/Demo/人脸描点检测/data/readme.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This folder contains various data that is used by cv libraries and/or demo applications.
-----------------------------------------------------------------------------------------
-
-haarcascades - the folder contains trained classifiers for detecting objects
- of a particular type, e.g. faces (frontal, profile), pedestrians etc.
- Some of the classifiers have a special license - please,
- look into the files for details.
diff --git a/Demo/单实例应用/README.md b/Demo/单实例应用/README.md
deleted file mode 100644
index 78d51ae..0000000
--- a/Demo/单实例应用/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-#单实例应用 Application
-
-###[Python3.4.4 or Python3.5][PyQt5]
-
- - 方法1:QSharedMemory
- - 方法2:QLocalSocket, QLocalServer
\ No newline at end of file
diff --git a/Demo/右下角弹出框/README.md b/Demo/右下角弹出框/README.md
deleted file mode 100644
index 116bed6..0000000
--- a/Demo/右下角弹出框/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# 右下角弹出框
-
-### [Python3.4.4 or Python3.5][PyQt5]
-
-# 截图
-![截图](ScreenShot/1.png)
-![截图](ScreenShot/2.png)
\ No newline at end of file
diff --git a/Demo/右下角弹出框/ScreenShot/1.png b/Demo/右下角弹出框/ScreenShot/1.png
deleted file mode 100644
index 5867c95..0000000
Binary files a/Demo/右下角弹出框/ScreenShot/1.png and /dev/null differ
diff --git a/Demo/右下角弹出框/ScreenShot/2.png b/Demo/右下角弹出框/ScreenShot/2.png
deleted file mode 100644
index 5fefe0d..0000000
Binary files a/Demo/右下角弹出框/ScreenShot/2.png and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Black.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Black.ttf
deleted file mode 100644
index d817cc2..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Black.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-BlackItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-BlackItalic.ttf
deleted file mode 100644
index 91a129b..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-BlackItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Bold.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Bold.ttf
deleted file mode 100644
index afca02a..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Bold.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-BoldCondensed.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-BoldCondensed.ttf
deleted file mode 100644
index f2d984d..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-BoldCondensed.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-BoldCondensedItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-BoldCondensedItalic.ttf
deleted file mode 100644
index b9c7fd5..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-BoldCondensedItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-BoldItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-BoldItalic.ttf
deleted file mode 100644
index 7e7ca95..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-BoldItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Condensed.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Condensed.ttf
deleted file mode 100644
index 970aff9..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Condensed.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-CondensedItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-CondensedItalic.ttf
deleted file mode 100644
index 0932979..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-CondensedItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Italic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Italic.ttf
deleted file mode 100644
index 437f8f1..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Italic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Light.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Light.ttf
deleted file mode 100644
index df13351..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Light.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-LightItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-LightItalic.ttf
deleted file mode 100644
index d7a9c17..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-LightItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Medium.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Medium.ttf
deleted file mode 100644
index 31d8570..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Medium.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-MediumItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-MediumItalic.ttf
deleted file mode 100644
index 0f27dc4..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-MediumItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Regular.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Regular.ttf
deleted file mode 100644
index 0ad1643..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Regular.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-Thin.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-Thin.ttf
deleted file mode 100644
index f917eed..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-Thin.ttf and /dev/null differ
diff --git a/Demo/字体测试/Fonts/Roboto/Roboto-ThinItalic.ttf b/Demo/字体测试/Fonts/Roboto/Roboto-ThinItalic.ttf
deleted file mode 100644
index ddb29db..0000000
Binary files a/Demo/字体测试/Fonts/Roboto/Roboto-ThinItalic.ttf and /dev/null differ
diff --git a/Demo/字体测试/TestFontRoboto.py b/Demo/字体测试/TestFontRoboto.py
deleted file mode 100644
index ed9b3a4..0000000
--- a/Demo/字体测试/TestFontRoboto.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-'''
-Created on 2017年3月30日
-@author: Irony."[讽刺]
-@site: https://pyqt5.com , https://github.com/892768447
-@email: 892768447@qq.com
-@file: TestFontRoboto
-@description:
-'''
-
-__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
-__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
-__Version__ = "Version 1.0"
-
-import glob
-import os
-import sys
-
-from PyQt5.QtGui import QFontDatabase, QFont
-from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QGridLayout
-
-
-app = QApplication(sys.argv)
-
-names = []
-
-for path in glob.glob("Fonts/Roboto/*.ttf"):
- print("path", os.path.abspath(path))
- names.append(os.path.basename(path.replace(".ttf", "")).replace("-", ""))
- fid = QFontDatabase.addApplicationFont(os.path.abspath(path))
- print("fid", fid)
- print(QFontDatabase.applicationFontFamilies(fid))
-
-w = QWidget()
-w.setWindowTitle("Roboto Fonts")
-layout = QGridLayout(w)
-
-print("names", names)
-for row in range(4):
- for col in range(4):
- layout.addWidget(QLabel(names[row * 4 + col],
- font=QFont(names[row * 4 + col], 26)),
- row, col, 1, 1)
-# print(row, col, row * 4 + col)
-
-w.show()
-sys.exit(app.exec_())
diff --git a/Demo/无边框自定义标题栏窗口/README.md b/Demo/无边框自定义标题栏窗口/README.md
deleted file mode 100644
index be3ae60..0000000
--- a/Demo/无边框自定义标题栏窗口/README.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# 无边框自定义标题栏窗口
-
-### [Python3.4.4 or Python3.5][PyQt5]
-
-原理说明:
-
- - 使用一个QWidget(FramelessWindow)作为父窗口, 一个TitleBar作为标题栏, 一个QWidget作为底部容器
- - 父窗口FramelessWindow设置为背景透明,但是需要绘制一定宽度的透明度很高的矩形边框用来接受鼠标事件(变形鼠标样式进行调整窗口大小)
- - TitleBar的最小化最大化关闭等按钮事件关联到父窗口里
- - TitleBar中的鼠标按下移动事件得到坐标也传递到父窗口调用move方法进行窗口移动
-
-使用方法:
-
-```
-class MainWindow(QWidget):
-
- def __init__(self, *args, **kwargs):
- super(MainWindow, self).__init__(*args, **kwargs)
- layout = QVBoxLayout(self, spacing=0)
- layout.setContentsMargins(0, 0, 0, 0)
- layout.addWidget(QPushButton('按钮', self))
- layout.addWidget(QTextEdit(self))
-
-
-# 样式
-StyleSheet = """
-/*标题栏*/
-TitleBar {
- background-color: rgb(54, 157, 180);
-}
-
-/*最小化最大化关闭按钮通用默认背景*/
-#buttonMinimum,#buttonMaximum,#buttonClose {
- border: none;
- background-color: rgb(54, 157, 180);
-}
-
-/*悬停*/
-#buttonMinimum:hover,#buttonMaximum:hover {
- background-color: rgb(48, 141, 162);
-}
-#buttonClose:hover {
- color: white;
- background-color: rgb(232, 17, 35);
-}
-
-/*鼠标按下不放*/
-#buttonMinimum:pressed,#buttonMaximum:pressed {
- background-color: rgb(44, 125, 144);
-}
-#buttonClose:pressed {
- color: white;
- background-color: rgb(161, 73, 92);
-}
-"""
-
-if __name__ == '__main__':
- import sys
- from PyQt5.QtWidgets import QApplication
- app = QApplication(sys.argv)
- app.setStyleSheet(StyleSheet)
- w = FramelessWindow()
- w.setWindowTitle('测试标题栏')
- w.setWindowIcon(QIcon('Qt.ico'))
- w.setWidget(MainWindow(w)) # 把自己的窗口添加进来
- w.show()
- sys.exit(app.exec_())
-
-```
-
-## 截图
-![截图](ScreenShot/1.gif)
-
-
-
-# 利用windows api
-
-原理说明:
-
- - 使用win32gui设置薄边框
- - 重写nativeEvent事件拦截边框的系统边框的显示,并返回各个方向
-
-## 截图
-![截图](ScreenShot/1.jpg)
-
-![截图](ScreenShot/2.jpg)
-
-![截图](ScreenShot/3.gif)
\ No newline at end of file
diff --git a/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小1.jpg b/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小1.jpg
deleted file mode 100644
index 7b8e24b..0000000
Binary files a/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小1.jpg and /dev/null differ
diff --git a/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小2.jpg b/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小2.jpg
deleted file mode 100644
index 3d99d64..0000000
Binary files a/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小2.jpg and /dev/null differ
diff --git a/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小3.gif b/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小3.gif
deleted file mode 100644
index 96170ba..0000000
Binary files a/Demo/无边框自定义标题栏窗口/ScreenShot/win无边框调整大小3.gif and /dev/null differ
diff --git a/Demo/消息提示/README.md b/Demo/消息提示/README.md
deleted file mode 100644
index 64e2e4c..0000000
--- a/Demo/消息提示/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# 消息提示
-
-### 简单的右下角气泡提示:
- - 1.使用QWidget包含一个QLabel,其中QWidget通过paintEvent绘制气泡形状
- - 2.使用QPropertyAnimation属性动画来移动气泡和改变气泡的透明度
- - 3.使用QParallelAnimationGroup动画组来同时运行两个动画
-
-见 [Issues#3](https://github.com/892768447/PyQt/issues/3)
-
-截图
-
-![1](ScreenShot/1.gif)
-
-
-### 右侧消息通知栏
-
-![2](ScreenShot/2.gif)
\ No newline at end of file
diff --git a/Demo/程序重启/README.md b/Demo/程序重启/README.md
deleted file mode 100644
index ce5c057..0000000
--- a/Demo/程序重启/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# 程序重启
-
-### [Python3.4.4 or Python3.5][PyQt5]
-
-# 截图
-![截图2](ScreenShot/1.png)
-
-# exe 下载
-[AutoRestart.exe](dist/AutoRestart.exe)
\ No newline at end of file
diff --git a/Demo/自定义属性测试/README.md b/Demo/自定义属性测试/README.md
deleted file mode 100644
index 1b58801..0000000
--- a/Demo/自定义属性测试/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# 自定义属性测试
-
-### [Python3.4.4 or Python3.5][PyQt5]
-
-# 截图
-![截图](ScreenShot/1.png)
\ No newline at end of file
diff --git a/Demo/调用截图dll(只能用32位)/README.md b/Demo/调用截图dll(只能用32位)/README.md
deleted file mode 100644
index d8f6b97..0000000
--- a/Demo/调用截图dll(只能用32位)/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# 只允许32位python调用 , 64位会报错
-
-![1](ScreenShot/1.gif)
\ No newline at end of file
diff --git a/Demo/验证码控件/README.md b/Demo/验证码控件/README.md
deleted file mode 100644
index bb1b63f..0000000
--- a/Demo/验证码控件/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# 验证码控件
-
-### [Python3.4.4 or Python3.5][PyQt5]
-
-# 截图
-![截图](ScreenShot/1.gif)
-
-# 说明
-2.更新为paintEvent方式,采用上下跳动
-1.参考网上一些代码,都是采用paintEvent绘制,这里采用QLabel显示html结合字体来显示文字
-然后在paintEvent中绘制噪点和线条
\ No newline at end of file
diff --git a/Demo/字体测试/TestFontAwesome.py b/QFont/AwesomeFont.py
similarity index 63%
rename from Demo/字体测试/TestFontAwesome.py
rename to QFont/AwesomeFont.py
index 8556893..7d8098d 100644
--- a/Demo/字体测试/TestFontAwesome.py
+++ b/QFont/AwesomeFont.py
@@ -6,7 +6,7 @@ Created on 2017年3月30日
@author: Irony."[讽刺]
@site: https://pyqt5.com , https://github.com/892768447
@email: 892768447@qq.com
-@file: TestFontAwesome
+@file: AwesomeFont
@description:
'''
@@ -14,15 +14,13 @@ __Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
__Version__ = "Version 1.0"
-import glob
-import os
import sys
from PyQt5.QtGui import QFontDatabase, QFont
-from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QGridLayout,\
- QScrollArea
+from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout,\
+ QScrollArea, QPushButton
-from FontAwesome import FontAwesomes
+from Lib.FontAwesome import FontAwesomes # @UnresolvedImport
class ScrollArea(QScrollArea):
@@ -30,7 +28,6 @@ class ScrollArea(QScrollArea):
def __init__(self):
super(ScrollArea, self).__init__()
self.setWindowTitle("FontAwesome Fonts")
- self.resize(800, 600)
self.window = QWidget(self)
self.setWidget(self.window)
@@ -41,18 +38,31 @@ class ScrollArea(QScrollArea):
for row in range(131):
for col in range(6):
# print(row, col, row * 6 + col)
- layout.addWidget(QLabel(": ".join(fonts[row * 6 + col]),
- self.window,
- font=QFont("FontAwesome", 14)),
- row, col, 1, 1)
+ layout.addWidget(QPushButton(
+ ": ".join(fonts[row * 6 + col]),
+ self.window,
+ minimumHeight=33,
+ font=QFont("FontAwesome", 14)),
+ row, col, 1, 1)
+
+ self.showMaximized()
def resizeEvent(self, event):
super(ScrollArea, self).resizeEvent(event)
self.window.resize(self.width(), self.height() * 4)
-app = QApplication(sys.argv)
-QFontDatabase.addApplicationFont("Fonts/FontAwesome/fontawesome-webfont.ttf")
+app = QApplication(sys.argv)
+app.setStyleSheet("""QPushButton:hover {
+ color: green;
+}
+QPushButton:pressed {
+ color: red;
+}
+""")
+
+QFontDatabase.addApplicationFont(
+ "Data/Fonts/fontawesome-webfont.ttf")
window = ScrollArea()
diff --git a/Demo/字体测试/Fonts/FontAwesome/fontawesome-webfont.ttf b/QFont/Data/Fonts/fontawesome-webfont.ttf
similarity index 100%
rename from Demo/字体测试/Fonts/FontAwesome/fontawesome-webfont.ttf
rename to QFont/Data/Fonts/fontawesome-webfont.ttf
diff --git a/Demo/字体测试/提取字符/cheatsheet.txt b/QFont/Data/提取字符/cheatsheet.txt
similarity index 100%
rename from Demo/字体测试/提取字符/cheatsheet.txt
rename to QFont/Data/提取字符/cheatsheet.txt
diff --git a/Demo/字体测试/提取字符/get.py b/QFont/Data/提取字符/get.py
similarity index 100%
rename from Demo/字体测试/提取字符/get.py
rename to QFont/Data/提取字符/get.py
diff --git a/Demo/字体测试/提取字符/result.txt b/QFont/Data/提取字符/result.txt
similarity index 100%
rename from Demo/字体测试/提取字符/result.txt
rename to QFont/Data/提取字符/result.txt
diff --git a/Demo/字体测试/FontAwesome.py b/QFont/Lib/FontAwesome.py
similarity index 98%
rename from Demo/字体测试/FontAwesome.py
rename to QFont/Lib/FontAwesome.py
index 49ddbbc..60ca9ca 100644
--- a/Demo/字体测试/FontAwesome.py
+++ b/QFont/Lib/FontAwesome.py
@@ -13,11 +13,17 @@ Created on 2017年3月30日
# 字体图标地址: http://fontawesome.io/icons/
# 字体字符地址: http://fontawesome.io/cheatsheet/
+
class FontAwesomes:
+ FA = None
+
@classmethod
def alls(cls):
- return {name: getattr(cls, name) for name in dir(cls) if name.startswith("fa_")}
+ if not cls.FA:
+ cls.FA = {name: getattr(cls, name)
+ for name in dir(cls) if name.startswith("fa_")}
+ return cls.FA
fa_500px = "\uf26e"
fa_address_book = "\uf2b9"
@@ -806,5 +812,6 @@ class FontAwesomes:
fa_youtube_play = "\uf16a"
fa_youtube_square = "\uf166"
-if __name__ =="__main__":
- print(len(FontAwesomes.alls()))
\ No newline at end of file
+
+if __name__ == "__main__":
+ print(len(FontAwesomes.alls()))
diff --git a/QProgressBar/__init__.py b/QFont/Lib/__init__.py
similarity index 100%
rename from QProgressBar/__init__.py
rename to QFont/Lib/__init__.py
diff --git a/Demo/字体测试/README.md b/QFont/README.md
similarity index 100%
rename from Demo/字体测试/README.md
rename to QFont/README.md
diff --git a/Demo/字体测试/ScreenShot/1.png b/QFont/ScreenShot/1.png
similarity index 100%
rename from Demo/字体测试/ScreenShot/1.png
rename to QFont/ScreenShot/1.png
diff --git a/Demo/字体测试/ScreenShot/2.png b/QFont/ScreenShot/2.png
similarity index 100%
rename from Demo/字体测试/ScreenShot/2.png
rename to QFont/ScreenShot/2.png
diff --git a/Demo/C和C++扩展/pydext/.vs/pydext/v15/.suo b/Test/C和C++扩展/pydext/.vs/pydext/v15/.suo
similarity index 100%
rename from Demo/C和C++扩展/pydext/.vs/pydext/v15/.suo
rename to Test/C和C++扩展/pydext/.vs/pydext/v15/.suo
diff --git a/Demo/C和C++扩展/pydext/.vs/pydext/v15/Browse.VC.db b/Test/C和C++扩展/pydext/.vs/pydext/v15/Browse.VC.db
similarity index 100%
rename from Demo/C和C++扩展/pydext/.vs/pydext/v15/Browse.VC.db
rename to Test/C和C++扩展/pydext/.vs/pydext/v15/Browse.VC.db
diff --git a/Demo/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/7828e06aa30c0d3c/PYDEXT.ipch b/Test/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/7828e06aa30c0d3c/PYDEXT.ipch
similarity index 100%
rename from Demo/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/7828e06aa30c0d3c/PYDEXT.ipch
rename to Test/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/7828e06aa30c0d3c/PYDEXT.ipch
diff --git a/Demo/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/d5916c660b4c4bac/PYDEXT.ipch b/Test/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/d5916c660b4c4bac/PYDEXT.ipch
similarity index 100%
rename from Demo/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/d5916c660b4c4bac/PYDEXT.ipch
rename to Test/C和C++扩展/pydext/.vs/pydext/v15/ipch/AutoPCH/d5916c660b4c4bac/PYDEXT.ipch
diff --git a/Demo/C和C++扩展/pydext/Release/pydext.exp b/Test/C和C++扩展/pydext/Release/pydext.exp
similarity index 100%
rename from Demo/C和C++扩展/pydext/Release/pydext.exp
rename to Test/C和C++扩展/pydext/Release/pydext.exp
diff --git a/Demo/C和C++扩展/pydext/Release/pydext.iobj b/Test/C和C++扩展/pydext/Release/pydext.iobj
similarity index 100%
rename from Demo/C和C++扩展/pydext/Release/pydext.iobj
rename to Test/C和C++扩展/pydext/Release/pydext.iobj
diff --git a/Demo/C和C++扩展/pydext/Release/pydext.ipdb b/Test/C和C++扩展/pydext/Release/pydext.ipdb
similarity index 100%
rename from Demo/C和C++扩展/pydext/Release/pydext.ipdb
rename to Test/C和C++扩展/pydext/Release/pydext.ipdb
diff --git a/Demo/C和C++扩展/pydext/Release/pydext.lib b/Test/C和C++扩展/pydext/Release/pydext.lib
similarity index 100%
rename from Demo/C和C++扩展/pydext/Release/pydext.lib
rename to Test/C和C++扩展/pydext/Release/pydext.lib
diff --git a/Demo/C和C++扩展/pydext/Release/pydext.pdb b/Test/C和C++扩展/pydext/Release/pydext.pdb
similarity index 100%
rename from Demo/C和C++扩展/pydext/Release/pydext.pdb
rename to Test/C和C++扩展/pydext/Release/pydext.pdb
diff --git a/Demo/C和C++扩展/pydext/Release/pydext.pyd b/Test/C和C++扩展/pydext/Release/pydext.pyd
similarity index 100%
rename from Demo/C和C++扩展/pydext/Release/pydext.pyd
rename to Test/C和C++扩展/pydext/Release/pydext.pyd
diff --git a/Demo/C和C++扩展/pydext/pydext.sln b/Test/C和C++扩展/pydext/pydext.sln
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext.sln
rename to Test/C和C++扩展/pydext/pydext.sln
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.obj b/Test/C和C++扩展/pydext/pydext/Release/pydext.obj
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.obj
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.obj
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.command.1.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.command.1.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.command.1.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.command.1.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.read.1.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.read.1.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.read.1.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.read.1.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.write.1.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.write.1.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.write.1.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/CL.write.1.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.command.1.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.command.1.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.command.1.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.command.1.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.read.1.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.read.1.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.read.1.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.read.1.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.write.1.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.write.1.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.write.1.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/link.write.1.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.lastbuildstate b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.lastbuildstate
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.lastbuildstate
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.lastbuildstate
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.write.1u.tlog b/Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.write.1u.tlog
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.write.1u.tlog
rename to Test/C和C++扩展/pydext/pydext/Release/pydext.tlog/pydext.write.1u.tlog
diff --git a/Demo/C和C++扩展/pydext/pydext/Release/vc141.pdb b/Test/C和C++扩展/pydext/pydext/Release/vc141.pdb
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/Release/vc141.pdb
rename to Test/C和C++扩展/pydext/pydext/Release/vc141.pdb
diff --git a/Demo/C和C++扩展/pydext/pydext/build.bat b/Test/C和C++扩展/pydext/pydext/build.bat
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/build.bat
rename to Test/C和C++扩展/pydext/pydext/build.bat
diff --git a/Demo/C和C++扩展/pydext/pydext/pydext.c b/Test/C和C++扩展/pydext/pydext/pydext.c
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/pydext.c
rename to Test/C和C++扩展/pydext/pydext/pydext.c
diff --git a/Demo/C和C++扩展/pydext/pydext/pydext.vcxproj b/Test/C和C++扩展/pydext/pydext/pydext.vcxproj
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/pydext.vcxproj
rename to Test/C和C++扩展/pydext/pydext/pydext.vcxproj
diff --git a/Demo/C和C++扩展/pydext/pydext/pydext.vcxproj.filters b/Test/C和C++扩展/pydext/pydext/pydext.vcxproj.filters
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/pydext.vcxproj.filters
rename to Test/C和C++扩展/pydext/pydext/pydext.vcxproj.filters
diff --git a/Demo/C和C++扩展/pydext/pydext/pydext.vcxproj.user b/Test/C和C++扩展/pydext/pydext/pydext.vcxproj.user
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/pydext.vcxproj.user
rename to Test/C和C++扩展/pydext/pydext/pydext.vcxproj.user
diff --git a/Demo/C和C++扩展/pydext/pydext/setup.py b/Test/C和C++扩展/pydext/pydext/setup.py
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/setup.py
rename to Test/C和C++扩展/pydext/pydext/setup.py
diff --git a/Demo/C和C++扩展/pydext/pydext/test.py b/Test/C和C++扩展/pydext/pydext/test.py
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/test.py
rename to Test/C和C++扩展/pydext/pydext/test.py
diff --git a/Demo/C和C++扩展/pydext/pydext/说明.txt b/Test/C和C++扩展/pydext/pydext/说明.txt
similarity index 100%
rename from Demo/C和C++扩展/pydext/pydext/说明.txt
rename to Test/C和C++扩展/pydext/pydext/说明.txt
diff --git a/Demo/C和C++扩展/pydext/test.py b/Test/C和C++扩展/pydext/test.py
similarity index 100%
rename from Demo/C和C++扩展/pydext/test.py
rename to Test/C和C++扩展/pydext/test.py
diff --git a/Demo/C和C++扩展/pydext/说明.txt b/Test/C和C++扩展/pydext/说明.txt
similarity index 100%
rename from Demo/C和C++扩展/pydext/说明.txt
rename to Test/C和C++扩展/pydext/说明.txt
diff --git a/Demo/C和C++扩展/pyx和c++/CalSpecSpea.cpp b/Test/C和C++扩展/pyx和c++/CalSpecSpea.cpp
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/CalSpecSpea.cpp
rename to Test/C和C++扩展/pyx和c++/CalSpecSpea.cpp
diff --git a/Demo/C和C++扩展/pyx和c++/CalSpecSpea.pyx b/Test/C和C++扩展/pyx和c++/CalSpecSpea.pyx
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/CalSpecSpea.pyx
rename to Test/C和C++扩展/pyx和c++/CalSpecSpea.pyx
diff --git a/Demo/C和C++扩展/pyx和c++/CalSpecSpeaLib.cpp b/Test/C和C++扩展/pyx和c++/CalSpecSpeaLib.cpp
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/CalSpecSpeaLib.cpp
rename to Test/C和C++扩展/pyx和c++/CalSpecSpeaLib.cpp
diff --git a/Demo/C和C++扩展/pyx和c++/CalSpecSpeaLib.h b/Test/C和C++扩展/pyx和c++/CalSpecSpeaLib.h
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/CalSpecSpeaLib.h
rename to Test/C和C++扩展/pyx和c++/CalSpecSpeaLib.h
diff --git a/Demo/C和C++扩展/pyx和c++/build.bat b/Test/C和C++扩展/pyx和c++/build.bat
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/build.bat
rename to Test/C和C++扩展/pyx和c++/build.bat
diff --git a/Demo/C和C++扩展/pyx和c++/hf_acc.txt b/Test/C和C++扩展/pyx和c++/hf_acc.txt
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/hf_acc.txt
rename to Test/C和C++扩展/pyx和c++/hf_acc.txt
diff --git a/Demo/C和C++扩展/pyx和c++/setup.py b/Test/C和C++扩展/pyx和c++/setup.py
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/setup.py
rename to Test/C和C++扩展/pyx和c++/setup.py
diff --git a/Demo/C和C++扩展/pyx和c++/test.py b/Test/C和C++扩展/pyx和c++/test.py
similarity index 100%
rename from Demo/C和C++扩展/pyx和c++/test.py
rename to Test/C和C++扩展/pyx和c++/test.py
diff --git a/Demo/C和C++扩展/py转pyd/build.bat b/Test/C和C++扩展/py转pyd/build.bat
similarity index 100%
rename from Demo/C和C++扩展/py转pyd/build.bat
rename to Test/C和C++扩展/py转pyd/build.bat
diff --git a/Demo/C和C++扩展/py转pyd/pydmod.c b/Test/C和C++扩展/py转pyd/pydmod.c
similarity index 100%
rename from Demo/C和C++扩展/py转pyd/pydmod.c
rename to Test/C和C++扩展/py转pyd/pydmod.c
diff --git a/Demo/C和C++扩展/py转pyd/pydmod.py b/Test/C和C++扩展/py转pyd/pydmod.py
similarity index 100%
rename from Demo/C和C++扩展/py转pyd/pydmod.py
rename to Test/C和C++扩展/py转pyd/pydmod.py
diff --git a/Demo/C和C++扩展/py转pyd/setup.py b/Test/C和C++扩展/py转pyd/setup.py
similarity index 100%
rename from Demo/C和C++扩展/py转pyd/setup.py
rename to Test/C和C++扩展/py转pyd/setup.py
diff --git a/Demo/C和C++扩展/py转pyd/test.py b/Test/C和C++扩展/py转pyd/test.py
similarity index 100%
rename from Demo/C和C++扩展/py转pyd/test.py
rename to Test/C和C++扩展/py转pyd/test.py
diff --git a/Demo/全局热键/HotKey.py b/Test/全局热键/HotKey.py
similarity index 100%
rename from Demo/全局热键/HotKey.py
rename to Test/全局热键/HotKey.py
diff --git a/Demo/全局热键/README.md b/Test/全局热键/README.md
similarity index 100%
rename from Demo/全局热键/README.md
rename to Test/全局热键/README.md
diff --git a/Demo/全局热键/ScreenShot/1.gif b/Test/全局热键/ScreenShot/1.gif
similarity index 100%
rename from Demo/全局热键/ScreenShot/1.gif
rename to Test/全局热键/ScreenShot/1.gif
diff --git a/Demo/全局热键/requirements.txt b/Test/全局热键/requirements.txt
similarity index 100%
rename from Demo/全局热键/requirements.txt
rename to Test/全局热键/requirements.txt
diff --git a/Demo/自动更新/README.md b/Test/自动更新/README.md
similarity index 100%
rename from Demo/自动更新/README.md
rename to Test/自动更新/README.md
diff --git a/Test/自动更新/mylibs/__init__.py b/Test/自动更新/mylibs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Demo/自动更新/mylibs/testlibs.py b/Test/自动更新/mylibs/testlibs.py
similarity index 100%
rename from Demo/自动更新/mylibs/testlibs.py
rename to Test/自动更新/mylibs/testlibs.py
diff --git a/Demo/自动更新/setup.py b/Test/自动更新/setup.py
similarity index 100%
rename from Demo/自动更新/setup.py
rename to Test/自动更新/setup.py
diff --git a/Demo/自动更新/test.py b/Test/自动更新/test.py
similarity index 100%
rename from Demo/自动更新/test.py
rename to Test/自动更新/test.py
diff --git a/Demo/自动更新/编译.bat b/Test/自动更新/编译.bat
similarity index 100%
rename from Demo/自动更新/编译.bat
rename to Test/自动更新/编译.bat
diff --git a/Demo/自定义import/IronyImporter.py b/Test/自定义import/IronyImporter.py
similarity index 100%
rename from Demo/自定义import/IronyImporter.py
rename to Test/自定义import/IronyImporter.py
diff --git a/Demo/自定义import/README.md b/Test/自定义import/README.md
similarity index 100%
rename from Demo/自定义import/README.md
rename to Test/自定义import/README.md
diff --git a/Demo/自定义import/ScreenShot/1.png b/Test/自定义import/ScreenShot/1.png
similarity index 100%
rename from Demo/自定义import/ScreenShot/1.png
rename to Test/自定义import/ScreenShot/1.png
diff --git a/Demo/自定义import/ScreenShot/2.png b/Test/自定义import/ScreenShot/2.png
similarity index 100%
rename from Demo/自定义import/ScreenShot/2.png
rename to Test/自定义import/ScreenShot/2.png
diff --git a/Demo/自定义import/ScreenShot/3.png b/Test/自定义import/ScreenShot/3.png
similarity index 100%
rename from Demo/自定义import/ScreenShot/3.png
rename to Test/自定义import/ScreenShot/3.png
diff --git a/Demo/自定义import/build.py b/Test/自定义import/build.py
similarity index 100%
rename from Demo/自定义import/build.py
rename to Test/自定义import/build.py
diff --git a/Demo/自定义import/main.py b/Test/自定义import/main.py
similarity index 100%
rename from Demo/自定义import/main.py
rename to Test/自定义import/main.py
diff --git a/Demo/自定义import/src/test.py b/Test/自定义import/src/test.py
similarity index 100%
rename from Demo/自定义import/src/test.py
rename to Test/自定义import/src/test.py
diff --git a/Demo/自定义import/test.irony b/Test/自定义import/test.irony
similarity index 100%
rename from Demo/自定义import/test.irony
rename to Test/自定义import/test.irony
diff --git a/Demo/自定义import/xxtea.pyd b/Test/自定义import/xxtea.pyd
similarity index 100%
rename from Demo/自定义import/xxtea.pyd
rename to Test/自定义import/xxtea.pyd