├── __init__.py
├── docs
└── images
│ ├── hum.png
│ ├── 1kHz_Analog.png
│ ├── 1kHz_Combined.png
│ ├── 1kHz_Digitized.png
│ └── D43-Screenshot.png
├── icons
├── D43-Icon.png
├── mac
│ ├── D43.icns
│ ├── D43.png
│ └── generate_icns.sh
└── windows
│ └── D43-Icon.ico
├── .ropeproject
├── history
├── objectdb
└── config.py
├── requirements.txt
├── CameraMount
├── bezel_new.png
├── camera_finished_mm.stl
├── cameramount_tubedrillingpattern.svg
├── bezel.svg
└── cameramount.svg
├── .eric6project
├── project-apis.db
├── DigitalD43.e6t
└── DigitalD43.e4q
├── D43_Resources.qrc
├── Forms
├── __pycache__
│ ├── Ui_Main.cpython-36.pyc
│ ├── WebCamView.cpython-36.pyc
│ └── Ui_WebCamView.cpython-36.pyc
├── Cursor_Enums.py
├── Cursor.py
├── Grid.ui
├── Ui_Grid.py
├── WebCamView.ui
├── WebCamView.py
├── Ui_WebCamView.py
├── Main.ui
├── Grid.py
├── Ui_Main.py
├── DigitizerView.py
├── CursorControl.py
├── Controls.py
├── Ui_Controls.py
└── icons_rc.py
├── D43.py
├── README.md
├── .gitignore
├── .github
└── workflows
│ └── build.yml
├── DigitalD43.e4p
└── LICENSE
/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/images/hum.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/hum.png
--------------------------------------------------------------------------------
/icons/D43-Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/D43-Icon.png
--------------------------------------------------------------------------------
/icons/mac/D43.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/mac/D43.icns
--------------------------------------------------------------------------------
/icons/mac/D43.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/mac/D43.png
--------------------------------------------------------------------------------
/.ropeproject/history:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/.ropeproject/history
--------------------------------------------------------------------------------
/.ropeproject/objectdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/.ropeproject/objectdb
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | quantiphy
2 | numpy
3 | PyQt5
4 | opencv-python-headless
5 | pyinstaller
6 |
--------------------------------------------------------------------------------
/CameraMount/bezel_new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/CameraMount/bezel_new.png
--------------------------------------------------------------------------------
/icons/windows/D43-Icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/windows/D43-Icon.ico
--------------------------------------------------------------------------------
/.eric6project/project-apis.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/.eric6project/project-apis.db
--------------------------------------------------------------------------------
/docs/images/1kHz_Analog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/1kHz_Analog.png
--------------------------------------------------------------------------------
/docs/images/1kHz_Combined.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/1kHz_Combined.png
--------------------------------------------------------------------------------
/docs/images/1kHz_Digitized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/1kHz_Digitized.png
--------------------------------------------------------------------------------
/docs/images/D43-Screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/D43-Screenshot.png
--------------------------------------------------------------------------------
/CameraMount/camera_finished_mm.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/CameraMount/camera_finished_mm.stl
--------------------------------------------------------------------------------
/D43_Resources.qrc:
--------------------------------------------------------------------------------
1 |
2 |
3 | icons/D43-Icon.png
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Forms/__pycache__/Ui_Main.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/Forms/__pycache__/Ui_Main.cpython-36.pyc
--------------------------------------------------------------------------------
/Forms/__pycache__/WebCamView.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/Forms/__pycache__/WebCamView.cpython-36.pyc
--------------------------------------------------------------------------------
/Forms/__pycache__/Ui_WebCamView.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JosephEoff/D43/HEAD/Forms/__pycache__/Ui_WebCamView.cpython-36.pyc
--------------------------------------------------------------------------------
/Forms/Cursor_Enums.py:
--------------------------------------------------------------------------------
1 | from enum import Enum
2 |
3 | class CursorType(Enum):
4 | vertical = 1
5 | horizontal = 2
6 | zeroline = 3
7 |
8 | class CursorStyle(Enum):
9 | single = 1
10 | barred = 2
11 |
12 |
--------------------------------------------------------------------------------
/.eric6project/DigitalD43.e6t:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.eric6project/DigitalD43.e4q:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/D43.py:
--------------------------------------------------------------------------------
1 | from PyQt5 import QtWidgets
2 | from PyQt5.QtCore import QCoreApplication
3 | from Forms.Ui_Main import Ui_MainWindow
4 |
5 | if __name__ == "__main__":
6 | QCoreApplication.setOrganizationName("JRE")
7 | QCoreApplication.setApplicationName("DigitalD43")
8 | QCoreApplication.setApplicationVersion('1.0.0')
9 | import sys
10 | app = QtWidgets.QApplication(sys.argv)
11 | MainWindow = QtWidgets.QMainWindow()
12 | ui = Ui_MainWindow()
13 | ui.setupUi(MainWindow)
14 | MainWindow.show()
15 | sys.exit(app.exec_())
16 |
--------------------------------------------------------------------------------
/icons/mac/generate_icns.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | mkdir $1.iconset
4 | convert $1.png -resize 16x16 $1.iconset/icon_16x16.png
5 | #convert $1.png -resize 32x32 $1.iconset/icon_16x16@2x.png
6 | convert $1.png -resize 32x32 $1.iconset/icon_32x32.png
7 | #convert $1.png -resize 64x64 $1.iconset/icon_32x32@2x.png
8 | convert $1.png -resize 128x128 $1.iconset/icon_128x128.png
9 | #convert $1.png -resize 256x256 $1.iconset/icon_128x128@2x.png
10 | convert $1.png -resize 256x256 $1.iconset/icon_256x256.png
11 | #convert $1.png -resize 512x512 $1.iconset/icon_256x256@2x.png
12 | convert $1.png -resize 512x512 $1.iconset/icon_512x512.png
13 | cp $1.png $1.iconset/icon_1024x1024.png
14 | png2icns $1.icns $1.iconset/icon_*.png
15 |
16 | rm -R $1.iconset
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | Digital D43 - A digital camera for analog oscilloscopes
3 |
4 | Make crisp images of your analog oscilloscope for documenting or sharing your experiments.
5 |
6 | 
7 |
8 | View the trace live:
9 |
10 | 
11 |
12 | Or digitized:
13 |
14 | 
15 |
16 | Or combined:
17 |
18 | 
19 |
20 | Use the onscreen cursors to measure voltage and frequency.
21 |
22 | You can download a pre-compiled binary [here.](https://github.com/JosephEoff/D43/releases)
23 |
24 | See the [Wiki](https://github.com/JosephEoff/D43/wiki) for a description of the manual installation and the setup of the D43 software.
25 |
26 | You will need Python 3.6 or higher, the Python OpenCV2 library, PyQt5, Numpy, and Quantiphy installed.
27 |
--------------------------------------------------------------------------------
/Forms/Cursor.py:
--------------------------------------------------------------------------------
1 | from PyQt5.QtGui import QColor
2 |
3 | from Forms.Cursor_Enums import CursorType
4 | from Forms.Cursor_Enums import CursorStyle
5 |
6 | class Cursor():
7 | def __init__(self, position, cursorColor, cursorBarColor, cursorType = CursorType.horizontal, cursorStyle = CursorStyle.barred ):
8 | self.cursorType = cursorType
9 | self.cursorStyle = cursorStyle
10 | self.cursorPosition = position
11 |
12 | self.cursorColor = QColor()
13 | self.cursorBarColor = QColor()
14 | self.cursorColor = cursorColor
15 | self.cursorBarColor = cursorBarColor
16 |
17 |
18 | def setCursorPosition(self, newPosition):
19 | self.cursorPosition = newPosition
20 |
21 | def getCursorPosition(self):
22 | return self.cursorPosition
23 |
24 | def getStyle(self):
25 | return self.cursorStyle
26 |
27 | def getType(self):
28 | return self.cursorType
29 |
30 | def getColor(self):
31 | return self.cursorColor
32 |
33 | def getBarColor(self):
34 | return self.cursorBarColor
35 |
--------------------------------------------------------------------------------
/Forms/Grid.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | Grid
4 |
5 |
6 |
7 | 0
8 | 0
9 | 102
10 | 78
11 |
12 |
13 |
14 |
15 | 0
16 | 0
17 |
18 |
19 |
20 |
21 | 50
22 | 50
23 |
24 |
25 |
26 | Form
27 |
28 |
29 |
30 | 0
31 |
32 |
33 | 0
34 |
35 |
36 | 0
37 |
38 |
39 | 0
40 |
41 |
42 | 0
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/Forms/Ui_Grid.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/Grid.ui'
4 | #
5 | # Created by: PyQt5 UI code generator 5.10.1
6 | #
7 | # WARNING! All changes made in this file will be lost!
8 |
9 | from PyQt5 import QtCore, QtGui, QtWidgets
10 |
11 | class Ui_Grid(object):
12 | def setupUi(self, Grid):
13 | Grid.setObjectName("Grid")
14 | Grid.resize(102, 78)
15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
16 | sizePolicy.setHorizontalStretch(0)
17 | sizePolicy.setVerticalStretch(0)
18 | sizePolicy.setHeightForWidth(Grid.sizePolicy().hasHeightForWidth())
19 | Grid.setSizePolicy(sizePolicy)
20 | Grid.setMinimumSize(QtCore.QSize(50, 50))
21 | self.gridLayout = QtWidgets.QGridLayout(Grid)
22 | self.gridLayout.setContentsMargins(0, 0, 0, 0)
23 | self.gridLayout.setSpacing(0)
24 | self.gridLayout.setObjectName("gridLayout")
25 |
26 | self.retranslateUi(Grid)
27 | QtCore.QMetaObject.connectSlotsByName(Grid)
28 |
29 | def retranslateUi(self, Grid):
30 | _translate = QtCore.QCoreApplication.translate
31 | Grid.setWindowTitle(_translate("Grid", "Form"))
32 |
33 |
34 | if __name__ == "__main__":
35 | import sys
36 | app = QtWidgets.QApplication(sys.argv)
37 | Grid = QtWidgets.QWidget()
38 | ui = Ui_Grid()
39 | ui.setupUi(Grid)
40 | Grid.show()
41 | sys.exit(app.exec_())
42 |
43 |
--------------------------------------------------------------------------------
/Forms/WebCamView.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | WebCamView
4 |
5 |
6 |
7 | 0
8 | 0
9 | 102
10 | 120
11 |
12 |
13 |
14 |
15 | 0
16 | 0
17 |
18 |
19 |
20 |
21 | 50
22 | 50
23 |
24 |
25 |
26 | Form
27 |
28 |
29 |
30 | 0
31 |
32 |
33 | 0
34 |
35 |
36 | 0
37 |
38 |
39 | 0
40 |
41 |
42 | 0
43 |
44 | -
45 |
46 |
47 |
48 | 0
49 | 0
50 |
51 |
52 |
53 |
54 | 50
55 | 50
56 |
57 |
58 |
59 | background-color: rgba(0, 0, 0, 0);
60 |
61 |
62 | QFrame::NoFrame
63 |
64 |
65 | QFrame::Plain
66 |
67 |
68 | 0
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | .hypothesis/
51 | .pytest_cache/
52 |
53 | # Translations
54 | *.mo
55 | *.pot
56 |
57 | # Django stuff:
58 | *.log
59 | local_settings.py
60 | db.sqlite3
61 | db.sqlite3-journal
62 |
63 | # Flask stuff:
64 | instance/
65 | .webassets-cache
66 |
67 | # Scrapy stuff:
68 | .scrapy
69 |
70 | # Sphinx documentation
71 | docs/_build/
72 |
73 | # PyBuilder
74 | target/
75 |
76 | # Jupyter Notebook
77 | .ipynb_checkpoints
78 |
79 | # IPython
80 | profile_default/
81 | ipython_config.py
82 |
83 | # pyenv
84 | .python-version
85 |
86 | # pipenv
87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
89 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
90 | # install all needed dependencies.
91 | #Pipfile.lock
92 |
93 | # celery beat schedule file
94 | celerybeat-schedule
95 |
96 | # SageMath parsed files
97 | *.sage.py
98 |
99 | # Environments
100 | .env
101 | .venv
102 | env/
103 | venv/
104 | ENV/
105 | env.bak/
106 | venv.bak/
107 |
108 | # Spyder project settings
109 | .spyderproject
110 | .spyproject
111 |
112 | # Rope project settings
113 | .ropeproject
114 |
115 | # mkdocs documentation
116 | /site
117 |
118 | # mypy
119 | .mypy_cache/
120 | .dmypy.json
121 | dmypy.json
122 |
123 | # Pyre type checker
124 | .pyre/
125 |
--------------------------------------------------------------------------------
/Forms/WebCamView.py:
--------------------------------------------------------------------------------
1 | from PyQt5 import QtGui
2 | from PyQt5.QtWidgets import QWidget
3 | from Forms.Ui_WebCamView import Ui_WebCamView
4 | import numpy as np
5 | import cv2
6 |
7 | class WebCamView(QWidget, Ui_WebCamView):
8 | def __init__(self, parent):
9 | super(QWidget, self).__init__()
10 |
11 | self.setupUi(self)
12 | self.transparentThreshold = 0
13 | self.thresholdMode = cv2.THRESH_BINARY
14 | self.rescaled=False
15 | self.persist = False
16 | self.persistImage = None
17 | self.liveViewOn = True
18 |
19 | def clearImage(self):
20 | self.viewer.clear()
21 |
22 | def setPersist(self, persistOn):
23 | self.persist = persistOn
24 | self.persistImage = None
25 |
26 | def setLiveViewOn(self, On):
27 | self.liveViewOn = On
28 |
29 | def getCurrentImage(self):
30 | return self.persistImage
31 |
32 | def setImage(self, scopeImage):
33 | grayframe = cv2.cvtColor(scopeImage, cv2.COLOR_RGB2GRAY)
34 | ret, alpha = cv2.threshold(grayframe, self.transparentThreshold, 255, self.thresholdMode)
35 |
36 | blue = scopeImage[:, :, 0]
37 | green = scopeImage[:, :, 1]
38 | red = scopeImage[:, :, 2]
39 |
40 | rgba = [blue,green,red, alpha]
41 | scopeImage= cv2.merge(rgba,4)
42 | if self.persist:
43 | scopeImage = self.doImagePersistance(scopeImage, green)
44 |
45 | self.persistImage = scopeImage
46 | if not self.liveViewOn:
47 | return
48 | img = QtGui.QImage(scopeImage, scopeImage.shape[1], scopeImage.shape[0], QtGui.QImage.Format_RGBA8888)
49 | pix = QtGui.QPixmap.fromImage(img)
50 | self.viewer.setPixmap(pix)
51 |
52 | def doImagePersistance(self, scopeImage, green):
53 | if self.persistImage is None:
54 | self.persistImage = scopeImage
55 | return scopeImage
56 |
57 | if self.persistImage.shape != scopeImage.shape:
58 | self.persistImage = scopeImage
59 |
60 | threshold = np.amax(self.persistImage[:, :, 1]) * 0.8
61 | bright = np.where(green.max(0) >= threshold)[0]
62 | if bright.size>0:
63 | for x in np.nditer(bright):
64 | self.persistImage[:, x] = scopeImage[:, x]
65 |
66 | return self.persistImage
67 |
68 |
69 |
--------------------------------------------------------------------------------
/Forms/Ui_WebCamView.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/WebCamView.ui'
4 | #
5 | # Created by: PyQt5 UI code generator 5.10.1
6 | #
7 | # WARNING! All changes made in this file will be lost!
8 |
9 | from PyQt5 import QtCore, QtGui, QtWidgets
10 |
11 | class Ui_WebCamView(object):
12 | def setupUi(self, WebCamView):
13 | WebCamView.setObjectName("WebCamView")
14 | WebCamView.resize(102, 120)
15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
16 | sizePolicy.setHorizontalStretch(0)
17 | sizePolicy.setVerticalStretch(0)
18 | sizePolicy.setHeightForWidth(WebCamView.sizePolicy().hasHeightForWidth())
19 | WebCamView.setSizePolicy(sizePolicy)
20 | WebCamView.setMinimumSize(QtCore.QSize(50, 50))
21 | self.gridLayout = QtWidgets.QGridLayout(WebCamView)
22 | self.gridLayout.setContentsMargins(0, 0, 0, 0)
23 | self.gridLayout.setSpacing(0)
24 | self.gridLayout.setObjectName("gridLayout")
25 | self.viewer = QtWidgets.QLabel(WebCamView)
26 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
27 | sizePolicy.setHorizontalStretch(0)
28 | sizePolicy.setVerticalStretch(0)
29 | sizePolicy.setHeightForWidth(self.viewer.sizePolicy().hasHeightForWidth())
30 | self.viewer.setSizePolicy(sizePolicy)
31 | self.viewer.setMinimumSize(QtCore.QSize(50, 50))
32 | self.viewer.setStyleSheet("background-color: rgba(0, 0, 0, 0);")
33 | self.viewer.setFrameShape(QtWidgets.QFrame.NoFrame)
34 | self.viewer.setFrameShadow(QtWidgets.QFrame.Plain)
35 | self.viewer.setLineWidth(0)
36 | self.viewer.setText("")
37 | self.viewer.setObjectName("viewer")
38 | self.gridLayout.addWidget(self.viewer, 0, 0, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
39 |
40 | self.retranslateUi(WebCamView)
41 | QtCore.QMetaObject.connectSlotsByName(WebCamView)
42 |
43 | def retranslateUi(self, WebCamView):
44 | _translate = QtCore.QCoreApplication.translate
45 | WebCamView.setWindowTitle(_translate("WebCamView", "Form"))
46 |
47 |
48 | if __name__ == "__main__":
49 | import sys
50 | app = QtWidgets.QApplication(sys.argv)
51 | WebCamView = QtWidgets.QWidget()
52 | ui = Ui_WebCamView()
53 | ui.setupUi(WebCamView)
54 | WebCamView.show()
55 | sys.exit(app.exec_())
56 |
57 |
--------------------------------------------------------------------------------
/Forms/Main.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | MainWindow
4 |
5 |
6 |
7 | 0
8 | 0
9 | 293
10 | 215
11 |
12 |
13 |
14 |
15 | 0
16 | 0
17 |
18 |
19 |
20 | D43 - Oscilloscope Camera
21 |
22 |
23 |
24 | :/icons/D43-Icon.png:/icons/D43-Icon.png
25 |
26 |
27 |
28 |
29 |
30 | false
31 |
32 |
33 | QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks
34 |
35 |
36 |
37 |
38 | 0
39 | 0
40 |
41 |
42 |
43 |
44 | QLayout::SetFixedSize
45 |
46 |
47 | 0
48 |
49 |
50 | 0
51 |
52 |
53 | 0
54 |
55 |
56 | 0
57 |
58 |
59 | 0
60 |
61 | -
62 |
63 |
64 |
65 | 0
66 | 0
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | Controls
77 | QWidget
78 |
79 | 1
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/Forms/Grid.py:
--------------------------------------------------------------------------------
1 | from PyQt5.QtGui import QPainter, QColor, QPen, QPixmap
2 | from PyQt5.QtWidgets import QWidget
3 | from PyQt5.QtCore import Qt
4 |
5 | from Forms.Ui_WebCamView import Ui_WebCamView
6 |
7 | class Grid(QWidget, Ui_WebCamView):
8 | def __init__(self, parent):
9 | super(QWidget, self).__init__()
10 |
11 | self.setupUi(self)
12 | self.pixelsPercm_H=30
13 | self.pixelsPercm_V=30
14 | self.gridWidth = 100
15 | self.gridHeight = 100
16 | self.grid_X1 = 0
17 | self.grid_X2 = 100
18 | self.grid_Y1 = 0
19 | self.grid_Y2 = 100
20 |
21 | def paintEvent(self, event):
22 | self.drawGrid()
23 |
24 | def drawGrid(self):
25 | gridPixmap = QPixmap(self.gridWidth + 1, self.gridHeight)
26 | gridPixmap.fill(QColor(255, 255, 255, 0))
27 |
28 | qp = QPainter()
29 | qp.begin(gridPixmap)
30 | pen = QPen(QColor(255, 120, 0, 100), 1, Qt.SolidLine)
31 | qp.setPen(pen)
32 | cwidth= (self.grid_X1 + self.grid_X2)/2
33 | cheight= (self.grid_Y1+self.grid_Y2)/2
34 | hcount=cwidth/self.pixelsPercm_H + 1
35 | vcount=cheight/self.pixelsPercm_V + 1
36 |
37 | for n in range(int(hcount+0.5)):
38 | xstep= n*self.pixelsPercm_H
39 | qp.drawLine(cwidth+xstep, 0, cwidth+xstep, self.gridHeight)
40 | if n>0:
41 | qp.drawLine(cwidth-xstep, 0, cwidth-xstep, self.gridHeight)
42 |
43 | for n in range(int(vcount+0.5)):
44 | ystep= n*self.pixelsPercm_H
45 | qp.drawLine(0, cheight+ystep, self.gridWidth , cheight+ystep)
46 | if n>0:
47 | qp.drawLine(0, cheight-ystep, self.gridWidth , cheight-ystep)
48 |
49 | qp.end()
50 | self.viewer.setPixmap(gridPixmap)
51 |
52 | def updateGridSize(self, width, height):
53 | if self.gridHeight == height and self.gridWidth == width:
54 | return
55 | self.gridHeight = height
56 | self.gridWidth = width
57 | self.drawGrid()
58 |
59 | def updateGridSpacing(self, X1, X2, Y1, Y2, horizontalDivisions, verticalDivisions):
60 | self.grid_X1 = X1
61 | self.grid_X2 = X2
62 | self.grid_Y1 = Y1
63 | self.grid_Y2 = Y2
64 | self.pixelsPercm_H = abs(X2- X1)/horizontalDivisions
65 | self.pixelsPercm_V = abs(Y2-Y1)/verticalDivisions
66 | self.drawGrid()
67 |
68 | def getPixelsPerDivision_Horizontal(self):
69 | return self.pixelsPercm_H
70 |
71 | def getPixelsPerDivision_Vertical(self):
72 | return self.pixelsPercm_V
73 |
74 |
75 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 |
3 | on:
4 | push:
5 | tags:
6 | - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
7 |
8 | jobs:
9 |
10 | createrelease:
11 | name: Create Release
12 | runs-on: [ubuntu-latest]
13 | steps:
14 | - name: Create Release
15 | id: create_release
16 | uses: actions/create-release@v1
17 | env:
18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19 | with:
20 | tag_name: ${{ github.ref }}
21 | release_name: Release ${{ github.ref }}
22 | draft: false
23 | prerelease: false
24 | - name: Output Release URL File
25 | run: echo "${{ steps.create_release.outputs.upload_url }}" > release_url.txt
26 | - name: Save Release URL File for publish
27 | uses: actions/upload-artifact@v1
28 | with:
29 | name: release_url
30 | path: release_url.txt
31 |
32 | build:
33 | name: Build packages
34 | needs: createrelease
35 | runs-on: ${{ matrix.os }}
36 | strategy:
37 | matrix:
38 | include:
39 | - os: macos-latest
40 | TARGET: macos
41 | CMD_BUILD: >
42 | pyinstaller -F -w -n D43 -i icons/mac/D43.icns D43.py &&
43 | cd dist/ &&
44 | zip -r9 D43 D43.app/
45 | OUT_FILE_NAME: D43.zip
46 | ASSET_MIME: application/zip
47 | - os: windows-latest
48 | TARGET: windows
49 | CMD_BUILD: pyinstaller -F -w -n D43 -i icons/windows/D43-Icon.ico D43.py
50 | OUT_FILE_NAME: D43.exe
51 | ASSET_MIME: application/vnd.microsoft.portable-executable
52 | - os: ubuntu-18.04
53 | TARGET: ubuntu
54 | CMD_BUILD: pyinstaller -F -w -n D43 D43.py
55 | OUT_FILE_NAME: D43
56 | ASSET_MIME: application/x-sharedlib
57 | steps:
58 | - uses: actions/checkout@v1
59 | - name: Set up Python 3.7
60 | uses: actions/setup-python@v2
61 | with:
62 | python-version: 3.7
63 | - name: Install dependencies
64 | run: |
65 | python -m pip install --upgrade pip
66 | pip install -r requirements.txt
67 | - name: Build with pyinstaller for ${{matrix.TARGET}}
68 | run: ${{matrix.CMD_BUILD}}
69 | - name: Load Release URL File from release job
70 | uses: actions/download-artifact@v1
71 | with:
72 | name: release_url
73 | - name: Get Release File Name & Upload URL
74 | id: get_release_info
75 | shell: bash
76 | run: |
77 | value=`cat release_url/release_url.txt`
78 | echo ::set-output name=upload_url::$value
79 | - name: Upload Release Asset
80 | id: upload-release-asset
81 | uses: actions/upload-release-asset@v1
82 | env:
83 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
84 | with:
85 | upload_url: ${{ steps.get_release_info.outputs.upload_url }}
86 | asset_path: ./dist/${{ matrix.OUT_FILE_NAME}}
87 | asset_name: ${{ matrix.OUT_FILE_NAME}}
88 | asset_content_type: ${{ matrix.ASSET_MIME}}
89 |
--------------------------------------------------------------------------------
/Forms/Ui_Main.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/Main.ui'
4 | #
5 | # Created by: PyQt5 UI code generator 5.10.1
6 | #
7 | # WARNING! All changes made in this file will be lost!
8 |
9 | from PyQt5 import QtCore, QtGui, QtWidgets
10 |
11 | class Ui_MainWindow(object):
12 | def setupUi(self, MainWindow):
13 | MainWindow.setObjectName("MainWindow")
14 | MainWindow.resize(293, 215)
15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
16 | sizePolicy.setHorizontalStretch(0)
17 | sizePolicy.setVerticalStretch(0)
18 | sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
19 | MainWindow.setSizePolicy(sizePolicy)
20 | icon = QtGui.QIcon()
21 | icon.addPixmap(QtGui.QPixmap(":/icons/D43-Icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
22 | MainWindow.setWindowIcon(icon)
23 | MainWindow.setStyleSheet("")
24 | MainWindow.setAnimated(False)
25 | MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowNestedDocks|QtWidgets.QMainWindow.AllowTabbedDocks)
26 | self.centralWidget = QtWidgets.QWidget(MainWindow)
27 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
28 | sizePolicy.setHorizontalStretch(0)
29 | sizePolicy.setVerticalStretch(0)
30 | sizePolicy.setHeightForWidth(self.centralWidget.sizePolicy().hasHeightForWidth())
31 | self.centralWidget.setSizePolicy(sizePolicy)
32 | self.centralWidget.setObjectName("centralWidget")
33 | self.gridLayout = QtWidgets.QGridLayout(self.centralWidget)
34 | self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
35 | self.gridLayout.setContentsMargins(0, 0, 0, 0)
36 | self.gridLayout.setSpacing(0)
37 | self.gridLayout.setObjectName("gridLayout")
38 | self.widgetScope = Controls(self.centralWidget)
39 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
40 | sizePolicy.setHorizontalStretch(0)
41 | sizePolicy.setVerticalStretch(0)
42 | sizePolicy.setHeightForWidth(self.widgetScope.sizePolicy().hasHeightForWidth())
43 | self.widgetScope.setSizePolicy(sizePolicy)
44 | self.widgetScope.setObjectName("widgetScope")
45 | self.gridLayout.addWidget(self.widgetScope, 0, 0, 1, 1)
46 | MainWindow.setCentralWidget(self.centralWidget)
47 |
48 | self.retranslateUi(MainWindow)
49 | QtCore.QMetaObject.connectSlotsByName(MainWindow)
50 |
51 | def retranslateUi(self, MainWindow):
52 | _translate = QtCore.QCoreApplication.translate
53 | MainWindow.setWindowTitle(_translate("MainWindow", "D43 - Oscilloscope Camera"))
54 |
55 | from Forms.Controls import Controls
56 | import D43_Resources_rc
57 |
58 | if __name__ == "__main__":
59 | import sys
60 | app = QtWidgets.QApplication(sys.argv)
61 | MainWindow = QtWidgets.QMainWindow()
62 | ui = Ui_MainWindow()
63 | ui.setupUi(MainWindow)
64 | MainWindow.show()
65 | sys.exit(app.exec_())
66 |
67 |
--------------------------------------------------------------------------------
/Forms/DigitizerView.py:
--------------------------------------------------------------------------------
1 | from PyQt5 import QtGui
2 | from PyQt5.QtWidgets import QWidget
3 | from PyQt5.QtCore import QLineF
4 | from Forms.Ui_WebCamView import Ui_WebCamView
5 | import numpy as np
6 |
7 | class DigitizerView(QWidget, Ui_WebCamView):
8 | def __init__(self, parent):
9 | super(QWidget, self).__init__()
10 |
11 | self.setupUi(self)
12 | self.range_X1 = 100
13 | self.range_X2 = 200
14 | self.lineMode = False
15 | self.traceColor = QtGui.QColor(255, 0, 0)
16 | self.ScopeImage = None #np.zeros((200, 200, 3))
17 | self.DigitizedData = None #np.zeros((200, 200))
18 | self.triggered = False
19 |
20 | def clearImage(self):
21 | self.viewer.clear()
22 |
23 | def setLineMode(self, lineModeOn):
24 | self.lineMode=lineModeOn
25 |
26 | def setDigitizingRange(self, X1, X2):
27 | self.range_X1 = X1
28 | self.range_X2 = X2
29 |
30 | def setImage(self, scopeImage):
31 | if scopeImage is None:
32 | return
33 | self.ScopeImage = scopeImage
34 | self.digitizeImage()
35 |
36 | def paintEvent(self, event):
37 | self.redrawImage()
38 |
39 | def redrawImage(self):
40 | if self.ScopeImage is None:
41 | return
42 |
43 | digipix= QtGui.QPixmap(self.ScopeImage.shape[1], self.ScopeImage.shape[0])
44 | digipix.fill(QtGui.QColor(0, 0, 0, 0))
45 |
46 | if self.lineMode:
47 | self.drawLines(self.DigitizedData, digipix)
48 | else:
49 | self.drawDots(self.DigitizedData, digipix)
50 |
51 | def digitizeImage(self):
52 | #b, g, r , a = cv2.split(self.ScopeImage)
53 |
54 | green = self.ScopeImage[:, :, 1]
55 | trigger = np.max(green, axis=0)
56 | if len(trigger[np.where(trigger > 20)]) > abs(self.range_X1- self.range_X2)*0.9:
57 | self.triggered = True
58 | else:
59 | self.triggered = False
60 |
61 | spots = np.argmax(green, axis=0)
62 | self.DigitizedData = spots
63 |
64 | def drawDots(self, spots, digipix):
65 | qp = QtGui.QPainter()
66 | qp.begin(digipix)
67 | qp.setPen(self.traceColor)
68 | for x in range(self.range_X1, self.range_X2):
69 | qp.drawPoint( x, spots[x])
70 | qp.end()
71 |
72 | self.viewer.setPixmap(digipix)
73 |
74 | def drawLines(self, spots, digipix):
75 | lines = []
76 | for x in range(self.range_X1, self.range_X2):
77 | line = QLineF(x, spots[x], x+1, spots[x+1])
78 | lines.append(line)
79 |
80 | qp = QtGui.QPainter()
81 | qp.begin(digipix)
82 | qp.setPen(self.traceColor)
83 | qp.drawLines(lines)
84 | qp.end()
85 |
86 | self.viewer.setPixmap(digipix)
87 |
88 | def getDigitizedData(self):
89 | return self.DigitizedData
90 |
91 | def getRange(self):
92 | return self.range_X1, self.range_X2
93 |
94 | def isTriggered(self):
95 | return self.triggered
96 |
97 | def resetTrigger(self):
98 | self.triggered = False
99 |
--------------------------------------------------------------------------------
/CameraMount/cameramount_tubedrillingpattern.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
107 |
--------------------------------------------------------------------------------
/.ropeproject/config.py:
--------------------------------------------------------------------------------
1 | # The default ``config.py``
2 | # flake8: noqa
3 |
4 |
5 | def set_prefs(prefs):
6 | """This function is called before opening the project"""
7 |
8 | # Specify which files and folders to ignore in the project.
9 | # Changes to ignored resources are not added to the history and
10 | # VCSs. Also they are not returned in `Project.get_files()`.
11 | # Note that ``?`` and ``*`` match all characters but slashes.
12 | # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'
13 | # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'
14 | # '.svn': matches 'pkg/.svn' and all of its children
15 | # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'
16 | # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'
17 | prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject',
18 | '.hg', '.svn', '_svn', '.git', '.tox',
19 | '__pycache__',
20 | '_eric6project', '.eric6project',
21 | ]
22 |
23 | # Specifies which files should be considered python files. It is
24 | # useful when you have scripts inside your project. Only files
25 | # ending with ``.py`` are considered to be python files by
26 | # default.
27 | # prefs['python_files'] = ['*.py']
28 |
29 | # Custom source folders: By default rope searches the project
30 | # for finding source folders (folders that should be searched
31 | # for finding modules). You can add paths to that list. Note
32 | # that rope guesses project source folders correctly most of the
33 | # time; use this if you have any problems.
34 | # The folders should be relative to project root and use '/' for
35 | # separating folders regardless of the platform rope is running on.
36 | # 'src/my_source_folder' for instance.
37 | # prefs.add('source_folders', 'src')
38 |
39 | # You can extend python path for looking up modules
40 | # prefs.add('python_path', '~/python/')
41 |
42 | # Should rope save object information or not.
43 | prefs['save_objectdb'] = True
44 | prefs['compress_objectdb'] = False
45 |
46 | # If `True`, rope analyzes each module when it is being saved.
47 | prefs['automatic_soa'] = True
48 | # The depth of calls to follow in static object analysis
49 | prefs['soa_followed_calls'] = 0
50 |
51 | # If `False` when running modules or unit tests "dynamic object
52 | # analysis" is turned off. This makes them much faster.
53 | prefs['perform_doa'] = True
54 |
55 | # Rope can check the validity of its object DB when running.
56 | prefs['validate_objectdb'] = True
57 |
58 | # How many undos to hold?
59 | prefs['max_history_items'] = 32
60 |
61 | # Shows whether to save history across sessions.
62 | prefs['save_history'] = True
63 | prefs['compress_history'] = False
64 |
65 | # Set the number spaces used for indenting. According to
66 | # :PEP:`8`, it is best to use 4 spaces. Since most of rope's
67 | # unit-tests use 4 spaces it is more reliable, too.
68 | prefs['indent_size'] = 4
69 |
70 | # Builtin and c-extension modules that are allowed to be imported
71 | # and inspected by rope.
72 | prefs['extension_modules'] = []
73 |
74 | # Add all standard c-extensions to extension_modules list.
75 | prefs['import_dynload_stdmods'] = True
76 |
77 | # If `True` modules with syntax errors are considered to be empty.
78 | # The default value is `False`; When `False` syntax errors raise
79 | # `rope.base.exceptions.ModuleSyntaxError` exception.
80 | prefs['ignore_syntax_errors'] = False
81 |
82 | # If `True`, rope ignores unresolvable imports. Otherwise, they
83 | # appear in the importing namespace.
84 | prefs['ignore_bad_imports'] = False
85 |
86 | # If `True`, rope will insert new module imports as
87 | # `from import ` by default.
88 | prefs['prefer_module_from_imports'] = False
89 |
90 | # If `True`, rope will transform a comma list of imports into
91 | # multiple separate import statements when organizing
92 | # imports.
93 | prefs['split_imports'] = False
94 |
95 | # If `True`, rope will remove all top-level import statements and
96 | # reinsert them at the top of the module when making changes.
97 | prefs['pull_imports_to_top'] = True
98 |
99 | # If `True`, rope will sort imports alphabetically by module name instead
100 | # of alphabetically by import statement, with from imports after normal
101 | # imports.
102 | prefs['sort_imports_alphabetically'] = False
103 |
104 | # Location of implementation of
105 | # rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general
106 | # case, you don't have to change this value, unless you're an rope expert.
107 | # Change this value to inject you own implementations of interfaces
108 | # listed in module rope.base.oi.type_hinting.providers.interfaces
109 | # For example, you can add you own providers for Django Models, or disable
110 | # the search type-hinting in a class hierarchy, etc.
111 | prefs['type_hinting_factory'] = (
112 | 'rope.base.oi.type_hinting.factory.default_type_hinting_factory')
113 |
114 |
115 | def project_opened(project):
116 | """This function is called after opening the project"""
117 | # Do whatever you like here!
118 |
--------------------------------------------------------------------------------
/DigitalD43.e4p:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | en_US
8 | fb488d2ab10b73481ffb78b8d3487f4532d28877
9 | Python3
10 | PyQt5
11 | A program to capture images from analog oscilloscopes and make on screen measurements.
12 | 0.1
13 | Joseph Eoff
14 | joseph.eoff@molear.de
15 |
16 |
17 | D43.py
18 | D43_Resources_rc.py
19 | Forms/Controls.py
20 | Forms/Cursor.py
21 | Forms/CursorControl.py
22 | Forms/Cursor_Enums.py
23 | Forms/DigitizerView.py
24 | Forms/Grid.py
25 | Forms/Ui_Controls.py
26 | Forms/Ui_Grid.py
27 | Forms/Ui_Main.py
28 | Forms/Ui_WebCamView.py
29 | Forms/WebCamView.py
30 | Forms/icons_rc.py
31 | __init__.py
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | D43_Resources.qrc
41 |
42 | D43.py
43 |
44 | Git
45 |
46 |
47 |
48 | add
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | checkout
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | commit
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 | diff
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | export
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | global
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | history
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | log
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | remove
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 | status
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 | tag
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 | update
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
--------------------------------------------------------------------------------
/CameraMount/bezel.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
134 |
--------------------------------------------------------------------------------
/Forms/CursorControl.py:
--------------------------------------------------------------------------------
1 | from PyQt5.QtGui import QPainter, QPen , QPixmap , QColor
2 | from PyQt5.QtWidgets import QWidget
3 | from PyQt5.QtCore import Qt, QLineF, pyqtSignal
4 |
5 | from Forms.Ui_WebCamView import Ui_WebCamView
6 | from Forms.Cursor_Enums import CursorType
7 | from Forms.Cursor_Enums import CursorStyle
8 | from Forms.Cursor import Cursor
9 |
10 | class CursorControl(QWidget, Ui_WebCamView):
11 | cursorMoved = pyqtSignal()
12 |
13 | def __init__(self, parent):
14 | super(QWidget, self).__init__()
15 |
16 | self.setupUi(self)
17 | self.parent=parent
18 |
19 | self.setMouseTracking(True)
20 |
21 | self.cursors = []
22 | self.barWidth= 5
23 | self.cursorWidth = self.width()
24 | self.cursorHeight = self.height()
25 |
26 | self.movingCursor = None
27 |
28 | self.cursor_T1 = None
29 | self.cursor_T2 = None
30 | self.cursor_V1 = None
31 | self.cursor_V2 = None
32 | self.cursor_zero = None
33 | self.addCursors()
34 |
35 |
36 | def addCursors(self):
37 | cursorColor = QColor(0, 186, 255, 100)
38 | cursorBarColor = QColor(0, 186, 255, 255)
39 |
40 | cursor = Cursor(15, cursorColor, cursorBarColor, CursorType.horizontal, CursorStyle.barred)
41 | self.addCursor(cursor)
42 | self.cursor_T1 = cursor
43 |
44 | cursor = Cursor(15, cursorColor, cursorBarColor, CursorType.vertical, CursorStyle.barred)
45 | self.addCursor(cursor)
46 | self.cursor_V1 = cursor
47 |
48 | cursor = Cursor(200, cursorColor, cursorBarColor, CursorType.vertical, CursorStyle.barred)
49 | self.addCursor(cursor)
50 | self.cursor_V2 = cursor
51 |
52 | cursor = Cursor(200, cursorColor, cursorBarColor, CursorType.horizontal, CursorStyle.barred)
53 | self.addCursor(cursor)
54 | self.cursor_T2 = cursor
55 |
56 | cursorColor = QColor(128, 128, 128, 100)
57 | cursorBarColor = QColor(128, 128, 128, 255)
58 | cursor = Cursor(200, cursorColor, cursorBarColor, CursorType.zeroline, CursorStyle.barred)
59 | self.addCursor(cursor)
60 | self.cursor_zero = cursor
61 |
62 | def getX1_pixels(self):
63 | return self.cursor_T1.getCursorPosition()
64 |
65 | def getX2_pixels(self):
66 | return self.cursor_T2.getCursorPosition()
67 |
68 | def getY1_pixels(self):
69 | return self.cursor_V1.getCursorPosition()
70 |
71 | def getY2_pixels(self):
72 | return self.cursor_V2.getCursorPosition()
73 |
74 | def getZero_pixels(self):
75 | return self.cursor_zero.getCursorPosition()
76 |
77 | def mousePressEvent(self, event):
78 | if not event.button() == Qt.LeftButton:
79 | self.movingCursor = None
80 | event.ignore()
81 | return
82 |
83 | cursor = self.getCursor(event.pos())
84 | if cursor is None:
85 | event.ignore()
86 | return
87 | self.movingCursor = cursor
88 |
89 | def mouseReleaseEvent(self, event):
90 | if event.button() == Qt.LeftButton:
91 | self.movingCursor = None
92 | event.ignore()
93 |
94 | def mouseMoveEvent(self, event):
95 | if self.movingCursor is None:
96 | return
97 | if not (event.buttons() == Qt.LeftButton):
98 | event.ignore()
99 | return
100 | event.accept()
101 | self.changeCursorPosition(self.movingCursor, event.pos())
102 | #self.drawCursors()
103 | self.cursorMoved.emit()
104 |
105 | def changeCursorPosition(self, cursor, eventPosition):
106 | x = eventPosition.x()
107 | y = eventPosition.y()
108 | if x<1:
109 | x = 1
110 | x = 1
111 | if y<1:
112 | y = 1
113 | if x > self.cursorWidth-2:
114 | x = self.cursorWidth-2
115 | if y > self.cursorHeight-2:
116 | y = self.cursorHeight -2
117 | if cursor.getType() == CursorType.horizontal:
118 | cursor.setCursorPosition(x)
119 | else:
120 | cursor.setCursorPosition(y)
121 |
122 | def getCursor(self, eventPosition):
123 | for cursor in self.cursors:
124 | if self.closeToCursor(cursor, eventPosition):
125 | return cursor
126 | return None
127 |
128 | def closeToCursor(self, cursor, position):
129 | if cursor.getType() == CursorType.horizontal:
130 | if abs(cursor.getCursorPosition() - position.x()) <= self.barWidth:
131 | return True
132 | else:
133 | if abs(cursor.getCursorPosition() - position.y()) <= self.barWidth:
134 | return True
135 |
136 | def updateSize(self, width, height):
137 | if self.cursorHeight == height and self.cursorWidth == width:
138 | return
139 |
140 | self.cursorHeight = height
141 | self.cursorWidth = width
142 | cursorPixmap = QPixmap(self.cursorWidth, self.cursorHeight)
143 | cursorPixmap.fill(QColor(255, 255, 255, 0))
144 | self.viewer.setPixmap(cursorPixmap)
145 |
146 | for cursor in self.cursors:
147 | if cursor.getType() == CursorType.vertical or cursor.getType() == CursorType.zeroline:
148 | if cursor.getCursorPosition() > self.cursorHeight:
149 | cursor.setCursorPosition(self.cursorHeight -2)
150 | if cursor.getType() == CursorType.horizontal:
151 | if cursor.getCursorPosition() > self.cursorWidth:
152 | cursor.setCursorPosition(self.cursorWidth-2)
153 |
154 | def addCursor(self, cursor):
155 | self.cursors.append(cursor)
156 | #self.drawCursors()
157 |
158 | def paintEvent(self, event):
159 | self.drawCursors()
160 |
161 | def drawCursors(self):
162 | qp = QPainter()
163 | qp.begin(self)
164 | for cursor in self.cursors:
165 | pen = QPen(cursor.getColor(), 1, Qt.SolidLine)
166 | qp.setPen(pen)
167 | line = self.getLine(cursor)
168 | qp.drawLine(line)
169 | if cursor.getStyle() == CursorStyle.barred:
170 | lines = self.getBars(cursor)
171 | pen = QPen(cursor.getBarColor(), 1, Qt.SolidLine)
172 | qp.setPen(pen)
173 | qp.drawLines(lines)
174 | qp.end()
175 |
176 | def getLine(self, cursor):
177 | if cursor.getType() == CursorType.vertical or cursor.getType() == CursorType.zeroline:
178 | line = self.makeHorizontalLine(cursor.getCursorPosition())
179 | else:
180 | line = self.makeVerticalLine(cursor.getCursorPosition())
181 | return line
182 |
183 | def getBars(self, cursor):
184 | lines = []
185 | if cursor.getType() == CursorType.vertical or cursor.getType() == CursorType.zeroline:
186 | line = self.makeHorizontalLine(cursor.getCursorPosition() + self.barWidth)
187 | lines.append(line)
188 | line = self.makeHorizontalLine(cursor.getCursorPosition() - self.barWidth)
189 | lines.append(line)
190 | elif cursor.getType() == CursorType.horizontal:
191 | line = self.makeVerticalLine(cursor.getCursorPosition() + self.barWidth)
192 | lines.append(line)
193 | line = self.makeVerticalLine(cursor.getCursorPosition() - self.barWidth)
194 | lines.append(line)
195 |
196 | return lines
197 |
198 | def makeHorizontalLine(self, position):
199 | line = QLineF(0, position, self.cursorWidth, position)
200 | return line
201 |
202 | def makeVerticalLine(self, position):
203 | line = QLineF(position, 0, position, self.cursorHeight)
204 | return line
205 |
--------------------------------------------------------------------------------
/CameraMount/cameramount.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
311 |
--------------------------------------------------------------------------------
/Forms/Controls.py:
--------------------------------------------------------------------------------
1 | from PyQt5 import QtCore, QtMultimedia
2 | from PyQt5.QtCore import QSettings
3 | from PyQt5.QtWidgets import QWidget, QApplication, QFileDialog
4 | import os
5 | from quantiphy import Quantity
6 | import cv2
7 | import csv
8 | from Forms.Ui_Controls import Ui_Controls
9 | import numpy as np
10 |
11 | class Controls(QWidget, Ui_Controls):
12 | def __init__(self, parent):
13 | super(QWidget, self).__init__()
14 |
15 | self.transparentThreshold = 20
16 | self.timer = None
17 | self.thresholdMode = cv2.THRESH_BINARY
18 | self.fps = 24
19 | self.videocapture = None
20 | self.setupUi(self)
21 | self.dockWidgetCalibration.hide()
22 | self.toolButtonCalibrate.clicked.connect(self.doShowCalibration)
23 |
24 | self.availableCameras = self.getListOfCameras()
25 | self.comboBoxCameraSelect.addItems(self.availableCameras)
26 | self.checkBoxPause.stateChanged.connect(self.doPauseStateChanged)
27 | self.checkBoxLines.stateChanged.connect(self.doLineModeSelect)
28 | self.checkBoxPersist.stateChanged.connect(self.doPersistStateChanged)
29 | self.pushButtonCrop.clicked.connect(self.on_buttonCropClicked)
30 | self.pushButtonReset.clicked.connect(self.on_buttonResetClicked)
31 | self.pushButtonGrid.clicked.connect(self.on_buttonGridClicked)
32 | self.pushButtonSnapshot.clicked.connect(self.on_buttonSnapshotClicked)
33 | self.pushButtonDigitizedData.clicked.connect(self.on_SaveDigitizedDataClicked)
34 | self.widgetCursorControl.cursorMoved.connect(self.updateOnCursorMove)
35 |
36 |
37 | self.timebase = [ ("5 Secs", 5.0), ("2 Secs", 2.0), ("1Sec", 1.0),
38 | ("500 ms", 0.5), ("200 ms", 0.2), ("100 ms", 0.1),
39 | ("50 ms", 0.05), ("20 ms", 0.02), ("10 ms", 0.01),
40 | ("5 ms", 0.005), ("2 ms", 0.002), ("1 ms", 0.001),
41 | ("500 us", 0.0005), ("200 us", 0.0002), ("100 us", 0.0001),
42 | ("50 us", 0.00005), ("20 us", 0.00002), ("10 us", 0.00001),
43 | ("5 us", 0.000005), ("2 us", 0.000002), ("1 us", 0.000001),
44 | ("0.5 us", 0.0000005)]
45 |
46 | self.voltages = [ ("50 V", 50.0), ("20 V", 20.0), ("10 V", 10.0),
47 | ("5 V", 5.0), ("2 V", 2.0), ("1 V", 1.0),
48 | ("500 mV", 0.5), ("200 mV", 0.2), ("100 mV", 0.1)]
49 |
50 | self.multipliers = [("1", 1.0), ("10", 0.1), ("100", 0.01), ("1000", 0.001)]
51 |
52 | self.indexOfLastUsedCamera = -1
53 | self.settings = QSettings()
54 | self.rawImageWidth = int(self.settings.value("rawImageWidth", 640))
55 | self.rawImageHeight = int(self.settings.value("rawImageHeight", 480))
56 | self.crop_X1 = int(self.settings.value("crop_X1", 0))
57 | self.crop_X2 = int(self.settings.value("crop_X2", 640))
58 | self.crop_Y1 = int(self.settings.value("crop_Y1", 0))
59 | self.crop_Y2 = int(self.settings.value("crop_Y2", 480))
60 | self.grid_X1 = int(self.settings.value("grid_X1", 0))
61 | self.grid_X2 = int(self.settings.value("grid_X2", 640))
62 | self.grid_Y1 = int(self.settings.value("grid_Y1", 0))
63 | self.grid_Y2 = int(self.settings.value("grid_Y2", 480))
64 | self.grid_HorizontalDivisions = int(self.settings.value("grid_HorizontalDivisions", 8))
65 | self.grid_VerticalDivisions = int(self.settings.value("grid_VerticalDivisions", 6))
66 | self.spinBoxHorizontalDivisions.setValue(self.grid_HorizontalDivisions)
67 | self.spinBoxVerticalDivisions.setValue(self.grid_VerticalDivisions)
68 | self.updateGrid()
69 | self.updateDigitizingRange()
70 | self.fillComboBoxes(self.settings)
71 | self.setComboBoxSelectedItemFromSettings(self.settings, "Camera", self.comboBoxCameraSelect )
72 | self.setComboBoxSelectedItemFromSettings(self.settings, "Multiplier_Selected", self.comboBoxMultiplier)
73 | self.setComboBoxSelectedItemFromSettings(self.settings, "Timebase_Selected", self.comboBoxTimeBase)
74 | self.setComboBoxSelectedItemFromSettings(self.settings, "VerticalDeflection_Selected", self.comboBoxVerticalDeflection)
75 | self.comboBoxMultiplier.currentIndexChanged.connect(self.settingChanged)
76 | self.comboBoxTimeBase.currentIndexChanged.connect(self.settingChanged)
77 | self.comboBoxVerticalDeflection.currentIndexChanged.connect(self.settingChanged)
78 | self.comboBoxCameraSelect.currentIndexChanged.connect(self.changeCamera)
79 | self.start()
80 | self.updateOnCursorMove()
81 |
82 | def on_SaveDigitizedDataClicked(self):
83 | data = self.widgetDigitizedView.getDigitizedData()
84 | data = self.widgetCursorControl.getZero_pixels() - data
85 | data = data * self.getVoltsPerPixel()
86 | filename, filter = QFileDialog.getSaveFileName(self, 'Save CSV Data File', '', 'CSV Files (*.csv)')
87 | if filename:
88 | filename, extension = os.path.splitext(filename)
89 | filename = filename + '.csv'
90 | timePerPixel = self.getSecondsPerPixel()
91 | count = 0
92 | x1, x2 = self.widgetDigitizedView.getRange()
93 | with open( filename, 'w') as csvfile:
94 | for x in range(x1, x2+1):
95 | csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
96 | csvwriter.writerow([count * timePerPixel, data[x]])
97 | count = count + 1
98 |
99 | def on_buttonSnapshotClicked(self):
100 | snapshot = QApplication.primaryScreen().grabWindow(self.groupBoxDisplay.winId())
101 | filename, filter = QFileDialog.getSaveFileName(self, 'Save Snapshot', '', 'PNG Files (*.png)')
102 | if filename:
103 | filename, extension = os.path.splitext(filename)
104 | filename = filename + '.png'
105 | snapshot.save(filename, "PNG")
106 |
107 | def doShowCalibration(self):
108 | self.dockWidgetCalibration.setFloating(True)
109 | self.dockWidgetCalibration.show()
110 |
111 | def fillComboBoxes(self, settings):
112 | # This looks stupidly complicated. If I just let QT take care of things, it would be much shorter.
113 | # I want user editable entries for these values in the settings file, though.
114 | # Qt encodes the strings and values in a way that you can't easily edit with a text editor.
115 | # Hence extra conversion steps.
116 | # For example, the multipliers entry looks like this:
117 | # multipliers="('1', 1.0), ('10', 0.1), ('100', 0.01), ('1000', 0.001)"
118 | # Easy enough to edit
119 | if not settings.contains("timebase"):
120 | settings.setValue("timebase", str(self.timebase).strip('[]'))
121 | self.timebase = self.listOfTuplesFromString(settings.value("timebase"))
122 | self.fillComboBoxFromListOfTuples(self.comboBoxTimeBase, self.timebase)
123 |
124 | if not settings.contains("voltages"):
125 | settings.setValue("voltages", str(self.voltages).strip('[]'))
126 | self.voltages = self.listOfTuplesFromString(settings.value("voltages"))
127 | self.fillComboBoxFromListOfTuples(self.comboBoxVerticalDeflection, self.voltages)
128 |
129 | if not settings.contains("multipliers"):
130 | settings.setValue("multipliers", str(self.multipliers).strip('[]'))
131 | self.multipliers = self.listOfTuplesFromString(settings.value("multipliers"))
132 | self.fillComboBoxFromListOfTuples(self.comboBoxMultiplier, self.multipliers)
133 |
134 | def setComboBoxSelectedItemFromSettings(self, settings, settingName, combobox):
135 | savedItemName = settings.value(settingName, "-")
136 | itemIndex = combobox.findText(savedItemName )
137 | if itemIndex>=0:
138 | combobox.setCurrentIndex(itemIndex)
139 |
140 | def fillComboBoxFromListOfTuples(self, combobox, valuesList):
141 | combobox.clear()
142 | for item in valuesList:
143 | combobox.addItem(item[0], item[1])
144 |
145 | def listOfTuplesFromString(self, formattedString):
146 | return eval("[%s]" % formattedString)
147 |
148 | def updateGrid(self):
149 | self.widgetGridView.updateGridSpacing(self.grid_X1, self.grid_X2, self.grid_Y1, self.grid_Y2, self.grid_HorizontalDivisions, self.grid_VerticalDivisions)
150 |
151 | def updateDigitizingRange(self):
152 | self.widgetDigitizedView.setDigitizingRange(self.grid_X1, self.grid_X2)
153 |
154 | def on_buttonCropClicked(self):
155 | self.crop_X1 = self.widgetCursorControl.getX1_pixels()
156 | self.crop_X2 = self.widgetCursorControl.getX2_pixels()
157 | self.crop_Y1 = self.widgetCursorControl.getY1_pixels()
158 | self.crop_Y2 = self.widgetCursorControl.getY2_pixels()
159 |
160 | if self.crop_X2
294 | Copyright (C)
295 |
296 | This program is free software; you can redistribute it and/or modify
297 | it under the terms of the GNU General Public License as published by
298 | the Free Software Foundation; either version 2 of the License, or
299 | (at your option) any later version.
300 |
301 | This program is distributed in the hope that it will be useful,
302 | but WITHOUT ANY WARRANTY; without even the implied warranty of
303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
304 | GNU General Public License for more details.
305 |
306 | You should have received a copy of the GNU General Public License along
307 | with this program; if not, write to the Free Software Foundation, Inc.,
308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
309 |
310 | Also add information on how to contact you by electronic and paper mail.
311 |
312 | If the program is interactive, make it output a short notice like this
313 | when it starts in an interactive mode:
314 |
315 | Gnomovision version 69, Copyright (C) year name of author
316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
317 | This is free software, and you are welcome to redistribute it
318 | under certain conditions; type `show c' for details.
319 |
320 | The hypothetical commands `show w' and `show c' should show the appropriate
321 | parts of the General Public License. Of course, the commands you use may
322 | be called something other than `show w' and `show c'; they could even be
323 | mouse-clicks or menu items--whatever suits your program.
324 |
325 | You should also get your employer (if you work as a programmer) or your
326 | school, if any, to sign a "copyright disclaimer" for the program, if
327 | necessary. Here is a sample; alter the names:
328 |
329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330 | `Gnomovision' (which makes passes at compilers) written by James Hacker.
331 |
332 | , 1 April 1989
333 | Ty Coon, President of Vice
334 |
335 | This General Public License does not permit incorporating your program into
336 | proprietary programs. If your program is a subroutine library, you may
337 | consider it more useful to permit linking proprietary applications with the
338 | library. If this is what you want to do, use the GNU Lesser General
339 | Public License instead of this License.
340 |
--------------------------------------------------------------------------------
/Forms/Ui_Controls.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/Controls.ui'
4 | #
5 | # Created by: PyQt5 UI code generator 5.10.1
6 | #
7 | # WARNING! All changes made in this file will be lost!
8 |
9 | from PyQt5 import QtCore, QtGui, QtWidgets
10 |
11 | class Ui_Controls(object):
12 | def setupUi(self, Controls):
13 | Controls.setObjectName("Controls")
14 | Controls.resize(346, 559)
15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
16 | sizePolicy.setHorizontalStretch(0)
17 | sizePolicy.setVerticalStretch(0)
18 | sizePolicy.setHeightForWidth(Controls.sizePolicy().hasHeightForWidth())
19 | Controls.setSizePolicy(sizePolicy)
20 | self.gridLayout_6 = QtWidgets.QGridLayout(Controls)
21 | self.gridLayout_6.setContentsMargins(0, 0, 0, 0)
22 | self.gridLayout_6.setSpacing(0)
23 | self.gridLayout_6.setObjectName("gridLayout_6")
24 | self.layoutScope = QtWidgets.QGridLayout()
25 | self.layoutScope.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
26 | self.layoutScope.setContentsMargins(0, 0, 0, 0)
27 | self.layoutScope.setSpacing(0)
28 | self.layoutScope.setObjectName("layoutScope")
29 | self.verticalLayout = QtWidgets.QVBoxLayout()
30 | self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
31 | self.verticalLayout.setContentsMargins(0, 0, 0, 0)
32 | self.verticalLayout.setSpacing(0)
33 | self.verticalLayout.setObjectName("verticalLayout")
34 | self.groupBoxDisplay = QtWidgets.QGroupBox(Controls)
35 | self.groupBoxDisplay.setEnabled(True)
36 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
37 | sizePolicy.setHorizontalStretch(0)
38 | sizePolicy.setVerticalStretch(0)
39 | sizePolicy.setHeightForWidth(self.groupBoxDisplay.sizePolicy().hasHeightForWidth())
40 | self.groupBoxDisplay.setSizePolicy(sizePolicy)
41 | self.groupBoxDisplay.setStyleSheet("background-color: rgb(0, 0, 0);\n"
42 | "")
43 | self.groupBoxDisplay.setTitle("")
44 | self.groupBoxDisplay.setAlignment(QtCore.Qt.AlignCenter)
45 | self.groupBoxDisplay.setFlat(False)
46 | self.groupBoxDisplay.setObjectName("groupBoxDisplay")
47 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBoxDisplay)
48 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
49 | self.verticalLayout_2.setSpacing(0)
50 | self.verticalLayout_2.setObjectName("verticalLayout_2")
51 | self.gridLayout_Display = QtWidgets.QGridLayout()
52 | self.gridLayout_Display.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
53 | self.gridLayout_Display.setContentsMargins(0, 0, 0, 0)
54 | self.gridLayout_Display.setSpacing(0)
55 | self.gridLayout_Display.setObjectName("gridLayout_Display")
56 | self.widgetLiveView = WebCamView(self.groupBoxDisplay)
57 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
58 | sizePolicy.setHorizontalStretch(0)
59 | sizePolicy.setVerticalStretch(0)
60 | sizePolicy.setHeightForWidth(self.widgetLiveView.sizePolicy().hasHeightForWidth())
61 | self.widgetLiveView.setSizePolicy(sizePolicy)
62 | self.widgetLiveView.setMinimumSize(QtCore.QSize(50, 50))
63 | self.widgetLiveView.setStyleSheet("background-color: rgb(0, 0, 0);")
64 | self.widgetLiveView.setObjectName("widgetLiveView")
65 | self.gridLayout_Display.addWidget(self.widgetLiveView, 0, 0, 1, 1, QtCore.Qt.AlignTop)
66 | self.widgetGridView = Grid(self.groupBoxDisplay)
67 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
68 | sizePolicy.setHorizontalStretch(0)
69 | sizePolicy.setVerticalStretch(0)
70 | sizePolicy.setHeightForWidth(self.widgetGridView.sizePolicy().hasHeightForWidth())
71 | self.widgetGridView.setSizePolicy(sizePolicy)
72 | self.widgetGridView.setMinimumSize(QtCore.QSize(50, 50))
73 | self.widgetGridView.setStyleSheet("background-color: rgba(255, 255, 255, 0);")
74 | self.widgetGridView.setObjectName("widgetGridView")
75 | self.gridLayout_Display.addWidget(self.widgetGridView, 0, 0, 1, 1, QtCore.Qt.AlignLeft)
76 | self.widgetDigitizedView = DigitizerView(self.groupBoxDisplay)
77 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
78 | sizePolicy.setHorizontalStretch(0)
79 | sizePolicy.setVerticalStretch(0)
80 | sizePolicy.setHeightForWidth(self.widgetDigitizedView.sizePolicy().hasHeightForWidth())
81 | self.widgetDigitizedView.setSizePolicy(sizePolicy)
82 | self.widgetDigitizedView.setMinimumSize(QtCore.QSize(50, 50))
83 | self.widgetDigitizedView.setStyleSheet("background-color: rgba(255, 255, 255, 0);\n"
84 | "")
85 | self.widgetDigitizedView.setObjectName("widgetDigitizedView")
86 | self.gridLayout_Display.addWidget(self.widgetDigitizedView, 0, 0, 1, 1)
87 | self.widgetCursorControl = CursorControl(self.groupBoxDisplay)
88 | self.widgetCursorControl.setEnabled(True)
89 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
90 | sizePolicy.setHorizontalStretch(0)
91 | sizePolicy.setVerticalStretch(0)
92 | sizePolicy.setHeightForWidth(self.widgetCursorControl.sizePolicy().hasHeightForWidth())
93 | self.widgetCursorControl.setSizePolicy(sizePolicy)
94 | self.widgetCursorControl.setMinimumSize(QtCore.QSize(50, 50))
95 | self.widgetCursorControl.setAutoFillBackground(False)
96 | self.widgetCursorControl.setStyleSheet("background-color: rgba(255, 255, 255, 0);\n"
97 | "border: 1px solid rgba(255,255,255,100);")
98 | self.widgetCursorControl.setObjectName("widgetCursorControl")
99 | self.gridLayout_Display.addWidget(self.widgetCursorControl, 0, 0, 1, 1)
100 | self.verticalLayout_2.addLayout(self.gridLayout_Display)
101 | self.groupBoxMeasurements = QtWidgets.QGroupBox(self.groupBoxDisplay)
102 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
103 | sizePolicy.setHorizontalStretch(0)
104 | sizePolicy.setVerticalStretch(0)
105 | sizePolicy.setHeightForWidth(self.groupBoxMeasurements.sizePolicy().hasHeightForWidth())
106 | self.groupBoxMeasurements.setSizePolicy(sizePolicy)
107 | self.groupBoxMeasurements.setStyleSheet("")
108 | self.groupBoxMeasurements.setTitle("")
109 | self.groupBoxMeasurements.setAlignment(QtCore.Qt.AlignCenter)
110 | self.groupBoxMeasurements.setFlat(False)
111 | self.groupBoxMeasurements.setObjectName("groupBoxMeasurements")
112 | self.gridLayout_11 = QtWidgets.QGridLayout(self.groupBoxMeasurements)
113 | self.gridLayout_11.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
114 | self.gridLayout_11.setContentsMargins(0, 0, 0, 0)
115 | self.gridLayout_11.setSpacing(0)
116 | self.gridLayout_11.setObjectName("gridLayout_11")
117 | self.groupBoxTime = QtWidgets.QGroupBox(self.groupBoxMeasurements)
118 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
119 | sizePolicy.setHorizontalStretch(0)
120 | sizePolicy.setVerticalStretch(0)
121 | sizePolicy.setHeightForWidth(self.groupBoxTime.sizePolicy().hasHeightForWidth())
122 | self.groupBoxTime.setSizePolicy(sizePolicy)
123 | self.groupBoxTime.setTitle("")
124 | self.groupBoxTime.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
125 | self.groupBoxTime.setFlat(True)
126 | self.groupBoxTime.setObjectName("groupBoxTime")
127 | self.formLayout_2 = QtWidgets.QFormLayout(self.groupBoxTime)
128 | self.formLayout_2.setLabelAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
129 | self.formLayout_2.setContentsMargins(0, 0, 0, 0)
130 | self.formLayout_2.setSpacing(0)
131 | self.formLayout_2.setObjectName("formLayout_2")
132 | self.labelDeltaT = QtWidgets.QLabel(self.groupBoxTime)
133 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
134 | sizePolicy.setHorizontalStretch(0)
135 | sizePolicy.setVerticalStretch(0)
136 | sizePolicy.setHeightForWidth(self.labelDeltaT.sizePolicy().hasHeightForWidth())
137 | self.labelDeltaT.setSizePolicy(sizePolicy)
138 | self.labelDeltaT.setStyleSheet("color: rgb(0, 255, 255);")
139 | self.labelDeltaT.setObjectName("labelDeltaT")
140 | self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.labelDeltaT)
141 | self.labelDeltaTDisplay = QtWidgets.QLabel(self.groupBoxTime)
142 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
143 | sizePolicy.setHorizontalStretch(0)
144 | sizePolicy.setVerticalStretch(0)
145 | sizePolicy.setHeightForWidth(self.labelDeltaTDisplay.sizePolicy().hasHeightForWidth())
146 | self.labelDeltaTDisplay.setSizePolicy(sizePolicy)
147 | self.labelDeltaTDisplay.setStyleSheet("color: rgb(0, 255, 255);")
148 | self.labelDeltaTDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
149 | self.labelDeltaTDisplay.setObjectName("labelDeltaTDisplay")
150 | self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelDeltaTDisplay)
151 | self.labelTInverse = QtWidgets.QLabel(self.groupBoxTime)
152 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
153 | sizePolicy.setHorizontalStretch(0)
154 | sizePolicy.setVerticalStretch(0)
155 | sizePolicy.setHeightForWidth(self.labelTInverse.sizePolicy().hasHeightForWidth())
156 | self.labelTInverse.setSizePolicy(sizePolicy)
157 | self.labelTInverse.setStyleSheet("color: rgb(0, 255, 255);")
158 | self.labelTInverse.setObjectName("labelTInverse")
159 | self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.labelTInverse)
160 | self.labelTInverseDisplay = QtWidgets.QLabel(self.groupBoxTime)
161 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
162 | sizePolicy.setHorizontalStretch(0)
163 | sizePolicy.setVerticalStretch(0)
164 | sizePolicy.setHeightForWidth(self.labelTInverseDisplay.sizePolicy().hasHeightForWidth())
165 | self.labelTInverseDisplay.setSizePolicy(sizePolicy)
166 | self.labelTInverseDisplay.setStyleSheet("color: rgb(0, 255, 255);")
167 | self.labelTInverseDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
168 | self.labelTInverseDisplay.setObjectName("labelTInverseDisplay")
169 | self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.labelTInverseDisplay)
170 | self.labeltperDiv = QtWidgets.QLabel(self.groupBoxTime)
171 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
172 | sizePolicy.setHorizontalStretch(0)
173 | sizePolicy.setVerticalStretch(0)
174 | sizePolicy.setHeightForWidth(self.labeltperDiv.sizePolicy().hasHeightForWidth())
175 | self.labeltperDiv.setSizePolicy(sizePolicy)
176 | self.labeltperDiv.setStyleSheet("color: rgb(0, 255, 255);")
177 | self.labeltperDiv.setObjectName("labeltperDiv")
178 | self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.labeltperDiv)
179 | self.labelTperDivDisplay = QtWidgets.QLabel(self.groupBoxTime)
180 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
181 | sizePolicy.setHorizontalStretch(0)
182 | sizePolicy.setVerticalStretch(0)
183 | sizePolicy.setHeightForWidth(self.labelTperDivDisplay.sizePolicy().hasHeightForWidth())
184 | self.labelTperDivDisplay.setSizePolicy(sizePolicy)
185 | self.labelTperDivDisplay.setStyleSheet("color: rgb(0, 255, 255);")
186 | self.labelTperDivDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
187 | self.labelTperDivDisplay.setObjectName("labelTperDivDisplay")
188 | self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelTperDivDisplay)
189 | self.gridLayout_11.addWidget(self.groupBoxTime, 0, 0, 1, 1)
190 | self.groupBoxVoltage = QtWidgets.QGroupBox(self.groupBoxMeasurements)
191 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
192 | sizePolicy.setHorizontalStretch(0)
193 | sizePolicy.setVerticalStretch(0)
194 | sizePolicy.setHeightForWidth(self.groupBoxVoltage.sizePolicy().hasHeightForWidth())
195 | self.groupBoxVoltage.setSizePolicy(sizePolicy)
196 | self.groupBoxVoltage.setTitle("")
197 | self.groupBoxVoltage.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTop|QtCore.Qt.AlignTrailing)
198 | self.groupBoxVoltage.setFlat(True)
199 | self.groupBoxVoltage.setObjectName("groupBoxVoltage")
200 | self.formLayout = QtWidgets.QFormLayout(self.groupBoxVoltage)
201 | self.formLayout.setLabelAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
202 | self.formLayout.setContentsMargins(0, 0, 0, 0)
203 | self.formLayout.setSpacing(0)
204 | self.formLayout.setObjectName("formLayout")
205 | self.labelVperDiv = QtWidgets.QLabel(self.groupBoxVoltage)
206 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
207 | sizePolicy.setHorizontalStretch(0)
208 | sizePolicy.setVerticalStretch(0)
209 | sizePolicy.setHeightForWidth(self.labelVperDiv.sizePolicy().hasHeightForWidth())
210 | self.labelVperDiv.setSizePolicy(sizePolicy)
211 | self.labelVperDiv.setStyleSheet("color: rgb(0, 255, 255);")
212 | self.labelVperDiv.setObjectName("labelVperDiv")
213 | self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.labelVperDiv)
214 | self.labelVperDivDisplay = QtWidgets.QLabel(self.groupBoxVoltage)
215 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
216 | sizePolicy.setHorizontalStretch(0)
217 | sizePolicy.setVerticalStretch(0)
218 | sizePolicy.setHeightForWidth(self.labelVperDivDisplay.sizePolicy().hasHeightForWidth())
219 | self.labelVperDivDisplay.setSizePolicy(sizePolicy)
220 | self.labelVperDivDisplay.setStyleSheet("color: rgb(0, 255, 255);")
221 | self.labelVperDivDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
222 | self.labelVperDivDisplay.setObjectName("labelVperDivDisplay")
223 | self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.labelVperDivDisplay)
224 | self.labelVpp = QtWidgets.QLabel(self.groupBoxVoltage)
225 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
226 | sizePolicy.setHorizontalStretch(0)
227 | sizePolicy.setVerticalStretch(0)
228 | sizePolicy.setHeightForWidth(self.labelVpp.sizePolicy().hasHeightForWidth())
229 | self.labelVpp.setSizePolicy(sizePolicy)
230 | self.labelVpp.setStyleSheet("color: rgb(0, 255, 255);")
231 | self.labelVpp.setObjectName("labelVpp")
232 | self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.labelVpp)
233 | self.labelVppDisplay = QtWidgets.QLabel(self.groupBoxVoltage)
234 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
235 | sizePolicy.setHorizontalStretch(0)
236 | sizePolicy.setVerticalStretch(0)
237 | sizePolicy.setHeightForWidth(self.labelVppDisplay.sizePolicy().hasHeightForWidth())
238 | self.labelVppDisplay.setSizePolicy(sizePolicy)
239 | self.labelVppDisplay.setStyleSheet("color: rgb(0, 255, 255);")
240 | self.labelVppDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
241 | self.labelVppDisplay.setObjectName("labelVppDisplay")
242 | self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.labelVppDisplay)
243 | self.labelVRMS = QtWidgets.QLabel(self.groupBoxVoltage)
244 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
245 | sizePolicy.setHorizontalStretch(0)
246 | sizePolicy.setVerticalStretch(0)
247 | sizePolicy.setHeightForWidth(self.labelVRMS.sizePolicy().hasHeightForWidth())
248 | self.labelVRMS.setSizePolicy(sizePolicy)
249 | self.labelVRMS.setStyleSheet("color: rgb(0, 255, 255);")
250 | self.labelVRMS.setObjectName("labelVRMS")
251 | self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.labelVRMS)
252 | self.labelVRMS_Display = QtWidgets.QLabel(self.groupBoxVoltage)
253 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
254 | sizePolicy.setHorizontalStretch(0)
255 | sizePolicy.setVerticalStretch(0)
256 | sizePolicy.setHeightForWidth(self.labelVRMS_Display.sizePolicy().hasHeightForWidth())
257 | self.labelVRMS_Display.setSizePolicy(sizePolicy)
258 | self.labelVRMS_Display.setStyleSheet("color: rgb(0, 255, 255);")
259 | self.labelVRMS_Display.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
260 | self.labelVRMS_Display.setObjectName("labelVRMS_Display")
261 | self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelVRMS_Display)
262 | self.labelVRMSAC = QtWidgets.QLabel(self.groupBoxVoltage)
263 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
264 | sizePolicy.setHorizontalStretch(0)
265 | sizePolicy.setVerticalStretch(0)
266 | sizePolicy.setHeightForWidth(self.labelVRMSAC.sizePolicy().hasHeightForWidth())
267 | self.labelVRMSAC.setSizePolicy(sizePolicy)
268 | self.labelVRMSAC.setStyleSheet("color: rgb(0, 255, 255);")
269 | self.labelVRMSAC.setObjectName("labelVRMSAC")
270 | self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.labelVRMSAC)
271 | self.labelVRMSAC_Display = QtWidgets.QLabel(self.groupBoxVoltage)
272 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred)
273 | sizePolicy.setHorizontalStretch(0)
274 | sizePolicy.setVerticalStretch(0)
275 | sizePolicy.setHeightForWidth(self.labelVRMSAC_Display.sizePolicy().hasHeightForWidth())
276 | self.labelVRMSAC_Display.setSizePolicy(sizePolicy)
277 | self.labelVRMSAC_Display.setStyleSheet("color: rgb(0, 255, 255);")
278 | self.labelVRMSAC_Display.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
279 | self.labelVRMSAC_Display.setObjectName("labelVRMSAC_Display")
280 | self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelVRMSAC_Display)
281 | self.gridLayout_11.addWidget(self.groupBoxVoltage, 0, 2, 1, 1)
282 | self.line = QtWidgets.QFrame(self.groupBoxMeasurements)
283 | self.line.setStyleSheet("color: rgb(0, 255, 255);")
284 | self.line.setLineWidth(2)
285 | self.line.setFrameShape(QtWidgets.QFrame.VLine)
286 | self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
287 | self.line.setObjectName("line")
288 | self.gridLayout_11.addWidget(self.line, 0, 1, 1, 1)
289 | self.gridLayout_11.setColumnStretch(0, 1)
290 | self.gridLayout_11.setColumnStretch(1, 1)
291 | self.gridLayout_11.setColumnStretch(2, 1)
292 | self.verticalLayout_2.addWidget(self.groupBoxMeasurements)
293 | self.verticalLayout_2.setStretch(1, 1)
294 | self.verticalLayout.addWidget(self.groupBoxDisplay)
295 | spacerItem = QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
296 | self.verticalLayout.addItem(spacerItem)
297 | self.verticalLayout.setStretch(0, 1)
298 | self.layoutScope.addLayout(self.verticalLayout, 0, 2, 1, 1)
299 | self.layoutControls = QtWidgets.QGridLayout()
300 | self.layoutControls.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
301 | self.layoutControls.setContentsMargins(0, 0, 0, 0)
302 | self.layoutControls.setSpacing(0)
303 | self.layoutControls.setObjectName("layoutControls")
304 | self.groupBoxSettings = QtWidgets.QGroupBox(Controls)
305 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
306 | sizePolicy.setHorizontalStretch(0)
307 | sizePolicy.setVerticalStretch(0)
308 | sizePolicy.setHeightForWidth(self.groupBoxSettings.sizePolicy().hasHeightForWidth())
309 | self.groupBoxSettings.setSizePolicy(sizePolicy)
310 | self.groupBoxSettings.setStyleSheet("")
311 | self.groupBoxSettings.setFlat(False)
312 | self.groupBoxSettings.setObjectName("groupBoxSettings")
313 | self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBoxSettings)
314 | self.gridLayout_3.setContentsMargins(3, 3, 3, 3)
315 | self.gridLayout_3.setSpacing(3)
316 | self.gridLayout_3.setObjectName("gridLayout_3")
317 | self.comboBoxTimeBase = QtWidgets.QComboBox(self.groupBoxSettings)
318 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
319 | sizePolicy.setHorizontalStretch(0)
320 | sizePolicy.setVerticalStretch(0)
321 | sizePolicy.setHeightForWidth(self.comboBoxTimeBase.sizePolicy().hasHeightForWidth())
322 | self.comboBoxTimeBase.setSizePolicy(sizePolicy)
323 | self.comboBoxTimeBase.setInsertPolicy(QtWidgets.QComboBox.InsertAtBottom)
324 | self.comboBoxTimeBase.setFrame(True)
325 | self.comboBoxTimeBase.setObjectName("comboBoxTimeBase")
326 | self.gridLayout_3.addWidget(self.comboBoxTimeBase, 0, 0, 1, 1)
327 | self.labelTimeBase = QtWidgets.QLabel(self.groupBoxSettings)
328 | self.labelTimeBase.setObjectName("labelTimeBase")
329 | self.gridLayout_3.addWidget(self.labelTimeBase, 0, 2, 1, 1)
330 | self.comboBoxVerticalDeflection = QtWidgets.QComboBox(self.groupBoxSettings)
331 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
332 | sizePolicy.setHorizontalStretch(0)
333 | sizePolicy.setVerticalStretch(0)
334 | sizePolicy.setHeightForWidth(self.comboBoxVerticalDeflection.sizePolicy().hasHeightForWidth())
335 | self.comboBoxVerticalDeflection.setSizePolicy(sizePolicy)
336 | self.comboBoxVerticalDeflection.setObjectName("comboBoxVerticalDeflection")
337 | self.gridLayout_3.addWidget(self.comboBoxVerticalDeflection, 1, 0, 1, 1)
338 | self.labelVerticalDeflection = QtWidgets.QLabel(self.groupBoxSettings)
339 | self.labelVerticalDeflection.setObjectName("labelVerticalDeflection")
340 | self.gridLayout_3.addWidget(self.labelVerticalDeflection, 1, 2, 1, 1)
341 | self.labelMultiplier = QtWidgets.QLabel(self.groupBoxSettings)
342 | self.labelMultiplier.setObjectName("labelMultiplier")
343 | self.gridLayout_3.addWidget(self.labelMultiplier, 2, 2, 1, 1)
344 | self.comboBoxMultiplier = QtWidgets.QComboBox(self.groupBoxSettings)
345 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
346 | sizePolicy.setHorizontalStretch(0)
347 | sizePolicy.setVerticalStretch(0)
348 | sizePolicy.setHeightForWidth(self.comboBoxMultiplier.sizePolicy().hasHeightForWidth())
349 | self.comboBoxMultiplier.setSizePolicy(sizePolicy)
350 | self.comboBoxMultiplier.setObjectName("comboBoxMultiplier")
351 | self.gridLayout_3.addWidget(self.comboBoxMultiplier, 2, 0, 1, 1)
352 | self.layoutControls.addWidget(self.groupBoxSettings, 0, 0, 1, 1)
353 | self.groupBoxView = QtWidgets.QGroupBox(Controls)
354 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
355 | sizePolicy.setHorizontalStretch(0)
356 | sizePolicy.setVerticalStretch(0)
357 | sizePolicy.setHeightForWidth(self.groupBoxView.sizePolicy().hasHeightForWidth())
358 | self.groupBoxView.setSizePolicy(sizePolicy)
359 | self.groupBoxView.setObjectName("groupBoxView")
360 | self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBoxView)
361 | self.gridLayout_5.setContentsMargins(0, 0, 0, 0)
362 | self.gridLayout_5.setSpacing(0)
363 | self.gridLayout_5.setObjectName("gridLayout_5")
364 | self.checkBoxLive = QtWidgets.QCheckBox(self.groupBoxView)
365 | self.checkBoxLive.setChecked(True)
366 | self.checkBoxLive.setObjectName("checkBoxLive")
367 | self.gridLayout_5.addWidget(self.checkBoxLive, 2, 0, 1, 1)
368 | self.checkBoxDigitizedView = QtWidgets.QCheckBox(self.groupBoxView)
369 | self.checkBoxDigitizedView.setObjectName("checkBoxDigitizedView")
370 | self.gridLayout_5.addWidget(self.checkBoxDigitizedView, 2, 1, 1, 1)
371 | self.checkBoxSingleShot = QtWidgets.QCheckBox(self.groupBoxView)
372 | self.checkBoxSingleShot.setObjectName("checkBoxSingleShot")
373 | self.gridLayout_5.addWidget(self.checkBoxSingleShot, 4, 0, 1, 1)
374 | self.checkBoxPersist = QtWidgets.QCheckBox(self.groupBoxView)
375 | self.checkBoxPersist.setObjectName("checkBoxPersist")
376 | self.gridLayout_5.addWidget(self.checkBoxPersist, 3, 0, 1, 1)
377 | self.checkBoxLines = QtWidgets.QCheckBox(self.groupBoxView)
378 | self.checkBoxLines.setObjectName("checkBoxLines")
379 | self.gridLayout_5.addWidget(self.checkBoxLines, 3, 1, 1, 1)
380 | self.layoutControls.addWidget(self.groupBoxView, 1, 0, 1, 1)
381 | self.groupBoxStorage = QtWidgets.QGroupBox(Controls)
382 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
383 | sizePolicy.setHorizontalStretch(0)
384 | sizePolicy.setVerticalStretch(0)
385 | sizePolicy.setHeightForWidth(self.groupBoxStorage.sizePolicy().hasHeightForWidth())
386 | self.groupBoxStorage.setSizePolicy(sizePolicy)
387 | self.groupBoxStorage.setObjectName("groupBoxStorage")
388 | self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBoxStorage)
389 | self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
390 | self.gridLayout_4.setSpacing(0)
391 | self.gridLayout_4.setObjectName("gridLayout_4")
392 | self.pushButtonSnapshot = QtWidgets.QPushButton(self.groupBoxStorage)
393 | self.pushButtonSnapshot.setObjectName("pushButtonSnapshot")
394 | self.gridLayout_4.addWidget(self.pushButtonSnapshot, 1, 0, 1, 1)
395 | self.pushButtonDigitizedData = QtWidgets.QPushButton(self.groupBoxStorage)
396 | self.pushButtonDigitizedData.setObjectName("pushButtonDigitizedData")
397 | self.gridLayout_4.addWidget(self.pushButtonDigitizedData, 1, 1, 1, 1)
398 | self.checkBoxPause = QtWidgets.QCheckBox(self.groupBoxStorage)
399 | self.checkBoxPause.setObjectName("checkBoxPause")
400 | self.gridLayout_4.addWidget(self.checkBoxPause, 0, 0, 1, 1)
401 | self.layoutControls.addWidget(self.groupBoxStorage, 2, 0, 1, 1)
402 | self.groupBoxSetup = QtWidgets.QGroupBox(Controls)
403 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
404 | sizePolicy.setHorizontalStretch(0)
405 | sizePolicy.setVerticalStretch(0)
406 | sizePolicy.setHeightForWidth(self.groupBoxSetup.sizePolicy().hasHeightForWidth())
407 | self.groupBoxSetup.setSizePolicy(sizePolicy)
408 | self.groupBoxSetup.setObjectName("groupBoxSetup")
409 | self.gridLayout = QtWidgets.QGridLayout(self.groupBoxSetup)
410 | self.gridLayout.setContentsMargins(0, 0, 0, 0)
411 | self.gridLayout.setSpacing(0)
412 | self.gridLayout.setObjectName("gridLayout")
413 | self.comboBoxCameraSelect = QtWidgets.QComboBox(self.groupBoxSetup)
414 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
415 | sizePolicy.setHorizontalStretch(0)
416 | sizePolicy.setVerticalStretch(0)
417 | sizePolicy.setHeightForWidth(self.comboBoxCameraSelect.sizePolicy().hasHeightForWidth())
418 | self.comboBoxCameraSelect.setSizePolicy(sizePolicy)
419 | self.comboBoxCameraSelect.setObjectName("comboBoxCameraSelect")
420 | self.gridLayout.addWidget(self.comboBoxCameraSelect, 0, 1, 1, 1)
421 | self.toolButtonCalibrate = QtWidgets.QToolButton(self.groupBoxSetup)
422 | self.toolButtonCalibrate.setObjectName("toolButtonCalibrate")
423 | self.gridLayout.addWidget(self.toolButtonCalibrate, 0, 0, 1, 1)
424 | self.layoutControls.addWidget(self.groupBoxSetup, 3, 0, 1, 1)
425 | self.dockWidgetCalibration = QtWidgets.QDockWidget(Controls)
426 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
427 | sizePolicy.setHorizontalStretch(0)
428 | sizePolicy.setVerticalStretch(0)
429 | sizePolicy.setHeightForWidth(self.dockWidgetCalibration.sizePolicy().hasHeightForWidth())
430 | self.dockWidgetCalibration.setSizePolicy(sizePolicy)
431 | self.dockWidgetCalibration.setFloating(True)
432 | self.dockWidgetCalibration.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures)
433 | self.dockWidgetCalibration.setObjectName("dockWidgetCalibration")
434 | self.dockWidgetContents = QtWidgets.QWidget()
435 | self.dockWidgetContents.setObjectName("dockWidgetContents")
436 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.dockWidgetContents)
437 | self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
438 | self.verticalLayout_3.setSpacing(0)
439 | self.verticalLayout_3.setObjectName("verticalLayout_3")
440 | self.groupBoxCalibration = QtWidgets.QGroupBox(self.dockWidgetContents)
441 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
442 | sizePolicy.setHorizontalStretch(0)
443 | sizePolicy.setVerticalStretch(0)
444 | sizePolicy.setHeightForWidth(self.groupBoxCalibration.sizePolicy().hasHeightForWidth())
445 | self.groupBoxCalibration.setSizePolicy(sizePolicy)
446 | self.groupBoxCalibration.setTitle("")
447 | self.groupBoxCalibration.setObjectName("groupBoxCalibration")
448 | self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBoxCalibration)
449 | self.gridLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
450 | self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
451 | self.gridLayout_2.setSpacing(0)
452 | self.gridLayout_2.setObjectName("gridLayout_2")
453 | self.labelHorizontalDivisions = QtWidgets.QLabel(self.groupBoxCalibration)
454 | self.labelHorizontalDivisions.setObjectName("labelHorizontalDivisions")
455 | self.gridLayout_2.addWidget(self.labelHorizontalDivisions, 1, 1, 1, 1)
456 | self.spinBoxHorizontalDivisions = QtWidgets.QSpinBox(self.groupBoxCalibration)
457 | self.spinBoxHorizontalDivisions.setMinimum(1)
458 | self.spinBoxHorizontalDivisions.setMaximum(15)
459 | self.spinBoxHorizontalDivisions.setObjectName("spinBoxHorizontalDivisions")
460 | self.gridLayout_2.addWidget(self.spinBoxHorizontalDivisions, 1, 3, 1, 1)
461 | self.pushButtonReset = QtWidgets.QPushButton(self.groupBoxCalibration)
462 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
463 | sizePolicy.setHorizontalStretch(0)
464 | sizePolicy.setVerticalStretch(0)
465 | sizePolicy.setHeightForWidth(self.pushButtonReset.sizePolicy().hasHeightForWidth())
466 | self.pushButtonReset.setSizePolicy(sizePolicy)
467 | self.pushButtonReset.setObjectName("pushButtonReset")
468 | self.gridLayout_2.addWidget(self.pushButtonReset, 0, 3, 1, 1)
469 | self.pushButtonCrop = QtWidgets.QPushButton(self.groupBoxCalibration)
470 | self.pushButtonCrop.setObjectName("pushButtonCrop")
471 | self.gridLayout_2.addWidget(self.pushButtonCrop, 0, 1, 1, 1)
472 | self.spinBoxVerticalDivisions = QtWidgets.QSpinBox(self.groupBoxCalibration)
473 | self.spinBoxVerticalDivisions.setMinimum(1)
474 | self.spinBoxVerticalDivisions.setMaximum(15)
475 | self.spinBoxVerticalDivisions.setObjectName("spinBoxVerticalDivisions")
476 | self.gridLayout_2.addWidget(self.spinBoxVerticalDivisions, 2, 3, 1, 1)
477 | self.labelVerticalDivisions = QtWidgets.QLabel(self.groupBoxCalibration)
478 | self.labelVerticalDivisions.setObjectName("labelVerticalDivisions")
479 | self.gridLayout_2.addWidget(self.labelVerticalDivisions, 2, 1, 1, 1)
480 | self.pushButtonGrid = QtWidgets.QPushButton(self.groupBoxCalibration)
481 | self.pushButtonGrid.setObjectName("pushButtonGrid")
482 | self.gridLayout_2.addWidget(self.pushButtonGrid, 3, 1, 1, 1)
483 | self.verticalLayout_3.addWidget(self.groupBoxCalibration)
484 | self.dockWidgetCalibration.setWidget(self.dockWidgetContents)
485 | self.layoutControls.addWidget(self.dockWidgetCalibration, 4, 0, 1, 1)
486 | spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
487 | self.layoutControls.addItem(spacerItem1, 5, 0, 1, 1)
488 | self.layoutScope.addLayout(self.layoutControls, 0, 3, 1, 1)
489 | spacerItem2 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
490 | self.layoutScope.addItem(spacerItem2, 1, 3, 1, 1)
491 | self.layoutScope.setColumnStretch(0, 2)
492 | self.gridLayout_6.addLayout(self.layoutScope, 0, 1, 1, 1)
493 | spacerItem3 = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
494 | self.gridLayout_6.addItem(spacerItem3, 0, 2, 1, 1)
495 |
496 | self.retranslateUi(Controls)
497 | QtCore.QMetaObject.connectSlotsByName(Controls)
498 |
499 | def retranslateUi(self, Controls):
500 | _translate = QtCore.QCoreApplication.translate
501 | Controls.setWindowTitle(_translate("Controls", "Form"))
502 | self.labelDeltaT.setText(_translate("Controls", "T"))
503 | self.labelDeltaTDisplay.setText(_translate("Controls", "0"))
504 | self.labelTInverse.setText(_translate("Controls", "F"))
505 | self.labelTInverseDisplay.setText(_translate("Controls", "0"))
506 | self.labeltperDiv.setText(_translate("Controls", "T/Div"))
507 | self.labelTperDivDisplay.setText(_translate("Controls", "0"))
508 | self.labelVperDiv.setText(_translate("Controls", "V/Div"))
509 | self.labelVperDivDisplay.setText(_translate("Controls", "0"))
510 | self.labelVpp.setText(_translate("Controls", "Vpp"))
511 | self.labelVppDisplay.setText(_translate("Controls", "0"))
512 | self.labelVRMS.setText(_translate("Controls", "VRMS"))
513 | self.labelVRMS_Display.setText(_translate("Controls", "-"))
514 | self.labelVRMSAC.setText(_translate("Controls", "VRMS(AC)"))
515 | self.labelVRMSAC_Display.setText(_translate("Controls", "-"))
516 | self.groupBoxSettings.setTitle(_translate("Controls", "Settings"))
517 | self.comboBoxTimeBase.setToolTip(_translate("Controls", "Seconds per centimeter"))
518 | self.labelTimeBase.setText(_translate("Controls", "Timebase"))
519 | self.labelVerticalDeflection.setText(_translate("Controls", "Vertical deflection"))
520 | self.labelMultiplier.setText(_translate("Controls", "Multiplier"))
521 | self.groupBoxView.setTitle(_translate("Controls", "View"))
522 | self.checkBoxLive.setText(_translate("Controls", "Live"))
523 | self.checkBoxDigitizedView.setText(_translate("Controls", "Digitized"))
524 | self.checkBoxSingleShot.setText(_translate("Controls", "Single shot"))
525 | self.checkBoxPersist.setText(_translate("Controls", "Persist"))
526 | self.checkBoxLines.setText(_translate("Controls", "Lines"))
527 | self.groupBoxStorage.setTitle(_translate("Controls", "Storage"))
528 | self.pushButtonSnapshot.setText(_translate("Controls", "Snapshot"))
529 | self.pushButtonDigitizedData.setText(_translate("Controls", "Digitized Data"))
530 | self.checkBoxPause.setText(_translate("Controls", "Pause"))
531 | self.groupBoxSetup.setTitle(_translate("Controls", "Setup"))
532 | self.toolButtonCalibrate.setText(_translate("Controls", "Calibrate"))
533 | self.dockWidgetCalibration.setWindowTitle(_translate("Controls", "&Calibration"))
534 | self.labelHorizontalDivisions.setText(_translate("Controls", "Horizontal Divisions"))
535 | self.pushButtonReset.setText(_translate("Controls", "Reset"))
536 | self.pushButtonCrop.setText(_translate("Controls", "Crop"))
537 | self.labelVerticalDivisions.setText(_translate("Controls", "Vertical Divisions"))
538 | self.pushButtonGrid.setText(_translate("Controls", "Grid"))
539 |
540 | from Forms.CursorControl import CursorControl
541 | from Forms.DigitizerView import DigitizerView
542 | from Forms.Grid import Grid
543 | from Forms.WebCamView import WebCamView
544 |
545 | if __name__ == "__main__":
546 | import sys
547 | app = QtWidgets.QApplication(sys.argv)
548 | Controls = QtWidgets.QWidget()
549 | ui = Ui_Controls()
550 | ui.setupUi(Controls)
551 | Controls.show()
552 | sys.exit(app.exec_())
553 |
554 |
--------------------------------------------------------------------------------
/Forms/icons_rc.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | # Resource object code
4 | #
5 | # Created by: The Resource Compiler for PyQt5 (Qt v5.9.4)
6 | #
7 | # WARNING! All changes made in this file will be lost!
8 |
9 | from PyQt5 import QtCore
10 |
11 | qt_resource_data = b"\
12 | \x00\x00\x23\x1d\
13 | \x89\
14 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
15 | \x00\x00\x40\x00\x00\x00\x35\x08\x06\x00\x00\x00\xf1\x86\xed\xac\
16 | \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
17 | \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\
18 | \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
19 | \xe3\x06\x06\x12\x17\x15\x81\xd3\x7e\x93\x00\x00\x20\x00\x49\x44\
20 | \x41\x54\x68\xde\x55\xba\x69\x8c\xa5\xd9\x79\xdf\xf7\x3b\xcb\xbb\
21 | \xdc\xf7\x2e\x75\x6b\xaf\xea\xa5\x7a\x9f\xee\x9e\xee\x59\xba\x87\
22 | \xb3\x71\x1d\x0d\x35\x32\x29\x09\xb2\x65\xc6\x8e\x11\xca\xb2\xe5\
23 | \xc4\x49\x6c\x39\x81\x10\x20\x01\x04\x24\x00\xe3\x00\x81\xa3\x0f\
24 | \x0e\x62\xf8\x43\x3e\x44\x46\x02\x47\x8e\x0d\x49\xa4\x24\x9a\x26\
25 | \x29\x71\x38\xe4\x70\x16\xce\x0c\x87\x33\x3d\xdd\xd3\xfb\x54\x6f\
26 | \x55\x5d\x7b\xdd\xba\xdb\xbb\x9e\x25\x1f\xde\xea\x61\x52\xc0\x45\
27 | \x15\x50\xf7\xde\xf7\x3c\xe7\x3c\xcf\x73\xfe\xff\xff\xf3\x17\x5f\
28 | \xf9\xfa\x3f\xf4\xff\xc3\x6f\x1d\x64\x71\x2e\xc0\x7b\x87\x94\x92\
29 | \xcd\x0d\xcf\x38\x55\x04\x7e\x8f\x83\x8b\x00\x15\xce\x39\x00\x94\
30 | \xd6\x78\x6b\xb1\x65\x85\x31\x1e\x3c\x78\xe7\x10\x42\xe0\xac\xc7\
31 | \x7b\x81\xf5\x1e\xad\x41\x07\x02\x21\x04\xd6\x38\xac\xb5\x48\x09\
32 | \x52\x09\x6c\xa5\xd9\xda\x18\x62\x4c\xc1\xf4\x4c\x03\xef\x1d\x4e\
33 | \x84\x54\x56\x52\x1a\x8b\x47\xe2\x3d\x54\xc6\xa1\x95\xa6\x34\x06\
34 | \xef\x41\x48\x0d\x72\xff\xfb\x9c\x03\x0f\xd6\x82\x75\x16\xef\xc1\
35 | \x7b\xb0\xd6\x63\x9d\xc3\x7a\x8f\xb3\x1e\xbc\xc3\x1a\x83\x35\x16\
36 | \x6b\x2a\x16\x17\xda\x14\x55\xc5\xda\xd0\x72\x63\xa3\x40\xff\xe7\
37 | \x7f\x2d\xe1\xc2\xe3\x82\x28\x89\x91\x12\x46\x83\x8c\xf1\x28\xe4\
38 | \xec\xc5\x17\xb9\xfa\xd3\x6f\x23\x65\xc9\x81\x83\xb3\x54\x55\x89\
39 | \x03\xf2\xac\xa2\x3f\xc8\xd9\x4e\x4b\xae\x5c\x5f\xe3\xee\x83\x1e\
40 | \x7b\xfd\x94\xbc\xb4\x08\x01\xed\x66\xcc\xd2\x62\x97\xb3\x27\x67\
41 | \x39\xb8\xd0\xa6\x11\x08\xa6\xa6\xdb\xe0\x1d\xa6\x32\x00\x64\xd5\
42 | \x34\x27\x17\x2f\x30\xdc\x5d\x63\xbc\x7b\x83\x23\x47\xe7\x29\xcb\
43 | \x1c\x63\x1d\x83\x41\xce\x4e\x2f\x63\x73\xab\x8f\xa9\x2c\x52\x08\
44 | \xac\xf5\x38\xc0\x7b\x8f\x75\x1e\xcf\x2f\x36\x1e\x04\x50\x07\xed\
45 | \x6c\x7d\x48\xce\xef\xff\x1f\x10\x52\x22\xa4\xc4\x23\x30\xc6\xb0\
46 | \xbc\xbc\x8e\x07\x66\xe7\x26\xf8\xd2\xe9\x09\xf4\x5c\xd7\x12\xc5\
47 | \x0d\x4c\x59\x80\xf3\x04\x4a\x72\xf3\xd2\xbb\x7c\xf7\x9b\xdf\x26\
48 | \x0a\x0c\x13\x93\xf0\xf5\xdf\xfe\x0d\x06\xc3\x82\x6b\xcb\x9b\xfc\
49 | \xe8\xed\xdb\x7c\xff\xb5\x6b\x5c\xbe\xb6\x45\x65\xa1\x7e\x24\x08\
50 | \x01\xc8\xfa\x14\xa8\xff\xe4\xc8\xc1\x98\xcf\x7f\xe6\x38\x2f\x7f\
51 | \xf6\x34\xe7\x8e\x4f\x73\x68\xae\x0b\xde\x71\xe7\xd6\x6d\xd6\xd6\
52 | \x2e\x71\xeb\xea\x15\x26\xa7\x22\x16\x16\xa7\x50\x52\xa2\x95\x24\
53 | \xcb\x4a\xfe\xcf\x7f\xf5\x1a\x0f\x56\xf6\x68\x4f\xb4\x11\x42\x22\
54 | \xea\x90\x11\x4a\x20\x04\x08\x21\xf1\xae\x0e\x5d\x08\x81\xdc\x0f\
55 | \xd2\x79\x8f\xc7\xee\xaf\x41\x00\x02\xe7\x2d\xde\x0b\xf6\x3f\x88\
56 | \x90\x92\x74\x5c\x70\xfa\x74\x9b\x2f\xbd\x74\x01\x6d\x6d\x85\x29\
57 | \x72\xac\xf3\xb0\x9f\x56\x27\x4f\xcd\x70\xef\xee\x0a\xe3\x6c\xcc\
58 | \xe9\xf3\x8f\xf3\xf6\xcf\x1f\xf0\x6f\xff\xfc\x1d\xfe\xec\x7b\x97\
59 | \x59\xdf\x2c\x51\x4a\x20\x95\x42\x4a\x8f\x14\xe2\x17\x51\x3f\xfa\
60 | \x55\xaf\x8c\xfb\xeb\x15\x7f\xf4\xef\xaf\xf2\x27\x7f\x79\x95\xe7\
61 | \x9f\x3a\xcc\xdf\x7c\xe5\x2c\x5f\xbc\x78\x8c\x20\x28\xb9\x7a\xf5\
62 | \x0a\x9b\xeb\xdb\x48\xd5\xc1\x54\x15\x06\x8b\x94\x8a\xf1\xa8\xa4\
63 | \xdd\xd2\xfc\x93\xdf\xff\x87\x1c\x3a\x72\x04\x2f\x3c\x78\x8b\x90\
64 | \x1e\x21\x40\xaa\xfd\xcd\xf6\x96\x7c\x34\xc0\x56\x05\x52\x2a\x10\
65 | \x12\xa1\x24\x49\x2b\x46\x6a\xf5\x68\x29\xfb\x6b\x13\x08\x59\xaf\
66 | \x59\x69\x45\x91\x96\x7c\xf8\xd6\xdb\xd8\xaa\x42\x3b\xfb\x69\x21\
67 | \xe1\xbc\x45\x78\xc1\x89\x13\x0b\x84\xf1\xf3\x0c\x87\x39\xdf\x7b\
68 | \x73\x99\x3f\xfd\xee\xab\x7c\x7c\x7d\x1b\xa5\x04\x81\xae\x77\x56\
69 | \xee\x9f\x88\xf3\x1e\xa9\xea\x5a\xf7\x80\xf0\x75\x56\x18\xe7\xf0\
70 | \xae\x7e\x78\x55\x0a\x7e\xf2\xfe\x0a\x97\x97\x37\x79\xe9\xb9\xbb\
71 | \xfc\xd6\x57\x2f\xf2\x85\x2f\x9c\xa7\xbf\xd7\xe7\xd0\xc1\x49\xb4\
72 | \x16\x98\xca\xe3\x9d\x43\xe2\x78\xea\xc9\x23\xfc\x8d\xdf\xf9\x3b\
73 | \xc0\xc4\x7e\x14\x06\xb0\xfb\xaf\x9c\xd1\x60\x87\x66\x2b\x66\x34\
74 | \xd8\x61\xd4\xdb\x41\xeb\x3a\x30\x2f\x05\x9d\x6e\x87\xd1\x70\xc8\
75 | \xe4\xcc\xec\xa7\xe5\xf1\x28\x1b\xea\xbc\xf4\xd8\x22\xe3\xf6\xa5\
76 | \x9f\xe1\xac\x47\x23\xea\xc5\xe3\x3d\x62\x7f\xb7\xb4\x86\xb9\x03\
77 | \x33\xfc\xf3\xff\xf9\x9b\xfc\xf9\xf7\x3e\x66\x34\x32\x68\x29\x10\
78 | \x1e\x94\x52\xa8\x40\x22\xa4\x27\x08\x35\xcd\x56\x83\x56\x2b\x26\
79 | \x69\x84\x04\x81\xa6\x32\x06\x63\x1c\x45\x69\x19\x8d\x72\xc6\xe3\
80 | \x9c\x2c\x2b\x28\x2b\xc3\xde\x5e\xc5\xbf\xff\xc9\x1d\x96\x37\xfa\
81 | \xfc\xde\xdf\x7a\x8e\x5f\x79\xe9\x09\xb2\x2c\xa5\x2a\xf7\x4f\x11\
82 | \x08\x03\x45\x23\x12\xac\x5d\xfb\x39\xdd\xa5\x73\x20\x43\x1a\x8d\
83 | \x16\x60\x28\x8a\x21\x7b\x3b\x1b\x24\xcd\x18\x8f\x27\x6a\x24\x64\
84 | \xf9\x98\x3c\xcb\x88\x03\x45\xd2\x6c\x20\x75\x5d\x32\x5b\xeb\xab\
85 | \x4c\xcd\x4e\x21\x95\x46\x20\x00\xc8\x8b\x92\x28\x0c\x29\xca\x0c\
86 | \x29\xa1\xaa\x2a\xb4\x73\x1e\xef\x3c\xd6\x54\x48\x29\x90\x0a\x7a\
87 | \xfd\x94\xff\xfa\x1b\xdf\xe4\xd5\x37\xef\x93\x8e\x4b\x24\x82\x48\
88 | \x2b\xa2\x48\xa3\x43\xe8\x74\x5b\x2c\x1d\x5b\x60\x71\x71\x06\xd5\
89 | \x52\x54\x0d\x49\x95\x04\x54\x91\xc4\x49\x70\xd6\x61\x4b\x4b\x39\
90 | \xca\x49\x77\x47\x14\x9b\x29\xdb\x77\x77\xe8\x6d\xec\x91\xe6\x86\
91 | \x8f\x3f\xe9\xf1\x4f\xff\xef\x37\x70\xde\xf2\xd2\x53\x87\x91\x5a\
92 | \x63\x2b\x53\xd7\xbb\x14\xe0\x0c\x83\xf5\x55\xc2\xa9\x69\x1a\xcd\
93 | \x49\xfa\xbd\x01\x52\x0a\x84\x2f\x48\x92\x88\x56\xbb\xc9\x68\xdc\
94 | \x07\x1c\xed\x4e\x87\xe9\x99\x69\x8c\x29\x29\xca\x9c\xd1\x70\x44\
95 | \x77\x6a\x82\xcd\x8d\x0d\x7a\x5b\xdb\x74\x26\xbb\xac\xaf\x6d\xd3\
96 | \x9d\x6c\xb3\xbb\xbb\x47\xa7\xd3\x26\xd2\x41\x7d\xab\x79\x87\x36\
97 | \xce\xe3\x70\x28\x1d\x80\x77\x48\x15\xf1\x3f\xfd\xcb\x6f\xf3\xfa\
98 | \xbb\x2b\x64\x69\x89\x16\x90\xc4\x21\xcd\x66\xc8\xec\xec\x04\x8f\
99 | \x3f\x71\x9c\xee\x42\x9b\xf6\xd2\x34\x7b\x2d\x18\x4c\x04\x8c\x94\
100 | \xc7\x2a\x70\x78\xf2\xaa\x22\xaf\x4a\xbc\x77\xc0\x04\x45\x3e\x49\
101 | \x9e\x96\x04\x3b\x0b\xcc\x2d\xf7\x49\x2f\xad\x32\x58\x1b\xb0\xbe\
102 | \x95\xf3\x07\xdf\x7a\x8f\x85\xe9\x0e\x67\x0e\x76\x70\xde\xa1\x84\
103 | \xac\x3b\xbb\x87\x6c\x38\x60\x7a\x7e\x96\x1b\x97\xaf\xf3\x07\xbf\
104 | \xff\x4f\xf9\xdc\x2b\xbf\xcc\xdf\xfd\x47\x7f\x17\x21\x35\xe3\x74\
105 | \x40\xbb\x1d\x93\xa5\x19\x51\xac\x31\x95\x21\x8a\x63\xd2\x6c\x4c\
106 | \x14\x68\x76\x7b\xbb\x4c\xcd\x74\x11\x42\x70\xf3\xca\x0d\x6e\x5e\
107 | \xb9\xce\xd3\x2f\x7c\x86\xa3\x27\x8f\x03\x90\xee\x0d\x00\x87\x00\
108 | \xb4\x35\x1e\x6f\x0c\xd6\x43\xa3\x91\xf0\x87\x7f\xf2\x06\xdf\x7d\
109 | \x73\x99\xe1\xa8\x6e\x76\xdd\x4e\x93\xd9\x99\x26\x4f\x3d\x75\x82\
110 | \xe7\x3e\xfb\x04\x65\x5b\xb2\xd1\x95\x3c\x88\x2c\xae\xa1\xd9\x2e\
111 | \x32\xc6\xc6\xa0\x3c\x74\x82\x88\x6e\x12\x50\xda\x88\x2c\xcf\x41\
112 | \x2a\x72\x69\x19\xe0\x29\x1b\x0d\xdc\x42\x44\xfc\xf8\x14\x07\xdf\
113 | \x79\xc8\xe8\xe3\x87\xf4\x76\x73\xfe\xd7\x3f\xff\x29\xff\xcb\xdf\
114 | \x7f\x99\x76\xac\xb0\xd6\xa1\x94\x44\x08\x48\x87\x43\xc0\x33\x33\
115 | \x33\xc1\xd3\x4f\x9f\x65\xa2\x21\xd8\xdb\xde\xa2\x33\xd3\x21\x69\
116 | \x68\xd2\x34\x47\xeb\x90\xad\x8d\x11\x57\x2f\xdf\xa2\xd5\x4e\x38\
117 | \x73\xee\x04\xde\xa5\x08\xa0\xdf\x1f\x32\x3d\x33\xc9\xb1\x93\xc7\
118 | \xe9\x76\xbb\x4c\xcd\xcf\x50\x77\x27\x89\xf3\x0e\xe9\x3d\x08\xd0\
119 | \x5a\x07\x38\xeb\x89\xa2\x98\x8f\x3f\x59\xe5\x9b\x3f\xbe\xc1\xf6\
120 | \xd6\x98\x46\xac\x99\x9a\x9b\x60\x66\x7e\x82\x97\xbf\xf0\x04\x5f\
121 | \xfe\xca\xe7\xd8\x24\x65\x33\x72\x48\x69\x98\x90\x8e\xc1\x78\x4c\
122 | \xa7\xd5\x24\x1f\x0d\x89\x9c\x40\x59\x87\x96\x9a\x44\x05\x74\x62\
123 | \xc5\xa0\x2c\xe8\xa8\x08\x95\x48\x06\xa6\xc2\x07\x9e\x38\x6e\x10\
124 | \x7c\xf5\x34\x33\x53\x2d\xfc\xd5\x87\xac\x6c\x8d\xf9\x93\xb7\xae\
125 | \xf2\xdb\x5f\x7a\x02\xbc\x40\x29\x85\x94\x50\x64\x63\xf0\x15\xd3\
126 | \x8b\x0b\x7c\xfd\xbf\xfa\x2f\xc9\xc6\x23\xda\x93\x2d\xaa\x22\x83\
127 | \x30\x40\x78\xc5\xbb\xaf\xbd\xcb\xbf\xf8\x83\x3f\xc4\x58\xc7\xe2\
128 | \x7c\x97\x43\x87\x67\x79\xfe\x97\x5e\xe0\xe2\x0b\x67\x51\xb2\x62\
129 | \x30\x18\xd1\xe9\x74\x58\x6c\x35\x29\x8b\x14\x53\x55\xe8\x20\xc4\
130 | \x54\x25\x42\x82\x94\x02\xed\xf7\x01\x44\x5e\x56\xbc\xf6\xf3\x65\
131 | \x2e\x7d\xbc\x86\x16\x82\xee\x6c\x87\x60\xb1\xc9\xd2\xe3\x8b\x7c\
132 | \xf6\x95\xe7\xe9\x4d\x69\xee\x3b\x41\x6e\x3d\x3b\x55\xc9\x5a\x3a\
133 | \x42\xcb\x80\x07\xc3\x3d\xf6\x30\x4c\x5a\x89\x51\x01\x3b\x76\x4c\
134 | \x62\x60\x52\x45\xa4\x38\x2a\xe1\x30\x78\x76\xa9\x30\x38\x3a\x5e\
135 | \x93\x2a\x03\xcf\x4c\xf1\xb8\xf3\xb8\x8f\x97\x79\xef\xe1\x1e\x9f\
136 | \xdb\xec\x71\x7c\x7a\x02\x29\xea\x0c\xa8\x8a\x02\x4c\x05\x41\x93\
137 | \xa9\xf9\xc3\x58\x97\x92\xa5\x3b\x84\xa1\x02\xa1\xb9\xf4\xfa\xdb\
138 | \x24\x2e\xe6\xc0\xf4\x3c\x9d\x50\x71\x6a\xaa\x49\x0b\xb8\xfe\x9d\
139 | \xb7\x98\x6a\xb7\x39\xf9\xcc\x12\xc2\x3b\xf2\xbc\x20\x8e\xdb\x5c\
140 | \x7e\xe7\x12\xd3\xf3\x33\x1c\x3d\x7d\xaa\x46\x85\xd6\x61\x2d\x68\
141 | \xef\x3d\x2a\x08\xb8\xfb\xb0\xc7\x0f\x7e\x74\x9d\xbc\x5f\xd2\x6e\
142 | \x35\x88\x67\x1a\x2c\x9c\x3a\xc8\x53\x2f\x7f\x9e\xad\xa9\x84\xac\
143 | \xa5\x49\x33\xc1\xb8\xac\xc8\x94\x26\x6c\xcf\x93\x84\x11\x0d\x34\
144 | \xfd\x7c\xbb\x86\x10\x51\x13\x95\x34\x50\x42\x53\x95\x25\xd9\x68\
145 | \x07\x89\xa0\x9d\xb4\x58\xea\x1c\xc1\x5a\x8f\x18\x8d\x30\xc3\x2d\
146 | \x8a\x86\x63\xf0\xf2\x69\x26\x3a\x09\xab\x0f\x57\xf8\xd9\xbd\x2d\
147 | \x8e\x74\x3b\x08\x51\xdf\xd9\x55\x51\x60\x8a\x0c\x15\x4c\x20\xb0\
148 | \x78\x57\xa1\xa4\x25\x08\x42\xde\x7d\xe3\x43\x5e\xfd\xee\xdb\x8c\
149 | \xfb\x29\x1d\x04\x7f\xfd\xd0\x22\xe7\xa7\x3b\x08\xeb\x28\xf2\x8a\
150 | \xeb\x7f\xfa\x1a\xee\xf8\xd7\x68\x2e\x4c\x61\x0c\x0c\x76\xfb\x6c\
151 | \xad\x8d\xb9\x75\x63\x9d\x4e\x77\x12\x6f\x2c\xce\x5a\x9c\x01\x29\
152 | \xa5\xc0\x54\x8e\x4f\xee\xf5\xb8\xf4\xd1\x2a\x5a\x4a\x9a\xdd\x84\
153 | \xd9\x99\x36\xc7\x9f\x3c\x45\x71\x72\x91\xf5\x66\x4c\xcf\x0b\x46\
154 | \x65\x45\x6e\x2d\xc2\x4b\xba\x71\x9b\x56\xd4\x62\xb1\x35\xc9\x5c\
155 | \xd8\xa4\x29\x54\xcd\x03\x64\x40\x25\x03\x8c\x0c\x28\x9c\xc3\x4b\
156 | \x41\x23\x88\x48\x82\x88\x48\x85\xf5\x09\x3b\x8f\x72\x9e\x72\x32\
157 | \xa4\xff\xf8\x1c\x7e\x73\xcc\xf2\x9d\x3e\xeb\xbd\xb4\x06\x64\x5e\
158 | \x60\x2a\x4b\x95\xa6\x88\xfd\xfb\xdf\xb9\x82\xd1\xa8\x8f\xa0\xe2\
159 | \xbd\xb7\x3f\xe2\x27\x6f\x5e\x63\xf5\xe1\x0e\xad\x34\xe7\xbc\x15\
160 | \xd8\xf5\x5d\xfc\x20\xa3\xd5\xcf\xb9\xb0\x9e\x93\xfd\xeb\x57\xb1\
161 | \x38\x9c\x73\x2c\xdf\x58\xe6\x5b\xff\xf6\x87\xfc\x6f\xff\xec\x9b\
162 | \xbc\xf3\x93\x4b\xb8\xca\x60\x8c\x41\xe0\xd1\x78\xcf\x70\x94\x71\
163 | \xfd\xf6\x36\xc3\x81\xa5\xdd\x4d\xe8\x4e\xb5\x78\xec\xf4\x51\xaa\
164 | \xd9\x80\xbb\xd9\x2a\xb1\x09\xb0\xc2\x61\x6d\x05\x95\x21\x37\x15\
165 | \x99\x2b\xd0\x08\x9c\xb3\xb8\xb2\xc0\x9b\x92\xc2\xee\xf1\x30\xdf\
166 | \x02\xeb\x99\x15\x21\x85\x29\x90\x41\x44\x99\x8f\xb9\xbf\xb7\xc6\
167 | \xb8\x2a\x69\x3a\x49\x66\x4a\x1c\x9e\xc1\xde\x0e\xa5\xcb\x39\xb9\
168 | \x30\xcb\xa0\x97\x73\xf3\xee\x06\xe7\x0e\x4f\xef\x93\x21\x4f\x91\
169 | \xa6\x34\xb0\x80\xc0\x7b\x47\xd2\x88\x41\x0a\xc2\xa8\x41\x7f\x98\
170 | \xf2\xd8\xf1\x25\x92\x32\x27\xdf\x1d\xd0\x52\x0a\xdf\x2f\x29\x87\
171 | \x63\x54\x5a\x32\x71\x63\x9d\x10\x41\x26\x0c\xdd\xa9\x0e\xad\x4e\
172 | \x8b\x03\x0b\x5d\x06\xdb\x1b\xd8\x72\x09\x63\x0d\x51\x10\x20\x03\
173 | \x2d\x18\x8e\x32\x6e\x2e\xaf\x23\x80\x46\x12\xb1\xb8\x38\x49\xf7\
174 | \xc8\x34\xe5\x84\x02\x57\x90\x65\x03\x06\xc3\x3d\x8a\xb2\xa0\xb0\
175 | \x86\xa2\xca\x29\xf2\x94\xc0\x7b\xca\xf1\x18\xe1\x2c\x91\xd4\x24\
176 | \x48\xa6\xa4\x62\x52\x48\x94\xb5\x08\x3c\x4a\x0a\xbc\x73\x84\x78\
177 | \x1a\x42\x10\x7b\x41\x88\xa8\x79\x47\x65\x69\xc5\x21\xc1\x89\x59\
178 | \xaa\xca\x72\x7f\xb5\xc7\x70\x5c\x82\xaf\x09\x4d\x39\x1e\x02\x15\
179 | \x60\x10\xc2\x33\x1e\x0e\xe8\x6f\x3f\xe4\x57\x7e\xed\x05\x8a\xa2\
180 | \xe4\xc6\xed\xfb\xec\x36\x62\x3e\x18\x0d\x11\x16\xe4\xd6\x08\xbf\
181 | \x35\x44\x25\x4d\x76\xdb\x0d\xfa\x0f\x37\x89\xe2\x98\x99\xb9\x0e\
182 | \xff\xe0\x77\xff\x3a\xbf\xfb\xdf\xfe\x06\x2f\x7e\xe9\x33\xf5\x5d\
183 | \x20\x45\xbd\xbe\xdf\xf9\x3b\xcf\x7c\x23\x0a\x24\xdf\xfc\xfe\x65\
184 | \xd6\x77\xc7\xcc\x2e\x74\x39\x7d\xfe\x08\xad\xb3\x8b\x8c\x9a\xe0\
185 | \xac\x21\xd4\x01\x7e\xff\xaa\x93\xd6\x53\x78\x4b\x5e\x95\xc8\xca\
186 | \xe1\x9d\xa3\x21\x43\x26\x75\x48\x60\x1c\xd2\x3a\xba\x41\x4c\x60\
187 | \x1c\x5a\x2a\x1a\x4e\xd2\x70\x35\x51\x51\xd6\xd3\x75\x12\x05\x48\
188 | \x04\x13\x3a\xc4\x19\x43\x22\x34\xc1\x4a\x8f\x96\x52\x68\x57\xa2\
189 | \x85\x23\x08\x14\xb3\x07\xe7\xe9\x1c\x9c\xc1\xe3\x10\xc2\x22\x29\
190 | \x09\x84\x67\x72\x3a\xa1\xc8\xe0\xdd\xb7\xae\x20\x1b\x11\x1f\x6d\
191 | \x0d\xb9\xb7\xd2\x63\x69\x76\x9a\xe6\x4c\x97\x87\x93\x8a\x6b\xd3\
192 | \x96\x87\x83\x5d\x4e\x3c\x7d\x9e\xb0\x11\x30\x33\x3f\xc5\x91\x93\
193 | \x4b\x4c\x2e\x4c\xb3\xb7\xb5\xcb\x83\xdb\x77\xf1\x0e\x74\x1c\x85\
194 | \xe4\x45\x4e\xaf\x3f\x44\x29\xc9\xf4\x4c\x87\xce\x62\x97\x5d\x5d\
195 | \x31\x74\x8e\xb4\xc8\x69\x9a\x92\xd2\x18\xa2\x30\x44\x21\xd9\x29\
196 | \x33\x4a\xef\xf0\xca\x63\xbd\x23\xf5\x86\xb6\x95\x28\xeb\x18\xfa\
197 | \x02\x51\x55\x28\x07\x9b\x26\xa3\x19\x84\xcc\xea\x98\xb4\x2a\x29\
198 | \xbd\xc1\x52\xf3\xfb\xa2\x2a\x48\x8d\x03\x3c\x65\xac\x08\x66\x5a\
199 | \xf8\xc2\xf1\x70\xad\xc7\xf1\x03\x1d\x8c\x71\x0c\x77\xfb\x6c\xad\
200 | \x3e\xa4\xaa\x0c\x9d\x6e\x0b\x21\x3d\x52\x4a\x5c\x59\xf0\x0f\xfe\
201 | \xd1\x97\xe9\x6d\x6d\x72\xef\xe6\x1e\xab\xfd\x21\x97\xb7\x7a\xbc\
202 | \x36\xe8\xf3\xeb\xbf\x74\x8c\x6e\xa7\xc9\x60\x98\x32\xbb\x1d\x73\
203 | \xf3\xcd\x9f\xd1\x58\x98\xa4\x91\x34\x10\x4a\x52\xe5\x15\xce\x1a\
204 | \xbc\xab\x79\x92\x34\x55\x85\x31\x06\xef\x04\x3a\x50\x4c\xcd\x4f\
205 | \x30\x73\x74\x1e\xd5\x08\x30\x58\x1c\xbe\xe6\xd7\x8f\x58\x9f\x73\
206 | \x34\x82\x60\x1f\x9a\x7a\xc6\x65\x81\x31\x06\xad\x24\x81\x94\xb4\
207 | \xa2\x06\xa1\x92\x04\x4a\xa1\x95\xa2\x32\x96\xbc\x28\x09\xa4\x64\
208 | \x32\x6e\x30\x15\x45\x4c\x27\x4d\x42\xad\x91\x42\x20\x91\x88\x28\
209 | \x20\x99\x6c\xd3\x6a\xb5\xe8\x0f\x73\xb2\xdc\xb2\xb3\x3b\xe6\xde\
210 | \xf2\x2a\xde\x79\x92\x66\xcc\x5e\xaf\x07\x08\xd2\x3c\xa7\x3f\x1a\
211 | \x11\x47\x92\xff\xee\x7f\xfc\x2d\xbe\xfc\x95\xf3\xb4\x1a\x8e\xd3\
212 | \x27\x67\x78\xee\xf3\xc7\x08\xe7\xda\xf4\xb3\x82\x46\x92\xe0\x2b\
213 | \x4f\xd9\x1b\x70\xf7\xca\x36\xbf\xff\x7b\xff\x9a\x7b\x77\xf7\x58\
214 | \x58\x3a\xb4\x4f\x8a\x04\x08\x8f\xd6\x4a\x51\x15\x0e\xad\x15\x61\
215 | \x28\x99\x9e\x9f\x40\x25\x92\xb9\x40\xb1\xd0\x39\x84\xc1\xb3\xdd\
216 | \xdb\xa5\x10\x16\xa9\x02\xaa\xaa\x42\x58\x4f\xe2\x23\x9c\xb1\x34\
217 | \x9d\x44\x2a\x49\xd7\x29\x62\x15\xa1\x5c\x45\xe5\x04\x81\x90\x68\
218 | \xe1\x31\xc2\xd1\xf0\x82\x49\x19\x10\xa3\x50\x58\x44\x65\x50\x22\
219 | \xc6\x7a\xd8\x36\x19\x2e\x0c\xb1\x4a\xa0\xa4\xc4\x3a\x4f\x51\x3a\
220 | \x16\xe7\x26\x98\xea\xb6\x59\xbf\xbb\xc9\xd8\x5a\x9e\xfe\xcc\x29\
221 | \x9a\xed\x06\xae\xd5\xc0\x59\xcb\xb0\x3f\x24\x89\x43\xfe\xe3\xdf\
222 | \x79\x19\xb2\x21\xf7\xae\xdf\x61\x76\x36\xa2\xc8\x33\x3a\x9d\x06\
223 | \x81\x56\x38\x6b\x79\xf0\xc9\x0a\xcb\x6b\x19\xa3\xad\x1d\x3e\xf9\
224 | \xf8\x1e\x4f\x3e\x79\x02\xac\xc7\x7b\x50\x4a\xd6\x25\x50\x65\x8e\
225 | \x66\x12\xa0\xc6\x92\xa8\x1d\x11\xc4\x21\xb3\xb1\x26\xb7\x9e\xf5\
226 | \xf1\x80\xbc\xc8\xb1\x4a\x91\x9b\x94\xa2\x32\x8c\x70\x38\xa1\x28\
227 | \xca\x92\x61\x55\xa0\x94\x24\x50\x16\xed\x05\x5b\xbe\xc2\x3a\x47\
228 | \x22\x43\xfa\x26\xc7\x3b\x8f\x97\x9a\xac\x48\x09\xb5\x26\xf1\x92\
229 | \xa1\xc9\x28\x2a\x83\x75\x1e\xa5\x25\xc6\x19\xb2\x22\x27\x2f\x1c\
230 | \xc6\x39\x2a\xeb\xb0\xce\xb3\xbb\xd5\xe7\x5b\x7f\xf4\x2e\xef\x5c\
231 | \xbe\xcf\x3f\xfb\xe7\xbf\xcd\xaf\xfd\xcd\xcf\x22\x55\x80\x54\x92\
232 | \xc9\xd9\x29\xbc\x77\x08\x04\x5f\xfb\x4f\x7f\x95\x9f\x7d\xff\x0d\
233 | \xb6\x57\xd7\xa8\x81\x9d\xad\x09\xbb\x17\xec\xec\x8c\x79\xef\x9d\
234 | \xdb\xdc\xbd\xbb\xcb\xb7\xff\xe4\x55\x5e\x7e\xe5\x22\x55\x51\xd5\
235 | \xdc\xc3\x2b\xb4\xc0\xd1\x88\x35\x33\x53\x09\xf7\x77\x86\x78\x2d\
236 | \x11\x81\x64\x5c\x95\xdc\x1c\xf6\xe9\x97\x25\x9d\xa4\x45\x6e\x4a\
237 | \xbc\x0e\x70\x52\xb0\x9b\x0e\x91\x61\x88\xd4\x92\xca\x4b\x7c\xa0\
238 | \x18\x39\x4f\x88\xa0\x87\xab\x4b\x47\x3a\xb2\x40\x82\x73\xc4\x3a\
239 | \x20\xa3\x22\x93\xb5\xb4\x35\x56\x92\x52\x83\xf4\x02\xe5\x6a\x69\
240 | \x2b\x92\x0a\x85\xc3\x58\x8b\xb5\x16\xef\x04\xbd\xde\x88\xca\x69\
241 | \x6c\x65\xb9\xf7\xc9\x2a\x2b\xf7\xd6\x40\x09\x16\x0e\xce\x21\xb4\
242 | \xc4\x0b\x89\x42\x91\xcc\x4f\x71\xf1\x95\x17\xd9\xb8\x75\x8f\x2a\
243 | \xcd\xf8\xe4\xe3\x1b\x94\x79\x85\xf7\x90\x8e\x0b\x94\x10\x1c\x3d\
244 | \x3c\xc3\xfc\x54\x00\xb6\xc2\xda\x0a\xef\x6b\x16\xac\xab\xb2\x40\
245 | \x78\xc3\xa1\xb9\x0e\x1f\xde\x5a\x27\x35\x25\x59\x55\xa2\xc3\x80\
246 | \x38\x88\xc8\x1d\x94\x95\xa1\x32\x16\x85\x44\x79\x41\xa2\x22\x04\
247 | \x1a\x21\x1c\x4e\x3a\xac\x07\xe1\xeb\xab\x2d\x96\x0a\xa1\x14\x09\
248 | \xba\x16\x45\xbc\x24\xf1\x12\x74\x4c\xe1\x2d\xb1\xd0\xa0\x3d\x06\
249 | \x45\x69\x0c\xd6\x57\x48\xe3\x98\x8d\x13\xf4\x60\x48\x59\x56\x38\
250 | \x07\xfd\xde\x88\xa8\x91\x30\x4a\x0b\x3c\x92\x4e\xb7\xcb\xec\xc2\
251 | \x0c\x69\x9a\x82\x94\x80\x42\x78\x49\x51\x14\x48\x04\x56\x29\xe6\
252 | \xcf\x1c\xa5\x11\x47\x24\x49\xc4\xc7\x1f\x7c\xcc\xa8\x3f\x26\x69\
253 | \x2a\xbe\xf2\xd5\x27\x38\x7e\xfe\x14\x51\x47\x33\x31\xd5\x62\xe3\
254 | \x81\x45\x88\x9a\x14\x69\x01\xb4\x5a\x09\xa7\x8e\xcc\x11\xfe\xf4\
255 | \x16\x83\x2c\x23\x77\x96\x22\xcd\xd8\x2d\x33\x2a\x21\x70\x1e\x06\
256 | \xce\x10\xec\x8b\x22\x99\x33\x78\x6f\x09\x9d\x20\xad\x4a\x2a\xe5\
257 | \x89\x09\x91\x48\x2a\x6f\x11\x1e\x72\x07\x63\x57\xa1\xa4\xa0\xf4\
258 | \x9a\xd2\x5b\x52\x5b\x22\x85\xa7\xb0\x06\xe3\x2c\x65\x55\xd2\x50\
259 | \x0a\x6d\x2c\x13\x5e\xe2\xaa\x0a\x6b\x2d\xb6\xf2\x14\x54\x38\x4a\
260 | \x06\xa3\x1c\x84\x24\x69\x36\x89\x92\x09\xc2\x38\xc0\x09\x51\xa7\
261 | \xb8\x90\x08\x24\xbd\xbd\x3d\x4c\x91\x91\x8e\x86\x2c\x1d\x3b\xcc\
262 | \xd2\xb3\x4f\x32\x39\x3b\xc7\xee\xda\x26\x4e\x78\xe6\x4f\x1e\xa4\
263 | \x31\xd3\x06\xad\x11\x42\xe3\x7d\x2d\xaf\xe1\x24\x5a\x29\x09\x58\
264 | \x0e\xcc\xb5\x39\xbc\x38\xc1\x60\x38\x62\x54\x96\xe4\xae\xc2\x4a\
265 | \x89\xf5\x0e\xa4\x64\x64\x2c\xde\x94\xf5\x06\x08\x87\x03\x42\x15\
266 | \x22\xb4\x46\x28\x8f\x10\x1a\x8c\xc0\x52\xd6\xfa\x8b\x56\x78\x2b\
267 | \xd1\x41\x88\x44\x53\x16\x25\x46\x08\x4a\x01\xa9\xf4\x64\xc6\xe2\
268 | \x71\x34\x65\xc8\x42\x10\xd2\xaa\x32\x76\xd2\x0c\x89\xc4\x58\x87\
269 | \x57\x8a\xac\xb0\x8c\xc6\x05\x78\xd8\xd9\xd8\x62\xbc\xbb\x41\xd8\
270 | \x6a\x20\xc3\xe0\x53\xcd\x2f\x88\x22\x66\x66\xa7\xc1\x1b\x9c\x9d\
271 | \x21\x88\x62\xb6\x1f\x6c\xb0\x7c\x73\x99\x72\x3c\xe2\xe0\xf1\x25\
272 | \x92\x85\x19\xbc\xb4\xfb\x5a\xa2\xdb\x57\x93\xc1\x39\x8f\xae\x8a\
273 | \x82\x48\x29\x66\x26\x1b\x3c\x71\x72\x9e\xf7\x8b\x92\xc1\x30\x43\
274 | \x47\x0a\x19\x09\x4a\x63\xd1\x5a\x11\xe8\x80\x02\x08\x82\x90\xd0\
275 | \x29\xbc\xf7\xb4\x64\x84\x12\x92\x4c\x0b\x62\xaf\x09\xb5\x20\x76\
276 | \x8e\x48\x28\x5a\x42\x83\x8c\x90\x48\x42\x2f\x69\x01\xa1\x33\xc4\
277 | \x42\x22\x8c\x22\x50\x11\x3e\xa8\x68\x3a\xc1\x19\xd3\x20\x72\x29\
278 | \xbb\xbd\x1e\x42\x0a\x9c\x73\x58\x67\xa9\x8c\x24\xcd\x0a\x90\x02\
279 | \xef\x2c\xdb\x9b\xbb\xcc\x37\x0e\x50\x43\xa9\x5a\x85\xf5\xa2\x9e\
280 | \x35\x94\x79\x45\x18\x84\x2c\x7f\x74\x83\xf7\x7f\xf0\x2e\xae\x80\
281 | \xe5\x1b\x77\x48\xc2\xcb\x9c\xf8\xe8\x36\x5f\xfc\xda\x4b\x74\x26\
282 | \x5b\xe0\x3c\xc6\xda\x5a\x05\x73\x1e\x2d\xa5\xc0\x1b\x4b\x1c\x48\
283 | \x2e\x3e\x76\x80\xb5\xe5\x35\xb2\xfe\x90\xa8\xd3\x22\x35\x15\x63\
284 | \x57\xa1\xb5\xa5\x0a\x43\xba\x0b\x47\xe9\x24\x5d\x4a\x6f\xb9\x75\
285 | \xff\x32\x45\x59\x52\x3a\xc3\xec\xa1\x33\x74\x54\x13\x5b\x95\xa8\
286 | \xed\x4f\x48\xc7\x03\x34\x8e\xb9\x63\x8f\xa3\x55\x84\x77\x86\xd1\
287 | \xd6\x3d\xf2\xbd\x6d\x90\x8a\x03\x87\xcf\xa0\x55\x84\x94\x30\xbb\
288 | \xb3\xc1\x91\x5b\x3b\x6c\x0c\x07\xe4\x79\x4e\x20\x25\x61\xa8\x68\
289 | \xb5\x1b\xec\x0c\x4a\xb2\xdc\xd0\x6e\xc7\x1c\x3f\x7b\x82\x23\x67\
290 | \xce\xe1\xc8\x7f\xa1\xf8\xe2\x01\x8f\x31\x25\xd6\x18\xd2\x51\xc1\
291 | \x5b\xdf\x7b\x9b\xf1\x6e\x4e\x7a\x6f\x9d\xaf\x1f\x3f\xc9\xac\x90\
292 | \xac\x5e\xdb\xe4\x67\xff\xd7\xf7\xb8\xf0\x9f\x7c\x99\xc9\xa9\x6e\
293 | \x7d\x53\xd4\x43\x03\xb4\x94\x12\x47\x85\x10\x9e\x23\x07\x26\x39\
294 | \xb3\xb6\xcb\xcd\xdd\x11\xc3\x86\xa6\x88\x35\xce\x4a\x9c\x52\x88\
295 | \x50\xb3\x33\xda\x66\xb7\xbf\x45\xe5\x2a\x8a\xaa\xc4\xe9\x18\x25\
296 | \x42\xae\x6f\xdc\x24\xb6\x20\xad\x63\x60\x0b\x1a\x08\x5a\x52\xf2\
297 | \xfe\xca\x47\x18\x04\xa1\x75\xa8\xca\x12\x49\x49\xa2\x03\x56\x57\
298 | \xae\x31\xb6\x86\x86\xf3\xfc\xb5\xf6\x12\x2d\xe3\x79\xe3\xe6\x6d\
299 | \xa4\x50\x04\x81\x60\x72\xaa\x4d\x14\x28\x8a\x9d\x14\x63\x1d\x81\
300 | \x56\x84\x51\x5d\xaa\xfe\x53\x95\xb7\x0e\x5e\xe0\x19\x8f\xc6\xa4\
301 | \xbd\x31\x76\x98\xd1\xef\xa5\xdc\xbb\xfa\x80\x7f\x72\xe6\x34\x4b\
302 | \x65\xc5\x78\xb3\xcf\xdc\xb8\x20\xb9\xbf\x0d\x8f\x1d\x81\x97\x2f\
303 | \xd4\x03\x94\x7d\x24\xa8\x9d\x77\xb5\x40\xe0\x0c\x5a\x6b\xce\x1f\
304 | \x99\xc7\x6c\x0c\xb9\x92\x97\x88\x56\x40\xac\x42\xa4\xd0\x64\x45\
305 | \x49\x91\xa7\x68\x2f\x08\x83\x90\xd8\x09\xd2\xaa\x40\x0a\x41\x47\
306 | \x52\xa7\xbc\x05\xe7\x25\xd2\x83\x10\x9e\x99\x52\xe0\x84\x40\x7b\
307 | \x85\xf1\x1e\xe9\xa0\xe3\x24\x07\xc2\x0e\xfd\x74\xc0\x73\xed\x29\
308 | \x1e\xcb\x15\xdf\x79\xeb\x3d\x2a\x63\xd1\x42\x31\x39\xd9\xa1\xd3\
309 | \x69\x80\x35\x14\x95\xc1\x5b\xf0\x38\x46\xc3\x11\xc6\xe6\x08\x25\
310 | \x1e\x25\xff\xa7\x9b\x10\x85\x1a\xd9\x08\x90\x28\x84\x54\x14\xc3\
311 | \x9c\x76\x65\x29\x86\x29\x8c\x0b\x3a\x33\xd3\xb4\x37\x77\xe8\xff\
312 | \xf1\xdb\x70\xee\x18\xc2\x7a\xac\x71\x78\x1c\xd2\xd9\xaa\xd6\xf6\
313 | \x85\x42\x08\x41\x23\x96\x2c\x08\xc1\x89\x9e\x43\x8f\x0b\xa4\xa8\
314 | \x1b\xa1\x33\x16\x6d\x3d\xc2\x41\x59\x54\x08\x04\x23\x67\x18\x3a\
315 | \xc3\xb8\x2c\xd9\x2b\x0b\xc6\xce\x12\x89\x00\xe1\x04\xa9\xb3\x78\
316 | \x07\xae\x32\x78\xeb\x09\x51\x24\x28\x70\x8e\x62\x34\xe4\xf9\xf6\
317 | \x14\xbf\xda\x3c\xc8\x3b\xaf\xbd\xc5\x83\x07\x6b\x48\xa1\xf0\x78\
318 | \x0e\x1d\x9c\xa3\x11\x07\x78\x2c\x65\x51\xdf\x0a\xc6\x58\xbc\xb3\
319 | \x28\x29\xf6\x43\xb7\x7c\x3a\x93\xf2\x0e\x67\x0c\xd9\x60\x44\x92\
320 | \x44\x3c\xf3\xec\x39\x9a\xd3\x5d\xde\x7d\xb0\x81\x2a\x2a\x1a\x06\
321 | \xca\x7b\x0f\x29\x07\x43\x92\xcc\x52\x2c\xaf\x63\x8b\xfa\xd0\xbd\
322 | \xf7\x68\x6b\x2d\x4a\xd6\x03\x46\x84\xa0\xdd\x4e\xa8\xca\x0d\xfc\
323 | \xea\x1e\x87\xc5\x2c\xef\xb9\x92\x22\x89\x28\xbd\xc7\x4a\x41\xe9\
324 | \x2a\x2c\x02\x2f\x64\x4d\x88\x04\x58\x01\x5a\x38\x9a\x52\xd5\xc3\
325 | \x48\x3c\xd2\x5b\x9c\x77\x78\x67\x09\x95\x20\x12\x12\x87\x67\xbb\
326 | \x18\xf3\xf9\xc9\x79\x5e\x69\x1d\xe4\x87\x7f\xfc\x1f\xf8\xe0\xc3\
327 | \xab\x68\x1d\x21\x10\x4c\x75\x9b\x2c\x1d\x9e\xc5\x97\x29\x0a\x41\
328 | \xa8\x61\x71\xb2\xc9\xec\x54\x83\xb9\x99\x36\x42\x84\x78\x32\xf8\
329 | \xff\xf4\x00\x21\x04\x91\xd6\x88\x56\x82\xb5\x86\x67\x9e\x7b\x9c\
330 | \xbb\xb7\xd6\xf8\xb3\x6f\xfd\x08\x39\x79\x88\x5f\x0e\x14\x81\x17\
331 | \x88\x4e\x9b\xdd\xc5\x0e\xf7\x6f\xdf\xa1\x9a\x98\xc4\x18\x87\x12\
332 | \xa0\x1f\x0d\x13\x3d\x02\x1c\x18\x57\x71\xfc\xf8\x22\x3f\xfb\xf0\
333 | \x4d\x1a\x69\xc5\x85\x8b\x4b\xfc\x70\x62\x80\x9f\x6a\x21\xbc\xc4\
334 | \x21\xb0\x1e\xb4\x52\x68\x21\x29\x9c\xa9\x35\x1b\xe7\xb0\xae\x44\
335 | \x78\x8f\xf4\x30\x99\xb4\xa8\xaa\x0a\xa4\xa5\x66\xde\xf5\xc3\x7e\
336 | \xf9\xd0\x49\x9e\xdf\x13\x7c\xe7\x5f\xfd\x3b\xee\xdc\x59\x45\xcb\
337 | \x3a\x78\xbc\xe5\xd8\xd1\x59\xa6\xba\x0d\xb6\xd7\x06\x0c\xfa\x7d\
338 | \x9a\xa1\xe7\xab\x5f\x5a\xe2\xb9\xcf\x9f\x67\xa2\x13\x32\x1a\xed\
339 | \xd0\x68\x25\x9f\x36\x41\x51\x0b\x07\xe0\x3c\x51\x1c\x81\xa9\xa5\
340 | \xf5\x5f\xff\xcd\x2f\xf2\xc9\xad\xbb\x7c\xe7\xc6\x03\x9a\x67\x96\
341 | \x38\x14\x4e\x51\x06\x82\x3b\x0d\xcb\xea\xdd\x55\x92\xe9\x92\xaa\
342 | \x72\x08\xed\x51\xbf\xfb\x5b\xcf\x7c\xa3\x2a\x0b\xb4\xd2\x58\x5b\
343 | \xab\x2f\x49\xb3\x41\xa7\xd3\xe1\xd5\xbf\x7a\x8f\x72\xa5\xcf\xf3\
344 | \x0b\x47\xe9\xf9\x92\x71\x5c\x6f\x40\xa0\x14\x52\xd4\xf3\x16\x0b\
345 | \x94\xd6\xd4\x10\xd6\xd7\x27\x02\x1e\x85\xc0\x99\xaa\xc6\xe5\xde\
346 | \x73\x28\x8e\xf9\xcd\xe9\x13\x4c\xbd\xbf\xca\xeb\x7f\xfa\x1d\xb6\
347 | \xb7\x7a\xe0\x14\x42\xd4\x70\xf9\xc0\xe2\x14\xcf\x5c\x38\xc1\x44\
348 | \xa7\x41\x91\xe6\x78\xe7\x98\x9e\x9c\xe0\xd4\xc9\x05\x5e\xf8\xe2\
349 | \x79\x0e\x9c\x3c\x8c\x6e\x44\x20\x41\xec\x6f\xa9\xa2\x06\x66\x94\
350 | \x06\x69\x7f\x31\xa7\x0c\x23\xcd\xe9\xc7\x8e\xb0\xb1\xb3\x41\xd1\
351 | \x8d\x58\x8b\x3c\x6b\x81\x27\x0b\x34\xbd\x61\xc1\xfb\x1f\xdd\xa6\
352 | \xd1\x4a\x88\xe3\x06\xea\x77\xbf\x7e\xf1\x1b\x1e\x8f\xf7\xee\xd3\
353 | \x0e\x2b\xa4\x64\x62\xa2\x4d\xd2\x9a\xe0\x9d\x37\xaf\xb0\x72\x79\
354 | \x99\xb3\xae\xc5\x8c\x8a\xd9\x93\x15\x85\xaa\x87\xf1\xce\x3a\x1e\
355 | \x7d\x4a\x4a\x89\x42\xa0\xa5\x44\x38\x47\x28\x25\xce\x54\x84\x02\
356 | \x9e\x89\xa6\x78\x71\x3b\xe0\xf2\xff\xf1\x5d\xae\xbc\xfd\xb3\xba\
357 | \xfd\x7a\x81\x10\x12\x25\x05\x13\xad\x98\xcf\x7c\xe6\x24\x4b\x87\
358 | \xa7\xf0\xce\x92\x65\x39\x45\x5a\x51\x19\xf8\xb3\xff\x70\x99\x9d\
359 | \x41\xce\xe3\x17\x8f\xd1\xe8\x34\x3e\x6d\x7d\x02\xc1\xde\xe6\x1e\
360 | \xbb\x77\x1e\x22\x0a\x43\x99\xe6\xf4\xd6\xb7\x48\x47\x63\xc2\x40\
361 | \x91\xb4\x22\x8e\x1e\x39\xc0\xea\xca\x2a\x85\xb1\x38\x21\x41\x29\
362 | \xf6\xfa\x25\x1f\x7c\xb4\x85\x50\x30\x33\x3b\x81\xfa\xc7\x5f\xbf\
363 | \xf0\x0d\x2d\x25\xd6\x1a\x4c\xe5\x90\x3a\x20\x8c\x3a\xf4\xf7\x52\
364 | \xe6\x66\xda\x84\x71\xc4\xf5\x6b\xab\xdc\xb9\xb1\x4a\x79\x7d\x95\
365 | \x53\x03\xcd\x51\xdd\x46\x59\x28\xaa\x12\x6b\x1d\x0d\x2f\x69\x13\
366 | \xd0\x76\x92\x56\x05\x8d\xca\x33\x99\xc3\xf9\x22\xe1\xec\xed\x8c\
367 | \xf4\x5b\x1f\xf2\xe3\xff\xe7\x2f\xa9\x8a\x94\x6e\xa7\x89\x56\x01\
368 | \x71\x14\x33\xd1\x6e\xd3\x69\xc5\x9c\x3b\xbb\xc8\xa9\x53\xf3\xb5\
369 | \xbe\x68\x3d\xd9\x38\xa7\xd7\x1b\x72\xe7\x5e\x9f\xbf\xf8\xf1\x0a\
370 | \xf7\xd7\xf6\xb8\xf0\xec\x12\x87\x8f\x1f\xa8\x19\xe0\x7e\xf6\xc5\
371 | \x2a\xa4\x1a\xe7\x94\x59\x89\x2b\xab\x7a\xc0\x6b\x1c\xc9\x44\x1b\
372 | \x99\x34\x68\x4e\x4e\x70\xf0\xe0\x41\x76\xb7\x77\x48\xd3\x1c\x84\
373 | \xa0\xb7\x97\x71\xfd\x93\x1e\xed\x4e\xc4\xc2\xe2\x24\xda\x39\x47\
374 | \x14\x6a\xaa\x4a\xa1\x43\xc1\xea\x4a\x8f\xa3\xe7\x2f\x12\x35\xf7\
375 | \xf8\xb3\x7f\xf7\x47\x7c\xf9\xab\x2f\x20\x84\xe4\x7b\x7f\xf5\x11\
376 | \x3b\x3b\x29\x9b\xaf\x5d\x46\xbe\x76\x99\xf9\xb9\x09\x4e\x1d\x9c\
377 | \x85\x6e\x03\x9a\x21\x2a\x0e\xb1\xd6\x21\x2a\x8b\x1a\x96\xa4\xeb\
378 | \xbb\x5c\xbf\xbb\x46\x9a\x5a\xc2\x18\x66\xa7\xdb\xcc\x4c\x36\x51\
379 | \x52\x92\xa5\x05\x4f\x3e\x79\x81\x5f\xff\x8d\x5f\xa7\xbf\xfd\x80\
380 | \xc1\xce\x75\xa4\x78\xd4\xd8\x05\xd6\x78\xa4\x0c\xd8\xd9\x4b\x41\
381 | \x0b\x10\x92\x3c\x2f\x71\xb6\xaa\x89\x90\xf7\xf5\x84\xc7\x18\x94\
382 | \x00\xe7\x2a\xaa\xca\x10\x6b\x4d\xd4\x9a\xa0\x37\x32\xdc\xbd\x72\
383 | \x15\xe7\x2c\x0b\xf3\xb3\x9c\xbb\xf0\x04\x1f\xbe\xf3\x01\xc3\xe1\
384 | \x18\x8f\x40\xe0\xe8\x4e\xb6\xea\xbe\x34\xce\xca\xda\x9c\x10\x04\
385 | \xd8\xb2\xc2\xfb\x98\x1f\x7f\xfb\x7b\xec\xf5\xf7\x18\x8d\x4a\x56\
386 | \xef\x6f\xf2\xb9\x17\x4e\x31\xd1\x49\xf8\xe1\xeb\x37\xb8\x7b\x7f\
387 | \x87\xbc\x34\xac\x6f\x8d\x58\xdb\x1c\xec\x4f\x94\xff\xff\x3f\x0e\
388 | \x40\xd6\xe5\xd0\x6a\xc7\x4c\x4d\x26\x4c\x76\x1b\x08\x1c\xa6\xb2\
389 | \x8c\x46\x25\xe9\x60\xcc\x8f\xbe\xf3\x5d\x1e\xdc\xbf\xc5\xc1\xc3\
390 | \x2d\x9e\xbe\x70\x1c\x6f\x1d\xd6\x38\xb6\xb6\x7b\x48\x02\xa4\xac\
391 | \xe7\xfc\x52\x49\xda\xed\x36\x52\x85\x58\x67\x6a\x1c\xe4\x1c\x08\
392 | \x4f\x77\xb2\x0d\x49\x4c\x39\x4e\x89\x1a\x09\x97\xaf\xdd\xe3\x3b\
393 | \x7f\xf1\x06\xd9\xb8\xc2\x96\x05\x8d\x50\xf0\xf4\xb3\xe7\x38\xfe\
394 | \xd8\x49\x56\xee\xdd\x63\x6b\x37\x67\x72\x32\x62\x7a\xb2\x89\xb3\
395 | \x0e\xfd\xe6\xbb\x2b\x1c\x9e\x93\x08\x21\x29\x0b\xcb\xde\x9e\xe1\
396 | \xda\xb5\x55\x46\xa3\x9c\xcd\xad\x1e\x42\xee\x0f\x4d\x7d\xc5\x93\
397 | \x8f\x1f\xc2\x5a\xc1\xca\x5a\x8f\xaa\xaa\x9d\x18\xe2\x51\x55\x8a\
398 | \x5f\xd8\x52\xfc\x7e\x33\xd4\x5a\xd1\x4e\x1a\x68\x21\x19\xec\x0e\
399 | \x6b\x32\x82\xa7\xd3\xee\x70\x7f\xf9\x01\xd7\x87\x43\xac\xb3\xdc\
400 | \x7b\xb0\xc1\x70\x54\x92\x24\x11\xd9\x38\x07\x53\x90\x84\x11\x72\
401 | \x9f\xb0\x84\xa1\x26\xd0\x12\x5c\x6d\x99\xa9\x7b\x56\x2d\xcf\x59\
402 | \xef\xc8\x06\x23\x4c\x5e\xe2\x7c\xc0\x8f\xff\xea\x3d\x7a\x3b\x19\
403 | \x49\xe9\xb9\xd8\x68\x91\x14\x15\xfd\xd7\xaf\xb3\xf1\xa2\xe0\xec\
404 | \xc5\xc7\x59\x38\x7c\x10\x1f\x68\x9c\xaf\x1b\xa6\xbe\xfd\xd0\x21\
405 | \x4d\xca\x5b\x3f\xb9\x4a\x14\x84\x68\x1d\x50\x55\x9e\xf1\xb8\xc4\
406 | \x59\xcf\xca\xfd\x2d\x06\xbd\x11\xd6\x39\x2a\x2f\x29\x0b\x6a\xe9\
407 | \x4a\xd6\x8d\x4f\x0b\x90\xc2\x01\x0e\xad\x14\x52\x4a\xa4\xd2\x54\
408 | \xc6\x52\x94\x86\xaa\xac\xf0\x55\x85\x12\x0e\x2d\x05\x5a\x4b\x8a\
409 | \x61\xca\xb8\x37\x40\x51\xbb\x36\x86\xa3\x8a\x1f\xff\xe8\x36\x41\
410 | \xa0\x89\x22\xc7\xcb\x9f\x7f\x1c\x61\x2a\x0e\x1d\x98\x01\x7f\x9f\
411 | \x30\x0a\x30\x45\xc9\xd6\xea\x06\xdd\xf9\x29\xa4\xd6\x3c\xf2\xc8\
412 | \x08\xa5\x40\x82\xd6\x9a\xfe\xde\x90\xaa\xf0\x64\xbb\x43\xfe\xc6\
413 | \xdc\x22\x2f\xce\x4e\xe1\xb3\x82\xde\xca\x06\xd7\x7f\x72\x95\xc6\
414 | \x85\x93\x2c\x3d\xff\x14\x2b\x6b\xdb\x7c\xb2\xbc\x56\x9b\xb9\x3a\
415 | \x93\x5d\x1a\x49\xca\xc3\xb5\x94\xc5\x19\x68\x25\x01\xa1\x10\x88\
416 | \x38\xa4\x19\xc7\x54\xd6\x51\x15\x16\xe7\x3c\xa5\x71\xec\xec\x65\
417 | \x6c\x0d\x4a\x8c\x85\x56\xa2\x99\x6e\x87\xb4\xe3\x88\x30\x92\x28\
418 | \x21\x11\x42\x30\xcc\x0c\x5b\xfd\x8c\x51\x66\x88\xb4\x60\x61\xaa\
419 | \x41\x12\x85\x84\x52\x20\xf7\xd1\x9c\x94\xf5\xfb\xbd\xf0\x84\x4a\
420 | \x91\x1b\xcb\x60\x5c\x31\x1d\x05\x68\x2d\x31\xa5\xa3\x3b\xd1\xae\
421 | \x4d\x13\x5a\x33\x3b\x3b\xcd\x44\xa7\x8d\x7a\xc4\x03\x84\x00\x25\
422 | \x40\x82\x0c\x03\xaa\x22\x23\x89\x42\x9a\x49\x04\x83\x94\xa7\x4f\
423 | \x35\x71\x83\x11\x59\x7f\xcc\x64\xb3\xcd\x93\xfd\x3e\xe5\x3b\xd7\
424 | \x61\x69\xb6\x1e\xdd\x8b\xfa\x26\x93\xce\x39\xb4\x92\x34\x22\x4d\
425 | \xa7\xd9\x44\x38\x87\xb7\x06\xe1\x6b\x03\x81\xad\x6a\x48\x5a\x19\
426 | \x4b\x59\x59\xc6\x85\x23\x33\x8e\xc2\x38\xc6\x59\x45\x20\xa1\x1d\
427 | \x2b\x9a\x81\x20\xd6\x9e\x40\x79\x86\xc3\x8c\x61\x61\xc8\x8d\x63\
428 | \x54\x38\x86\xa3\x82\xa0\xb6\x2c\x81\xab\x71\x41\xa0\x34\xce\xd5\
429 | \x2c\x74\xe9\xe0\x4c\x8d\x46\xbd\xc7\xed\xc3\x9c\x47\x8e\x32\x25\
430 | \x40\x4a\x4f\x14\x69\xc2\x24\xaa\x8d\x4e\x7e\xdf\xfb\x23\x24\xc8\
431 | \x5a\xb0\x71\xd6\xd2\x48\x34\x4f\x3e\x79\x02\x19\x25\xf4\xca\x9c\
432 | \x6a\x94\xd2\x10\x01\x54\x86\x86\x07\xf5\xe6\x35\xdc\x66\x7f\xbf\
433 | \x54\x5d\xed\x39\x72\xd6\x21\x70\x3c\xf5\xd4\x09\x2e\x3e\x73\x16\
434 | \x1d\x80\x0a\x34\xd6\x7b\xd2\xbc\x24\x2b\x0a\x1c\x75\x5a\x5b\x2f\
435 | \x28\x8c\xc7\x0b\x81\xd0\x12\xad\x04\xad\x58\x23\x85\xa5\xc8\x72\
436 | \x8a\x2c\x07\x5b\xd3\x2c\x5b\x83\x03\x9c\x10\x38\x40\x29\x08\xf6\
437 | \xcd\x4b\x79\x59\x90\x97\x19\x08\xcb\xc5\x67\x8e\x71\xf2\xe4\x14\
438 | \x71\x14\xec\xf7\x0e\x5f\xcb\x6b\xc0\xc6\xe6\x1e\x0e\x28\x4b\xc7\
439 | \xa8\x3f\x24\x1f\x8e\xf1\x95\xc1\x1b\x87\xb7\x0e\x9c\x47\x48\x49\
440 | \x92\x44\xb4\x3b\x4d\xa4\x12\x3c\xfb\xdc\x19\xe6\x8e\xcf\xf0\x87\
441 | \xd7\x57\xd0\x71\x8c\x1b\x8e\x48\xb7\x76\xa8\xb2\x82\xc0\x48\x6e\
442 | \x7c\x70\x95\xa2\xac\xf6\xfd\x84\x1e\x59\x95\x16\x63\x72\xe6\xe6\
443 | \x5b\x9c\x3a\x7d\x18\xa5\x25\x4e\x40\xe9\x1c\xe3\xd2\x51\x21\x29\
444 | \x1f\x01\x1e\x51\xdb\xd4\xf4\x7e\x1a\x27\x91\x66\xba\xdb\x20\x0c\
445 | \x34\x4a\x49\xbc\x17\x38\xe3\x68\x44\x01\xc2\xb3\xdf\xb0\xea\x86\
446 | \xad\x94\xc4\x39\x87\x50\x0a\x15\x46\xe8\x28\xe2\x89\xa7\x8e\x30\
447 | \x3d\x93\xe0\x31\x20\x7e\xc1\xef\x84\x10\xe8\x20\xe0\xee\x83\x35\
448 | \x3c\x82\xe1\x60\xcc\x27\x37\x6e\xb3\x7e\x7f\x0d\x9b\x97\xe0\x1c\
449 | \xde\xd4\xc6\xae\x3a\x63\x1d\x52\x3f\x72\x8a\x39\xfe\xfe\x7f\xf6\
450 | \x6b\xdc\xd7\x29\xff\xfb\xbd\x87\xf8\x66\x8c\x4a\x12\x82\xc5\x59\
451 | \xd6\x96\xba\xfc\xfc\xee\x03\x46\xa3\x0a\x63\xf7\xe9\xb0\xc7\x21\
452 | \x24\x34\x9a\x01\x4b\xc7\x67\x68\x77\x1b\xec\xdc\x1f\xb0\xba\x93\
453 | \x91\x95\x1e\x25\x24\x49\xac\x50\x81\x22\x8e\x14\xed\x86\x46\x6b\
454 | \x49\x59\x59\x96\xe6\x9a\x34\x22\x45\xb1\x2f\x4f\x03\x18\xe7\xe9\
455 | \x24\x21\x49\xa8\xc8\x4c\xad\xbc\xb6\x93\x00\x21\xc1\x58\x18\xe5\
456 | \x25\xfd\x71\xc9\xcc\x74\x93\xb8\xa9\x31\xd6\x82\x04\xcb\xa3\xef\
457 | \x10\x78\x01\x71\x12\xe3\x91\x48\xea\xa6\x7b\xf8\xd0\x41\x8e\x1e\
458 | \x3b\x46\x96\x67\x98\x6a\x4c\x9e\x17\x04\x5a\xd1\x8a\xe3\xfd\x7b\
459 | \x57\x61\x6c\x89\x14\x92\xc5\xc5\x2e\xbf\xfd\xf7\x7e\x95\xd7\x5e\
460 | \x7d\x83\x1f\x4c\x69\x0e\xf8\x49\x52\xe9\xb8\x1f\x79\xee\xed\xa6\
461 | \x8c\x36\xc6\xb4\xdb\x4d\x9c\xa7\x36\x48\x78\xef\x41\x79\x16\x0f\
462 | \xcf\xd2\x9d\xee\xb0\x73\x65\x93\xdc\x08\x2a\x04\x85\x85\x71\x3f\
463 | \x47\x2b\x98\x9d\x6a\x72\xea\x40\x0b\x94\x26\x0c\x3c\xd3\xed\x88\
464 | \x32\xaf\xad\x34\x4a\x07\x54\xc6\xd4\x96\x58\x25\x78\xec\xc0\x04\
465 | \x5b\xfd\x9c\x46\x20\x58\x98\x8a\xf1\xd6\xd1\x4f\x2b\x56\x76\x52\
466 | \x9c\x14\xd8\xbd\x01\xef\x7e\x70\x8b\xf3\x8f\x1d\x62\xa2\xd3\xfa\
467 | \xd4\x63\x28\x1e\x39\xda\x84\xa7\xd3\x8a\x38\x3c\x9f\x70\xfc\xf0\
468 | \x24\x51\x50\x4f\x72\xf6\xf6\x46\x8c\xfa\x83\x5a\x28\x8d\x34\xc9\
469 | \x94\x42\x38\x4f\x55\x18\x76\x76\x07\x34\x93\x06\x49\x22\x78\xe1\
470 | \x0b\x4f\x11\x25\x9a\xab\x1f\xdf\xe2\xd6\x30\xa7\x11\x47\x68\xa5\
471 | \xc9\x8b\x31\x1f\x5e\x7e\xc0\x93\x4f\x1f\x65\xa2\xd3\xaa\xd9\xa0\
472 | \x17\x1e\xa1\x60\x72\x71\x9a\xa5\xe3\x8b\x3c\xfe\xa0\xc7\xd1\xf6\
473 | \x24\xb1\x0a\x58\xde\xee\xf3\xd3\xbb\x5b\xe4\x79\x4e\xa4\x1c\x13\
474 | \xed\x90\x24\x0e\x50\x5a\x32\x1e\x57\x48\xe9\xe9\x0d\x73\x1e\x6e\
475 | \xa6\x08\x24\x13\xad\x08\xed\x2a\xda\x49\xcc\xfc\x91\x0e\x78\x4b\
476 | \x65\x0c\xe3\xd2\xd2\x1f\x17\x84\xb1\xe6\x85\x53\x0b\x9c\xe8\x46\
477 | \xe8\x48\xb1\x36\x4a\xeb\x03\xc0\x82\x37\x28\xa1\x81\xda\xb3\x2c\
478 | \xa5\xe7\xc2\xd9\x69\xbe\xf8\xa5\x53\x74\x3a\x09\x58\x4f\x23\x0c\
479 | \xe8\xe7\x35\xf2\x6b\x4f\x4f\xe0\x8d\x43\x22\x19\x8e\x32\xd6\x1e\
480 | \x6e\xa1\x03\xcd\xe3\x4f\x9c\x26\x68\x34\x78\xe6\x85\x67\x30\x46\
481 | \xf0\xda\x0f\xde\x45\x74\x34\xed\x76\x4c\x51\x38\x7a\x7b\x86\x5e\
482 | \x2f\xa5\xd3\x69\xa3\x1f\xb1\x37\x21\x3c\x28\x49\x27\x94\x7c\xed\
483 | \xf0\x14\x17\x82\x84\xc8\x38\x6e\xb9\x80\x84\x69\x7e\xfa\x60\x8d\
484 | \x28\x80\xf9\x99\x26\xf3\xf3\xd3\x5c\xbf\x71\x87\x34\x2d\xd0\x61\
485 | \x83\x87\xdb\x23\x36\xc7\x16\x6f\xeb\x61\xe9\x5c\x27\xa2\x2c\x73\
486 | \x9a\x49\x0d\x7c\xa4\xf0\x78\x67\xd1\xa1\xe4\x95\x53\x07\xf8\x7b\
487 | \x0b\x13\x1c\x00\x4a\xe0\x2d\x6f\xb9\xa4\x05\x2f\x3c\x77\x9a\xdb\
488 | \x77\xd6\x88\x63\x10\x0a\x64\xa0\xa9\xac\x63\x6a\x66\x9a\xdd\xde\
489 | \x80\xca\x78\xd0\x01\xeb\xf7\x37\x78\xef\xad\x2b\x04\x4a\x73\xe0\
490 | \xc0\x14\xad\x0b\x67\x51\x5a\xf1\xe0\xfe\x26\x1f\x7e\x70\x07\x2f\
491 | \x3c\x41\xa3\xc9\xb9\x8b\xe7\xb0\x65\xca\xb8\xa8\xe8\xa7\x8e\xd5\
492 | \xcd\x75\x8e\x1e\x59\x24\x2f\x2d\x65\xe9\x10\x52\x63\x8c\xdd\xb7\
493 | \xc8\x48\x89\x97\x30\xec\x0f\x99\xd8\x19\x72\x6e\x68\x88\x6c\x1f\
494 | \x97\x17\x1c\x53\x82\x97\x67\x13\x56\xb2\x90\x93\x27\xe6\x78\xee\
495 | \xd9\x13\x9c\x7b\xea\x0c\xe7\x3e\x39\xce\xfa\xe6\x2e\x95\x69\xf0\
496 | \xde\xf5\xbf\x60\xa2\xdb\xa2\x2a\x2b\x84\xf2\x1c\x3f\x3e\x47\x40\
497 | \x81\xab\x0a\x84\x50\xe4\x05\x54\x15\x1c\x9a\x8c\xf8\x72\x12\x70\
498 | \x62\x54\x50\x16\x25\x4d\x0f\x17\x71\x6c\x87\x82\x13\x2f\x9f\xe5\
499 | \xd0\xe1\x2e\x5b\xdb\x5b\x24\xcd\x88\x40\x47\xa8\xa8\x81\x0a\x42\
500 | \x7a\x7b\x15\x0f\x57\x77\x58\x3c\x74\x80\x8f\x3f\xbc\x49\x9e\xc2\
501 | \x4e\x3a\xc2\x3b\xc9\xdc\xcc\x3a\xf3\x0b\x73\xdc\xbe\xfd\x90\x07\
502 | \xab\x3d\xc2\x38\xe6\x8d\x9f\x5c\x62\x6e\x61\x86\x3c\xcd\x79\xf3\
503 | \xcd\x4b\x0c\x73\xc1\xda\x76\x46\xdc\x2e\x29\x6d\x6d\xb6\x68\xb7\
504 | \x13\xca\xd2\xa2\xbd\x77\x28\x25\x40\x49\x4a\x6b\x99\x2a\x3d\x8d\
505 | \xc2\x12\x4f\x4f\x22\x5a\x8e\xb2\x3f\x60\x22\xcf\x98\x9c\xd0\xbc\
506 | \xf8\xf9\x33\x7c\xf6\x97\x2e\x12\x4e\xb5\x99\x3d\x77\x08\x93\x96\
507 | \xec\x6c\xa4\xfc\xe1\xbf\xf9\x21\x2a\xec\x52\x96\x25\xa1\x4f\xf9\
508 | \xcd\xdf\x78\x9a\x71\xef\x1e\xdd\x4e\x97\xaa\xf2\x5c\xfe\xf8\x26\
509 | \xd3\x0b\x67\xb9\x7f\x6f\x87\xc6\xc6\x88\xd2\x41\x73\x7a\x06\xbc\
510 | \x67\x76\x98\x72\x60\x94\xb1\xbd\xb3\xcb\xec\xec\x24\x59\x36\xa0\
511 | \xa8\x72\xbe\xf4\xd2\xe7\x79\xe3\x9d\x5b\xbc\xff\xe1\x32\x9e\x80\
512 | \x71\x9e\x33\x3b\x3d\xc5\xe2\xc2\x1c\xd7\xae\x5d\x66\x65\xad\xcf\
513 | \xdb\x3f\xbb\xcf\xcd\xe5\x1e\xff\xf8\xbf\xf8\x2a\x51\xd4\xa0\x30\
514 | \x30\xec\x57\x7c\xf0\xd1\x2d\xee\xaf\xf4\xf9\x6f\x7e\xef\x6f\x13\
515 | \xc5\x09\xd6\x0f\x51\x61\x8b\x8f\xae\x3e\x24\x8e\x14\x73\x0b\x13\
516 | \xb4\x92\x08\x21\x1c\x1a\x04\x52\x08\x8c\x77\x4c\x1f\x98\x45\x1e\
517 | \x99\x27\xbe\xd7\x43\xa4\x29\xa6\xac\x50\xbe\x36\x4a\x4e\x36\x63\
518 | \x5a\x93\x4d\xc2\x03\x33\x10\x08\x94\xab\xfd\x85\x8d\x66\xc0\xcc\
519 | \x54\x9b\x5b\xcb\x1b\x38\xe7\x38\x7f\x72\x86\xee\x54\xcc\x13\x67\
520 | \xce\x50\xe6\x39\xdd\xd9\x79\x26\xa6\x25\x27\x4e\x3f\xc1\xd5\x9b\
521 | \x1b\x44\xdf\xbb\x44\xd4\x37\x90\xe5\x78\x6b\x09\x9d\xe5\x50\xd2\
522 | \xe0\xd5\xfb\xab\xcc\xce\xcf\x20\xa5\x66\x67\xa7\xc7\xf4\x6c\x87\
523 | \x57\x5e\x79\x81\xff\xfe\x1b\xff\x06\x84\x66\x6f\xb7\xc7\xc9\xe3\
524 | \x0b\xfc\x47\x5f\xfb\x12\xaf\xbd\xfe\x31\xef\xbf\x7f\x8f\x34\xf3\
525 | \xa4\x69\xc9\xf7\x7f\x70\x99\x5f\x7a\xe9\x29\x5e\x7f\xeb\x3a\xaf\
526 | \xbf\x71\x9d\xd1\xd8\xb2\xbb\x3b\xe2\xbd\xcf\x2d\xf3\xc5\x2f\x3e\
527 | \xc7\xcf\xff\xc5\x1f\x73\xef\xc1\x98\xc1\xa0\x24\x8c\x04\x5f\xf8\
528 | \xc2\x19\xa4\xf6\x48\x03\xea\xd9\xa7\x8f\x7c\xe3\xd0\xb4\xc5\x1a\
529 | \xcb\x67\x5e\x7a\x01\xb9\xd9\x83\xeb\x0f\xf0\xa3\x14\x5b\x94\xa0\
530 | \x14\x2b\x2d\xc5\xd6\x54\xc8\xfc\xe2\x1c\x07\x4e\x1e\x82\x40\xe1\
531 | \x8a\x0a\x2a\x47\x20\x15\x4a\xc5\x5c\xb9\x74\x9b\xf9\xd9\x0e\x4f\
532 | \x9c\x39\x6d\xc4\x23\xb0\x00\x00\x02\x9e\x49\x44\x41\x54\xc0\xcc\
533 | \x94\xe6\xd8\xf9\x23\x4c\x2c\x2d\x21\xe3\x06\xd3\x33\xf3\xb4\x26\
534 | \xba\x2c\x9d\x3c\x4c\xbe\xb3\x47\xf3\xde\x2e\x8c\x52\xf2\xc1\x10\
535 | \x1d\x86\x6c\xb4\x43\x5e\xdf\xdd\xc1\x22\x68\xb5\x13\xc6\xa3\x11\
536 | \xcf\x3f\x7f\x91\x99\xd9\x29\x7e\xfe\xde\x75\xbe\xf2\xd5\xcf\x11\
537 | \x44\x8a\x1b\xd7\x97\x39\xbc\x34\x43\xb3\xd1\xe4\xf2\xe5\x7b\xfc\
538 | \xad\xbf\xfd\x2b\x14\x65\xc9\xcd\x5b\xcb\x9c\x39\x7b\x90\xf1\x30\
539 | \x67\x6d\x6d\x8f\x2f\x7c\xf1\x19\xe2\x58\x72\xf5\xda\x27\xbc\xf8\
540 | \xfc\x19\xaa\x0a\x1e\x3e\xdc\xe5\x85\x17\xce\xa3\xb4\xa3\xd7\xdb\
541 | \xe3\xf0\xe1\x19\x4c\x65\xd0\xc2\x1b\x14\x9e\xed\xb5\x1d\x3e\xfc\
542 | \xe1\x5b\xb8\x62\xc8\xc1\x03\x13\xc4\xab\x02\xa9\x34\x0f\x4d\xc5\
543 | \x9f\xae\x6f\x32\xda\x53\x44\xcd\x3b\x84\x9d\x04\x1d\x2b\x8a\x51\
544 | \x56\x83\x11\x11\xd0\x49\x2c\x4f\x9c\x9d\x63\x3c\x2e\xd8\xdd\xdd\
545 | \xe6\xed\x77\x86\x34\x67\xa6\x68\xb6\x7a\xa4\xc3\x14\x5b\x9a\x7d\
546 | \x57\x79\xc0\xb6\xcb\xd8\x0b\xe0\x44\x2b\x41\x4e\x36\xd9\x48\x22\
547 | \x7e\xb8\xbb\xc1\x7a\x5a\x30\x77\x28\x40\x6a\xcd\x60\x64\xf9\xe8\
548 | \xf2\x15\xf0\x92\xcf\x3c\x7b\x94\x1f\xbc\xfa\x06\x65\xe5\x71\xb6\
549 | \xe4\xd2\x47\xb7\x79\xf2\xc9\x53\x3c\xf3\xcc\x31\xfe\xf2\x2f\x7f\
550 | \x42\x5e\x18\x26\x26\x42\xae\x7c\xfc\x09\x2f\xbc\x78\x9a\xfb\x2b\
551 | \xeb\xdc\xbd\x73\x97\xed\xdd\x11\x61\xe0\xb9\x76\xe3\x0e\x4f\x3f\
552 | \xbd\xc4\xfd\x07\x6b\x6c\xac\xad\x60\xaa\x92\xf1\x68\x48\x9e\x97\
553 | \x14\x69\x85\x7a\xe9\xd9\x83\xdf\x38\x76\x20\xe4\xf0\xa1\x59\x02\
554 | \x5b\x51\x9a\x9c\x7b\x36\xe7\xaf\xae\xae\xf0\xfe\x70\xc8\xf7\xfb\
555 | \xdb\xf4\x6a\xc2\xc5\xdc\x6c\x9b\xd9\x89\x04\x33\x4e\xc9\x86\x63\
556 | \xd2\xc1\x88\x71\x7f\x4c\x36\x1e\x83\x70\x94\x45\x4a\xa3\xa1\x38\
557 | \x7c\x78\x96\x38\xf0\x14\x69\x46\x36\x4e\x49\x47\x19\x79\x5e\x92\
558 | \xa5\x39\x2a\x0a\x79\xa7\x37\xe4\xbd\x8d\x1d\x6e\x09\xc3\xf7\x7b\
559 | \xdb\x2c\xe3\x69\x34\x42\x0e\x9e\x3e\xc6\xc1\x73\x8f\xd3\x4a\x14\
560 | \xe5\x38\x63\x34\x1c\x93\x34\x63\xb2\xac\x60\xaf\x9f\x91\x17\x86\
561 | \x28\x94\x44\x91\x60\x76\x76\x82\x51\x9a\xb2\xd7\xcf\x18\x0e\x52\
562 | \x04\x15\xed\x76\x48\xab\x1d\xb1\xbd\x33\x64\x73\x7b\x40\x9e\x1b\
563 | \x86\xa3\x21\x8b\x8b\x93\x44\xb1\x62\x94\xa6\x44\x51\x40\xa3\x51\
564 | \xeb\x0a\x41\x18\xa1\x9f\x7d\x62\x81\x74\xb8\x46\x59\x18\xc6\xc3\
565 | \xb4\x1e\x1c\xca\x88\x07\x1d\xc9\xe6\xf6\x00\xa5\x02\xa4\xf5\x54\
566 | \xae\x64\xaf\x37\x60\xed\xe1\x0e\xf8\x7a\x86\xef\x3c\x14\xa5\xc5\
567 | \xa3\xe8\x76\xda\xb4\x1f\x6b\xa3\xa4\x40\x08\xcb\xc3\x95\x1e\xce\
568 | \x39\xca\xc2\x50\x99\x7a\x98\xea\x5c\x3d\xcb\x53\x9d\x98\xab\x21\
569 | \xec\x6e\xed\x22\xbc\x40\x29\x81\xf1\x96\xd6\xf6\x88\xb3\xf3\xc7\
570 | \x58\xbb\x74\x85\xbb\xab\xeb\xb5\xed\x26\x8c\x50\x52\x52\xe6\x05\
571 | \x65\x5e\xb1\xbe\xbe\xc7\x27\xb7\x57\x69\xc4\x31\x4a\x08\x9c\xa9\
572 | \xa5\xbc\xf5\xb5\x11\x1f\x7d\x74\xa7\x0e\xce\x54\xb5\x63\xdd\x3a\
573 | \x36\x36\xfa\x7c\x78\xe9\x26\x5a\x29\xd2\xf1\x98\xed\x9d\x11\x95\
574 | \x85\xf6\x44\x84\xc1\xf3\xff\x02\xe3\xc3\x27\xc6\xef\x49\xb3\x61\
575 | \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
576 | "
577 |
578 | qt_resource_name = b"\
579 | \x00\x0c\
580 | \x02\xcf\x94\xa7\
581 | \x00\x44\
582 | \x00\x34\x00\x33\x00\x2d\x00\x49\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
583 | "
584 |
585 | qt_resource_struct_v1 = b"\
586 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
587 | \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
588 | "
589 |
590 | qt_resource_struct_v2 = b"\
591 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
592 | \x00\x00\x00\x00\x00\x00\x00\x00\
593 | \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
594 | \x00\x00\x01\x6b\x2e\x07\xf1\xa8\
595 | "
596 |
597 | qt_version = QtCore.qVersion().split('.')
598 | if qt_version < ['5', '8', '0']:
599 | rcc_version = 1
600 | qt_resource_struct = qt_resource_struct_v1
601 | else:
602 | rcc_version = 2
603 | qt_resource_struct = qt_resource_struct_v2
604 |
605 | def qInitResources():
606 | QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
607 |
608 | def qCleanupResources():
609 | QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
610 |
611 | qInitResources()
612 |
--------------------------------------------------------------------------------