aboutsummaryrefslogtreecommitdiffstats
path: root/examples/opengl
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-01-05 15:58:35 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-01-12 12:28:10 +0000
commit9f2a9aba3aff73e31ea15eb4a7a04b0e50f4ee4e (patch)
tree92dcb0c4f64df8a8375af2e1a9bb1170068c36b2 /examples/opengl
parent26c046e521c38bbfc3a263782a3bb74a7c1bf937 (diff)
Move examples from submodule to pyside-setup
Move PySide2 examples that are owned by the Qt Company to a new examples directory. Done-with: Venugopal Shivashankar <Venugopal.Shivashankar@qt.io> Task-number: PYSIDE-363 Change-Id: I14099764d9eef2bc35e067086121427955862e3a Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'examples/opengl')
-rwxr-xr-xexamples/opengl/2dpainting.py174
-rw-r--r--examples/opengl/contextinfo.py251
-rw-r--r--examples/opengl/grabber.py436
-rwxr-xr-xexamples/opengl/hellogl.py288
-rwxr-xr-xexamples/opengl/overpainting.py386
-rwxr-xr-xexamples/opengl/samplebuffers.py193
-rw-r--r--examples/opengl/textures/images/side1.pngbin0 -> 1044 bytes
-rw-r--r--examples/opengl/textures/images/side2.pngbin0 -> 1768 bytes
-rw-r--r--examples/opengl/textures/images/side3.pngbin0 -> 2323 bytes
-rw-r--r--examples/opengl/textures/images/side4.pngbin0 -> 1342 bytes
-rw-r--r--examples/opengl/textures/images/side5.pngbin0 -> 1959 bytes
-rw-r--r--examples/opengl/textures/images/side6.pngbin0 -> 2446 bytes
-rwxr-xr-xexamples/opengl/textures/textures.py232
-rw-r--r--examples/opengl/textures/textures.qrc10
-rw-r--r--examples/opengl/textures/textures_rc.py797
15 files changed, 2767 insertions, 0 deletions
diff --git a/examples/opengl/2dpainting.py b/examples/opengl/2dpainting.py
new file mode 100755
index 000000000..6073024c5
--- /dev/null
+++ b/examples/opengl/2dpainting.py
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""PySide2 port of the opengl/legacy/2dpainting example from Qt v5.x"""
+
+import sys
+import math
+from PySide2.QtCore import *
+from PySide2.QtGui import *
+from PySide2.QtWidgets import *
+from PySide2.QtOpenGL import *
+
+try:
+ from OpenGL import GL
+except ImportError:
+ app = QApplication(sys.argv)
+ messageBox = QMessageBox(QMessageBox.Critical, "OpenGL 2dpainting",
+ "PyOpenGL must be installed to run this example.",
+ QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+
+class Helper:
+ def __init__(self):
+ gradient = QLinearGradient(QPointF(50, -20), QPointF(80, 20))
+ gradient.setColorAt(0.0, Qt.white)
+ gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39))
+
+ self.background = QBrush(QColor(64, 32, 64))
+ self.circleBrush = QBrush(gradient)
+ self.circlePen = QPen(Qt.black)
+ self.circlePen.setWidth(1)
+ self.textPen = QPen(Qt.white)
+ self.textFont = QFont()
+ self.textFont.setPixelSize(50)
+
+ def paint(self, painter, event, elapsed):
+ painter.fillRect(event.rect(), self.background)
+ painter.translate(100, 100)
+
+ painter.save()
+ painter.setBrush(self.circleBrush)
+ painter.setPen(self.circlePen)
+ painter.rotate(elapsed * 0.030)
+
+ r = elapsed/1000.0
+ n = 30
+ for i in range(n):
+ painter.rotate(30)
+ radius = 0 + 120.0*((i+r)/n)
+ circleRadius = 1 + ((i+r)/n)*20
+ painter.drawEllipse(QRectF(radius, -circleRadius,
+ circleRadius*2, circleRadius*2))
+
+ painter.restore()
+
+ painter.setPen(self.textPen)
+ painter.setFont(self.textFont)
+ painter.drawText(QRect(-50, -50, 100, 100), Qt.AlignCenter, "Qt")
+
+
+class Widget(QWidget):
+ def __init__(self, helper, parent = None):
+ QWidget.__init__(self, parent)
+
+ self.helper = helper
+ self.elapsed = 0
+ self.setFixedSize(200, 200)
+
+ def animate(self):
+ self.elapsed = (self.elapsed + self.sender().interval()) % 1000
+ self.repaint()
+
+ def paintEvent(self, event):
+ painter = QPainter()
+ painter.begin(self)
+ painter.setRenderHint(QPainter.Antialiasing)
+ self.helper.paint(painter, event, self.elapsed)
+ painter.end()
+
+
+class GLWidget(QGLWidget):
+ def __init__(self, helper, parent = None):
+ QGLWidget.__init__(self, QGLFormat(QGL.SampleBuffers), parent)
+
+ self.helper = helper
+ self.elapsed = 0
+ self.setFixedSize(200, 200)
+
+ def animate(self):
+ self.elapsed = (self.elapsed + self.sender().interval()) % 1000
+ self.repaint()
+
+ def paintEvent(self, event):
+ painter = QPainter()
+ painter.begin(self)
+ self.helper.paint(painter, event, self.elapsed)
+ painter.end()
+
+
+class Window(QWidget):
+ def __init__(self, parent = None):
+ QWidget.__init__(self, parent)
+
+ helper = Helper()
+ native = Widget(helper, self)
+ openGL = GLWidget(helper, self)
+ nativeLabel = QLabel(self.tr("Native"))
+ nativeLabel.setAlignment(Qt.AlignHCenter)
+ openGLLabel = QLabel(self.tr("OpenGL"))
+ openGLLabel.setAlignment(Qt.AlignHCenter)
+
+ layout = QGridLayout()
+ layout.addWidget(native, 0, 0)
+ layout.addWidget(openGL, 0, 1)
+ layout.addWidget(nativeLabel, 1, 0)
+ layout.addWidget(openGLLabel, 1, 1)
+ self.setLayout(layout)
+
+ timer = QTimer(self)
+ self.connect(timer, SIGNAL("timeout()"), native.animate)
+ self.connect(timer, SIGNAL("timeout()"), openGL.animate)
+ timer.start(50)
+
+ self.setWindowTitle(self.tr("2D Painting on Native and OpenGL Widgets"))
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/opengl/contextinfo.py b/examples/opengl/contextinfo.py
new file mode 100644
index 000000000..b2df1ded2
--- /dev/null
+++ b/examples/opengl/contextinfo.py
@@ -0,0 +1,251 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide2 port of the opengl/contextinfo example from Qt v5.x"""
+
+import numpy
+import sys
+
+from PySide2.QtCore import QLibraryInfo, QSize, QTimer, Qt
+from PySide2.QtGui import (QMatrix4x4, QOpenGLBuffer, QOpenGLContext, QOpenGLShader,
+ QOpenGLShaderProgram, QOpenGLVertexArrayObject, QSurfaceFormat, QWindow)
+from PySide2.QtWidgets import (QApplication, QHBoxLayout, QMessageBox, QPlainTextEdit,
+ QWidget)
+from PySide2.support import VoidPtr
+try:
+ from OpenGL import GL
+except ImportError:
+ app = QApplication(sys.argv)
+ messageBox = QMessageBox(QMessageBox.Critical, "ContextInfo",
+ "PyOpenGL must be installed to run this example.",
+ QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+vertexShaderSource110 = """
+#version 110
+attribute highp vec4 posAttr;
+attribute lowp vec4 colAttr;
+varying lowp vec4 col;
+uniform highp mat4 matrix;
+void main() {
+ col = colAttr;
+ gl_Position = matrix * posAttr;
+}
+"""
+
+fragmentShaderSource110 = """
+#version 110
+varying lowp vec4 col;
+void main() {
+ gl_FragColor = col;
+}
+"""
+
+vertexShaderSource = """
+#version 150
+in vec4 posAttr;
+in vec4 colAttr;
+out vec4 col;
+uniform mat4 matrix;
+void main() {
+ col = colAttr;
+ gl_Position = matrix * posAttr;
+}
+"""
+
+fragmentShaderSource = """
+#version 150
+in vec4 col;
+out vec4 fragColor;
+void main() {
+ fragColor = col;
+}
+"""
+
+vertices = numpy.array([0, 0.707, -0.5, -0.5, 0.5, -0.5], dtype = numpy.float32)
+colors = numpy.array([1, 0, 0, 0, 1, 0, 0, 0, 1], dtype = numpy.float32)
+
+class RenderWindow(QWindow):
+ def __init__(self, format):
+ super(RenderWindow, self).__init__()
+ self.setSurfaceType(QWindow.OpenGLSurface);
+ self.setFormat(format);
+ self.context = QOpenGLContext(self);
+ self.context.setFormat(self.requestedFormat());
+ if not self.context.create():
+ raise Exception("Unable to create GL context")
+ self.program = None
+ self.timer = None
+ self.angle = 0
+
+ def initGl(self):
+ self.program = QOpenGLShaderProgram(self);
+ self.vao = QOpenGLVertexArrayObject()
+ self.vbo = QOpenGLBuffer()
+
+ format = self.context.format();
+ useNewStyleShader = format.profile() == QSurfaceFormat.CoreProfile;
+ # Try to handle 3.0 & 3.1 that do not have the core/compatibility profile
+ # concept 3.2+ has. This may still fail since version 150 (3.2) is
+ # specified in the sources but it's worth a try.
+ if (format.renderableType() == QSurfaceFormat.OpenGL and format.majorVersion() == 3
+ and format.minorVersion() <= 1):
+ useNewStyleShader = not format.testOption(QSurfaceFormat.DeprecatedFunctions)
+
+ vertexShader = vertexShaderSource if useNewStyleShader else vertexShaderSource110
+ fragmentShader = fragmentShaderSource if useNewStyleShader else fragmentShaderSource110
+ if not self.program.addShaderFromSourceCode(QOpenGLShader.Vertex, vertexShader):
+ raise Exception("Vertex shader could not be added: {} ({})".format(self.program.log(), vertexShader))
+ if not self.program.addShaderFromSourceCode(QOpenGLShader.Fragment, fragmentShader):
+ raise Exception("Fragment shader could not be added: {} ({})".format(self.program.log(), fragmentShader))
+ if not self.program.link():
+ raise Exception("Could not link shaders: {}".format(self.program.log()))
+
+ self.posAttr = self.program.attributeLocation("posAttr");
+ self.colAttr = self.program.attributeLocation("colAttr");
+ self.matrixUniform = self.program.uniformLocation("matrix");
+
+ self.vbo.create();
+ self.vbo.bind();
+ self.verticesData = vertices.tobytes()
+ self.colorsData = colors.tobytes()
+ verticesSize = 4 * vertices.size
+ colorsSize = 4 * colors.size
+ self.vbo.allocate(VoidPtr(self.verticesData), verticesSize + colorsSize);
+ self.vbo.write(verticesSize, VoidPtr(self.colorsData), colorsSize)
+ self.vbo.release();
+
+ vaoBinder = QOpenGLVertexArrayObject.Binder(self.vao)
+ if self.vao.isCreated(): # have VAO support, use it
+ self.setupVertexAttribs()
+
+ def setupVertexAttribs(self):
+ self.vbo.bind();
+ self.program.setAttributeBuffer(self.posAttr, GL.GL_FLOAT, 0, 2);
+ self.program.setAttributeBuffer(self.colAttr, GL.GL_FLOAT, 4 * vertices.size, 3);
+ self.program.enableAttributeArray(self.posAttr);
+ self.program.enableAttributeArray(self.colAttr);
+ self.vbo.release();
+
+ def exposeEvent(self, event):
+ if self.isExposed():
+ self.render()
+ if self.timer is None:
+ self.timer = QTimer(self)
+ self.timer.timeout.connect(self.slotTimer)
+ self.timer.start(10)
+
+ def render(self):
+ if not self.context.makeCurrent(self):
+ raise Exception("makeCurrent() failed")
+ functions = self.context.functions()
+ if self.program is None:
+ functions.glEnable(GL.GL_DEPTH_TEST)
+ functions.glClearColor(0, 0, 0, 1)
+ self.initGl()
+
+ functions.glViewport(0, 0, self.width(), self.height());
+ functions.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
+
+ self.program.bind();
+ matrix = QMatrix4x4()
+ matrix.perspective(60, 4 / 3, 0.1, 100)
+ matrix.translate(0, 0, -2)
+ matrix.rotate(self.angle, 0, 1, 0)
+ self.program.setUniformValue(self.matrixUniform, matrix);
+
+ if self.vao.isCreated():
+ self.vao.bind();
+ else: # no VAO support, set the vertex attribute arrays now
+ self.setupVertexAttribs()
+
+ functions.glDrawArrays(GL.GL_TRIANGLES, 0, 3);
+
+ self.vao.release()
+ self.program.release()
+
+ # swapInterval is 1 by default which means that swapBuffers() will (hopefully) block
+ # and wait for vsync.
+ self.context.swapBuffers(self)
+ self.context.doneCurrent()
+
+ def slotTimer(self):
+ self.render()
+ self.angle += 1
+
+ def glInfo(self):
+ if not self.context.makeCurrent(self):
+ raise Exception("makeCurrent() failed")
+ functions = self.context.functions()
+ text = "Vendor: {}\nRenderer: {}\nVersion: {}\nShading language: {}".format(
+ functions.glGetString(GL.GL_VENDOR), functions.glGetString(GL.GL_RENDERER),
+ functions.glGetString(GL.GL_VERSION),
+ functions.glGetString(GL.GL_SHADING_LANGUAGE_VERSION))
+ self.context.doneCurrent()
+ return text
+
+class MainWindow(QWidget):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+ hBoxLayout = QHBoxLayout(self)
+ self.plainTextEdit = QPlainTextEdit()
+ self.plainTextEdit.setMinimumWidth(400)
+ self.plainTextEdit.setReadOnly(True)
+ hBoxLayout.addWidget(self.plainTextEdit)
+ self.renderWindow = RenderWindow(QSurfaceFormat())
+ container = QWidget.createWindowContainer(self.renderWindow)
+ container.setMinimumSize(QSize(400, 400))
+ hBoxLayout.addWidget(container)
+
+ def updateDescription(self):
+ text = "{}\n\nPython {}\n\n{}".format(QLibraryInfo.build(), sys.version,
+ self.renderWindow.glInfo())
+ self.plainTextEdit.setPlainText(text)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWindow = MainWindow()
+ mainWindow.show()
+ mainWindow.updateDescription()
+ sys.exit(app.exec_())
diff --git a/examples/opengl/grabber.py b/examples/opengl/grabber.py
new file mode 100644
index 000000000..f9eb9dc05
--- /dev/null
+++ b/examples/opengl/grabber.py
@@ -0,0 +1,436 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""PySide2 port of the opengl/legacy/grabber example from Qt v5.x"""
+
+import sys
+import math
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL
+
+try:
+ from OpenGL.GL import *
+except ImportError:
+ app = QtWidgets.QApplication(sys.argv)
+ messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL grabber",
+ "PyOpenGL must be installed to run this example.",
+ QtWidgets.QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+
+class GLWidget(QtOpenGL.QGLWidget):
+ xRotationChanged = QtCore.Signal(int)
+ yRotationChanged = QtCore.Signal(int)
+ zRotationChanged = QtCore.Signal(int)
+
+ def __init__(self, parent=None):
+ super(GLWidget, self).__init__(parent)
+
+ self.gear1 = 0
+ self.gear2 = 0
+ self.gear3 = 0
+ self.xRot = 0
+ self.yRot = 0
+ self.zRot = 0
+ self.gear1Rot = 0
+
+ timer = QtCore.QTimer(self)
+ timer.timeout.connect(self.advanceGears)
+ timer.start(20)
+
+ def freeResources(self):
+ self.makeCurrent()
+ glDeleteLists(self.gear1, 1)
+ glDeleteLists(self.gear2, 1)
+ glDeleteLists(self.gear3, 1)
+
+ def setXRotation(self, angle):
+ self.normalizeAngle(angle)
+
+ if angle != self.xRot:
+ self.xRot = angle
+ self.xRotationChanged.emit(angle)
+ self.updateGL()
+
+ def setYRotation(self, angle):
+ self.normalizeAngle(angle)
+
+ if angle != self.yRot:
+ self.yRot = angle
+ self.yRotationChanged.emit(angle)
+ self.updateGL()
+
+ def setZRotation(self, angle):
+ self.normalizeAngle(angle)
+
+ if angle != self.zRot:
+ self.zRot = angle
+ self.zRotationChanged.emit(angle)
+ self.updateGL()
+
+ def initializeGL(self):
+ lightPos = (5.0, 5.0, 10.0, 1.0)
+ reflectance1 = (0.8, 0.1, 0.0, 1.0)
+ reflectance2 = (0.0, 0.8, 0.2, 1.0)
+ reflectance3 = (0.2, 0.2, 1.0, 1.0)
+
+ glLightfv(GL_LIGHT0, GL_POSITION, lightPos)
+ glEnable(GL_LIGHTING)
+ glEnable(GL_LIGHT0)
+ glEnable(GL_DEPTH_TEST)
+
+ self.gear1 = self.makeGear(reflectance1, 1.0, 4.0, 1.0, 0.7, 20)
+ self.gear2 = self.makeGear(reflectance2, 0.5, 2.0, 2.0, 0.7, 10)
+ self.gear3 = self.makeGear(reflectance3, 1.3, 2.0, 0.5, 0.7, 10)
+
+ glEnable(GL_NORMALIZE)
+ glClearColor(0.0, 0.0, 0.0, 1.0)
+
+ def paintGL(self):
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+
+ glPushMatrix()
+ glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
+ glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
+ glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
+
+ self.drawGear(self.gear1, -3.0, -2.0, 0.0, self.gear1Rot / 16.0)
+ self.drawGear(self.gear2, +3.1, -2.0, 0.0,
+ -2.0 * (self.gear1Rot / 16.0) - 9.0)
+
+ glRotated(+90.0, 1.0, 0.0, 0.0)
+ self.drawGear(self.gear3, -3.1, -1.8, -2.2,
+ +2.0 * (self.gear1Rot / 16.0) - 2.0)
+
+ glPopMatrix()
+
+ def resizeGL(self, width, height):
+ side = min(width, height)
+ if side < 0:
+ return
+
+ glViewport(int((width - side) / 2), int((height - side) / 2), side, side)
+
+ glMatrixMode(GL_PROJECTION)
+ glLoadIdentity()
+ glFrustum(-1.0, +1.0, -1.0, 1.0, 5.0, 60.0)
+ glMatrixMode(GL_MODELVIEW)
+ glLoadIdentity()
+ glTranslated(0.0, 0.0, -40.0)
+
+ def mousePressEvent(self, event):
+ self.lastPos = event.pos()
+
+ def mouseMoveEvent(self, event):
+ dx = event.x() - self.lastPos.x()
+ dy = event.y() - self.lastPos.y()
+
+ if event.buttons() & QtCore.Qt.LeftButton:
+ self.setXRotation(self.xRot + 8 * dy)
+ self.setYRotation(self.yRot + 8 * dx)
+ elif event.buttons() & QtCore.Qt.RightButton:
+ self.setXRotation(self.xRot + 8 * dy)
+ self.setZRotation(self.zRot + 8 * dx)
+
+ self.lastPos = event.pos()
+
+ def advanceGears(self):
+ self.gear1Rot += 2 * 16
+ self.updateGL()
+
+ def xRotation(self):
+ return self.xRot
+
+ def yRotation(self):
+ return self.yRot
+
+ def zRotation(self):
+ return self.zRot
+
+ def makeGear(self, reflectance, innerRadius, outerRadius, thickness, toothSize, toothCount):
+ list = glGenLists(1)
+ glNewList(list, GL_COMPILE)
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, reflectance)
+
+ r0 = innerRadius
+ r1 = outerRadius - toothSize / 2.0
+ r2 = outerRadius + toothSize / 2.0
+ delta = (2.0 * math.pi / toothCount) / 4.0
+ z = thickness / 2.0
+
+ glShadeModel(GL_FLAT)
+
+ for i in range(2):
+ if i == 0:
+ sign = +1.0
+ else:
+ sign = -1.0
+
+ glNormal3d(0.0, 0.0, sign)
+
+ glBegin(GL_QUAD_STRIP)
+
+ for j in range(toothCount+1):
+ angle = 2.0 * math.pi * j / toothCount
+ glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), sign * z)
+ glVertex3d(r1 * math.cos(angle), r1 * math.sin(angle), sign * z)
+ glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), sign * z)
+ glVertex3d(r1 * math.cos(angle + 3 * delta), r1 * math.sin(angle + 3 * delta), sign * z)
+
+ glEnd()
+
+ glBegin(GL_QUADS)
+
+ for j in range(toothCount):
+ angle = 2.0 * math.pi * j / toothCount
+ glVertex3d(r1 * math.cos(angle), r1 * math.sin(angle), sign * z)
+ glVertex3d(r2 * math.cos(angle + delta), r2 * math.sin(angle + delta), sign * z)
+ glVertex3d(r2 * math.cos(angle + 2 * delta), r2 * math.sin(angle + 2 * delta), sign * z)
+ glVertex3d(r1 * math.cos(angle + 3 * delta), r1 * math.sin(angle + 3 * delta), sign * z)
+
+ glEnd()
+
+ glBegin(GL_QUAD_STRIP)
+
+ for i in range(toothCount):
+ for j in range(2):
+ angle = 2.0 * math.pi * (i + (j / 2.0)) / toothCount
+ s1 = r1
+ s2 = r2
+
+ if j == 1:
+ s1, s2 = s2, s1
+
+ glNormal3d(math.cos(angle), math.sin(angle), 0.0)
+ glVertex3d(s1 * math.cos(angle), s1 * math.sin(angle), +z)
+ glVertex3d(s1 * math.cos(angle), s1 * math.sin(angle), -z)
+
+ glNormal3d(s2 * math.sin(angle + delta) - s1 * math.sin(angle), s1 * math.cos(angle) - s2 * math.cos(angle + delta), 0.0)
+ glVertex3d(s2 * math.cos(angle + delta), s2 * math.sin(angle + delta), +z)
+ glVertex3d(s2 * math.cos(angle + delta), s2 * math.sin(angle + delta), -z)
+
+ glVertex3d(r1, 0.0, +z)
+ glVertex3d(r1, 0.0, -z)
+ glEnd()
+
+ glShadeModel(GL_SMOOTH)
+
+ glBegin(GL_QUAD_STRIP)
+
+ for i in range(toothCount+1):
+ angle = i * 2.0 * math.pi / toothCount
+ glNormal3d(-math.cos(angle), -math.sin(angle), 0.0)
+ glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), +z)
+ glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), -z)
+
+ glEnd()
+
+ glEndList()
+
+ return list
+
+ def drawGear(self, gear, dx, dy, dz, angle):
+ glPushMatrix()
+ glTranslated(dx, dy, dz)
+ glRotated(angle, 0.0, 0.0, 1.0)
+ glCallList(gear)
+ glPopMatrix()
+
+ def normalizeAngle(self, angle):
+ while (angle < 0):
+ angle += 360 * 16
+
+ while (angle > 360 * 16):
+ angle -= 360 * 16
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ centralWidget = QtWidgets.QWidget()
+ self.setCentralWidget(centralWidget)
+
+ self.glWidget = GLWidget()
+ self.pixmapLabel = QtWidgets.QLabel()
+
+ self.glWidgetArea = QtWidgets.QScrollArea()
+ self.glWidgetArea.setWidget(self.glWidget)
+ self.glWidgetArea.setWidgetResizable(True)
+ self.glWidgetArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.glWidgetArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.glWidgetArea.setSizePolicy(QtWidgets.QSizePolicy.Ignored,
+ QtWidgets.QSizePolicy.Ignored)
+ self.glWidgetArea.setMinimumSize(50, 50)
+
+ self.pixmapLabelArea = QtWidgets.QScrollArea()
+ self.pixmapLabelArea.setWidget(self.pixmapLabel)
+ self.pixmapLabelArea.setSizePolicy(QtWidgets.QSizePolicy.Ignored,
+ QtWidgets.QSizePolicy.Ignored)
+ self.pixmapLabelArea.setMinimumSize(50, 50)
+
+ xSlider = self.createSlider(self.glWidget.xRotationChanged,
+ self.glWidget.setXRotation)
+ ySlider = self.createSlider(self.glWidget.yRotationChanged,
+ self.glWidget.setYRotation)
+ zSlider = self.createSlider(self.glWidget.zRotationChanged,
+ self.glWidget.setZRotation)
+
+ self.createActions()
+ self.createMenus()
+
+ centralLayout = QtWidgets.QGridLayout()
+ centralLayout.addWidget(self.glWidgetArea, 0, 0)
+ centralLayout.addWidget(self.pixmapLabelArea, 0, 1)
+ centralLayout.addWidget(xSlider, 1, 0, 1, 2)
+ centralLayout.addWidget(ySlider, 2, 0, 1, 2)
+ centralLayout.addWidget(zSlider, 3, 0, 1, 2)
+ centralWidget.setLayout(centralLayout)
+
+ xSlider.setValue(15 * 16)
+ ySlider.setValue(345 * 16)
+ zSlider.setValue(0 * 16)
+
+ self.setWindowTitle("Grabber")
+ self.resize(400, 300)
+
+ def renderIntoPixmap(self):
+ size = self.getSize()
+
+ if size.isValid():
+ pixmap = self.glWidget.renderPixmap(size.width(), size.height())
+ self.setPixmap(pixmap)
+
+ def grabFrameBuffer(self):
+ image = self.glWidget.grabFrameBuffer()
+ self.setPixmap(QtGui.QPixmap.fromImage(image))
+
+ def clearPixmap(self):
+ self.setPixmap(QtGui.QPixmap())
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About Grabber",
+ "The <b>Grabber</b> example demonstrates two approaches for "
+ "rendering OpenGL into a Qt pixmap.")
+
+ def createActions(self):
+ self.renderIntoPixmapAct = QtWidgets.QAction("&Render into Pixmap...",
+ self, shortcut="Ctrl+R", triggered=self.renderIntoPixmap)
+
+ self.grabFrameBufferAct = QtWidgets.QAction("&Grab Frame Buffer", self,
+ shortcut="Ctrl+G", triggered=self.grabFrameBuffer)
+
+ self.clearPixmapAct = QtWidgets.QAction("&Clear Pixmap", self,
+ shortcut="Ctrl+L", triggered=self.clearPixmap)
+
+ self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q",
+ triggered=self.close)
+
+ self.aboutAct = QtWidgets.QAction("&About", self, triggered=self.about)
+
+ self.aboutQtAct = QtWidgets.QAction("About &Qt", self,
+ triggered=QtWidgets.qApp.aboutQt)
+
+ def createMenus(self):
+ self.fileMenu = self.menuBar().addMenu("&File")
+ self.fileMenu.addAction(self.renderIntoPixmapAct)
+ self.fileMenu.addAction(self.grabFrameBufferAct)
+ self.fileMenu.addAction(self.clearPixmapAct)
+ self.fileMenu.addSeparator()
+ self.fileMenu.addAction(self.exitAct)
+
+ self.helpMenu = self.menuBar().addMenu("&Help")
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+ def createSlider(self, changedSignal, setterSlot):
+ slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ slider.setRange(0, 360 * 16)
+ slider.setSingleStep(16)
+ slider.setPageStep(15 * 16)
+ slider.setTickInterval(15 * 16)
+ slider.setTickPosition(QtWidgets.QSlider.TicksRight)
+
+ slider.valueChanged.connect(setterSlot)
+ changedSignal.connect(slider.setValue)
+
+ return slider
+
+ def setPixmap(self, pixmap):
+ self.pixmapLabel.setPixmap(pixmap)
+ size = pixmap.size()
+
+ if size - QtCore.QSize(1, 0) == self.pixmapLabelArea.maximumViewportSize():
+ size -= QtCore.QSize(1, 0)
+
+ self.pixmapLabel.resize(size)
+
+ def getSize(self):
+ text, ok = QtWidgets.QInputDialog.getText(self, "Grabber",
+ "Enter pixmap size:", QtWidgets.QLineEdit.Normal,
+ "%d x %d" % (self.glWidget.width(), self.glWidget.height()))
+
+ if not ok:
+ return QtCore.QSize()
+
+ regExp = QtCore.QRegExp("([0-9]+) *x *([0-9]+)")
+
+ if regExp.exactMatch(text):
+ width = int(regExp.cap(1))
+ height = int(regExp.cap(2))
+ if width > 0 and width < 2048 and height > 0 and height < 2048:
+ return QtCore.QSize(width, height)
+
+ return self.glWidget.size()
+
+
+if __name__ == '__main__':
+
+ app = QtWidgets.QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ res = app.exec_()
+ mainWin.glWidget.freeResources()
+ sys.exit(res)
diff --git a/examples/opengl/hellogl.py b/examples/opengl/hellogl.py
new file mode 100755
index 000000000..18857faca
--- /dev/null
+++ b/examples/opengl/hellogl.py
@@ -0,0 +1,288 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""PySide2 port of the opengl/legacy/hellogl example from Qt v5.x"""
+
+import sys
+import math
+from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL
+
+try:
+ from OpenGL import GL
+except ImportError:
+ app = QtWidgets.QApplication(sys.argv)
+ messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL hellogl",
+ "PyOpenGL must be installed to run this example.",
+ QtWidgets.QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+
+class Window(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.glWidget = GLWidget()
+
+ self.xSlider = self.createSlider(QtCore.SIGNAL("xRotationChanged(int)"),
+ self.glWidget.setXRotation)
+ self.ySlider = self.createSlider(QtCore.SIGNAL("yRotationChanged(int)"),
+ self.glWidget.setYRotation)
+ self.zSlider = self.createSlider(QtCore.SIGNAL("zRotationChanged(int)"),
+ self.glWidget.setZRotation)
+
+ mainLayout = QtWidgets.QHBoxLayout()
+ mainLayout.addWidget(self.glWidget)
+ mainLayout.addWidget(self.xSlider)
+ mainLayout.addWidget(self.ySlider)
+ mainLayout.addWidget(self.zSlider)
+ self.setLayout(mainLayout)
+
+ self.xSlider.setValue(170 * 16)
+ self.ySlider.setValue(160 * 16)
+ self.zSlider.setValue(90 * 16)
+
+ self.setWindowTitle(self.tr("Hello GL"))
+
+ def createSlider(self, changedSignal, setterSlot):
+ slider = QtWidgets.QSlider(QtCore.Qt.Vertical)
+
+ slider.setRange(0, 360 * 16)
+ slider.setSingleStep(16)
+ slider.setPageStep(15 * 16)
+ slider.setTickInterval(15 * 16)
+ slider.setTickPosition(QtWidgets.QSlider.TicksRight)
+
+ self.glWidget.connect(slider, QtCore.SIGNAL("valueChanged(int)"), setterSlot)
+ self.connect(self.glWidget, changedSignal, slider, QtCore.SLOT("setValue(int)"))
+
+ return slider
+
+
+class GLWidget(QtOpenGL.QGLWidget):
+ xRotationChanged = QtCore.Signal(int)
+ yRotationChanged = QtCore.Signal(int)
+ zRotationChanged = QtCore.Signal(int)
+
+ def __init__(self, parent=None):
+ QtOpenGL.QGLWidget.__init__(self, parent)
+
+ self.object = 0
+ self.xRot = 0
+ self.yRot = 0
+ self.zRot = 0
+
+ self.lastPos = QtCore.QPoint()
+
+ self.trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
+ self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
+
+ def xRotation(self):
+ return self.xRot
+
+ def yRotation(self):
+ return self.yRot
+
+ def zRotation(self):
+ return self.zRot
+
+ def minimumSizeHint(self):
+ return QtCore.QSize(50, 50)
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 400)
+
+ def setXRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.xRot:
+ self.xRot = angle
+ self.emit(QtCore.SIGNAL("xRotationChanged(int)"), angle)
+ self.updateGL()
+
+ def setYRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.yRot:
+ self.yRot = angle
+ self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
+ self.updateGL()
+
+ def setZRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.zRot:
+ self.zRot = angle
+ self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
+ self.updateGL()
+
+ def initializeGL(self):
+ self.qglClearColor(self.trolltechPurple.darker())
+ self.object = self.makeObject()
+ GL.glShadeModel(GL.GL_FLAT)
+ GL.glEnable(GL.GL_DEPTH_TEST)
+ GL.glEnable(GL.GL_CULL_FACE)
+
+ def paintGL(self):
+ GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
+ GL.glLoadIdentity()
+ GL.glTranslated(0.0, 0.0, -10.0)
+ GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
+ GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
+ GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
+ GL.glCallList(self.object)
+
+ def resizeGL(self, width, height):
+ side = min(width, height)
+ GL.glViewport(int((width - side) / 2),int((height - side) / 2), side, side)
+
+ GL.glMatrixMode(GL.GL_PROJECTION)
+ GL.glLoadIdentity()
+ GL.glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0)
+ GL.glMatrixMode(GL.GL_MODELVIEW)
+
+ def mousePressEvent(self, event):
+ self.lastPos = QtCore.QPoint(event.pos())
+
+ def mouseMoveEvent(self, event):
+ dx = event.x() - self.lastPos.x()
+ dy = event.y() - self.lastPos.y()
+
+ if event.buttons() & QtCore.Qt.LeftButton:
+ self.setXRotation(self.xRot + 8 * dy)
+ self.setYRotation(self.yRot + 8 * dx)
+ elif event.buttons() & QtCore.Qt.RightButton:
+ self.setXRotation(self.xRot + 8 * dy)
+ self.setZRotation(self.zRot + 8 * dx)
+
+ self.lastPos = QtCore.QPoint(event.pos())
+
+ def makeObject(self):
+ genList = GL.glGenLists(1)
+ GL.glNewList(genList, GL.GL_COMPILE)
+
+ GL.glBegin(GL.GL_QUADS)
+
+ x1 = +0.06
+ y1 = -0.14
+ x2 = +0.14
+ y2 = -0.06
+ x3 = +0.08
+ y3 = +0.00
+ x4 = +0.30
+ y4 = +0.22
+
+ self.quad(x1, y1, x2, y2, y2, x2, y1, x1)
+ self.quad(x3, y3, x4, y4, y4, x4, y3, x3)
+
+ self.extrude(x1, y1, x2, y2)
+ self.extrude(x2, y2, y2, x2)
+ self.extrude(y2, x2, y1, x1)
+ self.extrude(y1, x1, x1, y1)
+ self.extrude(x3, y3, x4, y4)
+ self.extrude(x4, y4, y4, x4)
+ self.extrude(y4, x4, y3, x3)
+
+ Pi = 3.14159265358979323846
+ NumSectors = 200
+
+ for i in range(NumSectors):
+ angle1 = (i * 2 * Pi) / NumSectors
+ x5 = 0.30 * math.sin(angle1)
+ y5 = 0.30 * math.cos(angle1)
+ x6 = 0.20 * math.sin(angle1)
+ y6 = 0.20 * math.cos(angle1)
+
+ angle2 = ((i + 1) * 2 * Pi) / NumSectors
+ x7 = 0.20 * math.sin(angle2)
+ y7 = 0.20 * math.cos(angle2)
+ x8 = 0.30 * math.sin(angle2)
+ y8 = 0.30 * math.cos(angle2)
+
+ self.quad(x5, y5, x6, y6, x7, y7, x8, y8)
+
+ self.extrude(x6, y6, x7, y7)
+ self.extrude(x8, y8, x5, y5)
+
+ GL.glEnd()
+ GL.glEndList()
+
+ return genList
+
+ def quad(self, x1, y1, x2, y2, x3, y3, x4, y4):
+ self.qglColor(self.trolltechGreen)
+
+ GL.glVertex3d(x1, y1, +0.05)
+ GL.glVertex3d(x2, y2, +0.05)
+ GL.glVertex3d(x3, y3, +0.05)
+ GL.glVertex3d(x4, y4, +0.05)
+
+ GL.glVertex3d(x4, y4, -0.05)
+ GL.glVertex3d(x3, y3, -0.05)
+ GL.glVertex3d(x2, y2, -0.05)
+ GL.glVertex3d(x1, y1, -0.05)
+
+ def extrude(self, x1, y1, x2, y2):
+ self.qglColor(self.trolltechGreen.darker(250 + int(100 * x1)))
+
+ GL.glVertex3d(x1, y1, -0.05)
+ GL.glVertex3d(x2, y2, -0.05)
+ GL.glVertex3d(x2, y2, +0.05)
+ GL.glVertex3d(x1, y1, +0.05)
+
+ def normalizeAngle(self, angle):
+ while angle < 0:
+ angle += 360 * 16
+ while angle > 360 * 16:
+ angle -= 360 * 16
+ return angle
+
+ def freeResources(self):
+ self.makeCurrent()
+ GL.glDeleteLists(self.object, 1)
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+ window = Window()
+ window.show()
+ res = app.exec_()
+ window.glWidget.freeResources()
+ sys.exit(res)
diff --git a/examples/opengl/overpainting.py b/examples/opengl/overpainting.py
new file mode 100755
index 000000000..9285eaa9b
--- /dev/null
+++ b/examples/opengl/overpainting.py
@@ -0,0 +1,386 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""PySide2 port of the opengl/legacy/overpainting example from Qt v5.x"""
+
+import sys
+import math, random
+from PySide2.QtCore import *
+from PySide2.QtGui import *
+from PySide2.QtWidgets import *
+from PySide2.QtOpenGL import *
+
+try:
+ from OpenGL.GL import *
+except ImportError:
+ app = QApplication(sys.argv)
+ messageBox = QMessageBox(QMessageBox.Critical, "OpenGL overpainting",
+ "PyOpenGL must be installed to run this example.",
+ QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+
+class Bubble:
+ def __init__(self, position, radius, velocity):
+ self.position = position
+ self.vel = velocity
+ self.radius = radius
+ self.innerColor = self.randomColor()
+ self.outerColor = self.randomColor()
+ self.updateBrush()
+
+ def updateBrush(self):
+ gradient = QRadialGradient(QPointF(self.radius, self.radius), self.radius,
+ QPointF(self.radius*0.5, self.radius*0.5))
+
+ gradient.setColorAt(0, QColor(255, 255, 255, 255))
+ gradient.setColorAt(0.25, self.innerColor)
+ gradient.setColorAt(1, self.outerColor)
+ self.brush = QBrush(gradient)
+
+ def drawBubble(self, painter):
+ painter.save()
+ painter.translate(self.position.x() - self.radius,
+ self.position.y() - self.radius)
+ painter.setBrush(self.brush)
+ painter.drawEllipse(0, 0, int(2*self.radius), int(2*self.radius))
+ painter.restore()
+
+ def randomColor(self):
+ red = random.randrange(205, 256)
+ green = random.randrange(205, 256)
+ blue = random.randrange(205, 256)
+ alpha = random.randrange(91, 192)
+
+ return QColor(red, green, blue, alpha)
+
+ def move(self, bbox):
+ self.position += self.vel
+ leftOverflow = self.position.x() - self.radius - bbox.left()
+ rightOverflow = self.position.x() + self.radius - bbox.right()
+ topOverflow = self.position.y() - self.radius - bbox.top()
+ bottomOverflow = self.position.y() + self.radius - bbox.bottom()
+
+ if leftOverflow < 0.0:
+ self.position.setX(self.position.x() - 2 * leftOverflow)
+ self.vel.setX(-self.vel.x())
+ elif rightOverflow > 0.0:
+ self.position.setX(self.position.x() - 2 * rightOverflow)
+ self.vel.setX(-self.vel.x())
+
+ if topOverflow < 0.0:
+ self.position.setY(self.position.y() - 2 * topOverflow)
+ self.vel.setY(-self.vel.y())
+ elif bottomOverflow > 0.0:
+ self.position.setY(self.position.y() - 2 * bottomOverflow)
+ self.vel.setY(-self.vel.y())
+
+ def rect(self):
+ return QRectF(self.position.x() - self.radius,
+ self.position.y() - self.radius,
+ 2 * self.radius, 2 * self.radius)
+
+
+class GLWidget(QGLWidget):
+ def __init__(self, parent = None):
+ QGLWidget.__init__(self, QGLFormat(QGL.SampleBuffers), parent)
+
+ midnight = QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QTime.currentTime()))
+
+ self.object = 0
+ self.xRot = 0
+ self.yRot = 0
+ self.zRot = 0
+ self.image = QImage()
+ self.bubbles = []
+ self.lastPos = QPoint()
+
+ self.trolltechGreen = QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
+ self.trolltechPurple = QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
+
+ self.animationTimer = QTimer()
+ self.animationTimer.setSingleShot(False)
+ self.connect(self.animationTimer, SIGNAL("timeout()"), self.animate)
+ self.animationTimer.start(25)
+
+ self.setAttribute(Qt.WA_NoSystemBackground)
+ self.setMinimumSize(200, 200)
+ self.setWindowTitle(self.tr("Overpainting a Scene"))
+
+ def freeResources(self):
+ self.makeCurrent()
+ glDeleteLists(self.object, 1)
+
+ def setXRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.xRot:
+ self.xRot = angle
+ self.emit(SIGNAL("xRotationChanged(int)"), angle)
+
+ def setYRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.yRot:
+ self.yRot = angle
+ self.emit(SIGNAL("yRotationChanged(int)"), angle)
+
+ def setZRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.zRot:
+ self.zRot = angle
+ self.emit(SIGNAL("zRotationChanged(int)"), angle)
+
+ def initializeGL(self):
+ self.object = self.makeObject()
+
+ def mousePressEvent(self, event):
+ self.lastPos = QPoint(event.pos())
+
+ def mouseMoveEvent(self, event):
+ dx = event.x() - self.lastPos.x()
+ dy = event.y() - self.lastPos.y()
+
+ if event.buttons() & Qt.LeftButton:
+ self.setXRotation(self.xRot + 8 * dy)
+ self.setYRotation(self.yRot + 8 * dx)
+ elif event.buttons() & Qt.RightButton:
+ self.setXRotation(self.xRot + 8 * dy)
+ self.setZRotation(self.zRot + 8 * dx)
+
+ self.lastPos = QPoint(event.pos())
+
+ def paintEvent(self, event):
+ painter = QPainter()
+ painter.begin(self)
+ painter.setRenderHint(QPainter.Antialiasing)
+
+ glPushAttrib(GL_ALL_ATTRIB_BITS)
+ glMatrixMode(GL_PROJECTION)
+ glPushMatrix()
+ glMatrixMode(GL_MODELVIEW)
+ glPushMatrix()
+
+ self.qglClearColor(self.trolltechPurple.darker())
+ glShadeModel(GL_SMOOTH)
+ glEnable(GL_DEPTH_TEST)
+ glEnable(GL_CULL_FACE)
+ glEnable(GL_LIGHTING)
+ glEnable(GL_LIGHT0)
+ lightPosition = ( 0.5, 5.0, 7.0, 1.0 )
+ glLightfv(GL_LIGHT0, GL_POSITION, lightPosition)
+
+ self.resizeGL(self.width(), self.height())
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+ glLoadIdentity()
+ glTranslated(0.0, 0.0, -10.0)
+ glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
+ glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
+ glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
+ glCallList(self.object)
+
+ glPopAttrib()
+ glMatrixMode(GL_MODELVIEW)
+ glPopMatrix()
+ glMatrixMode(GL_PROJECTION)
+ glPopMatrix()
+
+ glDisable(GL_CULL_FACE) ### not required if begin() also does it
+
+ for bubble in self.bubbles:
+ if bubble.rect().intersects(QRectF(event.rect())):
+ bubble.drawBubble(painter)
+
+ painter.drawImage((self.width() - self.image.width())/2, 0, self.image)
+ painter.end()
+
+ def resizeGL(self, width, height):
+ side = min(width, height)
+ glViewport(int((width - side) / 2), int((height - side) / 2), side, side)
+
+ glMatrixMode(GL_PROJECTION)
+ glLoadIdentity()
+ glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
+ glMatrixMode(GL_MODELVIEW)
+
+ self.formatInstructions(width, height)
+
+ def showEvent(self, event):
+ self.createBubbles(20 - len(self.bubbles))
+
+ def sizeHint(self):
+ return QSize(400, 400)
+
+ def makeObject(self):
+ list = glGenLists(1)
+ glNewList(list, GL_COMPILE)
+
+ glEnable(GL_NORMALIZE)
+ glBegin(GL_QUADS)
+
+ logoDiffuseColor = (self.trolltechGreen.red()/255.0,
+ self.trolltechGreen.green()/255.0,
+ self.trolltechGreen.blue()/255.0, 1.0)
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, logoDiffuseColor)
+
+ x1 = +0.06
+ y1 = -0.14
+ x2 = +0.14
+ y2 = -0.06
+ x3 = +0.08
+ y3 = +0.00
+ x4 = +0.30
+ y4 = +0.22
+
+ self.quad(x1, y1, x2, y2, y2, x2, y1, x1)
+ self.quad(x3, y3, x4, y4, y4, x4, y3, x3)
+
+ self.extrude(x1, y1, x2, y2)
+ self.extrude(x2, y2, y2, x2)
+ self.extrude(y2, x2, y1, x1)
+ self.extrude(y1, x1, x1, y1)
+ self.extrude(x3, y3, x4, y4)
+ self.extrude(x4, y4, y4, x4)
+ self.extrude(y4, x4, y3, x3)
+
+ NumSectors = 200
+
+ for i in range(NumSectors):
+ angle1 = (i * 2 * math.pi) / NumSectors
+ x5 = 0.30 * math.sin(angle1)
+ y5 = 0.30 * math.cos(angle1)
+ x6 = 0.20 * math.sin(angle1)
+ y6 = 0.20 * math.cos(angle1)
+
+ angle2 = ((i + 1) * 2 * math.pi) / NumSectors
+ x7 = 0.20 * math.sin(angle2)
+ y7 = 0.20 * math.cos(angle2)
+ x8 = 0.30 * math.sin(angle2)
+ y8 = 0.30 * math.cos(angle2)
+
+ self.quad(x5, y5, x6, y6, x7, y7, x8, y8)
+
+ self.extrude(x6, y6, x7, y7)
+ self.extrude(x8, y8, x5, y5)
+
+ glEnd()
+
+ glEndList()
+ return list
+
+ def quad(self, x1, y1, x2, y2, x3, y3, x4, y4):
+ glNormal3d(0.0, 0.0, -1.0)
+ glVertex3d(x1, y1, -0.05)
+ glVertex3d(x2, y2, -0.05)
+ glVertex3d(x3, y3, -0.05)
+ glVertex3d(x4, y4, -0.05)
+
+ glNormal3d(0.0, 0.0, 1.0)
+ glVertex3d(x4, y4, +0.05)
+ glVertex3d(x3, y3, +0.05)
+ glVertex3d(x2, y2, +0.05)
+ glVertex3d(x1, y1, +0.05)
+
+ def extrude(self, x1, y1, x2, y2):
+ self.qglColor(self.trolltechGreen.darker(250 + int(100 * x1)))
+
+ glNormal3d((x1 + x2)/2.0, (y1 + y2)/2.0, 0.0)
+ glVertex3d(x1, y1, +0.05)
+ glVertex3d(x2, y2, +0.05)
+ glVertex3d(x2, y2, -0.05)
+ glVertex3d(x1, y1, -0.05)
+
+ def normalizeAngle(self, angle):
+ while angle < 0:
+ angle += 360 * 16
+ while angle > 360 * 16:
+ angle -= 360 * 16
+ return angle
+
+ def createBubbles(self, number):
+ for i in range(number):
+ position = QPointF(self.width()*(0.1 + 0.8*random.random()),
+ self.height()*(0.1 + 0.8*random.random()))
+ radius = min(self.width(), self.height())*(0.0125 + 0.0875*random.random())
+ velocity = QPointF(self.width()*0.0125*(-0.5 + random.random()),
+ self.height()*0.0125*(-0.5 + random.random()))
+
+ self.bubbles.append(Bubble(position, radius, velocity))
+
+ def animate(self):
+ for bubble in self.bubbles:
+ self.update(bubble.rect().toRect())
+ bubble.move(self.rect())
+ self.update(bubble.rect().toRect())
+
+ def formatInstructions(self, width, height):
+ text = self.tr("Click and drag with the left mouse button "
+ "to rotate the Qt logo.")
+ metrics = QFontMetrics(self.font())
+ border = max(4, metrics.leading())
+
+ rect = metrics.boundingRect(0, 0, width - 2*border, int(height*0.125),
+ Qt.AlignCenter | Qt.TextWordWrap, text)
+ self.image = QImage(width, rect.height() + 2*border,
+ QImage.Format_ARGB32_Premultiplied)
+ self.image.fill(qRgba(0, 0, 0, 127))
+
+ painter = QPainter()
+ painter.begin(self.image)
+ painter.setRenderHint(QPainter.TextAntialiasing)
+ painter.setPen(Qt.white)
+ painter.drawText((width - rect.width())/2, border,
+ rect.width(), rect.height(),
+ Qt.AlignCenter | Qt.TextWordWrap, text)
+ painter.end()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = GLWidget()
+ window.show()
+ res = app.exec_()
+ window.freeResources()
+ sys.exit(res)
diff --git a/examples/opengl/samplebuffers.py b/examples/opengl/samplebuffers.py
new file mode 100755
index 000000000..eabcdd313
--- /dev/null
+++ b/examples/opengl/samplebuffers.py
@@ -0,0 +1,193 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""PySide2 port of the opengl/legacy/samplebuffers example from Qt v5.x"""
+
+import sys
+import math
+from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL
+
+try:
+ from OpenGL import GL
+except ImportError:
+ app = QtWidgets.QApplication(sys.argv)
+ messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL samplebuffers",
+ "PyOpenGL must be installed to run this example.",
+ QtWidgets.QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+
+class GLWidget(QtOpenGL.QGLWidget):
+ GL_MULTISAMPLE = 0x809D
+ rot = 0.0
+
+ def __init__(self, parent=None):
+ QtOpenGL.QGLWidget.__init__(self, QtOpenGL.QGLFormat(QtOpenGL.QGL.SampleBuffers), parent)
+
+ self.list_ = []
+
+ self.startTimer(40)
+ self.setWindowTitle(self.tr("Sample Buffers"))
+
+ def initializeGL(self):
+ GL.glMatrixMode(GL.GL_PROJECTION)
+ GL.glLoadIdentity()
+ GL.glOrtho( -.5, .5, .5, -.5, -1000, 1000)
+ GL.glMatrixMode(GL.GL_MODELVIEW)
+ GL.glLoadIdentity()
+ GL.glClearColor(1.0, 1.0, 1.0, 1.0)
+
+ self.makeObject()
+
+ def resizeGL(self, w, h):
+ GL.glViewport(0, 0, w, h)
+
+ def paintGL(self):
+ GL.glClear(GL.GL_COLOR_BUFFER_BIT)
+
+ GL.glMatrixMode(GL.GL_MODELVIEW)
+ GL.glPushMatrix()
+ GL.glEnable(GLWidget.GL_MULTISAMPLE)
+ GL.glTranslatef( -0.25, -0.10, 0.0)
+ GL.glScalef(0.75, 1.15, 0.0)
+ GL.glRotatef(GLWidget.rot, 0.0, 0.0, 1.0)
+ GL.glCallList(self.list_)
+ GL.glPopMatrix()
+
+ GL.glPushMatrix()
+ GL.glDisable(GLWidget.GL_MULTISAMPLE)
+ GL.glTranslatef(0.25, -0.10, 0.0)
+ GL.glScalef(0.75, 1.15, 0.0)
+ GL.glRotatef(GLWidget.rot, 0.0, 0.0, 1.0)
+ GL.glCallList(self.list_)
+ GL.glPopMatrix()
+
+ GLWidget.rot += 0.2
+
+ self.qglColor(QtCore.Qt.black)
+ self.renderText(-0.35, 0.4, 0.0, "Multisampling enabled")
+ self.renderText(0.15, 0.4, 0.0, "Multisampling disabled")
+
+ def timerEvent(self, event):
+ self.update()
+
+ def makeObject(self):
+ trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
+ Pi = 3.14159265358979323846
+ NumSectors = 15
+ x1 = +0.06
+ y1 = -0.14
+ x2 = +0.14
+ y2 = -0.06
+ x3 = +0.08
+ y3 = +0.00
+ x4 = +0.30
+ y4 = +0.22
+
+ self.list_ = GL.glGenLists(1)
+ GL.glNewList(self.list_, GL.GL_COMPILE)
+
+ for i in range(NumSectors):
+ angle1 = float((i * 2 * Pi) / NumSectors)
+ x5 = 0.30 * math.sin(angle1)
+ y5 = 0.30 * math.cos(angle1)
+ x6 = 0.20 * math.sin(angle1)
+ y6 = 0.20 * math.cos(angle1)
+
+ angle2 = float(((i + 1) * 2 * Pi) / NumSectors)
+ x7 = 0.20 * math.sin(angle2)
+ y7 = 0.20 * math.cos(angle2)
+ x8 = 0.30 * math.sin(angle2)
+ y8 = 0.30 * math.cos(angle2)
+
+ self.qglColor(trolltechGreen)
+ self.quad(GL.GL_QUADS, x5, y5, x6, y6, x7, y7, x8, y8)
+ self.qglColor(QtCore.Qt.black)
+ self.quad(GL.GL_LINE_LOOP, x5, y5, x6, y6, x7, y7, x8, y8)
+
+ self.qglColor(trolltechGreen)
+ self.quad(GL.GL_QUADS, x1, y1, x2, y2, y2, x2, y1, x1)
+ self.quad(GL.GL_QUADS, x3, y3, x4, y4, y4, x4, y3, x3)
+
+ self.qglColor(QtCore.Qt.black)
+ self.quad(GL.GL_LINE_LOOP, x1, y1, x2, y2, y2, x2, y1, x1)
+ self.quad(GL.GL_LINE_LOOP, x3, y3, x4, y4, y4, x4, y3, x3)
+
+ GL.glEndList()
+
+ def quad(self, primitive, x1, y1, x2, y2, x3, y3, x4, y4):
+ GL.glBegin(primitive)
+
+ GL.glVertex2d(x1, y1)
+ GL.glVertex2d(x2, y2)
+ GL.glVertex2d(x3, y3)
+ GL.glVertex2d(x4, y4)
+
+ GL.glEnd()
+
+ def freeResources(self):
+ self.makeCurrent()
+ GL.glDeleteLists(self.list_, 1)
+
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+
+ if not QtOpenGL.QGLFormat.hasOpenGL():
+ QMessageBox.information(0, "OpenGL pbuffers",
+ "This system does not support OpenGL.",
+ QMessageBox.Ok)
+ sys.exit(1)
+
+ f = QtOpenGL.QGLFormat.defaultFormat()
+ f.setSampleBuffers(True)
+ QtOpenGL.QGLFormat.setDefaultFormat(f)
+
+ widget = GLWidget()
+ widget.resize(640, 480)
+ widget.show()
+ res = app.exec_()
+ widget.freeResources()
+ sys.exit(res)
diff --git a/examples/opengl/textures/images/side1.png b/examples/opengl/textures/images/side1.png
new file mode 100644
index 000000000..68fd4336d
--- /dev/null
+++ b/examples/opengl/textures/images/side1.png
Binary files differ
diff --git a/examples/opengl/textures/images/side2.png b/examples/opengl/textures/images/side2.png
new file mode 100644
index 000000000..b12d30d49
--- /dev/null
+++ b/examples/opengl/textures/images/side2.png
Binary files differ
diff --git a/examples/opengl/textures/images/side3.png b/examples/opengl/textures/images/side3.png
new file mode 100644
index 000000000..f582ae558
--- /dev/null
+++ b/examples/opengl/textures/images/side3.png
Binary files differ
diff --git a/examples/opengl/textures/images/side4.png b/examples/opengl/textures/images/side4.png
new file mode 100644
index 000000000..19829d2d6
--- /dev/null
+++ b/examples/opengl/textures/images/side4.png
Binary files differ
diff --git a/examples/opengl/textures/images/side5.png b/examples/opengl/textures/images/side5.png
new file mode 100644
index 000000000..3843b1229
--- /dev/null
+++ b/examples/opengl/textures/images/side5.png
Binary files differ
diff --git a/examples/opengl/textures/images/side6.png b/examples/opengl/textures/images/side6.png
new file mode 100644
index 000000000..798a9bb66
--- /dev/null
+++ b/examples/opengl/textures/images/side6.png
Binary files differ
diff --git a/examples/opengl/textures/textures.py b/examples/opengl/textures/textures.py
new file mode 100755
index 000000000..3c91a6024
--- /dev/null
+++ b/examples/opengl/textures/textures.py
@@ -0,0 +1,232 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+############################################################################
+
+"""PySide2 port of the opengl/textures example from Qt v5.x"""
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL
+
+try:
+ from OpenGL.GL import *
+except ImportError:
+ app = QtWidgets.QApplication(sys.argv)
+ messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL textures",
+ "PyOpenGL must be installed to run this example.",
+ QtWidgets.QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+import textures_rc
+
+
+class GLWidget(QtOpenGL.QGLWidget):
+ sharedObject = 0
+ refCount = 0
+
+ coords = (
+ ( ( +1, -1, -1 ), ( -1, -1, -1 ), ( -1, +1, -1 ), ( +1, +1, -1 ) ),
+ ( ( +1, +1, -1 ), ( -1, +1, -1 ), ( -1, +1, +1 ), ( +1, +1, +1 ) ),
+ ( ( +1, -1, +1 ), ( +1, -1, -1 ), ( +1, +1, -1 ), ( +1, +1, +1 ) ),
+ ( ( -1, -1, -1 ), ( -1, -1, +1 ), ( -1, +1, +1 ), ( -1, +1, -1 ) ),
+ ( ( +1, -1, +1 ), ( -1, -1, +1 ), ( -1, -1, -1 ), ( +1, -1, -1 ) ),
+ ( ( -1, -1, +1 ), ( +1, -1, +1 ), ( +1, +1, +1 ), ( -1, +1, +1 ) )
+ )
+
+ clicked = QtCore.Signal()
+
+ def __init__(self, parent, shareWidget):
+ QtOpenGL.QGLWidget.__init__(self, parent, shareWidget)
+
+ self.clearColor = QtCore.Qt.black
+ self.xRot = 0
+ self.yRot = 0
+ self.zRot = 0
+ self.clearColor = QtGui.QColor()
+ self.lastPos = QtCore.QPoint()
+
+ def freeGLResources(self):
+ GLWidget.refCount -= 1
+ if GLWidget.refCount == 0:
+ self.makeCurrent()
+ glDeleteLists(self.__class__.sharedObject, 1)
+
+ def minimumSizeHint(self):
+ return QtCore.QSize(50, 50)
+
+ def sizeHint(self):
+ return QtCore.QSize(200, 200)
+
+ def rotateBy(self, xAngle, yAngle, zAngle):
+ self.xRot = (self.xRot + xAngle) % 5760
+ self.yRot = (self.yRot + yAngle) % 5760
+ self.zRot = (self.zRot + zAngle) % 5760
+ self.updateGL()
+
+ def setClearColor(self, color):
+ self.clearColor = color
+ self.updateGL()
+
+ def initializeGL(self):
+ if not GLWidget.sharedObject:
+ self.textures = []
+ for i in range(6):
+ self.textures.append(self.bindTexture(QtGui.QPixmap(":/images/side%d.png" % (i + 1))))
+ GLWidget.sharedObject = self.makeObject()
+ GLWidget.refCount += 1
+
+ glEnable(GL_DEPTH_TEST)
+ glEnable(GL_CULL_FACE)
+ glEnable(GL_TEXTURE_2D)
+
+ def paintGL(self):
+ self.qglClearColor(self.clearColor)
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+ glLoadIdentity()
+ glTranslated(0.0, 0.0, -10.0)
+ glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
+ glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
+ glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
+ glCallList(GLWidget.sharedObject)
+
+ def resizeGL(self, width, height):
+ side = min(width, height)
+ glViewport(int((width - side) / 2), int((height - side) / 2), side, side)
+
+ glMatrixMode(GL_PROJECTION)
+ glLoadIdentity()
+ glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0)
+ glMatrixMode(GL_MODELVIEW)
+
+ def mousePressEvent(self, event):
+ self.lastPos = QtCore.QPoint(event.pos())
+
+ def mouseMoveEvent(self, event):
+ dx = event.x() - self.lastPos.x()
+ dy = event.y() - self.lastPos.y()
+
+ if event.buttons() & QtCore.Qt.LeftButton:
+ self.rotateBy(8 * dy, 8 * dx, 0)
+ elif event.buttons() & QtCore.Qt.RightButton:
+ self.rotateBy(8 * dy, 0, 8 * dx)
+
+ self.lastPos = QtCore.QPoint(event.pos())
+
+ def mouseReleaseEvent(self, event):
+ self.clicked.emit()
+
+ def makeObject(self):
+ dlist = glGenLists(1)
+ glNewList(dlist, GL_COMPILE)
+
+ for i in range(6):
+ glBindTexture(GL_TEXTURE_2D, self.textures[i])
+
+ glBegin(GL_QUADS)
+ for j in range(4):
+ tx = {False: 0, True: 1}[j == 0 or j == 3]
+ ty = {False: 0, True: 1}[j == 0 or j == 1]
+ glTexCoord2d(tx, ty)
+ glVertex3d(0.2 * GLWidget.coords[i][j][0],
+ 0.2 * GLWidget.coords[i][j][1],
+ 0.2 * GLWidget.coords[i][j][2])
+
+ glEnd()
+
+ glEndList()
+ return dlist
+
+
+class Window(QtWidgets.QWidget):
+ NumRows = 2
+ NumColumns = 3
+
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ mainLayout = QtWidgets.QGridLayout()
+ self.glWidgets = []
+
+ for i in range(Window.NumRows):
+ self.glWidgets.append([])
+ for j in range(Window.NumColumns):
+ self.glWidgets[i].append(None)
+
+ for i in range(Window.NumRows):
+ for j in range(Window.NumColumns):
+ clearColor = QtGui.QColor()
+ clearColor.setHsv(((i * Window.NumColumns) + j) * 255
+ / (Window.NumRows * Window.NumColumns - 1),
+ 255, 63)
+
+ self.glWidgets[i][j] = GLWidget(self, self.glWidgets[0][0])
+ self.glWidgets[i][j].setClearColor(clearColor)
+ self.glWidgets[i][j].rotateBy(+42 * 16, +42 * 16, -21 * 16)
+ mainLayout.addWidget(self.glWidgets[i][j], i, j)
+
+ self.glWidgets[i][j].clicked.connect(self.setCurrentGlWidget)
+ QtWidgets.qApp.lastWindowClosed.connect(self.glWidgets[i][j].freeGLResources)
+
+ self.setLayout(mainLayout)
+
+ self.currentGlWidget = self.glWidgets[0][0]
+
+ timer = QtCore.QTimer(self)
+ timer.timeout.connect(self.rotateOneStep)
+ timer.start(20)
+
+ self.setWindowTitle(self.tr("Textures"))
+
+ def setCurrentGlWidget(self):
+ self.currentGlWidget = self.sender()
+
+ def rotateOneStep(self):
+ if self.currentGlWidget:
+ self.currentGlWidget.rotateBy(+2 * 16, +2 * 16, -1 * 16)
+
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/opengl/textures/textures.qrc b/examples/opengl/textures/textures.qrc
new file mode 100644
index 000000000..efa9e9c8d
--- /dev/null
+++ b/examples/opengl/textures/textures.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/side1.png</file>
+ <file>images/side2.png</file>
+ <file>images/side3.png</file>
+ <file>images/side4.png</file>
+ <file>images/side5.png</file>
+ <file>images/side6.png</file>
+</qresource>
+</RCC>
diff --git a/examples/opengl/textures/textures_rc.py b/examples/opengl/textures/textures_rc.py
new file mode 100644
index 000000000..2e9faeea7
--- /dev/null
+++ b/examples/opengl/textures/textures_rc.py
@@ -0,0 +1,797 @@
+#############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2016 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the PySide examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+# Resource object code
+#
+# Created: Wed Dec 28 19:57:29 2005
+# by: The Resource Compiler for PyQt (Qt v4.1.0)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x05\x3e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00\x6b\xac\x58\x54\
+\x00\x00\x00\xa5\x50\x4c\x54\x45\x00\x7c\xf8\x00\x80\xf8\x08\x80\
+\xf8\x08\x84\xf8\x10\x84\xf8\x10\x88\xf8\x18\x88\xf8\x18\x8c\xf8\
+\x20\x90\xf8\x28\x90\xf8\x28\x94\xf8\x30\x94\xf8\x30\x98\xf8\x38\
+\x98\xf8\x38\x9c\xf8\x40\x9c\xf8\x40\xa0\xf8\x48\xa4\xf8\x50\xa4\
+\xf8\x50\xa8\xf8\x58\xa8\xf8\x58\xac\xf8\x60\xb0\xf8\x68\xb0\xf8\
+\x68\xb4\xf8\x70\xb4\xf8\x70\xb8\xf8\x78\xbc\xf8\x80\xbc\xf8\x80\
+\xc0\xf8\x88\xc4\xf8\x90\xc4\xf8\x90\xc8\xf8\x98\xcc\xf8\xa0\xcc\
+\xf8\xa0\xd0\xf8\xa8\xd4\xf8\xb0\xd8\xf8\xb8\xd8\xf8\xb8\xdc\xf8\
+\xc0\xdc\xf8\xc0\xe0\xf8\xc8\xe0\xf8\xc8\xe4\xf8\xd0\xe4\xf8\xd0\
+\xe8\xf8\xd8\xe8\xf8\xd8\xec\xf8\xe0\xec\xf8\xe0\xf0\xf8\xe8\xf4\
+\xf8\xf0\xf4\xf8\xf0\xf8\xf8\xf8\xf8\xf8\xf8\xfc\xf8\xce\x99\xaa\
+\x77\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\x00\
+\x48\x00\x46\xc9\x6b\x3e\x00\x00\x04\x3f\x49\x44\x41\x54\x78\xda\
+\xed\xdd\xe1\x76\xd2\x40\x10\x05\xe0\x0d\x34\x05\x91\x62\x28\x82\
+\x14\x24\x16\x53\xc4\x88\x18\x13\xd3\x79\xff\x47\xf3\x8f\x9e\xee\
+\x20\x25\x9b\x9e\xb6\xb6\x73\xef\x3e\x40\x0f\xfb\x41\x93\xbd\x33\
+\x13\x70\x02\xbe\x1c\x01\x08\x40\x00\x02\x10\x40\x1c\xe0\x22\x00\
+\x01\x08\xa0\x01\xa0\x2e\x7d\x04\x20\x00\x01\x08\x40\x00\x02\x10\
+\x80\x00\x04\x20\x00\x01\x08\x40\x00\x02\x10\x80\x00\x04\x20\x00\
+\x01\x08\x40\x00\x02\x10\x80\x00\x04\x20\x00\x01\x08\x40\x00\x02\
+\x10\xe0\x05\xac\x9f\xd9\x7c\x38\x02\x05\xa8\xf3\x74\xd2\x73\xce\
+\xb9\x1e\x20\x40\x91\xcd\x87\xd1\xdf\x21\x96\x2e\x16\x40\x9d\xa7\
+\x93\xf3\x63\x63\x3c\x08\x00\xea\x8d\x07\x03\xa8\xf3\xf4\x32\x3e\
+\x39\xc8\x65\x18\xa0\x3c\xfe\xc6\xc3\x00\x54\xbd\xa0\x51\x3e\xbb\
+\x00\x53\x87\x0d\x70\xe3\xb0\x01\xaa\x18\x1c\x60\xe2\xb0\x01\x32\
+\x87\x0d\x50\xc6\xe0\x00\x63\x87\x0d\x90\x39\x6c\x80\xf2\x0c\x1c\
+\x60\xec\xb0\x01\x32\x87\x0d\x10\x74\x07\xb0\x0c\x70\xe9\xb0\x01\
+\x32\x87\x0d\x50\xc5\xe0\x00\x7e\x06\x88\x00\x01\x54\x08\x5e\xe0\
+\x01\xa8\x2a\x50\xbf\xc6\x03\x98\xf9\x1b\xdc\x0a\x1c\xc0\xd6\xdf\
+\xdf\x4c\xe0\x00\xea\xbe\xb7\xbd\xb8\xc2\x03\xb8\xf2\xb7\x97\x09\
+\x1c\xc0\x37\xff\xb6\x97\x08\x1e\xc0\xc0\x3f\x02\x14\x78\x00\x2b\
+\x7f\x73\x4b\x81\x03\x28\x3a\xea\x08\x80\x07\x90\xf8\x7b\xdb\x08\
+\x1c\xc0\xda\xdf\xda\x58\xe0\x00\x54\x08\xec\x14\x78\x00\xaa\x13\
+\xba\x12\x38\x00\x75\x06\xfe\x73\x05\x44\x02\x50\x67\x60\xf7\x45\
+\xe0\x00\x96\xfe\xbe\x26\x02\x07\xf0\xc3\x3f\x03\x77\x4b\x3c\x00\
+\x75\x04\x48\x05\x0e\x40\xd5\x81\x07\x02\x07\xa0\xeb\xc0\x39\x1e\
+\xc0\xfc\xa0\x0c\x84\x06\xb0\x8b\x0e\xca\x40\x68\x00\x43\x7f\x4f\
+\x6b\x81\x03\x50\x21\x68\x28\x70\x00\xea\x0a\x18\xed\xf0\x00\x3e\
+\xf8\x3b\x9a\x0b\x1c\xc0\xa9\x2b\x20\x04\xc0\xf0\xb0\x10\x0e\x06\
+\xf0\xd9\xdf\xcf\x85\xc0\x01\xd4\xe7\xf7\x9e\x01\x31\x00\x54\xfb\
+\x3b\x11\x38\x80\x42\x0d\x40\xec\xf0\x00\xc6\xf7\x94\x41\x50\x00\
+\x36\xee\x9f\x56\x18\x16\xc0\x9b\xfb\x53\x20\x04\xc0\xb5\xbf\x97\
+\x4e\x09\x07\xa0\xcb\x20\x0b\x81\x03\x50\xb7\xc0\xb3\x0a\x0e\x40\
+\xdf\x02\x53\x81\x03\x50\xcf\x44\xf5\x6a\x38\x80\xdc\x9d\xa8\x03\
+\x21\x00\xa8\x14\xd8\x17\x38\x00\x3d\x11\x7e\x03\x07\x70\xdb\x3f\
+\x55\x08\x04\x00\xf8\xe4\xf4\x44\x2c\x1a\xc0\xaf\xb8\x29\x06\x1b\
+\x07\x50\xcd\xf0\xa3\x31\xd8\x36\x40\xd9\x69\x8c\xc1\xb6\x01\x66\
+\xcd\x31\xd8\x34\x80\x3e\x04\xcf\x04\x0e\xe0\x7d\x40\x0c\xb6\x0c\
+\xf0\xdd\x05\xc4\x60\xcb\x00\xe3\x90\x18\x6c\x18\x40\xa7\xa0\x54\
+\xe0\x00\x46\x41\x31\xd8\x2e\xc0\x36\x2c\x06\xdb\x05\x18\x85\xc5\
+\x60\xb3\x00\xdb\xc0\x18\x6c\x16\x60\x18\x18\x83\xad\x02\x6c\x42\
+\x63\xb0\x55\x80\x61\x68\x0c\x36\x0a\xb0\x09\x8e\xc1\x46\x01\x2e\
+\x82\x63\xb0\x4d\x00\x7d\x0b\xd8\xe3\x01\xbc\xf3\x5f\xfc\xa5\xc0\
+\x01\xe4\xad\xaf\x00\xc6\x00\x92\xb6\xb7\x00\x63\x00\x3b\xf5\xda\
+\xbf\xe2\x01\x4c\x5a\x1e\x02\xad\x01\xec\xa3\x76\x29\xc0\x1c\xc0\
+\xac\x5d\x0c\x34\x07\x50\xaa\x0f\xc0\x35\x1e\x80\x1a\x88\xe9\xd6\
+\x70\x00\x55\xb7\x45\x29\xd8\x22\xc0\x2a\xbc\x19\x64\x12\xe0\xf6\
+\xbc\x75\x0c\xb2\x05\xa0\x1e\x0b\x38\x36\x16\x6f\x1d\xc0\xff\x7e\
+\x1c\x37\x12\x38\x80\xb6\xa5\x50\x73\x00\xe3\x07\x1d\x82\xec\x00\
+\xec\xdb\x35\x43\xec\x01\xa8\x53\x70\x4f\xe0\x00\xf4\x21\x68\x8d\
+\x07\x90\x3e\xfc\x03\x60\x03\xa0\xe9\xb7\x62\x1e\x79\x15\x2f\x0d\
+\xe0\xe6\x79\xf7\x1f\xd2\x6f\x7a\x5e\x80\x04\x1c\x60\xef\xc0\x01\
+\xe6\xe0\x00\x75\x17\x1c\xe0\xda\x81\x03\x0c\xc0\x01\x72\x07\x0e\
+\x30\x05\x07\xa8\x22\x70\x80\xbd\x43\xff\x17\x40\xff\x04\xc8\x5b\
+\x5e\x04\xc1\x01\x52\x74\x80\x2d\x3a\x40\x89\x0e\x20\x31\x3a\x40\
+\x82\x0e\x70\x85\x0e\xf0\x08\xaf\xc4\xe0\xb3\xc3\x04\x20\x00\x01\
+\x08\x40\x00\x02\x10\x80\x00\x04\x20\x00\x01\x08\x40\x00\x02\x9c\
+\x58\x0d\xbf\x3b\x5c\x9b\x07\x68\x28\x29\x56\xe6\x01\x76\x4f\x3f\
+\x10\xf6\xb2\x01\x36\xa7\x01\x72\xf3\x00\x0d\x7d\x95\xcc\x3c\x40\
+\x43\x67\x6d\x69\x1e\xa0\x61\xc8\x34\xb1\x0e\xd0\x34\x5e\xd0\xb5\
+\x0e\xf0\xb1\xa9\x07\x90\x1b\x07\x68\x1c\xb3\x9e\xd9\x06\x58\x37\
+\x76\x81\xba\x95\x65\x80\x2a\x60\xce\x7e\x69\x19\x20\x64\xba\x24\
+\x2a\xec\x02\xac\x82\x5a\xa1\x83\xda\x2a\xc0\x22\xb0\x19\x9c\xd4\
+\x26\x01\xf6\xa3\xe0\x76\xf8\x60\x67\x0e\xa0\xde\x4c\xda\xcc\x17\
+\x46\xd3\xfc\x15\x03\xac\x96\x07\x6b\x31\xbd\x68\x3f\x5d\x19\x27\
+\xf3\xbb\xbf\x50\xbc\x2a\x80\x27\x18\x25\xdd\x12\x80\x00\x04\x20\
+\x00\x01\x08\x40\x00\x02\x18\x28\x8a\xfe\xaf\x45\x00\x02\x10\x80\
+\x00\x04\x20\x00\x01\x08\x40\x00\x02\x10\x80\x00\x04\x20\x00\x01\
+\x08\x40\x00\x02\x10\x80\x00\x04\x20\x00\x01\x08\x40\x00\x02\x10\
+\x80\x00\x04\x20\x00\x2a\x00\xda\x22\x00\x01\x08\x70\x07\x80\xbb\
+\x08\x40\x00\x02\x10\x00\x7a\xfd\x06\x0e\x4c\xb1\x67\x70\xf4\x76\
+\x0b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x07\xa7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00\x6b\xac\x58\x54\
+\x00\x00\x00\x8d\x50\x4c\x54\x45\x78\xfc\x00\x80\xfc\x00\x80\xfc\
+\x08\x80\xfc\x10\x88\xfc\x10\x88\xfc\x18\x88\xfc\x20\x90\xfc\x20\
+\x90\xfc\x28\x90\xfc\x30\x98\xfc\x30\x98\xfc\x38\x98\xfc\x40\xa0\
+\xfc\x40\xa0\xfc\x48\xa0\xfc\x50\xa8\xfc\x50\xa8\xfc\x58\xa8\xfc\
+\x60\xb0\xfc\x60\xb0\xfc\x68\xb0\xfc\x70\xb8\xfc\x70\xb8\xfc\x78\
+\xc0\xfc\x80\xc0\xfc\x88\xc0\xfc\x90\xc8\xfc\x90\xc8\xfc\x98\xc8\
+\xfc\xa0\xd0\xfc\xa0\xd0\xfc\xa8\xd0\xfc\xb0\xd8\xfc\xb0\xd8\xfc\
+\xb8\xd8\xfc\xc0\xe0\xfc\xc0\xe0\xfc\xc8\xe0\xfc\xd0\xe8\xfc\xd0\
+\xe8\xfc\xd8\xe8\xfc\xe0\xf0\xfc\xe0\xf0\xfc\xe8\xf0\xfc\xf0\xf8\
+\xfc\xf0\xf8\xfc\xf8\xa0\x01\x02\x2a\x00\x00\x00\x09\x70\x48\x59\
+\x73\x00\x00\x00\x48\x00\x00\x00\x48\x00\x46\xc9\x6b\x3e\x00\x00\
+\x06\xc0\x49\x44\x41\x54\x78\xda\xed\xdd\xdb\x62\x9b\x38\x10\x06\
+\x60\x4b\x85\x42\x21\x66\xa1\x26\x1c\x8a\x03\x81\x9a\x40\x21\xf0\
+\xfe\x8f\xb7\x17\xbb\x6d\xe2\xc6\x18\x8c\xf5\x13\x81\x86\xcb\x36\
+\x17\xf8\x33\x16\xd2\x68\x66\xb4\xeb\x15\xbf\x76\x04\x40\x00\x04\
+\x40\x00\x04\xd0\xef\x14\xbc\x08\x80\x00\x08\xe0\x1c\x40\xa9\xa1\
+\x8f\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\
+\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\
+\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\
+\x80\x00\x08\xe0\xae\xab\x43\xde\x7c\xd7\x49\x0f\xf0\xcc\x76\x5c\
+\x37\xac\x07\xc7\x3b\x04\x61\x9c\x3c\x65\x79\x51\x56\x75\xd3\x4e\
+\xba\xf3\xae\x6d\xea\xaa\x3c\x15\x79\x96\x3e\x1d\x7f\xc4\x51\x18\
+\xf8\x07\xcf\x75\xf6\xb6\x65\x1a\xba\xc6\xd9\x6e\xc7\x7f\x49\x0e\
+\x50\xf2\xc1\xcc\x2c\xc6\x35\xdd\x30\x4d\xcb\xde\x3b\x8e\xeb\x79\
+\x07\xff\x31\xf8\xf0\xf9\xc6\x2f\x47\x72\x80\x00\x9d\xe0\x66\x48\
+\x0e\x10\xa1\x01\x7c\xc9\x01\x12\x34\x40\x26\x39\x40\x8a\x06\x68\
+\x25\x07\x28\xc0\x9f\xdf\x94\xfd\x35\x58\x82\x01\x3c\xd9\x01\x6a\
+\x30\xc0\x0f\xd9\x01\x5a\x30\x40\x21\xfd\x4c\x10\x0c\xf0\x4b\x7a\
+\x00\x0e\xfd\xfc\x4c\xfe\xc5\x90\x0e\x05\xd0\xe4\x07\x30\x65\x7f\
+\x0b\xa2\x01\x6c\x28\x80\x25\x3f\xc0\x1e\x0a\x60\xcb\x0f\xe0\xaa\
+\x0e\x70\x50\x1d\xe0\x51\x75\x80\x50\x75\x80\x58\xf5\xb7\x00\x36\
+\x22\xf2\x4d\x7e\x80\x54\xf5\x89\x50\x26\x79\x48\x14\x0e\x90\xab\
+\xbe\x16\xc0\xc6\xc4\x56\xb0\x1a\x04\xc7\xc4\xe4\xdf\x1a\x7b\x51\
+\xfd\x2d\x50\x41\x7f\x01\x95\xfc\x00\xf5\x87\xfd\xc0\xff\x36\x04\
+\xff\xec\x08\xfa\x41\x18\x46\x71\x9c\x1c\x8f\x69\x96\xe5\x45\x71\
+\x2a\xcb\xb2\x3c\xfd\x2c\xf2\x3c\xcb\xd2\xa7\x63\x92\xc4\x51\x14\
+\x86\x81\xef\x1f\xbe\x7b\xae\xeb\xec\xf7\xb6\x6d\x99\xa6\xf1\x55\
+\xd7\x34\x1e\xf5\xf2\x03\x34\x67\x00\x61\x2f\xdf\xb5\x28\x40\xa4\
+\x1e\xc0\x79\x5c\x3c\x56\x1d\x20\x51\x0f\xe0\xf5\x0c\xe0\xa8\x1e\
+\x40\x77\x06\xf0\xa4\x3a\x40\xaa\x3a\x40\xa6\x3a\x40\xae\x3a\x40\
+\xa1\x3a\xc0\x4f\xd5\x01\x4e\xaa\x03\x94\xaa\x03\x54\xaa\x03\xd4\
+\xaa\x03\x34\xaa\x03\xb4\x04\xa0\x38\x40\xa7\x3a\x40\xaf\x38\x00\
+\x53\x1d\x80\x13\x80\xe2\x00\x9a\xea\x00\xba\xea\x00\x86\xea\x00\
+\xa6\xea\x00\xdf\x54\x07\xb0\x54\x07\xb0\x55\x07\xd8\xab\x0e\xe0\
+\x5c\xfc\x93\xf6\x74\x0c\xbd\xbd\xa9\x6b\x9c\xed\xd8\x17\xdd\x30\
+\x6d\xf7\x31\xce\x4e\xaf\x1b\x04\x70\x3f\xfc\xf7\x4b\xe2\x1a\x83\
+\x39\x70\x6e\x94\x77\x5b\x06\xe8\x32\x4f\x1b\x4d\x82\x79\x88\x5f\
+\xd6\x0d\xf0\x3a\x50\xe6\xd8\x65\xee\xd4\x7a\x2a\x3d\xac\x57\x0c\
+\x70\x96\x1f\x70\xf8\xfd\xaf\xa7\xc3\x6d\xd5\x64\xf6\xb1\x5b\x2b\
+\x40\xf3\xb1\xd6\xbd\x4d\x66\x54\x52\x69\x71\xb7\x01\x80\xa0\xef\
+\xfb\xea\x30\xb3\x94\x10\x45\xb0\x64\x9a\x5c\xd8\x3f\xdf\x53\x45\
+\xf6\x35\x5f\x21\xc0\x59\xa6\xa8\x6d\xdc\x5b\x2c\xde\xae\x0e\xe0\
+\x24\x38\x3d\x3c\x5f\x1b\x80\xf0\x6c\xf1\x70\x65\x00\xcf\xc2\x13\
+\x84\x9d\x76\x55\x00\x80\x92\x19\xb3\x5d\x13\x00\xa2\x68\x4a\xac\
+\xc0\x1a\xcb\xe6\xcc\x66\x3d\x00\x98\xc2\x49\xb3\x5b\x0d\x80\x8f\
+\x29\x95\x70\x57\x03\xe0\x81\x8a\x45\xe2\xb5\x00\xa0\xca\xe7\x59\
+\xb1\x12\x00\x58\x03\x05\xa3\x5b\x07\x80\x05\xab\x98\x0a\xd6\x01\
+\x60\xc0\x00\xd8\xcb\x2a\x00\x34\x18\xc0\xee\x61\x15\x00\x0c\x07\
+\x20\x28\xf1\x16\x0b\xd0\x21\xeb\x26\xf7\x2b\x00\x68\xa0\x95\xb3\
+\xa5\xfc\x00\x03\x95\xb3\xcc\xf2\xa2\xb4\xa8\x9a\xd7\xbe\xef\xdb\
+\xa6\x2e\x8e\xa1\x37\x67\xb4\xf4\xe4\x07\xb8\x10\x10\xe2\x4e\x7c\
+\xf1\x9b\x6b\x73\xff\xd6\xc6\x63\xbc\x93\x1e\xe0\xef\xfe\x09\xcc\
+\xcd\xae\xdd\x74\xe9\xdf\x16\x32\x4e\xa5\x07\x38\x8f\x87\xe8\xd1\
+\xe8\x4a\xbe\x4b\xf4\x85\x87\x41\x2c\xc0\xfb\x78\x88\x3e\xad\x6c\
+\xb2\x8b\xa7\x3f\x05\xac\x95\x1d\xe0\xad\xb1\x32\x9f\xbe\x7e\x6b\
+\xa7\xaf\xa0\x72\xd9\x01\x82\x79\x11\xfd\x27\xbe\xdc\x82\x00\x3c\
+\x0f\xf0\xd9\xac\x70\x7e\x35\x71\x24\xb0\x64\x07\xe8\xfb\xca\x99\
+\x15\xc9\x6e\xa6\x2d\x23\x59\x27\x3d\x40\xdf\x9f\x66\x45\x6f\x3a\
+\x6b\xa1\xc9\x20\x1e\x60\xe6\xd5\x1a\xcb\xcc\x04\xa4\x05\xe8\xeb\
+\x29\x4b\xe9\x68\xc3\x00\x93\xfa\x90\x79\x5b\x06\x98\x12\x53\xb7\
+\x37\x0d\xd0\x8d\xbf\x0c\xcd\x4d\x03\x4c\xd8\x5a\x35\xb6\x0d\x30\
+\x1e\x54\xd6\x36\x0e\x30\x3a\x0e\xf2\x8d\x03\x8c\x86\xd5\xd9\xd6\
+\x01\x62\xd5\x9f\x80\xb1\xa8\xaa\xbe\x75\x80\xb1\xf6\xf4\xe6\xe6\
+\x01\x62\x95\x27\x42\x7d\x3f\xda\x94\xd4\xd9\x3c\xc0\xc8\x29\x25\
+\xde\xf6\x01\xf6\xe0\xbc\x49\xe9\x01\x7c\x65\xe3\x01\xff\x5f\xd7\
+\x33\x0d\xab\xed\x03\xe4\xe0\xd6\xd2\xd2\x03\x54\xd8\x69\x80\xfc\
+\x00\xbf\xc0\xfb\xc3\xd2\x03\x5c\x3d\xaf\x2d\x51\x00\xe0\x6a\x92\
+\x49\xad\x00\x40\x8f\x1d\x02\xd6\xfd\x04\x84\x2a\x00\x34\xe0\x3c\
+\x31\xe9\x01\x6a\x64\x40\x70\x0d\x00\x57\xea\xce\x7c\x99\x01\x2a\
+\x57\x50\x61\x4b\x8a\x9c\x07\xc3\x00\x5a\x9f\x89\x2a\x70\x8b\xd6\
+\x98\x28\x19\x7f\xd9\xed\x76\x5c\xcc\x23\x30\x7c\x5e\x5d\x26\x2b\
+\xc0\xb3\x21\x32\xa1\xdd\xc4\xc5\x43\x41\x00\x7f\xaa\x64\x98\x88\
+\xc6\x07\x1d\x03\x57\xcd\x88\x07\x78\x7b\x66\xff\x11\x70\x7f\x83\
+\xb5\xb7\x5a\x27\x2b\x40\x2a\xb4\x97\x78\x30\x04\x20\xea\xb0\x06\
+\xf1\x00\x8d\xd0\xc2\x9e\xaf\xc0\x65\x00\x6a\x10\x34\x04\xe6\xf1\
+\x95\xc0\x14\x49\x18\xc0\xbb\x30\x26\xbb\x77\xb6\xee\x43\xe7\x00\
+\x20\x80\xf7\x7b\xda\xfa\x7d\x93\x81\x76\x60\x57\x80\x55\x32\x03\
+\xb4\xe2\x8a\x5c\x63\x78\xe1\x28\x64\x26\x68\x8a\xba\xd7\x56\x43\
+\xff\x00\x30\x00\x67\x3f\x5c\x76\xc7\x70\x35\xf0\x0e\xd4\x64\x2f\
+\x9f\x3f\xef\x9b\xc1\x67\xff\x5e\x6b\x86\x5c\x04\x00\x01\xda\xf3\
+\x1b\xd7\xe7\x4e\x89\x2d\x60\x18\x00\xbb\x1a\xfc\xeb\xce\x67\x0a\
+\x04\xf8\x01\x00\x05\xf0\xf7\xad\xeb\x73\x7e\x05\x29\xbe\x7b\x04\
+\x0c\xe0\xc3\x7e\x9e\x76\xfb\x84\xa8\xb8\x3c\x00\xe8\xa2\x4f\xa9\
+\x80\x00\xbc\x7e\xb8\x79\x7e\xeb\x3e\xf6\xcf\xcb\x53\x20\x2e\xbc\
+\xbf\x22\x26\x24\x76\x61\xf8\xf2\x6f\x7a\x74\xb3\xcb\xdf\x3f\x17\
+\x7f\x56\x15\x06\xe0\xd2\xf8\x65\xde\x50\xdd\x11\x0d\x7c\x7e\xc0\
+\x49\x4d\x18\x80\x8b\x9b\xfa\x2c\x98\xf8\x10\x34\x03\xb9\x71\x1a\
+\xe2\xa0\x26\x50\x54\x78\x60\x04\x9b\x14\xc5\x18\xaa\x9c\xd4\x21\
+\xbd\x45\x41\xfb\x02\x43\x69\xde\x46\x32\xf6\x14\xa4\x43\xe9\xc1\
+\x06\xa6\xb7\x2a\x08\xe0\x71\x78\x3f\x2b\xb8\xf2\x20\xb7\x91\xbe\
+\x54\x17\x39\x30\xc0\xd5\x3c\x77\x23\x28\x2e\x3d\x07\x75\xf2\x30\
+\x18\x02\x66\xb0\x23\x8b\x41\x00\xed\x58\x9a\xbb\x75\x48\xf2\xea\
+\xf7\x97\xda\x96\x69\xe4\x5c\x2b\x12\xd3\x70\x47\x35\xa2\xf6\x06\
+\xa7\x75\x84\x60\x5c\xd3\xb5\xf1\x46\x2b\x36\xf0\x90\x32\x14\xc0\
+\x41\x5c\xab\x10\x0e\x3d\xb0\x1a\x05\x70\x14\xd7\x2c\x06\x7b\x48\
+\x1f\x6c\x7b\x5c\xd0\xc7\xd7\xd0\x67\x15\xc3\x12\x24\xb8\x88\x8f\
+\xcf\x7c\xf8\x01\x75\x30\x00\x01\x7d\xe4\xd8\xf7\x05\x8e\xa8\x84\
+\x01\xdc\xdf\x4c\xd3\x5d\xe4\x88\x52\x18\x40\x76\xe7\xb7\xef\xbd\
+\xf4\xfd\xaa\x01\xee\xea\xa2\x35\xa1\xe1\x8e\xf4\x00\x7d\x30\xb7\
+\x95\x1e\x73\x96\x3c\xa3\x1c\x98\x26\xd7\xa5\x33\x9a\xe9\xb3\x7d\
+\xb2\xec\xd9\xb4\xd8\x3c\xc1\x3a\xba\xe9\x34\x09\xee\xa6\x8b\x9f\
+\xcb\x0a\x4f\x94\xac\x93\xfd\xa4\xae\x8a\x9a\x13\x15\x9f\x71\x28\
+\xeb\x22\x99\xa2\xa7\xd8\x35\xae\x28\x68\xb6\x9f\x7e\xda\xa1\xd4\
+\x8b\xa5\xca\x76\x2f\x59\x1c\xb8\x7b\xcb\xd0\x38\x67\x3b\xc6\x75\
+\xc3\xb4\xf7\x6e\x90\xe4\xd5\xe7\x1e\xc6\x2b\x7f\xbd\x00\x01\x10\
+\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\
+\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\
+\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x40\x00\x54\xbb\
+\x08\x80\x00\x08\xe0\x0d\x40\xdd\x8b\x00\x08\x80\x00\x08\x40\xe9\
+\xeb\x5f\x29\x7e\x47\x9c\x8c\x3f\x1d\xdc\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x09\x8e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00\x6b\xac\x58\x54\
+\x00\x00\x00\xf0\x50\x4c\x54\x45\xf8\x00\x78\xf8\x00\x80\xf8\x04\
+\x80\xf8\x08\x80\xf8\x0c\x80\xf8\x10\x80\xf8\x10\x88\xf8\x14\x88\
+\xf8\x18\x88\xf8\x1c\x88\xf8\x20\x88\xf8\x20\x90\xf8\x24\x90\xf8\
+\x28\x90\xf8\x2c\x90\xf8\x30\x90\xf8\x30\x98\xf8\x34\x98\xf8\x38\
+\x98\xf8\x3c\x98\xf8\x40\x98\xf8\x40\xa0\xf8\x44\xa0\xf8\x48\xa0\
+\xf8\x4c\xa0\xf8\x50\xa0\xf8\x50\xa8\xf8\x54\xa8\xf8\x58\xa8\xf8\
+\x5c\xa8\xf8\x60\xa8\xf8\x60\xb0\xf8\x64\xb0\xf8\x68\xb0\xf8\x6c\
+\xb0\xf8\x70\xb0\xf8\x70\xb8\xf8\x74\xb8\xf8\x78\xb8\xf8\x7c\xb8\
+\xf8\x80\xb8\xf8\x80\xc0\xf8\x84\xc0\xf8\x88\xc0\xf8\x8c\xc0\xf8\
+\x90\xc0\xf8\x90\xc8\xf8\x94\xc8\xf8\x98\xc8\xf8\x9c\xc8\xf8\xa0\
+\xc8\xf8\xa0\xd0\xf8\xa4\xd0\xf8\xa8\xd0\xf8\xac\xd0\xf8\xb0\xd0\
+\xf8\xb0\xd8\xf8\xb4\xd8\xf8\xb8\xd8\xf8\xbc\xd8\xf8\xc0\xd8\xf8\
+\xc0\xe0\xf8\xc4\xe0\xf8\xc8\xe0\xf8\xcc\xe0\xf8\xd0\xe0\xf8\xd0\
+\xe8\xf8\xd4\xe8\xf8\xd8\xe8\xf8\xdc\xe8\xf8\xe0\xe8\xf8\xe0\xf0\
+\xf8\xe4\xf0\xf8\xe8\xf0\xf8\xec\xf0\xf8\xf0\xf0\xf8\xf0\xf8\xf8\
+\xf4\xf8\xf8\xf8\xf8\xf8\xfc\xf8\xd6\xac\x3e\xe0\x00\x00\x00\x09\
+\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\x00\x48\x00\x46\xc9\x6b\
+\x3e\x00\x00\x08\x44\x49\x44\x41\x54\x78\xda\xed\xdd\x6b\x5b\xda\
+\x48\x14\x00\xe0\x40\x52\x01\x05\x54\xac\xc8\x4a\x11\x61\x2d\x56\
+\xa4\x5c\xaa\x60\x15\xb9\x88\x60\x00\x49\xce\xff\xff\x37\xfb\xa1\
+\xbb\xed\xb6\x0f\x73\x83\x99\x30\xc9\x9c\xf9\xac\x79\x98\x37\x99\
+\xfb\x99\x19\x0b\x0c\x4f\x16\x02\x20\x00\x02\x20\x00\x02\x80\x65\
+\x60\x42\x00\x04\x40\x80\xdf\x01\x8c\xaa\xfa\x10\x00\x01\x10\x00\
+\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\
+\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\
+\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x60\xf7\x69\xe5\
+\x4e\x86\x4f\x0f\xdd\xce\xa3\x61\x00\xf3\xe7\xbb\x9b\xf2\xd9\x51\
+\x32\xfe\x33\x96\xa7\xb8\x34\x04\xc0\x1f\xb7\x2f\x73\x1f\xd6\x44\
+\x33\x25\x9f\xa2\x0f\xe0\xf5\xaf\x4f\xe2\xe4\x80\xae\xaa\x17\x69\
+\x80\x79\xbb\x60\x33\x42\xda\x32\xe3\xc8\x02\xbc\x77\xf2\x31\x8e\
+\xa0\xbe\x78\x3d\x9a\x00\xe3\xb2\xcd\x1b\xd7\x98\x9b\x45\x0f\xa0\
+\x77\x2c\x12\xd9\xe9\xb8\xd1\x02\xf0\x3b\x69\xb1\xd0\xd6\x46\xb4\
+\xbe\x80\x7b\xc1\xec\x5b\xb5\x48\xd5\x01\xfd\xac\x68\x68\x73\x25\
+\x4a\x95\xe0\xec\x9c\x23\xc7\x76\x36\x5f\xba\xaa\x37\x5a\xed\x4e\
+\xbb\x59\xff\x7c\x1d\xa1\x66\xd0\xaf\x33\x6a\xfe\x58\xa6\xf4\xb5\
+\x3f\x8f\xec\x60\x68\x44\xff\xfa\xd3\x95\xde\x52\xfd\x8f\xd8\x1d\
+\x80\x5f\xa3\x75\x7b\xb2\x37\xaf\x11\x1f\x0e\x8f\x29\xaf\xdf\xa9\
+\xbc\x44\x7e\x3e\xa0\x41\x1e\xf0\xa4\xdb\x1e\x40\xc4\x01\x16\x67\
+\xc4\xec\x1f\xf5\x0c\x98\x11\x1a\x24\x49\xd9\x3f\xe8\x9a\x30\x25\
+\xd6\x22\x7d\xfe\x4e\xc3\x37\x60\x4e\xd0\xbb\x20\xbd\xfe\x73\x17\
+\x20\xfa\x00\xee\x11\x21\xfb\x7b\x5d\x00\x03\x00\x5e\x48\xc5\xff\
+\x74\x0e\x26\x00\xf4\x1d\x42\xfe\xaf\x01\x4c\x00\xb8\x27\x54\x7f\
+\x4e\x0f\x8c\x00\x68\x10\x5e\x7f\x72\x02\x46\x00\xd4\x49\x5d\xbf\
+\x19\x18\x01\x70\x4b\xc8\xff\xe1\x02\x8c\x00\x20\xe5\x3f\xb3\xd3\
+\xfc\x07\x07\x40\x2a\xff\xe9\x39\x18\x01\xf0\x8d\x90\xff\xc4\x0c\
+\x8c\x00\x78\x22\xb4\x7f\xf6\x08\x8c\x00\x78\x21\xf5\x7f\xba\x60\
+\x04\x80\x4b\xea\xff\x56\xc1\x08\x00\xef\x90\x90\xff\x63\xdf\x0c\
+\x80\x32\x69\xf8\x3f\x03\x23\x00\xda\xa4\xf1\x7f\x1b\x8c\x00\x18\
+\x93\xe6\x7f\xf2\x60\x04\xc0\x32\x45\x5a\xf0\x9a\x99\x01\x50\x22\
+\x15\x80\x3a\x18\x01\xf0\x9d\x94\xff\x7d\xdf\x08\x80\x65\x82\x04\
+\x70\x0f\x46\x00\x14\x89\xeb\x1f\x60\x04\x00\xb1\x00\x58\x0f\x46\
+\x00\x78\x07\xc4\xc5\x5f\x30\x02\xe0\x86\xf8\x01\x74\x8c\x00\x70\
+\x89\xf1\x1f\x09\xcf\x08\x80\x62\x30\x71\x5e\xda\x02\x8c\xc8\x11\
+\x10\x53\x23\x00\xc8\x31\x00\x39\x30\x01\x60\x48\xfe\x00\x9a\x46\
+\x00\xe4\xc9\x00\xae\x09\x00\x94\x0f\xe0\x18\x4c\x00\x28\x90\x01\
+\xae\x4d\x00\x98\x52\x82\x00\x07\x26\x00\x54\x29\x51\x80\xbe\x01\
+\x00\x2b\x87\x0c\x90\x07\x03\x00\x9a\x56\x48\xaa\x00\x55\x00\x19\
+\x0a\xc0\xa3\x01\x00\x63\x5a\x14\xf8\xc2\x00\x80\x2b\x4a\xfe\x93\
+\x10\x7d\x00\x3f\x69\x85\xa5\x0e\x54\x03\xf0\x44\x2b\x01\x57\x06\
+\x00\x94\x68\x00\x2d\x03\x00\xf6\x68\x00\xfd\xe8\x03\x0c\xa9\x5b\
+\x81\x28\x2b\x62\xb3\x6e\xbd\x7c\x9a\x4d\x3a\x76\xcc\x4e\xa4\x32\
+\x27\x17\xf5\xee\x24\x94\x00\x35\xea\x46\x30\x42\x47\xf8\xad\x75\
+\xbe\xee\xc3\x71\x0a\x8d\x71\xe8\x00\xa8\x9b\xc1\xd6\xb6\x82\xab\
+\x56\x8e\xb6\x7d\xac\xee\x86\x0a\xc0\xa5\x96\x80\x35\x93\x01\x6e\
+\xd5\x61\x6c\x9d\x8c\xe5\x07\x21\x02\xe8\x50\xf3\x52\xf8\xf3\xcf\
+\x17\xd5\x38\xcf\x86\xd9\xfc\x30\x34\x00\x65\x6a\x46\x2e\xff\xf8\
+\xeb\x96\x63\x71\xa6\xe2\x22\x24\x00\x69\x81\xad\xdf\x53\x91\x73\
+\x03\xf6\xee\x42\x01\xb0\x10\xd8\xfb\xdf\xb6\x2d\xa1\x74\xbe\x0a\
+\x01\x40\x8f\x9e\x87\xff\xad\x0a\x7a\x25\xe1\x5b\xc1\xb2\x6f\xfa\
+\x03\x5c\xd1\xb3\xf0\x6b\x6f\xc8\xfc\x68\x83\x7b\xd1\x12\x43\xed\
+\x01\x3e\xd2\x73\xf0\xf3\x28\xa4\xd7\xd4\x46\x37\xc3\x39\x43\xdd\
+\x01\xf6\xe8\x19\x18\xfd\xd7\x5f\x76\xac\xcd\x92\x33\xd6\x1b\x60\
+\xce\xf8\xfd\xff\xee\x8a\x7f\xb6\xad\x4d\xd3\xde\xab\xd6\x00\x4f\
+\x8c\x9f\xff\x63\x2c\xd4\xdf\x3c\xff\x96\x95\x59\xe9\x0c\xd0\x60\
+\xfc\xfa\x39\x00\xc0\x70\x9b\xfc\x5b\x56\x51\x67\x00\x56\xd3\xb6\
+\x04\x80\xc9\x87\x2d\xef\xc8\x6c\x6a\x0c\x70\xc2\xf8\xed\x2b\xca\
+\xf6\x01\xee\x24\x31\xcc\x56\x3a\x00\xab\x71\xf3\xe0\x3d\x6b\x6d\
+\x9d\xce\xb4\x05\xf0\x59\x07\xc2\xf9\xfe\xa9\x8c\x8b\x62\x7b\xba\
+\x02\xcc\x58\xbf\xdc\xaf\x48\xb9\x29\x37\xe5\x6b\x0a\xf0\xcc\xfa\
+\xe5\x6d\x49\x77\x05\xb7\x35\x05\xb8\x63\x9e\x87\x28\x09\xe0\xc0\
+\xd7\x13\xe0\x56\xb4\x3e\x3f\xbd\xbe\x1f\xb9\x4b\xdf\x9b\x4f\xba\
+\xb5\x93\x98\xc0\x7f\x7e\xd3\x13\xa0\x26\x92\xfb\xf8\xf9\xc3\xef\
+\xef\x71\xd1\xca\x70\xff\xf3\xa1\x9e\x00\x97\xfc\xd9\x8f\x95\xd7\
+\xb5\xe6\x3d\x6e\x82\x17\x2d\x01\x8a\xfc\x3d\xfa\x11\xa1\x21\xad\
+\x71\x56\x13\x55\x2d\x01\xb8\x1b\xf9\x22\x39\x5e\x7a\x98\xe0\x9b\
+\x1b\xf1\x75\x04\x38\xb4\x24\xbc\xbe\x19\x5f\x31\x78\xd4\x11\xe0\
+\x80\x2f\xff\x25\xc6\xc4\x2a\x97\xc0\x95\x8e\x00\x7c\xf3\x5c\x39\
+\xd6\xd7\x3b\xdf\xe7\xa9\x45\x74\x04\xe0\x2a\xbe\x36\x3b\x5c\x7e\
+\xcc\x53\x13\xba\x1a\x02\xec\xc9\x3a\x17\x98\xa7\xcb\xdc\xd1\x10\
+\xc0\x96\x36\x90\x29\x04\x73\xc0\xae\x6c\x80\xb8\xb4\x17\xf7\xc6\
+\xb6\xcc\x69\x08\x20\xb1\xfd\xae\xb3\x67\xc8\xc3\xf9\x05\x7c\xe6\
+\x7c\x94\xc7\xae\x50\xa7\xfa\x01\x70\x2c\x77\x70\xc7\xfd\xb0\x47\
+\x96\x0f\xfa\x01\xb0\xdf\xda\x3e\xf7\xb3\x56\x4c\xcd\x56\x18\x3b\
+\x42\x02\x55\x37\x73\xf6\xac\xa6\x1f\x00\xfb\xa8\x7c\x81\xe9\xcc\
+\xf1\x96\x3d\xea\x5d\x00\x64\xa5\x76\xdf\x58\x4f\x3b\xd5\x0f\x80\
+\x19\xf2\x22\x14\x2c\xfe\x45\xfd\x68\x40\x36\xc0\x47\x66\xb4\x97\
+\xc8\xd3\x58\x65\xe0\x20\x84\x33\x42\x15\x99\x75\x6a\x52\x3f\x80\
+\xaa\x8c\x81\xd0\xaf\xf4\x89\xfe\xb0\x0f\xfa\x01\x30\xfb\xaf\x62\
+\xe7\xc7\xb5\x18\xd3\xca\xfa\x01\x7c\x63\x01\x3c\x83\xc4\x4a\x20\
+\xa6\x1f\x00\x2b\x40\xc4\x12\x8b\x6f\xf1\xe9\x63\x0b\x5b\x3f\x80\
+\x17\x16\x80\xe0\x11\xa2\xf4\xc9\xc1\x84\x7e\x00\x0b\x16\x80\xe0\
+\xbd\x29\xe7\x61\x6b\x06\x99\xc3\x41\xc1\xe3\x53\x6a\x61\xeb\x08\
+\x31\xbb\x82\x82\xab\x19\x2d\xd1\xcd\x07\x3b\x07\x60\x05\x49\x09\
+\x3e\x8e\x1e\x79\xfc\x51\x43\x80\xba\xdc\x22\x30\xa0\x3e\xec\x93\
+\x86\x00\x3d\x76\x94\x98\x48\x9a\x86\x6d\x3e\x80\xf1\x8b\x85\xb7\
+\x4e\xcf\x55\xc7\xc9\x48\x07\x60\x74\x5d\x44\x57\x73\x96\x7c\xa1\
+\xe7\x1a\x01\xb0\x9a\x01\xc1\xad\x90\x1e\x47\xe0\xb1\x66\x00\x8c\
+\xf1\x60\x7f\x83\x1f\x48\x1c\x0a\xf8\x3a\x02\x74\x65\x8e\x06\xc1\
+\x57\xbd\x3c\x2c\x1f\xc0\x95\x3a\x93\xbd\xa2\x3d\xab\xac\x25\x00\
+\x63\x16\xa7\x26\xb1\x12\x6c\xeb\x09\xf0\x49\x66\xac\xff\x5c\x62\
+\x85\x1a\x14\x00\xbd\xfb\x2e\x78\x9c\xec\x44\xed\x6c\x80\x12\x80\
+\x99\xcc\x69\xbc\xbe\xda\x91\x80\x9a\xed\xf3\x19\x89\x33\x22\xb4\
+\x36\xe5\x56\x57\x00\xfa\x18\xfe\xbb\xd0\xb3\x9a\x6a\x17\xc7\x77\
+\x71\x84\x86\xd8\x49\x5a\x94\x6e\x95\x9c\xb3\x89\x55\x00\xd0\xd7\
+\xc8\xc5\x76\xbb\x28\x3f\x96\x50\x09\x00\xf5\x04\x01\xb1\xd3\xf4\
+\x28\xab\xcd\x63\x7d\x01\xe8\x73\xe3\x22\xa7\x61\xac\xc8\x3b\x08\
+\xd2\xa0\x2f\x00\xec\xcb\xaa\x04\x06\xca\xf7\x0e\xaa\x01\xb8\x91\
+\xd5\x15\x22\xef\x43\x75\x56\x3a\x03\xb8\x31\x49\x8b\x43\x05\xc5\
+\xbb\x05\x94\x1d\xa8\x78\x26\xa7\x0c\xf8\xb6\xda\x4e\x80\x3a\x80\
+\x9e\x9c\x38\xb1\x27\xf5\x5b\x47\x15\x01\xd0\xbb\xc3\xdc\x71\x52\
+\xc4\x1d\x48\xb1\x89\xee\x00\xf7\x32\x62\x7c\x3d\xe2\x3a\xdb\x05\
+\xe8\x0e\x40\x8f\x97\x1b\x6e\xa9\x68\xbb\xfa\x03\xdc\x49\xf8\x04\
+\xb2\x0a\x17\x44\x94\x03\xf8\xe9\xad\xa7\x46\x1f\x89\x1b\x0e\xde\
+\x43\x00\x40\x6f\x08\xb8\xb2\x70\xa4\x70\x3d\x24\x00\x00\xf8\x6b\
+\xcb\x20\xd7\x96\xea\x3e\x90\x6a\x00\xd7\xd9\xaa\x10\xb8\xa4\x83\
+\x46\xd2\x5e\x48\x00\xa8\xb3\x39\xcc\xfb\x66\x7d\xd2\x19\x93\xf1\
+\x11\x84\x05\x00\x72\xd4\x00\xa7\xd9\x66\x7d\x20\xc9\x77\x34\x29\
+\x05\x98\x51\x37\xd1\xa5\x68\xbd\xb9\xab\x00\x5a\x40\xf5\x00\xe4\
+\x86\xec\xc7\x88\x96\xb8\x50\x4a\x3e\x68\xa4\x08\xa1\x02\x60\x6c\
+\xfb\x89\xd5\xd6\x4f\x8f\xcd\x89\x87\x11\xe5\xbc\x90\x01\xb0\x76\
+\xbd\x64\xd7\x34\xe9\x7e\x93\xd8\x7c\x9c\x84\xe1\x44\xc9\x3f\x12\
+\x2b\x7e\x3e\xd7\xfb\xfd\xa5\xbe\x37\xc8\x8b\xab\x67\x0a\xee\x68\
+\x53\x0e\xe0\x33\x77\x10\x38\xa5\xce\xf8\x47\x51\x58\x0e\xbe\xe6\
+\x29\x11\x36\x45\x15\xb7\xb3\x28\x07\x00\xbf\xcc\xb3\x9f\xda\x49\
+\xa5\x93\x8c\x20\xd3\x8a\x92\xdb\x69\xd4\x03\x30\xa6\x48\x79\x93\
+\xad\xe8\x96\xd6\x20\x00\xa0\x6b\x6f\x9d\xff\xcc\x2b\x84\x18\x00\
+\x5e\x33\x5b\xe6\xbf\xac\xec\x8a\xca\x60\x00\xc0\xfb\x1c\xdb\xe6\
+\xf5\x2b\xbc\x94\x21\x20\x00\x80\xe1\xe1\xc6\xa5\xff\x56\xe5\xdd\
+\x5c\x81\x01\x00\xb4\x13\x9b\x64\x3f\x7e\xa1\xf6\x76\xc2\x00\x01\
+\x60\x75\x2b\x4c\x60\xff\xad\xfa\x72\xc6\x20\x01\x00\xbc\xb6\xd0\
+\x71\x9a\xc9\x2f\x4b\x80\x48\x01\x00\xc0\xe0\x92\xf3\x48\x59\xa7\
+\x1c\xc8\x7d\x34\x81\x03\x00\xf8\xdf\x2b\xcc\x53\x06\x52\xa5\x5e\
+\x40\xb7\x12\xee\x00\x00\x00\x60\xda\xb9\xcc\x12\x7a\xfd\xb1\xcc\
+\xe5\xdd\x1b\x04\x96\x76\x04\x00\x00\xe0\xbf\x76\x6f\xab\x85\x5c\
+\x26\xe9\xd8\xb1\x98\x93\x3c\xc8\xe6\xce\xaa\xcd\xc7\x69\xc0\xf7\
+\x51\xee\x10\x40\x8f\x84\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\
+\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\
+\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\
+\x00\x08\x60\x2a\x80\x69\x09\x01\x10\x00\x01\x7e\x01\x98\x9b\x10\
+\x00\x01\x10\x00\x01\x8c\x4e\xff\x00\xf3\x6b\xd4\xa5\x75\x51\x85\
+\x33\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x14\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00\x6b\xac\x58\x54\
+\x00\x00\x00\x9f\x50\x4c\x54\x45\xf8\x7c\x00\xf8\x80\x00\xf8\x80\
+\x08\xf8\x84\x08\xf8\x84\x10\xf8\x88\x10\xf8\x88\x18\xf8\x8c\x18\
+\xf8\x8c\x20\xf8\x90\x20\xf8\x94\x28\xf8\x94\x30\xf8\x98\x30\xf8\
+\x98\x38\xf8\x9c\x38\xf8\xa0\x40\xf8\xa4\x48\xf8\xa4\x50\xf8\xa8\
+\x50\xf8\xa8\x58\xf8\xac\x58\xf8\xb0\x60\xf8\xb0\x68\xf8\xb4\x68\
+\xf8\xb4\x70\xf8\xb8\x70\xf8\xb8\x78\xf8\xbc\x78\xf8\xc0\x80\xf8\
+\xc4\x88\xf8\xc8\x90\xf8\xc8\x98\xf8\xcc\x98\xf8\xd0\xa0\xf8\xd4\
+\xa8\xf8\xd4\xb0\xf8\xd8\xb0\xf8\xd8\xb8\xf8\xdc\xb8\xf8\xe0\xc0\
+\xf8\xe0\xc8\xf8\xe4\xc8\xf8\xe4\xd0\xf8\xe8\xd0\xf8\xec\xd8\xf8\
+\xec\xe0\xf8\xf0\xe0\xf8\xf0\xe8\xf8\xf4\xe8\xf8\xf4\xf0\xf8\xf8\
+\xf0\xf8\xf8\xf8\xf8\xfc\xf8\x35\x75\xa4\x70\x00\x00\x00\x09\x70\
+\x48\x59\x73\x00\x00\x00\x48\x00\x00\x00\x48\x00\x46\xc9\x6b\x3e\
+\x00\x00\x03\x1b\x49\x44\x41\x54\x78\xda\xed\xdd\x61\x73\xd2\x40\
+\x10\x80\xe1\x8b\x10\x23\x1a\x01\x23\x69\x6c\x0b\xb1\x80\x0d\x62\
+\x10\x62\xe8\xff\xff\x6d\xb6\xd5\xd1\x92\x12\x72\x29\x38\x72\xbb\
+\xef\x7e\xce\xb0\xec\x33\xc9\x5d\xb8\xd9\x1d\xcc\x9d\xf2\x30\x00\
+\x00\x00\x00\x00\x00\xdc\x19\x85\x01\x00\x00\x00\xec\x02\xa8\x5a\
+\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x80\xff\x18\x45\xae\x1a\x20\x1b\x79\
+\x91\x5e\x80\xf5\xb8\x77\xff\x35\xde\x68\x05\x98\x0d\xbd\xa7\xbd\
+\x3b\xca\x00\xf2\x4b\xbf\xd2\xbc\xa4\x09\xa0\x48\xc3\xe7\xdd\x5b\
+\x7a\x00\x6e\x23\x6f\x5f\xfb\x9a\x12\x80\xfc\x2a\xa8\xe9\xdf\xd3\
+\x00\x50\xb9\xf5\xb5\x01\xcc\xab\xb7\xbe\x2a\x80\xaf\x89\xdf\xd0\
+\xc2\x2a\x19\x60\xf5\xf8\xc2\xa3\x15\xa0\x48\xdf\x5b\x35\x31\xcb\
+\x04\x28\xa7\x43\xcf\xb2\x8b\x5b\x20\xc0\x76\x1e\x75\xec\xdb\xd8\
+\xc5\x01\x64\x71\xb7\x55\x1f\xbf\x2c\x80\xec\xc2\x6f\x3b\xc8\x20\
+\x08\x60\x91\xbc\x7e\xc1\x24\x87\x14\x80\xac\x65\xf5\xb2\x00\xb2\
+\xd8\x7f\xf1\x2c\x8f\xf3\x00\xe5\x6c\xd4\x3d\x66\x98\xc9\x6d\x80\
+\xcd\xcd\xf0\xd5\x91\xd3\x5c\x0e\x03\xe4\xe3\xbe\x77\xfc\x38\x9b\
+\xa3\x00\xe5\x97\x8b\xe0\x34\xf3\x7c\x2e\x02\x2c\x27\x03\xef\x64\
+\x03\x8d\xae\x01\xe4\x69\xe4\x9b\xd3\x84\x83\x00\xab\x0f\xa7\x2a\
+\xde\x51\x80\xcc\xae\x32\x2f\x4a\x02\x99\x00\x0b\x9b\xf2\x3b\x97\
+\xeb\xfb\xd3\x00\x5f\x24\xc0\xb2\xb9\x2a\x7f\x5c\x3c\x5e\x9a\x88\
+\x04\xf8\xde\x54\x53\x2f\x2d\x7f\x5f\x3a\x15\x09\x50\x1e\xae\xe8\
+\xdd\xb4\xd5\xcd\xe2\xe2\x36\x78\xe8\xc9\x1e\xdc\xee\x6c\x18\x32\
+\x01\xfa\xf5\x0b\xff\xb2\x72\x26\x2a\x13\x20\xae\x29\x3f\x5e\xb5\
+\x7c\x5a\x5c\x05\x48\x6b\xf7\xbd\xbd\xa9\xe5\x01\xec\x59\xda\x82\
+\xc9\x8f\xda\xd4\x02\x7f\x0b\x54\xcf\xbb\x7b\x37\xdb\x03\xa9\x05\
+\x02\x0c\x77\x4a\x08\x67\x87\x53\x0b\x04\xf8\xfc\x74\xdf\xcb\x9a\
+\x52\x0b\x04\x58\xff\x59\xf8\x47\xdf\x9a\x53\x4b\x3c\x0f\xf8\xf5\
+\x26\xd0\x49\x56\x36\xa9\x25\x02\x3c\x6c\x84\xfe\x75\x61\x97\x5a\
+\x22\x40\xe1\x05\x93\xd2\x36\xb5\xc8\x33\xc1\x45\x8b\xd4\x7a\xfb\
+\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x38\x5f\x80\xad\x76\x80\x4d\x33\x40\x21\x1a\xc0\
+\xe2\x7f\xda\x73\xd1\x00\x93\x66\x80\xa9\x68\x80\x7e\x33\x40\x2c\
+\x19\xc0\xe2\x09\x30\xfe\x56\x30\x40\x68\x01\x60\x52\xb9\x00\xb1\
+\x4d\xfd\xa6\xbb\x16\x0a\x50\x8e\x8c\x5d\xbc\xdd\x88\x04\x98\xf7\
+\x8c\x6d\x04\x99\x38\x80\xe5\xd8\xbe\xfc\x87\x18\xcc\x4a\x37\x01\
+\xae\x9f\xc7\x55\x12\x85\x1d\xd3\x3a\xbc\xf0\xe3\xa7\xea\x47\x4d\
+\xce\x1e\xa0\x34\xff\x34\x7c\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x87\x4f\x85\xcf\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x2b\x80\xb6\x00\
+\x00\x00\x00\xfe\x02\xe8\x0d\x00\x00\x00\x00\x00\xd5\xf1\x13\x3b\
+\x45\x7a\xc4\xe1\x22\xe3\x41\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x06\xe8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00\x6b\xac\x58\x54\
+\x00\x00\x00\x8a\x50\x4c\x54\x45\x00\xfc\x78\x00\xfc\x80\x08\xfc\
+\x80\x10\xfc\x80\x10\xfc\x88\x18\xfc\x88\x20\xfc\x88\x20\xfc\x90\
+\x28\xfc\x90\x30\xfc\x90\x30\xfc\x98\x38\xfc\x98\x40\xfc\x98\x40\
+\xfc\xa0\x48\xfc\xa0\x50\xfc\xa0\x50\xfc\xa8\x58\xfc\xa8\x60\xfc\
+\xa8\x60\xfc\xb0\x68\xfc\xb0\x70\xfc\xb0\x70\xfc\xb8\x78\xfc\xb8\
+\x80\xfc\xb8\x80\xfc\xc0\x88\xfc\xc0\x90\xfc\xc0\x90\xfc\xc8\x98\
+\xfc\xc8\xa0\xfc\xd0\xa8\xfc\xd0\xb0\xfc\xd0\xb0\xfc\xd8\xb8\xfc\
+\xd8\xc0\xfc\xe0\xc8\xfc\xe0\xd0\xfc\xe0\xd0\xfc\xe8\xd8\xfc\xe8\
+\xe0\xfc\xe8\xe0\xfc\xf0\xe8\xfc\xf0\xf0\xfc\xf0\xf0\xfc\xf8\xf8\
+\xfc\xf8\x60\x3b\x5e\x10\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\
+\x00\x48\x00\x00\x00\x48\x00\x46\xc9\x6b\x3e\x00\x00\x06\x04\x49\
+\x44\x41\x54\x78\xda\xed\xdd\x61\x77\xa2\x38\x14\x06\x60\x42\x61\
+\x60\xa4\xba\xd0\x76\x74\x75\x51\x2a\x32\x50\x62\xf8\xff\x7f\x6f\
+\x3b\x9d\x3d\x67\xdb\x01\x14\x85\x24\x37\xe4\xcd\x77\xcf\xe9\x7d\
+\x2a\xe1\xe6\xe6\x26\x3a\x8d\xe5\xc3\x01\x00\x00\x00\x00\x00\x00\
+\x34\x8e\x85\x03\x00\x00\x00\xc0\x57\x00\xab\xa6\x3e\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x26\x1e\x55\x9e\xae\x93\x28\xf4\x5d\x97\x31\xd7\xf3\x83\x30\
+\x4a\xd6\x69\x56\x08\x1b\x00\xc4\x71\xf3\xe8\xf6\x75\x2c\x06\xf1\
+\xf6\xc8\xe7\x0c\x50\xed\x1e\xd9\xd5\xbe\xcd\x70\x9d\x8b\x59\x02\
+\xf0\x7f\x16\x43\x7b\x57\xd9\xea\x20\xe6\x06\x50\x24\xec\xa6\xfe\
+\x5d\x37\xc9\xe7\x04\x70\x8c\xee\xe8\x61\x0e\x52\x31\x13\x80\xe3\
+\xe2\xce\x36\x6e\x6f\xcb\x67\x00\x50\x44\x23\x3a\xd9\xdd\x9d\xe9\
+\x00\x75\x32\xb2\x99\x3f\x38\x1a\x0d\x90\xba\xe3\xcf\x33\x2c\x6b\
+\x63\x01\xca\xc5\x24\x27\x3a\x1e\x32\x43\x01\x36\x6c\xaa\x43\x2d\
+\x4f\xc2\x40\x80\x89\xfe\xfd\xff\xcd\x04\x95\x71\x00\x53\x3c\xfd\
+\x9f\xdf\x88\x85\x59\x00\x3c\x9e\xfa\x68\x97\x7b\x34\x0a\xe0\xdb\
+\xf4\x87\xdb\xd8\xc1\x20\x00\x2e\xe3\x78\x1f\xcb\xcd\x01\x28\xa4\
+\x1c\x70\x74\x4f\xc6\x00\x1c\xe5\x1c\xf1\xf4\x2a\x53\x00\x52\x49\
+\x87\x5c\xbf\x0b\x43\x00\x36\xb2\x8e\xf9\xbe\x18\x02\x90\xc8\x02\
+\x70\x32\x33\x00\x1e\xa5\x01\x78\xdc\x08\x80\x40\xde\x59\xf7\x17\
+\x23\x00\x98\x3c\x00\x56\x1a\x00\xc0\x1d\x89\x63\x69\x00\xc0\x80\
+\x3c\x88\xb9\x77\x7f\x4b\x0a\xfa\x00\x97\xf2\x20\x6f\xb5\xcd\x8a\
+\x8f\x99\x4c\xf0\x22\xdb\xae\xbc\x9b\x01\x12\xfa\x00\xbd\x79\xd0\
+\x62\xdb\x7e\x82\xcb\x4d\x78\xe3\x2c\xc0\xc9\x03\x74\xe7\x41\xee\
+\xba\x2f\x93\x3d\xc5\x37\x3d\x0f\x7f\x93\x07\xe8\xca\x83\xbc\xdd\
+\xa5\x34\xb6\x5c\xde\x52\x1e\x22\x0f\xd0\xde\x09\x60\x3f\xce\x57\
+\x3e\x93\xdd\x30\x19\x54\xd4\x01\x5a\x79\x50\x38\x60\xe6\xae\x87\
+\x7f\x09\x76\xd4\x01\xfe\x7c\xa2\xe3\x61\x8b\xb8\xe7\xa1\x00\x8f\
+\xc4\x01\xfe\xcc\x83\xd6\x43\x3f\xb8\x1e\xfa\x1e\x20\x0e\x50\xdc\
+\x19\xff\xf0\x55\xe4\x4f\xda\x00\xaf\x5f\xfe\xd8\xbf\xc6\x4d\x9f\
+\x9d\xe3\x40\x1b\xe0\x4b\x1e\xe4\xdf\x94\xb6\xd4\xc3\x76\x13\xd6\
+\xb4\x01\xbe\x3c\xca\xfb\xdb\x3e\x7b\x18\x04\xb0\xa2\x0d\xf0\xf9\
+\x49\xf6\xc7\xe7\x10\x5d\x29\x35\x6d\x80\x68\x4c\xfd\xe2\x34\x04\
+\x20\xa4\x0d\xf0\x39\x0f\xba\x7d\x33\x63\x48\x3e\xe4\xd3\x06\xf8\
+\x94\x07\xb1\xdb\xeb\xd8\x43\xf6\x14\x5c\xd2\x00\x7c\x64\xf9\xc6\
+\x57\x99\x09\xc9\x00\x28\x46\x66\xed\x2f\xa6\x7f\x03\x5e\x47\xa6\
+\x6c\xf9\x80\xe2\x38\x69\x80\x74\xec\x1f\xca\x14\x56\x04\x64\x00\
+\xac\xc7\x96\xef\xae\xa7\x02\x11\x69\x80\x64\x6c\xce\x7e\x7d\x51\
+\x98\x90\x06\xf8\xf4\x0f\xbc\xaf\xc3\x6f\x6f\xf8\x5a\x20\x18\x9b\
+\xb0\xe5\x86\xaf\x06\xd9\xd8\x7f\x54\xa9\x70\x6f\x44\x02\x00\x1f\
+\x93\x07\xff\x5e\x13\x9b\x5d\x11\x2a\xc6\xe4\xc1\x1f\x43\xa8\x7b\
+\x09\xc8\x00\xc8\xc6\x6f\x63\x5e\x03\xd8\x90\x06\x48\xc7\x57\xaf\
+\xaf\x01\x1c\x69\x03\x04\xee\xc8\xa9\xea\x7c\x6d\x25\x20\x48\x03\
+\x7c\x4c\x63\x3f\xf3\x43\xba\xbd\xfb\xd3\xca\x0a\x62\x44\x8f\xce\
+\x56\x57\x00\xf6\x73\x07\x38\x19\xbf\x3d\x3e\x72\x64\x97\x01\xe2\
+\x66\xee\x00\x3b\x65\xef\x00\xa2\x00\x2f\x8a\x0a\xa2\x64\x01\x2e\
+\xd7\x03\xb6\xf3\x07\xb8\xd8\x2a\xe1\xf2\xd9\x03\xd4\x33\xe8\x14\
+\x95\xf7\x12\x60\x6f\xf3\x07\xb8\x38\x07\x3e\x37\xf3\x07\xb8\x74\
+\xde\x90\x55\xf3\x07\xe0\x6c\x06\x07\x26\xc6\x8c\xbd\xba\x57\x00\
+\x4d\x80\x58\x4d\x7f\x1c\x59\x00\xe1\xaa\x68\x0b\x20\x0c\x70\xa9\
+\x47\xe6\x64\x03\xc0\x4a\x51\x9f\x3c\x55\x80\x0b\xef\x00\x9f\xdb\
+\x00\xb0\x55\xb4\x0c\x26\x0b\xd0\xdf\x1e\xf2\xd4\xd8\x00\xd0\xbf\
+\x0e\x08\xce\x56\x00\xf4\x96\x02\x98\x61\x37\x48\xdc\x39\x72\x85\
+\x29\x10\x49\x80\x48\xc5\x56\x00\x61\x80\xde\x7a\x78\x28\xec\x00\
+\xe8\xfb\x02\xb8\x55\x63\x05\x40\xdf\x2b\x80\x49\xbc\x4e\x8c\x14\
+\x40\xdf\x99\xf3\xb4\xb1\x03\x60\x27\xbd\x23\x8a\x36\x40\xdf\x61\
+\x91\xb8\xb1\x04\xa0\x67\x19\xb8\x14\x96\x00\xf4\xcc\x80\x0b\xc9\
+\xf7\x8a\x92\x01\xe0\xdd\xab\xa0\x50\xf6\xa5\xa2\x64\x00\x12\x3d\
+\xf1\x93\x01\xc8\x34\xc5\x4f\x05\xa0\xf6\x34\xc5\x4f\x05\xa0\xf3\
+\xde\xa1\x85\x8a\x7b\xd6\x69\x00\x74\xde\x38\x11\x9d\x1b\x5b\x00\
+\x72\xa6\xfe\xfd\x4f\x09\xa0\x73\x02\x58\x29\xba\x5e\x9e\x00\x80\
+\x58\x28\xcf\x7f\x69\x01\x24\x8a\xb6\x40\xa8\x02\xec\x54\x6c\x82\
+\x13\x06\xc8\x98\xe2\xf5\x2f\x31\x80\xc2\x95\x7a\x1a\x80\x3c\x40\
+\xe5\xc9\xee\x03\xa4\x0d\xc0\x03\xb5\xf5\x2f\x6a\x00\xe7\xf6\x0b\
+\x90\xed\x1b\x7b\x00\x44\xa4\xe8\xfa\x6c\xaa\x00\xed\x1a\x18\xcb\
+\x1a\x8b\x00\x62\x55\x17\xc8\x13\x05\xe8\x88\x3f\x6f\x2c\x02\x88\
+\x95\x5c\x9d\x4e\x17\x20\x56\xf6\x13\x12\x34\x01\xda\xf3\x9f\x57\
+\x36\xf6\x00\x88\xf6\x55\x41\x7e\xd5\xd8\x03\xd0\x11\x7f\xa0\x2b\
+\x7e\x1d\x00\xe7\x76\xfe\x13\xd6\x8d\x3d\x00\x7c\xa1\xa5\xfc\x4d\
+\x06\x80\x87\x7a\xca\xdf\x54\x00\xea\x76\xfc\x91\x68\xec\x01\xa8\
+\x03\x5d\xe5\x6f\x1a\x00\xd5\x37\x6d\xe5\x6f\x12\x00\x95\xaf\xaf\
+\xfc\x4d\x01\xa0\xf4\x35\x96\xbf\x09\x00\x14\x9e\xce\xf2\xb7\x7e\
+\x80\xe2\x41\x6b\xf9\x5b\x3b\xc0\xc9\xd5\x5b\xfe\xd6\x0d\x90\xbb\
+\xca\xfa\xbf\x49\x02\x1c\x5d\xdd\xe5\x6f\xbd\x00\xaf\x4c\x7b\xf9\
+\x5b\x2b\x40\x7b\xff\x4f\x7d\xf9\x5b\x27\xc0\x81\x11\x28\x7f\x6b\
+\x04\xd8\x33\x0a\xe5\x6f\x7d\x00\x29\x8d\xf2\xb7\x36\x80\x1d\x91\
+\xf2\xb7\x2e\x80\x2d\x95\xf2\xb7\x26\x80\x76\x03\xa0\x3f\x45\xf9\
+\x5b\x70\x43\x00\x7e\x8c\x3a\xfe\x24\xf8\x5b\x59\x9c\xf2\xec\xb0\
+\x4f\xb7\x9b\xf5\x4b\x12\xaf\x96\x51\x18\xf8\x0f\xec\xfe\xdb\x4a\
+\x15\x03\x74\x5d\x07\x53\xb7\xc3\xac\xab\xf7\x30\x5f\xdf\xc3\xdc\
+\xbd\x87\xf9\xfc\x2b\xcc\xef\x81\xef\xb9\x6a\xae\x93\x92\x09\xf0\
+\xd4\x79\x0b\x4a\xba\xdb\xbe\x87\x99\xbc\x87\xb9\xb8\x1a\x66\xff\
+\x48\x0d\x00\x90\xf7\xcb\xb3\x53\xde\xac\x2c\x0f\x20\x96\x19\x3f\
+\xfd\x39\x40\xac\xa4\xc6\x3f\xdd\x6d\x22\x92\x00\xc4\x52\x6e\xfc\
+\x4e\x49\x1b\x40\x44\x92\xe3\x9f\xee\x17\x07\xe5\xfc\xda\xdc\x42\
+\x76\xfc\x0e\xa7\x0c\xa0\x20\x7e\xe7\x4c\x18\x80\x87\xf2\xe3\x77\
+\x04\x5d\x80\x3a\x50\x10\xff\x74\xd9\xfa\xe4\x00\x6f\x4a\xe2\xa7\
+\x0b\x50\xf9\x8e\xd5\x00\xa5\xa2\xf8\xa9\x02\x94\x9e\x63\x35\x40\
+\xa1\x2c\x7e\xa2\x00\x2b\x07\x00\x00\x00\x00\x00\x00\xa0\x62\x08\
+\xdb\x01\x38\x00\x2c\x07\xa8\x6d\x07\xa8\x6c\x07\x28\x6c\x07\xa0\
+\x5e\x16\x37\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x60\x2b\x80\
+\x6d\x03\x00\x00\x00\xc0\xff\x00\xf6\x0e\x00\x00\x00\x00\x00\xb0\
+\x7a\xfc\x0b\x43\xd4\xc6\xc6\x44\x07\xe4\xaa\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x09\x13\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00\x6b\xac\x58\x54\
+\x00\x00\x00\xed\x50\x4c\x54\x45\x78\x00\xf8\x80\x00\xf8\x80\x04\
+\xf8\x80\x08\xf8\x80\x0c\xf8\x88\x10\xf8\x88\x14\xf8\x88\x18\xf8\
+\x88\x1c\xf8\x88\x20\xf8\x90\x20\xf8\x90\x24\xf8\x90\x28\xf8\x90\
+\x2c\xf8\x90\x30\xf8\x98\x30\xf8\x98\x34\xf8\x98\x38\xf8\x98\x3c\
+\xf8\x98\x40\xf8\xa0\x40\xf8\xa0\x44\xf8\xa0\x48\xf8\xa0\x4c\xf8\
+\xa0\x50\xf8\xa8\x50\xf8\xa8\x54\xf8\xa8\x58\xf8\xa8\x5c\xf8\xa8\
+\x60\xf8\xb0\x60\xf8\xb0\x64\xf8\xb0\x68\xf8\xb0\x6c\xf8\xb0\x70\
+\xf8\xb8\x70\xf8\xb8\x74\xf8\xb8\x78\xf8\xb8\x7c\xf8\xb8\x80\xf8\
+\xc0\x80\xf8\xc0\x84\xf8\xc0\x88\xf8\xc0\x8c\xf8\xc0\x90\xf8\xc8\
+\x90\xf8\xc8\x94\xf8\xc8\x98\xf8\xc8\x9c\xf8\xc8\xa0\xf8\xd0\xa0\
+\xf8\xd0\xa4\xf8\xd0\xa8\xf8\xd0\xac\xf8\xd0\xb0\xf8\xd8\xb0\xf8\
+\xd8\xb4\xf8\xd8\xb8\xf8\xd8\xbc\xf8\xd8\xc0\xf8\xe0\xc0\xf8\xe0\
+\xc4\xf8\xe0\xc8\xf8\xe0\xcc\xf8\xe0\xd0\xf8\xe8\xd0\xf8\xe8\xd4\
+\xf8\xe8\xd8\xf8\xe8\xdc\xf8\xe8\xe0\xf8\xf0\xe0\xf8\xf0\xe4\xf8\
+\xf0\xe8\xf8\xf0\xec\xf8\xf0\xf0\xf8\xf8\xf0\xf8\xf8\xf4\xf8\xf8\
+\xf8\xf8\xf8\xfc\xf8\x09\xd1\x39\xc7\x00\x00\x00\x09\x70\x48\x59\
+\x73\x00\x00\x00\x48\x00\x00\x00\x48\x00\x46\xc9\x6b\x3e\x00\x00\
+\x07\xcc\x49\x44\x41\x54\x78\xda\xed\xdd\x69\x43\xda\x4c\x10\x00\
+\xe0\x1c\x50\x90\xa3\x28\x2d\x52\x81\xaa\x78\x03\xe5\xa8\x82\x22\
+\x45\xa8\x81\x0a\x91\x64\xfe\xff\xcf\xe9\x87\xbe\xaf\x72\xe4\xce\
+\x26\x66\x36\xb3\xdf\x23\xd9\x47\xc8\x31\x3b\x33\x2b\x40\xcc\x87\
+\x40\x00\x04\x40\x00\x04\x40\x00\x20\xc4\x70\x10\x00\x01\x10\xc0\
+\x26\x40\xac\x2e\x7d\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\
+\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\
+\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\
+\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\x04\x40\x00\xac\x87\
+\xae\x0c\x5a\x67\x95\x2f\xf9\x74\x52\x96\x04\x29\xf1\x29\x9d\x2d\
+\x56\xce\x5b\x7d\x45\x8f\x03\x80\xd2\x3d\xfe\x2c\x99\xa4\x2c\x4a\
+\x85\x5a\x67\xc6\x33\xc0\xea\xae\x96\xb2\x4d\xdc\x4c\x55\x6f\x5f\
+\xb9\x04\xd0\xee\x0e\x25\x87\xc9\xab\xd2\xb7\xbe\xc6\x1b\xc0\xe4\
+\x58\x76\x95\xc0\x9b\x38\x9f\x73\x04\xa0\xff\x2c\xb8\xcf\x61\x16\
+\x2b\x13\x4e\x00\x5e\x1b\x9f\x3c\xe6\x71\x57\xe7\x1c\x00\xa8\x57\
+\x09\xef\x99\xec\xd2\xf9\x0a\x39\xc0\xab\x9f\xe9\x0b\x82\x20\x64\
+\xc6\x98\x01\xb4\x56\xd2\x77\x39\x83\x78\xa6\xa1\x05\xb8\x4b\x33\
+\xa9\xe8\x38\x58\xe2\x04\x50\xf7\x59\xd5\xb4\xa4\x9f\x51\x02\x3c\
+\xb0\xab\xea\x91\xc7\x18\x01\xae\x18\xd6\x35\x25\x9e\x10\x02\x1c\
+\xb2\xac\xec\x4a\x4c\xf1\x01\x24\x59\x02\x08\xa9\x25\x36\x80\x39\
+\xe3\xea\xbe\xa2\x8e\x0c\xe0\x8e\x75\x7d\xe3\x05\x32\x80\x73\xd6\
+\x00\xe2\x04\x17\xc0\x01\xf3\x12\xd7\x7d\x54\x00\xba\xcc\x1c\x40\
+\xe8\x60\x02\xf8\x1d\x40\x95\x73\x4a\x47\x04\xd0\x0d\xa2\xce\xfb\
+\x16\x11\xc0\x49\x10\x00\x79\x44\x00\xf9\x40\x4a\xfd\x27\x68\x00\
+\x34\xd1\xf4\x6e\x96\xab\x5c\x77\x87\x4f\x53\x45\x99\x8e\x07\x9d\
+\xcb\xf2\x9e\x1b\x80\x4b\x34\x00\x63\x93\x17\xdb\xb3\xe1\x4e\x8c\
+\x6b\xd9\x3f\x71\x1c\x33\xcc\xa1\x01\x68\x19\x86\x79\x47\x66\xf7\
+\xcc\x61\xd9\xa1\xc0\x1c\x0b\x40\xd5\x20\xc4\x6b\xb9\xe8\xa5\x54\
+\x1c\x01\x0c\xb0\x00\x64\x76\xbe\xbc\xb6\x31\x8d\x51\xd6\x01\xc0\
+\x15\x12\x80\xe5\xf6\x89\x9f\x38\x88\x6c\xae\x6a\xf6\x00\x65\x24\
+\x00\xc3\xad\x5f\x7f\xcf\xd9\x61\x0d\x5b\x80\xcf\x48\x00\x6e\x36\
+\x97\x37\x86\x4e\x8f\x6b\xdb\x2e\x13\x20\x01\xd8\x08\x87\x89\xf7\
+\xce\x0f\xbc\xb0\x01\x48\x22\x01\xd8\xb8\xb1\xf7\xdc\x1c\xf9\xc5\
+\x26\x28\x80\x03\xe0\xcf\xc6\xf5\xcf\x5d\x24\xcd\x7a\x29\x4d\xc6\
+\x01\xd0\x5f\x7f\x81\xd1\xfc\x5c\x3e\x90\xfe\x04\xd6\x7e\xc9\xa2\
+\xdb\x78\xf6\xca\x32\x9a\x9c\xc6\x01\x50\xf4\x13\xca\xb4\x0c\x26\
+\x16\x71\x00\xbc\x87\xc3\x92\xee\xf3\x9d\x9e\x2d\x53\x26\x50\x00\
+\xac\x4d\xe1\x07\x8b\xc7\xe8\xb5\x71\x83\x02\xa0\xe7\x2f\x8a\x67\
+\x15\x4c\x1a\xa2\x00\x38\x7d\x3b\xdf\x06\xeb\x70\xe2\x12\x05\xc0\
+\x5b\x4a\x98\xac\x7a\x39\xfc\x97\xf9\xfc\x0b\x28\x02\x22\xda\x5b\
+\x3e\xe4\x77\x4f\xc7\xbf\x84\xf7\x36\x1c\x0c\xc0\xd3\xdb\xf9\x7a\
+\xcb\x6b\x50\xcd\x01\x7e\xa3\x00\x68\xfb\x7c\x75\xd3\x43\x5c\x1c\
+\x0b\x04\xa0\xea\x73\x3d\x57\x33\x05\xe8\xe1\x00\xc8\xfa\x8c\xe2\
+\x2f\x4d\x9f\x83\x91\x2c\x8d\xfd\xec\xfd\x1b\x3f\x3d\x1e\x3f\xe3\
+\x62\x71\x94\x5d\x3c\xed\x3d\xae\xaa\xc7\x04\xc0\x2c\x2e\xf6\x0b\
+\x62\x02\x70\x6c\x3c\xff\x13\x88\x0b\x80\xf1\xcb\x50\x4e\x8b\x0b\
+\x80\x71\x7a\x99\x1c\x4c\xba\x6c\x14\x01\x9a\x86\xc1\xd0\x07\x88\
+\x0d\x40\xce\x08\xe0\x07\xc4\x06\x60\x64\x34\xff\x06\xc4\x07\xa0\
+\x18\x42\x1c\x28\xca\x00\x06\x49\xf6\x62\x07\xe2\x03\xf0\xba\x5b\
+\x64\x22\x0f\x20\x46\x00\xbb\x2b\xe4\x7b\x53\x88\x11\xc0\x6e\x66\
+\x4d\x49\x85\x18\x01\x0c\xb6\x73\xcb\xa4\x56\xc0\x9f\x18\x2d\x80\
+\xbb\xed\xf9\xe7\x7e\x43\x9c\x00\x1a\x5b\xf3\x97\xae\x83\x6f\xa8\
+\x10\x21\x80\xe5\x76\xa6\x5c\x51\x09\xe1\x53\xa3\x03\xd0\xdb\x5a\
+\x14\x4e\xdf\x85\xf2\xb1\x51\x01\x18\x6c\xa5\x16\xcb\x57\xdc\x35\
+\x50\xb0\xfa\xf2\xb7\xb6\xde\x7f\xa4\xfa\x32\xac\xcf\xfe\x78\x00\
+\xa5\x55\x92\x76\x6a\xe6\x07\x53\x95\x53\x00\x75\xf9\xdf\x58\xcc\
+\x95\xa7\x41\xab\x5e\x34\xcd\x08\x4a\xee\xd7\x1a\xc3\x05\x6f\x00\
+\xaa\xe8\xb6\x6c\xba\xda\x7d\xe1\x09\x60\xe0\xa5\x48\xa2\xd0\x5c\
+\x70\x03\xe0\xb1\x8e\x46\xac\x3c\x71\x02\xb0\x27\x78\x1d\xa5\x09\
+\x0f\x00\x33\x3f\xe5\x42\xd5\x17\xfc\x00\x1d\x7f\x15\xf4\x3d\xf4\
+\x00\x65\xc1\xdf\x38\x5a\xe1\x06\xd0\x7d\x76\xd4\x11\x84\xac\x82\
+\x1a\x60\xec\xbf\x6e\x30\xf9\x84\x19\x80\x45\x53\x11\xf9\x11\x31\
+\x00\x93\xb6\x3a\xf2\x08\x2d\x80\xeb\xe7\x60\x93\x9b\x81\x82\x15\
+\xa0\xcf\xa8\x7e\x38\xa3\x22\x05\x60\x56\x4f\x5e\x46\x0a\x90\x66\
+\x05\x20\x74\x51\x02\xcc\x98\xcd\x5f\x48\x2c\x30\x02\x6c\xa7\x3e\
+\x89\x92\x77\x81\x1a\x46\x80\x7f\xa9\x4f\x99\xf2\x45\xe7\x61\x32\
+\x57\x35\x00\x00\x6d\x39\x1b\xf5\xae\xca\x29\xf7\x02\x53\x84\x00\
+\xfa\x65\xf1\xfa\xd1\xb8\x80\x66\x71\x5b\x71\xf9\x94\x5c\xe1\x2a\
+\x2a\x0c\x00\xa0\xdf\x1f\xba\x79\x4c\x10\xe7\xbc\x01\x00\xc0\xfc\
+\xd8\x05\xc1\x25\x87\x00\x00\xb3\x23\xe7\x2d\x85\xb8\x04\x00\x18\
+\x38\xee\x26\x32\xe6\x13\x00\x96\xa5\x70\x7b\xcb\x45\x2f\x49\x4a\
+\xaf\x3b\x03\xf8\xcc\x2b\x80\x49\xa6\xe8\xee\x50\xb9\x05\xb0\xa9\
+\x1f\xff\x7f\x8c\xf8\x05\x58\x2b\xbc\xb4\x18\x2d\x8e\x01\x74\x27\
+\xcd\x18\x4f\x39\x06\x80\x85\x83\x27\xe3\x12\xcf\x00\x4e\x96\x50\
+\xf2\x5c\x03\x38\x08\xa0\xa6\xf8\x06\x18\xd9\x47\x45\xf8\x06\xb0\
+\xff\x0a\x48\x9c\x03\xd8\xe6\x52\x88\x9c\x03\xe8\x76\xad\xc9\x93\
+\x9c\x03\xd8\x46\xd1\x33\xbc\x03\x3c\xda\xa5\x0e\xf1\x0e\xb0\xb2\
+\x89\x0f\x7d\xe5\x1d\xc0\xee\x3e\x70\xc4\x3d\x40\x3d\xc6\xef\x02\
+\x00\x60\xdb\x5c\xb1\xc3\x3d\xc0\xd0\x1a\xe0\x89\x7b\x00\xc5\xfa\
+\x39\x48\xe3\x1e\x60\x11\x46\x8f\xe9\x28\x03\xbc\x0a\x21\xb4\x95\
+\x8b\x32\x80\x6e\x09\xd0\xe6\x1f\x40\xb3\x04\x78\x89\x2c\x80\xfa\
+\xc0\xa8\xd6\x7d\x69\x35\x7f\x56\x3d\xa5\x18\x03\xa8\xf7\xe7\x05\
+\x91\x55\xd3\x3f\xcb\x9d\x9a\x1a\x51\x04\xb8\xcc\x8b\x2c\xff\x3d\
+\x13\x2b\x80\x59\x14\x01\xde\x5b\x1f\x30\x49\xe7\xec\x87\xb1\xd1\
+\x02\x53\x80\xb3\xb7\xf3\x3b\x60\x71\x6e\x8d\xe0\xef\x01\x8c\x01\
+\xd6\x76\x17\x63\xd1\xf3\xe5\xbb\x45\x34\x48\x8b\x24\x80\xc2\x36\
+\x68\x9f\x0d\xa3\xb1\x24\xdb\xbb\xc0\xda\xee\x5a\xfe\xb7\x44\xb2\
+\xb8\x0b\x4a\x51\xcd\x13\x5c\x5b\xd2\x4b\xfb\xfe\x92\x5a\x84\x85\
+\x19\x76\x15\x63\x0b\x70\xca\xf2\x5b\x6a\xbe\xdf\x86\x34\x8f\x2a\
+\xc0\x7a\x43\x60\xf9\x8f\xcf\x07\xe1\x44\x28\xad\x65\xd9\x02\x4c\
+\x18\xe6\x74\x9b\xff\x02\xd2\x5a\x64\x01\x36\xf7\xd7\xf2\xd7\x01\
+\xe1\x4b\x38\x5b\x0d\x31\x7e\x17\xd8\xb8\x73\x25\xfd\x34\x01\x98\
+\x06\x9c\x17\x10\x10\xc0\xe6\x6e\x51\x87\xc0\xea\x2f\xad\x2f\x0a\
+\xcf\xa2\x0c\x70\xbd\x79\xb2\x4d\xcf\x7f\xc8\xbc\xc2\xae\x0f\x51\
+\x06\xd8\xba\x72\x89\x9e\x33\xb9\x0a\xc1\xae\x06\x04\x06\x30\x63\
+\x54\xe1\x65\x9a\x2a\x58\xd0\xa2\x0d\xa0\x6f\x57\x81\xec\x79\x8a\
+\x5c\x4d\xcc\x8a\x49\x12\xac\x77\xdb\x63\x1e\x12\xdb\xd9\x68\x33\
+\xeb\xe1\xb1\x5d\x35\xdb\x63\x43\x62\xbd\xbf\x04\x7b\x80\xdd\x6d\
+\x06\xb3\xae\x9f\x08\x35\xb3\x2c\x41\x31\x80\xde\x4a\xac\x01\x0c\
+\x82\x18\x29\x97\xfd\x70\xf5\x72\x88\xad\xc5\x99\x03\x18\x3d\xc0\
+\x26\xee\xdd\xfc\x85\x55\x29\xe8\x38\x68\xa0\x00\xc6\xc5\x81\x75\
+\xe7\xd7\xee\xc5\x7e\xc0\x05\x02\x01\x03\x80\xf1\xf5\x3b\xeb\xb4\
+\x2f\xfa\xd0\xb4\x62\xa4\x09\x38\x00\xcc\xf6\x5b\xae\x3a\xb9\x16\
+\xae\xce\x4c\x43\x00\x41\xf5\x96\x63\x0e\x50\x35\x9d\x42\xdd\xf6\
+\x91\xe0\xd6\xb4\x82\x32\x31\x02\x2c\x00\x16\xb1\x6c\xa9\x6a\x95\
+\xd3\xa0\xf7\x72\xe6\x11\x80\x67\x40\x03\x60\x9d\xe0\x99\xbd\x31\
+\x79\x36\x9e\x5e\x58\xd4\xcf\x1e\x06\xd8\x5c\x8f\x39\x80\x6d\x8d\
+\x78\xe6\xe4\x76\xeb\x85\x76\xd1\xaf\x5b\xed\x38\x2c\xfd\x00\x40\
+\x04\x00\x4e\x6a\xc2\xe5\x42\xe5\xac\xd1\xe9\x76\xdb\x8d\xcb\xea\
+\x81\x4d\xa5\x60\x36\xd0\xbe\xca\x01\x00\xe4\x05\xa6\xe3\x78\x05\
+\xc8\x00\xaa\x2c\xa7\x9f\x1f\x03\x60\x03\x68\xb0\x9b\x7e\xa2\x8d\
+\xb1\xaf\xf0\x03\xb3\xf9\xd7\xc2\xe8\xac\xca\x1e\x60\xce\x68\xfa\
+\x47\x53\x00\x94\x00\xeb\x2b\xa4\x9e\x87\x58\x7d\x06\xc0\x0a\xe0\
+\xbf\x61\x96\x58\x9b\x01\xe0\x05\xf0\xdb\x2f\x29\xdb\x5c\x00\x60\
+\x06\x80\xc7\x6f\xde\x9b\x86\xc9\xdf\xc7\x10\xea\x08\x26\x51\x72\
+\x71\x93\xf3\x34\xfb\x72\x6f\x05\xc0\x03\x00\x00\x4c\x2f\x32\x2e\
+\x5b\xa4\xd5\x1f\x35\x08\x7f\x04\x99\x2a\xab\xb4\x4a\xce\xee\x08\
+\x62\xae\xd6\x56\xe0\x63\x46\xc0\xb9\xc2\xfa\xb4\x5d\xcd\x5b\x29\
+\xc8\xd9\x4a\x73\xb4\x82\x8f\x1b\xa1\x24\x4b\xcf\x87\xdd\xab\xe3\
+\xc3\x62\x3e\x9d\x4c\xc8\x92\x20\x25\x52\x99\xfc\xfe\xd7\xf2\x69\
+\xb3\x3f\x59\xc0\x47\x8f\x28\x67\x8b\x13\x00\x01\x10\x00\x01\x10\
+\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\
+\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\
+\x10\x00\x01\x10\x00\x01\x10\x40\x80\x00\x71\x1b\x04\x40\x00\x04\
+\xf0\x0e\x10\xdf\x41\x00\x04\x40\x00\x04\x10\xeb\xf1\x17\xe9\x89\
+\x47\x68\xda\x1b\x7c\x00\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x09\
+\x0a\x87\xa4\xa7\
+\x00\x73\
+\x00\x69\x00\x64\x00\x65\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\x88\xa4\xa7\
+\x00\x73\
+\x00\x69\x00\x64\x00\x65\x00\x35\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\x89\xa4\xa7\
+\x00\x73\
+\x00\x69\x00\x64\x00\x65\x00\x36\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\x84\xa4\xa7\
+\x00\x73\
+\x00\x69\x00\x64\x00\x65\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\x85\xa4\xa7\
+\x00\x73\
+\x00\x69\x00\x64\x00\x65\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\x86\xa4\xa7\
+\x00\x73\
+\x00\x69\x00\x64\x00\x65\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x02\
+\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x16\x7f\
+\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x97\
+\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x01\x00\x00\x21\x83\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x05\x42\
+\x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xed\
+"
+
+def qInitResources():
+ QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()