aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitmodules9
-rw-r--r--.qt-license-check.exclude3
-rw-r--r--MANIFEST.in4
-rw-r--r--README.md57
-rw-r--r--build_history/blacklist.txt6
-rw-r--r--checklibs.py39
-rw-r--r--docs/conf.py42
-rw-r--r--docs/make.bat39
-rw-r--r--examples/3d/simple3d.py164
-rw-r--r--examples/axcontainer/axviewer.py84
-rw-r--r--examples/charts/audio.py128
-rw-r--r--examples/charts/memoryusage.py128
-rwxr-xr-xexamples/corelib/threads/mandelbrot.py349
-rwxr-xr-xexamples/corelib/tools/codecs/codecs.py251
-rwxr-xr-xexamples/corelib/tools/regexp.py195
-rwxr-xr-xexamples/corelib/tools/settingseditor/settingseditor.py722
-rw-r--r--examples/datavisualization/bars3d.py115
-rw-r--r--examples/declarative/extending/chapter1-basics/app.qml64
-rw-r--r--examples/declarative/extending/chapter1-basics/basics.py100
-rw-r--r--examples/declarative/extending/chapter2-methods/app.qml70
-rw-r--r--examples/declarative/extending/chapter2-methods/methods.py105
-rw-r--r--examples/declarative/extending/chapter3-bindings/app.qml78
-rw-r--r--examples/declarative/extending/chapter3-bindings/bindings.py110
-rw-r--r--examples/declarative/extending/chapter4-customPropertyTypes/app.qml60
-rw-r--r--examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py115
-rw-r--r--examples/declarative/extending/chapter5-listproperties/app.qml70
-rw-r--r--examples/declarative/extending/chapter5-listproperties/listproperties.py128
-rwxr-xr-xexamples/declarative/scrolling.py73
-rw-r--r--examples/declarative/signals/pytoqml1/main.py72
-rw-r--r--examples/declarative/signals/pytoqml1/view.qml73
-rwxr-xr-xexamples/declarative/signals/qmltopy1/main.py89
-rw-r--r--examples/declarative/signals/qmltopy1/view.qml85
-rwxr-xr-xexamples/declarative/signals/qmltopy2/main.py81
-rw-r--r--examples/declarative/signals/qmltopy2/view.qml80
-rw-r--r--examples/declarative/signals/qmltopy3/main.py72
-rw-r--r--examples/declarative/signals/qmltopy3/view.qml103
-rw-r--r--examples/declarative/signals/qmltopy4/main.py72
-rw-r--r--examples/declarative/signals/qmltopy4/view.qml68
-rw-r--r--examples/declarative/usingmodel.py102
-rw-r--r--examples/declarative/view.qml65
-rw-r--r--examples/examples.pyqtc103
-rwxr-xr-xexamples/macextras/macpasteboardmime.py127
-rwxr-xr-xexamples/multimedia/audiooutput.py301
-rw-r--r--examples/multimedia/camera.py170
-rw-r--r--examples/multimedia/player.py158
-rw-r--r--examples/network/blockingfortuneclient.py225
-rwxr-xr-xexamples/network/fortuneclient.py168
-rwxr-xr-xexamples/network/fortuneserver.py125
-rwxr-xr-xexamples/network/threadedfortuneserver.py153
-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/hellogl2.py473
-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
-rwxr-xr-xexamples/script/helloscript.py61
-rw-r--r--examples/scriptableapplication/CMakeLists.txt187
-rw-r--r--examples/scriptableapplication/README.CMake.txt28
-rw-r--r--examples/scriptableapplication/README.txt33
-rw-r--r--examples/scriptableapplication/main.cpp64
-rw-r--r--examples/scriptableapplication/mainwindow.cpp141
-rw-r--r--examples/scriptableapplication/mainwindow.h76
-rw-r--r--examples/scriptableapplication/pyside2.pri19
-rw-r--r--examples/scriptableapplication/pyside2_config.py283
-rw-r--r--examples/scriptableapplication/pythonutils.cpp169
-rw-r--r--examples/scriptableapplication/pythonutils.h81
-rw-r--r--examples/scriptableapplication/scriptableapplication.pro90
-rw-r--r--examples/scriptableapplication/scriptableapplication.xml56
-rw-r--r--examples/scriptableapplication/wrappedclasses.h (renamed from sources/pyside2/header.BSD)10
-rw-r--r--examples/texttospeech/texttospeech.py108
-rw-r--r--examples/tutorial/t1.py57
-rw-r--r--examples/tutorial/t10.py192
-rw-r--r--examples/tutorial/t11.py264
-rw-r--r--examples/tutorial/t12.py313
-rw-r--r--examples/tutorial/t13.py396
-rw-r--r--examples/tutorial/t14.py451
-rw-r--r--examples/tutorial/t2.py60
-rw-r--r--examples/tutorial/t3.py62
-rw-r--r--examples/tutorial/t4.py67
-rw-r--r--examples/tutorial/t5.py78
-rw-r--r--examples/tutorial/t6.py91
-rw-r--r--examples/tutorial/t7.py114
-rw-r--r--examples/tutorial/t8.py153
-rw-r--r--examples/tutorial/t9.py160
-rw-r--r--examples/utils/utils.py49
-rw-r--r--examples/webenginewidgets/simplebrowser.py102
-rwxr-xr-xexamples/widgets/animation/animatedtiles/animatedtiles.py260
-rw-r--r--examples/widgets/animation/animatedtiles/animatedtiles.qrc11
-rw-r--r--examples/widgets/animation/animatedtiles/animatedtiles_rc.py6144
-rw-r--r--examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpgbin0 -> 32471 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/images/centered.pngbin0 -> 892 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/images/ellipse.pngbin0 -> 10767 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/images/figure8.pngbin0 -> 14050 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/images/kinetic.pngbin0 -> 6776 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/images/random.pngbin0 -> 14969 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/images/tile.pngbin0 -> 16337 bytes
-rw-r--r--examples/widgets/animation/appchooser/accessories-dictionary.pngbin0 -> 5396 bytes
-rw-r--r--examples/widgets/animation/appchooser/akregator.pngbin0 -> 4873 bytes
-rwxr-xr-xexamples/widgets/animation/appchooser/appchooser.py134
-rw-r--r--examples/widgets/animation/appchooser/appchooser.qrc8
-rw-r--r--examples/widgets/animation/appchooser/appchooser_rc.py1464
-rw-r--r--examples/widgets/animation/appchooser/digikam.pngbin0 -> 3334 bytes
-rw-r--r--examples/widgets/animation/appchooser/k3b.pngbin0 -> 8220 bytes
-rw-r--r--examples/widgets/animation/easing/easing.py260
-rw-r--r--examples/widgets/animation/easing/easing.qrc5
-rw-r--r--examples/widgets/animation/easing/easing_rc.py403
-rw-r--r--examples/widgets/animation/easing/form.ui205
-rw-r--r--examples/widgets/animation/easing/images/qt-logo.pngbin0 -> 5149 bytes
-rw-r--r--examples/widgets/animation/easing/ui_form.py115
-rwxr-xr-xexamples/widgets/animation/states/states.py265
-rw-r--r--examples/widgets/animation/states/states_rc.py2221
-rwxr-xr-xexamples/widgets/dialogs/classwizard/classwizard.py404
-rw-r--r--examples/widgets/dialogs/classwizard/classwizard.qrc11
-rw-r--r--examples/widgets/dialogs/classwizard/classwizard_rc.py3928
-rw-r--r--examples/widgets/dialogs/classwizard/images/background.pngbin0 -> 22578 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/banner.pngbin0 -> 3947 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/logo1.pngbin0 -> 1619 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/logo2.pngbin0 -> 1619 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/logo3.pngbin0 -> 1619 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/watermark1.pngbin0 -> 14516 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/watermark2.pngbin0 -> 14912 bytes
-rwxr-xr-xexamples/widgets/dialogs/extension.py114
-rwxr-xr-xexamples/widgets/dialogs/findfiles.py211
-rw-r--r--examples/widgets/dialogs/standarddialogs.py320
-rwxr-xr-xexamples/widgets/dialogs/trivialwizard.py113
-rwxr-xr-xexamples/widgets/draganddrop/draggabletext/draggabletext.py156
-rw-r--r--examples/widgets/draganddrop/draggabletext/draggabletext.qrc5
-rw-r--r--examples/widgets/draganddrop/draggabletext/draggabletext_rc.py97
-rw-r--r--examples/widgets/draganddrop/draggabletext/words.txt41
-rwxr-xr-xexamples/widgets/effects/lighting.py145
-rwxr-xr-xexamples/widgets/graphicsview/anchorlayout.py126
-rw-r--r--examples/widgets/graphicsview/collidingmice/collidingmice.py217
-rw-r--r--examples/widgets/graphicsview/collidingmice/mice_rc.py271
-rwxr-xr-xexamples/widgets/graphicsview/diagramscene/diagramscene.py825
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene.qrc19
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene_rc.py445
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/background1.pngbin0 -> 112 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/background2.pngbin0 -> 114 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/background3.pngbin0 -> 116 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/background4.pngbin0 -> 96 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/bold.pngbin0 -> 274 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/bringtofront.pngbin0 -> 293 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/delete.pngbin0 -> 831 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/floodfill.pngbin0 -> 282 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/italic.pngbin0 -> 247 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/linecolor.pngbin0 -> 145 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/linepointer.pngbin0 -> 141 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/pointer.pngbin0 -> 173 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/sendtoback.pngbin0 -> 318 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/textpointer.pngbin0 -> 753 bytes
-rw-r--r--examples/widgets/graphicsview/diagramscene/images/underline.pngbin0 -> 250 bytes
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py287
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot.qrc5
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py1017
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/images/head.pngbin0 -> 14972 bytes
-rwxr-xr-xexamples/widgets/graphicsview/elasticnodes.py414
-rw-r--r--examples/widgets/itemviews/addressbook/adddialogwidget.py103
-rw-r--r--examples/widgets/itemviews/addressbook/addressbook.py131
-rw-r--r--examples/widgets/itemviews/addressbook/addresswidget.py249
-rw-r--r--examples/widgets/itemviews/addressbook/newaddresstab.py94
-rw-r--r--examples/widgets/itemviews/addressbook/tablemodel.py147
-rwxr-xr-xexamples/widgets/itemviews/basicsortfiltermodel.py203
-rwxr-xr-xexamples/widgets/itemviews/fetchmore.py148
-rw-r--r--examples/widgets/itemviews/stardelegate/stardelegate.py174
-rw-r--r--examples/widgets/itemviews/stardelegate/stareditor.py99
-rw-r--r--examples/widgets/itemviews/stardelegate/starrating.py102
-rwxr-xr-xexamples/widgets/layouts/basiclayouts.py135
-rw-r--r--examples/widgets/layouts/dynamiclayouts.py171
-rwxr-xr-xexamples/widgets/layouts/flowlayout.py156
-rwxr-xr-xexamples/widgets/mainwindows/application/application.py273
-rw-r--r--examples/widgets/mainwindows/application/application.qrc10
-rw-r--r--examples/widgets/mainwindows/application/application_rc.py645
-rw-r--r--examples/widgets/mainwindows/application/images/copy.pngbin0 -> 1338 bytes
-rw-r--r--examples/widgets/mainwindows/application/images/cut.pngbin0 -> 1323 bytes
-rw-r--r--examples/widgets/mainwindows/application/images/new.pngbin0 -> 852 bytes
-rw-r--r--examples/widgets/mainwindows/application/images/open.pngbin0 -> 2073 bytes
-rw-r--r--examples/widgets/mainwindows/application/images/paste.pngbin0 -> 1645 bytes
-rw-r--r--examples/widgets/mainwindows/application/images/save.pngbin0 -> 1187 bytes
-rw-r--r--examples/widgets/mainwindows/dockwidgets/dockwidgets.py304
-rw-r--r--examples/widgets/mainwindows/dockwidgets/dockwidgets.qrc8
-rw-r--r--examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py503
-rw-r--r--examples/widgets/mainwindows/dockwidgets/images/new.pngbin0 -> 977 bytes
-rw-r--r--examples/widgets/mainwindows/dockwidgets/images/print.pngbin0 -> 1732 bytes
-rw-r--r--examples/widgets/mainwindows/dockwidgets/images/save.pngbin0 -> 1894 bytes
-rw-r--r--examples/widgets/mainwindows/dockwidgets/images/undo.pngbin0 -> 1768 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/copy.pngbin0 -> 1338 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/cut.pngbin0 -> 1323 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/new.pngbin0 -> 852 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/open.pngbin0 -> 2073 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/paste.pngbin0 -> 1645 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/save.pngbin0 -> 1187 bytes
-rwxr-xr-xexamples/widgets/mainwindows/mdi/mdi.py448
-rw-r--r--examples/widgets/mainwindows/mdi/mdi.qrc10
-rw-r--r--examples/widgets/mainwindows/mdi/mdi_rc.py645
-rwxr-xr-xexamples/widgets/painting/basicdrawing/basicdrawing.py350
-rw-r--r--examples/widgets/painting/basicdrawing/basicdrawing.qrc6
-rw-r--r--examples/widgets/painting/basicdrawing/basicdrawing_rc.py174
-rw-r--r--examples/widgets/painting/basicdrawing/images/brick.pngbin0 -> 856 bytes
-rw-r--r--examples/widgets/painting/basicdrawing/images/qt-logo.pngbin0 -> 533 bytes
-rwxr-xr-xexamples/widgets/painting/concentriccircles.py147
-rwxr-xr-xexamples/widgets/richtext/orderform.py297
-rwxr-xr-xexamples/widgets/richtext/syntaxhighlighter.py203
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/examples/example79
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py180
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc5
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py183
-rw-r--r--examples/widgets/richtext/textobject/files/heart.svg55
-rwxr-xr-xexamples/widgets/richtext/textobject/textobject.py130
-rwxr-xr-xexamples/widgets/state-machine/eventtrans.py93
-rwxr-xr-xexamples/widgets/state-machine/factstates.py112
-rwxr-xr-xexamples/widgets/state-machine/pingpong.py97
-rwxr-xr-xexamples/widgets/state-machine/rogue.py203
-rwxr-xr-xexamples/widgets/state-machine/trafficlight.py140
-rwxr-xr-xexamples/widgets/state-machine/twowaybutton.py71
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part1.py75
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part2.py182
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part3.py247
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part4.py301
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part5.py361
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part6.py426
-rwxr-xr-xexamples/widgets/tutorials/addressbook/part7.py478
-rwxr-xr-xexamples/widgets/widgets/hellogl_openglwidget_legacy.py289
-rw-r--r--examples/widgets/widgets/tetrix.py499
-rwxr-xr-xexamples/xml/dombookmarks/dombookmarks.py263
-rw-r--r--examples/xml/dombookmarks/frank.xbel230
-rw-r--r--examples/xml/dombookmarks/jennifer.xbel93
-rw-r--r--examples/xmlpatterns/schema/files/contact.xsd25
-rw-r--r--examples/xmlpatterns/schema/files/invalid_contact.xml11
-rw-r--r--examples/xmlpatterns/schema/files/invalid_order.xml13
-rw-r--r--examples/xmlpatterns/schema/files/invalid_recipe.xml14
-rw-r--r--examples/xmlpatterns/schema/files/order.xsd23
-rw-r--r--examples/xmlpatterns/schema/files/recipe.xsd40
-rw-r--r--examples/xmlpatterns/schema/files/valid_contact.xml11
-rw-r--r--examples/xmlpatterns/schema/files/valid_order.xml18
-rw-r--r--examples/xmlpatterns/schema/files/valid_recipe.xml13
-rwxr-xr-xexamples/xmlpatterns/schema/schema.py278
-rw-r--r--examples/xmlpatterns/schema/schema.qrc13
-rw-r--r--examples/xmlpatterns/schema/schema.ui71
-rw-r--r--examples/xmlpatterns/schema/schema_rc.py501
-rw-r--r--examples/xmlpatterns/schema/ui_schema.py62
-rw-r--r--ez_setup.py39
-rw-r--r--header.BSD-OLD (renamed from sources/pyside2/header.BSD-OLD)1
-rw-r--r--missing_bindings.py4
-rw-r--r--popenasync.py45
-rw-r--r--prepare_coin_sources.py3
-rw-r--r--qtinfo.py39
-rw-r--r--setup.py131
m---------sources/pyside2-examples0
m---------sources/pyside2-tools0
-rw-r--r--sources/pyside2/CMakeLists.txt126
-rw-r--r--sources/pyside2/PySide2/CMakeLists.txt31
-rw-r--r--sources/pyside2/PySide2/Qt3DAnimation/CMakeLists.txt55
-rw-r--r--sources/pyside2/PySide2/Qt3DAnimation/typesystem_3danimation.xml70
-rw-r--r--sources/pyside2/PySide2/Qt3DCore/CMakeLists.txt74
-rw-r--r--sources/pyside2/PySide2/Qt3DCore/typesystem_3dcore.xml90
-rw-r--r--sources/pyside2/PySide2/Qt3DExtras/CMakeLists.txt81
-rw-r--r--sources/pyside2/PySide2/Qt3DExtras/typesystem_3dextras.xml86
-rw-r--r--sources/pyside2/PySide2/Qt3DInput/CMakeLists.txt56
-rw-r--r--sources/pyside2/PySide2/Qt3DInput/typesystem_3dinput.xml85
-rw-r--r--sources/pyside2/PySide2/Qt3DLogic/CMakeLists.txt37
-rw-r--r--sources/pyside2/PySide2/Qt3DLogic/typesystem_3dlogic.xml (renamed from header.LGPL)14
-rw-r--r--sources/pyside2/PySide2/Qt3DRender/CMakeLists.txt147
-rw-r--r--sources/pyside2/PySide2/Qt3DRender/typesystem_3drender.xml243
-rw-r--r--sources/pyside2/PySide2/QtAxContainer/CMakeLists.txt46
-rw-r--r--sources/pyside2/PySide2/QtAxContainer/QtAxContainer_global.post.h.in5
-rw-r--r--sources/pyside2/PySide2/QtAxContainer/typesystem_axcontainer.xml63
-rw-r--r--sources/pyside2/PySide2/QtCharts/CMakeLists.txt90
-rw-r--r--sources/pyside2/PySide2/QtCharts/typesystem_charts.xml129
-rw-r--r--sources/pyside2/PySide2/QtConcurrent/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtConcurrent/typesystem_concurrent.xml2
-rw-r--r--sources/pyside2/PySide2/QtCore/CMakeLists.txt14
-rw-r--r--sources/pyside2/PySide2/QtCore/typesystem_core.xml.in4
-rw-r--r--sources/pyside2/PySide2/QtCore/typesystem_core_common.xml295
-rw-r--r--sources/pyside2/PySide2/QtDataVisualization/CMakeLists.txt70
-rw-r--r--sources/pyside2/PySide2/QtDataVisualization/typesystem_datavisualization.xml179
-rw-r--r--sources/pyside2/PySide2/QtGui/CMakeLists.txt24
-rw-r--r--sources/pyside2/PySide2/QtGui/QtGui_global.post.h.in1
-rw-r--r--sources/pyside2/PySide2/QtGui/typesystem_gui.xml.in6
-rw-r--r--sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml486
-rw-r--r--sources/pyside2/PySide2/QtHelp/CMakeLists.txt7
-rw-r--r--sources/pyside2/PySide2/QtHelp/typesystem_help.xml3
-rw-r--r--sources/pyside2/PySide2/QtMacExtras/CMakeLists.txt8
-rw-r--r--sources/pyside2/PySide2/QtMacExtras/typesystem_macextras.xml4
-rw-r--r--sources/pyside2/PySide2/QtMultimedia/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia.xml4
-rw-r--r--sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia_common.xml8
-rw-r--r--sources/pyside2/PySide2/QtMultimediaWidgets/CMakeLists.txt7
-rw-r--r--sources/pyside2/PySide2/QtMultimediaWidgets/typesystem_multimediawidgets.xml8
-rw-r--r--sources/pyside2/PySide2/QtNetwork/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtNetwork/typesystem_network.xml6
-rw-r--r--sources/pyside2/PySide2/QtOpenGL/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtOpenGL/typesystem_opengl.xml14
-rw-r--r--sources/pyside2/PySide2/QtPrintSupport/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtPrintSupport/typesystem_printsupport.xml2
-rw-r--r--sources/pyside2/PySide2/QtQml/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtQml/typesystem_qml.xml6
-rw-r--r--sources/pyside2/PySide2/QtQuick/CMakeLists.txt9
-rw-r--r--sources/pyside2/PySide2/QtQuick/typesystem_quick.xml9
-rw-r--r--sources/pyside2/PySide2/QtQuickWidgets/CMakeLists.txt8
-rw-r--r--sources/pyside2/PySide2/QtQuickWidgets/typesystem_quickwidgets.xml12
-rw-r--r--sources/pyside2/PySide2/QtScript/CMakeLists.txt4
-rw-r--r--sources/pyside2/PySide2/QtScript/typesystem_script.xml2
-rw-r--r--sources/pyside2/PySide2/QtScriptTools/CMakeLists.txt7
-rw-r--r--sources/pyside2/PySide2/QtScriptTools/typesystem_scripttools.xml6
-rw-r--r--sources/pyside2/PySide2/QtSql/CMakeLists.txt7
-rw-r--r--sources/pyside2/PySide2/QtSql/QtSql_global.pre.h.in5
-rw-r--r--sources/pyside2/PySide2/QtSql/typesystem_sql.xml2
-rw-r--r--sources/pyside2/PySide2/QtSvg/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtSvg/typesystem_svg.xml2
-rw-r--r--sources/pyside2/PySide2/QtTest/CMakeLists.txt10
-rw-r--r--sources/pyside2/PySide2/QtTest/QtTest_global.post.h.in1
-rw-r--r--sources/pyside2/PySide2/QtTest/QtTest_global.pre.h.in5
-rw-r--r--sources/pyside2/PySide2/QtTest/typesystem_test.xml7
-rw-r--r--sources/pyside2/PySide2/QtTextToSpeech/CMakeLists.txt35
-rw-r--r--sources/pyside2/PySide2/QtTextToSpeech/typesystem_texttospeech.xml (renamed from sources/pyside2/header.LGPL-NOGPL2)30
-rw-r--r--sources/pyside2/PySide2/QtUiTools/CMakeLists.txt7
-rw-r--r--sources/pyside2/PySide2/QtUiTools/typesystem_uitools.xml4
-rw-r--r--sources/pyside2/PySide2/QtWebChannel/CMakeLists.txt4
-rw-r--r--sources/pyside2/PySide2/QtWebChannel/typesystem_webchannel.xml2
-rw-r--r--sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt9
-rw-r--r--sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml14
-rw-r--r--sources/pyside2/PySide2/QtWebKit/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/QtWebKit/typesystem_webkit.xml6
-rw-r--r--sources/pyside2/PySide2/QtWebKitWidgets/CMakeLists.txt9
-rw-r--r--sources/pyside2/PySide2/QtWebKitWidgets/typesystem_webkitwidgets.xml12
-rw-r--r--sources/pyside2/PySide2/QtWebSockets/CMakeLists.txt5
-rw-r--r--sources/pyside2/PySide2/QtWebSockets/typesystem_websockets.xml4
-rw-r--r--sources/pyside2/PySide2/QtWidgets/CMakeLists.txt7
-rw-r--r--sources/pyside2/PySide2/QtWidgets/typesystem_widgets.xml.in6
-rw-r--r--sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml51
-rw-r--r--sources/pyside2/PySide2/QtWinExtras/CMakeLists.txt8
-rw-r--r--sources/pyside2/PySide2/QtWinExtras/typesystem_winextras.xml4
-rw-r--r--sources/pyside2/PySide2/QtX11Extras/CMakeLists.txt9
-rw-r--r--sources/pyside2/PySide2/QtX11Extras/QtX11Extras_global.post.h.in1
-rw-r--r--sources/pyside2/PySide2/QtX11Extras/typesystem_x11extras.xml2
-rw-r--r--sources/pyside2/PySide2/QtXml/CMakeLists.txt5
-rw-r--r--sources/pyside2/PySide2/QtXml/typesystem_xml.xml2
-rw-r--r--sources/pyside2/PySide2/QtXmlPatterns/CMakeLists.txt5
-rw-r--r--sources/pyside2/PySide2/QtXmlPatterns/typesystem_xmlpatterns.xml2
-rw-r--r--sources/pyside2/PySide2/global.h.in375
-rw-r--r--sources/pyside2/PySide2/support/signature/mapping.py2
-rw-r--r--sources/pyside2/PySide2/typesystem_templates.xml8
-rw-r--r--sources/pyside2/cmake/Macros/PySideModules.cmake46
-rw-r--r--sources/pyside2/doc/CMakeLists.txt90
-rw-r--r--sources/pyside2/doc/_templates/index.html94
-rw-r--r--sources/pyside2/doc/_templates/layout.html4
-rw-r--r--sources/pyside2/doc/_themes/pysidedocs/static/logo_indt.jpgbin3138 -> 0 bytes
-rw-r--r--sources/pyside2/doc/_themes/pysidedocs/static/logo_openbossa.pngbin4702 -> 0 bytes
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/alphachannel.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/clipboard/clipwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_io_qsettings.cpp7
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp10
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qregexp.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication.cpp16
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qclipboard.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainter.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyle.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_util_qvalidator.cpp (renamed from sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qvalidator.cpp)0
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qftp.cpp4
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp4
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp4
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostinfo.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_xml_dom_qdom.cpp8
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/customstyle/customstyle.h4
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/customviewstyle.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/dialogs/dialogs.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/dragging/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/droparea.cpp8
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/layouts/layouts.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/mainwindowsnippet.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/matrix/matrix.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/mdiareasnippets.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/picture/picture.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/polygon/polygon.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qfontdatabase/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qsortfilterproxymodel-details/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qsplashscreen/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qstackedwidget/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/qxmlstreamwriter/main.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/shareddirmodel/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/handler.cpp (renamed from sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.cpp)0
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/handler.h (renamed from sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.h)0
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/main.cpp (renamed from sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/main.cpp)0
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/splitter/splitter.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/splitterhandle/splitter.h6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/sqldatabase/sqldatabase.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-css/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-texttable/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/transform/main.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/doc/src/snippets/whatsthis/whatsthis.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/dialogs/extension/finddialog.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/imageprovider/imageprovider-example.qml (renamed from sources/pyside2/doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider-example.qml)2
-rw-r--r--sources/pyside2/doc/codesnippets/examples/imageprovider/imageprovider.cpp (renamed from sources/pyside2/doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider.cpp)4
-rw-r--r--sources/pyside2/doc/codesnippets/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/mainwindows/application/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/mainwindows/dockwidgets/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/mainwindows/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/mainwindows/mdi/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/mainwindows/menus/mainwindow.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/quick/plugins/plugins.qml (renamed from sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_svg_qgraphicssvgitem.cpp)0
-rw-r--r--sources/pyside2/doc/codesnippets/examples/relationaltablemodel/relationaltablemodel.cpp (renamed from sources/pyside2/doc/codesnippets/examples/sql/relationaltablemodel/relationaltablemodel.cpp)6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/svggenerator/window.cpp (renamed from sources/pyside2/doc/codesnippets/examples/painting/svggenerator/window.cpp)0
-rw-r--r--sources/pyside2/doc/codesnippets/examples/widgets/icons/iconsizespinbox.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/examples/widgets/spinboxes/window.cpp6
-rw-r--r--sources/pyside2/doc/codesnippets/webkitsnippets/simple/main.cpp2
-rw-r--r--sources/pyside2/doc/codesnippets/webkitsnippets/webpage/main.cpp2
-rw-r--r--sources/pyside2/doc/conf.py.in6
-rw-r--r--sources/pyside2/doc/inheritance_diagram.py87
-rw-r--r--sources/pyside2/doc/modules.rst26
-rw-r--r--sources/pyside2/doc/pyside-config.qdocconf.in10
-rw-r--r--sources/pyside2/doc/pyside.qdocconf.in269
-rw-r--r--sources/pyside2/doc/pysideinclude.py4
-rw-r--r--sources/pyside2/doc/pysideversion.rst18
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qt3dextras.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtcharts.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtconcurrent.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtcore.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtdatavisualization.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtgui.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qthelp.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtmacextras.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtmultimedia.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtnetwork.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtopengl.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtprintsupport.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtquickwidgets.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtsql.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtsvg.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qttest.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qttexttospeech.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtuitools.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtwebchannel.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtwebsockets.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtwidgets.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtwinextras.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtx11extras.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtxml.qdocconf.in2
-rw-r--r--sources/pyside2/doc/qtmodules/pyside-qtxmlpatterns.qdocconf.in2
-rw-r--r--sources/pyside2/doc/src/README.md1
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/helloworld/Cell.qml2
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial1.qml2
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial2.qml2
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial3.qml2
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/index.rst4
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/step1.rst26
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/step2.rst46
-rw-r--r--sources/pyside2/doc/tutorials/qmltutorial/step3.rst31
-rw-r--r--sources/pyside2/doc/typesystem_doc.xml.in64
-rw-r--r--sources/pyside2/header.COMM20
-rw-r--r--sources/pyside2/header.FDL27
-rw-r--r--sources/pyside2/header.FDL-OLD27
-rw-r--r--sources/pyside2/header.GPL29
-rw-r--r--sources/pyside2/header.GPL-EXCEPT28
-rw-r--r--sources/pyside2/header.LGPL-ONLY22
-rw-r--r--sources/pyside2/header.LGPL2133
-rw-r--r--sources/pyside2/header.LGPL336
-rw-r--r--sources/pyside2/header.LGPL3-COMM28
-rw-r--r--sources/pyside2/libpyside/CMakeLists.txt5
-rw-r--r--sources/pyside2/libpyside/pysidesignal.cpp74
-rw-r--r--sources/pyside2/pyside_version.py41
-rw-r--r--sources/pyside2/tests/Qt3DAnimation/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/Qt3DCore/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/Qt3DExtras/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/Qt3DExtras/qt3dextras_test.py154
-rw-r--r--sources/pyside2/tests/Qt3DInput/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/Qt3DLogic/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/Qt3DQuick/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/Qt3DRender/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtAxContainer/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtCharts/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtCharts/qcharts_test.py63
-rw-r--r--sources/pyside2/tests/QtCore/CMakeLists.txt5
-rw-r--r--sources/pyside2/tests/QtCore/qfileread_test.py82
-rw-r--r--sources/pyside2/tests/QtCore/qmimedatabase_test.py5
-rw-r--r--sources/pyside2/tests/QtCore/qobject_test.py13
-rw-r--r--sources/pyside2/tests/QtCore/qregularexpression_test.py56
-rw-r--r--sources/pyside2/tests/QtCore/qurl_test.py132
-rw-r--r--sources/pyside2/tests/QtCore/qurlquery_test.py59
-rw-r--r--sources/pyside2/tests/QtCore/quuid_test.py45
-rw-r--r--sources/pyside2/tests/QtCore/qversionnumber_test.py48
-rw-r--r--sources/pyside2/tests/QtDataVisualization/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtDataVisualization/datavisualization_test.py85
-rw-r--r--sources/pyside2/tests/QtGui/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtGui/qopenglwindow_test.py104
-rw-r--r--sources/pyside2/tests/QtHelp/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtHelp/helpsearchengine_test.py44
-rw-r--r--sources/pyside2/tests/QtTextToSpeech/CMakeLists.txt1
-rw-r--r--sources/pyside2/tests/QtTextToSpeech/qtexttospeech_test.py63
-rw-r--r--sources/pyside2/tests/QtWidgets/CMakeLists.txt2
-rw-r--r--sources/pyside2/tests/QtWidgets/qcolormap_test.py43
-rw-r--r--sources/pyside2/tests/QtWidgets/qlistwidget_test.py7
-rw-r--r--sources/pyside2/tests/QtWidgets/qtreeview_test.py89
-rw-r--r--sources/pyside2/tests/pysidetest/CMakeLists.txt34
-rw-r--r--sources/pyside2/tests/pysidetest/typesystem_pysidetest.xml2
-rw-r--r--sources/pyside2/tests/registry/exists_darwin_5_9_4_ci.py (renamed from sources/pyside2/tests/registry/exists_darwin_5_9_3_ci.py)791
-rw-r--r--sources/pyside2/tests/registry/exists_linux_5_9_4_ci.py (renamed from sources/pyside2/tests/registry/exists_linux_5_9_3_ci.py)211
-rw-r--r--sources/pyside2/tests/registry/exists_win32_5_9_4_ci.py (renamed from sources/pyside2/tests/registry/exists_win32_5_9_3_ci.py)763
-rw-r--r--sources/pyside2/tests/registry/init_platform.py2
-rw-r--r--sources/pyside2/tests/signals/signal_signature_test.py40
-rw-r--r--sources/shiboken2/ApiExtractor/CMakeLists.txt45
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp958
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.h11
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h17
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp1062
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h404
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h18
-rw-r--r--sources/shiboken2/ApiExtractor/apiextractor.cpp126
-rw-r--r--sources/shiboken2/ApiExtractor/apiextractor.h10
-rw-r--r--sources/shiboken2/ApiExtractor/asttoxml.cpp160
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp858
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangbuilder.h (renamed from sources/shiboken2/ApiExtractor/parser/dumptree.h)37
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.cpp150
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.h (renamed from sources/shiboken2/ApiExtractor/parser/compiler_utils.h)34
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp272
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangparser.h93
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp227
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangutils.h101
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/compilersupport.cpp202
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/compilersupport.h (renamed from sources/shiboken2/ApiExtractor/parser/list.cpp)15
-rw-r--r--sources/shiboken2/ApiExtractor/doc/conf.py.in2
-rw-r--r--sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst5
-rw-r--r--sources/shiboken2/ApiExtractor/docparser.cpp83
-rw-r--r--sources/shiboken2/ApiExtractor/docparser.h22
-rw-r--r--sources/shiboken2/ApiExtractor/doxygenparser.cpp40
-rw-r--r--sources/shiboken2/ApiExtractor/doxygenparser.h6
-rw-r--r--sources/shiboken2/ApiExtractor/fileout.cpp16
-rw-r--r--sources/shiboken2/ApiExtractor/generator.qrc5
-rw-r--r--sources/shiboken2/ApiExtractor/graph.cpp3
-rw-r--r--sources/shiboken2/ApiExtractor/header_paths.h (renamed from sources/shiboken2/ApiExtractor/parser/codemodel_finder.h)67
-rw-r--r--sources/shiboken2/ApiExtractor/include.h4
-rw-r--r--sources/shiboken2/ApiExtractor/parser/ast.cpp38
-rw-r--r--sources/shiboken2/ApiExtractor/parser/ast.h884
-rw-r--r--sources/shiboken2/ApiExtractor/parser/binder.cpp866
-rw-r--r--sources/shiboken2/ApiExtractor/parser/binder.h133
-rw-r--r--sources/shiboken2/ApiExtractor/parser/class_compiler.cpp71
-rw-r--r--sources/shiboken2/ApiExtractor/parser/class_compiler.h77
-rw-r--r--sources/shiboken2/ApiExtractor/parser/codemodel.cpp80
-rw-r--r--sources/shiboken2/ApiExtractor/parser/codemodel.h65
-rw-r--r--sources/shiboken2/ApiExtractor/parser/codemodel_finder.cpp103
-rw-r--r--sources/shiboken2/ApiExtractor/parser/codemodel_fwd.h28
-rw-r--r--sources/shiboken2/ApiExtractor/parser/compiler_utils.cpp55
-rw-r--r--sources/shiboken2/ApiExtractor/parser/control.cpp135
-rw-r--r--sources/shiboken2/ApiExtractor/parser/control.h165
-rw-r--r--sources/shiboken2/ApiExtractor/parser/declarator_compiler.cpp167
-rw-r--r--sources/shiboken2/ApiExtractor/parser/declarator_compiler.h101
-rw-r--r--sources/shiboken2/ApiExtractor/parser/default_visitor.cpp464
-rw-r--r--sources/shiboken2/ApiExtractor/parser/default_visitor.h123
-rw-r--r--sources/shiboken2/ApiExtractor/parser/dumptree.cpp131
-rw-r--r--sources/shiboken2/ApiExtractor/parser/lexer.cpp1726
-rw-r--r--sources/shiboken2/ApiExtractor/parser/lexer.h295
-rw-r--r--sources/shiboken2/ApiExtractor/parser/list.h105
-rw-r--r--sources/shiboken2/ApiExtractor/parser/name_compiler.cpp139
-rw-r--r--sources/shiboken2/ApiExtractor/parser/parser.cpp4075
-rw-r--r--sources/shiboken2/ApiExtractor/parser/parser.h204
-rw-r--r--sources/shiboken2/ApiExtractor/parser/r++.macros28
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp-allocator.h29
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/builtin-macros.cpp28
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-cctype.h62
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-configuration86
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-engine-bits.h1300
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-engine.h288
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-environment.h144
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-fwd.h44
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-internal.h122
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-iterator.h99
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-macro-expander.h356
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-macro.h77
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-qt-configuration24
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-scanner.h318
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-string.h112
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp-symbol.h97
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/pp.h96
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.cpp164
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.h70
-rw-r--r--sources/shiboken2/ApiExtractor/parser/rxx_allocator.h146
-rw-r--r--sources/shiboken2/ApiExtractor/parser/smallobject.cpp33
-rw-r--r--sources/shiboken2/ApiExtractor/parser/smallobject.h58
-rw-r--r--sources/shiboken2/ApiExtractor/parser/symbol.h127
-rw-r--r--sources/shiboken2/ApiExtractor/parser/tokens.cpp256
-rw-r--r--sources/shiboken2/ApiExtractor/parser/tokens.h152
-rw-r--r--sources/shiboken2/ApiExtractor/parser/type_compiler.cpp134
-rw-r--r--sources/shiboken2/ApiExtractor/parser/type_compiler.h76
-rw-r--r--sources/shiboken2/ApiExtractor/parser/visitor.cpp127
-rw-r--r--sources/shiboken2/ApiExtractor/parser/visitor.h145
-rw-r--r--sources/shiboken2/ApiExtractor/qtdocparser.cpp160
-rw-r--r--sources/shiboken2/ApiExtractor/qtdocparser.h6
-rw-r--r--sources/shiboken2/ApiExtractor/reporthandler.cpp12
-rw-r--r--sources/shiboken2/ApiExtractor/reporthandler.h2
-rw-r--r--sources/shiboken2/ApiExtractor/tests/CMakeLists.txt1
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp91
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp6
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp58
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testarrayargument.h1
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testconversionoperator.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testenum.cpp10
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testextrainclude.cpp4
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testimplicitconversions.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testmodifydocumentation.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testmodifyfunction.cpp20
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testmodifyfunction.h1
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testmultipleinheritance.cpp3
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testremoveoperatormethod.cpp3
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testreverseoperators.cpp5
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testtemplates.cpp1
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testutil.h16
-rw-r--r--sources/shiboken2/ApiExtractor/typedatabase.cpp248
-rw-r--r--sources/shiboken2/ApiExtractor/typedatabase.h37
-rw-r--r--sources/shiboken2/ApiExtractor/typedatabase_typedefs.h (renamed from sources/shiboken2/ApiExtractor/asttoxml.h)29
-rw-r--r--sources/shiboken2/ApiExtractor/typeparser.cpp46
-rw-r--r--sources/shiboken2/ApiExtractor/typeparser.h9
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem.cpp739
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem.h620
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem_p.h3
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem_typedefs.h21
-rw-r--r--sources/shiboken2/CMakeLists.txt107
-rw-r--r--sources/shiboken2/data/Shiboken2Config.cmake.in2
-rw-r--r--sources/shiboken2/doc/conf.py.in6
-rw-r--r--sources/shiboken2/ext/sparsehash/AUTHORS2
-rw-r--r--sources/shiboken2/ext/sparsehash/COPYING28
-rw-r--r--sources/shiboken2/ext/sparsehash/google/dense_hash_map310
-rw-r--r--sources/shiboken2/ext/sparsehash/google/dense_hash_set287
-rw-r--r--sources/shiboken2/ext/sparsehash/google/sparsehash/densehashtable.h1062
-rw-r--r--sources/shiboken2/ext/sparsehash/google/sparsehash/sparseconfig.h45
-rw-r--r--sources/shiboken2/ext/sparsehash/google/type_traits.h250
-rw-r--r--sources/shiboken2/generator/generator.cpp99
-rw-r--r--sources/shiboken2/generator/generator.h14
-rw-r--r--sources/shiboken2/generator/main.cpp221
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp956
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.h49
-rw-r--r--sources/shiboken2/generator/shiboken2/cppgenerator.cpp528
-rw-r--r--sources/shiboken2/generator/shiboken2/cppgenerator.h14
-rw-r--r--sources/shiboken2/generator/shiboken2/headergenerator.cpp82
-rw-r--r--sources/shiboken2/generator/shiboken2/headergenerator.h10
-rw-r--r--sources/shiboken2/generator/shiboken2/overloaddata.cpp146
-rw-r--r--sources/shiboken2/generator/shiboken2/overloaddata.h14
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.cpp533
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.h28
-rw-r--r--sources/shiboken2/header.COMM20
-rw-r--r--sources/shiboken2/header.LGPL-ONLY22
-rw-r--r--sources/shiboken2/header.LGPL2133
-rw-r--r--sources/shiboken2/header.LGPL336
-rw-r--r--sources/shiboken2/header.LGPL3-COMM28
-rw-r--r--sources/shiboken2/libshiboken/CMakeLists.txt44
-rw-r--r--sources/shiboken2/libshiboken/basewrapper.cpp43
-rw-r--r--sources/shiboken2/libshiboken/basewrapper.h22
-rw-r--r--sources/shiboken2/libshiboken/bindingmanager.cpp9
-rw-r--r--sources/shiboken2/libshiboken/sbkarrayconverter.cpp289
-rw-r--r--sources/shiboken2/libshiboken/sbkarrayconverter.h171
-rw-r--r--sources/shiboken2/libshiboken/sbkarrayconverter_p.h62
-rw-r--r--sources/shiboken2/libshiboken/sbkconverter.cpp25
-rw-r--r--sources/shiboken2/libshiboken/sbkconverter.h3
-rw-r--r--sources/shiboken2/libshiboken/sbkconverter_p.h9
-rw-r--r--sources/shiboken2/libshiboken/sbkenum.cpp13
-rw-r--r--sources/shiboken2/libshiboken/sbkenum.h2
-rw-r--r--sources/shiboken2/libshiboken/sbkmodule.cpp19
-rw-r--r--sources/shiboken2/libshiboken/sbknumpyarrayconverter.cpp308
-rw-r--r--sources/shiboken2/libshiboken/shiboken.h1
-rw-r--r--sources/shiboken2/shiboken_version.py41
-rw-r--r--sources/shiboken2/tests/dumpcodemodel/main.cpp23
-rw-r--r--sources/shiboken2/tests/libother/otherderived.cpp3
-rw-r--r--sources/shiboken2/tests/libother/otherderived.h15
-rw-r--r--sources/shiboken2/tests/libsample/abstract.h1
-rw-r--r--sources/shiboken2/tests/libsample/derived.cpp6
-rw-r--r--sources/shiboken2/tests/libsample/derived.h19
-rw-r--r--sources/shiboken2/tests/libsample/functions.cpp41
-rw-r--r--sources/shiboken2/tests/libsample/functions.h11
-rw-r--r--sources/shiboken2/tests/libsample/multiple_derived.h10
-rw-r--r--sources/shiboken2/tests/libsample/objecttype.h10
-rw-r--r--sources/shiboken2/tests/libsample/objecttypelayout.h4
-rw-r--r--sources/shiboken2/tests/libsample/photon.h2
-rw-r--r--sources/shiboken2/tests/libsample/samplenamespace.h4
-rw-r--r--sources/shiboken2/tests/libsample/virtualmethods.cpp19
-rw-r--r--sources/shiboken2/tests/libsample/virtualmethods.h18
-rw-r--r--sources/shiboken2/tests/samplebinding/CMakeLists.txt3
-rw-r--r--sources/shiboken2/tests/samplebinding/array_numpy_test.py64
-rw-r--r--sources/shiboken2/tests/samplebinding/array_sequence_test.py53
-rw-r--r--sources/shiboken2/tests/samplebinding/enum_test.py5
-rw-r--r--sources/shiboken2/tests/samplebinding/typesystem_sample.xml18
-rw-r--r--sources/shiboken2/tests/test_generator/dummygenerator.cpp3
-rw-r--r--testing/runner.py16
-rw-r--r--tests/QtQml/qquickitem_grabToImage.py79
-rw-r--r--tests/QtQml/qquickitem_grabToImage.qml (renamed from sources/shiboken2/ApiExtractor/parser/name_compiler.h)75
-rw-r--r--utils.py109
m---------wiki0
698 files changed, 58947 insertions, 23671 deletions
diff --git a/.gitmodules b/.gitmodules
index 9a97d3b04..46377b89a 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,11 +1,4 @@
[submodule "sources/pyside2-tools"]
path = sources/pyside2-tools
- branch = 5.6
+ branch = 5.9
url = ../pyside-tools.git
-[submodule "sources/pyside2-examples"]
- path = sources/pyside2-examples
- branch = 5.6
- url = ../examples.git
-[submodule "wiki"]
- path = wiki
- url = https://github.com/PySide/pyside2.wiki.git
diff --git a/.qt-license-check.exclude b/.qt-license-check.exclude
deleted file mode 100644
index f42def186..000000000
--- a/.qt-license-check.exclude
+++ /dev/null
@@ -1,3 +0,0 @@
-License checker is excluded with Pyside in 5.6 branch.
-Do not merge this file to other branch.
-
diff --git a/MANIFEST.in b/MANIFEST.in
index 87d6b1cbe..dd79b2380 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -17,14 +17,10 @@ recursive-include sources/patchelf **
recursive-include sources/shiboken2 **
recursive-include sources/pyside2 **
recursive-include sources/pyside2-tools **
-recursive-include sources/pyside2-examples **
-recursive-exclude sources/pyside2-examples/examples/hyperui **
-recursive-exclude sources/pyside2examples/mobility **
# ignore .git
recursive-exclude sources/shiboken2/.git **
recursive-exclude sources/pyside2/.git **
recursive-exclude sources/pyside2-tools/.git **
-recursive-exclude sources/pyside2-examples/.git **
# PySide package
recursive-include pyside_package/PySide2 **
diff --git a/README.md b/README.md
index e654276ce..cde05940d 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,53 @@
-#PySide2
+# PySide2
-| Windows | Linux |
-|---------|-------|
-| [![AppVeyor](https://img.shields.io/appveyor/ci/techtonik/pyside2-setup.svg)](https://ci.appveyor.com/project/techtonik/pyside2-setup) | [![Travis CI](https://img.shields.io/travis/PySide/pyside2-setup.svg)](https://travis-ci.org/PySide/pyside2-setup) |
+### Introduction
+PySide is the [Python Qt bindings project](http://wiki.qt.io/PySide2), providing
+access to the complete Qt 5.x framework as well as to generator tools for rapidly
+generating bindings for any C++ libraries.
-###Introduction
+The PySide project is developed in the open, with all facilities you'd expect
+from any modern OSS project such as all code in a git repository and an open
+design process. We welcome any contribution conforming to the
+[Qt Contribution Agreement](https://www.qt.io/contributionagreement/).
+PySide 2 supports Qt5. For building, please read about
+[getting started](https://wiki.qt.io/PySide2_GettingStarted).
+Then download the sources by running
+ git clone https://code.qt.io/pyside/pyside-setup
-PySide is the [Python Qt bindings project](http://wiki.qt.io/PySide2), providing access the complete Qt 5.x framework
-as well as to generator tools for rapidly generating bindings for any C++ libraries.
+### Building
-The PySide project is developed in the open, with all facilities you'd expect
-from any modern OSS project such as all code in a git repository and an open design process. We welcome
-any contribution conforming to the [Qt Contribution Agreement](https://www.qt.io/contributionagreement/).
+#### Dependencies
+
+PySide versions following 5.6 use a C++ parser based on
+[Clang](http://clang.org/). The Clang library (C-bindings), version 3.9 or
+higher is required for building. Prebuilt versions of it can be downloaded from
+[download.qt.io](http://download.qt.io/development_releases/prebuilt/libclang/).
+After unpacking the archive, set the environment variable *LLVM_INSTALL_DIR* to
+point to the folder containing the *include* and *lib* directories of Clang:
-PySide 2 supports Qt5. For building, please read about [getting the dependencies](https://github.com/PySide/pyside2/wiki/Dependencies). Then download the sources by running `git clone --recursive https://code.qt.io/pyside/pyside-setup`.
+ 7z x .../libclang-release_39-linux-Rhel7.2-gcc5.3-x86_64.7z
+ export LLVM_INSTALL_DIR=$PWD/libclang
-###Building
+On Windows:
-####Windows
-On Windows, once you have gotten the dependencies and the source, `cd pyside2-setup.git` to enter the directory and then:
-```
-python setup.py install --qmake=\path\to\bin\qmake --cmake=\path\to\bin\cmake --openssl=\path\to\openssl\bin
-```
+ 7z x .../libclang-release_39-windows-vs2015_64.7z
+ SET LLVM_INSTALL_DIR=%CD%\libclang
-####Linux
+#### Build Instructions
+You might consider using a virtual environment as described at
+[getting started](https://wiki.qt.io/PySide2_GettingStarted).
You should be able to build:
-```
-python setup.py install --qmake=/path/to/bin/qmake --cmake=/path/to/bin/cmake --openssl=/path/to/openssl/bin
-```
+ cd pyside-setup
+ python setup.py install
+The setup script will try to find the location of the qmake tool of the Qt
+version to be used and the cmake build tool in the path. Non-standard
+locations can be specified by the *--qmake=path_to_qmake* or
+*--cmake=path_to_cmake* command line options.
diff --git a/build_history/blacklist.txt b/build_history/blacklist.txt
index 9192294e5..5da9fc427 100644
--- a/build_history/blacklist.txt
+++ b/build_history/blacklist.txt
@@ -10,6 +10,8 @@
linux
darwin
win32
+[Qt3DExtras::qt3dextras_test]
+ linux
[QtCore::qfile_test]
win32
darwin py3
@@ -66,6 +68,10 @@
win32
linux
darwin
+# PYSIDE-474
+[QtWebEngineWidgets::pyside-474-qtwebengineview]
+ py2
+ py3
[QtCore::thread_signals_test]
win32
linux
diff --git a/checklibs.py b/checklibs.py
index ff4d51ae8..172508706 100644
--- a/checklibs.py
+++ b/checklibs.py
@@ -1,3 +1,42 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
#!/usr/bin/env python
#
# checklibs.py
diff --git a/docs/conf.py b/docs/conf.py
index 0af22dbcb..61e4c7132 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,4 +1,42 @@
# -*- coding: utf-8 -*-
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
#
# PySide documentation build configuration file, created by
# sphinx-quickstart on Mon May 12 22:14:54 2014.
@@ -147,10 +185,6 @@ html_static_path = ['_static']
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
diff --git a/docs/make.bat b/docs/make.bat
index 53fb034ca..3db37e4fd 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -1,3 +1,42 @@
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Copyright (C) 2017 The Qt Company Ltd.
+:: Contact: https://www.qt.io/licensing/
+::
+:: This file is part of PySide2.
+::
+:: $QT_BEGIN_LICENSE:LGPL$
+:: Commercial License Usage
+:: Licensees holding valid commercial Qt licenses may use this file in
+:: accordance with the commercial license agreement provided with the
+:: Software or, alternatively, in accordance with the terms contained in
+:: a written agreement between you and The Qt Company. For licensing terms
+:: and conditions see https://www.qt.io/terms-conditions. For further
+:: information use the contact form at https://www.qt.io/contact-us.
+::
+:: GNU Lesser General Public License Usage
+:: Alternatively, this file may be used under the terms of the GNU Lesser
+:: General Public License version 3 as published by the Free Software
+:: Foundation and appearing in the file LICENSE.LGPL3 included in the
+:: packaging of this file. Please review the following information to
+:: ensure the GNU Lesser General Public License version 3 requirements
+:: will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+::
+:: GNU General Public License Usage
+:: Alternatively, this file may be used under the terms of the GNU
+:: General Public License version 2.0 or (at your option) the GNU General
+:: Public license version 3 or any later version approved by the KDE Free
+:: Qt Foundation. The licenses are as published by the Free Software
+:: Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+:: included in the packaging of this file. Please review the following
+:: information to ensure the GNU General Public License requirements will
+:: be met: https://www.gnu.org/licenses/gpl-2.0.html and
+:: https://www.gnu.org/licenses/gpl-3.0.html.
+::
+:: $QT_END_LICENSE$
+::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#
+
@ECHO OFF
REM Command file for Sphinx documentation
diff --git a/examples/3d/simple3d.py b/examples/3d/simple3d.py
new file mode 100644
index 000000000..a34d19821
--- /dev/null
+++ b/examples/3d/simple3d.py
@@ -0,0 +1,164 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2018 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 qt3d/simple-cpp example from Qt v5.x"""
+
+import sys
+from PySide2.QtCore import(Property, QObject, QPropertyAnimation, Signal, Slot)
+from PySide2.QtGui import (QGuiApplication, QMatrix4x4, QQuaternion, QVector3D, QWindow)
+from PySide2.Qt3DCore import (Qt3DCore)
+from PySide2.Qt3DRender import (Qt3DRender)
+from PySide2.Qt3DExtras import (Qt3DExtras)
+
+class OrbitTransformController(QObject):
+ def __init__(self, parent):
+ super(OrbitTransformController, self).__init__(parent)
+ self._target = None
+ self._matrix = QMatrix4x4()
+ self._radius = 1
+ self._angle = 0
+
+ def setTarget(self, t):
+ self._target = t
+
+ def getTarget(self):
+ return self._target
+
+ def setRadius(self, radius):
+ if self._radius != radius:
+ self._radius = radius
+ self.updateMatrix()
+ self.radiusChanged.emit()
+
+ def getRadius(self):
+ return self._radius
+
+ def setAngle(self, angle):
+ if self._angle != angle:
+ self._angle = angle
+ self.updateMatrix()
+ self.angleChanged.emit()
+
+ def getAngle(self):
+ return self._angle
+
+ def updateMatrix(self):
+ self._matrix.setToIdentity();
+ self._matrix.rotate(self._angle, QVector3D(0, 1, 0))
+ self._matrix.translate(self._radius, 0, 0)
+ if self._target is not None:
+ self._target.setMatrix(self._matrix)
+
+ angleChanged = Signal()
+ radiusChanged = Signal()
+ angle = Property(float, getAngle, setAngle, notify=angleChanged)
+ radius = Property(float, getRadius, setRadius, notify=radiusChanged)
+
+class Window(Qt3DExtras.Qt3DWindow):
+ def __init__(self):
+ super(Window, self).__init__()
+
+ # Camera
+ self.camera().lens().setPerspectiveProjection(45, 16 / 9, 0.1, 1000)
+ self.camera().setPosition(QVector3D(0, 0, 40))
+ self.camera().setViewCenter(QVector3D(0, 0, 0))
+
+ # For camera controls
+ self.createScene()
+ self.camController = Qt3DExtras.QOrbitCameraController(self.rootEntity)
+ self.camController.setLinearSpeed(50)
+ self.camController.setLookSpeed(180)
+ self.camController.setCamera(self.camera())
+
+ self.setRootEntity(self.rootEntity)
+
+ def createScene(self):
+ # Root entity
+ self.rootEntity = Qt3DCore.QEntity()
+
+ # Material
+ self.material = Qt3DExtras.QPhongMaterial(self.rootEntity)
+
+ # Torus
+ self.torusEntity = Qt3DCore.QEntity(self.rootEntity)
+ self.torusMesh = Qt3DExtras.QTorusMesh()
+ self.torusMesh.setRadius(5)
+ self.torusMesh.setMinorRadius(1)
+ self.torusMesh.setRings(100)
+ self.torusMesh.setSlices(20)
+
+ self.torusTransform = Qt3DCore.QTransform()
+ self.torusTransform.setScale3D(QVector3D(1.5, 1, 0.5))
+ self.torusTransform.setRotation(QQuaternion.fromAxisAndAngle(QVector3D(1, 0, 0), 45))
+
+ self.torusEntity.addComponent(self.torusMesh)
+ self.torusEntity.addComponent(self.torusTransform)
+ self.torusEntity.addComponent(self.material)
+
+ # Sphere
+ self.sphereEntity = Qt3DCore.QEntity(self.rootEntity)
+ self.sphereMesh = Qt3DExtras.QSphereMesh()
+ self.sphereMesh.setRadius(3)
+
+ self.sphereTransform = Qt3DCore.QTransform()
+ self.controller = OrbitTransformController(self.sphereTransform)
+ self.controller.setTarget(self.sphereTransform)
+ self.controller.setRadius(20)
+
+ self.sphereRotateTransformAnimation = QPropertyAnimation(self.sphereTransform)
+ self.sphereRotateTransformAnimation.setTargetObject(self.controller)
+ self.sphereRotateTransformAnimation.setPropertyName("angle")
+ self.sphereRotateTransformAnimation.setStartValue(0)
+ self.sphereRotateTransformAnimation.setEndValue(360)
+ self.sphereRotateTransformAnimation.setDuration(10000)
+ self.sphereRotateTransformAnimation.setLoopCount(-1)
+ self.sphereRotateTransformAnimation.start()
+
+ self.sphereEntity.addComponent(self.sphereMesh)
+ self.sphereEntity.addComponent(self.sphereTransform)
+ self.sphereEntity.addComponent(self.material)
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = Window()
+ view.show()
+ sys.exit(app.exec_())
diff --git a/examples/axcontainer/axviewer.py b/examples/axcontainer/axviewer.py
new file mode 100644
index 000000000..cb3d4c0de
--- /dev/null
+++ b/examples/axcontainer/axviewer.py
@@ -0,0 +1,84 @@
+#!/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 Active Qt Viewer example"""
+
+import sys
+from PySide2.QtAxContainer import QAxSelect, QAxWidget
+from PySide2.QtGui import QKeySequence
+from PySide2.QtWidgets import (QAction, qApp, QApplication, QDialog, QFileDialog,
+ QMainWindow, QMenu, QMenuBar, QMessageBox, QToolBar)
+
+class MainWindow(QMainWindow):
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ toolBar = QToolBar()
+ self.addToolBar(toolBar)
+ fileMenu = self.menuBar().addMenu("&File")
+ loadAction = QAction("Load...", self, shortcut="Ctrl+L", triggered=self.load)
+ fileMenu.addAction(loadAction)
+ toolBar.addAction(loadAction)
+ exitAction = QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close)
+ fileMenu.addAction(exitAction)
+
+ aboutMenu = self.menuBar().addMenu("&About")
+ aboutQtAct = QAction("About &Qt", self, triggered=qApp.aboutQt)
+ aboutMenu.addAction(aboutQtAct)
+ self.axWidget = QAxWidget()
+ self.setCentralWidget(self.axWidget)
+
+ def load(self):
+ axSelect = QAxSelect(self)
+ if axSelect.exec_() == QDialog.Accepted:
+ clsid = axSelect.clsid()
+ if not self.axWidget.setControl(clsid):
+ QMessageBox.warning(self, "AxViewer", "Unable to load " + clsid + ".")
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2)
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/charts/audio.py b/examples/charts/audio.py
new file mode 100644
index 000000000..94da12cfd
--- /dev/null
+++ b/examples/charts/audio.py
@@ -0,0 +1,128 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2018 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 charts/audio example from Qt v5.x"""
+
+import os
+import sys
+from PySide2.QtCharts import QtCharts
+from PySide2.QtCore import QPointF, QRect, QSize
+from PySide2.QtMultimedia import (QAudio, QAudioDeviceInfo, QAudioFormat,
+ QAudioInput)
+from PySide2.QtWidgets import QApplication, QMainWindow, QMessageBox
+
+sampleCount = 2000
+resolution = 4
+
+class MainWindow(QMainWindow):
+ def __init__(self, device):
+ super(MainWindow, self).__init__()
+
+ self.series = QtCharts.QLineSeries()
+ self.chart = QtCharts.QChart()
+ self.chart.addSeries(self.series)
+ self.axisX = QtCharts.QValueAxis()
+ self.axisX.setRange(0, sampleCount)
+ self.axisX.setLabelFormat("%g")
+ self.axisX.setTitleText("Samples")
+ self.axisY = QtCharts.QValueAxis()
+ self.axisY.setRange(-1, 1)
+ self.axisY.setTitleText("Audio level")
+ self.chart.setAxisX(self.axisX, self.series)
+ self.chart.setAxisY(self.axisY, self.series)
+ self.chart.legend().hide()
+ self.chart.setTitle("Data from the microphone ({})".format(device.deviceName()))
+
+ formatAudio = QAudioFormat()
+ formatAudio.setSampleRate(8000)
+ formatAudio.setChannelCount(1)
+ formatAudio.setSampleSize(8)
+ formatAudio.setCodec("audio/pcm")
+ formatAudio.setByteOrder(QAudioFormat.LittleEndian)
+ formatAudio.setSampleType(QAudioFormat.UnSignedInt)
+
+ self.audioInput = QAudioInput(device, formatAudio, self)
+ self.ioDevice = self.audioInput.start()
+ self.ioDevice.readyRead.connect(self._readyRead)
+
+ self.chartView = QtCharts.QChartView(self.chart)
+ self.setCentralWidget(self.chartView)
+
+ self.buffer = [QPointF(x, 0) for x in range(sampleCount)]
+ self.series.append(self.buffer)
+
+ def closeEvent(self, event):
+ if self.audioInput is not None:
+ self.audioInput.stop()
+ event.accept()
+
+ def _readyRead(self):
+ data = self.ioDevice.readAll()
+ availableSamples = data.size() // resolution
+ start = 0
+ if (availableSamples < sampleCount):
+ start = sampleCount - availableSamples
+ for s in range(start):
+ self.buffer[s].setY(self.buffer[s + availableSamples].y())
+
+ dataIndex = 0
+ for s in range(start, sampleCount):
+ value = (ord(data[dataIndex]) - 128) / 128
+ self.buffer[s].setY(value)
+ dataIndex = dataIndex + resolution
+ self.series.replace(self.buffer)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ inputDevice = QAudioDeviceInfo.defaultInputDevice()
+ if (inputDevice.isNull()):
+ QMessageBox.warning(None, "audio", "There is no audio input device available.")
+ sys.exit(-1)
+
+ mainWin = MainWindow(inputDevice)
+ mainWin.setWindowTitle("audio")
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ size = availableGeometry.height() * 3 / 4
+ mainWin.resize(size, size)
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/charts/memoryusage.py b/examples/charts/memoryusage.py
new file mode 100644
index 000000000..c0e0a38dd
--- /dev/null
+++ b/examples/charts/memoryusage.py
@@ -0,0 +1,128 @@
+#!/usr/bin/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 Charts example: Simple memory usage viewer"""
+
+import os
+import sys
+from PySide2.QtCore import QRect, QSize, QProcess
+from PySide2.QtWidgets import QApplication, QMainWindow
+from PySide2.QtCharts import QtCharts
+
+def runProcess(command, arguments):
+ process = QProcess()
+ process.start(command, arguments)
+ process.waitForFinished()
+ result = []
+ for line in str(process.readAllStandardOutput()).split(os.linesep):
+ result.append(line)
+ return result
+
+def getMemoryUsage():
+ result = []
+ if sys.platform == 'win32':
+ # Windows: Obtain memory usage in KB from 'tasklist'
+ for line in runProcess('tasklist', [])[3:]:
+ if len(line) >= 74:
+ command = line[0:23].strip()
+ if command.endswith('.exe'):
+ command = command[0:len(command) - 4]
+ memoryUsage = float(line[64:74].strip().replace(',', '').replace('.', ''))
+ legend = ''
+ if memoryUsage > 10240:
+ legend = '{} {}M'.format(command, round(memoryUsage / 1024))
+ else:
+ legend = '{} {}K'.format(command, round(memoryUsage))
+ result.append([legend, memoryUsage])
+ else:
+ # Unix: Obtain memory usage percentage from 'ps'
+ psOptions = ['-e', 'v']
+ memoryColumn = 8
+ commandColumn = 9
+ if sys.platform == 'darwin':
+ psOptions = ['-e', '-v']
+ memoryColumn = 11
+ commandColumn = 12
+ for line in runProcess('ps', psOptions)[1:]:
+ tokens = line.split(None)
+ if len(tokens) > commandColumn: # Percentage and command
+ command = tokens[commandColumn]
+ if not command.startswith('['):
+ command = os.path.basename(command)
+ memoryUsage = round(float(tokens[memoryColumn].replace(',', '.')))
+ legend = '{} {}%'.format(command, memoryUsage)
+ result.append([legend, memoryUsage])
+
+ result.sort(key = lambda x: x[1], reverse=True)
+ return result
+
+class MainWindow(QMainWindow):
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.setWindowTitle('Memory Usage')
+
+ memoryUsage = getMemoryUsage()
+ if len(memoryUsage) > 5:
+ memoryUsage = memoryUsage[0:4]
+
+ self.series = QtCharts.QPieSeries()
+ for item in memoryUsage:
+ self.series.append(item[0], item[1]);
+
+ slice = self.series.slices()[0]
+ slice.setExploded();
+ slice.setLabelVisible();
+ self.chart = QtCharts.QChart()
+ self.chart.addSeries(self.series);
+ self.chartView = QtCharts.QChartView(self.chart)
+ self.setCentralWidget(self.chartView)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ size = availableGeometry.height() * 3 / 4
+ mainWin.resize(size, size)
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/corelib/threads/mandelbrot.py b/examples/corelib/threads/mandelbrot.py
new file mode 100755
index 000000000..53da3d48d
--- /dev/null
+++ b/examples/corelib/threads/mandelbrot.py
@@ -0,0 +1,349 @@
+#!/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 corelib/threads/mandelbrot example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import (Signal, QMutex, QMutexLocker, QPoint, QSize, Qt,
+ QThread, QWaitCondition)
+from PySide2.QtGui import QColor, QImage, QPainter, QPixmap, qRgb
+from PySide2.QtWidgets import QApplication, QWidget
+
+
+DefaultCenterX = -0.647011
+DefaultCenterY = -0.0395159
+DefaultScale = 0.00403897
+
+ZoomInFactor = 0.8
+ZoomOutFactor = 1 / ZoomInFactor
+ScrollStep = 20
+
+
+class RenderThread(QThread):
+ ColormapSize = 512
+
+ renderedImage = Signal(QImage, float)
+
+ def __init__(self, parent=None):
+ super(RenderThread, self).__init__(parent)
+
+ self.mutex = QMutex()
+ self.condition = QWaitCondition()
+ self.centerX = 0.0
+ self.centerY = 0.0
+ self.scaleFactor = 0.0
+ self.resultSize = QSize()
+ self.colormap = []
+
+ self.restart = False
+ self.abort = False
+
+ for i in range(RenderThread.ColormapSize):
+ self.colormap.append(self.rgbFromWaveLength(380.0 + (i * 400.0 / RenderThread.ColormapSize)))
+
+ def stop(self):
+ self.mutex.lock()
+ self.abort = True
+ self.condition.wakeOne()
+ self.mutex.unlock()
+
+ self.wait(2000)
+
+ def render(self, centerX, centerY, scaleFactor, resultSize):
+ locker = QMutexLocker(self.mutex)
+
+ self.centerX = centerX
+ self.centerY = centerY
+ self.scaleFactor = scaleFactor
+ self.resultSize = resultSize
+
+ if not self.isRunning():
+ self.start(QThread.LowPriority)
+ else:
+ self.restart = True
+ self.condition.wakeOne()
+
+ def run(self):
+ while True:
+ self.mutex.lock()
+ resultSize = self.resultSize
+ scaleFactor = self.scaleFactor
+ centerX = self.centerX
+ centerY = self.centerY
+ self.mutex.unlock()
+
+ halfWidth = resultSize.width() // 2
+ halfHeight = resultSize.height() // 2
+ image = QImage(resultSize, QImage.Format_RGB32)
+
+ NumPasses = 8
+ curpass = 0
+
+ while curpass < NumPasses:
+ MaxIterations = (1 << (2 * curpass + 6)) + 32
+ Limit = 4
+ allBlack = True
+
+ for y in range(-halfHeight, halfHeight):
+ if self.restart:
+ break
+ if self.abort:
+ return
+
+ ay = 1j * (centerY + (y * scaleFactor))
+
+ for x in range(-halfWidth, halfWidth):
+ c0 = centerX + (x * scaleFactor) + ay
+ c = c0
+ numIterations = 0
+
+ while numIterations < MaxIterations:
+ numIterations += 1
+ c = c*c + c0
+ if abs(c) >= Limit:
+ break
+ numIterations += 1
+ c = c*c + c0
+ if abs(c) >= Limit:
+ break
+ numIterations += 1
+ c = c*c + c0
+ if abs(c) >= Limit:
+ break
+ numIterations += 1
+ c = c*c + c0
+ if abs(c) >= Limit:
+ break
+
+ if numIterations < MaxIterations:
+ image.setPixel(x + halfWidth, y + halfHeight,
+ self.colormap[numIterations % RenderThread.ColormapSize])
+ allBlack = False
+ else:
+ image.setPixel(x + halfWidth, y + halfHeight, qRgb(0, 0, 0))
+
+ if allBlack and curpass == 0:
+ curpass = 4
+ else:
+ if not self.restart:
+ self.renderedImage.emit(image, scaleFactor)
+ curpass += 1
+
+ self.mutex.lock()
+ if not self.restart:
+ self.condition.wait(self.mutex)
+ self.restart = False
+ self.mutex.unlock()
+
+ def rgbFromWaveLength(self, wave):
+ r = 0.0
+ g = 0.0
+ b = 0.0
+
+ if wave >= 380.0 and wave <= 440.0:
+ r = -1.0 * (wave - 440.0) / (440.0 - 380.0)
+ b = 1.0
+ elif wave >= 440.0 and wave <= 490.0:
+ g = (wave - 440.0) / (490.0 - 440.0)
+ b = 1.0
+ elif wave >= 490.0 and wave <= 510.0:
+ g = 1.0
+ b = -1.0 * (wave - 510.0) / (510.0 - 490.0)
+ elif wave >= 510.0 and wave <= 580.0:
+ r = (wave - 510.0) / (580.0 - 510.0)
+ g = 1.0
+ elif wave >= 580.0 and wave <= 645.0:
+ r = 1.0
+ g = -1.0 * (wave - 645.0) / (645.0 - 580.0)
+ elif wave >= 645.0 and wave <= 780.0:
+ r = 1.0
+
+ s = 1.0
+ if wave > 700.0:
+ s = 0.3 + 0.7 * (780.0 - wave) / (780.0 - 700.0)
+ elif wave < 420.0:
+ s = 0.3 + 0.7 * (wave - 380.0) / (420.0 - 380.0)
+
+ r = pow(r * s, 0.8)
+ g = pow(g * s, 0.8)
+ b = pow(b * s, 0.8)
+
+ return qRgb(r*255, g*255, b*255)
+
+
+class MandelbrotWidget(QWidget):
+ def __init__(self, parent=None):
+ super(MandelbrotWidget, self).__init__(parent)
+
+ self.thread = RenderThread()
+ self.pixmap = QPixmap()
+ self.pixmapOffset = QPoint()
+ self.lastDragPos = QPoint()
+
+ self.centerX = DefaultCenterX
+ self.centerY = DefaultCenterY
+ self.pixmapScale = DefaultScale
+ self.curScale = DefaultScale
+
+ self.thread.renderedImage.connect(self.updatePixmap)
+
+ self.setWindowTitle("Mandelbrot")
+ self.setCursor(Qt.CrossCursor)
+ self.resize(550, 400)
+
+ def paintEvent(self, event):
+ painter = QPainter(self)
+ painter.fillRect(self.rect(), Qt.black)
+
+ if self.pixmap.isNull():
+ painter.setPen(Qt.white)
+ painter.drawText(self.rect(), Qt.AlignCenter,
+ "Rendering initial image, please wait...")
+ return
+
+ if self.curScale == self.pixmapScale:
+ painter.drawPixmap(self.pixmapOffset, self.pixmap)
+ else:
+ scaleFactor = self.pixmapScale / self.curScale
+ newWidth = int(self.pixmap.width() * scaleFactor)
+ newHeight = int(self.pixmap.height() * scaleFactor)
+ newX = self.pixmapOffset.x() + (self.pixmap.width() - newWidth) / 2
+ newY = self.pixmapOffset.y() + (self.pixmap.height() - newHeight) / 2
+
+ painter.save()
+ painter.translate(newX, newY)
+ painter.scale(scaleFactor, scaleFactor)
+ exposed, _ = painter.matrix().inverted()
+ exposed = exposed.mapRect(self.rect()).adjusted(-1, -1, 1, 1)
+ painter.drawPixmap(exposed, self.pixmap, exposed)
+ painter.restore()
+
+ text = "Use mouse wheel or the '+' and '-' keys to zoom. Press and " \
+ "hold left mouse button to scroll."
+ metrics = painter.fontMetrics()
+ textWidth = metrics.width(text)
+
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(QColor(0, 0, 0, 127))
+ painter.drawRect((self.width() - textWidth) / 2 - 5, 0, textWidth + 10,
+ metrics.lineSpacing() + 5)
+ painter.setPen(Qt.white)
+ painter.drawText((self.width() - textWidth) / 2,
+ metrics.leading() + metrics.ascent(), text)
+
+ def resizeEvent(self, event):
+ self.thread.render(self.centerX, self.centerY, self.curScale, self.size())
+
+ def keyPressEvent(self, event):
+ if event.key() == Qt.Key_Plus:
+ self.zoom(ZoomInFactor)
+ elif event.key() == Qt.Key_Minus:
+ self.zoom(ZoomOutFactor)
+ elif event.key() == Qt.Key_Left:
+ self.scroll(-ScrollStep, 0)
+ elif event.key() == Qt.Key_Right:
+ self.scroll(+ScrollStep, 0)
+ elif event.key() == Qt.Key_Down:
+ self.scroll(0, -ScrollStep)
+ elif event.key() == Qt.Key_Up:
+ self.scroll(0, +ScrollStep)
+ else:
+ super(MandelbrotWidget, self).keyPressEvent(event)
+
+ def wheelEvent(self, event):
+ numDegrees = event.angleDelta().y() / 8
+ numSteps = numDegrees / 15.0
+ self.zoom(pow(ZoomInFactor, numSteps))
+
+ def mousePressEvent(self, event):
+ if event.buttons() == Qt.LeftButton:
+ self.lastDragPos = QPoint(event.pos())
+
+ def mouseMoveEvent(self, event):
+ if event.buttons() & Qt.LeftButton:
+ self.pixmapOffset += event.pos() - self.lastDragPos
+ self.lastDragPos = QPoint(event.pos())
+ self.update()
+
+ def mouseReleaseEvent(self, event):
+ if event.button() == Qt.LeftButton:
+ self.pixmapOffset += event.pos() - self.lastDragPos
+ self.lastDragPos = QPoint()
+
+ deltaX = (self.width() - self.pixmap.width()) / 2 - self.pixmapOffset.x()
+ deltaY = (self.height() - self.pixmap.height()) / 2 - self.pixmapOffset.y()
+ self.scroll(deltaX, deltaY)
+
+ def updatePixmap(self, image, scaleFactor):
+ if not self.lastDragPos.isNull():
+ return
+
+ self.pixmap = QPixmap.fromImage(image)
+ self.pixmapOffset = QPoint()
+ self.lastDragPosition = QPoint()
+ self.pixmapScale = scaleFactor
+ self.update()
+
+ def zoom(self, zoomFactor):
+ self.curScale *= zoomFactor
+ self.update()
+ self.thread.render(self.centerX, self.centerY, self.curScale,
+ self.size())
+
+ def scroll(self, deltaX, deltaY):
+ self.centerX += deltaX * self.curScale
+ self.centerY += deltaY * self.curScale
+ self.update()
+ self.thread.render(self.centerX, self.centerY, self.curScale,
+ self.size())
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ widget = MandelbrotWidget()
+ widget.show()
+ r = app.exec_()
+ widget.thread.stop()
+ sys.exit(r)
diff --git a/examples/corelib/tools/codecs/codecs.py b/examples/corelib/tools/codecs/codecs.py
new file mode 100755
index 000000000..15f7d9563
--- /dev/null
+++ b/examples/corelib/tools/codecs/codecs.py
@@ -0,0 +1,251 @@
+#!/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 widgets/tools/codecs example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+def codec_name(codec):
+ try:
+ # Python v3.
+ name = str(codec.name(), encoding='ascii')
+ except TypeError:
+ # Python v2.
+ name = str(codec.name())
+
+ return name
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.textEdit = QtWidgets.QTextEdit()
+ self.textEdit.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)
+ self.setCentralWidget(self.textEdit)
+
+ self.codecs = []
+ self.findCodecs()
+
+ self.previewForm = PreviewForm(self)
+ self.previewForm.setCodecList(self.codecs)
+
+ self.saveAsActs = []
+ self.createActions()
+ self.createMenus()
+
+ self.setWindowTitle("Codecs")
+ self.resize(500, 400)
+
+ def open(self):
+ fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self)
+ if fileName:
+ inFile = QtCore.QFile(fileName)
+ if not inFile.open(QtCore.QFile.ReadOnly):
+ QtWidgets.QMessageBox.warning(self, "Codecs",
+ "Cannot read file %s:\n%s" % (fileName, inFile.errorString()))
+ return
+
+ data = inFile.readAll()
+
+ self.previewForm.setEncodedData(data)
+ if self.previewForm.exec_():
+ self.textEdit.setPlainText(self.previewForm.decodedString())
+
+ def save(self):
+ fileName = QtWidgets.QFileDialog.getSaveFileName(self)
+ if fileName:
+ outFile = QtCore.QFile(fileName)
+ if not outFile.open(QtCore.QFile.WriteOnly|QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(self, "Codecs",
+ "Cannot write file %s:\n%s" % (fileName, outFile.errorString()))
+ return
+
+ action = self.sender()
+ codecName = action.data()
+
+ out = QtCore.QTextStream(outFile)
+ out.setCodec(codecName)
+ out << self.textEdit.toPlainText()
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About Codecs",
+ "The <b>Codecs</b> example demonstrates how to read and "
+ "write files using various encodings.")
+
+ def aboutToShowSaveAsMenu(self):
+ currentText = self.textEdit.toPlainText()
+
+ for action in self.saveAsActs:
+ codecName = str(action.data())
+ codec = QtCore.QTextCodec.codecForName(codecName)
+ action.setVisible(codec and codec.canEncode(currentText))
+
+ def findCodecs(self):
+ codecMap = []
+ iso8859RegExp = QtCore.QRegExp('ISO[- ]8859-([0-9]+).*')
+
+ for mib in QtCore.QTextCodec.availableMibs():
+ codec = QtCore.QTextCodec.codecForMib(mib)
+ sortKey = codec_name(codec).upper()
+ rank = 0
+
+ if sortKey.startswith('UTF-8'):
+ rank = 1
+ elif sortKey.startswith('UTF-16'):
+ rank = 2
+ elif iso8859RegExp.exactMatch(sortKey):
+ if len(iso8859RegExp.cap(1)) == 1:
+ rank = 3
+ else:
+ rank = 4
+ else:
+ rank = 5
+
+ codecMap.append((str(rank) + sortKey, codec))
+
+ codecMap.sort()
+ self.codecs = [item[-1] for item in codecMap]
+
+ def createActions(self):
+ self.openAct = QtWidgets.QAction("&Open...", self, shortcut="Ctrl+O",
+ triggered=self.open)
+
+ for codec in self.codecs:
+ name = codec_name(codec)
+
+ action = QtWidgets.QAction(name + '...', self, triggered=self.save)
+ action.setData(name)
+ self.saveAsActs.append(action)
+
+ 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.saveAsMenu = QtWidgets.QMenu("&Save As", self)
+ for action in self.saveAsActs:
+ self.saveAsMenu.addAction(action)
+
+ self.saveAsMenu.aboutToShow.connect(self.aboutToShowSaveAsMenu)
+
+ self.fileMenu = QtWidgets.QMenu("&File", self)
+ self.fileMenu.addAction(self.openAct)
+ self.fileMenu.addMenu(self.saveAsMenu)
+ self.fileMenu.addSeparator()
+ self.fileMenu.addAction(self.exitAct)
+
+ self.helpMenu = QtWidgets.QMenu("&Help", self)
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+ self.menuBar().addMenu(self.fileMenu)
+ self.menuBar().addSeparator()
+ self.menuBar().addMenu(self.helpMenu)
+
+
+class PreviewForm(QtWidgets.QDialog):
+ def __init__(self, parent):
+ super(PreviewForm, self).__init__(parent)
+
+ self.encodingComboBox = QtWidgets.QComboBox()
+ encodingLabel = QtWidgets.QLabel("&Encoding:")
+ encodingLabel.setBuddy(self.encodingComboBox)
+
+ self.textEdit = QtWidgets.QTextEdit()
+ self.textEdit.setLineWrapMode(QtWidgets.QTextEdit.NoWrap)
+ self.textEdit.setReadOnly(True)
+
+ buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
+
+ self.encodingComboBox.activated.connect(self.updateTextEdit)
+ buttonBox.accepted.connect(self.accept)
+ buttonBox.rejected.connect(self.reject)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(encodingLabel, 0, 0)
+ mainLayout.addWidget(self.encodingComboBox, 0, 1)
+ mainLayout.addWidget(self.textEdit, 1, 0, 1, 2)
+ mainLayout.addWidget(buttonBox, 2, 0, 1, 2)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Choose Encoding")
+ self.resize(400, 300)
+
+ def setCodecList(self, codecs):
+ self.encodingComboBox.clear()
+ for codec in codecs:
+ self.encodingComboBox.addItem(codec_name(codec), codec.mibEnum())
+
+ def setEncodedData(self, data):
+ self.encodedData = data
+ self.updateTextEdit()
+
+ def decodedString(self):
+ return self.decodedStr
+
+ def updateTextEdit(self):
+ mib = self.encodingComboBox.itemData(self.encodingComboBox.currentIndex())
+ codec = QtCore.QTextCodec.codecForMib(mib)
+
+ data = QtCore.QTextStream(self.encodedData)
+ data.setAutoDetectUnicode(False)
+ data.setCodec(codec)
+
+ self.decodedStr = data.readAll()
+ self.textEdit.setPlainText(self.decodedStr)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/corelib/tools/regexp.py b/examples/corelib/tools/regexp.py
new file mode 100755
index 000000000..7e28a5365
--- /dev/null
+++ b/examples/corelib/tools/regexp.py
@@ -0,0 +1,195 @@
+#!/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 widgets/tools/regexp example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class RegExpDialog(QtWidgets.QDialog):
+ MaxCaptures = 6
+
+ def __init__(self, parent=None):
+ super(RegExpDialog, self).__init__(parent)
+
+ self.patternComboBox = QtWidgets.QComboBox()
+ self.patternComboBox.setEditable(True)
+ self.patternComboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred)
+
+ patternLabel = QtWidgets.QLabel("&Pattern:")
+ patternLabel.setBuddy(self.patternComboBox)
+
+ self.escapedPatternLineEdit = QtWidgets.QLineEdit()
+ self.escapedPatternLineEdit.setReadOnly(True)
+ palette = self.escapedPatternLineEdit.palette()
+ palette.setBrush(QtGui.QPalette.Base,
+ palette.brush(QtGui.QPalette.Disabled, QtGui.QPalette.Base))
+ self.escapedPatternLineEdit.setPalette(palette)
+
+ escapedPatternLabel = QtWidgets.QLabel("&Escaped Pattern:")
+ escapedPatternLabel.setBuddy(self.escapedPatternLineEdit)
+
+ self.syntaxComboBox = QtWidgets.QComboBox()
+ self.syntaxComboBox.addItem("Regular expression v1",
+ QtCore.QRegExp.RegExp)
+ self.syntaxComboBox.addItem("Regular expression v2",
+ QtCore.QRegExp.RegExp2)
+ self.syntaxComboBox.addItem("Wildcard", QtCore.QRegExp.Wildcard)
+ self.syntaxComboBox.addItem("Fixed string",
+ QtCore.QRegExp.FixedString)
+
+ syntaxLabel = QtWidgets.QLabel("&Pattern Syntax:")
+ syntaxLabel.setBuddy(self.syntaxComboBox)
+
+ self.textComboBox = QtWidgets.QComboBox()
+ self.textComboBox.setEditable(True)
+ self.textComboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred)
+
+ textLabel = QtWidgets.QLabel("&Text:")
+ textLabel.setBuddy(self.textComboBox)
+
+ self.caseSensitiveCheckBox = QtWidgets.QCheckBox("Case &Sensitive")
+ self.caseSensitiveCheckBox.setChecked(True)
+ self.minimalCheckBox = QtWidgets.QCheckBox("&Minimal")
+
+ indexLabel = QtWidgets.QLabel("Index of Match:")
+ self.indexEdit = QtWidgets.QLineEdit()
+ self.indexEdit.setReadOnly(True)
+
+ matchedLengthLabel = QtWidgets.QLabel("Matched Length:")
+ self.matchedLengthEdit = QtWidgets.QLineEdit()
+ self.matchedLengthEdit.setReadOnly(True)
+
+ self.captureLabels = []
+ self.captureEdits = []
+ for i in range(self.MaxCaptures):
+ self.captureLabels.append(QtWidgets.QLabel("Capture %d:" % i))
+ self.captureEdits.append(QtWidgets.QLineEdit())
+ self.captureEdits[i].setReadOnly(True)
+ self.captureLabels[0].setText("Match:")
+
+ checkBoxLayout = QtWidgets.QHBoxLayout()
+ checkBoxLayout.addWidget(self.caseSensitiveCheckBox)
+ checkBoxLayout.addWidget(self.minimalCheckBox)
+ checkBoxLayout.addStretch(1)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(patternLabel, 0, 0)
+ mainLayout.addWidget(self.patternComboBox, 0, 1)
+ mainLayout.addWidget(escapedPatternLabel, 1, 0)
+ mainLayout.addWidget(self.escapedPatternLineEdit, 1, 1)
+ mainLayout.addWidget(syntaxLabel, 2, 0)
+ mainLayout.addWidget(self.syntaxComboBox, 2, 1)
+ mainLayout.addLayout(checkBoxLayout, 3, 0, 1, 2)
+ mainLayout.addWidget(textLabel, 4, 0)
+ mainLayout.addWidget(self.textComboBox, 4, 1)
+ mainLayout.addWidget(indexLabel, 5, 0)
+ mainLayout.addWidget(self.indexEdit, 5, 1)
+ mainLayout.addWidget(matchedLengthLabel, 6, 0)
+ mainLayout.addWidget(self.matchedLengthEdit, 6, 1)
+
+ for i in range(self.MaxCaptures):
+ mainLayout.addWidget(self.captureLabels[i], 7 + i, 0)
+ mainLayout.addWidget(self.captureEdits[i], 7 + i, 1)
+ self.setLayout(mainLayout)
+
+ self.patternComboBox.editTextChanged.connect(self.refresh)
+ self.textComboBox.editTextChanged.connect(self.refresh)
+ self.caseSensitiveCheckBox.toggled.connect(self.refresh)
+ self.minimalCheckBox.toggled.connect(self.refresh)
+ self.syntaxComboBox.currentIndexChanged.connect(self.refresh)
+
+ self.patternComboBox.addItem("[A-Za-z_]+([A-Za-z_0-9]*)")
+ self.textComboBox.addItem("(10 + delta4)* 32")
+
+ self.setWindowTitle("RegExp")
+ self.setFixedHeight(self.sizeHint().height())
+ self.refresh()
+
+ def refresh(self):
+ self.setUpdatesEnabled(False)
+
+ pattern = self.patternComboBox.currentText()
+ text = self.textComboBox.currentText()
+
+ escaped = str(pattern)
+ escaped.replace('\\', '\\\\')
+ escaped.replace('"', '\\"')
+ self.escapedPatternLineEdit.setText('"' + escaped + '"')
+
+ rx = QtCore.QRegExp(pattern)
+ cs = QtCore.Qt.CaseInsensitive
+ if self.caseSensitiveCheckBox.isChecked():
+ cs = QtCore.Qt.CaseSensitive
+ rx.setCaseSensitivity(cs)
+ rx.setMinimal(self.minimalCheckBox.isChecked())
+ syntax = self.syntaxComboBox.itemData(self.syntaxComboBox.currentIndex())
+ rx.setPatternSyntax(QtCore.QRegExp.PatternSyntax(syntax))
+
+ palette = self.patternComboBox.palette()
+ if rx.isValid():
+ palette.setColor(QtGui.QPalette.Text,
+ self.textComboBox.palette().color(QtGui.QPalette.Text))
+ else:
+ palette.setColor(QtGui.QPalette.Text, QtCore.Qt.red)
+ self.patternComboBox.setPalette(palette)
+
+ self.indexEdit.setText(str(rx.indexIn(text)))
+ self.matchedLengthEdit.setText(str(rx.matchedLength()))
+
+ for i in range(self.MaxCaptures):
+ self.captureLabels[i].setEnabled(i <= rx.captureCount())
+ self.captureEdits[i].setEnabled(i <= rx.captureCount())
+ self.captureEdits[i].setText(rx.cap(i))
+
+ self.setUpdatesEnabled(True)
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ dialog = RegExpDialog()
+ sys.exit(dialog.exec_())
diff --git a/examples/corelib/tools/settingseditor/settingseditor.py b/examples/corelib/tools/settingseditor/settingseditor.py
new file mode 100755
index 000000000..905049746
--- /dev/null
+++ b/examples/corelib/tools/settingseditor/settingseditor.py
@@ -0,0 +1,722 @@
+#!/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 widgets/tools/settingseditor example from Qt v5.x"""
+
+import sys
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self, parent=None):
+ super(MainWindow, self).__init__(parent)
+
+ self.settingsTree = SettingsTree()
+ self.setCentralWidget(self.settingsTree)
+
+ self.locationDialog = None
+
+ self.createActions()
+ self.createMenus()
+
+ self.autoRefreshAct.setChecked(True)
+ self.fallbacksAct.setChecked(True)
+
+ self.setWindowTitle("Settings Editor")
+ self.resize(500, 600)
+
+ def openSettings(self):
+ if self.locationDialog is None:
+ self.locationDialog = LocationDialog(self)
+
+ if self.locationDialog.exec_():
+ settings = QtCore.QSettings(self.locationDialog.format(),
+ self.locationDialog.scope(),
+ self.locationDialog.organization(),
+ self.locationDialog.application())
+ self.setSettingsObject(settings)
+ self.fallbacksAct.setEnabled(True)
+
+ def openIniFile(self):
+ fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open INI File",
+ '', "INI Files (*.ini *.conf)")
+
+ if fileName:
+ settings = QtCore.QSettings(fileName, QtCore.QSettings.IniFormat)
+ self.setSettingsObject(settings)
+ self.fallbacksAct.setEnabled(False)
+
+ def openPropertyList(self):
+ fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self,
+ "Open Property List", '', "Property List Files (*.plist)")
+
+ if fileName:
+ settings = QtCore.QSettings(fileName, QtCore.QSettings.NativeFormat)
+ self.setSettingsObject(settings)
+ self.fallbacksAct.setEnabled(False)
+
+ def openRegistryPath(self):
+ path, ok = QtWidgets.QInputDialog.getText(self, "Open Registry Path",
+ "Enter the path in the Windows registry:",
+ QtWidgets.QLineEdit.Normal, 'HKEY_CURRENT_USER\\')
+
+ if ok and path != '':
+ settings = QtCore.QSettings(path, QtCore.QSettings.NativeFormat)
+ self.setSettingsObject(settings)
+ self.fallbacksAct.setEnabled(False)
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About Settings Editor",
+ "The <b>Settings Editor</b> example shows how to access "
+ "application settings using Qt.")
+
+ def createActions(self):
+ self.openSettingsAct = QtWidgets.QAction("&Open Application Settings...",
+ self, shortcut="Ctrl+O", triggered=self.openSettings)
+
+ self.openIniFileAct = QtWidgets.QAction("Open I&NI File...", self,
+ shortcut="Ctrl+N", triggered=self.openIniFile)
+
+ self.openPropertyListAct = QtWidgets.QAction("Open macOS &Property List...",
+ self, shortcut="Ctrl+P", triggered=self.openPropertyList)
+ if sys.platform != 'darwin':
+ self.openPropertyListAct.setEnabled(False)
+
+ self.openRegistryPathAct = QtWidgets.QAction(
+ "Open Windows &Registry Path...", self, shortcut="Ctrl+G",
+ triggered=self.openRegistryPath)
+ if sys.platform != 'win32':
+ self.openRegistryPathAct.setEnabled(False)
+
+ self.refreshAct = QtWidgets.QAction("&Refresh", self, shortcut="Ctrl+R",
+ enabled=False, triggered=self.settingsTree.refresh)
+
+ self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q",
+ triggered=self.close)
+
+ self.autoRefreshAct = QtWidgets.QAction("&Auto-Refresh", self,
+ shortcut="Ctrl+A", checkable=True, enabled=False)
+ self.autoRefreshAct.triggered[bool].connect(self.settingsTree.setAutoRefresh)
+ self.autoRefreshAct.triggered[bool].connect(self.refreshAct.setDisabled)
+
+ self.fallbacksAct = QtWidgets.QAction("&Fallbacks", self,
+ shortcut="Ctrl+F", checkable=True, enabled=False)
+ self.fallbacksAct.triggered[bool].connect(self.settingsTree.setFallbacksEnabled)
+
+ 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.openSettingsAct)
+ self.fileMenu.addAction(self.openIniFileAct)
+ self.fileMenu.addAction(self.openPropertyListAct)
+ self.fileMenu.addAction(self.openRegistryPathAct)
+ self.fileMenu.addSeparator()
+ self.fileMenu.addAction(self.refreshAct)
+ self.fileMenu.addSeparator()
+ self.fileMenu.addAction(self.exitAct)
+
+ self.optionsMenu = self.menuBar().addMenu("&Options")
+ self.optionsMenu.addAction(self.autoRefreshAct)
+ self.optionsMenu.addAction(self.fallbacksAct)
+
+ self.menuBar().addSeparator()
+
+ self.helpMenu = self.menuBar().addMenu("&Help")
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+ def setSettingsObject(self, settings):
+ settings.setFallbacksEnabled(self.fallbacksAct.isChecked())
+ self.settingsTree.setSettingsObject(settings)
+
+ self.refreshAct.setEnabled(True)
+ self.autoRefreshAct.setEnabled(True)
+
+ niceName = settings.fileName()
+ niceName.replace('\\', '/')
+ niceName = niceName.split('/')[-1]
+
+ if not settings.isWritable():
+ niceName += " (read only)"
+
+ self.setWindowTitle("%s - Settings Editor" % niceName)
+
+
+class LocationDialog(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(LocationDialog, self).__init__(parent)
+
+ self.formatComboBox = QtWidgets.QComboBox()
+ self.formatComboBox.addItem("Native")
+ self.formatComboBox.addItem("INI")
+
+ self.scopeComboBox = QtWidgets.QComboBox()
+ self.scopeComboBox.addItem("User")
+ self.scopeComboBox.addItem("System")
+
+ self.organizationComboBox = QtWidgets.QComboBox()
+ self.organizationComboBox.addItem("Trolltech")
+ self.organizationComboBox.setEditable(True)
+
+ self.applicationComboBox = QtWidgets.QComboBox()
+ self.applicationComboBox.addItem("Any")
+ self.applicationComboBox.addItem("Application Example")
+ self.applicationComboBox.addItem("Assistant")
+ self.applicationComboBox.addItem("Designer")
+ self.applicationComboBox.addItem("Linguist")
+ self.applicationComboBox.setEditable(True)
+ self.applicationComboBox.setCurrentIndex(3)
+
+ formatLabel = QtWidgets.QLabel("&Format:")
+ formatLabel.setBuddy(self.formatComboBox)
+
+ scopeLabel = QtWidgets.QLabel("&Scope:")
+ scopeLabel.setBuddy(self.scopeComboBox)
+
+ organizationLabel = QtWidgets.QLabel("&Organization:")
+ organizationLabel.setBuddy(self.organizationComboBox)
+
+ applicationLabel = QtWidgets.QLabel("&Application:")
+ applicationLabel.setBuddy(self.applicationComboBox)
+
+ self.locationsGroupBox = QtWidgets.QGroupBox("Setting Locations")
+
+ self.locationsTable = QtWidgets.QTableWidget()
+ self.locationsTable.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+ self.locationsTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+ self.locationsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+ self.locationsTable.setColumnCount(2)
+ self.locationsTable.setHorizontalHeaderLabels(("Location", "Access"))
+ self.locationsTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
+ self.locationsTable.horizontalHeader().resizeSection(1, 180)
+
+ self.buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
+
+ self.formatComboBox.activated.connect(self.updateLocationsTable)
+ self.scopeComboBox.activated.connect(self.updateLocationsTable)
+ self.organizationComboBox.lineEdit().editingFinished.connect(self.updateLocationsTable)
+ self.applicationComboBox.lineEdit().editingFinished.connect(self.updateLocationsTable)
+ self.buttonBox.accepted.connect(self.accept)
+ self.buttonBox.rejected.connect(self.reject)
+
+ locationsLayout = QtWidgets.QVBoxLayout()
+ locationsLayout.addWidget(self.locationsTable)
+ self.locationsGroupBox.setLayout(locationsLayout)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(formatLabel, 0, 0)
+ mainLayout.addWidget(self.formatComboBox, 0, 1)
+ mainLayout.addWidget(scopeLabel, 1, 0)
+ mainLayout.addWidget(self.scopeComboBox, 1, 1)
+ mainLayout.addWidget(organizationLabel, 2, 0)
+ mainLayout.addWidget(self.organizationComboBox, 2, 1)
+ mainLayout.addWidget(applicationLabel, 3, 0)
+ mainLayout.addWidget(self.applicationComboBox, 3, 1)
+ mainLayout.addWidget(self.locationsGroupBox, 4, 0, 1, 2)
+ mainLayout.addWidget(self.buttonBox, 5, 0, 1, 2)
+ self.setLayout(mainLayout)
+
+ self.updateLocationsTable()
+
+ self.setWindowTitle("Open Application Settings")
+ self.resize(650, 400)
+
+ def format(self):
+ if self.formatComboBox.currentIndex() == 0:
+ return QtCore.QSettings.NativeFormat
+ else:
+ return QtCore.QSettings.IniFormat
+
+ def scope(self):
+ if self.scopeComboBox.currentIndex() == 0:
+ return QtCore.QSettings.UserScope
+ else:
+ return QtCore.QSettings.SystemScope
+
+ def organization(self):
+ return self.organizationComboBox.currentText()
+
+ def application(self):
+ if self.applicationComboBox.currentText() == "Any":
+ return ''
+
+ return self.applicationComboBox.currentText()
+
+ def updateLocationsTable(self):
+ self.locationsTable.setUpdatesEnabled(False)
+ self.locationsTable.setRowCount(0)
+
+ for i in range(2):
+ if i == 0:
+ if self.scope() == QtCore.QSettings.SystemScope:
+ continue
+
+ actualScope = QtCore.QSettings.UserScope
+ else:
+ actualScope = QtCore.QSettings.SystemScope
+
+ for j in range(2):
+ if j == 0:
+ if not self.application():
+ continue
+
+ actualApplication = self.application()
+ else:
+ actualApplication = ''
+
+ settings = QtCore.QSettings(self.format(), actualScope,
+ self.organization(), actualApplication)
+
+ row = self.locationsTable.rowCount()
+ self.locationsTable.setRowCount(row + 1)
+
+ item0 = QtWidgets.QTableWidgetItem()
+ item0.setText(settings.fileName())
+
+ item1 = QtWidgets.QTableWidgetItem()
+ disable = not (settings.childKeys() or settings.childGroups())
+
+ if row == 0:
+ if settings.isWritable():
+ item1.setText("Read-write")
+ disable = False
+ else:
+ item1.setText("Read-only")
+ self.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).setDisabled(disable)
+ else:
+ item1.setText("Read-only fallback")
+
+ if disable:
+ item0.setFlags(item0.flags() & ~QtCore.Qt.ItemIsEnabled)
+ item1.setFlags(item1.flags() & ~QtCore.Qt.ItemIsEnabled)
+
+ self.locationsTable.setItem(row, 0, item0)
+ self.locationsTable.setItem(row, 1, item1)
+
+ self.locationsTable.setUpdatesEnabled(True)
+
+
+class SettingsTree(QtWidgets.QTreeWidget):
+ def __init__(self, parent=None):
+ super(SettingsTree, self).__init__(parent)
+
+ self.setItemDelegate(VariantDelegate(self))
+
+ self.setHeaderLabels(("Setting", "Type", "Value"))
+ self.header().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
+ self.header().setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch)
+
+ self.settings = None
+ self.refreshTimer = QtCore.QTimer()
+ self.refreshTimer.setInterval(2000)
+ self.autoRefresh = False
+
+ self.groupIcon = QtGui.QIcon()
+ self.groupIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_DirClosedIcon),
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.groupIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_DirOpenIcon),
+ QtGui.QIcon.Normal, QtGui.QIcon.On)
+ self.keyIcon = QtGui.QIcon()
+ self.keyIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_FileIcon))
+
+ self.refreshTimer.timeout.connect(self.maybeRefresh)
+
+ def setSettingsObject(self, settings):
+ self.settings = settings
+ self.clear()
+
+ if self.settings is not None:
+ self.settings.setParent(self)
+ self.refresh()
+ if self.autoRefresh:
+ self.refreshTimer.start()
+ else:
+ self.refreshTimer.stop()
+
+ def sizeHint(self):
+ return QtCore.QSize(800, 600)
+
+ def setAutoRefresh(self, autoRefresh):
+ self.autoRefresh = autoRefresh
+
+ if self.settings is not None:
+ if self.autoRefresh:
+ self.maybeRefresh()
+ self.refreshTimer.start()
+ else:
+ self.refreshTimer.stop()
+
+ def setFallbacksEnabled(self, enabled):
+ if self.settings is not None:
+ self.settings.setFallbacksEnabled(enabled)
+ self.refresh()
+
+ def maybeRefresh(self):
+ if self.state() != QtWidgets.QAbstractItemView.EditingState:
+ self.refresh()
+
+ def refresh(self):
+ if self.settings is None:
+ return
+
+ # The signal might not be connected.
+ try:
+ self.itemChanged.disconnect(self.updateSetting)
+ except:
+ pass
+
+ self.settings.sync()
+ self.updateChildItems(None)
+
+ self.itemChanged.connect(self.updateSetting)
+
+ def event(self, event):
+ if event.type() == QtCore.QEvent.WindowActivate:
+ if self.isActiveWindow() and self.autoRefresh:
+ self.maybeRefresh()
+
+ return super(SettingsTree, self).event(event)
+
+ def updateSetting(self, item):
+ key = item.text(0)
+ ancestor = item.parent()
+
+ while ancestor:
+ key = ancestor.text(0) + '/' + key
+ ancestor = ancestor.parent()
+
+ d = item.data(2, QtCore.Qt.UserRole)
+ self.settings.setValue(key, item.data(2, QtCore.Qt.UserRole))
+
+ if self.autoRefresh:
+ self.refresh()
+
+ def updateChildItems(self, parent):
+ dividerIndex = 0
+
+ for group in self.settings.childGroups():
+ childIndex = self.findChild(parent, group, dividerIndex)
+ if childIndex != -1:
+ child = self.childAt(parent, childIndex)
+ child.setText(1, '')
+ child.setText(2, '')
+ child.setData(2, QtCore.Qt.UserRole, None)
+ self.moveItemForward(parent, childIndex, dividerIndex)
+ else:
+ child = self.createItem(group, parent, dividerIndex)
+
+ child.setIcon(0, self.groupIcon)
+ dividerIndex += 1
+
+ self.settings.beginGroup(group)
+ self.updateChildItems(child)
+ self.settings.endGroup()
+
+ for key in self.settings.childKeys():
+ childIndex = self.findChild(parent, key, 0)
+ if childIndex == -1 or childIndex >= dividerIndex:
+ if childIndex != -1:
+ child = self.childAt(parent, childIndex)
+ for i in range(child.childCount()):
+ self.deleteItem(child, i)
+ self.moveItemForward(parent, childIndex, dividerIndex)
+ else:
+ child = self.createItem(key, parent, dividerIndex)
+ child.setIcon(0, self.keyIcon)
+ dividerIndex += 1
+ else:
+ child = self.childAt(parent, childIndex)
+
+ value = self.settings.value(key)
+ if value is None:
+ child.setText(1, 'Invalid')
+ else:
+ child.setText(1, value.__class__.__name__)
+ child.setText(2, VariantDelegate.displayText(value))
+ child.setData(2, QtCore.Qt.UserRole, value)
+
+ while dividerIndex < self.childCount(parent):
+ self.deleteItem(parent, dividerIndex)
+
+ def createItem(self, text, parent, index):
+ after = None
+
+ if index != 0:
+ after = self.childAt(parent, index - 1)
+
+ if parent is not None:
+ item = QtWidgets.QTreeWidgetItem(parent, after)
+ else:
+ item = QtWidgets.QTreeWidgetItem(self, after)
+
+ item.setText(0, text)
+ item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
+ return item
+
+ def deleteItem(self, parent, index):
+ if parent is not None:
+ item = parent.takeChild(index)
+ else:
+ item = self.takeTopLevelItem(index)
+ del item
+
+ def childAt(self, parent, index):
+ if parent is not None:
+ return parent.child(index)
+ else:
+ return self.topLevelItem(index)
+
+ def childCount(self, parent):
+ if parent is not None:
+ return parent.childCount()
+ else:
+ return self.topLevelItemCount()
+
+ def findChild(self, parent, text, startIndex):
+ for i in range(self.childCount(parent)):
+ if self.childAt(parent, i).text(0) == text:
+ return i
+ return -1
+
+ def moveItemForward(self, parent, oldIndex, newIndex):
+ for int in range(oldIndex - newIndex):
+ self.deleteItem(parent, newIndex)
+
+
+class VariantDelegate(QtWidgets.QItemDelegate):
+ def __init__(self, parent=None):
+ super(VariantDelegate, self).__init__(parent)
+
+ self.boolExp = QtCore.QRegExp()
+ self.boolExp.setPattern('true|false')
+ self.boolExp.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
+
+ self.byteArrayExp = QtCore.QRegExp()
+ self.byteArrayExp.setPattern('[\\x00-\\xff]*')
+
+ self.charExp = QtCore.QRegExp()
+ self.charExp.setPattern('.')
+
+ self.colorExp = QtCore.QRegExp()
+ self.colorExp.setPattern('\\(([0-9]*),([0-9]*),([0-9]*),([0-9]*)\\)')
+
+ self.doubleExp = QtCore.QRegExp()
+ self.doubleExp.setPattern('')
+
+ self.pointExp = QtCore.QRegExp()
+ self.pointExp.setPattern('\\((-?[0-9]*),(-?[0-9]*)\\)')
+
+ self.rectExp = QtCore.QRegExp()
+ self.rectExp.setPattern('\\((-?[0-9]*),(-?[0-9]*),(-?[0-9]*),(-?[0-9]*)\\)')
+
+ self.signedIntegerExp = QtCore.QRegExp()
+ self.signedIntegerExp.setPattern('-?[0-9]*')
+
+ self.sizeExp = QtCore.QRegExp(self.pointExp)
+
+ self.unsignedIntegerExp = QtCore.QRegExp()
+ self.unsignedIntegerExp.setPattern('[0-9]*')
+
+ self.dateExp = QtCore.QRegExp()
+ self.dateExp.setPattern('([0-9]{,4})-([0-9]{,2})-([0-9]{,2})')
+
+ self.timeExp = QtCore.QRegExp()
+ self.timeExp.setPattern('([0-9]{,2}):([0-9]{,2}):([0-9]{,2})')
+
+ self.dateTimeExp = QtCore.QRegExp()
+ self.dateTimeExp.setPattern(self.dateExp.pattern() + 'T' + self.timeExp.pattern())
+
+ def paint(self, painter, option, index):
+ if index.column() == 2:
+ value = index.model().data(index, QtCore.Qt.UserRole)
+ if not self.isSupportedType(value):
+ myOption = QtWidgets.QStyleOptionViewItem(option)
+ myOption.state &= ~QtWidgets.QStyle.State_Enabled
+ super(VariantDelegate, self).paint(painter, myOption, index)
+ return
+
+ super(VariantDelegate, self).paint(painter, option, index)
+
+ def createEditor(self, parent, option, index):
+ if index.column() != 2:
+ return None
+
+ originalValue = index.model().data(index, QtCore.Qt.UserRole)
+ if not self.isSupportedType(originalValue):
+ return None
+
+ lineEdit = QtWidgets.QLineEdit(parent)
+ lineEdit.setFrame(False)
+
+ if isinstance(originalValue, bool):
+ regExp = self.boolExp
+ elif isinstance(originalValue, float):
+ regExp = self.doubleExp
+ elif isinstance(originalValue, int):
+ regExp = self.signedIntegerExp
+ elif isinstance(originalValue, QtCore.QByteArray):
+ regExp = self.byteArrayExp
+ elif isinstance(originalValue, QtGui.QColor):
+ regExp = self.colorExp
+ elif isinstance(originalValue, QtCore.QDate):
+ regExp = self.dateExp
+ elif isinstance(originalValue, QtCore.QDateTime):
+ regExp = self.dateTimeExp
+ elif isinstance(originalValue, QtCore.QTime):
+ regExp = self.timeExp
+ elif isinstance(originalValue, QtCore.QPoint):
+ regExp = self.pointExp
+ elif isinstance(originalValue, QtCore.QRect):
+ regExp = self.rectExp
+ elif isinstance(originalValue, QtCore.QSize):
+ regExp = self.sizeExp
+ else:
+ regExp = QtCore.QRegExp()
+
+ if not regExp.isEmpty():
+ validator = QtGui.QRegExpValidator(regExp, lineEdit)
+ lineEdit.setValidator(validator)
+
+ return lineEdit
+
+ def setEditorData(self, editor, index):
+ value = index.model().data(index, QtCore.Qt.UserRole)
+ if editor is not None:
+ editor.setText(self.displayText(value))
+
+ def setModelData(self, editor, model, index):
+ if not editor.isModified():
+ return
+
+ text = editor.text()
+ validator = editor.validator()
+ if validator is not None:
+ state, text, _ = validator.validate(text, 0)
+ if state != QtGui.QValidator.Acceptable:
+ return
+
+ originalValue = index.model().data(index, QtCore.Qt.UserRole)
+
+ if isinstance(originalValue, QtGui.QColor):
+ self.colorExp.exactMatch(text)
+ value = QtGui.QColor(min(int(self.colorExp.cap(1)), 255),
+ min(int(self.colorExp.cap(2)), 255),
+ min(int(self.colorExp.cap(3)), 255),
+ min(int(self.colorExp.cap(4)), 255))
+ elif isinstance(originalValue, QtCore.QDate):
+ value = QtCore.QDate.fromString(text, QtCore.Qt.ISODate)
+ if not value.isValid():
+ return
+ elif isinstance(originalValue, QtCore.QDateTime):
+ value = QtCore.QDateTime.fromString(text, QtCore.Qt.ISODate)
+ if not value.isValid():
+ return
+ elif isinstance(originalValue, QtCore.QTime):
+ value = QtCore.QTime.fromString(text, QtCore.Qt.ISODate)
+ if not value.isValid():
+ return
+ elif isinstance(originalValue, QtCore.QPoint):
+ self.pointExp.exactMatch(text)
+ value = QtCore.QPoint(int(self.pointExp.cap(1)),
+ int(self.pointExp.cap(2)))
+ elif isinstance(originalValue, QtCore.QRect):
+ self.rectExp.exactMatch(text)
+ value = QtCore.QRect(int(self.rectExp.cap(1)),
+ int(self.rectExp.cap(2)),
+ int(self.rectExp.cap(3)),
+ int(self.rectExp.cap(4)))
+ elif isinstance(originalValue, QtCore.QSize):
+ self.sizeExp.exactMatch(text)
+ value = QtCore.QSize(int(self.sizeExp.cap(1)),
+ int(self.sizeExp.cap(2)))
+ elif isinstance(originalValue, list):
+ value = text.split(',')
+ else:
+ value = type(originalValue)(text)
+
+ model.setData(index, self.displayText(value), QtCore.Qt.DisplayRole)
+ model.setData(index, value, QtCore.Qt.UserRole)
+
+ @staticmethod
+ def isSupportedType(value):
+ return isinstance(value, (bool, float, int, QtCore.QByteArray,
+ str, QtGui.QColor, QtCore.QDate, QtCore.QDateTime,
+ QtCore.QTime, QtCore.QPoint, QtCore.QRect, QtCore.QSize,
+ list))
+
+ @staticmethod
+ def displayText(value):
+ if isinstance(value, (bool, int, QtCore.QByteArray)):
+ return str(value)
+ if isinstance(value, str):
+ return value
+ elif isinstance(value, float):
+ return '%g' % value
+ elif isinstance(value, QtGui.QColor):
+ return '(%u,%u,%u,%u)' % (value.red(), value.green(), value.blue(), value.alpha())
+ elif isinstance(value, (QtCore.QDate, QtCore.QDateTime, QtCore.QTime)):
+ return value.toString(QtCore.Qt.ISODate)
+ elif isinstance(value, QtCore.QPoint):
+ return '(%d,%d)' % (value.x(), value.y())
+ elif isinstance(value, QtCore.QRect):
+ return '(%d,%d,%d,%d)' % (value.x(), value.y(), value.width(), value.height())
+ elif isinstance(value, QtCore.QSize):
+ return '(%d,%d)' % (value.width(), value.height())
+ elif isinstance(value, list):
+ return ','.join(value)
+ elif value is None:
+ return '<Invalid>'
+
+ return '<%s>' % value
+
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/datavisualization/bars3d.py b/examples/datavisualization/bars3d.py
new file mode 100644
index 000000000..c07314cb0
--- /dev/null
+++ b/examples/datavisualization/bars3d.py
@@ -0,0 +1,115 @@
+#!/usr/bin/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 QtDataVisualization example"""
+
+import os
+import sys
+from PySide2.QtCore import QRect, QSize, QProcess, Qt
+from PySide2.QtGui import QGuiApplication, QScreen, QWindow
+from PySide2.QtWidgets import QApplication, QSizePolicy, QMainWindow, QWidget
+from PySide2.QtDataVisualization import QtDataVisualization
+
+def dataToBarDataRow(data):
+ return list(QtDataVisualization.QBarDataItem(d) for d in data)
+
+def dataToBarDataArray(data):
+ return list(dataToBarDataRow(row) for row in data)
+
+class MainWindow(QMainWindow):
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.setWindowTitle('Qt DataVisualization 3D Bars')
+
+ self.bars = QtDataVisualization.Q3DBars()
+
+ self.columnAxis = QtDataVisualization.QCategory3DAxis()
+ self.columnAxis.setTitle('Columns')
+ self.columnAxis.setTitleVisible(True)
+ self.columnAxis.setLabels(['Column1', 'Column2'])
+ self.columnAxis.setLabelAutoRotation(30);
+
+ self.rowAxis = QtDataVisualization.QCategory3DAxis()
+ self.rowAxis.setTitle('Rows')
+ self.rowAxis.setTitleVisible(True)
+ self.rowAxis.setLabels(['Row1', 'Row2'])
+ self.rowAxis.setLabelAutoRotation(30);
+
+ self.valueAxis = QtDataVisualization.QValue3DAxis()
+ self.valueAxis.setTitle('Values')
+ self.valueAxis.setTitleVisible(True)
+ self.valueAxis.setRange(0, 5);
+
+ self.bars.setRowAxis(self.rowAxis)
+ self.bars.setColumnAxis(self.columnAxis)
+ self.bars.setValueAxis(self.valueAxis)
+
+ self.series = QtDataVisualization.QBar3DSeries()
+ self.arrayData = [[1, 2], [3, 4]]
+ self.series.dataProxy().addRows(dataToBarDataArray(self.arrayData))
+
+ self.bars.setPrimarySeries(self.series)
+
+ self.container = QWidget.createWindowContainer(self.bars)
+
+ if not self.bars.hasContext():
+ print("Couldn't initialize the OpenGL context.")
+ sys.exit(-1)
+
+ camera = self.bars.scene().activeCamera()
+ camera.setYRotation(22.5)
+
+ geometry = QGuiApplication.primaryScreen().geometry()
+ size = geometry.height() * 3 / 4
+ self.container.setMinimumSize(size, size)
+
+ self.container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding);
+ self.container.setFocusPolicy(Qt.StrongFocus);
+ self.setCentralWidget(self.container)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/declarative/extending/chapter1-basics/app.qml b/examples/declarative/extending/chapter1-basics/app.qml
new file mode 100644
index 000000000..60ecd7bff
--- /dev/null
+++ b/examples/declarative/extending/chapter1-basics/app.qml
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import Charts 1.0
+import QtQuick 2.0
+
+Item {
+ width: 300; height: 200
+
+ PieChart {
+ id: aPieChart
+ anchors.centerIn: parent
+ width: 100; height: 100
+ name: "A simple pie chart"
+ color: "red"
+ }
+
+ Text {
+ anchors {
+ bottom: parent.bottom;
+ horizontalCenter: parent.horizontalCenter;
+ bottomMargin: 20
+ }
+ text: aPieChart.name
+ }
+}
+//![0]
diff --git a/examples/declarative/extending/chapter1-basics/basics.py b/examples/declarative/extending/chapter1-basics/basics.py
new file mode 100644
index 000000000..f965cade9
--- /dev/null
+++ b/examples/declarative/extending/chapter1-basics/basics.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+"""PySide2 port of the qml/tutorials/extending-qml/chapter1-basics example from Qt v5.x"""
+
+import sys, os
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils'))
+from utils import text_type
+
+from PySide2.QtCore import Property, Signal, QUrl
+from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor
+from PySide2.QtQml import qmlRegisterType
+from PySide2.QtQuick import QQuickPaintedItem, QQuickView
+
+class PieChart (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._name = u''
+
+ def paint(self, painter):
+ pen = QPen(self.color, 2)
+ painter.setPen(pen);
+ painter.setRenderHints(QPainter.Antialiasing, True);
+ painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16);
+
+ def getColor(self):
+ return self._color
+
+ def setColor(self, value):
+ self._color = value
+
+ def getName(self):
+ return self._name
+
+ def setName(self, value):
+ self._name = value
+
+ nameChanged = Signal()
+
+ color = Property(QColor, getColor, setColor)
+ name = Property(text_type, getName, setName, notify=nameChanged)
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+
+ qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart');
+
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+ qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/extending/chapter2-methods/app.qml b/examples/declarative/extending/chapter2-methods/app.qml
new file mode 100644
index 000000000..863b597d0
--- /dev/null
+++ b/examples/declarative/extending/chapter2-methods/app.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import Charts 1.0
+import QtQuick 2.0
+
+Item {
+ width: 300; height: 200
+
+ PieChart {
+ id: aPieChart
+ anchors.centerIn: parent
+ width: 100; height: 100
+ color: "red"
+
+ onChartCleared: console.log("The chart has been cleared")
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: aPieChart.clearChart()
+ }
+
+ Text {
+ anchors {
+ bottom: parent.bottom;
+ horizontalCenter: parent.horizontalCenter;
+ bottomMargin: 20
+ }
+ text: "Click anywhere to clear the chart"
+ }
+}
+//![0]
diff --git a/examples/declarative/extending/chapter2-methods/methods.py b/examples/declarative/extending/chapter2-methods/methods.py
new file mode 100644
index 000000000..d6e74f5f0
--- /dev/null
+++ b/examples/declarative/extending/chapter2-methods/methods.py
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+"""PySide2 port of the qml/tutorials/extending-qml/chapter2-methods example from Qt v5.x"""
+
+import sys, os
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils'))
+from utils import text_type
+
+from PySide2.QtCore import Property, Signal, Slot, QUrl, Qt
+from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor
+from PySide2.QtQml import qmlRegisterType
+from PySide2.QtQuick import QQuickPaintedItem, QQuickView
+
+class PieChart (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._name = u''
+
+ def paint(self, painter):
+ pen = QPen(self.color, 2)
+ painter.setPen(pen);
+ painter.setRenderHints(QPainter.Antialiasing, True);
+ painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16);
+
+ def getColor(self):
+ return self._color
+
+ def setColor(self, value):
+ self._color = value
+
+ def getName(self):
+ return self._name
+
+ def setName(self, value):
+ self._name = value
+
+ color = Property(QColor, getColor, setColor)
+ name = Property(text_type, getName, setName)
+ chartCleared = Signal()
+
+ @Slot() # This should be something like @Invokable
+ def clearChart(self):
+ self.setColor(Qt.transparent)
+ self.update()
+ self.chartCleared.emit()
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+
+ qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart');
+
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+ qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/extending/chapter3-bindings/app.qml b/examples/declarative/extending/chapter3-bindings/app.qml
new file mode 100644
index 000000000..01b9216e8
--- /dev/null
+++ b/examples/declarative/extending/chapter3-bindings/app.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import Charts 1.0
+import QtQuick 2.0
+
+Item {
+ width: 300; height: 200
+
+ Row {
+ anchors.centerIn: parent
+ spacing: 20
+
+ PieChart {
+ id: chartA
+ width: 100; height: 100
+ color: "red"
+ }
+
+ PieChart {
+ id: chartB
+ width: 100; height: 100
+ color: chartA.color
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: { chartA.color = "blue" }
+ }
+
+ Text {
+ anchors {
+ bottom: parent.bottom;
+ horizontalCenter: parent.horizontalCenter;
+ bottomMargin: 20
+ }
+ text: "Click anywhere to change the chart color"
+ }
+}
+//![0]
diff --git a/examples/declarative/extending/chapter3-bindings/bindings.py b/examples/declarative/extending/chapter3-bindings/bindings.py
new file mode 100644
index 000000000..90af6d7e1
--- /dev/null
+++ b/examples/declarative/extending/chapter3-bindings/bindings.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+"""PySide2 port of the qml/tutorials/extending-qml/chapter3-bindings example from Qt v5.x"""
+
+import sys, os
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils'))
+from utils import text_type
+
+from PySide2.QtCore import Property, Signal, Slot, QUrl, Qt
+from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor
+from PySide2.QtQml import qmlRegisterType
+from PySide2.QtQuick import QQuickPaintedItem, QQuickView
+
+class PieChart (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._name = u''
+ self._color = QColor()
+
+ def paint(self, painter):
+ pen = QPen(self._color, 2)
+ painter.setPen(pen);
+ painter.setRenderHints(QPainter.Antialiasing, True);
+ painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16);
+
+ def getColor(self):
+ return self._color
+
+ def setColor(self, value):
+ if value != self._color:
+ self._color = value
+ self.update()
+ self.colorChanged.emit()
+
+ def getName(self):
+ return self._name
+
+ def setName(self, value):
+ self._name = value
+
+ colorChanged = Signal()
+ color = Property(QColor, getColor, setColor, notify=colorChanged)
+ name = Property(text_type, getName, setName)
+ chartCleared = Signal()
+
+ @Slot() # This should be something like @Invokable
+ def clearChart(self):
+ self.setColor(Qt.transparent)
+ self.update()
+ self.chartCleared.emit()
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+
+ qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart');
+
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+ qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/extending/chapter4-customPropertyTypes/app.qml b/examples/declarative/extending/chapter4-customPropertyTypes/app.qml
new file mode 100644
index 000000000..00e077276
--- /dev/null
+++ b/examples/declarative/extending/chapter4-customPropertyTypes/app.qml
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import Charts 1.0
+import QtQuick 2.0
+
+Item {
+ width: 300; height: 200
+
+ PieChart {
+ id: chart
+ anchors.centerIn: parent
+ width: 100; height: 100
+
+ pieSlice: PieSlice {
+ anchors.fill: parent
+ color: "red"
+ }
+ }
+
+ Component.onCompleted: console.log("The pie is colored " + chart.pieSlice.color)
+}
+//![0]
diff --git a/examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py b/examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py
new file mode 100644
index 000000000..473b7c15f
--- /dev/null
+++ b/examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py
@@ -0,0 +1,115 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+"""PySide2 port of the qml/tutorials/extending-qml/chapter4-customPropertyTypes example from Qt v5.x"""
+
+import sys, os
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils'))
+from utils import text_type
+
+from PySide2.QtCore import Property, QUrl
+from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor
+from PySide2.QtQml import qmlRegisterType
+from PySide2.QtQuick import QQuickPaintedItem, QQuickView
+
+class PieSlice (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._color = QColor()
+
+ def getColor(self):
+ return self._color
+
+ def setColor(self, value):
+ self._color = value
+
+ color = Property(QColor, getColor, setColor)
+
+ def paint(self, painter):
+ pen = QPen(self._color, 2)
+ painter.setPen(pen);
+ painter.setRenderHints(QPainter.Antialiasing, True);
+ painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16);
+
+class PieChart (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._name = u''
+ self._pieSlice = None
+
+ def getName(self):
+ return self._name
+
+ def setName(self, value):
+ self._name = value
+
+ name = Property(text_type, getName, setName)
+
+ def getPieSlice(self):
+ return self._pieSlice
+
+ def setPieSlice(self, value):
+ self._pieSlice = value
+ self._pieSlice.setParentItem(self)
+
+ pieSlice = Property(PieSlice, getPieSlice, setPieSlice)
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+
+ qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart');
+ qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice");
+
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+ qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/extending/chapter5-listproperties/app.qml b/examples/declarative/extending/chapter5-listproperties/app.qml
new file mode 100644
index 000000000..230c29520
--- /dev/null
+++ b/examples/declarative/extending/chapter5-listproperties/app.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+//![0]
+import Charts 1.0
+import QtQuick 2.0
+
+Item {
+ width: 300; height: 200
+
+ PieChart {
+ anchors.centerIn: parent
+ width: 100; height: 100
+
+ slices: [
+ PieSlice {
+ anchors.fill: parent
+ color: "red"
+ fromAngle: 0; angleSpan: 110
+ },
+ PieSlice {
+ anchors.fill: parent
+ color: "black"
+ fromAngle: 110; angleSpan: 50
+ },
+ PieSlice {
+ anchors.fill: parent
+ color: "blue"
+ fromAngle: 160; angleSpan: 100
+ }
+ ]
+ }
+}
+//![0]
diff --git a/examples/declarative/extending/chapter5-listproperties/listproperties.py b/examples/declarative/extending/chapter5-listproperties/listproperties.py
new file mode 100644
index 000000000..b494eac0d
--- /dev/null
+++ b/examples/declarative/extending/chapter5-listproperties/listproperties.py
@@ -0,0 +1,128 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+"""PySide2 port of the qml/tutorials/extending-qml/chapter5-listproperties example from Qt v5.x"""
+
+import sys, os
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils'))
+from utils import text_type
+
+from PySide2.QtCore import Property, QUrl
+from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor
+from PySide2.QtQml import qmlRegisterType, ListProperty
+from PySide2.QtQuick import QQuickPaintedItem, QQuickView
+
+class PieSlice (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._color = QColor()
+ self._fromAngle = 0
+ self._angleSpan = 0
+
+ def getColor(self):
+ return self._color
+
+ def setColor(self, value):
+ self._color = value
+
+ def getFromAngle(self):
+ return self._angle
+
+ def setFromAngle(self, value):
+ self._fromAngle = value
+
+ def getAngleSpan(self):
+ return self._angleSpan
+
+ def setAngleSpan(self, value):
+ self._angleSpan = value
+
+ color = Property(QColor, getColor, setColor)
+ fromAngle = Property(int, getFromAngle, setFromAngle)
+ angleSpan = Property(int, getAngleSpan, setAngleSpan)
+
+ def paint(self, painter):
+ pen = QPen(self._color, 2)
+ painter.setPen(pen);
+ painter.setRenderHints(QPainter.Antialiasing, True);
+ painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), self._fromAngle * 16, self._angleSpan * 16);
+
+class PieChart (QQuickPaintedItem):
+ def __init__(self, parent = None):
+ QQuickPaintedItem.__init__(self, parent)
+ self._name = u''
+ self._slices = []
+
+ def getName(self):
+ return self._name
+
+ def setName(self, value):
+ self._name = value
+
+ name = Property(text_type, getName, setName)
+
+ def appendSlice(self, _slice):
+ _slice.setParentItem(self)
+ self._slices.append(_slice)
+
+ slices = ListProperty(PieSlice, appendSlice)
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+
+ qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart');
+ qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice");
+
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+ qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/scrolling.py b/examples/declarative/scrolling.py
new file mode 100755
index 000000000..7b079c8f1
--- /dev/null
+++ b/examples/declarative/scrolling.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QUrl
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+# This example uses a QML file to show a scrolling list containing
+# all the items listed in dataList.
+
+if __name__ == '__main__':
+ dataList = ["Item 1", "Item 2", "Item 3", "Item 4"]
+
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+
+ ctxt = view.rootContext()
+ ctxt.setContextProperty("myModel", dataList)
+
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+
+ app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
diff --git a/examples/declarative/signals/pytoqml1/main.py b/examples/declarative/signals/pytoqml1/main.py
new file mode 100644
index 000000000..e90a3cfab
--- /dev/null
+++ b/examples/declarative/signals/pytoqml1/main.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QTimer, QUrl
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+
+ timer = QTimer()
+ timer.start(2000)
+
+ view = QQuickView()
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ root = view.rootObject()
+
+ timer.timeout.connect(root.updateRotater)
+
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/signals/pytoqml1/view.qml b/examples/declarative/signals/pytoqml1/view.qml
new file mode 100644
index 000000000..21ba8aa65
--- /dev/null
+++ b/examples/declarative/signals/pytoqml1/view.qml
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: page
+
+ function updateRotater() {
+ rotater.angle = rotater.angle + 45
+ }
+
+ width: 500; height: 200
+ color: "lightgray"
+
+ Rectangle {
+ id: rotater
+ property real angle : 0
+ x: 240
+ width: 100; height: 10
+ color: "black"
+ y: 95
+
+ transform: Rotation {
+ origin.x: 10; origin.y: 5
+ angle: rotater.angle
+ Behavior on angle {
+ SpringAnimation {
+ spring: 1.4
+ damping: .05
+ }
+ }
+ }
+ }
+
+}
diff --git a/examples/declarative/signals/qmltopy1/main.py b/examples/declarative/signals/qmltopy1/main.py
new file mode 100755
index 000000000..ba5684951
--- /dev/null
+++ b/examples/declarative/signals/qmltopy1/main.py
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QObject, QUrl, Slot
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+class Console(QObject):
+ """Output stuff on the console."""
+
+ @Slot(str)
+ @Slot('double')
+ def output(self, s):
+ print(s)
+
+ @Slot(str)
+ def outputStr(self, s):
+ print(s)
+
+ @Slot('double')
+ def outputFloat(self, x):
+ print(x)
+
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+
+ # Instantiate the Python object.
+ con = Console()
+
+ # Expose the object to QML.
+ context = view.rootContext()
+ context.setContextProperty("con", con)
+
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/signals/qmltopy1/view.qml b/examples/declarative/signals/qmltopy1/view.qml
new file mode 100644
index 000000000..0115d432b
--- /dev/null
+++ b/examples/declarative/signals/qmltopy1/view.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+
+import QtQuick 2.0
+
+Rectangle {
+ id: page
+
+ width: 500; height: 200
+ color: "lightgray"
+
+ Text {
+ id: helloText
+ text: "Hello world!"
+ anchors.horizontalCenter: page.horizontalCenter
+ y: 30
+ font.pointSize: 24; font.bold: true
+ }
+
+ Rectangle {
+ id: button
+ width: 150; height: 40
+ color: "darkgray"
+ anchors.horizontalCenter: page.horizontalCenter
+ y: 120
+ MouseArea {
+ id: buttonMouseArea
+ objectName: "buttonMouseArea"
+ anchors.fill: parent
+ onClicked: {
+ // once the "con" context has been declared,
+ // slots can be called like functions
+ con.outputFloat(123)
+ con.outputStr("foobar")
+ con.output(helloText.x)
+ con.output(helloText.text)
+ }
+ }
+ Text {
+ id: buttonText
+ text: "Press me!"
+ anchors.horizontalCenter: button.horizontalCenter
+ anchors.verticalCenter: button.verticalCenter
+ font.pointSize: 16
+ }
+ }
+}
diff --git a/examples/declarative/signals/qmltopy2/main.py b/examples/declarative/signals/qmltopy2/main.py
new file mode 100755
index 000000000..be8692c08
--- /dev/null
+++ b/examples/declarative/signals/qmltopy2/main.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QObject, QUrl, Slot
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+class RotateValue(QObject):
+ def __init__(self):
+ super(RotateValue,self).__init__()
+ self.r = 0
+
+ # If a slot returns a value, the return value type must be explicitly
+ # defined in the decorator.
+ @Slot(result=int)
+ def val(self):
+ self.r = self.r + 10
+ return self.r
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+
+ rotatevalue = RotateValue()
+ context = view.rootContext()
+ context.setContextProperty("rotatevalue", rotatevalue)
+
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/signals/qmltopy2/view.qml b/examples/declarative/signals/qmltopy2/view.qml
new file mode 100644
index 000000000..2a905a69f
--- /dev/null
+++ b/examples/declarative/signals/qmltopy2/view.qml
@@ -0,0 +1,80 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: page
+
+ width: 500; height: 200
+ color: "lightgray"
+
+ Text {
+ id: helloText
+ text: "Hello world!"
+ anchors.horizontalCenter: page.horizontalCenter
+ y: 30
+ font.pointSize: 24; font.bold: true
+ }
+
+
+ Rectangle {
+ id: button
+ width: 150; height: 40
+ color: "darkgray"
+ anchors.horizontalCenter: page.horizontalCenter
+ y: 120
+ MouseArea {
+ id: buttonMouseArea
+ objectName: "buttonMouseArea"
+ anchors.fill: parent
+ onClicked: {
+ helloText.rotation = rotatevalue.val()
+ }
+ }
+ Text {
+ id: buttonText
+ text: "Press me!"
+ anchors.horizontalCenter: button.horizontalCenter
+ anchors.verticalCenter: button.verticalCenter
+ font.pointSize: 16
+ }
+ }
+}
diff --git a/examples/declarative/signals/qmltopy3/main.py b/examples/declarative/signals/qmltopy3/main.py
new file mode 100644
index 000000000..81c19ee81
--- /dev/null
+++ b/examples/declarative/signals/qmltopy3/main.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QObject, QUrl
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+def sayThis(s):
+ print(s)
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+
+ root = view.rootObject()
+ root.textRotationChanged.connect(sayThis)
+ root.buttonClicked.connect(lambda: sayThis("clicked button (QML top-level signal)"))
+
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/signals/qmltopy3/view.qml b/examples/declarative/signals/qmltopy3/view.qml
new file mode 100644
index 000000000..72984a137
--- /dev/null
+++ b/examples/declarative/signals/qmltopy3/view.qml
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: page
+
+ signal buttonClicked
+ signal textRotationChanged(double rot)
+
+ width: 500; height: 200
+ color: "lightgray"
+
+ Text {
+ id: helloText
+ text: "Hello world!"
+ y: 30
+ x: page.width/2-width/2
+ font.pointSize: 24; font.bold: true
+ onRotationChanged: textRotationChanged(rotation)
+
+ states: State {
+ name: "down"; when: buttonMouseArea.pressed === true
+ PropertyChanges {
+ target: helloText;
+ rotation: 180;
+ y: 100;
+ }
+ }
+
+ transitions: Transition {
+ from: ""; to: "down"; reversible: true
+ ParallelAnimation {
+ NumberAnimation {
+ properties: "y,rotation"
+ duration: 500
+ easing.type: Easing.InOutQuad
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ id: button
+ width: 150; height: 40
+ color: "darkgray"
+ anchors.horizontalCenter: page.horizontalCenter
+ y: 120
+ MouseArea {
+ id: buttonMouseArea
+ objectName: "buttonMouseArea"
+ anchors.fill: parent
+ onClicked: {
+ buttonClicked()
+ }
+ }
+ Text {
+ id: buttonText
+ text: "Press me!"
+ anchors.horizontalCenter: button.horizontalCenter
+ anchors.verticalCenter: button.verticalCenter
+ font.pointSize: 16
+ }
+ }
+}
diff --git a/examples/declarative/signals/qmltopy4/main.py b/examples/declarative/signals/qmltopy4/main.py
new file mode 100644
index 000000000..5f180b349
--- /dev/null
+++ b/examples/declarative/signals/qmltopy4/main.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QObject, QUrl
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+def sayThis(s):
+ print(s)
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+
+ root = view.rootObject()
+ button = root.findChild(QObject, "buttonMouseArea")
+ button.clicked.connect(lambda: sayThis("clicked button (signal directly connected)"))
+
+ view.show()
+ res = app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
+ sys.exit(res)
diff --git a/examples/declarative/signals/qmltopy4/view.qml b/examples/declarative/signals/qmltopy4/view.qml
new file mode 100644
index 000000000..212df77e2
--- /dev/null
+++ b/examples/declarative/signals/qmltopy4/view.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: page
+
+ width: 500; height: 200
+ color: "lightgray"
+
+ Rectangle {
+ id: button
+ width: 150; height: 40
+ color: "darkgray"
+ anchors.horizontalCenter: page.horizontalCenter
+ anchors.verticalCenter: page.verticalCenter
+ MouseArea {
+ id: buttonMouseArea
+ objectName: "buttonMouseArea"
+ anchors.fill: parent
+ }
+ Text {
+ id: buttonText
+ text: "Press me!"
+ anchors.horizontalCenter: button.horizontalCenter
+ anchors.verticalCenter: button.verticalCenter
+ font.pointSize: 16
+ }
+ }
+}
diff --git a/examples/declarative/usingmodel.py b/examples/declarative/usingmodel.py
new file mode 100644
index 000000000..bd2e44693
--- /dev/null
+++ b/examples/declarative/usingmodel.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+from __future__ import print_function
+
+import os
+import sys
+from PySide2.QtCore import QAbstractListModel, Qt, QUrl
+from PySide2.QtGui import QGuiApplication
+import PySide2.QtQml
+from PySide2.QtQuick import QQuickView
+
+class PersonModel (QAbstractListModel):
+ MyRole = Qt.UserRole + 1
+
+ def __init__(self, parent = None):
+ QAbstractListModel.__init__(self, parent)
+ self._data = []
+
+ def roleNames(self):
+ roles = {
+ PersonModel.MyRole : 'modelData',
+ Qt.DisplayRole : 'display'
+ }
+ return roles
+
+ def rowCount(self, index):
+ return len(self._data)
+
+ def data(self, index, role):
+ d = self._data[index.row()]
+
+ if role == Qt.DisplayRole:
+ return d['name']
+ elif role == Qt.DecorationRole:
+ return Qt.black
+ elif role == PersonModel.MyRole:
+ return d['myrole']
+ return None
+
+ def populate(self):
+ self._data.append({'name':'Qt', 'myrole':'role1'})
+ self._data.append({'name':'PySide', 'myrole':'role2'})
+
+if __name__ == '__main__':
+ app = QGuiApplication(sys.argv)
+ view = QQuickView()
+ view.setResizeMode(QQuickView.SizeRootObjectToView)
+
+ myModel = PersonModel()
+ myModel.populate()
+
+ view.rootContext().setContextProperty("myModel", myModel)
+ qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml')
+ view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
+ if view.status() == QQuickView.Error:
+ sys.exit(-1)
+ view.show()
+
+ app.exec_()
+ # Deleting the view before it goes out of scope is required to make sure all child QML instances
+ # are destroyed in the correct order.
+ del view
diff --git a/examples/declarative/view.qml b/examples/declarative/view.qml
new file mode 100644
index 000000000..caf2dc1cc
--- /dev/null
+++ b/examples/declarative/view.qml
@@ -0,0 +1,65 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+ListView {
+ width: 100
+ height: 100
+ anchors.fill: parent
+ model: myModel
+ delegate: Component {
+ Rectangle {
+ height: 25
+ width: 100
+ Text {
+ function displayText() {
+ var result = ""
+ if (typeof display !== "undefined")
+ result = display + ": "
+ result += modelData
+ return result
+ }
+
+ text: displayText()
+ }
+ }
+ }
+}
diff --git a/examples/examples.pyqtc b/examples/examples.pyqtc
new file mode 100644
index 000000000..eb0e35933
--- /dev/null
+++ b/examples/examples.pyqtc
@@ -0,0 +1,103 @@
+charts/memoryusage.py
+corelib/threads/mandelbrot.py
+corelib/tools/codecs/codecs.py
+corelib/tools/regexp.py
+corelib/tools/settingseditor/settingseditor.py
+declarative/extending/chapter1-basics/basics.py
+declarative/extending/chapter2-methods/methods.py
+declarative/extending/chapter3-bindings/bindings.py
+declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py
+declarative/extending/chapter5-listproperties/listproperties.py
+declarative/scrolling.py
+declarative/signals/pytoqml1/main.py
+declarative/signals/qmltopy1/main.py
+declarative/signals/qmltopy2/main.py
+declarative/signals/qmltopy3/main.py
+declarative/signals/qmltopy4/main.py
+declarative/usingmodel.py
+macextras/macpasteboardmime.py
+multimedia/audiooutput.py
+multimedia/camera.py
+multimedia/player.py
+network/blockingfortuneclient.py
+network/fortuneclient.py
+network/fortuneserver.py
+network/threadedfortuneserver.py
+opengl/2dpainting.py
+opengl/grabber.py
+opengl/hellogl.py
+opengl/overpainting.py
+opengl/samplebuffers.py
+opengl/textures/textures.py
+script/helloscript.py
+texttospeech/texttospeech.py
+tutorial/t1.py
+tutorial/t10.py
+tutorial/t11.py
+tutorial/t12.py
+tutorial/t13.py
+tutorial/t14.py
+tutorial/t2.py
+tutorial/t3.py
+tutorial/t4.py
+tutorial/t5.py
+tutorial/t6.py
+tutorial/t7.py
+tutorial/t8.py
+tutorial/t9.py
+webenginewidgets/simplebrowser.py
+widgets/animation/animatedtiles/animatedtiles.py
+widgets/animation/appchooser/appchooser.py
+widgets/animation/easing/easing.py
+widgets/animation/states/states.py
+widgets/dialogs/classwizard/classwizard.py
+widgets/dialogs/extension.py
+widgets/dialogs/findfiles.py
+widgets/dialogs/standarddialogs.py
+widgets/dialogs/trivialwizard.py
+widgets/draganddrop/draggabletext/draggabletext.py
+widgets/effects/lighting.py
+widgets/graphicsview/anchorlayout.py
+widgets/graphicsview/collidingmice/collidingmice.py
+widgets/graphicsview/diagramscene/diagramscene.py
+widgets/graphicsview/dragdroprobot/dragdroprobot.py
+widgets/graphicsview/elasticnodes.py
+widgets/itemviews/addressbook/adddialogwidget.py
+widgets/itemviews/addressbook/addressbook.py
+widgets/itemviews/addressbook/addresswidget.py
+widgets/itemviews/addressbook/newaddresstab.py
+widgets/itemviews/addressbook/tablemodel.py
+widgets/itemviews/basicsortfiltermodel.py
+widgets/itemviews/fetchmore.py
+widgets/itemviews/stardelegate/stardelegate.py
+widgets/itemviews/stardelegate/stareditor.py
+widgets/itemviews/stardelegate/starrating.py
+widgets/layouts/basiclayouts.py
+widgets/layouts/dynamiclayouts.py
+widgets/layouts/flowlayout.py
+widgets/mainwindows/application/application.py
+widgets/mainwindows/dockwidgets/dockwidgets.py
+widgets/mainwindows/mdi/mdi.py
+widgets/painting/basicdrawing/basicdrawing.py
+widgets/painting/concentriccircles.py
+widgets/richtext/orderform.py
+widgets/richtext/syntaxhighlighter.py
+widgets/richtext/syntaxhighlighter/syntaxhighlighter.py
+widgets/richtext/textobject/textobject.py
+widgets/state-machine/eventtrans.py
+widgets/state-machine/factstates.py
+widgets/state-machine/pingpong.py
+widgets/state-machine/rogue.py
+widgets/state-machine/trafficlight.py
+widgets/state-machine/twowaybutton.py
+widgets/tutorials/addressbook/part1.py
+widgets/tutorials/addressbook/part2.py
+widgets/tutorials/addressbook/part3.py
+widgets/tutorials/addressbook/part4.py
+widgets/tutorials/addressbook/part5.py
+widgets/tutorials/addressbook/part6.py
+widgets/tutorials/addressbook/part7.py
+widgets/widgets/hellogl_openglwidget_legacy.py
+widgets/widgets/tetrix.py
+xml/dombookmarks/dombookmarks.py
+xmlpatterns/schema/schema.py
diff --git a/examples/macextras/macpasteboardmime.py b/examples/macextras/macpasteboardmime.py
new file mode 100755
index 000000000..0daa21a94
--- /dev/null
+++ b/examples/macextras/macpasteboardmime.py
@@ -0,0 +1,127 @@
+#!/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$
+##
+############################################################################
+
+import sys
+import math
+from PySide2 import QtCore, QtGui, QtWidgets
+
+try:
+ from PySide2 import QtMacExtras
+except ImportError:
+ app = QtWidgets.QApplication(sys.argv)
+ messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "QtMacExtras macpasteboardmime",
+ "This exampe only runs on macOS and QtMacExtras must be installed to run this example.",
+ QtWidgets.QMessageBox.Close)
+ messageBox.exec_()
+ sys.exit(1)
+
+class VCardMime(QtMacExtras.QMacPasteboardMime):
+ def __init__(self, t = QtMacExtras.QMacPasteboardMime.MIME_ALL):
+ super(VCardMime, self).__init__(t)
+
+ def convertorName(self):
+ return "VCardMime"
+
+ def canConvert(self, mime, flav):
+ if self.mimeFor(flav) == mime:
+ return True
+ else:
+ return False
+
+ def mimeFor(self, flav):
+ if flav == "public.vcard":
+ return "application/x-mycompany-VCard"
+ else:
+ return ""
+
+ def flavorFor(self, mime):
+ if mime == "application/x-mycompany-VCard":
+ return "public.vcard"
+ else:
+ return ""
+
+ def convertToMime(self, mime, data, flav):
+ all = QtCore.QByteArray()
+ for i in data:
+ all += i
+ return all
+
+ def convertFromMime(mime, data, flav):
+ # Todo: implement!
+ return []
+
+class TestWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ super(TestWidget, self).__init__(parent)
+ self.vcardMime = VCardMime()
+ self.setAcceptDrops(True)
+
+ self.label1 = QtWidgets.QLabel()
+ self.label2 = QtWidgets.QLabel()
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(self.label1)
+ layout.addWidget(self.label2)
+ self.setLayout(layout)
+
+ self.label1.setText("Please drag a \"VCard\" from Contacts application, normally a name in the list, and drop here.")
+
+ def dragEnterEvent(self, e):
+ e.accept()
+
+ def dropEvent(self, e):
+ e.accept()
+ self.contentsDropEvent(e)
+
+ def contentsDropEvent(self, e):
+ if e.mimeData().hasFormat("application/x-mycompany-VCard"):
+ s = e.mimeData().data( "application/x-mycompany-VCard" )
+ # s now contains text of vcard
+ self.label2.setText(str(s));
+ e.acceptProposedAction()
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+ QtMacExtras.qRegisterDraggedTypes(["public.vcard"])
+ wid1 = TestWidget()
+ wid1.show()
+ sys.exit(app.exec_())
diff --git a/examples/multimedia/audiooutput.py b/examples/multimedia/audiooutput.py
new file mode 100755
index 000000000..270683110
--- /dev/null
+++ b/examples/multimedia/audiooutput.py
@@ -0,0 +1,301 @@
+#!/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 multimedia/audiooutput example from Qt v5.x, originating from PyQt"""
+
+from math import pi, sin
+from struct import pack
+
+from PySide2.QtCore import QByteArray, QIODevice, Qt, QTimer, qWarning
+from PySide2.QtMultimedia import (QAudio, QAudioDeviceInfo, QAudioFormat,
+ QAudioOutput)
+from PySide2.QtWidgets import (QApplication, QComboBox, QHBoxLayout, QLabel,
+ QMainWindow, QPushButton, QSlider, QVBoxLayout, QWidget)
+
+
+class Generator(QIODevice):
+
+ def __init__(self, format, durationUs, sampleRate, parent):
+ super(Generator, self).__init__(parent)
+
+ self.m_pos = 0
+ self.m_buffer = QByteArray()
+
+ self.generateData(format, durationUs, sampleRate)
+
+ def start(self):
+ self.open(QIODevice.ReadOnly)
+
+ def stop(self):
+ self.m_pos = 0
+ self.close()
+
+ def generateData(self, format, durationUs, sampleRate):
+ pack_format = ''
+
+ if format.sampleSize() == 8:
+ if format.sampleType() == QAudioFormat.UnSignedInt:
+ scaler = lambda x: ((1.0 + x) / 2 * 255)
+ pack_format = 'B'
+ elif format.sampleType() == QAudioFormat.SignedInt:
+ scaler = lambda x: x * 127
+ pack_format = 'b'
+ elif format.sampleSize() == 16:
+ if format.sampleType() == QAudioFormat.UnSignedInt:
+ scaler = lambda x: (1.0 + x) / 2 * 65535
+ pack_format = '<H' if format.byteOrder() == QAudioFormat.LittleEndian else '>H'
+ elif format.sampleType() == QAudioFormat.SignedInt:
+ scaler = lambda x: x * 32767
+ pack_format = '<h' if format.byteOrder() == QAudioFormat.LittleEndian else '>h'
+
+ assert(pack_format != '')
+
+ channelBytes = format.sampleSize() // 8
+ sampleBytes = format.channelCount() * channelBytes
+
+ length = (format.sampleRate() * format.channelCount() * (format.sampleSize() // 8)) * durationUs // 100000
+
+ self.m_buffer.clear()
+ sampleIndex = 0
+ factor = 2 * pi * sampleRate / format.sampleRate()
+
+ while length != 0:
+ x = sin((sampleIndex % format.sampleRate()) * factor)
+ packed = pack(pack_format, int(scaler(x)))
+
+ for _ in range(format.channelCount()):
+ self.m_buffer.append(packed)
+ length -= channelBytes
+
+ sampleIndex += 1
+
+ def readData(self, maxlen):
+ data = QByteArray()
+ total = 0
+
+ while maxlen > total:
+ chunk = min(self.m_buffer.size() - self.m_pos, maxlen - total)
+ data.append(self.m_buffer.mid(self.m_pos, chunk))
+ self.m_pos = (self.m_pos + chunk) % self.m_buffer.size()
+ total += chunk
+
+ return data.data()
+
+ def writeData(self, data):
+ return 0
+
+ def bytesAvailable(self):
+ return self.m_buffer.size() + super(Generator, self).bytesAvailable()
+
+
+class AudioTest(QMainWindow):
+
+ PUSH_MODE_LABEL = "Enable push mode"
+ PULL_MODE_LABEL = "Enable pull mode"
+ SUSPEND_LABEL = "Suspend playback"
+ RESUME_LABEL = "Resume playback"
+
+ DurationSeconds = 1
+ ToneSampleRateHz = 600
+ DataSampleRateHz = 44100
+
+ def __init__(self):
+ super(AudioTest, self).__init__()
+
+ self.m_device = QAudioDeviceInfo.defaultOutputDevice()
+ self.m_output = None
+
+ self.initializeWindow()
+ self.initializeAudio()
+
+ def initializeWindow(self):
+ layout = QVBoxLayout()
+
+ self.m_deviceBox = QComboBox()
+ self.m_deviceBox.activated[int].connect(self.deviceChanged)
+ for deviceInfo in QAudioDeviceInfo.availableDevices(QAudio.AudioOutput):
+ self.m_deviceBox.addItem(deviceInfo.deviceName(), deviceInfo)
+
+ layout.addWidget(self.m_deviceBox)
+
+ self.m_modeButton = QPushButton()
+ self.m_modeButton.clicked.connect(self.toggleMode)
+ self.m_modeButton.setText(self.PUSH_MODE_LABEL)
+
+ layout.addWidget(self.m_modeButton)
+
+ self.m_suspendResumeButton = QPushButton(
+ clicked=self.toggleSuspendResume)
+ self.m_suspendResumeButton.setText(self.SUSPEND_LABEL)
+
+ layout.addWidget(self.m_suspendResumeButton)
+
+ volumeBox = QHBoxLayout()
+ volumeLabel = QLabel("Volume:")
+ self.m_volumeSlider = QSlider(Qt.Horizontal, minimum=0, maximum=100,
+ singleStep=10)
+ self.m_volumeSlider.valueChanged.connect(self.volumeChanged)
+
+ volumeBox.addWidget(volumeLabel)
+ volumeBox.addWidget(self.m_volumeSlider)
+
+ layout.addLayout(volumeBox)
+
+ window = QWidget()
+ window.setLayout(layout)
+
+ self.setCentralWidget(window)
+
+ def initializeAudio(self):
+ self.m_pullTimer = QTimer(self)
+ self.m_pullTimer.timeout.connect(self.pullTimerExpired)
+ self.m_pullMode = True
+
+ self.m_format = QAudioFormat()
+ self.m_format.setSampleRate(self.DataSampleRateHz)
+ self.m_format.setChannelCount(1)
+ self.m_format.setSampleSize(16)
+ self.m_format.setCodec('audio/pcm')
+ self.m_format.setByteOrder(QAudioFormat.LittleEndian)
+ self.m_format.setSampleType(QAudioFormat.SignedInt)
+
+ info = QAudioDeviceInfo(QAudioDeviceInfo.defaultOutputDevice())
+ if not info.isFormatSupported(self.m_format):
+ qWarning("Default format not supported - trying to use nearest")
+ self.m_format = info.nearestFormat(self.m_format)
+
+ self.m_generator = Generator(self.m_format,
+ self.DurationSeconds * 1000000, self.ToneSampleRateHz, self)
+
+ self.createAudioOutput()
+
+ def createAudioOutput(self):
+ self.m_audioOutput = QAudioOutput(self.m_device, self.m_format)
+ self.m_audioOutput.notify.connect(self.notified)
+ self.m_audioOutput.stateChanged.connect(self.handleStateChanged)
+
+ self.m_generator.start()
+ self.m_audioOutput.start(self.m_generator)
+ self.m_volumeSlider.setValue(self.m_audioOutput.volume() * 100)
+
+ def deviceChanged(self, index):
+ self.m_pullTimer.stop()
+ self.m_generator.stop()
+ self.m_audioOutput.stop()
+ self.m_device = self.m_deviceBox.itemData(index)
+
+ self.createAudioOutput()
+
+ def volumeChanged(self, value):
+ if self.m_audioOutput is not None:
+ self.m_audioOutput.setVolume(value / 100.0)
+
+ def notified(self):
+ qWarning("bytesFree = %d, elapsedUSecs = %d, processedUSecs = %d" % (
+ self.m_audioOutput.bytesFree(),
+ self.m_audioOutput.elapsedUSecs(),
+ self.m_audioOutput.processedUSecs()))
+
+ def pullTimerExpired(self):
+ if self.m_audioOutput is not None and self.m_audioOutput.state() != QAudio.StoppedState:
+ chunks = self.m_audioOutput.bytesFree() // self.m_audioOutput.periodSize()
+ for _ in range(chunks):
+ data = self.m_generator.read(self.m_audioOutput.periodSize())
+ if data is None or len(data) != self.m_audioOutput.periodSize():
+ break
+
+ self.m_output.write(data)
+
+ def toggleMode(self):
+ self.m_pullTimer.stop()
+ self.m_audioOutput.stop()
+
+ if self.m_pullMode:
+ self.m_modeButton.setText(self.PULL_MODE_LABEL)
+ self.m_output = self.m_audioOutput.start()
+ self.m_pullMode = False
+ self.m_pullTimer.start(20)
+ else:
+ self.m_modeButton.setText(self.PUSH_MODE_LABEL)
+ self.m_pullMode = True
+ self.m_audioOutput.start(self.m_generator)
+
+ self.m_suspendResumeButton.setText(self.SUSPEND_LABEL)
+
+ def toggleSuspendResume(self):
+ if self.m_audioOutput.state() == QAudio.SuspendedState:
+ qWarning("status: Suspended, resume()")
+ self.m_audioOutput.resume()
+ self.m_suspendResumeButton.setText(self.SUSPEND_LABEL)
+ elif self.m_audioOutput.state() == QAudio.ActiveState:
+ qWarning("status: Active, suspend()")
+ self.m_audioOutput.suspend()
+ self.m_suspendResumeButton.setText(self.RESUME_LABEL)
+ elif self.m_audioOutput.state() == QAudio.StoppedState:
+ qWarning("status: Stopped, resume()")
+ self.m_audioOutput.resume()
+ self.m_suspendResumeButton.setText(self.SUSPEND_LABEL)
+ elif self.m_audioOutput.state() == QAudio.IdleState:
+ qWarning("status: IdleState")
+
+ stateMap = {
+ QAudio.ActiveState: "ActiveState",
+ QAudio.SuspendedState: "SuspendedState",
+ QAudio.StoppedState: "StoppedState",
+ QAudio.IdleState: "IdleState"}
+
+ def handleStateChanged(self, state):
+ qWarning("state = " + self.stateMap.get(state, "Unknown"))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ app.setApplicationName("Audio Output Test")
+
+ audio = AudioTest()
+ audio.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/multimedia/camera.py b/examples/multimedia/camera.py
new file mode 100644
index 000000000..1b8d5ad47
--- /dev/null
+++ b/examples/multimedia/camera.py
@@ -0,0 +1,170 @@
+#!/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 Multimedia Camera Example"""
+
+import os, sys
+from PySide2.QtCore import QDate, QDir, QStandardPaths, Qt, QUrl
+from PySide2.QtGui import QClipboard, QGuiApplication, QDesktopServices, QIcon
+from PySide2.QtGui import QImage, QPixmap
+from PySide2.QtWidgets import (QAction, qApp, QApplication, QHBoxLayout, QLabel,
+ QMainWindow, QPushButton, QTabWidget, QToolBar, QVBoxLayout, QWidget)
+from PySide2.QtMultimedia import QCamera, QCameraImageCapture, QCameraInfo
+from PySide2.QtMultimediaWidgets import QCameraViewfinder
+
+class ImageView(QWidget):
+ def __init__(self, previewImage, fileName):
+ super(ImageView, self).__init__()
+
+ self.fileName = fileName
+
+ mainLayout = QVBoxLayout(self)
+ self.imageLabel = QLabel()
+ self.imageLabel.setPixmap(QPixmap.fromImage(previewImage))
+ mainLayout.addWidget(self.imageLabel)
+
+ topLayout = QHBoxLayout()
+ self.fileNameLabel = QLabel(QDir.toNativeSeparators(fileName))
+ self.fileNameLabel.setTextInteractionFlags(Qt.TextBrowserInteraction)
+
+ topLayout.addWidget(self.fileNameLabel)
+ topLayout.addStretch()
+ copyButton = QPushButton("Copy")
+ copyButton.setToolTip("Copy file name to clipboard")
+ topLayout.addWidget(copyButton)
+ copyButton.clicked.connect(self.copy)
+ launchButton = QPushButton("Launch")
+ launchButton.setToolTip("Launch image viewer")
+ topLayout.addWidget(launchButton)
+ launchButton.clicked.connect(self.launch)
+ mainLayout.addLayout(topLayout)
+
+ def copy(self):
+ QGuiApplication.clipboard().setText(self.fileNameLabel.text())
+
+ def launch(self):
+ QDesktopServices.openUrl(QUrl.fromLocalFile(self.fileName))
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.cameraInfo = QCameraInfo.defaultCamera()
+ self.camera = QCamera(self.cameraInfo)
+ self.camera.setCaptureMode(QCamera.CaptureStillImage)
+ self.imageCapture = QCameraImageCapture(self.camera)
+ self.imageCapture.imageCaptured.connect(self.imageCaptured)
+ self.imageCapture.imageSaved.connect(self.imageSaved)
+ self.currentPreview = QImage()
+
+ toolBar = QToolBar()
+ self.addToolBar(toolBar)
+
+ fileMenu = self.menuBar().addMenu("&File")
+ shutterIcon = QIcon(os.path.join(os.path.dirname(__file__),
+ "shutter.svg"))
+ self.takePictureAction = QAction(shutterIcon, "&Take Picture", self,
+ shortcut="Ctrl+T",
+ triggered=self.takePicture)
+ self.takePictureAction.setToolTip("Take Picture")
+ fileMenu.addAction(self.takePictureAction)
+ toolBar.addAction(self.takePictureAction)
+
+ exitAction = QAction(QIcon.fromTheme("application-exit"), "E&xit",
+ self, shortcut="Ctrl+Q", triggered=self.close)
+ fileMenu.addAction(exitAction)
+
+ aboutMenu = self.menuBar().addMenu("&About")
+ aboutQtAction = QAction("About &Qt", self, triggered=qApp.aboutQt)
+ aboutMenu.addAction(aboutQtAction)
+
+ self.tabWidget = QTabWidget()
+ self.setCentralWidget(self.tabWidget)
+
+ self.cameraViewfinder = QCameraViewfinder()
+ self.camera.setViewfinder(self.cameraViewfinder)
+ self.tabWidget.addTab(self.cameraViewfinder, "Viewfinder")
+
+ if self.camera.status() != QCamera.UnavailableStatus:
+ name = self.cameraInfo.description()
+ self.setWindowTitle("PySide2 Camera Example (" + name + ")")
+ self.statusBar().showMessage("Starting: '" + name + "'", 5000)
+ self.camera.start()
+ else:
+ self.setWindowTitle("PySide2 Camera Example")
+ self.takePictureAction.setEnabled(False)
+ self.statusBar().showMessage("Camera unavailable", 5000)
+
+ def nextImageFileName(self):
+ picturesLocation = QStandardPaths.writableLocation(QStandardPaths.PicturesLocation)
+ dateString = QDate.currentDate().toString("yyyyMMdd")
+ pattern = picturesLocation + "/pyside2_camera_" + dateString + "_{:03d}.jpg"
+ n = 1
+ while True:
+ result = pattern.format(n)
+ if not os.path.exists(result):
+ return result
+ n = n + 1
+ return None
+
+ def takePicture(self):
+ self.currentPreview = QImage()
+ self.camera.searchAndLock()
+ self.imageCapture.capture(self.nextImageFileName())
+ self.camera.unlock()
+
+ def imageCaptured(self, id, previewImage):
+ self.currentPreview = previewImage
+
+ def imageSaved(self, id, fileName):
+ index = self.tabWidget.count()
+ imageView = ImageView(self.currentPreview, fileName)
+ self.tabWidget.addTab(imageView, "Capture #{}".format(index))
+ self.tabWidget.setCurrentIndex(index)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2)
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/multimedia/player.py b/examples/multimedia/player.py
new file mode 100644
index 000000000..76445cd30
--- /dev/null
+++ b/examples/multimedia/player.py
@@ -0,0 +1,158 @@
+#!/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 Multimedia player example"""
+
+import sys
+from PySide2.QtCore import SLOT, QStandardPaths, Qt
+from PySide2.QtGui import QIcon, QKeySequence
+from PySide2.QtWidgets import (QAction, qApp, QApplication, QDialog, QFileDialog,
+ QMainWindow, QMenu, QMenuBar, QSlider, QStyle, QToolBar)
+from PySide2.QtMultimedia import QMediaPlayer, QMediaPlaylist
+from PySide2.QtMultimediaWidgets import QVideoWidget
+
+class MainWindow(QMainWindow):
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.playlist = QMediaPlaylist()
+ self.player = QMediaPlayer()
+
+ toolBar = QToolBar()
+ self.addToolBar(toolBar)
+
+ fileMenu = self.menuBar().addMenu("&File")
+ openAction = QAction(QIcon.fromTheme("document-open"),
+ "&Open...", self, shortcut=QKeySequence.Open,
+ triggered=self.open)
+ fileMenu.addAction(openAction)
+ exitAction = QAction(QIcon.fromTheme("application-exit"), "E&xit",
+ self, shortcut="Ctrl+Q", triggered=self.close)
+ fileMenu.addAction(exitAction)
+
+ playMenu = self.menuBar().addMenu("&Play")
+ playIcon = self.style().standardIcon(QStyle.SP_MediaPlay)
+ self.playAction = toolBar.addAction(playIcon, "Play")
+ self.playAction.triggered.connect(self.player.play)
+ playMenu.addAction(self.playAction)
+
+ previousIcon = self.style().standardIcon(QStyle.SP_MediaSkipBackward)
+ self.previousAction = toolBar.addAction(previousIcon, "Previous")
+ self.previousAction.triggered.connect(self.previousClicked)
+ playMenu.addAction(self.previousAction)
+
+ pauseIcon = self.style().standardIcon(QStyle.SP_MediaPause)
+ self.pauseAction = toolBar.addAction(pauseIcon, "Pause")
+ self.pauseAction.triggered.connect(self.player.pause)
+ playMenu.addAction(self.pauseAction)
+
+ nextIcon = self.style().standardIcon(QStyle.SP_MediaSkipForward)
+ self.nextAction = toolBar.addAction(nextIcon, "Next")
+ self.nextAction.triggered.connect(self.playlist.next)
+ playMenu.addAction(self.nextAction)
+
+ stopIcon = self.style().standardIcon(QStyle.SP_MediaStop)
+ self.stopAction = toolBar.addAction(stopIcon, "Stop")
+ self.stopAction.triggered.connect(self.player.stop)
+ playMenu.addAction(self.stopAction)
+
+ self.volumeSlider = QSlider()
+ self.volumeSlider.setOrientation(Qt.Horizontal)
+ self.volumeSlider.setMinimum(0)
+ self.volumeSlider.setMaximum(100)
+ self.volumeSlider.setFixedWidth(app.desktop().availableGeometry(self).width() / 10)
+ self.volumeSlider.setValue(self.player.volume())
+ self.volumeSlider.setTickInterval(10)
+ self.volumeSlider.setTickPosition(QSlider.TicksBelow)
+ self.volumeSlider.setToolTip("Volume")
+ self.volumeSlider.valueChanged.connect(self.player.setVolume)
+ toolBar.addWidget(self.volumeSlider)
+
+ aboutMenu = self.menuBar().addMenu("&About")
+ aboutQtAct = QAction("About &Qt", self, triggered=qApp.aboutQt)
+ aboutMenu.addAction(aboutQtAct)
+
+ self.videoWidget = QVideoWidget()
+ self.setCentralWidget(self.videoWidget)
+ self.player.setPlaylist(self.playlist);
+ self.player.stateChanged.connect(self.updateButtons)
+ self.player.setVideoOutput(self.videoWidget);
+
+ self.updateButtons(self.player.state())
+
+ def open(self):
+ fileDialog = QFileDialog(self)
+ supportedMimeTypes = QMediaPlayer.supportedMimeTypes()
+ if not supportedMimeTypes:
+ supportedMimeTypes.append("video/x-msvideo") # AVI
+ fileDialog.setMimeTypeFilters(supportedMimeTypes)
+ moviesLocation = QStandardPaths.writableLocation(QStandardPaths.MoviesLocation)
+ fileDialog.setDirectory(moviesLocation)
+ if fileDialog.exec_() == QDialog.Accepted:
+ self.playlist.addMedia(fileDialog.selectedUrls()[0])
+ self.player.play()
+
+ def previousClicked(self):
+ # Go to previous track if we are within the first 5 seconds of playback
+ # Otherwise, seek to the beginning.
+ if self.player.position() <= 5000:
+ self.playlist.previous();
+ else:
+ player.setPosition(0);
+
+ def updateButtons(self, state):
+ mediaCount = self.playlist.mediaCount()
+ self.playAction.setEnabled(mediaCount > 0
+ and state != QMediaPlayer.PlayingState)
+ self.pauseAction.setEnabled(state == QMediaPlayer.PlayingState)
+ self.stopAction.setEnabled(state != QMediaPlayer.StoppedState)
+ self.previousAction.setEnabled(self.player.position() > 0)
+ self.nextAction.setEnabled(mediaCount > 1)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2)
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/network/blockingfortuneclient.py b/examples/network/blockingfortuneclient.py
new file mode 100644
index 000000000..8e73af0f0
--- /dev/null
+++ b/examples/network/blockingfortuneclient.py
@@ -0,0 +1,225 @@
+#!/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 network/blockingfortunclient example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import (Signal, QDataStream, QMutex, QMutexLocker,
+ QThread, QWaitCondition)
+from PySide2.QtGui import QIntValidator
+from PySide2.QtWidgets import (QApplication, QDialogButtonBox, QGridLayout,
+ QLabel, QLineEdit, QMessageBox, QPushButton, QWidget)
+from PySide2.QtNetwork import (QAbstractSocket, QHostAddress, QNetworkInterface,
+ QTcpSocket)
+
+
+class FortuneThread(QThread):
+ newFortune = Signal(str)
+
+ error = Signal(int, str)
+
+ def __init__(self, parent=None):
+ super(FortuneThread, self).__init__(parent)
+
+ self.quit = False
+ self.hostName = ''
+ self.cond = QWaitCondition()
+ self.mutex = QMutex()
+ self.port = 0
+
+ def __del__(self):
+ self.mutex.lock()
+ self.quit = True
+ self.cond.wakeOne()
+ self.mutex.unlock()
+ self.wait()
+
+ def requestNewFortune(self, hostname, port):
+ locker = QMutexLocker(self.mutex)
+ self.hostName = hostname
+ self.port = port
+ if not self.isRunning():
+ self.start()
+ else:
+ self.cond.wakeOne()
+
+ def run(self):
+ self.mutex.lock()
+ serverName = self.hostName
+ serverPort = self.port
+ self.mutex.unlock()
+
+ while not self.quit:
+ Timeout = 5 * 1000
+
+ socket = QTcpSocket()
+ socket.connectToHost(serverName, serverPort)
+
+ if not socket.waitForConnected(Timeout):
+ self.error.emit(socket.error(), socket.errorString())
+ return
+
+ while socket.bytesAvailable() < 2:
+ if not socket.waitForReadyRead(Timeout):
+ self.error.emit(socket.error(), socket.errorString())
+ return
+
+ instr = QDataStream(socket)
+ instr.setVersion(QDataStream.Qt_4_0)
+ blockSize = instr.readUInt16()
+
+ while socket.bytesAvailable() < blockSize:
+ if not socket.waitForReadyRead(Timeout):
+ self.error.emit(socket.error(), socket.errorString())
+ return
+
+ self.mutex.lock()
+ fortune = instr.readQString()
+ self.newFortune.emit(fortune)
+
+ self.cond.wait(self.mutex)
+ serverName = self.hostName
+ serverPort = self.port
+ self.mutex.unlock()
+
+
+class BlockingClient(QWidget):
+ def __init__(self, parent=None):
+ super(BlockingClient, self).__init__(parent)
+
+ self.thread = FortuneThread()
+ self.currentFortune = ''
+
+ hostLabel = QLabel("&Server name:")
+ portLabel = QLabel("S&erver port:")
+
+ for ipAddress in QNetworkInterface.allAddresses():
+ if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0:
+ break
+ else:
+ ipAddress = QHostAddress(QHostAddress.LocalHost)
+
+ ipAddress = ipAddress.toString()
+
+ self.hostLineEdit = QLineEdit(ipAddress)
+ self.portLineEdit = QLineEdit()
+ self.portLineEdit.setValidator(QIntValidator(1, 65535, self))
+
+ hostLabel.setBuddy(self.hostLineEdit)
+ portLabel.setBuddy(self.portLineEdit)
+
+ self.statusLabel = QLabel(
+ "This example requires that you run the Fortune Server example as well.")
+ self.statusLabel.setWordWrap(True)
+
+ self.getFortuneButton = QPushButton("Get Fortune")
+ self.getFortuneButton.setDefault(True)
+ self.getFortuneButton.setEnabled(False)
+
+ quitButton = QPushButton("Quit")
+
+ buttonBox = QDialogButtonBox()
+ buttonBox.addButton(self.getFortuneButton, QDialogButtonBox.ActionRole)
+ buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole)
+
+ self.getFortuneButton.clicked.connect(self.requestNewFortune)
+ quitButton.clicked.connect(self.close)
+ self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton)
+ self.portLineEdit.textChanged.connect(self.enableGetFortuneButton)
+ self.thread.newFortune.connect(self.showFortune)
+ self.thread.error.connect(self.displayError)
+
+ mainLayout = QGridLayout()
+ mainLayout.addWidget(hostLabel, 0, 0)
+ mainLayout.addWidget(self.hostLineEdit, 0, 1)
+ mainLayout.addWidget(portLabel, 1, 0)
+ mainLayout.addWidget(self.portLineEdit, 1, 1)
+ mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2)
+ mainLayout.addWidget(buttonBox, 3, 0, 1, 2)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Blocking Fortune Client")
+ self.portLineEdit.setFocus()
+
+ def requestNewFortune(self):
+ self.getFortuneButton.setEnabled(False)
+ self.thread.requestNewFortune(self.hostLineEdit.text(),
+ int(self.portLineEdit.text()))
+
+ def showFortune(self, nextFortune):
+ if nextFortune == self.currentFortune:
+ self.requestNewFortune()
+ return
+
+ self.currentFortune = nextFortune
+ self.statusLabel.setText(self.currentFortune)
+ self.getFortuneButton.setEnabled(True)
+
+ def displayError(self, socketError, message):
+ if socketError == QAbstractSocket.HostNotFoundError:
+ QMessageBox.information(self, "Blocking Fortune Client",
+ "The host was not found. Please check the host and port "
+ "settings.")
+ elif socketError == QAbstractSocket.ConnectionRefusedError:
+ QMessageBox.information(self, "Blocking Fortune Client",
+ "The connection was refused by the peer. Make sure the "
+ "fortune server is running, and check that the host name "
+ "and port settings are correct.")
+ else:
+ QMessageBox.information(self, "Blocking Fortune Client",
+ "The following error occurred: %s." % message)
+
+ self.getFortuneButton.setEnabled(True)
+
+ def enableGetFortuneButton(self):
+ self.getFortuneButton.setEnabled(self.hostLineEdit.text() != '' and
+ self.portLineEdit.text() != '')
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ client = BlockingClient()
+ client.show()
+ sys.exit(app.exec_())
diff --git a/examples/network/fortuneclient.py b/examples/network/fortuneclient.py
new file mode 100755
index 000000000..3ec5623b8
--- /dev/null
+++ b/examples/network/fortuneclient.py
@@ -0,0 +1,168 @@
+#!/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 network/fortuneclient example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtNetwork
+
+
+class Client(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(Client, self).__init__(parent)
+
+ self.blockSize = 0
+ self.currentFortune = ''
+
+ hostLabel = QtWidgets.QLabel("&Server name:")
+ portLabel = QtWidgets.QLabel("S&erver port:")
+
+ self.hostLineEdit = QtWidgets.QLineEdit('Localhost')
+ self.portLineEdit = QtWidgets.QLineEdit()
+ self.portLineEdit.setValidator(QtGui.QIntValidator(1, 65535, self))
+
+ hostLabel.setBuddy(self.hostLineEdit)
+ portLabel.setBuddy(self.portLineEdit)
+
+ self.statusLabel = QtWidgets.QLabel("This examples requires that you run "
+ "the Fortune Server example as well.")
+
+ self.getFortuneButton = QtWidgets.QPushButton("Get Fortune")
+ self.getFortuneButton.setDefault(True)
+ self.getFortuneButton.setEnabled(False)
+
+ quitButton = QtWidgets.QPushButton("Quit")
+
+ buttonBox = QtWidgets.QDialogButtonBox()
+ buttonBox.addButton(self.getFortuneButton,
+ QtWidgets.QDialogButtonBox.ActionRole)
+ buttonBox.addButton(quitButton, QtWidgets.QDialogButtonBox.RejectRole)
+
+ self.tcpSocket = QtNetwork.QTcpSocket(self)
+
+ self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton)
+ self.portLineEdit.textChanged.connect(self.enableGetFortuneButton)
+ self.getFortuneButton.clicked.connect(self.requestNewFortune)
+ quitButton.clicked.connect(self.close)
+ self.tcpSocket.readyRead.connect(self.readFortune)
+ self.tcpSocket.error.connect(self.displayError)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(hostLabel, 0, 0)
+ mainLayout.addWidget(self.hostLineEdit, 0, 1)
+ mainLayout.addWidget(portLabel, 1, 0)
+ mainLayout.addWidget(self.portLineEdit, 1, 1)
+ mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2)
+ mainLayout.addWidget(buttonBox, 3, 0, 1, 2)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Fortune Client")
+ self.portLineEdit.setFocus()
+
+ def requestNewFortune(self):
+ self.getFortuneButton.setEnabled(False)
+ self.blockSize = 0
+ self.tcpSocket.abort()
+ self.tcpSocket.connectToHost(self.hostLineEdit.text(),
+ int(self.portLineEdit.text()))
+
+ def readFortune(self):
+ instr = QtCore.QDataStream(self.tcpSocket)
+ instr.setVersion(QtCore.QDataStream.Qt_4_0)
+
+ if self.blockSize == 0:
+ if self.tcpSocket.bytesAvailable() < 2:
+ return
+
+ self.blockSize = instr.readUInt16()
+
+ if self.tcpSocket.bytesAvailable() < self.blockSize:
+ return
+
+ nextFortune = instr.readString()
+
+ try:
+ # Python v3.
+ nextFortune = str(nextFortune, encoding='ascii')
+ except TypeError:
+ # Python v2.
+ pass
+
+ if nextFortune == self.currentFortune:
+ QtCore.QTimer.singleShot(0, self.requestNewFortune)
+ return
+
+ self.currentFortune = nextFortune
+ self.statusLabel.setText(self.currentFortune)
+ self.getFortuneButton.setEnabled(True)
+
+ def displayError(self, socketError):
+ if socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError:
+ pass
+ elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
+ QtWidgets.QMessageBox.information(self, "Fortune Client",
+ "The host was not found. Please check the host name and "
+ "port settings.")
+ elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
+ QtWidgets.QMessageBox.information(self, "Fortune Client",
+ "The connection was refused by the peer. Make sure the "
+ "fortune server is running, and check that the host name "
+ "and port settings are correct.")
+ else:
+ QtWidgets.QMessageBox.information(self, "Fortune Client",
+ "The following error occurred: %s." % self.tcpSocket.errorString())
+
+ self.getFortuneButton.setEnabled(True)
+
+ def enableGetFortuneButton(self):
+ self.getFortuneButton.setEnabled(bool(self.hostLineEdit.text() and
+ self.portLineEdit.text()))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ client = Client()
+ client.show()
+ sys.exit(client.exec_())
diff --git a/examples/network/fortuneserver.py b/examples/network/fortuneserver.py
new file mode 100755
index 000000000..1c08f6e82
--- /dev/null
+++ b/examples/network/fortuneserver.py
@@ -0,0 +1,125 @@
+#!/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 network/fortuneserver example from Qt v5.x"""
+
+import random
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtNetwork
+
+
+class Server(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(Server, self).__init__(parent)
+
+ statusLabel = QtWidgets.QLabel()
+ quitButton = QtWidgets.QPushButton("Quit")
+ quitButton.setAutoDefault(False)
+
+ self.tcpServer = QtNetwork.QTcpServer(self)
+ if not self.tcpServer.listen():
+ QtWidgets.QMessageBox.critical(self, "Fortune Server",
+ "Unable to start the server: %s." % self.tcpServer.errorString())
+ self.close()
+ return
+
+ statusLabel.setText("The server is running on port %d.\nRun the "
+ "Fortune Client example now." % self.tcpServer.serverPort())
+
+ self.fortunes = (
+ "You've been leading a dog's life. Stay off the furniture.",
+ "You've got to think about tomorrow.",
+ "You will be surprised by a loud noise.",
+ "You will feel hungry again in another hour.",
+ "You might have mail.",
+ "You cannot kill time without injuring eternity.",
+ "Computers are not intelligent. They only think they are.")
+
+ quitButton.clicked.connect(self.close)
+ self.tcpServer.newConnection.connect(self.sendFortune)
+
+ buttonLayout = QtWidgets.QHBoxLayout()
+ buttonLayout.addStretch(1)
+ buttonLayout.addWidget(quitButton)
+ buttonLayout.addStretch(1)
+
+ mainLayout = QtWidgets.QVBoxLayout()
+ mainLayout.addWidget(statusLabel)
+ mainLayout.addLayout(buttonLayout)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Fortune Server")
+
+ def sendFortune(self):
+ block = QtCore.QByteArray()
+ out = QtCore.QDataStream(block, QtCore.QIODevice.WriteOnly)
+ out.setVersion(QtCore.QDataStream.Qt_4_0)
+ out.writeUInt16(0)
+ fortune = self.fortunes[random.randint(0, len(self.fortunes) - 1)]
+
+ try:
+ # Python v3.
+ fortune = bytes(fortune, encoding='ascii')
+ except:
+ # Python v2.
+ pass
+
+ out.writeString(fortune)
+ out.device().seek(0)
+ out.writeUInt16(block.size() - 2)
+
+ clientConnection = self.tcpServer.nextPendingConnection()
+ clientConnection.disconnected.connect(clientConnection.deleteLater)
+
+ clientConnection.write(block)
+ clientConnection.disconnectFromHost()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ server = Server()
+ random.seed(None)
+ sys.exit(server.exec_())
diff --git a/examples/network/threadedfortuneserver.py b/examples/network/threadedfortuneserver.py
new file mode 100755
index 000000000..95452e7e9
--- /dev/null
+++ b/examples/network/threadedfortuneserver.py
@@ -0,0 +1,153 @@
+#!/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 network/threadedfortuneserver example from Qt v5.x, originating from PyQt"""
+
+import random
+
+from PySide2.QtCore import (Signal, QByteArray, QDataStream, QIODevice,
+ QThread, Qt)
+from PySide2.QtWidgets import (QApplication, QDialog, QHBoxLayout, QLabel,
+ QMessageBox, QPushButton, QVBoxLayout)
+from PySide2.QtNetwork import (QHostAddress, QNetworkInterface, QTcpServer,
+ QTcpSocket)
+
+
+class FortuneThread(QThread):
+ error = Signal(QTcpSocket.SocketError)
+
+ def __init__(self, socketDescriptor, fortune, parent):
+ super(FortuneThread, self).__init__(parent)
+
+ self.socketDescriptor = socketDescriptor
+ self.text = fortune
+
+ def run(self):
+ tcpSocket = QTcpSocket()
+ if not tcpSocket.setSocketDescriptor(self.socketDescriptor):
+ self.error.emit(tcpSocket.error())
+ return
+
+ block = QByteArray()
+ outstr = QDataStream(block, QIODevice.WriteOnly)
+ outstr.setVersion(QDataStream.Qt_4_0)
+ outstr.writeUInt16(0)
+ outstr.writeQString(self.text)
+ outstr.device().seek(0)
+ outstr.writeUInt16(block.size() - 2)
+
+ tcpSocket.write(block)
+ tcpSocket.disconnectFromHost()
+ tcpSocket.waitForDisconnected()
+
+
+class FortuneServer(QTcpServer):
+ fortunes = (
+ "You've been leading a dog's life. Stay off the furniture.",
+ "You've got to think about tomorrow.",
+ "You will be surprised by a loud noise.",
+ "You will feel hungry again in another hour.",
+ "You might have mail.",
+ "You cannot kill time without injuring eternity.",
+ "Computers are not intelligent. They only think they are.")
+
+ def incomingConnection(self, socketDescriptor):
+ fortune = self.fortunes[random.randint(0, len(self.fortunes) - 1)]
+
+ thread = FortuneThread(socketDescriptor, fortune, self)
+ thread.finished.connect(thread.deleteLater)
+ thread.start()
+
+
+class Dialog(QDialog):
+ def __init__(self, parent=None):
+ super(Dialog, self).__init__(parent)
+
+ self.server = FortuneServer()
+
+ statusLabel = QLabel()
+ statusLabel.setTextInteractionFlags(Qt.TextBrowserInteraction)
+ statusLabel.setWordWrap(True)
+ quitButton = QPushButton("Quit")
+ quitButton.setAutoDefault(False)
+
+ if not self.server.listen():
+ QMessageBox.critical(self, "Threaded Fortune Server",
+ "Unable to start the server: %s." % self.server.errorString())
+ self.close()
+ return
+
+ for ipAddress in QNetworkInterface.allAddresses():
+ if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0:
+ break
+ else:
+ ipAddress = QHostAddress(QHostAddress.LocalHost)
+
+ ipAddress = ipAddress.toString()
+
+ statusLabel.setText("The server is running on\n\nIP: %s\nport: %d\n\n"
+ "Run the Fortune Client example now." % (ipAddress, self.server.serverPort()))
+
+ quitButton.clicked.connect(self.close)
+
+ buttonLayout = QHBoxLayout()
+ buttonLayout.addStretch(1)
+ buttonLayout.addWidget(quitButton)
+ buttonLayout.addStretch(1)
+
+ mainLayout = QVBoxLayout()
+ mainLayout.addWidget(statusLabel)
+ mainLayout.addLayout(buttonLayout)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Threaded Fortune Server")
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ dialog = Dialog()
+ dialog.show()
+ sys.exit(dialog.exec_())
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/hellogl2.py b/examples/opengl/hellogl2.py
new file mode 100755
index 000000000..29a68269e
--- /dev/null
+++ b/examples/opengl/hellogl2.py
@@ -0,0 +1,473 @@
+#!/usr/bin/env python
+
+############################################################################
+##
+## Copyright (C) 2013 Riverbank Computing Limited.
+## Copyright (C) 2018 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/hellogl2 example from Qt v5.x"""
+
+import sys
+import math
+import numpy
+import ctypes
+from PySide2.QtCore import QCoreApplication, Signal, SIGNAL, SLOT, Qt, QSize, QPoint
+from PySide2.QtGui import (QVector3D, QOpenGLFunctions, QOpenGLVertexArrayObject, QOpenGLBuffer,
+ QOpenGLShaderProgram, QMatrix4x4, QOpenGLShader, QOpenGLContext, QSurfaceFormat)
+from PySide2.QtWidgets import (QApplication, QWidget, QMessageBox, QHBoxLayout, QSlider,
+ QOpenGLWidget)
+from PySide2.shiboken2 import VoidPtr
+
+try:
+ from OpenGL import GL
+except ImportError:
+ app = QApplication(sys.argv)
+ messageBox = QMessageBox(QMessageBox.Critical, "OpenGL hellogl",
+ "PyOpenGL must be installed to run this example.",
+ QMessageBox.Close)
+ messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
+ messageBox.exec_()
+ sys.exit(1)
+
+
+class Window(QWidget):
+ def __init__(self, parent=None):
+ QWidget.__init__(self, parent)
+
+ self.glWidget = GLWidget()
+
+ self.xSlider = self.createSlider(SIGNAL("xRotationChanged(int)"),
+ self.glWidget.setXRotation)
+ self.ySlider = self.createSlider(SIGNAL("yRotationChanged(int)"),
+ self.glWidget.setYRotation)
+ self.zSlider = self.createSlider(SIGNAL("zRotationChanged(int)"),
+ self.glWidget.setZRotation)
+
+ mainLayout = QHBoxLayout()
+ mainLayout.addWidget(self.glWidget)
+ mainLayout.addWidget(self.xSlider)
+ mainLayout.addWidget(self.ySlider)
+ mainLayout.addWidget(self.zSlider)
+ self.setLayout(mainLayout)
+
+ self.xSlider.setValue(15 * 16)
+ self.ySlider.setValue(345 * 16)
+ self.zSlider.setValue(0 * 16)
+
+ self.setWindowTitle(self.tr("Hello GL"))
+
+ def createSlider(self, changedSignal, setterSlot):
+ slider = QSlider(Qt.Vertical)
+
+ slider.setRange(0, 360 * 16)
+ slider.setSingleStep(16)
+ slider.setPageStep(15 * 16)
+ slider.setTickInterval(15 * 16)
+ slider.setTickPosition(QSlider.TicksRight)
+
+ self.glWidget.connect(slider, SIGNAL("valueChanged(int)"), setterSlot)
+ self.connect(self.glWidget, changedSignal, slider, SLOT("setValue(int)"))
+
+ return slider
+
+ def keyPressEvent(self, event):
+ if event.key() == Qt.Key_Escape:
+ self.close()
+ else:
+ super(Window, self).keyPressEvent(event)
+
+class Logo():
+ def __init__(self):
+ self.m_count = 0
+ self.i = 0
+ self.m_data = numpy.empty(2500 * 6, dtype = ctypes.c_float)
+
+ 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 = 100
+
+ for i in range(NumSectors):
+ angle = (i * 2 * Pi) / NumSectors
+ x5 = 0.30 * math.sin(angle)
+ y5 = 0.30 * math.cos(angle)
+ x6 = 0.20 * math.sin(angle)
+ y6 = 0.20 * math.cos(angle)
+
+ angle = ((i + 1) * 2 * Pi) / NumSectors
+ x7 = 0.20 * math.sin(angle)
+ y7 = 0.20 * math.cos(angle)
+ x8 = 0.30 * math.sin(angle)
+ y8 = 0.30 * math.cos(angle)
+
+ self.quad(x5, y5, x6, y6, x7, y7, x8, y8)
+
+ self.extrude(x6, y6, x7, y7)
+ self.extrude(x8, y8, x5, y5)
+
+ def constData(self):
+ return self.m_data.tobytes()
+
+ def count(self):
+ return self.m_count
+
+ def vertexCount(self):
+ return self.m_count / 6
+
+ def quad(self, x1, y1, x2, y2, x3, y3, x4, y4):
+ n = QVector3D.normal(QVector3D(x4 - x1, y4 - y1, 0), QVector3D(x2 - x1, y2 - y1, 0))
+
+ self.add(QVector3D(x1, y1, -0.05), n)
+ self.add(QVector3D(x4, y4, -0.05), n)
+ self.add(QVector3D(x2, y2, -0.05), n)
+
+ self.add(QVector3D(x3, y3, -0.05), n)
+ self.add(QVector3D(x2, y2, -0.05), n)
+ self.add(QVector3D(x4, y4, -0.05), n)
+
+ n = QVector3D.normal(QVector3D(x1 - x4, y1 - y4, 0), QVector3D(x2 - x4, y2 - y4, 0))
+
+ self.add(QVector3D(x4, y4, 0.05), n)
+ self.add(QVector3D(x1, y1, 0.05), n)
+ self.add(QVector3D(x2, y2, 0.05), n)
+
+ self.add(QVector3D(x2, y2, 0.05), n)
+ self.add(QVector3D(x3, y3, 0.05), n)
+ self.add(QVector3D(x4, y4, 0.05), n)
+
+ def extrude(self, x1, y1, x2, y2):
+ n = QVector3D.normal(QVector3D(0, 0, -0.1), QVector3D(x2 - x1, y2 - y1, 0))
+
+ self.add(QVector3D(x1, y1, 0.05), n)
+ self.add(QVector3D(x1, y1, -0.05), n)
+ self.add(QVector3D(x2, y2, 0.05), n)
+
+ self.add(QVector3D(x2, y2, -0.05), n)
+ self.add(QVector3D(x2, y2, 0.05), n)
+ self.add(QVector3D(x1, y1, -0.05), n)
+
+ def add(self, v, n):
+ self.m_data[self.i] = v.x()
+ self.i += 1
+ self.m_data[self.i] = v.y()
+ self.i += 1
+ self.m_data[self.i] = v.z()
+ self.i += 1
+ self.m_data[self.i] = n.x()
+ self.i += 1
+ self.m_data[self.i] = n.y()
+ self.i += 1
+ self.m_data[self.i] = n.z()
+ self.i += 1
+ self.m_count += 6
+
+class GLWidget(QOpenGLWidget, QOpenGLFunctions):
+ xRotationChanged = Signal(int)
+ yRotationChanged = Signal(int)
+ zRotationChanged = Signal(int)
+
+ def __init__(self, parent=None):
+ QOpenGLWidget.__init__(self, parent)
+ QOpenGLFunctions.__init__(self)
+
+ self.core = "--coreprofile" in QCoreApplication.arguments()
+ self.xRot = 0
+ self.yRot = 0
+ self.zRot = 0
+ self.lastPos = 0
+ self.logo = Logo()
+ self.vao = QOpenGLVertexArrayObject()
+ self.logoVbo = QOpenGLBuffer()
+ self.program = QOpenGLShaderProgram()
+ self.projMatrixLoc = 0
+ self.mvMatrixLoc = 0
+ self.normalMatrixLoc = 0
+ self.lightPosLoc = 0
+ self.proj = QMatrix4x4()
+ self.camera = QMatrix4x4()
+ self.world = QMatrix4x4()
+ self.transparent = "--transparent" in QCoreApplication.arguments()
+ if self.transparent:
+ fmt = self.format()
+ fmt.setAlphaBufferSize(8)
+ self.setFormat(fmt)
+
+ def xRotation(self):
+ return self.xRot
+
+ def yRotation(self):
+ return self.yRot
+
+ def zRotation(self):
+ return self.zRot
+
+ def minimumSizeHint(self):
+ return QSize(50, 50)
+
+ def sizeHint(self):
+ return QSize(400, 400)
+
+ def normalizeAngle(self, angle):
+ while angle < 0:
+ angle += 360 * 16
+ while angle > 360 * 16:
+ angle -= 360 * 16
+ return angle
+
+ def setXRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.xRot:
+ self.xRot = angle
+ self.emit(SIGNAL("xRotationChanged(int)"), angle)
+ self.update()
+
+ def setYRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.yRot:
+ self.yRot = angle
+ self.emit(SIGNAL("yRotationChanged(int)"), angle)
+ self.update()
+
+ def setZRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.zRot:
+ self.zRot = angle
+ self.emit(SIGNAL("zRotationChanged(int)"), angle)
+ self.update()
+
+ def cleanup(self):
+ self.makeCurrent()
+ self.logoVbo.destroy()
+ del self.program
+ self.program = None
+ self.doneCurrent()
+
+ def vertexShaderSourceCore(self):
+ return """#version 150
+ in vec4 vertex;
+ in vec3 normal;
+ out vec3 vert;
+ out vec3 vertNormal;
+ uniform mat4 projMatrix;
+ uniform mat4 mvMatrix;
+ uniform mat3 normalMatrix;
+ void main() {
+ vert = vertex.xyz;
+ vertNormal = normalMatrix * normal;
+ gl_Position = projMatrix * mvMatrix * vertex;
+ }"""
+
+ def fragmentShaderSourceCore(self):
+ return """#version 150
+ in highp vec3 vert;
+ in highp vec3 vertNormal;
+ out highp vec4 fragColor;
+ uniform highp vec3 lightPos;
+ void main() {
+ highp vec3 L = normalize(lightPos - vert);
+ highp float NL = max(dot(normalize(vertNormal), L), 0.0);
+ highp vec3 color = vec3(0.39, 1.0, 0.0);
+ highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0);
+ fragColor = vec4(col, 1.0);
+ }"""
+
+
+ def vertexShaderSource(self):
+ return """attribute vec4 vertex;
+ attribute vec3 normal;
+ varying vec3 vert;
+ varying vec3 vertNormal;
+ uniform mat4 projMatrix;
+ uniform mat4 mvMatrix;
+ uniform mat3 normalMatrix;
+ void main() {
+ vert = vertex.xyz;
+ vertNormal = normalMatrix * normal;
+ gl_Position = projMatrix * mvMatrix * vertex;
+ }"""
+
+ def fragmentShaderSource(self):
+ return """varying highp vec3 vert;
+ varying highp vec3 vertNormal;
+ uniform highp vec3 lightPos;
+ void main() {
+ highp vec3 L = normalize(lightPos - vert);
+ highp float NL = max(dot(normalize(vertNormal), L), 0.0);
+ highp vec3 color = vec3(0.39, 1.0, 0.0);
+ highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0);
+ gl_FragColor = vec4(col, 1.0);
+ }"""
+
+ def initializeGL(self):
+ self.context().aboutToBeDestroyed.connect(self.cleanup)
+ self.initializeOpenGLFunctions()
+ self.glClearColor(0, 0, 0, 1)
+
+ self.program = QOpenGLShaderProgram()
+
+ if self.core:
+ self.vertexShader = self.vertexShaderSourceCore()
+ self.fragmentShader = self.fragmentShaderSourceCore()
+ else:
+ self.vertexShader = self.vertexShaderSource()
+ self.fragmentShader = self.fragmentShaderSource()
+
+ self.program.addShaderFromSourceCode(QOpenGLShader.Vertex, self.vertexShader)
+ self.program.addShaderFromSourceCode(QOpenGLShader.Fragment, self.fragmentShader)
+ self.program.bindAttributeLocation("vertex", 0)
+ self.program.bindAttributeLocation("normal", 1)
+ self.program.link()
+
+ self.program.bind()
+ self.projMatrixLoc = self.program.uniformLocation("projMatrix")
+ self.mvMatrixLoc = self.program.uniformLocation("mvMatrix")
+ self.normalMatrixLoc = self.program.uniformLocation("normalMatrix")
+ self.lightPosLoc = self.program.uniformLocation("lightPos")
+
+ self.vao.create()
+ vaoBinder = QOpenGLVertexArrayObject.Binder(self.vao)
+
+ self.logoVbo.create()
+ self.logoVbo.bind()
+ float_size = ctypes.sizeof(ctypes.c_float)
+ self.logoVbo.allocate(self.logo.constData(), self.logo.count() * float_size)
+
+ self.setupVertexAttribs()
+
+ self.camera.setToIdentity()
+ self.camera.translate(0, 0, -1)
+
+ self.program.setUniformValue(self.lightPosLoc, QVector3D(0, 0, 70))
+ self.program.release()
+ vaoBinder = None
+
+ def setupVertexAttribs(self):
+ self.logoVbo.bind()
+ f = QOpenGLContext.currentContext().functions()
+ f.glEnableVertexAttribArray(0)
+ f.glEnableVertexAttribArray(1)
+ float_size = ctypes.sizeof(ctypes.c_float)
+
+ null = VoidPtr(0)
+ pointer = VoidPtr(3 * float_size)
+ f.glVertexAttribPointer(0, 3, int(GL.GL_FLOAT), int(GL.GL_FALSE), 6 * float_size, null)
+ f.glVertexAttribPointer(1, 3, int(GL.GL_FLOAT), int(GL.GL_FALSE), 6 * float_size, pointer)
+ self.logoVbo.release()
+
+ def paintGL(self):
+ self.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
+ self.glEnable(GL.GL_DEPTH_TEST)
+ self.glEnable(GL.GL_CULL_FACE)
+
+ self.world.setToIdentity()
+ self.world.rotate(180 - (self.xRot / 16), 1, 0, 0)
+ self.world.rotate(self.yRot / 16, 0, 1, 0)
+ self.world.rotate(self.zRot / 16, 0, 0, 1)
+
+ vaoBinder = QOpenGLVertexArrayObject.Binder(self.vao)
+ self.program.bind()
+ self.program.setUniformValue(self.projMatrixLoc, self.proj)
+ self.program.setUniformValue(self.mvMatrixLoc, self.camera * self.world)
+ normalMatrix = self.world.normalMatrix()
+ self.program.setUniformValue(self.normalMatrixLoc, normalMatrix)
+
+ self.glDrawArrays(GL.GL_TRIANGLES, 0, self.logo.vertexCount())
+ self.program.release()
+ vaoBinder = None
+
+ def resizeGL(self, width, height):
+ self.proj.setToIdentity()
+ self.proj.perspective(45, width / height, 0.01, 100)
+
+ 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())
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ fmt = QSurfaceFormat()
+ fmt.setDepthBufferSize(24)
+ if "--multisample" in QCoreApplication.arguments():
+ fmt.setSamples(4)
+ if "--coreprofile" in QCoreApplication.arguments():
+ fmt.setVersion(3, 2)
+ fmt.setProfile(QSurfaceFormat.CoreProfile)
+ QSurfaceFormat.setDefaultFormat(fmt)
+
+ mainWindow = Window()
+ if "--transparent" in QCoreApplication.arguments():
+ mainWindow.setAttribute(Qt.WA_TranslucentBackground)
+ mainWindow.setAttribute(Qt.WA_NoSystemBackground, False)
+
+ mainWindow.resize(mainWindow.sizeHint())
+ mainWindow.show()
+
+ res = app.exec_()
+ 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()
diff --git a/examples/script/helloscript.py b/examples/script/helloscript.py
new file mode 100755
index 000000000..5ae659f8a
--- /dev/null
+++ b/examples/script/helloscript.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 script/helloscript example from Qt v5.x"""
+
+import sys
+from PySide2 import QtWidgets, QtScript
+
+
+app = QtWidgets.QApplication(sys.argv)
+
+engine = QtScript.QScriptEngine()
+
+button = QtWidgets.QPushButton()
+scriptButton = engine.newQObject(button)
+engine.globalObject().setProperty("button", scriptButton)
+
+engine.evaluate("button.text = 'Hello World from PySide2!'")
+engine.evaluate("button.styleSheet = 'font-style: italic'")
+engine.evaluate("button.show()")
+
+sys.exit(app.exec_())
diff --git a/examples/scriptableapplication/CMakeLists.txt b/examples/scriptableapplication/CMakeLists.txt
new file mode 100644
index 000000000..40e29346a
--- /dev/null
+++ b/examples/scriptableapplication/CMakeLists.txt
@@ -0,0 +1,187 @@
+cmake_minimum_required(VERSION 3.1)
+cmake_policy(VERSION 3.1)
+
+# Enable policy to run automoc on generated files.
+if(POLICY CMP0071)
+ cmake_policy(SET CMP0071 NEW)
+endif()
+
+project(scriptableapplication)
+
+# Set CPP standard to C++11 minimum.
+set(CMAKE_CXX_STANDARD 11)
+
+# Find required Qt packages.
+find_package(Qt5 5.9 REQUIRED COMPONENTS Core Gui Widgets)
+
+# Macro to get various pyside / python include / link flags.
+macro(pyside2_config option output_var)
+ if(${ARGC} GREATER 2)
+ set(is_list ${ARGV2})
+ else()
+ set(is_list "")
+ endif()
+
+ execute_process(
+ COMMAND python "${CMAKE_SOURCE_DIR}/pyside2_config.py" ${option}
+ OUTPUT_VARIABLE ${output_var}
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ if ("${${output_var}}" STREQUAL "")
+ message(FATAL_ERROR "Got empty string when running: pyside2_config.py ${option}")
+ endif()
+ if(is_list)
+ string (REPLACE " " ";" ${output_var} "${${output_var}}")
+ endif()
+endmacro()
+
+# Get relevant general paths, include paths and linker flags.
+pyside2_config(--pyside2 PYSIDE2_PATH)
+set(SHIBOKEN_PATH "${PYSIDE2_PATH}/shiboken2")
+
+if(NOT EXISTS ${SHIBOKEN_PATH})
+ message(FATAL_ERROR "Shiboken executable not found at path: ${SHIBOKEN_PATH}")
+endif()
+
+pyside2_config(--python-include PYTHON_INCLUDE_DIR)
+pyside2_config(--pyside2-include PYSIDE2_INCLUDE_DIR 1)
+pyside2_config(--python-link-cmake PYTHON_LINKING_DATA 1)
+pyside2_config(--pyside2-shared-libraries-cmake PYSIDE2_SHARED_LIBRARIES 1)
+
+# Get all relevant Qt include dirs, to pass them on to shiboken.
+get_property(QT_CORE_INCLUDE_DIRS TARGET Qt5::Core PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+get_property(QT_GUI_INCLUDE_DIRS TARGET Qt5::Gui PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+get_property(QT_WIDGETS_INCLUDE_DIRS TARGET Qt5::Widgets PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
+set(QT_INCLUDE_DIRS ${QT_CORE_INCLUDE_DIRS} ${QT_GUI_INCLUDE_DIRS} ${QT_WIDGETS_INCLUDE_DIRS})
+set(INCLUDES "")
+foreach(INCLUDE_DIR ${QT_INCLUDE_DIRS})
+ list(APPEND INCLUDES "-I${INCLUDE_DIR}")
+endforeach()
+
+# Set up the options to pass to shiboken.
+set(WRAPPED_HEADER ${CMAKE_SOURCE_DIR}/wrappedclasses.h)
+set(TYPESYSTEM_FILE ${CMAKE_SOURCE_DIR}/scriptableapplication.xml)
+
+set(SHIBOKEN_OPTIONS --generator-set=shiboken --enable-parent-ctor-heuristic
+ --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero
+ --avoid-protected-hack
+ ${INCLUDES}
+ -I${CMAKE_SOURCE_DIR}
+ -T${CMAKE_SOURCE_DIR}
+ -T${PYSIDE2_PATH}/typesystems
+ --output-directory=${CMAKE_CURRENT_BINARY_DIR}
+ )
+
+# Specify which sources will be generated by shiboken, and their dependencies.
+set(GENERATED_SOURCES
+ ${CMAKE_CURRENT_BINARY_DIR}/AppLib/applib_module_wrapper.cpp
+ ${CMAKE_CURRENT_BINARY_DIR}/AppLib/mainwindow_wrapper.cpp)
+
+set(GENERATED_SOURCES_DEPENDENCIES
+ ${WRAPPED_HEADER}
+ ${TYPESYSTEM_FILE}
+ )
+
+# Add custom target to run shiboken.
+add_custom_command(OUTPUT ${GENERATED_SOURCES}
+ COMMAND ${SHIBOKEN_PATH}
+ ${SHIBOKEN_OPTIONS} ${WRAPPED_HEADER} ${TYPESYSTEM_FILE}
+ DEPENDS ${GENERATED_SOURCES_DEPENDENCIES}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Running generator for ${TYPESYSTEM_FILE}.")
+
+# Set the CPP files.
+set(SOURCES
+ mainwindow.cpp
+ pythonutils.cpp
+ ${GENERATED_SOURCES}
+ )
+
+# We need to include the headers for the module bindings that we use.
+set(PYSIDE2_ADDITIONAL_INCLUDES "")
+foreach(INCLUDE_DIR ${PYSIDE2_INCLUDE_DIR})
+ list(APPEND PYSIDE2_ADDITIONAL_INCLUDES "${INCLUDE_DIR}/QtCore")
+ list(APPEND PYSIDE2_ADDITIONAL_INCLUDES "${INCLUDE_DIR}/QtGui")
+ list(APPEND PYSIDE2_ADDITIONAL_INCLUDES "${INCLUDE_DIR}/QtWidgets")
+endforeach()
+
+# =============================================================================================
+# !!! (The section below is deployment related, so in a real world application you will want to
+# take care of this properly with some custom script or tool).
+# =============================================================================================
+# Enable rpaths so that the example can be executed from the build dir.
+set(CMAKE_SKIP_BUILD_RPATH FALSE)
+set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+SET(CMAKE_INSTALL_RPATH "")
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+# =============================================================================================
+# !!! End of dubious section.
+# =============================================================================================
+
+# Declare executable so we can enable automoc.
+add_executable(${PROJECT_NAME} main.cpp)
+
+# Enable automoc.
+set_property(TARGET ${PROJECT_NAME} PROPERTY AUTOMOC 1)
+
+# Add the rest of the sources.
+target_sources(${PROJECT_NAME} PUBLIC ${SOURCES})
+
+# Apply relevant include and link flags.
+target_include_directories(${PROJECT_NAME} PRIVATE ${PYTHON_INCLUDE_DIR})
+target_include_directories(${PROJECT_NAME} PRIVATE ${PYSIDE2_INCLUDE_DIR})
+target_include_directories(${PROJECT_NAME} PRIVATE ${PYSIDE2_ADDITIONAL_INCLUDES})
+target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR})
+
+target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets)
+target_link_libraries(${PROJECT_NAME} PRIVATE ${PYSIDE2_SHARED_LIBRARIES})
+
+# Find and link to the python library.
+list(GET PYTHON_LINKING_DATA 0 PYTHON_LIBDIR)
+list(GET PYTHON_LINKING_DATA 1 PYTHON_LIB)
+find_library(PYTHON_LINK_FLAGS ${PYTHON_LIB} HINTS ${PYTHON_LIBDIR})
+target_link_libraries(${PROJECT_NAME} PRIVATE ${PYTHON_LINK_FLAGS})
+
+# Same as CONFIG += no_keywords to avoid syntax errors in object.h due to the usage of the word Slot
+target_compile_definitions(${PROJECT_NAME} PRIVATE QT_NO_KEYWORDS)
+
+if(WIN32)
+ # =============================================================================================
+ # !!! (The section below is deployment related, so in a real world application you will want to
+ # take care of this properly (this is simply to eliminate errors that users usually encounter.
+ # =============================================================================================
+ # Circumvent some "#pragma comment(lib)"s in "include/pyconfig.h" which might force to link
+ # against a wrong python shared library.
+
+ set(PYTHON_VERSIONS_LIST 3 32 33 34 35 36 37 38)
+ set(PYTHON_ADDITIONAL_LINK_FLAGS "")
+ foreach(VER ${PYTHON_VERSIONS_LIST})
+ set(PYTHON_ADDITIONAL_LINK_FLAGS
+ "${PYTHON_ADDITIONAL_LINK_FLAGS} /NODEFAULTLIB:\"python${VER}_d.lib\"")
+ set(PYTHON_ADDITIONAL_LINK_FLAGS
+ "${PYTHON_ADDITIONAL_LINK_FLAGS} /NODEFAULTLIB:\"python${VER}.lib\"")
+ endforeach()
+
+ set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${PYTHON_ADDITIONAL_LINK_FLAGS}")
+
+ # Add custom target to hard link PySide2 shared libraries (just like in qmake example), so you
+ # don't have to set PATH manually to point to the PySide2 package.
+ foreach(LIBRARY_PATH ${PYSIDE2_SHARED_LIBRARIES})
+ string(REGEX REPLACE ".lib$" ".dll" LIBRARY_PATH ${LIBRARY_PATH})
+ get_filename_component(BASE_NAME ${LIBRARY_PATH} NAME)
+ file(TO_NATIVE_PATH ${LIBRARY_PATH} SOURCE_PATH)
+ file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME}" DEST_PATH)
+ add_custom_command(OUTPUT "${BASE_NAME}"
+ COMMAND mklink /H "${DEST_PATH}" "${SOURCE_PATH}"
+ DEPENDS ${LIBRARY_PATH}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Creating hardlink to PySide2 shared library ${BASE_NAME}")
+
+ # Fake target that depends on the previous one, but has special ALL keyword, which means
+ # it will always be executed.
+ add_custom_target("fake_${BASE_NAME}" ALL DEPENDS ${BASE_NAME})
+ endforeach()
+ # =============================================================================================
+ # !!! End of dubious section.
+ # =============================================================================================
+endif()
diff --git a/examples/scriptableapplication/README.CMake.txt b/examples/scriptableapplication/README.CMake.txt
new file mode 100644
index 000000000..ea658efd5
--- /dev/null
+++ b/examples/scriptableapplication/README.CMake.txt
@@ -0,0 +1,28 @@
+For general information read README.txt instead.
+
+To build this example you will need:
+* A recent version of CMake (3.1+)
+* Make sure that a --standalone PySide2 package (bundled with Qt libraries) is installed into the
+ current active Python environment (system or virtualenv)
+* qmake to be in your PATH (so that CMake find_package(Qt5) works; used for include headers)
+* use the same Qt version for building the example application, as was used for building
+* PySide2, this is to ensure binary compatibility between the newly generated bindings libraries,
+ the PySide2 libraries and the Qt libraries.
+
+For Windows you will also need:
+* Visual studio environment to be active in your terminal
+* Correct visual studio architecture chosen (32 vs 64 bit)
+* Make sure that your Qt + Python + PySide + CMake app build configuration is the same (either or
+ all Release (which is more likely) or all Debug).
+
+You can build this example by executing the following commands (slightly adapted to your file
+system) in a terminal:
+
+cd ~/pyside-setup/examples/scriptableapplication
+(or cd C:\pyside-setup\examples\scriptableapplication)
+mkdir build
+cd build
+cmake -H.. -B. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
+(or cmake -H.. -B. -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release)
+make (or nmake / jom)
+./scriptableapplication (or scriptableapplication.exe)
diff --git a/examples/scriptableapplication/README.txt b/examples/scriptableapplication/README.txt
new file mode 100644
index 000000000..28bdb44ae
--- /dev/null
+++ b/examples/scriptableapplication/README.txt
@@ -0,0 +1,33 @@
+scriptableapplication demonstrates how to make a Qt C++ application scriptable.
+
+It has a class MainWindow inheriting QMainWindow for which bindings are generated
+using PySide2's shiboken2 bindings generator.
+
+The header wrappedclasses.h is passed to shiboken2 which generates class
+wrappers and headers in a subdirectory which are linked into the application.
+
+pythonutils.cpp has some code which binds the instance of MainWindow
+to a variable 'mainWindow' in the global (__main___) namespace.
+It is then possible to run Python script snippets like
+mainWindow.testFunction1() which trigger the underlying C++ function.
+
+Virtualenv Support
+If the application is started from a terminal with an activated python virtual environment, that
+environment's packages will be used for the python module import process. In this case, make sure
+that the application was built while the virtualenv was active, so that the build system picks up
+the correct python shared library.
+
+Windows Notes
+The build config of the application (Debug or Release) should match the PySide2 build config,
+otherwise the application will not function correctly. In practice this means the only supported
+configurations are:
+1) qmake release config build of the application + PySide2 setup.py without "--debug" flag +
+ python.exe for the PySide2 build process + python36.dll for the linked in shared library +
+ release build of Qt.
+2) qmake debug config build of the application + PySide2 setup.py WITH "--debug" flag +
+ python_d.exe for the PySide2 build process + python36_d.dll for the linked in shared library +
+ debug build of Qt.
+This is necessary because all the shared libraries in question have to link to the same C++ runtime
+library (msvcrt.dll or msvcrtd.dll).
+To make the example as self-contained as possible, the shared libraries in use (pyside2.dll,
+shiboken2.dll) are hard-linked into the build folder of the application.
diff --git a/examples/scriptableapplication/main.cpp b/examples/scriptableapplication/main.cpp
new file mode 100644
index 000000000..167eeb0fa
--- /dev/null
+++ b/examples/scriptableapplication/main.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the PySide examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, 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$
+**
+****************************************************************************/
+
+#include "mainwindow.h"
+
+#include <QApplication>
+#include <QDesktopWidget>
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow mainWindow;
+ const QRect availableGeometry = a.desktop()->availableGeometry(&mainWindow);
+ mainWindow.resize(availableGeometry.width() / 2, availableGeometry.height() / 2);
+ mainWindow.show();
+ return a.exec();
+}
diff --git a/examples/scriptableapplication/mainwindow.cpp b/examples/scriptableapplication/mainwindow.cpp
new file mode 100644
index 000000000..e754bcb93
--- /dev/null
+++ b/examples/scriptableapplication/mainwindow.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the PySide examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, 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$
+**
+****************************************************************************/
+
+#include "mainwindow.h"
+#include "pythonutils.h"
+
+#include <QtWidgets/QAction>
+#include <QtWidgets/QApplication>
+#include <QtWidgets/QMenu>
+#include <QtWidgets/QMenuBar>
+#include <QtWidgets/QPlainTextEdit>
+#include <QtWidgets/QStatusBar>
+#include <QtWidgets/QToolBar>
+#include <QtWidgets/QVBoxLayout>
+
+#include <QtGui/QFontDatabase>
+#include <QtGui/QIcon>
+
+#include <QtCore/QDebug>
+#include <QtCore/QTextStream>
+
+static const char defaultScript[] =
+ "print(\"Hello, world\")\n"
+ "mainWindow.testFunction1()\n";
+
+MainWindow::MainWindow()
+ : m_scriptEdit(new QPlainTextEdit(QLatin1String(defaultScript), this))
+{
+ setWindowTitle(tr("Scriptable Application"));
+
+ QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
+ const QIcon runIcon = QIcon::fromTheme(QStringLiteral("system-run"));
+ QAction *runAction = fileMenu->addAction(runIcon, tr("&Run..."), this, &MainWindow::slotRunScript);
+ runAction->setShortcut(Qt::CTRL + Qt::Key_R);
+ QAction *diagnosticAction = fileMenu->addAction(tr("&Print Diagnostics"), this, &MainWindow::slotPrintDiagnostics);
+ diagnosticAction->setShortcut(Qt::CTRL + Qt::Key_D);
+ fileMenu->addAction(tr("&Invoke testFunction1()"), this, &MainWindow::testFunction1);
+ const QIcon quitIcon = QIcon::fromTheme(QStringLiteral("application-exit"));
+ QAction *quitAction = fileMenu->addAction(quitIcon, tr("&Quit"), qApp, &QCoreApplication::quit);
+ quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
+
+ QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
+ const QIcon clearIcon = QIcon::fromTheme(QStringLiteral("edit-clear"));
+ QAction *clearAction = editMenu->addAction(clearIcon, tr("&Clear"), m_scriptEdit, &QPlainTextEdit::clear);
+
+ QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
+ const QIcon aboutIcon = QIcon::fromTheme(QStringLiteral("help-about"));
+ QAction *aboutAction = helpMenu->addAction(aboutIcon, tr("&About Qt"), qApp, &QApplication::aboutQt);
+
+ QToolBar *toolBar = new QToolBar;
+ addToolBar(toolBar);
+ toolBar->addAction(quitAction);
+ toolBar->addSeparator();
+ toolBar->addAction(clearAction);
+ toolBar->addSeparator();
+ toolBar->addAction(runAction);
+ toolBar->addSeparator();
+ toolBar->addAction(aboutAction);
+
+ m_scriptEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont));
+ setCentralWidget(m_scriptEdit);
+
+ if (!PythonUtils::bindAppObject("__main__", "mainWindow", PythonUtils::MainWindowType, this))
+ statusBar()->showMessage(tr("Error loading the application module"));
+}
+
+void MainWindow::slotRunScript()
+{
+ const QStringList script = m_scriptEdit->toPlainText().trimmed().split(QLatin1Char('\n'), QString::SkipEmptyParts);
+ if (!script.isEmpty())
+ runScript(script);
+}
+
+void MainWindow::slotPrintDiagnostics()
+{
+ const QStringList script = QStringList()
+ << "import sys" << "print('Path=', sys.path)" << "print('Executable=', sys.executable)";
+ runScript(script);
+}
+
+void MainWindow::runScript(const QStringList &script)
+{
+ if (!::PythonUtils::runScript(script))
+ statusBar()->showMessage(tr("Error running script"));
+}
+
+void MainWindow::testFunction1()
+{
+ static int n = 1;
+ QString message;
+ QTextStream(&message) << __FUNCTION__ << " called #" << n++;
+ qDebug().noquote() << message;
+ statusBar()->showMessage(message);
+}
diff --git a/examples/scriptableapplication/mainwindow.h b/examples/scriptableapplication/mainwindow.h
new file mode 100644
index 000000000..4dcafc731
--- /dev/null
+++ b/examples/scriptableapplication/mainwindow.h
@@ -0,0 +1,76 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the PySide examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, 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$
+**
+****************************************************************************/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QtWidgets/QMainWindow>
+
+class QPlainTextEdit;
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ MainWindow();
+
+ void testFunction1();
+
+private Q_SLOTS:
+ void slotRunScript();
+ void slotPrintDiagnostics();
+
+private:
+ void runScript(const QStringList &);
+
+ QPlainTextEdit *m_scriptEdit;
+};
+
+#endif // MAINWINDOW_H
diff --git a/examples/scriptableapplication/pyside2.pri b/examples/scriptableapplication/pyside2.pri
new file mode 100644
index 000000000..bd0eeef9e
--- /dev/null
+++ b/examples/scriptableapplication/pyside2.pri
@@ -0,0 +1,19 @@
+PYTHON_INCLUDE = $$system(python $$PWD/pyside2_config.py --python-include)
+isEmpty(PYTHON_INCLUDE): error(Unable to locate Python)
+PYTHON_LFLAGS = $$system(python $$PWD/pyside2_config.py --python-link)
+
+PYSIDE2 = $$system(python $$PWD/pyside2_config.py --pyside2)
+isEmpty(PYSIDE2): error(Unable to locate PySide2)
+PYSIDE2_INCLUDE = $$system(python $$PWD/pyside2_config.py --pyside2-include)
+PYSIDE2_LFLAGS = $$system(python $$PWD/pyside2_config.py --pyside2-link)
+PYSIDE2_SHARED_LIBRARIES = $$system(python $$PWD/pyside2_config.py --pyside2-shared-libraries)
+CLANG_BIN_DIR = $$system(python $$PWD/pyside2_config.py --clang-bin-dir)
+
+INCLUDEPATH += $$PYTHON_INCLUDE $$PYSIDE2_INCLUDE
+LIBS += $$PYTHON_LFLAGS $$PYSIDE2_LFLAGS
+
+!build_pass:message(Using $$PYSIDE2)
+
+!win32 {
+ QMAKE_RPATHDIR += $$PYSIDE2
+}
diff --git a/examples/scriptableapplication/pyside2_config.py b/examples/scriptableapplication/pyside2_config.py
new file mode 100644
index 000000000..361043aef
--- /dev/null
+++ b/examples/scriptableapplication/pyside2_config.py
@@ -0,0 +1,283 @@
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+import os, glob, re, sys, imp
+from distutils import sysconfig
+if sys.platform == 'win32':
+ import winreg
+
+usage = """
+Utility to determine include/link options of PySide2 and Python for qmake
+
+Usage: pyside2_config.py [option]
+Options:
+ --python-include Print Python include path
+ --python-link Print Python link flags
+ --pyside2 Print PySide2 location
+ --pyside2-include Print PySide2 include paths
+ --pyside2-link Print PySide2 link flags
+ --pyside2-shared-libraries Print paths of PySide2 shared libraries (.so's, .dylib's, .dll's)
+ --clang-bin-dir Print path to the clang bin directory
+ -a Print all
+ --help/-h Print this help
+"""
+
+def cleanPath(path):
+ return path if sys.platform != 'win32' else path.replace('\\', '/')
+
+def sharedLibrarySuffix():
+ if sys.platform == 'win32':
+ return 'lib'
+ elif sys.platform == 'darwin':
+ return 'dylib'
+ return 'so'
+
+def sharedLibraryGlobPattern():
+ glob = '*.' + sharedLibrarySuffix()
+ return glob if sys.platform == 'win32' else 'lib' + glob
+
+def filterPySide2SharedLibraries(list):
+ def predicate(item):
+ basename = os.path.basename(item)
+ if 'shiboken' in basename or 'pyside2' in basename:
+ return True
+ return False
+ result = [item for item in list if predicate(item)]
+ return result
+
+# Return qmake link option for a library file name
+def linkOption(lib):
+ baseName = os.path.splitext(os.path.basename(lib))[0]
+ link = ' -l'
+ if sys.platform in ['linux', 'linux2', 'darwin']: # Linux: 'libfoo.so' -> '-lfoo'
+ link += baseName[3:]
+ else:
+ link += baseName
+ return link
+
+# Locate PySide2 via package path
+def findPySide2():
+ for p in sys.path:
+ if 'site-' in p:
+ pyside2 = os.path.join(p, 'PySide2')
+ if os.path.exists(pyside2):
+ return cleanPath(os.path.realpath(pyside2))
+ return None
+
+# Return version as "3.5"
+def pythonVersion():
+ return str(sys.version_info[0]) + '.' + str(sys.version_info[1])
+
+def pythonInclude():
+ return sysconfig.get_python_inc()
+
+def pythonLinkQmake():
+ flags = pythonLinkData()
+ if sys.platform == 'win32' or sys.platform == 'darwin':
+ return '-L{} -l{}'.format(flags['libdir'], flags['lib'])
+
+ # Linux and anything else
+ return '-l{}'.format(flags['lib'])
+
+def pythonLinkCmake():
+ flags = pythonLinkData()
+ libdir = flags['libdir']
+ lib = re.sub(r'.dll$', '.lib', flags['lib'])
+ return '{} {}'.format(libdir, lib)
+
+def pythonLinkData():
+ # @TODO Fix to work with static builds of Python
+ libdir = sysconfig.get_config_var('LIBDIR')
+ version = pythonVersion()
+ version_no_dots = version.replace('.', '')
+
+ flags = {}
+ flags['libdir'] = libdir
+ if sys.platform == 'win32':
+ suffix = '_d' if any([tup[0].endswith('_d.pyd') for tup in imp.get_suffixes()]) else ''
+ flags['lib'] = 'python{}{}'.format(version_no_dots, suffix)
+
+ elif sys.platform == 'darwin':
+ flags['lib'] = 'python{}'.format(version)
+
+ # Linux and anything else
+ else:
+ if sys.version_info[0] < 3:
+ suffix = '_d' if any([tup[0].endswith('_d.so') for tup in imp.get_suffixes()]) else ''
+ flags['lib'] = 'python{}{}'.format(version, suffix)
+ else:
+ flags['lib'] = 'python{}{}'.format(version, sys.abiflags)
+
+ return flags
+
+def pyside2Include():
+ pySide2 = findPySide2()
+ if pySide2 is None:
+ return None
+ return "{0}/include/PySide2 {0}/include/shiboken2".format(pySide2)
+
+def pyside2Link():
+ pySide2 = findPySide2()
+ if pySide2 is None:
+ return None
+ link = "-L{}".format(pySide2)
+ glob_result = glob.glob(os.path.join(pySide2, sharedLibraryGlobPattern()))
+ for lib in filterPySide2SharedLibraries(glob_result):
+ link += ' '
+ link += linkOption(lib)
+ return link
+
+def pyside2SharedLibrariesData():
+ pySide2 = findPySide2()
+ if pySide2 is None:
+ return None
+
+ glob_result = glob.glob(os.path.join(pySide2, sharedLibraryGlobPattern()))
+ filtered_libs = filterPySide2SharedLibraries(glob_result)
+ libs = []
+ if sys.platform == 'win32':
+ for lib in filtered_libs:
+ libs.append(os.path.realpath(lib))
+ else:
+ for lib in filtered_libs:
+ libs.append(lib)
+ return libs
+
+def pyside2SharedLibraries():
+ libs = pyside2SharedLibrariesData()
+ if libs is None:
+ return None
+
+ if sys.platform == 'win32':
+ if not libs:
+ return ''
+ dlls = ''
+ for lib in libs:
+ dll = os.path.splitext(lib)[0] + '.dll'
+ dlls += dll + ' '
+
+ return dlls
+ else:
+ libs_string = ''
+ for lib in libs:
+ libs_string += ' ' + lib
+ return libs_string
+
+def pyside2SharedLibrariesCmake():
+ libs = pyside2SharedLibrariesData()
+ result = ' '.join(libs)
+ return result
+
+def clangBinPath():
+ source = 'LLVM_INSTALL_DIR'
+ clangDir = os.environ.get(source, None)
+ if not clangDir:
+ source = 'CLANG_INSTALL_DIR'
+ clangDir = os.environ.get(source, None)
+ if not clangDir:
+ source = 'llvm-config'
+ try:
+ output = run_process_output([source, '--prefix'])
+ if output:
+ clangDir = output[0]
+ except OSError:
+ pass
+ if clangDir:
+ return os.path.realpath(clangDir + os.path.sep + 'bin')
+ return ''
+
+option = sys.argv[1] if len(sys.argv) == 2 else '-a'
+if option == '-h' or option == '--help':
+ print(usage)
+ sys.exit(0)
+
+if option == '--pyside2' or option == '-a':
+ pySide2 = findPySide2()
+ if pySide2 is None:
+ sys.exit('Unable to locate PySide2')
+ print(pySide2)
+
+if option == '--pyside2-link' or option == '-a':
+ l = pyside2Link()
+ if l is None:
+ sys.exit('Unable to locate PySide2')
+ print(l)
+
+if option == '--pyside2-include' or option == '-a':
+ i = pyside2Include()
+ if i is None:
+ sys.exit('Unable to locate PySide2')
+ print(i)
+
+if option == '--python-include' or option == '-a':
+ i = pythonInclude()
+ if i is None:
+ sys.exit('Unable to locate Python')
+ print(i)
+
+if option == '--python-link' or option == '-a':
+ l = pythonLinkQmake()
+ if l is None:
+ sys.exit('Unable to locate Python')
+ print(l)
+
+if option == '--python-link-cmake' or option == '-a':
+ l = pythonLinkCmake()
+ if l is None:
+ sys.exit('Unable to locate Python')
+ print(l)
+
+if option == '--pyside2-shared-libraries' or option == '-a':
+ l = pyside2SharedLibraries()
+ if l is None:
+ sys.exit('Unable to locate the PySide2 shared libraries')
+ print(l)
+
+if option == '--pyside2-shared-libraries-cmake' or option == '-a':
+ l = pyside2SharedLibrariesCmake()
+ if l is None:
+ sys.exit('Unable to locate the PySide2 shared libraries')
+ print(l)
+
+if option == '--clang-bin-dir' or option == '-a':
+ l = clangBinPath()
+ if l is None:
+ sys.exit('Unable to locate Clang')
+ print(l)
diff --git a/examples/scriptableapplication/pythonutils.cpp b/examples/scriptableapplication/pythonutils.cpp
new file mode 100644
index 000000000..27f1bc71c
--- /dev/null
+++ b/examples/scriptableapplication/pythonutils.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the PySide examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, 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$
+**
+****************************************************************************/
+
+#include "pythonutils.h"
+
+#include <QtCore/QByteArray>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+#include <QtCore/QStringList>
+
+#include <sbkpython.h>
+#include <sbkconverter.h>
+#include <sbkmodule.h>
+
+/* from AppLib bindings */
+
+#if PY_MAJOR_VERSION >= 3
+ extern "C" PyObject *PyInit_AppLib();
+#else
+ extern "C" void initAppLib();
+#endif
+
+// This variable stores all Python types exported by this module.
+extern PyTypeObject **SbkAppLibTypes;
+
+// This variable stores all type converters exported by this module.
+extern SbkConverter **SbkAppLibTypeConverters;
+
+namespace PythonUtils {
+
+static State state = PythonUninitialized;
+
+static void cleanup()
+{
+ if (state > PythonUninitialized) {
+ Py_Finalize();
+ state = PythonUninitialized;
+ }
+}
+
+State init()
+{
+ if (state > PythonUninitialized)
+ return state;
+
+ // If there is an active python virtual environment, use that environment's packages location.
+ QByteArray virtualEnvPath = qgetenv("VIRTUAL_ENV");
+ if (!virtualEnvPath.isEmpty())
+ qputenv("PYTHONHOME", virtualEnvPath);
+
+ Py_Initialize();
+ qAddPostRoutine(cleanup);
+ state = PythonInitialized;
+#if PY_MAJOR_VERSION >= 3
+ const bool pythonInitialized = PyInit_AppLib() != nullptr;
+#else
+ const bool pythonInitialized = true;
+ initAppLib();
+#endif
+ const bool pyErrorOccurred = PyErr_Occurred() != nullptr;
+ if (pythonInitialized && !pyErrorOccurred) {
+ state = AppModuleLoaded;
+ } else {
+ if (pyErrorOccurred)
+ PyErr_Print();
+ qWarning("Failed to initialize the module.");
+ }
+ return state;
+}
+
+bool bindAppObject(const QString &moduleName, const QString &name,
+ int index, QObject *o)
+{
+ if (init() != AppModuleLoaded)
+ return false;
+ PyTypeObject *typeObject = SbkAppLibTypes[index];
+
+ PyObject *po = Shiboken::Conversions::pointerToPython(reinterpret_cast<const SbkObjectType *>(typeObject), o);
+ if (!po) {
+ qWarning() << __FUNCTION__ << "Failed to create wrapper for" << o;
+ return false;
+ }
+ Py_INCREF(po);
+
+ PyObject *module = PyImport_AddModule(moduleName.toLocal8Bit().constData());
+ if (!module) {
+ Py_DECREF(po);
+ if (PyErr_Occurred())
+ PyErr_Print();
+ qWarning() << __FUNCTION__ << "Failed to locate module" << moduleName;
+ return false;
+ }
+
+ if (PyModule_AddObject(module, name.toLocal8Bit().constData(), po) < 0) {
+ if (PyErr_Occurred())
+ PyErr_Print();
+ qWarning() << __FUNCTION__ << "Failed add object" << name << "to" << moduleName;
+ return false;
+ }
+
+ return true;
+}
+
+bool runScript(const QStringList &script)
+{
+ if (init() == PythonUninitialized)
+ return false;
+ bool result = true;
+ for (const QString& lineS : script) {
+ const QByteArray line = lineS.toUtf8();
+ if (PyRun_SimpleString(line.constData()) == -1) {
+ if (PyErr_Occurred())
+ PyErr_Print();
+ qWarning() << __FUNCTION__ << "Error at" << line;
+ result = false;
+ break;
+ }
+ }
+ return result;
+}
+
+} // namespace PythonUtils
diff --git a/examples/scriptableapplication/pythonutils.h b/examples/scriptableapplication/pythonutils.h
new file mode 100644
index 000000000..53e8c4dab
--- /dev/null
+++ b/examples/scriptableapplication/pythonutils.h
@@ -0,0 +1,81 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the PySide examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, 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$
+**
+****************************************************************************/
+
+#ifndef PYTHONUTILS_H
+#define PYTHONUTILS_H
+
+class QObject;
+class QString;
+class QStringList;
+
+namespace PythonUtils {
+
+enum AppLibTypes
+{
+ MainWindowType = 0 // SBK_MAINWINDOW_IDX
+};
+
+enum State
+{
+ PythonUninitialized,
+ PythonInitialized,
+ AppModuleLoaded
+};
+
+State init();
+
+bool bindAppObject(const QString &moduleName, const QString &name,
+ int index, QObject *o);
+
+bool runScript(const QStringList &script);
+
+} // namespace PythonUtils
+
+#endif // PYTHONUTILS_H
diff --git a/examples/scriptableapplication/scriptableapplication.pro b/examples/scriptableapplication/scriptableapplication.pro
new file mode 100644
index 000000000..9f888f6a0
--- /dev/null
+++ b/examples/scriptableapplication/scriptableapplication.pro
@@ -0,0 +1,90 @@
+TEMPLATE = app
+CONFIG += no_keywords # avoid clash with slots in Python.h
+CONFIG += console force_debug_info
+QT += widgets
+
+include(pyside2.pri)
+
+WRAPPED_HEADER = wrappedclasses.h
+WRAPPER_DIR = $$OUT_PWD/AppLib
+TYPESYSTEM_FILE = scriptableapplication.xml
+
+QT_INCLUDEPATHS = -I$$[QT_INSTALL_HEADERS] -I$$[QT_INSTALL_HEADERS]/QtCore \
+ -I$$[QT_INSTALL_HEADERS]/QtGui -I$$[QT_INSTALL_HEADERS]/QtWidgets
+
+SHIBOKEN_OPTIONS = --generator-set=shiboken --enable-parent-ctor-heuristic \
+ --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero \
+ $$QT_INCLUDEPATHS -I$$PWD -T$$PWD -T$$PYSIDE2/typesystems --output-directory=$$OUT_PWD
+
+# MSVC does not honor #define protected public...
+win32:SHIBOKEN_OPTIONS += --avoid-protected-hack
+
+# Prepare the shiboken tool
+QT_TOOL.shiboken.binary = $$system_path($$PYSIDE2/shiboken2)
+win32 {
+ # Add the libclang/bin subdir to PATH.
+ CLANG_PATH.name = PATH
+ CLANG_PATH.value = $$CLANG_BIN_DIR
+ CLANG_PATH.CONFIG += prepend
+ exists($$CLANG_PATH.value): QT_TOOL_ENV = CLANG_PATH
+}
+qtPrepareTool(SHIBOKEN, shiboken)
+QT_TOOL_ENV =
+
+# Shiboken run that adds the module wrapper to GENERATED_SOURCES
+shiboken.output = $$WRAPPER_DIR/applib_module_wrapper.cpp
+shiboken.commands = $$SHIBOKEN $$SHIBOKEN_OPTIONS $$PWD/wrappedclasses.h ${QMAKE_FILE_IN}
+shiboken.input = TYPESYSTEM_FILE
+shiboken.dependency_type = TYPE_C
+shiboken.variable_out = GENERATED_SOURCES
+
+# A dummy command that pretends to produce the class wrappers from the headers
+# depending on the module wrapper
+WRAPPED_CLASSES = mainwindow.h
+module_wrapper_dummy_command.output = $$WRAPPER_DIR/${QMAKE_FILE_BASE}_wrapper.cpp
+module_wrapper_dummy_command.commands = echo ${QMAKE_FILE_IN}
+module_wrapper_dummy_command.depends = $$WRAPPER_DIR/applib_module_wrapper.cpp
+module_wrapper_dummy_command.input = WRAPPED_CLASSES
+module_wrapper_dummy_command.dependency_type = TYPE_C
+module_wrapper_dummy_command.variable_out = GENERATED_SOURCES
+
+# Get the path component to the active config build folder
+defineReplace(getOutDir) {
+ out_dir = $$OUT_PWD
+ CONFIG(release, debug|release): out_dir = $$out_dir/release
+ else:out_dir = $$out_dir/debug
+ return($$out_dir)
+}
+
+# Create hardlinks to the PySide2 shared libraries, so the example can be executed without manually
+# setting the PATH.
+win32 {
+ out_dir = $$getOutDir()
+ # no_link tell not to link to the output files, target_predeps forces the command to actually
+ # execute, explicit_dependencies is a magic value that tells qmake not to run the commands
+ # if the output files already exist.
+ hard_link_libraries.CONFIG = no_link target_predeps explicit_dependencies
+ hard_link_libraries.output = $$out_dir/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT}
+ hard_link_libraries.commands = mklink /H $$shell_path($$out_dir/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT}) $$shell_path(${QMAKE_FILE_IN})
+ hard_link_libraries.input = PYSIDE2_SHARED_LIBRARIES
+}
+
+QMAKE_EXTRA_COMPILERS += shiboken module_wrapper_dummy_command
+win32:QMAKE_EXTRA_COMPILERS += hard_link_libraries
+
+INCLUDEPATH += $$WRAPPER_DIR
+
+for(i, PYSIDE2_INCLUDE) {
+ INCLUDEPATH += $$i/QtWidgets $$i/QtGui $$i/QtCore
+}
+
+SOURCES += \
+ main.cpp \
+ mainwindow.cpp \
+ pythonutils.cpp
+
+HEADERS += \
+ mainwindow.h \
+ pythonutils.h
+
+OTHER_FILES += $$TYPESYSTEM_FILE $$WRAPPED_HEADER pyside2_config.py README.txt
diff --git a/examples/scriptableapplication/scriptableapplication.xml b/examples/scriptableapplication/scriptableapplication.xml
new file mode 100644
index 000000000..18e8277ff
--- /dev/null
+++ b/examples/scriptableapplication/scriptableapplication.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the PySide examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, 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$
+**
+****************************************************************************/
+-->
+<typesystem package="AppLib">
+ <load-typesystem name="typesystem_widgets.xml" generate="no"/>
+ <object-type name="MainWindow"/>
+</typesystem>
diff --git a/sources/pyside2/header.BSD b/examples/scriptableapplication/wrappedclasses.h
index aa400a469..c905e2356 100644
--- a/sources/pyside2/header.BSD
+++ b/examples/scriptableapplication/wrappedclasses.h
@@ -1,9 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
-** This file is part of the FOO module of the Qt Toolkit.
+** This file is part of the PySide examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
@@ -48,3 +48,9 @@
**
****************************************************************************/
+#ifndef WRAPPEDCLASSES_H
+#define WRAPPEDCLASSES_H
+
+#include <mainwindow.h>
+
+#endif // WRAPPEDCLASSES_H
diff --git a/examples/texttospeech/texttospeech.py b/examples/texttospeech/texttospeech.py
new file mode 100644
index 000000000..12edf5d1f
--- /dev/null
+++ b/examples/texttospeech/texttospeech.py
@@ -0,0 +1,108 @@
+#!/usr/bin/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 QTextToSpeech example"""
+
+import sys
+from PySide2.QtCore import Qt
+from PySide2.QtWidgets import (qApp, QApplication, QComboBox, QFormLayout,
+ QHBoxLayout, QLineEdit, QMainWindow, QPushButton, QSlider, QWidget)
+
+from PySide2.QtTextToSpeech import QTextToSpeech, QVoice
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ centralWidget = QWidget()
+ self.setCentralWidget(centralWidget)
+ layout = QFormLayout(centralWidget)
+
+ textLayout = QHBoxLayout()
+ self.text = QLineEdit('Hello, PySide2')
+ self.text.setClearButtonEnabled(True)
+ textLayout.addWidget(self.text)
+ self.sayButton = QPushButton('Say')
+ textLayout.addWidget(self.sayButton)
+ self.text.returnPressed.connect(self.sayButton.animateClick)
+ self.sayButton.clicked.connect(self.say)
+ layout.addRow('Text:', textLayout)
+
+ self.voiceCombo = QComboBox()
+ layout.addRow('Voice:', self.voiceCombo)
+
+ self.volumeSlider = QSlider(Qt.Horizontal)
+ self.volumeSlider.setMinimum(0)
+ self.volumeSlider.setMaximum(100)
+ self.volumeSlider.setValue(100)
+ layout.addRow('Volume:', self.volumeSlider)
+
+ self.engine = None
+ engineNames = QTextToSpeech.availableEngines()
+ if len(engineNames) > 0:
+ engineName = engineNames[0]
+ self.engine = QTextToSpeech(engineName)
+ self.engine.stateChanged.connect(self.stateChanged)
+ self.setWindowTitle('QTextToSpeech Example ({})'.format(engineName))
+ self.voices = []
+ for voice in self.engine.availableVoices():
+ self.voices.append(voice)
+ self.voiceCombo.addItem(voice.name())
+ else:
+ self.setWindowTitle('QTextToSpeech Example (no engines available)')
+ self.sayButton.setEnabled(False)
+
+ def say(self):
+ self.sayButton.setEnabled(False)
+ self.engine.setVoice(self.voices[self.voiceCombo.currentIndex()])
+ self.engine.setVolume(float(self.volumeSlider.value()) / 100)
+ self.engine.say(self.text.text())
+
+ def stateChanged(self, state):
+ if (state == QTextToSpeech.State.Ready):
+ self.sayButton.setEnabled(True)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/tutorial/t1.py b/examples/tutorial/t1.py
new file mode 100644
index 000000000..b3251dbfd
--- /dev/null
+++ b/examples/tutorial/t1.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 1
+
+
+import sys
+from PySide2 import QtWidgets
+
+
+app = QtWidgets.QApplication(sys.argv)
+
+hello = QtWidgets.QPushButton("Hello world!")
+hello.resize(100, 30)
+
+hello.show()
+
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t10.py b/examples/tutorial/t10.py
new file mode 100644
index 000000000..081190c9f
--- /dev/null
+++ b/examples/tutorial/t10.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 10
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ forceChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.currentForce = 0
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def force(self):
+ return self.currentForce
+
+ @QtCore.Slot(int)
+ def setForce(self, force):
+ if force < 0:
+ force = 0
+ if self.currentForce == force:
+ return
+ self.currentForce = force;
+ self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.blue)
+
+ painter.translate(0, self.height())
+ painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self.currentAngle)
+ painter.drawRect(QtCore.QRect(33, -4, 15, 8))
+
+ def cannonRect(self):
+ result = QtCore.QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("&Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange()
+ angle.setRange(5, 70)
+
+ force = LCDRange()
+ force.setRange(10, 50)
+
+ cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setAngle)
+ self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setForce)
+ self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"),
+ force.setValue)
+
+ leftLayout = QtWidgets.QVBoxLayout()
+ leftLayout.addWidget(angle)
+ leftLayout.addWidget(force)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addLayout(leftLayout, 1, 0)
+ gridLayout.addWidget(cannonField, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ force.setValue(25)
+ angle.setFocus()
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.setGeometry(100, 100, 500, 355)
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t11.py b/examples/tutorial/t11.py
new file mode 100644
index 000000000..070782b3f
--- /dev/null
+++ b/examples/tutorial/t11.py
@@ -0,0 +1,264 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 11
+
+
+import sys
+import math
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ forceChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.currentForce = 0
+ self.timerCount = 0
+ self.autoShootTimer = QtCore.QTimer(self)
+ self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
+ self.moveShot)
+ self.shootAngle = 0
+ self.shootForce = 0
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def force(self):
+ return self.currentForce
+
+ @QtCore.Slot(int)
+ def setForce(self, force):
+ if force < 0:
+ force = 0
+ if self.currentForce == force:
+ return
+ self.currentForce = force;
+ self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
+
+ @QtCore.Slot()
+ def shoot(self):
+ if self.autoShootTimer.isActive():
+ return
+ self.timerCount = 0
+ self.shootAngle = self.currentAngle
+ self.shootForce = self.currentForce
+ self.autoShootTimer.start(5)
+
+ @QtCore.Slot()
+ def moveShot(self):
+ region = QtGui.QRegion(self.shotRect())
+ self.timerCount += 1
+
+ shotR = self.shotRect()
+
+ if shotR.x() > self.width() or shotR.y() > self.height():
+ self.autoShootTimer.stop()
+ else:
+ region = region.united(QtGui.QRegion(shotR))
+
+ self.update(region)
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+
+ self.paintCannon(painter)
+ if self.autoShootTimer.isActive():
+ self.paintShot(painter)
+
+ def paintShot(self, painter):
+ painter.setPen(QtCore.Qt.NoPen);
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawRect(self.shotRect())
+
+ barrelRect = QtCore.QRect(33, -4, 15, 8)
+
+ def paintCannon(self, painter):
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self.currentAngle)
+ painter.drawRect(CannonField.barrelRect)
+ painter.restore()
+
+ def cannonRect(self):
+ result = QtCore.QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shotRect(self):
+ gravity = 4.0
+
+ time = self.timerCount / 40.0
+ velocity = self.shootForce
+ radians = self.shootAngle * 3.14159265 / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QtCore.QRect(0, 0, 6, 6)
+ result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("&Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange()
+ angle.setRange(5, 70)
+
+ force = LCDRange()
+ force.setRange(10, 50)
+
+ cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setAngle)
+ self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setForce)
+ self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"),
+ force.setValue)
+
+ shoot = QtWidgets.QPushButton("&Shoot")
+ shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(shoot, QtCore.SIGNAL("clicked()"), cannonField.shoot)
+
+ topLayout = QtWidgets.QHBoxLayout()
+ topLayout.addWidget(shoot)
+ topLayout.addStretch(1)
+
+ leftLayout = QtWidgets.QVBoxLayout()
+ leftLayout.addWidget(angle)
+ leftLayout.addWidget(force)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addLayout(topLayout, 0, 1)
+ gridLayout.addLayout(leftLayout, 1, 0)
+ gridLayout.addWidget(cannonField, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ force.setValue(25)
+ angle.setFocus()
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.setGeometry(100, 100, 500, 355)
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t12.py b/examples/tutorial/t12.py
new file mode 100644
index 000000000..6afd88092
--- /dev/null
+++ b/examples/tutorial/t12.py
@@ -0,0 +1,313 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 12
+
+
+import sys
+import math
+import random
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, text=None, parent=None):
+ if isinstance(text, QtWidgets.QWidget):
+ parent = text
+ text = None
+
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.init()
+
+ if text:
+ self.setText(text)
+
+ def init(self):
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+ self.label = QtWidgets.QLabel()
+ self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ layout.addWidget(self.label)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def text(self):
+ return self.label.text()
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+ def setText(self, text):
+ self.label.setText(text)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ forceChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.currentForce = 0
+ self.timerCount = 0
+ self.autoShootTimer = QtCore.QTimer(self)
+ self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
+ self.moveShot)
+ self.shootAngle = 0
+ self.shootForce = 0
+ self.target = QtCore.QPoint(0, 0)
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+ self.newTarget()
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def force(self):
+ return self.currentForce
+
+ @QtCore.Slot(int)
+ def setForce(self, force):
+ if force < 0:
+ force = 0
+ if self.currentForce == force:
+ return
+ self.currentForce = force;
+ self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
+
+ @QtCore.Slot()
+ def shoot(self):
+ if self.autoShootTimer.isActive():
+ return
+ self.timerCount = 0
+ self.shootAngle = self.currentAngle
+ self.shootForce = self.currentForce
+ self.autoShootTimer.start(5)
+
+ firstTime = True
+
+ def newTarget(self):
+ if CannonField.firstTime:
+ CannonField.firstTime = False
+ midnight = QtCore.QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QtCore.QTime.currentTime()))
+
+ self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
+ self.update()
+
+ @QtCore.Slot()
+ def moveShot(self):
+ region = QtGui.QRegion(self.shotRect())
+ self.timerCount += 1
+
+ shotR = self.shotRect()
+
+ if shotR.intersects(self.targetRect()):
+ self.autoShootTimer.stop()
+ self.emit(QtCore.SIGNAL("hit()"))
+ elif shotR.x() > self.width() or shotR.y() > self.height():
+ self.autoShootTimer.stop()
+ self.emit(QtCore.SIGNAL("missed()"))
+ else:
+ region = region.united(QtGui.QRegion(shotR))
+
+ self.update(region)
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+
+ self.paintCannon(painter)
+ if self.autoShootTimer.isActive():
+ self.paintShot(painter)
+
+ self.paintTarget(painter)
+
+ def paintShot(self, painter):
+ painter.setPen(QtCore.Qt.NoPen);
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawRect(self.shotRect())
+
+ def paintTarget(self, painter):
+ painter.setPen(QtCore.Qt.black)
+ painter.setBrush(QtCore.Qt.red)
+ painter.drawRect(self.targetRect())
+
+ barrelRect = QtCore.QRect(33, -4, 15, 8)
+
+ def paintCannon(self, painter):
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self.currentAngle)
+ painter.drawRect(CannonField.barrelRect)
+ painter.restore()
+
+ def cannonRect(self):
+ result = QtCore.QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shotRect(self):
+ gravity = 4.0
+
+ time = self.timerCount / 40.0
+ velocity = self.shootForce
+ radians = self.shootAngle * 3.14159265 / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QtCore.QRect(0, 0, 6, 6)
+ result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+ def targetRect(self):
+ result = QtCore.QRect(0, 0, 20, 10)
+ result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y()))
+ return result
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("&Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange("ANGLE")
+ angle.setRange(5, 70)
+
+ force = LCDRange("FORCE")
+ force.setRange(10, 50)
+
+ cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setAngle)
+ self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setForce)
+ self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"),
+ force.setValue)
+
+ shoot = QtWidgets.QPushButton("&Shoot")
+ shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(shoot, QtCore.SIGNAL("clicked()"), cannonField.shoot)
+
+ topLayout = QtWidgets.QHBoxLayout()
+ topLayout.addWidget(shoot)
+ topLayout.addStretch(1)
+
+ leftLayout = QtWidgets.QVBoxLayout()
+ leftLayout.addWidget(angle)
+ leftLayout.addWidget(force)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addLayout(topLayout, 0, 1)
+ gridLayout.addLayout(leftLayout, 1, 0)
+ gridLayout.addWidget(cannonField, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ force.setValue(25)
+ angle.setFocus()
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.setGeometry(100, 100, 500, 355)
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t13.py b/examples/tutorial/t13.py
new file mode 100644
index 000000000..34f2fe592
--- /dev/null
+++ b/examples/tutorial/t13.py
@@ -0,0 +1,396 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 13
+
+
+import sys
+import math
+import random
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, text=None, parent=None):
+ if isinstance(text, QtWidgets.QWidget):
+ parent = text
+ text = None
+
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.init()
+
+ if text:
+ self.setText(text)
+
+ def init(self):
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+ self.label = QtWidgets.QLabel()
+ self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
+ self.label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ layout.addWidget(self.label)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def text(self):
+ return self.label.text()
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+ def setText(self, text):
+ self.label.setText(text)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ forceChanged = QtCore.Signal(int)
+ hit = QtCore.Signal()
+ missed = QtCore.Signal()
+ canShoot = QtCore.Signal(bool)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.currentForce = 0
+ self.timerCount = 0
+ self.autoShootTimer = QtCore.QTimer(self)
+ self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
+ self.moveShot)
+ self.shootAngle = 0
+ self.shootForce = 0
+ self.target = QtCore.QPoint(0, 0)
+ self.gameEnded = False
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+ self.newTarget()
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def force(self):
+ return self.currentForce
+
+ @QtCore.Slot(int)
+ def setForce(self, force):
+ if force < 0:
+ force = 0
+ if self.currentForce == force:
+ return
+ self.currentForce = force;
+ self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
+
+ @QtCore.Slot()
+ def shoot(self):
+ if self.isShooting():
+ return
+ self.timerCount = 0
+ self.shootAngle = self.currentAngle
+ self.shootForce = self.currentForce
+ self.autoShootTimer.start(5)
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), False)
+
+ firstTime = True
+
+ def newTarget(self):
+ if CannonField.firstTime:
+ CannonField.firstTime = False
+ midnight = QtCore.QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QtCore.QTime.currentTime()))
+
+ self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
+ self.update()
+
+ def setGameOver(self):
+ if self.gameEnded:
+ return
+ if self.isShooting():
+ self.autoShootTimer.stop()
+ self.gameEnded = True
+ self.update()
+
+ def restartGame(self):
+ if self.isShooting():
+ self.autoShootTimer.stop()
+ self.gameEnded = False
+ self.update()
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
+
+ @QtCore.Slot()
+ def moveShot(self):
+ region = QtGui.QRegion(self.shotRect())
+ self.timerCount += 1
+
+ shotR = self.shotRect()
+
+ if shotR.intersects(self.targetRect()):
+ self.autoShootTimer.stop()
+ self.emit(QtCore.SIGNAL("hit()"))
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
+ elif shotR.x() > self.width() or shotR.y() > self.height():
+ self.autoShootTimer.stop()
+ self.emit(QtCore.SIGNAL("missed()"))
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
+ else:
+ region = region.united(QtGui.QRegion(shotR))
+
+ self.update(region)
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+
+ if self.gameEnded:
+ painter.setPen(QtCore.Qt.black)
+ painter.setFont(QtGui.QFont("Courier", 48, QtGui.QFont.Bold))
+ painter.drawText(self.rect(), QtCore.Qt.AlignCenter, "Game Over")
+
+ self.paintCannon(painter)
+ if self.isShooting():
+ self.paintShot(painter)
+ if not self.gameEnded:
+ self.paintTarget(painter)
+
+ def paintShot(self, painter):
+ painter.setPen(QtCore.Qt.NoPen);
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawRect(self.shotRect())
+
+ def paintTarget(self, painter):
+ painter.setPen(QtCore.Qt.black)
+ painter.setBrush(QtCore.Qt.red)
+ painter.drawRect(self.targetRect())
+
+ barrelRect = QtCore.QRect(33, -4, 15, 8)
+
+ def paintCannon(self, painter):
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self.currentAngle)
+ painter.drawRect(CannonField.barrelRect)
+ painter.restore()
+
+ def cannonRect(self):
+ result = QtCore.QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shotRect(self):
+ gravity = 4.0
+
+ time = self.timerCount / 40.0
+ velocity = self.shootForce
+ radians = self.shootAngle * 3.14159265 / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QtCore.QRect(0, 0, 6, 6)
+ result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+ def targetRect(self):
+ result = QtCore.QRect(0, 0, 20, 10)
+ result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y()))
+ return result
+
+ def gameOver(self):
+ return self.gameEnded
+
+ def isShooting(self):
+ return self.autoShootTimer.isActive()
+
+
+class GameBoard(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("&Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange("ANGLE")
+ angle.setRange(5, 70)
+
+ force = LCDRange("FORCE")
+ force.setRange(10, 50)
+
+ self.cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ self.cannonField.setAngle)
+ self.connect(self.cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
+ self.cannonField.setForce)
+ self.connect(self.cannonField, QtCore.SIGNAL("forceChanged(int)"),
+ force.setValue)
+
+ self.connect(self.cannonField, QtCore.SIGNAL("hit()"), self.hit)
+ self.connect(self.cannonField, QtCore.SIGNAL("missed()"), self.missed)
+
+ shoot = QtWidgets.QPushButton("&Shoot")
+ shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(shoot, QtCore.SIGNAL("clicked()"), self.fire)
+ self.connect(self.cannonField, QtCore.SIGNAL("canShoot(bool)"),
+ shoot, QtCore.SLOT("setEnabled(bool)"))
+
+ restart = QtWidgets.QPushButton("&New Game")
+ restart.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(restart, QtCore.SIGNAL("clicked()"), self.newGame)
+
+ self.hits = QtWidgets.QLCDNumber(2)
+ self.shotsLeft = QtWidgets.QLCDNumber(2)
+ hitsLabel = QtWidgets.QLabel("HITS")
+ shotsLeftLabel = QtWidgets.QLabel("SHOTS LEFT")
+
+ topLayout = QtWidgets.QHBoxLayout()
+ topLayout.addWidget(shoot)
+ topLayout.addWidget(self.hits)
+ topLayout.addWidget(hitsLabel)
+ topLayout.addWidget(self.shotsLeft)
+ topLayout.addWidget(shotsLeftLabel)
+ topLayout.addStretch(1)
+ topLayout.addWidget(restart)
+
+ leftLayout = QtWidgets.QVBoxLayout()
+ leftLayout.addWidget(angle)
+ leftLayout.addWidget(force)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addLayout(topLayout, 0, 1)
+ gridLayout.addLayout(leftLayout, 1, 0)
+ gridLayout.addWidget(self.cannonField, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ force.setValue(25)
+ angle.setFocus()
+
+ self.newGame()
+
+ @QtCore.Slot()
+ def fire(self):
+ if self.cannonField.gameOver() or self.cannonField.isShooting():
+ return
+ self.shotsLeft.display(self.shotsLeft.intValue() - 1)
+ self.cannonField.shoot()
+
+ @QtCore.Slot()
+ def hit(self):
+ self.hits.display(self.hits.intValue() + 1)
+ if self.shotsLeft.intValue() == 0:
+ self.cannonField.setGameOver()
+ else:
+ self.cannonField.newTarget()
+
+ @QtCore.Slot()
+ def missed(self):
+ if self.shotsLeft.intValue() == 0:
+ self.cannonField.setGameOver()
+
+ @QtCore.Slot()
+ def newGame(self):
+ self.shotsLeft.display(15)
+ self.hits.display(0)
+ self.cannonField.restartGame()
+ self.cannonField.newTarget()
+
+
+app = QtWidgets.QApplication(sys.argv)
+board = GameBoard()
+board.setGeometry(100, 100, 500, 355)
+board.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t14.py b/examples/tutorial/t14.py
new file mode 100644
index 000000000..609af40c8
--- /dev/null
+++ b/examples/tutorial/t14.py
@@ -0,0 +1,451 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 14
+
+
+import sys
+import math
+import random
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, text=None, parent=None):
+ if isinstance(text, QtWidgets.QWidget):
+ parent = text
+ text = None
+
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.init()
+
+ if text:
+ self.setText(text)
+
+ def init(self):
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+ self.label = QtWidgets.QLabel()
+ self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
+ self.label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ layout.addWidget(self.label)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def text(self):
+ return self.label.text()
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+ def setText(self, text):
+ self.label.setText(text)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ forceChanged = QtCore.Signal(int)
+ hit = QtCore.Signal()
+ missed = QtCore.Signal()
+ canShoot = QtCore.Signal(bool)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.currentForce = 0
+ self.timerCount = 0
+ self.autoShootTimer = QtCore.QTimer(self)
+ self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"),
+ self.moveShot)
+ self.shootAngle = 0
+ self.shootForce = 0
+ self.target = QtCore.QPoint(0, 0)
+ self.gameEnded = False
+ self.barrelPressed = False
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+ self.newTarget()
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def force(self):
+ return self.currentForce
+
+ @QtCore.Slot(int)
+ def setForce(self, force):
+ if force < 0:
+ force = 0
+ if self.currentForce == force:
+ return
+ self.currentForce = force;
+ self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce)
+
+ @QtCore.Slot()
+ def shoot(self):
+ if self.isShooting():
+ return
+ self.timerCount = 0
+ self.shootAngle = self.currentAngle
+ self.shootForce = self.currentForce
+ self.autoShootTimer.start(5)
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), False)
+
+ firstTime = True
+
+ def newTarget(self):
+ if CannonField.firstTime:
+ CannonField.firstTime = False
+ midnight = QtCore.QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QtCore.QTime.currentTime()))
+
+ self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
+ self.update()
+
+ def setGameOver(self):
+ if self.gameEnded:
+ return
+ if self.isShooting():
+ self.autoShootTimer.stop()
+ self.gameEnded = True
+ self.update()
+
+ def restartGame(self):
+ if self.isShooting():
+ self.autoShootTimer.stop()
+ self.gameEnded = False
+ self.update()
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
+
+ @QtCore.Slot()
+ def moveShot(self):
+ region = QtGui.QRegion(self.shotRect())
+ self.timerCount += 1
+
+ shotR = self.shotRect()
+
+ if shotR.intersects(self.targetRect()):
+ self.autoShootTimer.stop()
+ self.emit(QtCore.SIGNAL("hit()"))
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
+ elif shotR.x() > self.width() or shotR.y() > self.height() or shotR.intersects(self.barrierRect()):
+ self.autoShootTimer.stop()
+ self.emit(QtCore.SIGNAL("missed()"))
+ self.emit(QtCore.SIGNAL("canShoot(bool)"), True)
+ else:
+ region = region.united(QtGui.QRegion(shotR))
+
+ self.update(region)
+
+ def mousePressEvent(self, event):
+ if event.button() != QtCore.Qt.LeftButton:
+ return
+ if self.barrelHit(event.pos()):
+ self.barrelPressed = True
+
+ def mouseMoveEvent(self, event):
+ if not self.barrelPressed:
+ return
+ pos = event.pos()
+ if pos.x() <= 0:
+ pos.setX(1)
+ if pos.y() >= self.height():
+ pos.setY(self.height() - 1)
+ rad = math.atan((float(self.rect().bottom()) - pos.y()) / pos.x())
+ self.setAngle(round(rad * 180 / 3.14159265))
+
+ def mouseReleaseEvent(self, event):
+ if event.button() == QtCore.Qt.LeftButton:
+ self.barrelPressed = False;
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+
+ if self.gameEnded:
+ painter.setPen(QtCore.Qt.black)
+ painter.setFont(QtGui.QFont("Courier", 48, QtGui.QFont.Bold))
+ painter.drawText(self.rect(), QtCore.Qt.AlignCenter, "Game Over")
+
+ self.paintCannon(painter)
+ self.paintBarrier(painter)
+ if self.isShooting():
+ self.paintShot(painter)
+ if not self.gameEnded:
+ self.paintTarget(painter)
+
+ def paintShot(self, painter):
+ painter.setPen(QtCore.Qt.NoPen);
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawRect(self.shotRect())
+
+ def paintTarget(self, painter):
+ painter.setPen(QtCore.Qt.black)
+ painter.setBrush(QtCore.Qt.red)
+ painter.drawRect(self.targetRect())
+
+ def paintBarrier(self, painter):
+ painter.setPen(QtCore.Qt.black)
+ painter.setBrush(QtCore.Qt.yellow)
+ painter.drawRect(self.barrierRect())
+
+ barrelRect = QtCore.QRect(33, -4, 15, 8)
+
+ def paintCannon(self, painter):
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self.currentAngle)
+ painter.drawRect(CannonField.barrelRect)
+ painter.restore()
+
+ def cannonRect(self):
+ result = QtCore.QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shotRect(self):
+ gravity = 4.0
+
+ time = self.timerCount / 40.0
+ velocity = self.shootForce
+ radians = self.shootAngle * 3.14159265 / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QtCore.QRect(0, 0, 6, 6)
+ result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+ def targetRect(self):
+ result = QtCore.QRect(0, 0, 20, 10)
+ result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y()))
+ return result
+
+ def barrierRect(self):
+ return QtCore.QRect(145, self.height() - 100, 15, 99)
+
+ def barrelHit(self, pos):
+ matrix = QtGui.QMatrix()
+ matrix.translate(0, self.height())
+ matrix.rotate(-self.currentAngle)
+ matrix, invertible = matrix.inverted()
+ return self.barrelRect.contains(matrix.map(pos))
+
+ def gameOver(self):
+ return self.gameEnded
+
+ def isShooting(self):
+ return self.autoShootTimer.isActive()
+
+ def sizeHint(self):
+ return QtCore.QSize(400, 300)
+
+
+class GameBoard(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("&Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange("ANGLE")
+ angle.setRange(5, 70)
+
+ force = LCDRange("FORCE")
+ force.setRange(10, 50)
+
+ cannonBox = QtWidgets.QFrame()
+ cannonBox.setFrameStyle(QtWidgets.QFrame.WinPanel | QtWidgets.QFrame.Sunken)
+
+ self.cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ self.cannonField.setAngle)
+ self.connect(self.cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ self.connect(force, QtCore.SIGNAL("valueChanged(int)"),
+ self.cannonField.setForce)
+ self.connect(self.cannonField, QtCore.SIGNAL("forceChanged(int)"),
+ force.setValue)
+
+ self.connect(self.cannonField, QtCore.SIGNAL("hit()"), self.hit)
+ self.connect(self.cannonField, QtCore.SIGNAL("missed()"), self.missed)
+
+ shoot = QtWidgets.QPushButton("&Shoot")
+ shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(shoot, QtCore.SIGNAL("clicked()"), self.fire)
+ self.connect(self.cannonField, QtCore.SIGNAL("canShoot(bool)"),
+ shoot, QtCore.SLOT("setEnabled(bool)"))
+
+ restart = QtWidgets.QPushButton("&New Game")
+ restart.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(restart, QtCore.SIGNAL("clicked()"), self.newGame)
+
+ self.hits = QtWidgets.QLCDNumber(2)
+ self.shotsLeft = QtWidgets.QLCDNumber(2)
+ hitsLabel = QtWidgets.QLabel("HITS")
+ shotsLeftLabel = QtWidgets.QLabel("SHOTS LEFT")
+
+ QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+ self, self.fire)
+ QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return),
+ self, self.fire)
+ QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_Q),
+ self, QtCore.SLOT("close()"))
+
+ topLayout = QtWidgets.QHBoxLayout()
+ topLayout.addWidget(shoot)
+ topLayout.addWidget(self.hits)
+ topLayout.addWidget(hitsLabel)
+ topLayout.addWidget(self.shotsLeft)
+ topLayout.addWidget(shotsLeftLabel)
+ topLayout.addStretch(1)
+ topLayout.addWidget(restart)
+
+ leftLayout = QtWidgets.QVBoxLayout()
+ leftLayout.addWidget(angle)
+ leftLayout.addWidget(force)
+
+ cannonLayout = QtWidgets.QVBoxLayout()
+ cannonLayout.addWidget(self.cannonField)
+ cannonBox.setLayout(cannonLayout)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addLayout(topLayout, 0, 1)
+ gridLayout.addLayout(leftLayout, 1, 0)
+ gridLayout.addWidget(cannonBox, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ force.setValue(25)
+ angle.setFocus()
+
+ self.newGame()
+
+ @QtCore.Slot()
+ def fire(self):
+ if self.cannonField.gameOver() or self.cannonField.isShooting():
+ return
+ self.shotsLeft.display(self.shotsLeft.intValue() - 1)
+ self.cannonField.shoot()
+
+ @QtCore.Slot()
+ def hit(self):
+ self.hits.display(self.hits.intValue() + 1)
+ if self.shotsLeft.intValue() == 0:
+ self.cannonField.setGameOver()
+ else:
+ self.cannonField.newTarget()
+
+ @QtCore.Slot()
+ def missed(self):
+ if self.shotsLeft.intValue() == 0:
+ self.cannonField.setGameOver()
+
+ @QtCore.Slot()
+ def newGame(self):
+ self.shotsLeft.display(15)
+ self.hits.display(0)
+ self.cannonField.restartGame()
+ self.cannonField.newTarget()
+
+
+app = QtWidgets.QApplication(sys.argv)
+board = GameBoard()
+board.setGeometry(100, 100, 500, 355)
+board.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t2.py b/examples/tutorial/t2.py
new file mode 100644
index 000000000..91ca2f349
--- /dev/null
+++ b/examples/tutorial/t2.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 2
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+app = QtWidgets.QApplication(sys.argv)
+
+quit = QtWidgets.QPushButton("Quit")
+quit.resize(75, 30)
+quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"),
+ app, QtCore.SLOT("quit()"))
+
+quit.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t3.py b/examples/tutorial/t3.py
new file mode 100644
index 000000000..9dc50a1b6
--- /dev/null
+++ b/examples/tutorial/t3.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 3
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+app = QtWidgets.QApplication(sys.argv)
+
+window = QtWidgets.QWidget()
+window.resize(200, 120)
+
+quit = QtWidgets.QPushButton("Quit", window)
+quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+quit.setGeometry(10, 40, 180, 40)
+QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"),
+ app, QtCore.SLOT("quit()"))
+
+window.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t4.py b/examples/tutorial/t4.py
new file mode 100644
index 000000000..77f593d2d
--- /dev/null
+++ b/examples/tutorial/t4.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 4
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.setFixedSize(200, 120)
+
+ self.quit = QtWidgets.QPushButton("Quit", self)
+ self.quit.setGeometry(62, 40, 75, 30)
+ self.quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(self.quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t5.py b/examples/tutorial/t5.py
new file mode 100644
index 000000000..0fdd2ac20
--- /dev/null
+++ b/examples/tutorial/t5.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 5
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ lcd = QtWidgets.QLCDNumber(2)
+
+ slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ slider.setRange(0, 99)
+ slider.setValue(0)
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+ self.connect(slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(quit);
+ layout.addWidget(lcd);
+ layout.addWidget(slider);
+ self.setLayout(layout);
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t6.py b/examples/tutorial/t6.py
new file mode 100644
index 000000000..d720433f1
--- /dev/null
+++ b/examples/tutorial/t6.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 6
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ lcd = QtWidgets.QLCDNumber(2)
+ slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ slider.setRange(0, 99)
+ slider.setValue(0)
+ self.connect(slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(slider)
+ self.setLayout(layout)
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ grid = QtWidgets.QGridLayout()
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(quit)
+ layout.addLayout(grid)
+ self.setLayout(layout)
+ for row in range(3):
+ for column in range(3):
+ grid.addWidget(LCDRange(), row, column)
+
+
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t7.py b/examples/tutorial/t7.py
new file mode 100644
index 000000000..a9c53f68d
--- /dev/null
+++ b/examples/tutorial/t7.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 7
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ lcd = QtWidgets.QLCDNumber(2)
+
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ self.setLayout(layout)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ grid = QtWidgets.QGridLayout()
+ previousRange = None
+
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(quit)
+ layout.addLayout(grid)
+ self.setLayout(layout)
+
+ for row in range(3):
+ for column in range(3):
+ lcdRange = LCDRange()
+ grid.addWidget(lcdRange, row, column)
+
+ if previousRange:
+ self.connect(lcdRange, QtCore.SIGNAL("valueChanged(int)"),
+ previousRange.setValue)
+
+ previousRange = lcdRange
+
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t8.py b/examples/tutorial/t8.py
new file mode 100644
index 000000000..d023de154
--- /dev/null
+++ b/examples/tutorial/t8.py
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 8
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange.setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+ painter.drawText(200, 200, "Angle = %d" % self.currentAngle)
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange()
+ angle.setRange(5, 70)
+
+ cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setAngle)
+ self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addWidget(angle, 1, 0)
+ gridLayout.addWidget(cannonField, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ angle.setFocus()
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.setGeometry(100, 100, 500, 355)
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/tutorial/t9.py b/examples/tutorial/t9.py
new file mode 100644
index 000000000..37c0e651a
--- /dev/null
+++ b/examples/tutorial/t9.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## 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 tutorial 9
+
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class LCDRange(QtWidgets.QWidget):
+ valueChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ lcd = QtWidgets.QLCDNumber(2)
+ self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ lcd, QtCore.SLOT("display(int)"))
+ self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"),
+ self, QtCore.SIGNAL("valueChanged(int)"))
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ self.setLayout(layout)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @QtCore.Slot(int)
+ def setValue(self, value):
+ self.slider.setValue(value)
+
+ def setRange(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ QtCore.qWarning("LCDRange::setRange(%d, %d)\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue" % (minValue, maxValue))
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QtWidgets.QWidget):
+ angleChanged = QtCore.Signal(int)
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ self.currentAngle = 45
+ self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self.currentAngle
+
+ @QtCore.Slot(int)
+ def setAngle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70;
+ if self.currentAngle == angle:
+ return
+ self.currentAngle = angle
+ self.update()
+ self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle)
+
+ def paintEvent(self, event):
+ painter = QtGui.QPainter(self)
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.blue)
+
+ painter.translate(0, self.rect().height())
+ painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self.currentAngle)
+ painter.drawRect(QtCore.QRect(33, -4, 15, 8))
+
+
+class MyWidget(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ QtWidgets.QWidget.__init__(self, parent)
+
+ quit = QtWidgets.QPushButton("Quit")
+ quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold))
+
+ self.connect(quit, QtCore.SIGNAL("clicked()"),
+ QtWidgets.qApp, QtCore.SLOT("quit()"))
+
+ angle = LCDRange()
+ angle.setRange(5, 70)
+
+ cannonField = CannonField()
+
+ self.connect(angle, QtCore.SIGNAL("valueChanged(int)"),
+ cannonField.setAngle)
+ self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"),
+ angle.setValue)
+
+ gridLayout = QtWidgets.QGridLayout()
+ gridLayout.addWidget(quit, 0, 0)
+ gridLayout.addWidget(angle, 1, 0)
+ gridLayout.addWidget(cannonField, 1, 1, 2, 1)
+ gridLayout.setColumnStretch(1, 10)
+ self.setLayout(gridLayout)
+
+ angle.setValue(60)
+ angle.setFocus()
+
+
+app = QtWidgets.QApplication(sys.argv)
+widget = MyWidget()
+widget.setGeometry(100, 100, 500, 355)
+widget.show()
+sys.exit(app.exec_())
diff --git a/examples/utils/utils.py b/examples/utils/utils.py
new file mode 100644
index 000000000..ddba61b8a
--- /dev/null
+++ b/examples/utils/utils.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## 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$
+##
+#############################################################################
+
+import sys
+isPY3 = sys.version_info[0] == 3
+
+if isPY3:
+ text_type = str
+else:
+ text_type = unicode
diff --git a/examples/webenginewidgets/simplebrowser.py b/examples/webenginewidgets/simplebrowser.py
new file mode 100644
index 000000000..b895acb35
--- /dev/null
+++ b/examples/webenginewidgets/simplebrowser.py
@@ -0,0 +1,102 @@
+#!/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 WebEngineWidgets Example"""
+
+import sys
+from PySide2.QtCore import QUrl
+from PySide2.QtGui import QIcon
+from PySide2.QtWidgets import (QApplication, QDesktopWidget, QLineEdit,
+ QMainWindow, QPushButton, QToolBar)
+from PySide2.QtWebEngineWidgets import QWebEnginePage, QWebEngineView
+
+class MainWindow(QMainWindow):
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.setWindowTitle('PySide2 WebEngineWidgets Example')
+
+ self.toolBar = QToolBar()
+ self.addToolBar(self.toolBar)
+ self.backButton = QPushButton()
+ self.backButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png'))
+ self.backButton.clicked.connect(self.back)
+ self.toolBar.addWidget(self.backButton)
+ self.forwardButton = QPushButton()
+ self.forwardButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png'))
+ self.forwardButton.clicked.connect(self.forward)
+ self.toolBar.addWidget(self.forwardButton)
+
+ self.addressLineEdit = QLineEdit()
+ self.addressLineEdit.returnPressed.connect(self.load)
+ self.toolBar.addWidget(self.addressLineEdit)
+
+ self.webEngineView = QWebEngineView()
+ self.setCentralWidget(self.webEngineView)
+ initialUrl = 'http://qt.io'
+ self.addressLineEdit.setText(initialUrl)
+ self.webEngineView.load(QUrl(initialUrl))
+ self.webEngineView.page().titleChanged.connect(self.setWindowTitle)
+ self.webEngineView.page().urlChanged.connect(self.urlChanged)
+
+ def load(self):
+ url = QUrl.fromUserInput(self.addressLineEdit.text())
+ if url.isValid():
+ self.webEngineView.load(url)
+
+ def back(self):
+ self.webEngineView.page().triggerAction(QWebEnginePage.Back)
+
+ def forward(self):
+ self.webEngineView.page().triggerAction(QWebEnginePage.Forward)
+
+ def urlChanged(self, url):
+ self.addressLineEdit.setText(url.toString())
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ availableGeometry = app.desktop().availableGeometry(mainWin)
+ mainWin.resize(availableGeometry.width() * 2 / 3, availableGeometry.height() * 2 / 3)
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles.py b/examples/widgets/animation/animatedtiles/animatedtiles.py
new file mode 100755
index 000000000..d3b649d35
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/animatedtiles.py
@@ -0,0 +1,260 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import animatedtiles_rc
+
+
+# Deriving from more than one wrapped class is not supported, so we use
+# composition and delegate the property.
+class Pixmap(QtCore.QObject):
+ def __init__(self, pix):
+ super(Pixmap, self).__init__()
+
+ self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix)
+ self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
+
+ def set_pos(self, pos):
+ self.pixmap_item.setPos(pos)
+
+ def get_pos(self):
+ return self.pixmap_item.pos()
+
+ pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos)
+
+
+class Button(QtWidgets.QGraphicsWidget):
+ pressed = QtCore.Signal()
+
+ def __init__(self, pixmap, parent=None):
+ super(Button, self).__init__(parent)
+
+ self._pix = pixmap
+
+ self.setAcceptHoverEvents(True)
+ self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
+
+ def boundingRect(self):
+ return QtCore.QRectF(-65, -65, 130, 130)
+
+ def shape(self):
+ path = QtGui.QPainterPath()
+ path.addEllipse(self.boundingRect())
+
+ return path
+
+ def paint(self, painter, option, widget):
+ down = option.state & QtWidgets.QStyle.State_Sunken
+ r = self.boundingRect()
+
+ grad = QtGui.QLinearGradient(r.topLeft(), r.bottomRight())
+ if option.state & QtWidgets.QStyle.State_MouseOver:
+ color_0 = QtCore.Qt.white
+ else:
+ color_0 = QtCore.Qt.lightGray
+
+ color_1 = QtCore.Qt.darkGray
+
+ if down:
+ color_0, color_1 = color_1, color_0
+
+ grad.setColorAt(0, color_0)
+ grad.setColorAt(1, color_1)
+
+ painter.setPen(QtCore.Qt.darkGray)
+ painter.setBrush(grad)
+ painter.drawEllipse(r)
+
+ color_0 = QtCore.Qt.darkGray
+ color_1 = QtCore.Qt.lightGray
+
+ if down:
+ color_0, color_1 = color_1, color_0
+
+ grad.setColorAt(0, color_0)
+ grad.setColorAt(1, color_1)
+
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(grad)
+
+ if down:
+ painter.translate(2, 2)
+
+ painter.drawEllipse(r.adjusted(5, 5, -5, -5))
+ painter.drawPixmap(-self._pix.width() / 2, -self._pix.height() / 2,
+ self._pix)
+
+ def mousePressEvent(self, ev):
+ self.pressed.emit()
+ self.update()
+
+ def mouseReleaseEvent(self, ev):
+ self.update()
+
+
+class View(QtWidgets.QGraphicsView):
+ def resizeEvent(self, event):
+ super(View, self).resizeEvent(event)
+ self.fitInView(self.sceneRect(), QtCore.Qt.KeepAspectRatio)
+
+
+if __name__ == '__main__':
+
+ import sys
+ import math
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ kineticPix = QtGui.QPixmap(':/images/kinetic.png')
+ bgPix = QtGui.QPixmap(':/images/Time-For-Lunch-2.jpg')
+
+ scene = QtWidgets.QGraphicsScene(-350, -350, 700, 700)
+
+ items = []
+ for i in range(64):
+ item = Pixmap(kineticPix)
+ item.pixmap_item.setOffset(-kineticPix.width() / 2,
+ -kineticPix.height() / 2)
+ item.pixmap_item.setZValue(i)
+ items.append(item)
+ scene.addItem(item.pixmap_item)
+
+ # Buttons.
+ buttonParent = QtWidgets.QGraphicsRectItem()
+ ellipseButton = Button(QtGui.QPixmap(':/images/ellipse.png'), buttonParent)
+ figure8Button = Button(QtGui.QPixmap(':/images/figure8.png'), buttonParent)
+ randomButton = Button(QtGui.QPixmap(':/images/random.png'), buttonParent)
+ tiledButton = Button(QtGui.QPixmap(':/images/tile.png'), buttonParent)
+ centeredButton = Button(QtGui.QPixmap(':/images/centered.png'), buttonParent)
+
+ ellipseButton.setPos(-100, -100)
+ figure8Button.setPos(100, -100)
+ randomButton.setPos(0, 0)
+ tiledButton.setPos(-100, 100)
+ centeredButton.setPos(100, 100)
+
+ scene.addItem(buttonParent)
+ buttonParent.setTransform(QtGui.QTransform().scale(0.75, 0.75))
+ buttonParent.setPos(200, 200)
+ buttonParent.setZValue(65)
+
+ # States.
+ rootState = QtCore.QState()
+ ellipseState = QtCore.QState(rootState)
+ figure8State = QtCore.QState(rootState)
+ randomState = QtCore.QState(rootState)
+ tiledState = QtCore.QState(rootState)
+ centeredState = QtCore.QState(rootState)
+
+ # Values.
+ for i, item in enumerate(items):
+ # Ellipse.
+ ellipseState.assignProperty(item, 'pos',
+ QtCore.QPointF(math.cos((i / 63.0) * 6.28) * 250,
+ math.sin((i / 63.0) * 6.28) * 250))
+
+ # Figure 8.
+ figure8State.assignProperty(item, 'pos',
+ QtCore.QPointF(math.sin((i / 63.0) * 6.28) * 250,
+ math.sin(((i * 2)/63.0) * 6.28) * 250))
+
+ # Random.
+ randomState.assignProperty(item, 'pos',
+ QtCore.QPointF(-250 + QtCore.qrand() % 500,
+ -250 + QtCore.qrand() % 500))
+
+ # Tiled.
+ tiledState.assignProperty(item, 'pos',
+ QtCore.QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2,
+ ((i // 8) - 4) * kineticPix.height() + kineticPix.height() / 2))
+
+ # Centered.
+ centeredState.assignProperty(item, 'pos', QtCore.QPointF())
+
+ # Ui.
+ view = View(scene)
+ view.setWindowTitle("Animated Tiles")
+ view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate)
+ view.setBackgroundBrush(QtGui.QBrush(bgPix))
+ view.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
+ view.setRenderHints(
+ QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)
+ view.show()
+
+ states = QtCore.QStateMachine()
+ states.addState(rootState)
+ states.setInitialState(rootState)
+ rootState.setInitialState(centeredState)
+
+ group = QtCore.QParallelAnimationGroup()
+ for i, item in enumerate(items):
+ anim = QtCore.QPropertyAnimation(item, 'pos')
+ anim.setDuration(750 + i * 25)
+ anim.setEasingCurve(QtCore.QEasingCurve.InOutBack)
+ group.addAnimation(anim)
+
+ trans = rootState.addTransition(ellipseButton.pressed, ellipseState)
+ trans.addAnimation(group)
+
+ trans = rootState.addTransition(figure8Button.pressed, figure8State)
+ trans.addAnimation(group)
+
+ trans = rootState.addTransition(randomButton.pressed, randomState)
+ trans.addAnimation(group)
+
+ trans = rootState.addTransition(tiledButton.pressed, tiledState)
+ trans.addAnimation(group)
+
+ trans = rootState.addTransition(centeredButton.pressed, centeredState)
+ trans.addAnimation(group)
+
+ timer = QtCore.QTimer()
+ timer.start(125)
+ timer.setSingleShot(True)
+ trans = rootState.addTransition(timer.timeout, ellipseState)
+ trans.addAnimation(group)
+
+ states.start()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles.qrc b/examples/widgets/animation/animatedtiles/animatedtiles.qrc
new file mode 100644
index 000000000..c43a97972
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/animatedtiles.qrc
@@ -0,0 +1,11 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/Time-For-Lunch-2.jpg</file>
+ <file>images/centered.png</file>
+ <file>images/ellipse.png</file>
+ <file>images/figure8.png</file>
+ <file>images/kinetic.png</file>
+ <file>images/random.png</file>
+ <file>images/tile.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles_rc.py b/examples/widgets/animation/animatedtiles/animatedtiles_rc.py
new file mode 100644
index 000000000..198416413
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/animatedtiles_rc.py
@@ -0,0 +1,6144 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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 Sep 15 16:46:54 2010
+# by: The Resource Compiler for PySide (Qt v4.7.0)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x36\xe2\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x64\x00\x00\x00\x64\x08\x06\x00\x00\x00\x70\xe2\x95\x54\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
+\x95\x2b\x0e\x1b\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x03\
+\x0e\x1c\x24\x7c\x1a\xa6\xff\x00\x00\x20\x00\x49\x44\x41\x54\x78\
+\xda\xed\x9d\x77\x98\x9d\x65\x9d\xf7\x3f\xf7\x53\x4e\x9f\x99\x33\
+\x33\x99\x4c\x66\x12\x32\xa9\xa4\x03\x91\x90\x10\x6a\xe8\x48\xd9\
+\x05\xa5\x88\xc8\xba\xeb\xcb\xb2\xae\x04\x51\x57\x5f\x57\x5d\x5d\
+\x76\x5d\x45\x51\x56\x50\x71\x59\x75\xa5\x59\xc0\x12\x3a\x16\x88\
+\x94\x00\x09\x29\xa4\x4d\xea\xb4\x4c\xa6\xcf\x9c\x39\xbd\x3d\xf5\
+\x7e\xff\x38\xf3\x3c\x99\x41\x94\x34\x7d\xdf\xeb\xbd\xb8\xaf\x2b\
+\x57\x32\xc9\xc9\x79\xca\xf7\xfe\xb5\xef\xaf\xdc\xf0\xee\x7a\x77\
+\xbd\xbb\xde\x5d\xef\xae\x77\xd7\xbb\xeb\xdd\xf5\xee\x7a\x77\xfd\
+\x7f\xbf\xc4\xb1\xfc\xe7\xba\xba\xba\xab\x0c\xc3\x08\x4e\x99\x32\
+\xe5\x73\x2b\x57\xae\x3c\x51\x51\x14\xb6\x6d\xdb\x46\x6d\x6d\xed\
+\xa1\x0b\xb8\x02\x09\x20\xe4\x1f\x5c\x4d\x55\xd5\x94\xa2\x28\xf9\
+\x72\xb9\xac\xbf\xfa\xea\xab\xb3\xfe\x6f\xbf\x8c\xda\xda\xda\x9f\
+\x5d\x77\xdd\x75\x57\x97\xcb\x65\x17\x40\x41\xe0\x48\x89\xf8\x23\
+\x6f\xc9\x71\x1c\x02\x81\x00\xaf\xbf\xfe\xba\xb3\x60\xc1\x82\xc2\
+\xc0\xc0\x40\x6c\xcb\x96\x2d\xd3\x2d\xcb\x4a\x1e\xed\x3d\x68\xc7\
+\xf2\x00\x8b\x16\x2d\xfa\xe1\xcc\x99\x33\xeb\x37\x6f\xde\x4c\xa9\
+\x54\xc2\xb6\x6d\xea\xeb\xeb\x69\x68\x68\x40\x08\x41\xbf\x95\x62\
+\xda\x05\x45\xaa\xa2\x3a\x4e\x3a\x88\x93\xd1\x71\x73\x3a\x76\x4a\
+\x43\x16\x35\x80\xb0\x94\xf2\x0f\xbe\x77\xda\xb4\x69\xa2\xb7\xb7\
+\x57\xfe\x25\x40\xa8\xaa\xaa\xba\x60\xc5\x8a\x15\x6b\x74\x5d\x37\
+\x1d\xc7\xa9\xe9\xef\xed\xd3\x6d\x0b\x84\x22\x31\x30\x09\xc5\x04\
+\xb2\xa0\x4d\xd8\x4c\x42\x08\xf6\xee\xdd\xcb\xd2\xa5\x4b\xbd\x8d\
+\x85\xa6\x69\xb1\x58\x2c\x86\xeb\xba\xa7\x85\x42\xa1\x6c\x6d\x6d\
+\xed\xae\x81\x81\x81\xec\x9f\x1d\x90\x45\x8b\x16\xb1\x77\xef\xde\
+\x90\xe3\x38\x28\x8a\xe2\x94\x4a\x25\x5c\xd7\xc5\x34\x4d\x6c\xdb\
+\xc6\xb2\x2c\xca\xe5\x32\x42\x08\x8a\xdd\x09\xba\xba\xc3\x48\x69\
+\x22\x30\x91\xaa\x8b\x40\x80\xa8\x3c\xf0\x38\x19\x95\x67\x9c\x71\
+\x86\x04\xc8\x66\xb3\xb4\xb6\xb6\x8a\xbf\x94\x54\x94\xcb\xe5\xe6\
+\xc9\x93\x27\x57\x9b\xa6\x89\x82\xe0\x60\xb8\x87\x85\x17\x2a\xd8\
+\xc3\x41\xec\x44\x10\x67\x34\x88\x8c\x0a\xa4\xa9\x20\x2d\xa5\xf2\
+\xd2\x34\x0d\x55\x55\x31\x4d\x13\x45\x51\x70\x5d\x17\xc3\x30\x30\
+\x4d\x53\x5e\x75\xd5\x55\xbf\x11\x42\xf0\xda\x6b\xaf\x5d\x00\xfc\
+\xfe\xcf\x0e\x48\x47\x47\xc7\x9c\xd3\x4e\x3b\xad\xad\xb6\xb6\x96\
+\x42\xa1\x80\x69\x9a\x13\x00\xf1\x6e\x4e\x51\x14\xa6\x4c\x6d\x22\
+\x1c\x0e\xa3\x08\x41\xab\x71\x80\xe5\x1f\x82\x40\x40\xc1\x1e\xd5\
+\xb1\x7a\xa3\x98\x83\x01\x9c\xe1\x20\x42\xa9\x28\x05\x29\x25\xc1\
+\x60\xf0\x2f\xab\xb3\x85\xf0\x37\x92\x86\x8a\x3b\x3f\x43\x20\x5e\
+\x43\x20\x5e\x82\x13\x4b\x13\x3e\x3b\xf4\xe8\x24\xdc\xa2\x8a\xeb\
+\xba\x48\x29\x31\x0c\x03\x21\x04\x52\x4a\x2c\xcb\xc2\x75\x5d\x61\
+\x18\x06\x9a\xa6\x01\xb8\x7f\x11\x95\x55\x2e\x97\x1b\x1a\x1a\x1a\
+\x08\x85\x42\xe4\xf3\x79\x0c\xc3\xf0\x6f\xce\x71\x1c\x1c\xc7\xf1\
+\x6f\x34\x10\x08\x54\xc0\x11\x82\x5e\x7b\x84\xf3\x62\x4d\xb8\x46\
+\x90\x25\x4b\x4e\x61\xe7\xe4\x57\x89\x08\x89\xa2\xe8\xa4\x5f\xae\
+\xa2\xb0\x27\x8c\x94\x12\xd7\x75\xff\xec\x20\x44\xa3\xd1\xb3\xae\
+\xb9\xe6\x9a\x75\xa5\x52\xa9\xf2\x42\x5d\x29\x43\xf5\x42\xb8\x29\
+\x9d\x19\xbb\x4e\x61\x74\x97\xac\x48\xf0\x5b\xe4\xb4\x6d\xef\x2e\
+\x66\xcc\x98\xe1\x03\x32\x5e\x42\xca\xe5\xb2\xbf\x31\xa5\x94\x94\
+\xcb\xe5\x8f\x57\x55\x55\x5d\x57\x55\x55\xf5\x40\x7f\x7f\xff\xa6\
+\x3f\xab\x0d\xb1\x6d\x1b\xc3\x30\x7c\x69\xf0\x6e\xc4\x71\x1c\x7f\
+\xb7\x09\x21\x50\x55\x15\xcb\xb2\x90\xae\x4b\x7d\x3a\xc4\xc1\xa7\
+\x15\x4e\x08\x2e\x26\x57\x3f\x05\x3b\x31\x17\xac\x30\x49\x3a\x29\
+\x0c\x98\x38\x79\xc7\x07\xe4\xec\xb3\xcf\xfe\x1f\x29\x65\x20\x99\
+\x4c\x86\x7b\x7b\x7b\xff\x36\x9b\xcd\xe6\x8f\x27\x20\x52\xca\xb0\
+\xaa\xaa\x15\x89\x96\x92\x5d\x93\x77\x8a\xf3\xaf\xac\xc3\x95\x36\
+\x76\x56\x43\x64\xc3\xd8\x59\x0d\x27\xab\x51\xde\x1f\x41\x3a\xc2\
+\x97\xa6\x72\xb9\x8c\xa2\x54\x54\x97\x07\x88\x27\x21\x8e\xe3\x54\
+\x9e\x57\x4a\xb9\x6a\xd5\xaa\xab\x9b\x9b\x9b\x79\xf0\xc1\x07\xd7\
+\x03\x7f\x1e\x40\xa6\x4d\x9b\xb6\xb0\x54\x2a\xcd\xb7\x6d\x1b\x29\
+\x25\x8e\xe3\x4c\x50\x59\x8e\xe3\x00\xf8\x2a\x4b\xd3\x34\xff\x33\
+\x0b\x1b\x66\x13\x4d\x55\x91\x24\x41\x77\x7f\x37\xf1\xf7\x14\xd0\
+\xcc\x00\xd1\x44\x9c\x48\xbd\x86\xac\x11\x48\x43\x01\x57\x80\xe0\
+\x23\x00\xe1\x70\x98\xdd\xbb\x77\x7f\x14\x38\x26\x40\x9a\x9a\x9a\
+\x18\x18\x18\x18\x0f\x88\x34\x4d\x13\xd3\x34\x31\x5d\x9b\x58\xb5\
+\x0e\xb6\xc2\xf2\xc9\xef\xa7\xaa\x25\xc4\x4b\x9d\xbf\x62\xfa\xbc\
+\x26\x86\x8c\x2e\xf2\x1d\x2a\x4e\xa9\x02\x80\xf7\x9c\xe3\xed\x86\
+\xf7\x67\x4f\x32\xc6\xde\x87\xc8\x66\xb3\x44\xa3\x51\x14\x45\x91\
+\x7f\x36\x95\x55\x5b\x5b\xbb\x66\xd9\xb2\x65\xf3\xd2\xe9\xb4\x6f\
+\x2f\x1c\xa7\xb2\xb3\x3d\x2f\x2b\x18\x0c\x32\x66\xf0\x09\x06\x83\
+\xb8\xae\x8b\x65\x59\xbe\xb1\x57\x51\xd8\x17\xee\xe0\xc2\x05\xd5\
+\x40\xf1\x2d\x0a\x5d\x92\x5e\x57\x43\xb9\x2d\x02\x80\x65\x59\xc7\
+\x45\x22\x06\x06\x06\x68\x6a\x6a\x9a\x04\x2c\x01\x1c\xc3\x30\x4e\
+\x4e\x24\x12\x64\xb3\x59\x6c\x5c\xec\x11\x9b\x9d\xcf\x17\xb8\xf2\
+\x7d\xf3\x79\xfa\xd5\x35\xcc\x6b\xbe\x82\xf7\xd4\xaf\xe4\xbf\xb6\
+\x7f\x8a\x6c\x2a\x87\x2e\xc3\xbe\x9b\xeb\x01\x02\x50\x28\x14\x70\
+\x1c\x07\xd7\x75\x29\x95\x4a\x9e\xed\xc0\xf3\x1c\x3d\x4d\xf1\x67\
+\x03\x44\x4a\xa9\x14\x0a\x05\x1f\x08\xdb\xb6\xc9\xe5\x72\xd8\xb6\
+\x4d\x3e\x9f\xf7\x75\x6b\xa9\x54\x42\x51\x14\xc2\xe1\x30\xb6\x6d\
+\x63\xdb\xf6\xa1\x87\x91\x02\xc2\x15\xf1\xff\xc8\xc2\xbb\x91\x8a\
+\x4b\xda\xed\x64\xe3\xd6\x2e\x92\x55\xeb\x18\x1d\xfb\x9c\xb7\x23\
+\x8f\xd7\x2a\x95\x4a\x37\x9f\x7f\xfe\xf9\x77\xaa\xaa\x8a\x40\x90\
+\x30\x33\x4c\x3f\xbd\x1a\x77\x38\x8c\x33\xda\x82\x48\xc3\x8f\xbe\
+\xf3\x53\x14\x55\xf0\x1a\x5b\x78\x55\x6e\x26\xa0\xcd\x27\x9f\x6c\
+\x27\x1a\x55\x91\x52\x7a\xb6\xc1\x07\xa4\x58\x2c\xfa\xef\x22\x9b\
+\xcd\x12\x8b\xc5\x7c\x30\xc6\x49\x4b\x63\x2c\x16\x9b\x95\xcf\xe7\
+\x3b\xff\x1c\x80\xf8\x2f\xd8\xb2\x2c\x6c\xdb\xf6\x5f\x9e\xa6\x69\
+\x3e\x10\xaa\xaa\xfa\xde\x4b\xb1\x58\xf4\x8d\xbd\x27\x21\x58\x92\
+\xd1\x5e\x83\xa9\xef\x99\xcb\x75\x3f\x5a\xca\xcf\x3e\xb2\x81\xa6\
+\x93\xd2\xac\xed\xc9\xb2\x27\xfb\x2a\xf9\x9c\xe9\xab\x3e\xa0\xce\
+\xbb\xfe\xf4\xe9\xd3\x93\x07\x0f\x1e\x74\x8f\xd2\x6e\x44\xbd\x0d\
+\x53\x74\x4d\xb4\x73\xfa\xa9\x9d\x1f\xc1\x92\x83\x48\x1b\x44\x36\
+\x86\x9d\x51\x71\x52\x3a\xf9\x2d\xd5\xa0\x48\x1c\x69\xfb\xb6\xc2\
+\x93\x90\x54\x2a\x85\xaa\xaa\x38\x8e\xe3\xc5\x1f\x08\x21\xd0\x34\
+\x0d\x45\x51\xc8\xe5\x72\x04\x83\x41\x22\x91\x08\xa6\x69\xca\x93\
+\x4f\x3e\xf9\x9b\xaa\xaa\xde\xf1\xca\x2b\xaf\x54\xfd\x39\x00\x91\
+\x1e\x10\xde\x4e\x51\x14\x05\xdb\xb6\x99\x34\x69\x12\x37\xdd\x74\
+\x13\xdf\xf9\xce\x77\xa8\xad\xad\x65\xfa\xf4\xe9\x74\x75\x75\x91\
+\xcd\x66\x7d\x63\xed\x38\x0e\x96\x10\xa8\xdb\x5c\x8a\xf9\xa9\xdc\
+\xf4\xab\x0f\x50\x1b\x38\x95\x9b\xd6\xdd\x88\xae\xa9\xa8\x76\x08\
+\x4d\x6b\x24\x5e\xe3\xc7\x28\xf2\xca\x2b\xaf\xdc\xe7\xfd\xff\xf5\
+\xeb\xd7\xcf\x07\xf6\x1d\xad\x94\x78\x2a\xc4\x74\x4d\xe2\xe1\x00\
+\x85\x8c\xcb\x4d\x27\xdf\x81\xab\x16\x59\xb3\xf7\x5e\x26\x37\x34\
+\x32\x9c\xef\x65\xf4\xd5\x30\x4a\x40\x4e\x50\xc9\xde\x86\x54\x55\
+\xd5\x07\x24\x16\x8b\x21\x84\xf0\x37\xa1\xa2\x28\xfe\x35\x02\x81\
+\x00\x96\x65\x09\x21\x04\xe1\x70\xb8\x70\xb8\xf7\xa8\x1c\xce\x87\
+\xa6\x4c\x99\x32\x69\xca\x94\x29\x2f\xb9\xae\x3b\xcd\xb3\x05\xd9\
+\x6c\x25\x08\xbd\xea\xaa\xab\x68\x6c\x6c\xe4\x57\xbf\xfa\x15\xcd\
+\xcd\xcd\x00\xac\x5d\xbb\x96\xdb\x6f\xbf\x9d\x50\x28\x84\xa6\x69\
+\xbe\x71\x37\x0c\x83\x72\xa9\x84\xd0\x04\xa1\x58\x90\xda\xda\x5a\
+\xba\xd5\x21\x16\x7c\xbc\xcc\xac\x8f\x16\x69\xb9\x75\x94\xc9\xd7\
+\x24\x89\x9f\x6e\x10\x69\x16\x04\x83\x01\x11\x0c\x06\x09\x06\x83\
+\xd4\xd7\xd7\xe3\x38\xce\x31\xe9\x30\xc3\x30\xbc\x00\x0e\x45\x28\
+\x9c\x14\x7e\x3f\xa1\x6a\x9b\xe7\xdf\x78\x9d\x45\xda\xf5\xac\x3e\
+\xe3\x6e\x6a\x42\xf5\x94\xcb\xe5\xca\xbd\x96\xcb\x98\xa6\x49\x36\
+\x9b\xf5\x37\x56\x20\x10\xf0\xa5\xe1\xb2\xcb\x2e\x23\x12\x89\x50\
+\x5f\x5f\xcf\xdc\xb9\x73\x7d\x60\x34\x4d\xf3\xb5\x87\xe7\x7d\x1d\
+\x57\x40\x92\xc9\x64\xed\x05\x17\x5c\x70\x6e\x28\x14\x8a\x58\x96\
+\xe5\x5f\xb8\x5c\x2e\xf3\xe1\x0f\x7f\x18\xc3\x30\xb8\xff\xfe\xfb\
+\x59\xbe\x7c\xb9\xaf\x3b\xbd\x1b\x5f\xb0\x60\x01\xb7\xdd\x76\xdb\
+\x04\xe3\xee\xc5\x2d\xa6\x61\xe2\x04\x4c\x34\x4d\x25\x9b\x74\xb8\
+\x6a\xe1\xc7\xa8\x9b\x1a\x23\xb2\x38\x4b\xed\x15\xc3\xe8\x0b\x52\
+\x18\xa5\x31\x6f\xc8\x34\x8f\xd8\x40\x36\x34\x34\x5c\x1e\x8d\x46\
+\x6f\x8a\xc5\x62\x37\x4a\x29\x97\x0c\x0d\x0d\x31\x38\x38\x48\x62\
+\x68\x84\x81\x37\xb3\xf4\xed\x18\xe0\xb9\x35\x6b\xd9\xf1\xfa\x0e\
+\xf6\x6d\xda\xc3\xfd\x0f\x7c\x97\x9d\x2f\x76\x91\x2f\x64\x7d\xe0\
+\x3c\x0f\xca\xf3\xa2\xce\x3e\xfb\x6c\xaa\xab\xab\x91\x52\x92\x48\
+\x24\x7c\xa3\x9e\x48\x24\x18\x93\x06\x5f\x75\x65\xb3\x59\x5f\x5d\
+\x1f\x57\xa3\xee\xf9\xdf\xde\xc5\x15\x45\xe1\xfc\xf3\xcf\xa7\xb5\
+\xb5\x95\xc7\x1f\x7f\x9c\xba\xba\x3a\x9e\x7a\xea\x29\x9e\x79\xe6\
+\x19\x42\xa1\x10\x57\x5d\x75\x15\xa7\x9f\x7e\x3a\xa9\x54\x8a\xfb\
+\xef\xbf\x9f\xbe\xbe\x3e\x0c\xc3\x20\x99\x4c\xfa\xd1\xb8\x69\x9a\
+\x20\x41\x6a\x92\x72\xc9\xe1\xae\xf7\x3e\xc5\xa3\xad\xdf\xe0\xa6\
+\xf9\x5f\x65\xed\x8e\x17\x50\x1b\xfa\x78\xcd\xde\x56\xb1\x23\x4a\
+\x65\x67\x1e\xe9\x9a\x3c\x79\xf2\xb7\x97\x2d\x5b\x36\xcb\xb2\x2c\
+\x54\xa1\x50\xac\x4e\xcb\x58\xb5\x26\xdc\xac\x8e\x9d\xd4\xe9\xdb\
+\x36\x0c\x02\xea\xb5\x69\x8c\xa6\x73\x24\x64\x96\xa6\xc0\x0a\xf6\
+\x8f\xbe\x44\x53\xa0\xc9\x7f\x91\x9e\x4d\xb4\x2c\x8b\x48\x24\xe2\
+\x7b\x91\x1b\x37\x6e\x24\x16\x8b\x91\x48\x24\xa8\xae\xae\x46\x08\
+\xc1\xb4\x69\xd3\x18\x1e\x1e\x26\x9f\xcf\xfb\x31\xdb\x91\x48\xb6\
+\x72\xb8\x80\x78\x60\x14\x8b\x45\xa6\x4d\x9b\xc6\xbf\xfc\xcb\xbf\
+\xa0\x69\x1a\xcf\x3d\xf7\x1c\x7d\x7d\x7d\xc4\x62\x31\x82\xc1\xa0\
+\xef\xee\x6e\xdb\xb6\x0d\x4d\xd3\x26\xf8\xff\x9e\xcd\x39\x24\x21\
+\x95\x28\x3f\xa0\x46\x98\xd6\x38\x85\x84\xd8\x85\xb4\x42\x48\x09\
+\x8e\xb4\x70\x1d\x07\xc3\x34\x7c\xd1\xb7\xde\xe2\x07\x37\x35\x35\
+\xbd\xd3\x7d\x3b\xe5\x72\x99\x72\xb9\xcc\xee\x6c\x17\x91\x73\x07\
+\x45\xe8\xac\x7e\x42\x97\x75\x50\xf5\xe1\x7d\xd4\x7c\xf0\x00\xa1\
+\x73\xfb\x11\x33\x93\x95\xeb\x58\x26\x96\x7b\x28\x9e\xf0\x24\xbd\
+\xbe\xbe\x1e\x4d\xd3\xd0\x75\x9d\x97\x5e\x7a\xc9\xb7\x29\xba\xae\
+\xfb\x52\x14\x0e\x87\x31\x0c\xc3\x07\xcf\xb3\x35\x63\x80\x34\xad\
+\x5c\xb9\x52\xd6\xd7\xd7\xcf\x3f\x6e\x46\xdd\x8b\x3b\x4c\xd3\xa4\
+\x54\x2a\x31\x30\x30\x40\x24\x12\x61\x68\x68\x08\xc7\x71\xe8\xef\
+\xef\xf7\xe9\xe8\xd1\xd1\xd1\x0a\x97\x35\x65\x0a\x9f\xfd\xec\x67\
+\x71\x1c\x87\x60\x30\x88\xaa\x1e\x72\x1f\xbd\x77\xeb\xb4\x97\xd8\
+\xf0\xef\x2a\xa7\xfe\xdb\xa9\x00\x3c\xcf\x87\xde\xf6\xfa\xd9\x6c\
+\x96\xf9\xf3\xe7\x77\x79\xee\xf0\xd0\xd0\xd0\xbf\x0d\x0c\x0c\xdc\
+\xf1\x4e\x5e\xa1\x07\xa6\x29\x2d\x14\x14\xc8\x4c\xe6\x8e\xcb\xbf\
+\x47\x7b\x7a\x33\xdf\x7b\xf9\xdf\x58\xbc\x64\x0e\xdd\x75\x9d\x64\
+\x77\x69\xbe\x34\x18\x86\x41\x2a\x95\xf2\x8d\xf3\xf5\xd7\x5f\xcf\
+\x9a\x35\x6b\xc8\x64\x32\xd4\xd5\x55\x9c\xbe\xd1\xd1\x51\xff\x1a\
+\xf5\xf5\xf5\x98\xa6\x49\x38\x1c\x66\x68\x68\x08\x55\x55\x89\xc7\
+\xe3\xe8\xba\x4e\x2e\x97\x03\x60\xee\xdc\xb9\xec\xda\xb5\xcb\x39\
+\x2e\x80\x58\x96\x55\xf0\x5e\xa0\xa2\x28\x14\x8b\x45\x3e\xf3\x99\
+\xcf\x50\x5d\x5d\xed\xe7\x3e\xc6\x7b\x22\xde\x9f\x93\xc9\x24\x81\
+\x40\xc0\x07\xe4\x87\x3f\xfc\x21\x86\x61\xf0\xf1\x8f\x7f\xdc\xe7\
+\xbb\x54\x54\x96\x2c\x59\x52\x51\x89\xd2\x21\x39\xf7\x00\x73\x16\
+\x46\x70\x72\x2a\xd6\x70\x08\x7b\x28\x88\x35\x18\x44\x48\x05\xa1\
+\xbb\xfe\x35\x86\x86\x86\x0e\xdb\x90\xdb\x96\x8d\xab\x3a\x08\x45\
+\x70\xdd\x82\x4f\xb3\xbe\xf7\x49\x9c\x91\x69\x5c\x37\xf7\x4b\x9c\
+\x7f\xea\x99\xdc\xfe\xe8\xe5\xbe\x6b\xab\xaa\xaa\x1f\x03\x79\x6c\
+\xc3\x96\x2d\x5b\x2a\xe4\xe3\x98\x73\x32\x69\xd2\x24\xa4\x94\x08\
+\x21\x28\x95\x4a\xfe\xc6\x54\x55\x95\x50\x28\x44\xb1\x58\x24\x12\
+\x89\xf8\xa1\x80\x65\x59\xfe\xf7\x1f\x33\x20\xb5\xb5\xb5\xb7\x2c\
+\x5d\xba\xf4\x2e\x8f\x2e\x39\xe1\x84\x13\x48\xa5\x52\x04\x02\x01\
+\xd2\xe9\xb4\xaf\x82\xa4\x94\x28\x8a\xe2\xb3\x9f\xde\xee\x1a\xa3\
+\x16\x5c\x65\x2c\x9a\x9a\x36\x6d\x1a\x8e\xe3\x50\x28\x14\x10\x08\
+\x6c\x69\x51\x2c\x16\x29\x97\xcb\xf4\x59\x49\x5a\xa6\x3b\xc8\x48\
+\x89\xc6\x49\xd3\x49\x4d\xed\x43\x0a\x07\xd3\x35\x51\x4a\x61\x86\
+\x1e\x99\x5c\x49\x74\x1d\x01\x45\x62\x59\x16\xb6\x65\x21\x15\x89\
+\xa2\x09\x1a\xaa\x9b\x39\x58\xfa\x3d\xc9\x24\x64\xdd\x7e\xea\x4e\
+\x30\x08\x07\x23\x5e\xcc\x33\x41\xe5\x78\x2a\xb6\xa7\xa7\x87\x50\
+\x28\x84\xeb\xba\xac\x5e\xbd\x9a\xad\x5b\xb7\xd2\xd9\xd9\xe9\x7b\
+\x52\xaa\x5a\x61\x80\x6b\x6a\x6a\xc8\x66\xb3\xa8\xaa\x4a\x2c\x16\
+\xf3\xd5\x9e\x17\xbb\x1d\x8e\x53\xf2\x8e\x80\x98\xa6\x39\xb5\xa9\
+\xa9\xa9\xa6\xa7\xa7\x07\xd3\x34\xb9\xe7\x9e\x7b\xd8\xb3\x67\x0f\
+\x37\xde\x78\x23\x3f\xf8\xc1\x0f\x48\x24\x12\xd4\xd6\xd6\x12\x0c\
+\x06\x79\xe9\xa5\x97\x58\xb8\x70\x21\xbb\x76\xed\xa2\xa7\xa7\x87\
+\xb9\x73\xe7\xb2\x6d\xdb\x36\xf6\xef\xdf\x7f\xfb\x82\x05\x0b\xbe\
+\xf3\xec\xb3\xcf\x72\xd1\x45\x17\x51\x2e\x97\x7d\x95\x25\x74\xc5\
+\xf7\xbe\x5c\xc7\x45\x55\x04\xa1\xec\x7c\x3e\x71\xd1\x9d\x68\x32\
+\xca\x17\x9e\xf8\x08\x1f\x3e\xfb\x46\x7e\xb6\xfd\x6e\x2c\xcb\xac\
+\xe4\x52\xfe\xc8\x83\x0d\x0c\x0c\x30\x6b\xd6\xac\x3b\xa3\xd1\xe8\
+\x54\x00\xe9\xca\x29\xc9\xd1\x14\xd2\x75\x41\xb7\xe9\xfc\xa5\xc2\
+\x77\x5f\xf8\x16\x69\xf7\x20\x46\x36\x88\x4d\x89\xee\x75\x9d\x74\
+\x0d\xe6\x30\xcd\xb0\x0f\x48\x38\x1c\x66\xc6\x8c\x19\x0c\x0e\x0e\
+\x62\x9a\x66\xaa\x54\x2a\xf5\x38\x8e\xb3\x44\x51\x14\x71\xd7\x5d\
+\x77\x49\xd7\x75\x85\xb7\x01\x3d\x1b\x0b\xf8\x86\x1c\x20\x95\x4a\
+\x11\x8b\xc5\xfc\x4d\x7a\xb8\x34\x8a\x76\x38\x06\xdd\x34\x4d\x0a\
+\x85\x02\xaa\xaa\xf2\xa3\x1f\xfd\x88\x6f\x7f\xfb\xdb\xfc\xf4\xa7\
+\x3f\x65\xfd\xfa\xf5\xa8\xaa\x8a\xae\xeb\x68\x9a\x46\x2a\x95\x62\
+\xef\xde\xbd\xe4\xf3\x79\xca\xe5\x32\x89\x44\xc2\x53\x5f\x21\x55\
+\x55\xd9\xb0\x61\x03\xaf\xbf\xfe\xba\xef\xab\x8f\xbd\x34\xdf\xdf\
+\xb7\xb1\x71\x71\x59\xd6\x70\x19\x8f\x6c\xfb\x2a\xb3\xb4\xf3\xb9\
+\xf6\xa4\xd5\xb4\xd4\x4c\x41\xa0\x54\xd4\x9c\x22\xde\xc9\xb3\xfa\
+\xfb\xe9\xd3\xa7\xd7\x0b\x21\x28\x38\x65\x58\x38\x4c\x7d\x3c\x8c\
+\xd3\x1f\xc1\xea\x0b\x93\x19\x4d\x22\x88\x11\xaa\x98\x65\x8a\x43\
+\x92\x46\x71\x22\x1d\x66\x87\xcf\x38\x54\x57\x57\x13\x8f\xc7\x49\
+\xa5\x52\x98\xa6\xf9\xec\x9e\x3d\x7b\x6e\x8a\xc7\xe3\xd7\x5a\x96\
+\x35\xcb\xb2\xac\xaf\x5d\x70\xc1\x05\xac\x58\xb1\x82\x47\x1f\x7d\
+\xd4\xb7\xab\x5e\x10\xe9\x51\x4a\x8a\xa2\x30\x3c\x3c\x4c\x34\x1a\
+\x3d\x22\x5e\xeb\xb0\x00\xf1\xbe\xcc\x73\xf5\x4e\x3b\xed\x34\x5f\
+\x2d\x8d\xb7\x1f\x42\x08\x7a\x7b\x7b\xfd\x3f\x1f\x38\x70\xc0\xf3\
+\xbc\xd2\xfb\xf7\xef\xff\xab\xb1\xe8\x95\x50\x28\xf4\xf8\x89\x27\
+\x9e\xa8\x7e\xf1\x8b\x5f\xe4\x73\x9f\xfb\x1c\xa6\x69\x56\xf2\x29\
+\xaa\x8d\x10\x10\xd0\x22\x38\xae\x8d\x61\x9a\x64\x64\x8a\xae\x4c\
+\xe2\x10\x85\x21\xf0\x77\xe6\xdb\x2d\x8f\x85\x05\x78\x23\xbf\x9f\
+\xeb\x4f\xaf\xc1\xb2\x73\x94\x5a\x06\xa9\xd6\xc2\x08\x47\x45\x1a\
+\x2a\xc5\x3d\x51\xf2\xdb\x62\x20\x2a\x3b\x3d\x95\x4a\xf9\xd7\x28\
+\x95\x4a\xa4\x52\xa9\x09\xcf\x98\x4e\xa7\x7f\x01\x9c\xb8\x6a\xd5\
+\xaa\xaf\xdd\x79\xe7\x9d\xe8\xba\x8e\x61\x18\x74\x75\x75\xb1\x74\
+\xe9\x52\x7e\xf9\xcb\x5f\xf2\xbe\xf7\xbd\x8f\x2d\x5b\xb6\xb0\x67\
+\xcf\x1e\x2e\xbd\xf4\x52\x86\x86\x86\x58\xbb\x76\xad\xbf\xa9\x17\
+\x2c\x58\xf0\x66\x6b\x6b\xeb\xaa\x6c\x36\xbb\xe5\x98\x25\xc4\x33\
+\x70\x93\x27\x4f\x66\x68\x68\xc8\xb7\x15\xde\x4d\xbb\xae\xeb\xff\
+\xf2\x78\xac\xb1\x07\x7c\x42\xd7\xf5\xbd\xc3\xc3\xc3\xaf\x7a\xdf\
+\xd9\xd2\xd2\x22\x9f\x7b\xee\x39\x5e\x7c\xf1\x45\x96\x2f\x5f\xce\
+\x86\x0d\x1b\x2a\xbb\x2c\xe4\x32\xb4\xce\xe2\xf9\xf8\xd3\xc8\xc8\
+\x28\xfd\xca\x1b\x18\x56\x89\xaa\x1a\x9d\x83\x43\x06\x85\xa2\xed\
+\xdf\x53\x2c\x16\x3b\x77\xf1\xe2\xc5\x5f\x02\x84\x61\x18\x76\x5b\
+\x5b\xdb\x57\x3c\xbe\xc9\xf7\x8e\x85\x44\x22\x59\x20\xae\x67\xc5\
+\x7b\x4e\x21\x6d\xf6\xb3\x61\xdf\x6b\x64\x42\xfb\x29\x06\x6c\x2c\
+\xcb\x44\x22\xd1\x34\xcd\x27\x32\x5d\xd7\x95\xaa\xaa\x0a\xc7\x71\
+\x88\xc7\xe3\x24\x12\x89\xf1\xe8\x2b\x43\x43\x43\xec\xde\xbd\x9b\
+\xe6\xe6\x66\x3c\x97\x7a\xe3\xc6\x8d\x00\xbc\xf6\xda\x6b\x94\xcb\
+\x65\x74\x5d\xe7\xb5\xd7\x5e\xa3\xa1\xa1\xc1\xbf\x5f\xc3\x30\xa8\
+\xa9\xa9\x89\x59\x96\xa5\x1f\xab\x97\x25\x6d\xdb\x46\x55\x55\x1e\
+\x7e\xf8\x61\xa6\x4e\x9d\xca\x23\x8f\x3c\xc2\xce\x9d\x3b\x09\x85\
+\x42\x24\x93\x49\xa2\xd1\x28\x83\x83\x83\x04\x02\x01\x62\xb1\x18\
+\x23\x23\x23\x64\x32\x19\xd2\xe9\x34\x6d\x6d\x6d\x57\xbf\xdd\x2e\
+\x7e\xf6\xd9\x67\xa9\xad\xad\x25\x97\xcb\xf9\x34\x45\xa9\x54\xa4\
+\x2e\xb9\x08\x07\x0b\x91\xa9\xa1\xcf\x19\x22\x34\xbd\x8c\x99\x0d\
+\xd0\xc8\x3c\x26\xaf\xa8\xe4\xb5\xa5\x25\x40\x61\x95\x10\xac\x1a\
+\x8b\x69\x4a\x1e\x20\xe3\x25\x44\x00\x03\xfd\x79\xfe\xf3\x6f\x3e\
+\xce\xc7\x7f\x7d\x36\x5f\x3e\xe7\x69\x6a\xec\x79\xa8\x35\x29\xbe\
+\xb5\xe9\xab\x18\x86\x09\xa2\xc2\x59\x79\x2a\x54\xd3\x34\x31\x38\
+\x38\xd8\x39\x38\x38\xb8\x4d\x08\xe1\x06\x02\x81\xb5\x6f\xdd\xa0\
+\xab\x57\xaf\xc6\xb6\x6d\x42\xa1\xd0\x04\x35\x74\xf0\xe0\xc1\x09\
+\x3f\x1f\x38\x70\xc0\xb7\x21\x85\x42\xe1\x0f\x3e\x7f\x54\x80\x28\
+\x8a\x32\xc7\xb2\x2c\x54\x55\xa5\x54\x2a\x51\x2c\x16\x99\x3b\x77\
+\x2e\x6f\xbe\xf9\x26\x4b\x96\x2c\x61\x78\x78\x98\xda\xda\x5a\xb2\
+\xd9\x2c\xe5\x72\x99\x48\x24\xc2\x39\xe7\x9c\xc3\x33\xcf\x3c\xf3\
+\x47\x2f\xae\x69\x1a\x5f\xfa\xd2\x97\x7c\x43\xe8\xc5\x0b\x05\xa5\
+\x4c\xa9\x54\x42\xa4\x05\x42\x08\x76\xe8\xfb\x78\xef\x19\x35\xd8\
+\xd6\x78\xcf\x4a\xe2\x18\x0a\x99\x17\xea\x30\x87\x03\x80\xfc\x03\
+\xb0\x7d\x9a\x45\x07\xc7\x86\x80\xae\xa3\x29\x01\x10\x90\xc8\x0f\
+\xf2\x46\xff\x03\x48\x57\x8e\xa9\xc0\x8a\x94\x37\x34\x34\xf8\x36\
+\x40\x51\x94\x5f\x67\x32\x99\xd5\x6f\x17\x8e\x79\xae\xbc\xb7\xeb\
+\x0f\x33\xed\xed\x7f\xff\xb1\x02\x32\xbd\xb6\xb6\xf6\x46\xc3\x30\
+\xa4\xa6\x69\xe2\xee\xbb\xef\xa6\xb1\xb1\x91\xbd\x7b\xf7\xe2\xba\
+\x2e\x83\x83\x83\x18\x86\x41\x38\x1c\xa6\x50\x28\x20\xa5\x64\x74\
+\x74\x94\x5d\xbb\x76\xfd\x49\xee\xa9\x58\x2c\xe6\xa5\x94\xde\xb5\
+\x83\xe1\x70\x58\x77\x1c\x07\xdd\x52\x71\xdc\x43\x2a\x47\x09\x09\
+\x2c\xc7\x66\x45\xf4\x16\x16\xcf\x5c\xc0\x96\xe4\xe3\xe4\x92\x1a\
+\xbb\xdd\xe7\x70\xb4\x18\x96\x09\x12\x39\xc1\xa6\xb8\xae\x2b\x7d\
+\x03\x1a\x12\xc4\x27\x85\x28\x18\x65\x02\x21\x95\x9a\xaa\x5a\x4c\
+\xa5\x88\x16\xd2\x40\xa9\x00\x22\x91\xbe\xfa\x6d\x6e\x6e\x66\x68\
+\x68\x88\xb7\x2b\x4d\x02\x08\x04\x02\xed\x1d\x1d\x1d\x8d\xf3\xe7\
+\xcf\x1f\x9a\x32\x65\x0a\x37\xdc\x70\x03\x8f\x3d\xf6\x98\x6f\x7b\
+\xbc\x80\xd7\xdb\x60\x1e\xc3\xa1\xeb\xba\xcf\x8a\x1f\x2b\x20\x11\
+\x21\x04\xb9\x5c\x4e\xd4\xd7\xd7\x33\x3c\x3c\xcc\xe0\xc0\x10\x20\
+\x10\x02\x1f\xf1\x72\xb9\xec\x07\x54\xde\x36\x8e\xc5\x62\xa2\x54\
+\x2a\xbd\x6d\xf4\x2c\x84\xf0\x2b\xe9\x66\xce\x9c\xf9\xa0\xaa\xaa\
+\x1f\xbe\xfc\xf2\xcb\xfd\x00\xec\x90\x2b\x29\x49\x0d\x0a\xfe\xee\
+\xe6\x9b\xb9\xe9\x67\x4b\xf9\x97\xb3\x1f\xa3\x18\x2f\x30\xd3\x6c\
+\xe6\x27\xbf\x79\x02\xc3\x90\x9e\x0d\x08\x5d\x74\xd1\x45\x23\x80\
+\x14\x8e\xa8\xb3\x2c\x89\xa2\xc0\x22\x3b\xc2\xf0\xc3\x0a\xd7\x3f\
+\x74\x2d\x52\x09\x71\xfd\x7f\x5d\x83\x65\x5b\x04\xb5\x08\xdb\x5b\
+\x7b\xa9\x8a\xc4\x7d\x4a\xdd\x23\x3f\xff\x18\x18\xe3\xf2\x22\x32\
+\x16\x8b\xf1\xe2\x8b\x2f\xb2\x71\xe3\x46\x5a\x5a\x5a\xd8\xba\x75\
+\x2b\xe1\x70\x98\xf5\xeb\xd7\xfb\x36\x31\x12\x89\xd0\xd2\xd2\xc2\
+\xae\x5d\xbb\x18\x1d\x1d\xf5\x93\x74\xc7\xac\xb2\xa4\x94\xe8\xba\
+\xce\xbe\x7d\xfb\x90\xae\xa4\x66\xb1\x4e\x24\xac\x92\xeb\xb7\x29\
+\x0e\x39\x48\xf7\x6d\xd5\x9c\x28\x97\xcb\x9d\x8a\xa2\x7c\xf3\xed\
+\x9c\x84\xb7\xb0\x00\xfa\x07\x3e\xf0\x01\xe6\xcc\x99\xc3\x07\x3f\
+\xf8\x41\x6e\xbd\xf5\x56\x3f\xcf\x20\x10\x54\x05\xe3\xd8\xb2\x44\
+\xbc\xaa\x8a\xe6\xda\xa9\x3c\xbf\xe3\xd7\x3c\xd1\x77\x1f\xb6\xd5\
+\x88\x69\xb9\x50\xd9\xe1\xa2\xa6\xa6\x66\x92\x40\xd0\x35\x6d\x0f\
+\xa7\x5d\x14\xc6\x18\xac\xd4\x55\xd9\x83\x01\x9c\xac\x06\x96\x8e\
+\x5b\x52\x50\x75\x0d\x4d\x53\x29\xe5\x4d\x6c\x23\xe5\x25\xdd\x64\
+\x34\x1a\x15\x23\x23\x23\x84\x42\xa1\x77\xe4\xf8\x1c\xc7\xe1\x95\
+\x57\x5e\x21\x1e\x8f\xe3\xba\x2e\xfd\xfd\xfd\x7e\xa2\xca\x4b\xc8\
+\x79\xec\x6f\x5d\x5d\x1d\x03\x03\x03\x68\x9a\xe6\x05\x91\xb1\xe3\
+\x02\xc8\xec\xd9\xb3\x2b\x14\x40\xb2\x22\x9a\x51\x29\x89\xd4\xcb\
+\x09\xa5\x3b\x9e\x97\x35\xb6\xe3\x7a\x06\x06\x06\xfe\xeb\x70\xe9\
+\x8d\xb9\x73\xe7\xfa\x51\xed\x21\x75\x27\xb0\x5d\x13\x45\x68\x80\
+\xa0\x64\x15\xd1\x54\x8d\xa0\x16\xc5\x71\x5c\x4c\xd3\xf2\x83\x39\
+\xcb\xb2\x28\x38\x65\x6a\xa7\x29\x48\x5b\x25\x5a\x1f\x46\x99\x62\
+\x61\xcc\x4f\xf8\x9b\x60\xe0\xa1\x49\x48\x5b\xf1\x3d\x41\x8f\x5b\
+\x53\x55\x55\x74\x75\x75\x3d\xe0\xed\x11\x5d\xd7\x7f\xfd\xa7\xee\
+\xd7\x75\x5d\x3e\xf9\xc9\x4f\xfa\xdf\x33\x7e\xed\xdb\x77\x28\x7f\
+\xd6\xdf\xdf\xef\x7b\xa1\xf1\x78\x1c\xc7\x71\xa8\xaa\xaa\xfa\x72\
+\x3a\x9d\x7e\xe1\x98\x00\x59\xb1\x62\x05\x97\x5d\x76\x19\x67\x9f\
+\x7d\x36\xdf\xfb\xde\xf7\x68\x6d\x6d\xe5\xe4\x93\x4f\xe6\xf5\xd7\
+\x5f\x67\xee\xdc\xb9\x64\x32\x19\x5a\x5b\x5b\x09\x87\xc3\xcc\x9c\
+\x39\x93\x37\xde\x78\xe3\xb0\x29\xf2\x40\x20\xc0\x0b\x2f\xbc\xc0\
+\xde\xbd\x7b\xe9\xed\xed\xf5\x19\x54\x21\x04\x85\xd6\x1c\x43\x46\
+\x23\xff\xeb\xa5\x5b\x18\xcc\xea\x7c\xea\xb1\x4f\x60\x18\x36\x79\
+\x27\x8e\x5d\x14\x44\x22\x87\xa4\xae\xa2\x1e\x25\xca\xeb\x93\x39\
+\xf8\x86\xe0\xc1\x07\x7e\xc4\xfe\x9e\x2e\x7e\xbb\xf7\xa7\xfc\xed\
+\xaa\x8f\x72\xf7\xba\x5b\x31\x4d\x0b\x69\x1f\x02\x42\xd7\x75\x9f\
+\x4a\x1f\x19\x19\xf9\xc8\xe1\xde\x73\x3e\x9f\x27\x12\x89\x1c\x02\
+\xc3\x01\xcb\x74\xc7\xee\x05\x84\x2a\x50\xd4\x31\x6d\x30\xf6\x91\
+\xd1\xd1\x51\x5f\x3d\x1e\x8b\x84\xb8\xde\x2e\x88\xc7\xe3\x84\xc3\
+\x61\x9f\x74\x0b\x04\x02\x2c\x5d\xba\x94\xee\xee\x6e\xaa\xab\xab\
+\x7d\xa3\xa5\xeb\xfa\x3b\x5e\xf4\x2d\x2a\x2b\xa0\x28\x0a\x07\x0f\
+\x1e\xf4\x8a\x06\x64\xb9\x5c\x16\x00\xe5\x62\x91\x69\x2b\x66\x92\
+\xcb\xe5\x88\x69\x75\xa4\x67\x1c\xa0\x69\x46\x80\xaa\xb4\x8e\x93\
+\x1d\xfb\x95\xd6\x70\x73\x1a\x62\xec\x49\xc2\xe1\x30\xe9\x54\x9a\
+\xf5\x3d\xcf\xb2\xe9\xcd\x2e\x2e\x3e\xf9\x06\x1a\x63\xd3\x11\x28\
+\x95\x58\xc7\xaa\x48\xd4\xbc\x79\xf3\xfc\x6c\xe6\xe1\x12\x95\x00\
+\x35\x35\x35\x23\x1d\x1d\x1d\x4d\xa7\x9c\x72\xca\x40\x2a\x95\x42\
+\x48\x70\x67\x0b\x96\x5f\x59\x43\x7e\xc0\xa1\x38\x6c\x93\x1b\x70\
+\x28\x0e\xd9\x18\x19\x17\xcf\x24\x79\xef\xf0\x4f\xd9\xa8\x77\x04\
+\x24\x1a\x8d\x2e\x07\xd8\xb6\x6d\x1b\x89\x44\x82\xe1\xe1\x61\x8a\
+\xc5\x4a\xe9\xce\xee\xdd\xbb\xfd\xc0\xd0\x03\xcd\x75\x5d\x5e\x7e\
+\xf9\xe5\x23\x4a\x26\x25\x93\xc9\x2f\x0e\x0d\x0d\x7d\x77\xcc\x8d\
+\x9c\xbe\x60\xc1\x82\x87\x0f\x79\x23\x95\x0a\x96\x72\xb9\x4c\xca\
+\xcd\x31\x75\xae\x89\xa8\xb2\x69\x9c\xd6\x44\xd9\xcd\x51\x72\x12\
+\x28\x0a\xd8\x79\x95\xe1\x9f\x4e\xf6\x1f\x5c\x4a\x89\x57\xb2\x9e\
+\x29\x8d\x92\x35\x12\x08\x45\x4c\x00\x24\x93\xc9\x70\xf5\xd5\x57\
+\xf3\xf4\xd3\x4f\xfb\x31\xc8\xe1\xac\x4c\x26\x83\xae\xeb\x52\xd3\
+\x34\x9a\x9a\x9a\x2a\x36\xa2\x7f\x80\x8e\x07\x15\x2c\xc7\x45\x28\
+\x3a\xae\xab\xa2\x11\x40\x09\xbb\x7e\x4e\xc4\x53\xe5\xc7\x04\x88\
+\xae\xeb\x7f\xe3\x65\xf8\xfa\xfa\xfa\xfc\xa4\xcc\xf8\xdf\x8f\x75\
+\x15\x0a\x85\xbd\xc0\xde\xb1\x1f\xe7\x7b\x8c\x80\x10\x02\xa5\x50\
+\x79\x89\xa6\x61\x62\x2b\x0e\xaa\xaa\xd0\xa2\xae\xe2\xef\x56\xde\
+\x4a\x4d\xa0\x9e\x0f\x7c\xef\x7c\x6e\xbb\xea\x56\x7e\xb1\xfe\xfb\
+\x13\xe8\x73\xdb\xb1\x59\x30\xe9\x34\x92\x53\x54\x06\x72\xdd\x04\
+\xd5\xd3\x51\x50\x30\xcd\x32\xae\x55\x89\x83\x32\x99\x0c\x4f\x3f\
+\xfd\xb4\xef\x96\x1e\xe9\x52\x14\x85\x07\x1e\x78\x80\xe1\xe1\x61\
+\x84\x10\x3c\xfe\xf8\xe3\xc4\xe3\x71\x3a\x3b\x3b\x69\x6e\x6e\x66\
+\xcb\x96\x2d\xcc\x9a\x35\x0b\xc7\x71\xd8\xb7\x6f\x1f\xcd\xcd\xcd\
+\x74\x74\x74\x1c\x1b\x97\x25\xa5\x54\x63\xb1\x18\x7b\xf6\xec\x41\
+\x08\x41\xf4\x7c\x9d\x15\x17\xd5\x20\x01\x23\x27\x49\xee\x35\x18\
+\x6d\xb7\xc8\x74\x98\x98\x85\x43\xf9\x90\x9a\x9a\x9a\x11\xe0\x7d\
+\x47\x5b\xa6\xfa\xd3\x9f\xfe\x94\x42\xa1\xc0\xe7\x3f\xff\x79\xbf\
+\x30\xc1\x52\x4d\x84\x90\x9c\x3c\xe5\x6c\x7e\xd7\xfe\x00\xa9\xce\
+\x06\xae\x58\xf8\xb7\xcc\xa8\x59\x84\xed\x54\xaa\x60\x3c\x09\xe9\
+\xee\xee\xe6\x6b\xff\xfb\xbb\x95\xc4\x56\x29\xc5\xc6\x9f\xec\xe2\
+\xc0\x20\x64\x53\x79\x8f\x02\x92\x8a\xa2\x08\xaf\x8e\xea\x9d\x76\
+\xed\xdb\xd9\x55\x8f\x5d\x9e\x3f\x7f\x3e\x5d\x5d\x5d\x8c\x8c\x8c\
+\x78\xcf\xce\xc9\x27\x9f\xcc\xe6\xcd\x9b\x19\x19\x19\x61\xd1\xa2\
+\x45\xa4\x52\x29\x46\x47\x47\xd1\x34\xed\xd8\x24\xc4\x8b\xaa\x3d\
+\xef\xc9\xd9\xa9\xf1\x66\x47\x96\x7c\xbf\x83\x55\x94\x28\x9e\xf1\
+\x52\x55\x54\x55\xfa\xb9\x91\x40\x20\xe0\x0e\x0c\x0c\x1c\x55\xd3\
+\xca\xbc\x79\xf3\x68\x6e\x6e\x66\x74\x74\x94\xe6\xe6\xe6\x4a\x85\
+\xbd\x65\xe2\xe0\x00\x02\x4d\x09\x60\x4b\x0b\xdb\xb1\x18\x48\x0f\
+\xd3\x95\x0e\xa3\x09\xdd\x8f\x5f\x34\x4d\x03\xcd\xa1\xa4\xa6\x70\
+\xb2\x1a\x8a\xd4\xc9\xe6\xb2\xc4\xf4\x38\xb9\x5c\x07\x8a\xa2\xa0\
+\xeb\xba\x28\x14\x0a\x3b\x37\x6d\xda\xf4\x4f\x42\x08\x55\x51\x94\
+\x23\x2e\x91\x54\x55\x95\xaf\x7c\xe5\x2b\xcc\x9f\x3f\x9f\xcd\x9b\
+\x37\xa3\xeb\x3a\x1d\x1d\x1d\xb8\xae\xcb\xab\xaf\xbe\x8a\xa6\x69\
+\x24\x93\x49\xda\xdb\xdb\xc7\x9b\x00\xa4\x94\x35\xc7\x22\x21\x48\
+\x29\xf9\xd1\x8f\x7e\xc4\xac\x59\xb3\xb8\xf7\xde\x7b\x2b\x65\x93\
+\x73\x4a\x7e\x92\xaa\x58\x2c\x22\xa5\x64\xd2\xa4\x49\x74\x75\x75\
+\x91\xc9\x64\x8e\xb8\x3a\x64\x42\x85\x79\x5b\x1b\x2f\xbd\xf4\x12\
+\x2d\x2d\x2d\x1c\x38\x70\x80\x78\x3c\x5e\x49\xc3\x62\xa3\x6b\x21\
+\x52\xc6\x20\xd3\xa7\xcc\xa3\x7e\x5a\x1d\x9b\x7a\xba\xa9\x8d\x4c\
+\x1e\x8b\xba\x0f\xb9\xc0\x7a\x5c\x52\xf7\xfe\x01\x46\x9e\xae\xc3\
+\xe8\xad\xd0\x2b\x8e\xe3\xf8\xe5\x3b\x63\xbf\x27\x8b\xc5\xe2\xf3\
+\x47\x73\x8f\x63\x84\xab\xab\xeb\xba\xb2\x73\xe7\xce\x4a\x0b\x85\
+\x00\x55\x55\x90\x12\x62\x91\x18\x96\x6b\x55\x1c\x2c\x81\x1f\xab\
+\x8d\xd5\x78\x2d\x38\x26\x09\x99\x37\x6f\x1e\xb3\x67\xcf\xe6\x84\
+\x13\x4e\x60\xd9\xb2\x65\x6c\xdd\xba\x95\x65\xcb\x96\xf1\xe4\x93\
+\x4f\x72\xf1\xc5\x17\xb3\x7b\xf7\x6e\x36\x6c\xd8\xc0\x99\x67\x9e\
+\x49\x73\x73\x33\xcf\x3e\xfb\xec\x9f\xa4\xc7\xdf\x69\x45\x22\x11\
+\xbe\xf5\xad\x6f\x21\x84\x60\x68\x68\xa8\x52\x01\x68\x98\xd8\xaa\
+\xcb\x86\xff\x1e\x64\x93\xf9\x55\xe6\x35\x2e\xc1\x95\x2e\x3b\xfa\
+\x36\xd1\xfa\x68\x1b\x1d\x23\xbd\x14\x86\x0e\xbd\x2c\x4d\x53\x59\
+\xf7\xb5\x61\x8c\xd1\x51\x9c\x92\x64\xc6\x8c\x19\xe8\xba\xce\xd1\
+\xaa\xa8\xb7\xf1\x0c\x87\x76\xee\xdc\x79\xf1\xac\x59\xb3\x5e\x28\
+\x95\x4a\xb8\x2a\x4c\xbd\x21\xca\xc9\xcb\x63\xd8\x8e\x43\x53\x78\
+\x1e\xc3\x46\x3b\x8e\xe1\x72\xf0\xd5\x12\xfb\x9e\xc8\xa3\xa8\x15\
+\xa7\x27\xe2\xf9\xea\x47\x0b\x48\x67\x67\x27\xbf\xfc\xe5\x2f\x39\
+\xe5\x94\x53\x78\xe5\x95\x57\xc8\xe5\x72\xf4\xf4\xf4\x60\x18\x06\
+\x4f\x3e\xf9\xa4\x5f\x99\xf1\x9b\xdf\xfc\x86\x40\x20\xe0\xa7\x3e\
+\x8f\x72\x8d\x0e\x0d\x0d\x7d\x43\xd7\x75\x6b\xec\xc1\x3f\x98\x4a\
+\xa5\x66\xe4\xf3\x79\x2c\x53\x32\x2b\x3c\x83\x19\x33\xa6\x57\xa4\
+\x54\x1a\x2c\xbb\x7e\x16\x55\x91\x32\x0d\xc3\x27\x63\x0d\x06\x71\
+\x46\x2b\x69\x27\xa1\x48\x50\x24\x4c\x83\x5c\x2e\xc7\xc8\xc8\x08\
+\xd1\x68\x94\x78\x3c\xce\x69\xa7\x9d\xc6\xcb\x2f\xbf\x7c\x5c\x1c\
+\x12\x3f\xcd\x2b\xa1\xd4\x6a\xb3\x63\x7f\x8e\x7c\xaf\x83\x6d\x6c\
+\xc4\x2e\x4a\xec\x72\xa5\x3f\x51\x0f\x68\xbe\x23\x70\xac\xd4\x49\
+\x34\x1a\x8d\xf2\xf4\xd3\x4f\xf3\xc4\xe3\x4f\x1c\xf2\x46\x84\xc7\
+\x49\x29\x7e\x4f\x8b\x50\x2a\x89\xac\xea\xea\x6a\x69\xdb\xf6\xd1\
+\xea\xac\x91\xde\xde\xde\xff\xed\xfd\x50\x5f\x5f\xbf\x5c\x51\x94\
+\x19\xaa\xa2\x80\x03\xae\xe3\x92\xcf\xe7\x11\xc0\x66\xab\x8d\x4b\
+\x5a\xa2\xb8\x4a\x8e\xe0\xd4\x22\x8a\x2c\xa1\x6a\x0a\x76\x5a\xa7\
+\xbc\x2f\x46\x7e\x5b\xd4\x67\x01\xbc\xea\xc1\x7c\x3e\x5f\xc9\xe5\
+\x8b\xe3\xd3\x31\x67\x59\x16\xb7\xdc\x72\x0b\x00\x2f\xae\x7d\x11\
+\x51\x56\xd0\xb4\x02\x42\x17\x18\xba\x81\xac\x96\x7e\x6c\x94\x48\
+\x24\x0e\x2b\x6b\xa8\xbd\x83\x41\xaf\xf7\x92\xf9\xae\x0a\x93\xe6\
+\x05\xd0\x75\x81\xb4\x75\xe6\x4e\x5e\x48\x47\x6a\x07\x28\x50\x4e\
+\x39\xa4\xbb\x7c\x1d\x2e\x6c\xdb\xee\xe0\xf8\x2c\x25\x10\x08\x30\
+\x7d\xe1\xc2\x4a\x46\xcf\x1a\xa3\xd6\xbd\x88\x58\x11\xac\xac\xbe\
+\x85\xf7\x9d\x7e\x2d\x3b\x86\x5f\xe6\x85\x2d\x2f\xa1\x35\x0f\xd3\
+\xd6\x37\xe0\x13\x85\x5e\xc2\xca\x8b\x05\xd6\xaf\x5f\xef\xf1\x55\
+\xc7\xbc\xce\x3e\xfb\x6c\x2e\xb8\xe0\x02\xe6\xcc\x99\x43\xa1\x50\
+\xa0\xb7\xb7\x97\x8b\x2f\xbe\x98\xc7\x1f\x7f\x9c\xf3\xce\x3b\x8f\
+\x62\xb1\xc8\xab\xaf\xbe\xca\xfc\xf9\xf3\x89\xc5\x62\x3c\xf5\xd4\
+\x53\x7e\x09\xee\x51\x01\xa2\x28\x8a\xa8\xaf\xaf\xa7\x90\x2f\x60\
+\x45\x24\x4b\x3f\x52\x47\x75\x8d\x86\x74\x25\xc9\xb6\x7e\xea\xf6\
+\x55\x31\xbc\xdd\xc0\x1a\x75\x88\xc5\x82\xbe\x27\x31\x34\x34\xf4\
+\xe6\xf1\x78\x60\xd7\x75\xb9\xfd\xf6\xdb\xa9\xae\xae\xe6\x8a\x2b\
+\xae\xe0\xa2\x8b\x2e\xaa\xe4\x20\x24\x10\x82\x4c\xba\xc4\x65\x67\
+\x5c\xcf\x2d\xbf\x3c\x93\x9f\xff\xcd\x2e\x4e\x08\x2d\x25\xe1\xec\
+\x67\xf7\xfa\x3b\x30\x0c\xcd\x0f\x5a\xcb\xe5\x32\xd1\x68\x94\x60\
+\x30\x78\x58\xae\xe7\xe1\xae\x6d\xdb\xb6\x31\x75\xea\x54\x06\x06\
+\x06\x50\x55\x95\xda\xda\x5a\x76\xec\xd8\x81\x10\x82\x8e\x8e\x0e\
+\xbf\x16\x78\xe7\xce\x9d\xac\x5c\xb9\xf2\xd8\xe9\x77\x8f\x7b\x29\
+\x95\x4b\xe8\x8e\xce\x9b\x77\xa7\x91\x16\x58\xc5\x43\x39\x74\xa1\
+\x4c\xd4\x8d\x47\x42\x9b\x1c\xce\x32\x4d\x93\xfa\xfa\x7a\xbf\xe2\
+\xdc\xb2\xac\x4a\x27\x6f\x08\x0c\xc3\x25\x14\x0c\xe0\x52\xa9\x3f\
+\xeb\x1e\x3a\xc8\xc6\xfc\x63\x28\xa8\x13\x92\x47\x1e\xf7\xd4\xd6\
+\xd6\x36\xb7\x58\x2c\x8e\x00\xb2\xa1\xa1\xc1\x38\x1e\x36\xe4\xea\
+\xab\xaf\x46\xd3\xb4\x3f\x48\x56\xb5\xb7\xb7\xfb\xc4\xa2\x94\x92\
+\x5f\xfc\xe2\x17\x95\xf7\x75\xac\xf4\xfb\x25\x97\x5c\xc2\x87\x3e\
+\xf4\x21\x5c\xd7\xe5\xc9\x27\x9f\xa4\xab\xab\x8b\x68\x34\xca\xc1\
+\x83\x07\x89\xc5\x62\x54\x55\x55\x71\xe0\xc0\x01\x72\xb9\x1c\x8d\
+\x8d\x8d\xf4\xf4\xf4\x1c\xb7\x1d\x28\x84\xe0\x87\x3f\xfc\x21\xcb\
+\x96\x2d\xe3\x3f\xfe\xe3\x3f\x0e\x05\x7f\x08\xa4\x0b\xf1\x78\x88\
+\x64\x26\x4d\x4d\xa0\xbe\xe2\x56\x4a\x9b\x80\x88\x20\x5d\x89\x65\
+\xd9\x7e\xad\x98\x57\xd6\xa9\xeb\x7a\xce\x75\xdd\x0c\x70\x44\xfc\
+\xd5\x1f\x91\x5e\x73\x7c\xbe\xc7\x09\x40\x75\x5c\xc5\x71\x5d\x26\
+\x87\x67\x50\x72\xd3\x14\xac\x2c\x42\x48\x8c\xac\x8b\x5b\x92\x7e\
+\xf6\xf0\xa8\x01\x19\x6b\xc0\xa4\xb5\xb5\x95\x1b\x6e\xb8\x81\x6d\
+\xdb\xb6\x51\x2a\x95\xa8\xab\xab\x63\xd9\xb2\x65\x6c\xdc\xb8\x91\
+\x60\x30\x48\x38\x1c\x26\x93\xc9\x1c\xf7\xb6\x66\x29\xa5\x5b\x55\
+\x55\x25\x77\xec\xd8\x51\x29\x59\xf0\x4a\x50\x25\x48\x21\x89\x45\
+\xc2\x3c\xbe\xfb\x7e\xbe\x75\xe5\x6f\xf8\xcd\xfe\x87\x78\xa9\xe3\
+\x65\xce\x3a\xe9\x74\x5e\x73\x37\x62\x18\xa6\xcf\xe8\x7a\x54\x8c\
+\x6d\xdb\xb3\xea\xeb\xeb\x03\xa3\xa3\xa3\x3d\xc7\x7a\x6f\xb6\x6d\
+\xb7\x09\x21\x2a\xc5\x82\x08\x46\x96\x48\xfe\xee\xf6\x66\x24\x2e\
+\x51\x33\x42\x50\x0f\x72\x70\xb8\x80\x55\x90\xbc\x7e\x57\x0a\xe9\
+\x54\x34\xce\x31\xb9\xbd\x42\x08\xbe\xf9\xcd\x6f\x72\xfb\xed\xb7\
+\xf3\xc9\x4f\x7e\x92\xb6\xb6\x36\x5c\xd7\x9d\xd0\x5f\x38\xd6\x9f\
+\x8d\x94\x92\x9e\x9e\x9e\xe3\x0a\x48\x2a\x95\xba\xe8\xf9\xe7\x9f\
+\xa7\xa5\xa5\xa5\x7d\xce\x9c\x39\xb3\xb3\xd9\x6c\xa5\x6e\x58\x28\
+\x14\x6a\x24\x25\x33\xca\x7e\xf9\x1c\xdf\x79\x56\x67\xd5\xe9\xa7\
+\x90\x50\x76\xf0\xcc\xbe\x5d\x0c\xb5\xe5\x48\xa5\x2a\x01\x6b\x28\
+\x14\xa2\xa5\xa5\x85\x52\xa9\xc4\xb5\xd7\x5e\xfb\x7a\x5b\x5b\xdb\
+\x86\x75\xeb\xd6\xad\x3c\x1e\x0e\x87\xef\xfa\x0a\x85\xba\x83\x92\
+\x7d\x4f\x15\x18\xda\x6e\x90\xef\xdb\x38\x41\x35\xa9\x42\x03\x8d\
+\xb7\xcd\x9f\x1c\xb1\x0d\x89\xc7\xe3\xdc\x77\xdf\x7d\x7e\xc2\xc8\
+\x2b\x34\x00\xd0\x35\x1d\x5d\x3b\xe4\x0a\x7b\xe5\xa3\xfb\xf7\xef\
+\x9f\x71\x3c\xed\x88\x57\x2d\xef\xbd\x00\x81\x40\x35\x5c\xb4\x30\
+\xe4\x7b\xe1\xf5\xce\x9f\xf3\xe4\x4f\x7e\x4c\x79\x44\x62\x95\x5c\
+\xca\x69\xd7\x8f\x85\x54\x55\x25\x9d\x4e\x13\x0a\x85\x18\x19\x19\
+\x39\xa2\x5e\x8d\xc3\x21\x18\x2f\xbc\xf0\x42\x6e\xbc\xf1\x46\xbe\
+\xf5\xad\x6f\xa1\xf6\xa9\x10\xcc\xd1\x38\x1b\xbf\x7f\xbf\x5c\x2e\
+\x53\x55\x55\x45\x2a\x95\xc2\xeb\x8b\x3f\x6a\x40\x62\xb1\x98\xdc\
+\xb4\x69\x53\xa5\x92\x23\x06\x0b\xcf\x8f\xa1\x07\x04\x4a\xa9\x9e\
+\x0b\x16\x5f\xca\xef\x3a\x1f\x41\x0b\xa8\x8c\xee\x33\x19\xd8\x5c\
+\xf6\x12\x4e\x52\xd7\xf5\x29\xc7\x13\x10\xd7\x75\x1d\x2f\x69\xa5\
+\xaa\x2a\x8b\x17\x2f\xa6\xb3\xbd\x83\xd7\xfe\xa9\x5c\xd9\x1b\x0a\
+\xa0\x54\x28\x12\xe1\xba\x84\x42\xd2\xa7\x2a\xbc\x11\x18\x63\x3d\
+\x7f\xc7\xb5\x91\xb4\x58\x2c\xf2\xe9\x4f\x7f\x9a\x54\x2a\xc5\x27\
+\x3f\xf9\x49\x1e\x7a\xe8\x21\x4e\x5f\x79\x3a\xdd\xdd\xdd\xcc\x9b\
+\x37\x8f\xdf\xfe\xf6\xb7\xac\x5c\xb9\x12\x5d\xd7\xc9\x66\xb3\xec\
+\xd8\xb1\xc3\xaf\x9a\x3f\x2a\x40\x42\x63\x4f\x66\xdb\x36\xb2\xda\
+\x65\xc6\x39\x35\x68\x08\xac\xb2\xc1\xeb\x23\x3f\x43\xb5\xc3\x24\
+\x5a\x0d\x92\xfb\x2b\xc1\xcf\x98\xdb\x2b\x86\x87\x87\x8f\xc9\xaa\
+\xc7\xe3\xf1\x96\xb9\x73\xe7\x1e\x08\x04\x02\x15\x4f\x4f\x51\x71\
+\x84\x4d\xa9\x54\xe2\xdb\xdf\xfe\x36\x4d\x4d\x4d\x24\x12\x09\x7e\
+\xf7\xbb\xdf\xf9\x05\x04\x00\x23\x23\x23\x4c\x9d\x3a\x95\x64\x32\
+\xc9\xc8\xc8\x08\xaa\xaa\x92\x4c\x26\x09\x85\x42\x94\xcb\x65\x02\
+\x81\xc0\x71\x05\x24\x14\x0a\xb1\x63\xc7\x0e\x66\xcf\x9e\xcd\x0b\
+\x2f\xbc\xe0\xf7\xd0\x8c\x8e\x8e\xfa\x95\x90\x83\x83\x83\xc4\xe3\
+\x71\xbf\x78\xf0\x9d\x58\x8c\x77\xb4\x21\x9e\x1b\x5b\x9d\x83\x0d\
+\x77\x64\xdf\x32\xaa\xa8\xa2\x46\x82\x11\x7d\x82\x18\x1f\x87\x9d\
+\x17\x98\x3d\x7b\x36\xb6\x6d\xa3\x0a\x95\x56\x75\x3f\x67\xdd\x10\
+\x64\xfd\x7f\x38\xbe\x2b\x3c\x6f\xde\x3c\x1e\x7b\xec\x31\x9a\x9b\
+\x9b\xa9\xad\xad\x65\xde\xbc\x79\xdc\x73\xcf\x3d\x68\x9a\xc6\xc2\
+\x85\x0b\xd1\x75\x9d\x5f\xff\xfa\xd7\x7e\x56\xd0\xab\x5e\x3f\x9e\
+\x80\x84\xc3\x61\xbe\xfa\xd5\xaf\x4e\x50\x43\xad\xad\xad\x00\xec\
+\xdf\xbf\xdf\xa7\xe8\xc7\xab\xde\x63\x02\x44\x4a\xc9\x3f\xfe\xe3\
+\x3f\x32\x77\xee\x5c\x6a\x6b\x6b\x79\xe2\x89\x27\x38\x78\xf0\x20\
+\x9a\xa6\xf9\x85\xd4\x73\xe7\xce\xa5\xbd\xbd\x9d\x44\x22\x41\x73\
+\x73\x33\x07\x0e\x1c\x38\x2e\xee\xae\xd7\x68\xa3\x09\x95\x4c\x3c\
+\x03\x72\x32\x91\x48\x84\xaf\x7f\xfd\xeb\x9c\x7a\xea\xa9\x7e\xed\
+\x97\xc7\x24\xe8\xba\x4e\xb1\x58\x64\xd7\xae\x5d\x7e\x4f\xbc\xe7\
+\xf7\x8f\xa7\x2c\x8e\x17\x20\xf1\x78\xfc\x1b\x5e\x40\x08\x20\x15\
+\x89\xa6\x09\x5c\x17\xa2\xa1\x28\x05\x23\x57\x69\x10\x12\xe0\xda\
+\x87\x18\xdf\x77\xba\xbe\xf6\x4e\x5c\xcd\xfc\xf9\xf3\xc9\xe5\x72\
+\x5c\x7a\xe9\xa5\xfc\xfe\xf7\xbf\x67\xce\x9c\x39\xd4\xd7\xd7\x33\
+\x73\xe6\x4c\x1e\x7a\xe8\x21\x74\x5d\x67\xd2\xa4\x49\x78\xcd\xa0\
+\xc7\xc3\xcb\x1a\x3f\xa1\x47\x52\x29\x42\x28\x17\x25\xf9\xb4\x41\
+\x44\x53\x59\xbb\xb6\x52\xdd\xa9\xab\x41\x14\xad\x52\x23\xe6\x35\
+\x00\x79\x76\xc2\x8b\xc8\xbd\xde\x72\x2f\x4d\x6b\x59\xd6\xa4\x50\
+\x28\x74\x9d\x10\x22\x00\x88\xba\xba\xba\x57\xfb\xfa\xfa\xba\x8e\
+\xc2\xae\x4d\xaf\xaf\xaf\xaf\xd8\x04\x45\xa0\x9d\xaf\x73\xe9\xb5\
+\x93\x28\x96\x0d\x2e\x3b\xf1\x66\xb6\x8c\x3e\x45\x62\x28\x49\xae\
+\xdf\x61\xc3\x37\x93\x3e\xcb\x1c\x8d\x46\x87\x8f\x1a\x90\x60\x30\
+\xc8\xbd\xf7\xde\xcb\xe7\x3e\xf7\x39\x3e\xf6\xb1\x8f\xd1\xdf\xdf\
+\xef\x8b\xbd\x37\xdb\x24\x95\x4a\x61\x59\x16\xa5\x52\xc9\xcf\x85\
+\xc8\xb1\xc8\xf0\xad\x0d\x34\x47\x0a\x88\x61\x18\x38\x28\xa8\xaa\
+\x42\x6f\xa7\xc1\xdd\xf7\x7e\x95\x6f\x3c\xfb\x2f\x7c\xe1\xfc\x2f\
+\x13\x8f\xc4\xf9\x9f\xad\x5f\xa4\xfd\x37\x39\x8c\x11\xc5\xaf\xec\
+\x38\xe1\x84\x13\x68\x6c\x6c\x64\xfb\xf6\xed\xd4\x35\x55\x71\xc2\
+\xcc\x46\x96\x4f\x5a\x86\xea\xea\x15\x07\x40\x30\x47\x22\x1f\xf3\
+\xd2\xd0\x3f\xfc\xe1\x0f\xff\x06\xe8\x3a\x8a\x7b\x94\xe3\x55\xb4\
+\x18\x81\xe1\x5d\x65\x12\x7b\x2d\xbe\xfa\xdd\x7b\x49\xee\xb3\x70\
+\x4d\x89\xa2\x0b\x14\x4d\xf1\x35\x8e\x10\x42\x39\x26\x1b\x92\x48\
+\x24\xb8\xfd\xf6\xdb\x0f\xeb\x26\xbd\x1e\x43\x21\xc4\xa2\xa6\x43\
+\x9e\x9f\xf6\x00\x00\x16\x56\x49\x44\x41\x54\xa6\xa6\x53\x06\x06\
+\x06\xb6\x1d\x43\xe0\x55\x01\x5d\x2a\xa8\x42\x05\x14\x96\x2e\x3b\
+\x85\x86\xb6\x2a\x96\xaf\x38\x8d\x29\xb5\x4d\xac\x29\xa9\x54\x6d\
+\x8c\xa0\xe4\x85\xaf\xd3\x67\xcc\x98\xe1\x79\x88\x4c\x3a\xdd\xa5\
+\xf9\xec\x34\xd2\x4d\xe3\x00\xc6\x40\x00\xa3\x2d\x42\xb9\x33\x82\
+\x10\x15\xde\x4d\x55\xd5\xa3\x76\x40\x54\x55\x65\xe1\xc2\x85\x9c\
+\x74\xd2\x49\x6c\xd8\xb0\x81\x81\x35\x15\xa3\x1e\x70\x1c\x26\x37\
+\xba\x7e\xac\xe6\x6d\x62\x6f\xb0\xdb\x51\x03\x32\x3c\x3c\xdc\xe5\
+\xba\xee\x5c\xaf\x80\xa0\xe9\xac\x30\x91\x88\x82\xb4\x75\xde\x77\
+\xd2\x2d\x3c\xb3\xef\x87\xd8\x18\xd8\x86\xe4\xc0\xef\x8b\x7e\x0a\
+\xb5\xaa\xaa\x2a\x52\x2c\x16\xe3\x47\xf2\x70\x53\xa6\x4c\x79\x5f\
+\xb1\x58\xbc\x10\x70\xa5\x94\xf1\xce\xce\xce\x8a\xee\x97\x82\xb2\
+\x61\x32\xd0\x53\xe2\xab\x89\x6f\xb2\xa7\x6d\x98\x3b\xb6\xfd\x2b\
+\xb1\x50\x35\x1b\x0e\x1e\xc4\xee\x8b\xa2\x58\x41\x7f\x07\xb6\xb6\
+\xb6\xfa\x6d\x69\x81\x62\x33\x77\x5e\xf4\x23\x36\xf6\xfe\x96\x1f\
+\xbc\xf8\x9f\xcc\x9c\x51\xc7\x50\x39\x4f\x76\x77\xa5\xb6\x57\xd7\
+\xf5\x63\xa2\xe2\x83\xc1\x20\xdf\xfc\xe6\x37\x89\xc5\x62\x34\x35\
+\x35\xb1\x63\xc7\x0e\xce\x3d\xf7\x5c\xd6\xac\x59\xc3\xca\x95\x2b\
+\x69\x6b\x6b\x43\x08\xc1\xac\x59\xb3\xc8\x64\x32\xbc\xf2\xca\x2b\
+\xc7\xc6\xf6\x5a\x96\xd5\x16\x0c\x06\x2f\xf6\xf2\xd5\xd3\x2f\x09\
+\x13\x8f\x6b\xe4\xfa\x6d\x7e\x33\x70\x1f\xb6\x22\x28\x0c\x38\xa4\
+\xbb\x0f\x19\x4d\x5d\xd7\x7d\x37\xf4\x08\x49\xc4\x5b\xaf\xbb\xee\
+\xba\xf3\xa5\x94\xb8\x48\x32\x55\xa3\x34\x4d\x0f\xe0\x66\xbc\xfa\
+\x2b\x9d\x74\x22\xc7\xa9\x0d\xe7\x60\x16\x6d\x92\xc5\x24\xa7\x37\
+\x5d\xc9\xb3\x5b\x9f\x21\x18\x74\x7c\x09\x55\x14\x05\xe9\x4a\xa4\
+\x25\xb8\x76\xf9\x87\xf8\xef\x0d\xff\xca\xf2\xd8\x87\x58\xd9\x70\
+\x23\x2b\x17\x2c\xe0\x3b\xad\x5f\x99\xd0\xfb\x7e\xb4\x80\x48\x29\
+\x9d\xf1\x05\xe5\x9e\x93\xe3\xb9\xd9\x5e\xc7\x59\x77\x77\x37\x81\
+\x40\x80\xda\xda\x5a\x7f\x9c\xd3\xb1\x90\x8b\x0a\x40\x75\x75\x35\
+\xb6\x6d\xb3\xe3\x6b\x45\xac\x9c\x44\x68\x20\x14\x10\xaa\x57\x81\
+\xa1\xa2\x69\x87\x22\xe3\xa3\x1c\xab\xa4\x27\x93\x49\x5c\xd7\x25\
+\x63\x17\x99\x73\x45\x06\x5b\xad\xa8\x7d\x29\x6c\x74\x4d\x85\xa4\
+\x82\x71\x20\x4a\xfe\x8d\xb1\xe1\x30\x63\xde\xd4\xf8\x12\xa0\x48\
+\x38\x4c\x32\x98\xe3\xcc\x8f\x45\x38\xff\xfc\x0b\xf8\xd1\xce\xe7\
+\x18\x4a\x8d\xb0\xb7\x7f\x27\xc5\x9a\xed\xa8\x54\x6a\x6c\x85\x7a\
+\x74\xe3\x93\x00\x1a\x1b\x1b\x4f\x94\x52\xae\x08\x85\x42\x5c\x73\
+\xcd\x35\xc4\x62\x31\x7f\x13\x6e\xdd\xba\x15\x45\x51\xd8\xb3\x67\
+\x8f\x5f\xf4\x31\x30\x30\xe0\x17\x18\x1e\x2b\x20\x9c\x7c\xf2\xc9\
+\x7c\xe9\x4b\x5f\xc2\xb6\x6d\x1e\x7e\xf8\x61\x0e\x1c\x38\x30\x61\
+\x8e\x47\x3c\x1e\x67\x70\x70\xd0\x8f\x46\xbd\xc1\x34\x47\x9b\x81\
+\x73\x5d\x17\xcb\xb1\x51\x84\x42\xba\x27\xcc\x23\x7f\xff\x3b\xfa\
+\x0b\xfb\xb9\xe3\xb7\x7f\xc7\xec\xc6\x79\x74\x96\xdb\x30\xca\x21\
+\x14\xfd\xd0\x44\x37\xdf\xf5\xf4\x8a\xf6\x14\x85\x40\x40\xc7\xb2\
+\x0c\x34\x25\x88\xaa\x68\x04\xb4\x20\x21\xad\x42\x85\x1b\xa6\x81\
+\xa2\x8a\xa3\x9e\xc7\x55\x2a\x95\x5a\x9a\x9b\x9b\xc3\x85\x42\x81\
+\xaa\xaa\x2a\x9f\x32\x1a\xbf\xfe\x58\xb1\xa0\x17\x30\x1e\x35\x20\
+\x2b\x56\xac\x60\xf7\xee\xdd\xfc\xf5\x5f\xff\x35\x67\x9c\x71\x06\
+\x42\x08\x22\x91\x4a\x1b\xb1\x97\x0e\x2d\x16\x8b\x0c\x0f\x0f\xd3\
+\xdc\xdc\xcc\xe0\xe0\xa0\x6f\x97\x8f\xf4\x41\xbd\xb9\x8d\x16\x15\
+\x55\xb0\x7a\xd5\xbf\xf2\xf3\x3d\x5f\x27\x79\xa0\x9a\x05\xda\x55\
+\xdc\x72\xc6\xdf\xf3\x99\x9e\xf7\x57\x5c\x5c\xa7\xa2\x72\x82\xc1\
+\xa0\x3f\xdb\xd1\x75\x5d\x0c\xd3\xc4\x2a\x18\x64\xd7\x2c\xe6\x8b\
+\xbf\xfa\x22\x8e\xb4\xd9\xcb\xe3\x94\x0d\x8b\xcc\xcb\x02\xe4\x0c\
+\x66\xcf\x96\x20\x2a\xb9\x8a\xcb\x2f\xbf\xfc\x7f\x84\x10\xdf\x07\
+\xd8\xbc\x79\x73\xc7\xde\xbd\x7b\x97\x1c\xae\x27\x98\x4e\xa7\x2b\
+\x1d\xc4\x01\xb8\xe4\xdf\x1a\x50\x54\x01\xa8\x34\xd7\x9f\x40\x7f\
+\xea\x00\xa3\xfb\x4c\x0e\xbc\x58\x24\xd5\x5e\x91\xe0\xaa\xaa\x2a\
+\xf2\xf9\xfc\xfd\xc7\x14\x18\xfe\xfc\xe7\x3f\xe7\x03\x1f\xf8\x00\
+\x77\xdf\x7d\x37\xeb\xd7\xaf\xf7\xfd\xfd\x7c\x3e\xef\xd3\x25\xa9\
+\x54\x6a\x42\xaa\x54\x4a\x49\x63\x63\xe3\x97\x14\x45\xb9\xa5\xaf\
+\xaf\xef\xc0\x91\x4a\x88\x83\x83\x22\x55\xa6\xd4\x4d\x61\xff\x40\
+\x91\xa2\x05\x1d\xc3\xfb\x79\x72\xef\x7d\xd8\xb6\x85\x65\x55\x74\
+\xa9\x69\x9a\x04\x83\x41\x4e\x3d\xf5\x54\xf6\xee\xdd\x4b\x22\x91\
+\x20\x9d\x4e\x63\xba\x26\x56\xd9\xc6\x30\x2a\x53\x91\x76\xd7\x6e\
+\xe6\x9c\x6b\x63\x38\xb9\xca\x1c\x45\x37\x13\xc4\xc9\x6a\x38\x19\
+\x0d\x6b\x20\x18\x40\xfa\x33\x15\x83\x47\x60\x43\xd0\xf5\x4a\x3d\
+\x98\xee\x2a\x0c\x6c\x36\x29\x0e\x3b\x14\x86\x1c\x5e\x1d\x48\x50\
+\x4e\xb9\x95\xba\x35\x4d\xf8\xb5\x08\x63\x36\xcb\x3e\x26\x1b\xe2\
+\xba\x2e\x0f\x3c\xf0\xc0\xa1\x1b\xf1\x02\x4d\x01\x99\x74\x06\xcf\
+\xad\x16\xa2\xc2\xdb\x78\x63\xfd\xe6\xcc\x99\x73\x51\x26\x93\xa9\
+\x07\xfe\x28\x20\xf3\xe6\xcd\x7b\x8f\xae\xeb\x42\x51\x14\x67\x78\
+\x78\x38\x56\x2e\x55\x26\x7b\x5a\x8a\x4d\xbe\x3f\xc0\xae\x5d\xbb\
+\x48\xe4\x0a\xa4\x07\x6c\xb2\x89\x2c\xa3\x07\x8b\xe4\x07\x2d\x4c\
+\x4b\xa2\xc8\x0a\x80\x86\x61\xd0\xdc\xdc\xcc\x8e\x1d\x3b\x50\x94\
+\x4a\xeb\xb4\x23\x0f\x4d\x1e\x32\x5c\x8b\x70\x2d\x28\x8e\xc6\xb4\
+\xfa\x05\xc4\x67\x54\xb1\x73\x70\x03\x75\x91\xc9\x64\xe5\x10\x03\
+\x0f\x36\xe0\x14\x0e\xa9\xbc\x23\x49\x2f\x57\x55\x55\xb1\x7a\xf5\
+\x6a\xf6\xec\xd9\xc3\x81\x7d\x07\x08\x18\x65\x54\xc7\x21\x56\xef\
+\x62\xd7\xd8\xfe\x98\x0e\x2f\x6e\xf3\xbc\xbf\x63\x89\x43\xfe\xfb\
+\xe0\xc1\x83\x17\xdb\xb6\x3d\x53\x08\x41\x31\x26\x39\xf5\xf2\x6a\
+\xf4\x80\xa0\x30\x52\xc5\xfb\xcf\xb8\x9e\x67\xf6\xfd\x00\x4d\xd5\
+\x19\xda\x6e\x30\xb8\xb5\x84\x50\x84\x3f\xed\xe7\x1d\x1e\xb0\xe1\
+\xb4\xd3\x4e\xdb\xac\xaa\xaa\x10\x42\x20\x91\x50\x5b\x82\x6c\x10\
+\xe1\xa8\xb0\x11\x9e\xd8\xf8\xd4\x21\xde\x88\x1a\x76\x1c\x18\x64\
+\xf4\x60\x0c\x47\xe6\xb0\x4d\xe9\x1b\x73\xaf\x16\xcc\x9b\xec\xe6\
+\x9a\xae\xdf\x6a\x6d\x49\x07\x45\x55\xe8\xde\x6f\xf3\x95\x5b\xbf\
+\xc2\x0f\xd6\x7e\x97\x4b\x5a\x6e\xe1\x8a\x25\x1f\xe4\x53\xcf\x5f\
+\x80\x65\x5a\xd8\xa6\x73\x44\x80\x78\x69\xd9\x6f\x7f\xfb\xdb\x24\
+\x12\x09\x6e\xbe\xf9\x66\x9e\x7b\xee\x39\xbf\x72\xb1\xbd\xbd\x9d\
+\x65\xcb\x96\x11\x0e\x87\xd9\xb6\x6d\x1b\xdb\xb6\x6d\x63\xe9\xd2\
+\xa5\x6c\xd8\xb0\xe1\x1d\xbf\xfb\x4f\x02\x92\xcb\xe5\xb6\x36\x37\
+\x37\x0f\x1b\x86\x31\x53\x08\x81\xa1\x3b\xb4\x9c\x57\x8d\x9d\x92\
+\xa4\x3b\x0c\x1e\xfd\xed\x03\x14\x07\x04\x56\xd1\xa2\x9c\x92\x84\
+\xc2\x21\xdf\xf5\x7d\xa7\xf6\x30\x40\x2f\x97\xcb\xc2\xb6\x6d\x10\
+\xb0\x35\xb2\x8b\xf7\x9e\x5f\x87\x2b\x5d\x1c\xc3\x45\xb1\x83\x48\
+\x4b\xc1\xc9\xab\xe4\x5e\xab\xc1\x29\xaa\x3e\xb1\x98\x4c\x26\xfd\
+\xe0\xd1\xa3\x47\x5c\xd7\xa5\xb3\xb3\x53\xbe\xf1\xc6\x1b\xe2\xd1\
+\x47\x1f\x65\xdb\xb6\x6d\x15\xc7\x43\x3a\xa8\x9a\xc2\x09\xd5\x4b\
+\x38\x98\xdf\xcd\x48\xf9\x20\xff\xeb\xc4\xdb\x09\x6a\x21\x42\xa1\
+\x20\x96\x63\x63\x99\xbe\x1a\x7a\x47\x44\x6a\x6a\x6a\x3e\x71\xde\
+\x79\xe7\x7d\xa3\xb5\xb5\x95\x47\x1e\x79\x84\x2f\x7f\xf9\xcb\xf4\
+\xf5\xf5\xb1\x77\xef\x5e\x72\xb9\x9c\x4f\xd3\xac\x5d\xbb\x96\x99\
+\x33\x67\xd2\xd3\xd3\x83\xe3\x38\x8c\x8e\x8e\x1e\x9f\xc1\x01\x95\
+\x0d\x21\x38\xe9\xa4\x93\xe8\xee\xea\x66\xe3\xe7\xca\x48\x7b\xcc\
+\x21\x16\x1a\x08\x15\xe9\x38\x84\x42\xba\xff\x72\xbc\x12\xfc\x77\
+\xba\x01\xbf\x3c\x07\x49\xa0\xae\xd2\xd9\x74\xd6\xa4\x0f\xd3\x32\
+\xb9\x85\xa7\x3b\xbe\xc7\xcc\xaa\x53\xd8\x9a\xfa\x0d\xf6\xc6\x30\
+\xb6\x75\xa8\x8a\x64\x7c\x1b\x44\xa1\x50\xb8\x63\xff\xfe\xfd\xff\
+\x3e\x69\xd2\xa4\x81\x91\x91\x91\xc6\xb5\x6b\xd7\xb2\x68\xd1\x22\
+\x36\x6e\xdc\x58\xe9\xc8\x52\x5d\x92\xbf\x2f\xd3\x3b\x75\x90\x7b\
+\x36\x3f\x40\x32\x97\xe0\x0b\xbf\xfb\x12\xaa\xa2\xd2\x9d\x05\x2b\
+\x7f\x48\x32\x26\x4f\x9e\x7c\xc2\xb4\x69\xd3\x5e\x05\x54\xc7\x71\
+\xd8\xb9\x73\xe7\x75\xc9\x64\xb2\xe7\x2d\x6c\x44\xad\xa2\x28\x9a\
+\x94\x92\x4d\x9b\x36\x71\xd1\x45\x17\xf9\xe4\xe6\x5b\xd7\xfe\xfd\
+\xfb\x7d\x82\x73\xeb\xd6\xad\xc4\xe3\xf1\x63\x07\xc4\xb2\x2c\x6e\
+\xbd\xf5\x56\xce\x3b\xef\x3c\x0c\xc3\xe0\xb1\xc7\x1e\xf3\x07\x41\
+\x7a\x9e\xd6\x9c\x39\x73\xd8\xbb\x77\xaf\x4f\x0d\x0c\x0c\x0c\x78\
+\x37\xb9\x70\xda\xb4\x69\xc9\xde\xde\xde\xb7\xe3\x8a\x1c\x8f\xaf\
+\x92\x02\x14\x45\xd0\xbd\xcf\xe6\xdb\x7f\x75\x13\xff\xf0\xe3\x2b\
+\xf8\xe2\xc5\xdf\x27\x1e\x6e\x60\x74\x7b\x27\x83\xd6\x08\x86\xe1\
+\xf8\x80\x7b\xc4\xe1\xb8\x2a\x49\xa9\xaa\x2a\xb7\xde\x7a\x2b\x9f\
+\xff\xfc\xe7\xb9\xff\xfe\xfb\xfd\x09\x3c\xb6\x70\xd1\x8a\x1a\xb1\
+\x13\xaa\x28\x65\x2c\x0a\x96\x60\x64\xd9\x56\xe2\xb1\x10\x93\x46\
+\xc2\xd8\xf5\x41\xdc\xb2\x8a\x34\x14\xa4\xa9\x84\x91\xe2\x4c\x2f\
+\xf7\xfd\xe6\x9b\x6f\x86\xde\x4e\x5d\x8d\x4f\x5b\x2b\xaa\x4a\xb8\
+\x4a\x23\x10\x14\x87\x3a\xa6\x04\xd8\x25\x17\xbb\xa4\xf8\x36\x57\
+\x51\x14\x4a\xa5\x92\x65\x9a\x66\xe2\x98\x00\x71\x1c\x87\xd9\xb3\
+\x67\x93\x4c\x26\x39\xe5\x94\x53\x08\x85\x42\x9c\x72\xca\x29\x44\
+\xa3\x51\xa2\xd1\x28\x3f\xf9\xc9\x4f\xa8\xa9\xa9\xe1\xcc\x33\xcf\
+\x24\x9d\x4e\xb3\x6e\xdd\x3a\x02\x81\x00\xb6\x6d\xf3\x9e\xf7\xbc\
+\xe7\xe1\xf6\xf6\xf6\x1f\xf7\xf6\xf6\xde\x34\x46\x36\x36\x01\xab\
+\x01\xd3\x75\xdd\xea\xde\xde\xde\x4a\x01\x32\x60\x5a\x26\xf9\x6c\
+\x8c\x3b\xef\xfc\x1a\x3d\xed\x59\x1e\x1f\x7a\x86\x4c\x21\xc3\x2b\
+\x7d\x6f\x52\xe8\x0a\x13\xd3\x6b\x3d\xb6\x94\xaa\xaa\x2a\x72\xb9\
+\xdc\x84\xd1\x17\x42\x08\xda\xda\xda\xb8\xe9\xa6\x9b\xc8\xe5\x72\
+\x54\x55\x55\x55\x66\x09\x0b\x17\xdc\xb1\x39\xed\xc0\x90\x36\xc2\
+\xc2\x85\x01\x6c\xcb\x84\xa6\x89\x23\x93\xb2\x9b\xc7\x2a\x1e\x85\
+\xf4\x0b\x23\xfe\x18\xf1\xd9\xd0\xd0\x30\xd6\x82\x00\xb5\xe7\x04\
+\x59\x7c\x5a\x8c\xa1\xed\x65\x46\xf7\x59\x8c\xee\x36\x71\xed\xb7\
+\x75\x04\x0e\x0c\x0e\x0e\xde\x77\x4c\x80\x44\x22\x11\xee\xbc\xf3\
+\x4e\xce\x3c\xf3\x4c\xee\xb9\xe7\x1e\x8a\xc5\xe2\x84\xec\x97\x69\
+\x9a\xac\x5d\xbb\x16\xdb\xae\x64\xf4\x82\xc1\xa0\xff\xef\xde\xf0\
+\x2e\x6f\x8d\x8c\x8c\xac\xba\xf2\xca\x2b\x3f\xef\x51\xf4\x19\xb3\
+\x28\x6b\x67\x3b\x42\x26\xc3\xb8\xc9\x00\xd8\x92\x3d\x6f\x76\x32\
+\x59\x59\xc0\xa6\x8d\x95\xe9\xdc\xd3\xb4\xe5\x74\xba\x1d\x7e\x8e\
+\x3a\x12\x89\x10\x0c\x06\xfd\x91\x47\xe3\xa8\x97\x7b\x86\x87\x87\
+\xab\x84\x10\x6e\xb9\x5c\x5e\x2e\x84\xb8\xb8\x5c\x2e\xe3\x28\x2e\
+\xa1\x50\x78\xac\xe2\x51\x80\x2a\x31\x4d\x87\x0f\xcc\xbc\x93\xee\
+\xec\x2e\x4e\x9a\xb5\x98\xff\x7a\xee\x3e\xec\xba\x76\x1c\x27\x82\
+\x65\x5a\xa0\xc8\xb7\x8d\xe2\x03\x81\xc0\x6c\x29\x65\x9d\x37\x48\
+\x61\xd1\xa2\x45\x04\x02\x01\xfa\x5e\xeb\x65\xe7\xcb\x12\x49\x00\
+\x29\x75\x62\x91\x90\xaf\x52\xbd\x5f\x5e\x61\xc8\x31\xab\x2c\xdb\
+\xb6\x83\x8a\xa2\xf0\xda\x6b\xaf\x55\xf4\xa1\x64\xc2\x64\x05\x21\
+\xc0\xb6\x1c\x84\x52\x31\xe6\x5e\x2e\xa2\x50\x28\x4c\x18\x2c\xec\
+\x3d\x93\x33\x6e\x50\x72\x76\x61\xa7\x98\x79\x46\x14\xcb\x35\x71\
+\x1c\x17\x25\x17\xab\xc4\x07\xde\xec\xdc\x31\xf7\xd2\x9b\x17\x2c\
+\xa5\xf4\xe9\xfe\xfa\xfa\x7a\x12\x89\x43\xd2\x9f\x4c\x26\xbf\xe6\
+\x19\xfb\xc9\x93\x27\x7f\x4c\xd3\xb4\x8b\xa5\x94\x08\x1b\xb0\x5d\
+\xff\x50\x00\xcb\x34\x48\xec\x93\x54\x35\x57\xf3\xfc\x9b\x3f\xc6\
+\x3a\xf0\x31\x16\x28\x67\x12\x53\x56\xf0\x58\xef\x4f\xc9\x8d\x06\
+\x40\x48\x6f\xf0\xd8\x29\x81\x40\xa0\x5e\x55\x55\x51\x2a\x95\x76\
+\x5f\x72\xc9\x25\xed\x3d\x3d\x3d\x58\x96\x25\x6b\x6b\x6b\xc5\x3f\
+\xff\xf3\x3f\xb3\x78\xf1\x62\xee\xbd\xf7\x5e\xf6\xed\xdb\xc7\xe2\
+\xc5\x8b\x79\xf3\xcd\x37\x69\x69\x69\xa1\xbf\xbf\x9f\x74\x3a\xcd\
+\x94\x29\x53\x90\x52\xb2\x7d\xfb\x76\xd2\xe9\xf4\xb1\x03\x72\xe0\
+\xc0\x81\xbf\xcb\xe5\x72\x9b\xd4\x31\x7e\x22\x1f\x72\x39\xff\x96\
+\x3a\xca\x59\x07\xbb\x24\x29\xa5\x5c\xd2\x5d\x16\x99\x03\x36\xee\
+\x38\xa0\x26\x4d\x9a\xe4\xd1\x2b\x55\xb1\x58\x6c\x46\x3e\x9f\x3f\
+\x00\xb8\xe3\x77\x4a\x38\xa2\x61\x14\x25\x97\xcf\xfc\x27\x26\xd7\
+\xd5\xf2\xf3\x3d\xdf\x20\x56\xd7\x48\xa2\xf9\x00\xc9\xf5\x21\x5f\
+\xf7\x3a\x8e\x43\x3a\x9d\x46\x4a\x49\x38\x1c\xc6\xb2\x2c\x06\x06\
+\x06\xbc\x06\x98\xb7\xf3\x1c\x54\x4d\xd3\x58\xbd\x7a\x35\xf9\x7c\
+\x9e\x1f\xff\xf8\xc7\x7e\x02\xad\xae\x5c\x45\x68\xeb\x1c\xee\xda\
+\x7c\x17\xaa\x32\x87\xdf\x06\x9e\x20\xa4\xeb\x48\x43\x65\x8a\xb3\
+\x98\xa6\x13\xbd\x9d\x26\xb9\xfa\xea\xab\x7f\xee\x55\x8e\xac\x59\
+\xb3\x66\xaa\x57\x13\x6c\xdb\xb6\x37\x8f\xd7\x1f\x36\xe3\xba\x2e\
+\x93\x27\x4f\x66\xfa\xf4\xe9\x94\xcb\x65\x66\xcc\x98\xc1\xba\x75\
+\xeb\xfc\x64\xde\xce\x9d\x3b\x8f\x8f\x97\x65\x59\xd6\xd6\x40\x20\
+\x20\x3d\x35\x13\x01\x76\xfe\xc0\x7c\x4b\x6e\x5d\x27\xa4\xeb\xa0\
+\x1f\x8a\x62\x35\x4d\xc3\xb2\x2c\x1a\x1b\x1b\xff\x7a\xc9\x92\x25\
+\x97\xbd\xf8\xe2\x8b\x5f\xb5\x2c\xeb\xe4\xbe\xbe\xbe\x43\x63\x9d\
+\xde\x28\xa0\xb5\x57\xb3\xeb\xc4\x36\xbe\xb1\xf9\x19\x66\x4e\x99\
+\x89\x1e\x9f\x42\xdb\xe0\x4e\xf2\x43\xae\x5f\x1c\xf0\x16\xd1\x2f\
+\x77\x74\x74\x3c\x34\x96\xf1\x33\x34\x4d\x7b\xe5\xed\x72\x29\xef\
+\x7b\xdf\xfb\xa8\xaf\xaf\xe7\xb6\xdb\x6e\xe3\xd1\x47\x1f\xf5\x53\
+\xba\xae\x74\x29\x9b\x15\xb5\xbb\x21\xdd\xca\x7b\x6f\x0d\x4f\x18\
+\x33\x65\x0d\x07\x30\x7b\xc2\x98\x07\xc3\x38\x39\x8d\xf1\xb3\x54\
+\xbc\x2a\x7a\x2f\xc6\xb9\xed\xb6\xdb\x08\x06\x83\x94\x4a\x25\xa4\
+\x94\x7c\xff\xfb\xdf\x9f\xd0\x7f\x22\xa5\x64\xf7\xee\xdd\xb4\xb6\
+\xb6\x1e\x36\x89\x79\x58\xed\xa7\xae\xeb\xf2\xd1\x8f\x7e\x94\x73\
+\xce\x39\x87\x8e\x8e\x0e\x76\xee\xdc\x49\x67\x67\xa7\x3f\xdb\xc3\
+\x34\x4d\x4e\x3f\xfd\x74\xf6\xef\xdf\xcf\x9e\x3d\x7b\x98\x3d\x7b\
+\x36\x1d\x1d\x1d\x7e\x26\xb1\x5c\x2e\xeb\xe7\x9e\x7b\xee\xbf\x2a\
+\x42\x61\x58\x1b\x96\xd3\x4f\x12\xc2\x1c\x0c\x63\x0f\x07\x71\x53\
+\x3a\x3b\x36\xee\xa5\x45\x3d\x11\x67\xc4\xa5\x77\x78\x90\x26\x6d\
+\x29\xeb\x13\xaf\xfb\xbd\xe0\x5e\x71\xc0\x18\x91\x98\x4f\x24\x12\
+\x1f\xfd\x93\x0f\xa5\x69\xbc\xf2\xca\x2b\xac\x59\xb3\x86\x91\x91\
+\x11\x8a\xc5\xa2\x3f\x4f\xd7\x2b\x0b\x02\x28\x0a\x93\x68\x6d\x0c\
+\x92\xd3\xb8\xfd\x92\x2f\xf1\x8b\xd6\xff\x64\x24\x32\x82\x3d\x37\
+\x4b\x62\xb3\x45\xea\xe5\x2a\x54\xad\xd2\xb2\x7d\xd6\x59\x67\xad\
+\xf3\x00\x29\x95\x4a\x84\xc3\x95\xf3\x4e\x8a\xb9\x4a\x39\xa9\x50\
+\x15\x94\x3f\x5e\xd6\x2c\x01\x91\x4a\xa5\xa2\xc7\x05\x10\x29\x25\
+\xd7\x5c\x73\x0d\x5b\xb6\x6c\x61\xd5\xaa\x55\x24\x12\x09\x16\x2d\
+\x5a\xc4\xf6\xed\xdb\x69\x68\x68\xa0\xb3\xb3\x93\x9a\x9a\x1a\x16\
+\x2e\x5c\x48\x20\x10\xa0\xbd\xbd\xdd\x1f\x00\xe9\xbd\x80\xfe\xfe\
+\x7e\x1c\x29\xa9\xbe\x3e\x2f\xc2\x8b\x63\x84\x97\x66\x41\x91\x48\
+\x53\xc1\x4e\x6b\xb8\x59\x9d\xd4\xf3\xb5\x38\x96\x8b\xe6\x1e\xaa\
+\x2e\xf1\x06\xa7\xd5\xd5\xd5\x4d\x98\x35\xff\x4e\x91\x74\xb1\x58\
+\xe4\x9c\x73\xce\xf1\xc1\xf4\xf4\x77\x5d\x5d\x9d\xff\xbd\x4d\x3d\
+\x2a\x7b\xbf\x5c\x87\xed\x66\xf8\x9b\xff\xfc\x18\x02\x9d\x40\x40\
+\x45\x1a\x51\x14\x5d\x22\x74\x13\xd5\x55\xbc\xd1\xb8\xb3\x0c\xc3\
+\xc0\xb6\x6d\xaa\xab\xab\x2b\xc9\x27\x04\xb5\x4b\x82\xe8\x08\xf2\
+\x03\x0e\x46\xc6\x9d\x30\x9c\xc8\x93\x0a\x4d\xd3\x44\x36\x9b\x7d\
+\xc3\xb6\xed\xf7\x1e\x17\x40\x74\x5d\xe7\xfa\xeb\xaf\xe7\xae\xbb\
+\xee\xe2\xeb\x5f\xff\x3a\xdd\xdd\xdd\x13\x4e\xd2\x29\x16\x8b\x74\
+\x75\x75\x91\xcb\xe5\xfc\x29\x9d\xaa\xaa\x92\xcd\x66\xa9\xad\xad\
+\xc5\x75\x5d\x7f\xc8\xc0\xc0\x03\x36\x6f\x28\xde\xb0\x49\x65\x1c\
+\x65\x61\x52\xb4\xda\x68\x69\x69\x99\x90\xb7\xf7\x26\xea\x7c\xf4\
+\xa3\x1f\xe5\xfe\xfb\xef\x3f\xac\x32\x23\xc3\x30\x72\xb6\x6d\x77\
+\x7b\x75\x5d\x42\x88\xe9\xaa\xaa\x0a\x4f\xda\xfd\x89\xa8\x01\x8d\
+\x9a\x49\x31\x2c\xcb\x62\xb4\x6c\x53\x7d\xe9\x10\xb5\x93\x74\x64\
+\x49\xc3\x1c\x0a\x52\xec\x08\x40\x22\xea\x57\x4e\x7a\xf1\x47\x28\
+\x14\xe2\x13\x9f\xf8\x04\xc9\x64\x92\xed\xdb\xb7\x57\x1a\x95\x6a\
+\x2d\x64\xfc\x90\xf3\xe1\xfd\xee\x15\x5d\x94\x4a\xa5\x72\x22\x91\
+\x48\x1d\x17\x40\xbc\xb9\x8a\x5f\xf8\xc2\x17\xfe\xe8\x67\xf2\xf9\
+\xbc\x4f\xcd\x4b\x29\x19\x3b\xb1\xcc\x67\x81\x87\x86\x86\x2a\x85\
+\xda\x93\xe3\xa8\xaa\x4a\x5b\x5b\x9b\x3f\xcb\x77\xf1\xe2\xc5\x63\
+\xd4\x47\xd9\xcf\x71\xd8\xb6\xed\xe7\x0e\xaa\xaa\xaa\xfc\xf9\x86\
+\x87\x03\x48\x3a\x9d\x7e\x70\xd3\xa6\x4d\x0f\x7a\x3f\x4f\x9f\x3e\
+\xdd\x52\x55\x55\x3b\xf1\xc4\x13\xe9\xee\xee\xf6\x81\xf6\x5e\x98\
+\x61\x18\x24\x7b\x46\x68\x5e\x7f\x12\xd9\x52\x89\x75\xeb\xd6\xa1\
+\x69\x1a\xcb\x97\x2f\xa7\xa1\xa1\x81\x36\xa5\x7d\xc2\x09\x3a\x17\
+\x5e\x78\x21\x93\x27\x4f\xe6\x33\x9f\xf9\x0c\x8f\x3c\xf2\x08\x2f\
+\xbf\xfc\x32\x97\x5d\x76\x19\xbf\xff\xfd\xef\x99\x35\x6b\x16\xc3\
+\xc3\xc3\x6c\xd8\xb0\x81\x58\x2c\xc6\xa9\xa7\x9e\xca\x73\xcf\x3d\
+\x77\xd8\xa4\xe5\x61\x01\x92\x4a\xa5\xfe\x2a\x9b\xcd\x7e\xa3\xa6\
+\xa6\x66\x51\x3e\x9f\xf7\xcb\xfb\xc7\x1b\xaa\xb7\x1a\x2d\xaf\xc8\
+\xce\x03\xc5\xcb\x75\x54\x55\x55\x11\x08\x04\x68\x6a\x6a\x62\xe6\
+\xcc\x99\x0c\x0c\x0c\x4c\x38\xbf\x6a\xfc\x31\x42\xe3\x8b\x93\xbd\
+\xe1\x68\x47\x93\xfc\x92\x52\xb2\x6e\xdd\x3a\x86\x86\x86\x58\xbd\
+\x7a\xb5\x1f\x4b\x79\x52\xe8\x79\x4a\xb6\x6d\x93\x4e\xa7\x39\xeb\
+\xac\xb3\x88\xc5\x62\x24\x93\x49\x32\x99\xcc\xf8\x53\xd8\x30\x4d\
+\x93\xbd\x7b\xf7\x72\xdb\x6d\xb7\x31\x32\x32\xc2\x8e\x1d\x3b\x70\
+\x5d\x97\xed\xdb\xb7\xe3\xba\x2e\xfb\xf6\xed\xf3\x9f\xbd\x50\x28\
+\x30\x38\x38\x78\x44\x2c\xf2\x61\x01\x92\x4c\x26\x7f\x5d\x57\x57\
+\xf7\xcf\xcb\x97\x2f\x67\xf5\xea\xd5\x74\x77\x77\xb3\x79\xf3\x66\
+\xba\xba\xba\x08\x04\x02\x7e\xe2\x7e\xea\xd4\xa9\xf4\xf5\xf5\x91\
+\x4e\xa7\x99\x34\x69\x92\xcf\x7e\xfa\x25\x3d\xe3\x62\x10\xcb\xb2\
+\xc8\xe7\xf3\x3e\x4d\x3e\xfe\x40\xb1\xf1\xb3\x73\xc7\x5e\x5c\x6a\
+\x60\x60\xe0\xe1\xb1\xff\x37\x72\x34\x65\x45\x86\x61\xf8\x52\x9b\
+\xcd\x66\xfd\xef\x1f\x3f\x74\xdf\x53\x4b\xa6\x69\xfa\x07\xd5\x78\
+\xff\xe6\xfd\xbd\xe3\x38\x8c\x8c\x8c\xb0\x6a\xd5\x2a\x5f\x9d\x43\
+\xa5\x9b\xca\x1f\xeb\x31\x6e\x83\xbe\xf1\xc6\x1b\x47\xd4\x42\x77\
+\x24\xe7\x87\x88\x8f\x7f\xfc\xe3\x0c\x0e\x0e\x72\xed\xb5\xd7\x62\
+\xdb\x36\xb3\x67\xcf\xa6\xaf\xaf\x0f\xdb\xb6\xa9\xab\xab\x43\x88\
+\x4a\x32\xa6\xbd\xbd\x9d\x62\xb1\x48\x30\x18\xf4\x87\x24\x7b\xb6\
+\xc0\x03\xc4\x2f\xf3\x19\x03\x61\xbc\x24\xa9\xaa\x4a\x20\x10\xa0\
+\xa5\xa5\xc5\x9b\x3b\x35\xd2\xd9\xd9\xf9\x89\xf1\x31\xce\xf8\xa0\
+\xf0\x70\x54\xee\xc5\x17\x5f\xcc\x45\x17\x5d\xc4\xf0\xf0\xb0\xaf\
+\xb2\x42\xa1\x90\x9f\x8a\xf6\xd4\xd7\x78\x06\x60\xfc\xe1\x67\xde\
+\xdc\xc9\xb1\x0d\x3a\x81\x4c\x1c\x5f\x72\xfb\x76\xd7\x96\x52\x76\
+\x49\x29\xfb\x8e\x37\x20\x7c\xfa\xd3\x9f\xe6\xa1\x87\x1e\xe2\x67\
+\x3f\xfb\x19\x2f\xbe\xf8\xe2\x84\xf3\x38\x0c\xc3\x20\x1a\x8d\xfa\
+\x65\xf7\xde\x91\x0e\x9e\x6b\xec\xa9\xaf\xf1\xa7\xd5\x8c\x3f\xe9\
+\xcd\x7b\x21\xc5\x62\xd1\xaf\x32\x9c\x3a\x75\x2a\xe9\x74\xfa\x0f\
+\x28\x87\x23\x01\xc3\x53\x59\x4d\x4d\x4d\xec\xde\xbd\xdb\x57\xb7\
+\x9e\x5a\x1c\x7f\x14\x85\xf7\x67\x4f\x5a\xc7\xd7\x54\x99\xa6\x89\
+\xae\xeb\xdc\x71\xc7\x1d\x5c\x70\xc1\x05\xfc\xfb\xbf\xff\xbb\x97\
+\x5f\xf7\x59\x6b\x4f\xda\xab\xaa\xaa\xfc\x41\x3d\x52\x4a\x76\xed\
+\xda\x35\xeb\xb8\x4b\x88\xe7\x3e\x7e\xf0\x83\x1f\x9c\xd0\x53\x38\
+\xde\x76\x78\x93\x9d\x3d\xfd\x59\x55\x55\xe5\x9f\xc4\xe3\xed\x4a\
+\x8f\x23\xf2\xa4\xc5\xf3\x46\x3c\x8a\xc4\xa3\xab\xa5\x94\x13\x06\
+\x80\x1d\xcb\x4a\xa7\xd3\xb3\x36\x6f\xde\x8c\x65\x59\xf9\xe9\xd3\
+\xa7\x77\xac\x5a\xb5\xaa\xf6\x53\x9f\xfa\x14\x37\xdf\x7c\x33\xf9\
+\x7c\xde\xef\xb5\xf7\xdc\x5a\x6f\x1c\xdf\x78\x9a\x3f\x93\xc9\x30\
+\x7b\xf6\x6c\xce\x3d\xf7\x5c\xa2\xd1\x28\xe7\x9c\x73\x0e\x1b\x36\
+\x6c\xe0\x92\x4b\x2e\x61\xcd\x9a\x35\x5c\x79\xe5\x95\x3c\xf9\xe4\
+\x93\x2c\x5c\xb8\x90\xda\xda\x5a\x54\x55\xe5\xb9\xe7\x9e\x9b\x30\
+\xed\xfa\x78\x03\xf2\x8b\xee\xee\xee\xed\x8a\xa2\xac\x7e\xef\x7b\
+\xdf\x8b\xa2\x28\xb4\xb7\xb7\x63\x18\x86\x3f\xef\xdc\xd3\xb7\x35\
+\x35\x35\x38\x8e\xe3\x0f\x94\x14\x42\x90\x4a\xa5\xfc\x01\xf5\xe3\
+\x55\x96\x57\xd1\xe7\x7d\x6e\xac\x5a\x5d\x3a\x8e\x23\x6c\xdb\xa6\
+\xa6\xa6\x86\x4c\x26\xa3\x1e\x23\x20\x7e\x4e\xa3\x58\x2c\xba\x77\
+\xdd\x75\x17\xeb\xd7\xaf\xa7\xba\xba\x9a\x91\x91\x11\x7f\xf7\x8f\
+\xb7\x67\x1e\xd5\x32\x3e\xd1\x96\xcb\xe5\xd8\xbd\x7b\x37\x0d\x0d\
+\x0d\x78\xe7\xff\x7a\x6e\xef\xd6\xad\x5b\xb1\x6d\x9b\x9e\x9e\x1e\
+\x7f\x10\x8d\x37\x92\xe9\x88\xec\xdd\xe1\x7c\xc8\x3b\xab\x0f\xd0\
+\x96\x2c\x59\x62\x6d\xdd\xba\x95\x9d\x3b\x77\xd2\xd3\xd3\xc3\x96\
+\x2d\x5b\x58\xb1\x62\x05\x3f\xf8\xc1\x0f\xb8\xf0\xc2\x0b\xe9\xec\
+\xec\x24\x18\x0c\x32\x7f\xfe\x7c\x3a\x3b\x3b\x79\xf5\xd5\x57\xc9\
+\x66\xb3\x0c\x0f\x0f\x13\x8b\xc5\xfc\x72\x53\xef\x04\x01\x29\xa5\
+\xdf\x9f\x18\x8d\x46\xfd\x03\x51\x06\x07\x07\x13\xe5\x72\xf9\xe5\
+\x31\xbb\xb4\x67\x64\x64\xe4\x8b\x1c\x87\x75\xe2\x89\x27\x26\x6e\
+\xbc\xf1\xc6\xfa\x4b\x2f\xbd\x94\xcf\x7e\xf6\xb3\x0c\x0c\x0c\x50\
+\x2a\x95\xfc\x39\xed\x85\x42\x81\x29\x53\xa6\xf8\x07\x9c\x79\xe3\
+\x6f\x55\x55\x65\xe6\xcc\x99\x64\x32\x19\xff\xb4\x87\xb7\x73\x1e\
+\xde\x9a\xe6\xb5\x6d\x9b\x37\xdf\x7c\x53\x1c\x57\x09\x19\xa7\xc3\
+\x15\xcb\xb2\x78\xf8\xe1\x87\xb9\xec\xb2\xcb\x78\xf4\xd1\x47\x49\
+\x26\x93\xbc\xf0\xc2\x0b\x48\x29\x19\x1c\x1c\x64\xdf\xbe\x7d\x95\
+\xb3\xa5\xba\xbb\x27\x64\x10\xbd\xc1\x2f\xe9\x74\x9a\x60\x30\xe8\
+\x0f\x4f\x8e\x46\xa3\xbe\xd4\x18\x86\xc1\xec\xd9\xb3\xc9\x64\x32\
+\x28\x8a\xb2\x2b\x93\xc9\x5c\xc3\x71\x5e\xba\xae\xf3\xe4\x93\x4f\
+\xf2\xd4\x53\x4f\x91\xcf\xe7\x99\x3c\x79\x32\x9f\xfd\xec\x67\xf9\
+\xf4\xa7\x3f\xed\x0f\x4b\xf3\x46\x8d\xc7\xe3\x71\x9f\x36\xff\xfc\
+\xe7\x3f\xcf\x7d\xf7\xdd\xe7\x8f\x05\xf4\xc8\x4e\x4f\x9d\xd7\xd5\
+\xd5\x91\xcf\xe7\x49\xa5\x52\x34\x36\x36\x32\x3c\x3c\x8c\x65\x59\
+\x7d\x8a\xa2\xe4\xff\x2c\x2a\xcb\x5b\xa1\x50\x88\x7b\xee\xb9\x87\
+\xfb\xee\xbb\xcf\x8f\x13\x3c\x75\xd3\xdd\xdd\x8d\x10\xc2\x1f\x76\
+\xe6\xdd\x6c\x55\x55\x95\x4f\xc5\x7b\x27\x2d\x7b\xb6\xc6\x3b\xef\
+\xd0\x8b\x3f\xf6\xec\xd9\x73\x5c\xfb\x00\xdf\xba\x46\x47\x47\x5f\
+\x09\x87\xc3\xd5\x63\xf7\xb6\xf2\x1b\xdf\xf8\x46\xe4\xb5\xd7\x5e\
+\xf3\xef\xcd\xb3\x61\xe3\x8f\xde\x70\x5d\x97\x55\xab\x56\x31\x75\
+\xea\x54\x96\x2d\x5b\xc6\xd3\x4f\x3f\x4d\x75\x75\x35\x5b\xb6\x6c\
+\xa1\xb9\xb9\x99\xad\x5b\xb7\xb2\x72\xe5\x4a\x0a\x85\x02\xed\xed\
+\xed\x1c\x3c\x78\x90\x68\x34\x4a\x6f\x6f\xef\xe5\xdd\xdd\xdd\xdb\
+\x8f\xa4\x0b\xe0\x48\xad\xa5\x36\x73\xe6\xcc\x27\xa3\xd1\x68\x40\
+\xd7\xf5\x0b\x4f\x3c\xf1\x44\x42\xa1\x10\xaa\xaa\xb2\x6f\xdf\x3e\
+\xbf\x05\x39\x1c\x0e\xfb\xd3\x0d\x42\xa1\x90\x7f\x1c\x50\x26\x93\
+\x21\x97\xcb\x4d\xe0\xb9\x82\xc1\x20\x17\x5e\x78\x21\x2f\xbf\xfc\
+\x32\xde\xbc\x75\x21\x04\xed\xed\xed\xaf\x0f\x0c\x0c\x9c\x79\x3c\
+\xc1\x18\xb3\x47\xfe\xcf\x73\xe7\xce\xdd\x7b\xed\xb5\xd7\xce\xbb\
+\xf9\xe6\x9b\xb9\xfc\xf2\xcb\x59\xb6\x6c\x19\x2d\x2d\x2d\x3c\xf9\
+\xe4\x93\xbe\x6a\xfd\x87\x7f\xf8\x07\x1e\x79\xe4\x11\x0c\xc3\xe0\
+\x86\x1b\x6e\x60\xd3\xa6\x4d\x8c\x8e\x8e\xfa\xae\xb0\xd7\x93\xa2\
+\xeb\xba\x7f\x0c\x47\x30\x18\x44\xd7\x75\xba\xbb\xbb\x97\x1d\x3c\
+\x78\x70\xcb\x91\xdc\xe3\x91\xf6\x9f\xd9\x5d\x5d\x5d\x97\xb7\xb6\
+\xb6\x5e\x17\x0a\x85\x38\xf3\xcc\x33\xf9\xc2\x17\xbe\x40\x34\x1a\
+\xa5\xb9\xb9\x99\xa9\x53\xa7\x52\x55\x55\xc5\x8c\x19\x33\xa8\xa9\
+\xa9\xa1\xae\xae\x8e\x48\x24\x82\xeb\xba\x7e\xa0\xb5\x72\xe5\x4a\
+\x02\x81\x00\x0d\x0d\x0d\xc4\xe3\x71\x82\xc1\x20\xd1\x68\x94\xb1\
+\x81\xcd\x6f\x6e\xdf\xbe\xfd\x9f\xb6\x6f\xdf\xfe\x19\xe0\x2b\xc7\
+\x5b\x3a\xc6\x83\x31\x26\xa1\xca\x0b\x2f\xbc\xc0\x25\x97\x5c\x82\
+\x10\x82\x7b\xee\xb9\xc7\x3f\x9f\x70\xc3\x86\x0d\x18\x86\xc1\x15\
+\x57\x5c\x41\x22\x91\x40\xd7\x75\x7e\xf9\xcb\x5f\xd2\xdd\xdd\x4d\
+\xa1\x50\xa0\x58\x2c\x4e\x38\x39\xc7\x73\xed\x43\xa1\x90\xf4\xcb\
+\x91\x5c\xf7\x88\xdd\xc3\xa3\x3a\x2d\x5a\xd3\xb4\x80\x10\x82\x07\
+\x1f\x7c\x90\x87\x1e\x7a\xe8\x0f\xfe\xfd\xe0\xc1\x83\x7f\xd4\x39\
+\x78\xab\x1b\xeb\x38\x0e\xbf\xfd\xed\x6f\xbd\x49\x6f\xbb\x72\xb9\
+\xdc\x7f\x02\xef\x58\xb6\x7f\x3c\x56\x36\x9b\x95\x9e\x8a\x12\x42\
+\xf0\xfc\xf3\xcf\x73\xfa\xe9\xa7\xb3\x63\xc7\x0e\x36\x6c\xd8\x40\
+\x7d\x7d\x3d\x0f\x3e\xf8\x20\x0f\x3e\xf8\x20\x77\xdf\x7d\xb7\xef\
+\xba\x7b\x41\xaf\x77\xc2\x90\x97\xbe\x1e\x53\x6f\xa2\xad\xad\xed\
+\x5c\xc7\x71\xf6\xd4\xd5\xd5\x25\x8e\xf4\x9e\x8e\xca\xc1\x0f\x85\
+\x42\xb1\xba\xba\xba\xcf\x85\x42\x21\x17\xb8\x2a\x1c\x0e\x2f\x3e\
+\x1c\xbd\xef\x4d\x7a\xf0\xa6\x3c\x7b\x99\x36\xcf\xdf\x4f\xa7\xd3\
+\x6b\x7a\x7a\x7a\xde\xcf\x5f\x7e\x45\x16\x2f\x5e\x5c\xf0\xfa\x45\
+\x74\x5d\x67\xe9\xd2\xa5\xec\xdb\xb7\xcf\x77\xc9\x0f\xc7\x7d\xf5\
+\xf8\xb1\xed\xdb\xb7\xcf\x2d\x14\x0a\xed\x47\x73\x23\xc7\x3c\x38\
+\xaa\xb9\xb9\xf9\xe7\x4d\x4d\x4d\xd7\x1e\xce\x5c\x73\x0f\x14\x8f\
+\xce\xae\xa9\xa9\xa1\x50\x28\x14\x5b\x5b\x5b\xa3\xe3\xbe\x8f\xfe\
+\xfe\xfe\xbf\x34\x20\xc1\x96\x96\x96\x6d\xf1\x78\x5c\xe4\xf3\xf9\
+\x48\x63\x63\xe3\x09\x52\x4a\x0a\x85\xc2\x61\x8f\x90\x2d\x14\x0a\
+\x98\xa6\x79\x9f\xeb\xba\x56\xb9\x5c\xfe\x8f\xa1\xa1\xa1\xd1\xff\
+\x2b\x80\x00\x81\xb1\xef\x09\x86\x42\xa1\xa5\x87\x1b\xd7\x78\x51\
+\x7b\x38\x1c\x4e\x64\x32\x99\x5d\xfc\x3f\xb2\x82\xc1\x60\x6d\x38\
+\x1c\xfe\x47\xd7\x75\x9d\x23\x60\x08\x64\x20\x10\x48\x9e\x7c\xf2\
+\xc9\xff\xf3\xc2\x0b\x2f\x48\xde\x5d\xef\xae\x77\xd7\xbb\xeb\xdd\
+\xf5\xee\x7a\x77\xbd\xbb\xde\x5d\xff\x8f\xad\xff\x03\x21\xf6\x70\
+\xa0\xc1\x03\x97\x85\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x7e\xd7\
+\xff\
+\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x00\x00\x01\x00\
+\x01\x00\x00\xff\xdb\x00\x43\x00\x04\x02\x03\x03\x03\x02\x04\x03\
+\x03\x03\x04\x04\x04\x04\x05\x09\x06\x05\x05\x05\x05\x0b\x08\x08\
+\x06\x09\x0d\x0b\x0d\x0d\x0d\x0b\x0c\x0c\x0e\x10\x14\x11\x0e\x0f\
+\x13\x0f\x0c\x0c\x12\x18\x12\x13\x15\x16\x17\x17\x17\x0e\x11\x19\
+\x1b\x19\x16\x1a\x14\x16\x17\x16\xff\xdb\x00\x43\x01\x04\x04\x04\
+\x05\x05\x05\x0a\x06\x06\x0a\x16\x0f\x0c\x0f\x16\x16\x16\x16\x16\
+\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\
+\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\
+\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\xff\xfe\x00\
+\x10\x54\x69\x6d\x65\x20\x66\x6f\x72\x20\x4c\x75\x6e\x63\x68\xff\
+\xc0\x00\x11\x08\x02\x00\x02\x00\x03\x01\x22\x00\x02\x11\x01\x03\
+\x11\x01\xff\xc4\x00\x1b\x00\x00\x02\x03\x01\x01\x01\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x02\x03\x01\x04\x05\x00\x06\x08\xff\
+\xc4\x00\x44\x10\x00\x02\x01\x02\x04\x04\x04\x03\x07\x02\x04\x05\
+\x04\x01\x05\x01\x01\x02\x03\x00\x11\x04\x12\x21\x31\x05\x41\x51\
+\x61\x13\x22\x32\x71\x42\x81\x91\x14\x23\x52\xa1\xb1\xc1\xd1\x62\
+\xe1\x06\x33\x72\xf0\x24\x43\x82\x92\xf1\x15\x53\x73\xa2\x25\x34\
+\x35\x54\x63\x93\xa3\xff\xc4\x00\x19\x01\x01\x01\x01\x01\x01\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\
+\xff\xc4\x00\x21\x11\x01\x01\x01\x00\x03\x01\x01\x01\x00\x03\x01\
+\x01\x00\x00\x00\x00\x00\x01\x11\x02\x21\x31\x41\x12\x51\x22\x32\
+\x61\x71\x42\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00\x3f\
+\x00\xfa\x73\xfc\x3c\xe0\xa6\x23\x07\x32\x67\x92\x16\xcc\xb9\xc5\
+\xcd\xbf\x5a\xb1\x32\xca\xaa\x5e\x17\xce\xa0\x7a\x1f\x5b\x0e\xd5\
+\x9f\x23\xb2\xc9\xf6\x98\x6e\x1c\xa8\x0c\x47\x50\x74\x3f\x3a\xbd\
+\x82\xc5\x26\x29\x43\x0b\x09\x47\xa9\x3a\xfb\x57\xca\x97\xe3\xd5\
+\x7f\xae\x86\x48\xa6\x8b\x35\x95\x18\x1b\x10\x4f\xe9\x44\x6e\x0d\
+\x8d\xfe\xa6\xaa\x4e\xf2\x61\x84\xb0\xe5\xf2\x48\x6e\x1a\x9b\x83\
+\x90\xcb\x85\xbb\x6a\x50\xe5\xbf\x5a\x74\x58\x6f\x97\xa0\xa9\x0a\
+\x0d\xb5\x00\x93\x61\xae\xe6\x80\x9a\xe6\xf3\x44\xc8\x5b\x2d\xfd\
+\x27\xa1\xa8\x0d\x49\xd8\xb1\xa6\x21\x1c\xd4\x30\x3b\x83\xad\xe9\
+\x7e\x73\x1a\x99\x4a\x99\x2d\xe6\x20\xef\xd0\xd0\x7d\xe6\x6b\xf4\
+\xfa\x54\x8d\xc3\x48\x22\x95\xf0\xb9\xf2\xe5\x6f\x21\xd8\x51\xba\
+\x46\xc7\xcf\x18\xbe\xf7\x53\x63\x59\xf8\xec\xdf\x6b\x7c\xdb\x93\
+\x7a\xbb\x87\xb8\xc2\x47\x98\xdc\x90\x48\x3d\xa9\x94\x9f\x11\x44\
+\x16\x8d\x42\xdf\x73\xcc\xfc\xe8\x89\x04\x52\x41\xa9\x56\x07\x4b\
+\xfb\x53\xa0\xdc\xce\x08\x2a\xda\x8a\xcb\xe2\x03\xc3\xc7\x4a\x8a\
+\x6c\x03\x6d\xbd\x68\xc6\x0b\x38\x51\xcc\xda\xb2\xb8\x8c\x82\x4c\
+\x7c\xae\xb7\xb1\x6e\x74\x72\xf0\xc0\xec\x6f\x7b\x93\xce\x8b\x0d\
+\x27\x85\x88\x49\x00\x00\xab\x5e\xf6\xab\x58\x3c\x22\x18\x95\xe6\
+\x04\x97\xf4\xa8\x36\xb0\xea\x6a\x31\x78\x03\x94\xbe\x1d\xf3\x00\
+\x2e\x55\xb7\x1f\xcd\x67\x29\xd6\x93\x32\xba\x87\x8d\xae\x8d\xa8\
+\xa5\x3b\x00\x7a\x9e\x95\x9d\xc3\x71\xde\x00\xf0\xa6\x1f\x76\x5a\
+\xc4\x73\x53\xd6\xb4\xbd\x3a\x83\x70\xda\x86\x1c\xeb\x72\xeb\x38\
+\x15\xb0\xf4\xef\x52\xa1\x6c\x43\x2a\xb0\x3b\xdc\x57\x7c\xbe\x94\
+\x24\xf7\x1f\x5a\x90\xd4\x42\xa3\xcb\x12\x0f\x6b\xff\x00\x35\x24\
+\xa9\x50\xa0\x00\x06\xc0\x0d\xa9\x57\x27\x9d\xba\x69\x44\xa4\xfc\
+\xc5\x5a\x85\x1a\x90\xf7\x36\xb5\x54\xe3\x99\x1b\x18\x3c\x48\xd1\
+\xfe\xed\x75\x61\xda\xae\x29\xaa\x1c\x70\xff\x00\xc6\x8f\xfe\x35\
+\xfd\x2a\xe5\xe1\x9e\xab\xc6\x17\x35\x91\x42\x03\xba\x8d\x98\x7e\
+\xc6\xb5\x78\xba\x80\xd1\x95\xd8\x2e\x5b\xf5\xaa\xbc\x12\x11\x28\
+\x92\x47\x51\xa7\x95\x75\xd2\xe6\xac\xe3\xbe\xf3\x02\x8e\x3e\x12\
+\x2e\x2f\xce\xd6\xfd\xa8\x93\xa5\x7d\x54\xb8\x03\x7a\xec\xca\x7e\
+\x21\x4b\xf8\x87\x6a\x25\xbd\x0b\x13\xb9\x04\xec\x3b\x6e\x6b\x9a\
+\x8a\xd4\x2c\x39\xd4\x80\x47\x31\xbd\x06\x30\xe6\xc0\xca\xed\x9b\
+\x3a\x5b\xce\xbb\x81\xad\xff\x00\x6a\x61\xa8\x55\x0c\x59\x1a\xd9\
+\x64\x52\xa6\xf5\x12\x7f\xc3\xae\x35\x8d\xe4\x42\xc6\x45\x60\xca\
+\x2d\x98\x58\xef\xde\xb4\x25\x5b\x12\x1b\x4d\x6d\x58\x5c\x2d\x12\
+\x3e\x26\x60\x9d\x6d\x73\x6c\xc7\x4d\x79\x56\xfc\x8b\x93\x10\x63\
+\x72\x58\x91\x74\x66\xdc\xf6\xa3\x87\x70\x5f\x55\x9f\x43\x61\xa9\
+\xed\x43\x6b\x6f\xb9\xab\x24\x03\x4b\x75\xa5\x69\x40\x51\x90\x0a\
+\x65\x62\x74\x37\x52\x37\x53\xd4\x57\x05\xae\x22\xf5\x2d\x49\xb6\
+\xed\x6b\x7e\x35\x1f\xa8\xe5\x43\xe2\xc4\x08\x50\xfe\x23\x1d\x95\
+\x2b\x85\xd4\xdc\x13\x7a\x25\x20\x12\x42\x28\x62\x2c\x58\x0d\x6a\
+\x43\x65\x2f\x13\xa8\x8a\x40\x59\x2d\xc8\xfe\x95\x9a\x3c\xad\x60\
+\xac\xec\x3e\x1c\xa4\x0f\x99\x35\x78\x12\x0d\xc6\xe2\xaa\x71\x04\
+\x64\x93\x30\x27\xc3\x7d\x46\xba\x03\x45\x51\xc1\xb7\xbb\x06\x62\
+\x2c\x48\x16\x00\x74\x02\xac\xf0\xd9\x15\x49\x85\x8e\x8e\x7c\xbd\
+\x8d\x67\x83\x46\xad\x6a\x25\x6a\xc6\xb9\x1a\xd7\x0b\x83\x71\xca\
+\xab\xe1\xb1\x4b\x22\x65\x93\xd6\x07\xab\xf1\x7f\x7a\x31\x20\x2c\
+\x43\xe9\x6d\x81\xad\xeb\x18\xa1\xc7\x11\x17\x1c\x4c\x7a\x19\x14\
+\x35\xba\x13\x56\x38\x2c\xb7\x8d\xb0\xa7\x65\x05\x90\xfe\xb4\x9e\
+\x3f\x28\x6c\x4c\x68\x2d\x71\x18\xd7\x99\xbd\x17\x04\x04\x45\x34\
+\xa7\x73\x65\x1d\x7a\xd6\x3f\xfa\x6b\xe2\xe3\x9a\x84\x01\x89\x42\
+\x4d\x9f\x43\x42\x58\x5e\xd7\xd7\xa5\x09\x6e\x95\xa6\x41\x26\x26\
+\x31\x03\x86\x3f\x7c\x01\x51\xa6\xe7\xad\x23\x86\xe1\x8c\x83\xc6\
+\x95\x88\x04\xd8\x2d\xae\x5a\x83\x8a\xa9\x13\x78\xc0\x8b\x4a\x6f\
+\x6e\x95\x67\x0f\x2f\x8d\x1a\xac\x4a\xd0\xaa\x8b\x33\xff\x00\x15\
+\x9f\x6f\x6d\x7c\x5c\x67\x55\xd6\x42\x16\xda\x05\x1a\x9f\xa5\x04\
+\x99\xe7\x50\xa6\xf1\x45\xbe\xbb\xb5\x02\x14\x8c\x5a\x21\x6e\xad\
+\xf1\x1f\x9d\x71\x90\x03\xa9\x37\xf6\xad\xeb\x23\x48\x9a\x31\xf7\
+\x13\x1e\xeb\x20\xd0\xd1\x78\xae\x83\xfe\x22\x2c\xa3\xf1\xa6\xd4\
+\xb5\x95\x76\xd4\x7b\x8a\x62\xb8\xea\xba\xf2\x3c\xea\x46\x73\xd0\
+\xdc\x1d\x88\xe7\x52\x80\xad\xd0\x00\x5c\x1b\x12\x76\x5f\x7f\xe2\
+\x94\x09\x51\x68\xe6\x55\x5e\x4b\x6b\x95\xf6\x34\x48\x6c\x81\x40\
+\xb2\x8b\x9b\x53\xa8\xdb\xc9\xcb\x10\x49\xfc\x2c\xa3\x2d\x03\x62\
+\x10\x3e\x49\x94\xc4\xdd\xb5\x53\x42\x5a\xba\x40\x25\x89\xa3\x6d\
+\xac\x48\x3d\x2d\x56\xa3\x1a\x45\x44\x32\x31\xba\x81\x7d\x39\xd5\
+\x19\xe6\x97\x13\x32\x85\x51\xd1\x54\x1d\xaa\xd4\x66\xd8\x78\xd4\
+\x8f\xf9\x60\x10\x45\x70\xc8\xa6\xe9\x1a\x21\x3a\x5c\x51\x50\x62\
+\xc3\x28\x60\x1d\xf3\xb3\x68\x75\xda\xf5\x54\x48\xfe\x3e\x43\x2b\
+\x65\x24\xa9\x3f\x95\x5d\x8c\xfd\xea\xfb\x8a\xcc\x9c\xda\x57\xff\
+\x00\x51\xa2\xd3\x1d\xc3\x6d\xf6\x93\x98\x5c\x05\x3a\x75\xa5\x63\
+\x70\x46\x3b\xe2\x30\xac\x4a\x83\x7c\xbc\xd6\xbb\x86\xb9\x18\xc5\
+\x5f\xc4\x32\x9f\xa5\x5e\x85\xf2\xbd\xef\xd4\x1a\xcc\xee\x35\x55\
+\xa1\xe2\x90\xa2\x78\x38\xe9\x14\xc8\x79\xef\xcb\xe2\xa7\x60\xd3\
+\x26\x0e\xf9\x95\x83\xbd\xee\xa7\x41\x61\xfd\xeb\x17\xfc\x49\xc3\
+\x8c\x0e\x31\x50\xa9\x31\xc9\x7c\xd6\x37\xb1\xae\xe0\xd8\x99\xe1\
+\xe1\xb6\x8a\x42\xa1\x24\xb6\x52\x34\x37\xd7\x5a\xcc\xe5\x65\xca\
+\xb3\xae\x9b\x6e\xf6\xd1\x6c\x68\x4e\x6b\xf9\xaf\x7a\xa0\x9c\x4b\
+\x12\x18\x1f\x0e\x0f\xfb\x05\x13\x71\x4c\x4b\x10\x7c\x38\x7f\xec\
+\x15\xaf\xd4\x18\xd3\x43\x70\x0f\x5a\x2b\x58\xd5\x7c\x06\x26\x3c\
+\x62\x15\x0b\xe1\xc8\x2e\x72\x03\x70\x45\x34\xe7\xb5\x81\xd2\xb4\
+\x30\x73\x42\x93\x15\x2e\x4a\x95\xd2\xe0\x6e\x28\xa2\x8d\xa2\x4c\
+\xb1\x48\x1d\x7f\x03\x8b\x7d\x0d\x04\x57\x53\xae\xa0\xfe\x54\x38\
+\xfc\x60\xc3\x1f\x0e\x34\x57\x92\xda\x96\xd4\x2f\x6a\x91\xe4\x82\
+\xac\x40\x2a\x40\xf3\x29\xdc\x7f\x6a\x35\x46\x71\x70\x85\x87\x61\
+\x58\xd2\x71\x0c\x49\x95\x9f\xc4\xc8\xea\x97\x19\x74\x02\xda\xdb\
+\xfd\xf5\xa3\xc5\x62\x67\x32\x12\xd3\x39\xb0\x07\xd5\xf3\xab\xf5\
+\x17\xe6\xb4\x71\xb8\x85\xc1\xc4\x4b\x79\xe4\x20\x80\xb7\xf4\xf2\
+\xd6\xb2\xf8\x72\x3e\x27\x14\x91\x90\x3c\xcd\xa9\xb5\x01\xbb\xef\
+\x7d\x79\x5f\x53\x5a\x9c\x1f\x0c\x70\xf0\x99\x9a\xf9\xdc\x59\x54\
+\xe9\x61\xd6\x8f\xf6\xa7\xc8\xb6\xe5\x73\x1c\xa2\xc3\x61\xed\x50\
+\x09\x0d\x70\x6c\x6a\x06\xdb\x1f\xa5\x4d\xbb\x37\xd2\xb6\xca\x8f\
+\x19\xc3\x02\x46\x2a\x35\x16\xd9\xc0\x1e\x93\xd6\x83\x84\xe3\x15\
+\x41\x86\x66\x61\x1b\x7a\x58\x8d\x14\xd6\x88\x3b\x82\x0d\x98\x59\
+\xae\x39\x56\x46\x3b\x0c\xd8\x69\xb2\xda\xe8\x7d\x27\xa8\xac\xde\
+\xae\xc6\xa7\x7d\x35\x9d\x48\xb0\xb8\x20\xf3\x06\xe0\x8a\xeb\x5a\
+\xb1\xf0\x38\xa9\xb0\xc0\x04\x71\x6e\x68\xfb\x1a\xbb\x17\x16\xc3\
+\xb8\x1e\x2c\x45\x49\x3a\xe5\x3b\x55\x39\x41\x8b\x55\x23\x71\xdb\
+\x5f\xf7\xfe\xf9\x50\xc5\x2e\x1e\x60\x0c\x53\x29\xec\x74\x34\x44\
+\x32\xee\x08\x27\x5a\xd0\x48\x36\xac\xfe\x38\x6f\x8d\x5f\xfe\x35\
+\xfd\x2a\xfa\x02\xcc\x00\xdc\x9a\xcd\xe2\xb2\x2c\xb8\xd3\x93\x50\
+\xa0\x28\x3d\x6d\x47\x2f\x0c\xf5\x7f\x84\xa8\x5e\x1c\x08\xbd\xdd\
+\xc9\x3f\x2f\xfc\xd3\xb1\x0b\x9e\x1c\x42\x87\xf4\xb6\x6b\x5b\x9f\
+\x4a\x5f\x0e\x42\x9c\x3e\x3c\xc4\xf9\xae\xc0\x76\xd3\xf8\xa6\xb2\
+\x33\x33\x34\x4c\x15\xdd\x6c\x41\xd8\xd6\xa7\x81\x9a\xa0\x58\x7b\
+\x5e\x8d\x45\x71\x8d\x94\x90\x45\x99\x7c\xae\xbc\xd4\xd4\x81\x58\
+\x29\x14\x2d\x72\x3c\xba\x5f\x99\xa2\x61\xa8\x53\xcf\x5a\x83\x50\
+\x2d\x87\xbf\xd6\x81\xb5\xdf\x5e\xc6\x98\xfb\xd4\x11\x65\x66\xcb\
+\x98\xa8\xbe\x51\xce\xa3\x15\x78\xa6\x1c\xe2\x62\x13\x46\x01\x96\
+\x31\x66\x00\xea\xc3\x91\xab\x03\x12\x24\x68\x0b\xb1\x19\x72\x80\
+\xe0\xe9\xca\xd7\xe9\xd2\x83\x0d\x24\xf2\x44\x25\xcf\x0c\x77\x24\
+\x0f\xbb\xd6\xba\x7c\x1e\x21\xf0\x4c\xf0\xe4\x66\x6b\xa9\xfa\xdf\
+\x4a\x3f\xec\x2d\x19\x90\xac\x84\x11\x6e\x63\xda\x82\xb3\xb8\x57\
+\x11\x95\x30\x82\x2c\x4a\x67\x11\xbe\x43\x7d\xc0\xde\xb4\xe3\xc9\
+\x2c\x62\x48\x5b\x3a\x1f\x91\x1e\xf4\xcb\xbe\x0b\x30\x04\x0a\x16\
+\x02\xd4\xc6\x68\xc7\xc4\x5b\xba\xad\xc7\xd6\xa0\xa8\xb0\x20\x82\
+\x0e\xc7\xad\x40\xa2\x05\x08\xb5\x31\x96\x84\x8b\x54\x90\x68\x5d\
+\x16\x58\x8c\x6c\x6d\xcc\x1e\x95\xcd\xa6\xa6\x87\x29\x27\x36\xa0\
+\xde\xf5\x15\x29\x50\xc7\x21\x46\xdd\x4d\xa8\x41\xe9\x57\xb1\x11\
+\x89\xd4\x5c\x59\xc6\xc7\xaf\x6a\xa2\xc0\xab\x15\x61\x62\x37\xac\
+\x59\x8d\x4a\x90\x4d\x3e\x2c\x49\xf4\xcb\xa8\xda\xe3\x71\x55\x6f\
+\x5d\x7a\x34\xa7\x8f\xc8\x3e\xd0\xb6\xd4\x78\x6a\x01\x1b\x5e\xd5\
+\x73\x87\x00\x38\x54\x40\xf3\x66\xfd\xab\x33\x8a\xbb\xae\x1e\x2c\
+\x4a\x00\x42\xf9\x25\x16\xf5\x74\xbd\x68\xf0\xf9\x23\x6e\x15\x1f\
+\x86\x49\x0a\xc7\x97\x5a\x65\xff\x00\x2a\x3e\x1a\xd6\xe5\xa1\xa8\
+\x0e\x08\x25\xae\x00\xde\x96\xcf\x6e\xbf\x4a\x28\x88\xf2\x86\x1a\
+\xb4\x83\xf2\xb9\xfd\x85\x68\x25\xd5\x64\x70\xf3\x29\x27\xe1\x4b\
+\xe8\xa3\xa5\x10\x60\x14\x28\x00\x01\xb0\x14\xbb\xeb\x5d\x7a\xba\
+\x43\x2c\x6d\xa5\x72\x30\xca\x29\x6c\x6d\xef\xca\xb8\x69\xa5\x5a\
+\x8e\x06\x89\x5a\x92\x0d\x12\xb5\x29\x65\x5a\x8c\x30\x35\x5d\x4d\
+\x12\x35\x4c\x9f\x5c\x40\x24\xa6\xe0\x7a\xf5\xff\x00\xeb\xfc\xd0\
+\x17\x2a\x42\x8b\x67\x6f\x48\x3c\xbb\xd4\x82\x15\x02\x8f\x48\xff\
+\x00\x77\xa9\x08\x9b\x9b\xd4\x11\xde\x84\x3d\xf6\xd6\xa0\xbd\xb7\
+\x23\xeb\x52\x31\x48\x5b\xb1\x36\x0a\x09\x27\xa5\x63\x3b\x8b\xeb\
+\x7b\x9e\xd5\x7f\x1d\x2e\x5c\x26\x50\x48\x69\x3f\x21\x59\x6e\xc1\
+\x98\xef\xd0\x56\x79\x56\xb8\xc1\xe0\x64\xf0\xf1\x68\xcc\x35\x0c\
+\x34\xeb\x5a\x39\x7c\xe5\x17\x5d\x6d\x59\x4e\x03\x32\xdb\x42\x35\
+\xbd\x6a\xc2\x56\x58\xf3\xa9\xf5\x8b\x36\xba\x8e\xbf\x90\xfc\xea\
+\xe2\x68\x64\x4f\x1a\x42\xc5\xc0\x86\xd9\x00\x23\xd6\x3a\x8a\xa7\
+\x2f\x0c\xf0\x30\xe5\x70\x65\xa5\x42\xd9\x9a\xfe\xa1\xa7\x4a\xba\
+\xc7\x31\xe9\xd2\xdc\xaa\x23\x2c\xb2\x7a\x8f\x63\x4d\x92\x86\x3b\
+\xa3\xa7\xad\x19\x7d\xc5\xa8\x49\xb0\xbd\x6f\x78\xae\x48\x56\x39\
+\xb9\xf9\x85\xff\x00\x5a\x5c\x98\x4c\x14\xda\x98\x8c\x6d\xf8\x90\
+\xfe\x76\xac\xfe\x3f\x87\x59\x38\x49\x64\xc3\xe2\x04\xcb\xb8\x37\
+\xb5\x6c\x61\xf1\x98\x4c\x42\x66\x0f\xe0\xb7\x30\xfb\x7c\x8d\x52\
+\x9f\x86\x4c\x83\x3c\x4c\x26\x5e\x76\xdc\x7c\xaa\xab\x2b\x29\x21\
+\x94\xa9\xee\x2d\x54\xde\x2b\x25\x6c\x4b\x8c\x82\x05\xbc\x72\x2c\
+\xb2\x7c\x39\x76\x15\x9a\x03\x4b\x29\x21\x49\x66\xd7\x4d\xeb\xb0\
+\x78\x69\xb1\x0f\x68\xd0\x91\xcc\xf2\x15\xb1\x82\x85\x30\x89\x64\
+\x21\xa4\x3e\xa7\xfe\x29\x9b\xc8\x75\x08\x83\x85\x46\xb1\xb0\x9d\
+\xdb\x33\xa9\xba\x0f\xad\x89\xf9\x55\xb6\x83\x0c\x14\x2f\xd9\xe3\
+\x6f\x28\xd5\xb5\x3b\x51\x2f\x99\x48\xe6\xde\x50\x7d\xcd\xbf\x9a\
+\x97\x20\xb9\x23\x6a\xdc\x92\x33\xb4\x2a\xb0\x2b\x02\x30\xd1\x29\
+\x1b\x10\x2f\x4d\xb9\x66\x24\x9b\x93\x4b\x8f\xcc\xc4\x8e\x5b\x53\
+\x29\x89\x1a\xe5\xa9\xb1\xae\x16\xe6\x6b\x98\xd9\x49\xed\xa5\x29\
+\xd6\xa8\x3a\xae\x56\x50\xc3\x7b\x11\x7a\x9b\x2d\xb6\xbf\x73\x5c\
+\xbb\x91\xc8\x54\x83\x68\xb6\xf0\x22\x3f\xf4\xd4\x18\xb0\xcc\x7c\
+\xf8\x48\x4f\xfd\x34\xc0\xb6\xa8\x22\xf5\x62\x55\x93\x87\xe1\x1e\
+\x5f\xba\xcd\x13\x5b\xad\xc7\xf6\xa0\x64\xe2\x38\x4d\x98\xbc\x63\
+\x6f\x89\x4d\x5a\x37\x0d\x99\x45\x3a\x37\x36\x0c\xa4\x8b\xd1\x91\
+\x6b\x2a\x4c\x76\x25\x90\xa5\xd5\x2f\xbe\x55\xb1\xaa\xca\x09\x6b\
+\x0d\x49\x35\xb9\x2c\x30\x4b\xfe\x64\x22\xfd\x57\x43\x41\x87\xc2\
+\x61\xe1\x93\xc4\x5c\xce\xc3\x60\xc0\x58\x51\xf9\xa7\x4e\x2a\x11\
+\x55\x00\xb0\x55\x02\xdd\x2b\x80\xa9\x00\x93\x73\xb9\xa3\x51\x6a\
+\xd8\x0c\xd8\x78\xe7\x00\xb1\x2b\x22\x8b\x07\x53\x62\x7b\x1a\xa2\
+\xd1\x49\x1b\xb2\x4c\xcc\x59\x45\xc3\x6d\x98\x75\xf7\xad\x20\x34\
+\xa9\x75\x57\xc8\x19\x43\x00\xd6\xb1\xe8\x7f\xf1\x55\xe3\xa2\x56\
+\x4b\x58\x68\x05\xaa\x37\x15\xa3\x26\x16\x17\x37\x19\x93\xdb\x51\
+\x48\x93\x04\xc3\xd0\xe8\x7d\xf4\xb5\x66\xf1\xa7\x54\x9c\x54\x29\
+\x20\xdc\x55\x87\xc2\xce\x2f\x78\xc9\x03\x98\xda\x97\xe1\x3d\xfd\
+\x24\x77\x22\xb3\x94\xe9\x4e\xa1\x73\x46\xa2\xc0\x79\xd7\x4e\x47\
+\x7f\xce\xad\xe0\x98\xae\x0d\x2c\x6d\xe6\x6f\xda\xab\x61\xe1\x97\
+\x13\x8a\x92\x65\x5b\x46\xab\x91\x6f\xa0\x35\x71\x63\x11\xc2\xb1\
+\x83\x7b\x5e\xe7\xbd\x31\x52\x78\x86\x14\x62\x90\x98\xc0\x59\x46\
+\xb6\x03\x47\xfe\xf5\x9d\x83\x90\xc3\x8b\x11\x9f\xf2\xd4\x5e\x71\
+\xd7\xb5\x6c\x00\xf9\x08\x8d\x82\xbf\x22\x6b\x27\x1b\x1f\x87\x2b\
+\x8c\x99\x4b\xbe\x63\xf4\x1f\xbd\xe8\xe5\xfd\x53\xf8\xd7\x39\xd5\
+\x82\xa3\x10\xb6\xf2\xdb\x41\x6a\x5a\x15\x71\x29\x4b\x65\x12\x79\
+\x6c\x3a\xd2\x70\x38\x94\x7c\x11\x85\x9b\x2c\x80\x64\x43\xd6\xfc\
+\xbf\x5a\xbb\xe1\xd9\x02\x46\xb9\x94\x6d\x93\x51\x7a\xd4\xec\x2a\
+\xc8\x72\xe9\x6b\x93\xb5\x09\x4e\xac\x6a\xc1\x85\xef\x72\x8d\x7e\
+\xca\x68\x1d\x0a\x9b\x10\x47\xb8\xa3\x11\x05\x05\xef\xb9\xee\x76\
+\xa8\x2b\x4d\x22\x81\x8e\xb4\x22\x8a\xd2\xe7\x84\x4c\x08\x26\xce\
+\x3d\x2d\xd7\xb5\x3c\xda\xd7\xa0\x61\xa5\xf9\xd4\x65\x66\x3a\xb2\
+\x39\x56\xb8\x23\x7b\xd0\x93\x57\x38\xa2\x66\x8c\x4c\x37\x1e\x56\
+\xfd\xaa\x8b\x1b\x0a\xe7\x7a\x6e\x09\x54\x4b\x14\xb0\x1d\x9d\x0f\
+\xc8\x8d\x69\x5f\xe1\x59\xbe\xe9\xa1\x61\xe5\x67\xca\x3b\x5c\x51\
+\xc6\xc1\x23\x9a\x46\xf4\xa4\x64\x9e\xf5\x47\x81\xb6\x48\xd5\x94\
+\xf9\xbc\x71\x6a\xcf\x96\x26\xe3\x1b\x1a\x82\xcc\x27\xc3\x00\x37\
+\x72\x68\xa6\x53\xe3\xb2\x81\xf1\x1a\x01\x63\x2f\x8a\x0f\x96\x21\
+\x95\x3b\x9e\x66\xba\x32\x33\xbf\x5a\x82\x75\xb0\xff\x00\xc5\x0d\
+\xeb\x97\x46\x6d\x77\xa9\x27\xda\xbb\x9d\x75\x70\xde\xa4\x2a\x90\
+\x6a\x39\x54\xd3\x10\xd0\xd3\x03\x64\x42\xf6\xb9\x1a\x28\xea\x4e\
+\xd4\x90\x69\x80\xda\x4d\xae\x22\xd0\x77\x63\xfc\x0a\x52\x63\xfb\
+\xbb\x82\x09\x63\xbb\x6e\x4d\x48\x24\xea\x7e\x40\xd0\x83\x7a\x9a\
+\x90\x89\x07\x71\x52\x2c\x06\x77\xb2\xa8\xde\x84\x15\x55\x2e\xe6\
+\xca\x39\xd5\x3c\x5e\x20\xcc\xd6\x02\xc8\x36\x14\x5b\x83\x03\x89\
+\x93\xc6\x94\xb9\x03\xa0\x1d\x05\x21\x92\xcd\x75\x36\xa3\x35\x04\
+\x8a\xc3\x65\x5f\xcc\xb5\x67\x0d\x2b\xc3\x2c\x65\x6d\xac\x4e\x4d\
+\xc6\xf5\x5d\x56\xee\x14\x6a\x49\xb7\xbd\x4c\x72\x07\xc4\x62\x82\
+\x6a\x11\x15\x45\xba\x03\x44\xa9\x7e\x3c\x5c\x0f\xeb\x56\x43\xdb\
+\x51\x4f\x50\x1c\x5e\x36\x57\x1d\x8d\x64\x0a\x62\x31\x06\xe0\xdb\
+\xda\xb5\x39\x0c\x69\x6c\xda\xe9\x71\x61\x44\x06\x97\xa4\x61\xf1\
+\x80\x8c\xb3\xeb\xfd\x7c\xfe\x75\x64\xa8\xdc\x5a\xc4\x68\x46\x97\
+\xad\xb3\x5c\xb7\x07\x43\x63\x4d\x12\x39\xd4\xe5\x3d\xca\x82\x69\
+\x2c\x72\xdb\x98\xa9\x57\x61\xa9\x1e\x53\x50\xc3\x73\xb1\x16\x26\
+\xc3\xa0\x16\x15\x22\x81\x5b\x37\xa4\x7c\xcd\x18\xbf\x36\x3f\x41\
+\x4a\x74\x8f\x92\x48\x17\xf1\x3d\xea\x09\x62\xd6\x1a\x8e\x75\x2c\
+\xa0\xcb\x19\x37\x25\x41\x35\x23\x7a\x90\xb3\x05\xd0\x2d\x16\xb7\
+\xd5\x8f\xca\x84\x6d\x5c\x09\x02\xd7\x07\xde\x94\xe2\xa4\x9b\x96\
+\xa8\x28\xdb\x02\x2a\x6f\xad\x10\xd4\x8d\x0d\xc9\xe9\x52\x72\xa8\
+\x55\xb5\x16\x8a\x73\x3b\x2a\x29\x1b\xb1\xb5\x04\xf8\xa8\x20\x66\
+\x4d\x65\x91\x77\x51\xa0\x53\xd0\x9f\xda\xb3\xb1\x12\xc9\x34\x85\
+\xdd\xd2\xe7\x90\x52\x40\xf9\xdc\x55\x6e\x26\xce\x42\x40\x2b\x66\
+\x07\x62\xa6\xf4\x8c\x77\x88\x90\x06\x8c\xb2\xea\x73\x5a\x83\x84\
+\x43\x7c\x33\xb3\xb4\x85\x58\xf9\x47\xa7\xf4\xa7\xcb\x87\x71\x1b\
+\x08\xe5\xf2\x91\xaa\xb6\xa4\x53\xec\x4a\x8b\x8e\x21\x72\xcb\x15\
+\xcd\xbd\x6b\xa7\xe5\x56\x70\xe7\x34\x21\x85\xf2\x9d\x45\x72\x44\
+\x90\xc2\x2d\xe6\x2c\x75\xa6\x40\xb9\x70\xca\xa3\x93\x35\xbd\xaf\
+\x54\xd4\xe1\x44\x05\xeb\x82\xd1\x28\x26\xf6\xd0\x6d\x7a\xd2\x48\
+\x5b\x0b\xd4\x8e\xc0\x9e\xfb\x57\x05\x51\xc8\x5f\xa9\xd4\xd4\xee\
+\x69\x65\xda\xfe\x1f\xfe\xd5\xd7\xfb\xc4\x5d\x8e\x62\x6c\x7b\x0f\
+\xef\x47\x6b\x0d\x28\x5e\xe6\x64\x51\xba\xdc\xb5\xb9\x02\x2a\x48\
+\xa8\x22\x8f\x27\xf5\x1f\xca\xa0\xa1\xe4\x7e\xa2\xa4\x00\x0d\xe9\
+\x38\xec\x49\x45\x31\x2b\x12\xe7\x43\xae\xd5\x65\x6e\x1b\x6d\x7d\
+\xeb\x39\x22\x95\x66\x0e\xf0\x3b\x00\x6e\x47\x5a\xcd\xff\x00\x86\
+\x1f\x02\xb2\xe1\x54\x35\xee\x4d\xcd\xeb\x88\xa3\x12\xac\xad\x65\
+\xb8\x6e\x61\x86\xd5\x05\x3a\xde\xa2\x56\xec\x40\xb0\xb6\xe6\x93\
+\x89\xc2\xfd\xa4\x12\x08\xf1\x53\x4d\x46\x8e\x3a\x1a\xb4\x16\xc2\
+\xc0\x0a\x12\x32\xb6\x61\x7d\x4e\xb4\x62\x62\x48\x0a\xb5\x8d\xee\
+\xa7\x40\x16\xc0\x1b\x5a\xfd\x4d\x44\x5e\x3d\xad\x11\x7d\x39\x29\
+\x35\xbe\x58\x93\x72\x17\xe6\xa2\xa4\x3b\x0f\x4d\x97\xb8\x00\x7e\
+\x95\x9f\xc1\xd6\x03\x3c\xe0\x0c\xcf\x28\xbf\x22\x48\xa6\x61\xf1\
+\xf3\xc5\xe5\x73\xe2\x25\xad\x95\x8d\x6b\xc8\x24\x2d\x7b\x86\x1d\
+\x1e\xc6\xdf\x5a\xcc\xe2\xf0\x2a\x05\x96\x34\x20\x31\xb3\x0e\x86\
+\xb3\x65\x9d\xc3\x2e\xae\x12\xaf\x1a\xc8\x9e\x97\x17\x1d\xbb\x50\
+\x30\xa4\xf0\x96\x27\x0d\x24\x7f\x81\x81\x1e\xd4\xf7\x36\x17\xa7\
+\xde\xd9\xa4\xbe\x8e\xbf\x33\x42\xe6\xf4\xc6\x16\xd4\xee\x69\x46\
+\xa3\x09\xc7\xe9\x82\x3d\xd8\x56\x73\x5c\xe8\x35\x26\xae\x71\x77\
+\xb1\x48\x47\xc2\x2e\xde\xe6\xa9\x62\xa7\x4c\x14\x1e\x2b\x1b\xca\
+\xeb\xf7\x4b\x6d\xbb\xd7\x3e\x57\xb6\xa2\xaf\x1d\x9b\xc2\x85\x70\
+\x68\xd7\x6b\xde\x50\x0e\xe7\x90\xa3\xc3\x44\x62\x96\x08\x94\x5d\
+\xa3\x21\x9d\xbb\x92\x0d\x67\x60\x95\xe7\xc6\x78\xb2\x02\xe1\x4e\
+\x76\xef\x5b\x5c\x31\x95\xf1\xf9\xdf\x51\x18\x2d\x6f\xc4\xfc\xcf\
+\xcb\x6a\xe7\x3b\xba\x6a\xd3\xc8\x71\x39\xb2\x02\x88\xc6\xee\xe7\
+\x7f\x61\x52\xcc\x2c\x15\x45\x94\x0b\x01\xd2\x82\xe5\x9c\xb9\xe7\
+\xb5\x41\x35\xd7\x46\x08\xb5\x85\xcd\x70\x3a\x77\x26\x80\xea\x40\
+\x3c\xb5\x35\x20\xd5\xab\x0c\x06\xa6\xf4\xbb\xd4\x83\x56\xac\x30\
+\x1a\x9b\xd0\x03\x5c\xc7\xc8\x6d\x48\x36\x36\xf3\x02\x3e\xa6\xa3\
+\x0e\x4f\x84\x62\x63\x77\x8d\x89\x3a\xef\x7e\x74\x31\x9c\xc4\x5b\
+\x9d\x4a\x10\x59\xa6\xe6\xf6\x0b\xfe\x91\xce\xa4\x60\x34\x59\x95\
+\x10\xbc\x86\xca\x3f\x3a\x05\xb6\xb7\x36\x00\x5c\x9e\x95\x4b\x19\
+\x3f\x8b\x2d\x97\xd0\xbe\x9a\x6d\xc4\x3c\x4e\x21\xa6\x6e\x8a\x36\
+\x14\xb0\x69\x63\x7a\x9a\xe7\xad\x0c\xb5\x01\x3a\xd4\x1a\x83\xb6\
+\xd5\x27\x2b\x59\xb4\xb8\x3c\xaf\x4c\xb2\x87\x18\x85\x40\xa7\x30\
+\x59\x00\xf8\x81\xa1\xf0\xbc\xb6\xbe\xbd\x68\xd5\x5d\xa0\x75\x00\
+\x06\xb8\x61\x7e\x76\x35\x62\x73\xa6\x59\x19\x46\xb6\x24\x5e\xba\
+\xf6\xda\xb9\x87\x89\x69\xd5\x8f\x9c\x93\xa8\xdb\xb5\x72\x86\xce\
+\x41\xb1\xef\x6a\x52\x41\xab\x7c\x3e\x7c\xad\xe1\x39\xf2\x36\xdd\
+\x8d\x55\xd3\x99\x14\x2e\x5c\x37\x31\xd2\xad\xc5\x5b\x0e\x32\xdc\
+\x30\xfa\xd1\x0b\x5a\xd5\x53\x09\x29\x9a\x1b\x31\xf3\xa0\xb6\xa7\
+\x71\x56\x86\x80\x03\x5d\x18\xb0\x43\xb5\x4d\xc2\xa9\x63\xb2\x8b\
+\xd4\x0a\x56\x39\x98\x61\xec\xa2\xe1\x8f\x98\xda\xa0\x6c\x0d\x9e\
+\x1f\x14\xee\xe4\xdf\xb5\xb6\x14\x42\xa8\xe1\xa7\x96\x2f\x2a\xea\
+\xa7\xe1\x3b\x56\x83\x03\x60\x76\xd3\x50\x29\x9d\x9a\xe0\x6a\x75\
+\xa0\x37\xb5\xaf\xad\x12\x85\x03\xaf\xb9\xa4\x08\x0b\xd3\x10\x12\
+\xac\x01\xb3\x5b\xca\x6f\xce\x81\x4f\x73\x44\x46\x9b\x9f\xad\x31\
+\x31\xf1\x0a\xd0\x49\xe1\xce\xad\xab\x12\xb2\x01\xa1\xbe\xb6\x3d\
+\x0d\x5d\xc0\x60\x1d\x8a\xc9\x88\x5c\x89\xbd\xb9\xb5\x5c\x8f\xcc\
+\xb9\x5c\x93\xd6\xfa\xdb\xda\x8a\x16\x24\x34\x6e\xc1\x9a\x33\x6b\
+\xf5\x1c\xa8\x9c\x61\xd1\x46\xd7\x94\x20\x00\x28\x16\x00\x72\xa7\
+\x0d\x28\x10\x5b\x5b\x6b\x46\x2b\x71\x9a\x15\x48\xd5\x8b\x91\x60\
+\x35\x3d\xab\x91\x6d\x1a\x8b\x58\xda\xf6\xe9\x7d\x69\x8c\xb7\x0a\
+\xa7\x62\x75\xee\x00\xbf\xeb\x6a\xe6\x1a\x9d\x75\xa4\x16\xe3\xc8\
+\x7a\xda\xa4\x0b\x00\x3a\x57\x38\xf2\xdb\xae\x82\x8c\x81\x7a\x92\
+\x02\xde\x88\x0b\x54\xd7\x54\x9c\xc4\x2a\x96\x3b\x28\xb9\xa8\x41\
+\x65\xd7\xd4\x75\x63\xd4\xd4\x4d\xfe\x4b\xdc\x5c\x65\x35\x26\xe0\
+\xdb\xa6\xf5\x24\xd4\x13\x6a\x16\xbd\xea\x00\x26\xa4\xe3\xbd\x71\
+\x2d\xc8\xfe\x75\x39\x4d\x2e\x50\xd2\x44\x52\x3b\x00\x77\x73\xb7\
+\xb0\xeb\x52\x55\xe2\x52\xa3\x32\x84\x37\x65\xdd\x87\xe9\x44\x98\
+\xd4\xca\x03\xa3\x16\xe7\x6e\x74\xa9\x30\x53\x2f\xa4\x07\x03\xf0\
+\xd4\x70\xf4\x07\x17\xe6\xf8\x41\x36\x35\xcf\x6e\x95\xb5\x67\x71\
+\x75\x80\x01\xcb\x3b\xd8\x9a\x0c\xe9\x98\xa4\x9f\x76\xdf\x85\xb9\
+\xd3\x8e\xa6\xe6\xb9\x80\x6b\x66\x45\x6b\x6d\x71\xb5\x69\x00\x45\
+\xa6\x9f\x91\xa9\x29\x6e\x67\xf2\xa9\x78\xe3\x65\x39\xa3\x5d\xb7\
+\x02\xc4\x50\xc4\xd9\xe0\x46\xce\x3d\x3e\x6b\x9a\x52\x0a\xeb\xea\
+\x34\xb9\x21\x57\x86\x44\x37\x62\xca\x48\xbf\x5a\x6a\xb2\x35\xc2\
+\x48\xac\x57\x70\x2a\x50\x0c\xe3\xbe\x94\x16\x3f\x0a\x39\x71\x4c\
+\xa6\xde\x64\x23\x5e\xb5\x66\xe0\xc9\xa6\xc2\xa8\xc8\x4c\x38\x9b\
+\x8b\x82\x8f\x71\x7a\xbe\xb9\x58\x67\x8c\xdd\x48\xbd\xeb\x9c\x34\
+\x12\x52\x98\x84\x46\x91\xfd\x2b\xaf\xbf\x6a\x73\x8b\xd6\x6f\x13\
+\x9c\x3b\x78\x69\xe8\x53\xf5\xef\x45\xb9\x14\x21\x4f\x8d\x8c\xcc\
+\xfa\xdc\x96\x3e\xc3\x5a\xc1\xe2\x18\x89\x31\x78\xb2\xe7\x5b\x9b\
+\x28\xe8\x39\x0a\xdb\xc3\xb0\x13\x1c\xc6\xc0\xa9\x1f\x95\x52\x8b\
+\x87\x4d\x83\x66\xc4\x4c\x97\x0a\x6d\x19\xe4\x4f\x5a\xe3\xca\x5b\
+\x1b\x82\xc2\xa1\xc3\x44\xaa\x06\xb1\x83\x24\x96\xeb\xc8\x55\xbe\
+\x10\xa0\x49\x3e\x97\x29\x18\x5b\xdf\xbe\xbf\x9d\x54\x04\x29\x8a\
+\x36\xf5\x4a\x73\xb0\xe7\x94\x6d\xf9\xd5\xae\x18\x24\x2d\x3a\x44\
+\xe3\xc4\xca\x0b\xb7\x25\x37\xda\x9e\x3e\xaa\xb2\xc0\x8f\x50\x23\
+\xde\x84\xef\x40\x1a\x68\x0d\xb1\x0d\x9e\x36\x3a\x38\xd6\xd4\x63\
+\x23\x1f\x2c\xa8\x49\xd8\x66\xad\x00\x8b\x8b\xe9\x7b\x9a\x91\xf4\
+\xa2\x64\x65\x17\x2a\x6d\xd6\xa3\x42\x2a\x28\x6b\x01\x52\xa7\xad\
+\x44\xa6\x28\x55\x5a\x5c\xde\x6d\x94\x6f\x45\x04\xb1\xcf\x71\x1e\
+\x60\x47\x23\xce\xa0\x91\x6e\xf5\xc4\x12\x35\x36\xed\x53\xb5\x48\
+\xda\xb4\x10\x54\x88\x88\x5d\x59\xfc\x8b\xee\x69\xae\x6e\xe6\xdb\
+\x00\x05\x40\x03\xc6\x4e\xaa\x85\x80\xbf\x3b\xef\x43\x23\xac\x51\
+\xf8\x8d\xaf\x41\xd6\xa4\x5f\x10\x97\x22\x78\x2a\x75\x6d\x5b\xf8\
+\xaa\x60\x9a\xe7\x66\x77\x2e\xc6\xe4\x9b\x93\x52\x39\x56\x6b\x43\
+\x02\xa7\x95\x08\x3a\x51\x0d\xeb\x29\x04\x50\xb0\x60\xd7\xb5\xc0\
+\xa6\xd8\x74\xa8\x75\xb8\x22\xfb\xd3\x88\xef\x05\xf9\x21\x3d\xc6\
+\xb5\x24\xac\x0c\x1a\x56\xb3\x0f\x4a\x0d\xc9\xac\xd7\x5c\x4c\x1e\
+\x4b\x48\x8c\xdb\x00\x77\xab\x98\x18\x4e\x1d\x3c\x59\x35\x95\x87\
+\x97\x36\xa5\x7b\xd3\x2a\x31\x87\x84\x8b\x13\x0b\x11\x76\x3e\xe7\
+\x95\x72\x6a\x5a\xdf\x2a\xeb\xf5\xe7\xbd\x4d\xea\x4e\x51\x94\x00\
+\x45\x8f\x5e\xb5\x22\xba\xbb\x2e\x9b\x9f\xad\x21\x31\xb9\x49\x43\
+\x8d\xc7\x3a\xd2\x84\x89\x22\xce\x9a\x8b\xed\xcc\x56\x51\x36\x36\
+\x3a\x53\x20\x91\xd1\xcb\x46\xc4\x5a\x99\x55\x8d\x4b\x54\xa1\x00\
+\x12\xc7\xcb\x6b\x9b\xf3\x15\x49\x71\x92\x81\x62\x15\xbd\xc5\x41\
+\xc4\xcb\x23\x58\x90\x01\xd0\xe5\x00\x56\xb5\x9c\x58\xc2\x61\x85\
+\xbc\x56\x0d\x72\x6e\xa8\x3e\x1e\x97\xa7\x15\xb1\x25\x9e\xc7\x9d\
+\xda\xb3\x56\x79\x64\x46\x57\x91\x89\x89\xb2\x93\xd7\xa5\x40\xd7\
+\x5b\xd1\x2c\x58\xd4\x02\xfa\x06\x53\xff\x00\x50\xae\x60\x41\xda\
+\xb3\x05\x36\x09\xe4\x8d\xb4\x37\x1f\x84\xed\x4f\xe9\x62\xfa\xd3\
+\x06\xd4\xb8\xd8\x3a\x07\x5d\x9b\xf2\xa6\x2e\xd5\xa0\x20\x01\xde\
+\xa0\x69\xc4\xd4\x2e\xc6\x31\x71\xf2\xa2\x5d\xaa\x20\xb1\xe2\x33\
+\x5f\x70\x2c\xbe\xd5\xa4\xb1\xa0\x52\x49\xb0\x1b\x93\x47\x1d\x9a\
+\xc5\x48\x61\xd4\x1a\x4e\x25\x4b\x61\xca\xdf\x42\xcb\x7f\xad\x48\
+\xc3\xc6\x8f\x65\x2c\x17\x9a\xdf\x46\xa5\x91\xe6\x2e\xf7\x43\xa6\
+\xc0\xf6\xbe\xff\x00\xef\xb5\x1e\x45\xb6\xda\xf5\xe7\x5d\x1f\xa6\
+\xf6\xde\x8a\x94\x05\x8d\x43\x66\xd4\x9e\xf4\x43\x7a\x16\x34\x4a\
+\x74\xd6\xa4\x9a\xea\xeb\x8a\x1c\xc2\x94\xe9\x54\xb2\x15\x07\x5e\
+\x55\xc0\xb1\x17\x68\xf5\xff\x00\x58\xa1\x2c\x7a\xd4\x66\xd6\x84\
+\x98\x9d\x1e\xfb\x02\x0e\xa0\x9d\xa8\xb3\x0b\x79\x6c\xdd\xf6\x1f\
+\x5f\xe2\x80\xb2\x8f\x31\x03\xdf\x2d\xeb\xb3\x12\x6e\xdf\x2e\xd5\
+\x21\x9b\x11\xad\xdf\xb5\xac\xbf\xef\xde\xf4\x2e\xe6\xfe\x60\x2d\
+\xd6\xf5\xd7\xbd\x0b\x79\xc6\x50\x7d\xcf\x4a\x92\x6f\xad\x03\xa8\
+\xfb\x44\x72\x58\x5c\xdd\x4f\x7d\x28\xc0\x00\x58\x72\xa8\x27\xfe\
+\x2a\x34\xe8\xa4\x9a\xaa\x75\xaa\x40\xa3\xcb\x50\xc2\xc6\xa4\x5c\
+\xc8\xcd\x19\x55\x60\xb9\xb4\x24\xf4\xa4\xc7\x87\x85\x37\x5c\xe7\
+\xab\x6d\x56\x0d\x09\xd2\x8b\x09\x5e\x16\x49\x43\xc4\xaa\x0d\xac\
+\xcb\x7b\x5c\x51\x33\x0c\xc0\x15\x74\x27\x6b\xda\xc7\xe6\x2a\x49\
+\xa8\x60\x0a\x95\x61\x70\x68\x2a\x7c\x4f\x04\x66\x63\x34\x63\xcd\
+\x6f\x32\xdb\x53\x59\x2a\xf3\xe1\xa5\x25\x4b\x46\xdb\x11\xd2\xb7\
+\x46\x60\xc6\x27\x60\x40\x17\x43\x6d\xfb\x52\x78\x94\x69\x36\x19\
+\xdd\x96\xef\x18\xba\xd8\x7a\x8f\x4a\xc7\x2e\x3b\xdc\x32\xa8\xcb\
+\x8e\x57\x87\xc1\xb8\x49\xd8\x02\x75\xdc\x7f\x35\x9d\x38\x2a\x6c\
+\x45\x88\xe5\x59\xf8\xa9\x1d\xe5\x69\x09\xb3\x5f\x97\x2a\xbd\x04\
+\x87\x11\x82\x59\x08\xf3\x29\xc8\xdd\xfa\x57\x1f\xd7\xe9\xbc\xc1\
+\x61\x20\x32\xbd\xce\x8a\x37\x35\x7c\xb9\x06\xc0\x0c\xbb\x65\x23\
+\x4a\xe5\x8c\x43\x08\x8c\x6f\xbb\x77\x34\x27\x7a\xde\x63\x2c\xdf\
+\xf1\x07\x0e\xcf\x3a\xe2\xa2\x94\x45\x1e\x50\xa7\xa8\xf6\xa6\x70\
+\x22\x82\x39\xa1\x8c\x10\xa1\x6f\x73\xbb\x1b\xef\x57\x27\x8f\xc6\
+\xc2\xcb\x0d\xae\x4a\xdd\x7d\xc5\x65\xf0\x79\x44\x38\xd0\x1b\x69\
+\x01\x43\xaf\x5a\xc5\x92\x72\xd3\xf1\xa2\x48\xca\x54\x8b\xa9\xd0\
+\x8a\x50\x83\x0a\x3f\xe4\x9f\xfb\xcd\x36\x45\x2a\xc5\x48\xb5\x42\
+\x0b\xb0\x1d\x6b\x55\x17\x88\xfb\x98\x0c\xb0\xb3\x26\x52\x01\x52\
+\xd7\x06\x81\x31\x98\x72\x2e\xca\xea\x7a\x0d\x41\xa1\xc5\xbb\xcf\
+\x29\xc3\xc2\x9a\x29\xd7\xa9\x34\x71\x61\x22\x44\xfb\xe0\x5d\x8f\
+\x20\x6c\x05\x1d\xef\x49\x59\xd9\xf1\x78\xbf\x28\xb6\x6d\x85\xf6\
+\x14\xd9\x60\x6c\x32\x89\x92\x4b\xd8\xd8\xe9\x6a\x60\xc3\x45\x71\
+\xe1\x33\xc6\xc0\xe8\x77\xae\xc7\x44\xde\x5f\x1b\x13\x7e\x8b\x60\
+\x09\xa3\x3e\xa3\xa1\x94\x4d\x00\x93\x2e\x53\x7b\x1a\x9b\xda\xa8\
+\xe0\x38\xa6\x0f\x33\x61\x56\x17\x36\x37\x52\xc6\xc4\x9a\x62\xf1\
+\x34\xcc\x73\x61\x11\x11\x7d\x44\xb1\xbd\x33\x94\xfe\xac\x5a\x9a\
+\xcb\x87\x33\x92\x57\xc2\x20\x83\xfb\x55\x4c\x64\xad\x24\xd7\x61\
+\x6b\x01\xa7\x4a\xa9\x8d\xe3\x4d\x89\x4f\x0f\x09\x04\x6a\x11\xae\
+\xaa\xe7\xd5\xdf\x5e\x74\x2f\xc5\x1d\x90\xc9\x16\x1a\x1c\xc3\xd6\
+\x18\x6a\xa7\xb8\xac\xde\x70\xc9\x56\x2a\x41\xe5\x49\xc0\x71\x11\
+\x89\xc4\x24\x32\xe1\xa3\x05\xcd\x8b\x2e\x96\xf9\x53\xf2\x9f\x10\
+\xa2\x82\x4d\xed\xa5\x32\xcb\xe2\x12\xd1\xa8\xa7\xc1\x83\x00\x03\
+\x33\x5b\xfa\x56\xad\x45\x1e\x1d\x76\x88\x1f\xf5\x1b\xd3\x38\x8d\
+\x51\x14\x68\x8c\xc2\xe0\x6d\xb9\xab\x86\x08\x1e\xf6\x4c\xa6\xc4\
+\xe8\x74\xdb\xa5\x67\x62\xa2\xc5\x62\x2f\xe1\x36\x74\x1b\x22\xe9\
+\x6f\x95\x36\x62\xd5\xec\x3c\xb1\x4a\xf3\x0c\xa1\x4b\x1b\xc7\xdb\
+\xda\xa8\xc6\xcd\x98\xa9\xdc\x1a\xb3\xe2\x69\x1e\x1c\xc5\x95\xa2\
+\x6d\x5c\x0e\x55\x5d\x47\x9d\x18\x1b\xe6\x4b\x93\xd6\x8a\xa0\xc5\
+\x10\xa8\x5a\x9a\x88\xb4\xb5\xed\x52\x37\xb6\x95\x0a\x68\x59\x19\
+\xd8\xb0\xd8\x9d\x29\x64\x65\x14\x9b\x9b\xd7\x01\xc8\x0a\x88\x83\
+\xa9\xf3\x03\x6f\xd2\x8c\x6a\x34\x37\xa5\x04\xae\xc3\xa9\xa2\x16\
+\x45\xcf\x6d\x07\xa4\x75\x3d\x05\x43\x0b\x2e\x7b\x85\x09\xa9\x27\
+\xa5\x70\x60\xe0\x4a\xc4\xa9\x22\xc8\xbf\x84\x75\xf7\x35\x27\x22\
+\xf8\x51\xe5\x24\x66\x26\xec\x7b\xd7\x66\x3c\x87\xd6\xac\x43\x84\
+\x77\x50\xc6\xc8\xa7\x9b\x6e\x69\xc9\x84\x81\x46\xa5\x98\xfd\x29\
+\xca\xb5\x48\x13\xf8\x4f\xca\xb9\x58\xb3\x10\x45\xb4\xab\xb2\x61\
+\x52\xc4\xc6\xc4\x11\xc8\xd5\x2d\x4c\x9a\x82\x32\xe8\x6f\x56\x25\
+\xae\x1f\x29\x56\x31\x9d\x9b\x6f\x7a\xbd\x01\xba\xeb\x58\xf9\xd8\
+\x3f\x90\x6c\x77\xad\xa5\xb1\x01\x80\xd0\x80\x45\xab\x5c\x45\x31\
+\x05\xcd\xaa\xb9\x97\x2e\x3d\xa6\xb1\x2b\x9a\xd7\xb7\x2a\xb5\x0f\
+\xa8\x77\xa1\x89\x8a\xc0\x97\x50\x57\x28\xfe\xf5\xb0\x31\x22\x3b\
+\xaa\x23\x06\xbf\x98\xf6\x03\x5f\xd6\x8c\x6b\xf3\xaa\x39\xbe\xcf\
+\x8b\xce\x05\xc1\x1b\x7b\xd5\xd6\x60\xa0\x1e\xa0\x10\x29\x94\x25\
+\x5a\xea\x3d\xa8\xae\x6d\xbd\x2d\x76\xb7\x4d\x28\x81\xa4\x26\x88\
+\x11\x6a\x1b\xd0\x96\xb5\x48\x4c\x45\x09\x34\x2c\xff\x00\x2a\x0c\
+\xe3\x6b\x8f\xad\x1a\x70\xcb\xf7\xae\x2c\x05\x29\x9a\xc3\x5a\x12\
+\xe4\xec\x3e\xb4\x69\xc1\xca\xcd\x75\x03\xad\xea\x73\x6b\x4b\x5d\
+\xfa\x93\xce\x88\x54\x86\x4f\x97\xb5\xf5\x34\xd4\x17\x00\x2e\xdc\
+\xad\x42\x8a\x58\x58\x0b\xde\x80\x2c\xda\xc5\x19\xd7\x62\xdf\x86\
+\x90\x99\xa7\x0a\x08\x89\x73\x11\xbb\x72\x14\x58\x24\x60\x8d\x2c\
+\x9e\xb9\x3f\x4a\x88\xb0\x8c\x8b\xe6\x90\x38\xbd\xec\x05\x81\xf7\
+\xa6\xc6\x7c\xbb\x9b\x8a\x64\xbb\xda\x15\x03\xef\xbe\xd4\x67\x6a\
+\x5c\x84\x09\x3c\xc7\x4b\x5c\x55\x40\x49\xb8\xb8\x04\xd0\x33\x5d\
+\x8a\xda\xdf\x3a\xe9\x65\xb9\xb2\x7d\x6b\x88\x0a\x2c\x3e\x66\x83\
+\x11\x41\x23\x85\x5b\xd4\xbb\x59\x49\xe9\x55\xee\xce\xf7\x35\x9b\
+\x49\x81\x6e\xa4\x1d\x58\x8b\xdf\xa1\xaa\x78\xec\x40\x66\x40\x9b\
+\x2f\xab\xdf\x9d\x5b\x53\xf7\x83\xde\xb2\xb1\x0d\x7c\x64\xeb\x71\
+\x96\xf9\x94\x74\xbe\xf5\x9e\x57\xa3\x18\xdc\x6a\x1f\x07\x18\xf6\
+\x5b\x23\x1b\xaf\x71\x45\xfe\x1c\x90\x0e\x21\xe1\xc8\x7e\xed\x81\
+\x2c\x3a\x5b\x9d\x5e\xc5\xc2\xb8\xb8\x7c\x22\x40\x75\xf4\x13\xfa\
+\x56\x56\x0d\x5a\x0e\x20\x61\x95\x4a\xb3\x02\xba\xf2\xbd\x70\xb3\
+\x39\x6b\x7f\x1e\x8a\x60\x44\x87\x36\xf4\xa3\xbd\x55\xc1\xe3\x8a\
+\x0f\x03\x11\x72\xb7\xd1\x8e\xeb\x57\x19\x48\x20\x8d\x41\xd8\x8e\
+\x75\xd3\x75\x90\x83\x95\x83\x0e\x55\x9d\xc5\xb0\x6c\x92\x36\x22\
+\x11\x78\x98\xdf\x4f\x84\xd6\x8b\x29\x1a\x10\x45\x72\x12\xbb\x73\
+\xde\xfc\xe8\xb3\x54\xac\xfc\x16\x39\x72\x88\xb1\x37\x2a\x36\x7e\
+\x62\xad\x23\xc0\xd6\x29\x89\x8c\xdf\x5d\x4d\x88\xa8\xc4\x61\x30\
+\xb3\xfa\x94\xc4\xdd\x50\x68\x7e\x55\x56\x4e\x16\x6f\xf7\x58\x88\
+\xdb\xb3\x79\x68\xff\x00\x28\x57\xd7\xcc\x09\x59\xa2\xb7\x36\x0c\
+\x29\x12\x62\xb0\x48\x4e\x69\xcb\x11\xc9\x53\x7f\x9d\x51\x7e\x1d\
+\x8b\x52\x09\x8b\x32\xdf\x52\xa6\xf5\x57\x1c\x78\x96\x1f\x10\x50\
+\x61\x7e\xef\xe1\x1e\x1d\xc5\xa8\xbc\xac\xf8\xa4\x5d\xc4\x71\x57\
+\x23\x26\x1a\x31\x10\x23\x56\xdd\xbe\xb5\x51\xdd\x84\xb9\x14\xe7\
+\xc4\xb0\xcc\x4b\x1d\x10\x75\x34\x98\xb1\x2c\x49\x69\xf0\x91\x8c\
+\xbb\xe5\x26\xff\x00\x41\x54\x31\x3c\x59\xa2\xe2\x06\x58\xf0\xec\
+\x88\xde\xa2\x41\x0c\x47\x6e\x95\xca\xf2\xfb\x6b\x58\xb1\x89\xc2\
+\xa6\x1d\xd5\xdf\x10\xac\xc4\xde\xda\xaf\xf2\x68\x31\xf8\xb9\x31\
+\x01\x54\xbe\x60\xa3\x5b\x0b\x02\x7a\xda\x93\x2a\xf8\x89\xe3\xc4\
+\xe6\x44\x6d\xcf\x31\xef\x4a\xbd\x62\xdf\xe1\xc1\x03\x56\xa3\x2e\
+\x71\x38\x42\xba\xc9\x21\x2a\x6d\xbb\x27\x7a\xa8\x0d\x6d\xff\x00\
+\x87\x11\x15\xd3\x13\x3a\x80\x21\xd1\x6f\xbe\xa6\xf4\xf1\x9b\x55\
+\xab\x5c\x23\x87\x36\x1f\x33\x31\xb4\x8c\x37\xe4\x83\xf9\xad\x18\
+\x55\x21\x5c\xb1\xdf\xbb\x1d\xcd\x40\x91\x65\x17\x8e\x55\x23\xa5\
+\xec\x6a\x76\xd2\xbd\x32\x49\xe3\x14\x60\xd1\x03\x4b\x06\x8d\x01\
+\x63\x60\x09\x34\x83\x22\x60\x1a\xe7\x60\x09\x3e\xd5\xd8\x13\x93\
+\x04\xad\xac\x62\xec\xcd\xd6\xdc\xa9\x32\x9c\xc5\x70\xe8\x41\x67\
+\x20\xc9\x6d\x40\x14\xeb\xac\x85\x93\x65\x71\x94\x76\x1c\xa9\x4a\
+\x98\xb9\xd2\x46\x00\x2a\xbe\x5d\xd9\x86\xff\x00\x2a\x59\x66\x73\
+\x76\x37\xa5\xa0\x14\xc1\x58\x68\x42\xa4\x50\xd7\x7c\x27\xda\xa4\
+\x33\xf8\x79\x9e\x42\x8f\x9d\x00\xd0\xd8\x68\x28\x97\x6a\x60\xa2\
+\xe7\x50\x45\xcf\x7a\xea\x95\x3e\x60\x06\xa7\x90\x1b\xd2\x02\xaa\
+\xb2\xe2\x0c\x24\xb3\xac\x76\x39\x07\xc4\xd5\xa1\x87\xc3\xa4\x07\
+\xc5\x94\x03\x21\xe5\xc9\x6a\xbc\x90\x7d\x90\x7d\xa8\x00\x25\x63\
+\x62\x06\xb9\x68\xf0\xb3\x4f\x89\x3e\x75\x40\xa3\x98\x16\xb5\x33\
+\xaa\xaa\xcb\x48\xa4\xdc\xb1\xd7\x99\x15\xc4\x81\xb9\x1f\x5a\x51\
+\x56\x67\x0a\x4d\xc0\xfc\xaa\x7c\x21\x9a\xf7\xb0\xe9\x4b\x26\xd5\
+\x7c\x72\x82\x4c\x80\x00\x6d\xaf\x7a\x70\x04\x68\x18\xfc\xea\x55\
+\x41\x3e\x7d\x6f\xa1\x1d\xaa\x4c\xf1\x7a\xd2\xe1\x6d\x9b\x0c\xc2\
+\xf7\x28\x74\xf6\xac\xe9\x30\xec\x98\x96\x41\x7c\xbc\xb5\xb5\xe9\
+\xd8\x1c\xd0\xe2\x75\x07\x2b\x0b\x1a\xb8\xf5\x5a\xad\x50\xc5\x41\
+\x3d\x05\xc5\x14\x63\x2d\xd0\xdb\xf1\x0f\xdc\x7d\x7f\x5a\x50\x0f\
+\x7c\xad\x6b\x5f\x53\x45\x24\x81\x02\x3b\x1b\x0c\xc5\x49\xec\x45\
+\x74\x64\xae\x27\x1d\xd2\x36\x52\x6f\xaa\xfc\xea\xc3\x00\xa7\x28\
+\xdc\x00\x09\xf9\x50\x0c\xb3\x48\x1a\xf7\x8e\x3d\x8f\x26\x34\x4e\
+\x75\x26\xa4\x90\x6d\x5c\x1a\x80\x1a\xea\x92\x58\x96\xbd\xc9\x02\
+\xfb\x50\xb5\xed\xeb\x6f\xad\x40\x3e\x51\xdc\x57\x1a\x90\x6c\x4f\
+\xa8\xde\xd5\x24\x0e\x82\xba\xf5\x0c\x68\x48\x20\x03\xa5\x75\xea\
+\x2a\x54\x5c\xda\x84\x25\x37\x15\x18\xcc\x4a\xe1\x80\x45\x01\xe5\
+\x22\xf6\x3b\x20\xea\x6b\x95\xd4\x11\x93\xef\x09\x3c\x81\xb0\xf9\
+\xd6\x5c\xce\xcf\x33\xb3\x1b\xb3\x31\x2c\x7a\x9a\xad\xc8\xa2\xcb\
+\x62\xf1\x32\x8b\x3e\x25\xb2\xfe\x18\xd7\x2d\xe8\xb0\xb8\x89\x62\
+\x23\xc3\x62\x00\x37\xb7\x5a\xab\x1d\x59\xc1\x46\x65\x9d\x63\x51\
+\xab\x1b\x51\xde\x9a\xdd\x27\xee\xc3\x81\xba\x83\x6a\x15\x4d\x2f\
+\x7d\x4e\xa6\x9c\x40\xd8\x6c\x05\x85\x01\x16\x3a\x6d\xd2\xbb\xb0\
+\x5b\xf9\x54\x9b\x6c\x2f\x4b\x68\xc1\xf5\x6a\x7a\xd3\x24\x04\xe8\
+\x4e\x9d\x05\x41\xd3\x5a\x2a\x21\xa2\x50\x41\x51\xa8\xeb\x40\xf9\
+\xb7\x16\x14\xe6\xa5\x3d\x66\x98\x53\x82\x7d\x76\xf6\x14\x04\xd3\
+\x1c\xd2\x98\xd6\x69\x46\x62\x1a\xfd\x2b\x37\x8a\x2f\x83\x2f\x8e\
+\x6f\xb8\x52\x79\x32\x9a\xd0\xaa\xdc\x4d\x5a\x54\x11\x78\x25\xd2\
+\xd7\x24\x75\xac\x5f\x0c\x50\x93\x46\x20\x6d\x43\x3c\x29\x8c\x8c\
+\x24\xa1\x83\x29\xf2\xc8\xa3\x51\xef\x44\xe2\x64\x16\x43\x13\x90\
+\x2c\x33\x8b\x11\x55\x27\x4e\x22\xe4\xdc\x48\x47\xf4\x9f\xe2\xb9\
+\xd6\x88\xc4\x1c\x46\x1d\x8a\xe2\x62\xf1\x50\x68\x24\x1b\xfd\x69\
+\xf8\x3e\x27\x04\x70\x18\xb3\xba\x03\xb1\x61\x7c\xbf\x3a\x94\xc1\
+\xe2\xda\x2f\xbe\x25\x54\xf2\x60\x49\x34\xb1\xc3\xb0\xef\x7f\x0a\
+\x44\x27\x98\x91\x8a\x5b\xf5\xac\xf7\x3c\x3d\x35\xb0\xc6\x29\x30\
+\xaa\xd1\xe2\x52\x4b\x5e\xe6\xfa\xd7\x1c\x9c\xe4\x4f\xfb\xab\xcf\
+\x62\x70\xf8\x9c\x0c\x99\xd6\xe8\x2f\xa3\x2b\xdc\x1f\xca\x8a\x3e\
+\x2d\x36\xd8\x80\xb3\x2f\x32\x56\xcd\xf5\xa7\xf7\x3e\x8c\x6e\xbf\
+\x87\x6b\xf8\xd1\xe9\xfd\x54\x99\x24\x85\x75\x69\x47\xfd\x3a\xd5\
+\x28\x24\xc3\x62\x85\xb0\xf2\x15\x7b\x5f\xc3\x7d\x3f\x3a\x19\x94\
+\xa9\xb3\x0b\x11\x4d\xe5\xd2\xc5\xa6\xc5\xc2\x86\xe8\xae\xc7\xbe\
+\x82\x82\x6e\x21\x24\xa9\xe1\x95\xca\x84\x58\x8c\xc4\xfe\xb5\x50\
+\xd4\x56\x3f\x54\x86\x4c\x34\xa4\xfd\xd6\x3a\xea\x0e\xce\x4a\xda\
+\x97\x34\x18\xd4\x5c\xca\xe9\x32\x0d\xf6\x20\x8e\xf7\xa7\x57\x2b\
+\x14\x60\x54\xd8\xd1\x90\xeb\x35\x22\x84\xc8\x64\xc3\x01\x0c\x84\
+\x1c\xd1\x1f\x44\x9e\xdd\x0d\x56\xc4\xc7\x97\x12\x63\x41\xec\x08\
+\xd6\xb6\x71\x18\x13\x8b\x9d\x1a\x01\x95\x9f\x57\xe8\x2b\x51\x70\
+\xf8\x68\xe1\x10\x01\xaa\x8b\x09\x40\xd5\x4d\x13\x86\xad\x79\xdc\
+\x26\x0f\xc3\x0b\x2e\x24\x58\x9d\x55\x39\x9f\x7a\xbe\xb3\xc4\x8c\
+\xa9\x3b\x64\x59\xd0\x59\xc0\xd8\x82\x77\xfa\xd0\x63\xf0\xd2\xe1\
+\xe6\xb4\x87\x30\x6d\x43\xfe\x2a\x56\x2b\x0e\xf8\x98\x62\x58\x99\
+\x3c\x80\xdf\x33\x58\xd1\xe7\x8b\xd6\xa6\x0b\x08\xe6\x70\xe5\xbc\
+\x8b\x66\x0c\xba\xde\xae\x66\x0f\x3b\x2a\x87\x76\xbf\x9b\x28\x00\
+\x2f\xcc\xd6\x3f\x0a\x3c\x4f\x02\xa5\x22\x78\x24\x43\xbc\x65\xef\
+\x7f\x6a\xd6\xc0\xbc\x72\x42\x23\xb1\x8a\x76\xf3\x34\x64\xdf\xf3\
+\xae\xbc\x2f\x4c\xd3\x4a\x91\x6b\x42\xef\xfe\x97\x1a\x7b\xd4\xa3\
+\x5e\xe2\x42\x07\xff\x00\xd6\x87\x4f\x99\xe7\x42\x47\x6a\x95\x51\
+\x7b\x90\x0d\x6c\x08\xb1\x0b\x95\x55\x54\x74\x51\x52\x80\x93\x43\
+\x94\x11\x6d\x7e\xb4\x8c\x6b\x65\xfb\x95\x63\x7f\x8f\xf8\xab\x71\
+\x2b\x83\xde\xd4\xc0\x53\x28\x2d\x2a\x29\x23\x66\x3a\xd2\x63\x8c\
+\xbf\x94\x31\xa6\xaa\xa0\x3e\x33\x59\xf4\x01\x01\x1c\x86\x99\xab\
+\x11\xa3\x4a\x84\x17\x91\x85\xb9\x65\x20\x93\xec\x2b\xac\x4a\x12\
+\x30\xb3\xda\xdb\xdc\x54\x09\x5b\x93\x28\xee\x00\x15\xd7\xb9\xb9\
+\x37\xfc\xe9\x06\xd9\xef\xe5\x85\x35\xe4\xf2\x58\xd4\x48\xd9\x06\
+\x66\xc3\x4e\x07\x5b\x83\x40\xb7\xb0\x06\xa5\x4b\x03\x71\x71\x4a\
+\xc0\x7d\xa8\xb7\x97\x0d\x03\xbb\x75\x61\x7a\xbf\xc3\x9a\x35\x16\
+\x95\x44\x53\x30\xbd\x8e\xdf\xf9\xa8\xe1\xea\xce\xc5\xdf\xd2\xbc\
+\x86\x97\x35\x66\x78\xa3\x9c\x5a\x54\xb9\xea\x34\x35\xa9\x2f\xa2\
+\xd0\xca\xab\x88\x21\x33\x5e\x34\xd5\xcf\xe2\x3d\x05\x1a\xe8\x32\
+\x8d\x14\x6c\x06\xc2\xb8\x21\x48\xc2\x20\xb2\x8d\xaf\x5d\x66\x3a\
+\x11\x61\xce\x96\x51\x1f\xa3\xe7\x44\x05\x48\x15\xd6\xa9\x38\x54\
+\xaa\xdc\xf4\x00\x5c\x9e\x82\x88\x21\x22\xf6\xd3\xa9\xaa\xdc\x47\
+\x12\x91\x44\x61\x8d\x83\x3b\x8b\x31\x07\xd2\x29\xea\x7a\x99\x7f\
+\xe2\x39\xde\x5c\x44\x6f\x1b\x11\x1b\x0c\xaa\x3a\x5a\x91\xc3\xb1\
+\x72\xe1\xa5\xf5\x96\x46\xf5\x03\xaf\x3a\x2c\x59\xcf\x85\x0d\x63\
+\xf7\x6c\x0f\xd7\x4a\xaa\xbe\xab\x74\xae\x36\xf7\xad\xe3\xd9\x42\
+\xe2\x58\x04\x8b\xb7\xed\xca\xa2\x64\x12\xc2\x63\x26\xda\x82\x0d\
+\x66\x7f\x87\xb1\x36\xc2\x80\x7f\xe5\xb1\x56\x17\xe4\x79\xd6\xa9\
+\xec\x6e\x0e\xc6\xbd\x12\xec\x61\x2b\x65\x01\x57\x45\x5d\xab\x98\
+\xde\xa2\xba\x94\xea\xe1\xb8\xae\xae\xa9\x05\x3d\x03\xda\xa1\x88\
+\x02\xa2\x43\x96\xe7\x91\xde\x96\x5c\x6f\x63\x6e\xb4\x6a\x13\x35\
+\xea\x2f\x43\x7b\xed\xad\x70\xa1\x08\x7f\x73\x40\x5c\xca\xb9\x22\
+\x46\x2a\x4d\x99\xf9\x5a\x8b\x42\xac\xa4\x8f\x30\x22\x81\xa6\x8e\
+\x1c\x22\xc8\xdb\x81\x60\xbd\xea\x49\xc7\x62\x57\x0d\x0e\x55\x3e\
+\x72\x2c\x8b\xd0\x75\xac\xe4\x6b\xeb\x49\x9e\x57\x9a\x63\x23\x9b\
+\x93\x4d\x48\xe4\x45\x0c\xc8\xc0\x75\x22\xb1\xfa\xda\xd6\x61\xa9\
+\xbd\x6e\x70\x7c\x3f\x81\x17\x88\xe3\xef\x1f\x6e\xc2\xb0\xe1\xb6\
+\x71\x7d\xaf\xad\x7a\x53\xea\x1d\x2c\x2d\xf4\xae\x9c\x27\x6c\xf2\
+\x30\x1d\x2a\x0d\x4a\x54\x91\x5d\x59\x29\xc5\x03\xfa\x69\xac\x29\
+\x6c\x39\x51\x51\x47\x7a\x5c\x83\xa9\x03\xdc\x8a\x29\xdf\xc2\x89\
+\xa4\x3c\xb6\xf7\xac\xa4\xbc\xd8\x91\x9c\x17\xcc\x75\xb5\x63\x95\
+\x31\x79\xd7\x4b\xdd\x6d\xfe\xa1\x49\x25\x4e\xc7\x37\xfa\x05\xff\
+\x00\x3d\xa8\xca\x46\x86\xe9\x1a\x2d\xb9\xda\x85\x89\x3b\x92\x68\
+\x20\x21\xef\xea\x11\x8e\xde\x66\xfe\x28\x48\xb1\x37\x79\x1b\xdc\
+\x81\xfb\x51\x31\xa0\x63\x59\xa8\xb3\x06\x1b\x35\xfc\x22\x4f\x3b\
+\xb5\x42\xbc\x71\xe9\x1a\xe4\xf6\x1a\xd4\xb1\xa0\x26\x82\x23\x3b\
+\x6f\xe2\x3d\xfd\xcd\x04\x92\x17\x5b\x00\xbe\xf9\x05\x4e\x9d\x3f\
+\x2a\x06\x00\xf2\xb7\xb5\x45\xca\xea\x17\x21\x8a\x36\x5e\x61\x96\
+\xa9\x71\x0c\x0c\x0e\x9e\x26\x1f\x07\x11\xfc\x48\x14\xdc\x77\xab\
+\x7a\xdb\xad\x40\x24\x1b\x8b\x82\x3a\x51\x64\xa9\x84\xcb\x00\x24\
+\x1c\x32\x0e\xb6\xb8\x22\xb4\x70\x03\x0f\x89\x83\x2b\x02\x64\x5d\
+\x02\x97\xd6\xdf\x4a\xb3\x89\x86\x1c\x40\x1e\x34\x76\x61\xf1\x2d\
+\x81\xaa\x72\xf0\xdb\x31\x31\x62\x00\x3c\x83\x0b\x7e\x75\xcf\xf3\
+\x65\x6b\x61\xcd\x86\xc3\x29\xb3\x40\xe0\x8e\xae\x69\x58\x98\x70\
+\x91\x2e\x62\x18\x5f\x61\x7b\xd4\x88\xf8\xbc\x63\x2c\x72\x19\x07\
+\xf4\xb0\x6b\x50\xcb\x3e\x35\x7c\x98\x8c\x1e\x7d\x39\x2d\xbf\x4a\
+\x7a\xfe\x01\x61\xa3\xc2\x4b\x19\x61\x1b\x12\xbb\xdd\xad\x4e\x8d\
+\x63\x12\x00\xb0\xc6\xba\xda\xe0\x6b\x55\x63\xe2\x10\x44\x32\x36\
+\x19\x96\xfe\xa0\x0d\xa8\xcf\x11\xc1\x5e\xf9\x27\xfa\x8a\xb6\x21\
+\xc4\xa0\x33\xce\x45\x99\xd8\x81\xfd\x20\x69\x52\x8a\xcc\xc0\x0d\
+\x49\xa0\x18\xec\x26\x63\xe4\x93\x2b\xea\xb7\x61\x6c\xdd\x3b\x5e\
+\xaa\x62\xf8\x94\x85\x5a\x28\xa2\x10\x83\xa1\xeb\x46\xc8\x85\xc6\
+\xa6\x8d\x82\x40\x87\x31\x8c\x9c\xcd\xcb\xda\xa9\x28\xa1\x07\x5a\
+\x35\x3a\x57\x3d\xde\xda\xc4\x93\x6a\xe4\x62\xae\x19\x4d\x88\xd8\
+\xd7\x1a\x8e\x75\x44\xdd\xc3\x4d\xf6\x9c\x1a\x4c\x4f\x9c\x79\x5f\
+\xdf\xad\x1a\x9a\xce\xe0\xb8\x85\x8e\x46\x86\x56\xb4\x72\x0d\xfa\
+\x1e\x46\xb4\x8a\x95\x6b\x1a\xed\xc6\xec\x66\xa5\x9f\xc3\x85\xe5\
+\xe6\xa3\x4f\x7a\xce\x04\x93\x73\xa9\x35\x77\x19\xff\x00\xed\xf2\
+\x7f\xa9\x6b\x3f\x52\xb6\x1b\xde\xae\x4a\x2c\x46\xaa\x50\xeb\x9a\
+\x31\xff\x00\xfd\x0f\xf1\xfa\xd1\x31\x2c\xd7\x63\x44\xe1\xcb\xf9\
+\xc5\x8f\x4b\x5a\xd5\x39\x68\x41\x17\xe5\xa5\x4d\x8f\x3b\x9a\x20\
+\xbd\x68\x82\xd3\x8b\x42\xa2\x8a\xd4\x40\x57\x01\x48\x5e\xc1\xae\
+\x5c\x2a\xdb\xe2\x24\xd3\x00\x3a\xd8\x6b\x6d\x2f\xd6\x87\x00\x73\
+\x61\xb2\xde\xe5\x0e\xdd\xa8\xe5\x0c\x19\x55\x05\xdc\xec\xbf\xb9\
+\xad\xb2\xab\x84\x5c\x44\xa5\x9b\xc6\x65\x50\x75\x37\xe7\x56\x82\
+\xb8\xf8\x8c\xab\xce\xfa\x30\xfe\x68\xa0\x87\xc2\x84\x25\xee\x49\
+\xbb\x7b\xd1\xaa\xda\x99\x10\x14\x06\x17\x53\x7b\x6e\x2d\x62\x3d\
+\xe8\x71\x32\xc7\x86\x8c\x33\x82\xcc\xde\x95\x15\x60\xda\xe1\xc8\
+\xdb\x46\x3d\x8f\xf0\x6a\x97\x1e\x53\x68\x4d\xb4\x00\x8f\xce\xab\
+\xd4\x4a\x38\xbc\x44\xb3\xb9\x2c\x48\x5e\x4a\x36\x15\x56\x6b\x86\
+\x03\x91\xa6\xb6\xf4\x32\x8c\xc9\xa6\xe0\xd7\x2b\xdb\x63\x2b\x9a\
+\x39\x13\x7c\xc8\x6c\x2b\x32\x31\x6a\xd6\xc3\xa4\x84\x24\x99\x18\
+\xaf\x33\x6a\xcd\x99\x32\x4c\xeb\xd1\x88\xac\xf2\x89\x77\x80\x37\
+\xdf\xc9\x17\xfe\xe2\x7e\x63\x51\x5b\x38\x2c\x46\x82\x29\x2d\x6f\
+\x84\xf4\xaf\x3d\xc3\xa4\xf0\xb1\xd1\x49\x6d\x98\x56\xcc\xca\x15\
+\xca\x8e\x46\xba\x70\xbd\x0a\xd2\x20\x8f\xe6\xa2\xb3\xe2\x9a\x58\
+\xfd\x0e\x40\xe9\x4e\x18\xd9\x00\xf3\x22\x37\xca\xd5\xd3\xf5\x19\
+\xc5\xaa\x83\xb5\x57\x18\xdd\x75\x85\x7e\x44\xd7\x1c\x62\x69\xf7\
+\x47\xbf\x9a\xad\x8b\x0c\x7d\xe8\x0d\x29\xf1\x84\xe8\xb0\xaf\xd4\
+\x9a\x53\xe3\xa4\x07\x41\x18\xed\x96\x8d\x87\x0f\xc8\x3b\xfd\x6a\
+\x42\xad\xf6\xaa\x9f\x6c\x97\xf1\xaf\xd0\x51\x2e\x32\x41\xba\xa3\
+\x0f\x6a\x36\x2c\x5b\x05\x63\x46\x91\xb4\x54\x17\xf7\xac\x8c\x4c\
+\xad\x2c\xcd\x2d\xaf\x7d\xd0\x73\x1d\xbb\xd6\x9a\x62\x20\x91\x1a\
+\x39\x03\x28\x75\xb1\xe9\x59\x93\xc4\x62\x90\xad\xee\xa7\xd2\x7a\
+\xd6\x79\x18\xb1\xc2\x70\xcb\x2c\xa6\x56\xf3\x46\x9a\xfb\x9e\x95\
+\xab\x9f\x30\x2a\xe0\x32\x9f\x84\xed\x59\x3c\x3b\x10\xd0\xc8\xc0\
+\x65\xcb\x26\xe0\xec\x4f\x7a\xd5\x4b\x32\x07\x5f\x49\xfc\x8f\x4a\
+\xd7\x0f\x05\x51\xc7\x41\xe0\x4a\x0a\xff\x00\x96\xfa\xaf\x6e\xd5\
+\xb1\x80\x98\x4f\x83\x47\xbe\xaa\x32\xb5\x52\xc7\x28\x6c\x03\xdf\
+\xe1\x21\x85\x07\xf8\x7e\x52\x27\x78\x4e\xce\xb7\x1e\xe2\xb5\x3a\
+\xa2\xf8\xd8\x8d\xb5\xb1\xa6\x83\xa5\x57\x06\xfa\xd3\x11\xb4\xae\
+\xac\x8d\xe9\x2f\xbd\x30\x9b\xd0\xb6\xba\x54\x95\xf1\x68\x1e\x02\
+\xa4\x68\x59\x7f\x5a\x51\x45\x40\x42\x22\xa8\xec\x2a\xcc\x80\x98\
+\xd8\x0d\xed\x71\xdf\x9d\x2d\xc0\x3a\x8d\x8e\xa2\xb1\x61\x55\x90\
+\x69\x6a\x5b\x69\x56\x1d\x75\xa4\xc8\xa4\x56\x69\x25\xa8\x1f\x4a\
+\x61\x14\xb7\x15\x84\x5b\x9d\x68\x68\xce\xf5\x0c\x2a\x32\x80\xef\
+\x43\xa5\xe8\x88\xd2\x84\xd4\x50\x68\x6b\x89\xa8\xbd\x1a\x93\x42\
+\xdb\x57\x72\xa8\x6b\x05\x2c\xcc\xaa\xa3\x99\x34\x20\x10\x2f\xb5\
+\x48\x69\x14\x59\x64\x70\x3b\x35\x46\x68\x7f\xf7\xd0\x7b\xd1\x32\
+\x90\x3b\x75\x07\x4a\x93\xbc\x57\x1b\x90\x7d\xd4\x1f\xda\x93\x24\
+\x78\x69\x2e\x24\xc3\x47\xee\x83\x29\xa3\x61\xce\x85\xa8\xa6\x14\
+\xd8\x4c\x13\x23\x28\x59\x10\x1d\xfc\xc1\x81\xf9\x50\xae\x0b\x09\
+\x75\x52\xf2\xca\x3e\x1c\xda\x11\xfd\x34\xeb\x50\xca\xa4\x02\x14\
+\x7d\xe3\x8f\x20\xef\xd6\xb3\x90\x99\x19\x48\x85\xa1\x85\x23\xe5\
+\xe9\xb9\xa3\xce\x24\x19\x65\x8e\x37\x1d\x0a\x8f\xda\x97\x23\x03\
+\x26\xfa\xf3\xf7\xa9\x43\xad\x86\xf5\xa0\xa7\xc5\x70\x89\x08\x59\
+\xa1\x2d\xe1\xb9\x37\x07\xe1\x3d\x2a\x90\xad\x4e\x35\x2a\xc7\x85\
+\x18\x60\xc0\xbb\x36\x67\x03\x90\xe5\x59\x43\x38\x37\xbe\x9d\xab\
+\x9f\x39\x34\xc3\x2d\xa5\x5a\xc3\x71\x0c\x4c\x4a\x13\x30\x74\x02\
+\xc1\x5c\x5c\x0a\xa6\xcc\x2e\x32\xde\xe3\xad\x19\x3a\x5f\x29\x17\
+\xa2\x74\xbd\x6b\xc5\x8a\x87\x17\x87\x92\x30\x9e\x1c\x85\x7d\x37\
+\xd0\xfb\x55\x58\xe3\x66\x6c\x80\x6b\xfa\x52\x38\x79\x61\x89\x89\
+\x81\xd4\xb8\xd6\xb5\xf1\x50\x09\x99\xd6\x18\xec\xaa\x7c\xe8\x3e\
+\x3d\x34\x1e\xdd\xab\xa4\xff\x00\x28\x3c\x5e\x6c\xad\xe4\x91\x03\
+\x0e\xa7\x7a\x54\xd8\x20\x7c\xd0\xb5\xff\x00\xa4\xef\x56\x05\x88\
+\x2d\x96\xc6\xe4\x10\x77\x16\xa9\xb7\x3d\x2f\x5d\x71\x86\x6b\x23\
+\x23\x65\x60\x41\x1b\x83\x51\x6a\xd2\x9d\x12\x58\xfc\xe8\x73\x5b\
+\x46\xb6\xd5\x9f\x30\x68\xc9\x52\x3c\xc3\x4b\x56\x6c\x6a\x22\xa4\
+\x0a\x08\xcb\xde\xe7\x5f\x7a\x60\x64\x04\x29\x0e\xcc\x75\x08\xa3\
+\x5a\x91\x98\x67\x68\x98\x32\x9b\x66\x60\xbf\xef\xe5\x5a\x3e\x81\
+\x68\xc5\xc1\xd7\x37\x36\xee\x6b\x32\xc7\x38\x67\x00\x65\xf4\x20\
+\x37\xd7\xa9\xab\x58\x09\xf4\xf0\xa4\x3a\x7c\x24\xf2\xad\x71\xa2\
+\xac\x80\x48\xe9\x5d\x62\x07\x5a\x3b\x5b\x43\x5d\x5b\x08\x16\x23\
+\x5d\x54\x8b\x1a\x46\x22\x29\xe6\x84\xc2\x02\xb8\x02\xea\xd7\xb1\
+\x27\xa5\x3f\x28\xde\xd5\x0c\x0a\xea\x9a\x1d\xed\x45\x4c\x09\x4b\
+\x47\x7f\xf8\x69\x49\x1c\x88\xfe\x2b\x94\x87\x85\x64\x00\x8b\xe8\
+\x47\x42\x2b\x5f\x88\x61\x9a\x71\xe2\xc1\xfe\x67\xc4\x2f\xbf\x71\
+\x54\x57\x0f\x2b\x4c\x10\xc6\x47\x8b\xdb\x98\xfe\x47\xe9\x5c\xef\
+\x1c\xad\x4a\xd2\xc2\x1f\x0f\x86\x21\x51\xb4\x45\x88\xeb\xad\x60\
+\x71\xa8\xc0\xc5\x78\xaa\x34\x70\x09\xf7\xb5\x7a\x0c\x53\x2a\xe0\
+\xce\x5d\xb2\x84\x51\x59\xfc\x6b\x0c\x17\xc2\x4b\x82\x64\x8c\xe5\
+\x27\xad\xf4\xfe\x29\xe7\x36\x08\xc4\xad\xd5\x7f\x17\x0f\x14\xa3\
+\xe2\x40\x0f\xb8\xac\x47\x5f\x2e\x70\x08\x04\x90\x41\xf8\x4f\x31\
+\x5a\x7c\x20\x93\xc3\x98\x1f\x86\x4d\x3e\x95\x8e\x3e\xe3\x55\x61\
+\x45\xc8\x02\xa4\xa9\xcb\x7d\x0d\xba\x1b\xd0\x48\xc5\x30\xee\xe3\
+\x70\x2c\x3e\x75\x21\x12\x28\xe3\x91\x17\xd3\x6c\xdf\xd4\x0d\x6c\
+\x3a\xb9\xb4\x15\x2c\x32\xb1\x1d\x2a\x18\x12\x45\xad\x61\xca\xf5\
+\x00\x15\x36\xd7\x5a\x19\x0a\xc7\x11\x76\x07\x28\x36\xd0\x53\x09\
+\x6c\xd9\x42\xeb\xef\x43\x32\x13\x86\x93\x31\xbf\x97\x6b\x54\x41\
+\x19\x49\x14\xb4\x6c\x0d\xb7\x16\xd4\x57\x65\xe9\x4a\xc1\xe1\xa4\
+\xc8\x25\x49\x42\x13\xe9\x16\xde\xac\x44\xfe\x20\x60\xcb\x96\x44\
+\xf5\x2f\xef\x44\xff\x00\xa8\x20\x75\x15\x24\x02\x2c\x45\xc5\x16\
+\x95\x1f\x5a\x51\x7f\x67\x66\x04\xa0\xcc\x2d\xa8\x1b\xd1\xe0\xb1\
+\x72\xe1\x9f\x2c\x77\x65\xb8\xcf\x13\x7c\x5e\xdd\x0d\x1c\x32\x34\
+\x52\x07\x4d\xc5\x5c\x9e\x1c\x3e\x2e\x21\x29\x05\x5b\x9b\x2f\x2f\
+\x7a\xa4\xfe\x2d\x51\xe2\x1c\x60\x3e\x58\x63\x8c\x04\x27\xef\x05\
+\x8d\xea\xd7\x03\x8f\x36\x29\x67\x43\x78\xd0\x5e\xff\x00\xb5\x4a\
+\x70\x9c\x37\xda\x04\xcd\x3b\x16\x03\x5f\x2e\xe7\xad\x5c\x8a\x35\
+\x89\x6d\x0e\x97\xd4\x92\x3d\x5e\xe2\xb5\x25\xdd\xa2\xe7\xc5\x85\
+\x24\x53\x01\xb8\xa4\x23\x66\x21\x6d\x95\xed\xe9\xeb\xdc\x75\xa3\
+\x0d\x63\xa9\xb5\x74\x60\xca\xeb\xd7\x02\x0d\x56\x9b\x14\xd1\x4a\
+\xc8\xf1\x03\x6d\x88\x3b\xd5\x6e\x25\x9b\xeb\x42\xe2\xde\x65\x17\
+\xe6\x54\x73\xf6\xef\x41\x87\xc4\x47\x30\xb0\xf2\xb7\xe1\x3c\xe8\
+\xf3\x6b\x56\xea\x29\x80\x6f\x4d\xc8\x3b\x11\x48\x11\xda\xf9\x97\
+\xe7\x56\x25\xba\x13\x2c\x6a\x48\xf8\xd0\x7e\xa2\xa1\xca\x90\x19\
+\x48\x65\x3b\x11\xce\x8b\x0c\x54\x91\x2d\xb5\x2d\x94\xf2\xb5\x5a\
+\x75\x06\x94\xc9\x58\xb0\xab\x32\x91\xc8\x7c\x8d\x03\xe6\x03\xd2\
+\x6a\xc3\x2d\xa8\x6d\x59\x4a\xb9\x81\xed\x42\xe5\x6d\xbd\x14\xb1\
+\x95\x6b\x5b\x4a\xe0\x05\xb6\x15\x34\x43\xb0\x1d\x6a\x01\xb8\xb8\
+\xd0\x51\xca\x97\x3a\x69\x4b\x54\x65\x3b\xdc\x56\x6a\x49\x02\xdb\
+\x5f\xde\x86\x50\x81\xa2\x76\x00\x05\x72\x09\xe9\x71\x44\x76\xae\
+\xd0\x82\xad\xaa\xb0\xb1\x15\x20\xc8\x5b\x35\x9c\x66\x1c\xc1\xd6\
+\x80\x8f\x08\xf8\x90\x6a\xa7\xd7\x1f\xf1\x44\x97\xcf\xe0\xbe\xac\
+\xa2\xea\xdf\x8c\x54\xae\x8c\x0e\x97\x15\x17\x2b\x24\xa9\x9e\x32\
+\x48\xe6\x08\xda\x84\xad\x74\x51\x04\xc4\x4d\x97\x45\x75\x0c\xa0\
+\x1e\xf5\x24\x74\x63\x42\x27\x15\x2b\x40\xea\x88\x80\x16\xb7\x9d\
+\x85\xc5\x31\x62\x60\xe5\x54\x34\x92\x36\xef\xcc\xfb\x76\xa9\x0c\
+\x1a\x3c\xb2\x00\x50\xee\x0d\x54\xe3\x12\xcd\x87\x85\x30\xb8\x7c\
+\x59\x8d\x59\x73\x12\x45\xcd\x8d\x17\xae\xd2\xd4\x91\x88\x96\xf3\
+\xba\xc6\xbd\xcd\xef\x55\x66\xe2\x49\x1d\xd7\x0a\xa4\x9b\x7a\xdf\
+\x97\xb5\x50\x88\xb1\xf2\xac\xcc\xe3\xf0\xcc\x74\x6f\x63\xca\xad\
+\xe1\x38\x78\x95\x81\x93\x34\x00\x9d\x15\xac\x4b\x7b\x56\x76\xdf\
+\x0a\xb2\xe6\x91\xaf\x62\xce\x4e\xbc\xcd\x5e\xc3\x70\xc9\x99\x33\
+\x4a\xcb\x08\x23\x4c\xda\x93\xf2\xab\xf8\x68\xe2\xc3\x8c\x98\x68\
+\x80\x6e\x6e\xda\xb7\xf6\xae\x79\x61\x56\x39\xe5\x24\x8d\xca\xae\
+\x6b\x7c\xe9\x9c\x27\xd1\xaa\x91\xf0\x60\xe4\x01\x8c\x4b\x9d\x00\
+\xc8\x75\xaa\x33\x06\x8e\x46\x8d\xac\x72\x92\x2f\xd6\xb7\xf0\xcd\
+\x1e\x51\x88\x0d\x78\xd2\xec\x49\x16\xda\xb1\x1c\x78\xd2\xb1\x03\
+\xd6\xd7\x03\xde\x9e\x5c\x64\xf1\x4a\x77\x02\x84\xcb\x8d\x0c\x7d\
+\x11\xf9\x9e\xb7\x20\x8c\x04\x90\xa9\xd5\xa4\xd7\xb5\xa9\x38\x5c\
+\x32\xe1\x30\x8b\x11\xf5\xb6\xb2\x69\xf9\x55\xc4\x06\xf9\x94\x8b\
+\x91\x62\x1b\x66\xe9\xec\x6b\x7c\x78\xe4\xc6\x6d\x42\x92\x54\x16\
+\x3e\x66\x25\x9b\xb5\xff\x00\xd8\xa9\x06\x93\x01\xcf\x96\x55\x1e\
+\x52\xa3\xf4\xb5\x36\xb4\x04\x0d\x74\xa8\x26\x8f\x21\xb6\x61\xe9\
+\x6e\x86\x86\xf5\x20\xd2\x99\xec\x0a\xb1\x07\x71\x52\x4f\xfc\x4b\
+\x8d\x8f\x82\xb6\xfa\xd5\xae\x20\x83\xc3\x38\x83\xb2\x0f\x38\xeb\
+\x58\xf1\x4e\xff\x00\x6b\x38\x86\x42\x55\xae\x0e\x9a\x5a\xb1\x7a\
+\x6a\x2e\x8a\x35\xa1\x4c\xae\x99\xa3\x60\xcb\xfa\x51\x8e\x94\xa6\
+\x86\x0a\x6f\x16\x3c\xac\x46\x75\x1a\x77\x14\xda\xce\x81\xcc\x72\
+\x87\x07\x63\x5a\x4c\x3c\xda\x6c\x75\x15\xb9\x59\xa9\xa8\x22\xa4\
+\x6d\x5c\x69\x45\x95\x2a\x6e\xbf\x4f\xe2\xa6\xe5\xd3\x29\x73\x66\
+\xd8\xf4\x3d\x68\x88\xa0\x65\x20\xdd\x34\x3d\x3a\xd4\x95\xe3\x49\
+\x65\xc4\x2a\x4a\xbe\x55\x62\x49\xb6\xfa\xd4\x7f\x88\xd4\xb6\x06\
+\x39\x47\xc2\xf6\x3d\xaa\xcc\x57\x08\x01\xb8\xae\xc6\x28\x7c\x04\
+\x88\xcb\x71\xa1\xac\xe7\x49\x82\xf8\x49\x64\x8f\xed\x09\x18\x39\
+\xc7\xde\xa0\xdd\xba\x30\xef\x56\xb0\x91\x78\x18\x35\x8c\x9b\xb3\
+\x9c\xe7\xf6\xa6\x66\x21\x81\x5d\x2d\xa5\xab\xac\x02\x15\x1b\x29\
+\xba\xff\x00\xa4\xff\x00\xb3\x58\x93\x1a\xd7\x05\x0e\x8c\x8c\x6c\
+\x18\x5a\xfd\x2a\xa3\x62\x4c\x70\x18\x0a\xdc\xdb\x2a\x91\xef\x56\
+\x74\xcc\x09\xda\xd5\x2e\xb0\xbc\xaa\xcd\x18\x62\x39\xd5\x40\x97\
+\x3b\x46\xac\xc1\x41\x65\x04\xde\xa0\x82\x39\xaf\xbd\xa8\x9d\xff\
+\x00\x2e\x54\x05\xa9\x4e\x1a\x0b\x0b\xf7\x35\x28\x03\x5d\x18\x68\
+\xc2\xc6\x82\xfa\xd7\x4a\xe6\x38\x19\xc6\xe3\x41\xda\xf5\x27\x46\
+\x2d\x87\x41\xcc\x5c\x7e\x74\x13\xab\xf8\xab\x88\x8c\xdd\x90\x79\
+\xd7\xa8\xa6\x40\x19\xf0\xf1\x04\x17\x25\x2d\xa7\x5a\xb5\x86\xc2\
+\x28\x23\xc6\x24\x96\xd3\x28\x36\xb5\xea\xcd\x4a\x6e\x41\x01\x94\
+\xdd\x58\x5c\x50\xd5\xfc\x3a\xe1\x9e\x20\x82\x38\x83\x47\x71\x66\
+\x3c\xaf\x4a\xc4\xc3\x87\x22\xf0\xc8\xa5\xbf\x00\xd6\x9c\x5a\xab\
+\x4d\xc3\xca\x62\x7b\xee\xa7\x42\x3a\xd2\xb5\x04\x82\x2c\x6a\x77\
+\x34\x16\x9c\x46\xf1\xa9\x06\xe0\xec\x68\xef\x54\xb8\x7b\xb3\x46\
+\x50\x1f\x49\x24\x03\xd2\xad\x8a\xdc\xac\x98\x32\xba\xe5\x71\x71\
+\xf9\x8e\xe2\x97\x2c\xb2\xc5\x20\x49\xc9\x92\x36\xd5\x5f\x98\xf7\
+\xa2\x5a\x62\x3e\x53\x72\x74\x3a\x1a\x50\xa3\x7f\x28\x2b\xe6\x1e\
+\xf5\xd8\x88\xd7\x11\x1f\xf5\x0d\x8f\xec\x6a\xbe\x2c\xf8\x0c\xb3\
+\xc4\x72\x82\x6c\x40\xf4\x9a\x6e\x16\x5f\x19\x4b\x65\xca\xcb\xbd\
+\xb9\x8a\xb7\xe5\x0a\x48\xae\xd2\x05\x4f\x55\xf4\xab\xe2\x56\x5b\
+\x2e\x23\xca\xc7\x66\xf8\x5b\xe7\xd6\x95\x2c\x46\x2c\x40\xc4\x47\
+\x72\xb7\xf3\x2d\xef\x6a\x6b\x32\x11\x63\x62\x0e\xd7\xe7\x54\x98\
+\x85\x72\x06\x61\xb7\x51\x49\x90\xe4\x6c\xcb\xa2\xc8\x6c\x47\x2c\
+\xdd\x6a\x56\x24\x56\xcc\x85\x93\xfd\x26\xd4\xbc\x44\x02\x4d\x4c\
+\xd2\x5f\x95\xf5\x15\x5d\x43\x06\xf4\x2f\x42\x09\x03\x5f\x50\x16\
+\x36\xd9\xbb\xd4\x92\x0a\xdf\xad\x04\x04\xde\x81\x85\x11\xde\x85\
+\xa8\x41\x61\xa5\x25\xc6\xb4\xe6\x34\xa6\x35\x94\x4c\x82\x96\x69\
+\xce\x39\x52\xd8\x6b\x53\x40\x61\x42\x45\x19\xa1\xac\xa2\xe7\x42\
+\xf1\x66\x53\x69\x22\xd5\x4f\xed\x52\xb9\x65\x8d\x65\x5d\x2f\xbd\
+\xb9\x1a\x35\xd1\xae\x39\x52\x9e\x19\x52\x63\x26\x1e\x40\x81\x86\
+\xa0\x9d\x8d\x45\xd3\x12\x98\xac\x39\x20\x9c\xca\x41\x15\xd7\x63\
+\x7b\x0f\x9d\x32\x30\x14\x16\xbe\x79\x1b\xd4\xe7\xf4\x1d\xa8\x58\
+\x00\x2e\x36\xe9\x42\x2c\x29\x1b\xd5\x4f\xf1\x08\x6f\x16\x27\x03\
+\xca\x63\x02\xfe\xd5\x7c\xed\x4a\xe2\x31\x78\xbc\x3d\xf6\xcd\x17\
+\x98\x1e\xdc\xe8\xb3\xa5\xac\xfe\x0b\x1a\xcb\x8e\x51\x20\xb8\x00\
+\x9b\x56\xb3\xbf\x8a\x32\xc9\xe9\xf8\x6d\xf0\xfb\x56\x67\x04\x36\
+\xc7\x82\x7f\x09\xfd\x2a\xfa\x99\x5d\xc8\x81\x63\xc8\x86\xc5\x9f\
+\x99\xa3\x87\x8a\x8d\x56\x76\x19\x67\x99\x5a\x3f\xe9\xf5\x37\x63\
+\x4d\x57\xd3\x2e\x55\xc9\xf8\x6d\xa5\x0a\xa9\x63\x94\x80\xaf\xbe\
+\x50\x6e\x1b\xb8\x35\xda\x83\x62\x2d\x5b\x05\x71\x29\x46\x1f\x02\
+\xd8\x54\x56\x19\x9a\xe0\xf2\x2a\x75\xa5\xff\x00\x87\xe2\x0d\x88\
+\x69\x98\x5d\x62\x17\x00\xf3\x3c\xa9\x9c\x63\xcc\x72\x58\xe9\x11\
+\x00\xf2\xba\x9f\xe2\x8f\x81\x9f\xff\x00\x1d\x25\xbf\xf7\x47\xe9\
+\x47\xff\x00\x47\xe2\xf0\x39\xef\x7e\x74\xd8\x90\x0f\x88\xe9\xa9\
+\xa4\x47\x47\x88\x7c\x98\x29\x9b\x63\x96\xc0\xf7\x35\xb6\x04\xa5\
+\x40\x01\x54\x01\xca\xc2\x8a\x92\x9a\x0f\x2e\x9d\xb9\x1a\x60\x61\
+\x60\x7a\xd4\x85\x7a\x91\x40\x0d\xe8\x85\x49\xd3\x58\xe0\xe6\x56\
+\x1a\x3a\x65\xff\x00\x7f\x4a\xa2\x80\xc5\x12\x46\x0e\xca\x2f\xde\
+\xae\x62\xce\x5c\x04\xff\x00\x89\x92\xca\x3b\xd5\x18\x24\x12\xc4\
+\xac\xcc\xaa\xca\x2c\xe0\x9b\x5a\xab\xe9\x89\xca\xab\x8b\x81\x96\
+\xca\x5e\xf9\x80\xd8\xd3\x4e\xf4\x99\xd1\xe6\x64\x31\xb0\x44\x4d\
+\x9c\xf3\xee\x05\x1f\x88\x43\x85\x94\x7a\x8d\x84\x8b\xb1\xf7\xa2\
+\x13\x2b\x4f\x0c\xd9\xb0\xc8\xda\x6d\x63\x59\x7b\x1b\x1d\xc5\x5f\
+\xe1\xcc\x0e\x19\x97\x9a\x9b\xd6\xb8\xfa\x29\xe4\xd7\x03\x51\x5d\
+\x5b\x02\xae\x35\xc2\xba\xa4\x1a\x92\x33\x44\xeb\xd5\x48\xa9\x22\
+\xba\x2f\x58\x1d\x74\xa9\x32\x69\x8b\xa8\xf7\x4d\xbd\x8f\xf7\xa8\
+\x98\x65\x91\x97\xa1\x22\xa0\xb8\x46\x88\x9d\x03\x12\xa7\xe7\x5c\
+\xcb\x98\xe9\x60\x37\xae\xf4\x8b\x57\x35\xd5\x85\xc5\xb7\xa1\x26\
+\xf5\x24\x31\xae\xd0\x2b\x33\x1b\x2a\x8b\x9a\x93\x50\x50\x3c\x61\
+\x0e\xcc\xd7\x3e\xc0\x5f\xf8\xa8\x82\x19\xe1\x95\xb2\xa1\x60\x79\
+\x06\xe7\x57\x70\xf8\x4c\xe8\x7c\x6d\x10\xfc\x36\xd4\xd0\x43\x85\
+\x18\x84\x0e\x55\x54\x21\xf2\x5b\x4f\x95\x5b\xc3\xc8\xef\x9d\x25\
+\x5b\x3c\x7c\xfa\x8a\x64\xfe\x8b\x5d\x0c\x71\x61\x80\x48\x97\x2c\
+\x6f\xb1\x26\xe5\x5b\xdf\xbd\x17\xa5\xae\x46\xa0\xd4\x92\x2c\x41\
+\x17\x07\x71\xd6\xa2\xc4\x28\x55\x90\x10\x3f\x1a\xdf\x4e\x97\xde\
+\xb6\x19\xb8\xf8\x72\x62\x2c\xb7\x21\xc5\xc5\x0e\x59\xb0\xd2\xab\
+\xb2\x15\x23\x51\x71\x57\xd2\x39\x3c\x7f\x1a\x56\x4b\x80\x42\x2a\
+\xeb\x6a\x31\x7b\x65\x36\x20\xee\x0e\xd5\x9c\x3a\xcb\xc5\xe2\x13\
+\xc4\x0e\xf1\x39\x32\x0b\xf9\x0d\xea\x22\x78\xe5\x04\xc6\x4e\x61\
+\xba\xb0\xd4\x53\xf8\xb8\x5c\x2c\xb0\xcf\x1a\xdd\x42\x90\xca\x0e\
+\xab\x7a\xcd\x77\x93\x11\x8e\x0f\x87\x52\xad\x6e\x7f\xa9\xac\x5b\
+\x94\xc5\xfc\x1b\x14\xc4\xa9\x02\xe0\x9b\x69\x57\xa3\xf1\x33\x9b\
+\xdc\x0e\xf5\x47\x0e\x59\x5d\x5a\x50\x8d\x62\x09\x68\xf9\x7c\xab\
+\x51\xc7\x98\x90\x41\x5b\xe8\x45\x6f\x88\xa1\x19\xba\x8f\xa5\x12\
+\xb6\xe0\x8a\x8a\xe5\xf5\x8f\x7a\xd0\x06\x28\x2c\xa5\x70\xcb\xa1\
+\xbd\xd8\x81\xb5\x33\x0f\x14\x31\xae\x58\xc3\x2b\x1d\xc9\x35\x53\
+\x0d\x37\x87\x8d\x71\x29\x23\x35\xc1\x35\x70\xd8\xe8\x75\xf6\x34\
+\x4f\xea\x10\x72\x0d\x8e\xff\x00\xad\x0e\x89\xa0\x07\xc3\xfa\xe4\
+\xfe\xd4\x19\x6e\xc7\x33\x1d\x0e\x95\x20\x10\x74\x66\xa5\x08\xf9\
+\x40\x20\xdd\x08\xd0\x8d\xa8\x58\xd0\xc8\x59\x15\x98\x05\x2a\x7d\
+\x63\xf7\x15\xce\x6c\x05\x8d\xc1\xd8\xf5\xa9\x21\xbd\x54\x27\x7f\
+\x7a\xe6\x3a\x7b\xd0\xb1\x36\xd3\x71\x59\x4e\x34\x2d\x44\x35\x17\
+\x1b\x50\xbd\x15\x16\xc7\x7a\x07\xda\x88\xef\x40\xf4\x20\x9a\x17\
+\xa2\xa1\x6a\x9a\x03\x0a\x13\x47\x42\x45\x15\x06\xd5\xc4\x03\xa5\
+\x49\xd0\x57\x0c\xdd\x85\x08\x20\x11\xa0\xd4\x54\x10\x49\xd6\xd6\
+\xa9\x62\x46\xeb\xf4\xa3\x58\x99\x97\x35\xac\xb6\xf5\x1d\x05\x48\
+\xa5\x60\xd5\x18\x86\x58\xb0\x92\xbb\x91\xe6\x52\xaa\x0f\x33\x4a\
+\xc4\x62\x20\xc3\x7c\x42\x57\xe4\x14\xe9\xf5\xaa\x38\xa9\xe7\xc5\
+\x38\x0e\x6f\xaf\x95\x40\xd2\xb3\x79\x61\xc1\xf0\x78\xd9\xf1\x7a\
+\x72\x46\xb9\xe9\xa5\x68\xc2\x99\x21\x64\xb5\x8a\xc9\xaf\x7b\xed\
+\x43\x81\x80\xe1\x70\xc5\x5a\xde\x24\x9e\xa1\xd0\x53\x88\x62\x33\
+\xa2\xe6\x60\x2c\xcb\xf8\x87\xf2\x29\xe3\x32\x2b\x43\xe5\x65\xc8\
+\xe2\xeb\x7f\x98\xf6\xa9\x80\x3b\x19\x22\x63\x9a\x48\x9a\xda\x6e\
+\x45\x28\xca\x89\xe6\x6c\xe0\x77\x4b\x52\x10\xc9\x89\xc7\xb1\x52\
+\x63\xce\x6e\x48\x3b\x0a\xb5\x62\xdf\x12\x2a\x20\x45\x76\xca\xea\
+\x49\x23\xaa\xda\xc6\xff\x00\x2d\x7e\x55\x5f\x81\x4e\x23\x99\xb0\
+\xf2\x1b\x24\x9a\x7b\x1e\x55\x6e\x18\xa0\x89\x83\x14\xce\x79\xb3\
+\x9d\x4d\x63\x71\xbc\x46\x27\x09\xc5\xa5\x82\x19\x59\x62\x43\x74\
+\x17\xe5\xca\x8e\x5d\x76\xa7\xf1\xbc\x64\xcb\x70\x07\x9a\xfc\xc6\
+\xd4\x67\x58\xd5\x5c\x96\x56\x7b\x9b\x74\x03\x5f\xda\xab\xae\x35\
+\x25\x8e\x27\x92\x36\x66\x96\x30\xc0\x82\x2f\xd3\x5f\xa5\x58\x52\
+\xe0\x16\x75\xc8\x58\x65\x55\xe6\xa3\xbd\x74\x96\x56\x52\xba\x0a\
+\xeb\xdb\x6d\xb9\x8a\x59\x6b\x30\x1c\x88\xa9\x27\x43\x52\xc3\x97\
+\xda\x8a\xe1\x53\x33\x9b\x2f\x7a\xab\x2c\xa2\x30\x19\xda\xec\x46\
+\x8b\xfc\xd5\x77\x9a\x49\x48\x32\x1d\x46\x80\x0d\x80\xa3\x62\xc3\
+\xa6\x99\xa5\x92\xe3\x45\x1b\x0e\x94\x24\x86\x3e\x75\x56\x3d\xc5\
+\x2c\x1a\x2b\xd1\xa4\x45\xae\x75\xa0\xc6\x10\x30\x4f\x7e\xa2\xde\
+\xf4\x57\x19\x80\xe6\x6a\x9f\x13\xc4\x23\x48\xb0\xa9\x39\x57\x9f\
+\x22\x6a\xb7\xa5\x17\x60\x72\xf8\x68\xdd\x8d\xc9\x1a\x9a\xbb\xc2\
+\x5b\xef\x99\x09\xf5\x2e\xdd\x4d\x64\xf0\xb7\xf2\x3c\x6c\x74\x1a\
+\x8b\x9a\xb9\x0c\x85\x5c\x3a\x5e\xe3\x9e\xd5\xae\x35\x56\xbe\xbc\
+\xaa\x6c\x29\x65\x54\xd9\x94\xe8\xc2\xe0\xde\x89\x43\x03\x7c\xd5\
+\xd1\x91\x8a\x9a\x81\xa8\xb8\xa9\xa9\x22\xbb\xbd\x71\xae\xa9\x28\
+\xf1\x24\xcb\x89\x2d\xc9\xf5\x15\x5d\xd1\x64\x88\xc6\xe6\xc0\xea\
+\x0f\x43\x5a\x18\xf4\xcf\x86\xcc\x37\x8f\x5f\x95\x67\xd6\x39\x4e\
+\xcc\x20\x26\x36\x26\xf2\xdd\xd5\x76\xd6\xe0\xd3\xc3\x23\xb9\x0a\
+\x0a\xb8\xdd\x1b\x7a\xe3\xa8\xf9\xd0\x63\x43\x18\x44\xab\xeb\x8d\
+\xb7\xea\x2b\x3e\x11\xda\xf4\xd8\x21\x69\x65\x65\x03\x45\xb2\xdf\
+\xa7\x33\xfb\x7d\x2a\x93\x62\xe7\xd1\x44\x4a\x19\xb4\x0d\x6a\xd9\
+\xe1\xd1\x78\x58\x04\x51\xab\x90\x4b\x9d\xf5\xa7\x8f\x74\x51\x80\
+\xaa\xa1\x14\x59\x57\x6a\xed\x06\x20\x72\x2f\x1f\xd6\xc6\xa4\x82\
+\x37\x04\x50\x49\xa6\x2b\x0c\x7b\x91\x5d\x00\x8e\xd4\x35\x26\xd6\
+\x24\x9b\x00\x2e\x4f\x4a\xa3\x89\xe2\x45\x5e\xd0\x22\x65\x1f\x13\
+\x0b\x93\x45\xb2\x25\xda\xe1\xa9\xb5\x56\xe1\xf8\xdf\xb4\x4a\x21\
+\x95\x50\x33\x7a\x59\x45\xb5\xe9\x6a\xb2\x18\x28\x2e\x4d\x82\x82\
+\x6f\x54\xb2\xa5\x0e\x34\x7c\x44\x9d\x41\x16\x4b\x58\xf5\x02\x93\
+\x1c\x6b\x04\x62\x34\xdc\x80\x59\xb9\x9a\x94\x39\x99\xcb\x5a\xc5\
+\x49\x6b\xed\x40\xaf\xe2\x43\x1c\x82\xc7\x32\xeb\x6e\xda\x56\x3e\
+\xeb\x46\x43\xa4\xab\xee\x2b\x46\x42\xb0\xe2\x80\xd5\x63\x92\xe0\
+\xf4\x06\xa8\x60\x54\x3e\x32\x35\x61\x70\x5a\xaf\xe2\x54\xc9\x87\
+\x71\xf1\x0f\x30\xd2\xb5\x3c\x14\x6c\x08\x36\x3c\xab\x85\xb5\x63\
+\xb2\x8b\x9a\xa7\x1e\x2e\x61\x95\x06\x56\x3b\x00\x56\xe6\x9b\x8a\
+\x13\xb4\x2a\xc5\x95\x90\x1b\xba\xa0\xb5\xbd\xe9\xd0\x08\xf0\xc6\
+\x60\x66\x95\xca\x97\x24\x81\x6a\xb6\x00\x3e\x5b\x82\xca\x35\xbe\
+\xf5\xce\x41\x20\x8f\x49\x1e\x5f\x6a\x16\x8d\x1e\x65\x94\xb3\x06\
+\x51\x6f\x2f\x3a\xb1\x05\x1a\xc4\x8b\x12\x29\x9b\xeb\x41\x89\xb7\
+\xa8\x69\x73\xad\x44\x4c\x72\xdb\x29\x20\x73\x15\x21\x5e\xc6\x84\
+\x00\xb9\xd1\x76\x04\x38\x16\xd8\x1a\x92\x45\xed\x7d\x68\x26\x57\
+\x62\xad\x1b\x5a\x44\xd0\x03\xb3\x0e\x95\x54\x82\x68\x49\xa5\x7d\
+\xad\x09\x2a\xf0\xb0\x6b\xec\xa6\x8f\xc4\x87\xf1\x38\xee\xc8\x40\
+\x15\x9d\x43\x24\x8b\xb5\xc1\x52\x06\x9d\x08\xff\x00\xcd\x09\x52\
+\x76\xd6\x85\xf1\x18\x74\xff\x00\x98\x58\x8e\x40\x68\x7e\x75\x4a\
+\x58\xf1\x0e\xc6\x61\xa6\x6d\x40\x07\x51\x55\xa7\x16\xa4\xb2\x30\
+\x56\x04\xb3\x6c\xa3\x7a\x16\x23\x36\x42\xa5\x09\xf4\xdc\xdc\x37\
+\xce\xab\x0c\x54\x58\x58\x8e\x70\x5e\x56\xe5\x7f\xd6\xb9\x38\x84\
+\x33\x44\xe9\x24\x45\x34\x26\xe0\xdc\x0a\xce\xac\x3c\x8b\x1b\x1a\
+\x83\x41\x0c\xa1\x80\x49\x18\x6b\xe8\x93\x93\x0a\x36\x04\x0b\xee\
+\x3b\x6b\x49\x06\x80\x16\x3b\x28\xb9\xaa\xd8\x7c\x53\xc9\x89\xc9\
+\x27\xa1\xcd\x80\xfc\x35\x65\xf2\xb4\x4e\xa4\xd8\x32\x91\x7e\x95\
+\x99\x2e\x1e\x78\x4e\x7f\x84\x1f\x50\x3a\x56\x79\x69\x8d\x09\x06\
+\x51\xdc\x1a\xe1\x72\x2e\x45\xa9\x31\xe3\x22\x68\xc3\x4a\xcd\x9c\
+\x0b\x1b\x0d\xe9\xb0\x49\x2c\xaa\x1d\x63\x8e\x38\xfa\xb6\xa5\xa9\
+\xd0\x0c\x7c\xc7\x0d\x84\x56\x50\x0b\xbb\x58\x5f\x5b\x0a\xc9\x96\
+\x59\x24\xbe\x77\x2d\x7d\xee\x6b\x5b\x89\x2b\xbe\x04\x93\x87\x8d\
+\xb2\x38\xb5\xa4\xeb\xde\xb2\x64\x31\x89\x04\x72\x2b\x42\xcd\xe9\
+\xb9\xba\x9f\x9d\x73\xe7\xe9\x85\xac\x2d\x2c\x81\x62\x42\x49\xe5\
+\x5b\x38\x2c\x32\x61\x63\x1b\x3c\xbc\xd8\x8d\xbd\xa9\x7c\x16\x33\
+\x16\x1e\x49\x34\xcc\x5b\x28\xed\x4f\x7b\x8d\x47\x3a\x78\xcc\xed\
+\x54\x9d\xf5\x3a\x9a\x9f\x6a\xe5\x51\x6d\x45\xfb\xd7\x59\xbb\x56\
+\xc0\x96\x47\x3e\x5d\x5a\xdc\x9b\x51\x55\xe7\x88\x41\x8f\x8d\x97\
+\x28\x0f\x6b\xad\xce\x9d\x45\x3e\x30\x55\xee\x0d\xef\xbf\xf3\x54\
+\x4a\x48\xb8\xc0\xa4\x33\x30\x6d\xba\xd1\x4c\x5f\x58\x4a\xcd\x96\
+\xf7\x0a\x4d\xcf\x40\x2b\x17\x8d\x83\x8f\xe3\xea\xb1\x82\x04\x81\
+\x7e\x55\xa3\xc5\x78\xb6\x0e\x0c\xf0\xa5\xe4\x91\xbf\xcc\x03\x61\
+\xda\xaa\xe1\x63\x68\x10\xe2\x26\x00\x62\x27\xd4\x0b\xea\x8a\x6b\
+\x3c\xb2\xf4\xa2\xfe\x04\xab\x63\xce\x50\x32\xa4\x64\x2e\x9d\x06\
+\xf5\x64\x58\xef\x54\x78\x41\xff\x00\x89\x6f\xfe\x36\xfd\x2a\xe0\
+\x35\xae\x3e\x0a\x00\x33\x35\xce\xc3\x6e\xf4\x5e\x55\x46\x76\x1e\
+\x55\x17\xb7\x53\x45\x90\xa9\x0a\x75\x3f\xad\x56\xe2\x32\x02\xc2\
+\x25\x20\x85\xde\xdc\xcd\x37\xa4\x44\xae\xd2\x39\x66\x37\x26\xb8\
+\x54\x0a\x90\x2b\x0d\x0d\x4d\xa9\x80\xd2\x41\xb5\x4e\x6a\x74\x60\
+\xb1\x12\x98\x85\x94\x5d\xdc\x59\x47\xef\x54\x1b\x09\x89\x92\x75\
+\x41\x13\x0d\x37\x23\x41\x57\xdc\xf9\xe6\x6b\xf9\xae\x32\xf5\x0b\
+\x6d\x28\x92\x46\x0b\x94\xb1\xef\xad\x16\x6a\xd0\x88\xca\x20\x45\
+\x4d\xb7\x6e\xb4\xf0\x75\xa0\x0d\x44\x0d\x6e\x05\xac\x1e\x27\xc3\
+\x19\x1c\x5d\x39\x5b\x71\x5a\x09\x62\xb9\x94\xdd\x7a\xd6\x3a\xd3\
+\x60\x95\xe2\x37\x46\x23\xb5\x6a\x51\x8d\x45\xd3\xdb\xf4\xa2\x1b\
+\x8a\x46\x1f\x15\x1c\x9a\x3f\x91\xbf\x23\x4e\x22\xde\xd5\xb8\x04\
+\x45\xe8\x48\xa2\x5d\xaa\x6d\x7a\x40\x2d\x7d\x0e\xaa\x74\x22\xb3\
+\x71\x31\x18\xa5\x2b\xcb\x91\xeb\x5a\x85\x74\xa0\x91\x12\x44\xcb\
+\x20\xb8\xe5\xd4\x56\x6c\xd3\x2b\x2f\x99\xed\x52\x85\xaf\x65\xd4\
+\x9a\xb8\xd8\x38\x80\xb8\x77\xbd\xf4\xd2\x9d\x1c\x51\x45\xe8\x5d\
+\x7f\x11\xde\x8f\xcd\x3a\xa7\x88\x85\xd2\x14\x91\xf5\x60\x79\xfc\
+\x34\xcc\x2c\x4e\x22\x25\xdd\x95\x5b\x65\x06\xd7\xa7\xcc\x03\x64\
+\x8d\xbe\x23\x98\x8e\xc2\x86\x47\x24\xf7\xab\x02\x02\x5b\x44\x96\
+\x45\xf9\xde\x97\x1c\x32\x7d\xa5\x64\x92\x5c\xc1\x75\xbf\x3a\x2c\
+\xda\x5c\x9a\x25\x34\xa2\xf8\xab\x95\xc0\x1b\x7f\xcc\x6b\x56\x39\
+\x17\xda\xb6\xb1\xe9\xe2\xe0\x1d\x46\xe9\xe7\x15\x8c\x6b\x1c\xfd\
+\x31\x38\x42\xcb\x8a\x8d\x94\x90\x43\x8d\x6b\x6b\x88\x9c\xb0\xcd\
+\x61\xb9\xcb\xf9\xd6\x18\x62\x08\x23\x71\x5b\x78\xe1\x9f\x08\xc4\
+\x10\x6e\xaa\xd7\xbe\xfa\x6b\xf9\xd5\xc7\xca\xaf\xac\xb2\x85\xe0\
+\x96\x30\x45\xd9\x0d\xbf\x5f\xda\x87\x0e\x99\x70\x71\x03\xcc\x16\
+\x16\xe8\x69\xd1\x30\x52\x58\xe8\xa1\x4d\xc9\xe5\xa5\x09\x37\xca\
+\xb6\xb1\x08\x05\xbe\x55\x13\x78\x71\xb6\x36\x22\xd6\xdf\x7a\xd2\
+\xbe\x53\x73\xcb\x7a\xc9\x43\x96\x45\x27\x91\xb9\xad\x49\x08\x63\
+\x9b\x93\x6b\x5a\xe2\x2a\xa3\xdb\x0d\x8f\x59\x00\x39\x0b\x66\x1e\
+\xd5\x61\xb1\x10\xa4\x6c\x43\x86\x26\xf6\x51\xce\xf4\x18\xb4\xcd\
+\x11\x1b\x91\xaa\xf5\x15\x45\x2d\x9d\x73\x6d\x7e\x74\x78\x9a\x58\
+\x5c\xdf\x64\x8f\x36\xfa\xdb\xda\x8a\xe6\xf6\x16\xbf\x7e\x54\x33\
+\x92\x24\xb2\xb5\x94\xed\xd8\x57\x0b\x28\xb0\xf9\xd6\x82\x58\x66\
+\xf5\x12\x7d\xb4\xa9\x16\x0b\x61\x43\x9a\xa4\x1b\xd4\x9c\xe7\x63\
+\xd0\xd0\xb0\x37\xbd\x49\x60\x7c\xa3\x73\xa5\x11\xb0\x1a\x9b\x7b\
+\xd4\x80\x59\xaf\x7d\x01\xeb\x6d\x7e\xb5\x05\xd8\x0f\x33\x5c\x73\
+\x07\x51\x52\x59\x3a\x8e\xe7\x61\x49\x9f\x11\x85\x45\x39\xde\x4d\
+\xb4\xfb\xb2\x2f\xf3\xa1\x2a\x71\x18\xd5\x66\x53\x10\xb8\x93\x60\
+\x39\x1a\x64\xb8\x94\x8a\x20\xcb\xe6\x90\x2d\x89\xbf\x95\x2c\x39\
+\x9a\xab\x89\xc6\x99\x2f\x1a\xa6\x44\xe5\x66\xd4\xfc\xeb\x37\x1d\
+\x02\x2a\xc7\xe1\x33\x2a\xc8\xd6\x2a\x5a\xff\x00\x3a\xe7\x79\x67\
+\x8d\x48\x63\xa9\x99\xcb\xa4\x89\x2b\x1d\xf2\x9b\xd0\xba\xb4\x78\
+\x69\x8b\xa9\x19\x93\x28\xb8\xb5\xc9\xa3\xc9\x0c\x0f\x91\x20\x43\
+\x94\xd8\xb1\xbd\xcd\x41\x2a\xba\xac\x44\x13\xb1\x72\x5b\xe9\x7a\
+\xcb\x48\xe1\xe2\x4c\x3c\x19\x27\x70\x50\x9b\x15\xdc\xa5\xf6\x35\
+\x77\xc3\xc4\x61\xe3\xf1\x95\xac\x2f\x6b\x75\xaa\x31\x0f\x10\xbc\
+\x6d\x7f\x3a\x9b\x9b\xfc\xe9\xff\x00\xe1\xe9\xc6\x30\x0c\x3c\xcd\
+\xe6\x88\x5d\x6e\x7d\x42\xa9\xfc\x15\x78\xd9\x91\x58\x8b\x07\x50\
+\x48\xe9\x42\x9e\x47\x22\xe3\x5e\xb4\xd9\x83\x03\x66\x16\x3d\x29\
+\x6c\x9d\xf5\xae\x81\x5e\x7c\x28\x7c\x75\x94\x05\x52\xa1\x9b\xb5\
+\x58\x36\xb0\x55\x16\x55\x16\x15\x28\xa0\x48\x0d\xcd\xda\x36\xbf\
+\xc8\x8b\x7e\xf5\xce\xcb\x04\x46\x69\x6c\x00\xf4\x83\xf1\x1a\x27\
+\x49\x5b\x8c\xb8\x8f\x06\x20\xbf\x9a\x43\x98\x8e\xd5\x9b\x2c\x26\
+\x60\x98\x7b\xfa\x48\x77\x62\x3d\x3d\x05\x14\xaf\x26\x27\x11\x99\
+\xdb\xcc\xc6\xde\xd5\xab\x81\x81\x53\x0e\x31\x0e\xbe\x77\x76\x65\
+\x53\xf9\x13\xf2\xae\x7f\xed\x4f\x82\x0a\x23\x88\x26\x97\x3e\x66\
+\xb5\x75\xaf\x44\x41\x2d\x73\xa9\x34\x4a\x2d\xef\x5d\x70\x01\x12\
+\xc6\xf7\xd3\xa5\x11\x14\x56\xae\xa9\x04\x21\x24\x00\x09\x27\xa5\
+\x54\xe3\x73\x5b\x0c\xeb\x86\x65\x33\xc6\x9f\x78\xc3\x9a\xf4\x1e\
+\xd5\x67\x1f\x2b\x41\x81\x2c\x9a\x34\x8d\x92\xfd\x05\xab\x37\x05\
+\x1f\x8d\x21\x42\x33\x07\xd1\x87\x51\xbf\xec\x07\xce\xb3\xca\xfc\
+\x30\x8f\xf0\xde\x03\xc5\xc5\x7d\xa7\x14\xb6\x46\x6f\x28\x27\x57\
+\x35\xb4\xf1\x45\x33\xf9\xb0\xeb\x72\x7e\x0d\x0d\x09\xc2\xb7\x88\
+\xae\x31\x08\x85\x3d\x2a\xaa\x6c\xbd\xab\xa6\x4c\x63\xbe\x51\x2a\
+\x88\xce\xec\xa2\xc2\x8e\x33\xf3\x33\x15\xba\xad\x12\x18\xf8\xa0\
+\x8e\x27\x06\xcf\x60\x6a\xe3\x6a\xc7\x2e\xd7\xd2\x97\x1e\x12\x34\
+\x90\x3c\x53\xb2\xba\x9b\xdd\xd7\x4f\xca\x98\xd2\xb4\x6c\x7c\x40\
+\x8e\x83\x76\x45\xca\x57\xe5\x4c\xe8\x16\x71\x1e\x1e\x0d\x2d\x6f\
+\x13\x2d\x87\x61\xfc\xd5\x46\x94\xa6\x2e\x38\x40\x41\x9c\x02\xcc\
+\xc2\xfb\xd5\x63\xc4\x30\xb8\x62\x13\x19\x88\x46\x3b\xd9\x63\x24\
+\x8d\x7a\xd0\xe3\xf1\xb8\x39\x22\x47\x11\x4a\x1d\x96\xe1\xae\x34\
+\x1c\x85\x66\xf2\xff\x00\xad\x62\xfc\x8c\x06\x29\x60\x70\x2e\xe2\
+\xea\x42\x80\x54\xf7\xa0\xbd\x67\xe0\xb1\xf8\x48\xdb\x34\x89\x2b\
+\x39\xd0\x35\xc6\x95\x64\x62\xb8\x7b\x35\x97\x18\xc2\xfb\x66\x8c\
+\x80\x3d\xcd\x13\x94\xa8\xeb\xd7\x5e\x83\x36\x1f\xff\x00\xe7\x61\
+\xbf\xef\xfe\xd4\x48\x82\x40\x7c\x19\xe2\x97\x5d\x91\xbf\x9a\x50\
+\xc3\x31\x65\xcb\x6c\xc0\x11\xae\xcc\x3a\x54\xab\x44\xf6\x2b\x2a\
+\xad\xfe\x16\xdc\x52\xb5\x56\x01\xb4\x20\xd3\x16\x57\x1a\x83\xaf\
+\x5b\x6b\xf5\xa8\x05\xf1\x29\x19\xb2\xc3\x23\x0e\x6c\x45\x85\x58\
+\x56\x0c\xa1\xd0\x92\xad\xb1\xa5\x09\x5f\xf1\x93\xf3\xa9\x8e\xc0\
+\xdd\x0e\x42\x4e\xb6\xd5\x4f\xb8\xa6\x2a\x78\x34\x6a\x69\x2a\x7c\
+\xd9\x48\xca\xc7\x61\x7b\x86\xf6\x34\x52\xc8\x21\x8f\x3c\x8a\xc7\
+\x5b\x58\x69\x5a\xd0\x70\x37\xab\x38\x4c\x51\x8c\x64\x71\x99\x7d\
+\xf5\x15\x4e\x09\x23\x99\x43\x44\xc2\xfc\xd5\x8e\xa2\x9b\x91\xaf\
+\xcb\x5e\x57\xa6\x54\xd4\x56\x05\x43\xa1\xba\x9a\x35\x70\x45\x67\
+\x60\x24\x29\x88\x08\x76\x6d\x08\xab\xbb\x1b\x8a\xdc\xac\xd8\x63\
+\x1d\x28\x76\xa8\x56\xbd\x71\x34\xa0\xb9\x6c\xe0\x1f\x4d\xea\x24\
+\x9a\x14\x62\xae\xe7\x30\xdc\x01\x45\x7b\x29\xbf\x4a\xce\xc2\xc6\
+\x65\x66\x67\xf3\x2a\xeb\x6e\x67\xde\x8b\x52\xea\x31\x75\x32\x95\
+\xb1\x7b\x65\xec\x05\x2d\x8d\xc9\x00\xd4\xa1\x24\x90\x4f\xf6\xa0\
+\xcc\x10\x1b\xee\x0d\x15\x25\x88\x28\x00\x3b\xd1\x03\xad\x21\x49\
+\xce\x0f\x7a\x60\x27\xa5\x11\x2c\x42\xc2\xfa\xec\x74\x3e\xc6\xb1\
+\x31\x89\xe1\x62\x5e\x3f\xc2\x48\xad\x68\xc9\x3e\xe4\xda\xb2\xf8\
+\xc3\x2b\x71\x19\x8a\x9b\x8c\xd4\x72\xf0\xf1\xf5\x5e\xf5\x73\x07\
+\xc4\x0c\x71\x78\x32\xa0\x74\xd8\x1e\x6a\x2a\x8d\xcd\x1e\x1f\x0f\
+\x34\xe6\xd1\xa5\xc7\x53\xb0\xac\x4b\x67\x8d\x55\x9c\xd0\xb3\x08\
+\xcb\xe4\xcb\x62\xca\xfa\x66\x27\x61\x7e\x95\x0e\xcc\x65\x21\xd4\
+\x8b\xeb\x73\xce\x87\x89\x70\xb7\x91\x51\xc4\xd1\x99\x32\x65\x65\
+\x23\x47\xb6\xc2\xfc\xa9\x38\x61\xc4\x70\xa9\x67\xc2\x46\xd1\x74\
+\x12\xde\xfe\xd7\xa7\x6e\xf6\x16\x01\xab\xfc\x3e\x6c\xf1\xf8\x2d\
+\x6b\xaf\xa3\xbf\x6a\xce\x8f\x11\x85\x90\xd9\xcb\xe1\xdf\xa3\xa9\
+\xb5\x19\x93\x0c\x84\x13\x8c\x86\xfc\x80\x7b\x7e\xb6\xad\x4a\x9a\
+\xc0\xd8\x82\x37\x06\x96\xf8\x6c\x33\x36\x6c\xac\xb7\x37\x21\x4e\
+\x87\xf8\xa4\x47\xc4\xb0\xf2\x58\x11\x63\xd4\x87\xf3\x7b\x1b\x5a\
+\x8f\xed\x98\x5b\x5e\xed\xed\x63\x7f\xa5\xab\x5b\x19\xca\x73\xaa\
+\x93\xd3\x4b\x6f\x51\xcb\xb8\xa5\x2e\x26\x16\xbd\x96\x40\x06\xec\
+\x08\x36\xa1\x97\x13\x02\x59\xbc\x4c\xf7\xdc\x2e\xf5\x6c\x47\x0a\
+\x25\x22\x90\xb3\xc6\xe2\xe8\x49\x1c\xef\xb8\xa3\x92\x68\x61\x8b\
+\xc4\x95\xec\x0e\xca\x06\xa6\xad\x46\xb1\x5f\x9f\x6a\x8b\x80\x6f\
+\xcf\xa9\xac\xe9\xb8\xab\xe6\xfb\x98\xa3\x55\xfe\xa1\x72\x6b\x93\
+\x8a\x3d\x8f\x89\x04\x6f\xd2\xde\x5f\xd2\x8f\xd4\x39\x57\xa5\x62\
+\xaf\x98\x12\x3b\x8a\x57\x15\x7f\x17\x86\xc8\x49\xb9\x0e\xb9\x6f\
+\xb8\xaa\xe7\x89\x86\x5b\x7d\x95\x07\xfd\x66\x93\x8a\x9e\x4c\x51\
+\x16\x50\xaa\xa3\xd2\x0e\x9e\xf4\x5e\x53\xe2\x92\xaa\x85\x2c\x40\
+\x1b\xdc\x55\x9c\x16\x08\xe2\xe4\x13\xb0\x0b\x1c\x77\x11\xe6\x1a\
+\x7b\xf7\xa8\xc2\x44\xcf\x32\xf8\x56\x77\xbe\x83\x5b\x03\xdc\xed\
+\x5a\xcf\x00\x8e\x34\x89\x1a\xe2\x35\x03\xdc\xf3\x35\x9e\x3c\x74\
+\xda\x4a\x43\x87\x87\x58\xe2\x52\xc3\xe3\x71\x72\x6b\x9a\x42\x56\
+\xed\x1a\xb2\x5b\x62\xa2\x89\xa3\x76\xdc\xfd\x68\x5a\x0d\x34\x6a\
+\xdb\x2c\xfc\x7e\x13\xec\xee\x31\x10\x8c\xd1\x13\xa8\xfc\x3d\xab\
+\x23\xec\xf3\x41\xc4\x55\xa1\x52\x54\xb5\xd5\x80\xe5\x5e\x9d\x15\
+\xd4\xda\xde\x52\x3c\xc1\xb6\x34\xac\x46\x02\x27\xb9\x86\x66\x86\
+\xff\x00\x0e\xb9\x6b\x1c\xb8\x6f\x8d\x4e\x4c\xd6\xc6\xe2\x61\x93\
+\x2a\x38\x65\x04\x80\x18\x66\x00\x51\xe2\x78\xba\x43\x87\x0e\xf8\
+\x54\x66\x7f\x48\x0c\x45\xfb\xd5\x96\xe1\x98\x60\xb6\x33\x4a\x48\
+\xd6\xe1\x45\xa9\x27\x85\xc5\x36\x30\x93\x3a\xe5\x85\x00\x0a\xea\
+\x4d\x8f\x5f\xad\x59\xc9\x6c\x26\x2e\x29\x24\x90\x1c\x40\x82\x38\
+\xcb\x9c\xaa\x2e\x58\x58\x55\x77\x79\x31\x58\x90\x65\x62\xd9\x88\
+\xf9\x55\xfc\x47\x0f\xf0\xd0\x49\xf6\x88\x88\x26\xcd\xf7\x66\xdd\
+\xb4\xe4\x7b\xd4\xe0\x61\xc8\x59\xe0\x88\xc8\xdc\x98\x0d\x17\xeb\
+\x46\x5f\x29\xd8\x8c\x06\x10\x78\x4c\xf2\xbe\x53\xb0\x55\xf8\x3f\
+\xbd\x59\xb0\x0a\x15\x6f\x65\x16\xd6\x8e\x08\x7c\x28\x8a\x12\x0b\
+\x33\x5d\x88\xda\x88\xad\x6a\x4c\x66\xd2\x80\xa9\x02\x8e\xd5\xda\
+\x52\xb4\x36\xee\x2a\x00\xd6\x8c\x81\x5c\x05\x43\x55\xb8\xc2\x16\
+\xe1\xaa\x40\xf4\x49\x73\xf3\x15\x4b\x84\x3a\xc7\x8c\x57\x7f\x40\
+\x23\x31\xb6\xdc\xbf\x5b\x56\x9c\xf2\xc5\x10\x31\x3a\x97\x2e\x2c\
+\xca\x0e\xd5\x56\x6e\x1b\x30\xb1\x8c\x2b\x20\x20\xf8\x69\xea\x3d\
+\x2f\x59\xb3\xbd\x6a\x78\xb5\x20\x21\xf2\x8d\xaf\xa3\x6e\x0f\xb5\
+\x09\x17\xde\xe6\xb3\x44\xb8\xcc\x2c\x8c\x4a\xba\xdc\xea\xac\x34\
+\x26\xad\xc5\xc4\x70\xf2\x1f\xbd\x8d\xa3\x3d\x57\x51\xf4\xa6\x72\
+\x8b\x0e\x39\x86\xda\xfb\xf2\xae\xd3\x0f\x19\x92\x43\x61\x63\xbf\
+\xc5\xda\xa7\xc6\xc3\x88\x5a\x54\xc4\x26\xd6\x01\xae\x0d\xea\xa6\
+\x27\xec\xeb\x08\x92\x4c\x6a\x34\xcc\x2e\x11\x8f\x3a\xad\x4a\x32\
+\xf0\xfc\x1c\xb3\x45\x23\x46\xf2\x85\x16\x32\x33\xd8\xad\xba\x8e\
+\x74\xc9\xdb\x0e\xcf\x98\x60\xa0\x37\x3a\x0c\xa6\xf6\xfa\xd0\x1b\
+\xf2\xb1\xf9\xd0\xb6\xe7\xb5\x85\x73\x68\x77\xc3\x5b\x5c\x0e\x1c\
+\x7f\xd1\xfd\xe9\x72\x61\xb8\x74\xb7\xfb\xb7\x89\x89\xff\x00\x96\
+\xd7\xfc\x8d\x75\x45\x81\x7c\xdd\x3f\x3a\x2e\x22\xcf\x0b\x81\x89\
+\x30\xe3\x2d\xa6\x8b\x22\x9b\xfd\x76\xaa\x78\xac\x3e\x27\x07\x20\
+\x12\x29\x53\xf0\xb0\x3a\x1f\x63\x5a\x20\xda\x98\xcb\xf6\x9c\x1c\
+\xb8\x63\xa9\xca\x5a\x3d\x79\x8f\xf7\xf9\x51\x78\x4f\x8b\x41\xc3\
+\x71\x5f\x6b\xc3\xb4\x52\xff\x00\x9b\x1a\xdd\x5b\x9b\x0a\x76\x6a\
+\xc4\xc1\x4e\x70\xf8\x94\x94\x7c\x27\x5e\xe2\xb7\x4a\xab\xc2\xb3\
+\xc5\xac\x6d\xff\x00\xd7\xb1\xab\x8d\xd8\xab\x81\xa3\x53\x4b\x5d\
+\xef\x44\x34\xad\xa3\x95\xc6\x5c\xac\x2e\x0e\xe2\x95\x89\x86\x49\
+\x2d\xe1\xc8\xce\xa3\xe1\x66\xd4\x7b\x57\x5e\xa4\x1e\x86\xa1\x83\
+\xc1\x26\x1e\x4c\x3e\x52\x80\xc8\xbe\xa1\xb3\x54\x4f\x86\x60\x33\
+\xc2\xec\xd6\xd4\x83\xb8\xa2\x46\x25\xc3\x05\xbb\x01\x60\x46\xf5\
+\x6f\x0b\x0b\xe6\x0f\x25\xd4\x74\xe7\x5a\x93\x55\xe8\x1c\x17\x14\
+\xf9\xb3\x4f\xe6\x45\xd0\x13\xb8\xad\x65\x65\x65\xcc\xac\x18\x1e\
+\x62\xb3\xe7\x84\x36\x28\x22\x79\x55\x85\xfb\x0a\x38\xe2\x9e\x07\
+\xcd\x13\x09\x07\x30\x39\xfc\xab\x7c\x76\x33\x57\x74\xb5\x0b\xca\
+\xaa\xf9\x0c\x8b\x7e\xe3\x6a\x1c\xd7\x50\xc0\x11\x7e\x47\x71\x5d\
+\x98\x2c\xb7\x36\x02\x40\x06\x63\xc8\x8e\x47\xde\xb5\xa0\xac\x76\
+\x20\x78\x5e\x1a\x4a\xad\x9b\x72\xbc\xa9\x1e\x22\xc4\xaa\x60\x91\
+\xb3\x11\x67\xb8\xa9\xe2\x51\xa2\x15\x65\x00\x16\xbd\xc7\x2a\x3e\
+\x1c\x88\x22\xf1\x48\x05\xb3\x5b\x5e\x55\x9f\xa5\x6a\x26\x49\x23\
+\x0f\x1f\x31\xa8\xe9\x49\x9d\x6f\xa8\x1a\x93\x46\xde\x6f\x32\xd9\
+\x5c\x6c\x6d\x6f\x91\xed\x49\xc6\x49\x29\x4f\x0d\x21\x65\x6f\x88\
+\x8d\x40\x1d\xa9\xa1\x31\x80\x07\x23\x7a\x23\xf9\xf2\xa4\xe1\x6f\
+\xe0\xa5\x81\xf2\x5c\x1f\xf7\xf3\xa6\xa1\x0c\xc4\xd1\x10\xd0\x88\
+\xa3\x69\x0e\xbe\x1a\x96\xac\x29\x1b\x33\x96\x3b\x93\x7a\xd6\xe2\
+\x72\x78\x7c\x39\xb6\xbc\x87\x27\xef\x55\xf8\x54\x28\xb0\xfd\xa1\
+\xd4\x16\x63\x65\xbf\x2a\xcf\x2e\xee\x35\x3a\x80\xc1\x60\x4c\x8a\
+\x24\x95\xb2\x2d\xf4\x5b\x6a\x6b\x44\x65\x54\x08\x8b\x95\x06\xc2\
+\x96\xce\x49\xb9\x35\x19\xe9\x9d\x0b\x74\xc0\xd6\xda\xdf\x31\x43\
+\x2a\x89\x2e\xca\xc5\x24\xfc\x43\x9f\xbd\x0e\x6d\x2a\x03\x54\x15\
+\xe7\x52\x3c\x93\x46\x3b\x15\x39\x4f\xc8\x8a\x57\x85\x87\xfc\x33\
+\x7f\xfe\xe6\xae\xbb\x23\xa6\x57\x19\x87\x6e\x55\x56\x48\x98\x5c\
+\xa0\x2c\x3f\x31\x45\x87\x49\x38\x6c\x16\x6c\xc2\x19\x2f\xd7\xc5\
+\x34\x66\x34\x90\x91\xe2\xba\x5f\x6b\xd8\x8f\x9d\xa8\x0b\xdb\x90\
+\x34\x25\xbb\x0a\x3a\x21\x6f\xb4\x61\x58\x30\x24\x03\xb1\x1b\x1a\
+\xbb\x82\xe2\x10\xc8\xbe\x1c\xa1\x22\x70\x3d\x45\x46\x53\x55\xc4\
+\xc4\xc7\xe1\xbd\x99\x3a\x1a\x19\x70\x0e\xcb\x9f\x0f\xf7\x8b\xd3\
+\x9d\x53\x67\x87\xff\x00\x56\xf1\x73\xc1\x14\x82\x68\xd9\x64\xcc\
+\x9a\xaa\x6c\x75\xb5\x67\xcf\x3b\xca\xe5\xdc\xdd\x8d\x48\x56\x55\
+\x55\x70\x54\x32\xb2\x6a\x39\xdc\x11\xfb\xd5\x76\x24\x12\x0e\x96\
+\xa3\x95\xaa\x41\x86\xa2\x07\xa5\x29\x4e\xb4\x6b\x59\x26\x03\xf9\
+\xd5\x84\x8c\xbc\x82\x30\xb9\xb2\x90\x15\x6d\xa3\x36\xe4\x9e\xb6\
+\xa4\x44\x06\x60\x5b\xd2\x35\x3e\xd5\xab\xc2\xa3\x29\x84\x18\x89\
+\x57\xef\x24\x62\xc9\x71\xa8\x07\x9d\x6f\x8c\xd1\x6a\xd4\x00\xe1\
+\xe1\x11\x83\xe6\xb7\x9c\x8e\xbd\x2a\x43\x03\x4b\x1b\xd1\xa0\xd6\
+\xba\x30\xe2\x0f\x4a\x13\xa1\xa6\x69\x7d\xea\x1b\x28\xd4\x91\xf2\
+\xab\x11\x7a\x54\x15\xa6\x05\x0c\x2e\x2a\x4a\x91\x52\x21\x85\x01\
+\x8b\xef\x3c\x48\xd8\x23\x9f\x50\x23\x46\xab\x05\x6f\x49\xc5\x32\
+\xc7\x26\x42\xe7\x35\xb5\x55\x17\xb7\xbd\x18\x8a\x92\x39\xe5\x53\
+\x13\xa2\xc4\x81\x86\x63\x9a\xf9\xbd\xa9\xb9\x54\x28\x44\x16\x45\
+\xd8\x52\x92\x78\x90\xf9\xd2\x40\x4f\x33\x4d\x61\xa5\xc1\xb8\x3b\
+\x1e\xb4\x17\x1b\x0a\x12\xdd\xab\xac\xc4\x5e\x84\x9a\x82\x49\xa8\
+\x2d\x42\x4d\xe8\x6a\x38\x3c\xc2\x97\x8d\x96\x48\xa0\x46\x89\xca\
+\xdd\x88\x36\xe7\x53\x7a\x5e\x30\xd8\x43\x21\x52\xd1\xa1\x39\x87\
+\x7a\xaf\x8b\x15\x15\x99\x66\x56\x7b\x8d\x41\xd6\xb4\xa7\xbe\x72\
+\x79\x31\xf2\x9e\xb7\xaa\x78\x89\x5b\x1b\x32\xaa\x29\x55\x1f\x11\
+\xd6\xde\xf4\x79\x9f\x0a\xaa\x4b\x09\x62\x2d\xb1\x16\x3b\x72\xac\
+\xc3\x56\x04\x8f\xcd\xb3\x0e\x8c\x2e\x3f\x3a\x07\xc3\x61\x5d\x73\
+\x49\x87\x54\x1b\xdd\x5b\x2d\xff\x00\x9a\x4b\xe3\xa2\x0b\xf7\x71\
+\x31\x6f\xeb\x3a\x55\x69\x25\x92\x46\x0e\xe4\x34\x92\x1b\x46\xa7\
+\x6f\x7b\x74\xa6\xf2\x8b\x1d\x88\x8b\x0d\xe2\x59\x1e\x45\x54\x37\
+\x16\x50\x48\xbe\xd7\xd7\x7a\xab\x26\x0b\x07\x23\x97\x79\xb1\x04\
+\x9f\xe9\x5a\x6c\xac\x01\xc8\xa6\xea\x0e\xe7\xe2\x3c\xc9\xa5\xb3\
+\xa8\x6c\xa4\xd8\xfe\x95\xce\xb4\xe8\xf0\xef\x31\xb4\x71\x13\xa6\
+\xe2\x82\x58\x65\xc3\xf9\x64\x52\xa4\xeb\xad\x6b\xb8\x1a\xa2\x59\
+\x63\x4f\xa0\xee\x6b\x3f\x1f\x30\x96\x50\x17\xd0\x82\xcb\x7f\xd6\
+\xab\xc7\x04\xaa\xeb\x7d\xcd\x72\xe9\xa7\x4d\xaa\x6b\xbb\xf4\xa0\
+\xba\x9d\x82\x36\xc5\xa0\x3b\x31\xca\x7e\x7a\x7e\xf4\xa0\x2f\xd7\
+\xe9\x44\xa2\xcd\x71\x7d\x3a\x5b\xf9\xa6\x26\x3e\x21\x04\x78\x99\
+\x10\x03\x65\x72\x07\xb5\x3b\x05\x8a\x9f\x0a\xf7\x8a\x4c\xb9\xbe\
+\x13\xb1\xad\x2c\x46\x1f\x0b\x8b\x9c\xcd\x2f\x8b\x1b\x9f\x51\x40\
+\x0e\x63\xd7\x5a\x98\xb0\xbc\x3e\x16\x0c\xb0\x34\xac\x07\xaa\x56\
+\xd3\xe9\x58\x9c\x6c\xa7\x4a\x8b\x8b\x21\xb0\x9b\x08\x84\xfc\x45\
+\x09\x1f\x96\xd4\xf4\xc6\xf0\xf7\x5b\xf8\xb2\xc6\x7a\x32\x66\xfd\
+\x2a\x5a\x3c\x24\x82\xcf\x83\x8c\x5c\xef\x1d\xd4\xd4\x45\xc1\xe0\
+\xc4\x4b\x9b\x0f\x23\x28\x06\xe5\x1f\x6f\x60\x6b\x73\xf4\x0f\x89\
+\x23\x98\x06\x86\x65\x65\x3d\x74\x35\x6d\x30\xf8\x44\x8d\x5e\x59\
+\x90\xdf\xab\x7f\x15\x9b\x8b\x86\x68\x9f\x2c\x91\x14\x03\x61\x6d\
+\x00\xa4\xd3\xb9\xf0\x36\x86\x33\x05\x18\xca\xb3\x10\x07\x25\x8f\
+\x7f\x9d\x70\xc7\xe0\xd5\x0c\x85\xa4\xb2\xf3\x22\xb2\xe0\xc3\x4b\
+\x2a\x66\x58\xe4\x61\x7b\x79\x56\xac\x37\x09\x92\x58\x8c\x52\xc8\
+\x89\x73\x71\xe6\xd4\x7b\x8a\xd6\xf2\xf9\x06\x45\xa8\x31\xf0\x29\
+\x2d\x20\x92\xf2\x0b\xdf\xa0\xa7\x47\x8f\xc0\xb7\xfc\xe6\x07\xba\
+\x55\x01\xc3\x8c\x91\xae\x7c\x42\x29\x5f\x21\xb0\x3a\xda\xa3\xff\
+\x00\x4d\x60\x72\xa6\x22\x33\x61\xbe\xa2\xf5\x4b\xc9\x64\x6c\xa1\
+\x59\x17\x34\x52\x2c\x83\xaa\x9b\xd7\x5f\x75\x22\xe0\xee\x0d\x62\
+\x9c\x16\x36\x23\x9e\x3f\x31\xe6\x63\x6b\xfd\x69\x90\xf1\x4c\x44\
+\x44\x47\x89\x84\x32\xed\x98\x8b\x1f\xad\x3f\xaf\xe8\xc6\x89\x86\
+\x03\xae\x43\xa7\xf5\x69\x53\x9e\x35\x5c\xaa\x00\x1d\xa9\x11\x62\
+\xb0\xf8\x96\xc8\xb2\x80\xc0\x5e\xcd\xa7\xe7\x4f\x58\xd9\x45\xd5\
+\x2e\x3a\x8d\x69\x9f\xf1\x09\x1e\xe3\x45\x35\x21\x9f\x36\x6b\xdb\
+\xe7\x4b\xcf\x6a\x8c\xf7\xab\x40\xda\x45\x8a\x47\x32\x12\x16\x42\
+\x18\x10\x36\x36\xb5\xa8\x23\x99\x1a\x7b\x05\x74\xcd\xe9\xcd\xb3\
+\x51\x26\x76\xf4\x82\x7e\x57\xa5\x62\xe4\x48\x94\xb4\xee\x3b\x28\
+\x3a\xdf\x95\x45\x5f\xfc\x44\xf7\x58\xa0\xda\xc3\x31\xf7\x34\xdc\
+\x3c\x80\x60\x60\x04\x58\xe4\xe5\xef\x59\x53\x62\xa6\x93\x16\x44\
+\x90\xab\x48\x41\x2a\xf9\xb4\xb7\x5a\xd2\x0d\x96\x18\x45\xf3\x11\
+\x18\xcd\xde\xb3\x2e\xdb\x4e\x74\x66\x75\xfc\x55\x19\xd6\xfa\x30\
+\xa5\xdd\x4d\xed\x6a\x02\x7c\xd6\x14\xea\x58\xcd\x6a\xe7\x63\x94\
+\xd8\xda\x96\x49\xa8\x6b\xe5\x34\xa3\x81\xb0\x16\xe9\x50\x5c\x82\
+\x08\xde\x96\xad\x71\x53\x98\xdc\x5e\xa4\x99\x60\x8e\x7f\x31\x39\
+\x1f\xa8\xd8\xfb\xd5\x3c\x42\x3c\x4d\x66\x5f\xa5\x5d\x06\xa5\xb2\
+\xb2\xe5\x71\x99\x7a\x1a\x2c\xd4\xce\x07\x9d\x33\x0f\x88\x78\x5a\
+\xe8\x74\xe6\x0e\xd5\x38\xac\x2b\x20\x2f\x11\x2c\xbc\xc7\x31\x55\
+\x43\x9b\xd8\xd6\x3c\x6b\xd6\xbc\x58\xb5\x99\x4d\x88\x70\x47\x99\
+\x1b\x5f\xa5\xe8\x13\x3d\xf2\xc3\xe1\x15\xfe\xa1\x62\x2b\x2d\x49\
+\x49\x33\xa1\xb1\x15\x7b\x01\x8a\x59\x49\x0e\x32\xbf\x23\xc8\xd6\
+\xa5\xd6\x71\x63\xec\xf1\x6a\x71\x11\xa3\x06\x3a\xc8\xba\x65\xfe\
+\x28\x26\xe1\x8b\x7b\xc3\x25\xbf\xa5\xbf\x9a\xb1\x11\x21\xec\x47\
+\xb8\xeb\x54\x9a\x79\x17\x34\x71\xb9\xc8\x09\xb7\xb5\x37\x14\xd0\
+\x47\x10\x17\x59\x2c\x56\xfa\x80\x77\xfe\xd5\xae\x1b\x3c\x51\xb5\
+\xad\x74\x1a\x74\xac\x85\x37\xad\x4c\x3b\xe7\xc2\xc6\xcb\xf0\x8c\
+\xa6\x9e\x22\x9a\xa3\x5a\x25\xb9\x24\x03\x60\x37\x22\x97\x7b\x0a\
+\x6c\x43\x2a\x81\x5a\x80\x59\x53\xf0\x0a\x90\x00\xf4\x80\x3d\xab\
+\xaa\x6c\x6b\x49\x04\x03\xb8\x07\xdc\x54\x65\x53\xf0\x8f\xa5\x15\
+\xab\x97\x46\x07\xa1\xa9\x05\x97\xc3\x06\x46\x19\x02\x8b\xde\xd6\
+\xaa\xd8\x51\x6c\x32\xb1\xb8\x67\x62\x49\xe6\x69\x8b\x08\xf1\xe5\
+\xf1\x49\x65\x46\xd0\x13\xa5\x11\x60\xcc\x06\x5b\x0e\x5c\xa8\x40\
+\x7c\xb2\x0c\xb2\x8c\xc2\xd6\xb9\x1a\x8a\xa4\x9e\x3c\x38\xaf\xb3\
+\x29\x04\x16\xb0\xb8\xd3\xde\xae\xb5\x81\xb7\x3e\x82\xab\xe3\xd5\
+\xef\x0c\xab\xa1\x0d\x97\xde\xb3\x4c\x1b\x95\x0f\xa6\x5d\x09\x2b\
+\x7e\x54\x82\xc4\x9b\x20\xbd\xb7\x35\x62\x45\x01\x99\x40\xd2\xfb\
+\x52\x9b\xca\xa4\xa8\x1a\x50\x00\x7a\x8a\x8a\x30\xa0\x0d\x2e\x7b\
+\xd0\xb0\x00\x5c\x9d\x2a\x3a\x12\x2b\x90\x90\x74\xf9\xd4\xfb\x6b\
+\x50\xdb\x5b\xad\x45\x25\xcb\x02\xa2\xd6\xe7\x61\x6b\xd0\xe2\x23\
+\x59\xa1\x11\xb3\xe5\xb3\x5c\x1b\x5e\xa4\xda\xdd\x85\x42\x92\x58\
+\x00\x37\xa9\x13\x26\x0b\x0e\xb1\xb4\x9e\x24\x96\x51\xcc\x00\x0d\
+\x50\x9c\x5b\x13\xf6\x8f\x13\x33\x0f\x4d\x86\x8b\xf5\xab\x5c\x52\
+\x6c\xcf\xe0\xaf\xa5\x37\x23\x99\xaa\x65\xac\x6b\x9d\xcd\xe8\xc0\
+\xe7\x62\x7d\x63\xfe\x91\x40\xcc\x11\xb4\xdc\x8d\x6f\x44\xc0\x36\
+\xbb\x1e\x44\x0a\xe8\xa1\x69\xb1\x48\xa4\x8b\x31\x02\xb3\x49\xf3\
+\x4f\x3c\xa9\x95\xa4\x25\x7f\x08\xa4\x53\x0d\x71\x53\xae\x97\xf9\
+\xd3\xa8\xba\x90\x28\x97\x53\x63\xa1\xa2\x0a\x4e\x9c\xea\x40\xb5\
+\x10\x5a\x24\x0d\x94\x92\x01\xb1\xd4\x73\xa3\xca\x4a\x82\x96\xf9\
+\xd4\x8b\x17\xa9\xa6\x15\xe9\x50\x16\xac\x41\x15\xa9\x87\x4f\x0b\
+\x0e\xa9\xf1\x37\x99\xbf\x6a\xa5\x84\x88\x49\x89\x44\xd8\x13\xad\
+\x68\xb0\xbb\x93\xca\xf5\xbe\x30\x5a\xe5\x77\xcb\x96\xf7\x1d\x0e\
+\xa3\xf3\xa8\x6c\x84\xdd\xa1\x88\x91\xcc\xad\x48\xf6\xae\x22\xf5\
+\xa6\x50\x5d\xed\x60\xc4\x0e\x83\x4a\x53\x13\x7a\x32\x2d\x42\xd5\
+\x17\x06\x3e\x21\x1f\x0c\x9a\x8e\xcd\xd2\x96\x58\xe7\x35\x33\x06\
+\x31\xa2\x25\xb3\x3c\x82\xd7\xed\xad\x74\xa6\xf2\x16\x1d\x68\x42\
+\x0c\x46\xa0\xda\x8f\xc5\x63\xeb\xb3\x8f\xea\x17\xa4\x13\x5d\x9a\
+\xad\x4e\x97\x0b\x81\x94\xdc\xc1\x90\xf5\x8c\xd8\x0f\x95\x25\x70\
+\x53\xc4\x6f\x85\xc7\x01\x6d\x81\x25\x69\xad\x73\xb3\x11\x50\xb9\
+\xc1\xd4\x82\x28\xe9\x25\x5f\x8c\xaf\x34\x9b\xd8\x83\x4b\x9b\x1b\
+\xc4\xd1\xb2\xb4\x45\x4f\x68\xe9\xd7\xa2\x59\x64\x51\x65\x91\x80\
+\xe8\x1a\xac\xff\x00\xa9\x49\xa6\xe2\x73\xe8\x7c\x73\x7d\xbc\xa4\
+\x52\x8e\x0f\x1c\xce\x41\x85\xef\xcc\x9a\xd1\x92\x57\x6f\x29\x76\
+\x6f\x73\xb5\x43\x3d\x97\x56\x36\x14\x7e\x67\xf4\xea\xb4\x78\x27\
+\x45\x47\x9d\xd0\x04\x24\x35\xbc\xc7\x29\xdf\x6d\xaa\xd6\x21\x46\
+\x7f\x2e\xd6\xf2\xf7\x1c\xa9\x62\x51\x7d\x14\x91\xb1\xa8\x88\xe4\
+\x2f\x16\x62\x46\x50\xe9\x7e\x5d\x45\x33\x27\x81\x39\x0d\xaf\x7b\
+\x1a\x94\x52\x0d\xc9\xbd\x0e\x6a\x82\xd7\x39\x41\xf7\xa9\x19\x7a\
+\xeb\xd2\x55\x9b\x35\x81\xd0\x75\xa3\x2c\xdf\x87\xe9\x56\xac\x1d\
+\xec\x6f\xf5\xae\xbf\x2a\x58\x25\xb4\x0b\xda\x89\x4a\x33\x65\x59\
+\x55\x98\x7c\x20\xeb\x56\xa1\x23\xdc\x5e\xf4\x79\xcd\x27\x55\x3b\
+\x7b\x8a\x95\x6b\x8a\x75\x1a\x1a\xc6\xe3\x43\x49\xc5\x61\xd2\x62\
+\x5d\x3c\xaf\xd3\x91\xa2\x26\xc2\xf5\x19\x88\x3b\x1a\x92\x83\x02\
+\xad\x94\x82\x08\xe4\x6b\x81\xf3\x5c\x68\x6a\xf4\xea\xb3\x80\x18\
+\x59\x86\xcd\x54\xa5\x56\x8e\x42\xae\xba\x8e\x87\x7a\xc5\x8d\x2e\
+\xe0\xb1\x6c\x06\x49\x2e\xc3\x61\xd4\x55\xdc\x19\x5f\xb1\x21\x4c\
+\xac\xba\x86\xd3\x9f\x7a\xc5\x8c\xd9\x89\xd7\x5a\xb9\x86\x9d\xe3\
+\x7c\xc8\xd6\x63\xa1\xbe\xa1\xbb\x1f\xe6\x99\xc8\x58\xb9\x2e\x16\
+\x27\x6c\xc8\xde\x19\x3c\xad\x71\x52\x15\xf0\x6a\x64\x57\x12\x27\
+\xc4\xb6\xb5\x0f\xdb\x20\x24\x28\x56\x59\x0f\xfc\xb6\x3f\xa1\xe7\
+\x51\x36\x22\x16\x56\x5b\x3d\xd9\x6d\x62\x2b\x5d\x33\xda\xe4\x6c\
+\xae\xe0\xc7\x72\xac\x34\xa7\xa5\xf9\x8d\x6a\xa6\x15\x55\xb0\x28\
+\x14\x58\xe5\x20\x1e\x60\xd3\xb8\x79\x90\xc0\xa5\xe5\x62\x0e\xc0\
+\x80\x6b\x70\x2c\x2d\x10\x17\xa8\x19\xbf\x1c\x7f\xf6\x1f\xe6\x8c\
+\x1b\x0f\x30\x00\x7e\x25\x3a\x7c\xfa\x56\x83\x80\xa9\x2b\x70\x45\
+\x15\xba\xd4\xd8\xf4\xad\x05\x59\x62\x65\xfb\xc3\x72\xa0\x59\xc0\
+\xdc\x8e\xbf\x2b\xd7\x10\xac\xb7\x52\x19\x7a\x8a\xb5\x1f\xac\x03\
+\xb5\xf5\xaa\x78\x38\xb2\x89\x7f\xd6\x40\x17\xe5\x7a\xcd\x87\x5c\
+\x14\x0d\x86\xf4\xa6\x2a\xd8\xd0\x83\xfe\x52\x93\xf3\xab\x25\x7b\
+\x81\xef\xa5\x56\x96\x48\x53\x1b\xe2\x86\x04\x37\x95\xc8\x1a\x5c\
+\xf3\xa2\x94\x30\xa0\x2b\x4d\x0f\x13\x1b\x2b\x8b\xf4\x3a\x57\x3a\
+\xdb\x71\x59\xc4\x41\x45\x1b\x28\xa0\x74\x0c\x2d\x76\xfd\x69\xe4\
+\x50\xb2\xd0\x88\xc8\x14\x69\x70\x6a\x08\xf3\x5c\x9b\xd3\x1a\x81\
+\xad\x7a\x8c\x09\x1a\x5a\x82\x67\xf0\x30\xed\x27\xc4\x7c\xab\x4d\
+\x51\x73\x6f\xf6\x2a\x87\x11\x97\xc5\x94\x85\xf4\x26\x8b\x47\x2b\
+\x90\xab\x7b\xd0\x91\xda\x8a\xa2\xb9\x34\x1b\x0a\xe4\xcc\xac\x18\
+\x1b\x11\xb1\xa2\xa9\xb5\x3a\x9c\x6c\x05\xe8\xe3\xb3\x0f\x28\x27\
+\xf2\xa2\xcb\xe5\x3a\x5f\x4d\xa9\x9c\x3a\x13\x23\x14\xb5\x94\x6a\
+\x5b\xa5\x32\x22\x63\xc2\xcf\x34\xb9\x51\x33\x13\xae\x9c\xaa\xf4\
+\x3c\x3f\x28\x02\x59\x46\x9b\xe5\xd6\xaf\x22\x24\x71\x84\x41\x61\
+\x6d\x7a\x9a\x12\x40\xd8\x5e\xb7\x38\xc6\x6f\x25\x77\xc0\x46\xc2\
+\xf1\xcc\xca\xc3\xf1\x0d\xea\xab\xc0\xd0\x93\x1b\xea\x6f\xca\xb5\
+\x14\xad\xaf\x7b\x54\xcb\x08\x9e\x1c\xbf\x16\xe8\x6d\xf9\x55\xf9\
+\x83\x59\x16\xed\x5d\x96\xfc\xa9\xe5\x2c\x6c\x46\xb5\x19\x68\xc6\
+\xb4\x7c\x2d\x7f\xe2\x4e\x9f\x01\xab\x65\x6d\xca\xf5\x5f\x87\x69\
+\x8a\x02\xde\xa0\x54\x55\xb3\xbd\x33\xc6\x69\x2c\x2b\x81\xeb\x4d\
+\x65\xa5\x95\xa4\x3a\xc2\xc4\xda\xf9\x45\xec\x39\xd5\x27\xc6\x81\
+\x70\x60\x1f\xf7\x1a\xba\x2e\x0d\xc6\xf5\x9d\xc5\x54\x2e\x36\x50\
+\x05\x80\x34\x72\xdc\x6a\x1b\x0b\xb6\x21\x84\xec\x02\xa4\x67\xc8\
+\xa3\x99\xa9\x3b\xd4\xe1\xd1\x93\x09\x1a\xb0\x00\xea\x48\xf7\xa1\
+\x7c\xdc\x80\xab\xe2\x76\xde\xd5\x07\xf2\xa1\x0c\xe4\x1b\x28\xa0\
+\x05\x96\xf9\x86\x9d\xb9\x50\x70\xc9\x1e\x28\x80\x32\xbe\x5b\xec\
+\x00\xb9\x35\x1e\x2c\x44\x5f\x39\x5e\xee\x84\x0a\x5c\xca\xb3\x2a\
+\x82\xc1\x59\x4d\xd5\x88\xa9\x94\xcf\x24\x45\x24\x68\x54\x11\xa9\
+\x04\xb7\xe5\x46\xa3\x58\xd8\x03\x7b\x83\xb1\x1b\x1a\x8b\xd2\x60\
+\x41\x0a\x14\x59\x1d\xef\xca\xd6\x14\x46\xe0\xea\x08\xab\x56\x25\
+\x9b\x29\xb8\x3b\xef\x52\x1e\xe3\x51\x4a\x66\xf3\x0b\xf2\xa6\x01\
+\xa6\x62\x42\x8e\xa4\xd8\x55\xa9\x0c\xf4\xac\x54\xe6\x17\x8d\x86\
+\xae\x01\x05\x4e\xd9\x7b\xd1\xea\x5f\x42\x51\x7f\x15\xac\xcd\xed\
+\xd0\x54\xfd\xd2\x5e\xd1\xae\xbb\xe6\xd4\x9a\x12\x19\xae\x15\x97\
+\x40\xe2\xe0\x57\x2f\x99\xb5\xa8\x6d\x40\xb0\xb2\x8d\x00\x14\x4a\
+\x54\x0d\xef\x51\x12\xd9\x5b\x53\xbd\x49\x7f\xc3\xad\x05\xb3\x0b\
+\x93\xf2\xa8\xd5\x45\xd7\x7e\x94\x83\x12\xeb\x20\x20\xea\x75\xa0\
+\x91\x62\x86\xee\xca\x0c\x4e\x75\x36\xb9\x53\x5c\xa4\xde\xe7\x7f\
+\xd2\x88\xe5\x74\x68\xdf\xd2\xfb\xf6\xa9\x07\x0d\x3f\x8d\x19\xd4\
+\xe7\x8c\x6a\x4f\xc4\x3a\xd1\x0b\xdf\xcb\x54\x07\x8b\x83\xc4\x66\
+\x2b\xdb\x5d\x88\xa6\xcf\x8d\x56\x8b\x2c\x28\xca\xcd\x6b\x92\x76\
+\xf6\xac\xfe\xbf\xa9\x6a\xe6\xfa\xd1\x66\x14\xac\x3c\xab\x88\x4e\
+\x62\x45\x1e\x60\x79\xf7\xa2\xb9\xad\x6a\x15\xea\x64\x55\x95\x32\
+\x3f\xc8\xf4\xa0\xa9\x53\x6a\xb5\x62\xa4\x8a\xd1\x49\x95\xfe\x47\
+\xad\x10\x6b\x55\xa9\x51\x66\x4c\x87\xd4\x3d\x26\xa8\x6a\xa4\x83\
+\xc8\xd8\xd1\x61\x58\xba\xc9\x1e\x47\x06\xdc\x88\xdc\x51\x0f\x17\
+\x25\x83\x24\xd6\xda\xfa\x30\xaa\xea\xda\xd3\x15\xaa\xd4\xb1\x0f\
+\x15\x38\x7b\xc6\x20\x36\x3b\x86\x3b\x1a\xd2\xe1\xb8\xc8\x64\xc1\
+\xc6\x58\x14\xb1\x23\xa8\x15\x98\x72\x3d\xbc\x6f\x0c\xdc\x69\x9b\
+\x7f\x95\x16\x09\x44\x73\x4d\x02\x9b\xa6\x50\xc0\x74\x35\xa9\x6e\
+\xb3\x63\xd0\xae\xa9\x98\x10\xc0\xf3\x14\x71\x9a\xc7\xc2\xce\xf0\
+\xb5\xc3\x58\x74\x3b\x1a\xd3\xc2\xcc\x93\x26\x75\x20\x11\xea\x17\
+\xda\xba\xca\xcd\x8b\x08\x0a\xd8\x25\xad\xf8\x4f\x2f\x63\xca\x8d\
+\x5d\x49\xb1\xf2\xb0\xf8\x5b\x4a\x5a\x3a\xdf\x9f\xbd\x14\xae\xa6\
+\xca\x40\x61\xdf\x5a\xdb\x26\x01\x67\x06\xd6\xd6\x90\xb1\xa1\x8d\
+\x6c\x0e\xbd\x34\xbe\xb4\xc3\x1a\x15\x39\x4b\x2d\xc7\x23\xa7\xd2\
+\x82\x72\x21\xc3\x31\x5d\x32\x2d\x85\x49\x9d\x8e\x25\xa5\x31\x86\
+\xba\x2f\xe6\x6a\x9e\xd2\x18\xed\xe5\x7f\x2d\xaa\xc3\x1b\x9d\x69\
+\x2f\xa1\xcd\xcc\x57\x1a\xdc\x00\x6c\xf1\xab\x5f\x5b\x59\xbd\xc6\
+\x94\xc8\x71\x0f\x19\xb1\xf3\x2f\x43\x4b\x72\xa1\x09\x1b\x2b\xb5\
+\xfe\x7a\x8f\xd6\x95\x09\x25\x0d\xce\xc6\x8d\x2d\x28\xa4\x49\x41\
+\xc8\x6c\x7f\x09\xa2\x61\xae\xa2\xb3\x01\x21\xb4\x36\xa7\x47\x8a\
+\x99\x16\xd7\x0c\x3f\xa8\x5e\x9d\x18\xb0\xe3\x5a\x0c\xa5\x8e\x9f\
+\xf8\xa5\x49\x8e\xd3\xfc\x95\xbf\xb9\xaa\xd3\xe2\x65\x94\x59\x98\
+\x01\xd1\x45\x85\x1b\x14\x94\xcc\x74\xea\x23\xf0\xa2\x37\x27\xd4\
+\xc3\xf4\xaa\x4f\xb5\x1d\xa8\x5c\x69\x58\xb7\x5b\x2a\xa6\x8b\x2d\
+\x48\x5a\xce\x20\x5b\x5a\x9a\x92\x2a\x42\xd3\x89\x66\x38\xc9\x60\
+\x06\xf5\xaa\xb0\xac\x71\x08\x80\xbd\xbd\x47\xa9\xa4\xf0\xa8\xaf\
+\x39\x73\xff\x00\x2c\x5e\xae\x85\xae\xdc\x63\x16\x91\x94\x07\x00\
+\xb5\xc5\xa9\x80\x0e\xab\xf5\x14\x52\x45\x98\xdc\x1b\x1a\x01\x11\
+\xce\x14\xd3\x80\x56\x1b\x58\x37\x60\x2a\x51\x32\xa8\x1f\xbd\x31\
+\x50\x01\x60\x2a\x72\xd3\x89\x47\x89\xc3\xaf\x8e\xa3\xd5\xea\xec\
+\x6a\x99\x15\xb5\x94\x10\x55\x85\xd5\x85\x8d\x66\xe2\xe1\x68\x64\
+\xca\x57\x36\x6f\x4d\xb9\x8a\x2c\x31\x5d\x09\x57\x0c\xa7\x50\x6e\
+\x2b\x47\x47\x41\x22\xec\xc2\xfe\xd5\x9e\x79\xf9\x0e\x9f\x95\x5a\
+\xe1\xf2\x00\x3c\x26\x3e\x56\xd5\x49\x3b\x1a\x22\xa6\x91\x6a\x12\
+\x2f\x4e\x28\x79\xd0\x32\xda\xac\x05\x65\x25\xac\x06\xa6\xab\x49\
+\x0f\x8b\x8b\x92\x72\x2f\x18\x6b\x8b\xfc\x56\xab\x8c\x0e\x5d\x3d\
+\x4f\x75\x5d\x3e\xa7\xe5\x42\xea\x2d\x94\x68\xa0\x58\x0e\xd4\x58\
+\x62\xbc\x9a\xb1\x26\x94\xe2\xd4\xf9\x01\x51\xa8\xbd\xb9\x8e\x74\
+\xa3\xe6\xd2\xd6\xa8\x93\x6d\x49\xa1\x61\x4d\x22\xd4\x2c\x2b\x28\
+\x86\x16\x3d\x8d\x0d\xc5\xed\x4e\x65\x14\x21\x2d\xb5\x18\x74\x9c\
+\x54\xb2\x46\xd1\xaa\x3f\x86\x8e\x35\x7b\x52\xb1\x38\x86\x81\xc0\
+\x8f\x11\xe3\xa1\x1a\x83\xad\x5a\x9a\x21\x2c\x26\x36\x6c\xba\xdc\
+\x35\xb6\xa4\xe0\xe0\xf0\x26\x3e\x2d\xb3\x7c\x04\xec\x68\xba\x81\
+\x0c\x92\xcd\xac\x78\x5b\x13\xbb\x35\xec\x29\xc4\xfd\xe7\xa8\xb1\
+\x03\x56\xfe\x3a\x53\x24\x67\x6d\x19\x8f\xb7\x2a\x5a\x7a\x6d\x51\
+\x71\x37\x37\x22\xf5\xc2\xd6\xb5\x87\xd2\xa6\xd5\xd5\x27\x0e\xd4\
+\x5a\xda\x86\xe0\x1d\x6a\x0b\x12\x6c\x34\xa9\x08\xd4\x57\x1a\xea\
+\x93\xaa\x49\xbd\x09\x35\x17\xbd\x48\x77\x05\x72\xba\x86\x5e\x86\
+\x96\x23\x8e\x07\xfb\x44\x6a\x4a\x8f\x52\x9d\x6c\x3a\x8a\x20\x6a\
+\x64\x91\x61\x81\xa4\x61\x7c\xc3\x28\x5e\xb5\x22\x31\xb3\xc4\x65\
+\x8a\x48\xdb\x33\x29\xf3\x10\x2d\xa5\x5a\x70\x58\xe7\x40\x4a\xb6\
+\xa0\x8a\xcf\xc1\xe1\x9e\x6f\x31\x39\x50\x6e\xc6\x9f\x8a\x85\x70\
+\xf0\xe7\x8e\x69\x03\x5f\x40\x4d\xaf\x44\xb7\xd4\xb1\x66\x02\xe5\
+\x48\x1d\x6d\x51\x71\x55\x70\x12\x62\x1f\x14\xa3\x3b\x30\x3e\xab\
+\x9b\x8b\x55\xa2\x2e\xf6\x51\x7d\x74\xa6\x76\x84\xa7\xa1\xaa\xdc\
+\x4b\x49\xd5\xbf\x12\xeb\x56\x42\x30\x17\x20\x7d\x6a\xb7\x12\x20\
+\xca\x88\x06\xa8\xba\x9a\xaf\x80\x9a\x34\x3a\x50\x81\x73\x47\x10\
+\xf3\x00\x39\x6a\x68\x22\x96\x3f\x16\x48\x16\xf6\x24\x35\x58\xc0\
+\x42\x60\x8d\xf3\x90\x5d\x8d\xbe\x54\x97\x76\x8e\x48\x1d\x23\x2e\
+\xc0\x36\x80\x55\x9c\x39\x12\x47\x9d\x41\x52\x0d\x99\x4e\xe2\x99\
+\xe8\xa6\xaf\xad\x47\x7a\xbb\xc3\x74\xc5\xa8\x03\x46\xd0\xd5\x35\
+\xbe\x60\x40\x27\xda\xb4\xb8\x7c\x3e\x18\xf1\x18\xf9\x88\xb2\x8e\
+\x95\xd7\x8f\xac\xd5\xc8\xb6\xa3\x74\x04\x5c\x0d\x4d\x25\xa4\xf0\
+\xec\xc7\x61\xbd\x14\x18\x98\xa4\x75\x4d\x54\x93\xa5\xf9\xd7\x4d\
+\x9e\x32\x72\x5c\x79\x4f\x2a\xaf\xc5\x0d\xa1\x09\xf8\x8d\xea\xd1\
+\x03\x37\x7a\xa3\xc5\x9b\xef\x55\x7a\x2d\x5c\xba\x8a\x28\xb5\x2d\
+\xbb\xd1\xb9\x16\xde\x96\xfb\x57\x26\xa1\x13\xa3\x11\x9e\x3d\x5c\
+\x0d\x54\xec\xc2\xa3\x0f\x66\x80\xb0\x04\x10\xd6\x65\xe8\x68\xce\
+\xfa\x53\x06\x1a\x56\x1f\x68\x44\xd6\xde\x60\x74\x12\x0f\xe6\x8c\
+\x24\xf3\xa8\x6a\xb0\x70\x93\x11\x99\x56\xe0\xea\x35\xd6\x97\x26\
+\x1e\x70\x0f\xdd\x9d\x2a\xca\x95\x9c\xd0\xd3\x1a\x19\x83\x10\x62\
+\x6d\x3b\x50\x15\x60\x2e\x54\x81\xd4\x8a\xc3\x48\xae\x22\xbb\xf2\
+\xfd\x68\x80\xf7\xff\x00\xb8\xd4\x83\x96\xb8\x8a\x62\x8f\xea\x3f\
+\x3d\x6b\xb2\x83\xb9\x3f\x2d\x29\xc1\xa5\x65\xa9\x00\x02\x37\xb9\
+\xda\x9b\x91\x4f\x23\xef\x7a\xe8\xe3\xc8\x73\x6e\x3f\x4a\xb1\x6b\
+\x63\x86\xa6\x5c\x1e\x6b\x83\x98\xe8\x47\x41\x56\x00\xa4\x70\xf5\
+\xb6\x15\x5a\x32\x10\x96\x3e\x5f\x84\xf6\x23\xf7\xa7\x86\x05\x73\
+\x00\x45\x8d\x88\x3b\xa9\xe8\x6b\xb4\xf1\x87\x5a\xba\x50\x91\x47\
+\xe2\xc8\xe1\x00\xd0\x5f\xe2\xed\x51\x34\xb1\xe1\xe2\xf1\x24\xd4\
+\x9f\x4a\xf5\xac\xdc\x64\xef\x89\x6c\xd2\x01\x61\xb2\xf2\x15\x5b\
+\x89\x6e\x4e\x25\x1a\xbd\xa2\x83\x30\x1c\xdc\xd0\x2f\x13\x7c\xb6\
+\x78\x51\xbb\x8d\x3f\x4a\xa4\xaa\xc4\x90\x01\x6b\x7d\x68\x95\x24\
+\xbf\xf9\x6f\x6e\xb9\x4d\xab\x3f\xaa\x72\x34\x62\xc6\xe1\xa4\xd1\
+\xb3\x44\x7b\xea\x28\xe4\x48\xf1\x29\x95\x24\x46\xc9\xb1\x53\xad\
+\xfa\x56\x77\x81\x27\xfe\xd3\xff\x00\xda\x68\x4c\x52\x03\x70\x8e\
+\x08\xe6\x06\xd4\xea\xc3\x9a\x09\x6e\x54\xc6\xe6\xda\x6d\x40\x90\
+\xc8\xad\x90\x8c\xa4\x6d\x98\x81\x7f\xad\x54\xc6\x89\xe4\x52\x22\
+\x95\xc4\x8a\x2f\xe5\x3e\xa1\xfc\xd6\x6e\x20\x4a\x04\x71\xbb\x33\
+\x3c\xc6\xc0\x9b\x9b\x0b\xf2\xae\x77\x96\x7c\x32\x3d\x5c\x0e\x1d\
+\x0f\x88\xea\x19\x46\xa7\x91\xae\x70\x48\x3e\x12\x67\x3b\x66\x3a\
+\x28\xaf\x3d\x04\x86\x2c\x6c\x62\x2b\x00\xac\x00\x36\xf5\x0b\xd7\
+\xa2\xf1\xd6\x59\x99\x0e\x8e\x09\x00\x72\x35\xd3\x8f\x2d\x16\x61\
+\x79\x4a\x82\x5d\x83\x3b\x68\x48\xd8\x0e\x82\x81\x85\x39\xc6\x96\
+\xa4\xc8\x72\xa7\x7d\x85\x54\x16\xe5\x7a\x8a\x43\xaa\xf8\x83\x21\
+\xf7\xa7\x20\x19\x4d\xc8\xd7\xf2\xa1\xb0\x58\xaf\xd7\x7a\xc9\x85\
+\x3a\xeb\x4b\x6b\x03\x6e\x74\xf6\x04\x8e\x42\x96\xc8\x09\xd6\xf7\
+\xeb\x51\x28\x8a\x82\xb4\xc6\xd3\x7f\xad\x0d\x18\x80\x45\x04\xca\
+\x0e\x16\x55\x22\xf6\x52\x47\xbd\x3a\xb9\x00\x2c\x57\xf1\x02\x28\
+\xc4\x54\xc3\xcc\x17\x9d\x85\xf5\xed\x50\x16\x89\x98\x30\x43\x6b\
+\x12\xa2\xff\x00\x4a\x86\x20\x0b\x93\x41\x09\x1a\xd0\x9b\x57\x3c\
+\x82\xfb\x50\x9b\x9d\x49\xb7\x61\x41\x71\x55\xbd\xcd\x4a\x82\x4d\
+\x95\x6f\xec\x2a\x15\x03\x30\x5e\xa6\xab\x4f\x88\x91\xa4\xf0\x60\
+\x2c\x17\x6d\x0e\xad\x45\xb8\x96\xe4\xc9\x18\xbc\xb2\x2a\x76\xbd\
+\xcf\xd2\x85\xed\x94\x32\xe6\x21\x86\x84\xad\xa8\x70\xf0\x24\x3e\
+\x67\x01\xe5\x3b\xdf\x50\xb4\x6e\x4b\x35\xc9\xb9\xa5\x16\x73\x54\
+\x44\x18\x9b\x93\xa5\x18\x17\xf6\xfd\x68\xd5\x49\x36\x03\xd8\x54\
+\x83\x6a\xaf\xc5\x3f\xcd\x45\xbe\xcb\xb7\x4a\xba\x88\xc4\x7d\xd2\
+\xab\x9e\x6c\x7d\x2b\xfc\xd4\xa4\x10\xc6\xe5\xdb\xef\x64\x3b\xb3\
+\x6d\xf2\x15\x66\x8d\x66\xc3\x2e\x22\x24\xb4\x6c\xca\xb4\xdc\x3e\
+\x1e\x4c\x43\x78\xb3\x31\xc9\xd4\x9d\x4f\xb5\x68\x34\x84\xef\x6f\
+\x6b\x50\xc8\xdb\x17\xb9\xcd\xa2\xa8\xe7\xfc\x55\xf9\x5a\x04\x50\
+\x13\x24\x4a\x11\x79\xff\x00\x73\x48\x9a\x62\x5b\xc1\xc3\x0b\xb1\
+\xd0\xb7\xf1\x56\x99\x54\xaf\xde\x6a\xa3\x52\xa3\x44\x1e\xfd\x69\
+\x18\x63\x0c\x0c\xee\x54\xdd\xbd\x23\x98\x14\xd4\xe8\x50\x61\x22\
+\x2e\xde\x67\x6f\xd7\xa5\x55\xb3\xbc\x85\xc9\xb9\x63\x73\x7a\x6c\
+\xce\xf3\x49\x99\xb4\x1c\x80\xe5\x5c\xab\x61\xa5\x66\x90\xaa\x91\
+\xfd\xaa\xce\x0f\x0c\xd2\xb5\x94\x58\x0d\xcf\x21\x4c\xc1\x60\xda\
+\x4f\x3c\x9e\x54\xeb\xd6\xb4\x11\x00\x50\xaa\x2c\xa3\xf3\xad\x4e\
+\x3f\x68\xb5\x38\x60\x21\x5c\xb1\x0b\x77\xb6\xa6\x8c\x24\x47\x16\
+\x19\xa3\x5c\xd2\x21\xbf\x42\x46\xd5\x2a\xb6\xda\x83\x17\x13\xb2\
+\x2c\x88\x7d\x1c\xbf\x7a\xe8\xc1\xe9\x1a\x81\x65\x40\xbe\xc2\x99\
+\x15\x93\x36\x76\xb0\x1a\xde\x86\x09\x63\x68\x95\xd9\xc6\x6b\x6a\
+\xa3\x7b\xfb\x54\x82\x64\x90\x31\x1a\x8f\x48\xe4\xbf\xde\xb4\x83\
+\x8b\x49\x5c\x09\x32\xd9\x57\x40\xbc\xc7\xbd\x06\x10\x67\xc4\x22\
+\xf5\x61\x57\xa3\xf2\x8b\x6f\x4b\x8a\x20\x98\xd2\xc0\x79\x42\xe6\
+\x1d\xb9\x55\x78\xf6\x34\xf6\xca\x75\xb7\x3a\xa1\xc5\x54\x78\xe0\
+\xda\xfe\x51\xbe\xb5\x74\x1a\xa5\xc5\x35\xc4\xfb\x28\xa7\x97\x8a\
+\x2a\xb1\xd2\x90\x49\x00\x8e\x86\xd4\xd9\x0d\x28\x9b\xfc\xcd\xeb\
+\x9b\x50\xec\x04\x41\x98\xc8\xc2\xea\xbb\x0e\xa6\x9f\x8a\x62\x30\
+\xce\xc4\xea\xde\x51\x53\x87\x19\x30\x88\x3a\xdd\xab\xa4\xb1\x78\
+\x94\x81\x60\x0b\xeb\xcc\xed\x5a\xf8\x91\x7c\xa0\x06\x16\xd0\x7e\
+\x94\x12\x1e\x94\x52\x90\xd7\xcc\x6f\x7a\x51\x1d\xcd\x14\x27\x33\
+\x6c\x09\xd3\xbd\x48\x91\x8e\xfb\x0e\x47\x5a\x0b\x80\x2c\x2b\x94\
+\x92\x6c\x01\x26\x84\xe9\x62\x86\x4f\x52\x05\x27\xe2\x5a\xa7\x3c\
+\x4d\x0b\xe5\x61\x70\x76\x23\x63\x57\xb4\x0c\x14\xba\x06\x3b\x02\
+\xd4\x18\xb0\x87\x0c\x44\x92\x22\x95\xd5\x75\xbf\xe9\x45\x86\x29\
+\x0b\x72\xa2\x50\x49\xb0\xd4\xd0\x23\xc1\xcf\x13\x17\xd4\xd0\x89\
+\x96\x69\xd3\x0f\x09\x21\x5c\xf9\xda\xda\x9f\xed\x46\x93\x90\xa6\
+\x6c\xab\x9a\x46\x1f\x0a\x0b\xfe\x74\xc1\x95\x45\xe4\x8a\x48\x87\
+\xe2\x6b\x11\xf9\x54\x02\x02\xe5\x40\x15\x7a\x0a\x34\x62\xbb\x73\
+\xe5\x4c\x4b\xdc\x39\xc3\x61\x32\xf3\x46\xbe\xfb\xde\x8f\x15\x30\
+\x86\x45\x7b\x5c\xb2\x80\x41\x36\x04\xea\x45\xfe\x42\xa8\x60\x24\
+\x11\x62\xb3\x92\x6c\xe3\x2b\x0e\xd4\x7f\xe2\x58\x25\x93\x04\x92\
+\x46\x0b\x04\x7f\x35\xba\x01\x5a\xdf\xf1\x1f\x49\x96\x79\xb1\x38\
+\x96\x58\xbc\xf2\xf3\x6b\xf9\x53\xda\xb4\x21\xc1\xb4\x08\x1b\x13\
+\x31\x9d\x86\xad\x1d\xb6\xf9\xd5\x5f\xf0\x8a\x34\x65\xf3\xad\x89\
+\xbb\x2d\xc6\xfa\x6f\x5a\xc4\x02\xc1\xb9\x8e\x74\xf1\x9b\x35\x5b\
+\xf0\x11\x95\xb2\xac\x2a\xa8\x1b\x50\x40\xb1\xa6\x80\xe1\x6e\x25\
+\x72\x07\x22\x69\x2a\x8f\x1b\x05\x6d\x81\x25\x1f\x71\x6e\x86\x9d\
+\x1b\x07\x25\x43\xad\xf9\x81\xbd\x6e\x32\x3f\x12\x66\x5f\x29\x20\
+\x1e\xad\x43\x92\x5b\x1b\xc8\x75\xdc\x5e\xf7\xa6\x0a\x25\x50\x6b\
+\x58\x08\x58\x54\x91\xe2\x47\x1b\x01\xa8\xf2\xdb\xf4\xac\x2f\xf1\
+\x06\x0d\x61\xe2\x8f\x2c\x60\xe5\xf0\x96\xc3\x90\x26\xbd\x13\x34\
+\x48\x49\x79\x05\x97\x53\x6d\x4d\xab\x23\x12\xed\x89\x9d\x8b\xaf\
+\xf9\xc7\xd3\xd0\x72\x15\xcf\x9c\x99\x8d\x4b\xdb\x1f\x83\x61\xdc\
+\xce\x64\x91\x09\x8e\x3d\x4d\xfa\xf2\x15\xa4\xcd\x9c\x97\xd8\xdf\
+\x5a\xb4\xf8\x6f\xb1\xc6\xb0\x0b\xdb\x72\x7a\x9a\x44\x82\xcf\xee\
+\x2b\x19\x9d\x1d\xd1\xc1\x8a\x01\x42\x4d\xa8\x1b\x30\xde\x9a\xea\
+\x08\xb8\xb3\x29\xd8\xf2\xaa\x4e\x35\xae\x8e\x57\x88\xdd\x0f\xb8\
+\x3b\x1a\x75\x62\xd3\x28\xbd\xec\x3e\x94\x0f\x72\xc0\x5b\x63\x72\
+\x68\xe3\x92\x39\x63\x2c\xba\x11\xea\x1d\x2a\x06\xe4\xf5\xab\x01\
+\x4c\x2c\x68\x1c\x53\xa4\xda\x96\xda\x8a\x11\x46\x94\xc2\xcc\x7a\
+\x1a\x75\x2e\x41\x53\x41\xa8\xcd\x91\x1d\xf9\xaa\x93\x5d\x6e\xe6\
+\xa0\xd8\x5c\x1d\x98\x10\x6b\x28\xb4\x92\x03\x02\x31\x99\x14\x05\
+\x02\xd7\xd4\x50\xab\xc3\x2d\xc4\x66\x59\x0f\x50\x9a\x55\x7f\xb1\
+\x44\x8f\x98\xb9\x71\xf8\x6d\x6a\x79\x26\xc0\x1d\x00\xd9\x46\xc2\
+\xb3\xb7\xe9\x10\x8a\xdf\x04\x97\xf6\x5f\xe6\xa3\x28\xd6\xe0\xff\
+\x00\xd4\xc0\x7e\x97\xa1\x35\x16\xbd\x25\x33\x06\x28\x56\x29\x23\
+\x42\x45\x8d\x81\xfd\x6a\xae\x12\x29\x60\xc7\x20\x65\x07\x36\xc4\
+\x1d\x3d\xea\xd2\xad\xcd\x80\xd4\xd1\xaf\x99\x83\x28\xb8\x00\xaa\
+\x77\xea\x68\xcd\xed\x00\xee\x40\xae\xb6\x94\x41\x2c\x2e\xcc\xa0\
+\x75\x2c\x29\x89\x16\x72\x08\x05\x97\xae\x81\x4f\xcc\xef\x56\x22\
+\xe3\x17\x51\xa5\x31\x14\x0d\x6c\x3e\x62\xa3\x10\x71\x10\xa0\x65\
+\x48\x72\xed\xa1\xcd\x4c\xb1\x08\xb9\xc8\x2f\x6f\x35\x86\xd5\xa0\
+\xe6\x62\xdb\x9d\xb6\xed\x42\x75\xa2\xae\xb7\x5d\x6a\x01\x02\xf4\
+\x6b\x14\x9f\x6b\xf1\x33\x47\x95\x54\xaa\x0d\xcd\xbe\x55\x20\x00\
+\xa5\x98\x85\x51\xb9\x35\x5f\x11\x89\xcd\x74\x8b\xca\x9c\xcf\x33\
+\x55\xc8\x85\x8a\x91\x41\xca\xa7\x3b\x0e\xde\x51\xfe\xfe\x7e\xf5\
+\x57\x29\x26\xe7\x73\x46\x05\xa9\x98\x78\x9e\x56\xb2\x0d\x39\x9e\
+\x95\x9f\x5a\xf0\xb4\x42\x4e\x55\x04\x93\x57\xf0\xb8\x05\x5b\x34\
+\xda\xb7\xe0\x1f\xbd\x3b\x0f\x1c\x70\x0b\x26\xad\xcd\xbf\x8a\x66\
+\x6a\xdc\x98\xcd\xa9\xb5\xed\xca\xdc\x85\x12\x8a\x1b\x82\x2c\x6a\
+\x56\xca\xb6\x17\xa5\x91\x8b\x5e\xd7\xa6\xa1\x51\xcc\x77\xaa\xac\
+\x75\x00\x6e\x68\xe3\x00\x6e\x6f\x5a\x95\x1b\x68\xd4\xe5\x8d\x40\
+\xbe\xe7\xad\x14\x5e\x49\x6d\x7b\xe9\x42\xac\x2d\x63\x4c\x52\x00\
+\xd3\x4a\x50\xc3\x50\xcb\x23\x27\xde\x04\xcc\xa1\x6c\xc0\x1d\x46\
+\xb5\x05\xa8\x59\xc8\x46\x23\x73\xe5\x1e\xe7\x4a\x75\x1d\x04\xa9\
+\x2a\x07\x50\x40\x26\xda\xd6\x7e\x2e\x5f\x12\x77\x6e\xa6\xac\x4a\
+\xe2\x0c\x29\x50\x76\x19\x57\xbf\x7a\xce\x26\xe3\x53\xf2\xac\xf2\
+\xaa\x44\x3b\x5f\x40\x68\x4b\x54\x33\x5a\x82\x23\x9e\x74\x51\xcd\
+\x85\x63\x5a\x6a\x31\xb2\xaa\xdf\x40\xa0\x7e\x54\x8c\x63\x95\x30\
+\xba\x9d\x43\xe5\xa2\x99\xc6\x63\x6d\xaf\x49\x91\x81\x40\xcc\x2e\
+\x23\x70\xde\xc3\x9d\x36\x88\x37\x6f\x39\xe9\x7a\x16\x7a\x17\xbe\
+\x72\x07\xd6\x96\x59\x7f\x18\x62\x3e\x14\x37\x35\x23\x01\x19\x4b\
+\x31\xca\xa3\x73\x55\x71\x18\xdb\xdd\x61\x05\x57\xaf\x33\x4d\x6f\
+\x31\x0d\x20\x04\x8d\x97\x92\xff\x00\x26\x97\x26\x1e\x29\x1f\x35\
+\xca\x75\x00\x69\x59\xbb\xf0\xac\x41\x1c\x22\x04\x26\x35\x72\xeb\
+\x98\x96\xde\x8e\x3c\x3e\x1a\xe7\xc8\xc2\xea\x6f\xe6\xed\x42\x18\
+\x58\x28\x16\x0a\x2c\x28\xe2\xdc\xff\x00\xa4\xfe\x95\xa4\xcc\x8b\
+\x0f\x85\x51\xe8\x67\xff\x00\x51\xb5\xa9\xb0\xc5\x04\x73\x2c\xb1\
+\x87\x05\x76\x17\xb8\xa0\x5a\x25\x22\xf5\x89\x84\xe5\x34\x57\xa5\
+\xa9\xa2\x06\xb5\x00\x85\x68\x60\x1d\x71\x18\x76\xc3\x48\x75\xb7\
+\x94\xed\x59\xe0\x12\x36\x34\x50\xb3\x23\x86\x06\xc4\x1a\xd4\xaa\
+\x8e\x09\x64\xc3\x63\x41\x63\x66\x43\x95\x81\x35\xab\x81\x99\xb1\
+\x31\x34\x99\x57\x2d\x81\x16\xf8\x4f\x30\x7d\xa9\x18\xec\x32\x63\
+\xb0\xeb\x22\x0b\x4b\x6b\x82\x39\xf5\x15\x9d\x85\x69\x30\xf2\x96\
+\x89\xca\xb6\xc7\xca\x35\xf7\xeb\x4e\xde\x35\x9f\x5b\xea\x48\xd8\
+\x91\xed\x51\x1a\x83\x8b\x92\x4f\xc2\x32\xfb\x9b\x6a\x6a\x84\x3c\
+\x4e\x41\x61\x2a\x44\xfa\xea\x40\x20\xd5\xdc\x06\x25\x31\x39\xc0\
+\x39\x5f\x31\x60\x87\x72\x39\xfb\xd6\xe5\x94\x61\xf4\x9c\x74\xb2\
+\x20\x54\x5f\x2a\xb6\xed\xd7\xb5\x3a\xab\xf1\x17\x55\x54\x56\xb1\
+\x0a\x0b\x9d\x7f\x2a\x6f\x82\x3b\x8a\x4c\x90\x61\x7c\x08\xf7\x90\
+\x0b\x91\xd2\x93\xc2\x21\xb1\xfb\x4b\xec\xa7\xc8\x2d\xb9\xeb\x54\
+\x73\x34\x85\x09\xdd\xc5\xfe\x64\xff\x00\x7a\xda\x08\x22\x81\x63\
+\x03\xd1\x61\xf3\xac\xce\xee\x9f\x11\x32\x78\xb1\x95\x36\xd7\x6b\
+\xf2\x35\x97\x2a\x14\x25\x4f\xa8\x1d\x6b\x58\x9a\xa3\xc5\x96\xcc\
+\xae\x3e\x21\xad\x5c\xe7\xd5\x14\x5f\x6a\x51\xfd\xe9\x8f\x4b\xae\
+\x6d\x40\xe1\xdc\xa6\x2d\x6e\x6f\xae\xa3\xad\x5f\x7d\x18\xdb\xad\
+\x67\x46\xb9\xa5\x04\xef\x9a\xb4\x64\xd6\x43\xef\x54\xf1\x52\xdf\
+\x51\x4b\x90\xe9\x6a\x63\x02\x74\x1a\xd2\x64\x68\xc1\xb7\x88\x3e\
+\x40\x90\x3e\x75\x00\xd0\xbe\xd4\x4b\x94\x93\x96\x45\x6b\x6e\x06\
+\xe2\x84\x82\xc4\xdb\xff\x00\x15\x34\x59\xde\x85\xaa\x25\x95\x82\
+\xe6\x8a\x02\xe8\x37\x73\xcf\xda\xa6\xe1\x91\x5c\x02\x03\x0b\xd8\
+\xd6\x51\x4e\x35\xa8\x6a\x63\x2d\xec\x6f\x50\x10\x66\x1c\xfa\xd1\
+\x87\x40\x14\x9a\x2c\xb6\xa6\x65\xa9\xcb\x56\x2d\x28\x28\x2a\xca\
+\x4b\x2e\x61\x6b\x8d\xc5\x14\x71\xc6\xb1\xf8\x65\xe5\x75\xe8\x4e\
+\x5b\x7d\x29\x81\x68\x82\xd3\x80\x0a\xa9\x18\xb4\x51\x2a\x9e\x46\
+\xd7\x35\x2c\x5e\xd7\x73\x6e\x57\x34\xc8\x94\x5c\xb1\x04\xf6\x1c\
+\xea\x70\xe2\x62\xec\xf3\x46\xca\x76\x4f\x29\x21\x7e\x94\xe2\x05\
+\xac\xc1\x9d\x48\xb7\xa1\x5b\xf5\x3f\xc5\x47\x3a\x6b\x5b\x35\x83\
+\x02\x77\xb6\xb4\x06\x94\x1d\x7a\x57\x3b\xc7\x12\xe7\x96\xe3\xf0\
+\x8e\xb5\x2e\xc9\x14\x5e\x23\xeb\xf8\x47\x53\x54\x26\x91\xe5\x90\
+\xbb\x1b\x9f\xd2\xb3\x6e\x24\xe2\x71\x0d\x33\x6f\xec\xa3\x61\x4b\
+\x42\xc3\x73\xf2\xa8\xb6\xba\x1a\x76\x16\x23\x2b\x1b\x90\xaa\x37\
+\x35\x8e\xeb\x46\xe1\x30\xe6\x5f\x3b\x9c\xa8\x39\xf5\xf6\xab\xc0\
+\x85\x5c\x88\x32\xa8\xe5\x4a\x04\x9b\x6b\x60\x05\x80\xa2\x26\xba\
+\x48\xc8\xf3\x1a\xec\xc6\x97\x9a\xba\xe6\x95\x86\x86\xa9\xce\x00\
+\xb9\x34\x9c\xe3\xdf\xb0\xa8\x05\xcb\x5e\xd6\xa8\x62\xc4\x6d\xb9\
+\xe6\x69\x81\xc5\x56\xbd\x10\x6e\xf5\x2c\x59\x06\x8c\x3d\x56\x57\
+\xa6\x23\x16\x36\x02\xe6\x9d\x06\xe6\xbd\x0e\x22\x41\x14\x51\xb9\
+\x22\xe6\x41\x61\x7d\x4d\x26\x6c\x54\x10\x86\xbb\x66\x2b\xea\xb6\
+\xcb\x54\xa7\x9d\xe7\x91\x66\x94\xda\xc2\xf1\xa7\xe1\xee\x7b\xd1\
+\x79\x19\x0e\xc5\x4e\xd3\x49\xad\x85\xb4\x03\xa0\xa4\xbb\xd2\xf3\
+\x80\x34\x34\xb7\x92\xb3\x79\x35\x83\x76\xbd\x1e\x00\xdf\x12\x0f\
+\xe1\x05\xaa\xa3\xc9\xad\x85\xc9\xab\x1c\x3a\xe2\x39\x1e\xfb\xd9\
+\x45\x12\xf6\xbe\x2d\x96\xd2\xe7\x41\xd4\xd0\x19\x54\x5e\xec\x08\
+\x22\xc6\xd4\xb6\x60\x35\xa0\x2d\x7d\x6b\x5a\x12\x4b\x15\xca\x5d\
+\xdd\x47\x27\x3a\x7f\x7a\x92\xee\x45\x89\xb0\xe8\x28\x0b\x50\x93\
+\x59\xd3\x86\x73\x05\x4d\xa8\x81\x6b\x5e\xff\x00\x51\x48\xbb\x5c\
+\x5b\xe7\x46\x49\x23\x4f\x9d\x5a\xb0\xe5\x62\x45\xf2\xe9\x4f\x84\
+\xf9\x88\xec\x7f\x4a\xac\x5c\x11\xe5\x3b\xd3\x62\x62\xa6\xd6\xb9\
+\xca\x7f\x4a\xd4\xa1\x48\x1a\x90\x75\xa5\x67\xca\x2e\x41\x3e\xd4\
+\x68\xc1\xb5\x17\xac\x34\x7c\x66\x8c\x52\xe3\xa6\x2d\x69\x94\x8b\
+\x74\xbf\x7a\x24\x37\x72\x37\xb5\x56\x92\x6b\x68\x01\x04\xef\x7a\
+\x98\x4b\x13\xa5\xea\xd3\x8d\x9e\x17\x29\xb1\x88\x9e\xeb\xef\x43\
+\xc4\x70\x8c\xef\xe3\xc0\xb7\xbf\xad\x40\xd8\xf5\xaa\x51\x4b\x6b\
+\x16\x24\x30\x3d\x2b\x57\x0f\x88\x59\x62\xf1\x43\x00\xc3\xd4\x01\
+\xfc\xeb\xa4\xb2\xcc\x65\x93\xa8\x36\x3a\x1a\x38\x5d\xd2\x55\x78\
+\xdb\x2b\xae\xa1\xbb\xd6\xb4\xc9\x16\x25\x2d\x2a\xef\xa8\x60\x2c\
+\x45\x65\xe3\x30\xef\x87\x97\x2b\x6a\x0e\xaa\xc3\x63\x45\x98\xa5\
+\x6c\xc5\x8c\x8a\x58\x83\x94\x71\x26\xcc\x80\x73\xa8\xc4\x44\xad\
+\x85\x99\xe6\x5b\xb9\x5c\xc7\x5d\xba\x0a\xcb\xe1\xb8\xaf\xb3\x4c\
+\x49\x17\x56\x16\x60\x37\xab\xd8\xbc\x76\x1d\xb0\xae\x91\xbb\x33\
+\x38\xb5\x8a\xda\xd5\xb9\xcb\x67\x63\x19\xc8\xe4\x48\xad\xa6\x84\
+\x56\xec\xad\xf7\x82\xfc\xc6\x6a\xc0\x17\x2c\x15\x45\xc9\xda\xb7\
+\x4a\x02\x40\x3a\x9c\xa2\xe4\xfb\x51\xc1\x72\x43\x30\x2e\x14\x1d\
+\x46\xa6\xaa\xf1\x66\x45\x85\x03\xba\xa9\xb9\xde\x89\x8b\x16\x26\
+\x2b\xaa\xde\xc2\x43\xcf\xda\xa3\x1e\x8a\x30\xcc\xc8\x35\x0d\xb9\
+\xd4\x9b\xf5\xa6\xdd\x81\x9d\x2d\x94\xf9\x9d\x47\x4d\x6e\x4f\xb5\
+\x2d\x8a\x9f\x2a\x2c\x8c\xd6\xbf\xa6\xc0\x7c\xcd\x1e\x6c\xb7\x2a\
+\x02\xf5\xb0\xb5\x2d\xdd\x8a\x9b\xb1\xd7\xbd\x73\x6c\x58\x50\xfe\
+\x38\x26\x38\xd9\x13\x52\x15\xae\x6a\xdb\x32\x9b\x95\x0e\xc7\xba\
+\xe5\xfc\xcd\x27\x00\xb6\x89\x9f\xf1\x1b\x0f\x95\x35\xc3\x91\xa2\
+\xb1\xaa\x0a\x53\x9b\xe8\xd6\x61\xf8\x7e\x1f\xef\x40\xee\xd6\xd1\
+\x88\xf6\xa9\x9d\xa2\x89\x6f\x34\xca\xbd\x86\xa6\x93\x16\x27\x0b\
+\x34\xa2\x24\x66\x0c\x76\x2c\x34\x35\x6a\x82\x36\x76\xb9\x16\x61\
+\xb3\x8d\xc5\x57\xc4\x3c\xc9\x2a\xa6\x22\x4b\xc4\xc7\x52\x39\x8a\
+\xb6\x14\xe6\x20\xe9\x61\xaf\x6a\xad\x28\x49\xe5\x12\xbd\xcc\x6b\
+\xa4\x6b\xf8\xbb\xd1\x48\x89\x12\x21\x0b\x70\x84\x58\xb5\xad\xa7\
+\x45\x1f\xbd\x73\x9b\x9b\xec\x06\xc3\xa0\xae\x66\xb9\xeb\xd0\x74\
+\xae\xb5\xf7\xa9\x04\x02\x7b\x0a\x35\x4b\x6c\x2a\x54\x51\x9d\x2a\
+\xc4\x10\x95\xd9\x45\x10\xa9\x03\xa5\x28\x39\x6a\x72\xf7\xa3\x60\
+\x91\xae\x69\xa4\x58\xc7\x7d\xea\xac\xfc\x4a\x24\x16\x82\x3c\xc7\
+\xf1\x3e\xdf\x4a\x91\xc1\x09\x16\x5b\x9e\x82\xa5\xad\x10\x1e\x34\
+\x89\x1f\x42\xc6\xb3\xe5\xe2\x38\xa7\x5b\x66\x54\xff\x00\x42\xda\
+\xa8\xcd\x21\x24\xdc\x96\x27\x72\x6b\x17\x9c\x87\x1b\x6f\x8a\xc2\
+\xb9\x03\xc6\x67\x2a\xe2\xc7\x2e\xda\xf2\xa2\x4c\x92\xdd\xa2\x91\
+\x58\x73\xed\x59\x31\x00\x11\x46\x9f\x11\x07\xbd\x80\x1f\xa9\xaa\
+\xd2\xe3\x0e\x1a\x4c\x98\x7f\x33\x83\xe6\x6f\xda\x8f\xde\x7a\xb1\
+\xa3\x8f\x90\x4b\x3f\x94\xdd\x54\x58\x55\x72\x47\x33\xf2\x14\x42\
+\x48\xf1\x10\x09\xe1\x16\xbe\x8e\xbf\x84\xd0\x5f\xf2\xa3\xd2\xe2\
+\xdd\xad\xf3\xad\x28\x50\x47\x02\x27\xc5\x6b\x9a\xcf\xc3\x29\x93\
+\x10\x8b\xd5\xab\x49\xc8\x2e\x48\xeb\x5a\xe3\xd0\xa8\x2e\x41\xf4\
+\xde\x84\xca\x2f\xb5\xaa\x76\xa5\x4c\x09\x7e\x80\xd3\xa0\xdc\xeb\
+\xd6\xa6\xf7\xdf\xe9\x48\x45\xb3\x5c\x9d\xa8\xcb\x81\xdc\xf4\x15\
+\x6a\x30\x9e\xa6\xbb\x38\xef\xf4\xa5\xa9\x20\x6b\xa9\xa3\x8c\x33\
+\x9b\x28\xf7\xed\x4e\xa1\x06\x1d\x0f\xd2\x89\x6e\x4e\x83\xf3\xa5\
+\x3c\xd8\x74\x62\xa2\x68\xe4\x90\x7c\x0a\x6a\x9e\x23\x19\x2b\xdd\
+\x41\xc8\xbf\x84\x51\xfa\x4b\xf2\xcc\x90\xfa\x9d\x58\xfe\x10\x75\
+\xaa\xf3\xe3\x65\x71\x95\x3e\xed\x7a\x2f\xf3\x54\x73\x1a\x90\xd5\
+\x9b\x6d\x38\xb0\x35\x55\x46\x17\x04\x97\x3d\xc0\xe5\xf5\x35\xd9\
+\xd9\x98\x93\x49\x6c\x42\xa6\x3c\xc5\x21\xb2\xb2\x00\x1a\xf7\xb5\
+\x1b\x5c\x3e\x5d\x49\xed\xce\x8d\x29\x73\x40\x4f\x7a\x62\xe1\xe7\
+\x71\x70\x84\x03\xcd\xb4\x14\x47\x0a\x8b\xeb\x72\xe4\xf2\x5d\x05\
+\x59\x52\xbc\x28\xd3\x4a\x72\xe8\x0f\x33\xc8\x55\xdb\x85\x40\x89\
+\xb2\x8a\x92\x48\x50\xa0\x05\x1d\x05\x2c\x9a\x7c\x0e\x26\xb8\x9a\
+\x12\x7b\x9f\x6a\x16\x63\x7d\xf4\xa8\xa5\x9a\xa0\x35\x05\x48\x1a\
+\xd1\xa8\xc5\xa6\x21\x03\x52\x69\x4b\xbd\x1a\xd2\x8c\x50\x73\x66\
+\x5b\x0e\x97\xa6\x40\xcc\x24\xcc\xc2\x96\xa7\x4a\x34\xad\x46\x55\
+\x71\xe8\xd0\xb9\x16\xf2\xb6\xc7\xb5\x0e\x18\x31\xd4\x5b\x5d\x35\
+\xad\x06\x41\x34\x46\x33\xbd\xbc\xa6\xa8\x94\x78\xd8\xad\xac\x6f\
+\xb1\xe5\x45\x98\x62\x52\x56\x0d\x6b\x0d\xfa\x53\x73\xbd\xaf\x6b\
+\x52\x61\x42\xad\x99\x88\xf6\xa3\xbd\xee\x3a\xd1\x0a\x74\x61\x63\
+\xa8\xa7\x42\x86\xde\x45\x36\xa5\xa2\xd8\xd8\x00\x5b\x73\x7d\x97\
+\xdf\xf8\xa2\x96\x35\x93\x43\x34\x99\xb9\x36\xc0\x7c\xa9\x82\x9a\
+\x8a\x19\x8e\x6d\x02\xe9\x4e\x85\xbc\x39\x03\x28\xb6\xba\xf7\xa4\
+\xa3\x1b\x28\x60\x3c\x45\x16\x65\xfc\x43\xa8\xa2\x57\xcc\x6c\x10\
+\x83\xdf\x95\x6a\x06\xb6\x1d\x95\x96\xe8\x6e\xbb\xdb\x9a\xf6\xa6\
+\x90\xb2\x46\x63\x91\x43\x29\xfa\x8f\x6a\xcf\xe1\xb2\x78\x73\x65\
+\x63\xe5\x7d\x0d\x68\x01\x63\xde\xba\xca\xcd\x66\x63\x30\x92\x40\
+\xd9\x87\x99\x0e\xcc\x29\x1a\x1d\x6f\xad\x6e\x03\xa5\xb7\x07\x71\
+\xd6\x90\xd8\x3c\x2b\xbe\x6c\xac\xa4\xf2\x07\x4a\x2f\x1f\xe2\x95\
+\x5b\x83\x42\x5a\x63\x3b\xdc\xaa\x0d\x3b\x9a\xd1\x94\x93\x0c\x86\
+\xe7\xd2\x4d\x72\x85\x54\x08\x83\x2a\x8d\x85\x73\x6b\x1b\x8e\xaa\
+\x7f\x4a\xd4\x99\x06\xf6\x06\x8f\x2b\x80\x1a\xea\xb4\x38\xd7\x8a\
+\x3c\x3b\xac\xa7\x56\x5b\x85\x1b\xd3\x66\x91\x62\x8d\xa6\x6d\x94\
+\x5c\x77\x35\x8a\x5a\x4c\x46\x2f\x31\xbb\x16\x3a\xfb\x51\xca\xe2\
+\x9d\xa9\xcd\xc4\xe3\x5d\x23\xc3\x82\x35\x3e\x76\xaa\xf2\x71\x59\
+\xb4\xcb\x14\x40\xff\x00\xa6\xf5\x64\xe0\x30\xe9\x33\x09\x5d\x9c\
+\x8b\xf9\x46\x80\x51\xa2\x41\x1b\x7d\xd4\x08\xa7\xa9\x17\x35\xc3\
+\x39\x37\xd1\x7f\x6d\xc5\xa4\x68\x04\xa5\x5b\x28\x2d\x6e\xa6\x91\
+\x36\x27\x11\x26\x8f\x33\x90\x4d\xce\xb5\xbc\xd6\x51\x91\x51\x00\
+\xb0\xd3\x28\xa4\xcb\x0e\x1d\xc1\xcd\x87\x8c\x9e\xa0\x58\xd6\xaf\
+\x1b\xfd\x5a\xf3\x6e\xec\x58\xe9\xa9\xe7\x51\x77\x8c\x82\xa7\x5b\
+\xd6\xe8\xc3\xe1\x51\x48\x18\x54\xee\x49\xbd\x56\xc5\x70\xe8\xe5\
+\xf3\xe1\xce\x56\xff\x00\xdb\x3c\xfd\xab\x17\x85\x3a\x9c\x3e\x39\
+\x71\x11\xa4\x78\x80\x10\x1d\x59\xaf\xea\x02\xdb\xfd\x45\x58\x90\
+\x66\x5b\xa1\x42\x08\xf2\xd9\x86\xd5\x91\x30\x29\x9e\x33\xff\x00\
+\x2d\x55\x2d\xdc\x9b\x9a\x47\x85\x26\x5c\xd9\x18\x0e\xb6\xab\xf5\
+\x62\xc6\xc1\x78\x21\x07\xc6\x9d\x10\xf4\x1a\x9a\x4b\xf1\x28\x14\
+\xda\x28\x19\xf5\xdd\xcd\xbf\x4a\xcc\xb5\x12\xa8\xe9\x47\xee\xfc\
+\x58\xd2\x4e\x27\x11\xd2\x4c\x3e\x5e\x99\x5b\xf9\xa7\xae\x23\x06\
+\xc3\x37\xda\x32\xf6\x23\x5a\xce\x87\x05\x3c\xab\x9a\x38\x0b\x03\
+\xce\xd4\xd4\xe1\x78\x92\xd6\x78\x84\x63\xab\x5a\xb5\x2f\x25\xd2\
+\xeb\x63\x30\x6a\x09\x12\xbb\x9e\x81\x6d\xf9\xd2\xbe\xdd\x88\x98\
+\xe4\xc2\x41\x97\x4d\xed\x73\xf5\xae\xc2\xf0\xec\x34\x63\x34\x8e\
+\xd2\x37\x41\xa2\x8a\xb6\x32\x85\xca\x8a\x15\x7a\x0a\xd7\x63\xa5\
+\x13\x82\x9a\x43\x9f\x11\x38\x56\x3b\x86\xb9\x34\x63\x87\x41\x94\
+\x03\x33\x5c\x6e\x72\xe8\x7d\xaa\xdd\x8d\x71\x01\x57\x33\xb0\x51\
+\xd4\xd5\x91\x6a\xaf\xfe\x99\x87\x2c\x2d\x3c\x84\x7e\x1c\xbb\xfd\
+\x28\xfc\x3e\x1d\x85\xda\x10\xcd\xd0\x9c\xc7\xfb\x52\xf1\x58\x92\
+\xde\x58\xae\xab\xd7\x99\xaa\xc0\x58\x97\x63\xa2\xea\x4d\x66\xd9\
+\x3c\x38\x6c\xd3\x34\xae\x5b\x2e\x51\x1a\x8b\x5b\x99\x27\xfb\x52\
+\x25\xc3\xe1\xf1\x6b\x91\xd3\x24\x9f\x0b\x8d\x01\xf7\x15\xcc\xc5\
+\x57\x33\x7a\xa4\x39\x98\x74\x1c\x85\x75\xae\x34\xac\xd2\xcd\xc1\
+\xcb\x27\x0f\xc7\x94\x9c\x30\x53\xa3\xaf\x51\x5a\x33\x20\x52\x0a\
+\x9c\xca\xc2\xe0\xf5\x15\x5f\x8f\xa6\x7c\x3c\x13\x5b\xcd\xaa\x13\
+\x6d\xfa\x55\x8e\x03\x1c\xb3\xe1\x4c\x33\x02\xa1\x35\x46\x6d\xed\
+\xcc\x51\x3d\xc5\xff\x00\x4e\xe1\x91\xfd\xe9\x97\x92\x0f\xce\xad\
+\x11\x52\x02\xaa\x04\x41\x65\x1f\x9d\x41\xda\xba\x66\x46\x50\x45\
+\x0b\x0b\xd4\x9a\x83\x52\x09\x5d\x2c\x49\xb5\x47\x6d\xbe\x54\x44\
+\x8a\x8b\x83\x52\x71\xd0\x0d\x0b\x13\xb2\x8e\x75\x57\x17\x8d\x77\
+\x06\x3d\x90\x1f\x42\xe8\x3e\x7a\xdc\xd3\xf1\x44\xae\x14\xb8\x36\
+\x28\x41\x07\x6f\x7a\xcc\x7b\xe6\x37\xde\xf5\x9e\x57\x0c\x11\x48\
+\xe5\xb6\x48\xd2\x39\x14\xdd\x4a\x8b\x03\xd8\xd3\x24\x1e\x21\x32\
+\x2a\x90\x6f\xe7\x5e\x6a\x69\x17\x14\x78\x9c\x40\xc3\xe1\x52\x6b\
+\xa8\x99\x89\x11\xb1\x1b\x0e\xf5\x82\x91\x7b\x5e\xc6\xdd\x6a\xcc\
+\x18\x57\x70\x19\xce\x45\x3c\xce\xe6\xa8\x60\x31\xbc\x52\x66\x76\
+\x9b\x13\x85\xc8\x8b\xba\x1e\x7c\xaf\x57\xb0\xdc\x4e\x53\x88\x48\
+\x31\x30\xc4\xcb\x26\x89\x2a\x8b\x0b\xf7\xa7\x8d\x95\x76\xb4\x70\
+\xf8\x36\xb6\x78\x33\x30\x16\xce\xc6\xe7\xe9\x4c\x8d\xb2\x05\x88\
+\x15\x03\x64\x60\xb6\xbf\x63\xde\x80\x99\xd4\x5a\x48\x23\x24\x6e\
+\x11\xac\xdf\x4a\x15\x9b\x0f\x22\xb2\x34\x99\x3a\xac\x9a\x11\x5d\
+\x3a\x64\xc6\x24\x9d\x77\xef\x40\xc6\xe7\xd8\xeb\x4a\x93\x17\x1a\
+\x49\x91\x88\x91\x46\xce\xa7\x5f\x9d\x13\x9d\x99\x4e\x65\x61\x71\
+\xde\x8d\x38\x96\x6a\x02\xd5\x04\xdf\x9d\xbb\x50\xb9\xb7\x3b\x50\
+\x5c\xcd\x50\x6a\x2e\x2f\xa0\xbf\xb5\x46\x60\x76\xbe\xb4\x24\xeb\
+\x7a\x82\x58\x5b\x4b\x51\xc8\x22\x8d\x7e\xf1\x82\x9e\x97\xb9\xa8\
+\xc3\x78\x53\x12\x15\xce\x6e\x4a\x74\xbd\x48\x71\x5b\x2e\x9b\xf3\
+\xa3\x03\x5a\x0f\x0b\x5d\xed\xef\x46\xa2\xca\x05\xef\x4a\x1a\xd3\
+\x12\x82\x31\x4c\x02\xd5\xa8\xc8\xd2\x98\xf1\xac\xcb\x95\xf4\x3c\
+\x9b\xa5\x29\x69\xe9\xbd\x69\x33\xe6\x8d\xe2\x72\x8e\x35\x1f\x9d\
+\x08\xad\x39\x23\x59\x93\x23\xef\xf0\xb7\x4a\xce\x91\x19\x24\x28\
+\xc0\x82\x0d\x62\xcc\x32\xe9\xae\xb9\x4f\x87\xbd\x8e\xa4\x9d\xcf\
+\x33\x5c\x05\x1c\xdf\xe7\x37\xb9\xb5\x0d\xe9\x02\x53\x70\x15\xaf\
+\x61\xb7\x51\xdc\x53\x16\xec\x72\x9f\x58\x17\xb0\xd9\x87\x51\xfc\
+\x52\x81\xa9\x92\xed\x87\x70\x2f\x75\x19\x92\xdb\x83\x4c\x47\x29\
+\x37\x16\xde\xb5\x0c\xf1\x05\x52\xee\x01\x20\x68\x35\xaf\x3f\x06\
+\x2b\x17\x31\x11\xa1\x05\x8f\xc5\x6d\x7e\xb5\xbd\x87\x89\x61\x85\
+\x50\x85\x66\xb0\xcc\x6d\x7a\xd7\x1b\xa2\x9a\x45\x8e\x86\xa4\x5c\
+\xd2\xd4\xaa\x7d\xd9\xd1\x6f\xe4\x27\x6f\x6a\x60\x16\xde\xb6\x04\
+\x2a\x31\x04\x58\x44\x0d\x8b\xee\x7a\x0a\x0c\x54\xf1\xe1\x94\x67\
+\xbb\x3b\x0b\xac\x60\x6a\x47\x5e\xd5\x9d\x36\x26\x69\x59\x89\x01\
+\x2e\x2c\x15\x4d\xc9\xf7\xaa\xf2\x90\x48\x77\x10\x99\xb1\x58\x85\
+\x82\x1b\x95\x1a\x0e\xe6\x9b\x0c\x71\xe1\x90\xc6\x08\xb9\x1e\x66\
+\xeb\x4b\xc1\xc0\x62\x87\x3b\x2b\x09\x1f\x6e\xc2\x98\xca\xbb\x9d\
+\x7d\xe8\xff\x00\xa5\x4b\x8a\x80\x31\x02\x40\x2c\x24\x17\xf9\xf3\
+\xaa\x97\xd6\xb4\x31\xe9\x9f\x0d\xa0\xd6\x33\x7f\x95\x67\x1d\xeb\
+\x1c\xbd\x31\xa6\x5b\x32\x2b\x8f\x89\x45\x2c\x92\xca\x6d\xa5\xff\
+\x00\x3a\x5e\x0d\xf3\x41\x97\x9a\x7e\x94\x43\xa0\x36\xa8\x16\x49\
+\x36\xb8\xd3\xad\x14\x7a\x4a\xa7\xa1\xa2\x2b\xe4\xca\x35\xcd\xce\
+\xb8\x47\x76\x00\x54\x75\x8f\xc4\x6e\xb8\xa6\x70\x80\x17\x21\x9b\
+\xb9\x06\xa8\xe2\x23\x9d\x65\xf1\xf0\xec\xc7\x5b\x94\xbd\xed\xf2\
+\xad\x4e\x2d\x22\xc9\x8a\x7c\xa3\xc9\x1a\xe4\xbd\xb7\x6e\x75\x44\
+\xe6\x04\x10\x6c\x6f\xbd\x72\xe5\x3b\x6e\x22\x71\x63\x72\x02\x92\
+\xb7\x20\x72\x34\xce\x16\x10\xe3\x61\x32\x80\xc9\x9b\x51\x4b\x75\
+\xcf\xb9\xf9\xd0\x46\x5a\x39\x01\x53\xa8\x34\x79\x53\xd1\x4a\x49\
+\x94\x8e\x9a\x1d\x2d\x51\x63\x41\x81\xc4\x2e\x2e\x30\x09\x02\x65\
+\x1a\x8b\x7a\xbb\xd3\xc2\x9b\x5f\x61\xde\xbb\x30\x55\xad\xca\x89\
+\x41\x27\x4a\x87\x96\x04\xde\x4c\xc7\xa2\x8b\xd5\x79\xb1\x2e\xc3\
+\x2c\x63\x20\xeb\xce\x8d\x5d\xac\xcb\x24\x71\x03\x9d\x81\x6f\xc2\
+\x37\xaa\x38\xdc\x43\x34\x2d\x29\x4c\xd9\x48\x01\x6f\xa0\x14\x36\
+\x24\xde\x89\x55\x4a\x95\x7f\x4b\x0b\x1a\x2d\xb4\xe4\x84\x47\x39\
+\x91\x6e\x30\x8f\x6e\x45\x4d\xe9\x18\x99\x64\x98\x18\xa3\x85\x94\
+\x73\x16\xb9\xad\x08\xd4\xa4\x69\x11\x36\x2a\x2c\xa4\x1d\x1b\xfb\
+\xd4\xb1\x6b\xdc\x92\x1b\x6b\xf3\xac\xe6\xc3\xaa\xb6\x26\x24\x2e\
+\x2c\xc5\x7c\xc2\xd5\xd1\xa3\x19\x02\xa0\x27\x31\xb5\xa9\xae\x09\
+\x37\x26\x9f\x80\x0a\xaa\x64\xb7\x9a\xf6\x14\xc8\x8a\xe2\x31\x24\
+\x18\x35\xcd\xe6\x7f\x13\x4b\x8d\x2f\x6a\xa9\x81\x91\xd7\x88\x46\
+\xd9\x89\x25\xad\xa9\xab\xdc\x6e\xc7\x07\x10\x36\xf5\x1a\xad\xc1\
+\xe2\x0f\x8a\xf1\x18\x79\x62\x19\xbe\x7c\xa8\xbf\xec\xa7\x8b\xd2\
+\x8c\xb2\x30\x1b\x03\x42\x68\x98\xdd\x89\x3c\xe8\x6b\xa0\x41\xa1\
+\x22\x8c\xd4\x11\x59\x40\xcb\xda\xba\xdd\xa8\xab\x8e\xd5\x24\x04\
+\x8e\x55\xf0\xa4\x24\x03\xcc\x72\xd2\xb3\x71\x11\x15\x95\xa3\x60\
+\x04\xa9\xb8\xe4\xc3\xa8\xad\x2a\xab\xc4\xcf\xdf\xea\xc4\x1d\x19\
+\x1b\xa7\x6f\x6a\xcf\x29\xd1\x8c\xf2\x29\x7c\x62\x31\x2f\x08\x12\
+\x58\xe6\x81\xec\x35\xe4\x6a\xd4\xaa\xa4\x16\x5d\x34\xb9\x43\xb8\
+\xfe\x47\x71\x4a\xc5\xdb\xff\x00\x47\xc4\xdc\x1b\x1c\xb6\xb8\xef\
+\x5c\xec\xe8\xb3\xb8\x3b\x5e\x39\xe3\xfe\x90\xdf\x4a\xb2\x8c\xa5\
+\x32\x48\x09\x5b\xdc\x58\xd8\x83\xd4\x56\x7e\x12\x53\x06\x21\x64\
+\x1b\x0d\xfb\x8a\xd0\x9d\x02\xbf\x94\xf9\x48\xba\x9e\xd5\x89\x7a\
+\x6a\xb4\xe3\xc7\x4c\x70\xba\xb2\xbb\x47\x6b\x31\x1e\xa5\xeb\xd8\
+\xd5\x59\x1c\xc9\x31\x77\xe6\x6e\x6d\x4e\xe0\x20\x3a\x4e\x8e\x33\
+\x28\x50\x6d\x56\xc4\x38\x61\xa8\x83\x5e\xec\x48\xae\xb3\x6c\xd6\
+\x4a\x9a\x2c\x33\xe1\xcb\x40\x09\x60\x34\x02\xe4\xfc\xc5\x27\x0d\
+\x8a\x68\x87\x87\x22\x66\x5e\x9b\x11\x57\x73\x90\x00\x5f\x28\x1b\
+\x05\xd0\x0a\x09\x95\x66\x89\xfc\x45\x04\xaa\x92\x18\x0d\x69\xb3\
+\xf8\x80\xb8\x8c\x33\x9d\x59\x90\xf5\x23\xf8\xae\x02\x37\x92\xd1\
+\xb7\x88\x6d\x7d\x36\x1e\xe4\xd5\x48\xb0\xd3\x49\x1e\x74\x8c\x95\
+\xeb\x57\x30\x51\x34\x38\x76\x0e\xb6\x77\x23\x9e\xb6\xa2\x5b\x7d\
+\x54\x72\x00\xab\x72\x83\x2f\x36\x46\xbd\xbd\xc5\xab\x92\x10\x40\
+\x28\x33\x03\xb1\x06\xf7\xa3\x8c\x95\x37\x06\xb9\xa2\x85\xbe\x12\
+\x87\xf1\x21\xb5\x6f\x02\xb6\x32\x0f\x1b\x1a\xa9\x18\xf3\x10\x33\
+\xdb\x61\x56\x06\x1a\x0b\x04\x55\x0a\x57\xd3\x27\x3b\xd3\x22\x48\
+\xe2\x8f\x24\x40\xd8\xfa\x98\xee\xd4\x56\xaa\x45\xa8\x61\x71\x98\
+\x80\x1a\xf9\x5c\x03\xb1\xa5\xa6\x6c\xf6\xb0\xbf\x7a\xb1\xb8\xcc\
+\x6e\x54\x8b\x35\xb5\xb5\xb6\x3f\x4b\x83\x5c\x22\xb9\x00\x26\x6b\
+\xec\x46\xb7\xfa\x53\x80\x2a\xa7\xf1\x0f\xa5\x15\xb5\xb5\x19\x8e\
+\x45\x5b\xb2\xb0\x1f\xd4\xbf\xbd\x42\x03\x7b\x90\x05\xb6\xad\x27\
+\x20\xa6\xa0\xa8\x51\x46\x2a\x16\x8d\x57\x4a\x4f\x10\x8e\xea\xb3\
+\x00\x09\x0a\x46\xbc\xcf\x2f\xd6\x9e\x9b\x0a\xec\x55\x86\x02\x52\
+\x76\x16\xf9\x6b\x50\x8c\xcc\x44\x8d\x98\xe4\x5b\xd8\x74\xd8\x54\
+\x07\xba\x86\x1c\xe8\x1c\xb2\x5c\xdb\x51\xb8\x35\x03\x45\x03\xe7\
+\x58\xd6\xf0\xd5\x6a\x34\x62\x0d\xc1\xd6\x90\x0d\x1a\xb6\xb5\x6a\
+\xc5\xcc\x10\xf1\x27\x55\xb0\x00\x9b\xb5\x85\x69\x06\xb9\xbd\x53\
+\xc0\xc7\xe1\x45\x99\xbd\x6e\x3e\x82\xac\x29\xae\x93\xa8\xcd\x3d\
+\x4e\x96\x3a\x83\xc8\xd2\xf1\x52\xb6\x16\x0c\xf1\xc8\x00\x26\xca\
+\xac\x2f\x63\x52\xa6\xa9\xf1\x32\xd3\x71\x05\x81\x6e\x42\xd9\x40\
+\xef\xce\xb5\x6f\x41\xd8\x3c\x3c\x98\x96\x32\x3b\xb6\x52\x7c\xce\
+\xdb\xb1\xab\xf0\xc7\x0c\x2b\x68\xd0\x7f\xa8\xee\x6b\x88\x54\x02\
+\x34\x16\x55\xd0\x5a\xa2\xe6\xa9\x31\x22\x46\xcb\xa1\xbd\xb9\x1a\
+\x02\x74\xa9\x90\xe9\x40\x08\xd8\xde\xfb\x55\x52\x01\xf3\x6a\x2e\
+\x0e\xe2\xb3\x71\x91\x18\xa6\x2a\x76\xdc\x1e\xa2\xb4\x89\xd7\x63\
+\x49\xc5\xc4\x26\x87\x2f\xc6\xba\xaf\x7e\xd5\x9b\x34\xc6\x7c\x32\
+\x98\xa5\x0e\x35\x1b\x11\xd6\xae\xdd\x4a\x86\x53\x75\x3b\x56\x71\
+\xd0\xdb\xa5\x1e\x12\x73\x11\xca\xd7\x28\x77\x1d\x2b\x12\x9b\x17\
+\xc6\xa2\xa5\xe5\xf0\x20\x79\x88\xcd\x94\x69\xf3\xa1\x5b\x10\x1d\
+\x4d\xd4\xd2\xe7\x99\xfc\x76\xc2\xb2\xab\x2b\xec\x6d\xaf\x6a\xd0\
+\x8c\xb9\x41\x22\xda\x79\x18\x83\xae\xf7\xd4\x1f\xce\x94\xa3\x3b\
+\x65\x22\xc0\x9d\x7b\x55\x8c\x4c\x18\x88\x03\x09\xf5\x77\x6c\xd7\
+\x1b\x6d\xa5\x20\xdc\x6a\x2d\x5c\xab\x6d\x75\xe1\xd8\x45\xb4\x6d\
+\x03\x35\xc7\xac\x36\xf5\x9d\xc5\xf0\x70\xe0\x98\x66\x72\x43\x6a\
+\xa2\xda\xfc\xe8\xb0\xf8\x9c\x42\x59\x44\xec\x14\x6b\x60\x6b\x37\
+\x13\x3c\xb3\xc9\x9a\x59\x19\xcd\xf9\xd3\xcb\x94\xcf\x04\x94\xc8\
+\x31\xd2\xc2\xe1\xa1\x0a\xb6\xfe\x9b\x9a\xd4\x79\x8e\x22\x24\x9e\
+\xe4\x86\x1a\x8b\xec\x79\xd6\x22\x29\x76\x0a\xa2\xe4\xec\x05\x6d\
+\x61\x22\x68\x70\x29\x13\xfa\xae\x49\x1d\x2f\xca\x8e\x16\xd3\x62\
+\x10\x86\x17\x15\x36\x14\x4a\x8a\xa6\xe0\x57\x11\x5b\x64\x26\xf5\
+\xd5\x35\xd6\xa9\x39\x4e\x99\x48\x0c\xa7\x91\x1b\xd1\x7c\x36\xb9\
+\x60\x36\x3f\x10\xf7\xeb\xef\x43\x6a\xed\x8d\x48\x2e\xba\x66\x04\
+\x10\x76\x20\xdc\x1a\xb1\x82\x17\xc3\x9e\xaa\xd4\xab\x82\x6e\x49\
+\x04\xee\x47\x3f\x71\xb1\xa6\xe0\x0d\xa7\x31\xb6\x50\x59\x74\xe8\
+\xdd\xc5\x53\xd5\x7c\x27\x8e\x1f\xf8\x58\x56\xda\x96\x26\xbb\x85\
+\x47\x93\x04\xd2\x5f\x59\x1a\xdf\x4a\x57\x18\x94\x4d\x89\x58\xa3\
+\x20\xaa\x0b\x0f\x7a\xbc\x23\xf0\xa1\x48\x41\x07\x22\xd8\xfb\xd5\
+\x3f\xdb\x57\xc2\xce\xf5\x07\x6a\x93\x73\x7d\x28\x4e\xf4\xd4\xeb\
+\x9a\xed\xeb\xaa\x39\x50\x9c\x4d\x09\x35\x26\x84\xd4\x90\x5b\xa5\
+\x56\xe2\xba\xf8\x6d\xd5\x48\xab\x06\x91\xc5\x01\xf0\x22\x16\x3a\
+\xdc\xd6\x6f\x85\x55\x1b\x41\x1b\x6c\x0d\xc1\xe6\x3b\x8a\x2c\x52\
+\x99\x70\x18\x88\x55\x7e\xf1\x6d\x70\x36\x24\x6b\xa7\xb8\xa4\xb0\
+\x24\xe5\xda\xd4\xd4\x6b\x62\x1a\x3b\xe5\x91\x95\x5d\x0f\xca\xd6\
+\xac\x42\xc0\x65\x60\xcd\x71\x6d\x76\x3b\xd6\x86\x05\xbc\x5c\x0d\
+\x89\xf3\x42\x6d\xff\x00\x49\xab\xf3\x47\x06\x20\x9f\xb4\xc1\x67\
+\xe6\xe9\xa1\xfa\x50\x61\xb8\x77\x85\x24\x86\x09\x44\xa8\xe8\x46\
+\x5d\x9a\xfc\xb4\xac\xce\x16\x53\xa7\x70\x01\xac\xe7\x96\x4f\xde\
+\xae\x1d\xa9\x5c\x26\x16\x8b\x0b\x23\x3a\x95\x32\x10\xa0\x11\x6d\
+\xa9\xc4\x76\xae\xb3\xc0\x00\x09\x36\x02\xf4\x38\xb7\x10\xe1\xdf\
+\x31\xb3\xb8\xb0\x1c\xed\x5d\x88\x38\x87\xc5\x88\x22\x93\x22\xb2\
+\x06\xf6\x16\xa1\x9f\x06\x83\x0e\xef\x79\x0b\x28\xbe\x76\xd8\xf6\
+\xab\xff\x00\x01\x18\x2c\x48\x48\xc4\x72\x29\x28\x35\x04\x6e\x2a\
+\xca\xcb\x86\x94\x12\x98\x80\x00\x3f\x10\xb5\xeb\x39\x04\x92\x9f\
+\x06\x25\x2c\x58\xed\x6a\xb6\x9c\x39\x96\xe0\xcc\x99\xbf\x09\x16\
+\xfc\xeb\x32\xdc\x2b\x48\x84\x0c\xc0\x82\xa7\x40\x41\xbd\xe8\xd4\
+\x69\x4b\xc2\x44\xd0\x21\x8d\xca\x92\xc7\x37\x94\xdf\x91\xa6\xd6\
+\xe0\xa9\x14\x4c\x52\x38\xcc\xb2\xb6\x54\x1c\xed\x72\x7d\xaa\x10\
+\x28\x53\x24\x87\x2a\x2f\xa8\xfe\xd5\x99\x8b\x9e\x4c\x5e\x23\x41\
+\xa0\x36\x45\x1c\x85\x56\xe0\x5b\x6e\x26\x43\xe5\xc2\xc0\x2f\xc9\
+\x9b\xcc\x4f\xca\x8a\x57\xc7\xaa\x91\x24\xb9\x21\x91\x6f\x90\xb8\
+\x56\x53\xda\x9f\x84\xc3\x47\x83\x50\x02\x86\x9b\x76\x72\x3d\x3d\
+\x85\x76\x35\x4c\xd8\x62\xbe\xa6\x53\x98\x5c\xdf\xde\x9c\xb9\xda\
+\x26\x0c\x37\x14\x8c\xf8\x89\x88\x1a\x8f\x4f\x8b\x76\xb7\xb5\x1a\
+\x63\xe6\x89\xc4\x78\xc8\x73\x10\x6c\x58\xe8\xc3\xf9\xa6\xc3\x89\
+\x56\x44\x56\x8e\x42\xcb\x60\xc5\x75\xfc\xaa\xc3\x2c\x73\xc6\x52\
+\x4b\x4a\x9f\x46\x5a\x64\xfe\x55\xbf\xd4\xc2\x63\x9d\x73\x41\x20\
+\x71\xd0\xe8\x47\xca\xa4\x82\xa6\xc4\x5b\xde\xa9\x62\x78\x6c\x89\
+\xf7\x98\x66\x2e\xa0\x7b\x30\xae\x83\x88\x4b\x1d\x93\x10\x9e\x22\
+\x8e\xba\x30\xf9\xd5\xbf\xd1\x9f\xc5\xe5\x26\x97\xc4\xcf\xfc\x1a\
+\xc2\x0f\x9a\x76\x20\xff\x00\xa7\x99\xa6\x46\xd1\xcd\x1e\x78\x5b\
+\x30\x03\x51\xcd\x6a\xb7\x13\x90\x7d\xa5\x23\x3b\x04\x28\x18\xf2\
+\x6b\xde\xd4\xdf\x14\xf5\x51\x81\x92\x14\x63\x60\x59\x75\xb7\x22\
+\x34\xa5\xc4\xc4\xa5\xb2\x93\x97\x4d\x28\xf1\x09\x96\x49\x63\x24\
+\x8b\x36\x70\x0e\xe0\x1f\xef\x53\x83\x86\x59\x17\xd2\x04\x77\xf5\
+\x1a\xe7\xf5\xa4\x00\x4f\x23\xfa\xd5\xdc\x16\x16\xd6\x92\x51\x71\
+\xb8\x5e\xbe\xf4\xdc\x2c\x70\x44\x40\x52\xa2\x53\x7b\x16\x3a\xff\
+\x00\x6a\x64\x88\x54\x16\x98\x65\x03\x76\x23\x5a\xdc\xe2\x2d\x33\
+\x52\x46\xd7\x3b\x0a\xec\xc0\x10\x0d\x66\xcf\x36\x69\xfc\x41\x7c\
+\xab\x6c\xa7\xb7\x7a\xd1\x23\xc4\x54\x90\x69\x9d\x73\x53\x28\xc3\
+\x90\xf4\x35\x4e\x56\xf0\xf8\xe1\x3c\x84\xb5\x66\x25\xd4\x29\x27\
+\x53\xb5\x66\x62\x8e\x6e\x2e\xcd\x60\x4f\x8a\x36\xe7\xad\x36\xf4\
+\xa3\x66\x4d\x24\x60\x39\x1a\x8b\xe9\x43\x35\x8c\xcf\xa0\xdc\xf2\
+\xa8\x0c\x47\x7f\x9d\x6b\x42\x0b\x5c\x91\x44\xbc\xe8\x52\xc4\x74\
+\x23\xad\x70\x37\xed\x6d\xe8\x48\x7e\x7d\x28\x2f\xa5\xea\x64\x36\
+\x5d\x4d\x46\xf4\x54\xa9\xc4\x60\xce\xa6\x64\x1a\x8f\x58\x1f\xad\
+\x51\xb0\xad\x70\x1b\x3d\xd4\x12\x7b\x55\x7c\x56\x0f\x31\xbc\x6b\
+\x91\xb9\xa9\xe7\xed\x59\xb3\xeb\x52\xaa\x61\xe5\x78\x49\xca\x6e\
+\x0e\xe0\xec\x6a\xdc\x13\x47\x26\x24\x16\x21\x18\xc7\xe5\xbe\xdb\
+\xf5\xaa\x45\x48\x36\x3b\xd4\xb0\x6f\x23\x80\x4e\x4b\x86\x03\x7b\
+\x1a\x25\xa6\xb4\x58\x39\x1e\x19\x4c\xea\x77\x04\x5c\x52\xfe\xc3\
+\x85\x63\x7f\xb2\xb0\x3c\xf2\x35\x87\xd2\xa8\xea\x23\x0f\x1c\xbe\
+\x5e\xa0\xfe\xa2\xa0\x4f\x23\xe8\x5d\xaf\xef\x57\xea\x7d\x18\x6e\
+\x22\x0c\x34\x2e\x55\x73\x3d\xc5\x8f\x9b\x6a\x54\x71\xe1\xd1\xc1\
+\x8f\x0a\xa0\xff\x00\x56\xb5\xc0\x51\xa8\xd2\x82\x2c\xc4\x9d\x95\
+\x40\xfc\x20\x54\x85\x5b\xfa\x45\x08\xa9\xbd\x20\x56\xf7\xfa\xd4\
+\x1f\x7a\x8b\xd7\x6a\x6a\x4e\x3b\xee\x3e\x95\xd6\x3d\x45\x4d\xab\
+\xaa\x48\x1b\xdb\x63\x5c\x74\xa9\xde\xba\xc7\xb1\xa9\x20\x94\x48\
+\x8c\xb2\xb6\x54\x1c\xfa\xd5\x29\xf8\x89\x91\xbc\x28\x07\x86\x3e\
+\x16\x27\x5b\xf7\xae\xe3\xce\xde\x2c\x71\x0d\x15\x50\x1b\x77\x34\
+\xee\x19\x86\x8e\x2c\x32\xe2\x24\x50\x59\x86\x60\x4f\xc0\xbd\x7d\
+\xeb\x3b\x6d\xc8\x73\xad\x3b\x04\xb0\x9c\x42\xe2\x66\x5f\x0f\x38\
+\xcc\xaa\xdb\x5e\xad\xcb\x7c\xc6\xfb\xd2\xf0\x91\xc6\xf0\x09\x64\
+\x19\x9f\x31\x39\x49\xd1\x6f\xa8\xa6\x4a\xda\x92\x6b\x70\x7d\x2f\
+\xe1\x14\x24\x54\xee\x2f\xb0\xae\x53\x7d\x41\x20\x76\xa5\x04\x8e\
+\xd4\x07\xc4\xbe\xc2\xdd\xa8\xc9\x39\xf2\xef\x50\xc6\xc4\x0e\xb4\
+\x20\x9a\x13\x46\x68\x1b\x40\x4f\x4a\x10\x4e\xa6\xf5\x53\x8a\x13\
+\x26\x24\x22\x7c\x20\x00\x07\x33\x57\xa1\x1e\x23\x6a\x3c\xab\xa9\
+\x17\xde\xa8\x46\xc1\xb1\x99\xdb\x7b\x97\xfa\x6b\x59\xe4\xd4\x2a\
+\x00\x7c\x67\x48\x99\x57\xc2\xb6\x79\x48\xbe\xbd\x05\x0e\x23\x06\
+\x26\x97\xc4\x8f\x16\xc5\xfa\xca\x2c\x4f\xcc\x69\x4f\x2b\xe1\x40\
+\xa9\x6b\x34\x87\xc4\x93\xdc\xf2\xa8\x55\xbe\xf5\x9c\xeb\xb4\x98\
+\xe3\x9f\xc1\x3f\x68\x42\x19\x3d\x2e\x35\x0c\x2a\xc7\x0b\x4f\xf3\
+\x24\x3f\x08\xb0\x3d\xea\xae\xe0\xe5\x1b\x75\x35\xa3\xc3\x93\xfe\
+\x04\x58\x80\x59\x89\x60\xcc\x05\xad\xa5\x6a\x0a\x8c\x6e\x21\x20\
+\x11\x19\x95\x9f\xc4\x04\xe6\xcd\xa8\xd6\xd4\x50\xaa\x4e\xb9\xb0\
+\xce\x24\xed\xb3\x0f\x95\x27\x8b\x64\x64\x80\x85\x0f\x95\x4f\x99\
+\x9b\x2a\x03\x7f\xce\xa9\x78\xe1\x08\xfb\xc7\x62\x0e\x9e\x19\xc8\
+\xa3\xdb\xad\x57\x96\x5e\xd6\x74\x6f\x13\x90\x8c\x68\x31\xbd\x8a\
+\x28\x17\x1d\x45\x36\x18\x04\x98\x70\xf8\x89\x24\xcd\x26\xa3\x5d\
+\x87\xb5\x57\x82\x07\xc6\x67\x95\x0a\xa9\x07\xcc\x09\xb7\xce\xb4\
+\x25\x3e\x7d\x35\xb0\x00\x77\xa2\x77\xda\x56\xc0\xe1\xcc\x12\x34\
+\x99\xd7\x2e\x56\x02\xc7\x52\x4d\x34\x0f\x95\x48\x50\xa2\xc3\xf3\
+\xa1\x93\x53\x6e\x94\xe6\x21\x8b\x16\xd3\x97\x3a\x62\x85\x08\x5e\
+\x46\xca\x8b\xbb\x54\x44\xaa\x22\xcf\x21\xca\x8a\x35\x35\x43\x15\
+\x34\xb8\xe9\x84\x50\xa1\xc8\x0d\x95\x47\xea\x69\xb7\x10\x71\xd8\
+\x97\xc5\x4a\x23\x8d\x48\x8c\x1b\x22\x0e\x7d\xeb\x43\x87\xe1\x57\
+\x06\xa1\x9e\xc6\x73\xff\x00\xd3\xfb\xd1\x61\x30\xf1\xe0\xd0\x65\
+\x0a\xf3\x73\x7f\xc3\xd8\x53\x54\x5c\xdc\xd3\x38\xfd\xa3\x5c\x54\
+\xb0\xef\xde\xa7\x0c\x72\xb9\x16\xbe\x61\x6a\x34\x5a\x60\x5c\xdf\
+\xcd\x68\x6b\xa2\x51\x1d\xfc\x24\x09\x7d\xed\xbd\x0e\x25\x0a\xa3\
+\x4e\xac\x55\x97\x9f\x5e\xd4\xe8\xc1\x2a\x6f\xb8\x36\x35\x18\x98\
+\xcc\xb6\x86\xf6\x55\x37\x76\xfd\xaa\xc4\x4e\x0f\x16\x24\x60\xae\
+\xb6\x63\xa0\x75\xda\x9b\x8a\x82\x2c\x52\xda\x51\x67\xd6\xce\x34\
+\xd7\xbd\x28\x60\xa3\x59\x96\x45\x9a\xca\x1a\xe4\x15\xd4\xd5\x96\
+\x39\x98\x9b\x6e\x6f\x54\xdc\xed\x7f\xe3\x28\x24\xfc\x36\x76\x95\
+\x80\x20\x21\x3d\x43\x0a\x87\x03\x11\x11\x64\x24\xa4\xea\x4a\xf6\
+\x3d\x3d\xeb\x47\x89\x46\xb3\x70\xf3\x03\xb1\x1e\x23\x59\x48\xe5\
+\xfd\xab\x0b\x86\xca\xd8\x4c\x63\x61\xa5\xd1\x59\xac\x6f\xf0\x91\
+\xb1\xac\x5e\xae\x19\xda\xc7\x09\x55\x9e\x73\x1c\xce\x49\x78\xd4\
+\xa9\x36\xb1\xb0\x1e\x5b\xf5\xb8\x3f\xec\x56\x8a\x07\x13\x08\x94\
+\x05\x7c\xb7\xb7\xe0\x15\x93\x82\x85\x5e\x18\x62\x11\x96\x77\xb3\
+\x02\xbb\x8d\x6b\x68\x44\x90\xca\xcc\xac\x59\x88\xb1\xd0\x00\x4f\
+\x33\x4f\x1f\x15\x23\x11\x83\x52\xb7\x80\x5c\x8d\xc1\x1a\x9e\xe2\
+\xaa\x9f\x14\xb0\x46\x2e\xdc\xac\x4e\xbf\x4a\xd1\x04\x8a\x89\x50\
+\x4c\xca\xf9\x8a\x48\x9b\x35\xaf\x7a\x6c\x12\xa9\x34\x6d\x1d\xbc\
+\x45\x2b\x7f\xc5\xa5\x68\x70\xe9\x56\x4c\x3a\x44\x74\x74\x04\x2d\
+\xf9\x8a\x5e\x26\x19\xe6\x20\x2f\x85\x65\xd7\x43\x6b\x9e\xba\xd2\
+\xf0\x0a\xc9\x8f\x8d\x58\x10\x43\x73\xa6\x75\x53\x46\x1f\xf3\x54\
+\x9d\x81\xbf\xd2\xb1\x61\x19\xf1\xe0\xa9\xd1\xa5\xba\xdf\x90\xbd\
+\x6c\xc2\x7e\xf5\x7d\xed\x58\xa2\xe9\x8e\x00\x5b\xcb\x26\x97\x36\
+\xb6\xb5\x72\xf8\xa3\x66\x7d\x66\x6f\xf5\x1a\x85\x15\x33\x5f\xc5\
+\x7d\x47\xa8\xf2\xef\x43\xaf\x61\xf9\xd6\x80\xd4\x29\x2c\x58\x79\
+\x46\xa7\xe4\x2b\x29\xb8\x96\x20\x4c\xe2\x30\x42\x83\xa0\xab\x9c\
+\x4d\xcc\x7c\x38\xda\xf7\x76\x00\xd6\x41\x3a\xdf\xeb\x58\xe5\x73\
+\xc6\xa4\x5f\x87\x88\x2c\x8d\x7c\x4c\x36\xe4\x0a\xff\x00\x15\x2f\
+\xc4\xa0\x53\x95\x61\x76\x3f\xd4\x6c\x2b\x38\x11\xf8\x87\xd6\xb8\
+\xe6\x3b\x58\x0e\x57\xa3\xf5\x4e\x43\xf1\x38\xcc\x44\xd7\x19\xb2\
+\x2f\x45\xd2\x82\x1c\x6e\x2a\x11\x65\x94\x95\xfc\x2d\xa8\xa0\xe5\
+\xb8\xbf\xb5\x5f\xc0\xe1\xa2\x38\x41\x23\xc6\x24\x67\x26\xdd\xa8\
+\x9b\x6a\xb9\x0b\x18\xcc\x36\x20\x85\x99\x7c\x37\xfc\x43\x6a\x39\
+\x30\x6e\x14\x34\x6c\x24\x07\xf0\x9d\x68\xce\x03\x0d\x20\xb9\x56\
+\x8c\xff\x00\x4e\xb4\xb5\xc0\xe2\xf0\xe7\x3e\x12\x51\x27\x60\x6c\
+\x7e\x9c\xeb\x5d\xfd\x1d\x2b\x4f\x01\x2d\x9d\x33\x2c\xab\xea\x1b\
+\x67\x14\xa5\x4c\xc7\x32\x03\x6b\xfd\x3d\xea\xf2\xe3\xca\x9c\x98\
+\xbc\x31\xb8\x3b\x81\x63\x53\x2b\x60\xe6\x91\x1e\x19\x32\x3b\x1c\
+\xad\x71\x6c\xda\x6d\x46\x45\xb5\x5d\x52\xdc\xc9\xf7\x34\x40\x5a\
+\x9c\xf8\x59\x46\xa9\x67\x07\x9a\x9a\x53\xab\x21\xb3\x29\x1e\xf5\
+\x62\x45\x75\x45\xeb\xaa\x4e\x22\xe6\xa4\x57\x0a\x9a\x92\x40\xae\
+\xae\xae\xa5\x3a\xdd\xab\xad\xad\x4d\x75\xaa\xc4\xa7\xc7\x63\xce\
+\xb1\x4e\xa2\xc4\xae\x46\x37\xe6\x36\xd3\xfd\xef\x4d\xc1\xb1\x97\
+\x0e\x80\x90\x52\x15\xd1\x6d\xcc\x31\x02\xff\x00\x91\xa7\x49\x1f\
+\x8f\x87\x93\x0f\xcd\x85\xd7\xdc\x55\x6e\x1e\xcc\x85\xe0\x73\x6c\
+\xe8\x96\x1c\xb3\x6a\x7e\x5a\x00\x2b\x39\xda\xf8\xbd\xc3\xc9\x2b\
+\x2a\x12\x2f\xa3\x0b\xf3\xa2\x90\x5c\x58\xfe\x54\x8e\x1c\xc0\x63\
+\x2c\x7e\x20\x54\x55\x87\xb1\xad\x4f\x05\xf5\x5d\x94\x96\xcb\x5c\
+\x17\x21\x1a\xe8\x69\x84\x73\x1b\xfe\xb5\x04\xa8\x4c\xee\xe1\x54\
+\x73\x35\x12\xda\xec\xd7\x5e\x5b\x9a\x9c\xba\xdc\xb5\xcd\x4c\x6f\
+\x0c\xa4\x84\x97\x6e\x45\x6d\x45\x94\x13\x65\x74\x24\x6e\x2f\x6f\
+\xd6\xa4\x59\x15\xd9\x46\x52\x58\x85\x51\xb9\x3b\x53\x0c\x4d\xb8\
+\x1a\x75\xbe\x9f\x5a\x8b\x2b\x1b\xe8\xc2\x2d\x06\xb7\x05\x8d\x58\
+\x95\xe4\x56\x4c\x24\x8c\x8c\xb6\x60\x00\x21\xc0\x1a\xf3\xfc\xaa\
+\x9c\x30\x9c\x99\x94\x11\x9b\x43\x2b\x68\x00\xe7\x6e\xb5\x7f\x1f\
+\xe4\x81\x5d\x15\x43\x33\x58\xf9\x46\xba\x55\x2b\x97\x62\x59\x8b\
+\x1e\x75\x8e\x53\xb3\x13\x29\x0f\x29\x61\xb6\xc2\x84\x81\x6d\x6a\
+\x76\xae\x35\x92\x18\x90\x34\x81\x54\x1b\x13\xa8\xbe\xf4\xec\x04\
+\x0a\xd2\x33\x38\xba\xc5\xa1\x1d\x5b\xff\x00\x34\xdc\x36\x1c\xa6\
+\x11\xe7\x26\xcd\x94\x95\x16\xe5\x56\x32\x2c\x68\xb1\xa0\xd2\xc0\
+\x93\xd4\x91\x5b\x9c\x46\x93\xc4\xd0\xe2\x38\x79\x03\x78\x9b\x30\
+\x00\x72\xac\x60\x3a\x0a\xf4\x11\xb1\x57\xb8\x17\xb6\xe3\xf6\x35\
+\x9b\xc5\xb0\x9e\x0c\xbe\x2a\x29\x31\xbe\xa0\x9e\x47\xa5\x1c\xf8\
+\xfd\x52\x87\x82\x39\x18\xf5\x8c\x1b\x2c\xbe\x53\xde\xae\x85\x02\
+\x52\x3a\x0e\x75\x9b\xc3\xe3\x69\x31\xf1\x22\x9b\x12\xe3\x5a\xd8\
+\x97\x2b\x48\xc5\x45\x81\x26\xd5\x70\x9d\x2a\x55\xaa\x5a\x35\xf0\
+\xcc\x8d\xe5\x55\xdc\xd1\x48\xd1\x41\x18\x92\x72\x40\x3e\x95\x1b\
+\xb5\x51\x69\x26\xe2\x38\x85\x88\x2d\x90\x1d\x15\x74\x0a\x29\xb4\
+\x47\x4c\xd3\xf1\x0c\x42\xc3\x12\x15\x8c\x6c\x39\x7b\x9a\xd0\x82\
+\x38\xf0\xb0\xf8\x50\x9d\x4f\xad\xc6\xed\xfd\xaa\x62\x54\x81\x0c\
+\x30\x8b\x20\xe7\xcd\xbb\x9a\x9b\x53\x26\x76\x82\x06\xb4\xd8\xd7\
+\x95\x42\x8b\x53\x10\x56\x85\x12\x8d\x6d\x4c\x41\x50\x83\x4a\x35\
+\x14\xc0\x9b\x84\x90\x30\x17\xd2\xe4\x75\xa3\x28\x42\x05\x3a\x93\
+\xe6\x63\xd4\x9d\x6b\x94\x03\xa3\x6c\x41\x14\x69\x73\x18\xcf\xeb\
+\x5f\x2b\x58\x74\xd8\xfd\x2b\x51\x14\x56\xc0\x9b\x6c\x2a\x02\xe5\
+\x50\x29\xd7\x5b\xdb\xf2\xb5\x00\x07\x2e\xa3\x51\x46\x25\x3e\x28\
+\x40\x78\xd3\xa2\xdc\xfc\xeb\x23\x8f\xc7\x71\x16\x25\x45\x8b\x79\
+\x58\xf7\x15\xaf\xc5\x74\xc4\x8f\xf4\x0f\xd2\xb3\xb8\xbe\x5f\xfd\
+\x28\xe6\xdf\xc4\x19\x3d\xf9\xfe\x55\xcf\x9c\xf5\xae\x2d\x3c\x1c\
+\x0b\x86\xc3\xa1\x0b\x69\x1d\x05\xcf\xe1\x16\xda\xb8\xdc\x9a\x7e\
+\x28\x7d\xe6\x51\xb0\x00\x7d\x00\x14\x83\xa5\x69\x97\x0a\x25\x34\
+\x35\x2b\x52\x18\xda\x89\x81\x91\x40\x06\xce\xba\xa3\x5f\x63\x42\
+\xb4\x40\xeb\x4c\x43\x0d\x9d\x44\x83\x42\x77\xec\x79\xd6\x6f\x1b\
+\x8d\x93\x18\x66\x1b\x4b\xe6\x06\xb4\x09\xca\xcc\xe1\x4b\x2b\x6a\
+\xe0\x6e\x0f\x5a\x99\x16\x39\x22\xc9\x20\x12\x46\x76\x20\xed\xed\
+\x55\x9b\x0c\xea\xab\x61\xb1\xf0\xc8\x80\x62\x2e\x8e\x05\xb3\x01\
+\x7b\xd3\xda\x6c\x28\x5c\xc7\x13\x19\x03\xa6\xff\x00\x4a\xac\xfc\
+\x32\x26\x6b\xc7\x88\xca\x3a\x32\x9b\xfe\x54\xa9\xb8\x64\xf1\xdc\
+\x96\x8f\x2f\x22\x5a\xd7\xa3\x79\x45\xd0\x78\xa6\x29\x67\xcb\x1c\
+\x57\xc8\x97\xd4\xf3\xaa\x95\x63\xec\x73\x88\x4c\x9e\x04\xae\xa3\
+\xf0\x2e\x9f\x5a\x42\x14\x75\x25\x43\x02\xbe\xa5\x61\xa8\xac\x5d\
+\xfa\xd4\xc7\x0b\xd7\x58\xd4\x8a\x90\x3c\xb7\xa0\x86\xc6\xb5\x78\
+\x6d\x9f\x87\x2d\xbe\x06\x20\xfc\xeb\x2f\xe5\x57\xf8\x1c\x83\xc4\
+\x78\x0f\xfc\xc0\x32\xfb\xd6\xb8\xfa\x2f\x8b\x56\xae\xb5\x19\x17\
+\x14\x24\x6b\x5d\x18\x43\xda\x45\xc9\x2a\x89\x01\xd2\xcc\x2f\x55\
+\x8e\x0b\x0e\xf2\xfd\xde\x68\xc2\x12\x49\xbd\xc5\xc8\xb5\xaa\xd1\
+\x16\x89\x8e\x6c\xbb\x00\x7d\xcd\xaa\x5d\x42\x9c\x8a\x3c\xab\xa0\
+\xa3\x16\xb3\x1f\x0b\x8b\xc1\xfd\xec\x12\xe6\x41\xbd\x8e\xde\xe2\
+\xad\x60\x31\x23\x15\xf7\x4e\xa0\x48\x06\x9a\x68\xd5\x65\x09\x56\
+\xb8\xff\x00\xcd\x51\xe2\x78\x51\x1f\xfc\x4c\x07\x28\xbf\x99\x7f\
+\x09\xa3\x33\xc3\xba\xb0\xf8\x58\xe4\xbe\x51\xe1\xb7\x3e\x9f\xda\
+\xa9\xcc\x8b\x13\x65\x92\x44\x53\xca\xe7\x7a\xb5\x83\x91\xf1\x8e\
+\xc9\x2c\x8c\x72\x0c\xc5\x41\xb6\x70\x76\x3f\xcf\xb5\x49\xc2\xc6\
+\xd8\x93\x11\x04\xc2\x10\x31\x07\x52\x2f\xd2\xac\xdf\x12\x93\x29\
+\x53\x63\xf9\x57\x0a\xb1\x8d\x84\xc5\x2f\x55\x61\xe5\xb7\x4a\x4f\
+\xb5\x18\x5c\x05\x75\xaa\x46\x82\xa0\x1b\xd2\x93\x50\x6a\x6b\x8e\
+\xa2\xa4\x10\x4a\xb0\x61\xb8\x3a\x55\x3e\x34\x1a\x2c\x44\x8e\x9e\
+\x51\x94\x49\x19\x07\xa6\x9f\xb8\xab\x6d\x53\x2c\x51\x62\x03\x44\
+\xe3\xcc\x51\x42\xb5\xbd\x37\xfe\xe0\x56\x6c\xde\x90\x38\x64\x8b\
+\x89\x9a\x29\xd2\xd9\x81\xb4\x8a\x39\x1e\xb5\x64\xd7\x9e\xc1\xb4\
+\xf8\x4e\x26\xa2\x13\x66\x12\x65\x3a\xdb\x4a\xf4\x12\x32\xb4\xbe\
+\x22\xb7\x92\x41\x99\x7d\xaa\xe1\x76\x1a\x9b\xd2\x38\x92\x5f\x07\
+\x98\x35\xad\x25\xed\xd7\x4a\x2b\xf9\xf3\x0d\x40\xa6\xe4\xf1\x3c\
+\x10\xc3\xca\x25\x24\xdc\x5e\xfa\x53\xe8\x27\x0c\x7c\x18\x11\x14\
+\x10\xc4\x5d\x88\xef\x4c\x2c\x58\x11\x20\x0e\x3f\xa8\x5e\x80\x7f\
+\x9b\xf3\xe7\x4c\x37\xbd\x51\x06\xd1\x65\xcb\xe0\x47\x6e\x9a\xff\
+\x00\x35\x20\x8b\x05\x00\x28\x1b\x28\xda\xa6\xc6\xa4\x0b\xd2\x89\
+\xe2\x5a\x60\xd0\x85\xbd\xa4\x3f\xa5\x66\xc6\x72\xb5\xcf\x3d\xeb\
+\x57\x1e\x3f\xe1\x93\xff\x00\x90\xfe\x95\x9c\xa8\x19\xcf\x6a\xc7\
+\x2f\x4c\x41\xd7\x50\x34\xef\x45\x86\x88\xcb\x88\x58\xee\x06\x63\
+\xc8\x5e\x8a\xd5\x6b\x85\xc6\x73\x3b\x80\x6e\x05\x87\xce\x89\x36\
+\x9a\x9e\x20\xfe\x1e\x1f\x22\x9d\x24\xd0\x0b\x6b\x94\x54\x60\x09\
+\x93\x0c\x55\x8d\xcc\x67\x4b\xf4\xa8\xe2\x65\x4f\x86\x80\xdd\x94\
+\x1b\xd8\xde\xd5\x30\xc5\x2e\x12\xd2\xba\x82\x8e\x2c\x40\x35\xaf\
+\xac\xfc\x37\x2d\x2f\x89\x18\xd3\x07\xe0\xc8\xda\xca\xea\x6d\xd0\
+\x75\xab\x12\xbc\x50\xe1\x8e\x20\xd9\xd7\xe1\x1d\x4d\x63\x62\xa5\
+\x79\xe6\x32\x48\x75\x3f\x95\x36\xa8\x4c\x38\xf9\x30\x9c\x5c\x09\
+\x11\x04\x71\xb7\xa4\x0d\xbb\xd6\x8c\xdc\x45\x50\x0c\xb8\x54\x37\
+\x17\x0d\x98\x91\xee\x2b\x33\x8a\xa7\x89\x83\x49\x88\xbb\x23\x65\
+\x27\xb7\x2a\x77\x0e\xe1\xdc\x56\xc1\x51\x13\xc3\xb5\xfe\xf0\xf9\
+\x47\xf7\xae\x72\xf2\x97\x23\x5d\x02\x77\x9b\x15\x88\xcc\xe7\x33\
+\xb6\x80\x01\xfa\x56\xbe\x12\x0f\xb2\x61\x7c\x2f\xf9\x8f\xac\x9d\
+\xbb\x51\xe0\xe0\x4c\x39\x20\x46\x04\xfb\xdc\xdf\x6f\xe9\xa2\xb5\
+\xeb\x7c\x78\xe7\x75\x9b\x41\x6b\x58\xd1\x01\x53\x96\xed\x6f\x99\
+\xa3\x55\xad\x0d\x42\xad\x35\x56\xb9\x16\x98\x05\x41\xca\x28\xd4\
+\x6b\x50\xbb\xda\x88\x9b\x68\xba\xb7\xb6\xd5\xa4\x24\x5a\x6a\x8f\
+\x30\xe8\xfe\x53\xd8\x8d\x8f\xed\x49\x89\xb3\x1f\x31\xdb\x96\xd4\
+\xd8\x8f\xde\x2a\x83\xe5\xcc\x48\xee\x40\xdb\xf3\xad\x44\xe3\x7b\
+\x6e\x68\x5a\x9a\x46\x9a\xd0\x30\xa9\x33\x78\xb7\xff\x00\xaa\x1f\
+\xe8\x5f\xd2\xb2\xb8\xf3\x11\x85\x82\x3b\x68\xc4\xb9\xf7\xda\xb6\
+\x78\xba\x7d\xea\x3d\xfd\x4b\xfa\x69\x59\x3c\x69\x03\x3e\x0d\x0e\
+\xcd\x70\x7f\xee\xae\x5c\xe7\x55\xae\x2d\xc9\xbc\xc1\x5f\x6c\xea\
+\x1b\xda\x90\xc0\xde\x8b\x87\x16\x9f\x85\xc0\x43\x67\x65\x05\x0d\
+\xbb\x7f\xe6\x89\x81\x07\x51\xaf\xb5\x6a\xff\x00\x59\x2c\x2f\x5a\
+\x21\x5d\x51\x7e\xd4\x21\x0f\x7a\x9a\x10\x6a\x41\x35\x21\x02\x41\
+\x04\x6e\x29\x44\x4d\x16\x2b\x2c\x00\x15\x94\x66\x00\x8b\x81\x4c\
+\x15\x32\x5c\x46\xd2\xa5\xc3\xc6\xbe\xe0\x8e\x96\xa5\x03\x10\xf8\
+\xc8\xe2\x2d\x9a\x35\x00\xea\x63\xb5\x1e\x19\x32\xc2\xae\x7c\xce\
+\xe2\xe4\xb6\xb6\xaa\x32\x4b\x88\x9d\x6e\x73\xba\x83\xf0\x8d\x05\
+\x5d\x49\x84\xa1\x72\x02\x0a\xd8\x15\x3b\xe9\x54\xa4\xd0\xd2\x66\
+\xcd\x98\xdf\xad\xea\xbc\xb0\x26\x23\x89\x4a\x19\x72\xda\xf7\x75\
+\x1a\xfc\xea\xc6\x66\x12\x00\xaa\x73\x7c\x2b\xd7\xdf\xb5\x74\x71\
+\xac\x20\x85\x39\x8b\x1f\x33\x1e\x67\xb7\x6a\x7d\x0c\x9c\x66\x19\
+\xf0\xf2\xe5\x3a\xa9\xd5\x58\x6c\x69\x56\x35\xbb\x3c\x5e\x3e\x19\
+\xa2\xe7\xba\x7b\xd6\x31\x5b\x12\x08\x37\x15\x8e\x5c\x71\xa9\x41\
+\x6d\x2d\x56\x38\x40\xff\x00\xf2\x50\xff\x00\xaa\x92\x6c\x37\x20\
+\x7b\xd5\x8e\x12\x3f\xfc\x8c\x27\xfa\xaa\x9e\xa6\x89\x02\xda\x52\
+\xcd\x31\x98\x6c\x01\x27\xda\x81\xae\x01\xd0\x56\xd9\x71\x00\xca\
+\xa9\x73\x64\x5f\x10\x81\xcc\xec\x2a\x05\xed\x6d\xed\xce\xa1\x81\
+\x2a\xac\x1a\xef\x6b\x65\x3b\x30\xe9\xd8\xd3\x22\x0a\x45\x95\x80\
+\x23\x70\xda\x11\x52\x0d\x8d\x12\x73\xd0\x32\x9d\x18\x72\x34\xc5\
+\x8c\xf2\x19\xbd\x8d\xe9\x25\x6c\xe5\x46\x52\x06\xec\x4e\x9e\xda\
+\x6e\x6a\x4c\xfe\x2a\x92\x60\x18\x62\xa0\x3e\x54\x6b\x2e\xbb\x83\
+\xc8\xfc\xe9\xdc\x1b\x1d\x1e\x36\x49\x73\x30\x49\x99\x75\x52\x74\
+\x36\x3c\x8d\x59\x9a\x05\xc4\xc2\xd8\x76\x94\x80\xe2\xd6\x0a\x00\
+\xbf\x5a\xf3\x85\x25\xc0\x63\xd9\x1d\x7c\xcb\x70\xc3\x91\x15\x8b\
+\x6f\x1b\xbf\x0c\xed\xe9\xa7\x89\x9e\x06\x46\x1c\xae\xa6\xb3\x2d\
+\x47\x82\xc5\xbc\x79\x64\x8d\xd8\xc4\xc7\x55\x34\xdc\x5a\x05\x9c\
+\xd8\x68\xda\x8a\xd6\xea\x22\xc6\xbb\x2d\x34\x2d\x71\x5a\x16\xaa\
+\xe3\xe6\x92\x08\xd0\x44\x72\x97\xb9\x27\xb7\x4a\x94\xc5\x61\xde\
+\x30\xce\xf9\x5a\xde\x60\x16\xfa\xd3\xa7\x8e\x39\x23\xfb\xc4\x24\
+\xa0\xd0\x83\x6a\x4b\xe0\x62\x71\xe4\x63\x1b\x7f\x56\xa2\x8e\xf7\
+\xa3\xd3\x96\x48\x24\x6c\xb1\xcb\x73\xfd\x42\xd4\x4a\xd9\xe5\x31\
+\x23\x03\x95\x2c\x4f\x72\x74\xb5\x56\x7e\x1f\x38\x04\xfd\xd3\x76\
+\x56\xd7\xe9\x4e\xc0\x14\x83\x06\xce\x48\x56\x8e\xec\xc0\xef\xdb\
+\x4a\x3b\xde\xd3\x3b\x10\x56\x4f\xf1\x31\xc8\x43\x5e\x4f\xae\x95\
+\xb2\x61\x11\xc3\x1c\x6d\xea\x44\x00\xf6\x35\x99\xfe\x1e\x84\xcb\
+\xc6\x17\x12\xea\x08\x4d\x4d\xf9\x9a\xd6\x93\x31\xb9\x2a\x6e\x68\
+\xe1\xe6\xaa\x51\xb2\xad\x42\xc8\x4a\x94\x07\x29\x24\x10\x7a\x11\
+\xb5\x11\x40\x39\x6b\xd6\x81\xd4\x12\x2c\x35\xad\x23\x34\x20\x48\
+\xab\x6c\xdb\x8e\x87\x98\xa1\x66\xb1\xb5\xa8\x92\xd7\x24\x79\x49\
+\xdf\x4b\x86\xf7\x1f\xb8\xa9\xb5\xcd\xad\x66\x1a\xe5\xbe\xfd\xc7\
+\x5a\x52\x28\xd4\x50\xae\xf4\x6b\x50\xa0\xc7\x2e\x6c\x18\x23\xe1\
+\x7d\x7e\x75\x9c\x10\x2e\xa0\xed\xbd\x69\xe2\x41\x6c\x1c\x80\x6e\
+\x2c\x4f\xb5\x51\x50\x2d\x59\xbe\x99\x42\x12\xe6\xdb\x73\x27\xa5\
+\x5c\xc0\x25\xf0\xcc\xc4\xb2\x29\x60\x02\x8d\x0b\x0b\x1d\x4f\x4a\
+\x42\x80\x14\x2b\x5a\xce\x72\xfc\x86\xa7\xf2\x1f\x9d\x5c\xc0\xdd\
+\xa0\x91\x8e\xe6\x4b\xfe\x55\x48\xa8\xac\xa5\x72\x18\xd3\x2f\xe1\
+\xcb\x50\xd8\x44\x98\x04\xf1\x64\x50\x3d\x2a\x75\x02\x99\x61\x4c\
+\x87\xd6\x47\x55\x20\x7d\x0d\x69\x96\x0e\x35\xc3\x48\x51\x49\xca\
+\xa4\xdb\xa0\x1b\x0f\xd2\xff\x00\x3a\xb1\xc3\xb8\x78\x78\x84\xd8\
+\x82\xc1\x0f\xa5\x46\xed\x54\x9c\x10\xc5\x48\xd4\x1b\x1a\xdf\x6d\
+\x42\x64\xb6\x4c\x82\xc4\x7b\x56\x38\xf7\x75\xaa\x52\x41\x86\x8d\
+\x72\x24\x00\x5c\xdf\x31\x39\x88\x34\xb4\x79\x12\x5f\xb3\xce\xd7\
+\x0d\xe8\x6e\x5f\xf8\xa7\xb0\x23\x98\x3f\x95\x2d\xf2\x99\x21\x72\
+\x40\xc9\x25\x89\x27\x60\x7f\xbd\x6c\x39\x94\x98\xd8\x0d\x59\x7c\
+\xcb\xae\xc4\x57\x40\xc9\x32\xe7\x42\x01\xf8\x94\x9d\xa8\xe2\x17\
+\x97\x2f\x33\x70\x79\xf6\xac\xf8\x96\x21\x23\xac\x8c\xde\x51\xe5\
+\xcb\x45\xaa\x34\x02\x1b\x92\x74\x27\xb7\x2a\x25\x5b\x54\x61\x03\
+\x8c\x22\x67\x37\x27\x51\x7e\x42\x9a\x10\x9f\xee\x6d\x5a\xc0\x85\
+\x14\x5c\xab\x88\x23\x71\xa7\x23\xd6\xa4\x52\x9c\xbe\xaa\x38\xf4\
+\x5b\x03\xcc\xdf\xeb\x41\x6d\x6b\xae\x43\x79\x4d\x89\x3a\x8a\x90\
+\xa6\xb6\x9d\x4d\x1c\x79\x64\x87\x2b\x72\xe6\x39\x1e\xb5\x20\x8e\
+\x82\xb8\x1c\xa4\xe5\x1a\x1d\xc5\x69\x25\x24\x61\x27\x85\x3d\xae\
+\x7d\x2f\xc9\xa8\xd9\x4d\xed\x6f\x95\x2d\x99\x5d\x32\xb4\x64\xaf\
+\x7d\xc5\x04\x73\x98\xdf\xc2\x98\x92\xa7\xd0\xc7\x97\x6a\x90\x78\
+\x9a\x5f\x0c\xad\x6f\x4b\x6b\x58\xfc\x60\x5b\x09\x0c\xd9\x6f\xe1\
+\x4b\xa9\xe8\x37\xfd\x6b\x73\x1a\xc8\x20\x78\xdd\xd4\x31\x17\x00\
+\x9e\x95\x95\x8c\x48\xdf\x01\x34\x66\x45\x37\x00\x8b\x1e\x63\x6f\
+\xd6\xb1\xce\x18\xff\xd9\
+\x00\x00\x2a\x0f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x64\x00\x00\x00\x64\x08\x06\x00\x00\x00\x70\xe2\x95\x54\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
+\x95\x2b\x0e\x1b\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x03\
+\x0e\x1c\x2b\xec\xa5\xbb\x6e\x00\x00\x20\x00\x49\x44\x41\x54\x78\
+\xda\xed\x9d\x79\x94\x5d\x55\x9d\xef\x3f\xfb\x0c\x77\xae\x39\x35\
+\xa5\x06\x2a\x21\x21\x09\x14\x15\x84\x88\xd1\x00\x09\x08\xad\x08\
+\x1d\x5b\xec\x36\x60\x0b\x48\xd3\xf0\x1c\x68\xc4\xf5\xda\xd5\x4f\
+\x78\x48\x83\xda\x93\xad\x48\xab\x4b\xb4\x15\x51\x40\x9f\xd8\x34\
+\xad\x08\xd8\x0e\xc8\x20\x24\x81\x8c\x18\x92\x9a\x92\xaa\x54\xaa\
+\xea\xd6\x70\xab\xea\xce\xc3\x99\xf6\xfb\xe3\xd6\x3e\xb9\xc9\x13\
+\x03\x61\xce\xcb\x5e\x2b\x8b\x5b\xdc\xe1\x9c\xbb\xbf\xfb\x37\x7d\
+\x7f\xc3\x85\xe3\xeb\xf8\x3a\xbe\x8e\xaf\xe3\xeb\xf8\x3a\xbe\x8e\
+\xaf\xe3\xeb\xf8\x3a\xe6\x97\x78\x33\xdd\x4c\x75\x75\x75\x57\x26\
+\x93\x31\xa5\x94\x5e\x5d\x5d\xdd\xfb\xd6\xac\x59\xf3\x39\xd3\x34\
+\x5d\xd7\x75\xe5\xfe\xfd\xfb\x5b\x56\xac\x58\x81\xe7\x79\x24\x93\
+\x49\x5a\x5b\x5b\x29\x95\x4a\x68\x9a\xc6\xae\x5d\xbb\xb0\x6d\xbb\
+\xfc\x85\x84\x40\xd3\xb4\x83\x5f\x50\x08\x0b\x70\xd5\x63\xc3\x30\
+\xfa\x00\x0d\x20\x1e\x8f\x7f\x30\x1e\x8f\x8f\xa8\xd7\xb6\xb6\xb6\
+\x12\x8f\xc7\xdf\xd0\x3d\x30\xde\xc8\x8b\xb7\xb5\xb5\x2d\x9d\x9b\
+\x9b\x7b\xa7\x94\xd2\x03\x58\xbe\x7c\xf9\xb7\xdb\xdb\xdb\xc3\x52\
+\x4a\x86\xf6\x0d\x11\x0c\x06\xa5\xa6\x69\xc2\x95\x2e\x86\x61\xe0\
+\x38\x0e\x48\xc9\x44\x3e\x41\x87\xd1\x41\x26\x93\x01\x5d\x90\x76\
+\xf2\x9c\xbd\xea\x9d\x00\x4c\x27\xa6\xd1\x84\x86\xae\xeb\x00\xe8\
+\xba\x1e\x90\x12\x44\xf9\xe8\x85\x81\x33\xd5\xf5\x1b\x1b\x1b\x77\
+\xae\x5c\xb9\xd2\x11\x42\xb0\x67\xcf\x1e\x86\x87\x87\x1b\xdf\xe8\
+\x43\xf9\xba\x03\x52\x55\x55\x65\x66\x32\x19\x1d\x60\x76\x76\xf6\
+\xba\x8f\x7e\xf4\xa3\xd7\xab\xe7\xfa\xfb\xfb\xcb\x27\x5c\x08\xf2\
+\x94\xb0\x4a\x96\x10\x9a\x20\xe7\x14\xf0\x3c\x0f\xcb\xb2\xc0\x83\
+\x9c\x5b\xc4\xb2\x2c\x2c\xcb\xc2\xd6\x5d\x1c\xd7\x26\x9d\x4e\x03\
+\x70\x60\x7a\x9c\xd3\x4e\xea\xa6\x58\x2a\xa1\xeb\x3a\x3b\x76\x3f\
+\x4f\x55\x93\xc0\x9b\x0b\x21\x84\x00\x49\xf9\x9f\x00\x04\xb5\xea\
+\xda\xd1\x68\x94\xee\xee\xee\x3e\x40\xb8\xae\x6b\xee\xd9\xb3\x67\
+\xd1\xff\x17\x80\xb4\xb5\xb5\x3d\xb8\x78\xf1\xe2\x8b\xa4\x94\xf4\
+\xf7\xf7\x33\x33\x33\x53\x3e\xf9\x40\xc9\x2e\x6f\xb2\x00\x8a\x9e\
+\x85\xed\xd8\x08\x21\x70\x1c\x07\x29\x25\x96\x65\x21\x3d\x89\x94\
+\x1e\xb6\x6d\x63\x59\x16\x8e\x21\x91\xe0\x7f\x86\xf4\x3c\x6c\xdb\
+\xc1\xb6\x6d\xa4\xe7\x11\xa9\x8a\xb2\xb8\x61\x31\x62\x81\x20\x91\
+\x99\xc3\x3a\x69\x94\x05\x75\x61\x9c\xb1\x28\xf6\x58\x08\xe1\xea\
+\x95\x8a\xfb\x24\x29\x25\x52\x4a\x92\xc9\xe4\xba\x0a\xb5\x3e\x1a\
+\x8f\xc7\x07\x8e\x19\x40\x1a\x1b\x1b\x3f\x58\x28\x14\x22\x80\x15\
+\x0c\x06\x97\xc7\x62\x31\xa4\x94\x98\x01\xd3\xdf\x58\x00\xc7\x73\
+\x28\x95\x4a\xfe\xc6\x5a\x96\x55\x06\x42\x5a\x78\x9e\x57\x7e\xce\
+\x03\x29\x25\xa5\x52\xa9\x0c\x88\xe7\x95\x01\x2c\x16\x01\x70\x1d\
+\xd7\xff\x4c\x57\xd3\x91\xea\x7d\x40\x7f\x6f\x1f\xe7\x37\x9e\x47\
+\x6e\x34\x87\x29\xa0\x14\x4d\xb3\xa0\x43\xc3\x89\x87\x90\x39\x13\
+\x74\x09\x9a\x44\x68\xc8\xb3\xce\x3a\xeb\xb7\x00\xa6\x69\xf2\xe8\
+\xa3\x8f\xde\x09\x7c\xfc\x98\x01\x64\xc1\x82\x05\xf7\xbf\xed\x6d\
+\x6f\xd3\x34\x4d\x63\xef\xde\xbd\x94\x4a\xa5\xf2\xa6\xba\x36\xb6\
+\x65\x57\x80\x50\xde\x68\x81\x40\x4a\xcf\x07\xca\x96\xb6\x2f\x21\
+\x78\x12\xcf\x93\x07\x37\x7d\xfe\x44\xab\xd7\xba\x5e\x59\x7a\x4a\
+\xa5\x12\xba\xa6\xfb\xcf\x09\x21\x90\x9e\x87\x87\x87\x2b\x5d\x12\
+\xb3\x33\x88\x25\x33\xa4\xa4\x09\x0b\x25\xd2\x16\x38\xc9\x00\x6e\
+\xca\xc0\x4b\x1b\xa2\x6c\xd5\xc0\x30\x0c\xea\xea\xea\x4e\x6f\x6b\
+\x6b\xbb\x45\x08\xc1\xec\xec\xec\xf3\x63\x63\x63\x0f\xbe\xe5\x00\
+\xe9\xe8\xe8\x38\xa3\xa6\xa6\x86\x52\xa9\x84\xe7\x79\x5e\xa1\x50\
+\xd0\x74\x5d\xc7\x75\xdd\x83\x00\x48\x0f\xcb\xb6\x7c\x0f\x49\xd9\
+\x09\x21\x04\x9e\x47\x59\xed\x48\x89\x8d\x8d\x37\xbf\xd1\xd2\xf5\
+\x90\x42\xfa\x9b\xee\x49\x81\x40\x1c\x04\xc4\x3d\x28\x21\xba\xa6\
+\xf9\xd2\x24\x84\xf0\xc1\xb1\x6d\x9b\x03\xc3\x23\x9c\xbb\xe8\x5c\
+\x64\x52\xe2\x49\x49\x36\x92\xa2\x61\xa9\x8e\x37\x17\x42\xda\x02\
+\x69\x69\x48\xab\xec\xad\x75\x76\x76\x9e\x09\x9c\x69\x18\x06\x3b\
+\x76\xec\xb8\xa7\x12\x90\x57\xdb\x33\x7b\xad\x00\x09\x34\x37\x37\
+\x6f\xe9\xe9\xe9\xc1\x71\x1c\x36\x6f\xde\x8c\x6d\xdb\xb8\xae\x7b\
+\x50\xf5\xcc\x03\x60\x5b\x07\x55\x96\xe7\x79\x58\xae\x5b\x36\xbe\
+\xa0\xc0\xc4\x16\x0e\x42\x42\x3a\x9d\x2e\x4b\x51\xb0\x44\xb1\x58\
+\x24\x9f\xcf\x23\x1d\x81\x44\x56\x7c\xc6\x41\x40\x34\xa1\xe1\x79\
+\x15\x12\x32\x0f\x88\xfa\xdc\x54\x2a\x85\xe7\x79\x4c\xa7\x66\xd1\
+\x16\x4d\x32\x33\x72\x58\x14\x60\x78\xd8\x89\x00\xd6\x81\x30\x42\
+\x2b\xbb\xd4\xb3\xb3\xb3\x2b\x5b\x5b\x5b\x6f\x06\x74\xe0\xe1\x78\
+\x3c\xfe\xdc\x9b\x56\x42\xda\xda\xda\x9a\xc7\xc6\xc6\x6a\x80\xa0\
+\xfa\xc2\xae\xeb\xfa\x1b\xa1\x69\x1a\xae\xeb\xfa\x9b\x27\x3d\x89\
+\xed\x1c\x04\xc4\xc5\x23\x9b\xca\xa0\x09\x0d\xdb\xb3\xc8\xd8\x19\
+\x1c\xc7\xc1\xd1\x3d\x62\x66\xc4\x57\x59\x8e\x61\x93\xcd\x66\xc9\
+\xe5\x72\x48\x47\xe0\x78\x2e\x73\x73\x73\x00\xe4\xbd\x22\xb6\x6d\
+\x51\x28\x14\xd0\x84\x40\x9a\x07\xc1\x92\xe0\x7b\x67\xbe\xd7\x06\
+\xe4\xe6\xd2\x2c\x6b\x3c\xcd\xb7\xe1\xe3\xc1\x71\x16\xad\x08\xe2\
+\x4c\x86\x71\x73\x41\x64\xa7\x31\x6f\x5b\x24\x8b\x16\x2d\xea\x01\
+\x7a\x34\x4d\x63\xfb\xf6\xed\x89\x37\x35\x20\x85\x42\xe1\x9e\x4b\
+\x2f\xbd\xf4\x82\x5c\x2e\xc7\xe8\xe8\x28\xb6\x6d\xfb\x1e\x92\x0a\
+\xe2\x2a\x37\xc2\x93\x92\x5c\x2e\x47\x2e\x97\x2b\x8b\x55\x38\xe8\
+\x9f\x66\x57\x73\x31\x4c\x1d\xcf\xf3\x30\xe4\xc1\x80\xaf\x50\x2a\
+\x10\x4c\x6b\x18\x55\xe5\x5b\x17\x36\xe8\x9e\x40\x33\xca\xea\x45\
+\x77\x05\x99\x4c\x96\x74\x3a\x8d\x40\x10\xaa\x8f\x50\xb4\x8b\xf3\
+\x12\xe2\xf9\xce\x80\xef\xb5\xc9\xb2\xfa\x2b\x96\xca\xaf\xd9\x9f\
+\x9d\xa2\xed\xe2\x14\xd4\x07\x30\x3a\x25\x86\x06\x5e\x51\xc3\x4d\
+\x1a\x38\x33\x01\x32\xcf\x55\x81\x26\xd1\x34\x8d\x7c\x3e\x1f\x01\
+\x6a\xe7\xf7\x31\xf1\xa6\x03\xc4\xf3\x3c\x2d\x18\x0c\x52\x28\x14\
+\x7c\xd5\xe4\x38\xce\x61\xb6\xc1\xa3\x50\x28\xcc\x3f\x76\xfd\x13\
+\x0b\x10\x8c\x84\xd0\xe6\xf5\x7e\x20\xaf\x21\xea\x34\xce\x3d\xf7\
+\x5c\x66\x67\x67\xe9\xeb\xeb\xe3\x82\x0b\x2e\xe0\xf2\xcb\x2f\xe7\
+\xce\x3b\xef\x64\x70\x70\x90\xcb\x2f\xbf\x9c\x58\x2c\xc6\x9d\x77\
+\xde\x89\xa6\x69\x74\x76\x76\x72\xe0\xc0\x01\x74\x43\xc7\x30\x0c\
+\x04\xe0\x14\x6c\x72\xb9\x4c\x59\x3a\x1d\xd7\x57\x91\xea\x9e\x3c\
+\xcf\xf3\xed\x13\x80\x91\xb4\xf1\x1e\x5d\x44\x42\x96\x25\xca\xd3\
+\x9d\xb2\x2d\xb2\x34\x04\x02\xdd\xf4\x7c\x37\xb9\xa7\xa7\xe7\x9f\
+\x4f\x3d\xf5\xd4\x7f\x2e\x95\x4a\xfc\xea\x57\xbf\x12\x6f\x0a\x40\
+\x9a\x9b\x9b\x9b\x84\x10\x0f\x01\x05\xcb\xb2\x7a\xd4\x06\x2b\xa9\
+\xa8\x54\x59\x2a\xa6\xc8\x66\xb3\x68\x9a\x86\x65\x59\x18\xba\x81\
+\x61\x94\x6f\x43\x93\x82\xf7\xbc\xe7\x3d\xdc\x74\xd3\x4d\x5c\x7b\
+\xed\xb5\x9c\x7b\xee\xb9\xbc\xfd\xed\x6f\xa7\xbb\xbb\x9b\x75\xeb\
+\xd6\x71\xcb\x2d\xb7\xf0\xfc\xf3\xcf\x73\xe5\x95\x57\xf2\x9d\xef\
+\x7c\x87\x77\xbc\xe3\x1d\x5c\x70\xc1\x05\xdc\x7f\xff\xfd\xdc\x78\
+\xe3\x8d\x74\x76\x76\xf2\xcc\x33\xcf\x70\xcf\x3d\xf7\x50\x53\x53\
+\x43\x34\x1a\x65\x7a\x7a\x1a\xd7\x30\xd0\x34\x0d\xcd\x12\x64\xb2\
+\x19\xb2\xd9\xac\xaf\x3a\x3d\xcf\xf3\x1f\x3b\x8e\x43\x38\x12\x26\
+\x18\x31\xd1\x34\x8d\x67\x8b\x7b\x78\xef\x35\x31\x04\xe5\x80\xd2\
+\x4a\x98\x38\x13\x61\xac\x91\x10\xee\x6c\x60\xde\x31\x91\x04\x83\
+\xc1\x37\x8f\xca\x9a\x9c\x9c\x5c\xf4\xfe\xf7\xbf\xff\xcc\x58\x2c\
+\xc6\xe6\xcd\x9b\x29\x16\x8b\xb2\x54\x2a\x09\x05\x82\xeb\xba\x38\
+\x8e\xc3\xdc\xdc\x1c\x42\x08\x74\x7d\xfe\xf4\x0a\x81\xe6\x69\x48\
+\x24\x77\xdd\x75\x17\x89\x44\x82\x5b\x6f\xbd\x95\xab\xae\xba\x8a\
+\xbe\xbe\x3e\xce\x39\xe7\x1c\x76\xec\xd8\xc1\x65\x97\x5d\x86\xe7\
+\x95\x7d\xd0\x6f\x7d\xeb\x5b\xdc\x70\xc3\x0d\x7c\xe1\x0b\x5f\x20\
+\x91\x48\xd0\xd3\xd3\x43\xb1\x58\x64\x66\x66\x86\x93\x4f\x3e\x99\
+\xde\xde\x5e\x3a\x3b\x3b\x59\xbc\x78\x31\x9f\xfa\xd4\xa7\x58\xb5\
+\x6a\x15\x67\x9f\x7d\x36\xae\xeb\xf2\x9e\xf7\xbc\x87\x87\x1e\x7a\
+\x88\x52\xa9\x74\xd0\x59\x38\xcc\xd1\x70\xe7\x1d\x0a\xdb\xb6\x49\
+\x26\x93\x94\x92\x73\xec\xb8\x37\x87\xe7\x49\x14\xfd\x22\xca\x11\
+\x3e\xd6\x8c\x81\x35\x11\xf0\xf9\xb3\xea\xea\xea\xaf\x4b\x29\x09\
+\x87\xc3\xcf\x4d\x4d\x4d\x7d\xff\x75\x05\xa4\xb9\xb9\x99\xc9\xc9\
+\x49\xf5\x67\xde\xb6\xed\xca\x53\x27\xd4\xc9\x53\x5f\x58\x79\x50\
+\x0a\x90\xaa\xaa\x2a\x2e\xbd\xf4\x52\x7e\xfc\xe3\x1f\xf3\xde\xf7\
+\xbe\x17\x21\x04\x17\x5d\x74\x11\xdf\xf8\xc6\x37\x78\xf0\xc1\x07\
+\xf9\xc8\x47\x3e\xc2\xf6\xed\xdb\xe9\xef\xef\xe7\xea\xab\xaf\xa6\
+\x58\x2c\xa2\x69\x1a\x0f\x3e\xf8\x20\x3f\xfc\xe1\x0f\xf1\x3c\x8f\
+\x45\x8b\x16\x71\xf1\xc5\x17\x63\x9a\xe5\xd3\x7c\xc5\x15\x57\x70\
+\xd9\x65\x97\xf1\xe8\xa3\x8f\xb2\x60\xc1\x02\xaa\xaa\xaa\x08\x85\
+\x42\xe4\x72\x39\xee\xbd\xf7\x5e\x22\x91\x08\x23\x23\x23\xec\xdf\
+\xbf\xdf\x77\xa7\x93\xc9\x24\x8e\xe3\xf8\xae\xb2\xeb\xba\x68\x9a\
+\x46\xa9\x54\xe2\xc0\x81\x03\xac\x3f\xff\xa2\x32\x18\x48\xa6\xf4\
+\x04\x9d\x2b\x4c\xbc\x94\x89\x9b\x31\xf1\xaa\x4d\x64\x87\x86\xd0\
+\x24\x18\x52\x22\xf9\xa4\x61\x18\x6c\xdd\xba\xf5\x47\xaf\x3b\x20\
+\x93\x93\x93\x34\x36\x36\xfe\xd5\x89\x27\x9e\xf8\xdd\x7c\x3e\x8f\
+\xeb\xba\x12\x10\x95\x7e\x7e\xa5\x97\x25\x84\x40\x08\x81\xb2\x2f\
+\xb7\xdf\x7e\x3b\xd9\x6c\x96\xb5\x6b\xd7\xf2\xf4\xd3\x4f\xb3\x7e\
+\xfd\x7a\xf6\xec\xd9\x83\xe3\x38\x3c\xf6\xd8\x63\x3c\xfa\xe8\xa3\
+\xe4\xf3\x79\x5a\x5a\x5a\xfc\xd3\x5c\x28\x14\x58\xb0\x60\x01\xa1\
+\x50\x88\x42\xa1\x40\x2a\x95\x22\x1a\x8d\xfa\x6a\x23\x10\x08\xf0\
+\xc0\x03\x0f\x30\x37\x37\x47\xa9\x54\x92\x37\xdd\x74\x93\x08\x04\
+\x02\x65\x6f\x4b\xd3\x48\xa5\x52\xe8\xba\xce\xc2\x85\x0b\xf9\xb7\
+\x7f\xfb\x37\x3e\xf3\x99\xcf\x90\x4c\x26\xfd\xf7\x2b\x69\x0e\x04\
+\x02\xbe\xb4\xcc\xcc\xce\x20\xa5\x24\xe7\x96\x08\x5f\x18\x47\x76\
+\x04\xd1\x84\x86\xa6\x79\x48\xcd\xc3\xc9\xe8\xd8\xe3\x21\x52\xbf\
+\xae\x13\xe8\x12\xc3\x30\x90\x52\xda\xaf\x24\x46\x39\x6a\x95\x65\
+\x59\x56\x57\x5b\x5b\x1b\x73\x73\x73\xd8\xb6\x2d\x94\xf1\x56\x31\
+\x80\x94\xd2\x3f\x7d\xae\xeb\x72\xdd\x75\xd7\x71\xf5\xd5\x57\xb3\
+\x61\xc3\x06\x76\xed\xda\xc5\xfa\xf5\xeb\x79\xf2\xc9\x27\x71\x1c\
+\x87\xeb\xaf\x2f\xf3\x8b\x13\x13\x13\x48\x29\xfd\x6b\xec\xdb\xb7\
+\xef\x90\x6b\x1e\x38\x70\x40\x6d\xa0\xed\x38\xce\x01\x29\x25\xba\
+\xae\x5b\xf9\x7c\xfe\xf2\xb1\xb1\xb1\x29\x80\x40\x20\x70\x49\x73\
+\x73\xf3\xed\xb9\x5c\x8e\x42\xa1\x40\x2c\x16\xe3\xda\x6b\xaf\xa5\
+\xa3\xa3\x83\x6d\xdb\xb6\xf1\xdd\xef\x7e\x97\x91\x91\x11\x9a\x9a\
+\x9a\x7c\x42\xd2\x71\x1c\x92\xc9\x24\xae\xeb\xd2\xd0\xd0\x70\x30\
+\x20\x9d\x97\xfc\xfd\x07\x46\x30\xa7\x1c\x06\x83\xd0\x12\x5c\x4a\
+\x20\x28\x38\x90\x1e\x44\x22\x11\x1e\x94\xe2\x63\x88\x79\xc6\x3f\
+\x9f\xcf\xff\x49\x73\x73\xf3\x63\x9a\xa6\x69\xf1\x78\x7c\xdd\xeb\
+\x66\x43\xa4\x94\x56\xa9\x54\xc2\xb6\x6d\x3f\xbe\x80\x72\xf0\x96\
+\x4e\xa7\x31\x4d\x13\x21\x04\xa5\x52\x89\x70\x38\xcc\xdf\xfe\xed\
+\xdf\xf2\xf4\xd3\x4f\xd3\xdc\xdc\xcc\x8f\x7e\xf4\x23\x1e\x7f\xfc\
+\x71\x06\x07\x07\x0f\x01\x20\x12\x89\xfc\xe1\xa4\x8d\x10\x58\x96\
+\xb5\x4f\xd3\xb4\x21\x40\x3a\x8e\xb3\x2b\x1e\x8f\x7f\xfa\x0f\xbd\
+\x36\x12\x89\x7c\x7b\xeb\xd6\xad\xff\x09\x48\xdb\xb6\xb3\x8b\x17\
+\x2f\x1e\x6d\x68\x68\x88\x28\x09\xb9\xef\xbe\xfb\xe4\x97\xbe\xf4\
+\x25\xf1\xbd\xef\x7d\x8f\x0f\x7c\xe0\x03\x7c\xe8\x43\x1f\xe2\xf3\
+\x9f\xff\x3c\xdb\xb7\x6f\xf7\x3d\xae\x4a\xa7\x24\x91\x48\x70\xf6\
+\x9a\xb3\x70\x1c\x07\x81\x60\xd4\x1c\xe3\x84\xf3\xa0\x6d\x7a\x39\
+\x4e\x22\x84\x1d\x0f\x21\x5b\xe6\xe3\x14\x43\x02\xb4\x18\x86\xd1\
+\xb2\x71\xe3\xc6\xa3\x8a\xe0\x5f\x36\x20\x75\x75\x75\xd7\xae\x59\
+\xb3\xe6\x1f\x07\x07\x07\x43\x8e\x53\x66\x55\x75\x5d\x3f\x24\xde\
+\xb0\x2c\x8b\x40\x20\xc0\x0d\x37\xdc\xc0\x8a\x15\x2b\xb8\xe6\x9a\
+\x6b\xb8\xfe\xfa\xeb\xb9\xf0\xc2\x0b\x19\x1e\x1e\x66\x3e\x39\x44\
+\x2c\x16\x3b\x12\xe8\x2e\x20\x85\x10\x64\x32\x99\x6f\xc4\xe3\xf1\
+\xaf\x1c\xe9\xfe\xd2\xe9\x74\x1e\xf0\x93\x4e\xa3\xa3\xa3\xeb\x47\
+\x46\x46\xcc\x79\xe9\xf9\xc7\xf1\xf1\xf1\xd3\x2e\xb8\xe0\x02\x12\
+\x89\x04\xb7\xdd\x76\x1b\x13\x13\x13\x2c\x5e\xbc\x98\xe7\x9f\x7f\
+\x9e\x7c\x3e\x8f\x6d\xdb\x14\x0a\x05\xd4\x77\x73\x5d\x97\x42\xa1\
+\x50\xfe\x4e\xc2\xa0\xd0\x33\x81\xb6\xa0\x16\xad\x36\x47\xf4\x14\
+\x0d\xa9\x49\xa4\x0d\x4e\x32\xc0\xec\xcf\xeb\xf1\x8a\x9a\x52\x5d\
+\x1c\x8d\xea\x32\x8e\x42\x55\xb5\x2d\x5c\xb8\xb0\x7e\x6c\x6c\xcc\
+\xb7\x17\x95\x34\x87\x4a\x0c\x01\xac\x5f\xbf\x9e\xbe\xbe\x3e\x4c\
+\xd3\x64\xf3\xe6\xcd\x3c\xf5\xd4\x53\x04\x83\x41\x82\xc1\xa0\x4f\
+\x8f\x1c\x8e\x81\xb2\x45\x55\x55\x55\x6c\xd9\xb2\xa5\x3d\x99\x4c\
+\x4e\xbc\x12\x9d\x9c\xc9\x64\x7e\xa3\x1e\x87\xc3\xe1\x4b\x0e\x1c\
+\x38\x60\x00\x9e\xeb\xba\x27\xde\x70\xc3\x0d\xd1\xaf\x7c\xe5\x2b\
+\xf4\xf6\xf6\xd2\xd1\xd1\xc1\x9d\x77\xde\xc9\xfa\xf5\xeb\x29\x14\
+\x0a\xbe\x5d\x71\x1c\x07\xc7\x71\x98\x9d\x9d\xc5\x2e\x59\x94\x4a\
+\x3a\x2f\xf4\xe7\x79\xfb\xc2\x0b\x89\x85\xa3\x3c\xbe\xef\x3f\x08\
+\xe9\xd5\xd8\x64\xc9\x1f\xb0\x91\x0e\x68\x9a\x86\x69\x9a\xf4\xf4\
+\xf4\xdc\x9d\x4c\x26\x37\x8d\x8c\x8c\xdc\xf9\x9a\x49\x88\x52\x43\
+\x95\xbe\xbb\xd2\xc1\xb6\x6d\xb3\x70\xe1\x42\xee\xb9\xe7\x1e\x3e\
+\xfc\xe1\x0f\xf3\xaf\xff\xfa\xaf\xfc\xdd\xdf\xfd\x1d\xc1\x60\xb0\
+\xcc\x3b\xcd\x4b\x90\xe7\x79\xa8\xbc\x83\x52\x13\xf3\xf6\x40\xa4\
+\x52\xa9\x87\x80\x84\xae\xeb\xe9\x70\x38\x6c\x2b\xc3\xab\xa4\xea\
+\x95\xac\x44\x22\x71\x6d\x22\x51\x0e\xa8\xeb\xeb\xeb\x9f\x8c\xc5\
+\x62\x67\xdf\x7c\xf3\xcd\x8c\x8f\x8f\x73\xfb\xed\xb7\xb3\x73\xe7\
+\x4e\x02\x81\x80\x4f\x5c\x56\x7e\xbf\xe9\xe9\x69\xba\xbb\xbb\xcb\
+\x81\xab\x2b\x79\x7c\xfc\x71\xba\xcf\x09\xd2\xae\xb5\xe2\x4e\x84\
+\xf0\x52\x0b\xa1\xed\x10\x72\x15\x5d\xd7\xaf\xec\xef\xef\xd7\x5f\
+\x2b\x40\x42\xef\x7b\xdf\xfb\xf6\x1e\x38\x70\xa0\x5a\x89\xb2\xa2\
+\x46\x94\xeb\x29\xa5\xe4\xd3\x9f\xfe\x34\x4f\x3d\xf5\x14\xf3\x5c\
+\x0f\x1f\xfc\xe0\x07\xa9\xa9\xa9\x79\x49\x17\x30\x4d\x93\x2d\x5b\
+\xb6\x7c\x3e\x93\xc9\xbc\xaa\xfc\xd0\x8b\x48\xfa\x8d\x03\x03\x03\
+\xf5\x9a\xa6\x59\x52\xca\xff\xf5\x4f\xff\xf4\x4f\x6b\x6f\xba\xe9\
+\x26\x2c\xcb\x62\xdd\xba\x75\xec\xdb\xb7\x8f\xb1\xb1\x31\x5f\x8d\
+\x39\x8e\xe3\xb3\xc6\x39\xaf\x44\xdb\x7b\x4a\x84\xdb\xa1\xd0\x3c\
+\x8b\x01\x04\xb5\x08\x6e\x09\x28\x98\x4c\xfd\xa4\x11\x61\x78\x18\
+\x86\xe1\xc7\x50\xaf\x05\x20\xf5\xd5\xd5\xd5\x0b\x75\x5d\xf7\x25\
+\xa4\x50\x28\x50\x2c\x16\x09\x04\x02\x84\xc3\x61\x34\x4d\xe3\x27\
+\x3f\xf9\x09\x57\x5c\x71\x05\xb5\xb5\xb5\x14\x8b\x45\xdf\x5b\x39\
+\x5c\x1a\xd4\xdf\xba\xae\x93\x4e\xa7\x77\x1a\x86\xf1\xb8\xeb\xba\
+\x4e\x24\x12\x89\x67\x32\x99\xd7\x14\x0c\x4d\xd3\xc8\x66\xb3\xbf\
+\xcb\x66\xb3\xea\x34\x5f\x61\x18\x06\xb7\xdc\x72\x0b\x86\x61\xc8\
+\xbb\xee\xba\x4b\xac\x5e\xbd\xda\x7f\xbd\x72\xe3\x95\x26\xc8\x14\
+\x73\x44\xb6\xe7\x98\xfa\x7d\x9a\xcb\xcf\xf8\x5b\x5c\xbd\xc0\x43\
+\xbd\xdf\xa6\x29\xdc\xc5\x44\x66\x88\xb9\xb1\x22\xc2\x28\x5f\x67\
+\x66\x66\x66\x51\x34\x1a\xfd\xcb\x5c\x2e\x77\xdf\xab\x02\x48\x85\
+\xde\x76\x95\xaf\xae\x44\xd9\xb2\x2c\xf2\xf9\x3c\xed\xed\xed\x3c\
+\xf4\xd0\x43\xbc\xff\xfd\xef\x67\xdf\xbe\x7d\x5c\x77\xdd\x75\x04\
+\x02\x01\x34\x4d\xfb\x43\x55\x20\x87\x7c\x7e\x38\x1c\x26\x1e\x8f\
+\x3f\x35\x33\x33\x73\xc3\xeb\x95\x46\x3e\xfc\xd4\xa6\xd3\xe9\xcd\
+\x3b\x76\xec\x08\x7a\x9e\xa7\xb7\xb4\xb4\xbc\xff\xe9\xa7\x9f\x46\
+\xd7\x75\x84\x10\x84\xc3\xe1\x43\x54\x97\x69\x9a\x9c\x7d\xda\x1a\
+\xa4\x07\xae\x74\xd9\xd6\xbb\x11\xd3\xd0\x59\xea\x9c\x83\x3b\x23\
+\x58\x6a\x2f\x86\xd5\xaa\x9e\x47\x02\xac\x29\x14\x0a\x6b\xee\xbe\
+\xfb\xee\x57\x07\x90\x78\x3c\x4e\x6b\x6b\xeb\x59\xb6\x6d\x7f\x40\
+\xc5\x15\x2a\x12\x37\x8c\x32\x0f\x55\x53\x53\xc3\xe6\xcd\x9b\x31\
+\x4d\x93\x9d\x3b\x77\x1e\x02\xc0\x4b\x4a\x9e\x04\x02\x6f\x68\x39\
+\x52\x2a\x95\xba\x03\xb8\x03\x08\x2c\x5e\xbc\xb8\xf4\x37\x7f\xf3\
+\x37\x4c\x4e\x4e\xb2\x61\xc3\x06\xba\xba\xba\xf8\xee\x77\xbf\x4b\
+\xb1\x58\x2c\xb3\xc2\xc5\x22\xf1\x78\x1c\x21\x04\x1b\x53\xbd\xfc\
+\xd9\xa7\xab\xf1\x5c\xf0\x7c\xb0\xc1\x1a\x0b\x52\xe8\x8d\x61\x8d\
+\x05\x01\xf9\x62\x0e\xcc\xd1\xab\xac\x50\x28\xf4\xd7\x67\x9e\x79\
+\xe6\x95\x96\x65\x49\xd7\x75\x85\xba\x39\xcf\xf3\x38\xef\xbc\xf3\
+\xd8\xbd\x7b\x37\xdf\xf8\xc6\x37\xe8\xea\xea\xf2\x6d\x8b\x0a\xb8\
+\x0c\xc3\xf0\xa3\x60\x29\xcb\xd1\xac\xa2\x42\xb6\x6d\xdb\x16\x01\
+\x0a\xbc\x79\x96\x4c\x24\x12\x39\xd3\x34\xa5\x6d\xdb\xe1\x0d\x1b\
+\x36\xe8\x3f\xf8\xc1\x0f\x7c\x49\xaf\xe4\xe6\x00\x2c\xcd\x25\x54\
+\x25\x88\x26\x4f\xe7\x86\x0b\x3f\xcb\x23\x83\xdf\x61\x60\x6c\x90\
+\xd2\xa9\x93\x4c\xe4\x0b\xe4\x86\x34\x10\xf2\x65\x1d\xd0\x97\x04\
+\x5d\x57\x57\xd7\x7d\x2b\x56\xac\xf8\xb0\x6d\xdb\xec\xdf\xbf\x9f\
+\x68\x34\x4a\x3c\x1e\xe7\x93\x9f\xfc\x24\x1d\x1d\x1d\xfc\xcb\xbf\
+\xfc\x0b\xe1\x70\xd8\x57\x49\xca\xc0\x7b\x9e\x57\x66\x59\xe7\xf3\
+\x20\x95\x2e\x71\x3e\x9f\x67\xef\xde\xbd\xe1\x7c\x3e\x5f\xe4\x4d\
+\xb8\xea\xea\xea\x1e\x3b\xe5\x94\x53\xce\x5d\xbe\x7c\x39\x5b\xb7\
+\x6e\x65\x7a\x7a\x9a\xd6\xd6\x56\xa4\x94\x64\x32\x19\x16\x2d\x5a\
+\x84\x8e\x86\x53\x82\xa2\x57\xc4\xa5\x84\x69\x47\xd0\x8d\x79\x35\
+\x6d\x82\x30\xfc\x78\x4a\x9a\xa6\x29\xb6\x6f\xdf\xbe\x7a\x6c\x6c\
+\x6c\xf3\x2b\xb5\x21\x31\xcf\xf3\xaa\xd4\xe9\x70\x5d\xd7\x67\x6b\
+\xe3\xf1\x38\xe7\x9c\x73\x0e\x37\xdd\x74\x13\xdb\xb6\x6d\x23\x97\
+\xcb\x31\x37\x37\x47\x2a\x95\x22\x10\x08\xd0\xda\xda\xca\xd8\xd8\
+\x18\x63\x63\x63\xac\x58\xb1\x82\x6d\xdb\xb6\x51\x2c\x16\x7f\x35\
+\x3e\x3e\x7e\x6b\x2c\x16\x4b\xd7\xd7\xd7\x97\xf2\xf9\xfc\x9b\x11\
+\x0f\x84\x10\x01\xdb\xb6\x79\xe2\x89\x27\xe8\xee\xee\x96\x97\x5c\
+\x72\x89\xb8\xeb\xae\xbb\xa8\xad\xad\xc5\xf3\x3c\x9f\x47\x1b\xd5\
+\x67\x68\xff\x8b\x59\x16\x34\x06\x70\xf2\x56\x39\xcb\x38\x15\xc2\
+\x9a\x08\x22\x0b\x3a\x5e\x5e\x07\x10\xd1\x68\x14\xc3\x30\x9c\x57\
+\xac\xb2\xea\xeb\xeb\x6f\x6f\x6c\x6c\xfc\x53\xe5\xea\x2a\x40\xba\
+\xba\xba\x78\xf6\xd9\x67\xd9\xb4\x69\xd3\x8b\xbe\x77\x74\x74\xd4\
+\x97\x9a\xde\xde\x5e\x62\xb1\x18\x81\x40\x60\x72\xff\xfe\xfd\x4f\
+\xcf\xcd\xcd\xf9\x69\xd7\x37\xe3\x72\x1c\xe7\xf3\x03\x03\x03\xcd\
+\xb6\x6d\xaf\x59\xb3\x66\xcd\xb5\x43\x43\x43\x18\x86\x71\x48\x7e\
+\x07\x20\x65\xe5\x38\xb3\x39\x4a\x21\x2f\x79\xd7\x09\xef\xa3\xaf\
+\x6a\x33\xe9\x8e\x19\x40\x50\x18\x36\x99\xf9\x45\x0d\xe8\x65\xf2\
+\xf3\x55\xb1\x21\xae\xeb\x46\x94\xfb\xaa\x0a\x0b\xde\xfd\xee\x77\
+\x33\x3a\x3a\xca\x63\x8f\x3d\x46\x38\x1c\xf6\xcb\x3c\x15\xbd\xae\
+\x0c\x7e\x85\x6b\x5b\x2e\x09\x75\x5d\xd2\xe9\x74\x94\x37\xf9\xaa\
+\xae\xae\x26\x9d\x4e\xff\xf7\x3c\x37\xe6\x0e\x0d\x0d\x5d\x9b\x4c\
+\x26\x51\x55\x33\x9e\xe7\xd1\xdf\xdf\x4f\x55\x55\x15\x86\x67\xb3\
+\xed\x6b\x36\x94\xa2\xcc\xd5\xed\x44\x0a\x93\x78\xca\x21\x60\xea\
+\x14\x0b\x19\x9c\x54\x39\x3d\x3d\x35\x35\x45\x2c\x16\xfb\x61\x53\
+\x53\xd3\x0d\x53\x53\x53\x8f\x1e\x35\x20\x52\x4a\x57\x49\x86\xb2\
+\x07\x13\x13\x13\xdc\x78\xe3\x8d\x7c\xf5\xab\x5f\xe5\xf6\xdb\x6f\
+\x67\x78\x78\x98\x93\x4f\x3e\x99\x99\x99\x19\xe2\xf1\x38\x35\x35\
+\x35\x3c\xff\xfc\xf3\x68\x9a\xc6\x49\x27\x9d\xc4\x96\x2d\x5b\xc4\
+\xe8\xe8\xe8\x13\xd3\xd3\xd3\xeb\x00\x16\x2e\x5c\xc8\xf8\xf8\xf8\
+\x9b\x16\x10\xc5\x02\xcf\x4b\xb7\xa9\xb2\x9c\xab\x56\xad\x92\xa3\
+\xa3\xa3\x22\x99\x4c\xd2\xd0\xd0\xc0\xc9\x27\x9f\x5c\x26\x23\x3d\
+\x1b\x4e\x9a\xa1\xa6\xae\x80\x97\x0e\x50\x93\x5a\x84\x97\x36\x71\
+\x53\x06\xb4\x80\xd0\xa5\x22\x3e\x4f\xba\xf7\xde\x7b\x1b\x8e\x5a\
+\x42\x9a\x9a\x9a\x16\xbb\xae\xfb\x6e\xe5\x39\x05\x02\x01\x02\x81\
+\x00\x43\x43\x43\x6c\xd8\xb0\xc1\xf7\x9a\x00\x7e\xff\xfb\xdf\xfb\
+\x39\xf3\xca\x78\x63\xd3\xa6\x4d\x84\x42\x21\xff\x75\xc0\x9b\x1a\
+\x8c\x3f\x10\x44\x3e\xba\x65\xcb\x96\xb5\x81\x40\xe0\xea\xf3\xce\
+\x3b\xef\x8a\x1f\xfc\xe0\x07\x7e\x6a\x21\x93\xc9\x20\x3d\x8f\x31\
+\x99\xe0\x8c\xb7\x39\xd8\x8e\x4b\x55\xa8\x86\x82\x9b\x41\xe8\xe5\
+\x82\xbe\xfc\xae\x18\xe9\x67\x6a\x40\x1c\x74\x72\xfe\xe8\xf5\x8e\
+\x40\xcc\xad\x89\x44\x22\x0b\x5d\xd7\x25\x99\x4c\x22\xa5\xe4\xfa\
+\xeb\xaf\xa7\x58\x2c\x12\x0e\x87\x89\x44\x22\x3e\x48\xa1\x50\x88\
+\x60\x30\x48\x38\x1c\x26\x1c\x0e\x13\x0a\x85\x08\x85\x42\xc4\x62\
+\xb1\x43\xbc\xab\xb7\xda\xca\x64\x32\x93\xa5\x52\xe9\x49\x4d\xd3\
+\x46\xbe\xf5\xad\x6f\x1d\x22\x3d\x7e\x32\x4e\xba\x80\xc6\x62\x79\
+\x11\x9f\x59\x7d\x37\x7f\x7f\xee\x8f\x18\xde\xe3\xd2\x11\x5b\x8e\
+\x08\x96\x6b\xcf\x14\x7b\x7c\xa4\x98\xe4\x8f\x3e\x1b\x0e\x87\xaf\
+\x5c\xb2\x64\xc9\xdd\x00\xc9\x64\x92\xa6\xa6\x26\x7e\xf2\x93\x9f\
+\x30\x3d\x3d\xcd\x43\x0f\x3d\xc4\xfe\xfd\xfb\x59\xb7\x6e\x1d\x8f\
+\x3c\xf2\x08\x2b\x57\xae\x24\x91\x48\x30\x38\x38\x48\x4f\x4f\x0f\
+\x8d\x8d\x8d\xfc\xf0\x87\x3f\xa4\x58\x2c\xce\xbc\xf0\xc2\x0b\x8d\
+\xcd\xcd\xcd\x81\xc9\xc9\xc9\xd2\x5b\x15\x98\x9a\x9a\x9a\x2f\xac\
+\x5e\xbd\xfa\xa6\xd1\xd1\x51\x92\xc9\x24\xa1\x50\x88\xd3\x4f\x3f\
+\x9d\x40\x20\x80\x04\x02\x86\x86\x74\x02\x38\x5e\x09\xc3\x30\x71\
+\xa4\x8d\xa6\x97\x6b\xcf\x64\x05\x31\x30\x3c\x3c\x1c\x7f\xfa\xe9\
+\xa7\x17\x1e\x95\xca\xd2\x34\x2d\xac\x54\x90\xae\xeb\x84\x42\x21\
+\x3e\xf9\xc9\x4f\xd2\xd9\xd9\xc9\x0b\x2f\xbc\x80\x94\x92\xde\xde\
+\x5e\x74\x5d\xf7\xf3\x1c\x00\x8f\x3c\xf2\x08\xae\xeb\xaa\x82\x06\
+\x09\xc8\xb7\x32\x18\xf3\x74\xcb\xcf\x9e\x79\xe6\x99\xfd\x0b\x17\
+\x2e\xbc\xbd\xbd\xbd\x3d\x3a\x3a\x3a\xea\xf3\x79\x1e\x1e\xdb\xeb\
+\xfb\x38\xeb\x2f\x22\x18\x19\x13\x37\x6d\xa0\xa7\x82\xb8\x29\x03\
+\x37\x6d\x60\x8d\x85\x10\x02\xc5\x68\x9b\x47\x6d\x43\x42\xa1\xd0\
+\xa7\x65\xd9\xaa\x8b\x25\x4b\x96\xe0\x38\x0e\xf9\x7c\x9e\x3d\x7b\
+\xf6\xf8\xd1\xab\xe2\x7c\x82\xc1\xa0\x9f\x94\x51\x65\x9b\x80\x4c\
+\xa5\x52\x36\xc7\xc0\xca\x64\x32\xcf\x02\xcf\x1a\x86\xf1\x8f\x23\
+\x23\x23\x51\x4d\xd3\x0e\x26\xe5\xa4\x43\xfd\x42\x03\xe1\xea\x2c\
+\x6a\x3c\x85\x9a\x45\x55\xbc\x30\xb5\x89\x58\xa0\x96\xbc\x3e\xc5\
+\xc8\x57\x5b\x11\x5a\x99\x50\x55\x99\xd5\xa3\x02\x44\x4a\x29\xa4\
+\x94\xa2\x54\x2a\xf1\x89\x4f\x7c\x02\xc3\x30\xb8\xe8\xa2\x8b\xf8\
+\xf2\x97\xbf\x8c\x69\x9a\x18\x86\x41\x2a\x95\x62\x64\x64\x84\xee\
+\xee\x6e\x86\x87\x87\x49\xa7\xd3\xf4\xf7\xf7\x93\xcd\x66\xc9\x64\
+\x32\x7f\x33\x30\x30\xf0\x0d\x8e\xa1\xa5\x3c\x4d\x28\xe7\xf8\xa5\
+\x94\xb8\x48\x3c\xf2\x3c\xbb\xab\xc8\xa2\x77\x76\xf1\xf0\xf3\x4f\
+\x10\xab\x8f\x12\x88\x2e\x66\xd7\xcc\x5e\x52\xa3\x36\x9a\x56\x3e\
+\xa4\x85\x42\xa1\xee\xa8\x6d\x48\x7d\x7d\x7d\x7f\x53\x53\xd3\x52\
+\xd7\x75\xa9\xab\xab\xe3\x8a\x2b\xae\xa0\xb7\xb7\xd7\x2f\x36\xf0\
+\xdb\x0a\x4a\x25\x42\xa1\x10\xa5\x52\x89\x6c\x36\x4b\x34\x1a\x25\
+\x95\x4a\x91\xcd\x66\xaf\x3b\xd6\x00\x69\x69\x69\xf9\x8c\x10\xe2\
+\xb3\x42\x88\xba\x95\x2b\x57\xfa\xb9\x9e\xa2\x67\x11\x3a\x39\x85\
+\xe1\x18\x78\xd3\x11\x9c\xc9\x30\x68\x1e\x42\x13\x2a\xd7\x8e\x94\
+\x92\xe9\xe9\x69\x1e\x7b\xec\x31\x71\xb4\x71\x88\x50\x74\xb5\xae\
+\xeb\xdc\x75\xd7\x5d\x87\x24\xa3\x2a\xdd\x5b\x15\xb9\x9a\xa6\x89\
+\x6d\xdb\x32\x16\x8b\x89\x74\x3a\xad\x1f\x4b\x60\x54\x57\x57\x33\
+\x31\x31\xf1\xa5\xd6\xd6\xd6\x6b\x81\x3a\xcf\xf3\xca\x44\xa9\xd0\
+\x78\xac\xb8\x9d\xbf\x5c\xd5\x84\x23\x6d\x2c\xb7\x44\xcc\x08\xe3\
+\x66\x74\xbc\x54\x90\xdc\xce\x18\x56\x3c\xf0\x07\xa9\xff\x97\xe5\
+\xf6\x02\xa6\x6d\xdb\x5c\x70\xc1\x05\x34\x36\x36\x72\xf5\xd5\x57\
+\xd3\xd4\xd4\x84\x69\x9a\x2c\x5e\xbc\x98\x8e\x8e\x0e\x4c\xd3\xa4\
+\xb1\xb1\x91\x64\x32\x49\x2e\x97\x43\xd7\x75\xe2\xf1\xb8\xd8\xbd\
+\x7b\xf7\x2f\x32\x99\xcc\x2f\x8f\x25\x40\x94\xcb\x2b\xe6\x4f\xa1\
+\x4a\x45\x58\x96\x85\xd0\xca\xe5\xa6\xef\x8c\xfd\x35\x5f\x5c\xf7\
+\x30\xcb\x6a\xcf\x64\x79\xc3\xd9\x44\x3b\x25\xc4\x4a\x07\x1b\x8c\
+\x5e\x89\x0d\x01\xc4\x7c\x76\x8d\x7b\xef\xbd\x97\xa1\xa1\x21\xf6\
+\xec\xd9\x83\x69\x9a\xd4\xd7\xd7\x93\xcd\x66\xd1\x75\x9d\xce\xce\
+\x4e\x6a\x6b\x6b\xd9\xbb\x77\x2f\x3d\x3d\x3d\x64\x32\x19\x0a\x85\
+\xc2\xe6\x78\x3c\xde\xcb\x31\xb8\x1c\xc7\x91\x7e\x57\x30\xa0\x21\
+\xd0\x43\x82\x7d\x7b\x93\xfc\xcb\xff\xb8\x9c\xeb\x1e\x7c\x37\x77\
+\x5f\xb6\x99\xc9\xb9\x69\x9e\x4b\xfc\x17\xdf\xfb\xd5\xbd\x58\x96\
+\xe6\x07\x94\xaf\x88\xcb\xd2\x34\x8d\x81\x81\x01\x2e\xba\xe8\x22\
+\x0a\x85\x82\xaf\x0b\x2b\xcb\x5c\xfa\xfa\xfa\xfc\xc7\x4f\x3f\xfd\
+\xf4\x21\x51\xf9\xb1\xb8\x66\x66\x66\xde\xd5\xd2\xd2\x32\xa5\x78\
+\x2d\x81\x40\x84\x05\x85\x9c\x47\x38\x74\xd0\xab\x75\x5c\x87\xc7\
+\x87\xfe\x03\xcf\x95\xbe\xbd\x7d\xa5\x12\x42\x20\x10\xa0\xbe\xbe\
+\x9e\x40\x20\xa0\xaa\x14\x09\x06\x83\x64\x32\x19\x6a\x6a\x6a\xfc\
+\xbc\xba\xca\xa9\x67\x32\x19\x2c\xcb\xb2\x81\xb1\x63\x15\x10\xd7\
+\x75\xb3\xf3\x92\x52\xa6\x43\x28\xe7\x80\x62\x31\x13\xdb\x02\xd7\
+\x9b\xef\x08\xc6\xc5\xf5\x1c\x3c\xd7\xc5\xb2\xbc\x57\x0e\x88\xe7\
+\x79\xac\x5b\xb7\x8e\x2b\xaf\xbc\x92\x33\xce\x38\x83\x87\x1f\x7e\
+\x98\xdf\xfd\xee\x77\xe4\xf3\x79\x26\x26\x26\x38\xe3\x8c\x33\x98\
+\x9c\x9c\xa4\xaf\xaf\x0f\xcf\xf3\x68\x6c\x6c\xe4\x85\x17\x5e\xc0\
+\xf3\xbc\x7d\xf1\x78\xfc\xdf\xdf\x0c\x93\x11\x5e\xab\x35\xcf\x64\
+\x4b\xcb\xb2\x84\x40\x20\x34\x9d\xa5\xcb\xea\x79\x64\xeb\xcf\xf9\
+\xcc\x39\xdf\xe2\xbf\xf6\x7c\x13\x27\x17\xe6\xbc\xc5\x1b\xe8\x75\
+\xbe\x43\xa9\xe4\x1c\xa2\x55\x8e\x5a\x42\x36\x6e\xdc\xc8\xf4\xf4\
+\x34\x35\x35\x35\x0c\x0c\x0c\xf8\x28\x4b\x29\xf9\xe9\x4f\x7f\xea\
+\x57\x92\x78\x9e\xc7\xd4\xd4\x94\x2a\xae\x16\xc0\x31\x0b\x06\x60\
+\x15\x0a\x85\xd9\x42\xa1\x50\x9f\x4c\x26\xd1\x84\x46\xbe\xd9\xa3\
+\x68\x55\xf1\x1f\x43\x7f\xcf\x27\x63\xdf\xe3\x40\xae\x9f\xe7\x27\
+\x7e\x87\x11\xd0\x98\x19\x4b\x31\x37\x57\xae\x43\x50\x99\xd5\xa3\
+\x06\xc4\x30\x0c\x46\x47\x47\x19\x1e\x1e\x46\xd7\x75\xdf\xe5\xd5\
+\x34\xcd\xff\x5b\x45\xed\x2a\x0f\x32\x39\x39\xd9\xd2\xda\xda\xfa\
+\xbe\x78\x3c\xfe\xc8\xb1\xaa\xb5\x84\x10\x96\x4a\x57\xab\x86\x1e\
+\x23\x28\xa8\x22\xc2\x1d\x8f\x5d\x4b\xb2\xcf\x63\x66\x6f\x81\x52\
+\xd2\x23\x37\xe9\x22\x34\xe1\xef\xd3\x51\x03\x12\x8d\x46\xf9\xc8\
+\x47\x3e\x42\x7f\x7f\x3f\x17\x5f\x7c\x31\x4f\x3c\xf1\x04\x43\x43\
+\x43\xd4\xd5\xd5\xe1\x38\x8e\xef\x06\x8e\x8c\x8c\x90\x4c\x26\x69\
+\x69\x69\x61\x72\x72\x92\x5c\x2e\x57\x4d\xb9\x18\xe6\x98\x03\xa4\
+\xa5\xa5\x45\x55\xe9\x4b\x75\x08\x6b\x6b\x6b\x31\x87\x8b\x3c\x71\
+\x63\x9a\x42\xc2\x2d\x77\xec\x6a\x20\xf4\xb2\x0f\x66\x98\xf8\x07\
+\xf6\x48\xf4\xfb\x1f\x05\x24\x12\x89\x30\x35\x35\xc5\xa7\x3e\xf5\
+\x29\xa4\x94\x6c\xdc\xb8\x91\xba\xba\x3a\x6a\x6b\x6b\x71\x5d\x97\
+\xd1\xd1\x51\xba\xba\xba\xfc\xc6\x97\xb6\xb6\x36\x72\xb9\x9c\x02\
+\xca\x3b\x16\x45\x63\x62\x62\x82\xf6\xf6\xf6\xef\x06\x02\x81\x46\
+\xd7\x75\xb9\xe3\x8e\x3b\x58\xb7\x6e\x1d\x5f\xfb\xda\xd7\x38\x70\
+\xe0\x00\x9e\xe7\x91\xc9\x64\x30\x0c\x83\xd9\xd9\x59\xaa\xab\xab\
+\x09\x85\x42\x0c\x0f\x0f\x53\x28\x14\x38\x52\x0d\xc1\x91\xd8\x5e\
+\x7e\xf1\x8b\x5f\xf0\xf3\x9f\xff\xfc\x45\x5f\x53\x69\x27\x76\xed\
+\xda\x45\x24\x12\x79\x49\xc6\xeb\xad\xbc\x02\x81\xc0\xda\x55\xab\
+\x56\x19\xbf\xff\xfd\xef\x59\xb1\x62\x05\x7d\x7d\x7d\xac\x5d\xbb\
+\x96\xef\x7f\xff\xfb\xf4\xf4\xf4\x30\x36\x36\x46\x57\x57\x17\x8f\
+\x3c\xf2\x08\xd5\xd5\xd5\xb4\xb7\xb7\x73\xda\x69\xa7\x71\xdf\x7d\
+\xf7\x1d\x31\x37\xf4\x47\x15\x5a\x6b\x6b\xeb\x70\x55\x55\xd5\x09\
+\x95\x84\x5a\xa9\x54\x22\x12\x89\xf8\x95\x25\x91\x48\x84\x5c\x2e\
+\x87\xe7\x79\xd4\xd5\xd5\xf9\xd2\xd2\xde\xde\x6e\xcf\xcd\xcd\xdd\
+\xb3\x67\xcf\x9e\xab\x8f\x35\x40\x16\x2d\x5a\x34\x78\xea\xa9\xa7\
+\x9e\x38\x31\x31\xc1\x92\x25\x4b\x58\xb3\x66\x0d\xbf\xfc\xe5\x2f\
+\x29\x95\x4a\x04\x02\x01\xb2\xd9\x2c\xe1\x70\x98\x74\x3a\xed\xef\
+\x9b\xe7\x79\xe4\x72\x39\x5c\xd7\x65\xe7\xce\x9d\x47\xc7\x65\x45\
+\xa3\x51\xeb\x9b\xdf\xfc\x26\xa9\x54\x8a\x0f\x7c\xe0\x03\xdc\x7f\
+\xff\xfd\xf4\xf6\xf6\xd2\xd0\xd0\x40\x55\x55\x15\xcf\x3d\xf7\x1c\
+\x55\x55\x55\xf4\xf5\xf5\x31\x31\x31\x41\x57\x57\x17\x23\x23\x23\
+\x0c\x0f\x0f\xe3\x38\x8e\x29\x84\x30\x8f\x41\x30\xfe\x2a\x10\x08\
+\xd4\xcd\xcc\xcc\x20\x84\x60\x68\xdf\x10\x03\x03\x83\x18\xc6\xa1\
+\x27\xdf\x1f\x86\x33\x1f\x77\x08\x21\x08\x85\x42\xfe\xff\x3f\x2a\
+\x40\x74\x5d\xe7\x73\x9f\xfb\x1c\x5f\xfc\xe2\x17\xb9\xf5\xd6\x5b\
+\xd9\xb1\x63\x87\x5f\x75\x91\xcf\xe7\xd1\x75\xdd\xaf\x46\x71\x1c\
+\x87\xe1\xe1\x61\x3f\x8a\x9f\x77\x8d\xbd\x79\x49\x3b\x66\x5c\xe0\
+\xb6\xb6\xb6\x7f\x5c\xba\x74\x69\x3d\xc0\x8e\x5d\xcf\xe3\x35\xa5\
+\x89\x04\x4c\x64\x26\x80\xb4\x34\x3c\x4b\x43\xda\x1a\x42\x48\x5f\
+\xff\x48\x29\xc9\xe7\xf3\x94\x4a\x25\x7f\x48\xc2\x2b\x8a\xd4\x6f\
+\xbe\xf9\xe6\x17\xe3\x74\x7c\x5b\xa3\x7a\xb5\x43\xa1\x90\x7f\x32\
+\x34\x4d\xbb\x72\xe9\xd2\xa5\x17\x0d\x0c\x0c\x34\x1e\x2b\x12\x62\
+\x59\x96\xae\x5a\xbc\xc7\xab\xf3\xfc\xf9\x27\x1a\x70\x0f\xa3\xa7\
+\x3c\x07\xb2\x5b\xaa\xc9\xef\x89\xa2\x6a\x7b\x67\x67\x67\xc9\x66\
+\xb3\x94\x4a\xa5\xc4\x51\xb3\xbd\x63\x63\x63\xf7\x37\x35\x35\x71\
+\xe9\xa5\x97\x72\xd3\x4d\x37\x71\xd6\x59\x67\xd1\xda\xda\x8a\x2a\
+\xd5\x3f\xef\xbc\xf3\x68\x6f\x6f\x07\xca\xad\xd2\x4b\x96\x2c\x61\
+\x72\x72\xd2\x77\x8b\xab\xab\xab\xe9\xe8\xe8\x38\x56\x24\x23\x02\
+\x2c\xcc\xe7\xf3\x7a\x32\x99\x2c\x37\x28\x15\x2c\x32\x13\x25\xc4\
+\xd0\x32\x3e\xdc\xf6\x45\x4e\x64\x0d\xda\x44\x3b\x6e\xca\x24\x53\
+\x4a\x91\x9c\x2b\x33\xe0\xaa\xb7\xe4\xa5\xd4\xf8\xfe\x51\x09\xb1\
+\x6d\xbb\xdf\xb2\x2c\xd6\xae\x5d\xcb\xb2\x65\xcb\x18\x1f\x1f\xa7\
+\x54\x2a\x31\x37\x37\x47\x73\x73\x33\xe9\x74\x9a\xda\xda\x5a\x52\
+\xa9\x14\x93\x93\x93\x54\x57\x57\xa3\xeb\x3a\xaa\x87\xc4\xb6\x6d\
+\x4c\xd3\x94\x15\x4e\xc2\x5b\x56\x75\xe5\xf3\xf9\x8f\xfd\xe9\x9f\
+\xfe\xe9\x97\x4d\xd3\x04\x29\xc9\xd8\x45\xde\xbd\x68\x39\xa9\x9f\
+\x19\xcc\x15\x53\xfc\xc3\xc3\x5f\xc6\xd0\x0d\x34\x43\x20\x58\x80\
+\xae\xc1\x82\x46\x9d\xa1\xa1\x21\x1a\x1b\x1b\x29\x16\x8b\x04\x83\
+\x41\xe9\x79\x5e\xf8\x15\xd1\xef\x63\x63\x63\x6c\xd8\xb0\x01\xc3\
+\x30\xfc\xfc\xb9\x5a\x83\x83\x83\xbe\xc1\x02\x78\xee\xb9\xe7\x30\
+\x4d\x93\x4a\xe2\xcd\x75\xdd\xaa\x95\x2b\x57\xde\x35\x35\x35\x35\
+\x18\x8f\xc7\xff\xe1\xad\x2a\x21\x9e\xe7\xd5\x29\x16\xbb\x20\x6d\
+\xec\x35\x23\x2c\xe8\x89\xe1\xe2\x22\x6d\x70\x27\xa2\x58\x93\x01\
+\x9c\xc9\x20\x56\xdc\xf0\xab\xde\x55\x43\x6c\x2a\x95\xa2\xb9\xb9\
+\x59\x14\x8b\xc5\xab\xda\xda\xda\x18\x1b\x1b\x7b\xf9\x2a\x4b\xd3\
+\x34\x4f\xa9\x9e\x48\x24\x42\x30\x18\xf4\xeb\xb0\x54\xd7\xd4\xe1\
+\x35\x58\x6a\x7a\x82\x6a\x03\x03\x42\x3d\x3d\x3d\x57\x01\x7f\x72\
+\x0c\xd8\x8f\x72\xff\xa1\x65\x51\x57\x13\xa2\x54\x70\x38\x77\xc1\
+\x5f\xf3\xde\x25\x57\x10\x68\xb5\xa8\x7f\x9b\x43\xd5\x79\x09\x4a\
+\x79\xfb\xe0\x4c\xc8\xf9\x7a\x2c\x55\xa0\x2e\x84\x08\xbe\x18\x18\
+\x47\x94\x90\xaa\xaa\xaa\x7b\xc7\xc6\xc6\xd6\x7f\xf6\xb3\x9f\xfd\
+\xf3\x9a\x9a\x1a\x2e\xbd\xf4\x52\x6e\xbb\xed\x36\x92\xc9\x24\x2b\
+\x57\xae\xc4\xf3\x3c\x7e\xf9\xcb\x5f\xb2\x72\xe5\x4a\x76\xec\xd8\
+\x01\x40\x30\x18\xa4\x58\x2c\x92\xcd\x66\xfd\xc1\x01\xf3\xae\x9e\
+\xfb\x56\x54\x5d\xa1\x50\xe8\x2f\xd6\xaf\x5f\x7f\xff\x7c\x25\x8d\
+\x74\x5d\x29\xc2\x55\x3a\xde\x2f\x1a\xc8\x08\xc9\x03\xda\x6f\x40\
+\x80\xa6\x75\xfa\xef\xa9\xae\xd7\xd8\xbc\x79\x33\xcb\x96\x2d\xf3\
+\x5b\xe1\x94\x2a\x3f\x52\xd0\xfc\x47\x01\x99\x9a\x9a\x92\x8b\x16\
+\x2d\xb2\x1e\x78\xe0\x01\x3e\xfe\xf1\x8f\x73\xf3\xcd\x37\xd3\xd7\
+\xd7\x87\xa6\x69\xc4\xe3\x71\x3f\x25\xb9\x65\xcb\x16\x0a\x85\x02\
+\xc9\x64\x92\xe6\xe6\x66\x9f\x7c\x54\xee\xaf\x6d\xdb\x84\xc3\xe1\
+\x33\x2e\xbc\xf0\xc2\x67\x06\x06\x06\xfe\x7b\x70\x70\xf0\xd6\xb7\
+\x90\xaa\x0a\x29\x9b\x68\x08\x5d\x0c\x9d\xb0\x8b\x77\x9c\x5f\x85\
+\xeb\xb9\xd8\x29\x0d\xd2\x11\xdc\xb4\x81\x9b\x34\x29\x0e\x86\x91\
+\xae\x00\xb7\xac\xde\x2b\xa7\xd7\x05\x02\x01\x12\x89\xc4\xf3\x86\
+\x61\xec\x7b\x45\x6e\xaf\x94\x52\x73\x5d\x97\x2f\x7d\xe9\x4b\x7e\
+\xbd\x95\xf2\x16\xa4\x3c\xb4\x5d\x4b\xd3\x34\xa6\xa7\xa7\x7d\xf1\
+\x54\xdd\x46\xf3\x11\x6c\x4d\x7d\x7d\xfd\x3b\x6b\x6b\x6b\xf7\xbe\
+\x45\x48\xc4\xda\xfa\xfa\xfa\x25\x89\x44\x62\xd1\x7c\xd2\x0d\x5d\
+\x6a\xe8\x96\x20\x35\x24\xa9\xd3\x4e\xa4\xb5\xae\x9a\x01\x6f\x3b\
+\xa2\x4a\x43\x54\x0b\x72\x2f\x54\xe3\x15\x35\x7f\x22\xc5\xc1\xd9\
+\x92\x52\xb5\x32\x7c\x73\x6a\x6a\xea\x99\x57\x04\xc8\xec\xec\xec\
+\x57\xb3\xd9\x6c\xe7\x35\xd7\x5c\xf3\xae\x42\xa1\xc0\xbb\xde\xf5\
+\x2e\x1e\x78\xe0\x01\x3c\xcf\x63\xc1\x82\x05\x8c\x8f\x8f\x13\x0e\
+\x87\x89\xc5\x62\x3c\xf3\xcc\x33\xb4\xb7\xb7\xd3\xd2\xd2\x42\xb1\
+\x58\xf4\x49\xb6\xca\x51\x15\x2f\xb7\x4d\xf8\x8d\x5a\xc5\x62\xf1\
+\xe3\xa7\x9f\x7e\xfa\x3f\x28\x43\x5e\x92\x16\xc1\x06\x87\xa6\xd9\
+\xb7\x23\x9e\x13\xe4\x80\x1c\x0e\x01\x4e\xf5\xdf\xd3\xde\x64\xb0\
+\x7b\xf7\x6e\xbf\x15\x43\x55\xe2\xa8\x34\x05\xe5\x39\x8d\x47\xaf\
+\xb2\x0c\xc3\x20\x9d\x4e\x6f\x5e\xb8\x70\xe1\xd0\xbe\x7d\xfb\xde\
+\xf5\xef\xff\xfe\xef\xf4\xf7\xf7\xb3\x74\xe9\x52\x0c\xc3\xf0\xdb\
+\xa3\x0d\xc3\x20\x1a\x8d\x72\xca\x29\xa7\x30\x37\x37\x47\x43\x43\
+\xc3\x21\x05\x65\xaa\x49\x74\x9e\x07\xfb\xe0\x25\x97\x5c\x72\xfe\
+\xcc\xcc\x8c\xd8\xbe\x7d\x7b\x77\x3a\x9d\x4e\xbc\x59\x40\xa8\xb4\
+\x6d\x9e\xe7\x99\xf9\x7c\x1e\x21\x04\x79\xb7\x04\xe7\x1e\x60\xf1\
+\xb2\x30\xd2\x03\x69\xcf\x47\xe4\x96\x86\x3d\x6d\x92\x7a\xbc\x0e\
+\x29\x5c\xbf\xa1\x47\x1d\xc0\x64\x32\x49\x30\x18\x44\xd3\x34\x19\
+\x08\x04\x84\x65\x59\xe6\x2b\x02\xa4\x22\x12\x17\x7d\x7d\x7d\xac\
+\x5b\xb7\xce\x37\x50\x87\x97\x8d\x2a\xf5\x25\x84\xe0\xd7\xbf\xfe\
+\xf5\xc1\x21\x65\x9a\x46\xb1\x58\xf4\x01\x11\x42\x84\x0d\xc3\x08\
+\xd7\xd6\xd6\x62\x59\xd6\x9b\x8a\x16\x8e\xc7\xe3\x9c\x72\xca\x29\
+\xff\xa7\xb9\xb9\xb9\xb3\x54\x2a\x75\x64\xd2\x69\xf0\x34\x1c\xcf\
+\xc3\x78\xb2\x96\xa1\xcd\x82\xf9\x56\xe7\x0a\x5e\xd6\x25\x3b\x33\
+\x4d\x75\x4d\x95\xdf\x61\xe6\xcf\x1b\xb6\x6d\x42\xa1\x10\xba\xae\
+\x8b\x4d\x9b\x36\x9d\x58\x5f\x5f\x3f\xf1\x8a\x00\x51\xab\x54\x2a\
+\x4d\x99\xa6\x39\xaa\xeb\x7a\x7b\x53\x53\x13\x86\x61\xf8\xdc\x8c\
+\x9a\x5f\x15\x0a\x85\x7c\x23\xaf\x8a\xe9\xd4\x00\x80\xd9\xd9\x59\
+\x7f\xca\x8e\x9a\xdb\xeb\x38\x0e\x5d\x5d\x5d\xd7\x04\x02\x81\xec\
+\xc4\xc4\xc4\xf3\x53\x53\x53\x4f\xbe\xd1\x52\x31\xef\x59\x5e\xb0\
+\x60\xc1\x82\x7a\x80\x84\x9d\xa6\x7a\xcd\x2c\xf5\xd5\x21\x9c\xc9\
+\x30\xce\x64\x08\x59\xd2\xf1\x4a\xe5\xb9\xbe\x78\xe5\xc3\x18\x6d\
+\x29\x77\x07\x54\x4e\x5d\x55\xd9\x53\x55\x74\x2e\xa5\xdc\x37\x33\
+\x33\x73\xc4\xfb\x79\x49\x95\x85\xf9\x7c\xfe\xbf\xc7\xc7\xc7\x7f\
+\xdc\xd4\xd4\xf4\x3f\xef\xbe\xfb\x6e\x56\xad\x5a\xe5\xab\xa3\x0f\
+\x7d\xe8\x43\x4c\x4e\x4e\xb2\x7c\xf9\x72\xba\xba\xba\x98\x99\x99\
+\x61\xed\xda\xb5\xac\x5e\xbd\xda\x1f\x4a\xa6\x5a\xdb\x22\x91\x88\
+\x3f\x24\xcc\xf3\x3c\x5a\x5b\x5b\xcf\xef\xea\xea\x7a\xdf\xee\xdd\
+\xbb\xf3\xc5\x62\xf1\x0d\xc9\x2e\x66\xb3\x59\x5a\x5b\x5b\x3b\xab\
+\xaa\xaa\xde\x56\x5d\x5d\xdd\x68\x9a\xe6\x47\xa5\x94\xc1\x42\xa1\
+\xc0\xae\xe4\x10\x4b\x4f\x35\x28\x16\x2c\x1c\x23\x87\x57\x9b\xc2\
+\x6b\x48\x22\x9b\x67\x29\x58\x79\x72\xe3\xf8\x55\xed\x2a\x05\x91\
+\x4e\xa7\x7d\xb2\x55\x0d\xda\x89\xc5\x62\x0c\x0f\x0f\xbf\x24\xcf\
+\xf2\x65\x15\x50\x85\x42\x21\xae\xbd\xf6\x5a\x6a\x6a\x6a\x18\x1f\
+\x1f\x47\x4a\xc9\xee\xdd\xbb\xf1\x3c\x8f\x7d\xfb\xf6\xf9\x0d\x29\
+\x3f\xfd\xe9\x4f\x7d\x35\xa6\x69\x9a\x6f\x6f\x94\x28\x2b\x5e\xa7\
+\x62\x60\x66\x8d\xa6\x69\x4b\x01\xb1\x70\xe1\xc2\xf8\xe8\xe8\x68\
+\xe6\xf5\x04\x25\x14\x0a\xdd\xb2\x6a\xd5\xaa\xbf\x2a\x47\xca\x1a\
+\x33\xcc\xb1\xa0\x5d\x67\xdd\x64\x0f\xf6\x6f\xcc\x72\x4b\x9a\x06\
+\x68\x07\x35\x6c\x58\xc0\xc4\xec\x10\x4d\x4d\x4d\xfe\x58\xc0\xca\
+\x31\xb8\xaa\xa0\x21\x9f\xcf\x3f\x3e\x3d\x3d\x7d\xdb\x4b\xbd\x97\
+\x97\x05\x88\xda\xd4\x44\x22\x21\x3d\xcf\x13\xf3\x5c\x15\xba\xae\
+\x53\x2c\x16\x0f\xe9\x51\x57\x34\x8b\x4a\x68\x25\x93\x49\x66\x66\
+\x66\xa8\xa9\xa9\xc1\xb2\x2c\x4c\xd3\x54\x80\xc8\xce\xce\xce\x8f\
+\x2c\x59\xb2\xe4\x23\xba\xae\xf3\xab\x5f\xfd\xea\x2a\xe0\xee\xd7\
+\x41\x55\xb5\xa5\xd3\xe9\xf3\x3c\xcf\x2b\xe5\x72\xb9\xe5\xaa\x63\
+\x38\x65\xe7\x09\xaf\x4c\xa1\x05\x83\xd0\x25\x91\x96\xc0\x4d\x99\
+\x38\x49\x03\x37\x69\x10\xf6\x6a\xa9\xae\xa9\x46\x7a\xd2\xb7\x8b\
+\xba\xae\xfb\x83\xdc\x94\x33\x54\x31\x28\xe1\xc0\xe8\xe8\xe8\x6f\
+\x5f\x0b\x40\xe2\x5b\xb7\x6e\x0d\x06\x83\xc1\x5b\x3e\xf1\x89\x4f\
+\xdc\x78\xf6\xd9\x67\x73\xfe\xf9\xe7\xf3\xed\x6f\x7f\x9b\xed\xbb\
+\x25\x5f\xa5\x00\x00\x09\x83\x49\x44\x41\x54\xdb\xb7\xf3\x8e\x77\
+\xbc\x83\x74\x3a\xcd\xe0\xe0\x20\x35\x35\x35\x3e\xaf\xb5\x7a\xf5\
+\x6a\x9e\x7b\xee\x39\x1f\xac\xc3\x67\xf8\x5a\x96\x25\x94\x73\x30\
+\xdf\x22\xd7\xd1\xdd\xdd\x7d\x86\x94\x92\x99\x99\x99\x3d\x13\x13\
+\x13\xaf\x49\x23\x7b\xa1\x50\xf8\xcb\xcb\x2e\xbb\xec\x9f\x55\xbb\
+\x72\x51\x2b\x12\xad\x13\x60\xe9\x78\x25\x0d\x99\x2e\xdb\x88\xb2\
+\x62\x97\xc8\x06\x30\x9a\x0d\xb6\xef\xd8\x46\xc8\x3a\x98\x62\x50\
+\x87\x2b\x99\x4c\x22\x84\xf0\x0f\x9c\x65\x59\x04\x83\x41\x6c\xdb\
+\x7e\x59\x73\x46\x5e\x0e\x20\x92\xf2\xcf\x4d\x38\xdb\xb7\x6f\x47\
+\x4a\xc9\x8f\x7f\xfc\x63\xa6\xa7\xa7\xf1\x3c\x8f\x07\x1e\x78\xc0\
+\x4f\x5e\x55\x8e\xca\xdb\xb4\x69\x93\x5f\xfe\xa2\x4e\x4e\xa1\x50\
+\x38\xc4\x45\xac\x9c\xd5\x78\xea\xa9\xa7\xde\xd6\xd1\xd1\x71\x5b\
+\x24\x12\xe1\xe1\x87\x1f\x5e\x05\x6c\x7d\x15\xa5\xe2\x03\xc0\x69\
+\xe5\xbd\x74\xdf\xbd\x73\xe7\xce\xf2\xc8\x0c\xcf\x41\x9c\x90\xa6\
+\xa6\x74\xa8\x57\x6a\x27\x75\xec\xf1\x20\x26\x21\x9a\x9b\x9b\x39\
+\xfc\xc7\x04\x0e\x3f\x5c\xca\x33\x8d\xc5\x62\x64\xb3\x59\x06\x07\
+\x07\xfb\x75\x5d\x1f\x78\xad\x00\xf1\x1d\x81\x50\x28\xc4\xb6\x6d\
+\xdb\xfc\x69\xa4\xaa\x5d\x41\x75\x54\x55\x26\xf2\x95\x64\xa8\xea\
+\x8b\x5c\x2e\x47\xb1\x58\xf4\xd9\xe3\x4a\xcf\x4b\x4d\x11\x4d\xa7\
+\xd3\x78\x9e\x47\x47\x47\xc7\x7f\x9e\x74\xd2\x49\x45\xd7\x75\xf5\
+\xde\xde\xde\x3b\xe2\xf1\xf8\xd7\x5e\xce\x8d\x1e\x36\xce\x96\x6c\
+\x36\x7b\xcd\x65\x97\x5d\x76\x61\x36\x9b\x45\x08\x41\xa2\x76\x5c\
+\x76\x2e\x33\x85\x15\x0f\xe3\xcc\x04\x91\x19\xd3\xf7\x68\xa5\xe7\
+\x21\x35\x49\x78\x69\x98\x8d\x9b\x36\x52\x5b\x5b\xeb\x03\x52\x39\
+\xe4\x53\x4d\xe9\x56\x71\x57\x30\x78\x70\x5c\xfa\xf4\xf4\xf4\xb2\
+\x97\xcb\xdd\xbd\x6c\x40\x74\x5d\xbf\xfb\xc9\x27\x9f\x7c\x4a\xd7\
+\xf5\x2b\x2f\xba\xe8\xa2\xcb\xd6\xae\x5d\x4b\x5b\x5b\x1b\x9b\x36\
+\x6d\x22\x9d\x4e\x93\x4c\x26\x99\x9b\x9b\x43\xd7\x75\x4e\x38\xe1\
+\x04\x86\x87\x87\x99\x98\x98\xe0\xf4\xd3\x4f\xe7\x85\x17\x5e\x38\
+\x04\x34\xdb\xb6\xfd\x21\x36\xa5\x52\x89\x60\x30\xe8\x7f\x61\xdb\
+\xb6\xa9\xab\xab\xeb\x54\x3f\xfe\xb2\x6b\xd7\xae\x75\xe1\x70\x78\
+\x06\xd0\x82\xc1\x60\x21\x99\x4c\x3e\x70\xa4\x7b\x9d\x9c\x9c\xe4\
+\xe4\x93\x4f\x7e\x7c\xd1\xa2\x45\x6b\x95\x5d\xdb\x37\xb6\x57\x06\
+\x82\x9a\x90\x05\x03\x7d\x26\x22\x0e\xf4\x83\xd0\x6c\x84\x66\xe3\
+\x7a\xae\x1f\x3f\x00\xd4\xd4\xd4\xa0\xe9\x07\x8b\x3b\x2a\x01\x51\
+\x01\xaf\x2a\x5c\x38\xf1\xc4\x13\x89\xc7\xe3\x94\x4a\x25\xaa\xaa\
+\xaa\x0e\x99\x52\xf1\x72\x88\xd4\x97\x0d\xc8\xdc\xdc\xdc\x20\x30\
+\x58\x53\x53\x73\xd6\xce\x9d\x3b\x59\xbe\x7c\x39\x03\x03\x03\xfe\
+\x54\x4f\x25\xca\xae\xeb\x32\x36\x36\xe6\x73\x5d\x3b\x76\xec\xf0\
+\xdb\xe0\x54\x10\x39\x37\x37\xc7\xe1\xe3\x65\x2b\xb8\x2f\x7f\x13\
+\x00\xd9\xdd\xdd\x7d\xc9\x8a\x15\x2b\x2e\x01\xd8\xbf\x7f\x7f\x7e\
+\x74\x74\xb4\x65\x5e\x45\xe8\x53\x53\x53\x4f\xba\xae\x1b\x9f\xe7\
+\x8d\x16\xb5\xb5\xb5\x6d\xac\x2c\xd9\xac\xdc\x10\xe9\x49\xa1\xa4\
+\x40\x49\x29\xc0\xf4\xf4\x34\x3d\x3d\x3d\x7e\x2c\x31\x3b\x3b\x5b\
+\xe6\xaf\xe6\x27\x53\x54\x8e\x16\x51\x80\x54\xd2\x22\x4b\x96\x2c\
+\x61\x7a\x7a\x9a\x52\xa9\x34\x37\x35\x35\x35\x52\x2c\x16\x9d\xa3\
+\x51\xab\xaf\xa8\x6f\xa0\xad\xad\x8d\x8d\x1b\x37\x02\xfc\xc1\x59\
+\x1e\x55\x55\x55\x87\xe7\x57\x08\x85\x42\xb8\xae\xcb\xd4\xd4\x94\
+\x1f\xd9\x2b\x5d\xac\x86\x84\x29\x09\x51\x7f\x03\x22\x97\xcb\x31\
+\x31\x31\xa1\xf4\x74\x64\xc5\x8a\x15\x5f\x57\xc4\xdd\xd6\xad\x5b\
+\xa9\xae\xae\xf6\x83\xd0\xe9\xe9\xe9\x3f\x58\xb2\xe9\x38\x0e\x17\
+\x5e\x78\xa1\xef\x11\x8d\x8f\x8f\xd3\xd8\xd8\xe8\xdf\xbf\x72\x5d\
+\x95\x3a\x52\x3f\xb1\xa1\xa6\xe2\x29\x57\x5d\x55\x8e\xa8\x61\x97\
+\xba\xae\x33\x32\x32\xa2\x00\x7a\x78\xf7\xee\xdd\x97\x1f\xed\x9e\
+\x1e\x35\x20\x9e\xe7\x7d\xed\xd9\x67\x9f\xfd\xb1\x65\x59\x2b\x7b\
+\x7a\x7a\xee\xbd\xf5\xd6\x5b\x69\x6b\x6b\xe3\x67\x3f\xfb\x19\x3b\
+\x76\xec\x40\x08\x41\x36\x9b\x65\xd9\xb2\x65\xf4\xf6\xf6\xfa\xcd\
+\x3d\x8d\x8d\x8d\xec\xdb\xb7\xcf\xd7\xbb\x8a\xda\x3e\x3c\xd2\x55\
+\x29\x60\xe5\x4e\xab\x0d\x52\x41\xa6\xda\x14\x29\x25\xad\xad\xad\
+\xb4\xb5\xb5\x21\x84\x60\x72\x72\x92\xd6\xd6\x56\x3f\x0e\xd8\xbb\
+\x77\xaf\x9f\xd7\xdf\xb5\x6b\x97\xcf\xbf\xa9\x93\x7f\xb8\x81\x56\
+\xb4\x90\xf2\x9e\x0e\xf7\x0c\xd5\xf5\x01\x9f\x48\x1d\x1c\x1c\x64\
+\x6e\x6e\x8e\xaa\xaa\x2a\x2a\x87\x76\xbe\xae\x80\x64\x32\x99\x29\
+\x60\x4a\xd7\xf5\x2a\x4d\xd3\xf8\xdc\xe7\x3e\x47\x43\x43\x03\x89\
+\x44\xc2\xff\x52\x52\x4a\x26\x26\x26\x0e\xa1\xeb\x15\x58\xb1\x58\
+\x8c\xee\xee\x6e\xe2\xf1\xb8\xaf\x12\x2a\x87\x6b\xaa\x7f\x4a\x8a\
+\x94\xe1\xaf\xcc\xb1\x54\x66\xf2\x14\x11\xa8\x0c\xad\x72\x34\x14\
+\xeb\xac\xdc\x54\xc5\x38\x2b\xf0\xd5\xe7\xa8\x83\xa0\x3c\xc2\xca\
+\xc2\x84\xf9\xa1\x39\xfe\xf7\x50\x0e\xcc\xb2\x65\xcb\xe8\xeb\xeb\
+\xc3\x30\x0c\xe2\xf1\xf8\x1d\x42\x08\xaf\x50\x28\x3c\xf3\x86\x00\
+\x52\xa1\x86\x9c\x52\xa9\x54\x0c\x87\xc3\xc5\x64\x32\x19\x8d\x46\
+\xa3\x66\x30\x18\x44\xd7\x75\x7f\x34\xac\x3a\x65\xca\xb0\xaa\x4d\
+\x53\xd5\x8f\x2a\x9a\xd7\x75\xdd\x4f\xff\x56\x66\xd6\x54\x4f\xb8\
+\x92\x10\x21\x84\x2f\x21\x95\x3a\x5e\x01\xa7\x1c\x05\xe5\xc1\xa9\
+\x4d\x57\xaa\x47\x01\xa2\xc6\xc1\x56\x3e\xa7\x0e\x40\x25\x20\x95\
+\x3f\xb7\x51\x55\x55\xe5\x17\x5c\xff\xf6\xb7\xbf\x25\x12\x89\x10\
+\x89\x44\xd8\xb7\x6f\x9f\x3f\x33\xb2\xa9\xa9\x89\xa9\xa9\xa9\x37\
+\x06\x10\xdb\xb6\x9f\xdb\xbe\x7d\x7b\x18\xa0\xbe\xbe\xfe\x37\xdd\
+\xdd\xdd\xe7\x7d\xec\x63\x1f\xe3\xc9\x27\x9f\x64\x60\x60\xc0\x4f\
+\x61\x2a\x43\xaf\x36\x44\xd7\x75\xb2\xd9\xac\xcf\xf7\xd4\xd4\xd4\
+\xf8\x06\x5f\xc5\x33\x2a\xda\xad\x54\x1b\x2a\xd9\xa3\x00\x3b\x7c\
+\xde\x7c\xa5\x24\x05\x02\x01\x7f\x63\xd5\xa6\x2b\xe6\xf9\x70\x8f\
+\x49\x5d\x4f\x79\x81\x4a\x22\x54\x1b\x9f\xca\x8b\x74\x76\x76\xb2\
+\x7c\xf9\x72\x1e\x7b\xec\x31\x3c\xcf\xa3\xa5\xa5\xe5\xff\xe9\x1b\
+\x3c\x5a\x30\x5e\x15\x40\x0e\xcb\x2e\x8a\xba\xba\x3a\xbe\xfe\xf5\
+\xaf\x2b\xf1\x9e\xaf\xda\x2f\x9f\x3a\xd3\x34\xfd\xaa\x14\xb5\x02\
+\x81\x00\x96\x65\x11\x8d\x46\xfd\xd3\xaf\x3c\x17\x55\x90\x66\xcc\
+\xff\x20\x8b\xda\x74\xb5\xb9\xea\xfd\x95\x9b\x5e\x19\x6c\x2a\x37\
+\xfa\x70\x3b\xa1\x24\x44\x49\x9d\x7a\x4e\xc5\x27\x6a\xf3\x95\x9d\
+\x33\x0c\x83\x70\x38\x8c\xe3\x38\xc4\xe3\x71\x9f\x3c\xcc\x66\xb3\
+\x0f\x0d\x0c\x0c\xfc\x4f\xf3\xf0\x2f\xf5\x46\xaa\xac\xc3\xd4\xd7\
+\x1d\xbf\xf9\xcd\x6f\x1e\x14\x42\xc8\x40\x20\xf0\xc5\xf6\xf6\xf6\
+\xea\x8b\x2f\xbe\x98\x1d\x3b\x76\xf8\x11\xbd\x3a\x89\xea\x34\x3a\
+\x8e\x43\x6d\x6d\xad\x5f\xf7\x1a\x0a\x85\x58\xba\x74\x29\xd3\xd3\
+\xd3\x87\x8c\x99\x2d\x16\x8b\xbe\xc4\xd4\xd6\xd6\x1e\x12\x78\x56\
+\x06\x6b\x95\x12\x52\x59\xf5\xa1\x40\x54\xaf\x53\x00\xab\xc1\x6b\
+\xa6\x69\xfa\x41\x9e\x72\xcf\x55\xb0\x17\x0e\x87\x59\xbd\x7a\x35\
+\xdb\xb6\x6d\xf3\x55\x5b\x5d\x5d\x1d\x85\x42\x21\x93\xcb\xe5\x5e\
+\xd5\x5f\x00\x7d\x55\x01\x99\x99\x99\xf9\x69\x45\x94\xfc\xbf\x63\
+\xb1\x58\xf5\x43\x0f\x3d\xe4\x7b\x2b\x95\xbf\xb0\x73\x98\xc7\x46\
+\x2a\x95\xa2\xaa\xaa\x8a\x33\xcf\x3c\x93\xfd\xfb\xf7\xfb\x9b\x52\
+\x39\xa5\x4e\x01\xe2\xba\x2e\xa9\x54\x0a\x28\xf7\xb0\x28\x6f\x4c\
+\x6d\xb4\x02\xa4\x72\x22\xb5\x02\x24\x9b\xcd\x1e\x32\x1d\x55\x1d\
+\x8c\xea\xea\xea\x43\xae\x57\x5d\x5d\x4d\x43\x43\x03\x73\x73\x73\
+\xa4\xd3\x69\xa2\xd1\x28\xae\xeb\x92\xcb\xe5\x0e\xec\xdd\xbb\xf7\
+\x59\x21\x84\x0c\x06\x83\xbf\x79\xb5\x39\xb6\xd7\xac\x7f\xd9\x75\
+\xdd\xe1\xfe\xfe\xfe\x1c\xe0\x09\x21\x4e\xd0\x75\xdd\xac\xae\xae\
+\xf6\x0d\x7d\xc5\x80\x9a\x43\x0c\x78\x22\x91\xa0\xbe\xbe\x1e\xdb\
+\xb6\x89\xc5\x62\x2c\x5d\xba\x94\xdd\xbb\x77\xfb\xaa\x43\xa9\x1b\
+\x15\x67\x08\x21\xfc\x71\xe0\x6a\x38\x65\x65\x85\x79\x3e\x9f\xf7\
+\xd5\x92\x4a\x03\x54\xb2\xd1\x4a\xdb\x68\x9a\x46\x4d\x4d\x8d\xff\
+\x39\xea\xf5\x81\x40\x00\xd7\x75\x79\xea\xa9\xa7\x30\x0c\x83\x50\
+\x28\xf4\x44\x2a\x95\xba\xfc\xb5\xda\xb7\xd7\x0c\x90\x44\x22\xe1\
+\xcf\xea\xee\xec\xec\x1c\xe8\xec\xec\x5c\xf2\x12\xed\x90\x4f\x3f\
+\x78\x9e\xc7\xc2\x85\x0b\x19\x1c\x1c\x24\x12\x89\xf8\x53\xa6\xfd\
+\xde\xbe\x0a\x1a\x46\xd9\x1d\x65\xaf\x14\x58\x87\x4f\xd6\x56\x91\
+\xb9\xa6\x69\xbe\x87\xa7\x24\xa8\xb3\xb3\x13\xc3\x30\x18\x1c\x1c\
+\xf4\x27\x1f\xcd\x57\xce\xa4\x67\x67\x67\x9f\x13\x42\x78\x96\x65\
+\x6d\x7e\x2d\xd3\x02\xaf\x4b\x87\x7f\x2e\x97\xfb\xfe\xf8\xf8\xf8\
+\x02\xca\x6d\x6e\xef\x0b\x87\xc3\xcb\x8e\xd4\xaf\x3d\x33\x33\x43\
+\x20\x10\xe0\x99\x67\x9e\xf1\x37\xf0\xec\xb3\xcf\x66\xe3\xc6\x8d\
+\x68\x9a\xe6\xf7\xa8\x24\x12\x09\xbf\x92\x52\xd9\x0a\xd3\x34\x0f\
+\x99\xbc\x1d\x0c\x06\x7d\x4f\xaf\xb5\xb5\x95\xd9\xd9\xd9\x72\xea\
+\x35\x1a\x65\xe9\xd2\xa5\x0c\x0f\x0f\x93\xcb\xe5\xd0\x34\x4d\xfd\
+\x57\x0a\x21\x84\xe3\x38\xaa\x23\x6c\xdf\xd0\xd0\xd0\xf9\x2f\x96\
+\xf6\x7d\x4b\x01\x32\x3f\x90\xfe\x0b\x2a\x9f\x7c\xc2\x09\x27\xb4\
+\x2e\x58\xb0\x60\x59\x45\xe4\x2b\xc5\x1f\xe0\x39\x2a\xd5\x98\x8a\
+\x69\x2a\xf3\xf8\xd1\x68\xd4\x1f\x31\x58\x5f\x5f\xcf\xf2\xe5\xcb\
+\xd9\xb3\x67\x0f\x75\x75\x75\xe4\x72\x39\x82\xc1\x20\xb9\x5c\x8e\
+\x13\x4f\x3c\x11\x21\x04\xa9\x54\x8a\x44\x22\x41\x47\x47\x07\xef\
+\x7c\xe7\x3b\xf9\xf5\xaf\x7f\x4d\xa1\x50\xa0\xa1\xa1\x81\xde\xde\
+\x5e\x34\x4d\x63\xff\xfe\xfd\x4a\x8d\x89\xc1\xc1\xc1\x6f\x39\x8e\
+\xb3\x0f\x70\x23\x91\xc8\xc0\xe1\xc5\x10\xaf\xd5\x7a\xdd\x67\xae\
+\x6b\x9a\xb6\x40\xd3\xb4\xc8\xfc\xe3\x0f\x76\x77\x77\x7f\xe5\x48\
+\xf3\x3f\x94\x3e\x57\x76\x27\x10\x08\xf8\x86\xd9\xb2\xca\x3f\xb3\
+\x7a\xd5\x55\x57\x71\xdf\x7d\xf7\x11\x0e\x87\xa9\xad\xad\x65\x7a\
+\x7a\xda\x9f\x3e\xb1\x61\xc3\x06\x7e\xfe\xf3\x9f\x33\x37\x37\x47\
+\x57\x57\x17\xdd\xdd\xdd\x3c\xfe\xf8\xe3\xaa\x3a\xdf\x57\x6d\xea\
+\xf7\x15\x5d\xd7\x25\x93\xc9\x9c\x1b\x8f\xc7\x1f\x7f\xbd\xf7\xe7\
+\x0d\x1d\x82\x1f\x0e\x87\x4f\x6b\x6c\x6c\xbc\x4c\xd7\x75\x07\x20\
+\x1a\x8d\x7e\x2a\x18\x0c\x1e\x71\xae\xaf\x9a\x60\xa7\xd4\xd3\xd8\
+\xd8\x18\xd5\xd5\xd5\x38\x8e\xe3\xe7\x24\x14\xf1\x37\x31\x31\x41\
+\x5d\x5d\x9d\x3f\x73\x38\x16\x8b\xf9\x81\x61\xa1\x50\xf0\x6d\xca\
+\xfc\xe8\xf3\x43\x66\xd1\xbf\x11\xe3\x6c\xdf\xd0\x29\x31\x85\x42\
+\x61\xc7\xc8\xc8\xc8\x8e\x0a\xdd\xec\x45\xa3\xd1\x2a\x29\xa5\xb4\
+\x6d\xbb\xcb\x30\x8c\x3f\x3b\x52\xa3\xbd\xb2\x05\xca\x63\x2a\x16\
+\x8b\x7e\x90\xa9\x62\x09\xf5\x6b\x9c\xd9\x6c\x16\xcf\xf3\x76\x4b\
+\x29\x75\xd7\x75\xdd\x64\x32\xf9\xf7\xe3\xe3\xe3\x3f\x79\xb1\xcf\
+\x7e\x23\xc6\xd9\xbe\xa1\x12\x72\x24\xed\x06\xf8\x9c\x7e\x2c\x16\
+\xbb\x5a\xd3\xb4\xd8\x8b\x81\xa2\x96\x69\x9a\x3e\x95\x21\x84\x28\
+\x00\x7b\x8b\xc5\x62\x56\x4a\x29\x63\xb1\x58\x66\x76\x76\x76\xfb\
+\x61\x69\xdd\x63\x79\x04\xc8\xf1\x75\x7c\x1d\x5f\xc7\xd7\xf1\x75\
+\x7c\x1d\x5f\xc7\xd7\xf1\x05\xc0\xff\x05\xf4\xe6\xb0\x9e\xc6\x6e\
+\xd0\xb8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x3a\x79\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x64\x00\x00\x00\x64\x08\x06\x00\x00\x00\x70\xe2\x95\x54\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
+\x95\x2b\x0e\x1b\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x03\
+\x0e\x1c\x1e\xba\x16\x7f\x4d\x00\x00\x20\x00\x49\x44\x41\x54\x78\
+\xda\xed\xbd\x79\x9c\x5c\x55\x99\xff\xff\x3e\x77\xa9\x5b\xd5\xd5\
+\xdd\xd5\xdd\xe9\x2d\x49\x77\xd2\x21\x1b\x09\x59\x00\x59\x02\x81\
+\x08\x88\x40\x40\x10\x46\x5c\x66\x1c\xc1\x19\x01\xf9\x02\x83\xdf\
+\x41\xe7\x0b\xe3\x38\x83\xc8\x57\x04\x74\x5c\x58\x64\x40\x51\x91\
+\x4d\x04\xd9\x05\x21\x04\x08\x09\xd9\x43\x3a\x0b\x4d\xd6\x4e\xa7\
+\xf7\xa5\xba\xf6\xed\xae\xe7\xf7\xc7\xed\xba\x49\x00\x35\x60\xc0\
+\xef\xcc\x8f\xf3\x7a\xd5\xab\xb7\xea\x53\xf7\x9e\xe7\x9c\x67\xf9\
+\x3c\x9f\xe7\xb9\xf0\xd1\xf8\x68\x7c\x34\x3e\x1a\x1f\x8d\x8f\xc6\
+\x47\xe3\xa3\xf1\xd1\xf8\x68\xfc\x8f\x1f\xe2\x7f\xf2\xcd\x9d\x74\
+\xd2\x49\x3b\xa7\x4c\x99\x32\x51\x4a\x89\x00\xa4\xad\x20\x25\xa0\
+\x48\x50\x24\x42\xbc\x73\x05\x4a\xa5\x52\x78\xc9\x92\x25\x5f\x4c\
+\xa7\xd3\x0f\xff\x35\xae\x59\xfb\x20\x26\xad\xaf\xaf\x5f\x94\xcf\
+\xe7\x27\x1d\xf4\xae\x10\x02\xcf\xf3\xa8\xa9\xa9\x79\x6e\x70\x70\
+\x30\x71\xa8\xae\x43\x55\xd5\xea\x42\xa1\x10\x01\xd8\x63\x0f\x32\
+\xf3\x73\x05\x2a\xa3\x3a\x4e\x4a\xc3\x4b\x87\xf0\x72\xfe\xf7\x6e\
+\x4a\xc3\x4d\x86\x00\xf0\x3c\x0f\x29\xa5\xf6\xd7\xda\x44\x1f\xc8\
+\x07\xd7\xd5\xd5\xdd\xf5\xd9\xcf\x7e\x76\x36\x80\x27\x3d\xdc\x0a\
+\x8b\xb0\xa1\x20\xad\xb1\x97\xad\x80\x1c\xdb\x9d\x63\x3b\xd4\x30\
+\x0c\x1e\x7f\xfc\xf1\x63\x81\x43\x26\x10\x29\xa5\xb4\x2c\x0b\x01\
+\x8c\xb8\x29\x3e\x16\xa9\x24\x24\xab\x38\xf6\x88\x05\x6c\x1f\x5d\
+\x4f\x22\x93\xa4\xae\x2a\x42\x6e\xd8\x66\xf8\x77\x75\x07\x6c\x90\
+\xff\x51\x02\xb1\x6d\xdb\x18\x1a\x1a\x02\x60\x67\xbe\x9f\x85\x57\
+\x81\xed\xed\xbf\x50\x60\x0f\x86\x28\xee\x8c\x62\xee\x8e\x80\x90\
+\x54\x55\x55\x81\x2f\xa6\x43\x36\x5c\xd7\xc5\xb2\x2c\x90\x20\x74\
+\xf0\x84\xc3\x45\x33\xbe\xcf\x73\x3d\xb7\x71\xeb\x99\xbf\xe7\x47\
+\x4f\xfe\x90\x89\xad\x1e\x4b\x06\x9e\xf1\xdf\x37\x26\x8c\xbf\xa6\
+\x40\x94\x0f\x68\x5e\xcf\x34\x4d\x4c\xd3\xc4\x76\x5d\x74\x5d\x21\
+\x37\x50\xc5\xb7\x3f\xfe\x5b\xce\x9e\x71\x31\x8a\x13\x61\xdc\xe4\
+\x0a\x42\x93\xf3\x98\x25\x0b\xcb\xb2\x30\x4d\xf3\xa0\x17\xa2\xa5\
+\xa5\xe5\xe0\x2e\xc2\xf3\xa4\x65\x59\xd8\xb6\x8d\x87\x24\x95\x31\
+\x39\xfa\xf0\x23\xe9\x48\xaf\x40\x11\x0a\x9f\x38\xfa\x93\x54\x55\
+\xc5\x50\x42\x12\xc7\x71\x30\x4d\x13\xc7\x71\xfe\xaa\x76\x4f\x7b\
+\x1f\xea\xe8\xc2\x63\x8e\x39\xe6\x5f\x1c\xc7\xf1\x24\x12\x55\xaa\
+\xb8\xb6\xf4\x45\xab\x48\x34\x5d\x75\x3b\x3b\x3b\x5b\x4d\xd3\xf4\
+\x77\xa9\xe7\x62\x96\x14\xfe\xed\xcc\x3b\xf8\xe9\xfa\x6b\x38\xab\
+\xf9\x1b\x4c\x51\xe2\x9c\x34\xeb\x28\xee\xde\x7e\xab\x2f\x08\x55\
+\x12\x0a\x85\x90\xf2\xe0\x0e\x48\x6f\x6f\x2f\x6d\x6d\x6d\xab\x1a\
+\x1b\x1b\x29\x1b\x6c\x3c\x05\x89\x24\x95\x4e\xd6\x4d\x39\x6c\xca\
+\x0c\x45\x51\x40\x08\xa4\x2b\x11\x86\xcb\xdc\xfc\x14\x72\xbf\x84\
+\xd3\x7e\xf6\x71\x2a\x42\xd3\x39\xf9\x8e\x93\xd1\x55\x0d\x81\x46\
+\x28\x54\xc3\xce\x9d\x5b\x68\x6d\x6d\x45\x4a\x89\xeb\xba\x53\x43\
+\xa1\xd0\x82\xf7\xb2\x2e\x15\x15\x15\x54\x57\x57\xaf\xe9\xee\xee\
+\x96\x1f\xaa\x40\x2c\xcb\x9a\x7b\xd8\x61\x87\x1d\x97\x48\xf8\xaa\
+\xbe\xaf\xae\x8b\xd9\x0b\x75\xac\x81\x08\xce\x48\x18\x91\x8b\xd0\
+\xdd\xa3\x62\xdb\xb6\xbf\x4b\x85\x87\x6b\x4b\x66\xb5\xcd\x40\xd9\
+\x03\x45\x3b\x4b\xb6\x98\xe3\xa5\xdd\x0f\xe0\x79\xbe\x4a\x11\xaa\
+\x0c\xde\x7f\x90\x23\x5c\x5f\x5f\xbf\x60\xda\xb4\x69\x78\x9e\x47\
+\x51\x9a\x68\x87\xa7\xa8\x0c\x87\xe8\x5c\xe1\x31\xae\xba\x1e\xcb\
+\x32\xd1\x84\xca\xf6\xf1\x5b\x39\xe1\xec\x4a\x5c\xd7\xc3\x1e\xd1\
+\x71\x07\xa3\x58\xc3\x50\x93\x19\x87\x9d\x52\x28\x16\x4a\xa8\xaa\
+\x40\xd3\x34\x72\xb9\x1c\xae\xeb\xca\x93\x4e\x3a\xe9\xfa\xda\xda\
+\xda\xeb\x01\x1c\xe9\xa2\x57\x79\xe0\x28\x60\x8f\xd9\xbf\xc0\xf6\
+\xc9\x40\xcd\xed\xde\xbd\x9b\xb5\x6b\xd7\x46\x80\xd2\x87\x6e\x43\
+\x4a\xa5\x12\xa6\x69\x92\x73\x4b\x44\x8e\x2d\xa2\x56\x2b\x44\xaa\
+\x73\x30\x33\x87\x66\x08\xc4\x5a\x27\xd0\xc9\x9e\xe6\xa1\xaa\x2a\
+\xa9\x5c\x1a\x45\x51\x51\x15\x1d\xdb\x33\xa9\xd2\x2b\xf1\x24\x58\
+\xa6\x89\xd0\x08\xde\x7f\xb0\x8e\x99\xe7\x79\x94\x4a\x25\xf0\x24\
+\x9d\x7a\x37\x0b\x8f\xd6\x81\x22\x46\x3c\x83\xbd\xc7\xc2\xb2\x2d\
+\x3c\x54\x8c\x98\xc4\x35\x05\xf5\xea\x6c\x1a\x67\xd6\xd0\x51\xb3\
+\x8a\x8a\xd9\x2a\x20\xd8\xf4\x23\x9b\xa9\x2d\x87\x53\x55\x55\x45\
+\x6b\x6b\x2b\x00\x83\x83\x83\xa2\xac\x42\x55\x14\x76\x36\x6e\x63\
+\xc1\xd9\x51\xbc\x31\x1b\xe8\x59\x02\x7b\xd0\xc0\xea\x89\x60\x76\
+\x85\xc1\xf5\xb5\xbe\xae\xeb\x78\x9e\xf7\xe1\xdb\x10\x21\x04\x96\
+\xe5\xeb\x7d\xc7\x71\x50\x55\x05\x37\x5d\xcf\x4d\xa7\x3f\xc3\x95\
+\x47\xfd\x17\x7a\xb1\x85\xd6\xd8\xd4\xe0\x3d\x9e\xe7\x11\x8d\x86\
+\xb8\xe5\xf1\xef\xf2\x37\xd3\xaf\x61\x7c\x53\x2d\x49\xaf\x93\x73\
+\x66\x5c\x82\x22\xf7\xcd\xf5\x1e\x4f\x08\x52\xca\x31\xdb\x63\x21\
+\x3d\xdf\x65\x3b\xa7\xf5\x1b\x2c\x9e\xf6\x0f\x98\xb6\x3f\xa7\x65\
+\x9a\xa8\xaa\x82\x9a\x6f\xe2\xfa\xb3\xfe\x0b\x37\x3e\x81\x93\x9b\
+\xbe\xcc\x37\x4f\x7a\x88\x90\x6a\x50\x32\x4b\x64\x32\x19\x86\x86\
+\x86\x18\x1a\x1a\x62\x53\xec\x75\xe4\xc2\x1d\x38\xa6\x87\x69\x9a\
+\x58\xa6\x85\xa2\x4b\x1c\xc7\x65\x6e\xf4\x5c\xbe\x76\xe2\x8f\x89\
+\x44\x42\xd4\xb4\x54\x52\x7d\x52\x12\xcf\xf0\x37\x66\xf9\x3e\xff\
+\x6a\x46\xbd\xbc\x83\x2c\xcb\x42\x08\x98\xa0\x1e\xc5\x8a\x9e\x27\
+\xf9\xed\xf2\xdf\xf0\xa5\x23\xbf\x89\xeb\x3a\xa4\xd3\x69\x52\xa9\
+\x14\xf9\x42\x1e\xc7\xb3\x49\xd6\x2e\x63\xeb\xee\xdd\xf4\xe4\x36\
+\x43\x6d\x3f\x3f\x5a\x7b\x39\xe9\x64\x8e\x54\x3a\x4d\x3a\x9d\x26\
+\x93\xc9\x20\x84\xf8\xb3\xc7\x64\xfc\xf8\xf1\x41\xbc\xe0\x0b\xd2\
+\x02\x21\xd1\xc3\x1a\x9f\x9c\x73\x3e\xab\x07\x9f\x41\x7a\xbe\x0a\
+\xb4\x6c\x1b\x3d\xac\x23\xac\x18\xbd\xc5\x1d\xb4\xf7\xaf\xe0\xb0\
+\xfa\x79\x34\xd5\x34\xa1\x0a\x1d\xd7\x75\x71\x1c\x27\xd8\x14\x91\
+\x2a\x81\xaa\x8a\xe0\xf7\xb6\x6d\x23\x74\x41\x85\xde\xc0\x95\x9f\
+\xf8\x26\x3f\x7c\xf6\x07\x5c\x7a\xec\xad\x5c\xb3\xe8\x1e\xda\x1a\
+\x67\xe0\xb8\x0e\x8e\xe3\xbf\x3c\xcf\x43\x51\x94\x0f\xdf\xa8\x97\
+\x4f\x88\x6d\xdb\x38\xd8\x08\xa1\x10\xd6\x23\xb8\x9e\x8d\x2b\x5d\
+\x92\xc5\x61\x14\x45\x0b\xbc\x15\xd7\x71\x91\x8a\x87\x6b\x49\x9e\
+\xeb\xba\x85\xd2\x56\x97\xe2\x80\x20\xdf\xa5\x31\xb4\xb1\x88\x11\
+\xd1\x41\x82\x65\xda\x54\x46\xab\x6e\x9e\x3b\x67\xee\xe8\x1f\xc3\
+\x0f\x52\xa9\xd4\xeb\x3d\x3d\x3d\x77\x97\x05\x32\x38\x38\xe8\x7b\
+\x66\xa3\x2e\xab\x6f\xca\x70\xfe\x0f\xcf\x63\x30\x91\x43\x9a\x05\
+\x24\x1e\x02\x81\x7c\xda\x65\xad\xda\xc1\xe5\x8f\x5c\xc3\x68\x36\
+\xc1\xe5\x77\x5f\xc1\x9a\x37\x5e\xc3\x74\x8b\xbe\x5d\xd9\xef\x64\
+\x6a\x86\xc2\xf6\x9f\xbb\x54\xc7\x72\x60\xfa\x66\x42\x5f\x51\xc5\
+\xea\x57\x93\xcc\xbd\x76\x1e\xd5\x91\x18\x5f\xfa\xd1\x57\x71\xa5\
+\x8b\xa1\x46\xd0\x23\x1a\x42\xf8\x1b\x54\x55\xd5\x43\xe2\x2e\x6b\
+\xef\xf7\x84\x58\x96\x85\x2d\x1c\x34\x45\x63\x30\xbf\x97\x33\x62\
+\x0b\xe8\x89\x99\x24\x0a\x7e\xfc\xa1\x69\xfe\xd4\x75\x05\x95\xa5\
+\xd7\x8d\x62\x67\x64\x10\x04\xda\xb6\xcd\xa2\x45\x8b\x68\x98\x6d\
+\xa2\x0a\x85\x4e\x6d\x2f\x47\x2c\xd2\xb1\xfb\x2a\xce\xb6\x07\x22\
+\xc8\x74\xe8\x5d\x41\x9d\x2d\x5b\xb6\x00\xdc\x5d\x56\x59\x93\x27\
+\x4f\x26\x12\x89\x20\x84\xa0\xcf\x19\xa1\xee\xfc\x21\x26\xca\x2a\
+\x9c\xfe\x0a\xac\xde\x0a\xdc\x78\x08\xe4\xbe\x89\x6a\xaa\xc6\xb1\
+\x77\xef\x5e\x22\x54\x51\x1b\x6e\xc4\x73\x07\x71\x1c\x27\xf0\xee\
+\xd4\x9c\x47\x7d\x63\x3d\xe3\xea\xc6\xa1\x28\x0a\x3b\x0b\xfd\xcc\
+\xfc\x5c\x91\x58\x4c\xc7\x4d\xc7\xb0\x7a\x23\x38\x83\x35\x58\xfd\
+\x61\x14\x45\x04\xaa\x13\xa0\xbb\xbb\xfb\xaf\x2b\x90\x52\xa9\x84\
+\xad\x49\xa4\x0c\x63\xd7\x6c\x27\x31\xec\x70\xd2\xc7\x8e\xe4\x57\
+\x9b\x6e\xa0\x2f\xd9\xc7\x59\x67\x9d\xc5\xa5\x97\x5e\xca\xf2\xe5\
+\xcb\x69\x6f\x6f\x67\x68\x68\x08\xd7\x75\x71\x5d\x97\x81\x81\x01\
+\xca\x71\x4a\xca\x29\x10\x3d\x39\x4b\xa8\x39\x8a\xd7\x90\x44\x3b\
+\x4a\x10\x12\x15\x38\x25\x0f\x55\x68\x0c\x3d\xd0\xe8\x63\x4f\xfb\
+\xdd\x7c\xf9\xfb\x72\xec\xa0\x08\x85\x2d\xd6\x1e\xe6\xd5\x36\x53\
+\xb2\x0a\xd4\xcc\x0b\x51\x98\xdd\x0b\x48\x84\x13\x22\xbd\xaa\x9a\
+\xe2\x8e\x30\x00\x21\x11\xe6\xba\x57\xcf\x23\x5b\xca\x60\xd9\x56\
+\xa0\x72\x00\x2a\x84\x82\x3b\x36\xa7\x10\x82\xbe\xd2\x28\x27\x37\
+\xd6\x51\x2c\xba\x1c\x39\xe3\x38\xb6\xd6\xac\x40\xce\x75\x11\xa8\
+\xe4\x36\x45\xc9\xac\xa9\x02\x21\x51\x14\x05\xcf\xf3\x3e\x78\x81\
+\x8c\x1f\x3f\x9e\x81\x81\x81\x03\x8d\x8e\xa2\x38\xc9\x64\x92\x54\
+\x2a\x85\xad\x79\x94\xac\x18\x8e\x90\xdc\xf5\xc6\xd7\xf9\xc6\x19\
+\x37\x23\xc3\x26\x96\x5b\xe0\xfa\xeb\xaf\x67\xd9\xb2\x65\x7c\xfe\
+\xf3\x9f\x47\xd7\x75\x22\x91\x08\x3b\x76\xec\xa0\xb2\xb2\x92\xf6\
+\xf6\x76\x5f\xa0\xb6\x8d\xed\xda\x18\x9a\x4a\x6a\x48\xe5\x07\x17\
+\x3e\xcd\x60\x7a\x80\xfb\x36\x5d\xcf\xe2\x79\x7f\xc3\xf3\x5d\xf7\
+\x8e\xb9\xc5\xbc\x43\x20\x65\xe1\x5a\x96\x85\x22\x04\x8a\xa2\x60\
+\xd9\x36\x5f\x3d\xfc\x67\x64\x44\x17\x9a\xe1\x91\x1c\x75\x58\x91\
+\xf8\x39\x49\x7c\x7b\x20\xa5\xc4\x93\x1e\xdd\xdb\x06\x48\xec\xb4\
+\xc9\xc6\x4b\x38\xd5\xfb\x3c\xc2\xa8\x50\x02\x35\x26\x84\x00\x01\
+\x25\xd3\xe4\x82\xe6\xef\x31\xaa\xb7\x73\xcd\x82\x7b\x78\x65\xf3\
+\xcb\x64\x22\x1d\xb4\xb3\x0b\xdb\xb6\x90\x48\x34\x4d\xc3\xb6\x6d\
+\x54\x55\x7d\xcf\xce\xc9\x7b\x12\xc8\xc0\xc0\x00\x6d\x6d\x6d\xff\
+\xbb\xba\xba\xfa\x68\x3f\x00\x13\x8c\x26\x46\xe7\xab\xaa\x8a\xa2\
+\x28\xe8\x52\xc1\xc9\x48\x72\x03\x2e\x76\x9f\xe0\xeb\xff\xf2\xcf\
+\xa4\x77\x49\x4a\xa3\x82\xaf\x7c\xe5\x2b\x7c\xfb\xdb\xdf\xe6\x57\
+\xbf\xfa\x15\xdb\xb7\x6f\x47\x4a\x49\x22\x91\x20\x16\x8b\xd1\xd9\
+\xd9\x49\x7d\x7d\xbd\x1f\x19\x4b\x1b\x01\x1c\x1e\x5e\xcc\x9a\xc1\
+\xa7\xd9\xd3\x35\xca\x39\xe3\xff\x0f\x0b\x0f\x3b\x96\x35\x43\xcf\
+\xb2\xd3\x2c\xbd\xab\x40\xca\x27\xc4\x71\x1c\x14\x04\x4a\xa5\xa0\
+\x73\x67\x96\x23\xcf\x9b\xcd\x65\xbf\xbd\x9c\xfb\xfe\x76\x1d\xc3\
+\x75\x23\x78\x03\x23\x3c\xe4\xfc\x0e\xd3\x1c\xfb\x7f\xcd\x63\xe5\
+\x77\x53\xa8\xba\x40\x11\x0a\xc5\x62\x91\x62\xb1\x08\x40\x95\x1b\
+\xc2\x75\x55\xff\xd4\x29\x0a\x42\x48\x46\x86\x4a\x9c\xfd\xe9\x4f\
+\x72\xe5\xd3\x37\x70\xe6\xd4\x8b\x99\xde\x30\x8f\x94\x6e\xb0\xc1\
+\xdd\x8e\x69\xfa\x0e\x85\x94\xfe\xeb\x43\x31\xea\xe3\xc6\x8d\xfb\
+\xc2\xb4\x69\xd3\x8e\x07\x70\xa5\xc7\xfa\x3d\x6f\xa0\x0a\x95\x89\
+\x13\x27\x62\xdb\x36\xe9\x67\x2d\x52\xd2\x43\x4a\x81\x94\x61\x34\
+\x40\xd3\x2d\xfa\xfa\xfa\xb8\xf4\xd2\x4b\xdf\x75\xce\x5c\x2e\x47\
+\x2c\x16\xf3\x5d\x67\xe1\x20\x84\x42\xa5\x51\x83\xe5\x16\x71\x3d\
+\x97\xba\x86\x10\x5d\xa9\xad\x64\xac\x04\x96\xa5\xa1\x68\xe2\x1d\
+\x02\x51\x14\x25\x38\x25\x02\x81\xa2\xa8\xb8\x2e\x68\xaa\x8a\x10\
+\xfe\xc2\x38\x8e\xc3\xea\x9e\xdf\xe3\xb9\x2e\x96\xe5\x05\xae\xf2\
+\x9c\xf9\xb3\xe9\xe8\xe8\x20\x16\x8b\x05\xaa\x13\xc0\xf1\x94\x7d\
+\xa7\x4e\x51\xc0\xd8\x87\x7e\x0a\x45\x41\x08\x41\xb6\x94\x65\xc3\
+\xc8\x92\x60\x2e\xc4\xbe\xe0\xf0\x60\x91\x86\xbf\x48\x20\x9e\xe7\
+\x09\xd3\x34\x91\x52\xf2\x96\xd9\x4b\xed\x14\x97\xe3\x9a\x8e\xe7\
+\x9c\x73\xce\xe6\xe4\x93\x4f\xe6\xa7\x3f\xfd\x29\x5b\xb7\x6e\x65\
+\xfe\xfc\xf9\xac\x5c\xb9\x92\x99\x33\x67\xb2\x66\xcd\x1a\xe2\xf1\
+\x38\xe1\x70\x98\x7c\x3e\x1f\xec\x9c\x8c\x52\x62\xfc\x1c\x85\xfa\
+\xc4\x54\x8a\xd9\x9c\xef\x18\x28\x0e\x8a\xa2\x32\x9c\xeb\x61\x7e\
+\x74\x2e\x03\xc2\x64\xb4\xd0\xcf\x84\xc8\x44\x84\x14\x58\xa6\x85\
+\x70\xdf\x79\x42\xf6\x07\x0f\x05\x02\x01\x34\x35\x45\xc8\x65\x1c\
+\xa4\xeb\xab\x26\x17\x9b\xb0\x52\x85\xeb\x66\x30\x4d\xb7\x0c\x8b\
+\x80\x84\x49\x93\x26\xa1\x69\x1a\xae\xeb\x06\xf3\x2a\x1b\x24\x39\
+\x27\x03\x58\xbe\xca\x0a\x43\x7d\x7d\x84\xcd\x3b\x77\x20\x2d\x1d\
+\x45\x51\x48\x17\xe3\x1c\x56\x7d\x34\x3b\xdc\x17\xb0\x2c\x5f\x65\
+\x95\x6d\xc7\x87\x22\x10\x29\xe5\x3e\xfd\xeb\xf9\xae\xa4\x10\x82\
+\x9a\x9a\x1a\x22\x91\x48\xe0\x7f\x87\x42\x21\x8e\x3a\xea\x28\xf6\
+\xee\xdd\xcb\xd1\x47\x1f\xcd\xba\x75\xeb\x30\x0c\x83\x9a\x9a\x1a\
+\xd2\xe9\x34\x42\x08\x52\x86\xc7\xb4\x4f\x45\x08\xaf\x9e\xc6\x96\
+\xd5\xeb\x7c\xf0\x51\xf7\x50\x44\x98\x41\x63\x39\x13\xf5\x8b\x68\
+\x9a\x3f\x9d\x7b\xd6\xff\x1b\xe7\x86\xfe\x91\xaa\x70\x2d\x25\xab\
+\x0f\xe5\x5d\x04\x22\x84\x1f\x2f\x94\x4a\x25\x94\x31\x2c\x63\xc2\
+\xc4\x6a\x7e\xf2\xca\xb7\xb8\xeb\xc2\x65\xdc\xf4\xda\xc5\x48\x33\
+\x42\x63\x4d\x33\xb6\xd3\x45\xa9\x64\xf9\xaa\xc5\x15\x8c\x3f\x5d\
+\x62\x0e\x55\xe1\x66\x75\x9c\xa4\x06\xb6\x82\x50\xfd\x13\x35\xe2\
+\x24\x82\x13\xe2\x54\xba\x54\x55\x86\xb9\x73\xdd\xff\xe6\xa7\x9f\
+\x5b\xca\x7f\x6d\xb8\x86\x1d\x99\x0e\x5a\xf4\x56\x6c\xd7\x22\x9f\
+\x2f\x80\xf0\x05\xa2\x28\xca\x87\x76\x42\x28\x9f\x10\x4f\x78\x28\
+\x42\xa1\xbd\xbd\x9d\xd1\xd1\x38\xc3\xc3\xc3\x14\x0a\x05\x00\x3a\
+\x3a\x3a\x02\x5d\xea\xba\x6e\xb0\x6b\x4a\xa5\x12\x86\x61\xf8\x49\
+\x28\xdd\xa3\xc2\x30\xd8\x34\xf4\x3a\x89\x44\x8e\x62\xb1\x88\x19\
+\x92\x14\xad\x18\x46\x34\xc2\xb5\xbf\xbb\x98\xbb\xbf\xf2\x5b\x32\
+\xde\x20\x8f\x75\xfc\x88\x52\xca\x63\x74\x64\x14\xcd\x50\xca\x6a\
+\xca\xdb\x5f\x20\xc5\x62\x91\x54\x2a\x85\x40\x50\x30\x25\x25\xcb\
+\xa4\xcb\x7b\x85\x5f\x2f\xbf\x87\x86\xda\x09\xac\x8b\x2f\xc5\x4b\
+\x08\xba\x37\x26\xc9\xa7\x7d\xf7\x56\xc3\xa0\x75\x41\x05\xfd\xf1\
+\xbd\xfe\x42\x86\x24\x89\x57\x63\x14\x3b\xa2\x41\x90\x58\x2c\x16\
+\xfd\xf9\xab\x3c\x2c\xd7\x82\xaa\x38\x5f\xfb\xed\xe7\x39\x72\xc6\
+\x0c\x52\xb9\x61\x92\xf1\x38\x3b\x96\x24\xc9\xe7\xfd\x39\x85\x10\
+\x18\x86\xf1\xe1\xa0\xbd\xe5\x88\x18\x40\xea\x12\x90\xd4\x8f\x1b\
+\x47\x3c\x1e\x47\x51\x14\x2a\x2b\x2b\xff\x64\x10\xd9\xdf\xdf\x4f\
+\x32\x99\x44\x51\x14\x72\xc2\xa1\x64\x57\x10\xad\xcf\x93\x56\x55\
+\x54\x55\x45\x43\x82\x10\x08\x45\x50\x69\x48\x2e\xfa\xe6\xa7\x19\
+\xed\xb0\x49\xed\x2e\x20\x14\x81\x51\xa1\x07\xf3\x19\x86\x71\xf1\
+\x84\x09\x13\xf6\xf4\xf7\xf7\xdf\x2a\x84\x40\x1d\x9b\x43\x11\x0a\
+\x46\xc1\x45\xba\x92\x64\x07\x3c\xbc\xfd\x1e\x86\x37\x5b\x98\x69\
+\x17\x31\x16\x2f\x68\x9a\xe6\x67\x03\x3d\x97\xd3\x26\xfc\x23\x62\
+\xa2\x43\x7a\x58\xf0\x4a\xf2\x36\x46\x6c\x5f\xf5\xb9\xae\x8b\xa2\
+\x28\x68\x9a\x86\xa2\x28\x44\xd3\x2e\xe9\x5e\x87\xfe\x0d\x26\x89\
+\x1d\x9b\x78\x7e\xef\xfa\xfd\x5c\x5b\x81\xae\xeb\x48\x29\x83\xa0\
+\xf0\x50\x9c\x10\xf5\xcf\xbd\xa1\xa1\xa1\xe1\x52\x55\x55\x27\xba\
+\xae\x4b\x56\xb5\x98\xff\xe9\x28\x67\x1c\xfd\x0f\x94\x66\x6c\xe2\
+\xb2\xcf\x5c\x87\xd1\xa2\x30\xfe\x38\x41\x32\xba\x87\xee\x35\x19\
+\xf2\x85\x3c\x85\x42\x81\x81\x81\x01\x2b\x9b\xcd\x5a\xb6\x6d\xab\
+\x8e\xe3\x08\x29\x25\xc5\x88\xc7\xec\x8f\x57\x92\xed\xb5\x29\xec\
+\xd1\x88\x44\x22\x18\x42\xa3\xd8\x01\x5d\x2f\x9a\x0c\xac\xb4\xc9\
+\x74\x4a\x9c\xac\x8f\xbe\xaa\xaa\x5a\x4e\xc5\x22\x84\x60\xe2\xc4\
+\x89\x24\x12\x89\x64\x38\x1c\x56\x33\x99\xcc\xce\x58\x2c\x76\x7c\
+\xb1\x58\x54\x9a\x9b\x9b\x09\x25\x25\x7b\x5f\xb2\x19\xdd\xec\x52\
+\xe8\x07\x5c\x05\x4d\x53\xc7\xbc\x25\x7f\x3e\x21\x04\x9a\x30\xc8\
+\x1f\xdd\xce\xff\x3a\xf6\x7b\x44\x8d\x2a\x06\x0a\xbb\xd9\xbd\xb9\
+\x97\x5c\x9f\x87\xe3\x38\x14\x0a\x05\xc6\x8f\x1f\xcf\x55\x57\x5d\
+\x45\xba\x6f\x84\xe4\x46\x0d\x67\x28\x44\xc8\xad\x20\x52\x11\xa1\
+\xa2\xa2\x02\x45\x51\x08\x87\xc3\x01\xa0\x68\x18\x06\xf1\x78\xfc\
+\x51\x55\x55\x1f\x2b\x14\x0a\xde\x07\x2e\x10\x60\xa2\xe7\x79\xe4\
+\x0d\x87\x39\xa7\x56\x93\x74\x07\xb9\xee\x9c\x3b\x18\x12\x6f\xb1\
+\x31\xf5\x02\x0b\xe7\x9c\xca\x9e\xc4\x56\x06\xd6\xfa\xd8\x96\xa2\
+\x28\x4c\x9f\x32\x53\x9d\x75\xf8\x6c\x3d\x91\x4a\x88\x52\xa9\x44\
+\xa9\x54\xa2\xca\x32\xc8\x74\xb9\xf4\xaf\xcb\x33\x67\xd6\x3c\x6e\
+\xbd\xf5\x56\xae\xb8\xe2\x0a\xf6\xee\xe9\x26\x16\x8b\xb1\x60\xc1\
+\xf1\x84\x42\x21\xe6\xcc\x99\xc3\xcc\x99\x33\x31\x4d\x93\x29\x53\
+\xa6\x30\x69\xd2\x24\xe2\xf1\x38\x91\x48\x84\xda\x58\xdd\x2c\x4f\
+\xba\x17\xcc\x99\x33\x67\x61\x32\x99\x54\xee\xbe\xfb\x6e\x2e\xbf\
+\xfc\x72\x6a\x6a\x6b\xd1\x43\x3a\xf3\xe6\xcf\xa3\xb2\xaa\x92\xb9\
+\x73\xe7\x00\x30\x6f\xde\x3c\xa6\x4d\x9b\x86\x94\x92\x48\x24\x42\
+\x3e\x5b\x64\xea\xe2\x6a\xce\x9e\x71\x31\xd9\x42\x8e\xe7\x3a\xef\
+\x22\xb1\xdd\x09\x04\x52\x2c\x16\x79\xf9\xe5\x97\x91\x52\x72\xd2\
+\xc9\x27\x91\x2f\xe4\x99\x35\x7b\x16\x55\x55\x55\xcc\x9b\x37\x0f\
+\x80\x73\xce\x39\x87\xe9\xd3\xa7\x07\x73\x16\x8b\x45\xb6\x6d\xdb\
+\x36\xe7\x2f\x15\xc6\x41\x81\x8b\x8e\xe3\x30\x3a\x3a\xca\xe8\xe8\
+\x28\xe9\x4c\x86\xa2\x55\xa4\x10\xd9\xc5\xf7\x9f\xfa\x2e\x9a\xae\
+\x90\x55\xba\x79\xea\xad\xbb\xe9\xeb\x48\x92\x4c\x26\x48\x24\x12\
+\xa4\x53\x19\xd4\xd3\x76\x23\x3e\xbe\x1d\x19\x29\x71\xc2\x09\x27\
+\xb0\x7e\xfd\x7a\x3e\x76\xcc\xd1\xc4\xec\xf1\x54\x68\xd5\x4c\x99\
+\x32\x85\x64\x32\x49\x73\x73\x33\xe3\xc7\x8f\xa7\xb6\xb6\x96\xa9\
+\x53\xa7\x32\x7d\xfa\x74\x14\x45\x61\xf2\xe4\xc9\x68\x9a\x46\x38\
+\x1c\xa6\xb1\xb1\x31\xd8\x8d\xea\xcc\x38\x42\x11\x54\x54\x54\xe0\
+\x79\x1e\x8d\x8d\x8d\xc4\xe3\x71\x26\x4d\x9a\x84\xeb\xba\x4c\x98\
+\x30\x81\x86\x86\x06\x66\xce\x9c\x19\xc0\x34\x75\x75\x75\x9c\x7e\
+\xfa\xe9\x14\x0a\x05\x54\x45\xa1\x52\xaf\xc5\x76\x4d\x2c\xcf\xa4\
+\xda\x68\x08\xbc\xb5\xb2\xda\xea\xea\xea\xc2\x75\x5d\x86\x87\x87\
+\xf1\x3c\x8f\xda\xda\x5a\xf2\xf9\x3c\x9a\xa6\x91\x4c\x26\xe9\xeb\
+\xeb\xc3\x71\x1c\x9a\x9b\x9b\x29\x95\x4a\xc1\x49\xfe\x50\x68\x40\
+\x33\x67\xce\x5c\x63\x9a\xe6\x71\x8a\xa2\x90\xaa\x74\xf8\xd4\x37\
+\x1b\x31\x0c\x41\x6a\xb7\xc3\xf0\x16\x93\xf8\x5b\x16\xf9\x61\xf7\
+\x00\x6c\x47\x55\x35\xce\xb9\xe2\x54\xf4\x79\x7b\x78\xf1\x3b\x7b\
+\xf8\xc9\x0d\x3f\x23\x9d\x4e\x73\xef\xbd\xf7\x52\x53\x53\x43\x67\
+\x67\x27\xae\xeb\x72\xec\xb1\xc7\x92\x4c\x26\xe9\xef\xef\x0f\x9c\
+\x01\xcf\xf3\xde\xf1\x2a\xbb\xa6\x95\x95\x95\x0c\x65\x7a\x50\x4c\
+\x83\x19\x33\x66\x32\x3c\x3c\x4c\x65\x65\x25\x0b\x16\x2c\x60\xcd\
+\x9a\x35\x7f\xf6\xff\x1d\xc7\x21\x97\xcb\xb1\x6b\xd7\x2e\xae\x7f\
+\xf9\x73\x14\xf3\x50\x5d\xa3\xb1\xf2\x81\xdd\x0c\xac\xdd\x67\x43\
+\xde\x4b\x5e\xbd\x7c\x4a\x56\xad\x5a\x25\x3e\x14\xa3\x5e\x1e\xcd\
+\xcd\xcd\x18\x89\x24\x1b\x6f\x2e\xe2\x94\xe4\x18\x6b\x44\x22\xd1\
+\x30\x0c\x35\xb8\x38\xcf\xf3\x50\x04\x7c\xe6\xd8\xbf\x27\xde\xb4\
+\x89\x57\x42\x77\xf2\xfd\xef\x7f\x9f\x6f\x7e\xf3\x9b\x64\x32\x19\
+\x22\x91\x08\xb6\x6d\x53\x55\x55\x45\x7b\x7b\xbb\x7f\xf3\x08\x3c\
+\x57\xe2\x49\x17\x21\x14\xdf\xb0\x2a\x1a\x9e\x94\x28\x42\x09\x22\
+\x75\xcb\xb2\x68\xaa\x6e\x65\x64\x64\xc4\x8f\x01\xa4\xc4\xb1\x1d\
+\x96\xbd\xf2\x1a\xae\x74\xd0\x14\x1d\x4f\xfa\x71\x8d\x82\x8a\x16\
+\xd2\x82\x6d\x27\x3c\x81\xeb\x4a\x9c\xa2\xc7\xcf\x97\xdf\x49\x63\
+\xb4\x85\xcd\x85\xe5\x14\x6d\x95\x3d\x6f\xc4\x29\x26\xfd\x20\x33\
+\x1c\x36\xd0\x09\x53\x74\xf2\x44\x42\x11\x2c\xdb\xf6\x6d\x11\x3a\
+\x8a\x2e\x0f\xd8\xc2\x41\x7c\x95\xc9\x7c\x78\x39\x75\xdb\xb6\xb9\
+\xfa\xea\xab\x59\xb4\x68\x11\x8e\xe3\xf0\xe8\xa3\x8f\x92\xc9\x64\
+\x82\xa0\xaf\x50\x28\x30\x7d\xfa\x74\xde\x7c\xf3\x4d\x12\x89\x04\
+\xf5\xf5\xf5\x6c\xdd\xba\x15\x4d\xd5\x58\xd3\xf3\x1c\x21\xcd\x20\
+\x97\xcb\xf1\xf5\xaf\x7f\x9d\x42\xa1\x40\x4d\x4d\x0d\xd1\x68\x94\
+\xad\x5b\xb7\xd2\xd8\xd8\xe8\xab\x0b\xc5\x65\xce\xe7\x22\x1c\x3b\
+\xee\x42\xcc\x70\x1f\xa9\xbe\x30\xeb\x7b\x5e\xe5\xf4\x63\x4e\x66\
+\xdd\x8e\x57\xd9\xf3\x8c\x83\xa2\x41\x43\x43\x03\xc5\x62\x31\xf0\
+\xfc\x5c\xc7\xa1\xdb\xeb\x67\xde\x19\x95\x5c\x71\xc2\xcd\xfc\x62\
+\xe3\xb7\x38\xa5\xf1\x32\x56\xed\x7a\x95\x7c\xc5\x36\xb6\x3c\x90\
+\x21\x9f\x2d\x20\x10\xe4\xc6\x79\x2c\x38\x3b\x86\x18\xf6\x78\xfc\
+\xf9\x9f\x92\xee\x76\x31\x47\x20\xdb\xe7\x60\xe7\xf7\x79\x4a\x9e\
+\xa5\x70\xfa\x1d\x2d\xfc\xe8\xec\xdf\xf3\x99\xff\xfc\x24\xff\xf2\
+\xe9\x7f\x47\x91\x21\x36\x24\x7f\xc7\x0b\xff\xf5\x06\xa5\x3e\x3d\
+\x10\xca\x4b\x2f\xbd\xd4\x0c\x0c\x1f\x4a\xb6\xcc\x41\xb9\xbd\x93\
+\x27\x4f\xa6\x58\x2c\x32\x73\xe6\x4c\x14\x45\x61\xda\xb4\x69\x54\
+\x56\x56\x52\x55\x55\xc5\x53\x4f\x3d\x15\x18\xe2\x4c\x26\xc3\xc6\
+\x8d\x1b\x09\x85\x42\x08\x04\xba\x88\x50\x74\xf2\xec\xdd\x35\xe2\
+\xbb\x91\xd1\x68\x80\x13\x95\xed\x83\x6d\xdb\x48\xcd\x63\xe2\x91\
+\xd5\xbc\x35\xf8\x2a\x3f\xb8\xe0\x01\x4c\x25\xc5\x7f\x3c\xbb\x86\
+\xc5\x27\x9f\x4d\x9f\xda\x4e\xef\xf3\x69\xd4\x90\x4f\xa6\x2b\xc3\
+\xe5\x96\x65\x11\x0e\x47\x30\xea\x1c\x5a\xe6\xd7\x70\xc6\x19\x67\
+\xb0\x54\xf9\x21\xc7\xb7\x9e\xc8\x50\xa4\x8b\xe1\xe8\x5e\xba\xaa\
+\x3c\x0c\x3d\x4c\x43\x43\x03\xc3\x83\x43\x74\x3d\x06\x42\x11\xc4\
+\x55\x90\x63\xe6\x53\x78\x1a\x46\x58\x04\x2a\x53\x95\x1a\x8a\x5d\
+\x85\xc4\x25\x4b\x2f\x4d\x35\xcd\x3c\xbf\xfa\x55\x76\x2a\x1b\xf1\
+\xc6\xd4\x1e\xc2\xf7\xfc\xaa\xaa\xaa\xc8\x66\xb3\x87\x94\xba\xf4\
+\x67\x05\x12\x89\x44\xb8\xe9\xa6\x9b\x38\xf7\xdc\x73\xf9\xde\xf7\
+\xbe\x47\xa9\x54\x0a\x74\x72\x59\x3f\xf7\xf6\xf6\x1e\x60\x03\x14\
+\xa1\xb0\xec\xad\xa5\xcc\x3d\xfe\x44\xd6\xb6\x75\xe3\x0c\x86\x89\
+\x46\xa3\xa4\xd3\xe9\x03\xd2\xb5\x89\x44\xc2\x0f\xc6\x42\x12\xcb\
+\x0d\x53\xd1\x58\xe2\x7b\x7f\xb8\x86\x1b\x3f\xf3\x13\x8c\x4a\x87\
+\x5f\x6e\xfc\x0f\xe2\x03\x26\xa9\x74\x12\x45\x13\xd8\xb6\x1d\xc4\
+\x13\x65\xbe\x95\x94\xe0\x78\x26\xb9\x62\x0e\x2b\x6b\xa0\x1a\x16\
+\xaa\xaa\x53\x1f\x6a\xa3\x64\x6e\xe0\xb6\x1f\xdf\x41\x7d\x7d\x3d\
+\xab\x56\xad\x62\xe3\xc6\x8d\x84\xc3\x61\x7a\x7a\x7a\x68\x6c\x6c\
+\xa4\xab\xab\x8b\xd9\xb3\x67\x63\x59\x16\x1b\x36\x6c\xa0\xa2\xa2\
+\x82\xbe\xae\x01\x14\x0d\x54\x55\xc7\x71\x05\xae\x74\x89\xe8\x61\
+\xa4\xe7\xe1\xd8\x0e\xa6\xe5\x93\x1b\xca\xc1\xee\x87\x4e\x03\x72\
+\x5d\x57\xaf\xac\xac\x64\xe9\xd2\xa5\xc1\x05\x94\x8d\x5e\x39\x30\
+\x13\x12\xf6\x4f\x29\x3b\xb6\xc7\xda\xc4\x23\x74\xf7\x45\x48\x0d\
+\x65\x49\xa7\x0b\x54\x55\x55\x51\x57\x57\x17\x08\xa4\x1c\x50\x79\
+\x9e\x87\x82\x44\x0b\x0b\x8a\x09\x97\xc1\x9d\x5b\x39\xeb\xcb\x27\
+\x91\xeb\xf5\xb0\xf3\x12\x2b\xe3\xa2\x85\xf6\xc5\x23\xe5\xcd\x50\
+\x2a\x95\x90\x9e\xc4\x71\x3c\x22\x51\x95\x6b\x9f\xfd\x2c\x37\x9e\
+\xf9\x30\xbf\xd8\x72\x1d\x83\xfa\x4e\x1a\xf4\x06\xa4\x84\x71\xe3\
+\xc6\x91\xcd\x66\x69\x6d\x6d\x65\xdd\xba\x75\xcc\x9f\x3f\x1f\xcf\
+\xf3\x98\x3d\x7b\x36\x43\x43\x43\xe4\xf3\x79\xda\xda\xda\x98\x35\
+\x6b\x16\x0f\x3c\xf0\x00\x42\x51\x70\x34\x3f\xfa\xff\xdb\xa3\xff\
+\x89\xbc\xec\x47\xa2\x72\xc6\x94\x7f\x60\xab\x73\x27\xd6\x98\x40\
+\x0e\x55\x86\xf0\x3d\x7b\x59\x55\x55\x55\x0b\x3c\xcf\xab\x79\x9b\
+\x67\x51\xdb\xda\xda\xfa\x50\x2e\x97\x43\x48\x70\xa7\x08\x8e\x3b\
+\xb7\x9a\xfc\x90\x4b\x7e\xd8\xa5\x30\xe4\x11\xa9\xd2\x29\xa5\x3d\
+\x92\xbb\x6c\x3c\xe9\x32\x79\xf2\x64\x74\x5d\x27\x97\xcb\x61\xdb\
+\x36\xc3\xc3\xc3\x84\x42\x21\xe6\xcd\x9b\x47\x5f\x6f\x1f\x96\x6d\
+\xe3\x99\x72\x8c\x08\xed\x3b\x0c\xae\xeb\x1e\xa0\x3a\xa3\xd1\x28\
+\xa5\x52\x89\x7c\x3e\xef\x5f\xbc\x04\x73\x9a\xe0\x6f\xbe\xd1\x84\
+\xeb\x42\x4b\xf8\x28\xc6\x37\xd7\xb2\x7a\xd7\x4b\xe4\xfa\x5d\xba\
+\x1e\x0c\xd1\x32\xb1\x95\x63\x8f\x3d\x96\x17\x5e\x78\x21\x88\xa6\
+\x2d\xcb\xc2\x30\x7c\xdb\x56\xce\x65\xf8\xfc\x00\x81\x5d\xf0\x38\
+\xed\xce\x4a\xf2\x43\x06\x3f\xff\xfc\x52\x6e\x5a\xf1\x65\xba\xd2\
+\x6f\x22\xf1\xd8\xfc\xd3\x12\xc9\x4e\x07\x90\xd4\xd6\xd6\xb2\x73\
+\xe7\xce\xe6\x64\x32\x39\xf4\xa1\x0a\xe4\xdd\x86\xae\xeb\x4d\xf3\
+\xe7\xcf\x1f\x4c\xa5\x52\xd4\xd4\xd4\x90\xcb\x66\x71\x2c\x3f\x5f\
+\x82\x02\x8a\xcf\xb2\x39\x00\xdb\x6a\x69\x69\x61\x60\x60\x00\xcf\
+\xf3\x13\x40\xa6\x69\x72\xdf\x7d\xf7\xd1\xd2\xd2\x82\xa2\x28\x3c\
+\xf9\xe4\x93\xec\xde\xbd\x1b\xd7\x75\x03\x6f\x6c\xc2\x84\x09\x74\
+\x76\x76\x92\x4c\x26\xd1\x34\x8d\x74\x3a\x4d\x22\x91\xc0\x34\xcd\
+\x40\x75\x79\x8d\x82\x93\xff\xb1\x96\xf8\x0e\x9b\x54\xa7\xcd\xe8\
+\x36\x0b\x33\xe5\xa1\x68\x82\xc6\xf1\xf5\x41\x2a\xf9\xcf\x79\xaf\
+\xe5\xb5\xc8\xa5\x0a\x1c\xf5\x8d\x10\x4e\x49\x52\xa1\xd6\xa1\xaa\
+\x1e\x59\x33\x49\xba\xc7\x61\xfb\x13\x39\x3c\xc7\x37\x19\xd5\xd5\
+\xd5\xe4\xf3\xf9\x33\xc3\xe1\xf0\x68\x2a\x95\x32\x7b\x7a\x7a\xb6\
+\xfe\x55\xb9\xbd\x42\x08\x1e\x7d\xf4\x51\xa4\x94\xac\x5c\xb9\x92\
+\xdd\xbb\x77\xd3\xdb\xdb\xeb\x67\x01\xc7\x5e\xaa\xaa\x62\x18\x06\
+\x9d\x9d\x9d\x44\x22\x11\x74\x5d\x3f\x80\xa1\x31\x7d\xfa\x74\x5e\
+\x7f\xfd\x75\x3e\xfb\xd9\xcf\xd2\xda\xda\x4a\x24\x12\xa1\xbf\xbf\
+\x9f\x19\x33\x66\xd0\xde\xde\x8e\x61\x18\x34\x34\x34\x90\xcd\x66\
+\x49\xa5\x52\xe8\xba\xee\xa3\xbb\x8a\x82\x61\x18\x7c\xf1\x8b\x5f\
+\xe4\xe5\x97\x5f\xa6\xe7\xa1\xb1\x39\x5d\x97\x71\x31\x0f\xb7\xd2\
+\xb7\x65\xfb\x7b\x64\xb1\x58\x8c\xed\xdb\xb7\x9f\x52\x2a\x95\xf6\
+\xbc\xed\x56\x8e\x3e\xfc\xf0\xc3\x9f\xc8\xe5\x72\x14\x0a\x05\x16\
+\x2d\x5a\x84\xb2\xbc\x92\x10\x50\xf0\x6c\xb4\x3a\x0b\x2d\x35\x91\
+\x06\x04\x0d\x27\xbe\x63\x19\x5e\x50\x55\x95\x8e\x8e\x8e\x1d\x3d\
+\x3d\x3d\x33\xff\x6a\x27\x44\xd3\xb4\xa6\xa3\x8f\x3e\x7a\xf0\x96\
+\x5b\x6e\xa1\xa9\xa9\x09\xc3\x30\xb8\xe1\x86\x1b\x68\x68\x68\x40\
+\x55\x55\x16\x2c\x58\xc0\x5d\x77\xdd\x45\x55\x55\x15\x4d\x4d\x4d\
+\x84\xc3\x61\x5e\x78\xe1\x85\x20\xc3\xd7\xd0\xd0\xc0\xde\xbd\x7b\
+\x99\x3e\x7d\x3a\x47\x1e\x79\x24\x83\x83\x83\x24\x93\xc9\x20\xe1\
+\x34\x56\x12\x80\xae\xeb\x14\x8b\x45\x1c\xc7\x21\x12\x89\x04\x64\
+\x02\x45\x51\x78\xf3\xcd\x37\xd9\xbc\x79\x33\x00\x1b\x36\x6c\x40\
+\xd3\x34\x56\xae\x5c\xc9\xe4\xc9\x93\xc9\x66\xb3\x4c\x99\x32\x85\
+\x62\xb1\xc8\xfa\xf5\xeb\x91\x52\x32\x34\x34\xc4\x5b\x6f\xbd\x35\
+\x7d\x74\x74\x74\x57\xf9\x3e\x1a\x1b\x1b\xaf\x2d\x14\x0a\xc7\xd4\
+\xd6\xd6\x5e\x58\xbe\xf6\x6c\x36\x1b\x44\xde\x83\xc5\x61\x2a\x23\
+\x3e\xac\x2e\xed\x31\xe6\xbe\x23\x98\x34\x69\x12\x55\xd5\x55\x3e\
+\x89\x5b\x08\x1c\xc7\xb1\x84\x10\x5d\x63\xea\x5c\xdb\xb4\x69\xd3\
+\x7d\xf1\x78\xfc\x3b\x1f\xea\x09\x51\x14\x85\x47\x1f\x7d\x94\xe3\
+\x8f\x3f\x9e\x67\x9f\x7d\x96\x5c\x2e\x17\xa8\x93\xce\xce\xce\x20\
+\x67\x1e\x8f\xc7\xf1\x3c\x8f\x48\x24\x42\x26\x93\xe1\x86\x1b\x6e\
+\x60\xca\x94\x29\x5c\x7c\xf1\xc5\x98\xa6\xc9\xca\x95\x2b\x03\x1b\
+\x51\x86\x47\xca\xc6\xb2\x9c\xdb\xd6\x75\x1d\xdb\xb6\x09\x87\xc3\
+\x41\x00\xba\x71\xe3\x46\x9a\x9a\x9a\xd8\xb1\x63\x07\xa3\xa3\xa3\
+\x81\x0b\x5d\x59\x59\xc9\xc6\x8d\x1b\x19\x1a\x1a\xa2\xa1\xa1\x01\
+\x5d\xd7\xe9\xed\xed\x45\x55\x55\xa4\x94\xe2\x6d\xc1\xee\x25\x0b\
+\x17\x2e\x9c\x66\xdb\xb6\x44\x22\x8a\xd5\x69\xaa\x62\x1a\x5e\x2a\
+\x84\x9b\xd6\x11\x52\x01\x05\x84\x90\x01\xc8\x64\x95\x2c\x7a\xd8\
+\x4c\xf3\x94\x5a\xdc\x8c\x8e\x9b\xd2\xf0\xb2\x5a\x48\x68\xcc\x00\
+\x08\x87\xc3\x6c\xd8\xb0\xa1\xf1\xc3\x88\xd4\xeb\x92\xc9\xa4\x3e\
+\x56\x5c\xd3\xe0\xba\x2e\x6b\xd6\xac\x61\xf5\xea\xd5\xef\xf0\x36\
+\xca\xbc\xdf\xb2\x6a\xdb\x3f\xc5\x59\x55\x55\x45\xa9\x54\xe2\x17\
+\xbf\xf8\x05\xf7\xde\x7b\x2f\xb6\x6d\x53\x53\x53\x43\x63\x63\x23\
+\x2f\xbc\xf0\x02\xad\xad\xad\xe4\xf3\x79\xb2\xd9\x2c\x9e\xe7\x91\
+\x4e\xa7\xc9\x66\xb3\xc4\x62\x31\x52\xc9\x14\x55\x95\xd5\x14\x4b\
+\x05\x2e\xbb\xec\x32\x62\xb1\x98\x8f\x4f\x8d\xed\x68\x21\x04\x6f\
+\xbd\xf5\x56\x90\xde\xdd\x1f\xde\x18\x37\x6e\xdc\xbb\xb2\xe3\x13\
+\x89\x04\xb6\x6d\x8b\xbd\xf6\x10\xb3\x3f\x69\x22\xa3\x0a\x1e\x0e\
+\xaa\xa6\xe0\xa5\x74\xac\x01\x03\xbb\x2f\x4c\xa9\xd3\x3f\xa1\xd2\
+\x85\xda\x79\x61\xea\x16\x94\x28\xba\x71\x14\x05\x9c\x9c\xca\xf0\
+\x43\x8d\xef\xb8\xe7\x0f\x54\x20\x8a\xa2\xac\xb9\xf0\xc2\x0b\xa7\
+\xbd\x17\xca\x64\x28\x14\xe2\xc5\x17\x5f\x7c\xc2\x34\xcd\x27\x01\
+\xea\xeb\xeb\x6f\xbd\xe9\xa6\x9b\x9a\xce\x3a\xeb\x2c\x56\xad\x5a\
+\x15\xa8\xa7\x72\x1c\xa3\x28\x0a\xbd\xbd\xbd\x07\xe0\x50\xd1\x68\
+\x94\xfa\xfa\x7a\xc6\x35\xd7\xc3\xbc\x21\xaa\x23\x21\x5e\xb9\x6d\
+\x37\xb1\x58\x2c\x60\x9d\x1f\xcc\xd8\x3f\x95\xfc\x76\x3a\xaa\x6d\
+\xdb\x58\xd2\x46\x41\x41\xcf\x4d\xe4\xe6\xf3\xee\xe1\x85\xdd\xbf\
+\xe6\xf9\xd1\xc7\x99\x3c\xbf\x9e\xbe\xd8\x20\xd9\xed\x5a\x70\x6a\
+\x3f\x31\xe1\x5c\xae\x38\xf5\x6a\xbe\xf0\xd3\xd3\xf8\xa7\xf3\xaf\
+\xe4\xd1\x55\xf7\x04\x39\xa3\xbf\x94\xe8\x70\xd0\x02\xf1\x3c\xaf\
+\xaa\x4c\xb1\x1c\x75\x33\x4c\xbc\x20\x4d\xa4\x42\x01\x4b\xc1\xb3\
+\x15\xdc\x94\x86\x35\x60\xe0\x0c\x19\xb8\x19\x1d\x21\xfc\xaa\xa8\
+\x50\x28\xd4\x3e\x30\x30\xf0\xeb\x31\x28\xff\x3f\xea\xeb\xeb\x1b\
+\x57\xae\x5c\x29\xf6\x8f\x63\x74\x5d\xff\x93\xe0\x5d\x3e\x97\x67\
+\x43\x7e\x07\x67\xcc\xaa\x40\xd5\x2d\x16\xde\x58\x81\xa6\x14\xd0\
+\x55\x1d\xd7\x96\x38\x71\x83\xd4\xd2\xda\xe0\x7f\x5e\x7b\xed\xb5\
+\xaf\xe6\xf3\xf9\x47\xde\xb6\xa1\xdc\xa6\xa6\xa6\xfc\xdb\xe7\x37\
+\x4d\x13\xc7\x76\xf0\x54\x3f\x99\xf5\x99\xe9\xd7\xf0\x5f\xab\xff\
+\x9d\x2f\xcc\xfa\x57\x66\x2d\xfc\x04\x7a\xb4\xc4\xcd\xbb\xaf\xde\
+\x47\x06\xf7\x04\xaf\x74\x3f\x88\xf6\x6c\x8c\x4f\xcd\xfe\x32\x6d\
+\xb1\x23\x70\x5c\xc7\x27\x7e\x8f\x09\xe4\x43\x39\x21\x65\x70\xcf\
+\xb1\x1d\xb2\x4a\x9e\xca\x6a\x41\x36\x67\x72\xce\x11\x7f\xcf\xa8\
+\xd9\xcd\x9b\x43\xab\xa9\x9a\xe6\x51\x18\xcd\x30\xf4\x70\x3d\x42\
+\x0b\x6a\x3e\x82\xab\x8b\xc7\xe3\x09\xdb\xb6\xa7\x9a\xa6\x19\x40\
+\x31\xe5\x2c\x5b\x52\x49\xd1\x38\x51\xc7\x4d\xeb\x78\x59\x1d\x69\
+\xa9\x64\x0b\x29\x8c\xb0\xc1\xb8\xba\x71\x40\x06\x45\x15\xcc\x33\
+\xbe\xc0\xe2\xc5\x67\x63\x91\xe3\x7b\x4f\xfd\x3b\xf3\x67\x4f\x66\
+\xab\xb3\x35\x98\x67\x2c\xbf\x5d\xf4\x3c\x2f\xbd\xff\xb5\x47\xa3\
+\xd1\xfa\xbe\xbe\xbe\xf0\xdb\x84\xa1\x96\xe3\x22\xcb\x30\x29\xa6\
+\x15\xbc\x82\x4a\xef\xd0\x1e\x36\x29\x5b\x78\xab\xe7\x4d\x1a\x0e\
+\xcf\xa1\x29\xa1\x80\x99\xa2\xa0\xa2\x22\x71\x5c\x9b\x81\xd4\x30\
+\x7b\x52\x11\x34\xa1\x07\xe8\x43\x39\x9e\xf9\xf0\x04\xe2\x38\x78\
+\xba\x8b\x50\x14\x3e\x5e\x7f\x19\xcd\xb1\x3a\x1a\x12\x47\xb1\x6e\
+\x68\x3b\x9f\x3d\xf9\x42\x1e\x1f\xf4\xc9\x6d\x8a\xa4\x1c\x91\xef\
+\x8f\xf5\x64\xc3\xe1\x30\xae\xeb\xa2\x69\x1a\x13\x27\x4e\xc4\x75\
+\x5d\xd2\x4e\x81\x59\x17\xb9\x18\x61\x05\x17\x1b\xa1\x38\x78\x79\
+\x85\xed\x77\xd7\x60\x88\x0a\x3f\x4a\xf0\x20\x95\x2a\x72\xfe\xf1\
+\x17\x71\xdb\xda\xcb\xf8\xfc\xf4\xff\xe0\xdf\x17\xdf\x81\xad\x8f\
+\xd2\xbe\xf5\xaa\x60\xc1\xfe\x48\x04\xad\xb4\xb4\xb4\x8c\x94\x13\
+\x55\x00\x9e\xea\xa2\x69\x2a\x9e\x29\x10\x52\xd0\x20\x1a\xc8\x3d\
+\x06\x37\x7b\xd7\xa3\x2b\x06\x3f\xf5\x6e\x43\x41\xc5\x99\xbb\x9b\
+\x49\xb3\x9a\xf6\x95\xbc\xa1\xd0\x1a\x69\xe5\xb0\xe6\xc3\x58\xdf\
+\xbb\x97\x1a\xa3\x11\x89\xc4\xb2\xec\x03\x28\xb4\x1f\x8a\x40\xca\
+\xc7\xdb\x15\x0e\x0a\x61\x16\xcd\x5d\xc4\xca\xa1\x87\x19\xe9\xaa\
+\xc0\x70\xea\xb1\xbd\x12\x48\xe1\x03\x88\x1e\xe5\x9c\xf3\xa9\xe3\
+\xc7\x8f\x1f\x1c\x18\x18\xb8\xa7\x7c\xc1\xe5\x8b\x2e\xd3\xf8\x6d\
+\xd7\x26\xa4\x6b\x24\x06\x5d\x7e\x70\xc1\xe3\x74\x66\xd6\xf1\xe0\
+\xc6\xff\x44\x7a\xc2\x27\x19\x48\xc0\x00\xab\x24\x89\x46\x2a\xf0\
+\x84\x43\xb6\x90\x67\xdd\xce\x0d\x54\xb4\xf4\xa3\x29\xa1\x7d\x05\
+\x42\xef\x4e\xe9\x34\x2a\x2a\x2a\x88\x44\x22\x48\xcf\xa3\x47\x0e\
+\x33\xff\x22\x6b\x1f\xe1\x6e\x34\x84\x33\x10\xa1\xd4\x6d\x10\x4e\
+\x54\x8f\x91\x8a\xc2\x84\x8d\x30\xf3\xa7\x9f\xc4\x26\xf7\x09\x2c\
+\x6b\xdf\xbe\x3a\xa5\xed\x52\x26\x4f\x8f\xf0\xfc\xf0\x2a\x56\x74\
+\xd9\x50\xe6\x68\x8d\xdd\xdf\x5f\x72\x42\x0e\xda\x02\x95\x0d\xa0\
+\x65\x59\x78\xae\x07\x63\xa5\xcc\x08\x51\xa6\x92\x51\x72\x72\x63\
+\xef\x33\x83\x72\x85\xc3\x0f\x3f\xfc\x14\xc3\x30\xbe\x5a\x9e\x23\
+\x16\x8b\x71\xd7\x5d\x77\x31\x7e\xfc\xf8\x7d\x75\x26\xb6\x83\x10\
+\x82\xaf\x1c\xf3\x6d\xd6\x0c\x3d\xce\xce\x6d\x19\x66\xa9\x9f\xa5\
+\xd2\xa8\x0e\xe6\x41\x42\xac\xc6\x60\x24\x35\x4a\xb5\x5e\xcf\xf8\
+\xba\x46\x5c\xcf\xc6\x76\x6c\x84\x54\x02\xc2\xdb\x1f\xa3\x72\x4a\
+\x29\xc7\x6a\x3e\x6c\xf2\x22\x0f\x12\x0a\x29\x95\x0b\x66\xff\x2f\
+\xaa\x9b\x43\x18\xb3\xd3\x8c\x3b\x37\x4e\x78\x7e\x22\x98\xcb\x71\
+\x5c\x96\x74\xdd\x87\x63\x7b\x24\x93\x49\x92\xc9\x24\xa5\x82\xc9\
+\xa3\x9b\xee\xc2\x94\x39\x42\x95\x92\xce\xe2\x5a\x86\x77\xe7\x82\
+\xbf\x8f\x51\x9e\x9c\x0f\xd5\x86\xb8\xae\x8b\x82\xc2\x8b\xed\x7f\
+\xe0\xe4\x8f\x9d\x4c\x4a\xea\xbc\xd6\xf5\x34\x47\x36\x7e\x8d\x97\
+\xc5\x73\x58\x56\x1e\x45\xfa\xe8\xec\x98\x57\xe6\x95\x77\xef\x75\
+\xd7\x5d\x47\x3c\x1e\xa7\xa5\xa5\x85\x42\xa1\xe0\x9f\x10\x61\xa3\
+\x48\x95\xc3\x9a\xa6\xf2\xda\xe0\x4a\x46\x0b\x25\x76\x0d\x75\x20\
+\xf0\x17\x5a\x20\x90\x48\x2a\x2b\x22\x3c\xb2\xe5\x87\x7c\x79\xc1\
+\x77\xe8\xcc\xad\xe6\xcd\xfc\xf3\x9c\x11\x39\x1b\x5b\xee\x63\x1f\
+\xfe\x31\xb7\xb3\x1c\xb1\x4b\x57\xe2\x85\x7c\xa4\xe0\xc6\x33\x1f\
+\xe6\xa9\xad\x3f\xe7\xba\x85\x0f\xb0\x64\xe3\x12\xcc\xea\x9d\x2c\
+\x59\xff\x2a\xa6\xe9\x73\x03\x8c\x90\x4d\xff\x6a\x8b\x3d\x23\xa9\
+\xa0\x20\xc7\x71\x6d\x92\x9b\x2c\x6e\xf8\xfa\xad\x28\xd2\x20\xdf\
+\xef\x61\xe7\x75\x26\x8e\xaf\x06\x21\x51\x35\x85\x9a\x9a\x9a\xcf\
+\xcf\x9d\x3b\xf7\xf8\xfd\x3f\x7f\x70\x70\x90\xee\xee\xee\x8f\xe7\
+\x72\x39\xeb\x90\x09\xa4\x50\x28\xe0\xd8\x36\x66\xc4\xc3\xc3\x65\
+\xb3\xf5\x30\x87\xf5\x4d\xa5\xae\x51\xa1\x6d\x96\xca\x7f\xae\xba\
+\x04\xcb\x09\x91\xcb\xe5\x51\x74\x7f\x61\xca\xc1\x5c\xd9\x03\x59\
+\xb9\x72\x25\x9f\xf9\xcc\x67\x02\x40\xcf\xf3\x3c\x6c\xc5\x46\x28\
+\x1a\x99\x62\x86\x90\x6a\xa0\x8b\x10\x96\x6b\xe2\x38\x36\xa3\xa3\
+\xa3\x28\x42\x21\x5b\xe5\x51\xb4\x2a\xe8\x0e\xbd\xc6\x0f\x9e\x4b\
+\xf1\xa5\x4f\x7e\x11\x33\xd2\xc3\xb3\xdb\x7f\xce\x68\x57\x91\x64\
+\x32\x1b\xb8\xc1\xef\xe6\x7a\x06\xfc\x32\x57\x42\x54\x22\xa4\x42\
+\x4d\x64\x1c\x9b\xe3\xaf\x70\xf2\xf0\x67\xf0\x2c\x15\xd7\x75\x70\
+\x5d\x89\x65\xfa\xc5\x21\x86\x61\x90\xee\x74\x31\x0c\x0d\x4d\xf3\
+\xe7\xb4\x1d\x9b\xa6\xca\x49\x18\xd2\x40\x00\xb9\x89\x83\xcc\x3a\
+\xcb\x81\x4c\x08\x37\x6e\xe0\x0c\x87\x91\xb6\xd2\x2c\x4d\xa5\x59\
+\xda\x3e\x81\xaf\x4c\xea\xeb\xe8\xe8\x50\x0e\xe9\x09\xc9\xe7\xf3\
+\x7e\x4e\xa0\x42\x62\xbb\x16\x9a\xaa\xf2\x78\xe7\x77\x39\xa2\x74\
+\x0c\x96\x6d\x61\xa5\x15\xb6\xfd\x3e\x49\xc9\xb6\x10\xce\x81\xf6\
+\xa2\x3c\x96\x2f\x5f\xce\xf3\xcf\x3f\xcf\xe0\xe0\x20\x2d\x2d\x2d\
+\x7e\xb5\x92\xea\xa7\x6e\xef\x5b\x76\x0f\xff\x72\xc1\xb5\x94\x1a\
+\x3c\x56\xfc\xee\x51\x2c\x3b\x12\xf0\xae\x34\xd7\x57\x8b\x9e\x25\
+\xe8\x1b\x6e\xe7\x9a\x7f\x5d\xcb\xe8\x36\x93\xc2\xa0\x8b\x50\xc5\
+\x01\x94\xa1\x77\xe3\x47\x05\x5c\x5c\x4f\xe2\x49\x89\x50\xfc\x53\
+\xa7\x08\x05\x55\x55\x49\x66\x53\xa4\x43\x5d\xe0\x81\x65\xdb\x41\
+\x21\x4e\x4b\x4b\x0b\xd1\x68\xb4\x5c\x10\x4a\x32\x99\x0c\xd4\xa2\
+\x8a\x42\x69\x72\x82\xc8\xb8\x4a\x64\x5d\x11\xda\x8a\x07\x7c\xe6\
+\xf0\xef\xc6\xe1\xa6\xb5\x80\xf6\x7a\xc8\x55\x56\x99\x0b\x1b\xc9\
+\x29\xec\x7e\x31\x4f\x6a\xb7\x83\x99\xf6\x58\x55\x58\x82\x5b\x02\
+\xd7\x94\x08\x55\xa0\x69\xfb\x16\x67\xff\x82\x18\xa0\xd0\xd3\xd3\
+\x93\x97\x52\x4a\xdb\xb6\x23\xe9\x74\x5a\xb5\x6d\xdb\x4f\x50\x39\
+\x06\xb2\xae\x9d\x47\x56\x3e\xc4\xe7\x4f\xfe\x3c\x8d\x93\xa0\xc7\
+\x49\xe1\x38\x0e\x93\x26\x4d\xc2\x48\x24\x58\x7b\x63\x1e\xb7\x34\
+\x06\xce\x0a\x90\x68\x84\xc2\xfb\xf2\xf9\x7f\x8a\x81\x5e\x16\x88\
+\x74\x25\xd2\xf3\x91\xe9\x54\x21\xce\xec\xda\x53\x98\x32\x71\x02\
+\x2f\xae\xf7\x38\xbe\xf9\x53\xbc\xe1\xfe\x38\x30\xe0\xe1\x70\x98\
+\x68\x45\x94\xa6\xba\x09\x34\xd6\x4a\xde\xdc\xbe\x85\xb6\xb6\xb6\
+\x7d\xf9\x1c\x1f\x57\xc1\x73\x42\x7c\xef\x93\x4f\xf2\xd2\x96\x17\
+\x70\xaa\xf7\x92\xd8\x1b\x61\x93\xfd\x80\x5f\x16\x67\x79\x41\xeb\
+\x90\x83\x21\xd3\xbd\x27\x81\xb4\xb5\xb5\x71\xe1\x85\x17\xb2\x7e\
+\xfd\x7a\x06\x7a\x06\xf1\xac\x0c\x6e\xc8\x41\xea\x12\x2b\x62\x05\
+\x09\x27\xcf\xf3\xc8\xe5\x72\xc1\xcf\x80\x33\x06\xa9\x9c\x5b\x86\
+\x55\x62\xb1\xd8\x8b\xae\xeb\x7e\xd2\xcf\x3a\x7a\x28\x86\xbf\x6b\
+\xdb\x47\x7e\x47\xc7\xfd\xaf\x30\xd8\x53\xc0\x2a\x48\xee\xbc\xf3\
+\x4e\x26\x4f\x9e\xcc\xf0\xf0\x30\x4b\x96\x2c\xc1\x34\x4d\x5c\xd7\
+\xa5\x50\x28\x90\xc9\x64\x98\x30\x61\x02\x7b\xf6\xec\x61\x64\x64\
+\x84\xe6\xe6\x66\xba\xbb\xbb\xff\x68\x2a\x3a\x9f\xcf\x23\x5d\x0f\
+\xcb\xf6\x09\x15\xdf\x7d\xf5\x62\xae\x3f\xf5\x11\x1e\xda\x74\x0b\
+\x3b\xb4\x65\xf4\x77\x56\xe2\xd8\x2e\xb9\x5c\xa1\x9c\x66\xa0\xc7\
+\x1b\xa1\xf9\xb2\x51\x22\xba\x8e\xbc\x67\x14\xe1\x34\x04\x20\xa8\
+\x8a\x82\x22\x04\x21\x6b\x1c\xb1\x68\x8c\x1f\xbd\x74\x1d\xf7\x5e\
+\xfc\x07\xea\x4f\xaa\x23\xd7\xbe\x85\x1e\x6b\x17\x96\xa9\x7c\x70\
+\x02\xf9\xf5\xaf\x7f\xcd\xab\xaf\xbe\xca\x2d\xb7\xdc\xc2\xb2\x65\
+\xcb\xd8\xb8\x71\x23\x42\x08\xba\xbb\xbb\x99\x34\x69\x12\x93\x27\
+\x4f\x66\xf5\xea\xd5\x74\x74\x74\x70\xec\xb1\xc7\xb2\x71\xe3\x46\
+\x8a\xc5\x22\xaa\xaa\x2e\x38\xf1\xc4\x13\x65\x40\x92\xf6\x3c\x34\
+\x5d\x05\x47\x48\x84\xdf\x94\xa7\xfd\x5b\x1e\x12\x50\x14\x1d\xa1\
+\xda\xa8\x7a\x2d\x8e\x19\x0f\xa2\xf8\xa9\x53\xa7\xf2\xc8\x23\x5f\
+\x1c\x22\x28\x00\x00\x19\xed\x49\x44\x41\x54\x8f\x50\x57\x57\x47\
+\x73\x73\x33\x8d\x8d\x8d\xdc\x7f\xff\xfd\x14\x0a\x05\xc2\xe1\x30\
+\xb1\x58\xac\x5c\x38\x8a\xe7\x79\x6d\xb5\xb5\xb5\x1f\xdb\x8f\xa8\
+\x11\x76\x5d\x37\xb0\x21\xb6\x09\x8e\xb4\x51\x2b\x6d\x7e\xb0\xfa\
+\x2b\xb4\xd5\xcc\xa0\x94\xb6\xc9\x0f\x27\xe8\x7c\x2d\x45\xb1\xe8\
+\xab\x97\x48\x38\x8c\x5d\x6d\x51\x53\x15\xc6\xce\x87\x69\xac\x99\
+\x88\x3d\x60\xe3\x49\x1f\x8d\x76\xa5\x40\x11\x02\xe9\x29\x38\x9e\
+\x0d\x02\x14\xdd\x65\xf7\xc0\x2e\xba\xd3\xdb\x70\x6c\xb0\x6d\x11\
+\x6c\x88\x72\xa5\xd5\x21\x13\xc8\x13\x4f\x3c\xc1\x69\xa7\x9d\xc6\
+\x9e\x3d\x7b\x18\x1a\x1a\xc2\xb6\x7d\xa3\xab\x69\x1a\x5b\xb7\x6e\
+\xc5\xb2\x2c\x92\xc9\x64\x40\xb0\x03\x02\xe2\xf2\xc4\x89\x13\x7d\
+\x6f\xa3\x94\xa2\x6e\xf1\x30\x13\x26\x86\x71\xb2\xaa\xb0\xfb\x22\
+\x38\x03\x61\xac\xbe\x08\x65\x07\xba\xcc\xc1\x2a\x6c\xc9\x73\xe3\
+\x8d\x37\x72\xc6\x19\x67\xf0\xfa\xeb\xaf\xe3\x79\x1e\xbb\x76\xed\
+\xc2\xb6\x6d\x74\x5d\x67\xc2\x84\x09\x14\x0a\x05\x74\x5d\x0f\xc0\
+\xc3\xe6\xe6\x66\x66\xce\x9c\xf9\x1d\xe0\x3b\xfb\x93\xfd\xb6\x6c\
+\xd9\x82\xa6\x69\x48\x45\xa2\xc7\x61\xef\xcb\x45\x46\xb6\x9a\xa4\
+\xba\x46\x11\x6c\x3b\x20\x23\x51\xb6\x7b\xaa\xea\x17\x75\x96\x8a\
+\x2e\xb7\x9c\xf9\x3b\xfe\xfe\xa9\xf3\x28\x39\x2e\x12\x9f\x6c\x21\
+\x3c\x40\x0a\xf4\x88\x43\x48\x35\x68\x8c\x4e\x22\x59\x1c\x42\x11\
+\x51\xf0\x14\x6c\xc7\x0a\xd4\x5f\x99\x94\x7d\x48\x6d\xc8\x3d\xf7\
+\xdc\xc3\x43\x0f\x3d\x44\x2e\x97\x7b\x87\x7e\x06\xd8\xb9\x73\x67\
+\xf0\xbb\x35\x6b\xd6\x50\x5d\x5d\x1d\xfc\xbd\x8c\xf5\x8c\x94\x52\
+\x1c\x39\xa5\x82\x62\xc9\x66\xf6\xe4\xe3\xd8\x53\xb3\x09\x67\x76\
+\x16\xcf\x93\x98\x7b\x2a\x18\x7d\x31\x86\x50\x65\x90\xcc\x8a\x46\
+\xa3\x41\x3e\x5f\x08\xe1\x97\xd2\xd9\x36\x93\x27\x4f\xc6\xb6\x6d\
+\x14\x04\x3b\xd4\x3d\x1c\x73\xa1\x86\x90\x0a\xd2\x12\x78\x25\x15\
+\x27\x1e\xc2\xea\x37\x70\x86\x0d\x9c\xb1\xce\x37\xc7\x1c\x73\x0c\
+\x97\x5e\x7a\x29\xf7\xfd\xea\x3e\xe4\x28\x48\x75\x90\xba\x29\x5e\
+\x60\x13\x4c\xd3\x24\x1a\x8d\x32\x86\x00\xa3\x69\x2a\x02\xbf\xe6\
+\xb1\xae\xaa\x96\x82\x95\xc3\x71\xfc\x66\x39\xa5\x52\x09\x45\x0a\
+\x42\x02\x6c\x2d\xc1\x8f\xff\xf0\x7f\xf9\xe5\xa5\x4f\x70\xd3\xeb\
+\x17\x61\x78\x31\xaa\x23\x31\x4c\xb3\x97\x52\xc9\x0b\xec\xe9\xc1\
+\x00\x8f\xef\x05\x5c\xdc\x65\x9a\xa6\x61\x59\x56\xcd\x3e\x86\xe2\
+\x81\x30\xc5\xdb\x4b\xce\xb2\xd9\xec\x01\xb9\x0d\xff\xf7\x1e\x9e\
+\x27\x39\x2e\x74\x39\x2d\x0d\x1a\x67\x4c\xba\x84\x5f\xbc\xfe\x9f\
+\xcc\x98\xda\xcc\xaa\x3d\xab\xb0\x2d\x1b\xa1\xf9\x35\x29\x75\x8d\
+\x31\x42\x5e\xa5\xaf\xd3\x14\x49\xae\x90\x65\xfc\xf8\xf1\x44\xa3\
+\x51\xb2\xd9\x6c\xd0\x6d\x21\x57\x59\x40\xd3\xab\x89\x29\x93\x58\
+\x38\xf7\x14\x5e\xda\xfd\x30\xce\x38\x17\x31\x2f\x41\xfc\xd5\x28\
+\xf9\x2d\x7e\xb1\xcd\x1d\x77\xdc\xc1\x8a\x15\x2b\xf8\xc1\x7f\xfe\
+\x80\x5f\xfd\xea\x57\xcc\x91\x47\xd0\xdd\xdd\xcd\xac\x59\xb3\x78\
+\xe1\x85\x17\x98\x34\x69\x12\x96\x65\xa1\x69\x1a\xa1\x50\x88\x54\
+\x32\x35\x56\x6b\x28\xf6\xab\x49\x71\xb0\x6c\xcb\x2f\x83\x70\xa1\
+\xb2\x14\xc2\xf6\x74\x3a\xcc\x27\x59\xdd\x73\x18\x55\x15\x55\x0c\
+\xe6\x77\x93\x1f\x74\x89\xf7\x25\xb1\x0b\xfb\x52\xbe\x07\x43\x39\
+\x3d\x68\x81\x8c\x8c\x8c\x9c\x54\x2c\x16\x7f\x72\xce\x39\xe7\x5c\
+\x7d\xdb\x6d\xb7\x91\xcd\x66\x79\xf8\xe1\x87\xd9\xb5\x6b\x17\x8a\
+\xa2\x90\x4c\x26\x89\x44\x22\x28\x8a\xc2\xe8\xe8\x68\x90\xf5\x4b\
+\xa5\x52\x94\x4a\xa5\x00\x5a\x70\xa5\x47\xa9\xe8\x71\xf1\x79\x7f\
+\xcf\x4d\x2b\xfe\x1e\xad\x66\x02\x53\xab\x8e\x61\x76\x43\x2b\x2b\
+\xe5\x2a\x4c\xcb\x44\xb8\x3e\x30\xd9\x74\x41\x96\xaa\x89\x05\xec\
+\x11\x03\x77\x30\x02\x1d\x02\x67\xd8\x0b\xa8\x48\xb6\x6d\xe3\x4a\
+\xdf\x08\x49\x04\xdf\x3c\xe5\x5e\x7e\xf4\xf2\xbf\xf2\xef\x67\x3c\
+\xc4\xea\x8d\x6f\xb2\xc9\xf9\x35\x43\x76\x1f\xb6\xed\x2f\xe6\xd3\
+\x4f\x3f\xcd\x82\x05\x0b\x68\x6f\x6f\x67\xe7\xce\x9d\xc1\x02\x25\
+\x12\x09\x4a\xa5\x12\x89\x44\x22\x48\x3b\x17\x0a\x05\xca\x0d\x6c\
+\x5c\x69\x32\x9a\x1e\xa5\xda\xa8\x23\xed\x24\x02\xc6\x0d\x02\x94\
+\xbc\xa0\x30\xe2\x91\x1b\x76\xb9\xf5\xd9\x1b\x49\xec\x70\x49\x75\
+\x3a\x20\xfd\xba\xf7\xb2\x0c\x0e\xb6\xa0\xe7\x3d\xa9\x2c\x21\x84\
+\xbe\x70\xe1\x42\xd6\xad\x5b\xc7\x39\xe7\x9c\xc3\xe1\x87\x1f\x4e\
+\x3e\x9f\xc7\xf3\x3c\x5a\x5b\x5b\x29\x14\x0a\x98\xa6\x49\x3a\x9d\
+\x26\x1e\x8f\x53\x5b\x5b\x1b\x64\x01\x83\x1a\x13\xc5\x1b\xd3\xd3\
+\xba\x8f\xcc\x0a\x85\xa1\xec\x00\xb9\xde\x4d\xfe\xfb\x4c\x2b\x38\
+\x21\xb8\x82\x29\x91\xe3\x08\x1d\xee\xb2\xab\x61\x33\x66\x2c\xcf\
+\xf0\x23\x3a\x20\x83\x40\x4f\x91\x3e\x15\x35\x1d\xf7\x88\x86\x2b\
+\x58\xd6\xf9\x04\xd7\x6a\x37\xd3\x50\x57\x83\xd5\x6f\xe1\x38\x2e\
+\xa6\xe9\x43\x33\x77\xde\x79\x27\x77\xdc\x71\xc7\x1f\xbd\xbf\xd1\
+\xd1\xd1\x03\x7e\x8e\x55\x8f\xe5\x5c\xa2\x3a\xff\xe7\xf7\x9f\xa5\
+\x36\x34\x89\xed\xc5\x5e\xa2\xd1\x28\x86\x61\xd0\xd4\xd4\x44\x6a\
+\x73\x8a\x2d\x9b\xdd\x31\xb7\xdb\xef\x68\x54\x15\xf3\x0e\xa0\xd6\
+\x96\x0b\x98\x0e\xb9\x40\xa4\x94\xfc\xf6\xb7\xbf\xa5\x9c\x60\xea\
+\xe8\xe8\x08\x20\x8b\xb2\x8d\x10\x42\x50\x28\x14\x70\x5d\x37\x10\
+\x56\x59\x3f\x03\xb8\x61\x8f\x48\x58\xe7\xe5\x0d\xcb\x09\x51\x4d\
+\x6d\xb4\x9e\x81\x4c\x17\x67\x55\x7f\x9c\xad\x72\x07\xa6\x55\x42\
+\xf1\x7c\x20\xb3\x3a\x7d\x2c\xe7\x1f\xfd\x45\x5e\x5a\xbd\x8e\x71\
+\xd2\xe3\xf4\xd9\xa7\xf0\x7d\xeb\x76\xc2\xaa\xb1\x8f\x94\x37\x56\
+\x61\xa8\x28\x82\x03\x6d\xa6\xc0\xf6\x8a\x63\x27\xc9\x25\x95\x4a\
+\xf9\xe9\x80\xb1\x60\x50\x4a\xe9\x7f\xaf\xf9\x7c\xa2\xb0\x16\xa5\
+\x60\x67\x51\x84\x8a\x6b\xfa\x0b\x97\x4e\xa5\x70\x5a\x1c\x4c\xa7\
+\x84\x16\xf5\xd8\x38\xb4\x02\xd7\x11\x34\x36\x36\x72\xf7\xdd\x77\
+\xe3\x79\x1e\xab\x57\xaf\x66\xd5\xaa\x55\xb4\xb6\xb6\xb2\x66\xcd\
+\x1a\x8e\x3c\xf2\x48\x36\x6d\xf2\x37\x57\x5d\x5d\x1d\xf9\x7c\x9e\
+\xde\xde\xde\x83\xe6\xff\xbe\x57\xac\x58\xd5\x34\x8d\x67\x9e\x79\
+\x46\x0a\x21\x84\x22\x94\x80\x3d\xe8\x4a\x9f\xaf\xa4\x29\x21\x3f\
+\x3f\xae\x86\x70\x1c\x87\x8a\x8a\x0a\xa4\x94\x41\xe9\xb1\xa5\xd8\
+\x68\xba\xe0\xc1\xed\xff\xce\x2d\x67\x3f\xce\xda\xe1\x27\x08\x35\
+\xf7\xd3\x93\xdf\x82\xed\x59\x14\xf2\x05\x14\xdd\x8f\x01\x8e\x9b\
+\xbe\x80\xee\xd4\x76\xde\xec\x5f\xc7\xc2\x19\xa7\x11\x56\x8c\xb1\
+\xb2\x33\x11\xb4\xf8\x50\xa4\x40\x22\xa8\xad\x0f\x91\xce\x67\x38\
+\xf7\x88\x7f\x20\x51\x1c\x20\x97\x2b\x31\xb5\xf6\x28\xda\x9d\x3f\
+\xe0\xba\xd2\xf7\xf2\x5c\x41\xa9\x26\xc1\xb4\xd8\x5c\x4a\xa5\x12\
+\x03\x6e\x8a\x19\x5f\x34\x99\x56\xb1\x90\x8b\xcf\xf8\x12\x35\x6a\
+\x2b\x37\x3d\x7e\x0d\xcf\x5e\xbf\x0e\x0f\x5f\xe0\x91\xa2\xce\xc0\
+\x1b\x26\x99\x5e\x87\xd4\x9e\x02\xba\x5a\x5d\xce\xed\x30\x77\xee\
+\x5c\xaa\xaa\xaa\xc8\xe5\x72\x74\x74\x74\xa0\xeb\x3a\xb1\x58\x0c\
+\x29\x25\xc9\x64\x12\xd3\x34\x69\x6b\x6b\x63\xdb\xb6\x6d\x1f\x8c\
+\xca\x52\x14\xe5\xd1\x37\xde\x78\x63\xda\xac\x59\xb3\x4e\x2b\x14\
+\x0a\x58\xd2\x45\x9f\x9e\xa7\xae\xaa\x96\xb3\xe7\x7e\x8e\x92\x69\
+\xb1\x74\xfb\x13\x9c\x39\xfb\x1c\x96\xee\xfe\x2d\xe9\xf5\x61\x0a\
+\x85\x02\x42\x88\x60\x87\xe4\x85\x87\xed\x5a\x84\xaa\x3c\xfe\xed\
+\xf7\x17\xb1\x78\xfe\xd9\x64\xf3\x29\xd6\xc7\x57\xb2\xf3\xe5\x2c\
+\xd9\x82\x19\xec\xf4\x92\x69\xe2\x58\x2a\xae\xe3\x91\x2b\xa5\xf0\
+\x1c\x1f\xcd\x95\x78\x68\x9a\xe6\xcf\x2d\xfd\xb8\x06\xe1\x71\xcd\
+\xd3\xe7\xf3\xc3\xf3\x9e\xe2\xc6\xd7\x2f\x24\x53\x8a\xa3\xe9\x1a\
+\x56\xc9\x22\x97\xdb\x97\x2b\x99\x14\x9d\x46\x3e\x9f\xf7\x53\xb7\
+\xd8\xd8\xa6\xcb\xac\xc6\x45\x3c\xd9\xfe\x33\x0e\x53\x3f\xc1\x31\
+\x0d\x8b\x79\x46\xae\xa6\xbe\xa1\x9e\xe3\x8f\x3f\x9e\xad\x5b\xb6\
+\x12\xff\x83\x83\xe5\x98\xb8\x99\x0c\xd1\x6a\x9d\x64\x32\xc9\xd7\
+\xbe\xf6\x35\x5a\x5b\x5b\xe9\xec\xec\xdc\x57\x2e\x27\x25\x3b\x76\
+\xec\x08\x16\x3f\x95\x4a\x05\x2c\x99\x3f\x06\xe9\xfc\x45\x02\xc9\
+\x64\x32\x2f\x55\x55\x55\x9d\xdc\xda\xda\x7a\x5a\x32\x99\xa4\x88\
+\x45\xf5\xc9\x3a\xc7\x34\x9e\xc9\xdc\x63\x9a\x59\xb7\xb1\x93\xef\
+\x7f\xe6\x6e\x8e\x9b\x79\x0c\x43\xcf\x2c\x63\x47\x4f\x08\xe1\xaa\
+\xa4\x52\xa9\xc0\x80\x46\x4a\x2e\xd9\x21\x87\xc1\x8d\x16\xa3\xdb\
+\xf6\xb0\xfa\x96\xbb\x83\x5e\x55\x4d\xa2\x99\xa6\xb9\xfb\x3e\xef\
+\xf7\x0f\x3f\x05\x63\xcd\x5a\xfb\x78\x09\x80\x09\x13\xc7\x53\x2c\
+\x16\xc9\x66\xb3\xe4\xf3\x79\x84\x14\x38\xa6\xf0\x85\x5c\x6d\x71\
+\xe3\x6b\x7f\x47\x24\x5c\x41\x41\xd5\x48\x76\xda\x74\xae\x4c\x21\
+\x9d\x80\xe0\xc7\xb8\xea\x71\xf4\xf7\xf7\xfb\xec\x79\xd5\x19\xab\
+\xf8\xf2\xf1\x32\xd7\xf3\x48\x17\x13\xa8\xaa\xc6\xaa\x55\xab\x78\
+\xf1\xc5\x17\xf9\xd2\x97\xbe\xc4\xb2\x65\xcb\xa8\xa8\xa8\xe0\xfe\
+\xfb\xef\xa7\xad\xad\x8d\xae\xae\xae\xc0\x3d\xae\xa9\xa9\x39\xa8\
+\xb5\x8b\xc7\xe3\x1f\x0c\x0d\x48\x55\xd5\x69\xe5\xf6\x4c\xb6\xf0\
+\x6f\xa8\x52\x8f\x61\xba\x45\x4c\xa7\xc4\x50\xa6\x97\xbe\x6c\x2c\
+\x80\xeb\x71\xf6\xf9\xde\xd7\x5e\x7b\x2d\x4b\x96\x2c\xa1\xe7\xbe\
+\x04\xae\x6b\x13\x05\xf4\x4a\x2b\x28\x1c\xdd\x59\xe8\xe7\x88\xcf\
+\x38\x54\x84\x35\xa4\xa9\x62\x27\x74\xdc\x11\x03\xab\x3f\x8c\x97\
+\xd5\x10\x9a\x0c\x82\xc6\x6c\x36\xeb\xef\x4c\xd7\x23\xdc\x2d\xd8\
+\xf6\xbb\x1c\xe9\xbd\x0e\x4e\x21\x81\x5d\x90\x38\x45\x89\x94\xa0\
+\xa8\x6a\x50\xb8\x67\x84\x22\x6c\xea\x5a\x45\xb5\x6c\xf6\xf3\x1d\
+\x86\x87\xae\x18\xec\x18\xdd\xc8\xf1\x47\x9f\xc0\x78\xed\x70\x36\
+\xed\x5e\x13\x70\xbd\xda\xda\xda\xe8\xee\xee\xf6\x05\x3f\x86\xd8\
+\x0e\x0c\x0c\x70\xc3\x0d\x37\x30\x3a\x3a\xca\x93\x4f\x3e\x19\x54\
+\x28\xe7\x72\xb9\xe0\x24\x94\x49\xe5\xb5\xb5\xb5\xe5\x62\xa4\xd1\
+\xe1\xe1\xe1\x85\x8d\x8d\x8d\x66\x6f\x6f\xef\xa1\x15\x88\x94\xf2\
+\xb0\x80\x9d\xa8\xb8\xa8\x42\x63\xb4\x38\x40\x53\x74\x2e\x35\x15\
+\x69\xb2\x56\x1a\x5d\x0d\xa3\xa0\x60\x5b\x26\xd2\x11\x38\x8e\xc3\
+\x33\xcf\x3c\xc3\xe8\xe8\x28\x27\x9f\x7c\x32\xbf\xff\xfd\xef\x03\
+\x2c\x6a\xd9\xb2\x65\x81\xc1\xef\x2d\xc5\x59\x34\x7e\x1c\x85\xac\
+\xc7\x71\xd3\x3f\xce\xa6\xc1\x65\x38\x33\x72\x54\xa9\x92\xec\xe6\
+\x0a\x32\xaf\x57\xfb\x86\x58\xf1\x8b\x7a\x16\x2f\x5e\xcc\xec\xd9\
+\xb3\x79\x69\xc9\x4b\x78\x19\x09\x8c\x42\x05\x58\x9a\x85\x88\xf9\
+\x0b\xa8\xeb\x3a\x99\x4c\x06\xc7\x71\xd0\x74\x85\x64\xb7\x83\x5e\
+\x5f\xf4\x93\x55\x38\x78\x9e\xc1\x40\xe8\x55\xc2\xc5\xd3\xc9\xd7\
+\xf6\xb0\xdb\x7a\x19\x5d\x35\xb8\xe8\xa2\x8b\x98\x3d\x7b\x76\xd0\
+\xe5\xc7\xf3\x3c\x86\x86\x86\x98\x3a\x75\x2a\xdf\xf8\xc6\x37\x10\
+\x42\x10\x0a\x85\xde\x35\x07\x53\x2e\x32\xcd\x64\x32\xd4\xd4\xd4\
+\x50\x28\x14\x9c\xd1\xd1\xd1\xed\x1f\x14\x51\x4e\x09\x1a\x98\xa9\
+\x7e\x6e\xb5\x50\xb9\x8d\xb6\xca\xeb\x38\x62\xf1\x09\x5c\xf3\xe4\
+\x05\xb4\x4d\x6c\x06\x01\x96\x65\xe2\x8d\x61\x39\x6f\xbe\xf9\x26\
+\x8d\x8d\x8d\x64\x32\x99\x72\xd3\x64\x86\x87\x87\x0f\xf0\xc0\x84\
+\x10\x94\x6c\x93\x0b\x5a\x6e\x65\xc4\xdb\xc0\x3f\x2f\xb8\x9b\x97\
+\xda\x97\x90\x8e\x6c\xa5\xdd\xde\x15\xf4\x16\x29\x0b\xe4\xf2\xcb\
+\x2f\x27\x97\xcb\x71\xda\x69\xa7\x71\xfb\xed\xb7\x73\xc2\x89\x0b\
+\xe8\xee\xee\xe6\xc8\x23\x8f\xe4\xd1\x47\x1f\x65\xf2\xe4\xc9\x7e\
+\x7b\xc1\x54\x8a\x54\x2a\xc5\xe0\xe0\x20\x95\x95\x51\x32\x99\x0c\
+\xa6\x69\x52\xf0\xfc\x32\x08\x4f\x95\xfc\xf4\x8d\x7f\xe2\xaa\x53\
+\xbf\x8d\xed\x94\x30\x4d\x18\xd7\x54\x4b\x5f\x5f\x5f\xa0\x6a\x35\
+\x4d\xc3\x30\x0c\x7a\x7a\x7a\x10\x9a\x40\xd5\xfc\x66\x01\x39\x33\
+\x43\xa5\x51\xed\x57\x69\x45\x4d\xec\x3c\x63\x88\xf4\x81\xbd\xc5\
+\x3e\x30\xe6\xa2\x10\x82\x44\x22\xe1\xe7\x05\x34\x49\xc9\x8a\x61\
+\xab\x70\xe5\x6f\xcf\xe6\xd1\xaf\x6c\x44\x8b\x58\xdc\xb7\xe9\xdb\
+\x78\x2e\xc4\x87\x92\x41\x50\x74\xeb\xad\xb7\xbe\x23\xdf\xbd\x3f\
+\x1b\xdd\x87\x46\x60\x78\xa0\xc4\xd9\xe7\x9e\xc6\x95\xcf\x5c\xcf\
+\xe2\x19\x17\x33\xa9\x76\x06\x03\xa4\x91\xde\xce\xa0\xb7\x48\xb9\
+\x8e\xbc\xbb\xbb\x9b\x13\x4f\x3c\x91\xdf\xfc\xe6\x37\x01\x15\xb5\
+\xdc\x4c\x40\x4a\x19\xb4\xf7\xd0\x75\xdd\x8f\xac\xc7\x3e\xaf\x6c\
+\x84\x2b\x8a\x1e\xa5\xb8\x47\xcf\xae\x12\xf1\xad\x16\xff\xf0\xdd\
+\xaf\xfb\xf9\x7b\x05\x46\x46\x46\x0e\x70\xf7\xcb\xc5\xa4\x0a\x82\
+\xf8\x94\x0c\xc7\x9e\x59\xc5\xaf\xfe\x76\x25\x67\xde\x39\x85\x67\
+\xae\x58\xc1\xe6\xce\x0e\x9e\xea\xbd\x91\xad\x8f\x8f\x32\xba\xc9\
+\x37\xde\x86\x61\xb0\x7d\xfb\x76\x1a\x1b\x1b\x3f\x38\x81\x94\x17\
+\x58\x51\x14\x34\x4f\xa2\xea\x02\xd7\xf1\x60\x54\x72\xca\xa5\x87\
+\x93\xeb\xf2\xb0\xf2\x12\x33\xe3\x05\x1c\xa5\x62\xb1\x28\xcb\xb5\
+\xea\x6f\x17\xae\x10\x62\xdf\x0e\x32\x7c\x17\x7a\xff\xbf\xdb\x8e\
+\xcd\xae\xec\xc6\x31\xd6\xbc\x15\xb0\x91\x15\x45\xe1\x5b\xdf\xfa\
+\x16\xd1\x68\x34\x20\xc1\x95\xe7\xdf\xbc\x79\x73\x80\x18\xec\xff\
+\x99\xe5\xfa\x12\xc3\x30\xb8\xfa\xea\xab\x59\xbe\x7c\x39\x83\x2f\
+\x0e\xe2\x7a\x1e\x21\xc7\xa6\xa9\x51\xee\x6b\xed\x37\xa6\xa6\xca\
+\xbd\x7c\xcb\xc1\xad\x22\x05\x52\x08\x6a\xea\x74\xe2\x99\x11\xae\
+\x38\xe9\x46\xfa\xb3\xbb\x18\x49\xa4\x38\x7e\xe2\xd9\xbc\x61\xff\
+\x9c\x32\x85\xab\x6c\x53\xde\x0b\xe9\xe1\x7d\x09\x44\x08\xc1\xb4\
+\x69\xd3\x48\xa5\x52\x0c\xdc\x6b\xd2\x63\x9a\x08\x45\xe2\xe7\x6d\
+\xfd\xc0\x24\xa4\x4a\xa4\x22\xcb\xa4\x69\x31\x30\x30\xb0\x6c\x64\
+\x64\xe4\x94\xb7\xcf\x35\x67\xce\x9c\xb8\x69\x9a\xe3\x84\x10\x60\
+\x40\x4d\x4d\x98\x3d\x7d\x7d\x78\x8e\x82\xa6\xe8\x64\xcd\x24\x4d\
+\x91\x36\x76\xba\x71\x4c\xd3\x0e\xba\xef\xd8\xb6\x4d\x34\x1a\x0d\
+\xd2\xb6\xfb\x7b\x72\x65\xb8\xfb\x80\x93\xe8\x82\x65\xfa\xc4\xed\
+\xab\xae\xba\x0a\x21\x04\x0f\x3e\xf8\x20\xdf\xfe\xf6\xb7\xe9\xea\
+\xea\x62\xe6\xcc\x99\x8c\x8c\x8c\x60\xdb\x36\x4d\x4d\x4d\xbc\xf2\
+\xca\x2b\x84\x42\x21\xc6\x8f\x1f\xcf\xba\x75\xeb\xb0\x6d\xdb\xc7\
+\xe6\x3c\xb0\x2c\x70\xa5\xcd\xb5\x2f\x9e\xc7\xff\x3d\xf5\x29\xee\
+\xdd\xfc\xcf\xf4\xa4\xde\x42\x4b\xa8\x94\x0a\x26\x99\x8c\x79\xc0\
+\x26\x78\x2f\x6c\xc6\xf7\x63\xd4\x39\xf2\xc8\x23\xb9\xec\xb2\xcb\
+\x38\xe2\x88\x23\xb8\xf9\xe6\x9b\xe9\xec\xec\xa4\xa6\xa6\x86\x91\
+\x91\x11\x74\xdd\x6f\x2e\x39\x38\x38\x88\xae\xeb\x68\x9a\xc6\xe0\
+\xe0\x20\xe9\x74\xda\xfb\x63\x89\xa3\x52\xa9\xe4\xef\xc8\x2a\xc9\
+\xb8\x71\x95\xfc\x68\xd9\xbf\x70\xd7\xdf\x2d\xe3\x97\x6f\x5c\xcf\
+\x9b\xa9\x2d\x1c\x31\x69\x0e\xae\x37\xc6\x0e\x1c\xb3\x21\x53\xa7\
+\x4e\x0b\xe2\x15\x55\x55\x59\xb1\x62\x05\xcd\xcd\xcd\xef\xea\xeb\
+\xab\x21\x08\xcd\x4d\xd2\xb7\xb2\x48\x21\xe9\xb0\x6b\xd7\x2e\xae\
+\xbc\xf2\x4a\xf6\xee\xdd\x4b\xb1\x58\xa4\xb1\xb1\x91\xca\xca\x4a\
+\x74\x5d\x67\xd9\xb2\x65\xd4\xd5\xd5\xd1\xda\xda\x4a\x4f\x4f\x4f\
+\x50\x4e\x5d\x2c\x16\x83\xb8\xc7\x49\x0b\x92\xfd\x7e\x31\xe9\xbf\
+\x3e\x79\x3e\x15\x46\x98\x6c\xce\x25\xdd\x63\xd2\xb9\x22\x8b\xaa\
+\xa8\x07\x6c\x9a\xb1\xcd\x11\x06\x98\x34\x69\x92\xdd\xdd\xdd\xed\
+\x1e\xb2\x72\x84\xda\xda\xda\x35\x4d\x4d\x4d\xc7\x1d\x2c\xa7\xb6\
+\x3c\x5c\xd7\xa5\xbf\xbf\x7f\xc6\xc8\xc8\xc8\xce\xfd\x7f\x3f\x7d\
+\xfa\xf4\x78\xa9\x54\x1a\xa7\x28\x0a\xc3\x13\x5c\xfe\xf1\x5b\x13\
+\xb1\x2c\x97\x9a\xc2\xb1\x1c\x35\x67\x0a\x4b\x77\xff\x06\x4d\xd3\
+\x58\xf5\x83\x04\xa9\x2e\x5f\x17\x54\x56\x54\xb1\xe8\x96\x2a\x86\
+\xee\x6f\x44\x3a\xbe\x5a\x58\xbb\x76\x2d\xd1\x68\x94\x70\x38\x1c\
+\x30\xef\xcb\x69\x5d\xc7\xb5\x31\xa2\x21\xdc\x92\x0c\x9a\x0b\xec\
+\xcf\x52\xf9\x53\x19\xd2\xe6\xe6\xe6\xfd\xaa\x7a\x64\x90\xb3\xf9\
+\x63\x9b\xb5\xa7\xa7\x87\x6d\xdb\xb6\x21\x84\xa0\xb2\xb2\x32\x28\
+\x8e\x2d\x6f\xbe\xb5\x6b\xd7\x7e\x29\x99\x4c\x3e\x70\x48\x4f\x88\
+\x61\x18\xcc\x98\x31\x03\x80\x7e\x33\xc1\xe4\xb3\xf3\x44\xc2\x1a\
+\xc2\x34\xb0\x87\x42\x38\xc3\x61\x9c\xe1\x03\x1b\x59\x46\x22\x11\
+\xee\xbd\xf7\xde\xf4\xbb\x4d\x59\x26\x97\x85\x73\x50\xca\x78\x0c\
+\x6d\xb1\xe8\xd8\xf3\x0a\xcf\xdf\xb9\x04\xcf\x14\xd8\x79\x0f\xd7\
+\xf4\x8d\xf1\xbe\xbc\xb9\xc0\x76\x1c\xa4\xed\xeb\xfa\x39\x73\xe6\
+\xd0\xda\xda\x4a\x2c\x16\x63\xdb\xb6\x6d\x8c\x8e\x8e\xd2\xd4\xd4\
+\xc4\xd0\xd0\x10\xfd\xfd\xfd\x78\xa6\xaf\xba\x4c\xd3\x0c\xe8\x47\
+\x0a\x02\xc7\x94\xd8\xb2\x84\x42\x08\xcb\x2d\xa1\xab\x1a\x48\x05\
+\x4d\xd5\x28\x95\x8a\x0c\x0d\x0d\x21\x10\xac\x2c\x6d\xe5\x9c\xcb\
+\x62\x28\x52\xe0\x9a\x80\xa5\xfb\xd7\x36\x60\x50\xda\x5d\x81\x97\
+\xf5\xaf\xad\x50\x28\x50\x5b\x5b\x1b\x54\x1b\x47\x8c\x8a\x20\xce\
+\x8a\x46\xa3\x7f\xd6\xe3\x7a\x5f\x02\x29\xe7\xb4\x15\x04\xa3\x5a\
+\x9c\xf9\x2d\x61\x32\xd9\x34\xed\x77\x58\x4c\xac\x99\x82\xeb\x65\
+\x11\x8a\xc0\x72\x1d\x74\x5d\x20\x4d\x0d\x44\x82\xb3\xce\x5c\x3c\
+\x54\xb6\x01\x65\xa3\xd7\xd5\xd5\x45\x28\x14\xe2\xf4\xd3\x4f\x67\
+\xfd\xda\x75\xb4\xdf\xec\x20\x85\x0e\x42\x47\x93\x6e\xd9\xd1\xc6\
+\x88\x2a\x81\x8b\x5c\x66\xa2\x58\xa6\xef\x56\xab\xaa\xca\xc0\xc0\
+\x00\xae\xeb\x52\x59\x59\x49\x26\x93\x09\x58\x1e\x8e\xe3\x10\x0e\
+\x87\x39\xef\xbc\xf3\x48\xa7\xd3\x2c\x5f\xbe\x3c\xc8\x08\x0e\x47\
+\x8b\x9c\x7e\x55\x15\xc7\x1a\x57\xd1\x30\xc5\x64\x51\xeb\x17\xb8\
+\x7f\xc5\x4f\xf9\xf8\x91\x0b\xb9\xf3\xb9\x6f\xd3\xff\x98\x87\xa5\
+\xfa\x0d\xd2\x0a\x58\x18\xba\x42\x23\x47\x72\xfa\x51\xe7\xf0\xe4\
+\xb6\xbb\x50\x9d\x4a\x72\x2d\xbd\x8c\xe4\x25\xa5\xd1\x48\xe0\x31\
+\x1e\x73\xcc\x31\x6c\xdf\xbe\x9d\x7c\xa6\x80\x31\x37\x49\x69\x57\
+\x04\xa1\xec\xf3\x0e\x0f\xa9\x40\xaa\xab\xab\x03\x86\xa0\x82\x00\
+\x4d\x62\x3b\x2e\x7f\x33\xf1\x26\x12\x8d\x77\x05\xbb\x20\xe5\x66\
+\x19\x77\x41\x9c\x71\x0d\x3a\x4e\x1e\xec\xa1\x0a\xdc\x11\x03\x7b\
+\xd0\x40\x16\x55\xdc\xbc\x8a\xa6\x69\x94\x4a\x25\x7e\xf3\x9b\xdf\
+\x00\x70\xc6\x19\x67\xb0\x7c\xf9\x72\x1c\xc7\x21\x1e\x8f\x53\x53\
+\x53\x43\x4f\x4f\x0f\x8b\x16\x2d\x62\x64\x64\x84\x35\x6b\xd6\x10\
+\x8d\x46\xd9\xbb\xa7\x1b\x81\xc0\xb2\x6c\x3c\x9b\x20\x3a\x0e\x87\
+\xc3\xa4\x52\xa9\xe0\x5a\xfb\xfa\xfa\x08\x87\xc3\x58\x96\x45\x22\
+\x91\x60\xca\x94\x29\x81\x6b\x2c\x84\xc0\x0d\xbb\xa8\x8a\xc6\x26\
+\xef\x7e\x2e\x09\xdd\xce\x53\xbb\x7f\xc4\x4e\x6f\x29\x3b\xdf\x78\
+\x0e\x4f\x2a\x7e\x1a\xda\x94\x7e\x4f\x47\x43\x30\x38\x94\xe3\x3b\
+\x17\xdc\xca\xff\x7e\xf6\x0c\xee\xfe\xfc\x12\xf6\xf4\xf7\xf0\x74\
+\xef\xad\x0c\xda\x5d\x81\x0a\xf4\x3c\x8f\x78\x3c\x3e\x86\xe1\x29\
+\x78\x8e\x87\x6b\x9a\x08\x95\x03\x02\xc9\xbf\x98\x4a\x1a\x90\x64\
+\x0d\x23\xd8\x09\x25\xd3\xf4\xdb\x7c\xdb\x06\xe7\x9d\xb8\x98\xbc\
+\x99\x09\xe8\xa1\x23\x4e\x9a\x8a\x50\x08\x33\xab\xb0\x70\xca\xf9\
+\xd4\x4e\xd1\x88\x1e\x95\xa1\xf6\xec\x11\x2a\x4f\x89\x07\xdd\xb1\
+\xcb\x5e\xd0\xc8\xc8\x08\xe1\x70\x18\x45\x51\x98\x33\x67\x0e\x86\
+\x61\x30\x69\xd2\x24\x6c\xdb\x0e\x3a\x44\x9c\x78\xe2\x89\xa4\xd3\
+\xe9\x31\x57\x52\x39\xa0\x4d\xb9\xeb\xba\x41\xcb\xf0\x72\xb3\x9c\
+\x78\x3c\x1e\xd4\x3d\x76\x74\x74\xf0\xec\xb3\xcf\xa2\xaa\x6a\xd0\
+\x81\xa2\x50\x2c\x62\x3b\x16\x28\x36\x77\xb4\x5f\xc6\x70\xb6\x0f\
+\x89\x24\x3f\xe2\xb2\xfe\xde\x38\xae\xb7\xaf\xeb\xb5\xa2\x28\x8c\
+\x0c\x98\xc4\x6a\x42\x28\xaa\x4b\x44\xaf\xa4\xa6\xb2\x86\x78\xae\
+\x2f\x48\x96\x95\x89\x7f\x5d\x5d\x5d\x7e\x73\x4e\x55\x41\xba\xde\
+\x01\x34\xd7\x3f\xe7\x02\xbf\x2f\xb7\xb7\xac\x3a\x04\x7e\xa0\x55\
+\xf6\x2a\xf6\xb5\xff\xb6\x71\x15\x17\x45\x15\x7c\x7a\xd2\x37\xc9\
+\xc8\x5d\x5c\xbf\xe8\x31\x1e\x5d\xfd\x20\xcd\x93\x74\x9e\x58\x71\
+\x5f\x70\x93\xd1\x68\x94\x2b\xaf\xbc\x92\xc9\x93\x27\xd3\xdf\xdf\
+\x8f\xeb\xba\x2c\x5d\xba\x14\xcf\xf3\x68\x6f\x6f\xc7\x71\x9c\x40\
+\x1d\x95\x03\xcb\x90\x66\x04\xf1\x8b\x6b\xf9\x49\xa0\x50\x28\x44\
+\x5d\x5d\x1d\x42\x08\x6a\x6b\x6b\xdf\x76\xc1\x63\x24\x03\x45\x04\
+\xa5\xd0\x9e\xe7\x51\x9d\x51\xe9\x5a\x52\x20\xd7\xed\x62\x65\x3d\
+\xd6\x14\x56\xe2\x14\xc1\xb3\x25\x8a\x2a\x70\x0d\x77\x5f\x5b\x43\
+\x14\x74\x5d\xc1\x19\xe3\x35\x83\xff\xf4\x20\x04\xb8\xae\x87\x69\
+\xfa\xfc\x33\xd7\x71\xa8\x6d\xae\x27\x99\x8f\x13\x8a\x99\x84\x2a\
+\x55\xd2\xb6\xdf\x37\xf2\x60\x4a\x15\xde\x57\xa4\x5e\x5e\x78\x81\
+\xdf\x30\xc0\xf1\x6c\x4a\xa6\x89\xa6\xe8\xfb\x0a\x60\x0c\x0f\x4f\
+\x0a\x5a\xab\x67\xf0\x9b\x3d\xbf\xa0\x2d\x74\x22\xf5\x91\x16\x0c\
+\x25\x83\xf4\x08\x04\x52\x2a\x95\x64\x28\x14\x12\x9d\x9d\x9d\xfb\
+\x47\xef\x52\x08\x21\x5c\xd7\x45\xda\x60\x7b\xde\x98\x43\xa8\x82\
+\x02\x96\x63\x63\x3a\x92\xd1\x91\x04\x72\x8c\x65\x5f\xce\x4c\xe6\
+\xf3\xf9\x75\x1d\x1d\x1d\x0f\xd6\xd7\xd7\xff\x58\xd3\x34\xbf\x0f\
+\x7c\x9d\xc7\xe1\x0b\x2b\xc0\xae\xa2\x32\x57\x45\x75\x75\x35\x97\
+\x5c\x72\x09\xcb\x97\x2f\x67\x78\x70\x18\xc5\xc9\xe1\x86\x5c\x3c\
+\xcd\xc3\x8d\xba\x01\xe4\x51\xde\x78\xca\x58\x43\x9c\xa9\xd3\x6b\
+\xd8\xd1\xb5\x97\xd3\x0f\xfb\x3b\xde\x1c\x5e\x4d\x32\x51\x64\x76\
+\xc3\x09\xbc\xe5\xfc\x01\xcb\xf2\xb3\x86\x85\x7c\x81\x07\x7f\xf9\
+\x30\x3f\x79\xea\xfb\xfc\xcd\x27\x4e\xe5\x67\x8f\xfd\xc4\xcf\x82\
+\xaa\x7c\x30\x27\x44\x4a\xa9\x4a\x29\x65\xa9\x54\x12\x02\x81\xe7\
+\xb9\x54\x44\x15\xfe\xf9\xe1\x8b\x91\x9e\xc0\xb6\x7d\x42\xb6\xa7\
+\xb9\x08\x11\x02\x24\xaa\xe2\x1b\xb3\x91\x54\x9c\x5c\x65\x7f\xa0\
+\x6e\x00\x1a\x1b\x1b\xc5\x1b\x6f\xbc\xf1\x95\x62\xb1\xf8\x10\xe0\
+\x45\xa3\xd1\xeb\xa7\x4d\x9b\xf6\xcd\x64\x32\x89\xa3\x48\xa6\x7f\
+\xa5\x92\xd6\x96\x30\x76\x41\x62\x17\x3d\x52\x9d\x36\x99\x6e\x87\
+\x25\xff\x6c\x07\x5e\xfb\xd8\xb3\xa6\x44\x2c\x16\x43\xd3\xb4\x5d\
+\xf9\x7c\xfe\xce\x96\x96\x96\x1f\x97\x79\x58\x6e\xb5\xa0\xed\xd4\
+\x28\x5a\x58\xf2\xd2\xfa\x7e\x7e\xf6\xfd\x5f\xb1\x77\xef\x5e\x6e\
+\xbf\xfd\x76\x6e\xb8\xe1\x06\x74\x5d\xa7\xbe\xbe\x9e\x62\xb1\xc8\
+\xee\xdd\xbb\x59\xb4\x68\x11\xeb\xd6\xad\x63\xfd\xfa\xf5\xe4\x72\
+\x39\xc4\x98\x47\xa7\xeb\x2a\xdf\x79\xf5\x0b\xdc\x7e\xc1\x0b\x7c\
+\x7f\xcd\x97\xc8\x5a\x09\x14\x5d\x90\xcf\x9a\x64\xb3\x3e\xea\xeb\
+\x58\x2e\x23\x72\x33\x4e\xdd\x56\x96\xed\x4e\x21\x5d\x49\xb1\x54\
+\x44\x28\x3e\x13\xf2\x90\x0b\x64\xd7\xae\x5d\x9f\x6a\x69\x69\x19\
+\x48\xa7\xd3\x7e\x13\xfd\x71\x02\xd3\x89\xe2\xd5\xee\x61\xb4\x90\
+\x25\x22\x6b\x7c\x81\x44\x20\xa4\x84\xe8\x4a\x77\x30\xbf\xfe\x34\
+\x8e\x9e\x3e\x8f\xd7\x77\xbc\xc2\x11\xb1\xa3\x59\xea\x3d\x8f\x65\
+\x39\x41\x8e\x22\x12\x89\xd8\xc5\x62\xb1\x34\xf6\xb3\x13\x0e\x87\
+\x31\x0c\x03\x03\xe8\xff\x95\x43\xbf\x92\x7b\x17\x5a\xab\xbe\x3f\
+\xc5\x55\x64\xb3\xd9\x6d\xbb\x76\xed\xba\x41\xd7\xf5\x37\x01\xb5\
+\x4c\x44\x90\x42\xe2\xb9\x3e\x27\xca\x35\x21\x6a\x84\x79\xfa\xe9\
+\xa7\xb9\xf6\xda\x6b\x79\xe9\xa5\x97\x28\x95\x4a\x44\xa3\x51\xfa\
+\xfb\xfb\x89\xc5\x62\x0c\x0f\x0f\xd3\xd9\xd9\x49\x38\xec\x27\xd7\
+\x4a\xa5\x12\x8a\x50\xb0\x5d\x0f\xc7\xb3\xa9\xab\x37\xb8\xfe\xb5\
+\x4f\xfb\xea\xaf\x4f\x32\xb4\xb9\xc8\x9e\x65\x79\x14\x6d\x8c\x9d\
+\xe8\x29\x24\xf2\x43\xa0\xba\x0c\x15\xf6\xb2\x77\x6d\x9a\x5c\xae\
+\x04\x82\x43\xef\x65\x8d\x31\xef\x06\x03\xd6\x05\x10\xb2\xa0\x98\
+\xf6\x18\x79\xd3\xc4\xca\x7b\xb8\x5e\x0e\xc7\x71\x28\x19\x2e\xb6\
+\x5b\xc1\x92\xa1\x9f\x70\x4e\xe3\xb7\x78\x78\xeb\x2d\xec\x16\x2f\
+\x92\xd8\xbe\x02\x4f\xba\x64\xb3\xd9\x20\x3e\x79\x3b\x95\xa8\xad\
+\xad\x8d\x1b\x6f\xbc\x91\x89\x13\x27\xf2\xcb\x5f\xfe\x92\xae\xae\
+\x2e\xc6\x8f\x1f\xcf\xb6\x6d\xdb\xa8\xaf\xf7\xbb\x33\x74\x75\x75\
+\x61\x18\x06\x91\x48\x84\xae\xae\x2e\x84\x10\x83\x89\x44\xe2\x37\
+\xe5\xb0\xa7\x5c\x60\x34\x61\xc2\x04\xd2\xc3\x69\x5e\xbf\x3e\xe7\
+\xc7\x22\x8a\xca\xcb\x2f\xbf\xcc\x86\x0d\x1b\x82\x16\x1d\xe5\xe8\
+\xbe\xfc\xb5\x9c\xb3\x28\x63\x76\xae\xeb\x52\xdb\xa9\xb1\xe6\xc7\
+\x29\xac\x8c\x87\x53\x92\x38\x79\x89\xf4\x7c\xb7\xa8\xdc\x8b\x45\
+\x51\x14\x8c\x90\xc1\x75\x5f\xf8\x21\x6e\xc1\x8f\x9f\x24\xa0\xee\
+\xc7\x75\x3e\xa4\xd0\xc9\xfe\xf8\x90\xae\xeb\x2c\x5e\xbc\x98\x75\
+\x6b\xd6\xb1\xe9\x66\x0b\x94\x10\x6e\xd1\xc4\x74\x0b\x38\xb6\x43\
+\xa9\x52\xe2\x48\x0b\x43\x53\x79\x76\xe8\x26\x4e\x98\x72\x1a\xf9\
+\x64\x89\x91\xb7\x7a\xd9\xf3\x72\x81\x62\xf1\xdd\x9f\x8a\xe6\xba\
+\x2e\x33\x66\xcc\x20\x1e\x8f\xf3\xc9\x4f\x7e\x92\x19\x33\x66\x90\
+\x4a\xa5\x38\xee\xb8\xe3\x68\x6b\x6b\xa3\xbf\xbf\x9f\x50\x28\x14\
+\xa4\x46\xcb\x4d\x64\xde\x8e\x3a\x94\x69\x3f\xe5\xf4\xf1\xaa\x55\
+\xab\x48\xa5\x52\xbc\xfa\xea\xab\x18\x86\x41\xb1\x58\x0c\xc0\xbf\
+\x72\x92\x69\x2c\x6e\x19\x50\x14\xa5\xcc\x48\x98\xfe\xb9\xcf\x7d\
+\x4e\x39\xf5\xd4\x53\x79\xf8\xe1\x87\xc9\x66\xb3\xe4\xd4\x5c\x60\
+\x43\xcb\x0d\x30\x5d\xd7\x27\x51\x94\x89\xe5\xd5\x4a\x03\x4e\xd8\
+\xc1\x52\x2c\x22\x91\x08\x85\x42\x21\xe8\x6c\x71\x48\xb9\xbd\xfb\
+\x0b\x66\xcd\x9a\x35\x6c\xd8\xb0\x81\x4f\x7d\xea\x53\x6c\xde\xbc\
+\x99\x81\x81\x01\x96\x2e\x5d\x4a\x3e\x9f\xc7\x75\x5c\xa2\x49\x85\
+\xa1\x0d\x16\x85\x3e\x87\xe4\xce\x04\xcf\x75\xdf\x87\xa2\x0b\x14\
+\x15\x14\x6d\x7f\xba\xa6\xfa\x0e\x44\x76\xd5\xaa\x55\x2c\x58\xb0\
+\x80\xdb\x6e\xbb\x8d\xa5\x4b\x97\x22\xa5\xe4\x91\x47\x1e\x21\x9f\
+\xcf\x13\x0e\x87\x83\xee\x0e\xa5\x52\x89\xe5\xcb\x97\xbf\x2b\xd5\
+\xbf\x0c\xb5\x4b\x29\x39\xec\xb0\xc3\x58\xb2\x64\x09\xba\xae\x73\
+\xe2\x89\x27\xb2\x70\xe1\x42\xee\xbd\xf7\x5e\x2a\x2b\x2b\xa9\xaf\
+\xaf\x27\x9f\xcf\xb3\x67\x8f\xdf\x71\x63\xeb\xd6\xad\x57\x27\x12\
+\x89\xc7\x00\x66\xcc\x98\x51\xb8\xe4\x92\x4b\x22\xa3\xa3\xa3\x5c\
+\x7e\xf9\xe5\xdc\x7b\xef\xbd\x9c\x7f\xfe\xf9\xb4\xb7\xb7\x33\x67\
+\xce\x1c\x9e\x7b\xee\x39\x66\xce\x9c\x49\x43\x43\x03\xc9\x64\x92\
+\x55\xab\x56\xd1\xdb\xdb\x1b\xb8\xe7\x1f\xfb\xd8\xc7\x58\xbb\x76\
+\x2d\xbb\x77\xef\xe6\xb0\xc3\x0e\x63\xd7\xae\x5d\x1f\x8c\x40\xca\
+\x5e\x48\x2e\x97\xa3\xa1\xa1\x01\x21\x04\xb3\x66\xcd\xe2\xd5\x57\
+\x5f\xa5\xb1\xb1\x91\xeb\xaf\xbf\x9e\x07\x1f\x7c\x90\xc4\x8e\x04\
+\x8a\x69\x12\x8e\x39\x34\xce\xf6\x4b\xaa\xcb\xcc\xf1\x72\xd3\xe2\
+\x77\xab\x1d\x0f\x87\xc3\xdc\x7c\xf3\xcd\xef\xfa\xd9\x65\x1a\x6b\
+\xb9\x9b\x36\x10\x60\x45\x6f\xbf\xc6\x2b\xae\xb8\x82\x33\xcf\x3c\
+\x93\xe5\xcb\x97\x07\xde\x61\xb9\xe1\x81\x94\x92\xd1\xd1\x51\xf6\
+\xec\xd9\x13\x08\x74\x6c\x9e\xa0\xc2\xa8\xb2\xb2\x52\xbc\xfe\xfa\
+\xeb\x9c\x7b\xee\xb9\xdc\x70\xc3\x0d\x58\x96\xc5\xe6\xcd\x9b\xe9\
+\xea\xea\xa2\xae\xae\x8e\x5c\x2e\xc7\xde\xbd\x7b\xe9\xec\xec\xc4\
+\xb2\x2c\x0a\x85\x02\x52\x4a\x8e\x38\xe2\x08\x1e\x7b\xec\x31\x74\
+\x5d\x27\x1a\x8d\x52\x51\x51\x41\x22\x91\x38\x28\xd4\xf7\x7d\x55\
+\x27\xb6\xb5\xb5\xc9\xa6\xa6\x26\x26\x4f\x9e\xcc\xc0\xc0\x40\xe0\
+\x31\xc5\xe3\x71\x1e\x7c\xf0\x41\xde\x78\xe3\x0d\xbe\xfa\xd5\xaf\
+\x72\xfb\xed\xb7\x33\x38\x38\x48\x24\x12\xa1\xbe\xbe\x9e\x95\x2b\
+\x57\xd2\xdc\xdc\xcc\xae\x5d\xbb\x18\x1d\x1d\xa5\xae\xae\x8e\x81\
+\x81\x01\x76\xef\xde\x7d\x51\x22\x91\xb8\x7f\x6c\x51\x66\x56\x55\
+\x55\xcd\x14\x42\xbc\x97\x4e\x6d\x9e\xeb\xba\x5d\x83\x83\x83\x6f\
+\x96\x6d\xc8\xe1\x87\x1f\x5e\x68\x6e\x6e\x3e\xa0\xcb\xf6\x1f\x2b\
+\x77\xdb\x5f\x0d\x6f\xd8\xb0\xe1\xcb\xc9\x64\xf2\x3e\x80\x13\x4e\
+\x38\xa1\x58\x28\x14\xc2\x65\x0c\x6d\x7f\xd2\xf4\xfe\x5f\xdf\x4e\
+\xa5\x0d\x85\x42\x41\xcc\x54\xee\xef\x55\x6e\x3a\xbd\x65\xcb\x96\
+\x2f\x25\x12\x89\x07\x0e\xb9\xca\xca\x64\x32\x74\x74\x74\x04\x79\
+\xeb\x32\xd7\xf7\xe9\xa7\x9f\xe6\xea\xab\xaf\xe6\xb5\xd7\x5e\x63\
+\xc7\x8e\x1d\x81\x5d\x28\x43\x0a\xa1\x50\x28\xc8\xe2\xbd\xdb\x43\
+\x1c\xb3\xd9\xec\xf6\x6c\x36\xbb\xfd\xfd\x5c\x57\x7d\x7d\x7d\x99\
+\xdd\x61\x0e\x0d\x0d\x2d\xee\xe9\xe9\x79\xaf\x53\xd8\x35\x35\x35\
+\x9b\xcb\x0c\xfe\xe1\xe1\xe1\xe7\xa3\xd1\xa8\x5a\x2c\x16\x8f\x55\
+\x14\x65\x3c\x80\xab\x42\xdd\x14\x8d\xe1\xad\x05\xa4\x2b\x29\xd9\
+\x25\xc2\x5a\x05\x20\xc7\xf0\xbb\x12\x4d\x4d\x4d\x07\x08\x6f\xff\
+\xb6\xeb\x42\x08\xfd\x90\x9f\x90\xfa\xfa\xfa\xdd\xab\x56\xad\x3a\
+\xac\xbd\xbd\x9d\xa3\x8f\x3e\x9a\x27\x9f\x7c\xb2\x8c\xe6\x06\x39\
+\xec\x70\x38\xfc\x0e\xaf\xe2\xdd\x76\xaa\x61\x18\x6c\xdb\xb6\x2d\
+\x38\x21\xff\x2f\x8e\xf1\xe3\xc7\x3f\x1a\x0a\x85\x2e\x04\xc8\x55\
+\x78\x9c\xf1\xcd\x46\x22\x06\xe4\x87\xab\xf8\xfa\x79\xff\xc6\xed\
+\x2b\xaf\x81\x92\xce\xc0\x86\x22\x6f\x3d\x96\xf5\x1f\xb0\xe9\x37\
+\x46\x7b\xa8\xbf\xbf\xff\x8b\xfb\xa9\xc1\xd2\x21\xf5\xb2\xf6\xc3\
+\xb3\xe4\x4d\x37\xdd\xc4\x2d\xb7\xdc\xc2\x4b\x2f\xbd\x44\x6f\x6f\
+\xaf\xff\x28\x87\x74\x1a\x5d\xd7\x83\x27\xcd\x1c\x4c\x72\x3f\x9b\
+\xcd\xfe\xc9\xd6\x1a\xff\x8f\x0c\x25\x70\xf3\x6d\x81\xe7\x49\x4a\
+\x49\x41\x72\x47\x9c\xcb\xbe\x7c\x15\x99\x2e\x2b\xd8\xdb\x46\x24\
+\x14\xe4\xed\x85\x28\x3f\x68\xe3\xe0\x1f\x36\xf9\xbe\x73\xea\xed\
+\xed\xed\x2c\x5e\xbc\x38\x68\x3e\x2c\xa5\xa4\xba\xba\xfa\x8f\x16\
+\x5c\xc6\x62\x31\x76\xee\xdc\x79\x6c\x7f\x7f\xff\x7a\xfe\x9b\x8e\
+\x53\x4e\x39\x85\xae\xae\x2e\xf6\xdc\x99\xc3\x73\x25\x52\x1a\x08\
+\xa9\x53\x5d\x1d\xf1\x0b\x78\xc6\x6c\x46\x39\x3c\xb0\x6d\xfb\x3d\
+\xb7\xbc\x7e\x5f\x02\x31\x4d\xf3\x65\xd7\x75\xb7\x95\xbd\x93\x83\
+\xe9\x10\x94\x4a\xa5\x6c\xcf\xf3\x46\xff\x3b\x0a\x42\x4a\x69\x5e\
+\x72\xc9\x25\x9c\x72\xca\x29\xb4\xb4\xb4\x70\xc7\x1d\x77\x90\x4a\
+\xa5\x68\x68\x68\xa0\xb7\xb7\x97\x9a\x9a\x1a\xda\xda\xda\x58\xb1\
+\x62\x45\x90\xa2\xd8\xb0\x61\x03\xb6\x6d\xaf\xfb\xc0\x05\x52\x5d\
+\x5d\xcd\xf0\xf0\xf0\x65\xc3\xc3\xc3\xfc\xff\x68\xc8\x32\x0e\x15\
+\x0e\xfb\x7d\x80\xcb\x7d\xbd\xa6\x4c\x99\xc2\xe6\xcd\x9b\x99\x30\
+\x61\x02\x53\xa7\x4e\xa5\xa7\xa7\x87\xee\xee\xee\x32\xb9\xc1\xfe\
+\xc0\x05\x72\x28\xdb\x6a\xff\x77\x19\x9a\xa6\x71\xff\xfd\xf7\xf3\
+\xc2\x0b\x2f\x90\xcd\x66\x83\xb8\xa5\x1c\x78\x4a\x29\xe9\xee\xee\
+\x0e\xbe\xf7\x3c\xef\x7d\x37\xe8\xd7\xf8\x68\xfc\xd9\xe1\x38\x4e\
+\xc8\x30\x0c\xd2\xe9\xf4\x01\x1e\xe2\x9f\x8a\x69\xc6\x82\xe7\xf7\
+\xec\xad\x88\x8f\x96\xfb\xcf\x8f\x48\x24\xd2\x54\x2a\x95\xaa\xde\
+\xe3\xba\xba\x75\x75\x75\x83\xa3\xa3\xa3\x85\x8f\x56\xf0\xa3\xf1\
+\xd1\xf8\x68\x7c\x34\x3e\x1a\x1f\x8d\x8f\xc6\x47\xe3\xa3\xf1\xd1\
+\x38\x60\xfc\x7f\xa7\x8c\x4b\xc9\xd0\xc3\x6c\x1c\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x7c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x64\x00\x00\x00\x64\x08\x06\x00\x00\x00\x70\xe2\x95\x54\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
+\x95\x2b\x0e\x1b\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x03\
+\x0e\x1c\x0e\xa7\xa1\x6f\x29\x00\x00\x02\xfc\x49\x44\x41\x54\x78\
+\xda\xed\xd6\xbf\x6f\x1c\x45\x18\xc6\xf1\xef\xcc\xed\xda\xb1\x0f\
+\x9b\x93\x85\x90\x2d\xb0\x38\x12\x09\x77\x6e\xac\x14\x6e\x10\xe0\
+\x8b\x90\x4b\x37\x14\xc8\x7f\x03\xfc\x01\x54\x27\x51\x42\x81\x28\
+\xdd\xd0\x90\x36\x6d\x30\x8e\x70\x2a\x44\x44\x94\x20\x17\xc8\x0e\
+\x06\x64\x90\xec\xe4\x02\xde\xf3\xde\x9e\xf7\xd7\xec\x50\x1c\x39\
+\x89\x32\x52\xae\x58\xf1\x7c\xa4\xed\x76\xa4\x9d\x7d\xe7\x79\xdf\
+\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\
+\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\
+\x11\x79\x31\x4c\x9d\x3e\x76\x71\x71\xf1\x13\x63\x4c\xf8\x9c\xcb\
+\xa6\x80\xcf\x4e\x4f\x4f\xff\x56\x41\x5e\xb0\xf5\xf5\x75\xdf\x6e\
+\xb7\xf1\xde\x53\x51\x51\xbe\xf9\x94\x97\xae\x4c\x53\x3e\x99\xc6\
+\x9d\xcd\x8c\x5e\xb2\x60\xac\x1f\xef\x2c\x8e\x63\xf6\xf6\xf6\x56\
+\xb2\x2c\x3b\xaa\xc3\x1e\x83\xba\x45\x3a\x4d\x53\x0c\x70\x3f\xff\
+\x85\xce\xf5\x19\x1a\xe1\x05\x99\xbb\xa4\x19\x5e\x81\x24\xa0\x3c\
+\x9f\x22\xfb\x75\x86\xe1\xe1\x2c\x00\x65\x59\x62\x8c\xf1\x75\xd9\
+\x9f\xad\x53\x31\xaa\xaa\x22\xcf\x73\xf2\xbc\xc0\x53\x61\x8d\xe1\
+\xaa\x79\x9f\xcf\x3b\x77\x78\xe7\xf5\x0f\x98\xe7\x1a\x8b\x57\x5b\
+\xd8\x57\x32\x8a\xa2\xa0\x28\x0a\x9c\x73\xb5\x3a\x70\xb5\x4a\x88\
+\x73\x8e\x3c\xcf\xc1\x8f\x26\xc3\x60\x90\xf2\xe1\x7b\x1f\xf3\xd1\
+\xad\x1b\x7c\xbd\xfd\x90\x77\x5f\x3b\xe3\x24\x7d\xc0\x17\xf7\x3f\
+\x25\xcf\x73\xbc\xf7\xcf\x12\xa2\x82\x4c\x82\xf7\x9e\x2c\xcb\x30\
+\x18\x98\x82\xe1\xc0\x31\xd7\x6c\x92\x57\x29\x00\x87\x7f\x1e\xf2\
+\x63\x72\x0b\xe3\x2d\x59\x96\x8d\x53\xa5\x82\x4c\xb8\x65\x19\x00\
+\x0f\x73\xf3\x53\x0c\x86\x43\xa6\x1b\xa3\x79\x51\xe1\x29\x5d\x81\
+\xf7\x8c\x92\xf4\xec\xe6\x52\xa3\x82\xd8\x3a\x26\x24\xcb\x72\x2a\
+\x3c\x2f\xcf\x37\xb9\xfd\xf3\x4d\xba\x37\x6e\xf2\xe0\xf4\x2e\xf7\
+\xfe\xf8\x96\xb7\xdf\xd8\xa2\x28\xf3\x7f\xdf\xcb\xd4\xb2\x26\xa9\
+\x28\x0a\xe2\x38\xc6\x1a\x4b\x32\x57\x71\x99\x35\xf9\xc1\x7d\x45\
+\x75\x6f\x8e\x57\xaf\x65\x1c\x97\xdf\xf0\xfb\x4f\x7b\x44\x8f\x13\
+\xce\xcf\x13\xbc\xf7\xcc\xce\xce\x62\xad\x55\x41\x26\x16\x69\x6b\
+\x31\x18\x4c\x05\x8d\x69\x43\xc3\x86\x7c\xf7\xdb\x97\x5c\xdc\x31\
+\x3c\x79\x94\x90\xfe\xe5\x48\x1e\x3b\x8c\x31\xb5\x4a\x46\x6d\x0b\
+\xe2\x9c\x63\x61\x61\x81\xf0\x6c\xc8\xf7\xdd\x0b\x2e\x9f\x56\x18\
+\x03\xc6\x8e\x1e\x6f\x0c\x41\x10\x8c\x67\x4e\x9d\xd2\x51\xcb\x5b\
+\x56\xb7\xdb\x65\x63\x63\x83\xfd\xfd\x7d\x0e\x0e\x0e\xe8\xf5\x7a\
+\x94\x65\x49\x55\x55\x44\x51\x44\xab\xd5\x22\x49\x12\x7a\xbd\x1e\
+\x8d\x46\x83\x7e\xbf\x8f\xf7\xbe\x3e\x1d\xa0\x6e\x33\xa4\xdd\x6e\
+\x73\x72\x72\xc2\xe6\xe6\x26\x51\x14\xb1\xb4\xb4\xc4\xda\xda\x1a\
+\xdb\xdb\xdb\x78\xef\x69\xb5\x5a\xac\xac\xac\xd0\xe9\x74\x28\xcb\
+\x92\x30\x0c\x6b\x95\x90\x5a\x35\xd9\xd5\xd5\x55\xbf\xbc\xbc\xcc\
+\xd6\xd6\x16\xbb\xbb\xbb\xa3\x01\x6f\xed\xf8\xc7\x47\x51\x44\x18\
+\x86\x78\xef\x49\xd3\x14\xe7\x1c\xce\x39\x8e\x8e\x8e\xde\x1a\x0c\
+\x06\x8f\xd4\xb2\x26\xa0\xdf\xef\xb3\xb3\xb3\x33\x9e\x13\xff\x39\
+\x5d\xc6\x50\x14\xc5\x68\x63\x41\x40\x10\x04\x14\x45\xa1\x6b\xef\
+\xa4\x1c\x1f\x1f\x3f\x04\xca\xe7\x59\x13\x86\xe1\x4c\xb3\xd9\x4c\
+\xe3\x38\x46\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\
+\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\x44\
+\x44\x44\x44\xfe\x4f\xfe\x01\xd1\xc0\x51\x25\xbd\x25\x7f\x60\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x3f\xd1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x08\x06\x00\x00\x00\x8e\x11\xf2\xad\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
+\x95\x2b\x0e\x1b\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x03\
+\x0e\x36\x08\x21\xa9\x06\x34\x00\x00\x20\x00\x49\x44\x41\x54\x78\
+\xda\x9c\xbc\x69\x98\x24\x57\x79\xe7\xfb\x3b\xb1\xe6\x9e\x59\x99\
+\x59\x5b\xd7\xd2\x55\x5d\xbd\xaa\x17\x49\x2d\xb5\xf6\xd6\x0e\x12\
+\x12\x18\x8c\x6d\x60\x7c\x19\x6c\x23\x1b\xcc\xb0\x08\xcf\x18\xdb\
+\x63\x3f\x9e\xe5\xde\x67\xbc\x8c\xf1\x78\x7b\xbc\x8c\x3d\x36\xc6\
+\xf6\x18\x06\x63\x1b\x0c\xd8\x80\x05\x5a\x11\x12\xdd\x48\xa8\x5b\
+\xea\x7d\x51\x55\xd7\xbe\xe4\x16\xfb\x7a\xee\x87\xac\xcc\xae\x06\
+\xc6\x73\x9f\x9b\x1f\xba\xb3\x9e\x38\x71\xe2\x8d\x13\x27\x22\xce\
+\xef\xfd\xff\xdf\x14\xef\x7a\xd7\xbb\xa4\xe3\x38\xd4\x6a\x35\x5e\
+\x7f\xfd\x75\x7c\xdf\x67\x61\x61\xc1\xfa\xe8\x47\x3f\x5a\x2c\x97\
+\xcb\x84\x61\xc8\x8b\x2f\xbe\x88\xaa\xaa\x84\x61\x48\x18\x86\x74\
+\x3a\x1d\xd6\xd7\xd7\xa9\xd5\x6a\x9c\x39\x73\x66\x75\x68\x68\xa8\
+\xf8\xfe\xf7\xbf\x3f\x5b\xab\xd5\xf8\xf4\xa7\x3f\xcd\xf0\xf0\x30\
+\x17\x2f\x5e\x64\x68\x68\x88\xf9\xf9\x79\x4c\xd3\xc4\x34\x4d\x4e\
+\x9e\x3c\x19\x25\x49\x12\xfc\xe2\x2f\xfe\x62\x61\x78\x78\x98\x67\
+\x9e\x79\x06\xc7\x71\xb8\x72\xe5\x0a\x83\x83\x83\x34\x1a\x0d\x86\
+\x87\x87\xd9\xd8\xd8\x60\x6e\x6e\x0e\xdb\xb6\x3b\xb7\xdf\x7e\xbb\
+\x78\xc3\x1b\xde\x50\xac\xd7\xeb\x3c\xf3\xcc\x33\xac\xac\xac\x90\
+\xa6\x29\x8e\xe3\x50\x2a\x95\xb8\x7c\xf9\x32\x51\x14\xe1\xba\x2e\
+\xf3\xf3\xf3\xb3\xef\x79\xcf\x7b\xb6\x3f\xf0\xc0\x03\x7c\xe9\x4b\
+\x5f\xe2\xca\x95\x2b\x14\x0a\x05\x82\x20\x20\x8a\x22\x66\x67\x67\
+\xa9\x56\xab\x34\x9b\x4d\x2e\x5d\xba\x74\xee\xae\xbb\xee\xda\xf9\
+\xb3\x3f\xfb\xb3\xca\x73\xcf\x3d\xc7\x4b\x2f\xbd\xc4\xf4\xf4\x34\
+\x97\x2f\x5f\x46\xd3\x34\x6c\xdb\x66\x72\x72\x92\x73\xe7\xce\xb1\
+\xb8\xb8\xb8\xb4\xb2\xb2\xb2\xfc\xeb\xbf\xfe\xeb\x37\x66\xb3\x59\
+\x4e\x9c\x38\xc1\xfa\xfa\x3a\xb6\x6d\xa3\x0c\x0d\x0d\x91\xcb\xe5\
+\x10\x42\x30\x39\x39\x89\xa6\x69\x08\x21\xc8\xe7\xf3\xfc\xc8\x8f\
+\xfc\x08\x83\x83\x83\x54\xab\x55\xa6\xa6\xa6\xd8\xb1\x63\x07\xc5\
+\x62\x91\x52\xa9\x84\xae\xeb\x8c\x8d\x8d\x01\x10\x86\x21\x0f\x3c\
+\xf0\x00\xd7\x5f\x7f\x3d\xa6\x69\x32\x35\x35\xc5\xe0\xe0\x20\xdb\
+\xb7\x6f\xa7\x5e\xaf\x63\x9a\x26\xfb\xf7\xef\x47\x08\x81\xef\xfb\
+\xec\xdf\xbf\xbf\xbf\x6d\x6c\x6c\x8c\x52\xa9\xc4\xbe\x7d\xfb\xc8\
+\xe7\xf3\x14\x0a\x05\x76\xee\xdc\x49\xa1\x50\x40\x55\x55\x56\x57\
+\x57\xb9\xfd\xf6\xdb\x29\x95\x4a\xa4\x69\x4a\x26\x93\xa1\x54\x2a\
+\x11\x04\x01\xba\xae\x23\x84\xa0\x5e\xaf\xa3\x69\x1a\x52\x4a\xf6\
+\xee\xdd\xcb\x7d\xf7\xdd\x47\xb1\x58\x64\x70\x70\x90\xe9\xe9\x69\
+\x06\x06\x06\x98\x9c\x9c\xc4\x30\x0c\x86\x87\x87\xc9\xe5\x72\x00\
+\x68\x9a\xc6\xbe\x7d\xfb\x30\x0c\x83\x5c\x2e\xd7\xdf\x5e\x28\x14\
+\x30\x0c\x83\x28\x8a\x28\x16\x8b\xa8\xaa\x8a\x10\x82\xc1\xc1\x41\
+\x6e\xbe\xf9\x66\xc6\xc6\xc6\xd8\xbb\x77\x6f\x77\xdc\x0e\x1f\x3e\
+\x2c\x01\xa4\x94\xfd\x00\x3b\x9d\x8e\x95\xcf\xe7\x8b\x99\x4c\x06\
+\xd7\x75\x11\x42\x20\xa5\xa4\xf7\x91\x52\x22\x84\x40\x08\x41\xa7\
+\xd3\x59\x1d\x1c\x1c\x2c\xa6\x69\x9a\x05\x88\xa2\xa8\xbf\x3d\x4d\
+\xd3\xfe\xbe\x52\x4a\xe2\x38\x8e\xa2\x28\x0a\xf2\xf9\x7c\xa1\x58\
+\x2c\x62\xdb\xf6\xf7\xf4\xbb\xf5\x7f\x4d\xd3\x3a\xed\x76\x5b\x94\
+\x4a\xa5\x62\x92\x24\x28\x8a\x72\xcd\xf1\xb7\xf6\x5f\xad\x56\x79\
+\xed\xb5\xd7\x66\xaf\xbb\xee\xba\xed\x8e\xe3\x90\xa6\x69\xff\x9c\
+\x7a\x6d\x7a\xfb\xe8\xba\xce\xec\xec\xec\xb9\x3d\x7b\xf6\xec\x6c\
+\xb7\xdb\x8a\xa6\x69\xd7\x1c\x77\xeb\x47\x4a\x89\xa2\x28\x4b\x6b\
+\x6b\x6b\xcb\x43\x43\x43\x37\x9a\xa6\x89\xef\xfb\x08\x21\xba\x31\
+\xa6\x89\x6c\x08\x01\x08\x50\x14\x05\xcf\xf3\x52\xcb\xb2\x2e\x67\
+\xb3\x59\xdd\xb6\x6d\x04\x82\x34\x95\x80\x40\x08\x09\x9b\x6d\x7b\
+\x07\x8b\xe3\x78\xa5\xd3\xe9\xec\xd1\x34\xad\x24\x10\x9b\x07\xdd\
+\xfc\x47\x00\x9b\xfb\x6c\x1e\x30\xf4\x3c\x6f\x31\x93\xc9\x28\xed\
+\x76\x1b\x05\xe5\xfb\xf6\xdd\x0b\xae\xd3\xe9\x34\x92\x24\xd1\xd3\
+\x34\x2d\x0a\x04\x71\x9c\x76\x8f\x20\x05\x42\xa4\xdd\x38\xe8\xc6\
+\xb1\xbe\xbe\x1e\x03\x8d\x76\xbb\x5d\x4d\xd3\x34\x12\x88\xee\x96\
+\x14\xa4\x90\x88\xcd\xb6\x42\x08\x92\x24\x51\x84\x10\xad\x8d\x8d\
+\x8d\xbf\x35\x0c\xc3\x90\x69\x4a\x9a\x00\xdd\x50\xba\x31\x28\xb2\
+\x7b\x0a\x42\x08\xd7\x75\x97\xc2\x30\x2c\x48\x29\x35\xcf\x75\x13\
+\xa4\x42\x2a\x53\x40\xa0\xed\xb9\x7b\xb4\x9a\xac\x99\xc8\x50\x41\
+\x28\x82\x28\x8a\x08\xc3\x30\xbb\x6d\xdb\xb6\x7c\x1c\xc7\xc4\x15\
+\x87\xc2\x64\x44\xe2\x81\x6c\xe6\x88\x1b\x3a\x32\x50\x51\x0c\x89\
+\xa2\x28\x44\x51\xb4\x32\x33\x33\x53\x52\x55\x35\x1b\x11\x11\x4f\
+\x34\xa9\xd6\x35\x22\x4f\x22\x5a\x05\xa2\x0d\x1d\x02\x15\xa1\x82\
+\xeb\xba\xe1\xdc\xdc\x5c\x6e\x64\x64\xa4\xa4\x28\x0a\x6b\xe6\x3a\
+\x3b\xae\xd3\x08\xda\x02\xd9\xca\x10\x37\x0d\x64\xa0\xa0\x18\xdd\
+\x19\xdb\x6a\xb5\xbc\x34\x4d\xe3\xed\xdb\xb7\x17\x9d\xc8\xa3\x7c\
+\xd8\x41\x20\x49\x5c\x05\xda\x39\xa2\x75\x1d\x22\x05\x54\x89\xa1\
+\x1b\xac\xac\xac\xfc\xf3\xae\x5d\xbb\x8a\x32\x96\xac\x15\x97\x99\
+\xdc\xab\x13\x78\x09\x58\x19\xd2\xa6\x49\xdc\xd2\x11\x0a\x18\x86\
+\x4e\xa7\xd3\xb9\x65\x64\x64\xe4\xfa\x8c\x99\x31\x37\x42\x8b\xa1\
+\xeb\x43\x14\x14\xe2\xa6\x4e\xda\xcc\x90\xb6\x55\x84\x01\x42\x01\
+\xcb\xb2\x08\x82\xe0\x89\xd1\xd1\xd1\x83\x41\x18\x11\x8d\xb6\xa9\
+\x8d\x2a\x44\x36\x68\xf9\xbb\x56\x21\x51\x69\x7f\xad\x4a\xb8\x6a\
+\x20\x14\xd0\x34\x2d\xcd\x66\xb3\xd8\x9e\x8b\x32\x1d\x92\xbf\xa9\
+\xc3\x9e\xea\x11\x4e\x2f\x1e\xc3\x4c\xf3\xd0\xc9\xd1\xfc\xe7\x01\
+\x54\x55\x45\xd3\x34\xd1\xbb\x75\x6d\xcd\xc1\xd8\xb5\xc1\xd4\xae\
+\x03\x8c\x57\xb7\xf3\xe4\xe9\xcf\x53\xd2\xca\xd8\x4f\xd7\x09\x16\
+\x75\xa2\x28\x12\x9a\xa6\x29\xa6\x69\x22\x84\xc0\x38\xe0\x33\x70\
+\xab\xc6\xb6\xdc\x1e\x2e\x2f\x9f\x45\xa4\x90\xce\xd6\xb0\x5e\xce\
+\x23\x63\xc8\xe5\x72\x51\xa7\xd3\x11\x69\x9c\xb2\x21\x5b\x6c\x3b\
+\xec\x30\x6a\xec\x43\xd3\x53\xe6\xd6\x2e\x10\x77\x34\xdc\x63\x55\
+\xfc\x05\x0d\xd3\x30\x91\x52\x66\xd2\x34\x45\x06\x12\x6b\xef\x2a\
+\xc5\x43\x75\x0e\x97\x8f\x70\x6e\xfd\x18\xad\xe6\x32\xb9\x76\x85\
+\xc6\xd7\x4a\x28\x8a\xe8\x3d\xe7\x43\x53\xd5\xcd\x97\xc3\x59\x0e\
+\xdf\x5f\x24\x8d\x15\x0a\x6a\x9e\xc5\x8d\xd7\xc9\xca\x2a\xd6\xf3\
+\x65\xc2\x15\x83\x5c\x2e\x01\x28\x9b\xa6\x49\x33\x08\x98\xba\x1b\
+\xcc\x41\x9b\x1d\x85\x9b\x50\x7e\x74\xdf\xaf\x70\xc3\x8e\x3b\x89\
+\x65\x80\xe7\xf9\x04\x41\x80\x94\x12\xdf\xf7\xf1\x83\x80\x50\xba\
+\xdc\x51\xf9\x71\xee\xdb\xfe\x4e\x7e\xe5\xc1\x2f\x71\xf3\xe4\x0f\
+\x50\x1b\xeb\x3e\xc4\x83\x20\x20\x49\x12\xc2\x30\xc4\xf7\x7d\xa2\
+\x24\xa4\xb1\x16\xf2\x8e\xeb\xfe\x1d\x39\x6f\x86\xf7\xdf\xfc\x9b\
+\xbc\xe7\x9e\x9f\x21\x90\x6e\xbf\x7d\x9a\xa6\x5b\xf6\x8d\x79\x74\
+\xfb\x87\xd9\xad\x3f\xcc\x8f\xdd\xf2\x4b\xdc\xbf\xe3\x31\x44\xd1\
+\x27\x08\x7c\x7c\xdf\x27\x8e\x63\xa2\x38\xc2\x73\x5d\xa2\x24\x66\
+\xbc\xb0\x9b\xa3\xa3\xef\xe4\x07\xa7\x7e\x81\x01\xef\x76\xee\xbf\
+\xe1\xcd\xb8\x49\x1b\xdf\xf3\x89\xa2\x08\x00\x3f\xf0\x71\x5d\x17\
+\x5d\xd3\x98\xd2\x6f\xe7\x81\xf1\x9f\xe0\x86\xf2\xdb\xf9\xaf\x6f\
+\xf9\x12\xb2\xe0\xe1\xfb\x3e\x9e\xeb\x91\xa6\x69\x37\x6e\x2f\x20\
+\x11\x09\xae\x1b\xf0\xa1\x83\x7f\xc2\x1b\x76\xbd\x9b\x8f\xde\xfe\
+\xe7\x4c\x4c\x8f\x12\xe2\xe1\x7b\x3e\x61\x18\xf6\xc7\x24\x08\x03\
+\xa4\xf0\xb9\x5d\x7b\x9c\x5b\x27\xde\x80\xa2\xc4\x3a\x6e\xe0\x10\
+\x04\x11\xbe\xe7\xf5\x1b\x7b\x9e\xd7\x7d\xfd\x27\x01\xfb\x87\x6e\
+\xe3\xb3\xaf\xfd\x2e\xf3\x4b\xeb\x1c\x1c\xb9\x15\x05\xa5\x3b\xc0\
+\xbe\x4f\x92\x24\x44\x51\x84\xe7\x79\x84\x41\xc8\x80\x3e\xc1\xb2\
+\x35\xcb\x8b\xb3\x4f\x70\xc7\xf4\x43\x78\x91\x43\x14\x84\xfd\xfe\
+\x92\x24\xe9\xef\x6b\xaa\x79\x06\x72\x75\x9e\x5f\xfa\x1b\x6e\xa8\
+\xbf\x81\x5a\x6e\x84\x92\x5e\xc7\xf3\xaf\x0e\x60\x12\x27\x78\xbe\
+\x4f\x1c\x45\xe4\xf4\x02\x4a\xc6\xe5\x5b\xe7\xbe\x85\x48\x55\x6c\
+\xbf\x49\x1c\x26\x78\x7e\x77\x60\x00\x02\x3f\xc0\x75\x3d\x34\x55\
+\xc5\x69\x09\xbe\x7e\xfe\xf3\x28\x71\x9e\x6a\xa5\x40\x92\x24\x78\
+\x9e\x87\xe7\x79\xf4\xee\x1a\xcf\x73\x51\x15\xc1\xc5\xb3\x16\x03\
+\x43\x2a\x1b\xce\x32\xd7\x4f\xde\x4c\x35\x33\x46\x10\x76\xe3\x88\
+\xa2\xa8\x7b\xe1\x37\xbf\xb7\x3a\x1e\x3f\xf5\xc8\x63\xfc\xd3\xf9\
+\x4f\xa0\x24\x32\x25\xa3\x94\x88\xe2\x88\x20\x08\xfa\x03\xd8\x9b\
+\x25\x0a\x2a\x7e\xe2\x50\xcf\x8e\x33\x50\xa8\x32\xb7\x3e\x8b\x84\
+\xef\x19\xc0\x30\x0c\x89\x93\x18\x3f\xb1\x19\x2c\x6c\x43\x13\x59\
+\x5a\xde\x1a\x59\x2d\x47\x14\xc7\x84\x61\x78\x35\x90\x20\xc0\xf7\
+\x7d\x24\x29\x0a\x1a\x9e\x03\xa9\xea\xd1\x72\xdb\xac\xdb\x2b\x84\
+\x9b\xdb\x93\x24\x21\x8e\xe3\xcd\x81\x4f\x49\x64\x42\x1a\x19\xcc\
+\x8c\xee\xa2\xe3\xd8\x94\x33\x43\x84\x71\xd0\x8f\x15\x20\x08\x43\
+\x7c\xdf\x43\x51\x14\xf2\x45\x9d\xbd\x43\x37\x62\xf9\x4d\x32\x4a\
+\x09\x4d\x18\xdd\xb6\x61\xf7\x2e\x8b\xa2\x08\xcf\xf7\x91\x52\x50\
+\x19\x30\x49\x02\x1d\x29\x05\x48\x85\x86\xbb\x4c\x12\xa7\xfd\x01\
+\x94\x52\xe2\xf9\x3e\x61\x14\x62\xe8\x1a\x73\xcb\xcb\x18\x4a\x16\
+\xed\x58\xfb\xd3\x78\x4a\x03\xdf\xf3\xb0\xec\x88\x6c\x9a\x41\x4a\
+\x89\xe3\x38\xf8\x71\x44\x11\x83\x2f\xbf\xfe\x47\xbc\xf7\xd0\xaf\
+\x72\xb2\xf3\x0f\x5c\x72\x4f\x10\x8b\x00\xc7\x71\x50\x55\xb5\x3f\
+\x78\xae\xeb\x92\x1a\x30\x52\x57\xf8\xc6\x99\xe7\xf8\xf9\x47\xff\
+\x1f\x7e\xeb\x9b\x1f\x64\x7c\x74\x9c\x34\x49\x71\x9c\xcd\x19\xb5\
+\x39\x0b\xa4\x94\x0c\x68\x82\xa7\x2e\xfd\x1d\x3f\xff\xc6\xdf\xe4\
+\x53\xaf\xfd\x1a\x96\xef\x50\xca\x54\x70\xdd\x79\xe2\x40\x62\x18\
+\x06\x61\x18\x62\x5b\x16\xbe\x1e\xb3\x64\x5f\x62\x89\x45\xf6\x6f\
+\xaf\x21\x07\x2f\x70\xa9\xd1\x5d\x20\x5b\x96\x8f\x61\xea\x00\xb8\
+\x8e\x83\xdb\x71\xd1\x52\x9d\xa5\xe8\x3b\xdc\x9b\x7d\x2b\x51\x71\
+\x8e\x8f\x3f\xfd\x41\x14\x15\x6c\xdb\x46\xd3\xf4\xab\x93\xc4\xf1\
+\x89\xf2\x31\xdb\xb7\x0f\xf2\xd4\xa9\xaf\x32\xb3\x7d\x86\xdf\x7b\
+\xf1\x71\x32\x46\x86\x30\x0e\xb0\xed\x18\xdd\xd4\x48\xd3\x14\x77\
+\x73\x4c\xca\xf9\x22\xbf\xf5\xcc\xe3\x7c\xec\xc1\x3f\x40\x5b\x5c\
+\x9b\xa5\xd1\x59\x63\xf9\x6c\x9b\xc8\x4d\x91\xa4\xa4\x69\x4a\xab\
+\xd5\x22\x48\x22\x8a\x41\x1e\x57\x5b\xe4\xf7\xbe\xf5\x38\x8f\x5e\
+\xff\xc3\x9c\x5d\x3d\xc6\xea\x0b\x92\x76\xdb\x46\x51\x14\xd2\x34\
+\xc5\xb6\x6d\xda\xed\x36\x52\x15\x08\xa5\xc2\xf3\x8d\x4f\x30\x3e\
+\x37\xca\x6a\x67\x8e\xc5\xd5\x39\x16\xce\x34\xf1\xda\x49\x7f\x0d\
+\x16\x86\x21\x69\x9a\x52\x48\xf2\xcc\x06\xdf\xe2\xd9\x85\xcf\x62\
+\xf9\x4d\x4e\x2f\xbc\xc2\xec\x31\x9f\x8d\x15\x07\x04\x94\x4a\xa5\
+\x2e\xf9\x44\x29\x41\x26\x25\x51\x4a\x3c\xb3\xfa\x57\xb4\xd3\xa3\
+\xf8\x9e\xc5\x4b\x17\x4f\xb0\x72\xda\xc1\x77\x62\x32\x59\x13\xe8\
+\x0e\x90\x6d\xd9\x14\x92\x02\x8e\x58\xe5\x8b\xb3\xbf\x8d\x65\x59\
+\x2c\xaf\x2d\xb0\xf2\x4a\x40\xbb\x61\x61\x64\xb5\xfe\x24\xb1\x1a\
+\x6d\x9c\xa2\x24\x91\x15\xbe\xd5\xfc\x14\xcb\xfe\x8d\x5c\x6e\xbd\
+\x8c\xe3\xb8\x5c\xfa\x66\x03\x99\xa6\xe4\x92\x1c\x69\x9a\xd2\x68\
+\x34\xe9\xc8\x84\x30\x32\x71\x33\x97\xf9\x95\xaf\x7c\x04\x31\x3d\
+\xb1\x53\x0a\x04\x66\x5e\x23\x8c\x42\xb2\xd9\x2c\x51\x14\x59\x69\
+\x9a\x16\x6b\xd5\x3a\x72\xac\x43\x69\x58\x67\xe5\x3b\x1e\xeb\x17\
+\x5d\x4c\xc3\x44\xa8\xa0\x1a\xdd\x37\x59\x10\x04\xab\x03\x03\x03\
+\x45\x45\x51\xb2\x52\x4f\x29\xdd\x2c\x89\x97\x52\x16\x5e\xe9\x80\
+\xa7\x21\x14\x81\x6a\x76\xd7\x60\x69\x9a\x46\x42\x88\xc0\x30\x8c\
+\x42\xa5\x52\x41\xee\xb1\x28\x19\x3a\x57\x8e\x5b\x38\x4b\x09\x9a\
+\xa6\x81\x2a\x51\x75\x41\x92\x24\x14\x0a\x85\x4e\xb3\xd9\x14\x3b\
+\x67\x76\x16\x1b\x9d\x06\xa3\x37\x1b\xcc\xbf\x68\x63\x37\x42\x34\
+\x45\x43\x92\xa2\x67\x54\xe2\x24\xa6\x52\xa9\x30\x3b\x3b\xfb\xec\
+\xce\x9d\x3b\x8f\x2a\xa8\x24\x43\x16\x6a\x2a\x58\x7e\xd5\x21\x8d\
+\x25\xaa\xa2\x22\x34\x50\xba\x6b\x66\xc2\x30\xa4\x5c\x2e\x5b\x02\
+\x51\x6c\xe2\x73\xe3\x5b\x0a\x2c\x1c\x77\x59\x3f\xe7\x21\x43\x15\
+\x64\x8a\x96\xed\x4e\x10\xc3\x30\xe8\x74\x3a\xc7\xf2\xf9\xfc\x11\
+\x33\x5b\x64\xfb\x23\x12\x67\x21\x61\xfd\x9c\x8f\x76\xc7\xdd\xb7\
+\xd2\x6c\x36\x19\x1d\x1d\xe5\xc2\x85\x0b\x78\x9e\xc7\xca\xca\x0a\
+\x3f\xf6\x63\x3f\xc6\xbe\x7d\x7b\x99\xbb\x3c\xcf\xcb\x2f\xbf\x42\
+\x7d\xbb\x24\x9d\xec\xbe\x00\x3c\xcf\xa3\xd1\x68\x50\x2c\x16\xb9\
+\x74\xe9\x12\x9a\xa6\xf1\xd3\x3f\xfd\xd3\x0c\x54\x06\xf8\xab\x4f\
+\xfe\x35\x95\x6a\x85\xf2\x9e\x25\x6a\xb5\x1a\x0b\x0b\x0b\x18\x86\
+\x81\xa2\x28\x5c\xb8\x70\x81\x30\x0c\xf9\xc0\x07\x3e\xc0\xc1\x83\
+\x07\xf9\xe4\x9f\xfe\x05\xaa\xd4\x30\x46\x97\x19\xbc\xbe\xce\xc6\
+\xc6\x06\x03\x03\x03\x34\x9b\x4d\x16\x16\x16\x08\x82\x80\x3b\xef\
+\xbc\x93\xc7\x1e\x7b\x8c\x30\x0c\x79\xe6\xc9\xe7\x18\xbd\x71\x19\
+\x55\x53\xe9\x74\x3a\x14\x0a\x05\x16\x16\x16\x70\x5d\x97\x24\x49\
+\x50\x55\x95\x87\x1e\x7a\x88\xb7\xbf\xfd\xed\x7c\xe1\x73\x5f\xe4\
+\x95\x13\x27\x98\xbe\x53\x23\x9f\xcf\xb3\xb0\xb0\x80\xe3\x38\x64\
+\xb3\x59\x9a\xcd\x26\xcb\xcb\xcb\x54\xab\x55\x3e\xf2\xf8\x47\xb8\
+\x7c\xf1\x12\xcf\x3e\xf5\x4d\xf6\x0c\x64\xd9\x7d\x5b\xca\xfa\xc6\
+\x3a\x85\x42\x01\x21\x04\x4b\x4b\x4b\x58\x96\x45\x92\x24\x7c\xe0\
+\x03\x1f\x60\x6a\x6a\x3b\x4f\x7f\xed\x1b\x34\xd3\x06\x83\x13\x2e\
+\xda\xe0\xe0\x20\x8e\xe3\x60\x18\x06\x53\x53\x53\x9c\x3b\x77\x8e\
+\x24\x49\x98\x99\x99\xe1\xe8\xd1\xbb\x39\x55\x3b\xc5\x5a\x63\x95\
+\xc1\xc1\x41\x14\x45\xe1\x95\x57\x5e\x61\x74\x74\x14\x80\xe1\xe1\
+\x61\x2e\x5d\xba\x44\x9a\xa6\xdc\x76\xdb\x6d\x64\xb3\x59\xbe\xfc\
+\x95\x2f\x73\xfd\xf5\xd7\x73\xe6\x4c\x16\xc3\x30\xfa\x57\xfb\xc0\
+\x81\x03\x5c\xbc\x78\x11\x80\xc3\x87\x0f\x33\x3e\x3e\xce\x2d\x77\
+\x1c\x61\x65\x65\x05\x2f\xb2\xd9\xb1\x63\x07\x69\x9a\x32\x34\x34\
+\xc4\xae\x5d\xbb\xf8\xca\x57\xbe\xd2\x9b\x25\x94\x4a\x25\x86\x86\
+\x86\x78\xf5\xd5\x57\x11\x9a\x24\x9f\xcf\x73\xfc\xf8\x71\xc6\xc6\
+\xc6\x68\x36\x9b\xe4\xf3\x79\xd6\xd6\xd6\x10\x42\x50\x2a\x95\xd8\
+\xbd\x7b\x37\x03\xf5\x0a\x95\x6a\x89\x72\xb9\x8c\x94\x92\x5a\xad\
+\x86\x65\x59\x0c\x0d\x0d\x11\x04\x01\x42\x08\x0a\x85\x02\x37\x5c\
+\x7f\x03\x19\x33\xc3\x99\xb3\x67\xd9\xbb\x77\x2f\x6b\x6b\x6b\x20\
+\xa0\x50\x28\x30\x3a\x3a\x4a\x36\x9b\xe5\xe4\xc9\x93\x00\xdc\x71\
+\xc7\x1d\x94\x4a\x25\x3a\x1d\x0b\xcf\xf3\x38\x79\xf2\x24\xe2\xc6\
+\x1b\x6f\xec\x03\x60\x8f\x85\xdb\xed\xb6\x55\x2a\x95\x8a\x41\x10\
+\xf4\xf9\xf3\xfb\x7d\x14\x45\xa1\xd3\xe9\xac\x0e\x0d\x0d\x15\x1d\
+\xc7\xc9\xf6\x10\xec\x7f\xf7\x89\xe3\x38\x0a\xc3\x30\xc8\xe7\xf3\
+\x85\xef\xc7\x9d\xdf\xcd\xda\x8a\xa2\x74\x3a\x9d\x8e\x28\x95\x4a\
+\xc5\xff\x53\xfb\x72\xb9\xcc\xa9\x53\xa7\x9e\xdd\xb9\x73\xe7\x51\
+\xcf\xf3\xf8\xdf\xc5\x22\xa5\x44\xd3\x34\x36\x36\x36\x18\x1c\x1c\
+\xb4\x82\x20\x28\xfe\x4b\x71\xf7\x62\x59\x5b\x5b\x3b\x36\x34\x34\
+\x74\xa4\xc7\xd6\xbd\x8f\xb6\x35\xae\x4d\x16\xc6\xb2\xac\x20\x9f\
+\xcf\x67\x15\x45\x91\x48\x90\x89\xd8\xc2\xb4\x9b\x8d\x05\xa4\x69\
+\x2a\xe2\x38\x8e\x3b\x9d\x0e\x3d\x20\x47\x0a\x64\x17\x53\x41\x91\
+\xfd\xb6\x9b\xc1\x48\xdf\xf7\xe3\x4c\x26\x13\x2b\x8a\x22\x85\x14\
+\x5d\x06\x15\x12\x94\xcd\x66\x5b\x58\xd8\xb2\x2c\xdf\xf7\xfd\x0d\
+\x21\x44\x19\x90\x24\xa2\xcb\xd9\xca\xb5\xb1\x48\x29\x85\xe7\x79\
+\x91\x94\x72\x61\x63\x63\x63\x5d\x4a\x19\x90\x8a\x2e\x27\xa7\x02\
+\x94\x2e\x0b\x6f\xc6\x21\x36\x9f\xdd\x0d\xcb\xb2\xb6\x9b\xa6\x19\
+\x0b\x90\x69\xb2\xd9\xd9\x26\x37\xb3\x25\x96\x20\x08\x94\x24\xe9\
+\x36\x50\xc4\x26\xbf\xcb\xcd\x64\xc2\xf8\xae\x21\xa4\xa7\x76\x0f\
+\xd4\x1d\x14\x96\x96\x96\x2e\xed\xd8\xb1\xe3\x80\xe7\x7a\x69\x98\
+\x73\xc9\xef\x08\x10\xae\x46\xd2\x36\x49\x2d\x1d\x19\x75\x77\x56\
+\x55\x55\x00\x72\x78\x78\x58\x64\x32\x19\x02\x11\xc2\x74\x8b\x52\
+\x41\x25\xee\xe8\xd0\xce\x90\x5a\x1a\x32\x51\x40\x82\xe7\x79\x72\
+\x71\x71\x31\x1a\x1b\x1b\x0b\x14\x45\x91\x8d\xcc\x06\x63\xbb\x35\
+\xa2\xa6\x86\x6c\x9b\x24\x8e\x0a\x49\xff\xea\x8a\x76\xbb\x1d\x04\
+\x41\x30\x36\x39\x31\x59\xf2\x93\x10\x75\x47\x9b\xac\xae\x93\x34\
+\x0d\x12\x4b\x47\x06\xdd\x7e\x01\x4c\xd3\xe4\xc9\x27\x9f\xbc\x70\
+\xe8\xd0\xa1\xba\x8c\x25\xab\xb9\x65\xb6\x1f\xd0\x08\xda\x20\xdb\
+\x19\x92\x8e\x01\xbe\x8a\x4c\xc1\x30\x0c\x8e\x1f\x3f\xbe\x6d\x62\
+\x62\x62\xde\x34\x4c\xa5\x15\xda\x72\xe0\x90\x8f\x96\xea\xc4\x0d\
+\x9d\xb4\xd3\x65\xf2\x6e\x92\x03\x61\x59\x56\x9c\x24\xc9\xc4\xf4\
+\xf4\x34\x96\xef\x93\xd9\x63\x51\xa8\x28\x04\x9d\x14\xad\xfe\x03\
+\x1b\xe8\x8a\x49\xf3\xc9\x2e\xf7\x19\x86\x40\x55\xd5\x01\xd3\x34\
+\x73\x9e\xe7\xa3\x6e\xf7\xa9\xdc\xee\xa0\x87\x45\xc2\x78\x0d\x25\
+\x36\x90\x81\x46\xe3\x8b\xdd\x1c\xdc\xe6\x2d\xae\x26\x49\x82\x9d\
+\xb1\x19\xbc\xbe\xc3\xee\xf1\xfd\x90\xa6\xcc\xad\x5c\x44\x55\x54\
+\x3a\xcf\xd4\x09\x17\x75\xd2\x34\x55\x54\x55\xcd\x69\x9a\x96\x17\
+\x42\xc0\x1e\x8b\x81\xdb\x35\x72\x69\x9d\x56\x7b\x1d\x21\x15\xc2\
+\x73\x15\xac\x13\x39\x84\x90\x68\x9a\x96\x7a\x9e\x07\x52\xb2\x21\
+\x5b\xec\xbf\xdf\x46\x4b\x32\x04\x6e\x03\x3d\xcd\x10\xb9\x02\xfb\
+\x78\x99\x60\x51\x47\xc9\x2a\x48\x29\x37\x1f\xba\xe0\xee\x5d\xa7\
+\x74\xc3\x00\x55\x75\x8a\x75\x6b\x0e\xcb\xb2\xd1\x3a\x55\x1a\x4f\
+\x14\xe9\xa5\xc6\x0c\xc3\xa8\xe8\xaa\x9e\xbf\x98\xac\xf2\xe6\xbb\
+\x73\x44\x81\x4f\x96\x12\x1d\x7b\x03\x43\xe4\xe8\x7c\xa3\x4c\xb8\
+\x6c\xf4\x72\x8d\x91\x4c\x25\x56\xea\x30\x7a\x38\xc0\x53\xda\xbc\
+\x71\xe7\x0f\xa2\x3c\xba\xfb\x71\x8a\xd5\x22\xb1\xec\xf2\xec\x26\
+\x0b\x4b\xdf\xf7\xf1\x7c\x9f\x54\x84\x4c\x72\x37\x1f\xbc\xf3\xbf\
+\xf2\xaf\xaf\xfb\x0d\xf6\x0c\x1d\x65\x78\xdb\x60\x9f\x26\x92\x24\
+\x91\xbd\x4c\x75\x9c\x46\x24\xcd\x0a\xf7\x8e\xbf\x93\x43\x85\xb7\
+\x72\xcf\xf6\x77\xf3\xa6\x5b\xde\x41\x78\x2d\x0b\xcb\xde\x71\xe2\
+\x34\xe1\xd1\xed\x1f\x61\x52\x79\x80\x07\x0f\xbc\x8b\xa3\x33\xef\
+\xc2\x11\x1b\x5b\x29\x47\xc6\x71\x8c\xe7\xfa\x84\x49\xc8\x48\x76\
+\x9a\x47\x26\x3e\xca\xcf\xdd\xfd\x49\xbc\x66\x9d\x1d\xd3\x53\x84\
+\xd2\xed\xf3\x6a\x8f\x85\x3d\xcf\xc5\x30\x54\xa6\xd5\xbb\x78\xcb\
+\xd4\xe3\x1c\xaa\xbc\x95\x5f\x79\xcb\xdf\x93\xe6\xec\xcd\x55\x84\
+\x8f\x94\x92\x30\x0c\xa5\xef\x7a\x44\x32\xc2\x73\x23\x3e\x7c\xfd\
+\x27\xb8\x7f\xf7\xbb\xf8\xd0\x1d\x7f\x48\x65\x34\x47\x24\x83\x3e\
+\x67\x4b\x29\xf1\x3d\x8f\x38\x89\x68\x76\x5a\xfc\xee\x43\x4f\xb3\
+\xb4\xbe\x86\x32\x5e\xd8\xc3\xc1\x91\x3b\x37\x07\xa4\xcb\xc2\x42\
+\x08\x3c\xcf\xc3\x0f\x7c\xc2\x38\xe0\xba\xa1\x5b\x79\x7e\xe1\xef\
+\x79\xe1\xe4\x09\x6e\x9f\x7a\x08\x4d\xd1\xfb\x4c\x99\x24\x09\x41\
+\x10\x74\x59\x38\x0a\x19\x2b\xee\x66\xb1\x73\x91\xf3\x6b\x27\xb9\
+\x6d\xfa\x01\x92\x34\x21\x0e\x63\x7c\xbf\x7b\x92\x5b\xdb\x67\xd4\
+\x3c\x95\xcc\x20\xaf\x7b\x2f\xb0\xbf\x7c\x3f\x3b\x87\x0e\x50\xd2\
+\xeb\xf8\xbe\x8b\xe7\x79\xc4\x71\x4c\x1c\xc7\xf8\x7e\xf7\x7b\x29\
+\x53\x21\x57\x4c\x78\xf6\xc4\xf3\x1c\x1c\xbd\x83\xdd\xb5\x9b\x70\
+\x03\xe7\x7b\x59\xd8\xf3\x51\x55\x15\xa7\x2d\x78\x71\xee\x9f\xc9\
+\x8a\x2a\x43\x03\x43\xa4\x49\x17\x41\x03\xdf\xef\x27\x13\x3c\xcf\
+\x43\x51\x15\x2e\x9f\xb3\x18\x1a\xc9\xe2\x47\x2e\x37\x4c\xdc\xc2\
+\x64\xe9\x3a\xfc\xb0\x1b\x47\x0f\x41\x3d\xdf\x27\x0a\x23\x34\x99\
+\x61\xb8\x3a\xc4\x46\x7a\x06\xcd\x09\x6c\xce\xae\xbc\x4a\x14\xc5\
+\xf8\x5e\xda\x7d\xa0\x43\x77\xc6\xf8\x01\x86\x14\xb8\xa1\xc5\x60\
+\x69\x02\x59\xc8\xf3\xfa\xfa\xb9\xfe\x76\x55\x55\xfb\x2c\x1c\xc7\
+\x31\x69\x92\xd2\xf4\xd7\x18\x2d\x3f\x4c\x73\x3d\x65\xc5\x9d\xc5\
+\x54\xb3\x44\x51\x44\x10\x24\x7d\x02\xe9\x65\x74\x75\x52\x14\x45\
+\xc1\x77\x25\x46\xce\x67\xfe\xd2\x02\x1b\xf6\x0a\x81\x6f\xf6\x5f\
+\x3c\x71\x1c\x77\x93\x09\x5a\xd2\x7d\x46\x27\x0a\x23\x03\x23\xbc\
+\x7c\xf9\x18\xb2\xa2\x40\xd2\x1d\xb4\x1e\xc3\x87\x61\x48\xe0\xfb\
+\x18\x42\xa5\x50\x30\x98\xa9\xed\xe7\xcc\xc2\x59\x4c\x91\x45\x11\
+\x4a\x3f\x23\xd4\xeb\x3b\xf6\x23\xc8\x40\xa9\x62\x92\x84\xda\x66\
+\xf6\x1a\x96\x3a\x97\x49\xe2\x6e\x06\x46\x8a\xb4\x8f\x7e\xb1\x1a\
+\x23\x45\x42\xe0\xc7\x04\xae\x8e\xf2\xcd\xf5\xbf\xc2\xc8\x4a\x82\
+\xd0\xef\xb2\xde\xe6\x95\xec\xcd\x30\x91\x6a\x1c\x6f\xfc\x2d\x39\
+\x6f\x86\xfc\xf8\x3a\x67\xed\x67\x71\x93\x36\x8e\xe3\xe0\x38\x4e\
+\xf7\x04\x3d\x0f\xdb\xb6\x09\xfc\x90\x38\xbf\xc8\x2b\xe7\xcf\xf0\
+\xc0\xf5\xf7\xf1\x77\x67\x7e\x9b\xb3\xad\x6f\x11\xc6\x21\x96\x65\
+\xe1\x38\x4e\x3f\x1b\xe3\xba\x2e\x8a\x96\xf0\xb5\x8b\x9f\xe1\x67\
+\xee\xff\x35\x3e\xf3\xea\x6f\x73\x39\x78\x8e\xac\x56\xc0\x71\x5d\
+\x1c\xc7\xe9\x5f\x18\xcf\x75\x09\xc3\x88\x65\xfb\x75\xd6\x5b\x2d\
+\x28\xb4\x48\xab\xb3\x04\x69\x17\xee\x1d\xc7\xe9\x67\x58\x1c\xc7\
+\xc1\xea\x58\x24\x69\xca\x7c\xf4\x6d\x34\x91\xc1\xcf\x5d\xe4\x77\
+\xbe\xf9\x33\xa8\x9a\x8a\x65\x59\x58\x1d\xab\x3f\xd8\xae\xe3\x12\
+\xc7\x29\x53\x53\x15\xbe\xfc\xca\xe7\x19\x2a\x8d\xf0\x3b\x2f\xfe\
+\x9b\xae\x26\x12\xfb\x38\x8e\xd3\xcf\x22\x59\x9d\x0e\xae\xeb\x91\
+\xcf\x65\xf9\xb5\xa7\xdf\xcf\x2f\xdd\xf3\xe7\x68\xae\xb2\xce\xdc\
+\x85\x39\x96\xce\xb5\x08\xac\x84\x84\x04\x80\x66\xb3\x49\xab\xd3\
+\x21\xef\xe6\x09\x55\x95\xbf\xbb\xfc\x6b\xbc\xe5\xf0\x3b\x99\xbb\
+\xf8\x1a\x6b\x2f\x49\xda\xed\x4e\x7f\x8d\xd8\x9b\x85\x94\x14\x14\
+\xd5\xe0\x78\xe7\x53\xd4\xd7\x14\xda\xd1\x32\xf3\x5f\xd9\x60\xfe\
+\x44\x9b\xc8\x4e\xbf\x2f\x0b\x2f\xf8\xdf\xe1\xb9\xa5\xff\x45\xa0\
+\xd9\x5c\x7a\xfd\x3c\x57\x4e\x3b\xb4\x9a\x1e\x42\xe9\xb2\xb0\xef\
+\xfb\xc4\x41\x44\xa0\x4b\xfc\x34\xc7\xb3\x4b\x7f\xcd\xbd\x7b\x7e\
+\x00\x99\x6b\xf1\x9d\x6f\xaf\xb0\x7c\xce\xc2\xe9\x44\xe8\x66\x77\
+\xf6\xd8\xb6\x8d\xdd\xb1\xc9\xa5\x05\x7c\x75\x9d\x63\xf6\x5f\xd3\
+\xf1\x2c\x5e\xfe\xce\x2c\xcb\xaf\x04\x74\x5a\x0e\xba\xa9\xf6\x19\
+\xde\x6a\xb6\xb1\x4b\x92\x58\x96\xf9\x8e\xfd\xf7\x74\x16\x6f\x60\
+\xae\xf3\x2a\xeb\xb3\x0e\x97\xbf\xd5\x20\x89\x52\xb2\xd9\x2c\x69\
+\x9a\xd2\xb1\x2c\xbc\x44\x92\x92\x65\x39\x7e\x95\x3f\x7c\xf9\xe7\
+\x10\xe3\x43\x53\x52\x48\x05\xbd\xd0\x5d\xf7\xe4\xf3\x79\xd6\xd7\
+\xd7\xcf\x55\xab\xd5\xdd\xaa\xa2\x62\x4e\x47\xd4\x76\x1a\x6c\x9c\
+\x0e\x58\x3e\xe5\x90\x76\x34\xf4\x9c\x82\x96\xed\xb2\x70\x1c\xc7\
+\xb6\xaa\xaa\x66\x2e\x97\xd3\x63\x23\x62\xec\x1e\x83\x60\x21\x61\
+\xe9\x94\x83\x73\x05\xb4\x8c\x40\xcf\x8a\x3e\x0b\x2b\x8a\x12\xa8\
+\xaa\x5a\xc8\xe5\x72\x18\x87\x22\x6a\x15\x9d\xc5\x93\x0e\x1b\xa7\
+\x62\x44\x22\xd0\x73\x02\x61\x80\x4c\x25\x85\x42\xa1\xb3\xb1\xb1\
+\x21\x86\x86\x86\x8a\x9d\xd8\xe6\xd0\x0f\x17\x59\x3b\x15\xb2\x7c\
+\xd2\xc6\x5f\x56\x50\x0c\x30\xf2\x5d\x7d\xa2\x5a\xad\x32\x3b\x3b\
+\xfb\xec\x8e\x1d\x3b\x8e\x8a\x54\x90\x4e\x38\xe4\x32\x1a\x8b\x2f\
+\x3b\x78\xeb\x09\xba\xa9\xa2\x1a\x20\xb4\xee\xda\x2e\x0c\x43\x4a\
+\xa5\x92\x15\x87\x71\xb1\x63\x46\xdc\xfc\xd6\x22\xab\xaf\xf9\xac\
+\x9e\xf6\xf0\x57\xba\xed\x8c\x42\x97\x85\x4d\xd3\xc4\x75\xdd\xf5\
+\x7c\x3e\x5f\xcf\x97\x8b\x54\x0e\x44\x74\xe6\x23\x5a\x97\x43\xb4\
+\x3b\xee\xbd\x05\xc7\x71\xa8\x56\xab\x5c\xb9\x72\xa5\xa7\x0b\xf3\
+\xe0\x83\x0f\x72\xf0\xe0\x41\x3a\x2d\x8b\x63\xdf\x3a\xce\xd8\x48\
+\x96\xf1\x4c\x83\x62\xa9\xc0\xd2\xe2\x12\xcd\x66\xb3\xa7\x0b\x33\
+\x3d\x3d\xcd\x23\x8f\x3c\xc2\xf0\xd0\x30\xff\xf3\x2f\x3f\xc5\xde\
+\xc9\x09\x4a\x13\x0b\x8c\xde\x3a\xca\xca\xca\x0a\x61\x18\x92\xcb\
+\xe5\x38\x79\xf2\x24\x69\x9a\xf2\xde\xf7\xbe\x97\x83\x07\x0f\xf2\
+\x99\x4f\xfd\x0d\x19\x37\x8b\x9a\x9b\xe7\xae\x1f\x9e\xdc\xd4\x90\
+\x0d\x54\x55\xe3\xdc\xb9\x73\x84\x61\xc8\xe1\xc3\x87\x79\xdb\xdb\
+\xde\x46\x12\x27\x9c\x78\xf9\x55\x0a\x6a\x8b\x6d\xfb\x7d\xb4\x1b\
+\xbb\x69\xfc\xd7\x5f\x7f\x1d\x45\x51\x70\x5d\x17\x55\x55\x79\xe3\
+\x1b\xdf\xc8\xdb\x7f\xa8\xcb\xc2\xaf\x9e\x7c\x95\xd1\x1b\x54\x86\
+\x86\x07\x39\x77\xf6\x1c\xae\xeb\x92\xcb\xe5\x68\xb5\x5a\x7d\x16\
+\xfe\xc9\x9f\xfc\x49\x56\x96\x57\x78\xfa\xc9\xe7\xd8\x3b\x58\x65\
+\xfb\xf5\x1e\xcd\x56\x83\x72\xb9\x8c\xa0\xcb\xc2\x8d\x46\x03\x21\
+\x04\x1f\xff\xf8\xc7\x11\x42\xf0\xd4\xd7\x9e\x21\x2d\x27\x5c\xc8\
+\x9c\x47\x1b\x1b\x1b\xe3\xd2\xa5\x4b\x14\x8b\x45\xb6\x6d\xdb\xc6\
+\xe5\xcb\x97\x49\x92\x84\x3d\x7b\xf6\xf0\xf6\xb7\xbf\x9d\xb9\xb9\
+\x39\x56\xd7\x57\xa8\x54\x2a\xb8\xae\xcb\xf2\xf2\x32\x03\x03\x03\
+\x58\x96\x45\xa5\x52\xe9\xeb\xab\xef\x78\xc7\x3b\x50\x14\x85\x63\
+\xc7\x8f\x31\x3d\x3d\x4d\xa1\x9c\x47\xd7\x75\xb2\xd9\x2c\xcb\xcb\
+\xcb\xec\xd9\xb3\x87\xd7\x5e\x7b\x8d\x28\x8a\xb8\xe7\x9e\x7b\xb8\
+\xe9\xa6\x9b\x38\x7f\xfe\x3c\xcd\x66\x13\xcb\x6d\x33\x39\x39\xd9\
+\xcf\x5a\x6f\xdf\xbe\xbd\xcf\xcd\xdb\xb7\x6f\xef\xeb\xbc\xae\xe7\
+\xb2\xb6\xb6\x46\xa5\x52\xe1\xc5\x17\x5f\x64\x68\x70\x88\x6a\xb5\
+\xda\x17\xfc\x01\x6a\xb5\x1a\x07\xf6\x1f\xe0\xf9\x6f\x3c\x4f\xb9\
+\x5a\xa2\x58\x2c\x02\x30\x30\x30\x80\xeb\xba\x94\xcb\x65\x7a\xa8\
+\x57\x2e\x97\x79\xd3\x9b\xde\xc4\xf1\xe3\xc7\x39\x7b\xee\x2c\x3b\
+\x77\xee\xc4\x75\x5d\x2e\x5c\xb8\x40\x3e\x9f\xa7\x56\xab\x21\x84\
+\xa0\xd5\x6a\x91\xa6\x29\x53\x53\x53\x84\x61\xc8\xd0\x68\x1d\x29\
+\x25\x8b\x4b\x0b\x88\x1b\x6e\xb8\xe1\x1a\x16\xce\x66\xb3\xcc\xce\
+\xce\x9e\x9b\x9e\x9e\xde\xdd\x4b\x7c\xaa\xaa\xfa\x3d\x9a\x6d\x0f\
+\xb7\x3c\xcf\xb3\x33\x99\x8c\xa9\xaa\xaa\xbe\xb5\xcd\xa6\x7c\xd8\
+\x6f\x9b\x24\x09\x52\xca\x28\x8a\xa2\x40\x55\xd5\x42\x3e\x9f\x27\
+\x8e\xe3\x7e\x3f\xbd\x37\x63\xef\x99\xaa\x28\x0a\xba\xae\x77\x1a\
+\x8d\x86\xa8\xd5\x6a\x45\xdf\xf7\xd1\x75\xbd\xdf\x56\x51\x14\xe2\
+\x38\x46\x51\x14\x92\x24\xa1\x56\xab\x71\xea\xd4\xa9\x67\xa7\xa6\
+\xa6\x8e\xb6\xdb\x6d\xb2\xd9\xec\x35\xcc\xba\xf5\xbb\x61\x18\xac\
+\xae\xae\x52\xaf\xd7\xad\x30\x0c\x8b\x3d\x51\xbe\xa7\x25\xf7\x74\
+\xe4\x5e\x4c\x9b\xcc\xbf\x5e\x2c\x16\xeb\x61\x18\x62\x18\x46\x5f\
+\x17\xd7\x0a\x85\x62\x2a\xb6\xf0\x6a\x18\x86\x8a\x10\x42\xc9\xe5\
+\x72\x64\x32\x19\xc4\x26\xdb\xf6\xf4\xd2\x4d\x61\xb6\x1f\x94\xeb\
+\xba\x81\xa6\x69\x6a\x26\x93\x51\x85\x10\x90\x6e\x8a\xf0\xdf\xc5\
+\xcd\x9b\x4b\x9f\x68\x7d\x7d\xdd\xaf\xd7\xeb\x79\x21\x84\xcc\x9a\
+\x59\xd2\x64\x53\x0f\xde\xc2\xc2\xbd\xcf\xfa\xfa\x7a\x92\xcd\x66\
+\xf5\x4c\x26\x93\x66\x32\x99\x2e\x93\xb3\x45\x3f\xde\xd2\x7e\x73\
+\xad\x16\x46\x51\x44\xbe\x90\x4f\x45\xda\xe3\x6c\xfa\x4b\xb3\x5e\
+\x2c\x9b\x59\x74\x99\x24\x49\x52\x2c\x16\xbb\x2a\xf6\xbf\xd0\xb7\
+\x65\x59\x22\x08\x02\xaf\x54\x2a\xc5\xa6\x69\x4a\x52\x90\x49\x57\
+\x6f\xd6\x46\x76\x97\x93\xc4\xd2\x20\xee\xbf\x14\x12\xdb\xb6\x6b\
+\x13\x13\x13\x84\x51\x44\x52\xf4\xc8\x8d\xc4\xa4\xbe\x02\xbe\x4e\
+\xea\xa8\xa4\xae\xda\xbf\xa2\xb6\x6d\xaf\xd7\xeb\xf5\x9a\x69\x9a\
+\x5a\x24\x62\xc4\xa8\x4d\x2e\xab\x75\xb5\x5b\xd7\x20\xb1\x55\x44\
+\xd2\x1d\x1d\xcf\xf3\x9c\x20\x08\xd6\xea\xf5\xfa\x80\xaa\xaa\x69\
+\x3b\xd3\x64\x68\x52\x25\x76\x14\xf0\x74\x12\x57\x45\xfa\x2a\x3d\
+\x81\x3e\x0c\xc3\x28\x9b\xcd\x16\x6b\xb5\x5a\xe2\xa4\x1e\xa5\x5d\
+\x01\x24\x0a\xa9\xab\x76\xdb\xdb\x2a\x24\x0a\x20\x31\x4d\x53\x5c\
+\xba\x74\x29\x3e\x78\xf0\x20\x69\x94\x26\x8d\xfc\x2a\xdb\x76\x69\
+\x84\x36\xe0\x99\xa4\xae\x42\xea\xe8\xc8\x50\x60\x9a\x26\xed\x76\
+\x3b\x19\x1e\x1e\x8e\x73\x99\x6c\xd2\x0c\x6d\x59\xdb\x17\x23\xd2\
+\x6e\xdf\xd2\xd3\x49\x6d\x15\x19\x2b\x28\xaa\xc0\x30\x0c\xc5\xf7\
+\x7d\x67\xef\x9e\xbd\x81\x1f\x86\xa9\x1c\xb6\x29\xd6\x15\x12\x4f\
+\xa2\x95\x1e\x5c\xd5\x55\x55\xa5\xf1\x85\x1a\xb1\xd5\x65\x5b\x21\
+\x84\x6e\xdb\x36\x96\xef\x92\x8c\xad\x91\xd9\x1f\xb1\x2d\x3f\xcd\
+\x4a\xeb\x75\x34\xa9\x90\xba\x3a\x8d\x2f\xd6\x7a\x6f\xb3\x2c\x90\
+\x49\xd3\x54\xef\x18\x16\x43\x47\x9a\x8c\x56\x07\x51\x11\x34\x3a\
+\xcb\xe8\x19\x95\x8d\x2f\xd6\x88\x9b\x1a\x49\x92\x64\x85\x10\x85\
+\x34\x4d\x55\x40\xf5\x77\xac\x53\xbe\x25\x4b\x4d\x1f\x67\xa9\x79\
+\x05\x45\xa8\x78\xa7\x0b\xd8\xaf\x14\x00\x89\xae\xeb\x39\x40\x13\
+\x09\x2c\x69\xeb\x6c\xbf\x4b\x62\xa4\x25\x64\x9a\x10\x04\x6d\xd2\
+\x40\xa1\xf3\x62\x89\x60\xde\x40\xcd\xa9\x24\x49\x92\xf3\x3c\x8f\
+\xd4\x4d\xf5\xd5\xa9\x39\xa6\x0f\x0e\x30\xae\x4d\xb3\x62\xcd\x11\
+\x79\x29\x71\x5b\x63\xe3\xcb\x15\xc2\x30\x42\x08\xa1\xab\xaa\x1a\
+\x93\xa2\x9d\xf2\x17\x78\xeb\xd1\x3c\x22\x36\x30\x44\x86\xb6\xbd\
+\x8e\xae\x99\xb4\x9e\x2a\x13\x2e\x19\xbd\x5b\xba\x1e\x45\x51\x7e\
+\xd5\xea\x30\xfd\x88\x8d\x5a\xf6\x98\x2a\xed\x46\x79\x64\xe7\xe3\
+\x0c\x54\x86\x08\x93\xb0\xbf\xa2\x07\x64\x10\x04\x84\x41\x48\xac\
+\xfa\xdc\x5e\x7b\x37\x77\x6f\x7f\x27\xff\xe9\x0d\x7f\xcb\x74\xe5\
+\x36\x06\xea\xa5\xfe\x83\xbb\xc7\x94\x41\x10\x10\xcb\x90\xd6\x1a\
+\xbc\xeb\xe0\xcf\xf3\xd0\xc4\xe3\x1c\x9a\x38\xca\xdd\x07\x1f\xc6\
+\x0f\x9d\x5e\x7b\xd9\xd3\x91\xc3\x30\x24\x8c\x23\xde\x3c\xf3\x41\
+\x86\xd2\xdb\x79\xd3\x0d\xef\xe2\xc8\xe8\x0f\xe1\xd2\xc2\xdf\x8c\
+\xa3\xc7\xc2\xbe\x1f\x90\xc8\x88\x89\x81\xdd\xfc\xc8\xde\x7f\xcf\
+\xbf\x3b\xfa\xdf\x59\x9e\xd7\xd9\x31\x39\x43\x94\xfa\x04\xfe\x55\
+\x55\xae\xcb\xc2\x1e\xba\xa1\x32\x63\x1c\xe5\x8d\x13\xff\x86\xbd\
+\x85\x87\xf8\xc5\x37\x7e\x92\xd8\xb0\xfb\x9a\xf3\xa6\x2a\x27\x7d\
+\xcf\x27\x25\xc6\x0f\x42\xde\x77\xf0\x0f\xb9\x77\xe7\x3b\xf9\xe0\
+\xad\x7f\x40\xa9\x96\x23\x96\x5d\x1a\xbb\xaa\x26\xfa\x04\x51\x48\
+\xa2\x7a\xdc\x5b\xfa\x59\xf6\x0e\xde\x8a\xb2\x7f\xe4\x30\x23\x95\
+\xb1\x2e\x1d\x78\x2e\xfe\x26\x27\xf6\xde\x88\x71\x1c\xb0\xb7\x7e\
+\x84\xaf\x5c\xfc\x73\x2e\x5f\x59\xe4\xd0\xb6\xdb\x50\x64\x77\xd9\
+\xd0\xe3\xd5\x3e\x0b\x87\x21\xbb\xaa\x37\x71\x7e\xfd\x15\x8e\xcd\
+\x3d\xc9\x1b\xa6\xff\x35\xba\x92\x21\x0c\xbb\xf6\xb3\x5e\xdf\x3d\
+\x12\xc9\xe9\x45\x8a\x66\x95\x0b\xce\xb3\x5c\x57\xb8\x9f\xd1\xca\
+\x24\x06\x19\x3c\xcf\xed\xaa\x7c\x69\xda\xd7\x6e\xd3\x24\x25\xa3\
+\x64\x49\xf4\x16\x4f\x7c\xfb\x49\x0e\x8d\xdc\x41\x2d\xb3\x0d\x3f\
+\xf0\xfa\x71\xf7\x58\xd8\x73\x5d\x34\x55\xc5\x6a\xc2\x4b\x8b\x4f\
+\x52\x54\x87\x19\xa9\x0e\x41\x2a\xf0\x3d\x1f\xdf\xef\x0a\xeb\x41\
+\x18\xe0\x79\x2e\x42\x11\x5c\x3c\x63\x31\x34\x6a\xe0\x86\x1d\x0e\
+\x8e\xdf\x44\xc5\x1c\xee\x8a\xf4\x5b\x58\xd8\x75\x5d\xc2\x30\xa0\
+\xdd\xf6\xf8\xf1\x87\xde\xcd\x4b\xcb\x5f\x41\xf1\x43\x1f\x3f\xec\
+\x66\x1c\xc2\x4d\x1f\xdd\x56\x5d\x18\x54\xfc\xd8\x61\xa8\x30\xc1\
+\x40\x7e\x80\xa6\xdd\x04\xa1\x74\x99\x73\x13\x71\xba\xac\x1b\x90\
+\xc6\x29\x4e\xd8\x61\x20\x37\x48\xd1\xac\xd2\x8e\x56\x51\x95\xab\
+\xbe\xc2\x28\x8a\xfa\xc9\x84\xee\xec\x4d\x11\x08\x94\x24\x4b\xa2\
+\xdb\xb8\x5e\x80\x17\xba\x84\xc1\xb5\x7d\xf7\x66\x8c\x50\x54\x34\
+\x91\x65\x64\x60\x94\x75\x6b\x0d\x2f\xb2\x49\xe2\x84\x30\xb8\xba\
+\x8c\x09\xc2\x00\xcf\xf7\x51\x84\x4a\xbe\xa0\x33\x53\x3f\x84\x15\
+\x36\x50\x31\x00\x05\x7f\x73\x06\x02\x44\x61\x57\x17\x46\x42\xa9\
+\x6c\x92\x04\x1a\x9a\xa2\x23\x53\x08\x22\x97\x24\x4e\xfa\x62\x7a\
+\x6f\x4c\xa2\x28\xc2\xd4\x35\xae\x2c\x2f\x51\xcc\x54\xd1\x3e\x77\
+\xf1\xe3\x78\xda\x3a\x41\xe0\xe3\xba\x29\x19\x99\x5e\x75\x26\xc4\
+\x11\x65\x25\xcb\x17\x2e\xff\x2e\x3f\x7d\xf8\xe3\x3c\xb9\xf8\xdf\
+\x99\xeb\x9c\xc7\x4f\xec\x2e\xcb\x6e\x2e\x21\x7a\x59\x16\x19\x43\
+\x98\x9f\xc3\xee\x24\x1c\xd9\x73\x23\x7f\x73\xea\xb7\xa8\x0c\x16\
+\x88\xa2\x18\xd7\x0d\x89\xe3\xb8\x6f\x91\x00\xc8\x18\x0a\x4f\x5c\
+\xf8\x5f\x7c\xe4\xde\xff\xc2\x5f\x9c\xfa\x45\xe2\x58\xa2\xa2\xe1\
+\xba\x5d\x59\x53\xd7\xf5\x6e\xf0\x91\x24\x4d\x25\x0b\xed\x0b\x2c\
+\x8a\x55\x4a\x25\x03\x6d\x78\x8e\x85\xb6\x4e\x1c\x77\x6d\x19\x99\
+\x9c\xd9\x8d\xdb\xf5\x70\x2d\x17\x43\x6a\x5c\x09\x5f\x62\xc6\xbb\
+\x81\x96\xf6\x1a\xbf\xf9\x8d\x0f\xa0\xeb\x1a\xb6\xd3\x46\x57\xf5\
+\xbe\xb0\x1e\xba\x01\x69\x51\x32\x35\x35\xc0\x57\x4f\x7e\x81\x99\
+\xc9\x51\x7e\xfd\xf9\x1f\x27\x10\x36\x51\x1c\xe1\xba\x11\xaa\xae\
+\x5c\xbd\x2b\xe3\x88\x72\xa1\xcc\xef\x7c\xf3\x71\x3e\x72\xf4\xd7\
+\xd1\x6c\x7d\x99\xf5\xc5\x16\x2b\xaf\x37\x89\x83\x94\x5c\xd4\xd5\
+\x40\x9b\xcd\x26\x7e\x12\x91\x77\x73\x84\xea\x3a\x7f\xf0\xed\x8f\
+\x72\xc3\xcc\x8d\xb4\x5a\x57\x38\xff\x4f\x01\xad\x96\xdb\xd7\x85\
+\xdb\xed\x36\x71\x1c\x43\x4e\x20\x45\x95\xcf\x5f\xfe\x6f\x3c\x9c\
+\xf9\x57\x34\xd3\x79\x16\x8f\xe9\xac\xce\x36\x89\x9c\xee\xba\x4a\
+\xd3\xb4\xbe\xff\x26\x17\xe5\x58\x8e\x5e\xe5\xef\xce\xfe\x0e\x8e\
+\x6c\xd2\xf6\x9a\x2c\x5d\xb4\x68\x6e\x61\x61\xcf\xf3\x48\xfc\x98\
+\x70\x50\xe0\xcb\x0c\x5f\x5f\xf8\x53\x0e\x6b\x47\x49\x0b\x1d\xe6\
+\x2f\x84\x2c\x9c\x6e\xe1\xb5\x63\x34\xa3\xbb\x32\xb0\x2c\xab\xcb\
+\xc2\x71\x81\x40\x59\xe3\x45\xfb\x2f\x48\x8c\x80\x85\x53\xeb\xbc\
+\xfe\xb4\x4b\xa7\xe9\x7e\x17\x0b\x77\xe8\x14\x52\x62\x4a\x1c\x6b\
+\x7e\x86\xf9\x78\x27\x4d\xed\x32\xeb\x97\x5c\x2e\x7c\xa3\x2b\x30\
+\x65\x32\x19\x92\x24\x61\x63\xa3\x41\x47\x26\x04\xa1\x8e\xa5\xbc\
+\xce\xc7\x9f\xfe\x08\x62\xfb\xc4\xb4\x4c\x3c\xc8\x54\xba\x9d\xe6\
+\x72\x39\xa2\x28\xb2\xa4\x94\x45\xdd\x30\x30\x27\x13\x8a\x83\x2a\
+\xf6\x52\x44\x63\xd6\x23\x6a\xa8\x68\x86\x82\x9a\xe9\x2f\x90\xe7\
+\x34\x4d\x1b\x30\x4d\xb3\x18\xeb\x11\x43\x87\x0d\xe2\x46\xc2\xc6\
+\x15\x07\x7f\x59\x25\xf1\x25\x66\x59\x25\x4d\x13\x00\x0b\x68\x1a\
+\x86\x31\xa9\x69\x1a\xe6\x9e\x84\x72\x51\xa7\x31\xe7\x61\xcf\x27\
+\xf8\x1b\xa0\xe7\x15\x14\xbd\x6b\x6f\x2b\x16\x8b\x96\xe7\x79\xc5\
+\x8c\x61\xe2\x19\x01\x33\x77\xe6\x68\xcf\x85\x34\xe7\x5d\xfc\x55\
+\x95\xd8\x97\x64\x4a\x57\x59\x78\x6e\x6e\xee\xd9\x89\x89\x89\xa3\
+\x49\x94\xa2\x8c\x85\xe4\x73\x2a\x8d\xd7\x03\xac\x85\x10\x81\x8a\
+\x66\x8a\x4d\x5b\x9e\x4a\x10\x04\x94\xcb\x65\x2b\x0a\xc2\xa2\x65\
+\xc4\xec\xbf\xa7\x40\x73\x36\xc0\x5a\x0a\x70\x16\x24\x69\x04\x66\
+\x45\x21\x4d\xba\xba\xb0\xe7\x79\xeb\x86\x61\xd4\x51\x75\x26\xef\
+\xd6\x88\xec\x14\x77\x2d\x46\x3b\x72\xcb\x4d\x34\x5b\x4d\x0a\x85\
+\x02\xed\x76\x9b\x20\x08\x58\x58\x58\xe0\xb1\xc7\x1e\x23\x9f\xcf\
+\x93\x84\x29\x2f\xbd\xfc\x32\x5a\x4d\xc5\xcd\x39\x28\xaa\x82\xe3\
+\x38\xac\xae\xae\x52\xad\x56\x39\x7b\xf6\x2c\x33\x33\x33\xdc\x7f\
+\xff\xfd\x0c\x0f\x0d\xf3\xe9\xff\xf9\x19\x76\x4d\x4d\xb0\xe0\x2e\
+\xb0\xed\xe0\x28\x1b\x8d\x0d\x6c\xdb\xa6\x52\xa9\xf0\xca\x2b\xaf\
+\x20\xa5\xe4\x7d\xef\x7b\x1f\xf5\x7a\x9d\x27\xbe\xf2\x35\x74\x0c\
+\x32\xc6\x22\xe3\xf7\x8c\xb1\xba\xb6\x82\xd1\xb5\xa9\xf5\xfd\xda\
+\x77\xde\x79\x27\x37\x1e\x3e\x8c\xa1\xe9\x7c\xfb\x5b\x2f\x33\x5c\
+\x0a\x68\x8f\xb7\xd1\xa6\x55\xaa\xd5\x2a\x67\xce\x9c\x21\x93\xc9\
+\x6c\x5a\x36\x34\xee\xbb\xef\x3e\x1e\x7d\xf3\xa3\xbc\xf0\x8d\x17\
+\x79\xe9\xa5\x97\x98\xda\x97\xa1\x7c\x7b\x89\xd9\xd9\x59\x2c\xcb\
+\xa2\x5c\x2e\xb3\xbe\xbe\xce\xd2\xd2\x12\xd5\x6a\x95\x77\xbf\xfb\
+\xdd\x34\x36\x36\x78\xe6\xa9\xe7\xd9\x57\x1f\xc0\xcf\x7a\x34\x06\
+\x1a\x0c\x0e\x0e\x12\x86\x21\x2b\x2b\x2b\xb4\xdb\x6d\x3c\xcf\xe3\
+\xc3\x1f\xfe\x30\x99\x4c\x86\x57\x5f\x39\x4d\x4b\x69\xe2\x97\x3d\
+\xb4\xa9\xe9\x29\xdc\x53\x2e\x9a\xa6\x31\x33\x33\xc3\x99\x33\x67\
+\x48\xd3\x94\x5d\xbb\x76\xf1\xc8\x23\x8f\xf0\xe2\x8b\x2f\xb2\xde\
+\x5c\xa3\x56\xab\x21\xa5\xe4\xfc\xf9\xf3\xd4\xeb\x75\x3c\xcf\x63\
+\x60\x60\xa0\x6f\x9b\x7d\xec\xb1\xc7\xf0\x7d\x9f\x13\x27\x4f\x30\
+\x33\x33\x43\xa1\x94\xa7\x5c\x2e\x53\x1f\xac\x73\xfa\xf4\x69\x6e\
+\xba\xe9\x26\x4e\x9c\x38\x41\x10\x04\xdc\x7f\xff\xfd\x4c\x4d\x4d\
+\xd1\x6e\xb7\xd9\xd8\xd8\xc0\x0b\x1d\xf6\xee\xdb\x0b\x02\x5c\xd7\
+\x65\xf7\xee\xdd\xcc\xcf\xcf\x03\xb0\x6d\xdb\x36\xde\xf9\x8e\x77\
+\xe0\x79\x1e\x17\x2e\x5e\x40\xd7\xab\xec\x1f\xb8\x8e\x6f\x7f\xfb\
+\xdb\xd4\x6a\x35\xea\xf5\x3a\xba\xae\xf7\xb3\xe3\xbb\x77\xef\xe6\
+\xbe\x7b\xef\xe3\xe4\x89\x93\xd4\x06\xab\x98\xa6\x49\xb9\x5c\xa6\
+\xd5\x6a\xf5\x2f\xa4\x65\x59\x00\x94\xcb\x65\xde\xf6\xb6\xb7\xf1\
+\xc2\x0b\x2f\x70\xfe\xc2\x05\xf6\xee\xdd\x8b\x65\x59\x5c\xbc\x78\
+\x91\x81\x81\x01\x4a\xa5\x12\xa6\x69\xf2\xda\x6b\xaf\x21\xa5\xe4\
+\xc8\x91\x23\x4c\x4c\x4c\xf4\x66\x24\xaf\xbd\xf6\x5a\xd7\x23\xdd\
+\x63\xbf\x28\x8a\xc8\x66\xb3\x58\x96\x65\x65\x32\x99\xe2\xb6\x6d\
+\xdb\x58\x5a\x5a\x42\xd3\xb4\x1e\xcb\xf6\x59\xb4\xb7\x8f\xeb\xba\
+\x73\xd9\x6c\x76\x60\x64\x64\xa4\xd8\x4b\x3e\xf6\xb6\xa7\x69\xda\
+\xff\xbe\xe9\xdf\xb3\xc2\x30\x6c\xe6\xf3\xf9\xc9\xf1\xf1\x71\x16\
+\x17\x17\x7b\x0b\xf7\xee\x33\x74\x93\xa3\x7b\x8c\xab\x69\x9a\xe5\
+\xba\x6e\x71\x66\x66\xa6\xef\x70\x48\xd3\xb4\xcf\xca\x3d\x96\x4e\
+\x92\x84\x6a\xb5\xda\x67\xe1\x9e\x51\x60\x2b\xe3\xf7\x72\x97\xbd\
+\x9c\x64\xa3\xd1\x60\x68\x68\xc8\xca\xe5\x72\xc5\xad\x2b\x84\xad\
+\xb1\xf7\x58\x5e\x51\x14\xda\xed\xf6\x7a\xb5\x5a\xad\xd7\x6a\x35\
+\x9a\xcd\x66\x9f\x99\xb5\x6c\x26\x1b\xf4\x98\x6f\xf3\xf9\x27\x6d\
+\xdb\x6e\xd4\xeb\x75\xa3\xd1\x68\x90\xcd\xe6\x20\x05\x5d\xdd\xc2\
+\xc1\x5b\x18\xdd\xb6\x6d\x3f\x93\xc9\x48\xc7\x71\x10\x42\x90\x35\
+\x73\x7d\xdf\x72\x9f\x27\xaf\xb2\xb0\xf0\x3c\x8f\x4c\x26\x13\xae\
+\xaf\xaf\xcb\x6c\x26\x4b\x9a\x82\x40\xa2\x6b\xc6\x35\xcc\x2a\x13\
+\x6a\x82\x26\x00\x00\x1f\x45\x49\x44\x41\x54\x84\x60\x75\x75\xd5\
+\xca\xe5\x72\x99\x76\xbb\xad\x17\x8b\xc5\x2e\x93\x7f\x9f\x7e\x7b\
+\x03\x93\xa6\x69\x1b\xe8\x14\x8b\xc5\x10\x49\xbf\xfd\x77\xf3\xb0\
+\xaa\xaa\x04\x41\x10\x85\x61\xa8\xab\xaa\x6a\x02\x52\x53\x74\x34\
+\x45\xbf\xf6\x1c\x05\x08\x04\xb6\x6d\x8b\x24\x49\x56\x72\xb9\x5c\
+\xd9\xb6\xed\xd4\xd0\xcd\xbe\x9c\xaa\x8d\xec\x2d\x99\xf1\x86\x81\
+\x48\x05\xa8\x5d\x9d\xe0\xf2\xe5\xcb\xcd\xb1\xb1\xb1\xed\x9e\xe7\
+\x93\x16\x3d\xb2\x63\x11\x69\x92\x82\xab\x93\xb4\x32\x24\x2d\xad\
+\xef\x91\x76\x1c\xa7\x30\x31\x31\xa1\xaa\xaa\x4a\xac\x24\x24\xdb\
+\xda\x94\xcb\x2a\x49\x24\x51\x82\x0c\x51\x43\x43\x3a\x3a\x02\x81\
+\xe3\x38\xba\xe7\x79\xa5\x7a\xbd\x6e\xa8\xaa\x4a\x33\xdb\x60\x62\
+\x87\x4e\xe4\x27\xc8\x4e\x96\xa4\xad\x21\x5d\xb5\x9f\xf4\x74\x5d\
+\x37\xc9\x64\x32\xf6\xf6\xc9\xc9\x01\x37\x0e\xc8\xef\x75\x50\x84\
+\x20\x75\x55\xd2\x8e\x49\xd2\xd4\x21\xa5\xeb\x91\x36\x0c\xce\x9c\
+\x39\xa3\x4f\x4c\x4c\x94\x64\x22\x69\xe6\x36\x18\x99\xd6\x88\xfc\
+\x14\x6c\x93\xa4\xad\x93\x74\xba\x71\x1b\x86\xce\xca\xca\x0a\x43\
+\x43\x43\xcd\x5c\x36\x67\xac\x07\x1d\x86\x0f\x74\x0d\xec\xa9\xab\
+\x20\x2d\x93\x68\xa3\x1b\xb3\xa2\x77\x97\x53\xed\x76\x7b\x6e\x68\
+\x70\x70\xbf\x17\x46\x88\x6d\x36\xc5\xaa\x42\x1c\x26\x68\xe5\x37\
+\xae\xa2\x48\x9d\xd6\xd7\xab\x44\x2b\x46\xaf\xf6\x22\xaf\x69\x1a\
+\x71\x9a\x20\x47\x6d\xb4\xc3\x2d\xf6\xd5\x6e\x66\xc5\xbe\x8c\xed\
+\x36\x50\xbc\x0c\x8d\x2f\x0c\xf6\xec\x17\x5a\x1c\xc7\x4a\x18\x86\
+\x58\x9a\x83\xb9\x63\x89\xfd\x3b\x0f\x32\x59\x9d\xe6\xe9\x73\xff\
+\x40\x25\x57\x63\xfd\xab\x39\x82\x05\x13\xd7\x75\x15\x45\x51\xb4\
+\xde\xed\x14\xef\x6c\x52\xbc\x39\xc3\x74\xe9\x00\xe7\x57\x4e\x92\
+\xa6\x92\xe8\x74\x15\xfb\x44\xbe\x97\x20\x50\xa3\x28\xd2\x7d\x37\
+\x60\x21\x5d\xe1\xe0\x4d\x0e\x25\x31\x8c\x24\xc0\xf6\x56\x89\x2c\
+\x81\x73\xac\x4a\xb0\xa0\xf7\x6e\xd1\x9c\xaa\xa9\xc8\x50\x62\x4f\
+\xad\x31\x70\x7b\x99\xaa\x36\xc1\xba\x33\x8f\x65\x3b\x18\xd6\x00\
+\x8d\x7f\x2e\x03\xa2\x97\x2e\xd3\x55\x29\x38\x1f\x2e\xb2\xff\x68\
+\x19\x2d\xc9\x92\x33\xb2\xcc\x6f\xbc\x4e\x45\x14\xe8\x3c\x3b\x40\
+\xb8\x64\xf4\xd2\x68\x75\x10\xb4\x02\x8f\x1d\xb7\xfa\x50\x6c\x73\
+\xd3\xf0\x3d\x28\x6f\xde\xf1\xb3\x8c\x0c\x4e\x11\xa7\x61\xdf\x23\
+\x0d\x48\xdf\xf7\xf1\x3d\x9f\x98\x80\x5d\xc6\x03\xfc\xab\x1b\x3e\
+\xc6\x8f\x5d\xf7\x9b\x5c\x3f\xf8\x28\xa3\x63\xa3\x7d\xed\x36\xde\
+\x74\x9f\x06\x41\x40\x9c\x44\xac\xaf\x06\xfc\xe8\xc1\x9f\x43\xb6\
+\x07\xf9\xa9\x23\xbf\xce\x0f\x1d\x79\x1f\x41\xe2\x5f\xe3\x50\xf5\
+\x3c\xaf\xef\xfc\x7c\xf3\xcc\x87\xd8\xa1\x3f\xc8\xdd\x3b\x7f\x90\
+\x37\xed\xfc\x20\xa1\x66\xe3\x79\x57\xfb\xee\x89\x56\x51\x1a\x31\
+\x9c\x9f\xe2\xa1\x89\x0f\xf1\x73\x77\xfd\x19\xf6\xd2\x20\x37\xee\
+\xb9\x95\x20\xb5\xaf\xd5\x85\xfd\x00\xd7\x75\xd1\x74\xc1\x8e\xdc\
+\xed\x7c\xf8\xc8\x1f\x70\xa0\xfa\x46\x7e\xe9\xbe\x4f\x11\x67\xba\
+\x6d\xb7\x78\xa4\xa5\xeb\x7a\x24\xa4\x78\x81\xcf\xfb\x0e\xfc\x01\
+\xf7\xed\xf8\x51\x7e\xe6\x96\x4f\x32\x36\xbe\x8d\x30\xbd\xd6\x23\
+\xed\xf9\x1e\x7e\x10\x10\x0b\x97\xbb\x73\x1f\xe3\xc0\xf0\x9d\x28\
+\x35\x73\x9c\xa1\xfc\x58\x9f\x67\x7b\xce\xa5\xfe\x49\xc6\x01\xd7\
+\x0d\x1f\xe1\x89\x4b\x7f\xc1\x97\x5f\x78\x8a\xbd\x43\x37\xf4\x6c\
+\x1a\xfd\x37\x5f\xdf\x23\x1d\xfa\xd4\x8c\x49\xe6\xdb\x17\x78\x75\
+\xe5\x05\x6e\x99\x78\x00\x3f\xb6\xfb\xfa\xeb\x56\x8f\xb4\xe7\x79\
+\x64\xf5\x22\xe5\x4c\x95\x67\x16\x3e\xcd\x91\x91\x47\x29\x64\x4a\
+\x68\xa9\x89\xe7\x79\xb8\xae\xbb\xc5\xc7\xec\x11\x47\x11\xe5\xec\
+\x00\x4a\xa1\xcd\x17\x5f\xfc\x12\x3b\x6b\x07\x29\x68\x15\xfc\x20\
+\xc0\xf3\xbd\xab\x16\x5f\xdf\xbf\xea\x91\x6e\xe8\x7c\xe6\xe5\x3f\
+\x24\x9f\x8e\x33\x33\x3e\x09\xa9\x8a\xe7\x5f\xf5\x48\x77\xe3\xea\
+\x7a\xa4\x2f\x9c\xb6\xa8\x0d\x2b\xac\x3b\x8b\xec\x9f\x38\x44\x4e\
+\x2d\x6f\xb2\xb2\x77\xcd\x85\x8f\xc2\x90\x76\xdb\xe3\xa7\x1e\xfd\
+\x71\xbe\x7a\xe9\x93\x28\x61\x1c\x63\x79\x9d\x4d\x16\xbe\xea\x76\
+\xef\x79\x89\x91\x02\x27\xb4\x19\x2e\x6c\x67\xa8\x32\x44\xcb\x6d\
+\xf5\xf5\xd5\xad\xbc\x1a\x86\x21\x71\x94\x12\xa4\x0e\xb5\xdc\x08\
+\x05\x7d\x80\x8e\xdf\x24\x6f\x94\xfb\x09\x87\x9e\x1a\xd7\x9b\xb1\
+\xa9\x4c\x10\x28\x68\x69\x9e\x58\xb3\xf0\xbc\x08\x3f\xf2\x09\x43\
+\xbf\xdf\x77\x92\x24\x04\xa1\x4f\x12\xa7\xa4\x52\x22\x63\x9d\xb1\
+\xda\x04\xab\xad\x35\xc2\x34\xd8\xe4\xd5\x2d\x1e\xe9\x4d\x83\x80\
+\xa2\xa8\x64\xb3\x1a\xe3\xe5\x19\x2c\xbf\x89\x21\xf2\x48\xb9\xe9\
+\xcf\x0e\xba\x49\x8d\x5e\xa6\x47\x4a\x28\x57\x4c\xe2\x40\x43\x57\
+\x0c\x04\x0a\x61\xe2\x13\x47\xc9\x35\x1e\xe9\x1e\x17\x1b\xba\xc6\
+\xdc\xd2\x12\x45\xa3\x8a\x72\xac\xf9\x69\x7c\xd1\xda\xf4\x39\x7b\
+\xdf\x57\x17\xfe\xc6\xca\xa7\xd9\x6e\xdc\xce\xf8\x4e\x85\x13\xcd\
+\x7f\xc2\x89\xdb\xb8\x6e\x37\x63\xd2\xbb\x85\x5d\xd7\x25\x08\x43\
+\x0a\xb5\x90\x97\x5f\xff\x36\x8f\x3f\xfc\x4b\x7c\xfc\xf9\xf7\xf1\
+\xed\xc5\x27\x49\x93\xf4\x9a\x6c\x4c\xaf\x6f\xd5\x48\xf9\xfa\x85\
+\xcf\xf2\xf8\xbd\xbf\xc2\xe7\x4e\xfd\x01\x67\xec\xaf\xa1\xa2\xe2\
+\xba\xd7\xce\x6e\xd7\xf5\x88\xe2\x88\x25\xeb\x12\xed\x8e\x4d\x6d\
+\xd8\x40\xd6\x2f\xb2\x61\xaf\x10\x27\xdd\x4c\x4f\x3f\x9d\xe5\xfb\
+\xb8\x8e\x8b\x94\xd0\xe0\x2c\x7b\x86\x6e\xc0\xcb\x5f\xe4\x77\x9e\
+\xf9\x18\xba\xa6\x5f\x33\xbb\xbb\x71\x3b\x24\x49\xca\xd4\xd4\x00\
+\x4f\x9d\xfe\x67\xc6\x6b\x93\xfc\xc6\x73\xef\x07\x91\xf4\xfb\xee\
+\x5d\x78\xd7\xeb\xde\xc2\x95\x7c\x99\xdf\x78\xe6\x83\x7c\xf0\xa6\
+\xdf\x41\x6b\x27\x8b\xb4\xa3\x15\x96\xce\x35\xf0\x3b\x29\x71\x9a\
+\x47\x08\x41\xb3\xd9\xa4\xdd\xb1\x28\xb8\x39\x84\xa9\xf2\x47\x2f\
+\x3f\xce\x1b\xf6\xfe\x10\xab\xf1\x79\xd6\xbf\xd3\xe5\xdf\x5e\x32\
+\xc1\xb6\x6d\x5a\xad\x56\x37\x87\x2f\x2a\x3c\xbb\xf6\x67\xa8\xaf\
+\x25\xb4\xc3\x65\x5a\x97\x57\x59\x38\xd3\xc0\x6f\xa7\xdf\xc3\xc2\
+\xf9\x28\xc7\x42\xf8\x32\x9f\x3f\xf3\x87\x58\x41\x93\x96\x7f\x9e\
+\xd5\x79\x9b\x56\xd3\x05\x21\xb7\xe8\xc2\x31\x81\x96\x12\x93\xe7\
+\x2b\xaf\xff\x0f\xee\xd1\xde\x02\x19\x87\xb3\xf3\x27\x58\x39\xdb\
+\xd5\x85\x35\x43\x05\xa0\xdd\x6e\x63\x37\x6d\x32\x51\x81\x66\xf2\
+\x3a\x5f\xb8\xf4\xbb\xb8\x71\x93\x8b\xce\x4b\x6c\x2c\xf8\x6c\x2c\
+\x37\x31\xf2\x5d\x0d\xc4\xb6\x6d\xac\x46\x07\xbb\xd8\xd5\x85\x9f\
+\x5f\xfb\x4b\x2e\xd9\x7b\x58\x8b\xcf\x11\x58\x3e\xe7\x9f\x5e\x43\
+\xd1\xe9\xeb\xc2\xcd\x66\x93\x4e\x9a\x10\x44\x06\xe6\xc0\x02\xbf\
+\xfc\xa5\x9f\x40\xec\xd8\xb9\x43\xc6\xb6\xc4\x2c\x68\x24\x69\x42\
+\x2e\x97\x63\x7d\x7d\xfd\xdc\xe0\xe0\xe0\x6e\x5d\xd3\xd1\xb6\x85\
+\xe4\xea\x82\x8d\xb3\x3e\x76\x23\x40\x7a\x3a\xc8\xae\xde\xbb\x99\
+\x91\x5e\xad\x54\x2a\x45\x20\x8b\x2e\xc9\x5f\x97\x12\x2d\xa7\xb4\
+\x96\x1c\x12\x57\x23\xf1\x40\xcf\x0a\x52\x99\xf6\x3d\xd2\xa6\x69\
+\x16\x72\xb9\x1c\xca\x8c\x4f\x5e\x55\x59\x39\xef\x10\x75\x20\xf1\
+\xe8\x56\x11\xe9\xdd\x75\x5d\x3e\x9f\x5f\x6c\xb5\x5a\xa5\x91\xe1\
+\x91\x82\x15\x5a\xcc\x3c\x98\x63\xf9\x84\x47\x6b\xc9\x45\x09\x0c\
+\x02\x27\xc1\xc8\x77\x39\xfb\x1a\x16\x0e\x12\xf4\xbd\x31\x85\xac\
+\xca\xca\x69\x9b\xd0\x92\xa4\x9e\x82\x4c\x41\xcb\x82\xd8\x4c\xc7\
+\x55\x2a\x15\x4b\xa6\xb2\xd8\xc1\x67\xef\xbd\x79\x56\x4e\xba\xd8\
+\xab\x21\xa9\xaf\x10\x3a\x29\x66\x49\x25\x89\x93\x9e\xe9\xf4\x58\
+\x3e\x9f\x3f\x62\x98\x59\xc6\xee\x56\xb0\x97\x23\xda\x73\x21\xda\
+\xa1\x03\x87\x7a\x86\x6e\xe6\xe6\xe6\x48\xd3\x94\x85\x85\x05\x1e\
+\x7e\xf8\x61\x0e\x1c\x38\x40\x6b\xa3\xcd\x73\xcf\x7e\x83\xc9\x5d\
+\x19\x36\x1a\x1b\x14\x8b\x05\x36\x36\x36\x68\x34\x1a\x54\xab\x55\
+\xce\x9d\x3b\x87\xa6\x69\xbc\xef\x7d\xef\xa3\x90\x2f\xf0\x99\x4f\
+\x7d\x96\xda\xb6\x2a\x57\xd2\x39\x86\x86\x87\x58\x5a\x5a\xc2\x34\
+\xbb\x0e\xfa\x8b\x17\x2f\x12\x86\x21\x8f\x3f\xfe\x38\xf5\x7a\x9d\
+\x2f\x7e\xfe\x1f\xbb\x25\x57\x43\xcb\x8c\x1c\x1a\x61\x75\x75\x95\
+\x6c\x2e\xdb\xd7\xa6\x3d\xcf\xe3\xd6\x5b\x6f\xe5\x91\x47\x1e\xc1\
+\xd0\x0d\x9e\x7d\xea\x79\x0a\x03\x0d\xe2\x52\x44\x14\xc7\x0c\x0e\
+\xd6\xb9\x70\xe1\x02\xaa\xaa\x76\x4d\x42\x8a\xc2\xbd\xf7\xde\xcb\
+\xfd\xf7\xdf\xcf\xd3\x5f\x7f\x86\xd3\xa7\xce\x50\x9b\xd4\x31\x32\
+\x26\xcd\x46\x03\xdb\xb5\xc9\x66\xb2\x74\x3a\x1d\x56\x56\x56\xa8\
+\xd5\x6a\xbc\xef\xfd\xef\x63\x7e\x6e\x9e\xe7\x9e\x7a\x9e\xeb\x46\
+\xf3\x44\x83\x01\x8d\x66\x93\x5a\xad\x4a\x14\x45\x2c\x2f\x2f\xf7\
+\x2d\x29\x1f\xfa\xd0\x87\xa8\xd7\x6b\x7c\xeb\xf9\x97\x58\xd5\x57\
+\x88\xb6\x07\x68\x3b\x76\xec\xe8\x83\x75\xa1\x50\xe0\xf4\xe9\xd3\
+\x24\x49\xc2\xde\xbd\x7b\xb9\xfb\xee\xbb\x09\x82\x80\x95\xf5\x65\
+\x06\x07\x07\xd9\xd8\xd8\xe8\xdf\xba\x96\x65\x5d\xe3\xa9\x7e\xe0\
+\x81\x07\x50\x55\x95\xaf\x3f\xf5\x75\x6e\xbb\xf5\x36\xf4\xe3\x1a\
+\xa3\xa3\xa3\xfd\x5b\xf6\xe6\x9b\x6f\xe6\xd2\xa5\x4b\x24\x49\xc2\
+\xad\xb7\xde\x4a\xa1\xd0\xbd\x10\xcb\xcb\xcb\xf8\x91\xcb\xee\x3d\
+\xbb\x31\x33\x26\x8e\xe3\x70\xd3\x4d\x37\xf1\xb9\xcf\x7d\x0e\xdf\
+\xf7\xd9\xb1\x63\x07\x87\x0e\x1d\x62\xdf\xbe\x7d\xb4\xda\x2d\xd6\
+\xd7\xd7\x29\x16\x8b\x3c\xf7\xdc\x73\x8c\x8d\x8d\xd1\xe9\x74\xd0\
+\x75\x9d\x2b\x57\xae\xa0\x28\x0a\xd3\xd3\xd3\x3c\xfa\xe8\xa3\x34\
+\x9b\x4d\x6c\xcf\xa2\x56\xab\x01\xb0\x52\xc8\x73\xee\xdc\x39\x66\
+\x66\x66\xb8\x70\xe1\x02\xab\xab\xab\x14\x0a\x05\xee\xb8\xfd\x0e\
+\x4e\x16\x4e\x72\xf6\xfc\x59\x0e\x1d\x3c\xc4\xfa\xfa\x3a\x97\x2e\
+\x5d\xa2\x5e\xaf\x53\xad\x56\xb9\x78\xf1\x22\x27\x4e\x9c\x00\xd8\
+\x52\xb7\xdc\x4d\xae\xbe\xf4\xd2\x4b\x57\x3d\xd2\x3d\x1d\xb4\xa7\
+\x0b\xcf\xcc\xcc\xec\xce\xe7\xf3\x7d\xee\xdb\xaa\xdb\x6e\xf5\x09\
+\x5b\x96\xb5\x3a\x38\x38\x58\xcc\x64\x32\xd9\x5e\x8e\x6d\x6b\x6d\
+\xee\xd6\xbe\x93\x24\x89\xc2\x30\x0c\xaa\xd5\x6a\xa1\x52\xa9\xf4\
+\x8d\xe1\x5b\x75\xe1\xad\x35\xbe\x42\x88\xc5\x4e\xa7\x53\xda\xb5\
+\x6b\x57\xa1\xd5\x6a\x5d\xc3\xcb\x5b\x75\xe7\x34\x4d\x19\x18\x18\
+\xe0\xd4\xa9\x53\xcf\x1e\x38\x70\xe0\xa8\xa2\x28\xdd\x67\xf2\x16\
+\x9f\xf3\x56\x8e\xd7\x34\x8d\x66\xb3\xc9\xd0\xd0\x90\x95\xc9\x64\
+\x8a\xbd\xaa\xa8\xad\xbc\xdf\xd3\xa7\x7b\xe8\xb7\xb6\xb6\x76\x6c\
+\x64\x64\xe4\x48\xb9\x5c\xee\xd6\xc4\xf4\x6a\x9a\xd3\x44\x6e\x28\
+\xaa\x10\x42\x88\x1e\x23\xca\x34\x4d\xd7\x3d\xcf\x2b\xb6\xdb\xed\
+\x54\x11\x8a\x90\xa9\xb8\xea\x1d\xde\xc2\x9f\x42\x08\x91\x24\xc9\
+\x7c\xa7\xd3\xa9\xd8\xb6\x9d\xef\x5a\x8c\x95\x6e\x9d\xad\x72\x0d\
+\x33\xf7\x4e\xc4\x0f\xc3\xd0\x75\x5d\xb7\xe6\x38\x8e\x54\x85\x4a\
+\x9a\xf2\x7d\xfb\xde\xac\x17\x5e\x54\x14\x45\xac\xac\xac\x44\x02\
+\x21\xb7\xb2\xad\x10\xb2\x3f\xf8\xaa\xaa\x62\xdb\xb6\x04\x56\x1a\
+\x8d\xc6\x46\x92\x24\xc1\xbf\xd4\xf7\xe6\x52\xca\x71\x1c\x27\xef\
+\xfb\x7e\xac\x20\x64\x2a\xaf\xd6\x0b\xf7\xda\xab\xaa\x0a\x20\xa2\
+\x28\x0a\xe3\x38\x76\xd3\x34\x6d\x6f\x6c\x6c\x24\x48\x01\x12\x54\
+\x4d\xd5\xb4\xf1\xbd\x83\xb5\xa4\xa9\x23\xd4\x6e\x6d\x6c\x77\x6d\
+\xe4\x8f\x0e\x0e\x0e\xc6\x49\x9c\x10\x16\x1d\x72\xdb\x03\x68\x65\
+\x48\xd6\x4d\x92\x8e\xd6\x7d\xd9\x1a\x12\x40\x49\x92\xc4\xa9\xd5\
+\x6a\x59\x4d\xd3\x32\x31\x09\xd1\x78\x83\x81\x5c\x96\x68\xcd\x20\
+\xd9\x30\x91\x91\x82\x62\x76\x5d\xe7\x41\x10\xb8\xc0\xda\xe0\xe0\
+\xe0\x80\xa2\x28\xe9\xba\xba\xce\xe4\x75\x2a\xc9\x86\x49\xbc\x62\
+\x92\x3a\x3a\x42\x93\x08\xad\x3b\x63\x72\xb9\xdc\x36\x45\x51\x46\
+\x2b\x95\x0a\x7e\x1c\x92\xb9\xae\x83\xa1\x2a\xc4\x2d\x83\xb4\xd1\
+\xe5\x5b\xa1\x4b\x50\x24\xba\xd6\xbd\x8d\x47\x46\x46\x22\x99\xa4\
+\xc9\x9a\xb2\xc1\xf6\xeb\x15\xc2\x55\x83\x68\xd5\x44\xda\x3a\x42\
+\x91\x08\xbd\xeb\xd2\x6f\x34\x1a\xb9\xc9\xc9\xc9\x11\x24\xca\x62\
+\xd0\x60\xea\x66\x20\x12\x24\x4d\x9d\xa4\x91\x21\xb1\x34\x54\x53\
+\x22\x14\x41\xb3\xd9\x5c\x0f\xc3\x70\xdf\xb6\x6d\xdb\xca\x8e\xef\
+\x63\xee\xb4\xc9\x55\x14\xc2\x0e\x68\xf5\xb7\xae\xa3\xa5\x19\xda\
+\x4f\x55\x89\xd6\x34\x0c\xc3\x40\xd7\xf5\xc1\x72\xb9\x5c\xb0\x3d\
+\x0f\x65\x8f\xc5\xe8\x6d\x11\x78\x0a\x9e\xdf\x22\x27\xca\xa4\x6d\
+\x93\xd6\x53\x15\x14\x45\xa1\xd1\x68\xa4\x85\x42\xa1\xaa\xeb\x7a\
+\xbe\x6d\xb4\xd9\x76\x9f\x4a\x21\x17\x90\x84\x1e\x7a\x9c\x27\x49\
+\x13\x9c\xa7\x46\x88\x3b\x0a\xaa\xaa\x56\x2d\xcb\x2a\x17\x8b\xc5\
+\x31\x21\x04\xde\x75\xab\x8c\xde\x2e\x49\x5d\x41\xea\xc7\xc8\x58\
+\x12\x9f\xaf\xe1\x9c\xc9\xf4\x3c\x37\x51\x18\x86\x64\x74\x93\x0d\
+\xdd\x62\xc7\x83\x21\x39\x59\xc5\xf7\x3d\x48\x23\xbc\x86\xc4\x7f\
+\xa9\x8a\xbf\xa4\x53\x2c\x16\x10\x42\x8c\x54\x06\x2a\x23\xd2\x95\
+\x34\xf7\x2e\xb2\xed\xee\x0c\x8d\x8d\x0d\x0a\x4a\x85\xc0\x0b\xd1\
+\xdb\x55\x5a\xdf\x28\x62\x9a\x26\x9a\xa6\x91\xcb\xe5\xc2\xc8\x8f\
+\x0c\xbb\x6a\x33\x7e\x6f\x91\xd8\x57\x29\x68\x05\xe6\xd6\x2e\x52\
+\x52\x86\xd8\xf8\xc7\x32\x32\x50\x31\x0c\x43\x13\x42\xa4\xa6\x61\
+\xd0\x4c\x5c\x26\xef\x04\x4f\x5f\xe3\xd6\xd1\x7b\x51\xde\xb6\xeb\
+\xe7\x19\x1f\x9b\x21\xc6\xc7\xf7\xaf\xf5\x31\x7b\x81\x47\xa4\x78\
+\xec\xd2\xdf\xc4\x2f\x3c\xf0\xa7\xfc\xc2\x83\x9f\x60\x62\xf0\x20\
+\xe5\x09\xf3\xbb\x3d\xd2\xa9\xef\xfb\x04\x49\x40\xa7\x19\xf1\xe1\
+\x5b\x7f\x9f\x8f\xde\xf1\xa7\x4c\x8c\xec\xe6\xae\x5b\xee\xc1\x4b\
+\xec\x1e\xb9\xa4\x49\x92\x5c\xf5\x48\x13\x71\xef\xc8\x7b\x79\xd7\
+\xae\x5f\xe5\xd6\xbd\xf7\x73\x64\xe6\x51\x3c\x63\x03\xdf\x0b\x7a\
+\x04\x20\xbb\xb5\xc8\x01\x51\x12\x32\x94\x99\xe6\xd1\xc9\x9f\xe1\
+\xe7\x8f\xfe\x05\x71\x73\x82\x9b\xf6\x1f\xc1\xc7\xea\x7b\xbb\xbb\
+\x0c\xdf\x95\x35\xd5\x0c\x4c\x67\x6e\xe7\x4f\xde\xf6\x1d\xae\x1b\
+\x3d\xca\x8f\xdf\xf9\x9f\x89\x2b\xad\x2e\x0b\x7b\x5e\xbf\x6a\xd4\
+\xf3\x7d\x34\x1d\xe6\xe7\x3a\xfc\xf2\x5d\x9f\x61\x6f\xf5\x28\xff\
+\xe5\x4d\x9f\x23\x3b\x92\x12\xc4\xdd\xed\x71\x1c\xcb\xae\x47\xda\
+\x27\x4c\x43\x3a\x5e\x87\x5f\xb8\xf1\xb3\x8c\x99\x07\x51\x46\xf2\
+\xd3\x4c\x0d\xec\x25\x08\xc2\x6b\x0a\xae\xbb\x2c\x1c\x10\xc6\x3e\
+\x77\x6c\x7f\x94\xdf\x7f\xe1\x63\x84\x56\x86\x1f\xb9\xe1\x03\x64\
+\xd4\x5c\x9f\x95\x7b\x32\xa5\xbf\x59\x0a\x3a\x5d\xb8\x99\x53\x6b\
+\xcf\xf3\xe5\x93\x7f\xc3\x3b\xf7\xfe\x7b\x26\x2a\x7b\x88\xa3\xb8\
+\xcf\xc2\x3d\x5d\xd8\xf3\x3c\x4c\x25\xc7\xc4\xc0\x0e\x3e\x77\xfe\
+\xb7\xb9\xa1\xf8\x83\x3c\xb0\xf7\xad\x0c\x66\x27\x71\xbd\xab\x9a\
+\x73\x4f\x17\x8e\xa3\x84\x72\x76\x00\x91\xed\xf0\xc4\x4b\x4f\xb0\
+\xb3\x76\x3d\xa3\x85\x1d\x78\x81\xb7\xd5\x1c\x4f\xe0\xfb\x38\xae\
+\x87\xae\x29\x04\xad\x3c\x9f\x3c\xf6\x1b\x4c\x9a\x47\x78\xf0\xba\
+\xb7\x60\xaa\x79\x5c\xdf\xc5\x73\xb7\xb2\xb0\x07\x48\xf2\xe1\x14\
+\xeb\xe9\x19\x2a\xf9\x12\xdb\x4a\x3b\xa8\x67\xc7\xf1\x7d\xaf\x8f\
+\x6f\x5b\x3d\xd2\x44\x1a\x37\xee\x3e\xc4\xf3\xeb\x9f\x42\x73\x7c\
+\x97\xb9\xe6\x25\xa2\x28\x26\xf0\x23\x24\x7a\x5f\x7a\x0c\xc3\x80\
+\x2c\x0a\x71\x12\x52\xd0\x2b\xe8\x8a\xc9\x8b\x17\xbf\x42\x9c\x76\
+\x1d\xfd\x5b\x65\x4d\x80\x24\x9f\x10\x24\x1e\x05\xa3\x8c\x2a\x3a\
+\x38\x2c\xd3\x70\x97\xf1\x7d\x97\xc0\xd7\xae\xa9\x17\x06\x30\x00\
+\x55\xa8\x04\x5e\x42\x75\x50\xe5\xc5\xb3\xc7\x98\x6b\x9c\x25\x08\
+\xba\xd6\x0e\x4d\xd3\x7a\xcf\x64\x12\x23\x46\x00\x32\x51\xa8\x97\
+\x07\x79\xe9\xf2\x4b\xc4\x25\x1f\x91\x76\x8b\xbf\x33\x81\xb9\xe9\
+\x4c\x08\x08\xbc\x00\x43\x68\x98\x19\x9d\x4a\x66\x88\xe5\xf6\x3c\
+\x31\x1e\x4e\x60\x11\xf8\x06\x32\x95\x57\xb5\x6f\xdf\x47\x20\xf0\
+\xd2\x0e\x25\x7d\x90\x86\xf3\x3c\x0a\x0a\xeb\xce\x12\x51\x18\x11\
+\xf9\xd1\x35\x72\x6c\xac\xc5\xa4\xa4\x90\x82\x63\xa5\x28\xc7\x5b\
+\x9f\xc5\xc8\x48\x82\xc0\xc3\x71\x9d\xfe\xf4\xee\x95\xfc\x6b\x22\
+\xcb\x57\x5f\xff\x33\xde\x73\xf0\x3f\x73\xca\xfd\x12\x1b\xf1\xe5\
+\x9e\x51\xa8\xcf\xab\xbd\x92\xff\x24\x4a\xe9\x68\x17\xc8\xc8\x41\
+\xee\x3b\x78\x2f\x9f\x3f\xfb\x47\xf8\xa9\x4d\x12\x5f\x4d\x61\x6d\
+\x2d\xb8\x16\x5a\xc2\x8b\x73\x4f\xf0\x33\xf7\xfe\x06\x7f\x7f\xfa\
+\xf7\xb1\xb8\x42\x35\x3b\x8a\xe7\x5d\x75\xc7\xf7\x06\x30\x8a\x62\
+\x96\xad\x39\x9c\x4e\xc2\xe8\xb6\x02\x71\x61\x96\x91\xe2\x76\xbc\
+\xa0\x3b\xa3\xae\x26\x13\x7c\x7c\xcf\x45\x22\xb0\xb5\xcb\x1c\x1e\
+\x3f\x4a\x47\x3f\xc3\x17\x4f\xfe\x15\x05\xb3\xd8\xcd\xc6\xb8\x5e\
+\x7f\x40\xba\x3e\xef\x94\xfa\x64\xc4\x4b\xe7\x5e\x65\xa2\x3e\xce\
+\x9f\xbc\xfc\x0b\x54\x8b\x75\xdc\xc0\xc1\xb6\x9d\xbe\xee\xed\x38\
+\x0e\x81\xef\x53\x2a\x64\xf9\xbf\xff\xf1\x23\xfc\xe6\xa3\x5f\x44\
+\x6b\xf9\x8b\x2c\x2e\xcd\xb2\x7c\xb1\x8d\xdf\x8e\x89\x93\x3c\x52\
+\x4a\x36\x36\x36\xf0\xe3\x88\x82\x97\xa7\xa5\x9e\xe3\xb7\x9f\xfc\
+\x25\x7e\xe2\xc1\xc7\xf8\xc7\x8b\xff\x83\xd6\x49\x95\x66\xb3\xeb\
+\x91\x96\x52\x5e\xf5\x48\x67\x04\x46\xb6\xc6\xef\x3e\xf7\x6f\xf9\
+\xa3\x1f\xfd\x27\xce\x36\xbe\xc9\x95\xd5\xf3\xac\xce\x37\xf0\x5b\
+\x57\x3d\xd2\x3d\xa7\x41\x2e\xc9\x73\xb2\xf5\x55\x0e\x78\xb7\xe1\
+\x26\x1d\xce\x2e\x7d\x89\xb9\x4b\x0e\x8d\x75\x17\xa1\x42\xa5\x52\
+\xe9\x9e\x60\x10\x13\x69\xe0\xc9\x0c\x4f\xcc\x7d\x92\xf7\x8c\x7c\
+\x0c\x51\x6a\xf0\xf5\x57\xbe\x48\x63\xde\xa1\xd5\x0c\x51\xf5\x6e\
+\x92\xb6\xd9\x68\x62\xaf\xdb\xe8\x51\x91\xa5\xe0\x14\xc7\xd6\xfe\
+\x81\x62\x31\xcb\x17\xce\xfc\x31\x8d\xc5\x90\x8d\x95\x26\x7a\xa6\
+\x2b\xe1\x5a\x96\x45\xb3\xd9\xea\x96\xe5\xaa\x79\x9e\x5c\xfe\x63\
+\x26\x9d\x43\x9c\x59\xf9\x06\x7e\x27\x61\xe1\xd5\x26\x7a\x01\x4c\
+\xb3\xab\x0b\x37\x9b\x4d\xfc\xbc\x24\x4e\x4d\x16\xd2\x17\xf8\xcd\
+\xaf\xfd\x1c\x62\xfb\xd8\x0e\x29\x10\xa8\x99\xae\x3f\xae\x57\x2f\
+\x1c\x45\x51\x31\x9b\xcd\x91\xbf\x21\x66\x6c\x6f\x8e\xd5\x93\x1e\
+\x57\x5e\xea\x80\x65\xa2\xe8\xa0\x9a\xe2\x1a\x5d\x58\xd7\xf5\x62\
+\x92\x8f\xd8\xfd\xf6\x02\xe1\x7c\xca\xe5\xe3\x1b\xf8\xb3\x5d\x9d\
+\x43\xcb\xf4\xcb\xc8\x2c\x45\x51\x9a\x52\xca\xc9\x7c\x3e\x4f\xfe\
+\x68\xca\xd8\x68\x86\xd9\xe3\x6d\xd6\xbf\x93\x90\x86\x02\xd5\x00\
+\x45\xeb\x2e\xc2\x2b\x95\x4a\xd8\x6e\xb7\x8d\x5c\x36\x87\xad\xb8\
+\xdc\xf5\xc1\x1a\x2b\x27\x7c\x66\x8f\xb5\x09\xe6\x75\x10\x29\x5a\
+\x46\x45\x72\x55\x17\x1e\x1d\x1d\x3d\xea\x5b\x01\x95\x37\x2a\x4c\
+\x4e\xe5\x98\x7d\xb1\xcd\xda\x89\x08\xe9\x75\x7f\x7a\x45\x35\xe9\
+\xeb\xc2\xb5\x5a\x2d\x94\x89\x34\xa2\x91\x88\xe9\x1b\x33\x2c\x1e\
+\x77\x68\x5e\x0c\x20\x56\x91\x48\xb4\xac\x20\x4d\x52\x74\x5d\x6f\
+\x7a\x9e\x27\x33\x99\x4c\x35\x57\x2e\xb0\xed\x5e\x89\x75\x25\x66\
+\xe3\x9c\x8f\x76\xe4\xf6\xc3\x58\x56\x17\x79\x66\x67\x67\x09\xc3\
+\x6e\xd9\xc0\x5b\xde\xf2\x16\x76\xed\xda\xc5\xc2\xdc\x22\xa7\xbf\
+\x79\x96\xba\x22\x29\xed\xf4\x51\x54\xa5\x5f\x2f\x5c\x28\x14\xb8\
+\x72\xe5\x0a\xd5\x6a\x95\x77\xbc\xe3\x1d\x68\xaa\xc6\xe7\xff\xf6\
+\x8b\x54\x6b\x03\x4c\xe4\x1b\x54\x8f\x0e\xd0\x6e\xb7\x09\xc3\x10\
+\xd3\x34\xb9\x70\xe1\x02\x71\x1c\xf3\xde\xf7\xbe\x97\x1d\x3b\x76\
+\xf0\x0f\x7f\xf7\x05\x94\x15\x8d\xaa\xbd\xce\xce\xdb\x06\x68\xb5\
+\x5b\x18\x86\x41\x92\x24\x2c\x2e\x2e\x22\xa5\x64\xdf\xbe\x7d\x3c\
+\xf2\xe8\x23\xf8\xae\xcf\x77\x9e\x7a\x95\x9c\xd5\x66\xa6\xea\xa3\
+\x8f\x6a\x64\xb3\x59\x16\x16\x16\xfa\xd4\x20\x84\xe0\x8e\x3b\xee\
+\xe0\xce\xbb\xee\xe4\xb9\xa7\xbe\xc1\xe5\xaf\xce\x52\xd7\x87\x99\
+\xbc\x21\x4b\xb3\xd5\xec\xfe\xd0\x85\x69\x62\x59\x16\x2b\x2b\x2b\
+\x8c\x8d\x8d\xf1\xe1\x0f\x7f\x98\xe7\x9e\x7e\x8e\x57\x4f\x9e\xe2\
+\xfa\xf1\x32\xd6\x40\x87\x30\x0a\x49\xe2\x84\x62\xb1\xc8\xfc\xfc\
+\x3c\xcd\x66\x13\x80\xff\xf8\x1f\xff\x23\x00\x2f\x3c\x77\x0c\x37\
+\x63\xb3\x3c\xb2\x8c\xb6\x6d\xdb\x36\x66\x67\x67\x19\x18\xe8\xfe\
+\x0e\xcc\x85\x0b\x17\x08\x82\x80\xfb\xee\xbb\x8f\xc3\x87\x0f\x33\
+\x3b\x3b\x4b\x2c\x23\x86\x86\x86\x30\x4d\x93\x6f\x7e\xf3\x9b\x8c\
+\x8e\x8e\x62\x9a\x66\xdf\x12\x3b\x3e\x3e\xce\x43\x0f\x3d\xc4\xd0\
+\xd0\x10\x17\x2f\x5d\xec\x0e\xfc\x66\x32\x60\x6c\x6c\x8c\xa5\xa5\
+\x25\x46\x46\x46\xb8\x7c\xf9\x32\x00\x0f\x3f\xfc\x30\x7b\xf6\xec\
+\xa1\xd3\xe9\xb0\xb6\xb6\xc6\xb9\x73\xb0\x6f\xdf\x3e\x2e\x5f\xbe\
+\x8c\xef\xfb\x8c\x8f\x8f\xb3\xb2\xb2\x42\x1c\xc7\xdc\x7c\xf3\xcd\
+\xdc\x79\xc7\x9d\xec\xdc\xb9\x93\xbf\xfc\xcb\xbf\x64\x7e\x61\x9e\
+\xd1\x91\x51\x9e\x78\xe2\x09\xea\xf5\x3a\x00\x6b\x6b\x6b\x44\x51\
+\x84\xa6\x69\x1c\x3c\x78\x90\x77\xff\x5f\xef\xc6\x34\x4c\x9e\x78\
+\xe2\x09\x86\x86\x86\x48\x92\x84\xf9\xf9\x79\xae\x5c\xb9\x42\x4f\
+\xaa\xed\xb1\xf0\x2d\xb7\xdc\xc2\xdc\xdc\x1c\x4b\xab\x4b\xdc\x78\
+\xe3\x8d\xbc\xf2\xca\x2b\x54\x2a\x15\xce\x9c\x39\xc3\xc1\x83\x07\
+\xc9\x64\x32\x1c\x3f\x7e\x9c\x34\x4d\x79\xf8\xe1\x87\xb9\x70\xf1\
+\x42\x3f\xb9\xf0\xfc\xf3\xcf\x7f\xff\x7a\xe1\x4e\xa7\x63\xe5\x72\
+\xb9\x62\xad\x56\xa3\xdd\x6e\xf7\xb7\xf5\x98\x72\xab\x17\xda\xb6\
+\xed\xb9\x7c\x3e\x3f\x50\xad\x56\x8b\x5b\xcd\xde\x5b\xf9\xb9\xf7\
+\x3d\x8e\x63\x2b\x0c\xc3\x66\xb1\x58\x9c\x1c\x18\x18\xa0\xd3\xe9\
+\x5c\xc3\xab\x3d\x1d\xb9\xf7\xb7\x61\x18\xa1\xe3\x38\xc6\xf0\xf0\
+\x30\xb6\x6d\x7f\x8f\x77\x79\xeb\xef\x63\x55\x2a\x15\x4e\x9f\x3e\
+\xfd\xec\xee\xdd\xbb\x8f\x6e\xb1\xfc\x5e\xb3\x4f\xef\x7f\x4d\xd3\
+\x58\x5b\x5b\x63\x7c\x7c\x3c\xb4\x6d\xdb\xf8\x97\x6a\xa2\x37\xcf\
+\xb7\x69\x59\x96\x2c\x97\xcb\xd5\xef\xde\xae\xa5\x49\x1a\x6d\xf5\
+\x31\x3b\x8e\x83\x65\x59\x5e\xb5\x5a\xcd\xb4\x5a\xdd\xf4\xbd\x4c\
+\x05\x8a\x10\x08\xe5\x7b\x78\x55\x58\x96\x95\x68\x9a\xd6\xcd\x5e\
+\x23\xd0\x84\xde\xd5\x85\x95\xab\x35\x19\x5b\xfc\xd7\xd2\x75\xdd\
+\x50\xd7\x75\x1c\xc7\x41\x57\xf5\x6b\xea\x85\x15\x5d\x5c\xd3\x7f\
+\xa7\xd3\x91\x8a\xa2\x44\xbe\xef\x6b\x9a\xa6\x09\x12\x81\x14\xa0\
+\x6a\x12\x45\xb9\xb6\xed\x26\xf8\xcb\x24\x49\x64\x9a\xa6\xb1\x82\
+\xd2\x35\x5e\x23\x51\x94\x3e\xd7\xf6\xab\x0a\xe2\x38\x4e\x2c\xcb\
+\x4a\x55\x55\x15\x02\xf8\x17\xea\x85\xc5\xe6\x7a\x37\xca\x66\xb3\
+\x71\x9a\xa6\x52\xc8\xcd\xba\x65\x40\xdb\x36\x39\x12\xc8\x48\xd9\
+\x2c\x90\xee\x16\x2f\xaf\xae\xae\x5e\xaa\xd7\xeb\x07\x7d\xcf\x97\
+\xa1\xd1\xd5\x85\x71\x4d\xd2\x4e\xb7\x46\x57\x46\x0a\x42\x93\xbd\
+\x3c\x9c\x51\x2a\x95\xf4\x4c\x26\x43\x44\x44\x3a\xde\xa6\x98\x35\
+\x48\x5a\xbd\xba\xdb\xab\x81\x87\x61\x18\xb8\xae\xbb\x5a\x2c\x16\
+\x67\x74\x5d\x17\x2d\xb5\xc5\xf0\x1e\x48\x6d\x8d\xb4\x65\x22\x1d\
+\x6d\xd3\x48\xde\xbf\xfa\x9e\xeb\xb9\xb2\x5a\xad\x0e\x04\x49\x88\
+\xb2\xa3\x4d\x4e\x33\x88\x5b\x3a\x69\x5b\x47\x46\x6a\xf7\xc7\xc5\
+\x90\x64\x32\x19\x2e\x5e\xbc\x58\x19\x1e\x1e\x0e\x7c\xd7\x8f\xdb\
+\x99\x16\x23\x13\x2a\xe1\x86\x41\x6a\x6b\xdd\x1a\xe7\x44\x20\x54\
+\xd0\x75\x5d\x18\x86\xe1\x8f\x8c\x8c\x04\x19\x33\x53\xfe\x3f\xd4\
+\x0b\x63\xdb\xb6\x7e\xe5\xca\x95\xb5\x72\xb9\x5c\x0c\xe3\x38\x0d\
+\xca\x16\x95\xba\x4a\xda\xd1\xd1\x46\x7e\xa4\x55\xd0\x35\x9d\xe6\
+\x53\x15\xa2\x55\x1d\x45\x15\x08\x21\x6a\xa5\x52\x29\x9f\x4a\x50\
+\x76\x39\x8c\xde\x11\x11\x05\x2e\x22\xd2\xd0\x45\x86\x34\x50\x68\
+\xfe\x63\x1d\x55\x55\xd1\x75\x5d\x98\xa6\xa9\xea\xba\x8e\x63\xb8\
+\x0c\xde\xe5\x53\x2f\x6a\x10\x87\x84\x9e\x0b\xba\xa4\xfd\xe5\x21\
+\xe2\x96\x8a\x94\x52\x68\x9a\xa6\x1b\x86\x21\x34\x4d\xc3\x1d\xeb\
+\x30\x7c\xbf\x46\x51\x8e\xb2\xda\x58\x41\x93\x1a\xf1\x42\x91\xce\
+\xf1\x02\x32\x06\xd3\x34\xd5\x3e\x0b\xab\x1d\xf6\xbf\x29\x42\x4b\
+\x54\x7c\xc7\xc1\x24\x47\xe4\x82\x75\xac\x44\xb0\x68\xf4\x7e\x03\
+\xb1\x52\x2e\x97\x33\x41\x94\x90\xb9\xc5\x65\xdb\x21\x13\xab\x6d\
+\x91\xa1\x40\x10\x06\xe8\x4e\x99\xc6\xd7\xcb\x98\x86\x81\xa6\x69\
+\x79\xd3\x34\xed\xff\x2f\xf5\xc2\xaa\xaa\xa2\xaa\x6a\xb5\x90\xcf\
+\xe7\x96\xfd\x16\x13\x6f\x94\x14\x06\x7d\x22\xcf\x47\xb9\x63\xea\
+\x1d\x88\x3c\xc4\xd2\xff\x2e\xa6\xec\xfe\x9d\xaa\x01\x35\x79\x80\
+\xff\xf0\xe0\xa7\x78\xef\x91\x5f\xa5\x56\xdc\x41\x7d\xdb\xc0\x35\
+\x35\xbd\x7d\x94\x4b\x03\xec\x35\x9d\x77\x1f\xfa\x65\xde\xbc\xe3\
+\x63\x1c\x9c\xb8\x87\x7b\x6e\x78\x23\x5e\xe4\x5c\xf3\xdb\x59\xbd\
+\xe3\xf8\x49\xc0\x7d\x23\x3f\xc1\xb0\x72\x23\x8f\xdd\xf1\x1f\xb8\
+\x65\xf2\xed\x78\x7a\xa3\xef\x22\x4d\x92\x44\x76\x51\x31\x24\x4c\
+\x23\x6a\xe6\x36\x1e\x19\xfb\xb7\xfc\xa7\x87\x3f\xcd\xeb\xf3\x1e\
+\xa3\xe3\xc3\xc4\xe2\xaa\x8f\x59\x76\xa7\x2c\x9e\xe7\x63\xe4\x04\
+\xdb\x94\xdb\xf9\xbd\x1f\x7c\x9a\x4a\x66\x86\x5f\x7e\xdb\x1f\xe3\
+\x65\x1a\x04\x9b\x75\xd0\xff\x7f\xea\x85\x3d\xcf\x27\x88\x02\x94\
+\x4c\xc0\xee\xf4\x9d\xfc\xe8\x4d\x3f\x87\x72\x78\xf8\x41\xee\x99\
+\xf9\x81\x4d\x16\xbe\x56\x17\xf6\x3c\x9f\x28\x0a\x38\x3c\x7a\x3f\
+\xff\xfc\xfa\x27\x78\xe1\xe5\xd3\xbc\xfd\xc0\xfb\x31\x14\xb3\x4f\
+\x22\x3d\x55\xae\x27\xff\x4d\x57\x0e\x71\xb9\xf9\x1a\x27\x16\xbe\
+\xc9\x43\x33\xef\xa1\x9c\x19\x24\xde\xd4\x76\xb7\x92\x88\xe7\x79\
+\xa8\xe8\xd4\xf3\x63\xf8\xb9\x8b\xec\x1f\xb8\x97\x89\xca\x2e\x86\
+\x72\x93\xf8\x5b\xfa\xee\x09\xeb\x71\x14\x51\xcb\x0f\x93\xad\x44\
+\x7c\xe5\x85\xaf\xf3\x96\x7d\x3f\xc1\x8d\xa3\xf7\x62\x7b\x9d\xfe\
+\xc5\x04\xfa\xb5\xc3\x42\x40\x31\xdd\xce\x27\x9e\xff\x6f\xfc\xbf\
+\x6d\x9c\x6b\x8c\x5c\x65\x01\x86\x9f\x73\xbe\x73\xce\x5c\x76\xe7\
+\xbe\xd3\xdd\x2e\xdd\xb2\xbd\xb0\xad\x6d\xb7\x58\x4b\xa9\x6c\xb1\
+\x36\xa4\x0d\x26\x1a\x8c\x25\x26\x18\x2d\x58\x8c\x3f\x08\x5a\x34\
+\x81\x5f\x68\x22\x09\xff\x88\x09\x09\x4a\x82\x09\x68\x34\x40\x0c\
+\x8a\x60\x0c\x72\x91\x16\x50\xda\x02\x52\x2b\x4b\xaf\x3b\xed\x76\
+\x2f\xdd\xeb\xcc\xec\xcc\xec\xcc\xb9\x5f\xfc\x71\x66\x4e\x97\xe2\
+\xef\x99\x39\xf9\xe6\x3b\x97\xef\xbc\xdf\xfb\xbc\xef\x57\x6e\xf8\
+\x36\x6b\x33\x43\xc4\xe5\x64\x5b\x67\xeb\x11\x4c\x65\x9a\x06\xe2\
+\x73\x79\xe1\x5d\xdc\x98\xde\x82\x69\x1b\xd7\x3a\xbc\xda\x8d\x4b\
+\x8e\xe3\xb0\x54\xd3\x79\xf8\xe0\x23\xbc\x56\xfa\x0d\x4a\xb5\x59\
+\xe1\xa3\xb9\x77\x71\x1d\x17\xcb\x0c\x08\xb8\x96\x8d\xb5\x6d\x0b\
+\x15\x70\x7c\x9b\x94\x56\xc0\x50\x54\xce\xcc\xfd\x1b\x9f\xd0\xdb\
+\x15\x42\x44\x20\xb8\xe3\x38\x78\xdd\x5e\xc8\x48\x27\x7a\x58\x10\
+\x26\x35\xf7\x2a\xb6\xdf\x6e\x81\xb3\x44\x98\x29\x6e\x4f\x60\xf8\
+\x50\x0f\xda\x09\x4b\x07\x4f\x36\xa9\x2c\x2f\x32\x5b\x9f\xc4\xb2\
+\x63\xf8\x76\x54\xf0\x88\x69\x99\x78\x8a\x87\x24\xc9\x48\xbe\x20\
+\x9f\xca\xf3\xf6\xe8\x1b\x94\x63\x2d\x64\x5f\x44\x57\x77\xb8\x99\
+\x60\x61\x5b\x16\x42\x56\xf0\x71\xe9\xe9\xea\x65\xb1\x35\x83\xe5\
+\xe9\x18\x4e\x0b\xdb\x4e\x46\xab\xb1\xe3\x38\x04\xb6\x07\x71\x48\
+\x74\xa9\x04\x6e\x48\xb9\x4a\xc8\x8c\xd7\x3e\x05\x2f\x9c\x07\x1f\
+\xaf\x3d\x27\x26\x8e\xec\xa0\x08\xc1\x52\xbd\x81\x2a\x62\xc8\xa7\
+\xea\x2f\x93\xee\x4e\x61\xbb\x76\x44\xda\xaf\x34\xa8\x45\xa0\x72\
+\x72\xfe\xcf\x6c\x49\x1d\xa0\x6f\x83\xcb\x44\xeb\x54\x38\x98\xff\
+\x93\x58\x77\x2c\x17\x23\x3e\xc1\xd2\x92\xc9\xce\xa1\x61\x5e\x39\
+\xff\x2b\x26\x97\xcf\xe2\xd8\x4e\x94\xe9\x5d\x49\xe9\xab\x9a\xe0\
+\xed\xcb\x2f\x72\xf8\x4b\x8f\xf1\xfb\xd1\xc7\xb8\x6c\x1e\x27\x9d\
+\xc8\xa3\x5f\x97\x17\x36\x8d\x70\xd7\x67\x6e\xf9\x0a\xf5\x86\x45\
+\xae\x28\x90\xf2\x33\xa8\x52\x02\xdb\xb5\x3e\x33\x6e\xd3\x34\x30\
+\x6d\x0b\x09\x41\x5d\xb9\xc8\x70\xff\x97\x99\xf2\x4e\xf0\xd7\x33\
+\xcf\xd1\xa5\x75\x87\xe3\xd6\x8d\x08\xb9\x33\x4c\x13\xcf\x87\x8d\
+\x1b\xf3\xbc\x7f\xee\x7d\xfa\xb2\xfd\x3c\xfd\xe1\x23\x64\xe2\x85\
+\x68\x4e\xae\x91\x09\x61\x8b\x5c\x21\x93\xe1\x89\xa3\x3f\xe5\x81\
+\x9d\xbf\x44\x69\x2a\xd3\xcc\x2e\x4d\x33\x5b\xaa\xa0\xd7\x3c\xba\
+\xdd\xd0\x17\x2e\x97\xcb\xd4\x1b\xcb\xc4\x9b\x49\x6c\x15\x9e\x3a\
+\xf1\x30\xf7\xec\xb9\x8f\xe9\xb9\xd3\x2c\x9d\x81\x6a\xb5\x1e\x69\
+\xe1\xce\x15\x48\x52\x42\xa8\x05\xfe\x78\xe6\x09\x7e\xb1\xfe\x19\
+\x66\xec\xb3\xcc\x8d\x66\x29\x5f\xad\x61\xd5\xfd\xce\xbb\x5d\x84\
+\x56\x74\xdb\x31\xaa\xfe\x25\x5e\x3d\xfb\x0c\x6e\xa2\xce\xe5\x85\
+\xb3\x94\x3e\x30\xa8\xce\x1b\x91\x2f\x6c\x18\x06\x8e\xe9\x60\xc9\
+\x3e\x86\x1f\xe3\xd8\xe4\x1f\xd8\xbf\xf9\x6e\xc8\x54\x38\x37\x39\
+\xcf\xfc\xe5\x3a\x8d\x25\x07\x49\x84\xef\x6c\xe5\x72\x99\x4a\xbd\
+\x41\xbf\x9d\x63\xd2\xf8\x98\x77\x27\xff\x44\x90\x68\xf2\xaf\x99\
+\x97\x59\x98\x32\x29\xcf\xd7\x50\xe3\x4a\xa4\x85\x97\xab\x0d\x1a\
+\x09\x1f\x2f\x48\xf1\xce\xdc\x73\x6c\xf5\xf7\x30\xee\x7c\x40\x63\
+\xd1\xe0\xca\xa9\x32\x8e\xee\x13\x4f\x84\x5a\xb8\x5c\x2e\x63\x24\
+\x7c\x4c\x5b\x50\xe9\x1e\xe5\xb9\xe3\x4f\xa2\x3c\xff\xc3\xd3\x98\
+\x8b\x10\xcb\x48\xa8\xaa\x12\x35\xd6\xca\xb2\x4c\x4c\xd3\x70\x17\
+\x02\xe6\xff\xe3\xd1\x98\x9a\xe3\xc7\x4f\x3d\x8a\x3e\xae\x41\x10\
+\x10\x4b\x2b\x91\xb1\xd3\x6e\xc0\xc0\xb7\x7c\x96\xce\xb9\xc8\xad\
+\x6e\xee\x7b\xe9\xfb\xe8\x25\x0d\xb3\x5e\x26\x91\x15\x88\x70\x75\
+\x8f\x8e\x9d\xcf\xe7\xb1\x67\x5b\x4c\xbd\x1d\xf0\xe1\xe8\x9b\x2c\
+\x8e\xda\xf8\x96\x84\x92\x04\x2d\xa6\x46\x50\x64\x10\x04\x68\x09\
+\x0d\xcf\xb0\x99\x3f\xed\xb2\x3c\x3b\xc3\xb1\x5f\x3f\x8e\x7e\x59\
+\xc5\x5c\x72\x89\x67\x15\x14\x45\x44\x81\x48\xa1\x28\xc4\x64\x15\
+\x7d\xdc\xa7\x5a\x87\x17\x2f\xbe\xc4\xd2\x79\x9f\xc6\x15\x1f\x2d\
+\x29\xa3\x25\xd5\xa8\xd2\x59\x08\x81\x1a\x53\xe9\xd6\x7d\x16\x47\
+\x1d\x96\xe7\x17\x39\x7e\xee\x05\x96\xce\x05\xb8\x7a\x40\x3c\x2b\
+\x50\x54\x39\x82\x33\x25\x49\x22\x21\x69\xd4\x2e\xb8\x34\x15\x9f\
+\xb3\x93\xef\xa0\x6c\xda\xb0\x05\xe9\x26\xd0\xd4\x30\xc1\xe8\xfb\
+\x3e\x33\x33\x33\xec\xd9\xb3\x87\x81\x81\x01\x2c\xdd\xe6\xf4\x07\
+\x9f\xb0\x2a\x19\x43\x4a\x2c\x52\xdc\xd7\xc3\xfc\xc2\x3c\x8d\x7a\
+\x83\x42\xa1\xc0\xd8\xd8\x18\xbd\xbd\xbd\xec\xdb\xb7\x8f\x54\x77\
+\x8a\xbf\xff\xed\x0d\x7a\xfb\x7a\x59\xe5\xcc\xd3\xbb\x7b\x15\xf5\
+\x46\x8d\x56\x4b\x27\x9d\x4e\x73\xe1\xc2\x05\x0c\xc3\xe0\xfe\xfb\
+\xef\x67\xe7\xce\x9d\xbc\xf5\xfa\x3f\xb0\xaa\x36\x92\x32\xc3\xb6\
+\x03\x39\x9a\xcd\x26\xb9\x5c\x8e\x5a\xad\xc6\xf4\xf4\x34\xad\x56\
+\x8b\xe1\xe1\x61\x46\x46\x46\x88\x69\x31\x3e\x39\xf5\x29\x9e\xd1\
+\xe2\x06\xa9\x45\x6c\xab\x46\x26\x97\xe1\x52\xe9\x12\xf1\x78\x3c\
+\x4c\x27\xa9\x2a\x23\x23\x23\xdc\x7c\xf3\xcd\x9c\xf8\xe7\x49\x16\
+\x2f\x56\x28\x6a\x82\xbe\x41\x19\x77\xad\x43\xb5\x52\xed\x10\xb8\
+\x51\x6c\xf6\xd0\xa1\x43\x2c\x55\xaa\x7c\x7c\xec\x34\x99\x54\x8a\
+\x78\xcc\x24\x7f\xd3\x32\xb9\x7c\x0e\xcb\xb2\xa8\x54\x2a\xb4\x5a\
+\x2d\x74\x5d\xe7\xc8\x43\x47\x68\x35\x9b\x8c\x97\x26\x59\xaa\xd5\
+\xc8\x3a\x16\xca\xf0\xf0\x36\xce\x9f\x3f\xcf\xe0\xe0\x20\xa9\x54\
+\x2a\x12\xfc\x7b\xf7\xee\xe5\xf6\xdb\x6f\x0f\x21\x1f\x7e\x47\x2e\
+\x97\xc3\xb6\xed\x08\xcb\xb5\x4c\x8b\x62\xb1\xc8\xd8\xd8\x18\xf9\
+\x7c\x9e\x43\x87\x0e\x91\xcf\xe7\xb9\x3a\x73\x95\xa1\xa1\x21\x26\
+\x26\x26\xe8\xd4\x28\x5f\xb9\x72\x85\xad\x5b\xb7\x52\x2a\x95\x30\
+\x4d\x93\x3b\xee\xb8\x83\x4d\x9b\x36\x31\x31\x31\x11\x2e\x00\x9e\
+\xc1\xf6\xed\xdb\x39\x7d\xfa\x34\xe9\x74\x9a\xfe\xfe\x7e\xe6\xe6\
+\xe6\x00\xd8\xb1\x63\x07\x07\x0f\x1e\x64\xfd\xfa\xf5\x3c\xfb\xec\
+\xb3\x2c\x2c\x2c\x50\x28\x14\x38\x79\xf2\x24\x7d\xbd\x7d\xed\xc6\
+\xca\x90\xd1\x51\x14\x85\x91\x91\x11\xee\xbd\xf7\x5e\x1c\xc7\xa1\
+\x54\x2a\x31\x34\x34\xc4\xa5\x4b\x97\xc8\x66\xb3\x1c\x3d\x7a\x94\
+\xb5\x6b\xd7\x32\x35\x35\x45\xb9\x5c\x26\x97\xcb\x71\xf8\xf0\x61\
+\x46\x47\x47\x29\x57\x2b\x6c\xde\xbc\x19\x5d\xd7\xb9\x70\xe1\x02\
+\x99\x4c\x86\x62\xb1\x48\xa9\x54\x8a\x7c\xe1\x23\x47\x8e\x70\xee\
+\xdc\x39\xc6\xc7\xc7\x99\x9d\x9d\x0d\x19\xe9\x5d\xbb\x76\x05\x1d\
+\x9d\xe8\x38\x0e\xc9\x64\x92\xc9\xc9\xc9\x8b\x6b\xd6\xac\x19\xda\
+\xbc\x79\x33\x63\x63\x63\xd1\xce\xf3\xf5\xdd\xcc\xed\xf8\x53\x53\
+\xd3\xb4\xd8\xd6\xad\x5b\xd5\x6a\xb5\xca\xf2\xf2\x72\xa4\x55\x3b\
+\x5e\x6b\x27\x62\x2f\x49\x52\xd9\x75\xdd\x71\x60\x57\x36\x9b\x8d\
+\x68\x82\x95\xbb\x29\x2b\xfd\x67\x55\x55\x1b\xb3\xb3\xb3\xd2\xfe\
+\xfd\xfb\x53\x63\x63\x63\x91\x36\xed\x3c\x36\x3a\x15\x2d\xae\xeb\
+\x76\x18\xe9\x89\x91\x91\x91\x1b\x6d\xdb\x8e\xbc\xdb\xce\x6e\xf2\
+\xca\xa6\x8e\x95\xbe\x70\x87\xed\x5e\xb9\x58\xac\x1c\xbb\xef\xfb\
+\x08\x21\xa8\xd7\xeb\xe5\x62\xb1\xd8\x33\x38\x38\xc8\xe4\xe4\x64\
+\x74\x4b\x2b\xa9\xee\x74\xa4\x29\xa5\x76\x96\xd6\x75\x5d\xaf\xbd\
+\xbf\x46\x32\xd1\x15\x62\xb4\xda\xf5\x5c\x72\x88\xf8\x5a\x96\xe5\
+\xa6\x52\x29\x75\x76\x76\x16\x59\x96\xdb\x8c\xf4\xf5\x1c\x73\xd0\
+\x99\x44\x79\x66\x66\x46\x5a\xbd\x7a\xb5\x27\x84\x90\x62\x5a\xec\
+\xb3\x59\x64\xae\x79\xbd\xed\x1a\xe4\xa0\x58\x2c\x2a\x53\x53\x53\
+\x24\x12\x09\x3a\x5a\x58\x6a\x7f\xb7\xab\xab\x3b\xfa\x4d\xfb\x8f\
+\x9a\xba\xae\x63\x3b\x36\x71\x2d\x8e\xef\x43\x5c\xfb\xfc\xf1\x85\
+\x10\x94\xcb\x65\x84\x10\x52\xbd\x5e\x47\x42\x42\x15\x31\x34\x25\
+\xb6\x82\x91\x96\x22\x4d\xdc\x68\x34\xf0\x7d\xbf\x99\x4e\xa7\x7b\
+\x16\x16\x16\xe8\x4a\x74\x11\xf8\x61\x7d\x96\x92\x1b\x8c\x47\x5a\
+\xb1\x73\x36\x65\x59\x76\xf3\xf9\x3c\x86\x6e\xe0\x74\x99\x24\xfb\
+\xed\xb0\x94\xd0\x10\xf8\xba\x1a\xe6\x85\xdb\x98\x6c\xa5\x52\x69\
+\x15\x0a\x05\x55\x08\x11\xf3\xf0\xf0\x56\x2d\xd3\x9d\x52\x42\xd6\
+\xb8\x93\xe9\x75\xe5\x4e\x0d\x7c\x22\x16\x8b\xe5\x93\xc9\xa4\xa3\
+\x28\x8a\x68\xca\x4d\x72\x03\x12\xbe\x29\x11\xb4\x54\x7c\x5d\x21\
+\xb0\xe4\xd0\xeb\x0d\xaf\x02\x21\x84\x48\xe6\x72\x39\x5a\xbe\x41\
+\x7a\xa3\x05\xae\x4c\xa0\x2b\x04\xa6\xd2\xee\xda\x92\x91\xa4\x10\
+\x6b\x53\x14\x65\xb2\xa7\xa7\x67\x93\xa9\x9b\xd4\xe2\x55\xfa\x06\
+\x05\x4e\xb3\x9d\x73\xd6\xc3\x9c\x73\x27\xb1\x2e\xcb\x32\x7d\x7d\
+\x7d\x6a\xe0\x07\x94\x9d\x3a\x7d\x5b\x20\xb0\x24\x7c\x43\x21\x30\
+\x04\x7e\x33\xe4\xaf\x65\x21\x77\x56\xf7\x4b\x99\x4c\x66\xd0\xb2\
+\x1d\xfc\x55\x4d\x52\x05\x19\x57\x07\x25\x7b\xa0\x8c\x2c\x04\x4b\
+\x6f\x65\x71\xe6\xb5\x4e\x0b\x5b\x5c\x08\x81\xe3\x7b\xf8\xfd\xcb\
+\x24\x77\xb7\xe8\x4d\x0c\xd0\x34\xeb\x21\x74\x69\x2b\x54\x5e\x29\
+\x46\x77\x9a\xa2\x28\xb2\xe7\x79\xe8\xaa\x41\x6c\x7b\x95\xe2\x9a\
+\x1c\x29\x35\xcb\x4c\x75\x8a\x58\x5c\xa5\x7e\x2c\x8f\x3d\x13\xc3\
+\xf7\x7d\x59\x51\x94\x64\x2c\x16\xd3\x14\x45\x91\xe7\x56\x4f\xb3\
+\xe5\x4e\x8d\x44\x50\x60\xa9\x59\x41\xc8\x02\x77\xaa\x9b\xe5\x8f\
+\x52\xf8\x6e\xd8\x20\x62\x59\x16\xb2\x2f\x05\x73\x4a\x45\x1a\xdc\
+\x1b\x10\x0f\xb2\x58\x76\x0b\xd7\xb1\x09\x0c\x95\xfa\xf1\x0c\xce\
+\xa2\x8a\xa6\x69\x04\x41\x10\x97\x65\x19\xd9\x95\x59\x5e\xb7\xc0\
+\xe6\x3d\x69\x12\x41\x9e\xa6\x5e\xc3\xb6\x1d\x68\x24\xa9\xbe\x99\
+\x5d\x59\xaf\x27\x39\xb6\xc3\x7c\x72\x91\xe1\xbd\x49\x02\x2b\x8e\
+\x2a\x4b\x34\x5a\x15\x54\x45\x63\xf1\x95\x3c\xbe\x11\xed\xe4\xa4\
+\x09\xa0\x6a\xe8\xac\xbb\x4d\x47\xc9\x18\x0c\xa4\x86\x90\x0f\xac\
+\x7b\x80\x64\x57\xbb\x3b\xcb\xba\x96\x17\x0e\x2b\x92\x2c\x3c\xd9\
+\x66\x7d\xec\xab\x7c\x6f\xc7\xa3\x7c\xe7\x0b\x8f\xb3\x2e\xb3\x3b\
+\x2a\x31\xec\xd8\x9a\x51\xfe\xd7\x73\x58\xa8\x34\xf8\xd1\xee\x27\
+\x19\xce\xde\xc5\x37\xb7\x3f\xc0\xb7\x6e\xfd\x01\xa6\xdb\x5a\x49\
+\xa8\x06\x1d\x59\x67\x05\x06\xbb\x7a\xef\x66\x77\xf1\xbb\xdc\xb3\
+\xfb\x41\xbe\xb8\xea\x1b\xe8\xa2\x82\x71\xad\x47\xba\x93\x17\x96\
+\xbc\xc0\x61\x6d\x6e\x13\x5f\x1f\x7c\x88\x9f\xdf\xf9\x5b\x32\xe6\
+\x6d\xac\xea\xed\xc1\xf6\xcc\x28\x45\x19\xf5\x5f\x1b\x26\x8a\x26\
+\xb1\x31\xb9\x87\x07\x6f\x79\x9a\xa1\xfc\x5e\x7e\xb2\xf7\x19\x6c\
+\x6d\xf9\x33\x34\x6b\xc7\x73\x96\x55\xb8\x32\x51\xe3\xd1\x7d\xcf\
+\xb3\x21\xbb\x9b\x9f\xed\x7f\x01\x27\xd9\x88\x3e\xbf\x96\xd6\x6c\
+\xe7\x85\x65\x83\x7d\xa9\x76\x5e\x78\x4d\x6a\x13\xeb\x0b\xdb\xb0\
+\xed\x50\x79\x74\xb4\x70\x28\xf8\x4d\x5c\xd7\x64\x53\xe1\x16\x8e\
+\xcf\xfc\x85\xf7\x4e\x7d\xc4\xce\x35\xfb\xc2\x64\xf9\x0a\x6d\x1b\
+\x69\x61\xdb\x22\x2b\x06\x98\xaa\x95\x38\x71\xf9\x75\xbe\x36\x74\
+\x08\x81\xc0\x75\xbd\x48\x67\x77\x1a\x83\x0c\xc3\x20\x70\x15\x06\
+\x73\x37\x71\xd6\x7c\x95\x1d\xf9\xbb\xd8\x58\xdc\x46\x5f\xd7\x7a\
+\xcc\xeb\x7c\x61\xd3\x34\xc2\xbc\xb0\x92\xa4\xea\x4c\xf3\xdf\xd2\
+\x28\xb7\xae\xdb\x4b\x3e\xbe\x1a\xd3\x32\xae\x53\x22\xa1\xe7\xac\
+\x08\x41\x73\x49\xf0\xda\xd9\xe7\x59\xad\x6d\x63\xfb\xda\xed\x68\
+\x52\x22\xd4\xca\xc6\x0a\x4d\x6e\x1a\x04\x81\x47\xd6\xdb\x40\xd5\
+\x2b\xd1\x97\xed\xa7\xb7\x7b\x80\xde\xe4\x40\x14\xde\xee\x48\x50\
+\xbd\xcd\x48\x37\xda\x79\xe1\x33\x95\xf7\xf8\x1f\xcb\xb6\x8e\xf6\
+\x8f\xf1\xef\x16\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x1a\x78\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x64\x00\x00\x00\x69\x08\x06\x00\x00\x00\xcc\x7c\x86\x8a\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x88\x26\x00\x00\x88\x26\x01\
+\xac\x91\x9d\x06\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x03\x03\
+\x0e\x04\x3a\x04\x0e\x03\xc5\x00\x00\x19\xf8\x49\x44\x41\x54\x78\
+\xda\xed\x9d\x7b\x74\x54\xf5\xbd\xe8\x3f\xbf\xbd\x67\xcf\x64\x92\
+\x0c\x79\x12\xc2\x23\x01\x4a\x28\x8f\x4a\x90\xa2\x16\x6b\xc3\xa9\
+\xa0\x02\xf5\xd4\x2e\xbd\xda\x2e\x5b\xee\xa5\x85\x7a\xb4\x75\xf5\
+\xae\x16\xef\x83\xf6\xf6\x9c\x73\x5b\xd0\x7a\x7b\xaf\x4b\xaf\xbd\
+\xb4\x97\xd5\x7a\x3d\x2a\xb7\xd6\x1e\x3d\xe7\xd4\x5a\xa1\x2a\x78\
+\x05\x0f\x4a\x00\x51\x08\xa4\x09\xaf\xc8\x23\x04\xf2\x9a\x24\x33\
+\x99\xcc\xec\xc7\xef\xfe\x31\xcc\x66\x1e\x7b\x87\x09\x4c\x12\x70\
+\xe5\x3b\x6b\xaf\x64\xf6\xfe\xfd\x7e\xfb\xf7\xfb\xbe\xbf\xdf\xdf\
+\x63\x04\x40\x65\x65\x65\x9d\x10\x62\x07\x63\x30\xea\xa0\x00\xaa\
+\x65\x59\xda\x18\x2a\xae\x0e\xf0\x00\x85\xa6\x69\x16\xaa\xaa\x0a\
+\x80\x94\x12\xcb\xb2\xc6\x30\x33\x42\x20\x84\x40\x51\x94\x14\x82\
+\x94\x1b\x86\x51\xe6\xf5\x7a\x01\xc8\xcf\xcf\x67\xe5\xca\x95\x63\
+\x98\x1a\x21\xd8\xbf\x7f\x3f\x7b\xf7\xee\x4d\x21\xc8\x44\xc3\x30\
+\x2a\xd3\x0b\x9a\xa6\x89\xae\xeb\x63\x18\x1b\x46\xc9\xf0\xf9\x7c\
+\x08\x21\x32\x54\xd6\xf8\x0b\x97\x0d\x52\x4a\xfa\xfb\xfb\x69\x6b\
+\x6b\x1b\xc3\xdc\x30\x41\x5e\x5e\x1e\x53\xa6\x4c\x41\x4a\x99\x41\
+\x90\x80\x65\x59\x81\xf4\x0a\xc3\x65\x4b\x84\x10\x28\x28\x08\x40\
+\x20\x88\x19\x26\x31\xcb\x40\xf5\x9b\xf1\x3b\x31\x0f\xaa\xa5\x82\
+\x00\xa1\x48\x10\x20\x91\x9f\x38\x82\xa4\x13\x22\x99\x20\x5e\x21\
+\x84\xe6\x54\x30\x5d\x9c\x72\x01\x41\xa3\x8f\x93\xfa\x39\xba\x8d\
+\x10\x03\x32\xc6\x67\x6e\xc8\x67\x76\x6d\x01\x49\x76\x8d\xfe\x1e\
+\x89\x6c\xcf\x27\x76\xce\x87\xd5\xee\xc7\x33\x90\x17\x27\x90\xdd\
+\xb1\x4f\x36\x41\x14\xcb\xb2\xd4\x64\x22\x58\x96\x95\x53\x09\x11\
+\x40\x8f\x19\xa6\x61\xe0\x04\x1d\x66\x0f\x42\x2a\x4c\x9d\x9e\xc7\
+\x8a\xa5\x65\xe4\xe5\x29\x98\x26\x48\x09\xe2\x82\x34\x14\x94\x0a\
+\x28\xeb\x47\xcc\x09\x83\x02\xb1\x01\x89\xec\xd3\x30\x7a\x35\x64\
+\x9f\x86\x19\xf2\x60\x85\x34\xac\xb0\x07\x2b\xa4\xa2\xe8\x9a\x2d\
+\x4d\xf1\x4b\x5e\x13\x04\x49\xe0\x39\x9d\x20\xc2\x49\x12\xdc\x28\
+\x78\x39\x10\xb2\x22\xfc\x6b\x7f\x03\x52\x4a\x54\xa9\x52\x31\xc9\
+\xcb\x17\xbf\x54\x8a\xb4\xc0\x30\x24\x42\x08\x12\x5d\x10\x71\x1d\
+\x05\x52\x20\x11\x60\x48\x34\x55\x81\x62\x13\x6f\xb1\x09\x0c\x10\
+\xef\xda\x85\x72\xc0\x40\x48\x62\x9c\xcf\xc3\x68\xf7\xa1\xb7\xf9\
+\xf0\x84\xf3\x6d\x4e\x10\x57\xa9\x44\x0d\x26\x21\xae\x94\xcb\x85\
+\x84\x18\xd2\x64\x57\xff\xa1\x0b\x12\x20\xf0\xe5\x09\x6e\xbb\xab\
+\x0c\x69\x65\xa9\x16\xed\xe7\xc2\xf1\x96\x04\xfc\x45\x02\x8a\x07\
+\x10\xb3\x07\x40\x01\x3d\x66\x61\xf6\x7a\xb0\x7a\xbd\x18\xbd\x2a\
+\xb2\xcf\x8b\x19\x56\x91\x21\x0f\x46\x48\x41\x89\x7a\x11\x42\xc6\
+\xc3\xe2\x51\x92\xa8\xc1\x24\xc4\xb5\x42\x2e\xa4\xe4\xa4\x7e\x0e\
+\x43\x9a\x28\x17\xb0\x58\x33\xb7\x00\x45\x11\xc8\x1c\x31\xae\xdd\
+\x86\x14\x48\x13\xa4\x09\x1e\xa1\xe0\x29\x92\x50\x14\xbd\x30\x96\
+\xfe\x14\x89\xd2\xa3\x92\x81\x36\x0d\xeb\x9c\x9f\x48\x9b\x07\x4f\
+\x77\xbe\xad\xee\x46\x4a\xa2\xb2\x96\x90\x64\x62\xe4\x82\x20\xed\
+\x46\x4f\x8a\x14\x54\x4e\xf6\x0e\xab\x5d\x16\x4e\xff\x25\x4b\x94\
+\x94\x78\xfd\x02\xef\x0c\x1d\x51\xa3\x53\xa2\x48\x4c\xab\x83\x58\
+\x8f\x02\x3d\x5e\x62\x3d\x2a\xf4\x7a\x31\xc2\x0a\x84\x35\x62\x21\
+\x81\x12\xd1\x10\x6a\x6e\x25\xc9\x0d\xbf\xc3\x4e\x90\x90\x8c\xa4\
+\x7c\x2f\x2c\x52\x47\x3d\x20\x03\xc0\x8a\x4b\xa9\x34\x40\x11\x0a\
+\x79\x85\x12\x0a\x63\xe4\x4d\x06\x49\x04\x64\xc2\x96\x81\x65\x40\
+\xd7\x9f\x4b\x90\x5d\x79\x39\x27\x48\x56\x2a\x2b\x97\x04\x31\x30\
+\xe3\x86\xfa\x02\xf8\x7c\xa3\x4b\x10\x57\x02\xa5\xcb\x56\xc2\x63\
+\x93\xa0\xfa\x40\xd1\xc0\x90\x72\xe4\x09\x92\x4b\xef\x8a\xf8\x78\
+\x6c\xfb\x01\xa0\x88\x6b\x2c\x8c\x10\x49\x03\x19\x01\x18\x54\x42\
+\xc6\xb2\xbe\xc3\x97\xb9\x18\x92\x0d\xc9\xb5\xa4\x64\xb6\x25\x87\
+\x50\xf7\x82\x5a\x11\xf1\x7a\x71\xc4\x48\x5b\xdd\x08\x2e\xc6\x30\
+\xc3\x4a\x90\x1c\x8b\xc8\x90\xbc\xac\x04\x27\xe4\x82\x23\x84\x88\
+\x1b\xcd\x54\x50\xb2\xaa\xab\xa8\xd0\xd5\xae\x73\xea\x64\x1f\x35\
+\x15\x73\xb8\x61\xc6\x4d\x54\x96\x4e\x60\x7a\xe5\xa7\x50\x15\xe8\
+\xec\x6f\xe3\x64\xf0\x2f\xb4\x85\x3e\xe6\x78\x77\x03\x8a\x50\x1d\
+\xde\x95\x33\x0c\xe6\x5c\x42\x86\x1c\x87\x0c\xb7\x63\x7a\x29\xc9\
+\x78\xfb\x4f\xdd\xf4\xb4\xc3\xab\x3f\xfb\xbf\xcc\x9f\x3e\x1f\x8f\
+\xea\x71\xec\xa7\x29\x0d\xce\xf4\x1e\xe5\xd7\x7b\xff\x96\xf3\xa1\
+\x93\xa8\x8a\x73\xb9\x44\x46\xc0\x92\x56\x5c\xf2\x10\x59\xe7\xeb\
+\xe4\x30\xa8\x40\x27\x3c\x2b\xd9\x78\x01\x57\x72\x5d\x0e\xc4\x06\
+\x2c\x5e\x7d\xb1\x0d\x2d\x56\xc6\x47\xcf\xec\x60\x61\xcd\x42\x54\
+\x45\x75\xf5\x92\x3c\x8a\xc6\xd4\xe2\x39\x6c\xb8\xed\x65\x6e\xfd\
+\xd4\x7d\x18\x96\xee\x58\x2e\xd4\x6b\xb0\xed\x4f\xed\x4c\xb6\xea\
+\xb8\xbf\x76\x2d\x4b\x3e\xf5\x55\xe6\x8c\xff\x5c\xd6\x0c\x92\x2b\
+\x9c\x0c\x86\x97\x61\x77\x7b\x11\x82\xf4\x66\x06\x6b\xd7\xb2\xe0\
+\xf5\x7f\xec\x24\xe0\x2f\xe5\xfd\x5f\xbe\x89\xdf\xeb\xcf\x2a\xc5\
+\x92\x90\x80\xfb\x6b\xff\x23\xc5\x79\x15\xfc\x63\xc3\xff\xc4\xab\
+\xfa\xec\xe7\xaa\x47\xd0\x72\x64\x80\xe6\xc3\x3d\xdc\xff\xf7\x7f\
+\x43\xcd\xc4\x99\x00\xb4\x74\x1f\xe6\xf0\xf9\xf7\xb3\xa0\x88\x95\
+\x53\xad\xe1\xa4\xae\x06\x55\x59\xb9\xf3\xf3\xe3\xae\x6e\x32\xa7\
+\x2a\x8a\x3b\x72\x0f\x7f\xd0\x47\xa4\xdf\xe4\xe7\x0f\x3e\x62\x13\
+\x23\x1d\xa2\x46\x84\xf7\xff\xb2\x1b\x4d\xf8\xb9\x61\xd6\x02\xbc\
+\x1e\x6f\x0a\x61\x56\x7c\x7a\x15\x4d\x1d\x7b\x69\xee\xfc\xe0\x22\
+\x41\x54\xc1\xc9\x63\x03\x54\x56\x94\x50\x33\x71\xa6\x4d\x40\x04\
+\x29\x73\xda\x57\xaa\x6a\x73\xee\xf6\xe6\x42\xe5\x5c\xb6\x1f\x23\
+\x05\x87\x3f\x0c\x51\x5e\x12\xe0\xdf\xde\x76\xbf\x63\xa9\x73\xa1\
+\x53\xfc\xb7\x9d\xab\xe9\xe9\x0b\xb3\xf5\xe5\x4e\xaa\x27\x54\xf1\
+\xde\x2f\xde\xca\x08\xf4\xfe\xcd\x67\xfe\x3d\x8f\xbd\xb3\xca\xfe\
+\x1e\x09\x5b\xf4\xf5\x98\xdc\x3c\x6f\x61\x76\x49\xcd\x61\xca\xed\
+\x5d\x4a\x0b\x29\x83\x89\x93\x65\x59\x57\x7c\x25\x5c\xc6\xc4\x27\
+\xfd\x7b\xe2\xa3\xa8\x82\x86\x7d\x7d\x74\xf7\x84\xf9\xdf\x8f\x3c\
+\xe1\x6a\x04\x5f\xf8\xf0\x51\x22\x46\x98\xbc\x7c\xc1\xed\x77\x97\
+\x70\xf0\x48\x13\x77\xfe\xf8\xde\x0c\x04\x57\x15\xcd\xa4\xa6\x74\
+\x3e\xa6\x65\x20\x91\x74\x77\xe8\x48\x24\xd7\xd7\x5c\xe7\xe8\xd2\
+\x5e\xf2\x93\x23\x7c\x24\x2e\x37\x2f\x4b\x71\x32\x7e\xb9\xe4\x06\
+\x91\xf6\x71\xba\x27\x10\x28\x42\xa1\xf9\x60\x3f\x15\xe5\x45\x2c\
+\xb9\x7e\x89\xa3\x51\xee\x8e\x9c\xa3\xb1\xbd\x1e\x81\x40\x5a\x50\
+\x50\xa8\x32\x73\xf6\x38\xde\xfb\x70\x3f\xef\x37\xd6\x67\xd4\x59\
+\xb3\xf0\xa7\x58\xc4\xd0\x54\x85\x73\x6d\x61\xf4\x98\xc1\xbc\x4f\
+\xcd\xc9\x70\x9f\x84\x14\x5c\xea\x93\x6b\x37\x2b\xeb\xc0\x30\xd9\
+\x1d\xcb\xdd\x8c\xa1\xc8\x20\x51\x3a\x74\xb4\xc5\xd0\x63\xb0\xe2\
+\xe6\xbf\x72\x8d\x25\xde\x39\xf1\x4f\xa8\xc2\x13\xaf\x7f\xa1\x89\
+\x09\x93\x7d\x9c\x3c\x16\xe5\x9d\x8f\xfe\x95\x45\x73\x6e\x4a\x19\
+\x47\xb1\x7f\x3c\x4d\x3b\x4b\x68\x3a\x76\x8a\xed\xbf\x78\x99\xfe\
+\xaf\xc7\x98\x33\x25\x95\x20\x01\x5f\x09\x9f\xab\x5a\xce\x80\x11\
+\x41\x37\x23\xb4\x87\x5b\xe9\xe8\x3f\xe3\x28\x45\xb9\x8e\x43\x46\
+\xc7\xcb\xca\x12\xba\xda\x75\x84\x80\x05\x33\xe7\xb9\x96\x69\xee\
+\xfc\x00\x55\xa4\xba\xbf\x25\x65\xf1\xe5\x00\x07\x8e\x35\x38\x26\
+\x0d\xe7\x55\xcd\xa7\xe1\x2f\x1f\x33\xa9\x64\x32\x25\x53\xca\x33\
+\xda\x2c\xcb\x9f\xc8\xaa\x05\x7f\x1b\x4f\xec\x4a\x8b\xff\x77\xe2\
+\x65\x5e\x39\xf4\xf4\xd5\x65\x43\x86\x23\x0f\x94\xfa\x72\x99\x71\
+\x85\x7a\x4d\xa4\x94\x54\x55\x4c\x74\x6d\xe7\x74\x4f\x33\x42\x28\
+\x29\xf5\x0a\x02\x2a\x52\x4a\xce\x76\xb6\x3b\xd6\x99\x3b\xf5\x33\
+\x59\x05\x76\x82\x78\x46\x41\x49\x6b\xff\xe2\x75\x15\x24\x17\x73\
+\xc1\x11\x8a\x48\x55\x51\xc2\xc5\x7d\x0c\xf7\x59\x08\x21\xa8\x99\
+\x3c\xd3\xb5\x2d\xc3\x32\x33\x8c\xb7\x3f\x5f\x41\x08\x41\x6b\xc7\
+\x19\xc7\x3a\xd3\x26\x4d\xc6\x32\xa1\xc0\xe7\x4f\x89\x57\x06\x57\
+\xaf\xc2\xd9\xf0\xcb\x51\x9a\xa0\x4a\xcf\x69\x5d\x79\x2c\x22\x2e\
+\xe9\xd3\x87\x43\x71\x64\x57\x96\x95\x39\x47\xef\x66\xd4\x11\x91\
+\xaa\x27\x9e\xfe\x08\x47\x23\xce\x12\x32\xb3\x9a\xaf\xfd\x4d\x25\
+\x13\xef\x9b\x45\x59\x51\x11\x47\xfe\xe1\x50\xaa\x1b\xdd\x77\x8a\
+\x7f\x3e\xf8\x0c\x9a\xe2\xa3\xc0\x57\x48\x47\xf4\x63\x67\x82\x58\
+\x57\x81\x0d\x19\x49\xd0\x63\xf1\xc1\x96\x14\x16\x3b\x3f\x37\x07\
+\x5c\x93\x4c\x9a\x4f\x10\x89\x39\x3f\x2f\xce\x1b\x8f\xc7\xa3\x90\
+\xe7\xc9\xc7\x32\x32\x35\x74\xc4\xe8\xe3\x40\xc7\x9b\xa9\x32\xe2\
+\xb4\x0a\x67\xd8\xd5\xf8\x20\x5e\x56\x6e\xd7\x65\x65\x17\x80\x99\
+\x46\xbc\x63\xf9\xde\x80\xab\x84\xb8\x81\xd7\xab\x10\xee\x77\x5e\
+\x87\xec\x55\xf3\x2e\xa6\x0c\x84\x73\xf7\x44\x36\x19\xe2\xd1\xcc\
+\xf6\x26\x62\x91\x5c\xac\x5c\x8c\xe3\x41\xa4\x7d\x77\x20\x88\x39\
+\x78\xf4\xac\x9b\x51\x57\xd2\xfa\x7c\x0a\xba\x61\x3a\x3e\xd3\x54\
+\xef\xc5\xf5\x73\x0e\xed\x0b\x57\xab\x96\x8d\xea\xcd\xb5\x2a\x1f\
+\x64\x3e\x64\xa4\x67\x0c\x0d\x43\x0e\x3a\xdf\x1e\x1b\x54\x65\x29\
+\x18\xba\x85\x69\x99\x19\x59\x61\x4d\xf1\x5d\x94\x84\x2b\xc8\x47\
+\xe5\x1a\x1f\xc9\x11\xfb\x88\x67\x7b\xb3\x51\xc0\x8a\x10\xf6\x4c\
+\xe0\x50\xb8\x53\x42\xea\xaa\xc7\x61\xe2\xea\x38\x3e\x86\x3f\x52\
+\x57\x46\x42\x34\xb3\x01\x55\x15\xe8\x86\x3b\x07\xda\xb6\xc0\x81\
+\xde\x7a\xcc\x42\x55\xe3\x3b\x91\xd2\x07\x69\x5a\xc6\x05\x0c\x08\
+\x57\x09\x1b\x2d\xc8\x5a\x65\xb9\xcd\x66\x5d\x49\x2e\x2b\xcd\x8a\
+\x3a\xbb\xaf\x03\xee\x8c\xa0\xa9\x3e\xc7\x7a\x08\x81\x11\x13\x68\
+\x9a\xc7\x71\x90\xba\x15\x03\x71\x31\x8b\xe6\x4a\xd5\x51\xca\xf6\
+\x66\x6d\x43\x92\xb3\xb5\x23\x25\x21\x08\x88\x9a\x11\x7c\x6a\xe6\
+\x3c\x88\x6d\x0b\x5c\x5c\x66\xaf\xe6\x71\x71\x06\x62\xb9\x41\x20\
+\x16\xb9\x44\x47\xd6\xd9\xde\x5c\x4a\x87\x9b\x4d\x72\x4a\x6f\xfb\
+\xfc\x71\x75\x73\xae\xfb\xbc\x8b\xca\xf2\x39\xd6\x13\x02\x62\x31\
+\x49\x9e\xe6\x75\xce\x00\xc4\x82\x17\xd3\xfe\xd2\x0d\xd9\x97\xfe\
+\x0c\x47\xb6\x77\x48\x81\x61\xee\x88\x92\x39\x43\xa8\x38\x98\xae\
+\xfc\x02\x15\x45\x51\xe8\xea\x09\x52\x5d\x3e\xd5\x51\x65\x09\xe9\
+\x10\xb4\x49\xe2\xa9\x91\x7c\x67\x1b\xd3\x1b\xed\x8e\xef\xd8\x12\
+\x02\xb7\x89\x41\x25\x8b\x94\x9e\xcc\xf1\x14\xee\x90\x92\x8b\x39\
+\x9d\x0f\x11\xd9\x39\x0c\xfe\xfc\xb8\xbb\xda\xda\xd9\x36\x88\x1d\
+\xf1\x66\x1a\x6d\x23\xfe\x8e\xc2\xbc\x80\x0b\x41\x3a\x93\xe2\x53\
+\x71\x45\x4a\x2b\xd7\x30\x6a\xb9\xac\x6c\xa0\x70\x5c\x9c\x20\xc7\
+\x5b\x5b\x5c\xcb\x54\x17\xcf\xe2\x48\xc7\x47\x29\x29\xf8\x70\x28\
+\x1e\x10\x56\x8f\x9f\xe2\x58\xa7\x2d\xd4\x92\x23\xe4\x31\xba\xb9\
+\x2c\xb7\x55\x11\x97\x3d\x9a\x34\x9d\x9d\x0e\x25\xe5\x1a\x48\xc9\
+\xfe\xa3\x07\x5c\x9b\x99\x51\x32\x9f\xa6\xf6\x0f\x52\x54\x4c\x7f\
+\xc8\x02\x29\x19\x5f\x52\xea\x58\xe7\x6c\xdf\x09\xdb\x06\x38\x8e\
+\x27\xcb\x4d\xa5\x72\x98\x56\x9d\x64\x6d\xd4\x73\x16\x8b\x08\x01\
+\x8a\x62\x5f\x82\xf8\x2e\xdc\xf4\x4f\x69\xb9\x06\x8a\xc2\xa1\x13\
+\xcd\xae\x1c\xf4\xb9\xaa\xe5\x58\xd2\x4c\xa9\x17\xec\x34\x40\x51\
+\x58\x38\x6b\x81\xe3\x38\x4e\x06\x9b\xe2\x04\x54\x04\xc2\x61\xb5\
+\x8b\xa6\xe6\xa1\xc8\xe4\x16\x9d\xfb\x37\x12\x69\x93\x41\x6d\x48\
+\x32\x05\x47\x62\xa1\x9c\xd7\x27\x98\x32\xcd\xc7\xc1\xa3\xcd\x1c\
+\x3d\xdb\x9c\xd1\x61\x29\x25\x13\x0a\xab\xa9\x2c\x9c\x9a\x82\xf0\
+\xf3\xad\x31\x2c\xcb\xa2\xae\xf6\x73\x19\x03\x6e\x09\x1e\xe6\x7c\
+\xe8\x54\xdc\xad\x56\x04\xb1\x68\x66\x02\x72\x42\x41\x15\xba\x15\
+\x45\x37\x74\x4e\x9f\xee\xa3\x37\xe8\x9c\x13\x93\x96\xcc\xe9\x42\
+\xb9\xac\x25\xc4\x2d\x1e\xb9\xa2\x55\x27\xe9\x04\x72\x98\x90\x33\
+\x0d\x58\xb0\x28\x80\x47\xd5\xf8\xbb\xff\xf3\xb8\x2b\x47\xdd\x32\
+\xf5\x2e\x4c\xcb\x44\x51\x05\xbd\x41\x83\xa3\xcd\xbd\x2c\xbd\x71\
+\x11\xb5\xd3\x6b\x33\xea\xbc\xd6\xf8\x1b\x3c\x8a\x06\x12\xbc\x3e\
+\x85\x48\x34\x13\xd9\xaa\xe2\xe1\x3f\xd7\x3d\xcb\xd4\xe8\xdd\xac\
+\xb9\xfe\x67\xac\xff\xeb\x67\x1d\xfb\x37\x1c\xab\x4e\xb2\xb6\x21\
+\x09\x24\xe6\x26\xdb\xeb\xb0\x3a\x5d\x38\xc7\x02\xf9\x85\x2a\x53\
+\xa7\x17\xb0\x6d\xdf\x7b\x1c\x6d\x3d\x4a\xcd\xa4\x9a\x8c\x72\x77\
+\xd4\xac\xa4\xab\xff\x2c\xbf\xdd\xf9\x02\x3b\xdf\xe8\xe3\xcb\x75\
+\xb7\xf3\xcc\x7f\xf8\x5f\x19\xe5\x4e\x74\x1f\xa2\xa9\x73\x9f\xbd\
+\xce\xb7\xb8\xd4\x43\x4f\xb7\x41\xd3\xe9\x26\x66\x4d\x99\x95\x32\
+\xce\x69\xa5\xb3\x59\xf7\xb5\xd9\x00\x9c\xea\x69\x1a\x24\xa0\x1f\
+\xfe\x94\x92\x32\x98\x77\x95\x2b\x09\x89\x13\x45\x5c\xdc\x56\xe0\
+\x70\xd9\x8b\x12\x6e\x28\x04\x09\x3f\xfb\xed\x53\xae\xb6\xe4\xfe\
+\xf9\xff\x89\x8d\x5f\x7b\x9d\xc3\xcf\xed\x64\xf3\x0f\x7f\x8d\x4f\
+\xf3\x65\x38\x0c\x6f\x1c\x7d\x21\xe5\x7d\x53\x6b\xf2\x40\xc2\x3f\
+\xed\x7c\x6d\x50\x5b\x29\x50\x1c\xfb\x97\x58\x75\x32\xe2\xeb\xb2\
+\x46\xc3\xe5\x4d\x86\xf2\x4a\x8d\x1b\x6e\x19\xc7\x2b\xdb\xff\xcc\
+\xaf\xfe\xb4\x29\x13\x61\x17\xbe\x57\x8f\xaf\x62\x52\x49\x55\xc6\
+\x80\x04\x82\x57\x0e\xfd\x82\x03\x6d\xef\xa6\xdc\x9f\x54\xed\xe3\
+\xc6\xc5\xe3\x78\xea\xa5\x67\xf8\xf5\x96\xe7\x1c\x6d\xd4\xbb\x2d\
+\x7f\xe0\xf9\x0f\x1f\xcd\xc6\x51\xcc\x99\xdb\x9b\x55\xfa\x3d\x97\
+\xfb\x43\x86\xec\x0e\x9a\x92\x9a\xb9\x7e\x06\x06\x8a\xf9\x2f\x9b\
+\xfe\x3b\x05\xbe\x00\xff\xee\xb6\xfb\x5d\x83\xba\x64\xc4\x1a\x96\
+\xce\x96\xe6\x7f\x60\xdb\xf1\xdf\xc5\x6d\x47\xca\x98\x24\x33\x66\
+\xfb\x99\x3e\xd3\xcf\x96\x8f\x7f\xc1\x9f\x36\x6e\xe4\xf3\x73\x6f\
+\xa4\xbc\xa8\x9c\x96\xee\xc3\x9c\xed\x6b\xc1\xa3\x78\xf0\x28\x5e\
+\x67\xd5\x34\x4c\x33\x86\x23\x1e\x87\x88\xcb\xb0\x39\x52\xc2\xdc\
+\xeb\xf3\x99\x5c\xed\xe3\xd1\x17\x1f\xe7\xb7\x6f\xfc\x0b\xcf\xae\
+\x7b\x8a\x89\xa5\x93\x5c\xeb\xed\x6f\x7d\x9b\xd7\x9b\x9f\xe5\x6c\
+\xa8\x25\x83\x18\xc9\xed\x0a\x05\xa6\x54\x15\x02\x92\x93\xe1\x83\
+\x9c\x0c\x4b\x04\xf1\x39\xf7\xc1\x6c\x84\x35\x42\xab\x4e\x94\x6c\
+\xf3\x2d\x23\xb9\x3f\x24\x81\xc0\xe2\x32\x0f\x7f\xfd\xb5\x32\x2a\
+\xae\x3b\xc3\xc2\x87\x3f\xcf\xb2\x75\x77\xd3\xda\x75\xd6\xb1\xfc\
+\xef\x0e\x3e\xc1\xb9\xf0\xc9\x21\xec\xa0\x12\x17\xd6\x61\xa9\x17\
+\xed\xdb\x10\x82\xdb\x2b\xc5\x99\x5b\xc4\x7e\xc9\x19\x43\xd3\x34\
+\x87\x1c\xfe\xa7\xa4\xbf\x0d\x23\x65\xbf\xbd\x69\x19\x08\x4b\xb8\
+\xe7\x8b\x64\x6a\xe6\xc8\x30\xa1\xb0\x04\x66\xce\x2e\x66\xf7\x9e\
+\x8f\x78\x63\xef\x36\xbe\x79\x47\xe6\x89\x77\x9f\xa9\x58\xc4\xfb\
+\xa7\x5e\xbf\x44\xe6\x49\x66\x9d\xaa\x92\x69\x37\x23\xfd\x11\xfa\
+\xfb\x8d\xdc\x79\x53\x8a\x92\xbd\xca\xb2\x2c\x0b\x5d\xd7\x09\x87\
+\xc3\x57\x2c\xa6\x51\xdd\x40\x58\xa9\xf3\x13\xf2\x32\xdc\xc7\x92\
+\xf1\x60\x18\x06\xef\x35\xec\xe5\x9b\x77\xac\x8c\xa7\xde\x93\x14\
+\xe2\x8a\x4f\x7f\x93\xe6\x8e\x0f\xe8\x8b\x06\x31\xa4\x8e\x31\xc8\
+\x2a\x95\x6c\x74\x6b\xfa\x84\x56\xb4\xdf\xc0\x30\x72\x47\x10\xc3\
+\x30\x18\x18\x18\xc8\x38\xb5\xcf\x51\xbe\x63\xb1\x18\xb1\x58\x2c\
+\x67\x36\x24\xd9\xed\x4d\xec\xeb\x1b\xea\x35\xb1\xca\x87\xd7\xab\
+\xf0\xcf\x17\xdc\xd6\x74\x8e\x1e\x5f\x30\x85\xbf\xbb\xf5\xb7\xfc\
+\xd7\x25\xbf\xe3\xce\x4f\xaf\xc6\xb0\x62\x43\x7b\x47\xc6\x2a\x7d\
+\x71\x31\x1e\x53\xa0\xaf\x2d\x77\xc4\x18\x72\x1c\x62\x9a\x66\x4e\
+\xf7\x87\xe4\x2a\x3f\x79\xcb\xed\xc5\xb4\x77\xf5\xf1\xf7\x2f\x6c\
+\x70\xd4\xf9\x5e\x4f\x1e\x25\xf9\x15\x14\xfa\x8a\x73\xb6\x8d\x59\
+\x51\x05\x67\x0f\x45\x31\x42\x66\x4e\xe3\x10\xb7\x88\x5d\x19\x2e\
+\x63\x6e\x1b\xaf\x1c\x05\xb7\x96\x25\x99\x54\xed\xa3\xf6\xb3\x25\
+\xfc\x8f\xcd\x9b\x78\x6b\xff\xf6\xac\xed\xd8\x15\x31\x82\x80\xc3\
+\x2f\xf6\xa2\x78\x73\x8b\x97\xcb\xf2\xb2\xae\x26\x48\x48\xc4\xe7\
+\x97\x14\x31\x77\x41\x80\x6f\x3c\xb6\x9a\x97\x77\xbd\x44\x7b\xef\
+\x79\x42\x03\xbd\xe8\x66\x94\xa8\x11\x21\xa2\x87\xe9\x8f\xf5\x72\
+\xa5\x9c\x90\x60\xa6\x13\x6f\xf7\x13\x0b\x9a\x23\x36\x4e\x8f\x7b\
+\xfe\x49\xe4\x26\x77\x93\x63\x0e\xb6\x2c\x58\x78\x4b\x80\x79\x0b\
+\x0b\xf8\x7d\xf3\x63\xfc\xf9\xf4\x46\x4a\x03\x25\xf8\x7d\x7e\x4c\
+\xcb\x24\x66\x46\x08\xc7\x7a\xd1\x14\xef\x15\xbd\x47\xf3\x2b\x9c\
+\xd8\xd5\xcf\x91\x7f\x09\x0d\x4b\x0e\xcb\x0d\xbf\x1e\xae\x41\x90\
+\x16\x68\x5e\x85\x12\x6f\x1e\x10\x25\x18\x6b\x23\x18\xbb\xcc\x44\
+\xe0\x85\x55\x49\x52\x82\x11\x95\x98\x31\x0b\x23\x22\x39\xb6\xbd\
+\x9f\x33\x3b\x22\xa8\x9a\x18\x56\x89\x77\x3a\xb7\x77\x78\x25\xe4\
+\x6a\x52\x7b\x0a\x08\x35\x6e\xa8\x0d\x43\xd2\x73\x46\xa7\xb7\xc5\
+\xa0\xe7\xb4\x4e\xff\x19\x13\xbd\x5f\xa2\xf7\x5b\xc4\xfa\x2c\xa4\
+\x89\x4d\x8c\xe1\xc2\x43\x62\x0d\xf5\x35\x2f\x21\xd9\xc6\x13\x66\
+\x4c\xda\x57\x34\x64\x11\x3c\x65\xd0\x73\x4c\xa7\xfb\x63\x9d\xc8\
+\x19\x23\xce\x74\x4a\x9c\x50\xe9\xd6\x54\x0c\xb3\x75\x1d\x35\x09\
+\x91\x62\xf8\xce\x98\xb4\x39\x5e\x11\x98\x52\xd2\x7b\xd6\xa0\xaf\
+\xc5\xa0\xe7\x8c\x41\xf8\xb4\x41\x2c\x2c\x31\xc2\x16\xb1\x7e\x89\
+\x19\x89\xaf\xe1\x4a\xa8\x28\x4f\xde\xe8\xfb\x33\x59\xdb\x90\x5c\
+\x8a\x68\x7e\x97\x42\xa4\xd8\xe2\xb2\xd7\x9e\x27\x73\xbc\x2e\xb1\
+\x62\x12\x53\x97\xc4\xfa\x25\xc1\xd3\x3a\xbd\xc7\x0c\xba\x3e\xd6\
+\xe9\x3f\x69\xc6\xc3\x39\x9b\xe3\x45\x4a\xf4\xa8\x5c\x65\xba\xc0\
+\x8d\xe9\x3d\x43\xa5\xe0\x50\x61\xdc\x79\x15\x8f\x2e\xe8\xad\x30\
+\x11\x52\x64\xc5\xf1\x42\x11\x48\x24\xbd\xe7\x4d\x42\x1f\x27\x38\
+\xde\x24\xd6\x67\xd9\x1c\x6f\xf4\x4b\x7b\xa9\x95\x10\xe0\xf1\x89\
+\x1c\xe4\x9a\x47\x1f\x5c\x93\x8b\xb9\x5b\x75\x02\x05\xdd\xf1\xb3\
+\xdc\x43\x65\x16\xc9\x7b\x2a\x2d\x23\xae\xdf\x2d\x5d\xa2\x0f\x48\
+\x7a\x5a\x8d\x38\xc7\x9f\xd4\x09\xb7\x98\x60\xe2\xaa\xe3\x15\x95\
+\x6b\x1e\xb2\x5e\x28\xe7\x66\x70\xae\x84\x28\x85\xdd\x2a\xaa\x2e\
+\x68\xff\x4b\x8c\x70\x9b\x49\xf8\x94\x49\xb4\xcf\x42\x0f\x49\xf4\
+\xb0\x85\x1e\x96\x71\x5b\xa3\xc4\x39\x5e\xf5\x88\x4f\xa2\xcb\x91\
+\xa1\xb2\xb2\xf6\xb2\x72\xed\xea\x49\x01\xfe\x90\xca\xa1\x5f\x87\
+\x3e\xb1\x1c\x9f\x0b\xc3\x3e\xb2\x71\x88\x00\x45\x13\x8c\x81\x7b\
+\xa4\xae\x8c\xa1\xe6\x1a\x30\xea\x39\xb7\x21\x63\x70\x65\x6e\xaf\
+\xc8\x72\x8b\x17\x80\xaa\xaa\x68\x9a\x86\x65\x59\xf6\x74\x6f\x2e\
+\x37\x5a\x5e\x6d\x5e\x50\x2e\xeb\x0d\x29\xb9\xe8\xa6\xe3\x2c\xcb\
+\x62\x60\x60\x80\x3b\xef\xbc\x93\x3b\xef\xbc\x93\xf1\xe3\xc7\x13\
+\x08\x04\x88\xc5\x62\x04\x83\x41\x76\xef\xde\xcd\xee\xdd\xbb\xd1\
+\x34\x2d\xc5\x8b\x70\xfa\x9b\xed\xb3\xa1\x96\x4b\xf4\x33\x19\x41\
+\x6e\xe5\xae\xf4\x5d\x4e\x7f\x13\x53\xe0\xb1\x58\xcc\x95\x39\xdd\
+\xee\x7b\xb2\x49\x78\x25\xc3\x67\x3f\xfb\x59\x7e\xf9\xcb\x5f\x52\
+\x96\x76\x26\x49\x22\x76\xb9\xf5\xd6\x5b\xe9\xed\xed\xe5\xe9\xa7\
+\x9f\xe6\xe8\xd1\xa3\x19\x03\x4f\xb4\x9d\x3e\x5b\x96\x3e\xd8\xc1\
+\xbe\x67\x5b\x6e\xb0\xff\xdd\xbe\x5b\x96\x95\x72\x88\xdb\x60\xfd\
+\x75\xeb\x97\xc7\xe3\xc1\xeb\xf5\xe2\xf7\xfb\xe9\xef\xef\xb7\x67\
+\x60\xb3\x91\x24\xe5\x52\xfa\x2d\x71\x19\x86\xc1\x8f\x7e\xf4\x23\
+\x5e\x7a\xe9\x25\x9b\x18\xe9\xcb\x45\x13\x10\x08\x04\x58\xb7\x6e\
+\x1d\x5f\xff\xfa\xd7\x5d\x17\x06\xe4\xe7\xe7\x53\x57\x57\x47\xe2\
+\x07\x2d\xaf\xc6\x20\x2d\x5d\x33\xdc\x7a\xeb\xad\x8c\x1f\x3f\x3e\
+\x2b\x35\x24\xa5\x44\x51\x14\x0a\x0a\x0a\xc8\xcb\xcb\x73\x9d\xcb\
+\x1f\xb2\x97\x95\xa8\xf4\xfd\xef\x7f\x9f\x55\xab\x56\xd9\x1d\xaf\
+\xaf\xaf\x67\xf5\xea\xd5\x6c\xdd\xba\xd5\x2e\x6b\x18\x06\x3f\xff\
+\xf9\xcf\x59\xb3\x66\x0d\x07\x0e\x1c\xe0\x8e\x3b\xee\xe0\x9e\x7b\
+\xee\x71\x1c\xec\x8a\x15\x2b\xf8\xce\x77\xbe\xc3\x4d\x37\xdd\x34\
+\xea\x84\x50\x14\x85\x69\xd3\xa6\x0d\x5a\x6e\xee\xdc\xb9\x6c\xd8\
+\xb0\x81\x87\x1e\x7a\x68\xc8\xf6\xc1\xe7\xf3\xe1\xf3\xf9\x2e\xcf\
+\xcb\xba\x78\x02\xb4\xb0\x7f\x20\x6c\xce\x9c\x39\x7c\xef\x7b\xdf\
+\x4b\x79\xd1\xb9\x73\xe7\xf0\xf9\x7c\x4c\x99\x32\xc5\xae\xf7\xf4\
+\xd3\x4f\xd3\xd8\xd8\xc8\xda\xb5\x6b\x99\x37\x2f\x7e\x32\xdc\x3d\
+\xf7\xdc\xc3\xfe\xfd\xfb\x69\x69\x69\x49\xe9\xe4\xce\x9d\x3b\x89\
+\x46\xa3\x1c\x3c\x78\x70\x54\x09\x12\x8d\x46\x79\xe8\xa1\x87\xb8\
+\xf9\xe6\x9b\x79\xe0\x81\x07\x5c\xcb\x1d\x3f\x7e\x9c\x27\x9f\x7c\
+\x92\x03\x07\x0e\x5c\x56\xe0\xe7\xf3\xf9\x30\x0c\xc3\x79\x01\xfa\
+\x50\x24\xc4\x30\x0c\x36\x6d\xda\x94\x71\xff\xdc\xb9\x73\x48\x29\
+\xa9\xac\xac\x44\x4a\xc9\x0b\x2f\xbc\x40\x53\x53\x13\xab\x57\xaf\
+\x66\xde\xbc\x79\x29\x52\xb1\x76\xed\xda\x94\x05\x77\x7e\xbf\x9f\
+\x50\x28\xc4\x5b\x6f\xbd\x45\x38\x1c\x76\x7c\xaf\xa6\x69\x68\x9a\
+\x86\x94\x92\xbc\xbc\x3c\x02\x81\x00\xf9\xf9\xf9\x59\x9e\xb1\x1b\
+\x7f\x47\x20\x10\xa0\xa0\xa0\xc0\x9d\x1b\x3d\x1e\xaa\xab\xab\x59\
+\xb9\x72\x25\xcd\xcd\xcd\xe4\xe7\xe7\xe3\xf7\x67\xee\x91\xf7\xf9\
+\x7c\x78\xbd\x5e\xb6\x6c\xd9\xc2\xf1\xe3\xc7\x07\x95\x36\x55\x55\
+\x29\x2c\x2c\x64\xdc\xb8\x71\x14\x16\x16\xda\x2a\x59\x08\xe1\xd8\
+\x76\x56\x46\x3d\xf9\x5a\xb4\x68\x11\x13\x26\x4c\xc8\x48\x38\xb6\
+\xb5\xb5\x21\x84\xa0\xa2\xa2\x82\x17\x5f\x7c\x91\x37\xdf\x7c\x93\
+\x07\x1e\x78\x80\xba\xba\xba\x0c\x5d\x5a\x52\x52\xc2\xdc\xb9\x73\
+\x69\x6e\x6e\xa6\xa4\xa4\x84\xa7\x9e\x7a\xca\x26\xc4\xb7\xbf\xfd\
+\x6d\x47\x3b\x72\xef\xbd\xf7\xe2\xf1\x78\xe8\xea\xea\xe2\xab\x5f\
+\xfd\x2a\x7e\xbf\x9f\x48\x24\xc2\x9b\x6f\xbe\xc9\xb3\xcf\x3e\x3b\
+\x28\x92\x1f\x7e\xf8\x61\x6e\xb9\xe5\x16\x2c\xcb\xc2\xe3\xf1\xb0\
+\x67\xcf\x1e\x1e\x7d\x34\x75\x55\x7b\x2c\x16\xe3\xc1\x07\x1f\xe4\
+\xde\x7b\xef\xb5\x55\xe8\xb2\x65\xcb\xa8\xaf\xaf\xe7\x87\x3f\xfc\
+\xa1\x5d\x2e\x12\x89\xb0\x71\xe3\x46\x6a\x6a\x6a\x88\x46\xa3\xfc\
+\xf8\xc7\x3f\x66\xff\xfe\xfd\x19\xef\xd5\x75\x9d\xeb\xae\xbb\x8e\
+\x47\x1e\x79\x84\xda\xda\x5a\x2c\xcb\x42\x55\x55\x36\x6c\xd8\xc0\
+\x1f\xff\xf8\x47\x9b\x58\xaa\xaa\xda\x8e\xc3\x65\x49\x48\x42\xc7\
+\x27\x57\x94\x52\xd2\xda\xda\x4a\x75\x75\x35\x3b\x76\xec\x60\xfb\
+\xf6\xed\xdc\x77\xdf\x7d\x2c\x5e\xbc\x38\x73\x7b\xc0\x85\x7a\xb3\
+\x67\xc7\x37\xc4\x74\x77\x77\xb3\x6a\xd5\x2a\xf2\xf3\xf3\xe9\xec\
+\xec\x74\xfd\xbd\xdd\xea\xea\x6a\x96\x2c\x59\xc2\xf2\xe5\xcb\x79\
+\xf0\xc1\x07\x59\xbe\x7c\x39\x67\xce\x9c\xe1\xae\xbb\xee\xc2\xe3\
+\xf1\xb8\x7a\x2d\x6b\xd7\xae\xe5\xb6\xdb\x6e\x63\xe3\xc6\x8d\x7c\
+\xe5\x2b\x5f\x61\xf3\xe6\xcd\xd4\xd5\xd5\xb1\x64\x49\xea\xd1\xb3\
+\x5e\xaf\x97\x4d\x9b\x36\xb1\x79\xf3\x66\x00\xd6\xad\x5b\xc7\xd2\
+\xa5\x4b\x59\xb7\x6e\x5d\x86\xa4\x3d\xfc\xf0\xc3\xd4\xd7\xd7\x53\
+\x5c\x5c\xcc\xd9\xb3\xce\x6b\x8b\x67\xcf\x9e\xcd\xf3\xcf\x3f\x4f\
+\x51\x51\x11\x2b\x56\xac\xa0\xb6\xb6\x96\x65\xcb\x96\xd9\x2a\x2e\
+\x81\x87\x4b\x39\x31\x97\xf4\xb2\x26\x4c\x98\x90\xf1\x3c\x18\x0c\
+\xd2\xd7\xd7\xc7\xc0\xc0\x00\x9b\x37\x6f\x66\xd9\xb2\x65\xdc\x75\
+\xd7\x5d\x83\xfa\xd7\x25\x25\x25\x36\xd2\x4a\x4b\x4b\x51\x55\x95\
+\x8f\x3e\xfa\xc8\xb5\x83\x93\x26\x4d\xa2\xa0\xa0\x80\xf5\xeb\xd7\
+\x13\x0e\x87\xf1\x7a\xbd\xec\xde\xbd\x1b\x80\xb2\xb2\xb2\x0c\x82\
+\x18\x86\xc1\x82\x05\x0b\x58\xbc\x78\x31\x7f\xf8\xc3\x1f\xd8\xb2\
+\x65\x0b\x3e\x9f\xcf\x56\x31\x45\x45\x45\x8e\x04\xac\xae\xae\x06\
+\xe0\xe4\xc9\x93\x83\xaa\xa2\xa9\x53\xa7\x62\x9a\xa6\x63\x39\x29\
+\x25\x3f\xf8\xc1\x0f\x6c\xf5\xdc\xd9\xd9\x49\x61\x61\x21\x5d\x5d\
+\x5d\x9c\x38\x71\x22\x15\xe1\x8a\x32\x74\x2f\x2b\xb9\xe0\xb8\x71\
+\xe3\x32\x9e\x1f\x3a\x74\x28\xbe\xd1\xb2\xae\x8e\x68\x34\x3a\xe8\
+\x82\xec\x04\x24\x74\xb9\x69\x9a\xd4\xd6\xc6\xf7\x03\x1e\x3c\x78\
+\x30\x83\x20\x09\x44\x4f\x9c\x38\x91\x96\x96\x16\x4e\x9c\x38\x61\
+\x3b\x17\x55\x55\x55\x00\xb4\xb7\xb7\x67\x1e\x32\xa3\xeb\xb6\xe3\
+\xf1\xcc\x33\xcf\x50\x58\x58\x48\x5e\x5e\x1e\xb7\xdf\x7e\x3b\x96\
+\x65\xd1\xd8\xd8\xe8\x38\xce\xaa\xaa\x2a\x2c\xcb\xe2\xd4\xa9\x53\
+\x83\x06\x71\xd3\xa6\x4d\xe3\xd0\xa1\x43\x19\x63\x95\x52\x52\x54\
+\x54\xc4\x8d\x37\xde\xc8\x87\x1f\x7e\x48\x73\x73\xb3\x6d\xe7\x14\
+\x45\xc9\xb0\x79\xc9\xef\xb8\xac\x19\xc3\x60\x30\x98\x71\xbf\xb1\
+\xb1\x11\x55\x55\x59\xba\x74\x29\x07\x0e\x1c\x60\xdb\xb6\x6d\x2c\
+\x5d\xba\x94\xf2\xf2\x72\xd7\xb6\x42\xa1\x90\x4d\x90\x84\x07\x96\
+\xdc\xf9\x74\x6e\x04\xd8\xb1\x63\x07\x9a\xa6\xd9\xf5\xae\xbf\xfe\
+\x7a\x82\xc1\x60\x4a\xf0\x96\x80\xc9\x93\x27\x53\x51\x51\x41\x24\
+\x12\xe1\x27\x3f\xf9\x09\x81\x40\x80\xea\xea\x6a\xda\xda\xda\xd8\
+\xb0\x61\x03\x0d\x0d\x0d\x78\x3c\x9e\x8c\xd8\x62\xfa\xf4\xe9\x34\
+\x36\x36\xa2\xeb\xba\xfd\xae\xf4\x32\x09\x29\xaa\xaf\xaf\xcf\x60\
+\x20\xc3\x30\x58\xbe\x7c\x39\x00\x2f\xbd\xf4\x12\x89\xdf\xa5\x1f\
+\x4c\xda\x06\x4b\x2d\x79\x2e\x15\x24\x39\xe9\xcc\xc3\x87\x0f\x53\
+\x59\x59\x89\xaa\xaa\x2c\x5e\xbc\x98\xe6\xe6\x66\xde\x7e\xfb\x6d\
+\xee\xbb\xef\x3e\xd7\x17\x76\x74\x74\xd8\x03\xbc\xee\xba\xeb\xe8\
+\xea\xea\xc2\x34\xcd\x0c\xc4\x26\x10\x0f\xa4\xa8\xb4\xd2\xd2\x52\
+\xc6\x8d\x1b\x47\x43\x43\x83\x63\x36\x21\xc1\x0c\x67\xce\x9c\x61\
+\xd7\xae\x5d\x74\x74\x74\xd0\xd0\xd0\x40\x30\x18\xc4\xe3\xf1\x64\
+\x10\x43\x4a\xc9\xc4\x89\xf1\x33\x82\xf7\xec\xd9\x93\xf1\x3c\xb9\
+\x3f\x8b\x16\x2d\x02\x60\xf7\xee\xdd\x19\x04\x31\x4d\x93\x19\x33\
+\x66\x00\x70\xe2\xc4\x89\x4b\x7a\x81\xc9\x7b\x1b\x2f\x2b\x52\xaf\
+\xaf\xaf\x4f\x69\x28\x12\x89\x10\x0e\x87\xed\xc1\xdc\x74\xd3\x4d\
+\x04\x02\x01\xde\x79\xe7\x1d\x0c\xc3\x70\xdc\xbb\x97\x20\x62\x42\
+\xff\xe7\xe7\xe7\xd3\xda\xda\xea\x8a\x80\xf9\xf3\xe7\x03\xa4\xa8\
+\x91\xc9\x93\x27\xdb\x08\x1f\x6c\xa0\x47\x8e\x1c\xe1\xb5\xd7\x5e\
+\xe3\xbd\xf7\xde\x23\x1c\x0e\x3b\x72\x7d\xfa\x7b\xf6\xec\xd9\xe3\
+\x6a\xcb\x0c\xc3\xb0\x1d\x9b\xa6\xa6\xa6\x8c\x72\x42\x08\xa2\xd1\
+\xa8\xad\x36\x5d\x4f\xbe\x4b\x4b\xcd\xb8\xd9\x5b\xe5\x52\xe9\xf7\
+\x7d\xfb\xf6\x71\xe4\xc8\x11\xfb\x5e\xc2\xdd\x4d\x36\xf6\xab\x56\
+\xad\x22\x18\x0c\xf2\xfb\xdf\xff\xde\xb1\xad\xd3\xa7\x4f\xd3\xd4\
+\xd4\x64\x1b\x6b\x37\xc9\x4b\xc0\x9c\x39\x73\x6c\x82\x25\xde\x9b\
+\x08\x40\xdd\x08\x72\xfe\xfc\x79\x5b\x05\x79\xbd\x5e\x54\x35\x7e\
+\xba\x50\x79\x79\x39\x85\x85\x85\x99\x87\xd6\x98\x26\x73\xe7\xce\
+\x4d\x41\xb4\xdb\x8f\x34\x2f\x58\xb0\x80\xd6\xd6\x56\xc7\xd5\xfc\
+\xaa\xaa\xda\xc1\xed\x97\xbe\xf4\x25\x3b\x6f\xa5\x69\x1a\xaa\xaa\
+\xa6\x48\x44\xe2\xd9\x60\x46\xfd\x92\x33\x86\x7e\xbf\x9f\xef\x7e\
+\xf7\xbb\x6c\xdd\xba\x15\x55\x55\x39\x75\xea\x14\x91\x48\x84\x8a\
+\x8a\x0a\xbb\xc3\xb5\xb5\xb5\x4c\x9f\x3e\x9d\xad\x5b\xb7\xb2\x64\
+\xc9\x12\x2a\x2b\x2b\x53\x74\xf0\x13\x4f\x3c\x61\xeb\xd6\x04\x62\
+\xdd\x08\x32\x69\xd2\x24\x54\x55\xa5\xad\x2d\xf5\x54\xa0\x84\x41\
+\x77\x23\x48\x7b\x7b\x3b\xcf\x3d\xf7\x1c\xdf\xfa\xd6\xb7\x78\xfc\
+\xf1\xc7\x39\x73\xe6\x0c\xe5\xe5\xe5\xcc\x9e\x3d\x9b\x35\x6b\xd6\
+\x64\x72\xa2\xa2\xd8\x1e\xd8\x4f\x7f\xfa\x53\x0c\xc3\xe0\xf5\xd7\
+\x5f\x67\xe7\xce\x9d\x29\xea\x6b\xca\x94\x29\xf8\x7c\x3e\x4e\x9f\
+\x3e\xed\x1a\xf7\xbc\xf1\xc6\x1b\x7c\xe3\x1b\xdf\x60\xcd\x9a\x35\
+\xcc\x98\x31\x83\x48\x24\xc2\xc2\x85\x0b\x59\xbf\x7e\x3d\xbb\x76\
+\xed\xb2\xdd\x74\x5d\xd7\x6d\x95\xe6\x46\x10\x15\xb8\x41\xd3\xb4\
+\xea\xbc\xbc\xbc\xda\x44\x47\xa7\x4d\x9b\xc6\xc0\xc0\x00\x3d\x3d\
+\xf1\xdf\xb1\x0d\x87\xc3\x74\x76\x76\x52\x57\x57\x47\x69\x69\x29\
+\x5f\xf8\xc2\x17\x98\x35\x6b\x96\x9d\x62\x07\x58\xb8\x70\x21\x75\
+\x75\x75\x04\x02\x01\x3b\x6f\x23\xa5\xe4\xf9\xe7\x9f\xa7\xb1\xb1\
+\xd1\x2e\x57\x54\x54\x44\x5f\x5f\x1f\xf5\xf5\xf5\xf4\xf6\xf6\x66\
+\x74\x28\x10\x08\x20\xa5\xa4\xbe\xbe\x3e\x05\xf9\xa5\xa5\xa5\x74\
+\x74\x74\xf0\xee\xbb\xef\xda\x2a\x22\x9d\x53\x0f\x1d\x3a\xc4\xbe\
+\x7d\xfb\x28\x2b\x2b\x23\x10\x08\xd0\xd0\xd0\xc0\x63\x8f\x3d\x46\
+\x5f\x5f\x5f\x66\x00\xa6\x28\x34\x36\x36\xd2\xd7\xd7\x47\x55\x55\
+\x15\x67\xcf\x9e\x65\xfb\xf6\xed\x0c\x0c\x0c\xa4\x94\x4d\xb8\xcb\
+\x3b\x76\xec\xa0\xa5\xa5\xc5\xd5\xf9\x79\xe5\x95\x57\x08\x87\xc3\
+\x4c\x98\x30\x81\x68\x34\xca\xaf\x7e\xf5\x2b\xf6\xee\xdd\x6b\x4b\
+\x89\xae\xeb\x29\x52\xaa\x69\x1a\xa5\xa5\xa5\x04\x83\x41\xba\xbb\
+\xbb\x2f\xb6\x05\x3c\xe8\xf7\xfb\xbf\x50\x5c\x5c\xbc\x32\x41\xf1\
+\x2f\x7e\xf1\x8b\x04\x83\xc1\x14\x9f\xdb\x30\x0c\xee\xbe\xfb\x6e\
+\xd6\xaf\x5f\x9f\x75\xd2\xee\x37\xbf\xf9\x0d\x3b\x76\xec\xb0\x3b\
+\x25\xa5\xc4\x30\x0c\x4c\xd3\x4c\x51\x11\xc9\x69\x6c\xd3\x34\x6d\
+\x4e\x4a\xae\xa7\xeb\xba\x1d\x79\x3b\xa5\xc7\x93\xf7\x44\x26\x72\
+\x46\x42\x08\x9b\xdb\xdd\xd2\xed\xb1\x58\xcc\xb6\x7d\x89\x54\x4d\
+\x72\xfb\x96\x65\x11\x8b\xc5\x52\xfa\xe3\x96\x7e\x8f\xc5\x62\x29\
+\xef\x4d\xd8\x1b\x5d\xd7\x6d\x07\x26\x39\xdb\x5d\x53\x53\xc3\xf1\
+\xe3\xc7\x53\xd2\x31\x9e\x6c\x53\xd2\x1e\x8f\x87\x57\x5f\x7d\x95\
+\xfa\xfa\x7a\x36\x6e\xdc\xc8\xf4\xe9\xd3\x1d\x0d\xa1\x65\x59\xb4\
+\xb6\xb6\xf2\xe4\x93\x4f\xd2\xd9\xd9\x99\x51\x26\x91\x3e\x70\xdd\
+\xb0\xa2\x28\x78\xbd\x99\x07\x95\xa5\x23\xd6\x35\xd2\x4d\xaa\x9f\
+\xcd\xc9\x78\x9a\xa6\xa5\x44\xfe\x4e\x99\x06\x9f\xcf\x97\xd5\xae\
+\xe2\x64\x97\x37\x79\xa2\x6a\x28\x27\xf4\x0d\x69\xc6\x50\x08\xc1\
+\xd9\xb3\x67\xf9\xf2\x97\xbf\x4c\x6d\x6d\x2d\xb5\xb5\xb5\x4c\x9a\
+\x34\x89\x8a\x8a\x0a\x42\xa1\x10\xed\xed\xed\x1c\x3b\x76\x8c\x63\
+\xc7\x8e\x39\xba\x99\x83\xcd\xd4\x39\xfd\xbd\xd4\x0c\xa3\x5b\xbb\
+\x43\xbd\x7f\xb9\xe5\x2e\x35\xbb\xe8\x34\x57\x74\xd9\x04\x71\x6b\
+\x28\xc1\xe1\xcd\xcd\xcd\xb6\xe7\x94\xf3\x33\xb6\x3e\x01\x0b\x18\
+\x2e\x85\x8f\x21\x4d\xe1\x66\xbb\x2e\x6b\x8c\x00\x57\x4e\xb8\x21\
+\x67\x7b\xc7\x60\x78\xa5\x68\xc8\x71\xc8\x18\x8c\x2c\x51\xc6\x24\
+\x64\x4c\x42\xc6\x60\x4c\x42\xae\x21\x4f\xcc\x55\x42\xc6\x8d\x1b\
+\xc7\xac\x59\xb3\xc6\x30\x37\x4c\x90\x98\x39\x74\x54\x59\xe9\x01\
+\x8f\x53\xae\x68\x0c\x72\x0b\x96\x65\x11\x8d\x46\x33\x16\x12\x7a\
+\x00\x4b\x88\x8b\xfb\x64\x0d\xc3\x60\xdb\xb6\x6d\x63\x18\x1b\xa5\
+\x58\xc4\x03\xe8\x40\x2c\x5d\x9c\xc6\x60\x94\x54\x19\x10\x16\x42\
+\x0c\x8c\x79\x54\xa3\x0f\x52\xc6\x77\x16\x2f\x05\x26\x6a\x9a\x56\
+\x21\xa5\xf4\x70\x2d\xee\x25\xbe\x76\xc0\x14\x42\xc4\x80\x5e\x45\
+\x51\x3a\x54\x55\x3d\xa7\x69\x5a\x50\xd3\xb4\x88\xc7\xe3\x31\x00\
+\xf9\xff\x01\xfa\x90\x4b\xa0\xc0\x4f\x7e\x35\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\x0b\
+\x08\x52\xaa\xc7\
+\x00\x66\
+\x00\x69\x00\x67\x00\x75\x00\x72\x00\x65\x00\x38\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x14\
+\x00\x22\x00\x47\
+\x00\x54\
+\x00\x69\x00\x6d\x00\x65\x00\x2d\x00\x46\x00\x6f\x00\x72\x00\x2d\x00\x4c\x00\x75\x00\x6e\x00\x63\x00\x68\x00\x2d\x00\x32\x00\x2e\
+\x00\x6a\x00\x70\x00\x67\
+\x00\x0b\
+\x07\x50\x31\x47\
+\x00\x65\
+\x00\x6c\x00\x6c\x00\x69\x00\x70\x00\x73\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0b\x53\x47\xc7\
+\x00\x72\
+\x00\x61\x00\x6e\x00\x64\x00\x6f\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0c\
+\x05\x8f\xe2\xc7\
+\x00\x63\
+\x00\x65\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x65\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x00\x28\x58\x27\
+\x00\x74\
+\x00\x69\x00\x6c\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0a\x12\x5e\xc7\
+\x00\x6b\
+\x00\x69\x00\x6e\x00\x65\x00\x74\x00\x69\x00\x63\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\x07\x00\x00\x00\x02\
+\x00\x00\x00\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x36\xe6\
+\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x01\x1d\xd1\
+\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x01\x1a\x51\
+\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00\xb5\xc1\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\xc6\x00\x00\x00\x00\x00\x01\x00\x01\x5d\xa6\
+\x00\x00\x00\x78\x00\x00\x00\x00\x00\x01\x00\x00\xdf\xd4\
+"
+
+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()
diff --git a/examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg b/examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg
new file mode 100644
index 000000000..c57a55549
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/images/centered.png b/examples/widgets/animation/animatedtiles/images/centered.png
new file mode 100644
index 000000000..e416156a0
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/centered.png
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/images/ellipse.png b/examples/widgets/animation/animatedtiles/images/ellipse.png
new file mode 100644
index 000000000..2c3ba881c
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/ellipse.png
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/images/figure8.png b/examples/widgets/animation/animatedtiles/images/figure8.png
new file mode 100644
index 000000000..6b058041c
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/figure8.png
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/images/kinetic.png b/examples/widgets/animation/animatedtiles/images/kinetic.png
new file mode 100644
index 000000000..55cfa5515
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/kinetic.png
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/images/random.png b/examples/widgets/animation/animatedtiles/images/random.png
new file mode 100644
index 000000000..415d96f85
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/random.png
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/images/tile.png b/examples/widgets/animation/animatedtiles/images/tile.png
new file mode 100644
index 000000000..c8f39d8d4
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/images/tile.png
Binary files differ
diff --git a/examples/widgets/animation/appchooser/accessories-dictionary.png b/examples/widgets/animation/appchooser/accessories-dictionary.png
new file mode 100644
index 000000000..e9bd55d91
--- /dev/null
+++ b/examples/widgets/animation/appchooser/accessories-dictionary.png
Binary files differ
diff --git a/examples/widgets/animation/appchooser/akregator.png b/examples/widgets/animation/appchooser/akregator.png
new file mode 100644
index 000000000..a086f45ab
--- /dev/null
+++ b/examples/widgets/animation/appchooser/akregator.png
Binary files differ
diff --git a/examples/widgets/animation/appchooser/appchooser.py b/examples/widgets/animation/appchooser/appchooser.py
new file mode 100755
index 000000000..7501bf4e4
--- /dev/null
+++ b/examples/widgets/animation/appchooser/appchooser.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import appchooser_rc
+
+
+class Pixmap(QtWidgets.QGraphicsWidget):
+ clicked = QtCore.Signal()
+
+ def __init__(self, pix, parent=None):
+ super(Pixmap, self).__init__(parent)
+
+ self.orig = QtGui.QPixmap(pix)
+ self.p = QtGui.QPixmap(pix)
+
+ def paint(self, painter, option, widget):
+ painter.drawPixmap(QtCore.QPointF(), self.p)
+
+ def mousePressEvent(self, ev):
+ self.clicked.emit()
+
+ def setGeometry(self, rect):
+ super(Pixmap, self).setGeometry(rect)
+
+ if rect.size().width() > self.orig.size().width():
+ self.p = self.orig.scaled(rect.size().toSize())
+ else:
+ self.p = QtGui.QPixmap(self.orig)
+
+
+def createStates(objects, selectedRect, parent):
+ for obj in objects:
+ state = QtCore.QState(parent)
+ state.assignProperty(obj, 'geometry', selectedRect)
+ parent.addTransition(obj.clicked, state)
+
+
+def createAnimations(objects, machine):
+ for obj in objects:
+ animation = QtCore.QPropertyAnimation(obj, 'geometry', obj)
+ machine.addDefaultAnimation(animation)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ p1 = Pixmap(QtGui.QPixmap(':/digikam.png'))
+ p2 = Pixmap(QtGui.QPixmap(':/akregator.png'))
+ p3 = Pixmap(QtGui.QPixmap(':/accessories-dictionary.png'))
+ p4 = Pixmap(QtGui.QPixmap(':/k3b.png'))
+
+ p1.setGeometry(QtCore.QRectF(0.0, 0.0, 64.0, 64.0))
+ p2.setGeometry(QtCore.QRectF(236.0, 0.0, 64.0, 64.0))
+ p3.setGeometry(QtCore.QRectF(236.0, 236.0, 64.0, 64.0))
+ p4.setGeometry(QtCore.QRectF(0.0, 236.0, 64.0, 64.0))
+
+ scene = QtWidgets.QGraphicsScene(0, 0, 300, 300)
+ scene.setBackgroundBrush(QtCore.Qt.white)
+ scene.addItem(p1)
+ scene.addItem(p2)
+ scene.addItem(p3)
+ scene.addItem(p4)
+
+ window = QtWidgets.QGraphicsView(scene)
+ window.setFrameStyle(0)
+ window.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
+ window.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ window.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+
+ machine = QtCore.QStateMachine()
+ machine.setGlobalRestorePolicy(QtCore.QStateMachine.RestoreProperties)
+
+ group = QtCore.QState(machine)
+ selectedRect = QtCore.QRect(86, 86, 128, 128)
+
+ idleState = QtCore.QState(group)
+ group.setInitialState(idleState)
+
+ objects = [p1, p2, p3, p4]
+ createStates(objects, selectedRect, group)
+ createAnimations(objects, machine)
+
+ machine.setInitialState(group)
+ machine.start()
+
+ window.resize(300, 300)
+ window.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/animation/appchooser/appchooser.qrc b/examples/widgets/animation/appchooser/appchooser.qrc
new file mode 100644
index 000000000..28a3e1c4c
--- /dev/null
+++ b/examples/widgets/animation/appchooser/appchooser.qrc
@@ -0,0 +1,8 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>accessories-dictionary.png</file>
+ <file>akregator.png</file>
+ <file>digikam.png</file>
+ <file>k3b.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/animation/appchooser/appchooser_rc.py b/examples/widgets/animation/appchooser/appchooser_rc.py
new file mode 100644
index 000000000..d661c220d
--- /dev/null
+++ b/examples/widgets/animation/appchooser/appchooser_rc.py
@@ -0,0 +1,1464 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: to lokakuuta 14 15:41:37 2010
+# by: The Resource Compiler for PySide (Qt v4.7.0)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x0d\x06\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0c\x83\x49\x44\
+\x41\x54\x78\xda\xed\x9b\x5b\x68\x55\xd9\x19\xc7\xd7\x49\x4e\xa2\
+\x26\x26\x1a\xe3\x35\x31\x5e\xc6\x54\xad\x97\x4a\x95\x29\x38\x14\
+\xc4\x22\xb6\xcc\x73\x9f\x2a\xf4\x61\x5e\x7c\x10\xc4\xc2\x0c\x08\
+\x7d\x28\xf8\x54\x4a\x1f\x15\xa4\x4f\xf6\x51\x0a\x52\x90\x4e\x07\
+\x41\x94\xfa\xe0\xfd\xd6\xaa\x03\x5e\xc6\xfb\x35\x51\x63\x2e\x46\
+\xcd\xc5\x7e\xbf\x0d\xbf\x61\xcf\x31\x92\x8c\x1c\x83\xc1\x2c\x58\
+\xec\xbd\xd7\x59\x7b\xad\xef\xfb\x7f\xf7\xb5\x93\xc2\xeb\xd7\xaf\
+\xd3\xc7\xdc\x2a\xa2\x8f\x03\x30\x0e\xc0\x38\x00\xe3\x00\x8c\x03\
+\x30\x0e\xc0\x47\xda\x8a\x1f\x1a\x41\xc7\x8e\x1d\xdb\x53\x5d\x5d\
+\xfd\xb3\x69\xd3\xa6\x7d\xe1\x98\xad\xad\xad\xed\x8f\x95\x95\x95\
+\xf3\x57\xaf\x5e\xfd\x8b\x72\xed\xf7\x41\x24\x42\xdb\xb6\x6d\x5b\
+\x50\x2c\x16\xff\x10\xb7\x9f\xcd\x9e\x3d\xbb\x65\xf2\xe4\xc9\x93\
+\x18\x87\x36\xaf\xb6\x81\x81\x81\xc1\x4b\x97\x2e\xdd\x1a\x1c\x1c\
+\xbc\xd4\xd1\xd1\xf1\xb7\xbd\x7b\xf7\x1e\x1a\xd3\x00\x6c\xd9\xb2\
+\xe5\xb3\xfa\xfa\xfa\xc3\x21\xf5\xaa\x21\x09\x2c\x14\xd2\xdb\xc6\
+\x03\x84\x74\xfd\xfa\xf5\x43\x15\x15\x15\xbf\xd9\xb3\x67\xcf\xab\
+\xb1\x64\x02\x32\xff\xcb\x9a\x9a\x9a\x43\x21\x84\xe2\xcb\x97\x2f\
+\x87\x63\x78\xc8\xb1\x96\x96\x96\xf5\xd7\xae\x5d\xfb\x26\x1e\x7f\
+\x35\x96\x9c\xa0\x0c\xfc\xb3\xbf\xbf\x3f\x13\x42\x00\x91\xaa\xaa\
+\xaa\x52\x98\x02\x3d\xbb\xb7\x3b\x6e\x9f\x38\x71\x62\xc6\x3c\xa0\
+\xd1\x9b\x9a\x9a\xd6\x6f\xd8\xb0\x61\xdd\x98\xd2\x80\xcd\x9b\x37\
+\xff\x39\x98\x69\xec\xeb\xeb\x4b\xcf\x9e\x3d\x4b\x0f\x1e\x3c\x40\
+\xa5\x47\x0a\x5c\x0a\x27\x99\x1a\x1b\x1b\x93\xad\xae\xae\xee\xaf\
+\x71\xf9\x74\xac\x00\x00\xb3\x5f\x04\xf3\x48\x10\xef\x9e\x16\x2d\
+\x5a\x94\xc2\xf9\xa5\xe7\xcf\x9f\x23\x65\xe7\xa4\xce\xce\xce\xd4\
+\xd0\xd0\x90\x31\xfc\xf4\xe9\xd3\x34\x69\xd2\xa4\x74\xfa\xf4\xe9\
+\xf4\xe4\xc9\x93\x44\x0b\xff\x91\x68\x53\xa6\x4c\xf9\xf9\xc6\x8d\
+\x1b\x8b\x07\x0e\x1c\xe8\xff\xe0\x01\xd8\xb4\x69\x53\x75\xb4\xe9\
+\x71\x0b\xc3\x78\xf6\xb4\x6a\xd5\xaa\x34\x61\xc2\x84\x74\xe3\xc6\
+\x8d\x34\x6b\xd6\xac\x74\xea\xd4\xa9\xd4\xda\xda\x9a\xe6\xcf\x9f\
+\x8f\x9d\xc3\x60\xba\x7a\xf5\x6a\x5a\xb8\x70\x61\x3a\x7b\xf6\x6c\
+\xf6\x4e\x77\x77\xb7\xe6\x00\x68\x95\x2f\x5e\xbc\xd8\x14\x4b\xfe\
+\xfd\x83\x88\x02\xdb\xb7\x6f\x6f\x7c\xf4\xe8\xd1\xba\x20\xbc\x3f\
+\x88\x9d\x17\xd2\x5b\x31\x73\xe6\xcc\xdf\xde\xb9\x73\xa7\x2b\x88\
+\x9e\x1c\x63\xd3\x83\xe0\x84\x16\x00\x42\xc4\xf7\x77\xd1\xa2\x4c\
+\x33\x02\xcc\x0c\x84\x5b\xb7\x6e\xed\x0b\x8d\xd9\x4f\x38\x8d\x7e\
+\x34\xd6\xfc\xf7\x89\x13\x27\x1e\xbc\x17\x00\x7e\x1d\x6d\xc5\x8a\
+\x15\x95\xc1\x54\x6d\x30\xd3\x7a\xe6\xcc\x99\xdf\xaf\x59\xb3\xa6\
+\x39\x18\x7d\x10\xd2\x68\xba\x70\xe1\x42\xed\xb2\x65\xcb\xd2\xdd\
+\xbb\x77\xd3\xd4\xa9\x53\x53\x57\x57\x57\x7a\xfc\xf8\x71\x46\x6c\
+\x84\xad\xc4\xbe\xd8\x3e\x12\x0c\xa0\x90\xa8\x9e\x7e\xc4\x0d\x4d\
+\x61\x1d\x1c\x28\x66\xc3\xfd\xe5\xcb\x97\xf1\x07\x98\x13\xfb\xbc\
+\x0e\xad\xba\x1c\x4e\xf4\x1f\x3d\x3d\x3d\xff\xda\xbf\x7f\xff\x89\
+\x98\x33\x38\x62\x00\x76\xec\xd8\xb1\xf4\xe6\xcd\x9b\x5f\xc5\x6d\
+\xcb\xe2\xc5\x8b\x6f\xd6\xd6\xd6\xd6\x04\xa1\x8b\x7a\x7b\x7b\x5b\
+\xcf\x9f\x3f\xdf\xc8\x26\xa8\x24\x92\x84\x51\x18\xc0\x63\xf3\x8c\
+\x6d\xbf\x7a\xf5\xca\xae\x27\x77\x69\xa4\xce\x38\x44\xd2\x99\xcf\
+\x18\x4c\x0c\x1b\x0e\x01\x2d\x68\x51\x0b\x78\x3f\x63\xd8\xe7\x90\
+\x7a\x8a\xe8\x82\xf9\x00\x3e\x7e\x22\xdb\x3b\xe8\xee\x6c\x6f\x6f\
+\xff\x26\xf6\xfd\x32\xe6\xdc\x1e\x12\x80\xdd\xbb\x77\xa3\x8b\xbf\
+\x7b\xf8\xf0\xe1\x5f\x8e\x1f\x3f\x3e\x3b\xd4\x88\x97\x0d\x37\x10\
+\x08\xe1\x79\x06\x91\x1e\x1b\xdb\xdf\x78\x46\x42\x74\x1b\x6b\xe0\
+\xd0\x64\x9e\x3d\x60\x8c\x7b\xae\xf9\x6e\xf3\x3d\xaf\xac\xeb\x95\
+\x0e\x00\x79\xe7\x19\x1a\x09\x08\x00\xc5\xfa\x38\x4f\xfc\x48\xe6\
+\x67\x42\x1b\xae\x1f\x3d\x7a\xf4\x93\x37\x00\xd8\xb5\x6b\x57\x4d\
+\xd8\xd0\xd7\xa1\xaa\xeb\x62\x92\x4c\xb2\x10\x1d\xc6\xd8\x14\xbb\
+\x85\x38\x09\x18\x16\x00\x36\x86\x39\x1b\xce\x0b\x2d\x81\x30\xc6\
+\xed\x23\x01\x80\x2e\x93\x79\x10\x58\xcb\x88\xe0\xef\x87\x0f\x1f\
+\x66\x1f\x98\x56\x08\xdc\xd3\xfb\xc3\x24\xeb\x6f\xdf\xbe\xdd\x5b\
+\xf4\x85\x9d\x3b\x77\xb6\x44\x38\xfa\x36\x54\xb9\x96\xd0\x93\x27\
+\x02\x64\x91\x18\xe3\x61\xf3\x69\xee\xdc\xb9\x29\x5e\x06\x08\x36\
+\x96\x30\x89\xcb\xe6\x00\x60\xe4\xea\x3f\x20\xd6\xe6\xfa\x00\x25\
+\x08\x6a\x80\xfb\x39\xce\x9a\x39\x40\x87\xd4\x00\x3b\xcc\xf1\x1e\
+\xfe\x06\x8d\x20\x7a\x60\x56\x08\x12\x20\x42\xab\x11\x24\xeb\x17\
+\xc3\x17\xfd\x09\x5f\x9d\x01\xb0\x6f\xdf\xbe\xc6\x90\xca\xb5\x28\
+\x32\xaa\x64\x3a\xcf\x3c\x49\xca\xca\x95\x2b\x13\xed\xc8\x91\x23\
+\x20\x9d\x81\x10\x7e\x00\xe9\xe6\x01\xc8\x88\x8e\x82\x86\x8d\x01\
+\x8d\x35\xb2\x4d\x6d\x6a\x14\x8d\xb9\x30\xc7\x1e\xd3\xa7\x4f\xc7\
+\x79\xf1\x9b\x1a\x02\xe1\x43\x81\x24\x20\xa5\x20\xc8\x38\xe0\x2b\
+\x79\xd6\xc0\x0c\xe8\xd6\x0f\xfc\x86\xe3\xfd\x2a\x9e\xf7\x64\x00\
+\xdc\xbb\x77\xef\x3f\x11\x77\xab\x54\x53\x99\xd7\xfe\xc9\xb8\x02\
+\x31\x9c\x48\x46\xa4\xf3\x24\x16\xfb\x82\x10\xcd\x23\x22\x00\x8c\
+\xf2\x2c\x00\xae\x9b\xad\x41\x13\x00\x12\x20\xd6\x46\xa3\xc8\x01\
+\xf2\x4e\x50\xa6\x35\x3d\x9b\x29\x71\xe9\x6f\xac\x8d\x83\xc4\xe1\
+\x42\x07\xeb\xd2\xb6\x6e\xdd\x9a\xdd\x9f\x3b\x77\x0e\x67\x4d\xa4\
+\x40\x0b\x2b\x02\x88\x4f\x8b\x21\xfd\xda\x50\x8d\x9f\xe6\xbd\xac\
+\xc4\xa9\x8a\x84\x29\x50\x43\xa2\x80\x81\x84\x4f\x9e\x3c\xc9\x34\
+\xc6\xd9\x54\x00\x40\x18\x86\x95\x8e\x25\xec\x0f\x34\x80\x36\x6f\
+\xde\x3c\x9c\x2a\x5a\x04\x31\xec\x07\xb8\x86\x34\x9e\x5d\x03\x1a\
+\x74\xb6\xec\x87\x76\x71\xcd\xfb\x09\xe6\xb0\xaf\xeb\x93\x1f\x08\
+\x36\x91\x20\xfb\x7d\xce\x9c\x39\x19\x38\x57\xae\x5c\x31\x5a\x4d\
+\x2b\xc6\x4b\xad\x11\x8f\x0b\xbc\xa8\x63\x73\x41\x91\x9e\x31\x63\
+\x46\xb6\xb0\xa9\xea\xc1\x83\x07\x9d\x87\x8a\xb1\xd1\x1b\x6a\xc9\
+\x06\xda\xbf\x44\x0a\xc4\xf2\xe5\xcb\x49\x65\x31\x27\x18\x05\x54\
+\xcc\x0a\xa2\x19\xd7\x9e\x95\x24\xb4\x20\x41\x34\x0d\x3a\x98\x03\
+\xb3\xa8\x3c\x57\x23\x13\x82\x50\x20\x8c\xab\x45\xf8\x37\xae\xbc\
+\x57\xea\x5c\x0b\xc5\xd8\xa0\x10\x8d\x7c\x9b\x8d\xf3\x5e\x7f\x48\
+\xc6\x68\x10\xc6\x6f\x3c\x03\x00\x0b\x43\x30\x44\xd2\x35\x0d\x43\
+\x9f\xef\x31\x8e\x2f\x21\xa5\x25\x09\x82\x69\xf6\x05\x60\xd6\x40\
+\xc3\xb8\xc2\xb4\x0e\xcf\x7d\xd5\x4a\xf6\x31\x17\xc0\xff\xb0\x26\
+\x6b\x01\x12\x7b\xd2\xa0\x01\x3e\xbc\xd7\x17\xd9\xf3\x0d\x0d\xe0\
+\x65\x88\xd0\x86\xe9\x82\x90\x0f\x7f\x02\x61\x1e\xfe\x86\x5d\x6a\
+\x7f\x02\xa0\x59\xd8\xc8\xed\x2f\x5e\xbc\x08\x68\x48\x1d\x89\x03\
+\x00\x3e\x08\x69\xb2\x2f\x84\xeb\x00\xe9\x32\x8b\xf4\x55\x5b\xe6\
+\x40\x07\x6b\xe0\xf0\x58\x83\x88\xc3\x3c\x0b\x26\x53\xeb\x61\x53\
+\xec\xa2\x2a\xf4\xae\x4d\x2f\x9d\x6b\x10\x85\xa4\x4a\xd3\x56\x9c\
+\x1c\x0c\x10\x26\x91\x0c\x73\xd0\x06\x00\x83\x01\x1c\x14\x6b\xe1\
+\xb1\xd1\x1e\xf3\x07\x01\x61\x5d\x68\x45\x73\xb8\x47\x0b\x99\x03\
+\xe3\x80\x00\xf3\xbc\x8b\x43\x25\x04\x1a\xc5\xb8\xda\x87\x01\xa0\
+\x4c\x0d\xc2\x60\xc0\x06\x51\x48\x18\x55\x85\x50\x7d\x47\x14\x46\
+\x5c\x61\x1c\x8d\xc1\x31\xf2\x1e\x0c\xb3\x06\x0c\x41\x1b\x0c\xd2\
+\x01\x4d\xed\x83\x31\xd6\xa5\x94\xc6\x79\x5a\x1a\xb3\x47\x36\x7e\
+\xff\xfe\x7d\x9c\xec\xb0\xf5\x05\x3e\x20\x95\xbb\x69\x32\x46\x15\
+\x98\x8a\x63\x2b\x33\x31\x4d\x0b\x46\xa8\xe0\x32\x82\x97\x2c\x59\
+\x42\xb1\xc4\x19\x5f\x69\x46\x88\xb4\x61\x1e\xa6\x59\x03\x86\x01\
+\x8e\xe8\x01\xd3\x5c\x71\xd0\xac\xc9\x95\x75\x19\xc3\x54\x4c\xb3\
+\x05\xe2\xfd\x6b\x80\x9b\xda\xb0\x47\xc2\x28\x04\x40\xac\x21\x92\
+\x2b\xb6\x8f\x39\x00\x00\xe6\x01\xe1\xe6\x0d\xe6\x21\x26\x2f\xfa\
+\x03\x7d\x92\x76\x0e\x38\x80\x82\xc6\xa8\x25\x8c\x13\xfa\x58\x1f\
+\xad\x1a\xd6\x07\x94\xb3\x11\x26\x21\x02\x50\xb5\x41\xd4\xbf\x94\
+\x79\x54\x17\x82\x91\x26\x7e\x40\x4d\xe4\x1d\x23\x8a\x79\x88\xe9\
+\x30\x73\x60\xd4\xb9\xcc\x43\x5b\xe4\x81\x39\x00\x05\x20\x79\xc7\
+\x6d\x1b\x15\x0d\x30\x03\x63\x63\x25\x44\x83\x59\x01\x80\x09\xa4\
+\x4d\xb9\x8a\xad\x32\x66\x4a\x8c\x64\x35\x15\xcf\x0e\x64\xce\x08\
+\x01\xc8\x98\x0b\x8e\xd5\x04\x88\xf7\xd4\x06\x43\x26\x9a\x85\x1f\
+\x61\x9d\xd1\xd2\x00\xe3\x36\x1d\x86\x70\x4a\x84\xaf\x7c\xa6\x08\
+\xf1\x84\x5d\x3d\x39\x0c\xe8\xd4\xb0\x61\xa3\x00\xa0\x31\x6e\x78\
+\x86\x79\xde\xb1\xe0\xa1\x13\x05\x04\x3e\x9f\x00\xc1\xb4\x7b\x51\
+\x67\x70\xff\x56\x27\x58\x56\x0d\x90\x51\x9a\xea\x8e\x9a\xe7\x55\
+\xd2\x3a\x9d\x28\xc0\xb8\x67\x06\x8c\x31\x17\xa6\xb8\x1a\xfb\xcd\
+\xf4\x90\x3c\xcf\xfa\x05\x8b\x1f\x9a\xd9\xa2\x69\x35\x60\xd0\x0c\
+\x9b\x68\x1c\xfb\x8e\xaa\x06\x68\xab\x4a\xd1\x31\x98\x70\x1e\xfb\
+\x43\x38\x04\xeb\xe1\x71\x60\xf3\x66\x2c\x49\x4d\xd3\x3e\x49\x03\
+\x13\x42\xdd\xbb\x6f\xa3\x29\x30\x6c\x8d\x60\xde\x6f\xea\xab\x84\
+\x87\xca\x1e\xc9\x31\x00\xd5\x7c\xe2\xfd\xfa\x80\x3c\x21\x82\x9b\
+\xaf\xda\x54\x55\x88\xb7\xb4\x05\x00\x41\x50\x0b\xe6\xcf\x5c\x9a\
+\xfa\x6b\x1f\xa7\xe6\xa6\x96\x54\xdd\x96\x85\x4c\xed\x1d\x46\x74\
+\xb6\xac\xc7\x3b\xae\x6f\x04\x92\x27\xfd\x0a\xa6\x88\x29\x00\x40\
+\x59\x35\x60\xd8\x23\x2b\x01\xb0\xa9\x01\xee\x2b\xd1\x8c\xe5\x35\
+\xa1\x50\xf7\x32\x2d\x58\xb4\x34\x15\xeb\xfa\x52\xb1\xba\x39\x75\
+\x90\x2a\xc7\x3b\x66\x99\x9e\x31\xa2\x19\xac\xaf\x29\x5b\xd0\xe5\
+\xa3\x10\xe1\xd0\xcc\xb3\xb4\x55\x94\xd3\x07\xc8\xa8\x04\x20\x95\
+\x52\x60\xf2\x67\x0e\xf9\x7b\x9f\x3d\x23\x7c\xde\xdf\x1e\xcc\x3e\
+\x4a\xb5\x55\xf5\xa9\x3e\xca\xd8\x89\x75\x93\x53\xfd\xec\xc8\x19\
+\x1a\xa6\x38\xcf\xf7\x5c\xc3\xee\xfe\x76\x35\x0d\xb0\xde\x04\xa0\
+\xdc\x3e\x20\x4f\x40\xbe\xa2\xf3\xde\x4c\xd0\xef\x7f\x30\xeb\x5c\
+\xfb\xf7\x31\xbf\xa7\x37\x75\x84\xea\x77\xb5\xb7\xa5\xee\xb6\xf6\
+\xd4\x1b\x6a\x3c\x21\xbe\x9c\x0f\xe6\x34\x8c\xf5\x2c\x99\x05\x54\
+\xe9\x6b\x86\x66\x93\xac\x5b\xda\x8a\x12\x53\x6e\x00\x8c\xdd\x3a\
+\x2d\x9a\xa1\xd1\x33\x02\x55\x9f\x79\x3a\x35\xed\x1b\x6f\x5e\xc5\
+\x07\x8f\xfa\xba\xd4\xf7\xbc\x27\x3d\x8d\x32\xb9\xb3\xa7\x3b\xf5\
+\x15\x99\xfb\x7d\xc5\x0a\x00\xbc\x83\xa7\x57\xd2\xa5\x25\x38\x7b\
+\x50\x83\x70\x1d\x1d\x00\x24\x40\x00\x2c\xb9\x75\x4a\x82\xc2\xbd\
+\x85\x92\xcc\x6b\xe3\xcc\xc9\xca\xe3\xca\x42\x7a\x45\x32\x55\x5d\
+\x91\xba\xba\x3b\x23\xb7\x4e\xa9\xab\xb3\xcb\x13\x6b\x22\x06\x60\
+\x19\xf7\x65\xdc\xc6\x98\xc5\xd2\x90\xad\xa8\x57\x2e\x57\xf3\x24\
+\x57\x42\xcc\xe3\x21\x42\x7f\x03\xb1\x66\x7e\x48\x0e\xdb\xa4\x9b\
+\xfe\xe6\x6d\x96\x10\x56\x37\xb3\x21\x4d\xa8\x9c\x98\xba\x7a\xbb\
+\xd2\xa3\x2b\x0f\x01\x0c\x2d\x61\x4d\xee\xcd\x1a\x3d\x87\x54\xab\
+\xbc\x1f\xdd\x54\x18\x06\xf2\x84\xc0\x84\xa0\xd0\x4c\x7a\x90\x9a\
+\x80\x51\x10\x91\x12\x23\xfd\x7c\xf1\x83\x60\x3c\x95\xce\x67\x82\
+\xda\x33\x8c\x73\x82\xb4\x60\xc1\x02\xcf\x27\x05\xd8\xc4\x89\x44\
+\x69\x74\x8b\x21\x9d\x9a\xcd\xb3\x3a\x80\x80\x60\x6d\x14\xd5\x67\
+\x0c\x66\x01\x8a\xda\x3d\x3e\x5b\x65\xc0\x18\xeb\xad\x05\xb4\x65\
+\x41\xf0\x9c\x32\x3e\xdb\x71\x40\x2b\xd0\xcc\xc9\x3b\x42\xb5\x84\
+\x3d\x47\x4f\x03\x4c\x47\x05\x82\x67\x08\xf1\x68\x8b\x31\x99\xf6\
+\xd0\xd3\x12\x1a\x10\x50\x79\x6b\x04\xab\x41\xdf\xf1\xec\x12\x9a\
+\xa9\x20\x39\x12\xf3\x5c\xd0\x33\x4a\x80\xf5\xd3\x1d\xe6\x05\xf3\
+\xa3\x75\x20\x62\xfd\xaf\xf3\xd3\x0c\x60\xca\x6a\x4d\x02\x21\x1a\
+\x40\xf2\x1f\x47\x19\x83\x21\x8b\x17\xa4\xed\x3c\xc3\x27\x5f\x77\
+\x00\x94\x4a\x12\x06\xd9\x03\xe6\x35\x09\xfd\x0f\x42\xe0\x58\x8c\
+\xdf\x46\xd7\x07\x58\xcf\xeb\x84\x54\x77\x2b\x40\x98\x32\x13\xb4\
+\x74\x36\x1c\xf2\x9b\x45\x8b\x15\x9d\x1f\x52\x61\x44\x8f\x1e\x5f\
+\xaa\xd1\x0e\x4f\x95\x00\x8f\xf7\x33\xa0\x3c\x29\x6a\x6e\x6e\x36\
+\xed\x1d\x55\x1f\x20\xc3\x1e\x45\xeb\x18\x01\x85\x7c\xdc\x83\x4e\
+\xf3\x7a\x01\x31\xf4\xe1\x20\x61\x54\xd3\x00\x00\xde\xa1\xf6\x67\
+\x1d\xd7\xd4\x21\x5a\x4c\xb1\x27\x63\x74\xd6\xc0\xf9\x01\xfa\x88\
+\x00\xe0\x0b\x71\xb9\x01\xc0\xa1\x69\xbf\x66\x6c\x48\x0b\xf5\xd5\
+\x57\xc0\xb8\xde\xde\x52\xd7\x44\x4a\xa6\x4a\x73\x0b\x55\xde\x22\
+\x27\x9f\x0c\x79\x62\x84\xf4\x31\xbb\x11\x29\x6c\x31\x50\xae\x61\
+\xd1\x72\x54\x7f\x36\x88\xb3\x04\x2e\x05\x06\x10\x20\x54\xe7\x05\
+\x13\xac\x81\xdd\x23\x71\xa5\x6a\x6d\x60\x46\x49\xb7\xb6\x27\xf9\
+\xf1\x54\x29\xff\x75\x8a\x77\xf9\xd6\xc0\xbc\xb5\x6b\xd7\x72\xec\
+\xa6\x06\xe9\x24\xf9\x2e\x21\xdd\x00\xde\x87\x06\x34\xf0\xf0\x0e\
+\xcd\x8c\xee\x6d\x5a\x80\x2d\x2a\x39\xbb\xc7\xde\x10\xe7\x87\x0d\
+\x08\xf1\x4b\x8e\xa7\xba\x1e\x8c\x70\xc6\x0f\x53\x00\xc5\xf1\x39\
+\x6b\xc8\x98\xef\x20\x6d\x00\x63\x3d\x2b\x4e\x2a\x40\xd6\xf6\x3d\
+\x40\xf5\xbc\x01\xba\xa0\x01\x20\x6f\x15\xf9\xdb\x5b\xff\x14\xed\
+\xc7\xb6\x7c\xf5\xa5\xbd\xea\xfd\xd9\xc0\xdf\x4a\x9b\x4e\x12\x8f\
+\x0e\x51\x48\x15\xa2\xf3\x69\x33\x34\xd1\x79\x9f\x64\xc7\x46\xe6\
+\x67\x68\x33\x29\xe2\x7d\x4b\x5d\x01\xf8\xee\xbb\xef\x86\x22\x59\
+\x00\xd1\xd0\xb3\x11\x49\xfe\x5b\x8c\x81\x9b\x64\x5a\x6c\xca\x22\
+\xf9\xd8\x9b\xaf\xeb\xed\x2c\x6e\x4d\x0f\x61\x7e\xa8\x90\x28\x8f\
+\xb8\xec\x6e\xea\xb5\xa4\x79\x86\xef\x91\xd8\x70\x69\xb9\x66\x82\
+\xcf\xf0\x0b\xb6\xe7\x83\x23\x31\x57\xfd\xc7\x85\xf8\xfb\x86\x2f\
+\x63\xa8\xad\x18\x52\xea\x08\x6f\x79\x28\x08\x5f\xef\x5f\x58\x04\
+\x83\x32\xe2\x55\xe2\x65\x12\x2f\x3f\x10\x44\x7c\x1b\x8f\xcf\xf2\
+\x69\xae\xcd\xf8\x3e\x82\x26\x38\x95\x01\xe8\xd4\x58\x63\x7a\xd0\
+\x50\x13\x9d\xbf\x57\x80\x3e\xf6\x1b\x88\xf1\xbe\xb8\xbc\x88\xa9\
+\x8f\xc3\x41\x3e\x09\xa0\x7e\x6c\x02\x83\xd0\x3a\xc2\x9c\x2e\x45\
+\x38\xfe\x3a\xd6\xbb\xc0\x29\x7e\x21\xfe\xf6\x7e\x52\x2c\xbc\x3a\
+\x54\xf6\xf3\x40\x77\x59\xfc\xf0\x13\xfe\xcc\x8d\xf9\x79\xc9\x4b\
+\x67\x34\xa0\xbe\x1d\xb6\x74\x24\x88\xf8\x5f\xbc\xdb\x99\xde\x4f\
+\x73\xc3\x42\xb4\xd7\x65\xc8\x4f\x90\x0e\xb4\x12\x1b\xef\x45\x7f\
+\x12\x7f\x71\xfa\x3a\x0b\x81\xf1\xf7\x7d\xd3\x02\xed\x96\x60\x66\
+\x6e\x3c\x83\x7e\x7d\x00\x41\xfd\xca\xef\x48\xb2\x10\x9d\x7b\xfa\
+\x60\xdc\xb3\x50\x7b\xcc\xb9\x16\xd7\xa7\x69\x6c\x34\x40\xec\x23\
+\x68\x04\xe3\x7d\x0e\x9a\x03\x00\x42\x15\x99\x6c\xf4\x9a\xe8\x18\
+\xa2\xfa\xeb\xb5\x40\x67\x21\x54\x07\x7f\x44\x07\xc5\x34\x86\xdb\
+\xf8\xbf\xce\xa6\x34\xfe\x5f\x63\xe3\x00\x8c\x03\xf0\x11\xb7\xff\
+\x03\x7f\x19\x0a\xe4\xd7\x62\x63\xda\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x15\x14\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x14\x91\x49\x44\
+\x41\x54\x78\xda\xe5\x5b\x79\x8c\x64\xc5\x7d\xfe\xbd\xa3\x8f\xe9\
+\xee\x39\x76\xa6\x97\xdd\xb9\x96\x3d\x66\x61\xef\x05\x61\x6c\xae\
+\xa0\x38\xb6\x20\x4e\x2c\x22\x27\x32\x09\x92\x0f\x14\x20\xc6\x81\
+\x18\x84\x92\x08\x59\x8a\x30\x7f\x18\x04\x09\xe0\xf8\x08\x47\x24\
+\xa2\x24\x76\x14\x9b\x80\xf3\x4f\x0e\x27\x86\x80\xc3\x61\x60\x31\
+\xe6\xb0\x21\xbb\xec\xb2\xf7\xce\xf4\x4c\xcf\xf4\xdd\xfd\xae\xaa\
+\x7c\xbf\x7a\x5d\xf3\xfa\x98\x49\xef\xb4\x90\x65\x29\x65\x7d\x54\
+\xbd\x7a\x47\xd7\xf7\xbb\xab\x66\x6d\x48\x29\xe9\xff\x73\xb3\xe9\
+\x97\xb8\xbd\x74\xed\xb5\x03\x9e\xeb\x66\x09\xf0\x84\x18\x23\xe9\
+\x67\xa5\x2f\xb3\x42\x88\xac\x14\x18\x63\x4e\x04\x22\x2d\xfd\xe0\
+\xdf\x7f\xf3\x95\x57\xfe\x8a\xfa\x68\xbf\x30\x0b\x78\xef\x4b\x5f\
+\x4a\x54\x3d\x2f\xeb\x48\x37\x6b\xf8\x41\x96\x04\x88\x04\x04\x02\
+\x41\x56\x92\xc8\x52\x20\x43\x52\x52\x8c\xc9\x40\xe0\x9e\x60\x82\
+\x29\x89\x87\x70\x4d\x18\x87\x08\x02\x12\xd1\xb8\xd9\x8b\xc6\x46\
+\x21\x86\x2e\x3a\x70\xc0\xfb\x85\x58\xc0\xcf\xef\xbe\x3b\x6e\xd5\
+\x6a\x59\xd7\xf3\xc6\x4c\xc3\xc8\x0a\x62\x12\x06\x2f\x18\x3d\x8d\
+\x19\x22\xc8\x0a\x49\x59\x92\x4c\x42\x86\x7d\x20\xd3\x20\x47\x06\
+\x6e\xa0\x03\xd0\xf3\x80\x00\x26\x21\x19\x12\x64\x00\xdc\x23\xd9\
+\x84\x7a\xae\x1d\xb4\x0c\xd2\x73\xc9\x63\x52\xee\xbc\x88\xe8\xcd\
+\x0f\x44\x00\xef\xdc\x79\xe7\xed\xe5\xb8\xbd\x29\x79\xe2\xe4\x88\
+\xb1\x6e\x24\x26\x0d\xca\x1a\x64\x8c\x11\x48\x12\x49\x80\x06\x7d\
+\xe2\x26\xa1\x38\xee\x42\x32\x7a\x61\x22\xec\x43\xed\xf0\x98\xfb\
+\xe6\x75\x04\xb9\x32\xa4\x86\x88\xde\xd7\x08\xaf\x43\x88\xf6\xdf\
+\x34\xa4\x7f\x01\x7d\x10\x02\x78\xec\xc2\x0b\xbf\x72\xc5\x95\x97\
+\xdf\xe5\x98\x43\x94\x1a\x18\xa0\x40\x88\x90\xaa\xc1\xff\x55\xff\
+\xa1\x50\xf4\x7a\x28\xc3\x61\xa4\x9d\x88\x74\x34\x56\xef\x5a\xa9\
+\x34\x05\x8d\x3a\x5c\x99\xcd\xda\x65\x33\x50\x30\x63\x36\xe6\x1b\
+\xe1\xb5\xd0\xc4\xf1\x46\x32\x41\xa4\x85\x55\xa9\xb4\x0b\xa3\xc3\
+\x2a\x84\x30\x2e\x30\x0c\xe3\xef\x25\x5a\x5f\x02\x30\xd0\xee\x98\
+\x9e\x4e\xce\x0c\x0f\xdf\x5e\x2f\x95\xa9\x54\x2c\x53\x76\x7c\x9c\
+\xfc\x72\x89\xc8\x34\x69\xb5\x66\x26\x12\x24\xea\xf5\x48\x10\xe1\
+\xe2\x99\x8c\xd6\x54\x48\xcc\x60\x01\x0c\xa0\xc7\x3b\x98\x0b\x6a\
+\xfc\xb2\xa5\xe6\xfc\x5a\x83\xac\xc1\x21\xf4\x35\xb2\x86\x06\xc9\
+\xcd\xcd\x13\xa5\x53\xca\xf7\x85\x03\xc1\x60\x5e\x13\xee\xd6\xbe\
+\xb6\x00\xb1\xbf\xa9\xa1\xb5\x0b\x80\xc9\xf3\x72\x3c\xa2\x6d\x41\
+\x10\x0c\xd7\xf0\x83\x85\xa5\x22\xc5\x76\xee\xa4\x5a\x6e\x8e\xcc\
+\x64\x52\x4b\x49\x6b\x5d\x75\xf1\x6c\x96\xbc\x42\x81\x12\x1b\x36\
+\x52\x50\xad\x84\x6b\xf1\x3d\x32\x62\x31\xe2\x4f\x06\x9e\x47\xd6\
+\x40\x4a\x09\xa8\x31\x3f\xaf\x34\xeb\xd7\x41\x36\x99\xc4\x3b\x1b\
+\xc8\xc9\xe5\x48\xb2\x65\xc0\xd2\xbc\x7a\x95\xc8\x32\xc9\xaf\xd6\
+\xc8\x84\x50\x02\xd7\xa3\x00\xe4\xf9\x5d\xe9\xba\x91\xf6\x05\xf7\
+\x1d\xae\x80\x1e\x2a\xda\xcb\x2b\xec\xd7\x05\x0c\x20\x31\x57\xaf\
+\xaf\x9f\x49\xa5\xa8\x86\x1f\x75\xaa\x55\xb2\x86\x47\x28\x60\xe9\
+\xc7\xe2\x78\xa2\xfd\xeb\x12\x30\x2c\x1b\x8b\x74\x48\xb8\x0e\x34\
+\x08\xcd\x2d\x2c\x28\x72\x36\xb4\xe9\x2c\x2e\xc2\xb4\xe3\xea\x9e\
+\xa4\xd0\xff\xb5\x00\xdd\xa5\x25\x08\x6e\x89\x04\x5c\x21\x58\x2a\
+\x34\x4d\xbe\x33\x3e\x04\xaa\x27\xdb\xc2\x37\xbc\xe8\x9e\xd4\x71\
+\xa5\x45\x18\x00\xfe\xb3\xfe\x9b\xdb\xb7\x8f\x43\xf0\xa7\xd6\xe2\
+\x06\x76\x53\xfb\x16\x90\x2e\x04\xc1\x04\x07\xb0\x06\xfc\x31\x33\
+\x98\x21\x7b\xdd\x08\x49\x98\xa7\x1c\x0c\x34\xe9\xb6\xe6\x2c\xcc\
+\x2b\xc2\x0d\x68\xd2\x4a\x24\x95\x86\xdc\x52\x99\x4d\x5b\x49\xab\
+\x7e\xfa\x54\x4b\x1c\x90\x54\x3b\x71\x42\xbb\x84\x26\xda\x41\x5e\
+\x32\xda\xef\x35\x7c\xfd\x8d\x2e\x17\x00\xda\x2c\x63\x90\x88\x03\
+\xe1\xa9\x7e\x2c\xc0\x04\x52\xae\x54\x45\x06\x39\x8e\x4b\xe7\x6c\
+\x9f\x21\xd7\x07\x71\x19\xe6\xdb\x95\x4c\xc0\x87\x95\xe8\x00\x28\
+\x3c\x8f\x47\xa1\x99\x57\xca\xad\x01\x31\x22\x2d\x23\x82\x3a\x4b\
+\x44\x02\x88\xae\x89\xc1\xf9\xde\xf7\x29\xf0\xb9\xf7\xd4\xd8\xc7\
+\x98\x94\xba\x2c\x32\x01\xb8\x5a\x28\x6c\xdc\x93\x58\x0b\xc8\xec\
+\xc3\xdd\x7f\xe9\x57\x00\x31\x43\xca\x14\x2f\xd2\x81\xcf\x4d\xcf\
+\x6c\xa3\xea\x7c\x8e\xcc\x78\x3c\x5c\x54\x77\xd3\xe4\xa3\x6c\xa0\
+\x53\x22\xe9\x34\x18\x09\x81\x05\x20\x02\xc1\x71\x21\x04\x2f\x1a\
+\x40\xaf\x82\xac\x61\x59\x80\x0d\x60\x8c\xdf\x34\x6c\x9b\x6c\xcc\
+\xc7\x00\xa4\x60\xf0\xe4\x9e\xf8\x79\x95\x31\x82\x3a\xe0\x38\xe1\
+\x98\xdd\x8c\xb3\x89\x94\xfb\x74\x20\xec\x27\x0d\x9a\xf0\xd1\x18\
+\x2f\xd6\xf3\x7c\x15\x7c\x2a\xe5\x1a\x0d\x20\x1a\x3b\xda\x02\xba\
+\x9a\x04\x09\x90\x0a\x3c\x28\xc1\x67\x2b\x08\xb5\x16\x04\x4c\x46\
+\x91\xb0\x00\xee\xc9\x8e\x21\x63\x58\xb8\xb6\xe0\xd6\x36\x00\xc2\
+\x26\x60\x19\xca\xc7\x03\xfc\x9e\xd0\x84\x18\xd0\xa8\xaf\x2d\xa4\
+\x37\x94\x0b\x58\x3a\x10\xf6\x15\x04\x81\x79\xdf\x2f\xa2\x57\x64\
+\x3c\x04\xb1\x52\xb5\x4e\x83\x08\x84\x8d\xc5\x3c\xd5\x0a\x45\x12\
+\x2c\xa5\x78\x8c\x4d\x4f\x59\x86\x65\xa1\xcf\xc4\xc8\x42\xb0\x8b\
+\xc7\x98\x5c\x1c\x81\x2f\xd4\xa2\x6c\x92\x11\x8a\x90\x43\x3e\x7a\
+\x59\x87\x90\x9a\xe6\xee\xb7\xb9\x40\x38\xa6\x68\xdc\x01\xd9\x1b\
+\x52\x32\x89\xed\x9f\xdb\xb0\x21\x89\xb0\x56\x93\x68\x6b\x2e\x84\
+\xde\xaf\xd7\x17\xf1\x96\xd2\x60\xad\x5c\xa6\x42\x2e\x4f\xe7\x5e\
+\x3c\x4d\xf2\xd4\x29\x1a\xdb\xb5\x8b\xcd\x34\x24\xa5\xc9\xb9\x0e\
+\x08\x42\x73\x24\x55\x40\xf6\xa8\xc5\x0d\x80\xee\x9e\xc9\x74\x8e\
+\x55\xdf\x4d\x3e\x22\x06\x88\xff\x1b\x62\x19\xb1\xcb\xe2\xf1\xdd\
+\x7f\x47\xf4\x6a\x3f\x2e\x20\xab\x41\xe0\xba\x42\xa0\x0b\xd2\xb5\
+\x5a\x9d\x4a\x88\xee\xf6\xc8\x88\xd2\x62\xf5\xd8\x51\x8a\x9a\xe2\
+\xd4\x51\x15\x46\xe4\x69\x45\x41\x88\x96\xba\xbe\x83\xb0\x5c\x51\
+\x00\x6d\xe4\x68\x19\xb2\x1b\x32\x42\xd2\x90\xfb\xa9\x0f\x01\x48\
+\x40\x00\x7e\x2d\x08\x0a\x83\x42\xa4\x51\x0b\xf0\x02\xb8\x16\x50\
+\x5a\x36\x06\x92\xd4\x91\x06\xda\x3b\x29\xb5\x30\x34\xe9\xae\x80\
+\xa8\x02\x2c\x4a\xda\x0a\xfc\x7b\xdd\xd8\xd8\xea\xfb\x85\x8e\x31\
+\x45\xa6\xde\x91\x39\xba\x61\x0a\xc4\x81\x35\x34\xb3\x85\x8d\x0f\
+\x78\x2c\x00\x5d\x0b\xf0\x22\x25\x07\x31\x21\x9b\x5b\xd2\x20\x44\
+\xc0\x10\xcb\x73\x22\xda\x96\x02\x3c\x0e\xaf\x45\x73\x4e\x00\x7c\
+\x5d\x02\xf9\xe9\xcf\x5f\x4f\x57\x3d\xf1\x4f\x3d\x82\x5a\x07\xf9\
+\x88\xb4\x86\x16\x52\x17\x8c\x30\x15\x9a\x6b\xb2\x00\xad\x7d\xc0\
+\xad\x0a\xb1\x14\xd6\x02\x1e\x4d\xef\xdd\x4d\xd5\x85\x79\x15\xf0\
+\x7c\xd1\x91\x09\xb4\xb6\xa3\xb1\x4a\x51\x25\x54\x83\x23\xe7\x9c\
+\xb3\xe2\x26\xe9\x43\xbf\xf3\xdb\x34\x75\xc3\x0d\x61\x4e\xe7\x32\
+\xd9\x30\x75\x31\x13\x91\x6d\x89\x0d\xb4\x7a\xb1\xc4\x58\xd9\x02\
+\xa4\x54\x99\xa0\x1f\x0b\xf0\x00\xa7\xe4\xfb\x0b\x4a\x00\xae\x4b\
+\xe3\x5b\x36\x43\x00\x79\xb2\x32\x19\x12\x5a\xbb\x80\x50\x50\x1a\
+\x6e\x5a\x44\xd8\xdb\xdb\x66\xe8\x23\x7f\xf9\x75\xf2\x38\x40\x0a\
+\xfd\x7c\x84\xc3\xdf\xfd\x2e\xcd\x7e\xff\x29\x32\x6d\x9b\x2b\x47\
+\x6d\x29\xcd\xf7\x57\x44\x37\xf9\xd5\xef\xeb\xc0\x34\x7a\xcf\xc6\
+\x8d\x53\x06\xda\x59\x09\x40\xa2\xb5\xb8\x80\x5b\xf4\xfd\xbc\x4e\
+\x85\x41\xb1\x48\x65\x04\xc2\xf8\xc8\x3a\x6d\xd2\x0a\x32\x22\x17\
+\xb9\x01\xfa\x0b\xef\xb8\x83\x26\x2e\xbb\x8c\xec\x89\xc9\xe5\xc5\
+\x89\x96\xde\x01\xe9\xd2\x1b\x3f\x25\x6e\x89\xb1\x51\x7d\xef\x2c\
+\xd1\xed\x0a\xd1\x39\x41\xd8\x8b\x26\x91\x75\xa6\xb9\xbf\x1f\x0b\
+\x08\x00\x37\x1f\x04\xf3\x4d\x01\xe0\x22\x4f\xc5\x33\x67\x38\x13\
+\x70\x5e\x6f\xd7\xa8\x5e\x8c\xb6\x06\x3c\x9f\xc0\x73\xdc\xce\xbf\
+\xe9\x26\x65\x05\xd1\xf3\x91\x96\x1b\xc7\x4f\x10\xb7\xf4\x94\x12\
+\x92\x16\x60\x6f\xd2\x00\xbb\x4d\x19\xbb\x4f\x07\x75\x48\xd5\x0f\
+\xa8\x5c\xa9\x44\xf7\x23\x22\xaa\x24\xee\x27\x0b\x28\x01\x9c\x74\
+\xdd\x39\x2d\x80\x4a\xa5\x4a\x65\x6c\x63\xed\x4b\x2f\x21\x62\x01\
+\x74\x58\x95\x6c\x19\xc7\xb0\x71\x5a\x78\xe6\x69\x4a\xc2\x5d\x26\
+\x7f\xfd\x13\xf4\xf3\x8d\xe3\x24\x72\xf8\x54\x47\x3d\x50\x9f\x3b\
+\x43\xdc\x52\x9b\x36\x93\xfc\xef\xe7\x95\xf6\x3c\xc7\x51\xd6\x60\
+\x59\x5c\x8c\x1a\x51\x0c\x68\xf1\x7f\xc7\xb2\x69\xc7\xcd\x37\xd3\
+\xf8\xee\xdd\x94\x9a\x9c\xa0\x81\x2d\x5b\xa8\x84\xcd\xd5\x0f\xaf\
+\xba\x5a\x0b\x40\x5b\x00\x7f\xe3\xac\x4b\x62\xb3\x23\x0d\x7a\x67\
+\x1c\x27\x1f\x80\x3f\x2f\x88\x53\x61\x65\x69\x29\xac\x05\x5c\x57\
+\xbb\xc0\x8a\xae\x30\xb8\x65\x2b\x15\x5f\x7f\x8d\xe6\xfe\xfa\x51\
+\xe2\xb6\xeb\xd6\x5b\x61\x05\x4e\x97\x1b\x94\x17\xf2\xaa\x64\x4e\
+\xcf\xcc\x50\x15\x5b\xe1\x7a\x22\x41\x9b\x10\x18\x67\xf0\xfc\xd8\
+\x27\x7e\x83\x8a\xd5\x2a\x07\xd3\xb6\xb8\x20\xd6\x8d\xd2\xd5\x88\
+\x1f\x23\xcf\xfd\x90\xde\xfd\xcc\x75\xf4\xda\xaf\x5e\x49\x87\x2e\
+\xff\x08\xd1\xf3\xcf\x61\xc5\x1e\x2f\x3e\x82\x61\xe8\xb3\x01\x73\
+\x0d\x2e\xd0\x96\x09\x9c\x1a\x4a\x62\x5e\x6c\xbd\x56\x23\x1b\x87\
+\x15\x46\x12\xd0\x64\x3b\xd1\x9c\x1f\xde\xbb\x8f\x6a\xef\x1d\xa6\
+\x93\x67\xe6\x68\xe1\x3f\x7e\x40\x93\x57\x5e\x49\xf1\xe9\xe9\x76\
+\x17\x00\x1c\x69\x50\xf9\xf0\x61\x9a\xfa\xd8\xc7\xe8\x92\xfb\xef\
+\xa7\x5f\xf9\xbd\x6b\x69\x6b\xad\x44\x5b\xb7\x6f\xa3\x2b\xee\xbd\
+\x97\x7e\xf7\xc0\x6b\x14\xdb\xb6\x4d\x93\x57\xc2\xf8\xe8\xe3\x8f\
+\x53\xe1\x1f\xbe\x4d\x07\x7e\xf2\x16\xe5\x92\x69\xca\x25\x52\xf4\
+\xe6\xdc\x22\x3d\xff\xe5\x3f\xa3\xa0\x9d\xbc\xb6\x80\x99\xcf\x8c\
+\x8e\xa6\x0c\xb4\xb5\x08\x40\x67\x02\xb7\x2e\x44\x41\xb0\xbf\xc2\
+\x34\x37\x4c\x4f\x51\x0d\xfb\x02\x2b\x91\xe8\xf6\x51\xf6\xfd\xe6\
+\x31\xf5\xe8\x85\x17\xaa\x78\x11\x90\x41\x73\x8f\x3e\x4c\xdc\xf6\
+\xdc\x76\x1b\x9b\x77\x18\x24\x01\xd9\x44\xf5\xd0\x41\xb2\x90\x5a\
+\xe7\x1f\xf9\x16\x1d\x78\xe4\x51\x7a\xfe\xdb\xff\x48\xaf\xdc\x74\
+\x23\x9d\xbe\xe5\x0b\x14\x1f\x1a\xa2\xab\xbf\xf3\x1d\x92\xc3\xc3\
+\xea\xd9\x91\x7d\xfb\x68\xdd\x79\xe7\xd1\xd1\xe7\x7e\x44\x42\xca\
+\x36\x9f\xaf\x5a\xf6\x32\x79\x11\x92\xd7\xb0\xf6\x0d\x0c\xec\x5e\
+\xab\x05\xc8\x65\x0b\x08\x82\x25\xa1\xb6\xc5\xa8\x05\x76\x9c\x4f\
+\x75\x6c\x86\xec\x74\xba\x4d\xf3\x82\xa1\x83\x97\x65\x71\x90\xc4\
+\xf3\xbe\x9a\x3b\xf2\xde\xfb\x94\x7b\xee\x39\x9a\xb8\xe2\x0a\x4a\
+\x6c\xdd\xd6\x6e\xce\x40\xfd\xbd\xf7\x88\x5b\x11\xd6\xe0\x41\x60\
+\x30\x78\x2a\x26\x53\xf4\xda\x7f\x3e\x43\xb3\x4f\x7c\x8f\xe2\x38\
+\x5d\xda\x7c\xcd\x35\xea\xd9\xb1\xcd\xe7\xaa\xa5\x35\x82\xa0\x8d\
+\xbc\x86\xe8\x20\xaf\x91\x20\xda\xdf\x8f\x0b\x78\x80\x53\x0e\x82\
+\xbc\x3e\x18\xd9\x30\x31\x8e\x54\x38\x4f\x71\xf8\xa1\xce\xfd\xdc\
+\xcb\x65\x04\x34\xb4\x79\x33\x39\x88\xfa\xd6\xf9\xe7\xd3\xf0\x47\
+\x7f\x8d\x36\x7f\xf1\x8b\x94\xda\xba\x95\xb8\xed\xbd\xfd\x76\x58\
+\x41\xa3\xcd\x0d\xea\xcd\x7d\x45\x72\x6a\xaa\xad\x62\x74\x0d\x93\
+\x72\x4f\x3e\x41\x68\xec\x42\x6a\xce\x32\x0d\x15\x40\xd3\xbb\xf7\
+\xa8\x5e\x10\xb5\x41\x76\x93\x57\x73\xb1\x30\x13\x9c\x9d\x0b\xb4\
+\xd6\x02\x5a\x00\xcb\xa9\x90\xb7\xc5\x73\x73\x64\x8f\x8e\xf2\x81\
+\xa7\x2e\x75\x23\x60\x91\x23\xf0\xff\x31\x04\xb5\x8b\x2f\xb9\x98\
+\x76\x0a\x97\xb2\x2f\x3c\x4b\xf9\x9b\x7f\x9f\x4a\xaf\x1d\xa0\x89\
+\xcb\x2f\xa7\xd4\x8e\x9d\xad\x6e\x00\x01\x1c\x0b\x53\x21\x22\x79\
+\xe7\x5f\x7e\x4e\x1f\x3c\x48\xaa\x35\x35\x5e\x7b\xe9\x45\x95\x48\
+\x66\xbe\xf0\x07\xe4\x0a\xd1\x45\x94\xd7\x68\x66\x32\x5d\x71\x80\
+\x4c\x53\x95\xc4\xfd\xb8\x80\xbb\x84\x5a\xa0\x55\x00\x95\x85\x05\
+\x95\x09\x60\xe3\x6a\xb1\x11\x42\x52\x59\x14\x3f\x07\xaf\xff\x2c\
+\xfd\xf8\xe1\x47\xe8\x85\x1f\x3c\x4d\xaf\xbc\xf5\x0e\xfd\xf4\x64\
+\x8e\x4e\xdf\x77\x2f\x71\xdb\x87\x02\x89\x33\x82\x7e\xaf\x78\xf2\
+\x64\x28\x80\x6d\x33\x1d\x55\x20\x22\xc8\xba\x31\xe2\xe6\xe7\xe6\
+\xd4\xdc\xc9\xa3\x27\xa8\xf8\xc2\xf3\xb4\xfe\x82\x0b\xe8\xa2\xfb\
+\xef\x23\xc7\xe0\xc0\xef\xa9\x2d\x7b\x1d\x19\x63\xe6\xfa\xeb\xe9\
+\xdc\x5d\x3b\xda\xc8\x03\x4c\x6c\x37\x77\x06\xda\x5a\x04\x10\x00\
+\xde\xac\xeb\xe6\x42\x25\x04\x61\x2d\x80\x54\x68\x8d\x0c\xf3\x2f\
+\x33\xe1\x08\xbc\x78\x32\x68\x74\xcf\x1e\x3a\x8e\xe8\xef\xe1\x73\
+\xa2\xa5\x34\x3e\xfc\xd6\xdb\x54\x7c\xf5\x15\x1a\xbf\xf4\x52\x1a\
+\xdc\xb7\x77\xb9\xe0\xa9\x14\x4a\xe4\xe0\x9b\x53\x57\x5d\x15\x1e\
+\x8c\xa8\x6f\x85\xef\xc5\xd9\xd2\x30\x97\xff\xdb\xbf\x51\xbd\x87\
+\xf5\x1f\xbe\xe5\x66\x72\x20\xb4\xed\x9f\xfe\x34\x7d\xea\xc7\x2f\
+\xd1\x87\x1e\xf8\x73\xda\xf5\xa7\x7f\x42\xd7\x3c\xfb\x5f\x34\x99\
+\x1d\xa1\xf7\x5f\x7e\xb5\xcb\x15\x70\x3d\x72\xe7\xfa\xf5\x9b\xd6\
+\x6a\x01\x02\xf0\x8e\x3b\xce\xac\x3e\x18\xe1\x5a\xa0\xc6\x47\xe4\
+\x99\x41\xf6\x95\x76\x0b\x10\xf0\xff\x6d\x5b\xa9\x7c\xe8\x10\x79\
+\xbe\xaf\x49\x2c\x9b\xb5\x83\xcf\xcf\x7e\xf3\xeb\xc4\xed\xc3\x5f\
+\xbd\x87\x5c\x37\x14\xa0\x4f\x52\xbd\x93\x04\xd9\xf1\x4f\x7e\x92\
+\xaa\xa5\x32\x79\xae\x4b\x55\xa4\xdd\xf3\x6e\xb9\x85\x16\x1e\x7b\
+\x98\x0e\xbe\xfe\xc6\x32\x99\x83\x85\x0a\xfd\xec\xea\x8f\x53\xe9\
+\xbe\xaf\x92\x3c\x7e\x8c\xa6\xf6\xef\xa7\x2d\xd3\x93\xe4\xdf\x73\
+\x37\xbd\xf9\xb5\xaf\x93\x6f\x9a\x7a\xf1\x6d\x41\x71\x5d\x22\xb1\
+\x6f\xad\x7f\x1a\x93\xcd\x2d\x71\xd5\x05\xe2\x52\xa6\x6b\x58\x54\
+\x06\x0b\x75\x0a\x4b\x2a\x15\x7a\x22\x68\x2b\x03\xc7\x90\xfe\xaa\
+\x47\xdf\x57\xd6\x80\xd6\x7e\x26\x80\xf6\xb3\x67\x7f\x44\xd3\x48\
+\x8f\x9c\xca\xf6\xdd\x75\x17\xbd\xf9\x8d\x6f\x90\x84\x4b\x79\x20\
+\x22\x2f\xba\x88\xae\x7c\xe8\x21\xda\x7b\xe3\x8d\x94\x3b\x70\x80\
+\x86\x51\xe1\x89\x27\xbf\x47\x2f\x3e\xf1\x14\xb9\x76\xac\xad\xbc\
+\x3d\x58\xf7\xe8\xc8\x63\x8f\xd3\xc8\xb7\x1e\x26\x5b\x08\x95\x02\
+\x17\xe3\x49\x68\xda\xea\x8a\x0b\x7a\x6c\x87\x99\xe0\x9f\x01\xd9\
+\x4b\x00\xdd\xc5\x10\x6a\x81\xb4\x10\x69\xce\x04\x93\xe7\x9f\x87\
+\x5a\x60\x89\x62\x48\x4f\x75\xc4\x04\xdd\x1a\x8d\x3a\x4d\x5e\xf3\
+\x5b\x34\xff\xfa\xeb\x54\xc4\xbe\x61\xa8\xb9\x17\x90\xa1\x10\x54\
+\xae\xbf\xf0\xa1\xaf\x91\x09\xed\x96\x9f\x7d\x86\x26\x93\x71\xca\
+\xde\x74\x03\xfd\xcf\x93\x4f\x51\xee\xa1\x07\xe8\xc4\x1f\xfd\x21\
+\x65\xb0\x75\x8e\x65\xd2\xe4\x97\x2b\xf4\xf6\x99\x59\xca\xc7\x07\
+\xc8\x67\xf2\x11\x21\x2d\x04\x95\x25\xe6\x70\xbf\x93\x28\xb0\xe2\
+\x1c\x59\x96\xca\x04\x6b\xb6\x80\xa6\x00\xb8\x16\x98\xe4\x6d\xf1\
+\xae\x5d\x3b\x69\xfe\xf8\x49\x8a\x83\xa0\xc0\xde\x80\xdb\x10\x0a\
+\x94\x4b\x60\xae\xe9\xc1\x0c\xc5\x21\xa0\x8f\x3f\xf8\x00\xbd\xfc\
+\x95\xbb\x49\xb6\x1e\x93\xc3\x75\xe6\x6f\xbd\x99\x8e\xc1\x35\x1a\
+\x56\x4c\x11\xf0\x0d\x43\xf5\xa7\xf8\xbe\x95\x20\xca\x17\x49\x02\
+\xdc\x64\x22\x15\x2d\x7e\x05\x82\xd4\x83\x78\xe7\x9c\x85\xb3\x81\
+\x66\x20\x14\x12\x6d\x2d\x16\xe0\x56\x5b\x6a\x81\x61\x90\x3c\x82\
+\xa8\x3c\x9e\x5d\x4f\xf4\xee\x3b\x61\x9e\x7d\xfb\x4d\x3a\xf5\xd9\
+\xeb\xe8\x10\x4c\xdf\x33\x2d\xf2\x2d\x8b\x84\x1d\x6f\x3b\x30\xf4\
+\xd0\x1f\x89\x0d\x10\xd9\xd1\x66\x08\x2d\x1c\xb7\x12\x5b\x85\x24\
+\xad\x4e\x94\x5b\x4f\x4b\x00\xf1\x2d\x9f\x1a\x19\x49\x7f\xbf\x50\
+\x28\xf6\x0a\x82\x51\x2d\x10\x15\x43\x8b\x3a\x13\x70\x2a\x2c\xcf\
+\x87\xa9\xd0\xf0\xc2\x8d\xca\xbc\xe3\xd1\xfb\x20\x37\x8b\x0a\x2e\
+\x1f\x4b\x50\xd1\xb4\x5b\xff\xd5\x46\x74\x4c\xa6\x7b\x29\xdb\x76\
+\x6c\xa2\x63\x8c\x45\x33\x74\x00\xeb\x0e\x6a\x8c\xee\x0a\xb0\xbd\
+\x28\xd2\xcf\x46\x73\x26\x4a\xe2\x3d\x6b\x75\x01\x7d\x30\xb2\x5c\
+\x0b\x38\x5c\x0b\x14\x8b\x64\x73\x7d\xce\xa9\x90\xba\x1b\x18\xb6\
+\x7e\x64\xf5\x71\xb7\x06\x3b\xe7\xba\xdd\xa0\xb7\xd6\xf5\x7c\xd7\
+\xb5\x1d\x8f\x73\x20\x7c\x11\xe8\xe1\x02\x1d\xe7\x02\x8b\x41\x90\
+\xd3\x02\xa8\x54\x6b\x61\x2a\x5c\xb7\x8e\x4c\xbd\xb7\x5f\xa1\xc9\
+\xce\xeb\xd5\x84\xd0\x69\xe2\x9d\xcf\xf7\x70\x83\x68\xae\xb7\x1b\
+\x20\x0e\xb0\x00\x8c\xb5\x58\x80\x00\xbc\x13\xa8\x05\xd0\x87\x9b\
+\x17\xd4\x02\x75\xd4\xfa\x6e\xa9\x44\x16\x6f\x8a\x5c\xb7\x9b\x70\
+\x2f\xad\x1b\xc6\x2a\x82\xe9\xd6\x78\x37\xf1\xfe\x83\x22\x22\x60\
+\x5b\x20\xec\x21\x80\xc8\x0d\x4e\xe3\x60\xc4\x97\xd2\x8f\x49\x69\
+\x73\x2d\xb0\x1e\x1b\x9e\x06\xbb\x01\xb6\xab\x62\x61\xa1\xb7\xf6\
+\x99\x70\xff\x6e\x10\x8d\x7b\xb9\x41\x8f\xe7\x41\x5c\x95\xc4\x3d\
+\x83\xe0\x4a\xbb\x42\x6c\x41\x8b\x3a\x13\x6c\xda\x79\x3e\x55\x51\
+\xbe\x26\xb2\x59\x0e\x34\x5d\x90\x8c\xd6\x6b\xa2\x5e\x41\x6f\xd5\
+\xe0\x26\xa3\xfb\xd1\x35\xa3\xc7\x0e\xb0\x2b\x28\xe2\x1a\x02\x18\
+\xbc\x6d\x62\x62\xf3\x1a\x04\x10\x05\xc2\xba\x10\x8b\xfa\x88\xfc\
+\x5c\xe4\xfa\x2a\x34\x9f\x58\xbf\x5e\x9f\xf9\x77\x47\xeb\xce\xb9\
+\x55\x48\xa9\x7e\x35\x01\x75\x13\x8f\xc6\x2d\xef\x8a\x1e\x31\x80\
+\x5a\x2c\x70\xd0\xb6\xf7\xaf\x49\x00\xda\x02\x50\x0b\x2c\xc1\x6d\
+\x54\x0d\x9f\x42\x55\x57\x99\x9f\x57\x81\x90\x84\x68\x27\xbd\x1a\
+\x71\x4d\xb8\x9d\xd4\x4a\x7d\xf4\xdc\x5a\xac\x81\xe7\x7a\x90\xe7\
+\x16\x37\x0c\x15\x08\x7b\x06\x41\x89\xc6\xc1\x42\x97\xc3\x95\xd6\
+\x73\x81\x7c\x3e\x4c\x85\xd8\x17\x18\x52\xf2\xa2\xd6\x16\x08\xf5\
+\xb8\x67\x36\xe8\x5d\x10\x51\x0f\xad\x77\x36\xcc\xee\x69\x2a\x5b\
+\x9c\x75\x10\x04\xdc\x12\x04\xa0\x8b\x21\xa7\x50\xa0\x7a\xa5\xc2\
+\x16\xa0\xbf\xd4\x3b\x10\x76\x8d\x35\xe9\xde\xd9\xa0\x37\xf1\x6e\
+\x61\xea\xac\x85\x8d\x9c\x82\x0f\x38\xbe\x2f\xc8\x34\xe7\xf8\x09\
+\x6e\x12\xad\xa7\x00\x74\x2d\x50\x68\xad\x05\x2a\x55\xaa\x3b\x0e\
+\x79\xd5\xaa\x3a\x29\x16\x98\xa3\x5e\xda\xd7\x56\xd2\xcb\x12\x7a\
+\xa4\x41\x5d\x56\x2b\x62\xf8\x5d\x0f\xbd\x27\x84\xf4\xd9\x5a\x13\
+\x89\xc0\x1a\x48\x0a\x3b\x95\x96\xf6\xf0\x90\x4c\x8e\x8e\xd1\xe0\
+\xe4\x84\x1c\x9d\xde\x44\x53\xbb\x76\xc8\xbf\xb8\xf3\xcb\xd7\xfd\
+\xdb\xbb\xef\xbe\xdc\xb3\x0e\x58\xf1\x60\xc4\xf3\xe6\x5a\x6b\x01\
+\xe5\x17\x70\x83\x18\x52\xa1\x5c\x5a\xea\x26\xdd\x87\x1b\xb8\x4d\
+\x8d\x79\x00\xf7\x0e\x88\x41\x63\x81\x88\xc7\x03\x23\x91\x10\x46\
+\x26\xc3\xff\x78\x52\x9d\x1d\x0c\x8c\x8f\xcb\xd1\xc9\x49\x63\x64\
+\x7a\xda\x1e\x99\x18\xb7\x6d\x3b\x66\x99\xf8\x9f\x6d\xd9\x14\x8b\
+\xc5\xc8\xb6\x2d\xf4\x71\xe2\xeb\x64\x32\x49\x43\x58\xe7\x79\x93\
+\x93\x15\x08\xa0\xce\x9c\x7a\xd4\x01\xdd\x81\xf0\x78\xa3\x31\x2b\
+\xf0\x8e\xfe\x23\xc9\xe4\xf6\x19\x6a\xa0\x18\x4a\x8e\x8d\x91\x80\
+\x00\x56\x7b\x11\xef\x68\x2d\x69\x73\x64\x0d\x0a\x11\x12\x63\xad\
+\x09\x99\x4a\x49\x2b\x93\x31\x6c\xa4\xd5\x01\x6c\x89\x33\xe3\xe3\
+\xe6\xf0\xf4\x94\x99\xc9\x66\x6d\x32\xd4\xc6\xc2\xe6\xe5\x5a\x96\
+\x45\x71\x45\x0e\x24\xe3\x71\x35\x8e\x27\xb8\x8f\x87\xa4\x63\x98\
+\xb7\x63\xfc\x9c\x7a\x06\x02\x61\x01\xa8\x67\xd2\xa9\x34\xed\x3f\
+\x77\x52\xe9\xad\x67\x29\xbc\xd2\xae\x10\x59\xa0\x02\x12\x15\x14\
+\x43\x19\x95\x0a\x77\xec\xc0\xb6\xf8\xb8\x0a\xa7\x8b\xb5\x5a\xe8\
+\x67\x78\x36\xb0\xac\x40\xc4\x62\x42\x26\x12\x52\x0e\x0c\x48\x99\
+\xce\x20\x58\x8e\xc9\xc4\x86\x73\xcc\xd4\xf8\x46\x63\xdd\xe4\xa4\
+\x3d\x38\x3a\x66\x41\x55\x26\x2f\xce\x34\x94\x43\x92\xc9\x8b\x06\
+\x4c\x1e\x9b\x26\x19\x80\x26\x8c\x7b\x21\x69\xc0\x62\xe0\x1e\xae\
+\x19\xea\x59\x0d\x7d\xe4\x87\x79\x7e\x57\x83\x05\xa4\xe6\x26\x92\
+\x99\x18\x6e\xf7\xda\x0e\xaf\x9e\x0a\xf9\x8f\x24\x49\x21\x32\xae\
+\xe3\xd1\xb6\xa9\x29\xf9\xea\xf1\x13\x1e\xcd\xcc\x48\xfb\xe2\x0f\
+\x1b\xa3\x9b\x36\xd9\x03\x83\x83\x26\x7e\xc8\xd4\x0b\x64\xad\x60\
+\xac\x34\x80\x59\xb2\x15\x19\x73\xf9\xf8\x1b\xd4\x31\x0e\x78\xcc\
+\x8b\x57\xe0\xb5\x99\xfc\x0e\x34\x0c\xe8\x39\x75\xf8\xc9\x82\x37\
+\x00\x7c\x97\x63\x11\xf7\xfc\x0c\x93\x0c\x85\xd8\xfc\x5d\x34\xbe\
+\xd6\xd9\x2c\xdc\xc5\xd6\xeb\x6e\xcc\x94\xa9\x35\x9c\x08\x75\x67\
+\x82\x1a\x8a\xa1\x11\x29\xa7\x38\xf2\x9f\x29\x14\xbc\x89\xcf\x7d\
+\x1e\xe7\x22\x23\x94\x49\xa7\x40\x32\xc1\x0b\x51\x84\x41\x45\xbd\
+\x26\x98\x8c\x8e\xe2\x18\xa3\x0f\x17\x69\x59\xbc\x78\x8c\x2d\x40\
+\x11\x6c\x03\x04\xa2\xc7\x9a\x84\x7a\x3e\x11\x5a\x85\x26\xac\x35\
+\xdd\x9a\xba\x59\x30\x3c\xd7\xf6\x0d\xbe\xae\x17\x8b\x65\xcb\x13\
+\x99\x35\x6c\x87\xa3\x5a\x40\x5b\x40\xa5\x79\x2e\xb0\x1e\x01\xe5\
+\xe4\x9e\x7d\xd6\xa6\xe9\x69\xca\x8e\x8d\x92\xdd\xd4\x34\xb1\x16\
+\x0c\x93\x3b\x6d\xaa\x9a\x44\x44\x8e\x11\x04\xbc\xd0\x30\xa5\x3a\
+\x2e\x6b\x57\x2f\x58\x43\x9b\x34\xa3\x6d\x8e\xdf\xd1\x42\x40\x6b\
+\x8e\xb5\x40\x57\x2e\xf3\xf9\xdb\x8d\x7c\xbe\x4a\xc2\x4f\xb3\x71\
+\xf4\x6b\x01\x2c\x00\xb5\xf3\x09\x3c\x4f\x66\xa6\xa7\x51\x06\x8c\
+\xd0\xf0\xf0\x30\xff\x78\xf3\xbb\xa1\xf6\x74\xbd\x00\x62\x7a\xcc\
+\xe0\x7b\x0a\xda\x2c\xd1\xba\xc9\x47\xd0\x1a\xe6\xbe\x6d\x0c\xa2\
+\xda\x0a\xf8\xdd\xd0\xc4\x9b\xbb\x52\xad\x71\xfd\x8c\x16\x4a\xe5\
+\xf4\xa9\x1a\x1e\x4c\xaf\xc1\x02\xba\x53\x61\xc9\xf7\x95\x00\x6a\
+\xae\x1b\x0c\x25\x93\x76\x22\x9e\x20\x5d\x1b\x60\x31\x6d\x64\xb5\
+\x00\x22\xd2\x91\x70\xb4\x56\x5b\x7d\x94\x7b\x4d\x46\x2f\x5e\x9b\
+\xb4\xe3\x38\xfa\x0f\x20\xda\xf4\xbb\x02\x1d\xe6\x75\x1c\x50\xdf\
+\xd1\xef\xeb\x00\xb9\xf8\xea\x2b\x0d\xc3\xf3\xfa\xb6\x00\xd1\xfc\
+\x17\x23\x73\xfc\xb6\x67\xdb\x42\xfd\xa8\x69\x68\xcd\x6a\xad\x69\
+\x82\xda\x2c\x79\xac\x89\x30\xb4\x50\x34\xda\xde\xd1\x66\xaf\xef\
+\xe9\x6b\xf4\xfa\x5b\x3c\xcf\xdf\x60\x8d\xab\xf9\x0c\x6a\x83\x81\
+\x81\x01\x95\xeb\x13\xcd\x38\xd4\xd9\x1a\xa5\x62\xc3\x39\x72\x78\
+\xc4\xf5\x7c\xd9\x87\x05\x44\xa9\x10\x07\x23\x67\x78\x11\x3e\x56\
+\x8d\x42\x43\x93\xd3\xd2\xd7\x5a\xd4\xda\xd7\x64\x3b\x03\x9b\x16\
+\x4e\x9b\x26\x75\xd3\x04\xb5\xf6\xf4\xb3\x3a\x23\x74\xb6\x72\x3e\
+\xef\xce\xbe\xf3\x4e\x3d\x7f\xf4\xa8\x53\x3a\x79\xc2\xaf\x9e\x99\
+\x95\x41\xa1\x60\x58\x8d\xba\x3d\x20\x45\x7c\xc8\x8e\xa5\x32\xa9\
+\x64\x32\x96\x88\x0f\xbf\x9e\x5b\xfc\xd7\x3e\xb2\x40\x94\x0a\x4f\
+\x39\xce\x82\x90\x92\x3d\x3b\xd0\x8b\x6e\xd5\xa8\x16\x82\xd6\x1a\
+\x34\xd2\xb5\x68\x5c\x6b\xb4\xa5\xaf\xd6\xc6\xef\x71\x2b\xe6\x72\
+\xce\xe9\x23\x47\xea\x0b\x47\x8e\xb8\x85\xe3\xc7\xfd\xf2\xe9\xd3\
+\xd2\x59\x58\x30\xfc\x62\xd1\x36\x1a\x8d\x44\xdc\xf7\x53\xb6\x69\
+\xc6\xf1\x8d\xb8\x0a\x90\x86\x51\x0b\x4c\xa3\xe4\x1a\x0a\x05\x60\
+\x09\xa2\x9c\x43\xd1\x75\xe8\xe9\xd3\xb3\x4f\xbe\x9d\xcf\x1f\xeb\
+\x57\x00\x3a\x13\x34\xea\xbe\x5f\xf2\xa4\x8c\x6b\x72\xda\x84\x5b\
+\xcd\x55\x43\x13\x5d\xa9\x15\x66\x67\x9d\x1c\xc8\x2d\x1d\x3b\xe6\
+\x2c\x1e\x3d\xea\x57\x67\x67\x79\x97\xb9\x4c\x2e\x21\x44\xca\x84\
+\x2c\x08\xc0\xef\x35\x1c\x29\x4b\x7c\x28\x83\x5a\xa4\x58\xc7\xd6\
+\x9c\xff\x0d\x63\x59\x88\x7c\x01\x9b\xb4\x3c\x14\x73\xd4\x75\xe7\
+\x30\x5f\x67\x57\x65\xe8\xcc\x05\xd4\x80\x02\x50\x0c\xe7\xfb\x17\
+\x80\x0b\xd4\x71\x40\x7a\x6c\x7c\x71\x71\x47\x12\x02\xb0\x59\x83\
+\xb6\xdd\x45\x12\xe4\x1a\xb9\x43\x87\xea\x79\x90\xc3\x5f\x7f\x83\
+\x0a\x6b\x0e\xe4\x44\xa9\x14\x53\x9a\x13\x22\xcd\xe4\x02\x64\xd9\
+\x86\x10\x7e\x43\xca\x4a\x93\x9c\x22\x56\xf1\xfd\x7c\x11\xc4\x16\
+\x7c\x3f\x87\x12\x7c\x1e\x3b\xd1\x32\x13\xea\x20\xc7\xf0\x5b\x10\
+\xb4\xf7\x7a\x1c\x3d\xab\xab\xc0\x1e\x02\x58\xb5\x16\x70\x80\xd2\
+\x7b\x8d\xc6\x4b\x9b\x97\x96\xf6\xbe\xf4\xe0\x83\x8b\x89\x7a\xd5\
+\x3c\x35\x9f\xaf\xe1\x80\x54\x82\x9c\x6d\x36\x1a\xc9\x18\x8a\x5f\
+\xfe\x16\x6f\x64\x80\x3a\xff\x59\xad\x2e\x65\xa1\xe6\xfb\x4b\x15\
+\x68\xac\xe8\x79\x0b\x8b\x38\x66\x3f\x89\xcd\xd5\x82\xeb\x96\x34\
+\xa1\x3e\x88\x31\x04\x20\xcf\x06\xdc\xfa\xfe\xbf\xce\x42\x00\x26\
+\x85\xe6\xb8\x11\x52\xda\x7e\xf3\xe4\xe4\x1f\x6f\x4c\x26\x77\xa7\
+\xd2\x29\xff\x8d\xb9\xdc\x4f\xaa\xa8\x0f\x4a\x40\x1e\xc4\x70\x80\
+\x9a\x3b\xe3\xba\x8b\xdd\xa4\x80\xde\xa4\xb8\x17\x8c\x1e\xe4\x28\
+\x1a\x77\xb7\xd5\xc8\xf6\x2b\x00\x2d\x04\x1b\x5d\x1a\x18\x05\x86\
+\x81\x18\x20\xce\x46\x5b\x6b\xd4\x18\x7d\x30\xc4\x3e\x78\x01\x18\
+\xe8\x2c\x26\xde\x84\xa1\x6b\x84\x5f\x2e\x62\xfd\xb7\xff\x05\xc7\
+\xfd\xe7\xdb\x23\x5d\x13\x38\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x20\x1c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\
+\x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd7\x08\x12\x14\x39\x28\x29\x91\x7c\x0e\x00\x00\x1f\xa9\x49\x44\
+\x41\x54\x78\xda\xe5\x9b\x09\xb0\x5c\x57\x99\xdf\xff\xb7\xf7\xbd\
+\x5f\xbf\xfd\xe9\xe9\x3d\x49\xd6\x2e\xd9\xda\x2c\x79\xc1\x78\xc0\
+\x76\x42\x81\xc1\x03\x64\x0c\x13\x1c\x42\x65\x02\x4e\xb1\x84\x78\
+\x5c\xc5\x14\x55\x49\x2a\x54\x48\x05\x2a\x03\xc3\x14\x03\x55\x33\
+\x13\x43\x2a\xae\x21\x9e\x01\x26\x05\x43\x80\xd8\xb2\x0d\x78\xc3\
+\x96\x25\x6b\xb1\xf5\xb4\x3d\x6b\x7d\xd2\xdb\xb7\xde\xb7\xdb\xb7\
+\xf3\x3b\xa7\xbb\x35\x12\x1a\x0a\x18\xb0\x81\x4a\xcb\x9f\xcf\xed\
+\xbb\x9c\x77\xbe\xed\xff\x2d\xf7\xb4\xfe\x7f\xff\x38\xaf\xe7\xdf\
+\x59\xb3\x66\x8d\xaf\xab\xab\xcb\xd7\xdb\xdb\x6b\x29\x91\x48\x38\
+\xd5\x6a\x55\xb9\x5c\xce\x5b\x58\x58\xf0\x96\x97\x97\xbd\x0b\x17\
+\x2e\x78\xd9\x6c\xb6\x29\x09\xfa\x2d\x16\x40\x24\x12\xf1\x6d\xdd\
+\xba\x35\xb0\x7b\xf7\xee\xf8\xdd\x77\xdf\xbd\xb5\xaf\xaf\x6f\x67\
+\x34\x1a\x5d\xcf\xf9\x75\x7e\xbf\xbf\xd7\x71\x9c\x04\x14\x6f\xf2\
+\x69\x34\x1a\x05\x43\x08\x63\xa6\x5c\x2e\x9f\x2a\x16\x8b\xe3\xd3\
+\xd3\xd3\xfb\xbf\xfd\xed\x6f\x9f\x3c\x70\xe0\x40\x0d\xa1\x34\x8c\
+\x40\x7e\x1b\x04\xe0\x6c\xda\xb4\x29\x74\xef\xbd\xf7\xf6\xbe\xf5\
+\xad\x6f\xbd\x07\x2d\xbf\x3d\x16\x8b\xdd\x1c\x0e\x87\xfb\x60\x5a\
+\xf0\x2a\xd7\x75\x2d\xc1\xb0\x3c\xcf\xb3\x0f\xf9\x7c\x3e\x4b\xc1\
+\x60\x50\xdc\x67\xcf\x57\x2a\x15\x15\x0a\x85\x49\xac\xe1\xd9\xa9\
+\xa9\xa9\x6f\x3d\xca\xe7\x5b\xdf\xfa\x56\xde\x58\xca\xaf\x52\x18\
+\xce\xaf\x4a\xdb\xd7\x5f\x7f\x7d\xf4\x13\x9f\xf8\xc4\xae\x6d\xdb\
+\xb6\x7d\x34\x9d\x4e\xdf\x0d\xd3\x29\xc3\x08\x1a\x15\x1a\x55\xa9\
+\x54\x52\x15\xa6\x6a\xb5\x9a\xdc\x7a\xbd\x25\x00\x08\xa1\x40\xad\
+\x95\xc0\xbc\x15\x42\x38\x1a\x55\x2a\x95\xb2\x14\xe5\xb8\xce\xfd\
+\x8b\x8b\x8b\xf3\x33\x33\x33\xff\x7b\x6c\x6c\xec\xcf\x3e\xf7\xb9\
+\xcf\x8d\x4f\x4e\x4e\xba\x46\x10\xbf\x6e\x01\x38\x1b\x37\x6e\x8c\
+\x7e\xfa\xd3\x9f\xbe\x79\xc7\x8e\x1d\x7f\x94\xc9\x64\xde\xe2\xe7\
+\x03\xd3\xc6\xaf\x55\x2c\x14\x54\xe1\xd8\x50\x15\x2a\x23\x04\xc8\
+\x0a\xa2\x8e\x20\x1a\x58\x82\xe1\xde\xe7\x38\xf2\x07\x02\x0a\x05\
+\x43\x0a\x86\x42\x0a\x84\x43\xf2\x9b\x63\xc6\x68\x3c\xae\x9e\xbe\
+\x3e\xf5\x41\x21\xae\x2d\x2d\x2d\xd5\x2f\x5d\xba\xf4\xcd\x23\x47\
+\x8e\x7c\x96\xbf\x7b\x22\x9f\xcf\xbb\xbf\x16\x01\xa0\x9d\xe0\x87\
+\x3f\xfc\xe1\x91\xf7\xbf\xff\xfd\xff\x7e\x68\x68\xe8\x03\x98\x70\
+\x10\x4d\x5b\xc6\x4b\x30\x6e\x28\xbb\xbc\xac\x85\xb9\x79\xcd\xce\
+\xcd\x6a\x6e\x76\x56\x4b\x8b\x4b\xca\xe6\xb2\xd6\x1a\x3a\x02\xf0\
+\x49\x0a\xfa\xfc\x8a\x84\x82\x4a\x18\xcd\x27\x12\xea\x4a\xa7\xd5\
+\x95\xe9\x56\x2a\xd3\xa5\x68\x2a\xad\x50\x22\xae\x70\x2c\xa6\x6e\
+\x84\x30\xbc\x72\xa5\x62\x1c\xcf\xce\xce\x96\xcf\x9c\x39\xf3\xc5\
+\x6f\x7c\xe3\x1b\x9f\xfb\xfa\xd7\xbf\xbe\x2c\xc9\x7b\xbd\x04\xe0\
+\x8c\x8e\x8e\xc6\xbe\xf4\xa5\x2f\xbd\x63\xcf\x9e\x3d\x7f\x8a\x89\
+\x0e\x5d\xd6\x78\x3e\xaf\x1c\x4c\x4f\x4f\x4d\xe9\xfc\xb9\xf3\x3a\
+\x73\xf6\x8c\x26\x26\x26\x34\x03\xf3\xf8\x72\x87\x71\x6b\xfa\xc2\
+\x3d\x1c\xa3\x7d\x49\x01\xc7\xa7\x00\x18\x10\x0a\xf8\x15\x45\xcb\
+\x89\x48\x54\x19\xcc\xbf\xaf\xa7\x5b\x83\x83\x83\xea\x5f\xb1\x42\
+\xe9\x81\x01\x45\x33\x19\x85\xcd\x79\xce\xad\x5a\xb5\x4a\xc2\x72\
+\xce\x9d\x3b\xf7\xea\xc1\x83\x07\xff\xf5\x27\x3f\xf9\xc9\xe7\x5d\
+\x3e\xaf\xb5\x00\x7c\xb7\xdc\x72\x4b\xf7\x97\xbf\xfc\xe5\xff\x40\
+\x48\xfb\xb7\x66\xed\x98\xa0\x0a\x50\x76\x71\x51\x13\x17\x2e\xe8\
+\xc4\xf1\x13\x1a\x3b\x7e\x4c\x68\xc7\x32\x5e\x2e\x96\xd4\xdb\xdb\
+\xa3\x95\x2b\x86\xd5\xc7\xd8\xdd\xd5\xa5\x58\x24\xa2\x30\xbe\xde\
+\x6c\x78\x06\x0f\xb8\xa7\xa0\x02\x02\x5c\x5a\x58\xd0\xfc\xf4\x0c\
+\x34\x8d\x60\x9a\x8a\xe0\x06\x29\x5c\xa0\xbf\xa7\x47\x2b\x56\x0e\
+\x6b\xc5\xea\xd5\xca\x8c\x8c\x2a\xda\xdb\xab\x38\xc2\x19\xe5\x7b\
+\x5f\x7f\xbf\xc0\x86\x2a\xd8\xf0\x1f\x1f\x7c\xf0\xc1\x2f\xe3\x22\
+\x95\xd7\x4a\x00\xfe\xb7\xbf\xfd\xed\x2b\x3e\xff\xf9\xcf\xff\x05\
+\x5a\xb9\x1b\x60\xb2\x8c\xe7\xd0\xec\xe4\xc5\x8b\x3a\xfa\xca\x2b\
+\x3a\xf0\xd2\x4b\x3a\x7e\xf2\xa4\x66\xa6\xa6\xf1\xd9\x5e\x6d\xdb\
+\xba\x55\x9b\x37\x6d\x52\x22\x1c\x91\xaf\xe9\xc9\xef\xb5\xc8\x31\
+\x04\xf3\x62\x84\xac\x45\x34\x0c\x71\xec\x72\x5f\xb5\x5a\xb3\x73\
+\x9e\x3e\x76\x4c\x0b\x08\xd1\x80\x63\x12\xb3\xef\x87\xf1\x95\x30\
+\xbd\x62\xfd\x7a\xa5\x56\x8d\x2a\xc2\xf7\x01\x5c\x62\xf5\x75\xd7\
+\x59\xa0\x45\x08\x5f\xf9\xd4\xa7\x3e\xf5\xe0\xc9\x93\x27\x8b\x3f\
+\x2f\x40\xfa\x7f\x5e\xe6\x3f\xf0\x81\x0f\xac\xf9\xcc\x67\x3e\xf3\
+\x48\x7f\x7f\xff\x9d\x26\x44\xe5\xdb\x1a\x3b\x31\x36\xa6\x1f\xfe\
+\xf0\x87\x7a\xe2\x07\x3f\xd0\xcb\x2f\xbf\xac\x01\x16\xf5\xce\x77\
+\xdc\xa3\xbb\x6e\xbf\x5d\xd7\xa1\xf5\x0c\xbe\x9d\xc4\x54\xd3\x6a\
+\x51\xaa\x43\x9c\x4b\x4a\x4a\x74\x88\x73\x71\xc6\x18\x6e\x11\xe7\
+\x5a\x6f\x32\xa5\x75\x1b\xd6\x69\x04\x06\x6b\x08\xb9\xb0\xb0\xa8\
+\x12\x02\x2f\xf2\x37\x6b\x4b\x4b\xf2\x55\xaa\x0a\x20\x98\x4a\xdd\
+\x55\xae\x84\x95\x81\x0f\x03\x03\x03\xbb\x6e\xb8\xe1\x86\xad\x58\
+\xc4\x63\xe7\xcf\x9f\xaf\xfe\xaa\x04\xe0\xbf\xf3\xce\x3b\x57\x7e\
+\xf6\xb3\x9f\xfd\x5f\xc4\xf5\x5b\x0d\x8a\x1b\xb3\x9f\xc3\x4c\x5f\
+\xda\x7f\x40\x8f\x3d\xbe\x57\xcf\x3e\xfb\xac\x5c\x7c\xfb\xbd\xbf\
+\xf7\x7b\xba\xe3\x8d\x6f\xd4\x20\xc0\x95\xc2\xa7\xd3\x4e\x87\xe9\
+\x0e\xb3\x0e\x0c\xc2\xa4\xa4\xa8\x31\xf1\x26\x24\x99\x11\xe2\x9c\
+\x19\xa1\x98\xbd\xc6\x79\xac\x22\x01\x26\x5c\xb7\x6e\xbd\xba\x01\
+\xc4\xfc\xf4\x94\xaa\x68\xba\x9c\xcb\xab\xba\xbc\x24\x87\xb5\x84\
+\x88\x1e\x0d\x9f\xa3\x3c\xc7\x19\x5c\x05\x21\x6c\x02\xa3\x36\xee\
+\xdb\xb7\xef\xbb\xe0\x52\xfd\x97\x15\x80\x8f\x30\xd7\xff\xd0\x43\
+\x0f\x7d\x85\x89\xef\x00\xc4\xac\xd9\x4f\x5d\xba\xa4\xe7\x9f\x7f\
+\x5e\xff\xf7\xb1\x47\x75\xe8\xe0\x41\xed\xda\xb1\x43\xff\xfc\xde\
+\x7b\xb5\xb2\xa7\x57\xe9\x0e\xe3\x57\x68\x38\x0a\x85\x61\x0c\xaf\
+\x57\x00\xc6\x02\x8c\xfe\xa6\x20\x46\xaf\x75\xec\x33\xc7\xf6\xba\
+\x21\x29\xc8\x18\x16\xe4\xf1\x9c\x5b\x07\x3b\x12\x1a\xc1\x22\xaa\
+\x33\x73\xaa\xb1\x86\x5a\x89\xd0\x4a\x44\xb1\x42\xf0\x33\x23\x96\
+\x96\x03\x8c\xbb\x00\x4a\x42\xe6\x26\xb2\xd0\x81\xef\x7f\xff\xfb\
+\x8f\xe3\x5a\xee\x3f\x56\x00\x0e\x79\x7b\xea\xe1\x87\x1f\xfe\xcf\
+\x6b\xd7\xae\xbd\x8f\x58\x6e\x32\x33\x4d\xc3\xfc\x8f\x9f\x7b\x4e\
+\x8f\xed\xdd\xab\xb3\xa7\x4f\xeb\xdd\xef\x7c\xa7\x6e\xdb\xbd\x47\
+\x5d\x80\x5a\x86\x85\x74\x18\x8f\x59\xa6\x61\xb6\xcd\xa4\x45\x7c\
+\x33\x1a\xbf\x6f\x42\x1c\x37\x6d\x24\x68\x8d\x6a\x9f\x77\xec\xbd\
+\x8c\x1d\xe1\x58\x30\x6c\x32\x59\xdd\x5a\xcf\xf0\x9a\x0d\x6a\x10\
+\x4e\xdd\x42\x8e\x30\x5a\x53\x3d\x57\x40\x08\x65\x2c\x21\x88\xa4\
+\x23\x2a\xd6\x6a\xd6\x1d\x58\xfb\x2e\x92\xb3\x65\x84\xb0\x5f\xcc\
+\xfe\x0b\x0b\x80\xb8\x1e\xf9\xc2\x17\xbe\x70\xef\x6d\xb7\xdd\xf6\
+\x5f\x00\x3c\x1f\xcc\x5b\xb3\x7f\xe1\xf9\x17\xb4\xf7\xf1\xc7\x75\
+\x11\xc4\xbf\xef\xf7\x7f\x5f\x1b\x09\x47\x5d\xf8\x62\x06\xcd\xe3\
+\xd7\x76\x91\x21\x18\x68\x69\xb5\xcd\x58\x9b\xa9\xa6\x65\x9a\xb1\
+\x7d\xac\xf6\xb1\xda\xc7\xba\xea\xd8\x8e\xac\xc3\x53\x20\x0d\x40\
+\x3a\x9e\x42\x45\xc9\x29\xd7\x35\xb4\xf6\x3a\x35\x96\xc1\x02\x37\
+\x27\xa7\xee\x22\x84\xa2\xfc\x60\x42\x08\xb0\x6d\x1a\x21\x10\x0d\
+\x07\x08\x95\xe4\x0b\xbf\x43\x8e\xf2\x14\x2e\x3a\x21\x66\xfc\x45\
+\x04\xe0\xa7\x80\xd9\xf4\x91\x8f\x7c\xe4\xaf\x40\xe0\xa4\xc9\xe8\
+\x96\x09\x73\x07\x0f\x1c\x40\xf3\x8f\xeb\x3c\x21\xce\x30\xbf\x66\
+\x60\x00\xcd\xfb\xd4\xed\xf7\x29\xe9\x39\xd6\x7f\x03\x2d\x2d\x42\
+\xad\x58\xaf\x0e\xa3\x57\x33\x79\x95\x15\xa8\x6d\x05\x96\x38\xee\
+\x8c\x1c\x28\x18\xa7\x2e\xe8\x8a\x28\x56\x73\xe5\xe5\x4c\xf4\x80\
+\x88\x40\xfd\x6b\x56\x03\x86\x17\xb9\xa7\x2a\xaf\x84\x80\x8a\x65\
+\xf9\x39\x1f\x8a\xc7\xd4\x20\xcc\xba\x92\x86\x56\xac\x08\x90\xa7\
+\xdc\x76\xe2\xc4\x89\x47\x00\xc6\xf2\xcf\x2d\x00\x24\xd7\xf5\xc5\
+\x2f\x7e\xf1\xb3\x84\xbb\x5b\x08\x2f\x36\xc1\x39\x41\x48\x7a\xfc\
+\x89\x27\x34\x06\xd2\xbf\xfb\x77\xef\xd1\xda\xa1\x15\xea\x86\xf9\
+\x54\x44\xea\x92\x8f\xe4\x25\x2e\x11\xbe\x3a\xcc\x59\x26\x1a\x10\
+\x82\x40\xcb\x57\x6a\xfe\xaa\x31\x68\xb4\xe6\xba\xc4\xf7\x11\xad\
+\xba\x79\x8f\xfa\xd6\xae\x55\x1f\xbe\xde\x47\xa8\xeb\xdf\xb8\x56\
+\xf1\x35\xbd\x0a\xf7\xf4\x6b\xd5\x75\x5b\xd4\xbf\xe1\x06\x0d\x6e\
+\xde\xac\x9e\xd1\x51\x2d\x9c\x1a\x57\xdf\x48\x9f\x16\x16\x27\x14\
+\xab\x53\x64\x95\x5d\x35\x89\x4e\x01\x39\x0a\xa6\x92\xaa\x01\x9e\
+\x41\x04\xd1\xc3\x07\x2b\xf0\xbe\xf7\xbd\xef\x3d\x2d\xa9\x71\x8d\
+\xa5\xeb\xda\x4f\xf0\x81\x07\x1e\x78\x13\x7e\xff\x1e\xc2\x9d\xcd\
+\xe3\xa7\x88\xc9\xa0\xaa\x8e\x1e\x79\x59\xb7\xec\xd9\xad\x75\xc3\
+\xc3\x4a\x4b\x84\x38\xc1\x78\x40\x41\x98\x1b\x20\x16\xa7\x07\xfb\
+\x5b\x0c\x37\x5a\xc4\xf1\x15\x82\xb8\x96\x12\x84\xcc\x55\x37\xed\
+\x91\x83\xfb\xa8\x69\xdc\xe4\xea\xcc\xc4\xf1\xd7\x55\x27\x19\x8a\
+\x45\xc3\xdc\x1f\x30\x67\x3a\xff\xc9\x2b\x57\x14\x4b\x74\x6b\x64\
+\xeb\xf5\x44\x08\xbf\xe2\xc2\x32\x4c\x74\xc0\x3a\x6b\x27\x4e\xca\
+\x9b\x5f\xd0\x0c\x19\x29\x25\xb7\xe0\xe5\x81\x0f\x7e\xf0\x83\x9b\
+\xcd\x04\x3f\x4b\x00\x0e\xda\xcf\x50\xca\xfe\x21\x26\x18\xb0\xf1\
+\x9e\xd4\x76\xec\xe8\x98\x8e\x1c\x3a\xa4\x34\xfe\x75\xeb\xce\x5d\
+\x4a\x35\x05\xd8\x11\xaf\xc3\x3e\x28\x24\xc7\x6d\x58\x06\x52\x83\
+\x43\x56\x83\xfc\x55\xc3\x34\x74\x25\xf3\x8d\xd6\xb1\x71\x11\x09\
+\x0d\xaf\xd3\x10\x89\x12\xcc\x9b\x73\x96\x3c\xa8\xf3\x8c\xb8\xbf\
+\xd1\x2c\x2b\x90\xea\x95\xcf\x0a\x51\x10\xff\xb3\xd7\x20\xc6\xfa\
+\x72\x4e\xab\x6f\xbc\x49\xc9\xe1\x5e\x25\x03\xb8\x20\xcf\x08\x57\
+\x75\x4f\x9f\x55\x1d\x41\xd4\xb3\x39\xcd\xce\xcc\xa8\xbb\xbb\x3b\
+\x7a\xeb\xad\xb7\xfe\x91\xa4\xf0\xcf\x12\x40\xe0\x43\x1f\xfa\xd0\
+\x1b\x30\x99\xdb\x0d\xf3\xb5\x72\x19\xb0\x9b\xd0\x91\xc3\x87\x34\
+\x4b\x4e\xff\x4f\xde\x7c\x87\x92\x86\x51\x28\x0e\x85\x78\x9a\xe5\
+\x4b\x56\xe3\xae\x65\x32\x92\x4c\x6a\x68\xcb\x66\x05\x11\x56\xc7\
+\x0a\x3a\xcc\x73\xc0\xf9\x80\x86\x77\x6e\x53\x7a\x68\xa8\xe3\x16\
+\x1d\x21\x5d\x1e\xbd\xf6\x33\x35\xaf\xa6\x68\xba\x5b\xf8\xc8\x35\
+\x56\x64\x05\x56\xab\x2a\x46\x6a\xdd\x7b\xfd\x76\xd2\xeb\x16\x77\
+\x81\x5a\x5d\x4d\xc0\xba\x81\x00\x3c\xb2\xc8\x02\x0a\x34\x25\xf8\
+\xca\x95\x2b\xdf\x73\xdf\x7d\xf7\x6d\x90\xe4\xfc\x54\x01\x50\x8b\
+\x27\xdf\xf6\xb6\xb7\xdd\x4f\x1d\xef\x33\x0f\xe5\xc9\xc0\xc6\x4f\
+\x9e\xd0\x19\xd2\xdb\x35\xc3\x2b\xb5\xb2\x3b\xa3\x64\x87\x79\x16\
+\xe4\x73\x01\xa6\x96\x6a\x34\x73\xfc\x24\x7e\x58\xb1\x4c\x53\xda\
+\xe2\xab\xa4\xc0\x7d\xbd\x57\xb9\x43\x72\x20\xad\xe4\x86\x21\x85\
+\x13\x21\xfb\xbd\x01\x68\x4d\x1d\x79\x45\x2e\xc2\xbe\xc6\x6d\x9a\
+\x8c\x12\xf7\xa6\x25\xe6\x6b\xaa\x7e\xf9\x9a\xd7\x06\x53\x5f\x90\
+\x68\x43\xe1\xd4\xbd\x79\xbb\xc2\x71\x8a\x29\x2c\x2f\x64\xc2\x2d\
+\xb9\x81\x26\xa7\xe4\x52\x8c\x09\x25\x2e\x92\x3d\xd2\xa3\x08\xdd\
+\x7e\xfb\xed\x1f\x35\x6c\xfe\x14\x01\xd8\xa4\x67\xd5\xf0\xf0\xf0\
+\x9b\x6d\xd3\x02\x9a\x45\x92\xe3\xc7\x8f\x2b\x37\x33\xab\x3d\xdb\
+\xb7\x2b\xe1\xb5\x98\x0f\x7b\x6d\x34\xae\xd4\x44\x1b\x0b\x33\x6e\
+\xa8\x92\x5d\xd6\xa5\x23\x47\x54\x5e\x5a\x6a\x23\xbb\xd4\x43\xde\
+\xde\x0b\x36\x38\x8e\x0f\xd7\x58\xad\xae\xf5\x83\x72\x9d\x96\x36\
+\x2b\xa4\xd2\xe7\x5f\x78\x41\x59\xf2\x8a\x2b\x35\xeb\x59\x17\x60\
+\x6c\x0b\xc3\x4f\x7c\x0f\xf6\xad\x92\x17\xc8\x09\x6e\x38\x57\x63\
+\xee\x9a\x82\x31\x4f\x91\x95\x09\xa5\x46\x37\x2a\x3e\x30\xc2\xf7\
+\xa0\x65\xc6\x2f\x59\xc5\x80\x8e\x6a\x5e\xbc\x64\xb1\xa0\x8a\x40\
+\x5c\xce\x01\xea\xef\x06\x13\xd3\x3f\x4d\x00\xa1\xfb\xef\xbf\xff\
+\x1e\xc2\x5e\xcc\xdc\x5c\x06\xfd\x2f\x9e\x3b\xa7\x4b\x50\x17\x68\
+\xba\xb2\xaf\xcf\x32\x1f\x31\xc9\x89\xf5\x41\x34\x58\xc2\x02\xaa\
+\x2c\xca\x6f\x17\x6b\x35\x39\x05\x5e\x2c\x9d\xbf\x60\x90\xdd\x32\
+\x11\x27\x3d\x1d\xdd\xbd\x4b\xc9\x15\x5d\x2a\xe3\xef\x31\xc2\xd4\
+\xf2\xc4\xa4\x2e\xec\xdb\xaf\x6a\xbe\xd0\x36\xfd\x46\x27\x62\x40\
+\xae\x25\xbe\x5b\x6c\xa9\x15\x73\xea\x1e\xdd\x2c\x67\x78\xbd\x6a\
+\xf1\xaa\xea\xe1\x05\x79\xf1\xac\xba\x6e\x5a\xa3\xfe\x37\xbf\x13\
+\xdc\x59\x05\x58\xc2\x38\x40\xe9\x48\x90\xcd\x2a\xad\xe6\x1d\x98\
+\xaf\x9d\x3f\x2f\x1f\xf3\x93\xbe\x1b\x2b\xe8\xff\xd8\xc7\x3e\xf6\
+\x96\x2b\xf9\x0e\x74\x0e\x4c\xbc\x5f\xb7\x6e\xdd\x3f\xb5\xfd\x3a\
+\xc8\x80\xdf\xc4\xd9\x73\xca\xcf\xcd\x69\x23\x05\x89\x61\x3e\x6a\
+\xd2\x52\x99\x2c\xcd\x11\xff\xc1\xb0\xf1\x39\x4f\x35\xbf\x83\x96\
+\x1b\x62\xdd\x36\x7e\x2f\xf2\x5c\x79\x69\x59\x7d\xeb\xd6\xca\x47\
+\x8d\x2f\x01\x58\x2a\x29\xda\xb7\x5a\x0b\x2f\x3d\xa5\xec\x89\x39\
+\xee\xbd\x3a\x3a\x74\xa2\x87\xeb\x95\xe4\x73\x4c\x1e\x11\x56\x80\
+\x46\x49\x61\xfa\xac\x62\x3d\x03\xea\xb9\xee\x06\x35\x86\xd7\xa9\
+\x5e\x29\xda\x7b\xd3\x3c\xeb\x0f\x84\x54\x2f\xcd\x6b\xf9\xcc\x01\
+\xf9\x38\xbe\xaa\xbc\x75\x11\x22\x19\x63\x63\x72\x52\x3e\x5c\xb3\
+\x1a\x29\x8b\x2e\xb4\x46\x46\x46\xee\x91\xf4\xb7\x50\xf5\x4a\x01\
+\xf8\xe8\xeb\xf5\x51\xec\x6c\x43\x00\xb6\x46\x5f\x9a\x9f\xd7\x0c\
+\xc0\xe7\x15\x8a\x1a\x1d\x18\x84\x79\x4f\xe0\x7d\x0b\xf4\xd4\x12\
+\x00\xa7\x14\x2a\x4b\x95\x4c\x42\x3d\x23\x61\x92\x91\x90\xb8\x6c\
+\x85\x20\xa8\x00\x08\x25\xfa\xfb\x59\x5c\x55\x0d\xe2\x7d\x94\x92\
+\x36\x68\xd2\x65\xaa\x44\x0b\x1d\xed\x4c\x11\x8b\x69\x9b\xbd\xcb\
+\xbc\xf4\x06\xca\x05\x25\x82\x43\x6a\x54\x29\x74\x66\x2f\xa8\xd0\
+\x33\xc8\x3c\x2b\x69\x93\x05\x99\x2b\x6d\x05\x40\x6f\x0d\x21\x56\
+\x55\xbc\xf4\x8c\xca\xf3\x17\x98\x2c\x70\x75\xaa\x67\xc0\xb5\x84\
+\x30\x97\xb3\xaa\xd3\x91\x0a\x66\xba\x2c\x18\x92\x22\xdf\x2a\x29\
+\x7e\x8d\x00\xde\xf7\xbe\xf7\xed\xa4\xe7\x96\x32\x75\x7e\x1d\xbf\
+\x5e\x64\xf1\xb9\xf9\x39\x85\x78\xa8\x2f\x95\xb4\xa6\x1f\xb8\x42\
+\xfb\x12\xa3\x44\x4e\x8e\x65\xf4\xd3\xcc\x1c\x1a\x54\xaa\xe6\x80\
+\xcc\x2d\x21\x48\x56\x10\x2d\xcd\x3a\x15\x85\x32\xd7\x59\xbb\x4b\
+\x76\xf7\x90\xae\x26\x61\xfc\xef\x05\xb5\x6c\x05\xd0\x10\x12\xc0\
+\xd7\xc1\x1f\xa7\x2e\xa9\xc6\x5c\x01\x42\x20\x45\xce\xd8\x8f\xd1\
+\xf4\x0d\x4a\xaf\x24\xc4\xca\x69\x27\x57\x2e\x65\xf2\x69\x15\x27\
+\x9e\x43\x18\x01\x6b\x8d\x57\x49\x80\x63\x38\x96\x43\x16\x5b\xa3\
+\x3f\x11\xdb\xb8\xd1\xe2\x55\x32\x99\x1c\x7d\xef\x7b\xdf\xbb\x96\
+\x56\xda\x92\xb9\xab\xe3\x0b\xc1\xcd\x9b\x37\xef\x68\x58\xe0\xf1\
+\x6c\x03\x73\x79\x76\x4e\x55\xe2\x68\x8c\xef\x69\x90\x36\xc8\x1f\
+\xf5\x75\x90\xda\x35\xe4\x5a\x72\x2b\x1c\x67\xb3\x30\x38\x48\xd2\
+\xe2\x5a\xc1\xe2\xfb\x68\xc7\xf8\xb1\xa1\xba\xdc\x26\x85\x4c\x77\
+\x9f\xd5\x78\xc7\xd4\xbd\xcb\x73\xb9\x1d\x74\x87\x60\x3c\x88\x30\
+\x09\x7d\xcc\x63\xae\x63\x05\x7e\xf9\xf2\x21\x95\x4f\x1d\xd0\xc2\
+\xab\x87\x39\xc7\xf9\xa6\xc1\x9e\x25\x15\xce\x3f\xa6\xc2\x1c\xbd\
+\x01\x04\x5f\xcf\x5f\x5b\xf9\xda\x39\xc1\x19\x17\x6b\x0e\x4a\x82\
+\x3f\xdb\x7e\xa7\x48\xba\xd1\x28\xfd\x4a\x0b\x08\x63\x1a\xd7\x99\
+\xf0\x02\x59\xd4\x2c\x90\x50\x08\x41\x24\xda\xa5\x6c\x80\xf3\x72\
+\x98\x54\x90\x73\xd9\xd3\x6c\xde\xdf\x58\x32\xa5\xe9\x9c\xa2\x83\
+\x6b\x94\x3d\xf4\x8c\x2a\x97\x6a\x1d\x3c\xb0\xc5\x4c\x78\x75\x4c\
+\x99\x70\x54\x24\x16\x5a\x9a\x9c\xe0\xba\x07\xe3\xcd\xcb\xe9\xb0\
+\x5b\xad\xd1\xe8\x98\x57\xe0\x62\x45\xd1\xeb\xd7\x60\xe6\x61\x2d\
+\x1e\x3b\xa2\xca\x82\x1f\x86\x5b\xf7\xf8\xfc\x35\x85\xce\x9d\x56\
+\xa3\x56\x51\xd7\xaa\xf5\x98\xfe\xb3\xaa\xcc\x8f\xa9\xb4\x80\x5b\
+\x16\xa5\x7a\xe1\xda\xfe\x07\xcc\xd8\xf4\x98\x57\x4e\x56\x79\x00\
+\x9d\x3d\x0d\x18\xae\x6f\x0b\xa0\x61\x05\x40\xba\x18\xe5\xe4\x68\
+\x5b\x00\x36\x01\x2a\xe7\x73\xf2\xd7\xea\xb6\x3b\x13\x70\xeb\x98\
+\x62\xf8\x1f\x2c\xa8\x3c\xa8\x56\xc0\xdf\x27\x4e\xab\x67\xe3\x0e\
+\xe5\x87\x46\xc9\xc2\x9e\x57\x79\xc1\x33\x8b\x87\x19\x68\x68\xc0\
+\x40\x33\xa1\x2a\x8e\x35\xc0\x2c\x9d\xe2\x46\xa5\x53\x00\x59\x37\
+\xc1\xda\x96\x54\xca\xe4\x94\x19\xb8\x9d\x67\x69\xa2\x5e\xbc\xa0\
+\xfc\xc5\xc6\x55\x40\x19\x8c\x73\x5f\xed\xbb\xf2\x6e\xbd\x59\x95\
+\xc9\xa7\x54\x5e\xac\xa9\x59\x8c\xaa\x3c\x57\x27\xa7\xa8\xf2\xb7\
+\xac\x17\x5d\xbd\x4c\x5c\x5a\x46\x08\xf4\x26\xa9\x8c\xac\x52\x00\
+\xc3\x75\x6d\xe5\xd7\x6d\x82\xcd\xc9\x08\xfe\xdf\xdd\xa9\xc4\xea\
+\xa0\xa6\xcb\x03\x41\xd3\x91\x09\x88\x73\x39\x72\x11\x34\x68\x7c\
+\xfc\x27\xd2\x69\x66\xc4\x4c\x9b\xf4\xec\x12\xe4\xe7\x45\x0d\x6c\
+\xd8\xae\xd2\xf8\x51\x98\x58\xb4\x02\x18\xde\xb3\x4b\x4e\xb7\x2b\
+\x07\x21\x86\x58\x40\x64\xc5\x88\x4a\xaf\xce\x6a\x74\xcf\x1b\x25\
+\xaf\x85\x01\x67\x9e\x79\x56\x7e\xea\xfd\x08\x7d\xbe\xee\x61\x22\
+\x45\x31\xcf\xf5\x9b\x55\xdf\x1c\x63\x0e\x33\x7f\x15\x4d\x2f\x68\
+\xe1\xf4\xb8\x8a\x67\xa6\x34\xe1\xfe\x9d\x32\x83\x39\x84\x44\xb4\
+\x28\x86\x55\x99\xcb\x2b\x10\xa9\xcb\x09\xb3\xf6\x25\x3f\x56\x72\
+\x79\x6d\xd6\x0d\x7d\x75\x97\x90\x5d\xc4\x00\xfa\xad\x1b\xc0\x6b\
+\x7f\xc7\xfa\x2f\x63\x00\xbe\x11\x45\x00\xd6\x02\xdc\x3a\x92\x05\
+\x40\xa8\xeb\x61\xcc\x91\x8b\xf9\x05\x42\x36\x5e\x5f\x4d\xae\x6b\
+\x47\xaf\x8e\x58\x08\x87\x15\x6a\xf4\x10\x5a\x0e\x0f\x0e\x81\xd8\
+\xd6\xcf\x6d\xb8\x13\x0c\xd4\x8b\x59\xeb\x42\x19\xac\x24\x3c\x14\
+\x15\x27\x3b\x58\x80\xe6\x5c\xc5\x46\x42\xea\xd9\x76\x8b\xfc\xa1\
+\x20\xf3\x56\xed\x73\x16\x6b\xcc\x75\x4c\x37\xde\xdf\xa7\x91\x9b\
+\x6e\x26\x5b\xcd\xc0\x64\x5e\xf9\x19\xae\xe5\xfd\x58\x4e\x90\x28\
+\xb0\x48\x32\x86\x9b\x76\xb9\x8a\x64\x58\xcb\x95\x3a\x6a\x97\xe6\
+\x5e\x0d\x1e\x02\x81\x4e\xc8\x8f\x9b\xe1\x2a\x01\x70\x32\x72\xb9\
+\x16\x77\x5b\x80\x17\x96\x14\x89\xf9\x31\xdd\x28\x8b\xd4\x15\x49\
+\xcb\xb5\x82\xf0\x4c\x49\x5a\x5a\xb6\xb1\x21\xdc\x3d\x80\x46\xdb\
+\x80\xe7\x1a\xe1\x34\x31\xfb\x49\xc1\x15\x89\xcb\x0a\x65\x76\xdd\
+\x22\x5f\x2c\xcb\x12\x4a\x24\x31\x45\x25\x56\x39\xca\xec\xbe\x55\
+\x99\xd5\x6b\xdb\x00\x57\x62\xc1\xb8\xa3\x4d\xa6\xda\x64\xc1\xd2\
+\x53\xff\xa6\x75\xd6\x2a\x4a\x53\x92\x9b\x8d\x20\xd8\xba\xaa\x26\
+\xde\x57\x1d\x18\xa4\x14\xee\x62\xed\xc1\xab\x2c\x14\x62\xe4\x79\
+\x9a\xa8\x1d\x01\xc4\x7e\x12\x04\x1d\x4c\xc3\xf1\x0c\x83\xf6\x4a\
+\xd3\x5e\x08\x3a\x52\x18\xb2\xe8\x0f\x98\xd9\x30\xe5\x75\x26\xbe\
+\x3a\xe6\x34\xeb\x46\xca\x06\xa1\xeb\x36\x7d\xc5\x96\xda\xd6\x01\
+\x92\x97\x7d\xf2\xa6\xcf\xab\xb1\x9a\x50\x18\x0a\xab\xff\x86\xdd\
+\xca\x12\x59\x34\x77\xc6\x3c\x49\x65\x78\x17\xf8\xb1\x0d\x2d\x8a\
+\x79\xd0\x7e\x39\xaf\x06\x02\x38\xfd\xa3\xa7\x2c\xd3\xe1\x78\x5c\
+\x83\x37\x5c\x8f\x55\x31\xab\x93\xc5\x22\x82\x6a\xe4\x04\x78\x86\
+\x55\x26\x5a\x79\xf8\x39\x38\x06\xcc\x98\x05\x7b\xf8\x7a\x93\xe7\
+\x9d\x2b\x85\x60\xad\x08\x2b\xef\x84\xe7\x4e\xd2\xd8\x11\x00\x42\
+\xe7\xc3\x85\x76\x3b\xcc\x4f\xa3\x11\x62\x45\x7e\x18\xf0\xe1\x54\
+\x75\xb7\x80\xb6\x42\x52\xbd\x3d\xe7\x55\x42\x68\xb6\x42\x98\x5a\
+\x3e\xe7\x96\x0b\xb8\x90\x09\x93\x56\x8b\x00\x1e\x52\x07\x89\x0b\
+\x53\x17\x94\x1a\x59\x85\x80\x7c\xea\xdd\xb8\x55\x8d\x35\x68\x5c\
+\x20\xbc\x31\x7b\xeb\xaf\x35\x35\x8c\xf6\x4b\x05\xc6\x20\xb1\xbf\
+\x64\x05\x50\xcb\x17\x48\x84\x7a\x94\x59\x13\xa3\x29\x7b\x09\x2c\
+\xc1\xdd\x96\x22\xcc\x5b\x47\x00\xb3\xed\x90\x07\xb9\x0e\x2e\xd4\
+\xb4\x02\xa8\xe6\x6c\xc8\xb2\x82\x11\x14\x08\x87\x6d\xe9\xcd\x77\
+\x53\x17\x94\x0c\xcf\x57\xba\x80\x0b\xff\x95\x8e\x00\x02\xc1\x80\
+\xc2\xc1\x90\x15\x40\xb3\xcc\x12\x17\xa7\xd4\xe0\x38\x94\x34\x3c\
+\xa3\xd5\x2b\xfc\x1f\xe2\x24\xa3\x9f\x3e\x7d\x2c\x69\x05\x51\x5b\
+\x9c\x36\xa6\xd9\xbe\xee\xb6\xcc\xb9\xe8\xd3\xd2\xf1\x83\x68\xc6\
+\x30\x55\x13\x92\xc4\x4d\x70\x2f\x88\x63\x90\xd8\x16\x39\x30\x4b\
+\x31\x55\x2a\xa3\xd5\xcb\xee\x86\xe6\xfd\xa4\xc3\x21\x55\xaa\x13\
+\xe4\x13\x45\x04\xd0\x24\x22\x04\x40\xff\x29\xee\xab\xb5\x75\xd0\
+\xae\x03\x1c\xc1\x2c\x7e\xcf\xd8\xd6\x26\x6b\xf3\x29\x9c\x4c\x5e\
+\x16\x00\xd6\x5e\x96\xe4\x5d\x69\x01\x55\x8a\x85\x2c\x17\xe4\xf0\
+\x2f\x88\xb4\xa2\xd4\xf3\x05\x53\x86\x56\x1c\x55\x2f\x4d\x2a\x0a\
+\x6a\xbb\x4b\x53\x0a\xa7\x43\xaa\x2e\xb9\x1d\xe5\x63\x15\x14\x48\
+\x5d\x52\x33\x19\x55\xbc\xb7\x4f\x75\xb4\x5f\x9e\xba\x88\x00\x0c\
+\x00\x36\x21\xd7\x2c\x02\x01\x38\x2a\x2d\x9e\x52\x61\xc3\x46\xac\
+\x60\xd4\x6a\x85\xa7\xda\xeb\x68\xf9\x37\x44\xec\x9f\x46\x0e\x4d\
+\x0b\x82\xa3\xb7\xdc\x6c\x05\x10\x8c\xfa\x15\x88\xcf\xca\xf5\x16\
+\x50\x42\x59\x71\x94\x51\x9e\xe1\x38\x32\xaf\x6a\x10\x86\xea\x6a\
+\x15\x44\x30\x6e\x4a\x82\x9a\x8d\x6d\x86\xe0\x06\x1e\x3c\x53\x84\
+\x51\x94\x75\xde\x99\xa1\xec\x79\x06\xb7\x63\x01\x4d\x88\x28\xb3\
+\x30\xe9\xb5\x93\x9d\x40\x84\xbc\x9d\xc2\x21\x84\x69\xca\x63\xc2\
+\x19\xfa\x82\x17\x4f\x29\xb3\x69\xbb\xe2\x1b\x57\x28\x71\x5d\x58\
+\xb1\x15\x94\xc6\x2b\xa5\xd4\xfa\xa8\xd2\x3b\x37\x72\x6d\x27\x9a\
+\x0a\xa8\x34\x37\xad\xda\xec\x02\xe6\xd9\xd2\x1e\x02\x80\x18\xb1\
+\x82\xf2\xa5\xa2\x96\x8e\x1e\xe0\xb8\x24\x54\x67\x1b\x9a\x6a\x6b\
+\xbe\x69\xc8\xa5\x09\x33\x8f\xb5\x95\x1c\x2e\x5b\xf4\xc7\xa4\x03\
+\x54\x7a\xa4\xb3\xd5\x29\x3a\x3f\xe4\x23\x7c\x0f\xc5\x68\x84\xa4\
+\x27\x94\x1c\xad\xaa\x6b\x6d\x43\xd1\x6e\x62\xfb\x30\x58\x91\xa0\
+\x44\x4e\x19\x16\x3a\xd6\x60\x5c\x22\x24\x7f\x3c\x81\xe2\xd2\xea\
+\x58\x38\xca\x3e\xcb\xe0\x5e\x69\x01\x15\x5e\x37\x5f\x68\xa7\x8a\
+\x56\x00\x71\x3a\x2d\x61\x80\xca\x71\x72\xaa\x2e\x37\x95\x3b\xfa\
+\x8a\x86\x6e\xbc\x59\xdd\xeb\x37\xca\xb9\x7e\x37\xfe\x99\x67\x81\
+\xb8\x45\x22\x69\xcd\x2b\xc4\xbd\x1e\x0c\x94\x2e\x9e\xc5\x05\x4c\
+\x62\xd2\xb0\x21\xc8\x46\x08\x00\x94\x0f\x7e\x4b\x59\xfa\xea\xb8\
+\x4a\x37\x6c\x53\x6a\x68\x58\xb0\x29\x62\x94\x05\x4e\xdb\xe2\x22\
+\x6f\xaf\x13\x4a\xdd\x52\xc8\x0a\x8e\x05\x83\x17\x75\xc6\x59\xc5\
+\x7a\xa9\x27\xd2\x31\xd6\xd3\x24\xaf\x99\x50\x62\x10\x54\xc7\xdf\
+\xb3\xb1\xba\x92\x83\x8e\x55\x54\xac\xdf\xa3\x36\xc1\xcc\xc9\xf0\
+\xf9\x87\xc9\x1b\xcb\x89\xcb\x47\x63\xc6\x6f\x92\x20\xe6\xe7\x63\
+\x36\x5b\x9c\x66\x68\x5c\x89\x01\xb5\x31\x3e\x6e\xfb\x8f\xfa\x90\
+\x5a\x82\xfa\x3f\xc2\xc3\x4c\x62\x4d\xac\x7c\x3e\xaf\xe9\xe7\x7f\
+\x04\x43\x25\xf9\x9d\x0a\x85\xc9\x08\x4c\x0c\x21\x71\xee\x71\x6c\
+\x1e\x4f\x3c\x9e\x21\xef\x9e\xc5\x8f\x6d\x28\x6d\xbd\xf4\xb4\x16\
+\x00\xd5\x4d\xdd\x40\x9a\x3d\x57\x50\x69\xf2\x02\xf7\x57\xed\x33\
+\x1e\xd4\x74\x49\x9d\x99\xb7\x78\xe1\x04\xe8\x5e\x36\xf7\xd9\x6e\
+\xd1\xf9\x67\x9f\xd3\xf4\xb1\x1f\xab\xb4\x7c\x46\xd1\x01\x3f\x16\
+\x66\xc2\xd5\x8c\x22\xe9\xb8\x42\xa9\xa8\x62\x03\x41\xf5\x6d\x75\
+\xd4\xb3\xc9\x53\xcf\x96\x06\x02\x90\x4d\xd6\x1c\xd7\x47\x04\xf3\
+\xb5\x36\x5c\xa0\x9c\x38\x1d\x67\xe1\x0a\x9d\x4c\xf7\xa5\x97\x5e\
+\x3a\x72\x0d\x08\x3e\xf9\xe4\x93\x87\x79\x97\x56\x32\x37\x38\x94\
+\x9d\x71\x04\x10\xc5\x0a\x8c\x09\x35\x25\xea\x7b\x29\x77\xf8\xa8\
+\xe6\xc7\x0e\x61\xde\x79\x62\xef\x84\x8d\xd9\x96\xbc\x9a\x05\xb7\
+\xfc\xe9\x63\xc4\xe6\x26\xd7\x3d\xcb\x7c\xc7\x05\x3a\x84\x50\xb8\
+\x86\x20\xb0\x1e\x98\xb7\x66\xcf\x09\xc2\x24\xf5\xc1\xf4\x5e\xcd\
+\xef\x7f\xc2\x6a\xd0\xab\x59\x90\x45\x08\x15\x18\x68\xd0\xf1\x09\
+\x71\xef\x12\xe7\x2f\xe2\xe7\x30\x97\x48\x51\x7c\xf5\x70\x2d\x4e\
+\xe1\x14\xa2\x90\xf1\x81\xfc\xed\x30\x58\x43\xf7\x35\xbf\x22\x4e\
+\x00\x1c\x8b\xc9\x0b\x85\x08\xbb\xf4\x12\x4c\x94\x81\x30\xff\x69\
+\xb6\x1b\x9d\xfc\x49\x10\xf4\xf8\x5c\x64\x33\xc3\xab\xd4\x04\xdb\
+\x48\x15\x49\x66\x32\x4a\x50\xe2\xe6\xe9\xa8\xd8\x5c\xda\xe5\xe1\
+\x0b\x35\xcd\x3d\xff\x14\xdd\x9d\x21\xc5\xfa\xfa\x55\x5d\x30\x66\
+\x69\xea\xfd\x10\xe0\x35\xa7\x3a\x55\x57\x2d\x17\x31\xcc\xb6\xa3\
+\x83\xc9\x0f\x60\x1e\x57\x41\x8a\x9c\x73\xad\xc9\xe3\x9b\x30\x58\
+\x80\xa1\x79\x79\x95\x33\xb8\xd8\x51\xac\x62\x99\xe2\x86\x34\x35\
+\xe0\xb4\xdc\x47\x02\xe9\x23\x58\x98\x41\xf5\x79\x70\x61\x49\xa1\
+\xae\x1e\x1a\x17\x71\x14\x94\xa0\x59\x02\x40\xc3\xa4\x70\x51\xb1\
+\x36\x61\x31\x6e\x1d\xed\x57\xc0\x8c\x0a\xd1\x05\x73\xf1\x27\x53\
+\xaa\x74\xa5\x71\xdb\xf5\xca\xb6\x37\x66\xcd\xcf\xcf\x1f\x94\x94\
+\xfd\xc9\x96\x58\x13\x9a\xc7\x0b\x9e\x05\x21\xad\x99\xf8\x31\x9d\
+\xf4\x9a\x35\x0a\xa6\x52\xed\xa6\xa4\xd0\x9c\xa3\xfc\x49\x1a\x25\
+\xfb\x9e\x46\x71\x86\x81\x32\x42\xb8\x00\xd3\x33\xaa\x2d\x2f\x81\
+\x65\xa1\xab\xc2\x97\x07\xb5\xcd\x1f\x42\xe3\x6a\xa0\x41\x97\x89\
+\x2e\xaa\x3a\xbf\x17\xac\xd8\x8b\xc6\x8f\x32\x4f\x56\x45\x84\x0b\
+\xd6\xd8\x8c\xce\x41\x60\xe4\x06\x3c\x5f\x67\xfe\xf3\xcc\x3b\x4b\
+\x68\x0e\xc2\x78\x44\x0e\xc2\xf6\x05\xad\x10\xf0\xeb\x2e\xe6\x8b\
+\xf3\xbd\xdd\xaa\xc9\xe1\xf7\x65\x42\x78\x1d\xed\x93\x70\x05\x33\
+\x19\xa5\xae\xdf\x2a\x5f\x3c\x66\x9b\x21\xa6\xd7\xc1\xde\x81\xc7\
+\x84\x4a\xff\xa1\x9e\x60\xe9\x3b\xdf\xf9\xce\xf7\x30\x91\xaa\xc1\
+\x02\x87\x50\x18\xe7\x0d\x4c\x64\x90\xb4\x36\x16\xb5\x21\x05\xb9\
+\x80\xf2\xd2\xf2\xe1\x63\x5a\x3a\x31\x66\x72\x76\xa8\x26\x37\x3f\
+\xa7\xe5\xb1\x7d\x2a\x4d\x2f\xb0\xc0\xa0\x01\x1c\x8b\x1d\x3c\x70\
+\xd9\xfc\x1b\x90\xcf\xef\xa2\x4d\x63\xf6\x27\x08\xaf\x17\x44\xc5\
+\xc5\xb1\xc9\x14\x49\x6d\x67\xc8\xeb\x0b\x71\xc1\x91\x15\x58\x85\
+\x0c\xaf\x1b\x8c\x49\xf6\x0d\x12\x96\xbb\x15\x80\xe9\x96\x19\xc9\
+\xb6\xcd\x85\xf6\x1d\x5f\x08\x0e\x18\x9b\x30\x8e\xe9\x8b\x42\xc8\
+\x57\xc0\xfc\x3d\x08\xe4\x5f\x0e\xfa\xb4\xfa\xce\x3b\x55\x67\x1d\
+\xed\x0d\x1d\xcb\xff\xf3\xab\x5f\x7d\x54\x92\x7b\x4d\x4f\x50\x2c\
+\x85\xed\x25\x63\x48\xe8\x50\x3c\x1e\xbf\x85\x92\x51\x41\xd0\x33\
+\x45\x27\x25\x4b\x77\x55\x24\x27\xcc\x62\x2b\xad\xdc\xb9\x3a\xfe\
+\xba\x4f\x09\x5c\x21\x94\x4e\x09\x75\x63\xa2\x05\x15\xcf\x03\x82\
+\xe5\x59\xe5\xa7\xd1\x98\x79\x3e\x81\x76\x22\x61\xae\xdb\x82\x04\
+\x90\x42\x33\x69\xa8\x2f\x20\xc0\xc5\x76\x8b\xb9\x04\xb3\x2e\x89\
+\x48\x85\x50\x9b\x27\xf5\xbe\x84\x15\xd4\x5a\xcf\xf8\x4d\x76\x88\
+\x40\x8a\x97\x6b\x14\xdc\xa3\x6c\xdd\x11\x0d\xb5\xdc\xac\x0e\x55\
+\xb8\x37\x8f\xd5\x2c\x04\x14\xc8\x13\x26\x11\x8c\x47\xdc\x0f\x6c\
+\xda\xa0\x24\x2f\x6f\xe7\x0a\x79\xdb\x0d\x62\xd3\xc4\xe3\xf9\x62\
+\x71\xca\x4a\xf2\x5a\x01\xd8\x93\xb3\x7b\xf7\xee\x7d\x84\xf6\xb8\
+\xd9\xdc\xe8\x04\x89\x02\x49\x04\x50\xe4\xbd\xa0\x72\x79\x28\x67\
+\xb5\x5a\x2b\x38\xca\x9d\x9e\xd7\x12\xe7\xfb\xf7\xec\x84\x11\x59\
+\x8d\x37\x1d\x17\x01\xd5\x29\x54\xa6\x68\x5e\x56\x6c\x1c\x0f\x63\
+\xce\x84\x22\x50\x1b\xad\x24\x73\x8a\x0f\x61\x5d\x32\x61\xcf\xb1\
+\x59\x9c\xc7\xc2\xb2\x2f\x5f\xd2\xfc\xcb\x0d\x30\xc6\xa7\x64\x66\
+\xb0\x53\x9e\xd8\x66\x4b\xad\x14\xc6\x5d\x7c\x8a\x90\x03\x78\x80\
+\x26\x21\x02\xa1\x76\xf3\xf7\x10\x08\x2e\xa8\xb2\xd1\x08\xb8\x32\
+\x8b\xf6\x97\x30\xff\x32\x18\x80\xdb\x9e\x25\xc3\xdc\xf0\xcf\xde\
+\xad\xba\xcf\xe9\xec\x55\x74\xbf\xff\xdd\xef\x7e\x05\x26\x4b\xe2\
+\x73\x8d\x00\x3a\x49\xd2\xfe\xfd\xfb\x1f\xc7\x0a\x5e\xd9\xbe\x7d\
+\xfb\x36\xfa\x67\x0a\x00\x84\x5d\xbb\x76\x69\x79\x0e\xf3\x86\xa9\
+\x26\xa4\x86\x30\x59\x72\x83\x53\xa7\xd4\xbd\x69\x2d\x0c\x46\xf0\
+\xd7\x12\x3d\xfe\x57\xb4\x34\x0e\x63\x2d\x03\xb3\xa6\x7f\xfe\x99\
+\xe7\x8c\x55\xab\x7b\xa3\xc7\xcb\x4d\x97\x4c\x2e\x88\xb5\xa0\x79\
+\x00\x8b\x66\x08\x02\x80\xc9\x2c\xe9\x33\x9a\xf3\xc8\x00\x27\x5e\
+\xdc\x7f\xe5\x0e\x26\xee\x97\x46\x76\x01\x8e\xfd\x54\x99\x7d\x30\
+\x69\xe6\x75\x0a\x08\x1d\xa0\x2d\x92\x3c\x65\x6b\xf2\x2f\x32\xd7\
+\x14\x82\xce\x05\x01\xbf\xa8\xf2\x7d\xdd\x8a\xdc\xb2\x5b\x29\xc0\
+\x6f\x1e\xed\x9b\x8d\x1d\x67\x4e\x9f\x7e\xe2\x99\xa7\x9e\x3a\x20\
+\x56\xff\x53\xdf\x0e\x77\xb2\x42\x5e\x8b\xf9\xb6\x6c\xd9\xf2\x16\
+\x3a\xc5\x8e\x49\x8a\x82\x50\x9d\xee\x6a\x93\x56\xb7\x8c\x00\x6c\
+\xda\xea\x90\xa2\xd6\xd0\x68\x17\x3e\x38\x21\x77\xf9\x15\xb0\xa0\
+\x2c\x8c\x11\x80\x74\xac\x69\x63\xe1\x24\x55\x52\x7a\xb5\xa7\xde\
+\x55\xae\x7a\x77\x05\x40\x72\x98\x08\xf9\xb0\x0e\x23\x00\x21\x08\
+\xfc\xff\xac\xa7\xec\xb4\x0f\x30\x75\xae\x69\x3a\xe1\x5d\x60\x90\
+\xa3\x44\xcc\x53\xa8\xa7\xfd\x72\xd4\xb6\xa1\x58\xc3\x32\xda\x9f\
+\x02\x57\x26\xb9\xe7\x22\x20\x59\x00\x24\xfb\x07\x75\xaa\x2f\xa5\
+\x1d\x0f\xfe\xa1\x6a\x91\x90\x49\x7a\x44\x92\x57\xfb\xc6\x23\x8f\
+\x3c\x38\x7e\xf6\xec\x31\x33\xe5\xcf\x7a\x3d\xee\xb2\x0d\x75\x86\
+\x77\x69\xdb\xd9\x6a\xb2\x26\x12\x8d\xb2\x80\x98\xc2\x50\x69\x6e\
+\x16\x90\xa1\x2f\x8f\xd9\xa2\x3d\x00\xad\x81\xc4\x27\x15\x0c\x9d\
+\xc5\xa5\x2b\x80\x95\x09\x18\xd4\x06\xa4\xa6\x80\x34\xcd\x89\xa6\
+\xba\x60\xbe\x67\x65\x83\x66\x87\x0f\x40\x0d\x60\xbe\x41\x9b\x5b\
+\xd8\xac\xa6\x2d\x80\xfa\x82\x47\xb2\xe3\x53\x69\xde\x0a\xa5\xa3\
+\xfd\x4e\x25\x6b\x29\xc1\x5c\xb1\x3e\xb5\xdc\xad\xc1\x89\x3c\x37\
+\xce\x50\xfa\xe2\xd1\xc1\x69\x7c\x3f\x6b\x36\x47\xf4\xea\x04\x09\
+\xd2\xba\x7f\xf7\x51\x45\x79\xf9\xba\x48\x64\x9a\x9b\x9b\x63\x2f\
+\xd3\xfe\xaf\xfd\xcd\xc3\x0f\x3f\x64\xf2\xb9\x9f\x77\x83\x44\x89\
+\x0d\x88\xb3\xec\xb8\x7a\x07\x1b\x0c\xc2\x30\x6f\x22\x01\x42\x88\
+\xab\x44\xf9\xe9\x00\x88\x04\x5d\x5b\x76\xc6\xd3\x15\x16\xd6\x80\
+\x29\x07\x40\x74\x38\x86\xf1\x98\xc7\xf9\xa6\x52\x7d\x9e\xd2\xc3\
+\x4d\xa5\xb7\xf8\x31\x5f\x7c\x33\x12\x82\xa2\x58\x40\xbc\x85\xe0\
+\x4d\x59\x60\x13\x0c\xb9\xcb\x9e\x0a\x0b\x3e\xac\x47\xd7\x7e\x9a\
+\xcc\xdb\x83\x10\x98\xd3\x66\x83\x26\xdd\x5d\xa0\xc4\x9d\x26\xde\
+\xcf\x60\x55\xb9\x30\x80\x99\xd1\x59\xf2\xfd\xf0\xbb\xde\xae\x91\
+\xb7\xbd\x55\xd9\x72\xc9\x68\xde\x00\xdf\xe4\x9f\xfd\xf1\x1f\x7f\
+\x14\x0c\xb8\xe4\x32\xd3\xcf\x2b\x80\x06\x7e\x33\x07\x72\x3a\xec\
+\xc8\xbc\xdd\xb8\x42\x10\x21\x18\x30\x0b\x43\x65\xfa\x73\xbe\x4a\
+\x99\xa2\xa4\xa6\x44\x0f\x9d\xa3\x5e\x13\x8d\xa0\xa0\x6c\x46\x16\
+\xee\xf6\x51\x2c\xf9\x14\x1d\xf6\xa3\x75\x3f\x11\xc1\x68\x3e\x0c\
+\xf3\x09\xf0\x20\x45\x0c\xa7\x34\x05\xc5\x65\x30\xc0\xad\xdb\xf6\
+\x99\x93\x6d\x08\x78\xa4\xd1\x69\x31\xe4\xca\x8f\x2d\x61\xa3\xcc\
+\x99\x49\xca\xbe\x2d\xf2\x2d\xa2\xf1\x59\xfc\x7d\x0e\xca\x86\xb9\
+\x9e\xd6\x85\x44\x46\xb9\x9b\x76\x6b\xcb\x07\xff\x40\x45\x22\xce\
+\x2c\x9a\x27\xb3\x73\xbf\xfd\xcd\xbf\x7d\x60\xec\xd0\xa1\xa7\x8b\
+\x92\xfb\x8b\x6e\x92\x32\xfb\xf4\xcf\xd0\x2e\x5f\xcb\x0b\xc5\x8d\
+\xc6\x15\x82\x26\xb4\x25\x13\xb6\xf8\xa9\xd0\xc5\x4d\xc6\x4b\x8a\
+\x67\xaa\x14\x44\x4d\x2b\x00\x27\xe0\x20\x04\x53\x81\xf9\x18\x61\
+\x3a\x1c\xe0\xd8\x6a\x1d\x4a\xf2\x3d\x0d\xf3\x90\x2f\x81\x2a\x5a\
+\x4d\x10\xe2\x9a\xb5\x82\x00\x56\x13\x2c\x21\x04\x62\x77\x35\x27\
+\xce\x31\x9f\x98\xcb\x41\xd3\xe0\x45\x17\x00\x98\x89\xa0\xf1\x3a\
+\xf9\xfd\x42\x58\x21\x28\x98\x37\xf9\x46\x5a\xe7\x48\x17\x67\xe8\
+\x18\xed\x78\xe0\xe3\xaa\x04\xfc\x2d\xe6\xd9\xd4\xf1\xdc\xd3\xcf\
+\xfc\xf9\xb7\xbe\xf6\x57\x7f\xce\x74\xc5\x7f\xcc\x2e\xb1\x26\x54\
+\x38\x76\xec\xd8\x89\x15\x2b\x56\xec\x21\x22\x0c\x21\x04\x6b\x05\
+\x81\x54\xca\x36\x29\x6b\xe5\x9c\x52\xdd\xe6\x5d\x5e\xcd\x34\x25\
+\x21\x41\x7e\xcc\xd1\x6f\xb2\x33\x98\x07\x94\xc2\x31\x4c\x3e\xc1\
+\xf7\x14\xe7\x93\x5c\x8f\x73\x53\xa8\x95\x83\xd9\x1e\xa3\x6b\xdd\
+\xc9\x71\xc0\x93\x18\x7e\x5e\x47\x10\x29\x1f\x58\x40\x37\x0a\x0a\
+\xd3\x0c\x49\x67\x82\x1a\xec\x0e\x28\x19\x20\x45\x07\xe8\x42\xf8\
+\x7b\xa0\x4c\xc7\x38\xd8\xa3\x13\xfe\x08\x9a\xbf\x49\x3b\x3e\xfe\
+\x31\x55\x10\xfa\x0c\xcc\xa3\x38\xb3\x9f\xe9\xd1\xbf\xfc\x93\x2f\
+\x7c\xb2\x5b\x9a\x5b\xfe\x25\xf6\x09\x7a\x68\x69\xe1\xf8\xf1\xe3\
+\x63\xbc\x36\xbf\x0d\x3c\xe8\x09\x1b\x50\x8c\xc7\xa1\x24\x05\xd3\
+\xb0\xf2\x4b\xa0\x30\xd5\xa1\xdf\xd6\xf6\x08\x41\x62\x0c\x30\xfa\
+\xa1\x90\x80\x3e\x04\x84\x20\xcc\xc8\x79\x35\xfc\x26\x77\x87\xcc\
+\x66\xa7\x06\x63\x83\xb1\x2e\x51\x00\xc1\x36\xd6\xe4\x28\xe9\x49\
+\x5d\x34\x63\xbb\x32\x01\xf5\x76\xc3\x3c\x05\x4f\x97\x2f\xac\x70\
+\x93\x88\x54\x04\x43\xdc\x84\xaa\x80\xcd\x8b\x3c\x1f\x7d\xd7\xbb\
+\xb4\xf9\x5f\xfd\x4b\x15\xb1\x94\xe9\x99\x19\xcb\xfc\xcb\x87\x0f\
+\xbf\xf0\x97\x9f\xff\xc2\xbf\x49\x36\xea\x13\xe7\xe0\xe1\x97\xdd\
+\x29\x4a\x16\xeb\xce\x8c\x8f\x8f\x1f\x23\x2a\x98\x04\xa9\x27\x1c\
+\x89\xd8\x4c\xaf\x19\x89\x53\xa7\xaf\x22\xcb\x4a\xab\x9c\xaf\x90\
+\x81\xd5\x2d\x53\x0c\xb6\x2a\x73\xaa\x50\x05\x43\x2e\x0b\xe0\x84\
+\xd9\xa2\x2b\x15\xb0\x96\x62\x95\xe3\x0a\x54\x6b\x51\xc1\x05\xd8\
+\x1a\x8c\xb8\x50\x09\xcc\x00\xe9\xa2\x50\x02\x9c\x48\xf9\xe8\x4d\
+\x40\xa1\x26\xd6\x57\x8f\x23\xdb\x8c\x26\x7c\x51\x1d\x66\x0d\x9b\
+\x1f\x7c\x50\x43\x77\xdd\xa1\x2c\x51\x69\x6a\x7a\xda\x00\x1e\xbb\
+\x59\x0e\xbf\xf8\xb5\xbf\xf8\xef\xf7\x47\xf2\xd9\xf1\xb3\xac\xfd\
+\x57\xb9\x59\x3a\x82\x05\xdc\xc4\xcf\x61\xfe\x94\x24\x69\x17\xdb\
+\x68\x44\xe5\x68\x37\x48\x85\xca\x00\x62\x7e\x5e\xc5\xf1\x17\x15\
+\x29\x8f\x29\x1d\x98\x57\xa8\x51\x6d\xed\x0a\x35\x8d\x55\xfe\xf9\
+\x9a\x10\xff\x1c\x4b\x9d\xfd\x4e\xed\x37\xc4\xed\x1e\x23\x9e\xd4\
+\x29\x67\xa1\x20\xc2\x0c\xa2\x6d\x46\x2f\x2c\x4c\x4e\x34\xc1\x34\
+\x56\xa6\x17\x71\xd7\x5d\xda\xf8\x9e\x7b\xd5\xc0\x12\x17\xb3\xcb\
+\x76\x57\x3a\x95\xac\x8e\x1c\x3c\xf4\xf8\x5f\x3f\xf4\x95\x8f\x77\
+\x57\x4a\xa7\x8f\x4b\xee\x6b\xb1\x5d\x3e\x44\xc7\x68\x2b\x7b\x08\
+\x3f\xc5\x6f\x05\x7e\x97\x5c\xc1\x61\x03\x92\x22\x21\x80\x09\x33\
+\x8e\x19\x7f\xa6\xa7\x57\x3e\x7d\x08\x3f\x3d\xa5\x1e\x65\x11\x48\
+\x49\x81\x6a\xc3\xee\x23\xf0\xd7\x01\x4b\x5b\x11\x43\xcd\x76\xba\
+\x6b\x81\xc3\x69\x63\x82\x9f\xf3\x86\x60\xda\xe4\xfa\x68\xde\xa3\
+\x08\xba\x58\x71\x75\xae\xe1\xd1\x97\xdc\xa3\x4d\xec\x47\x0e\xb2\
+\x1b\x2d\x47\x42\xb6\x40\x92\xc3\xfe\x3f\xa3\xf9\xc6\x81\x7d\xfb\
+\xfe\xc7\xf7\xfe\xfa\x6f\xfe\xeb\x48\xd3\xbb\x78\x04\x91\xbe\x96\
+\x3f\x98\x08\x40\xc3\x3b\x77\xee\xfc\x83\x37\xbd\xe9\x4d\x0f\x12\
+\x26\x53\xec\x20\x17\x20\xa9\xb0\xc9\xfd\x59\x68\xdc\x41\x61\xc5\
+\x9c\x0a\xaf\x9e\x94\x26\xc7\x15\x9a\xbf\xa4\x1e\x9a\x1b\x09\xf2\
+\xf6\x40\x89\xd4\xb5\x4a\xee\x6e\x84\xc0\x3f\xf1\x8c\x7c\x50\x20\
+\x88\x79\x87\x60\x38\xa2\x1a\xe3\x54\xa9\xaa\x59\xee\xa9\x62\x69\
+\x03\x6f\x78\x83\x46\xd8\x7d\xee\x74\xa5\xf1\xa0\xaa\x96\xb2\x59\
+\x9b\xe1\x4d\x63\xf6\x67\xcf\x9c\x99\x7b\xe6\xc9\x1f\xfc\xa7\xa3\
+\xcf\x3d\xff\xcd\x95\xd4\x73\x07\x25\xef\xf5\xf8\xc9\x8c\x03\xa5\
+\xf9\xdc\x7a\xc7\x1d\x77\x7c\x82\xd7\xcd\x6f\xc6\x25\x7c\x84\x4b\
+\xc5\x63\x31\xbb\x83\x3b\x2c\x29\xee\x0f\x28\xe6\x43\xb3\xe4\xe3\
+\x45\x4c\xb4\x3a\x35\xa9\xe6\xec\x8c\x7c\x30\xa0\x82\x79\x77\x50\
+\xb7\x55\x5e\xc3\x54\x85\xe1\x88\x5c\x00\xd6\x4b\x53\xe3\x0f\xf4\
+\xab\x7f\xcb\x56\xf5\x6e\xdd\x22\x1f\x6e\x46\xd9\xa0\x3c\x6e\x96\
+\xe3\x99\x2c\xcf\xd2\xd4\x10\xd9\xaa\xcb\xa6\xcd\xbf\xfb\xc1\xf7\
+\x1f\xfd\x6f\xde\xe2\xe2\xd1\xf5\xf2\x2a\x3f\x92\x9a\xaf\xf7\x8f\
+\xa6\x82\xd0\x8a\x0d\x1b\x36\xdc\x73\xe3\x8d\x37\xde\xbf\x7e\xfd\
+\xfa\x1b\x00\x4a\xb3\xc9\xda\x6e\x47\x09\xe3\x1a\x21\x63\x15\x50\
+\x14\x0d\x47\x8c\x60\x10\x4a\xc0\x74\x6b\x3b\x11\x83\x63\x87\xeb\
+\xe2\x9a\x82\x41\x46\xbf\x5c\x47\xb6\x86\x2f\x03\x6e\x14\x26\x2a\
+\x96\x4a\xc8\xab\xd0\xc9\xeb\xbd\xd3\xe3\xe3\x2f\x1c\xdc\xf7\xe2\
+\x97\xce\x1d\x1d\x7b\x22\xd3\x6c\x2c\x8d\x4b\x8d\x5f\xe7\xcf\xe6\
+\x1c\x28\x02\x0d\xaf\x5b\xbb\xf6\x2d\x3b\x76\xee\xfc\x17\xb8\xc5\
+\x6e\x04\x11\xc2\x42\xac\x20\x00\x4f\x11\x3d\x14\x0c\xc0\x3c\xcc\
+\xf2\xfb\x20\x2c\x3f\x00\x01\x78\x68\x9f\xff\xd9\xa4\xa8\xe1\x79\
+\x96\xea\x00\x62\x0d\xe6\xcb\x30\x6f\x18\xe7\x17\xa5\x26\xa7\x2f\
+\x4f\x9c\x3f\xff\xdc\xe1\xfd\x07\xbe\x7a\xe1\xd4\xf8\xd3\x51\xcf\
+\x9d\x0f\x49\xb5\x73\xbf\x41\x3f\x9c\x74\xa0\x30\xec\xf4\x26\x62\
+\xb1\x2d\xdb\x77\xee\x7c\xc7\xc8\xe8\xe8\xef\x80\x0f\x1b\x32\xec\
+\xd4\x64\x07\xea\xdf\x0b\x02\x4d\x07\x10\x46\xe7\x5d\x9d\xda\xbb\
+\x37\x08\xb7\xb6\x75\x45\x35\x6a\x4b\xd8\xa5\xc5\xc5\xc2\xfc\xdc\
+\xdc\x31\x36\x6b\x3e\x79\xe4\xc5\x17\xff\x4f\xad\x54\x79\x35\xe8\
+\xd5\x97\x03\xa6\x60\x93\x9a\xbf\xa9\x3f\x9d\x75\xd4\x2a\x0d\xa2\
+\xb0\xd7\x8d\x81\x0f\xaf\xdd\xb0\xfe\xc6\x15\xc3\xc3\xd7\x03\x94\
+\xab\x12\xc9\xd4\xca\x70\x24\x9c\xa6\xf1\x8a\x57\x04\xc3\xdc\x6c\
+\x18\xaf\xd0\xb2\x2a\xc1\xfc\x32\x6d\xab\x0b\xec\x4e\x3f\x37\x39\
+\x31\x71\xf8\xec\xa9\xf1\x83\x5c\x9f\xa6\xfa\xcb\x8a\x3e\xd1\xb2\
+\xe4\xfd\x36\xfe\x78\x9a\xba\x0f\xb7\x97\xc8\xf2\x15\x91\x15\x8c\
+\xc3\xe8\x84\x9a\x9c\xc7\xfc\x3d\x47\xb8\x3d\x90\xc8\xf5\x32\x9b\
+\x54\xcb\xa0\x80\xcd\x08\x0c\xd7\xaf\xf5\x8f\xa8\x9d\xdf\xb0\x5f\
+\xad\x37\xf5\x3a\x7f\xfe\x1f\x5f\xbc\xdd\xe6\x1a\x53\x0c\xc2\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x13\x09\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\
+\x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd7\x09\x17\x17\x15\x19\x49\x86\x70\x41\x00\x00\x12\x96\x49\x44\
+\x41\x54\x78\xda\xed\x5b\x09\x74\x5c\xd5\x79\xfe\xee\x7b\xb3\x6b\
+\xb4\x5a\xb2\x25\xd9\x96\x64\x63\x6c\x83\x31\x36\xb6\x81\x00\xe1\
+\xb0\x34\x14\xc2\xda\x94\x86\x04\xd2\x90\x42\x72\x20\x5d\x20\x14\
+\x68\x08\x4b\x48\x09\x87\xda\xad\x73\x52\x52\x02\x24\xad\x7b\x20\
+\xe4\xb0\x95\xcd\x40\xb0\x1b\x56\x2f\x80\xb1\x2d\xdb\xd8\xb2\x6c\
+\x6c\xd9\xb2\x2c\xc9\x1a\x4b\x1a\x69\xf6\xe5\x6d\xf7\xf6\x7f\x33\
+\xef\xf0\xf4\x3a\x9a\x19\x1b\x26\x3d\xc9\x69\x7e\x9d\x4f\xf7\xbd\
+\xfb\xee\x9b\x79\xdf\x77\xff\xe5\xbe\x2b\x1b\x7f\xb4\x3f\xda\xff\
+\x6f\x63\x38\x0e\x1b\xbb\x05\x75\x52\xed\xf4\x8b\x5d\x33\x97\x5c\
+\x06\xb7\xef\x3c\xa1\xa4\x3c\xd0\xb3\xc3\x42\xcd\x0c\x71\x35\x15\
+\x12\x4a\x22\xc4\x53\xe3\x21\x91\x8d\x85\x84\xc0\x10\x80\x10\xe1\
+\xe8\xd4\x9f\x43\xf9\x83\x16\x40\xfc\xd8\x7f\x95\x68\x5d\x76\x37\
+\xe7\x58\xc6\xd3\x51\x99\x08\x42\x70\x01\xe1\x0e\x12\xaa\xc0\x65\
+\x3f\x84\xec\x81\x60\x6e\x82\x0b\x90\x5c\x10\x82\x03\xdc\x00\xd7\
+\xd2\x02\xba\x32\x2e\x0c\x6d\x48\xe8\x6a\x48\x68\x4a\x48\xe8\xd9\
+\x10\x57\xd3\x24\x54\x7c\x48\x68\xd9\x90\x30\x85\x12\x08\x4d\x7f\
+\x0c\x99\xdf\x3b\x01\xc4\x03\x9e\x3f\xc7\xf9\xf7\xbf\x88\xe6\x45\
+\xcc\x24\x04\xae\x03\x26\x39\x43\x05\x32\x11\x80\xc4\x80\x9a\xcc\
+\x43\xcf\x40\x68\x19\xf0\x6c\x82\x90\x02\x57\x92\xe0\xa6\x50\xb2\
+\x0f\x5c\x48\x04\x53\x13\x4e\xd0\xc1\x75\x2d\x27\x14\x40\xd7\x0d\
+\x03\x24\x0a\x41\x8d\x0a\xae\x87\x08\x43\xc2\xa0\x36\x07\x95\x04\
+\x33\xa1\x0c\x09\x6e\x84\x00\x84\x3a\x1e\x47\xf2\xff\x4e\x80\xa7\
+\x2e\xee\xc4\x99\xb7\x2c\x85\xb0\xc8\x73\x23\x07\xc7\xb9\x28\xd6\
+\xa7\xe7\xa1\x98\xe2\x64\xed\x3e\xd3\x84\x00\x57\x33\xa4\xa3\x42\
+\xc8\x82\x73\x0e\x03\x6e\x70\x12\xd6\x50\x32\x39\x01\x0d\x12\x52\
+\xcf\xc4\x01\xba\x26\xcc\x1f\x6e\x80\x3c\x89\xa0\x27\x68\x60\x4e\
+\x90\x1c\x04\x0f\x01\x3c\xc4\x64\x98\xd8\xd9\x71\x29\xba\xd9\xc5\
+\x10\x95\x11\xe0\x85\x6b\x53\x58\x78\x6d\x20\x3f\xf3\x46\x09\x01\
+\x9c\x62\x38\xc6\x8b\xdc\x35\x1b\xa2\xc8\x58\xf2\x1e\x40\x00\x14\
+\x4e\x90\xdc\x80\xcb\x47\xf0\xe7\x3c\x46\xd7\x75\x18\x9a\x96\xf3\
+\x20\x9d\x33\x12\x27\x09\x3d\x35\x06\x75\xa4\x07\x7a\xa2\x0f\xae\
+\x00\x03\xf3\xe4\x6f\x37\x14\xf1\x3a\x35\xdf\xe8\x58\x81\x04\xca\
+\x98\x0b\x65\x8d\xb9\x72\x0f\x97\x8b\x69\x82\x63\xc6\xb9\x89\x82\
+\x63\xc7\x78\x61\x58\x2d\xb7\xfa\x8b\x8c\x35\x21\xc9\xf9\x3e\xcd\
+\xf4\x96\xd4\xa7\xe2\x48\x34\xc6\x63\x0b\x95\x0f\x3f\xd9\x0b\xd4\
+\xd7\x00\xb3\x2e\x85\xde\x34\x97\x9c\xec\x03\xe8\x43\xab\xc1\xb3\
+\x06\xd4\x38\xae\xc8\x8c\x88\x55\xa2\x1b\x5f\x63\x0b\x50\xd2\x24\
+\x94\x35\x0e\x88\x89\x04\x78\x01\x81\xa2\xd7\x45\x31\x91\x8a\x7c\
+\xd6\xb1\x7e\xb6\x69\x5a\x1a\x48\x1c\x01\x0e\xbf\x0f\xd7\xbe\x35\
+\xa8\x5a\xba\x02\x9e\xe9\xcb\x00\x96\x1f\x0a\xce\xbe\xda\xf3\x38\
+\x4e\x00\x3e\xaf\x00\x42\x4c\x70\xdd\x22\x33\x69\x79\x44\xd9\x87\
+\xe7\xe5\xbd\x80\x50\xfe\xb3\xed\x6b\x79\x11\x0e\xbc\x09\xac\xbd\
+\x13\x7a\x66\x16\x52\x43\x02\xe9\x61\x01\x35\x29\x98\xa1\x62\x49\
+\x25\x04\x28\x7c\x38\xce\x8b\xcc\x6c\x31\x61\x8e\x91\x38\x2f\x15\
+\x5a\x93\x08\x13\x27\xf2\xe9\x31\xe4\xec\x93\xd5\x30\x12\x5e\xa4\
+\x8f\x9a\xe4\xf3\xb7\x42\xc0\x5f\x81\x1c\x20\x0a\xc9\xd8\x84\x4a\
+\x92\x71\x1e\x97\x0a\x25\x5e\x46\x9c\x42\xf1\x6c\xf2\xf6\x44\x31\
+\xdd\x2c\xaf\xd6\x23\xc3\xb2\xcf\x2d\x40\xa1\xdb\x15\x78\x41\xb1\
+\xd8\x75\x1e\x17\x0f\x95\xc2\x44\x59\xc6\xc3\xe2\x83\x44\x3e\x8c\
+\x02\xe3\x1a\x84\xc5\xbc\x72\x02\x40\x14\xcd\xe8\x36\x81\xe3\x4d\
+\x88\x45\xae\x17\x92\x2d\x1c\x1f\x1b\x70\x90\x77\x98\xa1\x43\xa0\
+\xd2\x02\x08\x41\x30\x8e\x3d\xa3\x17\x86\x4a\xf9\x24\xc8\x8f\x31\
+\x29\xc6\x4b\x90\x27\x13\xa6\x07\x4c\x9c\xb7\x0a\x09\xe0\x24\x5b\
+\xbe\xd4\x95\x5f\x03\x94\xff\xac\x42\x0f\x8b\xf5\x03\xa9\x51\x94\
+\x34\x43\xb7\x89\x57\x38\x04\x2c\x18\x05\x0f\x57\x9e\x4c\x91\x6b\
+\x28\xa8\x26\xc5\x45\x8d\x1d\x2e\x4f\x1e\xc8\x2f\x93\xe1\x14\xa0\
+\x12\x65\xd0\x41\xb6\x10\x45\x32\x36\x6c\xa2\xb9\x7e\x10\x98\x75\
+\x0e\x6e\x9d\x13\x60\xf7\x4d\x9a\x10\xcb\xcf\xbc\x33\x09\x02\x36\
+\x44\x25\x04\x40\xc9\x44\x35\xb9\x10\xb0\x88\xb1\x63\x24\x6e\xc2\
+\x3e\xb6\xbf\x27\x6a\xce\xfc\x08\x8e\xd5\x04\xd7\x2d\xe2\x16\x2a\
+\xe4\x01\x65\x56\x7a\x0e\x22\xc5\x88\x95\x12\xc3\xea\x73\x0a\x87\
+\x58\x5f\x01\xf9\xb2\x66\x38\xca\x60\x25\x05\x28\x1f\xdb\x4e\x21\
+\x9c\x64\x0a\x3d\xc2\x26\x6e\x0b\x64\x58\xe0\x40\x9c\xc8\x67\x88\
+\xbc\x54\xe4\x7d\xb5\x74\x15\x70\xa0\xd2\x2b\xc1\x82\x38\xb7\x60\
+\x93\x13\xff\xdb\x0b\x2c\x62\xc2\xe1\xe6\x36\x59\x82\xe3\x38\x7e\
+\x88\xc8\x0f\x03\xb2\x35\x54\x58\xe0\x28\x67\xf6\x3a\xc0\xf6\x82\
+\x0a\xaf\x04\x3d\x55\x40\xfd\x09\xf9\xa7\xd1\xd3\x40\x26\x0c\x24\
+\x8f\x02\x5a\xd2\x99\xe8\xec\x58\x2e\x14\x88\x39\x12\xa3\x53\xa8\
+\x78\x6f\x9e\xbc\x64\x3d\x3d\xb3\x45\xb0\xfd\xba\x74\x15\xb0\xcb\
+\x60\xe5\xd6\x01\xb6\x08\xfe\x29\xc0\xdc\x4b\xe1\x34\x91\x17\x61\
+\x6c\x2f\x10\xfa\x28\xe7\xbe\x85\xee\x4f\x10\x13\xfa\x84\xc3\xe5\
+\xf3\x6d\xe2\x90\x93\xbc\x4d\xd6\xd9\xf2\x12\xcc\xac\x24\x58\xe9\
+\x75\x80\x23\xbb\x17\x1a\x03\x82\x2d\x79\xb4\x5f\x98\x17\xe0\xe0\
+\x6b\xc0\x48\xa7\x33\x1c\x18\x01\x36\x79\xb3\xb5\xc9\x9b\x33\x7f\
+\xd4\x72\xfb\x32\x02\xc0\x1e\x53\x72\x1d\x20\x08\x15\x4d\x82\xb0\
+\x50\xce\x6a\x3a\x80\xd3\x6e\x05\xce\xb8\x17\xa8\x9e\x3e\x21\xce\
+\xed\x7c\x60\x9f\x5b\xe4\xb3\x16\x79\x09\xd4\x5a\x90\xca\x80\xa1\
+\xf8\xcb\x90\xa8\x64\x15\xc0\x24\x19\xdf\x50\xca\xaf\x32\xea\xe7\
+\x01\xe7\x2c\x07\x3a\x2e\x73\x84\x84\x0d\x93\xfc\x41\x22\x1f\xb2\
+\x49\x95\x03\x2b\x2d\x82\x30\xf4\xca\x57\x01\x22\x6a\x27\xaa\x48\
+\x0f\xb0\xee\x6e\x40\xe8\xf9\x73\x6f\x35\x10\x6c\x26\xb2\x27\x02\
+\xd3\x96\xd1\x79\x7d\xc1\x76\x22\x4e\xba\x01\xa8\x9b\x03\xec\x5c\
+\x09\x18\x9a\x95\x00\x09\x89\x03\x80\x62\x91\x17\x93\x00\x8e\x44\
+\x68\x1b\xb7\xa7\xad\x20\x1c\xb8\xe6\x8c\x16\x51\xe9\x32\x88\x89\
+\xe5\x4f\x07\xb2\x61\xc2\x30\x30\xba\x1d\xe8\x79\x16\x68\x5c\x04\
+\xcc\xfe\x33\xa0\xba\x1d\x0e\x6b\x39\x17\xf0\x90\x58\x9d\x14\x16\
+\x9a\x0a\x24\x7b\xec\x99\x17\x25\x92\x9c\x70\x10\x76\x92\x66\x13\
+\x20\x9c\x1e\x90\xfb\x55\xb1\x10\x60\x02\xce\x9a\x3f\x59\x19\xb3\
+\xb6\xba\x47\xb6\x00\x9b\x7f\x00\x7c\xb2\x8a\xba\xb2\x70\xd8\x94\
+\xc5\xc0\x92\xfb\x81\x74\x9f\x49\xbe\x78\xcc\xdb\xfd\xc7\x17\x1a\
+\xa6\xd9\x65\x90\x50\xa9\x24\x08\x51\x58\xd7\x6d\xf2\x85\xab\x3e\
+\x53\x88\x81\x35\x24\xc4\x1d\x40\x6a\x10\x0e\x6b\x3a\x13\x38\xf5\
+\xfb\x05\x64\xcb\x82\x4d\x1a\xff\xce\x7e\xf6\x3b\x5d\x09\x5a\x04\
+\xfd\x8d\x40\xfb\x05\x80\xbb\x2a\x17\x6f\x48\x0f\x01\xf1\x83\xc0\
+\x78\x17\x60\xa8\x13\x44\xa0\x36\x75\x18\xd8\x4a\x22\x2c\x79\x10\
+\xa8\x99\x8b\x4f\x6d\xfe\xdf\x00\xa3\x1f\x00\x87\x9e\x01\x50\x26\
+\xfe\x51\xc2\xf5\x25\x47\x9e\xc8\x83\xeb\xf6\xed\xa2\x32\xeb\x00\
+\xe7\xcc\xfb\xea\x80\xd6\xb3\x60\xdb\x52\x02\xf2\x2b\xc1\xa1\x77\
+\x80\xbe\xd5\x74\x1c\xb1\x17\x3b\x5a\x14\xd8\x7e\x17\x89\xf0\xcf\
+\x4e\x11\xce\x7c\x04\x18\x79\xd7\xac\xfd\xc5\xe3\x9f\x17\xf5\x4f\
+\x27\x69\xc9\x3e\x17\x10\x16\xf1\x8a\x87\x80\xed\xee\x93\x9a\x3b\
+\x08\xb4\x5f\x05\x9c\xf5\x53\xa0\x71\xa9\xf3\xe5\x66\x7c\x2b\xb0\
+\xfe\x72\x40\x8b\xd9\xe3\x3d\x0d\xa4\xdd\x4f\xca\xd7\x7c\x66\xb7\
+\x36\x8a\x84\x06\x9b\xc4\xa1\x2a\x23\x80\x73\x25\x58\xd2\x3c\xf5\
+\xc0\xe2\xfb\x80\xb6\x2b\xf2\x5e\x90\xd8\x07\x28\x47\x80\x54\x0f\
+\xb0\xfd\x56\x38\xac\xfd\x5a\xa0\xe1\xb4\xcf\x50\xfb\x4b\xc2\xb1\
+\x12\x14\xa2\x62\x02\x70\x0b\x02\x50\x62\x40\x78\x17\x30\xb2\x0d\
+\x48\x0e\x4e\xf2\x2d\x0c\x98\xfb\x5d\xa0\xf1\x4c\x20\x3b\x68\x3f\
+\x78\xff\x53\x74\xcf\x3b\x13\x86\x51\xe7\x29\xf7\x1d\x67\x22\x2c\
+\x71\xcc\x9c\xc4\x05\x2a\x97\x03\xec\xfa\x3f\xbe\x17\xd8\x70\x1b\
+\x00\xdd\x0a\x09\xeb\x05\xa9\xe3\x4a\x60\xc6\xc5\xce\xa5\xd9\xc2\
+\x1f\x11\xe1\xdf\x02\x91\x4e\xfb\x41\x77\xdf\x05\x5c\xb8\xd5\x1e\
+\xd7\x4a\x61\x13\x6c\x03\x92\xfd\xce\xd8\x67\x36\x0a\x63\xbd\x04\
+\x80\xcf\xb6\x27\xf8\xe0\x7d\x37\x2d\xdc\xf2\xf6\x4f\xa5\xd2\x55\
+\x80\xc0\x55\xe7\x92\x18\x84\x4c\x08\xd8\xfb\x18\xb0\xfd\x87\x80\
+\x91\x99\xf0\xc9\x6e\xe0\x0b\xbf\x06\x5c\x2e\x7b\x16\xe3\xdb\x80\
+\xd1\x89\x5e\x20\x03\xed\xdf\x2c\x3b\xf3\x4e\x14\xef\x17\xec\x33\
+\xe6\x80\xb7\x37\xf7\xae\x7e\x6b\xc3\xbe\x5f\x90\x08\xac\x68\x0e\
+\x28\xdc\xf3\x73\x2e\x90\xc6\x3a\x81\x0f\x6f\xb4\xfa\x2c\xab\x9e\
+\x0f\xb4\x5d\xe7\x8c\xe3\xfe\x5f\xc2\x61\xd3\xaf\x2e\x41\xba\x4c\
+\xdc\xa3\xe0\xdc\x0e\x83\xe3\xc9\x01\xe3\x8a\x9e\xed\xdc\x35\x38\
+\x7f\xc7\xee\xc1\x7f\x25\x11\x4a\x6f\x89\x81\x3b\x84\xb0\x77\x6f\
+\xf7\x00\x87\x9f\x03\xf6\xac\x84\xc3\xe6\xdd\xe5\x24\x37\xba\x06\
+\x30\xd2\xf6\xf5\xda\xc5\x80\x7f\x6a\x01\xe9\xe3\x24\x6e\x0b\x20\
+\x3e\x83\x07\x24\x33\x19\x43\x81\xfb\xce\xd7\xdf\xec\xba\xe6\x50\
+\xff\xd8\x43\xc5\xdf\x06\x09\x81\x16\xe0\x8c\x1f\x03\x17\x3d\x4f\
+\xed\x0a\x20\x38\x33\x4f\x3e\x3d\x80\x9c\xed\xa5\x9a\xaf\xc5\x27\
+\x78\xc1\xc9\x40\xcd\x7c\x9b\x94\x20\xf2\xd1\x0f\x9d\x49\x73\xca\
+\xd9\x85\xa4\x51\x36\xde\x0b\xc9\x33\x27\x71\x21\xb9\xe5\x63\x12\
+\x20\x95\xc9\x1a\x29\xdd\xc8\x8e\x45\x92\xb7\x3c\xbb\x7a\xeb\x3d\
+\x6b\x5f\x78\xf0\x9e\xc2\x3f\x8d\xf1\x7c\xe6\x5e\x72\x27\x50\x6f\
+\x12\x72\x01\x75\xd4\x9e\xbe\xc2\x76\x7b\x86\xfc\xe2\xe7\xc8\xab\
+\x70\xd8\xd4\x8b\x9d\x33\x1b\xdb\x0c\x87\xd5\x2e\x3a\x0e\xa2\x65\
+\x44\x80\x05\xfa\xb5\xcb\x77\xfa\x2f\x96\x3f\x70\xeb\xeb\x8f\x3d\
+\xfc\xc3\xef\xfc\xec\x27\xf7\x4e\x2f\x5a\x05\x32\x8a\xa2\x27\xd2\
+\x19\xff\xf6\x4d\x9b\x5e\x5a\xba\x74\xe9\x6b\xcf\xbc\xbc\xf9\xa1\
+\x0f\xff\x7b\xe5\xc8\xd9\x97\xfc\xc3\x2a\x47\x12\xac\x99\x0d\x54\
+\xb5\xc0\x61\xee\x1a\xe0\xe4\xef\x01\xdb\xbf\x6f\xf7\x8d\x6e\x00\
+\x3a\xbe\x39\xc1\x0b\x4e\x71\xba\x77\x66\x1f\x1c\x56\x75\xc2\xf1\
+\x91\x47\x89\xbe\x09\x25\x70\xe3\xa6\x2e\xcf\x86\xa1\xfd\x97\x37\
+\xd4\xd7\x5e\x3e\x73\x66\x8b\xf8\xea\xd5\x57\xec\x9a\x36\x6d\xda\
+\x7b\x55\x55\x35\xeb\x33\x59\xf5\x83\x7f\x7b\xe4\xe7\xa3\x39\x01\
+\x14\x4d\xe3\x14\x06\x7e\x90\x71\xce\xff\x76\x67\x77\xff\xb9\x2f\
+\xbd\xb1\xed\x71\xca\x07\xc3\x38\xfc\xa4\x2d\x80\x96\x29\xb2\xf9\
+\x71\x0a\x1c\x96\x19\x80\xc3\x7c\xcd\xce\x87\x56\x87\xe0\x30\x6f\
+\x4b\x59\x82\xe5\xc9\x3b\x63\x9f\x83\x61\x6a\x9d\xf7\xad\xda\x54\
+\xed\x02\x26\xb9\x5a\x87\x47\xa2\x6c\x6c\x3c\xb9\xa8\xb7\x6f\x68\
+\x91\x2c\xcb\xb7\xa9\xaa\xca\xe7\xcc\x99\x73\x7b\x4e\x00\x5d\xd7\
+\x59\x3a\x9b\x0d\x80\x6c\xc7\x8e\x1d\x83\x0b\x16\x2c\xf8\xbb\x35\
+\x6f\xef\x7c\xba\x65\x5a\xed\x73\x27\x9d\x30\x53\x0e\x72\xc3\xda\
+\xc1\xe9\x07\xd2\x47\x81\x40\x33\x1c\x96\x3c\x0c\xe7\x02\x5c\x86\
+\xc3\x5c\xb5\xce\x35\xbf\x91\x82\xc3\xe4\x2a\x1c\x97\xb1\xc9\xfb\
+\x46\xb2\x3e\xbc\x1f\xa9\xc3\xc1\x4c\x2d\x0e\x67\x6b\x30\x1e\x4b\
+\x5f\xa4\xeb\x49\xc4\x62\x31\x28\xe4\xe5\x84\x7d\xc4\xb5\x95\x73\
+\x5e\x6f\xf9\xe2\x2c\xf3\x17\xb8\x10\x8c\xf2\x40\x10\x96\x75\x77\
+\x77\x3f\x63\x18\xc6\xd3\xff\xf9\xf4\xba\xc0\x6b\x91\xb9\x72\x5a\
+\x78\x00\x6e\xfd\xe3\xc8\xf5\xb7\xe5\x57\x83\xb0\x2c\x3b\x0a\xec\
+\x7c\xc8\x49\xb0\xaa\x03\x0e\xd3\xe3\x70\xee\xef\x7b\x50\x60\xf6\
+\xfd\xc7\x65\xe3\x59\x37\x7e\xb5\xb7\x19\xd7\xbf\xbd\x00\xcb\xfb\
+\xcf\xc5\x7b\xb1\x99\xd8\xdc\xaf\xe0\xc0\xde\x2e\xd4\x25\xba\x51\
+\xa7\xf4\x3f\x5a\x53\x53\x73\xe1\xca\x95\x2b\x67\x90\x00\x4b\x67\
+\xcf\x9e\xdd\x23\x49\x12\xac\x6f\x7a\xcb\x05\xb2\x80\xcf\xd3\x94\
+\x55\x95\x46\x4c\x30\x12\xe0\x26\x55\x35\x4e\x5e\xfe\xd8\xda\xd3\
+\x3c\xb7\x5c\x86\xcb\x9b\xfa\xe0\x33\x5f\x7b\x93\x7d\x24\xf5\x26\
+\x60\xee\xd7\xf3\x1a\xf6\x3c\x01\xa8\x24\x82\x3c\xe1\xe1\x5b\x2e\
+\x83\xc3\x52\xbd\x36\x79\x46\x90\xeb\xe1\x30\x6d\x1c\x10\xc7\x21\
+\x82\x99\xe0\x46\xaa\xf0\xec\xee\xa9\xd8\x12\x9e\x06\x4d\xd7\x10\
+\x8f\x8f\x43\x44\xdf\xc3\xe5\x73\x0d\xcc\x59\xe4\xc3\x89\xb3\xda\
+\xe0\xad\x6d\xa6\x3c\x7d\x41\x5f\xfb\x95\xf7\x0c\x03\x10\x0f\x3f\
+\xfc\x30\x23\x5b\x2c\x44\x2e\x6b\x5f\x4d\x78\xc3\x75\xcf\xdf\x5f\
+\x83\xc7\xd6\xee\x6c\x4a\xa6\xd5\x16\xcb\x2d\x38\x01\x07\x0f\x1e\
+\x4c\xb7\xb5\xb5\x7d\x25\x1a\x49\x6c\x5d\xf1\xcb\xdf\x36\xc9\x37\
+\x7e\x11\x97\x64\x87\xe0\x96\x00\x16\xeb\x07\xdb\xfe\x2f\x80\x79\
+\x2c\xe3\xd3\xed\x6c\xc6\xac\x87\xdf\xf9\x03\xe0\xc0\xa3\x66\xc9\
+\xcc\x23\xfc\x2e\xc0\x27\xb8\xaf\x6f\x0e\x1c\xa6\x5a\x02\x38\x45\
+\x98\xb4\x6f\xf3\x60\x10\xab\xb6\x35\x63\xd3\x61\x2f\xa2\xd1\x08\
+\x62\x91\x8f\xf1\xa5\x39\x0a\x7e\x74\x9e\x84\xf3\x17\xce\x04\xab\
+\x9b\x87\x3d\x83\x40\x64\xe8\x10\xa2\x07\x3b\x11\xee\xdd\x79\xf0\
+\x9d\x70\xf3\x01\x00\x7c\xc5\x8a\x15\xcb\xc8\x1b\x3c\x24\xc0\xeb\
+\x00\x72\xa5\xca\xd5\xd8\x58\x23\x65\x15\xad\xdf\xd0\x35\x0e\xa0\
+\x86\x90\x26\x68\x04\x31\xbb\xbf\xff\x70\xf4\x84\xa6\xeb\x87\x8e\
+\x8c\xac\x59\xf1\xe4\x26\x96\xb9\xfa\x6a\x9c\x6f\xbc\x08\x8f\xac\
+\x41\x96\xcd\x4a\x48\xa0\x56\xa6\x96\x59\xe7\x8c\x13\xc2\x5d\x60\
+\x11\x82\x9c\xaf\x9c\x29\x5d\xc6\xa1\xb1\x00\x8e\xc4\x3c\x18\x8a\
+\x7a\x10\x7a\xf5\xbf\x10\xd3\xd7\x21\xcd\xa6\x23\x65\xd4\x01\x24\
+\x6c\x2d\xef\x40\x8d\xcf\xc0\xd4\x6a\x0d\x73\x9b\x32\x58\x36\x23\
+\x85\x29\x7e\x1d\xa6\x0d\x27\xdc\xd8\x70\xb0\x1a\x2f\x75\x4d\xc1\
+\xc7\x83\x12\xc2\xe1\x30\x22\xe3\xe3\xf8\x8b\xa5\xc0\x03\x37\x07\
+\x70\xe2\xbc\x2f\xe4\x12\xb1\x88\x1d\x81\x31\xb4\x1d\x91\x7d\x31\
+\xa4\x14\x91\x4f\x37\x6e\xb7\x35\x45\x60\x2d\x2d\x2d\x17\x9b\xf9\
+\x80\xec\x79\x58\xe6\xba\xfd\xde\x55\x1c\x5e\xff\x12\xa8\x59\x93\
+\xfc\x14\x42\x15\x21\x46\xc8\x10\xf8\x99\xd3\x47\xd7\x6d\x3c\x5c\
+\xf7\x60\x6f\xdf\x91\xfb\x1f\x7e\x49\x42\xf4\x4f\xaf\xc2\x32\x75\
+\x35\x3c\x2e\x1d\x2e\x57\x9e\xbc\xcb\x12\x81\x13\xdb\x50\xda\x8b\
+\xc1\xb8\x17\xfd\x51\x1f\x8e\x24\x83\xd8\x3f\xec\x42\x6f\x48\x43\
+\x3a\x93\x45\x36\x9b\x85\xaa\x66\x20\x44\x1a\x3e\x5f\x06\x81\xc0\
+\x28\x82\xf2\x18\x3c\x48\x23\x6f\x12\x09\xe4\x42\x46\xf7\xc0\xef\
+\xaf\xc7\xec\x66\x2f\x3d\x5a\x35\x14\xe1\x43\x86\xee\x1f\x0a\x8d\
+\x20\x3c\x36\x86\xa0\x17\x78\xed\x8e\x7a\x5c\xf2\x27\xe7\x03\xb5\
+\x27\x43\x28\x29\x18\x07\xd7\xe6\x04\x10\x06\xc0\x49\x79\xc1\x04\
+\x84\xe0\x74\xec\xca\x15\x5f\xf3\xbb\xeb\xeb\xeb\xaf\xef\xeb\xeb\
+\xcb\x80\x6e\x77\xbe\x0d\x2a\xf4\xe9\x00\xb7\x50\x47\xf0\x13\xa2\
+\x9b\x81\x44\xbb\x0e\x76\x61\x7b\xf4\xb9\xf7\x0e\xd7\xce\x3e\xd4\
+\x37\xf0\x97\x4f\xbc\xc9\xb0\xff\xa4\xf3\x35\x79\x74\x4b\xca\x60\
+\xae\xa0\xaf\xaa\xc6\xe5\xae\x9e\x82\x81\xa8\x84\x81\x31\x8e\x68\
+\x3c\x8d\x54\x2a\x83\x44\x32\x8d\x80\x34\x88\x93\x5a\x75\x5c\xbb\
+\x54\xc2\xbc\x19\x40\x5b\xb3\x84\xf6\xd6\x20\x9a\xbf\xf4\x22\x24\
+\x33\x51\xba\x48\xf3\x9d\x37\x83\x99\x9b\x26\xba\x02\x28\x49\x30\
+\x35\x85\xa7\xd6\xeb\xb8\xf1\x3f\x52\x18\x19\xe1\x85\xc9\x9e\x01\
+\xab\x6f\x0b\xe0\xbc\x2b\xbe\x05\xe1\x69\x82\x48\x0e\x43\xdb\xf7\
+\x12\x90\x49\x12\x61\x19\x0c\xc8\x91\xe7\xd6\x96\x92\x90\x68\xa6\
+\x00\xf6\xca\x2b\xaf\xdc\x10\x08\x04\x66\x47\xa3\xd1\x55\x20\x5e\
+\xc5\x0a\x8a\x8b\x10\x24\x34\x10\xbc\x84\x64\x73\x10\x89\xf3\xe7\
+\x81\x35\x04\x51\xfb\x9b\xfd\x0d\x77\x29\xdc\xfd\xdd\xd6\xd6\x56\
+\xf4\xf7\xf7\xa1\x2a\xe0\x05\x37\x34\x84\x86\x23\x30\x0c\x8e\x69\
+\xb5\x14\x87\xf3\x25\x9c\x3b\x8f\xe1\x82\xa5\x4d\x68\x9f\x3d\x8b\
+\x2a\x5c\x13\x98\xbf\x01\xcc\x5b\x0b\xe6\x0e\x82\x41\x03\xb8\x92\
+\x03\x33\xb2\x10\x6a\x14\x2c\x3d\x08\xa4\x87\x73\xdb\xec\x4c\xcb\
+\xe2\xd0\x51\x81\xb3\x97\xd7\x62\x24\x1c\x01\x59\x6e\xc6\x3b\x1a\
+\x25\xec\x09\x01\xa7\xb5\x09\x7c\xf0\xb3\x0b\x20\xd1\xeb\x37\x4f\
+\x47\xa0\xed\x79\x06\x22\x9b\xb4\x37\xaa\x75\x81\x4d\x07\x38\x14\
+\x8d\x83\x09\xae\x27\x1b\x16\x2f\x7c\xba\xa7\x4e\x27\xf2\x5b\x3e\
+\xfa\xe8\x23\xcf\xc0\xc0\xc0\xa9\x00\x7a\x8b\xed\x07\xe8\x84\x38\
+\x41\xb5\x44\xa8\x1d\x4e\x22\xf0\x7a\x17\xa2\x27\x35\x23\x7c\xde\
+\xac\xc8\x9d\xef\xf6\x35\xb3\xde\xde\xde\x9b\xcd\x58\x22\x6f\xb4\
+\x66\x85\xe1\x9c\x39\xae\xc8\xbd\x5f\x9f\xe5\x9f\xb5\xe8\x42\x6f\
+\xb0\x75\x21\x73\xfb\x82\x48\x0b\x05\xc4\x90\xa0\x10\x31\x82\xaa\
+\xd0\x61\x14\x3c\xd9\x9f\xdb\x2c\x91\x94\x10\x24\x3d\x01\x99\x09\
+\xc8\x42\x40\x12\x66\xcb\xd0\x3d\x5c\x0d\x0e\x39\x37\xdb\x37\x9e\
+\x03\x7c\xeb\x6c\x50\x68\x00\x7f\xfd\x42\x2d\x66\x34\x24\x10\x97\
+\xdb\xe0\x4a\x2b\x48\xed\x5a\x0d\x91\xce\xd0\x7d\x66\xfc\x09\x08\
+\x9d\x23\x95\x11\x54\x1a\x01\xb3\x27\x65\xf8\x1e\x79\x64\x7d\xba\
+\xba\x75\x7a\xfd\xbf\xf7\xf4\xf4\xd4\x11\xf9\x1b\x4c\xf2\xe5\x36\
+\x44\xb8\x15\xff\x23\x04\x45\x00\x8d\x29\x15\x53\x3b\xfb\x11\xdb\
+\xd6\x2f\xc6\x5b\x1b\x95\xef\x69\x9a\x36\x04\xe0\xdb\x84\x36\x02\
+\xbc\x6e\xb9\x77\xd9\x89\x35\xf7\xb6\x5f\xf9\xe8\x75\x35\x53\x5a\
+\xda\x54\x25\x2d\xa5\x33\x09\xb7\xa6\xa6\x5d\x4a\x72\x14\xa3\xfd\
+\xbd\x99\x70\xff\xc7\x6e\x23\xbe\xbf\x5a\x36\xe2\xbe\x80\x57\x54\
+\x79\x3d\xc2\x13\xf0\x08\x29\xe0\x61\xb9\xca\xe2\x22\xb8\x19\xc0\
+\x0d\xe0\xdd\x81\x39\x48\x24\xba\x30\xb3\x1e\x5b\x82\x6e\xec\x79\
+\x6d\x07\x6a\x3d\x2e\x51\x27\x04\x3f\xef\x70\x18\xfa\xc7\x3d\x11\
+\xc9\x88\xbf\x2a\xf3\x78\x04\x01\xb7\xcc\x3c\x4c\x80\x71\x01\x45\
+\x15\x62\xdf\x30\xd4\xa3\x09\x36\x7a\x28\xea\xde\xf8\xe1\xa0\xdf\
+\x35\xeb\xc4\xa6\xd5\x54\xd1\x9a\xf7\xee\xdd\x7b\x37\x80\x5f\x1d\
+\xeb\x8e\x90\xb0\xbc\x60\xdc\x6a\x1b\x09\x0d\x02\x08\x1c\x09\x8f\
+\x87\x01\xac\x90\x65\xf9\x9f\x7c\x3e\xdf\xf6\x54\x2a\xb5\xd0\xe3\
+\xf5\xbe\xdc\x71\xfa\xd5\xef\xcf\x3e\xe5\xec\xaf\x09\x2e\x06\x0c\
+\x43\x53\xe2\x91\x70\xf7\xde\x1d\x1b\x77\x6f\xfc\xcd\x93\xa3\xaa\
+\x9a\xf6\x41\x57\x7d\x86\x11\x0c\x08\xdd\x5b\x25\xb8\x56\x45\xa1\
+\x13\x64\x42\xaf\x97\x99\xde\xe0\x96\x8c\xda\x6a\x9f\x41\x2d\x0f\
+\xc6\xa4\x99\xf3\x3b\xfb\xa4\x2a\x55\x51\xe2\x0b\xe6\xe0\x0e\x83\
+\x23\xab\xab\xf0\x65\x54\xe1\xf3\xbb\xb8\xa7\xfb\x88\xb1\x64\xcd\
+\x3b\x9d\xcf\xca\x2e\xd6\x00\x78\x83\x0c\xc2\xc7\x60\xb8\x05\x87\
+\x94\x48\xc3\x08\xa7\xb8\x72\x24\x2a\xbc\x9a\x67\xda\x17\x3b\xe6\
+\xcc\x98\xd1\xd5\xd5\x95\x08\x85\x42\xf7\x00\x78\xf4\xb3\x6c\x89\
+\x19\x84\x84\x25\xc2\x14\x0b\x33\x08\x11\xc3\x30\xc6\x1a\x1a\x1a\
+\xb6\x64\x32\x99\x85\xfe\x40\x70\xd7\x57\x6e\xbc\x77\x9a\xcb\xed\
+\x35\xb3\xed\xfb\x5d\xbb\xf7\xbc\xb1\xa3\x73\x6b\x94\x43\x97\x1a\
+\x4f\xfa\x32\xe3\x5c\x65\xa4\x89\xc4\xf5\x2c\x33\xd4\xb4\xa4\x2b\
+\x29\x49\x57\x93\x32\x65\x6f\x59\xa3\x96\x67\x53\xee\x31\x2d\xed\
+\x19\x1c\x63\x0b\xdd\xcd\xcb\x1e\xdd\xd9\xf5\x3a\x24\x86\x07\x3b\
+\xa6\x62\x9b\x00\x1d\x6a\x90\xb8\x4c\xe9\xc4\xa5\xde\x3e\x2c\xd8\
+\x5b\x4f\xae\x1f\x9b\x75\xe1\xb2\x59\xcf\xb7\x34\xf8\xd3\xe3\xb1\
+\xd4\xb4\xd1\x68\xfa\x84\x70\x4c\x9f\x6f\x48\xfe\x99\x9e\x40\x5d\
+\xa3\xab\xc6\x1f\x8c\x86\xc3\xea\xce\xee\xf7\x5e\xd6\x75\x7d\x39\
+\x80\x5d\x04\xed\xf3\xfc\xaf\x31\x66\x89\x55\x4b\x98\x6a\x95\xca\
+\x24\xd5\xd5\x9b\xa8\x26\xdf\xd6\xdc\xdc\xfc\x0d\x7a\x87\x50\xd2\
+\xe9\x74\xe2\x8d\x37\xde\xd8\x3d\xc9\x96\x86\x80\x05\xd3\x98\x10\
+\x9c\xc3\xe0\x42\x37\xe8\x48\xe5\x86\x9a\x11\xdb\xb6\xed\xa8\x86\
+\xb7\x7a\xed\xde\xbd\x9f\xcc\xeb\xec\xec\xdc\x0e\xe0\x4c\x82\xfe\
+\x8f\x00\xd6\x2d\x06\x4b\x8d\x83\x45\x63\x90\x7b\x13\xec\x2c\xba\
+\xf3\x79\xb7\xdb\xdd\xec\xf5\x7a\x55\x6a\x99\xcb\xe5\x72\x93\x81\
+\xc8\x1a\xf1\x78\x7c\xbf\xa2\x28\x6b\x01\xfc\x5a\x08\xd1\x5d\x40\
+\xbc\x9c\x07\x94\x08\x09\x8d\x10\x21\x28\x84\x26\xc2\x14\x55\x55\
+\xe3\xe6\xba\x9a\xda\xa6\x97\xc9\xc8\x2b\x38\x00\x97\x53\x00\xe7\
+\x9f\x3d\x18\x63\x1c\x8c\x41\xa2\x1f\x78\xdc\x02\xf0\xf1\x77\x37\
+\x7c\xd4\xee\xf7\x57\x3d\x91\x88\xc6\xe6\x6d\xdb\xb6\x6d\x14\xc0\
+\x35\xd6\x78\x99\x04\x90\xf0\x31\x64\xab\x2a\xd5\xe4\x77\x54\x70\
+\x0b\xe5\xa1\xb3\x08\xb5\xd6\x73\x85\x09\xfb\x09\xa6\x70\x7d\xd6\
+\x62\x4e\x54\x66\x57\xb8\x30\x24\x92\xd6\x97\x66\x69\xc6\x37\x92\
+\x00\x4a\x22\x91\x38\xe3\xc0\x81\x03\xaf\x51\x79\xe4\x74\x2e\x13\
+\x49\x13\x92\x55\x21\x72\xe4\xf3\x13\x2f\x0c\xab\x95\x48\x2c\xb1\
+\x6e\xdd\xba\x36\xba\x7e\x3d\x2d\x4f\xbf\x73\xe8\xd0\x21\xff\xa6\
+\x4d\x9b\xc6\xe9\xda\x5f\x01\xc8\x12\xda\x26\x7c\xa7\x36\xc1\x0b\
+\x93\x84\xdd\x84\x4e\x42\x8a\x90\xb1\x26\x45\x2f\x47\xba\x74\x08\
+\x1c\xff\x7d\x32\x21\xe0\xf1\x78\xbe\x4d\x1e\xb0\x9c\xc2\x60\xe5\
+\xa9\xa7\x9e\xba\x9e\x92\xa3\x9b\x5c\x93\x51\x82\xe4\xe4\x9a\x3a\
+\x09\xa2\x72\xce\x0d\x1a\x23\x28\x5f\xc8\xe3\xe3\xe3\x33\xfc\x7e\
+\xff\x29\x34\xe6\x22\x6a\x97\x51\x82\x62\x94\xa1\x0d\xea\xff\x10\
+\xc0\x2a\xc2\x51\x8b\x50\xc2\x2a\xc9\xb1\x1c\x51\x27\x41\x6e\x41\
+\xe0\x73\x1a\xab\xc0\xfd\x26\xae\x63\x8c\x3d\x4c\xa4\x6a\xab\xaa\
+\xaa\x86\x89\x58\x8a\xda\x0c\x09\x20\x3c\x79\xf3\xd1\xf5\x06\x42\
+\x8d\x39\xfb\xe4\x39\x88\x44\x22\xc6\xd0\xd0\x50\x2f\x79\xc2\x06\
+\x6b\x69\x3a\x60\x11\x4d\x12\xd2\x96\x08\x9a\x4d\xf6\x77\x63\x0c\
+\x95\xb3\x2a\xc2\x97\x09\xa7\x13\xda\x2c\xc2\x75\x04\x37\xe7\x5c\
+\xb2\x5e\x41\x23\x84\x83\x84\x6e\xc2\xfb\x84\x7e\x6b\xa6\x8d\x72\
+\x7f\xd6\xfb\x03\x10\xa0\xf0\xf3\x1c\xff\x0a\xc0\xf9\x17\x56\x81\
+\xdf\x13\xfb\x1f\x84\xaf\xe2\x02\x22\xe6\xe9\x93\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x0b\
+\x01\xad\xab\x47\
+\x00\x64\
+\x00\x69\x00\x67\x00\x69\x00\x6b\x00\x61\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x1a\
+\x08\xdd\xe1\xa7\
+\x00\x61\
+\x00\x63\x00\x63\x00\x65\x00\x73\x00\x73\x00\x6f\x00\x72\x00\x69\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x69\x00\x63\x00\x74\x00\x69\
+\x00\x6f\x00\x6e\x00\x61\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0e\x95\x57\x87\
+\x00\x6b\
+\x00\x33\x00\x62\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0b\x34\x2d\xe7\
+\x00\x61\
+\x00\x6b\x00\x72\x00\x65\x00\x67\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x0a\
+\x00\x00\x00\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x42\x42\
+\x00\x00\x00\x56\x00\x00\x00\x00\x00\x01\x00\x00\x22\x22\
+"
+
+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()
diff --git a/examples/widgets/animation/appchooser/digikam.png b/examples/widgets/animation/appchooser/digikam.png
new file mode 100644
index 000000000..9de9fb2f8
--- /dev/null
+++ b/examples/widgets/animation/appchooser/digikam.png
Binary files differ
diff --git a/examples/widgets/animation/appchooser/k3b.png b/examples/widgets/animation/appchooser/k3b.png
new file mode 100644
index 000000000..bbcafcfba
--- /dev/null
+++ b/examples/widgets/animation/appchooser/k3b.png
Binary files differ
diff --git a/examples/widgets/animation/easing/easing.py b/examples/widgets/animation/easing/easing.py
new file mode 100644
index 000000000..9989c81b5
--- /dev/null
+++ b/examples/widgets/animation/easing/easing.py
@@ -0,0 +1,260 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import easing_rc
+from ui_form import Ui_Form
+
+
+class Animation(QtCore.QPropertyAnimation):
+ LinearPath, CirclePath = range(2)
+
+ def __init__(self, target, prop):
+ super(Animation, self).__init__(target, prop)
+ self.setPathType(Animation.LinearPath)
+
+ def setPathType(self, pathType):
+ self.m_pathType = pathType
+ self.m_path = QtGui.QPainterPath()
+
+ def updateCurrentTime(self, currentTime):
+ if self.m_pathType == Animation.CirclePath:
+ if self.m_path.isEmpty():
+ end = self.endValue()
+ start = self.startValue()
+ self.m_path.moveTo(start)
+ self.m_path.addEllipse(QtCore.QRectF(start, end))
+
+ dura = self.duration()
+ if dura == 0:
+ progress = 1.0
+ else:
+ progress = (((currentTime - 1) % dura) + 1) / float(dura)
+
+ easedProgress = self.easingCurve().valueForProgress(progress)
+ if easedProgress > 1.0:
+ easedProgress -= 1.0
+ elif easedProgress < 0:
+ easedProgress += 1.0
+
+ pt = self.m_path.pointAtPercent(easedProgress)
+ self.updateCurrentValue(pt)
+ self.valueChanged.emit(pt)
+ else:
+ super(Animation, self).updateCurrentTime(currentTime)
+
+# PySide2 doesn't support deriving from more than one wrapped class so we use
+# composition and delegate the property.
+class Pixmap(QtCore.QObject):
+ def __init__(self, pix):
+ super(Pixmap, self).__init__()
+
+ self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix)
+ self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
+
+ def set_pos(self, pos):
+ self.pixmap_item.setPos(pos)
+
+ def get_pos(self):
+ return self.pixmap_item.pos()
+
+ pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos)
+
+
+class Window(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ super(Window, self).__init__(parent)
+
+ self.m_iconSize = QtCore.QSize(64, 64)
+ self.m_scene = QtWidgets.QGraphicsScene()
+
+ m_ui = Ui_Form()
+ m_ui.setupUi(self)
+ m_ui.easingCurvePicker.setIconSize(self.m_iconSize)
+ m_ui.easingCurvePicker.setMinimumHeight(self.m_iconSize.height() + 50)
+ m_ui.buttonGroup.setId(m_ui.lineRadio, 0)
+ m_ui.buttonGroup.setId(m_ui.circleRadio, 1)
+
+ dummy = QtCore.QEasingCurve()
+ m_ui.periodSpinBox.setValue(dummy.period())
+ m_ui.amplitudeSpinBox.setValue(dummy.amplitude())
+ m_ui.overshootSpinBox.setValue(dummy.overshoot())
+
+ m_ui.easingCurvePicker.currentRowChanged.connect(self.curveChanged)
+ m_ui.buttonGroup.buttonClicked[int].connect(self.pathChanged)
+ m_ui.periodSpinBox.valueChanged.connect(self.periodChanged)
+ m_ui.amplitudeSpinBox.valueChanged.connect(self.amplitudeChanged)
+ m_ui.overshootSpinBox.valueChanged.connect(self.overshootChanged)
+
+ self.m_ui = m_ui
+ self.createCurveIcons()
+
+ pix = QtGui.QPixmap(':/images/qt-logo.png')
+ self.m_item = Pixmap(pix)
+ self.m_scene.addItem(self.m_item.pixmap_item)
+ self.m_ui.graphicsView.setScene(self.m_scene)
+
+ self.m_anim = Animation(self.m_item, 'pos')
+ self.m_anim.setEasingCurve(QtCore.QEasingCurve.OutBounce)
+ self.m_ui.easingCurvePicker.setCurrentRow(int(QtCore.QEasingCurve.OutBounce))
+
+ self.startAnimation()
+
+ def createCurveIcons(self):
+ pix = QtGui.QPixmap(self.m_iconSize)
+ painter = QtGui.QPainter()
+
+ gradient = QtGui.QLinearGradient(0, 0, 0, self.m_iconSize.height())
+ gradient.setColorAt(0.0, QtGui.QColor(240, 240, 240))
+ gradient.setColorAt(1.0, QtGui.QColor(224, 224, 224))
+
+ brush = QtGui.QBrush(gradient)
+
+ # The original C++ code uses undocumented calls to get the names of the
+ # different curve types. We do the Python equivalant (but without
+ # cheating)
+ curve_types = [(n, c) for n, c in QtCore.QEasingCurve.__dict__.items()
+ if isinstance(c, QtCore.QEasingCurve.Type) \
+ and c != QtCore.QEasingCurve.Custom \
+ and c != QtCore.QEasingCurve.NCurveTypes \
+ and c != QtCore.QEasingCurve.TCBSpline]
+ curve_types.sort(key=lambda ct: ct[1])
+
+ painter.begin(pix)
+
+ for curve_name, curve_type in curve_types:
+ painter.fillRect(QtCore.QRect(QtCore.QPoint(0, 0), self.m_iconSize), brush)
+ curve = QtCore.QEasingCurve(curve_type)
+
+ painter.setPen(QtGui.QColor(0, 0, 255, 64))
+ xAxis = self.m_iconSize.height() / 1.5
+ yAxis = self.m_iconSize.width() / 3.0
+ painter.drawLine(0, xAxis, self.m_iconSize.width(), xAxis)
+ painter.drawLine(yAxis, 0, yAxis, self.m_iconSize.height())
+
+ curveScale = self.m_iconSize.height() / 2.0;
+
+ painter.setPen(QtCore.Qt.NoPen)
+
+ # Start point.
+ painter.setBrush(QtCore.Qt.red)
+ start = QtCore.QPoint(yAxis,
+ xAxis - curveScale * curve.valueForProgress(0))
+ painter.drawRect(start.x() - 1, start.y() - 1, 3, 3)
+
+ # End point.
+ painter.setBrush(QtCore.Qt.blue)
+ end = QtCore.QPoint(yAxis + curveScale,
+ xAxis - curveScale * curve.valueForProgress(1))
+ painter.drawRect(end.x() - 1, end.y() - 1, 3, 3)
+
+ curvePath = QtGui.QPainterPath()
+ curvePath.moveTo(QtCore.QPointF(start))
+ t = 0.0
+ while t <= 1.0:
+ to = QtCore.QPointF(yAxis + curveScale * t,
+ xAxis - curveScale * curve.valueForProgress(t))
+ curvePath.lineTo(to)
+ t += 1.0 / curveScale
+
+ painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
+ painter.strokePath(curvePath, QtGui.QColor(32, 32, 32))
+ painter.setRenderHint(QtGui.QPainter.Antialiasing, False)
+
+ item = QtWidgets.QListWidgetItem()
+ item.setIcon(QtGui.QIcon(pix))
+ item.setText(curve_name)
+ self.m_ui.easingCurvePicker.addItem(item)
+
+ painter.end()
+
+ def startAnimation(self):
+ self.m_anim.setStartValue(QtCore.QPointF(0, 0))
+ self.m_anim.setEndValue(QtCore.QPointF(100, 100))
+ self.m_anim.setDuration(2000)
+ self.m_anim.setLoopCount(-1)
+ self.m_anim.start()
+
+ def curveChanged(self, row):
+ curveType = QtCore.QEasingCurve.Type(row)
+ self.m_anim.setEasingCurve(curveType)
+ self.m_anim.setCurrentTime(0)
+
+ isElastic = (curveType >= QtCore.QEasingCurve.InElastic
+ and curveType <= QtCore.QEasingCurve.OutInElastic)
+ isBounce = (curveType >= QtCore.QEasingCurve.InBounce
+ and curveType <= QtCore.QEasingCurve.OutInBounce)
+
+ self.m_ui.periodSpinBox.setEnabled(isElastic)
+ self.m_ui.amplitudeSpinBox.setEnabled(isElastic or isBounce)
+ self.m_ui.overshootSpinBox.setEnabled(curveType >= QtCore.QEasingCurve.InBack
+ and curveType <= QtCore.QEasingCurve.OutInBack)
+
+ def pathChanged(self, index):
+ self.m_anim.setPathType(index)
+
+ def periodChanged(self, value):
+ curve = self.m_anim.easingCurve()
+ curve.setPeriod(value)
+ self.m_anim.setEasingCurve(curve)
+
+ def amplitudeChanged(self, value):
+ curve = self.m_anim.easingCurve()
+ curve.setAmplitude(value)
+ self.m_anim.setEasingCurve(curve)
+
+ def overshootChanged(self, value):
+ curve = self.m_anim.easingCurve()
+ curve.setOvershoot(value)
+ self.m_anim.setEasingCurve(curve)
+
+
+if __name__ == '__main__':
+
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ w = Window()
+ w.resize(600, 600)
+ w.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/animation/easing/easing.qrc b/examples/widgets/animation/easing/easing.qrc
new file mode 100644
index 000000000..7e112d3a9
--- /dev/null
+++ b/examples/widgets/animation/easing/easing.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+ <qresource>
+ <file>images/qt-logo.png</file>
+ </qresource>
+ </RCC> \ No newline at end of file
diff --git a/examples/widgets/animation/easing/easing_rc.py b/examples/widgets/animation/easing/easing_rc.py
new file mode 100644
index 000000000..aff458b1d
--- /dev/null
+++ b/examples/widgets/animation/easing/easing_rc.py
@@ -0,0 +1,403 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: ?? ????. 4 11:48:38 2011
+# by: The Resource Compiler for PySide (Qt v4.7.0)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x14\x1d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x2e\x00\x00\x00\x37\x08\x06\x00\x00\x00\x73\x60\x78\x64\
+\x00\x00\x13\xe4\x49\x44\x41\x54\x78\x9c\x62\xfc\xff\xff\x3f\xc3\
+\xdf\x7f\x7f\x99\x99\x99\x98\xff\x3e\x78\xf1\x58\x66\xe9\x9e\x55\
+\x09\x87\x2f\x9e\xb6\x79\xf7\xe9\xad\x98\xa4\xf2\x3f\x7e\x51\xb9\
+\xbf\xfc\xcc\x1c\x3f\xf8\xfe\xfd\xff\xc7\xca\xc5\xc6\xf7\x46\x9c\
+\x5b\xf6\x96\x24\xaf\xd2\x35\x29\x3e\xa5\xcb\xd2\xbc\x4a\xd7\xc4\
+\x78\x64\xef\x08\x70\x8a\x3e\x63\x63\x66\xff\xc5\x80\x05\xfc\x67\
+\xf8\xcf\xf4\xef\xff\x3f\x26\x06\x86\xff\x0c\x8c\x0c\x8c\xff\x19\
+\x19\x18\xff\x33\x30\x42\x69\x0a\x00\x00\x00\x00\xff\xff\x62\xfc\
+\xfb\xf7\x2f\x33\x13\x13\xd3\xdf\x59\x9b\x17\xa6\x54\xcf\x6d\xed\
+\x7d\xf3\xe6\x0d\x1f\x17\x2f\xdb\x7f\x7b\x2f\x61\x46\x59\x45\x4e\
+\x06\x86\x7f\x8c\x0c\x0c\xff\x99\x18\x18\x18\x18\x18\xfe\xfd\xff\
+\xc7\xf0\xe7\xdf\x6f\x86\x7f\xff\xff\x30\x30\x30\x30\x32\xb0\x30\
+\xb1\x32\x70\xb2\xf0\x7c\xe3\x63\x17\x7a\x26\xcc\x25\x75\x5f\x9c\
+\x47\xee\xa6\x04\x8f\xc2\x75\x09\x5e\x85\x9b\xa2\x5c\x52\xf7\x05\
+\x38\xc5\x9e\xb1\xb3\x70\xfc\xc0\x6e\xf5\x7f\xc6\x7f\xff\xff\x31\
+\xc3\x39\x24\x7a\x08\x00\x00\x00\xff\xff\x62\xfc\xff\xff\x3f\xc3\
+\xa4\xb5\xb3\x73\xf2\xbb\xf3\x26\x73\xf2\x09\xff\x63\x67\x63\xfb\
+\xef\x1e\x2c\xc4\x20\x21\xc3\xc6\xf8\xed\xeb\x3f\x46\x46\x88\x39\
+\x8c\x70\x0b\x18\x99\xfe\x33\x32\x30\xfc\x67\x60\x60\x60\xf8\xff\
+\xff\x3f\xd3\xbf\xff\x7f\x19\xff\xfc\xff\x03\xf1\xd0\xbf\x3f\x0c\
+\xff\x19\xfe\x33\xb0\x30\xb2\x32\xb0\xb3\x70\xff\xe5\x67\x17\x7e\
+\x21\xcc\x25\x79\x5f\x8c\x47\xee\xa6\x14\xaf\xe2\x75\x09\x1e\x85\
+\xeb\xa2\x3c\x32\x77\x85\x39\x25\x9e\x70\xb0\x72\x7d\xc5\xe7\xa1\
+\xff\x70\x4b\x19\xff\x31\x62\xf1\x10\x00\x00\x00\xff\xff\x6c\x92\
+\xbd\x0a\xc2\x30\x14\x46\xbf\x2f\x16\x7f\xd2\x06\x21\x83\xc6\x41\
+\xc5\x5d\x70\xec\xa8\xbb\xcf\xe2\x6b\xba\x76\x70\x28\xa8\x83\xe0\
+\xd6\xb1\x88\x20\x24\xf7\x3a\x88\x5b\x5e\xe0\x1c\x0e\x1c\x36\xb7\
+\xcb\x76\x7f\x3a\x9e\x85\xea\xe2\x87\xb2\xab\x4b\x53\x1f\xa6\x78\
+\xbf\x04\x66\x90\x03\x67\x4c\xa0\xfe\x0a\xa9\xc4\x7f\x8f\x64\xa2\
+\x44\x24\x89\x48\x1a\xa1\x2a\x30\x2c\x30\x2e\xac\xb8\x91\xef\xfc\
+\x24\x3c\x66\xe5\xf2\xba\x70\x9b\x36\x54\xeb\x76\x5e\xad\xee\xde\
+\x86\xa7\x1d\xba\x9e\x79\x0f\x45\xc5\x28\x94\x04\xf0\x05\x00\x00\
+\xff\xff\x62\x99\xbc\x76\x56\xee\xa7\xef\x5f\x79\xf9\xb9\xf9\xfe\
+\x32\xb2\xff\x65\x56\xd6\xe4\x62\xf8\xfd\xeb\x3f\x03\x23\x13\x51\
+\x8e\x66\x60\x60\x60\x60\xfc\xcf\xf0\x9f\xf1\xff\x7f\xf4\x18\x66\
+\xfc\xcf\xca\xc4\xf6\x9f\x8d\x99\x1d\xc9\x43\x0c\x8c\xff\xfe\xff\
+\x65\xfe\xf8\xe3\xb5\xc4\xbb\xef\xcf\x24\x6e\xbc\x39\x65\x01\xf1\
+\x10\x33\x03\x3b\x33\xe7\x7f\x1e\x36\xc1\xb7\x82\x9c\xe2\x0f\xc5\
+\x79\x64\x6f\x8b\xf3\x28\x5c\x97\xe4\x55\xb8\x2e\xce\x23\x77\x5b\
+\x98\x4b\xe2\x11\x0f\x9b\xc0\x3b\x26\x46\xa6\xbf\x30\xd3\x01\x00\
+\x00\x00\xff\xff\x62\x54\x89\x34\xbe\xfb\xf4\xed\x0b\x25\x86\xff\
+\xcc\xff\x85\x44\x58\x18\xbd\xc3\x45\x88\x76\x31\xb9\x00\x9a\x9e\
+\xff\x31\xa2\x79\xe8\xef\x7f\x48\x0c\xfd\xf9\xf7\x9b\xe1\xff\xff\
+\x7f\x0c\x8c\x8c\xcc\x0c\x6c\xcc\x1c\x0c\x3c\xac\xfc\x1f\x04\x39\
+\xc5\x1e\x89\x72\xcb\xde\x91\xe0\x51\xb8\x26\xc9\xab\x70\x03\x00\
+\x00\x00\xff\xff\xbc\xd1\xb1\x0d\x80\x30\x10\x03\x40\x3b\x05\x54\
+\x54\xb4\x91\x32\x0e\xa2\x65\xff\x45\xc8\xff\xdb\x54\x94\xb4\x8c\
+\x70\x3a\x6e\xe7\xb8\x01\x2f\x73\x1a\x7d\xac\x38\xae\x1d\x11\x06\
+\x3f\xbe\x7e\x00\x99\xa0\x5e\x90\xad\x56\x4e\x96\x02\xa9\x84\x5c\
+\x20\x1b\x1e\x00\x00\x00\xff\xff\xb4\x92\x21\x12\x00\x20\x0c\xc3\
+\xda\x5b\x81\xff\x7f\x98\xa0\x26\x70\x18\x2a\x73\x11\x11\x0d\x30\
+\xdd\xd6\xfb\x3d\xbe\x0c\x61\x81\x91\xae\x92\x72\xa8\x0c\x96\xbc\
+\x9b\x1d\x00\x00\x00\xff\xff\x94\x94\xb1\x0d\x00\x20\x0c\xc3\xdc\
+\x96\xff\x4f\x76\x19\xd8\x10\x42\x70\x40\x6c\x79\xc9\xd8\x96\x7f\
+\x22\x21\x33\xa8\x2a\x6c\xd1\x05\xc8\x08\xd6\x27\x34\xb6\x57\xc6\
+\x93\xe7\x10\x34\x01\x00\x00\xff\xff\x8c\x91\xc1\x0a\x80\x20\x10\
+\x05\x67\xdd\x35\xa5\xfe\xff\x3b\x83\x28\x41\xad\xad\x4b\x67\xeb\
+\xdd\x67\x18\x78\x36\x02\x46\xc1\x6a\x42\x9e\x8d\xbd\x1c\xac\x5b\
+\x21\x6a\x24\x4d\x09\x01\xaa\x37\x4e\xef\x68\x30\xb2\x2d\x04\x51\
+\xfc\xbe\x3e\xac\xef\xed\x3f\xf7\x00\x00\x00\xff\xff\x22\xd9\xe1\
+\xff\xff\x31\x30\x70\x70\x32\x33\x7c\xfb\xfa\x87\xe1\xf4\xc9\xc7\
+\x0c\x52\x5c\xea\x0c\x5e\x26\x3e\x0c\xc6\xaa\x86\x0c\xa2\x02\x22\
+\x0c\x8c\x8c\x0c\x0c\x5f\x7e\x7d\x60\x78\xf6\xe9\x1e\xc3\xb5\xd7\
+\x27\x19\xae\xbe\x3a\xc1\xf0\xf5\xf7\x27\x06\x6e\x56\x3e\x9c\x8e\
+\x67\x64\x64\x60\x80\x95\x4a\x4c\x8c\x4c\x0c\xff\xff\xff\x67\xf8\
+\x4f\xc0\x13\x00\x00\x00\x00\xff\xff\x22\xc9\xe1\xff\xff\x43\x1c\
+\x7d\xe7\xc6\x17\x86\xa3\xfb\xde\x32\x54\x84\x54\x30\x14\x85\x67\
+\x30\xb0\xb3\xb3\x32\xfc\x87\x54\xe9\x70\xb5\x5a\x62\x16\x0c\xae\
+\x2a\xd1\x0c\xcf\x3f\x3f\x60\x58\x73\x75\x22\xc3\xe9\x27\x3b\x19\
+\xb8\xd8\xf8\x18\x30\x8b\x4d\x06\x86\x5f\x3f\xff\x31\xb0\xb0\xb0\
+\x30\x30\x32\xfd\x65\xf8\xf6\xfb\x0b\x03\x0b\x13\x0b\x03\x2b\x13\
+\x3b\x5e\xc7\x03\x00\x00\x00\xff\xff\x22\x3a\x3b\xfe\xff\xc7\xc0\
+\xc0\xce\xc1\xc4\x70\xe3\xf2\x57\x86\x9d\x6b\x5f\x30\xcc\x2e\x9c\
+\xce\x50\x19\x97\xcb\xc0\xc2\xca\xc4\xf0\xf7\xdf\x5f\x86\xff\xff\
+\xff\xc1\x2b\x9b\x3f\x7f\x7f\x33\xfc\xfe\x03\x29\xd2\x24\x79\xe5\
+\x19\x72\x2d\xfa\x19\x42\x74\xf2\x19\xbe\xfd\xfa\xcc\xc0\x04\x2d\
+\x01\xfe\xff\x67\x60\x60\x65\x63\x64\x78\xf5\xec\x0f\xc3\x92\x59\
+\x0f\x18\x3c\xc4\x4b\x18\xba\xbc\x36\x32\xd4\xd8\x2f\x66\x30\x94\
+\x74\x64\xf8\xf1\xe7\x1b\x5c\x2d\x36\x00\x00\x00\x00\xff\xff\x8c\
+\xd4\x21\x0e\xc2\x40\x10\x40\xd1\x3f\x33\xbb\x75\x0d\x06\x01\x0e\
+\x53\x82\x44\x35\x58\x24\xa6\x12\x8d\x20\xe1\x04\x78\x6e\xc4\x01\
+\xb8\x0c\x69\x10\x08\x0c\x49\x31\x5d\xb6\x83\x42\x92\x70\x82\xff\
+\xd4\xff\x0b\xfe\x8d\x3c\xee\x99\xcb\xf9\xca\x69\x7f\x64\xbb\x6e\
+\xe8\x53\x42\x45\x31\x35\x44\x14\xd3\x80\x49\x20\x58\xa4\x08\x05\
+\x0e\x0c\xee\x64\xcf\x34\x8b\x03\x9b\xf9\x8e\xae\x7f\xa2\x62\xb8\
+\x3b\xaa\xc2\xad\x7d\x11\xbd\xa4\xae\x56\x8c\xe2\x94\x6a\xbc\x64\
+\x52\xce\x78\x0f\x09\xf8\xfd\xe4\x0f\x00\x00\x00\xff\xff\x22\x3a\
+\xc4\x19\x19\x99\x18\x0e\xee\x7e\xce\xa0\xa9\xac\xcb\x50\x16\x95\
+\xcb\xc0\xc0\xc0\xc0\xc0\xca\xc2\xc2\xc0\xc8\xc8\xc8\xf0\xff\x3f\
+\x24\x99\xdc\x78\x7b\x92\xa1\x66\x43\x3a\x83\x4f\x65\x04\xc3\xda\
+\x43\x5b\xa0\x21\xc6\x08\x0f\xb9\x10\xed\x3c\x06\x45\x41\x6d\x86\
+\x9f\x7f\xbe\x31\x30\x33\x31\x33\xfc\xff\xc7\xc8\xf0\xf4\xf1\x17\
+\x06\x6d\x25\x55\x06\x19\x51\x69\xa8\x63\x19\x18\xfe\x13\x51\x12\
+\x01\x00\x00\x00\xff\xff\x84\xd4\x2b\x0e\xc2\x40\x14\x46\xe1\xf3\
+\xdf\xa6\x4c\x05\xeb\x40\xa0\x50\x2c\x02\x0d\x49\x75\x05\x0e\xc9\
+\x1e\x58\x09\x8a\x2d\x90\x60\x70\x24\x78\x12\x14\x62\x12\x02\x02\
+\x0c\x8f\xb6\x77\xb0\x18\xc2\x0e\x8e\xf8\x72\xfe\x86\xa7\x04\x9d\
+\x20\xe2\xe9\x4d\x3c\xde\x99\x4d\x2a\x42\x5e\xd0\xb4\x0d\x92\xf0\
+\xe4\x48\xe2\x70\xdd\xb3\xd8\x4c\x89\xb6\xe5\xd6\xdd\x31\x9e\x97\
+\x2c\xd7\x2b\x4c\xc2\xdd\xf1\xd4\x92\x67\x81\x51\xaf\xa2\xf6\x1a\
+\x99\x78\x3d\xc4\xe5\xfc\x64\xd8\x1f\x00\x7c\xed\x34\xc3\x64\x98\
+\x0c\xfd\xe0\xf2\x01\x00\x00\xff\xff\x22\x1c\xe2\xff\x21\x65\xf5\
+\x8d\x2b\x1f\x19\x04\x84\xc4\x19\xfc\xad\x3d\x19\x18\x18\x18\x18\
+\x98\xa1\x2d\x30\x58\x64\x6e\xbe\x31\x8b\xe1\xdf\xff\xbf\x0c\xec\
+\x0c\x02\x0c\xa6\xe6\x92\x0c\x72\x9a\x22\x0c\x55\x33\xda\x18\xbe\
+\xff\x82\x84\x2e\x23\xb4\x08\x36\x94\x74\x60\x90\xe1\x57\x66\x60\
+\x62\xfd\xc5\xf0\xf2\xc5\x67\x86\xdf\x2f\xdf\x33\x58\xe9\x98\x20\
+\x2c\x63\x60\x60\xf8\xf5\xf7\x3b\xc3\xd7\xdf\x9f\x18\xbe\xff\xf9\
+\xca\xf0\xeb\x2f\xf6\x56\x31\x00\x00\x00\xff\xff\x22\xe8\x70\x26\
+\x66\x06\x86\x9f\xdf\x19\x18\xee\xdf\xfb\xc8\x60\xa9\x63\xc4\x20\
+\x25\x2c\x09\x0f\xe5\xff\x0c\xff\x19\x18\x19\x99\x18\x3e\xfc\x78\
+\xcd\xf0\xe0\xfd\x55\x06\x0e\x16\x2e\x86\x3f\xff\x7e\x33\xfc\xfe\
+\xf3\x87\x41\x53\x47\x90\xe1\xe1\xe3\xfb\x0c\x07\x2e\x1c\x85\x84\
+\xe6\xff\x7f\x0c\x7f\xff\xfd\x65\x60\x67\xe1\x64\xe0\xfd\x64\xc4\
+\xb0\x62\xfe\x43\x86\x64\xd3\x46\x86\xcd\x33\x76\x30\xb8\x98\x38\
+\x40\x03\x03\x52\xc8\x29\x08\x6a\x33\x98\xc9\xb8\x33\x68\x88\x98\
+\x30\x48\xf2\x28\x60\x75\x17\x00\x00\x00\xff\xff\xc2\x5b\x1c\xfe\
+\xff\xcf\xc0\xc0\xc2\xc2\xc8\xf0\xfe\xdd\x5f\x86\xef\xef\x7f\x30\
+\x58\xe9\x9a\x42\x1c\xf1\xef\x1f\x03\x13\x33\xa4\xbc\x65\x64\x64\
+\x64\x78\xf9\xe5\x21\xc3\x97\x5f\x1f\x19\xd8\x59\xb8\x20\xc9\xe2\
+\xef\x7f\x06\x61\x31\x36\x06\x06\xe6\x7f\x0c\xa7\xae\x9d\x63\xf0\
+\x34\x73\x85\xe7\x03\x06\x06\x06\x06\x4d\x51\x33\x86\x77\x8f\xfa\
+\x19\x54\xc5\xb4\x19\x34\xe5\xd5\x18\xfe\xfe\xfb\x0b\x75\x38\x24\
+\x16\x2d\x65\xbd\x19\x2c\x64\x3c\x19\x18\x19\x99\x18\x9e\x7f\xbe\
+\xcf\xd0\xb0\x2f\x02\xc3\x6d\x00\x00\x00\x00\xff\xff\xc2\x1f\xe2\
+\xff\x19\x18\x98\x98\x19\x19\xde\xbf\xfd\xcd\xc0\xf0\x8f\x99\x41\
+\x5f\x45\x8b\x81\x81\x81\x81\x81\x11\xde\x02\x83\x44\xed\x9b\x6f\
+\xcf\x19\xfe\xfc\xfb\xcd\xc0\xc8\xc0\xc8\xc0\xc8\x08\x49\xab\x9c\
+\xdc\x4c\x0c\xcc\x5c\x2c\x0c\x37\x1f\xdf\x83\xeb\x61\x64\x82\xe8\
+\xd3\x53\xd1\x64\xe0\xe2\xe3\x67\xf8\xf3\xf7\x0f\x6e\x8b\x09\x54\
+\x40\x00\x00\x00\x00\xff\xff\x22\x98\x54\x18\x19\x19\x18\x3e\xbc\
+\xff\xc5\xc0\xc4\xce\xc9\xa0\x20\x21\x07\x11\x83\x86\x1c\xcc\xe8\
+\x4f\x3f\xde\x42\x9a\xa1\x50\xfe\xbf\x7f\x0c\x0c\xac\xac\x0c\x0c\
+\xdc\xdc\xac\x0c\xcf\xdf\xbc\x84\x58\xc4\xc8\x04\xd7\x27\x25\x2c\
+\xc1\xa0\xa9\x26\xc5\x70\xf1\xfe\x25\x86\xa7\xaf\x9f\xc3\x43\x1a\
+\x06\xfe\xfc\xfd\xcb\xf0\xfb\xcf\x3f\x14\xbb\xd0\x01\x00\x00\x00\
+\xff\xff\x22\x5c\x73\xfe\x67\x60\xf8\xfc\xe9\x37\x03\x2f\x17\x37\
+\x83\x28\xbf\x30\xd4\x33\xd0\x4e\x15\x54\xc9\xb7\xdf\x9f\x51\x3c\
+\xc2\xc0\x00\xc9\x1b\x1c\x1c\x2c\x0c\xef\x3f\x7f\x82\xeb\xf9\x0f\
+\x0d\x49\x4e\x76\x4e\x86\x88\x28\x2d\x86\xd4\xce\x64\x06\x13\x69\
+\x17\x86\xc3\x53\x37\x32\xfc\xff\xff\x9f\xe1\x1f\xc3\x3f\x06\x66\
+\x46\x66\x86\xed\x37\x17\x32\xec\xba\xbd\x82\x41\x84\x5b\x92\x01\
+\xa9\xef\x80\x02\x00\x00\x00\x00\xff\xff\x7c\x95\x4d\x0a\x80\x20\
+\x18\x44\x9f\xf9\x43\x88\x50\xf7\xbf\x5b\x27\x88\x36\x2d\x34\x31\
+\xfd\x5a\xb8\x11\x8a\xf6\x03\xf3\x86\x19\x98\x7f\x70\xd5\x77\x9e\
+\x62\x21\xf8\x85\xe0\xc3\xa7\x2c\xdf\x91\xf1\x2c\x44\x7a\x53\xce\
+\x69\xe2\x95\x28\xb5\x60\xb5\x05\x81\x86\x30\x29\x85\xb7\x2b\xd6\
+\x18\x8c\x1e\x11\x7a\xf4\xd4\x4e\xf6\xbc\x91\xe4\xa0\xb6\x8a\xd3\
+\xf3\xcb\xf3\x01\x00\x00\xff\xff\x84\x97\xc1\x0a\x80\x30\x0c\x43\
+\x5f\xb7\xae\x9b\xc5\xff\xff\x57\xad\x16\x0f\x9e\x64\x03\xef\x21\
+\x79\x10\x08\xe4\x7f\xc7\x81\x88\x64\xb3\x41\x57\x5b\x6a\x22\x63\
+\x3a\x1e\x22\xa0\x5a\x38\xe2\xe4\xba\x63\x82\xf3\xb6\x93\x99\x7c\
+\x7b\x7a\x4d\x8a\x54\x9a\x0c\xac\x3a\x5d\x7d\x99\xf9\x00\x00\x00\
+\xff\xff\x22\xaa\x1c\xff\xfb\xf7\x3f\x03\x0b\x33\x33\x03\x13\x13\
+\x13\xb2\xf9\x70\x00\x69\xf5\xa1\xbb\x1c\x92\xb1\xff\xfe\xfb\x0b\
+\x75\x20\x2a\x60\x65\x62\x83\x26\x1d\x6c\x69\x18\xd2\x3a\xfc\xff\
+\xff\x1f\xce\x5a\x14\x00\x00\x00\xff\xff\x22\xb2\xad\x02\x29\xf6\
+\x18\x71\xf6\xe7\xb0\x97\x00\x8c\x50\x29\x6c\xb2\x4c\x8c\xc4\x0d\
+\x21\xe0\x02\x00\x00\x00\x00\xff\xff\x22\xca\xe1\x4c\x4c\x8c\x0c\
+\x7f\xff\xfd\x63\xf8\x87\xa5\x49\xca\xc0\xc0\x80\xbd\x5a\x86\x3a\
+\x98\x91\x11\x7b\xb9\x40\x69\xcf\x08\x00\x00\x00\xff\xff\x22\xaa\
+\x38\x64\x61\x85\xa4\xd5\xdf\x7f\x7e\xc3\x1d\x85\x0c\x58\x18\x59\
+\xb1\xb6\x9d\xff\xfd\xfd\xcf\xc0\xcc\xc4\xc4\xc0\x84\x65\x80\xe6\
+\xf7\xbf\x9f\xd0\xa2\x8e\xbc\x91\x38\x00\x00\x00\x00\xff\xff\x22\
+\x1c\xe2\x8c\x0c\x0c\xec\xec\x2c\x0c\xdf\x7e\x7c\x67\xf8\xf1\x0b\
+\x7b\xbb\x81\x95\x99\x1d\xc3\xfe\xff\x0c\x0c\x0c\x7f\xfe\xfe\x63\
+\x60\x65\x65\x65\x60\x61\x46\x76\x38\x24\xfc\x7f\xfc\xf9\x06\x2d\
+\x22\xc9\x03\x00\x00\x00\x00\xff\xff\x22\x58\x73\x32\x32\x32\x30\
+\x70\x73\x43\xfa\x96\x1f\xbf\x7e\x82\x0a\xff\x87\x3b\x8e\x81\x81\
+\x81\x81\x93\x95\x9b\x01\x32\xa8\x89\x70\xda\xff\x7f\x0c\x0c\xbf\
+\x7f\xfd\x65\xe0\x64\xe7\x80\x14\x85\x50\x09\x58\x3e\xf9\xfa\xeb\
+\x23\x24\x89\x91\xe9\x72\x00\x00\x00\x00\xff\xff\x22\x2a\x8d\xf3\
+\xf2\xb1\x32\x7c\xff\xf1\x8d\xe1\xe5\xfb\xd7\x10\x07\xff\x47\x38\
+\x90\x81\x81\x81\x81\x87\x4d\x80\x81\x81\x01\x29\xf4\x18\x21\x0e\
+\xff\xf9\xf3\x2f\x03\x1f\x17\x2f\x44\x0e\xaa\x89\x91\x81\x91\xe1\
+\xcf\xbf\xdf\x0c\x9f\x7e\xbe\x63\x60\x66\x64\x21\xd8\xb7\xc4\x05\
+\x00\x00\x00\x00\xff\xff\xc2\xef\x70\xa8\x03\xf8\x05\xd9\x18\x18\
+\xfe\xfc\x64\xb8\xf7\xec\x21\xd4\xe1\xa8\x96\x09\x70\x88\xa2\x74\
+\xb3\x18\x19\x19\x18\xfe\xfc\x81\x54\x5c\x62\x82\x42\x0c\x0c\x0c\
+\x90\x9e\x10\xcc\x8d\x9f\x7e\xbe\x83\x38\x9c\x89\x85\x81\xdc\x20\
+\x07\x00\x00\x00\xff\xff\x22\x18\xe2\x7f\xff\xfd\x67\xe0\x17\x64\
+\x61\x60\x60\x61\x60\xb8\x78\xe7\x2a\x9a\xbf\x20\x61\x2e\xc2\x25\
+\xc5\xc0\xc6\xc2\x09\x29\x29\xa0\xed\xf7\x9f\x3f\xfe\x33\xfc\xfc\
+\xf6\x87\x41\x5e\x42\x06\xee\x59\x58\xe8\xbe\xfc\xf2\x88\xe1\xeb\
+\xaf\x8f\x0c\xcc\x8c\xcc\x64\xa7\x71\x00\x00\x00\x00\xff\xff\xc2\
+\xeb\x70\x46\x46\x06\x86\xbf\x7f\xfe\x33\xf0\xf0\x31\x31\xf0\x0a\
+\x73\x32\x9c\xbc\x7a\x8e\x81\x81\x81\x81\x81\x19\x5e\x11\x41\x1c\
+\x2e\xca\x2d\xc3\x20\xc0\x2e\xc2\xf0\x17\xda\x4f\x64\x62\x66\x60\
+\xf8\xfc\xe1\x0f\x03\xc3\xaf\xff\x0c\xba\xca\x9a\x50\xd3\x10\x2d\
+\xbe\x7b\xef\x2e\x33\xfc\xfe\xfb\x0b\x9a\xc6\x91\x9d\x8e\x48\x4e\
+\x4c\x8c\x4c\x0c\xac\x2c\x2c\x0c\xcc\xcc\xd8\xcb\x7b\x00\x00\x00\
+\x00\xff\xff\x22\x5c\xe5\xff\x63\x60\x60\x65\x67\x60\x50\x50\xe2\
+\x67\x38\x7b\xe3\x32\xc3\xa3\x57\x8f\xa1\x5d\x36\x48\xfb\xfa\xdf\
+\xff\x7f\x0c\x9c\xac\x3c\x0c\x4a\x42\x3a\x0c\xbf\xfe\xfd\x64\x60\
+\x64\x60\x62\x60\x62\x62\x64\x78\xfa\xe8\x3b\x03\x2b\x27\x2f\x83\
+\x8d\xae\x05\xc4\x22\xa4\x6e\xd8\xb5\x57\x27\x18\x58\xa0\xc9\x04\
+\xa5\x3c\x87\xfa\x81\x87\x4d\x90\xe1\xeb\xef\x8f\x0c\x2f\xdf\xbd\
+\x61\x78\xf7\xf1\x23\xd6\x16\x22\x00\x00\x00\xff\xff\x22\xaa\x38\
+\xfc\xf7\xf7\x3f\x83\x9a\x06\x2f\xc3\xe7\x8f\x6f\x18\x36\x1f\xdb\
+\xc9\xc0\xc0\xc0\x80\x51\x8d\xdb\x2b\x86\x30\xfc\xfb\xfb\x97\x81\
+\x99\xed\x1f\xc3\xcf\x6f\x4c\x0c\xa7\x8e\x3e\x60\x08\x75\xf2\x66\
+\x50\x93\x51\x61\xf8\xf7\xef\x1f\x03\x23\x23\x24\x24\x9f\x7c\xba\
+\xc3\x70\xfb\xed\x45\x06\x0e\x56\x2e\x06\x56\x36\x26\x86\xcf\xdf\
+\xbe\x30\x30\x30\x40\x6a\x66\x58\x6d\x6a\x25\xef\xc5\x60\x2d\x92\
+\xc0\xa0\xfc\x27\x80\x21\x55\x77\x02\x83\x28\x8f\x34\x24\x86\x90\
+\x3c\x00\x00\x00\x00\xff\xff\x22\xaa\x02\xfa\xfd\xeb\x3f\x83\x84\
+\x0c\x1b\x83\x84\x12\x1f\xc3\xf4\xf5\x8b\x18\x7e\xfd\xf9\xc5\xc0\
+\xc2\xcc\xcc\xf0\x9f\xe1\x3f\x7c\xe4\x49\x5b\xcc\x82\x21\x4c\x2f\
+\x9f\xe1\xd3\xa7\xef\x0c\x5b\xd6\x3d\x64\xb0\xd5\x73\x61\x98\x98\
+\xd7\x0a\x35\x83\x91\xe1\x1f\x03\xc4\xa3\xfb\xef\xad\x62\xf8\xfa\
+\xeb\x13\x03\x0b\x0b\x33\x83\x98\x18\x27\xc3\xc3\x17\x4f\x19\x9e\
+\xbf\x7b\x01\x0d\x70\x48\x90\xf3\xb2\x09\x33\x14\xb9\xb6\x30\xb4\
+\x25\xb4\x31\x38\xe9\x3a\x33\xc0\x87\xe7\x90\x9a\x1c\x00\x00\x00\
+\x00\xff\xff\x22\xae\xad\xc2\xc0\xc0\xf0\x9f\xf1\x1f\x83\xad\x93\
+\x04\xc3\xd5\x5b\x17\x19\xa6\xac\x9b\xcd\xc0\xc0\xc0\xc0\xf0\xfb\
+\xcf\x1f\xb8\xc3\xfe\xff\xff\xcf\xe0\xa7\x91\xc1\x50\x67\xb7\x86\
+\x61\x4d\xf9\x46\x86\xbd\x13\xd7\x30\x88\xf0\x8b\x40\xc6\x56\x18\
+\xfe\x32\x30\x33\xb2\x30\xdc\x7b\x77\x99\xe1\xd0\x83\xf5\x0c\xdc\
+\x6c\x7c\x0c\xbf\x7e\xfd\x66\x50\xd7\xe1\x67\xf8\xf8\xf1\x15\xc3\
+\xca\x3d\x9b\x20\xf6\xfc\x83\xe5\x03\xb4\x21\x38\x2c\x39\x18\x00\
+\x00\x00\xff\xff\x22\x6a\x08\x8e\x91\x91\x81\xe1\xf7\xcf\xff\x0c\
+\x12\x32\x2c\x0c\xd6\xee\x32\x0c\x95\x53\xdb\x18\x4c\x35\x8d\x18\
+\x6c\x75\x2d\x19\x7e\xff\xf9\xcd\xc0\xc4\xc4\xc4\xc0\xcc\xc4\xc4\
+\xf0\xff\xff\x3f\x06\x55\x29\x55\x06\x55\x29\x48\x29\x02\x49\xbf\
+\xff\x19\x98\x19\x59\x18\x3e\xfd\x7c\xc7\x30\xe7\x6c\x2d\xc3\xdf\
+\x7f\xbf\x19\xd8\x59\x38\x19\x7e\xff\xfe\xc7\x20\x24\xc6\xcc\xe0\
+\x1a\x28\xcb\xd0\xb1\xaa\x9b\x41\x5c\x58\x94\x21\xc4\xde\x9f\x81\
+\x99\x81\x91\xe1\xff\xff\x7f\x0c\x9f\x7f\x7d\x60\x78\xf8\xe1\x3a\
+\xc3\xa9\x27\x3b\x19\xde\x7c\x7b\xc6\xc0\xca\xcc\x86\xd2\x52\x04\
+\x00\x00\x00\xff\xff\x62\xe4\xf1\x90\xfb\xcf\xc8\xc8\xc0\xf0\xeb\
+\xe7\x7f\x06\x59\x45\x76\x06\xb7\x40\xdc\x03\xfb\xff\xff\x33\x30\
+\x70\x70\x30\x33\x9c\x3a\xf2\x96\xe1\xe6\xf9\xbf\x0c\x4b\x6b\x66\
+\x33\x78\x59\x3a\x42\xca\x75\x68\x1a\xfe\xf7\xff\x1f\xc3\xff\xff\
+\x90\x92\x07\x36\x9e\xf8\xe4\xe3\x6d\x86\xe9\xa7\xca\x18\x9e\x7e\
+\xba\xcb\xc0\xc9\xca\x03\x1f\xfc\xfc\xff\x9f\x81\x81\x9d\x9d\x89\
+\xe1\xcb\x97\x5f\x0c\x2f\x5f\x7e\x65\x50\x93\x51\x66\x10\x17\x12\
+\x63\xf8\xf1\xe7\x1b\xc3\xfb\xef\x2f\x19\x3e\xfe\x78\x03\xcf\xfc\
+\xe8\x19\x14\x00\x00\x00\xff\xff\x22\xc9\xe1\x30\xcb\x38\x39\x59\
+\x18\x1e\xde\xff\xcc\x70\xf1\xf4\x47\x06\x6f\xfd\x50\x86\x64\xcf\
+\x78\x06\x1d\x25\x4d\x06\x56\x68\x6f\x06\xe6\xe0\x6f\xbf\x3f\x33\
+\xac\xbd\x3a\x99\xe1\xf0\x83\x0d\x0c\x7f\xfe\xfd\x82\x8c\x02\xa0\
+\x8d\xd8\xc2\x86\xac\x59\x58\x98\x18\x7e\xfc\xfa\xc1\xf0\xfb\xcf\
+\x1f\xc8\x8c\x03\x13\x2b\xb4\xe4\x61\xc4\x3a\xca\x0b\x00\x00\x00\
+\xff\xff\x22\x79\x0e\x82\x91\x91\x81\xe1\xfb\xb7\x3f\x0c\x32\x72\
+\xdc\x0c\x7e\xe1\xd2\x0c\x77\x19\x37\x31\x18\x25\x58\x31\xb4\x2e\
+\xee\x63\x60\x60\x60\x60\xf8\xfb\x17\x61\xc9\x9f\x7f\xbf\x18\x0e\
+\xde\x5f\xcb\xc0\xc0\xc0\xc0\xc0\xc5\xca\x8b\xd5\x01\x8c\x4c\x90\
+\x51\x81\x9f\x3f\xff\x32\x30\x33\xb0\x31\x70\xb0\x72\x33\xb0\xb3\
+\x70\x32\x30\x33\x42\x27\x0b\xb0\x0f\x4d\xff\x07\x00\x00\x00\xff\
+\xff\x22\x6b\xf2\x84\x91\x89\x81\xe1\xd7\xaf\x7f\x0c\x3f\xbe\xfd\
+\x65\x50\x53\x15\x67\x10\x94\xe0\x65\xd8\x7a\x6c\x0f\x03\x03\x03\
+\x03\x03\x13\x33\x33\x3c\xc9\xf0\xb1\x0b\x33\xb8\xa9\xc6\x30\x7c\
+\xf8\xf1\x8a\xe1\xe3\xcf\xb7\xd0\x34\x8f\x3d\x2a\x19\x19\x19\x50\
+\x7a\x3d\x78\xdb\x30\xff\x19\xfe\x00\x00\x00\x00\xff\xff\x22\x6b\
+\x46\x02\x6e\xd1\x3f\x06\x86\xff\x8c\x7f\x18\xd4\x35\x04\x19\xce\
+\x1c\xbd\xca\x70\xe9\xde\x15\x06\x3d\x25\x1d\xc8\x80\x11\xb4\x76\
+\x0d\xd4\xca\x66\x90\xe1\x53\x65\x78\xf1\xe9\x11\xc3\xb1\x27\x9b\
+\x19\x3e\xfc\x78\x85\xb3\xfd\x4e\x84\xad\xff\xff\xfd\xff\xc3\xc8\
+\xcf\x2e\xfa\x0c\x00\x00\x00\xff\xff\xa2\x6c\xba\x8a\x91\x81\xe1\
+\xf7\xef\xff\x0c\xea\xba\xbc\x0c\x7f\xfe\x7f\x63\x98\xb1\x71\x21\
+\x03\x03\x03\x03\xc3\x9f\xbf\x7f\xe0\x0d\x31\x16\x46\x56\x06\x2b\
+\x39\x1f\x86\x20\x9d\x2c\x06\x5e\x36\x01\x86\xbf\xff\xfe\x30\xe0\
+\xcc\x40\x04\x00\x13\x23\xe3\xbf\xdf\x7f\x7f\x32\xa8\x0a\x1b\xed\
+\x07\x00\x00\x00\xff\xff\xa2\xc8\xe1\x8c\x8c\x0c\x0c\x7f\x7f\xff\
+\x67\xe0\x15\x60\x64\x70\x74\x97\x65\x98\xb9\x76\x31\xc3\xf6\x13\
+\x7b\x19\xd8\x58\xd9\xe0\x0e\xff\xcf\xf0\x9f\x88\xf9\x1f\xa2\xc0\
+\xff\xff\x0c\xff\x99\x98\x99\xd8\x7e\x3b\x28\x06\xcf\x02\x00\x00\
+\x00\xff\xff\xa2\x78\x82\x90\x91\x89\x81\xe1\xe7\x8f\x7f\x0c\xda\
+\x86\x3c\x0c\xf6\x3e\xc2\x0c\x69\x93\x32\x19\x66\x6c\x9a\xcf\xf0\
+\xe1\xf3\x67\x86\xff\xff\x11\x6d\x94\x6f\xbf\x3f\x33\xfc\xf9\xff\
+\x1b\xe7\xc8\x14\x0e\xd3\xff\x33\x32\x32\xfd\x63\x62\x64\xfe\xc3\
+\xc2\xc4\xfa\xfb\xfd\xf7\x57\x8c\x0e\x0a\xa1\x53\xd4\x45\x8d\x8e\
+\x03\x00\x00\x00\xff\xff\x22\xb9\x38\xc4\x05\x60\x65\xfc\xb7\xef\
+\xbf\x19\x9e\x3c\xfd\xc0\x20\x29\x20\xc5\xa0\x28\x29\xc7\xc0\xce\
+\xc6\xce\xf0\xfd\xf7\x67\x86\x8f\x3f\xde\x41\x47\xbc\x30\xd3\x36\
+\x64\x62\x16\xba\x82\x02\xba\xd8\xe0\x3f\xc3\x3f\xe6\x7f\xff\x20\
+\x0b\x1c\xfe\xfe\xfb\xfd\xef\xf7\xdf\x5f\x4c\xb6\xf2\x41\x2b\x52\
+\x4d\x5b\x62\x58\x98\x58\xfe\x02\x00\x00\x00\xff\xff\x22\x3b\x73\
+\x62\x58\xce\xc8\xc0\xf0\xe3\xfb\x5f\x06\x16\x66\x66\x06\x35\x15\
+\x31\x86\x5f\xbf\xbf\x31\xdc\xff\x78\x09\x3e\xb5\x0d\x9d\x66\xf9\
+\x0f\x59\x09\xc1\x04\x6f\xe3\xfe\x67\xf8\xc7\xfc\xf7\xdf\x5f\xc6\
+\xbf\xff\x7e\x33\xfe\xfd\xf7\x87\xe1\xef\xbf\xbf\x0c\x8c\x0c\x90\
+\x7e\x2c\x17\x2b\xdf\x17\x71\x4e\xb1\xc7\xa2\x5c\x32\xb7\xcd\x64\
+\xdc\x97\x9a\xcb\x7a\xac\x82\x0c\xb4\xff\x67\x04\x00\x00\x00\xff\
+\xff\x62\x81\xac\x7a\xf8\x4f\x95\x09\x70\x48\xf3\xfa\x3f\xc3\xcf\
+\x1f\x7f\xfe\x33\x32\xb2\xfc\xe7\x64\x65\x83\x2f\xd7\xf8\xf7\xff\
+\x2f\xf3\xdf\x7f\x7f\x18\x7f\xff\xfb\xcd\xf8\xe7\xdf\x1f\x86\x7f\
+\xff\x20\x6b\x5e\xd8\x20\x0e\xfc\x2a\xc0\x21\xff\x58\x94\x5b\xe6\
+\xb6\x24\xaf\xc2\x75\x49\x5e\xc5\xab\x92\xbc\x0a\x37\x45\xb8\xa4\
+\x1e\xf0\x71\x08\xbd\x66\x62\x64\xfe\xc7\xc0\xc0\xc0\xf0\xff\xff\
+\x3f\x26\x06\x68\xac\x00\x00\x00\x00\xff\xff\x62\xf9\xf3\xe7\x0f\
+\x03\x1b\x1b\xdb\x3f\x06\x86\xdf\x4c\x24\x25\x3f\x88\x53\xff\x33\
+\x32\x32\xa0\x85\xe0\x7f\xe6\x7f\xff\xff\x30\xfe\xfe\xfb\x8b\xf1\
+\xef\x9f\xdf\xf0\x10\x64\x61\x66\x67\xe0\x66\xe5\xfb\x2a\xc6\x21\
+\xff\x58\x94\x5b\xfa\x0e\xc4\x81\x4a\x57\x25\x78\x14\x6e\x8a\x72\
+\x4b\xdd\x47\x76\x20\x3a\x80\x2c\xc8\xf9\xcf\xc0\xc4\xc8\x0c\xcf\
+\xe5\x00\x00\x00\x00\xff\xff\x62\x11\x13\x10\x7e\xf2\xf4\xed\x73\
+\x59\x76\x66\xee\xbf\xff\xff\x33\x30\x63\x77\x3c\xe3\x7f\xa4\xc5\
+\x2e\x28\x69\x10\x11\x82\x10\x33\x59\x61\x0e\xe4\x16\x7d\x22\xca\
+\x2d\x73\x5b\x82\x57\xe1\xba\x14\xaf\xe2\x35\x09\x1e\x85\x9b\x22\
+\xdc\xd2\xf7\xf9\x39\x84\x5e\xe1\x72\xe0\xff\xff\xff\x98\xff\xc3\
+\x63\x1f\xba\x18\x81\x91\xf1\x3f\x13\x96\x21\x5b\x00\x00\x00\x00\
+\xff\xff\x62\xd9\xd3\xbf\xc1\x2e\xa4\x2e\x6e\xd3\xc5\x2b\x97\x74\
+\x59\x98\xa5\xfe\x42\x06\x53\x99\xfe\x33\x31\x22\x56\x01\xfd\xfd\
+\xff\x87\xf1\xcf\x5f\xc8\x0a\x86\xbf\xff\xa1\x21\xc8\xc4\xce\xc0\
+\xcd\xc6\xf7\x5d\x94\x43\x0e\x12\x82\x3c\x8a\xd7\x24\x79\x15\xaf\
+\x49\xf0\xca\xdf\x10\xe5\x96\xb9\xcf\xcf\x2e\xf4\x8a\x89\x09\xb7\
+\x03\xff\x41\x17\xcc\x40\x03\x05\xb2\x04\x84\x91\xe9\x2f\xb1\x91\
+\x0e\x00\x00\x00\xff\xff\x62\xfc\xff\xff\x3f\xc3\xeb\x8f\x6f\x84\
+\xbd\x4a\xa2\x37\x3f\xfe\x76\xd9\x32\x38\x46\xee\xdf\xd7\x6f\xdf\
+\x99\xfe\x33\x40\x06\x32\x59\x99\xd8\x18\xb8\x58\x79\x3f\x09\x70\
+\x88\x3d\x11\xe1\x96\xbe\x23\xc1\xa3\x70\x43\x92\x57\xe1\x9a\x38\
+\x8f\xfc\x4d\x51\x6e\xa9\x07\xfc\xec\xc2\x78\x1d\x88\x2d\x04\x89\
+\x74\x1b\x5e\x00\x00\x00\x00\xff\xff\x62\xfc\xf3\xf7\x0f\x33\x33\
+\x13\xf3\xdf\x57\xef\xde\xf3\x66\xcf\x4e\xde\x2e\xa1\xfd\x56\x4f\
+\x96\x4f\xfd\xac\x04\xaf\xc2\x75\x69\x3e\x95\x4b\x52\xbc\x8a\xd7\
+\xc4\xb8\x65\xef\x08\x70\x8a\xbe\x64\x66\x62\xc6\xde\xe2\xf9\xff\
+\x8f\xf9\x1f\xc3\x3f\x68\xc3\x96\x11\x69\xa9\x13\xd9\x9d\x78\x82\
+\x00\x00\x00\x00\xff\xff\x03\x00\x3c\x1e\x17\xa6\x18\xe4\xa8\x9e\
+\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\x0b\
+\x05\x52\xbf\x27\
+\x00\x71\
+\x00\x74\x00\x2d\x00\x6c\x00\x6f\x00\x67\x00\x6f\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\x01\x00\x00\x00\x02\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/animation/easing/form.ui b/examples/widgets/animation/easing/form.ui
new file mode 100644
index 000000000..61a792115
--- /dev/null
+++ b/examples/widgets/animation/easing/form.ui
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>545</width>
+ <height>471</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Easing curves</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QListWidget" name="easingCurvePicker">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>120</height>
+ </size>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="movement">
+ <enum>QListView::Static</enum>
+ </property>
+ <property name="isWrapping" stdset="0">
+ <bool>false</bool>
+ </property>
+ <property name="viewMode">
+ <enum>QListView::IconMode</enum>
+ </property>
+ <property name="selectionRectVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Path type</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QRadioButton" name="lineRadio">
+ <property name="text">
+ <string>Line</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <attribute name="buttonGroup">
+ <string>buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="circleRadio">
+ <property name="text">
+ <string>Circle</string>
+ </property>
+ <attribute name="buttonGroup">
+ <string>buttonGroup</string>
+ </attribute>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Properties</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Period</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QDoubleSpinBox" name="periodSpinBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <double>-1.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="value">
+ <double>-1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Amplitude</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QDoubleSpinBox" name="amplitudeSpinBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <double>-1.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="value">
+ <double>-1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Overshoot</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QDoubleSpinBox" name="overshootSpinBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimum">
+ <double>-1.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="value">
+ <double>-1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="1">
+ <widget class="QGraphicsView" name="graphicsView">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+ <buttongroups>
+ <buttongroup name="buttonGroup">
+ <property name="exclusive">
+ <bool>false</bool>
+ </property>
+ </buttongroup>
+ </buttongroups>
+</ui>
diff --git a/examples/widgets/animation/easing/images/qt-logo.png b/examples/widgets/animation/easing/images/qt-logo.png
new file mode 100644
index 000000000..14ddf2a02
--- /dev/null
+++ b/examples/widgets/animation/easing/images/qt-logo.png
Binary files differ
diff --git a/examples/widgets/animation/easing/ui_form.py b/examples/widgets/animation/easing/ui_form.py
new file mode 100644
index 000000000..4ecf4858d
--- /dev/null
+++ b/examples/widgets/animation/easing/ui_form.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'form.ui'
+#
+# Created: Wed Feb 16 22:14:47 2011
+# by: pyside-uic 0.2.6 running on PySide 1.0.0~beta5
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName("Form")
+ Form.resize(545, 471)
+ self.gridLayout = QtWidgets.QGridLayout(Form)
+ self.gridLayout.setObjectName("gridLayout")
+ self.easingCurvePicker = QtWidgets.QListWidget(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.easingCurvePicker.sizePolicy().hasHeightForWidth())
+ self.easingCurvePicker.setSizePolicy(sizePolicy)
+ self.easingCurvePicker.setMaximumSize(QtCore.QSize(16777215, 120))
+ self.easingCurvePicker.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.easingCurvePicker.setMovement(QtWidgets.QListView.Static)
+ self.easingCurvePicker.setProperty("isWrapping", False)
+ self.easingCurvePicker.setViewMode(QtWidgets.QListView.IconMode)
+ self.easingCurvePicker.setSelectionRectVisible(False)
+ self.easingCurvePicker.setObjectName("easingCurvePicker")
+ self.gridLayout.addWidget(self.easingCurvePicker, 0, 0, 1, 2)
+ self.verticalLayout = QtWidgets.QVBoxLayout()
+ self.verticalLayout.setObjectName("verticalLayout")
+ self.groupBox_2 = QtWidgets.QGroupBox(Form)
+ self.groupBox_2.setObjectName("groupBox_2")
+ self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2)
+ self.verticalLayout_2.setObjectName("verticalLayout_2")
+ self.lineRadio = QtWidgets.QRadioButton(self.groupBox_2)
+ self.lineRadio.setChecked(True)
+ self.lineRadio.setObjectName("lineRadio")
+ self.buttonGroup = QtWidgets.QButtonGroup(Form)
+ self.buttonGroup.setObjectName("buttonGroup")
+ self.buttonGroup.addButton(self.lineRadio)
+ self.verticalLayout_2.addWidget(self.lineRadio)
+ self.circleRadio = QtWidgets.QRadioButton(self.groupBox_2)
+ self.circleRadio.setObjectName("circleRadio")
+ self.buttonGroup.addButton(self.circleRadio)
+ self.verticalLayout_2.addWidget(self.circleRadio)
+ self.verticalLayout.addWidget(self.groupBox_2)
+ self.groupBox = QtWidgets.QGroupBox(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
+ self.groupBox.setSizePolicy(sizePolicy)
+ self.groupBox.setObjectName("groupBox")
+ self.formLayout = QtWidgets.QFormLayout(self.groupBox)
+ self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
+ self.formLayout.setObjectName("formLayout")
+ self.label = QtWidgets.QLabel(self.groupBox)
+ self.label.setObjectName("label")
+ self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
+ self.periodSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
+ self.periodSpinBox.setEnabled(False)
+ self.periodSpinBox.setMinimum(-1.0)
+ self.periodSpinBox.setSingleStep(0.1)
+ self.periodSpinBox.setProperty("value", -1.0)
+ self.periodSpinBox.setObjectName("periodSpinBox")
+ self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.periodSpinBox)
+ self.label_2 = QtWidgets.QLabel(self.groupBox)
+ self.label_2.setObjectName("label_2")
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
+ self.amplitudeSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
+ self.amplitudeSpinBox.setEnabled(False)
+ self.amplitudeSpinBox.setMinimum(-1.0)
+ self.amplitudeSpinBox.setSingleStep(0.1)
+ self.amplitudeSpinBox.setProperty("value", -1.0)
+ self.amplitudeSpinBox.setObjectName("amplitudeSpinBox")
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.amplitudeSpinBox)
+ self.label_3 = QtWidgets.QLabel(self.groupBox)
+ self.label_3.setObjectName("label_3")
+ self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
+ self.overshootSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
+ self.overshootSpinBox.setEnabled(False)
+ self.overshootSpinBox.setMinimum(-1.0)
+ self.overshootSpinBox.setSingleStep(0.1)
+ self.overshootSpinBox.setProperty("value", -1.0)
+ self.overshootSpinBox.setObjectName("overshootSpinBox")
+ self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.overshootSpinBox)
+ self.verticalLayout.addWidget(self.groupBox)
+ spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+ self.verticalLayout.addItem(spacerItem)
+ self.gridLayout.addLayout(self.verticalLayout, 1, 0, 1, 1)
+ self.graphicsView = QtWidgets.QGraphicsView(Form)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.graphicsView.sizePolicy().hasHeightForWidth())
+ self.graphicsView.setSizePolicy(sizePolicy)
+ self.graphicsView.setObjectName("graphicsView")
+ self.gridLayout.addWidget(self.graphicsView, 1, 1, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ Form.setWindowTitle(QtWidgets.QApplication.translate("Form", "Easing curves", None))
+ self.groupBox_2.setTitle(QtWidgets.QApplication.translate("Form", "Path type", None))
+ self.lineRadio.setText(QtWidgets.QApplication.translate("Form", "Line", None))
+ self.circleRadio.setText(QtWidgets.QApplication.translate("Form", "Circle", None))
+ self.groupBox.setTitle(QtWidgets.QApplication.translate("Form", "Properties", None))
+ self.label.setText(QtWidgets.QApplication.translate("Form", "Period", None))
+ self.label_2.setText(QtWidgets.QApplication.translate("Form", "Amplitude", None))
+ self.label_3.setText(QtWidgets.QApplication.translate("Form", "Overshoot", None))
+
diff --git a/examples/widgets/animation/states/states.py b/examples/widgets/animation/states/states.py
new file mode 100755
index 000000000..e812e9fd6
--- /dev/null
+++ b/examples/widgets/animation/states/states.py
@@ -0,0 +1,265 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import states_rc
+
+
+class Pixmap(QtWidgets.QGraphicsObject):
+ def __init__(self, pix):
+ super(Pixmap, self).__init__()
+
+ self.p = QtGui.QPixmap(pix)
+
+ def paint(self, painter, option, widget):
+ painter.drawPixmap(QtCore.QPointF(), self.p)
+
+ def boundingRect(self):
+ return QtCore.QRectF(QtCore.QPointF(0, 0), QtCore.QSizeF(self.p.size()))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ # Text edit and button.
+ edit = QtWidgets.QTextEdit()
+ edit.setText("asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
+ "asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
+ "asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
+ "asdf lkjha yuoiqwe asd iuaysd u iasyd uiy!")
+
+ button = QtWidgets.QPushButton()
+ buttonProxy = QtWidgets.QGraphicsProxyWidget()
+ buttonProxy.setWidget(button)
+ editProxy = QtWidgets.QGraphicsProxyWidget()
+ editProxy.setWidget(edit)
+
+ box = QtWidgets.QGroupBox()
+ box.setFlat(True)
+ box.setTitle("Options")
+
+ layout2 = QtWidgets.QVBoxLayout()
+ box.setLayout(layout2)
+ layout2.addWidget(QtWidgets.QRadioButton("Herring"))
+ layout2.addWidget(QtWidgets.QRadioButton("Blue Parrot"))
+ layout2.addWidget(QtWidgets.QRadioButton("Petunias"))
+ layout2.addStretch()
+
+ boxProxy = QtWidgets.QGraphicsProxyWidget()
+ boxProxy.setWidget(box)
+
+ # Parent widget.
+ widget = QtWidgets.QGraphicsWidget()
+ layout = QtWidgets.QGraphicsLinearLayout(QtCore.Qt.Vertical, widget)
+ layout.addItem(editProxy)
+ layout.addItem(buttonProxy)
+ widget.setLayout(layout)
+
+ p1 = Pixmap(QtGui.QPixmap(':/digikam.png'))
+ p2 = Pixmap(QtGui.QPixmap(':/akregator.png'))
+ p3 = Pixmap(QtGui.QPixmap(':/accessories-dictionary.png'))
+ p4 = Pixmap(QtGui.QPixmap(':/k3b.png'))
+ p5 = Pixmap(QtGui.QPixmap(':/help-browser.png'))
+ p6 = Pixmap(QtGui.QPixmap(':/kchart.png'))
+
+ scene = QtWidgets.QGraphicsScene(0, 0, 400, 300)
+ scene.setBackgroundBrush(scene.palette().window())
+ scene.addItem(widget)
+ scene.addItem(boxProxy)
+ scene.addItem(p1)
+ scene.addItem(p2)
+ scene.addItem(p3)
+ scene.addItem(p4)
+ scene.addItem(p5)
+ scene.addItem(p6)
+
+ machine = QtCore.QStateMachine()
+ state1 = QtCore.QState(machine)
+ state2 = QtCore.QState(machine)
+ state3 = QtCore.QState(machine)
+ machine.setInitialState(state1)
+
+ # State 1.
+ state1.assignProperty(button, 'text', "Switch to state 2")
+ state1.assignProperty(widget, 'geometry', QtCore.QRectF(0, 0, 400, 150))
+ state1.assignProperty(box, 'geometry', QtCore.QRect(-200, 150, 200, 150))
+ state1.assignProperty(p1, 'pos', QtCore.QPointF(68, 185))
+ state1.assignProperty(p2, 'pos', QtCore.QPointF(168, 185))
+ state1.assignProperty(p3, 'pos', QtCore.QPointF(268, 185))
+ state1.assignProperty(p4, 'pos', QtCore.QPointF(68 - 150, 48 - 150))
+ state1.assignProperty(p5, 'pos', QtCore.QPointF(168, 48 - 150))
+ state1.assignProperty(p6, 'pos', QtCore.QPointF(268 + 150, 48 - 150))
+ state1.assignProperty(p1, 'rotation', 0.0)
+ state1.assignProperty(p2, 'rotation', 0.0)
+ state1.assignProperty(p3, 'rotation', 0.0)
+ state1.assignProperty(p4, 'rotation', -270.0)
+ state1.assignProperty(p5, 'rotation', -90.0)
+ state1.assignProperty(p6, 'rotation', 270.0)
+ state1.assignProperty(boxProxy, 'opacity', 0.0)
+ state1.assignProperty(p1, 'opacity', 1.0)
+ state1.assignProperty(p2, 'opacity', 1.0)
+ state1.assignProperty(p3, 'opacity', 1.0)
+ state1.assignProperty(p4, 'opacity', 0.0)
+ state1.assignProperty(p5, 'opacity', 0.0)
+ state1.assignProperty(p6, 'opacity', 0.0)
+
+ # State 2.
+ state2.assignProperty(button, 'text', "Switch to state 3")
+ state2.assignProperty(widget, 'geometry', QtCore.QRectF(200, 150, 200, 150))
+ state2.assignProperty(box, 'geometry', QtCore.QRect(9, 150, 190, 150))
+ state2.assignProperty(p1, 'pos', QtCore.QPointF(68 - 150, 185 + 150))
+ state2.assignProperty(p2, 'pos', QtCore.QPointF(168, 185 + 150))
+ state2.assignProperty(p3, 'pos', QtCore.QPointF(268 + 150, 185 + 150))
+ state2.assignProperty(p4, 'pos', QtCore.QPointF(64, 48))
+ state2.assignProperty(p5, 'pos', QtCore.QPointF(168, 48))
+ state2.assignProperty(p6, 'pos', QtCore.QPointF(268, 48))
+ state2.assignProperty(p1, 'rotation', -270.0)
+ state2.assignProperty(p2, 'rotation', 90.0)
+ state2.assignProperty(p3, 'rotation', 270.0)
+ state2.assignProperty(p4, 'rotation', 0.0)
+ state2.assignProperty(p5, 'rotation', 0.0)
+ state2.assignProperty(p6, 'rotation', 0.0)
+ state2.assignProperty(boxProxy, 'opacity', 1.0)
+ state2.assignProperty(p1, 'opacity', 0.0)
+ state2.assignProperty(p2, 'opacity', 0.0)
+ state2.assignProperty(p3, 'opacity', 0.0)
+ state2.assignProperty(p4, 'opacity', 1.0)
+ state2.assignProperty(p5, 'opacity', 1.0)
+ state2.assignProperty(p6, 'opacity', 1.0)
+
+ # State 3.
+ state3.assignProperty(button, 'text', "Switch to state 1")
+ state3.assignProperty(p1, 'pos', QtCore.QPointF(0, 5))
+ state3.assignProperty(p2, 'pos', QtCore.QPointF(0, 5 + 64 + 5))
+ state3.assignProperty(p3, 'pos', QtCore.QPointF(5, 5 + (64 + 5) + 64))
+ state3.assignProperty(p4, 'pos', QtCore.QPointF(5 + 64 + 5, 5))
+ state3.assignProperty(p5, 'pos', QtCore.QPointF(5 + 64 + 5, 5 + 64 + 5))
+ state3.assignProperty(p6, 'pos', QtCore.QPointF(5 + 64 + 5, 5 + (64 + 5) + 64))
+ state3.assignProperty(widget, 'geometry', QtCore.QRectF(138, 5, 400 - 138, 200))
+ state3.assignProperty(box, 'geometry', QtCore.QRect(5, 205, 400, 90))
+ state3.assignProperty(p1, 'opacity', 1.0)
+ state3.assignProperty(p2, 'opacity', 1.0)
+ state3.assignProperty(p3, 'opacity', 1.0)
+ state3.assignProperty(p4, 'opacity', 1.0)
+ state3.assignProperty(p5, 'opacity', 1.0)
+ state3.assignProperty(p6, 'opacity', 1.0)
+
+ t1 = state1.addTransition(button.clicked, state2)
+ animation1SubGroup = QtCore.QSequentialAnimationGroup()
+ animation1SubGroup.addPause(250)
+ animation1SubGroup.addAnimation(QtCore.QPropertyAnimation(box, 'geometry', state1))
+ t1.addAnimation(animation1SubGroup)
+ t1.addAnimation(QtCore.QPropertyAnimation(widget, 'geometry', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p1, 'pos', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p2, 'pos', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p3, 'pos', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p4, 'pos', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p5, 'pos', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p6, 'pos', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p1, 'rotation', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p2, 'rotation', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p3, 'rotation', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p4, 'rotation', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p5, 'rotation', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p6, 'rotation', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p1, 'opacity', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p2, 'opacity', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p3, 'opacity', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p4, 'opacity', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p5, 'opacity', state1))
+ t1.addAnimation(QtCore.QPropertyAnimation(p6, 'opacity', state1))
+
+ t2 = state2.addTransition(button.clicked, state3)
+ t2.addAnimation(QtCore.QPropertyAnimation(box, 'geometry', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(widget, 'geometry', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p1, 'pos', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p2, 'pos', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p3, 'pos', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p4, 'pos', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p5, 'pos', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p6, 'pos', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p1, 'rotation', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p2, 'rotation', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p3, 'rotation', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p4, 'rotation', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p5, 'rotation', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p6, 'rotation', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p1, 'opacity', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p2, 'opacity', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p3, 'opacity', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p4, 'opacity', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p5, 'opacity', state2))
+ t2.addAnimation(QtCore.QPropertyAnimation(p6, 'opacity', state2))
+
+ t3 = state3.addTransition(button.clicked, state1)
+ t3.addAnimation(QtCore.QPropertyAnimation(box, 'geometry', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(widget, 'geometry', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p1, 'pos', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p2, 'pos', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p3, 'pos', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p4, 'pos', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p5, 'pos', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p6, 'pos', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p1, 'rotation', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p2, 'rotation', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p3, 'rotation', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p4, 'rotation', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p5, 'rotation', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p6, 'rotation', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p1, 'opacity', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p2, 'opacity', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p3, 'opacity', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p4, 'opacity', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p5, 'opacity', state3))
+ t3.addAnimation(QtCore.QPropertyAnimation(p6, 'opacity', state3))
+
+ machine.start()
+
+ view = QtWidgets.QGraphicsView(scene)
+ view.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/animation/states/states_rc.py b/examples/widgets/animation/states/states_rc.py
new file mode 100644
index 000000000..67a05f8f0
--- /dev/null
+++ b/examples/widgets/animation/states/states_rc.py
@@ -0,0 +1,2221 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: to lokakuuta 14 16:08:44 2010
+# by: The Resource Compiler for PySide (Qt v4.7.0)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x1b\x48\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x1a\xc5\x49\x44\
+\x41\x54\x78\xda\xcd\x7b\x0b\x5c\xcf\xf7\xf7\xbf\xf9\xee\xc6\x30\
+\x14\xdb\xd7\xfd\x32\x66\xc6\x66\xc3\xd8\xec\x8a\x51\x51\x2a\x42\
+\xae\xb9\x35\x84\xb9\x33\x86\xe6\xba\x94\x6b\xc9\xa5\x74\x2f\x11\
+\xa9\x24\x95\x8a\xe4\xbe\xdc\x72\x0b\x45\x49\x4a\x4a\xf7\xcb\xa7\
+\xcb\xe7\xf9\x3f\xcf\xd7\x47\xf3\xdd\x77\xdf\xff\x77\xfb\x7d\xc7\
+\xf0\x78\x9c\xf5\xde\xfb\xf3\x7e\x9d\xf3\x3c\xe7\x75\x5e\xe7\xf5\
+\x7a\x9f\x73\xde\x35\x00\xfc\x65\x5a\xbf\x7e\xbd\xbe\x87\x87\xc7\
+\x48\x77\x77\x77\xcb\xad\x5b\xb7\xb6\x5f\xb0\x60\x41\xcd\xff\xf6\
+\xfc\xa6\x4d\x9b\x6a\xb9\x07\x44\xce\xf1\x39\x7a\xcf\xca\x3b\x26\
+\x65\xa2\x47\x40\xf8\x4f\x32\x76\xd2\xce\x9d\x3b\xad\x5c\x5c\x5c\
+\xc6\x0a\x4d\x12\x9a\xbc\x63\xc7\x0e\x5e\x8f\x70\x75\x75\xed\x2d\
+\xfc\x9b\x71\xec\xd3\xa6\xbf\x34\x38\x28\x28\xa8\xf6\xee\xdd\xbb\
+\x8f\x87\x87\x87\x17\x47\x47\x47\xe3\xe8\xd1\xa3\x90\xbf\x15\xb1\
+\xb1\xb1\x5a\xf9\x2d\xf3\xc0\x81\x03\x39\x01\x01\x01\x09\xfb\xf7\
+\xef\x4f\x15\xba\x11\x12\x12\xf2\xe0\xd0\xa1\x43\x05\x31\x31\x31\
+\xda\x5b\xc9\x77\x50\x5c\x56\xa9\xe8\xc6\xad\x64\xc8\x18\x35\xf6\
+\xd4\xa9\x53\x88\x88\x88\x28\x38\x71\xe2\x04\xc2\xc2\xc2\x1e\xc9\
+\xb3\xfc\x5b\x10\x19\x19\x09\xa1\x22\xe1\x1b\xb7\x61\xc3\x86\x56\
+\x2f\x84\x01\xbc\xbd\xbd\x03\x05\x60\x85\x28\x19\x2b\x33\x64\x2d\
+\xb3\x38\xd5\xc7\xc7\x67\x9d\xbf\xbf\x7f\xe0\xae\x5d\xbb\xa2\x45\
+\xe1\xdb\x02\xf8\x4a\x58\x70\x60\x8e\xb7\xdd\x92\x87\x7b\xf7\x05\
+\x95\xee\xda\x1d\x58\xe6\xe2\xb9\xb7\x6c\xf9\xd6\xb0\xf2\xb9\xce\
+\xa7\x2a\xe7\x6f\x3b\x53\xb9\xd6\x3d\xae\x6c\x93\x67\x4c\xe1\x36\
+\x8f\x43\x99\xde\x1e\x81\x57\xc3\x67\x98\xaf\xda\xe3\xb0\x6c\xa2\
+\xf0\x1c\xec\xe7\xe7\x37\x55\xe4\xcc\x17\x9e\xbb\xf6\xed\xdb\x77\
+\x4e\x8c\x53\x29\xc6\xaa\x14\x6f\x19\xf2\x5c\x0d\x20\xb3\x50\xff\
+\xd8\xb1\x63\x5a\x01\x75\xea\x3f\xfd\x7e\xd2\xb0\x51\x97\x63\x03\
+\x1a\x6e\x3a\x32\x50\x2f\x39\x66\x60\x43\xed\xd1\xc1\x4d\x71\x39\
+\x25\x1f\x57\xd3\x0a\x90\x78\xaf\x08\xc9\x19\x45\xb8\x9d\x49\xd2\
+\x5d\x27\x09\xdd\xb8\x57\x88\xab\x77\x0b\x70\x6d\x58\x6b\x24\x98\
+\xbc\xa5\xfd\xc5\x50\xff\x97\xf3\x06\x7a\x0b\xe3\xfb\xe9\x75\xa8\
+\xe6\x2b\x4b\xac\x63\x70\x70\x70\x8a\x78\x5d\xce\x73\x35\x00\xd7\
+\xac\xb8\x6c\x95\xa7\xa7\xa7\x55\xf5\xbd\xab\xfd\xeb\x35\x8c\x37\
+\xd2\x5f\x15\x6f\xa0\x77\xfb\xe2\x80\x46\xb8\x36\xb8\x09\x6e\x8d\
+\x68\x89\x3b\x56\xef\x20\xcd\xe6\x43\x64\xe7\x97\x21\xb7\x50\x83\
+\xfc\xe2\x72\x14\x94\xe8\xa8\xb0\xa4\x82\x7f\xd5\xbd\xdc\x22\x0d\
+\x72\x0a\x34\xb8\x3f\xf3\x63\xa4\x59\x77\xe0\x38\x8e\x57\x7c\xce\
+\x0d\x68\x7c\x9b\xbc\x29\x43\x8c\x1e\x15\x17\x17\xa7\x7d\xae\x06\
+\x10\x97\xdc\x2d\x6b\x1c\x02\xa6\xd9\x49\x8b\x66\xb5\xe2\x0d\xf4\
+\x17\x9d\x33\xd0\x2f\xb8\x6c\xfa\x36\x6e\x5a\xb6\x40\xca\xf8\x76\
+\xb8\x3f\xf5\x7d\x3c\x9c\xd5\x05\x39\x0b\x7b\x20\x6f\x65\x5f\x54\
+\x54\x56\xa1\xb2\x4a\x8b\x2a\x92\x56\x0b\xad\x22\x5e\xab\x7b\xfc\
+\x4d\x3d\x93\xb7\xd6\x08\xb9\xb6\x5f\x72\x1c\xc7\x93\x0f\xf9\x29\
+\xbe\x97\x4c\xdf\x2e\x88\x99\x63\x71\xed\x60\x70\x60\xf1\x73\x35\
+\x80\xaf\xaf\xef\x51\x59\x9f\xda\x0b\x03\xdf\x9a\x28\xca\x3f\xa0\
+\xe2\xb7\x46\xb6\xc2\xdd\x49\xef\xe2\xc1\xf7\x1f\x20\xe7\x07\x51\
+\x7a\x45\x6f\x14\x38\x0c\x40\xd1\x96\x21\x28\x71\xb3\x42\x59\x05\
+\x50\xa2\x01\x8a\x84\x0a\xcb\x74\x54\x50\xaa\xfb\x5b\x24\x54\x2c\
+\xf7\x4b\xcb\x85\x7c\xbf\x43\x89\xcb\x48\x8e\xe3\x78\xf2\x21\x3f\
+\xf2\x25\x7f\x25\xe7\xfc\xf0\x76\xda\xf3\x06\x0d\x27\xec\xb1\xa8\
+\xf1\x8f\xe7\x62\x00\xb7\x2d\x9b\x6e\x6e\x75\x72\xc2\xa5\x81\x8d\
+\x38\x33\x0a\x58\xd6\xcc\x0f\xf1\x68\xc9\xe7\xc8\xb7\x33\x50\xe0\
+\x4b\xdd\xc7\x42\xe3\x3f\x19\x15\x41\xb3\x50\x19\xb9\x04\x0f\x0b\
+\x81\x07\x05\x40\x46\x3e\x70\x3f\x0f\x48\x57\xa4\xbb\xce\x10\xca\
+\x94\xfb\x59\xf2\x4c\xd5\xd1\x15\xa8\x0a\xff\x81\xe3\x38\x9e\x7c\
+\xc8\x8f\x7c\xc9\x9f\x72\x28\x8f\x72\xb9\x34\xae\x9c\x37\xaa\xdf\
+\xf2\x6f\x35\xc0\x39\xc3\x06\x9f\x3b\xaf\x58\xa4\xdd\xb0\x7e\x3d\
+\x6e\x5b\xb5\x45\xe6\xf4\xce\x78\xb4\xf8\x53\x9d\xe2\xce\x43\x51\
+\xe6\x33\x11\x15\xfb\x67\xa2\x2a\x62\x11\x10\xb3\x0c\x88\x5e\x02\
+\xed\xe1\x1f\x71\xfb\x21\x90\x94\x05\xdc\x7c\x00\xdc\xc8\x04\x12\
+\x9f\x90\xba\x77\x4b\x7e\x4b\x96\x67\xb4\x11\x0b\x80\xc8\x85\x1c\
+\xc7\xf1\xe4\x43\x7e\xe4\x4b\xfe\x94\x43\x79\x94\xab\xe4\x27\x98\
+\x35\xcd\x25\xa6\xbf\xc5\x00\xbf\x18\xea\x4d\x3c\x6f\xa8\x5f\xe1\
+\xb2\x6a\x11\xdc\x76\x6c\x45\xf6\xdc\x8f\x65\x7d\xf7\x41\x91\xd3\
+\x60\x94\x79\x4f\x50\xb3\xa6\x7d\xac\x34\x22\x45\x91\xb0\x19\x40\
+\xd0\x04\x68\x03\x46\xe0\xd2\x3d\xe0\xc2\x5d\xe0\x5c\x2a\x10\x9f\
+\x02\xfc\xf2\x84\xd4\xbd\xf3\xf2\xdb\xc5\x34\x40\xeb\x63\x02\xec\
+\xb6\xe0\x38\x8e\x27\x1f\xf2\x23\x5f\xf2\xa7\x1c\xca\xa3\x5c\xca\
+\x57\x01\x33\x71\x58\xf3\x0a\x62\x7b\x66\x06\x90\x47\x5f\x3a\x6b\
+\xa0\xb7\xe9\x82\x91\xbe\x8a\xcc\xbe\x9b\xed\x10\x12\x1c\xa4\xd6\
+\x68\x89\xeb\x28\x94\xef\x9d\xc6\x59\xd6\x29\x1e\x31\x0f\x08\xf9\
+\x4e\xa7\x84\xdb\xd7\xc0\xe6\x0e\xa8\x5a\xd3\x08\xc7\x93\x80\x63\
+\x37\x81\xa3\x37\x80\x23\x42\x31\x89\x5a\x44\x5f\xd7\xf2\x5a\x51\
+\xac\xfc\x76\xfc\x16\x50\xb1\xec\x75\x60\x65\x5d\x8e\xe3\x78\xf2\
+\x21\x3f\xf2\xad\xf6\x26\xca\xa3\x5c\x25\x3f\x67\x51\x4f\xa4\x4f\
+\xe9\xa8\x70\x9d\x35\x6c\xb4\x89\x58\x9f\xba\x01\x4e\x19\x34\xb6\
+\xbb\x38\x40\x1f\x49\x12\x80\x32\xa6\x75\x82\xff\x16\x3b\xec\xf7\
+\xf7\x56\xb3\x51\x19\x3a\x57\xb4\x59\xaa\x73\xdb\x03\x53\x00\xff\
+\xc1\xc0\xb6\xee\xc0\x9a\x86\xa8\x5a\x5c\x03\x9a\x85\x35\x51\xb4\
+\xe0\x0d\x04\x9e\x2b\x83\xff\x99\x12\x78\x9f\x28\x82\x47\x5c\x21\
+\xdc\x8e\x15\x28\x72\x97\x6b\x2f\xb9\xe7\x77\xaa\x18\x7b\xe3\x4b\
+\x51\x30\xaf\x0e\x4a\xe6\xfe\x83\xe3\x38\x9e\x7c\xc8\x8f\x7c\xc9\
+\x9f\x72\x28\x8f\x72\x95\xfc\xc2\x4d\xa6\x78\xb4\xf4\x0b\xe2\x52\
+\xf8\x4e\x19\x35\xb6\x7b\xaa\x06\x38\x6d\xa8\x37\xe2\x82\xa1\x1e\
+\x99\x73\xdd\xa9\x2d\x2a\xd8\xcf\x1d\xe1\x07\xf6\x73\x7d\xea\x66\
+\x3d\x7c\x36\xb0\x77\x24\xe0\xda\x0b\x58\x5d\x1f\x95\x8b\x5e\x42\
+\xe9\xfc\x9a\x28\x9c\xf5\x32\xb2\x6c\xea\xe0\xe6\xc4\x36\xd8\x28\
+\x67\x97\xb5\xa1\x59\x58\x15\xf4\x00\x3f\x05\x66\xc0\x76\x5f\x06\
+\x96\xed\xbd\xaf\xae\x57\x06\x65\xe2\xe7\x90\x2c\xac\x0f\xcb\x46\
+\xe2\x84\x36\xc8\x9c\x5c\x17\x79\x33\x5e\xe1\x78\xf2\x21\x3f\xf2\
+\x25\x7f\xca\xa1\x3c\xca\x55\xf2\x35\xbb\xbe\xe3\x92\x20\x2e\xe2\
+\x53\x38\x89\xf9\xa9\x18\xe0\xac\x91\x7e\xb7\x73\x06\x7a\xe5\x37\
+\x2d\x5b\xd2\xc2\x14\xa2\x22\x72\x58\xa0\x3f\x0e\xf8\xb9\x00\x51\
+\xe2\xf6\xa1\x36\x80\x9f\x09\xb0\xa1\x2d\xaa\x7e\xac\x81\xb2\xc7\
+\x8a\xdf\x9b\x5c\x1f\x97\xc6\xb6\xc1\xa9\x51\x9d\x71\x7a\x54\x27\
+\xcc\xf1\xbe\x8b\x99\x3b\x2e\x6b\xa7\xd9\x47\x95\x58\x2d\xd9\xf5\
+\xd0\x74\x86\xd3\x6d\xb3\xe9\x4e\xb7\xc7\x2d\xf1\xcb\xb6\xb1\x8f\
+\x2c\x9d\xb1\x2d\x41\x3b\xd3\x33\x85\xcf\xaa\x31\x17\xc7\xb4\x45\
+\xea\xc4\x06\xc8\x9d\xf6\x2a\xf9\x91\x2f\xf9\x53\x0e\xe5\x51\xae\
+\x92\xaf\x8d\x5a\x02\xcd\xee\x29\xc4\x45\x7c\x0a\xe7\x75\xcb\x96\
+\xe5\xc4\xfe\x97\x0c\x10\xdf\x5f\xff\x9f\x67\x0c\xf4\xb3\x13\x87\
+\x36\xe3\x1a\x53\x5b\x50\x91\xa3\x39\x72\xbd\xac\x71\x3c\x2e\x0e\
+\xe1\x5e\x1b\x80\x10\x6b\xc0\xa3\xaf\x9a\x9d\xf2\x1f\x5e\x42\xf1\
+\x9c\x7f\x20\x6b\x6a\x6d\x9c\x1d\xd5\x16\xc7\x2c\x3b\x2a\x8a\x1b\
+\xde\xae\xd2\x75\x60\xbb\xb4\x6f\xbe\xec\x73\xe0\xe3\x8f\x3f\x76\
+\x16\x5a\x2f\xb4\xea\xa3\x8f\x3e\x5a\x4a\xe2\x35\xef\xf1\xb7\xde\
+\x5f\xf5\x3e\xb0\xd5\xa8\x5d\xca\x91\xa1\xed\x2b\xaa\xc7\x9f\x19\
+\xf9\x0e\xd2\x27\xd5\x41\xde\xf4\x57\xc8\x9f\x72\x28\x8f\x72\x75\
+\xf2\x0f\x2f\x62\x80\xa4\x11\x88\x8f\x38\x15\xde\x04\x8b\xe6\xd9\
+\xd4\xe1\x7f\x36\xc0\xf1\xfe\x8d\x4e\x5f\x31\xfb\x27\xf7\x5c\x75\
+\x10\x29\xdc\x38\x08\x65\x7e\xd6\x38\xed\xb7\x06\x91\x11\x11\xb8\
+\xea\xbb\x10\xd8\xf9\x25\x60\xfb\x0a\x34\x0b\x64\xd6\x67\xbe\x8c\
+\xd4\x49\xf5\x70\x74\xf8\x3b\x88\x1e\xd6\x0e\xe1\x43\xda\x94\x2c\
+\xeb\xd3\x2e\xbe\x6b\xd7\xae\x1b\x44\xb9\x39\xa2\xec\x10\xb9\xfe\
+\xec\x43\xdd\xbf\x76\x5d\xba\x74\x69\x4a\xe2\x35\x6f\xf0\x37\x3e\
+\xc3\x67\x39\x66\xda\x57\x1d\x8f\x1f\x1c\xdc\xa6\x98\xbc\xc8\x33\
+\x79\x5c\x7d\xe4\x4c\x7d\x8d\x72\x28\x8f\x72\x75\xf2\x83\x27\x01\
+\x51\x8b\xe9\x09\xc4\x47\x9c\xc4\xab\x70\x9f\x19\xd4\xe4\xf4\xff\
+\x64\x80\xb8\x7e\xfa\xc6\x8c\xf8\xc9\x63\xda\x20\x7b\xce\x47\xc8\
+\x5f\x6b\x88\x52\xcf\x71\x28\x0d\x5b\x8c\xa8\x88\x30\x84\xca\x12\
+\xd0\xee\xfc\x1a\x58\x56\x53\xb9\x66\xfe\xf7\xaf\xe0\xfa\xb8\x06\
+\x38\x64\xd1\x06\x91\x16\xad\xb4\x73\xbe\x69\x7f\x56\x94\x58\x2b\
+\x0a\x0e\xa7\x72\xa2\x94\xbe\xd0\x2b\x7f\xe4\x92\x7c\x86\xcf\x72\
+\x0c\xc7\x92\x87\xcd\x97\x1d\x4e\x46\x0c\x69\x5d\x45\xde\x97\x47\
+\xeb\xe1\xe1\xe4\xd7\x28\x8f\x72\x29\x9f\x3b\x05\x3d\x81\x31\x81\
+\x07\x28\xe2\x24\x5e\xe2\x56\xf8\xe3\x0c\xdf\x36\xfe\xbf\x19\xc0\
+\xb6\x46\xcd\xe3\xfd\x1b\xa7\xca\xde\xaa\x5b\xf7\xcb\xbf\x91\xa3\
+\xe9\x08\x54\x84\xcc\x46\xd4\x3e\x0f\x99\xfd\x70\x9c\x71\x9e\x0c\
+\x2c\x7f\xfd\x57\xe5\xcf\x8f\xd6\x47\xc8\xe0\x96\x08\x1d\xdc\x5c\
+\x63\xdc\xb3\x93\xb7\xcc\xe4\x58\x51\xa4\xb3\xd0\xeb\xff\xeb\x29\
+\x8d\x63\xc9\x83\xbc\x8c\x3e\xe9\xec\x15\x6a\xde\xa2\x92\x32\xce\
+\x8e\x68\x84\xac\xef\x5e\xaf\x36\x82\xc2\x01\xaf\xfe\xc0\xc1\x69\
+\x34\x02\x71\x12\x2f\x71\x2b\xfc\xf1\x43\x5a\xa6\x52\xa7\x3f\x6d\
+\x80\x98\x7e\x8d\xa7\x26\x18\x37\xe6\x0b\x08\x5f\x48\x64\x9b\x31\
+\x83\x66\x8f\x0d\x0e\x07\xec\x54\x89\x8b\x88\x1d\xb6\xa8\x5c\xdd\
+\x48\xb9\x61\x81\x80\xb8\x39\xae\x2e\xf6\x99\x35\x83\xe7\xc0\x66\
+\x0f\xbb\x75\xe9\xb2\x46\x66\xee\x2b\x01\x5e\xf7\x69\x25\x2d\xc8\
+\x8b\x3c\x47\x0f\x1b\x7a\x29\xd0\xbc\xb5\x96\xb2\xae\x8e\xac\x47\
+\x23\x50\xbe\xc2\x81\x9f\x1b\x01\x7e\xa6\x40\xf8\x1c\x9e\x1e\x89\
+\x97\xb8\x89\x5f\xe9\x71\xd4\xe8\xed\xa9\x7f\xca\x00\x47\xbe\x6e\
+\xf5\xfa\x29\x83\x46\x8f\x6e\x0c\x6f\x81\xcc\x19\x9d\x91\xbf\xe6\
+\x5b\x14\x7a\x4c\x40\xa0\xef\x4e\x04\xf8\xfb\x21\xcc\xdd\x1e\x9a\
+\xf5\x1d\x50\x21\x81\x88\x91\x39\x53\x40\xec\x37\x6b\x2c\xca\x37\
+\x79\x24\x20\x17\xca\x6c\x75\x11\xc0\x2f\x3f\xed\xd4\x15\x79\x3a\
+\x38\x38\xc4\x2e\x5e\xf4\x03\x7c\x07\x34\xc9\x0f\x34\x7d\x0b\xa9\
+\x63\x6b\x73\x39\x10\x87\xc2\x03\xc7\x8e\x40\xe0\x18\x06\x45\xd9\
+\x1e\x65\x29\x78\x8c\x25\x7e\xa5\xc7\xc5\xa1\xad\x1e\x51\xb7\x3f\
+\x34\xc0\xa1\x7e\x8d\xe7\x5d\xaa\x9e\x7d\x9e\xb0\x9c\xc7\x62\xfb\
+\xe6\x75\x70\x74\x74\xc4\x41\xd7\x35\x28\x75\xee\x05\xed\x92\x1a\
+\x28\x96\x83\x4a\xce\xd4\x57\x11\x65\xd1\x00\xfe\x26\x8d\xca\x7b\
+\x7c\xd4\xd9\x56\x40\xbe\x23\xa4\x4e\x61\xcf\x82\x24\xf7\xb0\x55\
+\xa8\xf8\xf3\x5e\x9f\xae\xf3\x1c\xf0\x56\x59\x84\x59\x43\xa4\x8f\
+\xaf\x45\x1c\xc4\x43\x5c\x8c\x07\x8f\x97\xc2\x52\x94\x07\xce\xe0\
+\xf9\x80\x7a\x28\x7d\x82\xe6\x8e\x4a\x92\xd7\xf8\x63\x92\xad\xf2\
+\x93\x3c\x66\xad\xff\x68\x80\xf0\x7e\x6f\x5d\xe1\xb6\xc7\xb5\x93\
+\xb0\x61\x12\x7c\xbc\xbd\xb0\x6d\xeb\x56\x1c\xdb\x3e\x4f\x82\x8b\
+\x29\xb0\xf6\x6d\xba\x9c\x3a\xa4\x5c\x1e\xf3\x06\xbc\x06\xd6\xd7\
+\x8e\xe8\xf5\x9e\x97\x04\xab\xce\xcf\x52\x79\x92\xa4\xc8\x4c\x0e\
+\x1e\x3c\x88\xd5\xab\x57\x7b\x9a\xf4\xe8\xec\xea\x31\xa0\x81\xf6\
+\xdc\xb0\x7a\xc8\x9c\xf4\x3a\xf1\x10\x97\xc2\x87\x3d\xc3\xd5\x69\
+\xb1\x2a\x72\xb1\xf2\x82\xbc\xd5\x7d\x95\x3e\x31\xe3\x3f\x45\x68\
+\x68\x68\x16\x73\x96\x7b\xf7\xee\x8d\xfa\x9d\x01\x0e\x7e\xd1\xf4\
+\xcd\x78\x43\xbd\x4a\x46\xce\xa8\x8d\x0b\x21\x09\x4c\x04\xf8\xb8\
+\x23\xd1\x7b\x36\x2a\x82\xac\xb9\xe5\xa8\x83\x48\xd1\xec\x97\x95\
+\xeb\x05\x0e\xaa\x8b\xc5\xbd\x9b\x9f\x13\xe5\x3f\x17\xe5\xd5\x7b\
+\xf9\x33\xa6\x9a\x32\x7b\xd9\x92\x84\x29\x96\xe5\x70\x7b\x89\xf1\
+\x47\x8f\x02\x8c\xeb\x21\x4d\xb7\x14\x88\x8b\xf8\x88\x53\xe7\x05\
+\x31\xe2\x05\x01\xd3\xd4\x51\x39\x7b\x7e\x37\xdc\x1c\xdd\xa6\x92\
+\x3a\x06\x06\x06\x9e\x92\x94\x5a\xe9\xef\x0c\x10\xf0\x6d\x13\x9b\
+\x4b\x66\x4d\x64\x9d\x3b\x21\x3a\xe2\x10\x22\xf6\xf9\x22\xdb\x7b\
+\x12\xb4\x3c\x7b\xef\x1b\x05\x38\x34\xa7\x95\xd5\x81\x24\x6d\x5c\
+\x6d\xb8\x18\xd4\xad\x10\xc5\xc7\x09\x29\x77\xfa\x3b\x48\x92\xae\
+\xef\x4b\x32\xe6\xba\x64\xa3\x35\x4b\x96\x2c\xd1\x6c\x37\x68\x80\
+\x5b\x96\x75\x90\x31\xa1\x16\x71\x11\x1f\x71\x12\xaf\x3a\x1b\x54\
+\x1e\x9c\xaf\xdb\x11\x96\x7d\xa9\xde\x1a\x83\x8c\x9a\xd9\xc8\x32\
+\xd8\xca\xac\xb3\xa4\xdb\xbb\xfc\x86\x79\x88\x49\xfb\xb3\xa1\x5e\
+\xdb\x21\xc9\x4e\x1c\xdd\xb9\x1a\xf9\x2e\xc3\xb8\x96\x74\x91\xd5\
+\xdb\x88\x6b\x4c\x9d\xc4\xb2\xa7\xbc\x86\x93\x43\x6b\xe1\xe7\xde\
+\x8d\xae\x75\xeb\xd6\xad\x2d\xc7\x3e\x0f\xea\xd5\xab\x57\xbb\xc5\
+\x5f\xbe\x7d\xf1\xe8\xa0\x37\xe8\x05\xc4\x45\x7c\xc4\x49\xbc\xd5\
+\x3b\x82\xca\x23\xe4\xff\xdc\x5f\xbd\x27\x44\x9a\xb6\x3a\x21\xf9\
+\xcc\x91\x92\x6a\xcf\x17\x03\x8c\x79\x92\xe1\x59\x35\xad\x76\xb0\
+\xe7\x0e\x6d\xe4\xa1\x30\x9c\x58\x37\x1d\x79\xeb\x0c\x51\xbe\x47\
+\x05\x13\xdd\x1b\xd8\xd6\xae\x8c\xb4\xdc\x76\xd4\x9a\xf3\x1f\xf0\
+\x5a\x95\x51\x8f\xce\x56\xd5\x87\x9b\xe7\x41\x94\xfd\x59\xf7\x0f\
+\x47\xee\xfc\xb6\xb6\xe6\xce\xc8\x3a\xc4\x45\x7c\xc4\x49\xbc\xc4\
+\x4d\xfc\x5c\x06\x3c\x1d\xaa\x83\xd1\x95\x91\x6d\x4a\xdd\x5d\xb6\
+\x7e\x45\x0f\x90\x98\x62\xfb\x2b\x33\x2f\x57\x97\x98\xa8\xc8\x70\
+\xc4\xba\xac\x46\xde\x8e\xc9\x28\xde\x6f\x8b\xb2\x38\x67\x94\x9c\
+\x71\x43\xe1\x61\xb9\xe7\x31\x14\xe9\xf6\x5f\xe1\xfa\xb2\xaf\x70\
+\x66\xf6\xd7\xd8\x34\xa0\x69\x56\xf7\xee\xdd\x55\x81\xe2\x79\x12\
+\x31\xd8\xf5\x6b\x9e\x71\x64\x72\x6f\x9c\x9f\xf7\x0d\x92\xe4\xf0\
+\x93\xb5\xfe\x1b\x14\x78\x0e\x45\x71\xd4\x6a\x68\xce\xba\xa1\xfc\
+\xb8\x33\x4a\x83\x6c\x91\xbb\x7d\x0a\xee\xac\x18\x0e\xd7\x85\x53\
+\x4c\x59\x74\x91\x7a\xc3\x7a\xdd\xec\xbb\xb9\x19\xf1\x80\x13\x7e\
+\x38\x86\xe9\x69\x66\x68\x99\xa4\x64\xee\x8e\xa9\x2a\x66\x6b\x54\
+\x12\xc3\x57\xde\xd7\xd7\x84\x3c\xc0\xd4\x9d\xb7\x31\x7a\xd4\x8c\
+\x48\x99\x81\x3a\xcf\xdb\x00\xc4\x30\x76\xd8\xd4\x18\x2b\xe7\x5b\
+\x58\x12\x70\x1f\x2e\x47\xf3\x11\x71\xa5\x12\x67\xee\x00\xd7\xee\
+\x03\x69\x8f\x80\xdc\x12\x40\x92\xcd\x28\xd5\x54\x22\x3d\xa7\x04\
+\x01\x1b\xec\x1c\x58\x71\x92\x78\xe2\xa1\x98\x48\x76\x37\xea\xe0\
+\xc1\xd0\x8a\xc4\x94\x2c\x14\x95\x56\x00\xd0\x65\x6b\xd3\x73\x81\
+\xc4\x0c\x95\xb2\x62\xe6\x86\xc9\x0b\xf5\x0e\x3f\x7e\xdb\x2d\xf4\
+\x1a\x64\x33\x53\x84\x73\xfc\x73\x25\x62\xf8\xca\xc4\x7a\xee\xf0\
+\x4d\x89\x98\xef\x97\x86\x2d\x87\x73\x71\xe0\x62\x39\x4e\x26\x03\
+\x97\xd3\x81\x94\x1c\x20\xa7\x08\x28\xaf\x04\x34\x15\x55\xc8\xca\
+\x2b\xc3\x01\x27\x87\x7d\xb2\xc3\x15\x8a\xde\xbe\x8a\xc9\xe1\xc3\
+\x87\x35\x41\x7b\xf6\x14\xdf\xcb\x2e\x41\x89\x58\x49\x1c\x00\x79\
+\x25\xb4\x9e\xce\x8a\x67\x6e\x03\xe1\x62\xd5\x1d\x47\xf2\xb0\x78\
+\x77\x3a\x46\x3b\x5e\xc7\x07\x9f\x7e\xdb\x89\x63\x5f\x04\x22\x96\
+\xc1\x0e\x09\x98\xe5\x95\x8a\x0d\x87\xb2\x99\x79\x62\xfa\x8d\x39\
+\x48\x26\x62\x25\x1b\x4d\xe5\x69\x84\x2a\x55\x9c\x89\x74\x75\x3a\
+\x23\x75\x46\xad\x18\x60\x6f\x0d\x9f\x98\x3b\xd3\xf2\x0a\x4b\xb5\
+\x73\x37\x86\x97\xdd\xcf\x29\x45\xa9\x98\x8a\xee\x92\x5b\x0c\xa4\
+\xe6\x00\x57\xd2\x81\x53\x62\x80\xd0\x4b\xe5\x70\x8e\xca\xc5\x82\
+\x5d\x69\x18\x63\x77\x5c\x23\x96\x7f\xfb\x45\x31\x00\xb1\x8c\x5e\
+\x1e\x5d\x35\xdd\xfd\x0e\xec\x43\x1f\x62\xcf\xd9\x52\xc4\xdd\x62\
+\x82\x55\x97\x65\xce\x2a\x50\xf5\x06\x16\x5d\x54\xe5\xc9\x6b\xef\
+\xb1\xbc\xf4\x07\xb9\xd8\x15\x1c\x73\xb2\x86\x94\xa8\x67\xb2\x42\
+\x3b\x7f\x63\x74\x69\xe6\xa3\x52\xba\x89\x3c\x08\x3c\x2a\xa6\xfb\
+\x28\x37\x52\xee\x14\x22\x6e\xe5\x18\xf9\x08\xf3\x7c\xef\x62\xc4\
+\xb2\x90\x1c\x11\xaa\xf7\x02\x19\x40\x6f\xd2\x42\xdf\x32\x1b\xb7\
+\x3b\xb0\x3b\x90\x85\x5d\xa7\x4b\x98\x7c\x65\x06\x5a\xa5\xe1\x1f\
+\xfc\x8b\x01\x1e\x15\x6a\xe0\x19\x1c\xaf\xa1\x21\xfc\x0e\xc4\x9d\
+\xf8\xd5\x00\x0b\x36\x46\x56\x3d\x31\x00\xd7\xcd\x6f\x0d\x10\x7c\
+\x41\xa3\x0c\x30\xd7\xe7\x2e\x46\xae\x88\xc8\x17\xa1\xf5\x5e\x20\
+\x03\xd4\xb3\x5a\x1c\x58\xce\xe0\xcc\xbc\x22\x0d\x10\xfb\x6f\x06\
+\x28\xf9\x57\x03\x04\x9d\x2d\xa7\x01\x7c\x82\x8f\x45\xd1\x00\xb5\
+\xf7\x05\x06\x6e\x3e\xb8\xd3\x55\xfb\x67\x3d\xc0\xd2\xfe\x5c\xa5\
+\x08\x7d\xe3\x05\x32\xc0\x1b\x83\x57\x9e\xd6\xd2\x00\x7f\xc6\x03\
+\xc2\xbd\xdd\xb3\x25\x06\x94\x78\x78\xf9\xac\xa9\x7e\xcb\x0a\x0e\
+\x72\x74\xa8\x62\x0c\x28\xfb\x4f\x31\x20\xf9\x49\x0c\x60\xa4\x65\
+\xc4\xfd\x6c\xac\x7d\xdb\x17\xc5\x00\x5d\x87\xd9\xb7\x35\xb1\xbb\
+\x8c\xea\x18\xb0\xfb\x4c\xc9\x7f\x8d\x01\x41\xae\x5b\x1e\xf0\x20\
+\xb4\x7d\xfb\xf6\x41\x8a\x81\xbc\x5c\xdc\xf5\x72\x58\x55\xf6\xef\
+\xbb\xc0\xdd\x7f\xd9\x05\x0e\x5d\xae\xc4\xf6\x98\x3c\x2c\x92\x5d\
+\x60\x94\xd3\x0d\x18\x4e\x71\x35\x7f\x51\x0c\x60\x69\xf5\xd3\x78\
+\xf3\x75\x57\x7f\xdd\x05\xf6\xc5\xff\x7e\x17\x28\x7b\xb2\x0b\x48\
+\x3d\xc3\xaf\x58\x5e\x88\xd2\xbd\xbc\xbc\x6a\xd5\x90\x7e\x9e\x97\
+\xa5\xcc\xad\xd9\xbc\x62\xd9\x9d\x3b\xf1\xa7\x91\x97\x78\x1e\x95\
+\xf7\xae\xa1\xf0\x5e\x12\x1e\xa6\xa5\x21\x25\x39\x15\x57\x2f\xdf\
+\xc0\xd9\xb8\x93\x08\x0a\x3a\x82\xad\x6e\x87\xb0\xd4\x3e\x10\x8b\
+\x26\x4c\x77\x79\x51\x0c\xf0\xc3\x28\x6b\x9f\x39\x2b\xf6\x62\xdd\
+\x96\x50\xec\xf2\x8f\x46\x6c\xd4\x09\x24\x9c\x3e\x8d\xa4\xc4\x1b\
+\xc8\x48\x4d\x45\x7e\x46\x1a\x34\x99\x49\x28\x4d\xbd\x82\xb8\xb0\
+\x03\x38\x79\xf2\x24\x0f\x41\xfe\x1c\xcb\x46\x87\xc9\x62\x8d\xaa\
+\x79\x53\xac\x9d\x98\x34\x48\x9d\xd8\x5e\xa5\x95\x8b\x77\x58\xa2\
+\x32\x6c\x01\xb3\x2b\x7c\xbf\x56\x69\xe8\xd2\x79\xba\x24\xc8\x3d\
+\xab\xda\x38\x66\xaa\x77\xfd\x45\x31\x40\x48\xbf\xb7\xcf\xde\x1c\
+\x5a\x8f\xb8\x88\x8f\x38\x89\x97\xb8\x89\x5f\xe9\x51\xec\x32\x42\
+\x8e\xf9\xab\x10\x19\x7e\x08\xfe\xde\xee\xf7\xc5\xfd\xd5\x3b\x0c\
+\x5f\x2f\x83\xa5\xc7\x47\x6b\x6e\x6e\xde\xf3\xaa\x55\x7b\x0d\xbb\
+\x32\x72\x16\x7e\xc2\xfc\x3a\x2b\xb2\x4c\x32\xb2\x48\xc9\x3a\x1d\
+\x4b\x55\x4c\x3c\xa8\x57\xcf\x24\xcb\xba\x38\x6d\xd4\xa0\xc3\xf3\
+\x56\x3e\xb6\x6f\xa3\xd6\x17\x07\xd5\xaf\x4c\x16\x3c\xc4\x45\x7c\
+\xc4\x49\xbc\xc4\x4d\xfc\xc9\xbb\x97\x22\x6c\xaf\x0f\x22\xc2\x0e\
+\x62\x97\xb3\x03\x46\x0d\x1e\xd4\xa3\x7a\x3c\x1b\x9d\xa2\xe4\x44\
+\x74\x5f\x22\x69\xe3\xfd\xa6\xed\x92\xef\x8c\x6b\xc7\xfa\x3b\x8b\
+\x8e\xac\xcd\xf3\x75\x92\x15\x5a\x95\x64\xa8\x94\x3a\x1d\xf3\x6f\
+\x4c\x46\xa6\x8e\x7e\x03\xa7\x4c\xf5\xdc\x9f\xaf\x01\x58\xbb\xd0\
+\x0f\x4a\x1c\xfc\x26\xf1\x10\x17\xf1\x11\xa7\xe0\x95\x17\xb7\xc0\
+\x95\x88\x3c\xb0\x17\xf2\x96\x87\xb0\x03\xc1\xf0\x5f\x38\x92\x29\
+\xfb\x02\xea\x5a\x3d\x9e\x3b\x40\x9c\x2c\x81\x12\xb9\xf9\x9a\xf5\
+\x67\xef\x39\xdf\x95\x25\xc0\x96\x14\x96\x9e\x99\x4e\x62\x5a\x89\
+\xe5\x69\x55\x98\x5c\x51\x5b\xb9\xd7\x23\x9b\x57\x91\x2e\x09\x91\
+\x6b\x43\xeb\x95\xc6\x1b\x37\xa9\xfd\x77\x29\x2b\xff\x5e\x92\xbe\
+\xc1\x0f\x25\x78\xb5\xe0\xff\x5f\xea\xaf\xff\xf1\x65\x93\x06\xda\
+\xa4\x61\x75\x15\x9e\x1c\x9b\xd7\x70\x6d\x79\x0f\x84\xb9\xd8\x22\
+\x60\xb7\x1f\x82\x83\xf6\x23\x78\xff\x5e\x04\xad\x9b\x8f\x13\x53\
+\x3f\x46\xca\xe4\x0e\xf0\x30\xef\x14\x46\x5d\xab\x79\xf2\x4d\x70\
+\x8f\x78\x40\xc6\xf1\xe3\xc7\x5f\x92\xe4\x86\xe1\x0d\xab\x76\x15\
+\xa9\x13\xda\xa9\x06\x84\x22\x67\x0b\x54\x04\xeb\x8a\x90\x08\x9e\
+\x08\x6c\xf9\xe0\xd7\x9c\xc0\x03\xeb\xd7\x91\x32\x4a\x79\x81\xff\
+\xb3\x56\x7c\xcb\x96\x2d\x75\xa4\x2d\x2e\x4a\xfe\x56\xd8\xd9\xd9\
+\x55\x3a\x3b\x3b\x63\xdb\xb6\x6d\x05\x5e\x2e\xdb\x2a\xfc\xd6\x2f\
+\x87\x9f\x93\x1d\x5c\x36\xdb\xc3\xc1\xde\x1e\xab\x56\xad\xc2\x36\
+\xe7\x2d\xd8\xe5\xe6\x8c\x18\xa7\xd9\x48\x5a\x67\x82\x07\xf6\x46\
+\x4a\x9f\xdb\x93\x3b\x56\x0e\xfa\xbc\xeb\x6f\x76\x2f\x06\xc1\xb5\
+\x92\x1f\x63\x7a\xe8\x13\xf9\xd7\x3c\xdc\xac\xcd\xfd\x54\x09\x86\
+\x6c\x4e\xe2\x32\x60\xa9\x89\xcb\x40\x65\x57\x7c\x06\xb0\x12\x23\
+\xa5\xeb\x27\x5e\x90\x3c\xbc\x2e\x2e\x19\x37\x18\xfd\xac\x94\xb7\
+\xb5\xb5\x7d\x55\x26\x29\x63\xe5\xca\x95\x55\xa2\xf4\x5d\x31\xc4\
+\x0e\xc1\xec\xef\xeb\xb2\xf5\x56\x80\xb7\x07\xf6\x78\xbb\x21\x28\
+\x70\x2f\x02\x77\x79\x22\x54\x82\xdc\x29\x87\x21\xc8\xd8\xd4\x1b\
+\x79\x5e\xa3\x50\x16\x3a\x97\xf8\xa9\x87\x5a\xd6\x97\xc7\x77\x28\
+\xa4\x8e\xff\x6e\x80\xfe\x92\x23\xcb\x67\x76\x44\x5c\xa3\xf6\xf4\
+\x2f\x3a\x78\xdf\xb5\x7e\x17\xf7\xbe\x7b\x8f\x95\x56\xdd\x6e\x10\
+\x3a\xef\x49\x30\x74\xea\x84\x0a\x29\x55\x17\xce\x64\x2c\x78\x0d\
+\x77\x25\x33\x9c\x68\x51\xaf\xec\xaa\x71\xc3\xf7\x9f\x85\x01\x44\
+\x61\xb7\x35\x6b\xd6\x60\x9b\xfc\xab\xbe\x77\xc1\xa8\x51\x97\x0b\
+\xc6\xfa\xf9\x49\x96\xf5\x91\x36\xbe\x9e\x2a\xbf\xe7\xcf\xa9\x85\
+\xb2\x45\xaf\x40\xeb\xd8\xa9\x3a\xf8\x11\x37\xf1\x53\x0f\xa9\x54\
+\xbf\x07\xf7\x41\x1d\x63\xa8\xe3\xef\xea\x02\x92\x1d\xd1\xc8\x4e\
+\x70\x9d\xef\xd6\xb2\x0c\x4c\x8e\x0d\x69\x9d\x9f\x32\xa1\xbd\x4a\
+\x21\x15\xac\x1b\xc8\xfa\xbb\xce\x0b\x22\xe6\xb2\xfa\xc2\x2d\x86\
+\x25\x29\x46\x5c\x95\x86\x4a\x95\xa5\x90\x60\x5e\xff\x2e\x7b\xf8\
+\x9e\x81\xfb\x67\x6d\xde\xbc\x39\x8b\xd7\xa4\x8b\x06\x0d\x3e\xbf\
+\x38\xb0\x41\xd1\x8d\x21\xf5\x28\xb7\x3a\x25\x4e\x3c\xc4\x45\x7c\
+\xc4\x49\xbc\xc4\xad\xf0\x3f\x90\xd9\xbf\x31\xfe\xdd\xf2\x1e\x5d\
+\xbb\x0e\xa2\x8e\xbf\x33\x80\xa4\x9a\x4f\x48\x96\xf5\x21\x83\xcb\
+\x07\x1f\x7c\xd0\xc4\xb2\x67\x47\x4f\x9e\x09\x68\x35\xe5\x05\xdb\
+\x87\xb3\xde\xa6\xf3\x82\xd0\xa9\xdc\x11\x98\x78\xac\x5e\x0a\xdc\
+\x7e\x24\x1e\xd4\xc1\xd5\xc1\x6f\xde\xbf\x62\xac\xd7\xfd\x69\xae\
+\x7d\x49\x7f\x43\x02\xdf\x21\x35\xf3\x06\x8d\x8c\x2e\x0d\x68\x50\
+\x46\xe5\x29\x8f\x72\x29\x9f\x38\x88\x87\xb8\x88\xaf\xba\x3e\x48\
+\xdc\xb9\xcb\xbe\x50\x55\xe2\x9f\x0d\xde\x0f\xa7\x6e\xff\x2e\xa3\
+\x3a\x25\xd6\x9b\xcd\xc8\x7b\xf6\xec\x09\x14\x0b\xd5\x94\xc2\xac\
+\x41\xa8\x49\xeb\x07\x29\xe3\x24\x16\xcc\xee\xc2\x4a\x2b\x5b\x51\
+\x74\x3d\x40\x87\x7f\x00\xf6\x5b\x31\x20\xca\x76\xc3\x7e\x00\xdd\
+\xe1\xe8\xfe\x63\x23\x24\x0e\x79\xb3\xe2\xa2\x71\xfd\xe9\x4f\xc3\
+\x00\x12\x97\x7a\x4a\xd0\xab\x90\xae\xf1\x95\xf1\x86\xfa\x23\x13\
+\x06\x36\xac\xa8\x56\x9e\xf2\x28\x97\xf2\x89\x83\x78\x88\x8b\xf8\
+\x88\x93\x78\x89\x9b\x05\x91\x4b\xa3\xdb\x95\x50\x27\xea\xf6\xff\
+\x2d\x8d\xc9\x12\x48\x0a\xdc\x1f\x98\x25\xef\x05\xcd\xf9\x7e\xdd\
+\xbf\x5b\xe7\xf5\x49\x63\xda\x68\xb9\x14\x18\x41\x0b\x37\xab\x02\
+\xe9\xe3\xa5\x30\x4f\x77\xca\xda\xd4\x9e\xf1\x80\x05\x09\x9d\x27\
+\x4c\xac\xa5\xf6\xe3\x5b\x72\x2a\x4b\x18\xd4\x30\xf0\x82\x41\xfd\
+\x56\x7f\xb1\x19\x7b\xdc\xc6\x8d\x1b\xe1\x3a\x69\x40\xe6\x35\xd3\
+\xfa\x5a\xf2\x25\x7f\xca\xa1\x3c\xca\xa5\x7c\xe2\x20\x1e\xe2\xaa\
+\x2e\x8c\x12\xef\xc3\xf9\xdd\x71\x67\xdc\x3b\x98\xdb\xe7\x7d\x1f\
+\xea\xf4\x5f\x8b\xa3\x4e\x4e\x4e\x9f\x47\x47\x47\xb1\xf9\xf9\x32\
+\xd7\x89\x14\x3a\xbf\xd8\xd6\xbf\x6d\xe2\xed\xb1\x6d\x75\x01\x71\
+\xf9\xd7\x74\x29\x9e\x0e\x59\x71\x61\x8f\x8e\xee\x6c\xb0\xbe\x15\
+\x41\x70\x26\xd8\xca\xc2\x35\xa9\x72\xf4\xb7\x2d\xe9\x0d\xf5\xb4\
+\x97\x4c\xea\x87\x5f\x34\x6a\x30\xb0\xba\x3c\xfd\x67\x89\x81\x2e\
+\x78\xc1\xd8\xd8\xf5\xeb\x1c\xb0\x63\xec\x17\xe4\x47\xbe\xe4\x4f\
+\x39\x94\x47\xb9\x94\x4f\x1c\xc4\x43\x5c\xc4\xa7\x70\xe6\x48\xd3\
+\xd4\x1d\xe9\x21\x8c\xb6\x78\x27\x8b\xba\x50\xa7\x3f\xac\x0e\x4b\
+\x0c\x08\x0e\x0a\xda\x5f\xec\xe1\xe1\xbe\x49\x06\xbc\x29\x25\xaf\
+\x59\x87\x8c\x5b\xe5\xb0\x54\x96\x61\xd3\x49\x55\x5a\x4b\x76\x8e\
+\x46\xe5\x81\x39\x40\xf4\x13\x23\x70\x06\x78\xfa\xe2\x5a\xcc\x97\
+\x80\xc4\x32\xd5\xfd\xf1\xca\x1b\xd4\x36\x49\xb7\xbd\x68\xaa\x77\
+\x6f\x9c\x8d\xe3\x69\x93\x29\x9e\xab\xdf\x9f\x73\xb2\xff\xfb\xb3\
+\x4e\xbe\xd3\xd5\x3a\xfe\x15\x12\xaf\x79\xcf\x78\xb2\xf7\xaa\x31\
+\x93\x1d\x4f\xc7\x9b\xe8\x27\xc9\x8c\x23\x76\xb6\x21\xa4\x2b\x1d\
+\xde\x13\xbf\x24\x3f\xf2\x25\x7f\xca\xa1\x3c\xca\xad\x56\x9e\x78\
+\x88\x4b\xe1\xcb\x5b\xd5\x17\x3c\xd1\x5e\x1c\xf9\x4e\xe9\x67\xdd\
+\xbb\xce\xa5\x2e\x7f\xaa\x41\x82\x27\x2d\xf1\x80\x34\x59\x0a\x5a\
+\x59\x7f\xbe\xb2\x23\xbc\xdb\xb3\xdb\xc7\x6b\xe2\x87\xb4\x28\x4b\
+\x1e\xd5\x1a\x59\xb3\x3e\xe4\xba\x62\xeb\x2a\x5b\xd4\x9e\x54\x8d\
+\x02\x2c\x01\xe7\x2e\x0c\x44\x2c\x4d\xf1\x38\xca\x59\xe2\xd1\x94\
+\xc0\xd5\x56\x79\x4b\x3a\x3b\xcc\x1c\xae\x62\xc0\x9a\x04\x7c\xbb\
+\xe2\x22\xbe\xf9\xe9\x02\xbe\x5e\x76\x4e\x4b\xe2\x75\x5f\xb9\x67\
+\xb8\x3a\x01\x83\xd6\x5e\x41\xa2\xa5\x3e\x58\xe8\x38\xb5\xa0\x2f\
+\xd6\xda\xd9\x21\x60\x5a\xdf\xea\x46\x29\xf2\xa7\x1c\xca\xa3\x5c\
+\xca\x27\x0e\xe2\x21\x2e\xc1\x67\x80\x94\x89\xed\x70\x63\x64\xeb\
+\x2a\x93\x4f\xbb\x6c\x94\x72\x7d\xbb\xff\x53\x8b\x8c\xbc\x25\xd5\
+\x96\x60\x78\xd3\xd3\xcb\xa3\xd2\xd1\x69\x73\xf9\xac\xd9\xb3\xce\
+\x9b\x7d\xd3\xeb\xd0\xb5\x61\x2d\xaa\xd8\xa4\xfc\x60\xa6\x1c\x90\
+\xec\x8d\x28\x8c\x91\xf6\x71\x7f\xe0\x7c\x20\x68\x3c\xe0\xde\x9b\
+\x8d\x0a\x0c\x4a\x72\x64\x7e\x62\x08\xce\x5c\xfa\x77\x6f\xe2\x7b\
+\xcf\x14\x4c\x71\xbd\x8d\x09\xdb\x92\xc0\x3c\xfe\x98\x2d\x37\x15\
+\x8d\x75\xbe\xa9\x52\xed\xdf\xb9\x24\xab\xa4\x46\xda\xc4\xfa\xca\
+\xd5\x2f\x2d\xfa\x0c\x3f\xfd\xf4\x13\x42\xe6\x1b\x49\xf9\xbb\x26\
+\xf9\x92\x3f\xe5\x50\x1e\xe5\x52\x3e\x71\xe8\x94\xff\xd9\x00\xa9\
+\x12\xb3\x6e\x8d\x68\x85\xe9\x5f\x75\xdc\x2f\x51\xbf\xdb\x1f\x55\
+\xac\xff\x5b\x29\x7a\xba\xaf\xaf\x4f\xe6\x5a\x7b\xbb\x8a\x61\x96\
+\x43\x31\x63\xd0\xd7\x9a\xeb\xc3\x5a\xe0\x86\x34\x28\xa7\x73\x39\
+\xd8\x19\xb0\x53\x53\xd6\xdc\xf7\x0c\x3c\x2c\x44\xb2\x22\xcb\xae\
+\x4e\x36\x35\xb2\xd3\x93\xbd\x7d\xdc\x9f\x75\xf1\x61\x76\x1d\xac\
+\x0b\xcb\x56\x85\x95\xe5\x81\x99\x58\x2a\x45\x8c\x1f\xf7\xa4\x93\
+\x58\xd0\x60\xbd\x81\xfd\x83\x2a\xa3\x93\xf3\x7d\x5d\x5d\xe7\xc9\
+\xb2\x2e\x90\x5d\x00\x11\xcb\xcc\x50\xb9\xbc\x2e\xf9\x92\x3f\xe5\
+\x50\x1e\xe5\x52\xbe\xc2\x91\xb3\xbc\x37\x92\x46\xb7\x11\x7c\x2d\
+\x61\xff\x6d\xfb\xb3\xb2\xee\xfb\xfe\x99\xb2\xdd\x9f\x39\x89\xbd\
+\x2b\x5e\xb1\xcb\xfa\x3b\xeb\xdc\xe9\x66\xdf\x6a\x13\x2c\x5a\x80\
+\xfd\x03\xb4\x74\xee\xaa\x3e\x28\xde\x3a\x8c\xed\x69\xaa\x23\x03\
+\xd1\xca\x1b\x74\x0d\x4b\xbb\xcc\x80\x1d\x3d\x58\xaf\xd7\x2d\x8d\
+\x1f\x6b\x21\xe0\x97\x52\x56\x97\x54\x97\xe8\xce\xd8\x02\x56\x71\
+\x14\xb9\xc6\xaa\x6e\x51\x76\x90\xaa\x74\x56\xe9\x0f\xb5\xd5\x3b\
+\xc7\xfd\x55\xed\xe1\xe4\xb8\x19\x51\x6b\xad\x50\xe5\x33\x88\x7c\
+\xc9\x9f\x72\x28\x8f\x72\x95\xfc\x07\x0b\x7b\xe2\xc6\xf0\xe6\xb8\
+\x3e\xac\xb9\x76\x69\x9f\x77\x4f\x8a\xdb\x0f\xe5\x89\xef\xa9\xb6\
+\xca\x0a\xc3\xfa\xfd\xfa\xf5\x9b\x3e\x6c\x40\xff\x6b\x27\xa5\x4f\
+\xe7\xba\x45\x53\x24\x8d\x6a\x85\xec\xc5\x9f\xa9\xfa\x7b\xa9\x87\
+\x15\x23\xf0\x93\x46\x69\x6e\x49\x3c\x94\x70\x9d\x7a\x19\xa0\x6a\
+\x47\x2f\xe6\xe9\x98\xad\x55\x7d\xc1\x51\xd7\xaa\x10\x79\x55\x47\
+\x87\xe5\x9a\x7d\xc3\x2c\xbf\x31\x99\x59\xb5\xe9\x5d\x35\xdb\x59\
+\x9e\x23\x20\x81\x19\x47\x9c\xe7\xa0\xfc\xc0\xf7\xd5\x0d\xd3\x94\
+\xa3\xe4\x15\x6c\x30\xc1\x5d\x9b\xce\x10\x2c\xec\x09\xac\x18\xdd\
+\xab\x23\xcf\x31\xc3\x88\xf5\x99\x74\x8b\xb3\x0e\x27\x3b\x43\xbf\
+\xee\x5d\x3f\xda\x14\x32\xa0\x45\x36\x3f\x65\xb9\x2e\x94\x32\x5e\
+\xce\x0a\x2b\x7a\x57\xb7\xca\xab\x37\x48\x2d\xbd\x41\x88\x19\x19\
+\x06\x2a\xed\xc1\xef\x55\x92\xf2\x7c\xaa\xae\xd4\x76\xf6\xce\x6f\
+\xa9\xba\x63\x9c\x99\x5c\x6d\xb0\xb5\x32\xde\xa3\xd0\x1f\xb1\xdb\
+\xdf\x0f\xb1\x6e\x4b\xa0\x91\x3a\x3f\xf9\x92\x7f\xd1\x16\x0b\x64\
+\xcc\xe9\x0e\x76\xb1\x11\xc3\x49\xb3\x16\xc5\xbd\x3f\xf9\xd0\x99\
+\xd8\x88\xf1\x99\xb6\xcb\x8b\x80\x57\xc5\xc5\x7a\x08\xd9\x3a\x7c\
+\xdd\xfa\xea\x25\xf3\xa6\x55\x6c\xa6\xbc\x2a\x40\x52\xad\x3b\xca\
+\x56\xd9\x5f\x19\xa2\xd4\x6b\x3c\xca\xf7\x4d\xd7\xa5\xd5\x8e\xd8\
+\x42\x7b\x64\x39\x92\xb3\x80\x5b\xd5\xdf\x0a\x64\x00\xd7\x9f\x50\
+\xf5\x37\x03\x4c\x63\xcb\x2c\xff\xa4\x82\x5b\x4e\xc4\x6a\x7e\x32\
+\x87\x38\x37\x5b\x14\xee\x1c\xa5\xf8\x66\xfe\xf0\x19\x12\xa5\x81\
+\x8b\x32\xaf\x98\x37\xd1\xfa\x18\xb6\x4e\xed\x2a\x58\x88\x89\xd8\
+\xfe\x96\x0f\x26\x78\xa4\x94\x08\xfb\x9e\x58\x7c\x5a\xcf\xae\x5d\
+\xdc\xbd\xfb\xb7\xbc\x77\xd9\xf4\x9f\xda\xcb\x83\xde\xc2\x55\x01\
+\x76\x5b\x3c\x22\x73\xc1\xa7\xe2\xa2\xa6\xec\xce\x50\xc7\xd2\xb2\
+\x7d\x33\x91\xf5\xaf\x5f\x8b\xe4\x02\xf7\x14\xc9\x35\x29\x8f\xbf\
+\xe9\x72\xf8\xe5\x21\xf3\xd4\x69\x2e\xcd\x73\x26\x22\x24\x89\x79\
+\x62\xe3\x34\xa4\x4d\xff\x40\x29\x4e\x19\x97\xa5\x43\x2c\x74\x60\
+\x8b\xec\xfe\x9f\x7c\xe8\x4b\x0c\xc4\x42\x4c\x7f\xeb\x27\x33\x8f\
+\x4f\x8b\x8d\xc4\xf2\x7d\xe4\xbc\xb0\xa0\x4f\xf7\xce\xbb\x43\x0c\
+\x9b\x65\x13\x60\x82\x49\x63\x92\x02\x7a\x4b\x1a\x9e\xd3\x67\x77\
+\x43\xae\xbd\xb1\xca\xcd\x17\x69\x9e\x7c\x2b\x94\xaf\x88\xd7\x8a\
+\x54\x49\xbe\x44\x23\xd7\x8e\x16\x78\xb0\xe4\x4b\x1c\x5f\x31\x01\
+\x52\xb8\x45\xec\xf7\xfd\x65\xb6\x75\x7c\x8f\x18\x37\x2d\x1c\xde\
+\xf3\xfd\x60\xca\xa4\x6c\x62\x20\x96\xe7\xf0\xe1\xe4\x6f\xbc\xa1\
+\xa9\xcc\xc4\x40\x01\x63\x3b\xb0\x7b\xa7\x60\x97\xbe\xad\xd3\x4e\
+\x98\xb6\xc0\x25\x93\xb7\xf8\x4d\x91\xa2\x04\xf3\x66\x2c\x4c\xfc\
+\xe6\x8b\xb1\xea\x7f\xbc\x26\x55\x7f\x39\xc6\x67\x39\xe6\xe0\xe6\
+\x95\x60\xd3\xc6\x59\x8b\x96\x9a\x3d\x86\x2d\xee\x8f\xfc\xb4\x63\
+\x38\x65\x50\x16\x65\x52\xf6\x5f\xc5\xff\x54\x1b\x19\x85\x5a\x0b\
+\x99\x09\xc0\xd9\xd2\xbf\xe3\x3a\xc2\xc2\x3c\xcf\x71\xf0\xa7\x88\
+\x36\x6e\x59\x79\xde\xac\x79\x55\x4e\x6e\x11\xf2\x8a\x1e\x7f\x2f\
+\x58\x5a\x81\xa2\x27\xc4\xef\x07\x75\xdf\x0e\x16\x94\xe1\x82\x79\
+\xf3\xaa\x83\xd6\xdf\x6a\xa2\xa2\x0e\xc3\xd3\xdd\x2d\x4f\x66\xda\
+\x81\x3c\xc9\x9b\x32\x28\xeb\xf9\x7e\x3a\xfb\xc7\x86\xd0\x97\x99\
+\xfa\x40\x8c\x60\x6e\x6d\x6d\x7d\x6e\xd2\xa4\x49\x45\x42\x55\x43\
+\x87\x0e\xcd\x1e\x6d\x39\x3c\x75\xe9\xc4\x11\x29\x9b\x57\xda\xe7\
+\x3a\xba\x86\x6a\x1c\xdd\xc2\x35\x5b\xd6\x6f\xcb\xb5\x9b\x63\x73\
+\x73\xde\x8c\x69\xf1\xf3\xe6\xcf\x3f\x2f\x87\xb0\x6c\xf9\x3a\xb4\
+\x54\x52\x75\x9a\x3e\x7d\xfa\x0c\x27\x2f\xf2\x7c\x16\x1d\xa8\xcf\
+\xba\x68\x59\x53\xa8\x81\x8d\x8d\x8d\xa9\xb4\xb4\x1d\x95\x63\x6d\
+\x16\x5f\x6e\x98\xb8\x0c\x8b\x88\x42\xae\x78\x03\x29\xf1\x66\x32\
+\x1b\x18\x8b\x1f\x7f\x30\x5d\x2a\x5f\x85\x56\x49\x9a\x2e\x41\x0c\
+\xd6\x82\x3c\x9e\x25\x46\xfe\xe7\x6f\xa5\xe5\xcb\x97\xff\x53\xd2\
+\x7b\xc3\xb6\x7b\x07\xad\xde\xb1\xe7\x88\xf7\xce\x7d\xb1\xfe\x2e\
+\xbe\xc1\xeb\xe5\xde\x2c\x49\x7c\x4c\xe2\xa7\xf2\xac\xd9\xfd\x5d\
+\x78\xfe\x1f\x54\xc7\x67\x32\x0b\x29\x7c\xe5\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x13\x17\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x12\x94\x49\x44\
+\x41\x54\x78\xda\xed\x9b\x09\x90\x5c\x47\x79\xc7\xff\xdd\xef\x9a\
+\x73\x67\xf6\xd2\xae\x56\xbb\xba\xbd\xb2\x84\x0e\x0b\x1b\x51\xb2\
+\x1d\x0a\x6c\x8e\x40\x9c\x40\x48\x0a\xca\x54\x80\x70\xe4\xa8\x8a\
+\x53\x60\x08\x15\x8a\x22\x45\x48\x02\x14\x47\x01\x45\x05\x63\x28\
+\x53\xa9\xd8\xd8\xb1\x62\x82\x6d\x8e\x02\x0c\x54\x30\x92\x15\x09\
+\xc9\x96\xac\xd3\xd2\xae\x76\x25\x4b\x7b\x68\xaf\x99\xdd\xd9\x9d\
+\x79\xf3\x8e\xee\x7c\xaf\x5f\xc7\x33\x7b\x69\x25\xb0\x1c\x57\xa1\
+\x4f\xfa\xeb\xeb\xd7\x3b\xf5\x66\x7e\xff\xef\xeb\x7e\x6f\x34\xb3\
+\x4c\x4a\x89\xdf\xe5\xe0\xa4\x6b\x06\x5c\x33\xe0\x9a\x01\xd7\x0c\
+\xb8\x66\xc0\x35\x03\x5e\xfa\x60\x51\xe0\xff\x39\xae\xca\x7d\x00\
+\xbb\xee\x73\xad\x46\xd2\x79\x95\x44\x78\x13\x24\xef\x92\x12\x79\
+\xce\xd1\x68\x9a\x46\x63\xd2\x36\x9a\x52\x09\x33\xcf\x18\xcf\x80\
+\x49\x37\x0c\x51\x0c\x05\x0a\xbe\x2f\x0a\x55\x5f\x4c\x54\xaa\xfe\
+\xf8\xb6\x75\xa9\x83\x87\x1f\xff\xab\x7b\xf1\x12\x84\xf9\xdb\x97\
+\x11\x0c\xaf\xf8\xda\x2d\x8d\x59\xeb\x35\x89\x84\xb5\xa3\x54\x0e\
+\xb6\xb7\x2c\x6f\x59\x99\x72\x2c\xa4\x93\x26\x32\x29\x0b\xd9\xb4\
+\x85\x5c\xc6\x42\xc2\x31\x60\x5b\x06\x4c\x83\xc3\x88\xc4\x59\x86\
+\x31\x64\x00\x74\x0a\x01\xb8\x5e\x88\x3d\x87\xc6\x83\xa1\xbe\x5f\
+\x5a\x00\x5e\xde\x06\xb0\x1b\xee\x5d\xd1\xdd\x95\xff\x9b\xed\xef\
+\xb0\xdf\xdd\x37\x90\xeb\x5c\xd7\xd5\x00\xce\x01\xc7\xe6\x24\x03\
+\x09\x3b\x86\xa5\x63\x3d\xa6\xf9\x48\xb6\xa9\xc6\x96\xc9\x94\x11\
+\x8c\x01\xa1\x00\xaa\x04\xbf\xef\xe8\x04\x5a\xf3\xe1\x91\xde\xfd\
+\x67\x72\xa0\x78\xd9\x19\xc0\x5e\xf7\x4b\x33\x17\x0e\xbf\x6d\xd3\
+\x9a\xdc\x5d\xc9\x64\xc3\xad\x4d\x8d\x0d\x46\xa1\x54\xc5\xaa\x8e\
+\x26\x30\x82\xb1\x6d\x05\x1c\x03\x92\x6c\xc7\xd0\x63\x03\x96\x1d\
+\xcf\x99\x26\x87\x11\xc9\x60\xaa\x7d\x04\x24\x02\x21\x31\xed\x4a\
+\x4c\x56\x8c\xca\xc9\xbd\x8f\x77\x02\x38\xff\xb2\x33\xc0\xda\xf9\
+\xdd\xd7\x6e\x5f\x9b\xbf\x2f\x9f\x6d\x5f\x37\x34\x56\x41\x7b\x6b\
+\x0e\xe3\xd3\x8c\x40\x12\x90\xdc\x80\x50\x30\x1c\x81\x34\xc0\x25\
+\x03\x17\x1c\x2c\xe0\x90\xe0\x08\x49\xbe\x60\x70\x7d\xc0\xe0\x91\
+\x24\xb1\x4b\x48\x09\x25\x3f\x94\x38\xda\x57\x46\x02\x13\xc7\x67\
+\x4a\x85\x9b\x40\xf1\xb2\x31\x80\xdd\xf2\xe8\xb2\x5c\x22\xf9\xd5\
+\x1b\x36\xb4\xdd\x79\x71\xc2\xc5\xc8\xa4\x4f\x00\x16\x38\x67\x08\
+\x25\x00\x82\x05\xc1\x8a\x00\x04\xca\xe0\x4b\x0e\x2f\x8c\x2a\xcd\
+\x60\xfa\x24\x83\xc5\xd0\x06\xc0\x19\x03\xe7\x50\xf0\x00\x53\xf0\
+\x42\x4a\x94\x5d\x81\x54\x32\x39\xf5\xd4\x4f\x1f\xee\x06\x38\xc0\
+\xf8\xcb\xc3\x00\x76\xf3\xcf\xb7\xb4\xe6\x1a\x7f\xd1\x90\xb6\x5a\
+\xcf\x0c\xfa\x04\x61\x13\x0c\x83\x90\x04\x24\x19\x01\xc5\xe3\x80\
+\x80\x0d\xca\xbe\xe0\xe0\x3e\x08\x32\x12\x81\x2b\x78\x46\xc0\x0c\
+\x94\x94\x50\x77\xe5\x13\x92\x91\x00\xd7\xe3\xc8\x89\x9e\xd3\x9e\
+\x57\xbd\x09\x64\x2e\x98\x81\x28\x3e\x73\xf3\xcd\x2b\x66\x86\x87\
+\x1f\x19\xef\xef\x3f\x2c\x81\x43\x9c\x64\x03\x47\xbf\x26\x65\xf5\
+\x6a\x1b\x40\xf0\xbb\x77\x80\x27\x7e\x5c\xaa\xf2\xa6\x42\x59\x2a\
+\x78\x53\x30\xbd\x7b\x03\x66\x54\x51\xc9\x09\x54\x57\x56\x12\xa8\
+\x40\x04\x4b\x42\x2c\x30\x5d\xcc\xd8\x84\xfa\x90\x32\x9e\xf7\x42\
+\x89\xed\xeb\xec\xb1\x1f\xdd\xbf\x6b\x73\x0d\x9e\x44\x91\xe4\xfc\
+\xb3\x76\x5b\xdb\xce\xd6\x15\x2b\x76\x7a\xd3\xd3\x70\x4b\x25\xb8\
+\x53\x53\xc1\x47\xd3\xe9\x43\x7e\xb9\xfc\x98\x00\x1e\xff\x57\x29\
+\x8f\xbf\xe8\xf7\x01\xec\xf7\x7e\xdd\x0d\x66\x1c\x04\x43\xb6\x6e\
+\x76\x56\xd6\x70\xaa\xc2\xbc\x2e\x73\x65\x80\x56\xfc\x40\x95\x05\
+\xe2\x6a\x0b\x11\x29\x5a\x3e\x92\xb2\x44\xf7\x0a\x0b\xd6\xe4\xbe\
+\x83\x87\xf7\x7e\xef\x26\x05\xcf\x38\x28\x3f\xfe\x8d\x2d\x85\x4f\
+\xd2\x39\x0e\xe5\x57\xad\x32\x79\xf4\xd8\x30\x44\xe8\x79\x4a\x81\
+\xeb\x62\x66\x6c\x0c\xa5\xc1\xc1\x28\x9f\x71\xa7\xa7\xff\x0b\xc0\
+\x3d\x5f\x92\xf2\xdc\x8b\x63\xc0\xeb\x8e\xff\x84\xd2\x9b\x66\x41\
+\xb3\x7a\x23\x2e\x31\x66\x97\xff\x73\xc7\x62\xf8\xe3\x9d\x7c\xf0\
+\xe1\x7b\x3e\xd2\x4e\xe0\xfc\x05\x03\x38\x7f\xfc\xdf\xb6\x15\x13\
+\xcb\xb7\x6d\x7b\x53\xaa\xa5\x05\x22\x82\xae\x54\x40\x55\x87\x4f\
+\x39\xa0\xac\x8f\x95\xca\x64\xc6\xe4\xb9\x73\x81\x5b\x2c\x3e\xc4\
+\x84\xf8\xfc\xa7\xa4\x3c\xf1\x1b\x2f\x01\x76\x5b\xff\x1f\xc1\x48\
+\x12\xfc\xd5\x8f\x1d\x1b\x4c\x3c\xf3\x3f\x3f\xba\x08\x6e\x76\x28\
+\x78\x70\x44\x79\x67\x93\x68\xc9\xe7\x72\x37\x37\xe4\xf3\x90\x42\
+\xc0\x64\xd1\xd2\x33\x60\x58\x16\xcc\xa8\x13\x48\xc1\xff\x49\x08\
+\x38\x4d\x4d\x68\x48\x26\x4d\x32\xe0\x3d\x33\x83\x83\xef\xfe\x22\
+\x63\x0f\x13\xd8\x5d\x77\x4b\x39\x71\xe5\xef\x05\x0c\xf1\xa7\x58\
+\x34\xd8\x8b\xa6\xe6\x2c\xc7\xca\xe6\xa0\xff\xf4\xb3\x4f\x6e\x07\
+\xb3\x00\x66\x02\xdc\x52\x7a\xdf\x3a\xb9\xb9\xa1\xa9\x89\x85\x13\
+\x13\xf0\x49\xa2\x50\x00\x68\xfd\x73\xaa\xb6\xe9\xba\x30\x7d\x1f\
+\x16\xc1\xdb\x11\xbc\x94\x48\x02\x48\x32\x86\x6c\x22\x81\xd6\xe5\
+\xcb\xd9\xb2\xf6\xf6\x3b\x93\x86\x71\xf4\x9b\x8c\xbd\xe1\xca\x37\
+\x41\xc9\x6e\x04\xd8\x6f\x7c\x5f\x7c\x39\x61\x19\xc0\x6b\xb6\x5a\
+\x78\xf2\x89\x07\xcb\x0a\xba\xb6\xf6\xf1\x86\x65\x21\xd6\x58\x7e\
+\xce\xa0\x16\x97\xd1\x9a\x8f\xaa\x0f\xa8\x4e\x00\x41\xb3\x20\x00\
+\x27\x03\x98\xe7\x29\xf1\x6a\x15\x06\x1d\x0b\x9a\xd7\xdd\x01\xdb\
+\xb6\x91\x68\x6c\xec\x08\x8a\xc5\x9f\xde\xcf\xd8\xa7\xde\x23\xe5\
+\x3f\x5f\xbe\x01\x8c\xad\xfc\x4d\x0d\x58\x1a\x9c\x61\xeb\x5a\x13\
+\x5b\x56\xb3\x99\x91\xe1\xa1\xc3\x17\xce\x9e\xb8\x45\x19\xa0\x5b\
+\x9f\x73\x13\x7f\x7d\xbd\x07\xa3\x58\x06\xfc\xf8\x7a\x2a\xb4\xa9\
+\x4c\xc6\x3b\x28\xd3\x26\x48\x12\x27\x03\x84\xef\xc7\x46\x91\x11\
+\x26\x29\xa4\xb1\x3a\x8e\x1e\x63\x59\x8c\x8c\xf9\xa7\xef\x31\x56\
+\x7a\xbb\x94\x5f\xbd\x3c\x03\x44\x70\x0e\xdc\x7e\x05\x5e\xc4\xb0\
+\x4d\x46\xd0\x1c\x5b\xd7\x18\xd3\xbd\xfd\x43\xa7\x1f\x7c\xf8\x99\
+\x0d\x5d\xcb\xcc\x3c\xd8\xec\xea\xbf\x77\x8d\x40\xdb\xf8\x05\x84\
+\x53\x53\xe0\xa6\xa9\x3a\x4a\x72\x0e\xae\xaf\x9b\x4a\x64\x80\xd4\
+\x42\x5c\x79\x95\x8d\xc8\x0c\xea\x1a\x83\x96\x89\x88\x96\x09\x1d\
+\x2b\xc3\xa0\xe2\xcb\x4f\x30\x36\xf4\x46\x29\x77\x2d\x6d\x40\x50\
+\x2c\xc1\x5e\xb6\x64\x7b\x2f\x1d\x8c\xc0\x11\x41\x63\xcb\x2a\x3e\
+\xdd\x7b\x6e\xe8\xf4\x77\x76\x1d\xda\xe0\x07\xc1\x2b\x09\x96\xc0\
+\x1c\xa9\xaa\xaf\xe1\x13\x06\xc7\x07\xbb\x09\xec\xbf\xcf\xa8\x0d\
+\x8f\x93\xf4\x6d\x23\x0c\xe8\xd0\x5d\x00\x82\xa6\x2a\x2b\x50\x10\
+\xb0\xa4\xca\xf3\x48\x35\xe0\xb9\x99\x31\x32\xe1\xc7\x8c\x3d\xf6\
+\x66\x29\xab\x97\x36\xa0\x74\xba\x19\x2d\xed\x1e\x00\x1b\x60\x57\
+\x04\xac\x93\x06\xe7\xd8\xb2\x92\x4f\xf7\xf4\x0f\x9f\x7e\xe0\x3f\
+\x0f\x5d\x1f\x04\x82\xc0\x39\xc0\x13\x0a\x3a\x84\x49\x39\x92\xa1\
+\xf4\xf1\x2d\x0c\x89\xa7\x7e\x0e\xb7\xb7\x17\x1a\x5c\xc9\x27\x31\
+\xe8\x3d\x40\x8b\x49\xa9\xe6\x8c\x39\x5b\x33\xe6\x1f\xd7\xe7\x8e\
+\x0c\xf0\x01\x00\xf7\x2c\xb1\x04\xaa\xd7\xc1\x1b\xdd\x03\xa7\xfd\
+\xd6\xcb\x02\x06\x66\x5d\xd7\xb7\xae\x66\xd8\xbc\x8a\x97\x7a\xce\
+\x0e\xf5\x3c\xf0\xc8\xb3\x1a\xdc\xc0\xac\xcd\x0e\x1c\x42\x9a\x1c\
+\x7a\xae\x25\x61\xe0\x5d\x6b\x25\xa6\x1f\x3d\x86\x14\x50\xdf\xba\
+\x98\x21\x25\xe7\xc1\xe8\xbc\x18\xf0\xe2\xa6\xdc\xb9\xb4\x01\xdc\
+\x01\x26\x8f\xec\x40\xeb\xb2\x13\xe0\xe6\xa6\xc5\x80\xe7\x83\x43\
+\x81\x9f\xee\x1b\xea\x7d\xe0\x91\xe3\x04\x1e\x12\xb8\xa9\xab\xa9\
+\x85\xda\x58\xc8\xd0\x89\x0d\xb0\xf0\xc5\x9d\x16\xda\xb6\xad\x41\
+\xc3\xfb\xdf\x8f\xd2\xc3\x0f\x43\x96\xcb\x2f\x00\x0c\x91\x12\xaa\
+\xda\x2f\x4a\xb4\x2e\xbd\x07\x18\x0e\x10\xc2\xc6\xe8\x2f\x96\x37\
+\xaf\x7d\xe3\xb1\xf1\x19\x73\xf3\xa2\xe0\x36\x03\xbd\x6e\x6c\xea\
+\x44\xe9\x54\xdf\x85\xfe\x07\x1e\x39\xd5\x1d\x04\x72\xbb\xaa\xb4\
+\x41\x70\x52\x90\x02\x40\x90\x64\x08\x1a\xe8\xb9\x10\xfe\xd4\x64\
+\x13\xfd\xa3\x9e\x6f\xef\xd3\xfd\xe8\x5a\xd5\x80\x1d\x7f\x70\x07\
+\x52\x3b\x77\x62\xea\xbe\xfb\x50\xdd\xbf\x1f\x13\x00\xce\x92\x9e\
+\x27\xa5\x49\x59\x52\x86\x94\xd7\x62\xb8\xb2\x28\x02\x4d\x4b\xde\
+\x0a\xb3\x57\xff\x40\x22\xac\x02\xc2\x85\x69\x04\x6e\xd0\x78\xfb\
+\xb3\xe9\x74\xea\xd5\x33\x6e\x7d\xc5\x63\xf0\x8d\x2b\xc2\xe9\x53\
+\xbd\xe7\xcf\x1f\x38\x7c\x66\x5d\x18\x4a\x1b\xc2\x05\x44\x05\x08\
+\x23\xcd\x90\xaa\x75\x9b\x27\xd3\xe3\x58\x2d\xe9\x69\x77\xec\xe2\
+\x40\x22\x32\xeb\x6d\x23\xbf\x42\x8b\x37\x81\xfc\x96\x1b\x70\xc7\
+\xbb\xfe\x04\x37\x6d\x5e\x0b\xef\xa9\xa7\xf0\xab\x6f\x7e\x13\x63\
+\x85\xc2\x82\x3d\x68\xe9\x72\xb6\x20\xa6\xe2\x58\x3a\xf6\x00\x07\
+\xfe\x4c\xca\x1d\x97\x36\x60\xe7\x13\x52\x1b\xa0\x55\x95\xd7\x6f\
+\xe8\xde\x5f\x4d\xbe\x62\xcd\xc5\x49\xde\x76\x03\x81\x5f\x4f\xe0\
+\x27\x4e\xf6\x0f\x1d\x38\xd2\xbf\x3a\xac\x4e\x5a\x08\x26\xe3\xc7\
+\x4a\xe8\x16\x67\x7a\x5c\x03\x9e\x3b\xd7\xe8\x14\xbd\xc2\xf8\x45\
+\x3b\x32\xe0\x9d\xc3\x3f\xc7\xb2\xea\x18\x04\x24\x42\x00\xcb\xb6\
+\x6e\x9c\x7c\xd3\x7b\xdf\x69\x74\xac\xec\xcc\x9c\xfe\xd6\xb7\x30\
+\xf8\xb3\x9f\x5d\x72\x21\x9a\xa4\x0e\x52\x27\xc9\xc6\xe2\xf1\x61\
+\xe0\x17\x8f\x4a\xf9\xfa\x4b\x1b\x70\xcb\x93\x92\xa0\x81\x50\xc1\
+\x93\x5c\x35\xb6\x2d\x39\xfd\xd6\xdf\xbf\x75\x60\xa4\x50\xb6\xf6\
+\x1c\xe8\x59\x19\x56\xa7\x4c\x04\xa5\x79\xd5\xd5\x9a\x33\x37\xdf\
+\x8c\x9c\x39\xea\x4f\x16\xc7\x2d\xc0\xc4\xbb\x07\x7f\x88\x76\x77\
+\x34\x32\x80\x04\x84\x94\x07\x10\xa0\x65\xf3\x86\xe0\xad\xef\x7d\
+\x17\xeb\x12\x81\xf1\xdc\x57\xbe\x82\xca\xf0\xf0\xa2\x46\x30\xad\
+\x36\xd2\x4a\x52\x02\xb3\x63\x0c\x28\xbe\x03\x48\xf6\x48\x99\x58\
+\x7a\x13\xd4\xd7\x5c\x3d\x50\xf2\xfc\x6a\x66\x7a\xf8\x40\xe7\xa9\
+\x3e\x99\x0e\x2b\x25\xfd\xae\x2d\x15\x83\x31\x00\xb2\x76\xe9\x8a\
+\x83\x2f\x0c\xaf\x0d\x90\xbc\x04\xf0\x34\xc9\x80\x03\x13\x49\x30\
+\x08\x25\xa0\x80\x10\x06\x8d\x27\x8e\x9d\x36\xbf\xfd\xb1\x7f\x44\
+\xdb\x96\xeb\xc3\xb7\xfc\xed\x87\xd0\xd9\x73\x8a\x0f\x3e\xf6\x18\
+\xf3\x8a\xc5\x05\x4d\xd0\xa0\x28\x90\x56\xeb\xae\xd0\x11\x7c\x16\
+\xd6\xd3\x19\x88\xdb\x97\xde\x04\x79\xa2\x0e\x5c\x67\xe1\x83\xaa\
+\x4d\x29\x6d\x05\x22\x0d\x98\x99\x39\x40\x57\x38\x86\x80\x80\x0d\
+\x98\x91\x81\x26\x1c\x52\x02\x5c\xc1\x07\x91\xd9\x90\xda\x10\x28\
+\x15\x8e\x3e\x67\x7c\xe7\xe8\x67\xb1\x6c\xcb\xc6\xf0\xcd\x1f\xff\
+\x04\xd6\x8f\x8f\xf2\x81\x5d\xbb\x58\xe5\xf9\xe7\xb1\x58\x5c\x20\
+\x4d\x93\xd6\x91\xee\x45\x62\x5f\x05\xec\xf6\x2c\x02\xa8\x58\xba\
+\x03\x64\x9d\x77\x53\xf1\x86\xc6\xcd\xa8\x2e\x3c\x60\x29\xc0\x08\
+\xe7\x54\x96\xcf\x69\x77\x3e\x07\x5c\x46\x7f\xe3\xac\x25\x85\x23\
+\xe3\x67\x8f\x0d\x48\x6a\x03\x26\x10\xc0\xa2\xb1\xa1\x97\x83\x54\
+\x99\x45\x59\x19\xf1\xe0\xc7\xff\x05\xad\x5b\x37\x85\x7f\xf8\xd1\
+\x8f\x61\xbd\x5f\x35\x86\x1e\x7a\x08\x93\xcf\x3c\xb3\xe0\x5d\x4a\
+\x25\x99\xc4\xe7\x2b\x62\xcc\x83\x7d\x6b\x16\x21\x04\x0c\x30\x0a\
+\x49\x71\xe9\xcb\x20\xa4\x92\x82\x07\xa3\xb9\x14\x25\x03\x92\xd9\
+\x2c\x40\x64\x80\xa8\x01\xab\xcc\x6b\x63\x15\x6c\x76\x07\x49\x12\
+\xc3\xac\x39\x21\x38\x60\x64\xd5\x79\x2d\xdb\x81\xe3\x5b\xf0\x45\
+\x08\x57\x32\x24\x04\x87\x50\xc8\x40\xa8\xb3\xa8\xcb\x53\x47\x4e\
+\x1a\xf7\x7f\xe8\x93\x68\xdd\xb6\x29\xbc\xe3\x2f\x3e\x88\xed\x77\
+\x67\x8d\xe1\x07\x1f\xc4\x38\x6d\x96\x32\x0c\xc1\x1d\x07\xc3\x9e\
+\x1f\xec\x66\x59\x0f\xa8\xb6\x78\x90\x48\x13\x7c\x58\x63\xf6\x17\
+\x34\x80\xcc\x31\x70\xfb\x19\x7d\x2f\x50\x06\x98\x45\xe3\x34\x65\
+\x53\x49\x70\x2e\x95\x01\x26\x16\x00\x17\x80\x9c\x05\x59\x4b\xac\
+\x56\x79\xc6\x38\x72\x59\x07\xd9\x95\x67\xf9\xf9\x0d\x5f\x07\xeb\
+\xdf\x86\x7c\x49\x56\x93\x70\x9c\x29\xcf\x85\x15\x98\x30\x24\xc1\
+\x4a\x42\x15\x0a\x5a\x65\x01\xd2\x1c\x23\x4a\xcf\x9e\x34\x1e\xbc\
+\xeb\x13\x68\xde\xba\x51\xdc\x71\xd7\x07\xe4\x8d\x77\xdf\x6d\x0c\
+\xef\xda\x85\x27\x4f\xf5\x54\x2f\x1c\xeb\xb7\x5a\xdc\x20\x55\x81\
+\xa1\x1e\x1d\x92\x32\xe0\xa0\x48\x13\xe7\xa4\xee\x02\x98\x35\x78\
+\x45\x91\x56\x40\x32\x88\x97\x82\x29\x55\xeb\x23\x24\x89\xa8\x03\
+\x04\x42\x9e\xa5\xf9\xd9\xa0\xb5\x2a\x2f\x54\xf9\x48\xea\xfc\xc8\
+\x65\x6c\x34\xae\x1d\x01\x5f\xbf\x07\xd5\x65\x07\x4d\x24\x0e\x81\
+\x75\x1f\xc2\x0f\x6e\x58\x66\xbd\x7e\x4f\x13\xf2\xbb\x4d\x64\xc6\
+\x5d\x50\xf1\x20\x94\x01\x80\x50\x26\x48\x1a\xeb\x63\xc8\x59\x86\
+\x48\x52\xe9\xc8\x29\xfe\xd0\x5f\x7e\x0c\x4d\x64\x84\x63\x04\x41\
+\x43\x71\xc6\x69\x4a\x25\x51\x81\x1b\xbf\x06\xcf\xc7\x34\x24\x9c\
+\xb8\x0d\x9b\xf5\x1d\xb6\x3f\xcb\x00\x3d\xce\x93\x74\xdb\xdb\xba\
+\xf2\x5a\x64\x82\x60\x2e\x42\xe9\x00\x5c\x43\x83\xcd\x06\x55\xa1\
+\x8d\x90\x52\x57\x1c\x04\x6e\x21\xb7\x7a\x08\x7c\xdd\x41\x84\xd9\
+\x01\x54\x05\xe0\xf9\x02\xb0\xa0\xe4\xa6\x05\xdf\x73\x7b\x09\x89\
+\x9d\x1c\x1b\xf7\x25\xb0\x72\x77\x0a\x95\x02\x19\x11\x90\x11\x61\
+\x0c\x2c\xd5\xb2\xd1\x63\x49\x63\x59\x1b\xab\x63\x30\x4c\x93\x11\
+\x99\xee\xe5\x3c\x99\xb4\x11\xb7\x89\x54\x99\x51\x96\x41\x6c\x9e\
+\xbe\x77\x1a\x5e\xcc\x80\x56\x30\x56\x9b\x36\x74\x07\x08\x65\x82\
+\x5a\x8f\x82\xd9\xb3\x61\xa3\x21\xc7\xbc\xca\x33\x03\x68\x48\xdb\
+\xc8\xad\x3a\x0f\xb6\x66\x5f\x0c\x1e\x02\x41\x55\xc2\x0f\x24\x08\
+\x0d\x70\x30\x2b\xdc\x94\xc0\xa1\xdb\xca\x38\x41\x46\x6c\xde\x97\
+\xc4\xaa\xbd\x69\xb8\x13\x51\x47\xf8\x11\xac\x86\x86\xee\x0e\x0d\
+\xae\x40\xc5\x0b\x86\x24\x6c\x0b\x29\xc7\x89\xc1\x69\x0e\x42\xab\
+\x2c\xe1\x89\x10\x14\x0d\x24\x63\xa1\x3d\xc0\x8a\x3b\x80\xe9\xc2\
+\xc6\x15\x56\x24\x3c\xa1\xc6\x7e\xe0\xaa\xe3\xf9\xff\x3f\x20\xeb\
+\x8a\xcf\x90\x4d\x73\x34\x74\x9d\x05\x5b\xbd\x17\x41\x7a\x00\x41\
+\x08\xf8\x33\x92\x32\xc1\x87\x42\x19\x20\x24\x4d\x5a\x50\x26\x94\
+\x11\x20\x2b\x6c\xf2\x3b\x3e\x67\xd5\x16\x78\xfa\x35\x33\x38\xf6\
+\x2a\x8e\x2d\x4f\xa7\xb1\x66\x6f\x12\xd5\x42\x15\xbe\x1f\x10\xeb\
+\xec\xea\x0b\x95\xd5\xf2\x50\xc7\x8e\x63\x43\x75\x80\x36\xa0\x5e\
+\x46\xd9\x13\x90\xea\x59\xf9\x3c\x03\xf4\x24\x91\x4a\x2c\x6c\x82\
+\x03\x2f\xe4\x34\x5e\xf8\x1e\x4c\x81\x67\x4c\x64\x57\xf4\x01\x5d\
+\x7b\x10\xa4\x06\xe2\x4a\x97\x22\x68\x0d\x1f\xc4\x2f\x16\x20\xd9\
+\x5e\x44\x0e\x91\x92\xe8\x61\x45\x8c\x99\x2e\x3a\xbd\x0c\x72\x01\
+\x19\xa1\xcf\x5b\x35\x05\x0e\xee\x28\xe1\xe8\x36\x86\xad\x87\x33\
+\x58\xbf\x3f\x09\xaf\x58\x55\x7b\x84\xea\x88\x08\x1a\x22\x36\x41\
+\x2b\x99\xa0\x0e\x48\x38\x60\x02\x1a\x5c\x73\x48\x60\x4a\x88\x49\
+\x54\x10\x00\x10\x8b\x5d\x06\x05\xaa\x43\x13\x70\x3a\x9a\x74\x95\
+\x67\x99\xe0\x4b\x4b\x8d\xeb\x42\x81\x67\x52\x26\x32\x1d\x04\xde\
+\xb1\x07\x5e\x62\x20\x86\x9d\x22\x68\x55\x6d\x20\x14\x42\x9f\x27\
+\x04\x8c\x0a\xd0\x78\x02\xc8\x9f\x04\x26\x24\xe0\xc6\x97\xba\x71\
+\x54\x50\x60\x2e\x1a\x99\x85\xce\x4a\x0a\x39\xdf\xaa\x75\x04\xe9\
+\xc0\xa6\x2a\x8e\xac\x63\xb8\xe1\x78\x16\xdd\x87\x93\x74\xfe\x80\
+\x0a\x22\x5e\xe8\x08\xa8\xac\x0d\x48\x39\x0a\xbc\x26\xa9\x0c\xa9\
+\x7a\xee\x79\x00\x25\x52\x30\xcf\x00\x3d\x39\x8d\x99\x33\xe7\x90\
+\x58\xd1\x04\x39\x77\x43\x03\xc1\xf0\x1a\x38\xe7\x0a\x3c\xdd\x76\
+\x06\xb2\x8d\xc0\x9d\x0b\xb5\x8a\x07\x71\xd5\x75\x5f\xc6\x86\x1b\
+\x33\x31\x74\xc3\x73\x00\xf7\x01\x3f\x2a\x09\x00\x7d\x53\x29\x01\
+\x6d\x84\x87\x82\xe5\xa3\x51\x18\xe8\x9a\xb6\x91\xf3\x0c\x70\x05\
+\xc1\xe0\x01\xd8\xbf\xb6\x8c\xc3\x5d\x1c\xdb\x4f\xe5\xb0\xf1\x64\
+\x06\x7e\x19\xf0\x24\xf4\x72\x10\x64\x80\x8d\x54\x52\x1b\x80\xb8\
+\xf5\xa1\x3b\x61\x64\x26\x3c\x00\x60\x6c\xc1\xfb\x00\x3d\x39\x81\
+\xe9\x13\xc7\xd0\xfc\xda\xed\xca\xb2\x59\x26\x00\x55\x5f\x2a\xf0\
+\x74\x92\x5c\x5e\xd6\x0b\xd9\xb2\x1b\xae\x15\x55\x5c\xe8\x8a\x4b\
+\x84\x24\x40\xc1\x6b\xf0\x32\x41\x9f\x20\x9d\xaa\x81\x57\x01\x4c\
+\x92\x5c\x52\x1f\xa9\x61\x21\x23\x02\x14\xd2\x01\x1a\x39\x47\xd7\
+\x24\x43\xde\xd5\x9f\x3d\x02\xb1\x11\x5d\x33\x38\xdc\x4e\x46\xf4\
+\xe5\xb0\xb9\xa7\x11\xbe\xb4\xc9\x08\x03\xb6\x41\x45\x89\x0c\x00\
+\xf4\x12\x60\x0a\x7e\xc8\x75\xcf\xee\x2a\x5e\xfc\x0f\xc5\x08\x04\
+\x8b\x19\x30\x8a\xb3\xf7\x7d\x1f\xed\x6f\x7f\x0b\x9c\xf6\xe6\xb9\
+\x26\xf8\x21\x60\x27\x27\xd1\x7c\xdd\x5e\x54\x93\xbd\x98\xae\x96\
+\x51\x75\x43\x9a\xd7\x55\x96\x75\xe0\x5c\x83\x67\x4e\xd7\xc0\x3d\
+\xdd\x80\x2e\x6a\x11\xea\x9a\x14\xb4\x09\xa9\x7a\x23\x80\x71\x43\
+\xa0\x90\x07\xf2\x15\xa0\xb3\x08\xe4\x5c\xc4\x4b\x43\x02\x15\x84\
+\xd8\xb7\x6a\x1c\xcf\xad\xa8\xe0\xc6\x63\xcd\x58\x35\xd9\x04\xce\
+\x39\x12\x8e\xa5\x0c\xe0\x92\x04\x46\x45\x11\xde\x03\xc3\xe7\xbf\
+\xa0\xed\x2e\x2d\x78\x2b\x4c\x73\x82\x31\x36\x05\x6f\xf4\x38\x9e\
+\xfb\xe4\xd7\xb1\xf5\x1b\x9f\x00\xb3\xcc\x7a\x13\xbc\x40\xca\xc0\
+\x18\xc2\xc5\xf1\x43\x70\x8c\x75\xc8\xa7\xb2\x90\xf6\x08\xa6\xc3\
+\x22\x66\xfc\x69\x04\xc2\x8f\x5b\x3d\x43\xe0\xa9\x08\x3c\x88\xfb\
+\xd3\xd7\xef\x4c\x3c\x2c\x1e\x81\x5e\xec\x05\x6d\x42\x72\xb6\x11\
+\x13\x06\x50\x6c\x02\x72\x15\xa0\xab\xc4\xd1\x11\x64\xd0\xe1\xe5\
+\x90\x1c\x91\xe8\x2d\x8d\xe2\x38\x2b\x61\x83\xdd\x06\xcb\x30\x24\
+\xe7\x2c\xba\x12\x28\xf8\x6a\x10\x7a\x0f\x0d\x9c\xfb\xf2\xa1\xc9\
+\xc2\x2f\x01\x5c\x24\xf9\x97\x7a\x33\xe4\x91\x86\x30\xf2\xd3\x9f\
+\xe0\xfc\xbf\xaf\xc7\xca\x0f\xde\x09\x70\xa6\x4d\x88\x37\x34\x3a\
+\x0c\xbd\x00\x2e\x3f\x85\x49\x5f\x22\x65\xb5\xa0\xd1\x5e\x87\xd5\
+\x0d\x5c\xb6\xb5\xf7\x4a\x2f\x39\xc8\x47\x2b\xc0\x68\xb9\x11\xe5\
+\xe8\x83\xcb\xc9\x32\x84\x27\xb0\x60\x30\x2c\x18\x7a\x89\x28\x13\
+\xac\xa4\x85\xb4\x93\x46\x73\xb2\x19\x4d\xc9\x26\x91\x43\xc3\x70\
+\xa5\x38\x53\x1e\xee\xbb\xd0\x74\xfe\xe2\x40\x53\xa6\x12\xef\xf0\
+\xcd\x3c\x03\x87\x2a\x6f\x70\x0e\x93\x71\x44\x31\x63\xb0\xd2\xa7\
+\x9f\x3e\xf4\xf9\x1f\x9f\x3b\xf7\x43\xfd\x06\xb1\x22\x29\x16\x35\
+\x40\x77\x41\x09\x40\x0f\x4e\x7d\xfa\x1e\x54\x47\xa6\xb1\xfe\x23\
+\x7f\x0e\xe6\xd8\x60\x80\x1f\xea\xfb\x5a\x11\xaa\x04\x29\x50\xc6\
+\x19\x94\x13\xdf\xc7\x40\xa2\x97\x25\x7c\x03\xd7\xd9\xd7\x8d\x6c\
+\xcc\x6d\xc4\x6d\xcd\xb7\xa5\xda\xd3\xed\x4e\x73\x43\xb3\x59\x0d\
+\xaa\xcc\x0d\x5c\x94\xbd\x32\x66\xaa\x33\x98\xaa\x4e\xa1\xe4\x96\
+\x30\xe5\x4e\x51\xc5\x2c\x64\x9d\x2c\x92\x56\x12\x29\x3b\x85\x84\
+\x95\x80\x63\x3a\xb0\x0d\x5b\x8a\x40\x84\xe3\xa5\x71\x6f\xa4\x32\
+\x52\xee\x2f\xf5\xbb\x3d\x17\x7a\x1a\xc7\xa6\xc6\x3a\xe0\x23\xde\
+\x0f\xf2\x40\x83\xcd\xd0\x56\x62\x90\xe0\x48\x70\x1b\xb6\x61\x84\
+\x64\x82\x75\xf8\xe2\xe8\x91\x7f\xd8\xbd\xf7\x2b\x07\x86\x47\xf7\
+\x01\x18\x24\xcd\x48\x8a\xcb\xfb\x78\x9c\x31\x8b\x52\x8e\xb4\x16\
+\xad\xaf\x7f\x23\x36\x7d\xee\xc3\xb0\xdb\x9a\x4d\x7f\xc8\x0d\x32\
+\xa5\x04\xb2\xf7\x03\x56\x19\xc8\x1c\x03\xb2\xbd\x34\x0e\x48\xba\
+\xa2\x7e\x9d\xb5\x24\x27\xe1\xa0\x23\xd1\x21\x3a\x8d\x4e\xd1\x68\
+\x37\xca\x8c\x9d\x61\x79\x3b\x2f\x73\x66\x8e\x35\xd8\x0d\x08\xc2\
+\x00\xc5\x4a\x11\x85\x4a\x41\x96\xaa\x25\x4c\xba\x93\x6c\xa8\x32\
+\xc4\x2e\x94\x2f\x18\x85\x72\x21\x3e\x5f\xa0\xd7\x01\xaf\x7b\x0e\
+\x2d\x16\x90\x3c\xa0\x79\xc2\x7a\xf6\x73\xe5\x1b\x8d\xce\xce\x16\
+\xf3\x91\xbe\xfe\xef\x7e\xfb\x59\xf5\x11\x7f\xbf\x5e\x54\xd5\xa8\
+\xb8\x57\xf0\x45\x49\xfd\xce\x90\xf0\x48\xed\x30\xb2\x1b\x71\xfd\
+\xa7\xde\x87\xa6\x5b\x77\x22\x3b\x98\x42\xfb\xdf\xa7\x90\xee\x07\
+\x6c\x05\x1e\x87\xd0\xd9\xaa\xc1\xc3\xaa\xcb\x86\xce\x24\x15\x41\
+\x9d\x7c\x0d\xe8\x2f\x31\xa7\x8d\x50\x21\x6b\x3f\xd3\x7b\xcc\xa3\
+\x78\x02\x9f\x41\x1c\x45\xd2\xb8\x7e\xd3\x13\x48\x8a\x2b\xfe\x8a\
+\x8c\x94\x32\x54\x9b\x22\x50\x45\x58\x2a\xe0\xf8\xdf\xf5\x23\x7f\
+\xd3\x2a\xac\x3f\xde\x8d\x55\x95\x2f\x80\xe9\x17\x13\x90\x58\x1d\
+\x28\x27\x19\x5a\x7c\x4e\xd6\x52\x21\xb5\x84\x9e\x93\x3a\xcf\x9b\
+\xd3\xc7\x5c\x4b\xd4\x81\xd7\x63\x71\x35\x7b\xaa\xee\x55\x85\xaa\
+\xea\xbf\xcd\x97\xa4\xf4\x09\x2a\x64\x84\x47\x79\x0a\xc5\x83\xcf\
+\xa3\x01\x36\x84\xde\xa8\x78\x0d\x5a\x4b\x03\xcf\x85\x5e\xc2\x00\
+\x39\xe7\xb8\x06\x3d\x5f\x4c\xe7\xfa\x02\x08\x25\x5b\x43\x57\x5e\
+\xdc\x2f\x4b\xeb\x6e\xd0\x27\x2e\xe1\x24\x7e\x8d\x7e\x7c\x0d\x33\
+\x18\x9c\x0b\xba\xc4\xf1\xa2\xaa\x19\x37\xcf\xcc\xa5\x4d\x90\x70\
+\x31\x41\xcd\xff\x3c\xee\x8d\x66\xa2\xb8\x6a\x5f\x96\xa6\x73\x73\
+\xfd\x21\x4d\x3b\x69\x0d\xb6\xe0\x76\x6c\xc2\x5b\xd0\x89\x6e\x24\
+\x60\xc3\x9a\xb7\xf6\x6b\x32\x17\xd8\x03\xfc\xd9\x59\x8f\x97\x3e\
+\xf6\x20\x09\x7a\x04\x17\xb0\x1b\xc7\xf1\x18\x5c\x9c\xd0\x97\xb9\
+\x22\xf1\xf8\x57\xcb\x80\x7a\x13\x1c\x6d\x44\x63\xbc\x49\x62\x39\
+\xb6\xe1\x55\x58\x87\x57\x62\x05\x36\xd0\x51\x3b\x1c\x18\x57\x6c\
+\x80\x7f\x89\xb9\x22\x8a\x84\xdc\x87\x21\x1c\xc1\x69\xec\x47\x01\
+\x7d\xfa\xc6\x66\xb4\x76\x7f\xa9\x37\xbc\xab\x66\xc0\x7c\x23\x4c\
+\x6d\x46\x52\xdf\xd1\xe7\x95\x29\x49\xb4\xa0\x9b\xec\xe8\xc4\x1a\
+\xb2\xa2\x03\xcd\x68\x27\x35\x23\x8d\x04\x92\xb0\x55\xaf\x18\xda\
+\x16\x17\x02\x15\xf8\x2f\xa8\x0c\x0f\x93\xf4\xa7\x40\xb8\x13\x18\
+\x24\xbc\x73\x78\x9e\x60\xc7\x30\x00\xa0\xa0\x55\x24\x95\xf5\x4e\
+\xe4\x91\x84\x06\x7f\xe9\x7f\x5f\x40\xaf\xb9\x48\x46\x9d\x21\x36\
+\x29\x51\xbb\xa9\x55\x39\x51\xd7\x0b\x86\x16\xab\xdb\xfa\x82\x5a\
+\x56\x60\x95\x08\x52\xe7\x19\x0d\x4a\xd2\xbd\xb1\x14\xf4\xd5\x37\
+\x60\x69\x43\x16\xd9\xce\x50\xcb\xda\x80\x38\x44\x2d\xab\xb9\x50\
+\x8f\x43\x2d\xb9\x10\xf0\xcb\xc9\x80\xa5\x8d\xb9\xcc\x50\xa0\x2f\
+\x51\x5c\xfb\xd5\x59\xe0\xda\x6f\x8d\x5d\x33\xe0\x9a\x01\xbf\xc3\
+\xf1\xbf\x9d\xd2\xae\xe2\x5a\xef\x69\x4e\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0d\x06\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0c\x83\x49\x44\
+\x41\x54\x78\xda\xed\x9b\x5b\x68\x55\xd9\x19\xc7\xd7\x49\x4e\xa2\
+\x26\x26\x1a\xe3\x35\x31\x5e\xc6\x54\xad\x97\x4a\x95\x29\x38\x14\
+\xc4\x22\xb6\xcc\x73\x9f\x2a\xf4\x61\x5e\x7c\x10\xc4\xc2\x0c\x08\
+\x7d\x28\xf8\x54\x4a\x1f\x15\xa4\x4f\xf6\x51\x0a\x52\x90\x4e\x07\
+\x41\x94\xfa\xe0\xfd\xd6\xaa\x03\x5e\xc6\xfb\x35\x51\x63\x2e\x46\
+\xcd\xc5\x7e\xbf\x0d\xbf\x61\xcf\x31\x92\x8c\x1c\x83\xc1\x2c\x58\
+\xec\xbd\xd7\x59\x7b\xad\xef\xfb\x7f\xf7\xb5\x93\xc2\xeb\xd7\xaf\
+\xd3\xc7\xdc\x2a\xa2\x8f\x03\x30\x0e\xc0\x38\x00\xe3\x00\x8c\x03\
+\x30\x0e\xc0\x47\xda\x8a\x1f\x1a\x41\xc7\x8e\x1d\xdb\x53\x5d\x5d\
+\xfd\xb3\x69\xd3\xa6\x7d\xe1\x98\xad\xad\xad\xed\x8f\x95\x95\x95\
+\xf3\x57\xaf\x5e\xfd\x8b\x72\xed\xf7\x41\x24\x42\xdb\xb6\x6d\x5b\
+\x50\x2c\x16\xff\x10\xb7\x9f\xcd\x9e\x3d\xbb\x65\xf2\xe4\xc9\x93\
+\x18\x87\x36\xaf\xb6\x81\x81\x81\xc1\x4b\x97\x2e\xdd\x1a\x1c\x1c\
+\xbc\xd4\xd1\xd1\xf1\xb7\xbd\x7b\xf7\x1e\x1a\xd3\x00\x6c\xd9\xb2\
+\xe5\xb3\xfa\xfa\xfa\xc3\x21\xf5\xaa\x21\x09\x2c\x14\xd2\xdb\xc6\
+\x03\x84\x74\xfd\xfa\xf5\x43\x15\x15\x15\xbf\xd9\xb3\x67\xcf\xab\
+\xb1\x64\x02\x32\xff\xcb\x9a\x9a\x9a\x43\x21\x84\xe2\xcb\x97\x2f\
+\x87\x63\x78\xc8\xb1\x96\x96\x96\xf5\xd7\xae\x5d\xfb\x26\x1e\x7f\
+\x35\x96\x9c\xa0\x0c\xfc\xb3\xbf\xbf\x3f\x13\x42\x00\x91\xaa\xaa\
+\xaa\x52\x98\x02\x3d\xbb\xb7\x3b\x6e\x9f\x38\x71\x62\xc6\x3c\xa0\
+\xd1\x9b\x9a\x9a\xd6\x6f\xd8\xb0\x61\xdd\x98\xd2\x80\xcd\x9b\x37\
+\xff\x39\x98\x69\xec\xeb\xeb\x4b\xcf\x9e\x3d\x4b\x0f\x1e\x3c\x40\
+\xa5\x47\x0a\x5c\x0a\x27\x99\x1a\x1b\x1b\x93\xad\xae\xae\xee\xaf\
+\x71\xf9\x74\xac\x00\x00\xb3\x5f\x04\xf3\x48\x10\xef\x9e\x16\x2d\
+\x5a\x94\xc2\xf9\xa5\xe7\xcf\x9f\x23\x65\xe7\xa4\xce\xce\xce\xd4\
+\xd0\xd0\x90\x31\xfc\xf4\xe9\xd3\x34\x69\xd2\xa4\x74\xfa\xf4\xe9\
+\xf4\xe4\xc9\x93\x44\x0b\xff\x91\x68\x53\xa6\x4c\xf9\xf9\xc6\x8d\
+\x1b\x8b\x07\x0e\x1c\xe8\xff\xe0\x01\xd8\xb4\x69\x53\x75\xb4\xe9\
+\x71\x0b\xc3\x78\xf6\xb4\x6a\xd5\xaa\x34\x61\xc2\x84\x74\xe3\xc6\
+\x8d\x34\x6b\xd6\xac\x74\xea\xd4\xa9\xd4\xda\xda\x9a\xe6\xcf\x9f\
+\x8f\x9d\xc3\x60\xba\x7a\xf5\x6a\x5a\xb8\x70\x61\x3a\x7b\xf6\x6c\
+\xf6\x4e\x77\x77\xb7\xe6\x00\x68\x95\x2f\x5e\xbc\xd8\x14\x4b\xfe\
+\xfd\x83\x88\x02\xdb\xb7\x6f\x6f\x7c\xf4\xe8\xd1\xba\x20\xbc\x3f\
+\x88\x9d\x17\xd2\x5b\x31\x73\xe6\xcc\xdf\xde\xb9\x73\xa7\x2b\x88\
+\x9e\x1c\x63\xd3\x83\xe0\x84\x16\x00\x42\xc4\xf7\x77\xd1\xa2\x4c\
+\x33\x02\xcc\x0c\x84\x5b\xb7\x6e\xed\x0b\x8d\xd9\x4f\x38\x8d\x7e\
+\x34\xd6\xfc\xf7\x89\x13\x27\x1e\xbc\x17\x00\x7e\x1d\x6d\xc5\x8a\
+\x15\x95\xc1\x54\x6d\x30\xd3\x7a\xe6\xcc\x99\xdf\xaf\x59\xb3\xa6\
+\x39\x18\x7d\x10\xd2\x68\xba\x70\xe1\x42\xed\xb2\x65\xcb\xd2\xdd\
+\xbb\x77\xd3\xd4\xa9\x53\x53\x57\x57\x57\x7a\xfc\xf8\x71\x46\x6c\
+\x84\xad\xc4\xbe\xd8\x3e\x12\x0c\xa0\x90\xa8\x9e\x7e\xc4\x0d\x4d\
+\x61\x1d\x1c\x28\x66\xc3\xfd\xe5\xcb\x97\xf1\x07\x98\x13\xfb\xbc\
+\x0e\xad\xba\x1c\x4e\xf4\x1f\x3d\x3d\x3d\xff\xda\xbf\x7f\xff\x89\
+\x98\x33\x38\x62\x00\x76\xec\xd8\xb1\xf4\xe6\xcd\x9b\x5f\xc5\x6d\
+\xcb\xe2\xc5\x8b\x6f\xd6\xd6\xd6\xd6\x04\xa1\x8b\x7a\x7b\x7b\x5b\
+\xcf\x9f\x3f\xdf\xc8\x26\xa8\x24\x92\x84\x51\x18\xc0\x63\xf3\x8c\
+\x6d\xbf\x7a\xf5\xca\xae\x27\x77\x69\xa4\xce\x38\x44\xd2\x99\xcf\
+\x18\x4c\x0c\x1b\x0e\x01\x2d\x68\x51\x0b\x78\x3f\x63\xd8\xe7\x90\
+\x7a\x8a\xe8\x82\xf9\x00\x3e\x7e\x22\xdb\x3b\xe8\xee\x6c\x6f\x6f\
+\xff\x26\xf6\xfd\x32\xe6\xdc\x1e\x12\x80\xdd\xbb\x77\xa3\x8b\xbf\
+\x7b\xf8\xf0\xe1\x5f\x8e\x1f\x3f\x3e\x3b\xd4\x88\x97\x0d\x37\x10\
+\x08\xe1\x79\x06\x91\x1e\x1b\xdb\xdf\x78\x46\x42\x74\x1b\x6b\xe0\
+\xd0\x64\x9e\x3d\x60\x8c\x7b\xae\xf9\x6e\xf3\x3d\xaf\xac\xeb\x95\
+\x0e\x00\x79\xe7\x19\x1a\x09\x08\x00\xc5\xfa\x38\x4f\xfc\x48\xe6\
+\x67\x42\x1b\xae\x1f\x3d\x7a\xf4\x93\x37\x00\xd8\xb5\x6b\x57\x4d\
+\xd8\xd0\xd7\xa1\xaa\xeb\x62\x92\x4c\xb2\x10\x1d\xc6\xd8\x14\xbb\
+\x85\x38\x09\x18\x16\x00\x36\x86\x39\x1b\xce\x0b\x2d\x81\x30\xc6\
+\xed\x23\x01\x80\x2e\x93\x79\x10\x58\xcb\x88\xe0\xef\x87\x0f\x1f\
+\x66\x1f\x98\x56\x08\xdc\xd3\xfb\xc3\x24\xeb\x6f\xdf\xbe\xdd\x5b\
+\xf4\x85\x9d\x3b\x77\xb6\x44\x38\xfa\x36\x54\xb9\x96\xd0\x93\x27\
+\x02\x64\x91\x18\xe3\x61\xf3\x69\xee\xdc\xb9\x29\x5e\x06\x08\x36\
+\x96\x30\x89\xcb\xe6\x00\x60\xe4\xea\x3f\x20\xd6\xe6\xfa\x00\x25\
+\x08\x6a\x80\xfb\x39\xce\x9a\x39\x40\x87\xd4\x00\x3b\xcc\xf1\x1e\
+\xfe\x06\x8d\x20\x7a\x60\x56\x08\x12\x20\x42\xab\x11\x24\xeb\x17\
+\xc3\x17\xfd\x09\x5f\x9d\x01\xb0\x6f\xdf\xbe\xc6\x90\xca\xb5\x28\
+\x32\xaa\x64\x3a\xcf\x3c\x49\xca\xca\x95\x2b\x13\xed\xc8\x91\x23\
+\x20\x9d\x81\x10\x7e\x00\xe9\xe6\x01\xc8\x88\x8e\x82\x86\x8d\x01\
+\x8d\x35\xb2\x4d\x6d\x6a\x14\x8d\xb9\x30\xc7\x1e\xd3\xa7\x4f\xc7\
+\x79\xf1\x9b\x1a\x02\xe1\x43\x81\x24\x20\xa5\x20\xc8\x38\xe0\x2b\
+\x79\xd6\xc0\x0c\xe8\xd6\x0f\xfc\x86\xe3\xfd\x2a\x9e\xf7\x64\x00\
+\xdc\xbb\x77\xef\x3f\x11\x77\xab\x54\x53\x99\xd7\xfe\xc9\xb8\x02\
+\x31\x9c\x48\x46\xa4\xf3\x24\x16\xfb\x82\x10\xcd\x23\x22\x00\x8c\
+\xf2\x2c\x00\xae\x9b\xad\x41\x13\x00\x12\x20\xd6\x46\xa3\xc8\x01\
+\xf2\x4e\x50\xa6\x35\x3d\x9b\x29\x71\xe9\x6f\xac\x8d\x83\xc4\xe1\
+\x42\x07\xeb\xd2\xb6\x6e\xdd\x9a\xdd\x9f\x3b\x77\x0e\x67\x4d\xa4\
+\x40\x0b\x2b\x02\x88\x4f\x8b\x21\xfd\xda\x50\x8d\x9f\xe6\xbd\xac\
+\xc4\xa9\x8a\x84\x29\x50\x43\xa2\x80\x81\x84\x4f\x9e\x3c\xc9\x34\
+\xc6\xd9\x54\x00\x40\x18\x86\x95\x8e\x25\xec\x0f\x34\x80\x36\x6f\
+\xde\x3c\x9c\x2a\x5a\x04\x31\xec\x07\xb8\x86\x34\x9e\x5d\x03\x1a\
+\x74\xb6\xec\x87\x76\x71\xcd\xfb\x09\xe6\xb0\xaf\xeb\x93\x1f\x08\
+\x36\x91\x20\xfb\x7d\xce\x9c\x39\x19\x38\x57\xae\x5c\x31\x5a\x4d\
+\x2b\xc6\x4b\xad\x11\x8f\x0b\xbc\xa8\x63\x73\x41\x91\x9e\x31\x63\
+\x46\xb6\xb0\xa9\xea\xc1\x83\x07\x9d\x87\x8a\xb1\xd1\x1b\x6a\xc9\
+\x06\xda\xbf\x44\x0a\xc4\xf2\xe5\xcb\x49\x65\x31\x27\x18\x05\x54\
+\xcc\x0a\xa2\x19\xd7\x9e\x95\x24\xb4\x20\x41\x34\x0d\x3a\x98\x03\
+\xb3\xa8\x3c\x57\x23\x13\x82\x50\x20\x8c\xab\x45\xf8\x37\xae\xbc\
+\x57\xea\x5c\x0b\xc5\xd8\xa0\x10\x8d\x7c\x9b\x8d\xf3\x5e\x7f\x48\
+\xc6\x68\x10\xc6\x6f\x3c\x03\x00\x0b\x43\x30\x44\xd2\x35\x0d\x43\
+\x9f\xef\x31\x8e\x2f\x21\xa5\x25\x09\x82\x69\xf6\x05\x60\xd6\x40\
+\xc3\xb8\xc2\xb4\x0e\xcf\x7d\xd5\x4a\xf6\x31\x17\xc0\xff\xb0\x26\
+\x6b\x01\x12\x7b\xd2\xa0\x01\x3e\xbc\xd7\x17\xd9\xf3\x0d\x0d\xe0\
+\x65\x88\xd0\x86\xe9\x82\x90\x0f\x7f\x02\x61\x1e\xfe\x86\x5d\x6a\
+\x7f\x02\xa0\x59\xd8\xc8\xed\x2f\x5e\xbc\x08\x68\x48\x1d\x89\x03\
+\x00\x3e\x08\x69\xb2\x2f\x84\xeb\x00\xe9\x32\x8b\xf4\x55\x5b\xe6\
+\x40\x07\x6b\xe0\xf0\x58\x83\x88\xc3\x3c\x0b\x26\x53\xeb\x61\x53\
+\xec\xa2\x2a\xf4\xae\x4d\x2f\x9d\x6b\x10\x85\xa4\x4a\xd3\x56\x9c\
+\x1c\x0c\x10\x26\x91\x0c\x73\xd0\x06\x00\x83\x01\x1c\x14\x6b\xe1\
+\xb1\xd1\x1e\xf3\x07\x01\x61\x5d\x68\x45\x73\xb8\x47\x0b\x99\x03\
+\xe3\x80\x00\xf3\xbc\x8b\x43\x25\x04\x1a\xc5\xb8\xda\x87\x01\xa0\
+\x4c\x0d\xc2\x60\xc0\x06\x51\x48\x18\x55\x85\x50\x7d\x47\x14\x46\
+\x5c\x61\x1c\x8d\xc1\x31\xf2\x1e\x0c\xb3\x06\x0c\x41\x1b\x0c\xd2\
+\x01\x4d\xed\x83\x31\xd6\xa5\x94\xc6\x79\x5a\x1a\xb3\x47\x36\x7e\
+\xff\xfe\x7d\x9c\xec\xb0\xf5\x05\x3e\x20\x95\xbb\x69\x32\x46\x15\
+\x98\x8a\x63\x2b\x33\x31\x4d\x0b\x46\xa8\xe0\x32\x82\x97\x2c\x59\
+\x42\xb1\xc4\x19\x5f\x69\x46\x88\xb4\x61\x1e\xa6\x59\x03\x86\x01\
+\x8e\xe8\x01\xd3\x5c\x71\xd0\xac\xc9\x95\x75\x19\xc3\x54\x4c\xb3\
+\x05\xe2\xfd\x6b\x80\x9b\xda\xb0\x47\xc2\x28\x04\x40\xac\x21\x92\
+\x2b\xb6\x8f\x39\x00\x00\xe6\x01\xe1\xe6\x0d\xe6\x21\x26\x2f\xfa\
+\x03\x7d\x92\x76\x0e\x38\x80\x82\xc6\xa8\x25\x8c\x13\xfa\x58\x1f\
+\xad\x1a\xd6\x07\x94\xb3\x11\x26\x21\x02\x50\xb5\x41\xd4\xbf\x94\
+\x79\x54\x17\x82\x91\x26\x7e\x40\x4d\xe4\x1d\x23\x8a\x79\x88\xe9\
+\x30\x73\x60\xd4\xb9\xcc\x43\x5b\xe4\x81\x39\x00\x05\x20\x79\xc7\
+\x6d\x1b\x15\x0d\x30\x03\x63\x63\x25\x44\x83\x59\x01\x80\x09\xa4\
+\x4d\xb9\x8a\xad\x32\x66\x4a\x8c\x64\x35\x15\xcf\x0e\x64\xce\x08\
+\x01\xc8\x98\x0b\x8e\xd5\x04\x88\xf7\xd4\x06\x43\x26\x9a\x85\x1f\
+\x61\x9d\xd1\xd2\x00\xe3\x36\x1d\x86\x70\x4a\x84\xaf\x7c\xa6\x08\
+\xf1\x84\x5d\x3d\x39\x0c\xe8\xd4\xb0\x61\xa3\x00\xa0\x31\x6e\x78\
+\x86\x79\xde\xb1\xe0\xa1\x13\x05\x04\x3e\x9f\x00\xc1\xb4\x7b\x51\
+\x67\x70\xff\x56\x27\x58\x56\x0d\x90\x51\x9a\xea\x8e\x9a\xe7\x55\
+\xd2\x3a\x9d\x28\xc0\xb8\x67\x06\x8c\x31\x17\xa6\xb8\x1a\xfb\xcd\
+\xf4\x90\x3c\xcf\xfa\x05\x8b\x1f\x9a\xd9\xa2\x69\x35\x60\xd0\x0c\
+\x9b\x68\x1c\xfb\x8e\xaa\x06\x68\xab\x4a\xd1\x31\x98\x70\x1e\xfb\
+\x43\x38\x04\xeb\xe1\x71\x60\xf3\x66\x2c\x49\x4d\xd3\x3e\x49\x03\
+\x13\x42\xdd\xbb\x6f\xa3\x29\x30\x6c\x8d\x60\xde\x6f\xea\xab\x84\
+\x87\xca\x1e\xc9\x31\x00\xd5\x7c\xe2\xfd\xfa\x80\x3c\x21\x82\x9b\
+\xaf\xda\x54\x55\x88\xb7\xb4\x05\x00\x41\x50\x0b\xe6\xcf\x5c\x9a\
+\xfa\x6b\x1f\xa7\xe6\xa6\x96\x54\xdd\x96\x85\x4c\xed\x1d\x46\x74\
+\xb6\xac\xc7\x3b\xae\x6f\x04\x92\x27\xfd\x0a\xa6\x88\x29\x00\x40\
+\x59\x35\x60\xd8\x23\x2b\x01\xb0\xa9\x01\xee\x2b\xd1\x8c\xe5\x35\
+\xa1\x50\xf7\x32\x2d\x58\xb4\x34\x15\xeb\xfa\x52\xb1\xba\x39\x75\
+\x90\x2a\xc7\x3b\x66\x99\x9e\x31\xa2\x19\xac\xaf\x29\x5b\xd0\xe5\
+\xa3\x10\xe1\xd0\xcc\xb3\xb4\x55\x94\xd3\x07\xc8\xa8\x04\x20\x95\
+\x52\x60\xf2\x67\x0e\xf9\x7b\x9f\x3d\x23\x7c\xde\xdf\x1e\xcc\x3e\
+\x4a\xb5\x55\xf5\xa9\x3e\xca\xd8\x89\x75\x93\x53\xfd\xec\xc8\x19\
+\x1a\xa6\x38\xcf\xf7\x5c\xc3\xee\xfe\x76\x35\x0d\xb0\xde\x04\xa0\
+\xdc\x3e\x20\x4f\x40\xbe\xa2\xf3\xde\x4c\xd0\xef\x7f\x30\xeb\x5c\
+\xfb\xf7\x31\xbf\xa7\x37\x75\x84\xea\x77\xb5\xb7\xa5\xee\xb6\xf6\
+\xd4\x1b\x6a\x3c\x21\xbe\x9c\x0f\xe6\x34\x8c\xf5\x2c\x99\x05\x54\
+\xe9\x6b\x86\x66\x93\xac\x5b\xda\x8a\x12\x53\x6e\x00\x8c\xdd\x3a\
+\x2d\x9a\xa1\xd1\x33\x02\x55\x9f\x79\x3a\x35\xed\x1b\x6f\x5e\xc5\
+\x07\x8f\xfa\xba\xd4\xf7\xbc\x27\x3d\x8d\x32\xb9\xb3\xa7\x3b\xf5\
+\x15\x99\xfb\x7d\xc5\x0a\x00\xbc\x83\xa7\x57\xd2\xa5\x25\x38\x7b\
+\x50\x83\x70\x1d\x1d\x00\x24\x40\x00\x2c\xb9\x75\x4a\x82\xc2\xbd\
+\x85\x92\xcc\x6b\xe3\xcc\xc9\xca\xe3\xca\x42\x7a\x45\x32\x55\x5d\
+\x91\xba\xba\x3b\x23\xb7\x4e\xa9\xab\xb3\xcb\x13\x6b\x22\x06\x60\
+\x19\xf7\x65\xdc\xc6\x98\xc5\xd2\x90\xad\xa8\x57\x2e\x57\xf3\x24\
+\x57\x42\xcc\xe3\x21\x42\x7f\x03\xb1\x66\x7e\x48\x0e\xdb\xa4\x9b\
+\xfe\xe6\x6d\x96\x10\x56\x37\xb3\x21\x4d\xa8\x9c\x98\xba\x7a\xbb\
+\xd2\xa3\x2b\x0f\x01\x0c\x2d\x61\x4d\xee\xcd\x1a\x3d\x87\x54\xab\
+\xbc\x1f\xdd\x54\x18\x06\xf2\x84\xc0\x84\xa0\xd0\x4c\x7a\x90\x9a\
+\x80\x51\x10\x91\x12\x23\xfd\x7c\xf1\x83\x60\x3c\x95\xce\x67\x82\
+\xda\x33\x8c\x73\x82\xb4\x60\xc1\x02\xcf\x27\x05\xd8\xc4\x89\x44\
+\x69\x74\x8b\x21\x9d\x9a\xcd\xb3\x3a\x80\x80\x60\x6d\x14\xd5\x67\
+\x0c\x66\x01\x8a\xda\x3d\x3e\x5b\x65\xc0\x18\xeb\xad\x05\xb4\x65\
+\x41\xf0\x9c\x32\x3e\xdb\x71\x40\x2b\xd0\xcc\xc9\x3b\x42\xb5\x84\
+\x3d\x47\x4f\x03\x4c\x47\x05\x82\x67\x08\xf1\x68\x8b\x31\x99\xf6\
+\xd0\xd3\x12\x1a\x10\x50\x79\x6b\x04\xab\x41\xdf\xf1\xec\x12\x9a\
+\xa9\x20\x39\x12\xf3\x5c\xd0\x33\x4a\x80\xf5\xd3\x1d\xe6\x05\xf3\
+\xa3\x75\x20\x62\xfd\xaf\xf3\xd3\x0c\x60\xca\x6a\x4d\x02\x21\x1a\
+\x40\xf2\x1f\x47\x19\x83\x21\x8b\x17\xa4\xed\x3c\xc3\x27\x5f\x77\
+\x00\x94\x4a\x12\x06\xd9\x03\xe6\x35\x09\xfd\x0f\x42\xe0\x58\x8c\
+\xdf\x46\xd7\x07\x58\xcf\xeb\x84\x54\x77\x2b\x40\x98\x32\x13\xb4\
+\x74\x36\x1c\xf2\x9b\x45\x8b\x15\x9d\x1f\x52\x61\x44\x8f\x1e\x5f\
+\xaa\xd1\x0e\x4f\x95\x00\x8f\xf7\x33\xa0\x3c\x29\x6a\x6e\x6e\x36\
+\xed\x1d\x55\x1f\x20\xc3\x1e\x45\xeb\x18\x01\x85\x7c\xdc\x83\x4e\
+\xf3\x7a\x01\x31\xf4\xe1\x20\x61\x54\xd3\x00\x00\xde\xa1\xf6\x67\
+\x1d\xd7\xd4\x21\x5a\x4c\xb1\x27\x63\x74\xd6\xc0\xf9\x01\xfa\x88\
+\x00\xe0\x0b\x71\xb9\x01\xc0\xa1\x69\xbf\x66\x6c\x48\x0b\xf5\xd5\
+\x57\xc0\xb8\xde\xde\x52\xd7\x44\x4a\xa6\x4a\x73\x0b\x55\xde\x22\
+\x27\x9f\x0c\x79\x62\x84\xf4\x31\xbb\x11\x29\x6c\x31\x50\xae\x61\
+\xd1\x72\x54\x7f\x36\x88\xb3\x04\x2e\x05\x06\x10\x20\x54\xe7\x05\
+\x13\xac\x81\xdd\x23\x71\xa5\x6a\x6d\x60\x46\x49\xb7\xb6\x27\xf9\
+\xf1\x54\x29\xff\x75\x8a\x77\xf9\xd6\xc0\xbc\xb5\x6b\xd7\x72\xec\
+\xa6\x06\xe9\x24\xf9\x2e\x21\xdd\x00\xde\x87\x06\x34\xf0\xf0\x0e\
+\xcd\x8c\xee\x6d\x5a\x80\x2d\x2a\x39\xbb\xc7\xde\x10\xe7\x87\x0d\
+\x08\xf1\x4b\x8e\xa7\xba\x1e\x8c\x70\xc6\x0f\x53\x00\xc5\xf1\x39\
+\x6b\xc8\x98\xef\x20\x6d\x00\x63\x3d\x2b\x4e\x2a\x40\xd6\xf6\x3d\
+\x40\xf5\xbc\x01\xba\xa0\x01\x20\x6f\x15\xf9\xdb\x5b\xff\x14\xed\
+\xc7\xb6\x7c\xf5\xa5\xbd\xea\xfd\xd9\xc0\xdf\x4a\x9b\x4e\x12\x8f\
+\x0e\x51\x48\x15\xa2\xf3\x69\x33\x34\xd1\x79\x9f\x64\xc7\x46\xe6\
+\x67\x68\x33\x29\xe2\x7d\x4b\x5d\x01\xf8\xee\xbb\xef\x86\x22\x59\
+\x00\xd1\xd0\xb3\x11\x49\xfe\x5b\x8c\x81\x9b\x64\x5a\x6c\xca\x22\
+\xf9\xd8\x9b\xaf\xeb\xed\x2c\x6e\x4d\x0f\x61\x7e\xa8\x90\x28\x8f\
+\xb8\xec\x6e\xea\xb5\xa4\x79\x86\xef\x91\xd8\x70\x69\xb9\x66\x82\
+\xcf\xf0\x0b\xb6\xe7\x83\x23\x31\x57\xfd\xc7\x85\xf8\xfb\x86\x2f\
+\x63\xa8\xad\x18\x52\xea\x08\x6f\x79\x28\x08\x5f\xef\x5f\x58\x04\
+\x83\x32\xe2\x55\xe2\x65\x12\x2f\x3f\x10\x44\x7c\x1b\x8f\xcf\xf2\
+\x69\xae\xcd\xf8\x3e\x82\x26\x38\x95\x01\xe8\xd4\x58\x63\x7a\xd0\
+\x50\x13\x9d\xbf\x57\x80\x3e\xf6\x1b\x88\xf1\xbe\xb8\xbc\x88\xa9\
+\x8f\xc3\x41\x3e\x09\xa0\x7e\x6c\x02\x83\xd0\x3a\xc2\x9c\x2e\x45\
+\x38\xfe\x3a\xd6\xbb\xc0\x29\x7e\x21\xfe\xf6\x7e\x52\x2c\xbc\x3a\
+\x54\xf6\xf3\x40\x77\x59\xfc\xf0\x13\xfe\xcc\x8d\xf9\x79\xc9\x4b\
+\x67\x34\xa0\xbe\x1d\xb6\x74\x24\x88\xf8\x5f\xbc\xdb\x99\xde\x4f\
+\x73\xc3\x42\xb4\xd7\x65\xc8\x4f\x90\x0e\xb4\x12\x1b\xef\x45\x7f\
+\x12\x7f\x71\xfa\x3a\x0b\x81\xf1\xf7\x7d\xd3\x02\xed\x96\x60\x66\
+\x6e\x3c\x83\x7e\x7d\x00\x41\xfd\xca\xef\x48\xb2\x10\x9d\x7b\xfa\
+\x60\xdc\xb3\x50\x7b\xcc\xb9\x16\xd7\xa7\x69\x6c\x34\x40\xec\x23\
+\x68\x04\xe3\x7d\x0e\x9a\x03\x00\x42\x15\x99\x6c\xf4\x9a\xe8\x18\
+\xa2\xfa\xeb\xb5\x40\x67\x21\x54\x07\x7f\x44\x07\xc5\x34\x86\xdb\
+\xf8\xbf\xce\xa6\x34\xfe\x5f\x63\xe3\x00\x8c\x03\xf0\x11\xb7\xff\
+\x03\x7f\x19\x0a\xe4\xd7\x62\x63\xda\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x15\x14\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x14\x91\x49\x44\
+\x41\x54\x78\xda\xe5\x5b\x79\x8c\x64\xc5\x7d\xfe\xbd\xa3\x8f\xe9\
+\xee\x39\x76\xa6\x97\xdd\xb9\x96\x3d\x66\x61\xef\x05\x61\x6c\xae\
+\xa0\x38\xb6\x20\x4e\x2c\x22\x27\x32\x09\x92\x0f\x14\x20\xc6\x81\
+\x18\x84\x92\x08\x59\x8a\x30\x7f\x18\x04\x09\xe0\xf8\x08\x47\x24\
+\xa2\x24\x76\x14\x9b\x80\xf3\x4f\x0e\x27\x86\x80\xc3\x61\x60\x31\
+\xe6\xb0\x21\xbb\xec\xb2\xf7\xce\xf4\x4c\xcf\xf4\xdd\xfd\xae\xaa\
+\x7c\xbf\x7a\x5d\xf3\xfa\x98\x49\xef\xb4\x90\x65\x29\x65\x7d\x54\
+\xbd\x7a\x47\xd7\xf7\xbb\xab\x66\x6d\x48\x29\xe9\xff\x73\xb3\xe9\
+\x97\xb8\xbd\x74\xed\xb5\x03\x9e\xeb\x66\x09\xf0\x84\x18\x23\xe9\
+\x67\xa5\x2f\xb3\x42\x88\xac\x14\x18\x63\x4e\x04\x22\x2d\xfd\xe0\
+\xdf\x7f\xf3\x95\x57\xfe\x8a\xfa\x68\xbf\x30\x0b\x78\xef\x4b\x5f\
+\x4a\x54\x3d\x2f\xeb\x48\x37\x6b\xf8\x41\x96\x04\x88\x04\x04\x02\
+\x41\x56\x92\xc8\x52\x20\x43\x52\x52\x8c\xc9\x40\xe0\x9e\x60\x82\
+\x29\x89\x87\x70\x4d\x18\x87\x08\x02\x12\xd1\xb8\xd9\x8b\xc6\x46\
+\x21\x86\x2e\x3a\x70\xc0\xfb\x85\x58\xc0\xcf\xef\xbe\x3b\x6e\xd5\
+\x6a\x59\xd7\xf3\xc6\x4c\xc3\xc8\x0a\x62\x12\x06\x2f\x18\x3d\x8d\
+\x19\x22\xc8\x0a\x49\x59\x92\x4c\x42\x86\x7d\x20\xd3\x20\x47\x06\
+\x6e\xa0\x03\xd0\xf3\x80\x00\x26\x21\x19\x12\x64\x00\xdc\x23\xd9\
+\x84\x7a\xae\x1d\xb4\x0c\xd2\x73\xc9\x63\x52\xee\xbc\x88\xe8\xcd\
+\x0f\x44\x00\xef\xdc\x79\xe7\xed\xe5\xb8\xbd\x29\x79\xe2\xe4\x88\
+\xb1\x6e\x24\x26\x0d\xca\x1a\x64\x8c\x11\x48\x12\x49\x80\x06\x7d\
+\xe2\x26\xa1\x38\xee\x42\x32\x7a\x61\x22\xec\x43\xed\xf0\x98\xfb\
+\xe6\x75\x04\xb9\x32\xa4\x86\x88\xde\xd7\x08\xaf\x43\x88\xf6\xdf\
+\x34\xa4\x7f\x01\x7d\x10\x02\x78\xec\xc2\x0b\xbf\x72\xc5\x95\x97\
+\xdf\xe5\x98\x43\x94\x1a\x18\xa0\x40\x88\x90\xaa\xc1\xff\x55\xff\
+\xa1\x50\xf4\x7a\x28\xc3\x61\xa4\x9d\x88\x74\x34\x56\xef\x5a\xa9\
+\x34\x05\x8d\x3a\x5c\x99\xcd\xda\x65\x33\x50\x30\x63\x36\xe6\x1b\
+\xe1\xb5\xd0\xc4\xf1\x46\x32\x41\xa4\x85\x55\xa9\xb4\x0b\xa3\xc3\
+\x2a\x84\x30\x2e\x30\x0c\xe3\xef\x25\x5a\x5f\x02\x30\xd0\xee\x98\
+\x9e\x4e\xce\x0c\x0f\xdf\x5e\x2f\x95\xa9\x54\x2c\x53\x76\x7c\x9c\
+\xfc\x72\x89\xc8\x34\x69\xb5\x66\x26\x12\x24\xea\xf5\x48\x10\xe1\
+\xe2\x99\x8c\xd6\x54\x48\xcc\x60\x01\x0c\xa0\xc7\x3b\x98\x0b\x6a\
+\xfc\xb2\xa5\xe6\xfc\x5a\x83\xac\xc1\x21\xf4\x35\xb2\x86\x06\xc9\
+\xcd\xcd\x13\xa5\x53\xca\xf7\x85\x03\xc1\x60\x5e\x13\xee\xd6\xbe\
+\xb6\x00\xb1\xbf\xa9\xa1\xb5\x0b\x80\xc9\xf3\x72\x3c\xa2\x6d\x41\
+\x10\x0c\xd7\xf0\x83\x85\xa5\x22\xc5\x76\xee\xa4\x5a\x6e\x8e\xcc\
+\x64\x52\x4b\x49\x6b\x5d\x75\xf1\x6c\x96\xbc\x42\x81\x12\x1b\x36\
+\x52\x50\xad\x84\x6b\xf1\x3d\x32\x62\x31\xe2\x4f\x06\x9e\x47\xd6\
+\x40\x4a\x09\xa8\x31\x3f\xaf\x34\xeb\xd7\x41\x36\x99\xc4\x3b\x1b\
+\xc8\xc9\xe5\x48\xb2\x65\xc0\xd2\xbc\x7a\x95\xc8\x32\xc9\xaf\xd6\
+\xc8\x84\x50\x02\xd7\xa3\x00\xe4\xf9\x5d\xe9\xba\x91\xf6\x05\xf7\
+\x1d\xae\x80\x1e\x2a\xda\xcb\x2b\xec\xd7\x05\x0c\x20\x31\x57\xaf\
+\xaf\x9f\x49\xa5\xa8\x86\x1f\x75\xaa\x55\xb2\x86\x47\x28\x60\xe9\
+\xc7\xe2\x78\xa2\xfd\xeb\x12\x30\x2c\x1b\x8b\x74\x48\xb8\x0e\x34\
+\x08\xcd\x2d\x2c\x28\x72\x36\xb4\xe9\x2c\x2e\xc2\xb4\xe3\xea\x9e\
+\xa4\xd0\xff\xb5\x00\xdd\xa5\x25\x08\x6e\x89\x04\x5c\x21\x58\x2a\
+\x34\x4d\xbe\x33\x3e\x04\xaa\x27\xdb\xc2\x37\xbc\xe8\x9e\xd4\x71\
+\xa5\x45\x18\x00\xfe\xb3\xfe\x9b\xdb\xb7\x8f\x43\xf0\xa7\xd6\xe2\
+\x06\x76\x53\xfb\x16\x90\x2e\x04\xc1\x04\x07\xb0\x06\xfc\x31\x33\
+\x98\x21\x7b\xdd\x08\x49\x98\xa7\x1c\x0c\x34\xe9\xb6\xe6\x2c\xcc\
+\x2b\xc2\x0d\x68\xd2\x4a\x24\x95\x86\xdc\x52\x99\x4d\x5b\x49\xab\
+\x7e\xfa\x54\x4b\x1c\x90\x54\x3b\x71\x42\xbb\x84\x26\xda\x41\x5e\
+\x32\xda\xef\x35\x7c\xfd\x8d\x2e\x17\x00\xda\x2c\x63\x90\x88\x03\
+\xe1\xa9\x7e\x2c\xc0\x04\x52\xae\x54\x45\x06\x39\x8e\x4b\xe7\x6c\
+\x9f\x21\xd7\x07\x71\x19\xe6\xdb\x95\x4c\xc0\x87\x95\xe8\x00\x28\
+\x3c\x8f\x47\xa1\x99\x57\xca\xad\x01\x31\x22\x2d\x23\x82\x3a\x4b\
+\x44\x02\x88\xae\x89\xc1\xf9\xde\xf7\x29\xf0\xb9\xf7\xd4\xd8\xc7\
+\x98\x94\xba\x2c\x32\x01\xb8\x5a\x28\x6c\xdc\x93\x58\x0b\xc8\xec\
+\xc3\xdd\x7f\xe9\x57\x00\x31\x43\xca\x14\x2f\xd2\x81\xcf\x4d\xcf\
+\x6c\xa3\xea\x7c\x8e\xcc\x78\x3c\x5c\x54\x77\xd3\xe4\xa3\x6c\xa0\
+\x53\x22\xe9\x34\x18\x09\x81\x05\x20\x02\xc1\x71\x21\x04\x2f\x1a\
+\x40\xaf\x82\xac\x61\x59\x80\x0d\x60\x8c\xdf\x34\x6c\x9b\x6c\xcc\
+\xc7\x00\xa4\x60\xf0\xe4\x9e\xf8\x79\x95\x31\x82\x3a\xe0\x38\xe1\
+\x98\xdd\x8c\xb3\x89\x94\xfb\x74\x20\xec\x27\x0d\x9a\xf0\xd1\x18\
+\x2f\xd6\xf3\x7c\x15\x7c\x2a\xe5\x1a\x0d\x20\x1a\x3b\xda\x02\xba\
+\x9a\x04\x09\x90\x0a\x3c\x28\xc1\x67\x2b\x08\xb5\x16\x04\x4c\x46\
+\x91\xb0\x00\xee\xc9\x8e\x21\x63\x58\xb8\xb6\xe0\xd6\x36\x00\xc2\
+\x26\x60\x19\xca\xc7\x03\xfc\x9e\xd0\x84\x18\xd0\xa8\xaf\x2d\xa4\
+\x37\x94\x0b\x58\x3a\x10\xf6\x15\x04\x81\x79\xdf\x2f\xa2\x57\x64\
+\x3c\x04\xb1\x52\xb5\x4e\x83\x08\x84\x8d\xc5\x3c\xd5\x0a\x45\x12\
+\x2c\xa5\x78\x8c\x4d\x4f\x59\x86\x65\xa1\xcf\xc4\xc8\x42\xb0\x8b\
+\xc7\x98\x5c\x1c\x81\x2f\xd4\xa2\x6c\x92\x11\x8a\x90\x43\x3e\x7a\
+\x59\x87\x90\x9a\xe6\xee\xb7\xb9\x40\x38\xa6\x68\xdc\x01\xd9\x1b\
+\x52\x32\x89\xed\x9f\xdb\xb0\x21\x89\xb0\x56\x93\x68\x6b\x2e\x84\
+\xde\xaf\xd7\x17\xf1\x96\xd2\x60\xad\x5c\xa6\x42\x2e\x4f\xe7\x5e\
+\x3c\x4d\xf2\xd4\x29\x1a\xdb\xb5\x8b\xcd\x34\x24\xa5\xc9\xb9\x0e\
+\x08\x42\x73\x24\x55\x40\xf6\xa8\xc5\x0d\x80\xee\x9e\xc9\x74\x8e\
+\x55\xdf\x4d\x3e\x22\x06\x88\xff\x1b\x62\x19\xb1\xcb\xe2\xf1\xdd\
+\x7f\x47\xf4\x6a\x3f\x2e\x20\xab\x41\xe0\xba\x42\xa0\x0b\xd2\xb5\
+\x5a\x9d\x4a\x88\xee\xf6\xc8\x88\xd2\x62\xf5\xd8\x51\x8a\x9a\xe2\
+\xd4\x51\x15\x46\xe4\x69\x45\x41\x88\x96\xba\xbe\x83\xb0\x5c\x51\
+\x00\x6d\xe4\x68\x19\xb2\x1b\x32\x42\xd2\x90\xfb\xa9\x0f\x01\x48\
+\x40\x00\x7e\x2d\x08\x0a\x83\x42\xa4\x51\x0b\xf0\x02\xb8\x16\x50\
+\x5a\x36\x06\x92\xd4\x91\x06\xda\x3b\x29\xb5\x30\x34\xe9\xae\x80\
+\xa8\x02\x2c\x4a\xda\x0a\xfc\x7b\xdd\xd8\xd8\xea\xfb\x85\x8e\x31\
+\x45\xa6\xde\x91\x39\xba\x61\x0a\xc4\x81\x35\x34\xb3\x85\x8d\x0f\
+\x78\x2c\x00\x5d\x0b\xf0\x22\x25\x07\x31\x21\x9b\x5b\xd2\x20\x44\
+\xc0\x10\xcb\x73\x22\xda\x96\x02\x3c\x0e\xaf\x45\x73\x4e\x00\x7c\
+\x5d\x02\xf9\xe9\xcf\x5f\x4f\x57\x3d\xf1\x4f\x3d\x82\x5a\x07\xf9\
+\x88\xb4\x86\x16\x52\x17\x8c\x30\x15\x9a\x6b\xb2\x00\xad\x7d\xc0\
+\xad\x0a\xb1\x14\xd6\x02\x1e\x4d\xef\xdd\x4d\xd5\x85\x79\x15\xf0\
+\x7c\xd1\x91\x09\xb4\xb6\xa3\xb1\x4a\x51\x25\x54\x83\x23\xe7\x9c\
+\xb3\xe2\x26\xe9\x43\xbf\xf3\xdb\x34\x75\xc3\x0d\x61\x4e\xe7\x32\
+\xd9\x30\x75\x31\x13\x91\x6d\x89\x0d\xb4\x7a\xb1\xc4\x58\xd9\x02\
+\xa4\x54\x99\xa0\x1f\x0b\xf0\x00\xa7\xe4\xfb\x0b\x4a\x00\xae\x4b\
+\xe3\x5b\x36\x43\x00\x79\xb2\x32\x19\x12\x5a\xbb\x80\x50\x50\x1a\
+\x6e\x5a\x44\xd8\xdb\xdb\x66\xe8\x23\x7f\xf9\x75\xf2\x38\x40\x0a\
+\xfd\x7c\x84\xc3\xdf\xfd\x2e\xcd\x7e\xff\x29\x32\x6d\x9b\x2b\x47\
+\x6d\x29\xcd\xf7\x57\x44\x37\xf9\xd5\xef\xeb\xc0\x34\x7a\xcf\xc6\
+\x8d\x53\x06\xda\x59\x09\x40\xa2\xb5\xb8\x80\x5b\xf4\xfd\xbc\x4e\
+\x85\x41\xb1\x48\x65\x04\xc2\xf8\xc8\x3a\x6d\xd2\x0a\x32\x22\x17\
+\xb9\x01\xfa\x0b\xef\xb8\x83\x26\x2e\xbb\x8c\xec\x89\xc9\xe5\xc5\
+\x89\x96\xde\x01\xe9\xd2\x1b\x3f\x25\x6e\x89\xb1\x51\x7d\xef\x2c\
+\xd1\xed\x0a\xd1\x39\x41\xd8\x8b\x26\x91\x75\xa6\xb9\xbf\x1f\x0b\
+\x08\x00\x37\x1f\x04\xf3\x4d\x01\xe0\x22\x4f\xc5\x33\x67\x38\x13\
+\x70\x5e\x6f\xd7\xa8\x5e\x8c\xb6\x06\x3c\x9f\xc0\x73\xdc\xce\xbf\
+\xe9\x26\x65\x05\xd1\xf3\x91\x96\x1b\xc7\x4f\x10\xb7\xf4\x94\x12\
+\x92\x16\x60\x6f\xd2\x00\xbb\x4d\x19\xbb\x4f\x07\x75\x48\xd5\x0f\
+\xa8\x5c\xa9\x44\xf7\x23\x22\xaa\x24\xee\x27\x0b\x28\x01\x9c\x74\
+\xdd\x39\x2d\x80\x4a\xa5\x4a\x65\x6c\x63\xed\x4b\x2f\x21\x62\x01\
+\x74\x58\x95\x6c\x19\xc7\xb0\x71\x5a\x78\xe6\x69\x4a\xc2\x5d\x26\
+\x7f\xfd\x13\xf4\xf3\x8d\xe3\x24\x72\xf8\x54\x47\x3d\x50\x9f\x3b\
+\x43\xdc\x52\x9b\x36\x93\xfc\xef\xe7\x95\xf6\x3c\xc7\x51\xd6\x60\
+\x59\x5c\x8c\x1a\x51\x0c\x68\xf1\x7f\xc7\xb2\x69\xc7\xcd\x37\xd3\
+\xf8\xee\xdd\x94\x9a\x9c\xa0\x81\x2d\x5b\xa8\x84\xcd\xd5\x0f\xaf\
+\xba\x5a\x0b\x40\x5b\x00\x7f\xe3\xac\x4b\x62\xb3\x23\x0d\x7a\x67\
+\x1c\x27\x1f\x80\x3f\x2f\x88\x53\x61\x65\x69\x29\xac\x05\x5c\x57\
+\xbb\xc0\x8a\xae\x30\xb8\x65\x2b\x15\x5f\x7f\x8d\xe6\xfe\xfa\x51\
+\xe2\xb6\xeb\xd6\x5b\x61\x05\x4e\x97\x1b\x94\x17\xf2\xaa\x64\x4e\
+\xcf\xcc\x50\x15\x5b\xe1\x7a\x22\x41\x9b\x10\x18\x67\xf0\xfc\xd8\
+\x27\x7e\x83\x8a\xd5\x2a\x07\xd3\xb6\xb8\x20\xd6\x8d\xd2\xd5\x88\
+\x1f\x23\xcf\xfd\x90\xde\xfd\xcc\x75\xf4\xda\xaf\x5e\x49\x87\x2e\
+\xff\x08\xd1\xf3\xcf\x61\xc5\x1e\x2f\x3e\x82\x61\xe8\xb3\x01\x73\
+\x0d\x2e\xd0\x96\x09\x9c\x1a\x4a\x62\x5e\x6c\xbd\x56\x23\x1b\x87\
+\x15\x46\x12\xd0\x64\x3b\xd1\x9c\x1f\xde\xbb\x8f\x6a\xef\x1d\xa6\
+\x93\x67\xe6\x68\xe1\x3f\x7e\x40\x93\x57\x5e\x49\xf1\xe9\xe9\x76\
+\x17\x00\x1c\x69\x50\xf9\xf0\x61\x9a\xfa\xd8\xc7\xe8\x92\xfb\xef\
+\xa7\x5f\xf9\xbd\x6b\x69\x6b\xad\x44\x5b\xb7\x6f\xa3\x2b\xee\xbd\
+\x97\x7e\xf7\xc0\x6b\x14\xdb\xb6\x4d\x93\x57\xc2\xf8\xe8\xe3\x8f\
+\x53\xe1\x1f\xbe\x4d\x07\x7e\xf2\x16\xe5\x92\x69\xca\x25\x52\xf4\
+\xe6\xdc\x22\x3d\xff\xe5\x3f\xa3\xa0\x9d\xbc\xb6\x80\x99\xcf\x8c\
+\x8e\xa6\x0c\xb4\xb5\x08\x40\x67\x02\xb7\x2e\x44\x41\xb0\xbf\xc2\
+\x34\x37\x4c\x4f\x51\x0d\xfb\x02\x2b\x91\xe8\xf6\x51\xf6\xfd\xe6\
+\x31\xf5\xe8\x85\x17\xaa\x78\x11\x90\x41\x73\x8f\x3e\x4c\xdc\xf6\
+\xdc\x76\x1b\x9b\x77\x18\x24\x01\xd9\x44\xf5\xd0\x41\xb2\x90\x5a\
+\xe7\x1f\xf9\x16\x1d\x78\xe4\x51\x7a\xfe\xdb\xff\x48\xaf\xdc\x74\
+\x23\x9d\xbe\xe5\x0b\x14\x1f\x1a\xa2\xab\xbf\xf3\x1d\x92\xc3\xc3\
+\xea\xd9\x91\x7d\xfb\x68\xdd\x79\xe7\xd1\xd1\xe7\x7e\x44\x42\xca\
+\x36\x9f\xaf\x5a\xf6\x32\x79\x11\x92\xd7\xb0\xf6\x0d\x0c\xec\x5e\
+\xab\x05\xc8\x65\x0b\x08\x82\x25\xa1\xb6\xc5\xa8\x05\x76\x9c\x4f\
+\x75\x6c\x86\xec\x74\xba\x4d\xf3\x82\xa1\x83\x97\x65\x71\x90\xc4\
+\xf3\xbe\x9a\x3b\xf2\xde\xfb\x94\x7b\xee\x39\x9a\xb8\xe2\x0a\x4a\
+\x6c\xdd\xd6\x6e\xce\x40\xfd\xbd\xf7\x88\x5b\x11\xd6\xe0\x41\x60\
+\x30\x78\x2a\x26\x53\xf4\xda\x7f\x3e\x43\xb3\x4f\x7c\x8f\xe2\x38\
+\x5d\xda\x7c\xcd\x35\xea\xd9\xb1\xcd\xe7\xaa\xa5\x35\x82\xa0\x8d\
+\xbc\x86\xe8\x20\xaf\x91\x20\xda\xdf\x8f\x0b\x78\x80\x53\x0e\x82\
+\xbc\x3e\x18\xd9\x30\x31\x8e\x54\x38\x4f\x71\xf8\xa1\xce\xfd\xdc\
+\xcb\x65\x04\x34\xb4\x79\x33\x39\x88\xfa\xd6\xf9\xe7\xd3\xf0\x47\
+\x7f\x8d\x36\x7f\xf1\x8b\x94\xda\xba\x95\xb8\xed\xbd\xfd\x76\x58\
+\x41\xa3\xcd\x0d\xea\xcd\x7d\x45\x72\x6a\xaa\xad\x62\x74\x0d\x93\
+\x72\x4f\x3e\x41\x68\xec\x42\x6a\xce\x32\x0d\x15\x40\xd3\xbb\xf7\
+\xa8\x5e\x10\xb5\x41\x76\x93\x57\x73\xb1\x30\x13\x9c\x9d\x0b\xb4\
+\xd6\x02\x5a\x00\xcb\xa9\x90\xb7\xc5\x73\x73\x64\x8f\x8e\xf2\x81\
+\xa7\x2e\x75\x23\x60\x91\x23\xf0\xff\x31\x04\xb5\x8b\x2f\xb9\x98\
+\x76\x0a\x97\xb2\x2f\x3c\x4b\xf9\x9b\x7f\x9f\x4a\xaf\x1d\xa0\x89\
+\xcb\x2f\xa7\xd4\x8e\x9d\xad\x6e\x00\x01\x1c\x0b\x53\x21\x22\x79\
+\xe7\x5f\x7e\x4e\x1f\x3c\x48\xaa\x35\x35\x5e\x7b\xe9\x45\x95\x48\
+\x66\xbe\xf0\x07\xe4\x0a\xd1\x45\x94\xd7\x68\x66\x32\x5d\x71\x80\
+\x4c\x53\x95\xc4\xfd\xb8\x80\xbb\x84\x5a\xa0\x55\x00\x95\x85\x05\
+\x95\x09\x60\xe3\x6a\xb1\x11\x42\x52\x59\x14\x3f\x07\xaf\xff\x2c\
+\xfd\xf8\xe1\x47\xe8\x85\x1f\x3c\x4d\xaf\xbc\xf5\x0e\xfd\xf4\x64\
+\x8e\x4e\xdf\x77\x2f\x71\xdb\x87\x02\x89\x33\x82\x7e\xaf\x78\xf2\
+\x64\x28\x80\x6d\x33\x1d\x55\x20\x22\xc8\xba\x31\xe2\xe6\xe7\xe6\
+\xd4\xdc\xc9\xa3\x27\xa8\xf8\xc2\xf3\xb4\xfe\x82\x0b\xe8\xa2\xfb\
+\xef\x23\xc7\xe0\xc0\xef\xa9\x2d\x7b\x1d\x19\x63\xe6\xfa\xeb\xe9\
+\xdc\x5d\x3b\xda\xc8\x03\x4c\x6c\x37\x77\x06\xda\x5a\x04\x10\x00\
+\xde\xac\xeb\xe6\x42\x25\x04\x61\x2d\x80\x54\x68\x8d\x0c\xf3\x2f\
+\x33\xe1\x08\xbc\x78\x32\x68\x74\xcf\x1e\x3a\x8e\xe8\xef\xe1\x73\
+\xa2\xa5\x34\x3e\xfc\xd6\xdb\x54\x7c\xf5\x15\x1a\xbf\xf4\x52\x1a\
+\xdc\xb7\x77\xb9\xe0\xa9\x14\x4a\xe4\xe0\x9b\x53\x57\x5d\x15\x1e\
+\x8c\xa8\x6f\x85\xef\xc5\xd9\xd2\x30\x97\xff\xdb\xbf\x51\xbd\x87\
+\xf5\x1f\xbe\xe5\x66\x72\x20\xb4\xed\x9f\xfe\x34\x7d\xea\xc7\x2f\
+\xd1\x87\x1e\xf8\x73\xda\xf5\xa7\x7f\x42\xd7\x3c\xfb\x5f\x34\x99\
+\x1d\xa1\xf7\x5f\x7e\xb5\xcb\x15\x70\x3d\x72\xe7\xfa\xf5\x9b\xd6\
+\x6a\x01\x02\xf0\x8e\x3b\xce\xac\x3e\x18\xe1\x5a\xa0\xc6\x47\xe4\
+\x99\x41\xf6\x95\x76\x0b\x10\xf0\xff\x6d\x5b\xa9\x7c\xe8\x10\x79\
+\xbe\xaf\x49\x2c\x9b\xb5\x83\xcf\xcf\x7e\xf3\xeb\xc4\xed\xc3\x5f\
+\xbd\x87\x5c\x37\x14\xa0\x4f\x52\xbd\x93\x04\xd9\xf1\x4f\x7e\x92\
+\xaa\xa5\x32\x79\xae\x4b\x55\xa4\xdd\xf3\x6e\xb9\x85\x16\x1e\x7b\
+\x98\x0e\xbe\xfe\xc6\x32\x99\x83\x85\x0a\xfd\xec\xea\x8f\x53\xe9\
+\xbe\xaf\x92\x3c\x7e\x8c\xa6\xf6\xef\xa7\x2d\xd3\x93\xe4\xdf\x73\
+\x37\xbd\xf9\xb5\xaf\x93\x6f\x9a\x7a\xf1\x6d\x41\x71\x5d\x22\xb1\
+\x6f\xad\x7f\x1a\x93\xcd\x2d\x71\xd5\x05\xe2\x52\xa6\x6b\x58\x54\
+\x06\x0b\x75\x0a\x4b\x2a\x15\x7a\x22\x68\x2b\x03\xc7\x90\xfe\xaa\
+\x47\xdf\x57\xd6\x80\xd6\x7e\x26\x80\xf6\xb3\x67\x7f\x44\xd3\x48\
+\x8f\x9c\xca\xf6\xdd\x75\x17\xbd\xf9\x8d\x6f\x90\x84\x4b\x79\x20\
+\x22\x2f\xba\x88\xae\x7c\xe8\x21\xda\x7b\xe3\x8d\x94\x3b\x70\x80\
+\x86\x51\xe1\x89\x27\xbf\x47\x2f\x3e\xf1\x14\xb9\x76\xac\xad\xbc\
+\x3d\x58\xf7\xe8\xc8\x63\x8f\xd3\xc8\xb7\x1e\x26\x5b\x08\x95\x02\
+\x17\xe3\x49\x68\xda\xea\x8a\x0b\x7a\x6c\x87\x99\xe0\x9f\x01\xd9\
+\x4b\x00\xdd\xc5\x10\x6a\x81\xb4\x10\x69\xce\x04\x93\xe7\x9f\x87\
+\x5a\x60\x89\x62\x48\x4f\x75\xc4\x04\xdd\x1a\x8d\x3a\x4d\x5e\xf3\
+\x5b\x34\xff\xfa\xeb\x54\xc4\xbe\x61\xa8\xb9\x17\x90\xa1\x10\x54\
+\xae\xbf\xf0\xa1\xaf\x91\x09\xed\x96\x9f\x7d\x86\x26\x93\x71\xca\
+\xde\x74\x03\xfd\xcf\x93\x4f\x51\xee\xa1\x07\xe8\xc4\x1f\xfd\x21\
+\x65\xb0\x75\x8e\x65\xd2\xe4\x97\x2b\xf4\xf6\x99\x59\xca\xc7\x07\
+\xc8\x67\xf2\x11\x21\x2d\x04\x95\x25\xe6\x70\xbf\x93\x28\xb0\xe2\
+\x1c\x59\x96\xca\x04\x6b\xb6\x80\xa6\x00\xb8\x16\x98\xe4\x6d\xf1\
+\xae\x5d\x3b\x69\xfe\xf8\x49\x8a\x83\xa0\xc0\xde\x80\xdb\x10\x0a\
+\x94\x4b\x60\xae\xe9\xc1\x0c\xc5\x21\xa0\x8f\x3f\xf8\x00\xbd\xfc\
+\x95\xbb\x49\xb6\x1e\x93\xc3\x75\xe6\x6f\xbd\x99\x8e\xc1\x35\x1a\
+\x56\x4c\x11\xf0\x0d\x43\xf5\xa7\xf8\xbe\x95\x20\xca\x17\x49\x02\
+\xdc\x64\x22\x15\x2d\x7e\x05\x82\xd4\x83\x78\xe7\x9c\x85\xb3\x81\
+\x66\x20\x14\x12\x6d\x2d\x16\xe0\x56\x5b\x6a\x81\x61\x90\x3c\x82\
+\xa8\x3c\x9e\x5d\x4f\xf4\xee\x3b\x61\x9e\x7d\xfb\x4d\x3a\xf5\xd9\
+\xeb\xe8\x10\x4c\xdf\x33\x2d\xf2\x2d\x8b\x84\x1d\x6f\x3b\x30\xf4\
+\xd0\x1f\x89\x0d\x10\xd9\xd1\x66\x08\x2d\x1c\xb7\x12\x5b\x85\x24\
+\xad\x4e\x94\x5b\x4f\x4b\x00\xf1\x2d\x9f\x1a\x19\x49\x7f\xbf\x50\
+\x28\xf6\x0a\x82\x51\x2d\x10\x15\x43\x8b\x3a\x13\x70\x2a\x2c\xcf\
+\x87\xa9\xd0\xf0\xc2\x8d\xca\xbc\xe3\xd1\xfb\x20\x37\x8b\x0a\x2e\
+\x1f\x4b\x50\xd1\xb4\x5b\xff\xd5\x46\x74\x4c\xa6\x7b\x29\xdb\x76\
+\x6c\xa2\x63\x8c\x45\x33\x74\x00\xeb\x0e\x6a\x8c\xee\x0a\xb0\xbd\
+\x28\xd2\xcf\x46\x73\x26\x4a\xe2\x3d\x6b\x75\x01\x7d\x30\xb2\x5c\
+\x0b\x38\x5c\x0b\x14\x8b\x64\x73\x7d\xce\xa9\x90\xba\x1b\x18\xb6\
+\x7e\x64\xf5\x71\xb7\x06\x3b\xe7\xba\xdd\xa0\xb7\xd6\xf5\x7c\xd7\
+\xb5\x1d\x8f\x73\x20\x7c\x11\xe8\xe1\x02\x1d\xe7\x02\x8b\x41\x90\
+\xd3\x02\xa8\x54\x6b\x61\x2a\x5c\xb7\x8e\x4c\xbd\xb7\x5f\xa1\xc9\
+\xce\xeb\xd5\x84\xd0\x69\xe2\x9d\xcf\xf7\x70\x83\x68\xae\xb7\x1b\
+\x20\x0e\xb0\x00\x8c\xb5\x58\x80\x00\xbc\x13\xa8\x05\xd0\x87\x9b\
+\x17\xd4\x02\x75\xd4\xfa\x6e\xa9\x44\x16\x6f\x8a\x5c\xb7\x9b\x70\
+\x2f\xad\x1b\xc6\x2a\x82\xe9\xd6\x78\x37\xf1\xfe\x83\x22\x22\x60\
+\x5b\x20\xec\x21\x80\xc8\x0d\x4e\xe3\x60\xc4\x97\xd2\x8f\x49\x69\
+\x73\x2d\xb0\x1e\x1b\x9e\x06\xbb\x01\xb6\xab\x62\x61\xa1\xb7\xf6\
+\x99\x70\xff\x6e\x10\x8d\x7b\xb9\x41\x8f\xe7\x41\x5c\x95\xc4\x3d\
+\x83\xe0\x4a\xbb\x42\x6c\x41\x8b\x3a\x13\x6c\xda\x79\x3e\x55\x51\
+\xbe\x26\xb2\x59\x0e\x34\x5d\x90\x8c\xd6\x6b\xa2\x5e\x41\x6f\xd5\
+\xe0\x26\xa3\xfb\xd1\x35\xa3\xc7\x0e\xb0\x2b\x28\xe2\x1a\x02\x18\
+\xbc\x6d\x62\x62\xf3\x1a\x04\x10\x05\xc2\xba\x10\x8b\xfa\x88\xfc\
+\x5c\xe4\xfa\x2a\x34\x9f\x58\xbf\x5e\x9f\xf9\x77\x47\xeb\xce\xb9\
+\x55\x48\xa9\x7e\x35\x01\x75\x13\x8f\xc6\x2d\xef\x8a\x1e\x31\x80\
+\x5a\x2c\x70\xd0\xb6\xf7\xaf\x49\x00\xda\x02\x50\x0b\x2c\xc1\x6d\
+\x54\x0d\x9f\x42\x55\x57\x99\x9f\x57\x81\x90\x84\x68\x27\xbd\x1a\
+\x71\x4d\xb8\x9d\xd4\x4a\x7d\xf4\xdc\x5a\xac\x81\xe7\x7a\x90\xe7\
+\x16\x37\x0c\x15\x08\x7b\x06\x41\x89\xc6\xc1\x42\x97\xc3\x95\xd6\
+\x73\x81\x7c\x3e\x4c\x85\xd8\x17\x18\x52\xf2\xa2\xd6\x16\x08\xf5\
+\xb8\x67\x36\xe8\x5d\x10\x51\x0f\xad\x77\x36\xcc\xee\x69\x2a\x5b\
+\x9c\x75\x10\x04\xdc\x12\x04\xa0\x8b\x21\xa7\x50\xa0\x7a\xa5\xc2\
+\x16\xa0\xbf\xd4\x3b\x10\x76\x8d\x35\xe9\xde\xd9\xa0\x37\xf1\x6e\
+\x61\xea\xac\x85\x8d\x9c\x82\x0f\x38\xbe\x2f\xc8\x34\xe7\xf8\x09\
+\x6e\x12\xad\xa7\x00\x74\x2d\x50\x68\xad\x05\x2a\x55\xaa\x3b\x0e\
+\x79\xd5\xaa\x3a\x29\x16\x98\xa3\x5e\xda\xd7\x56\xd2\xcb\x12\x7a\
+\xa4\x41\x5d\x56\x2b\x62\xf8\x5d\x0f\xbd\x27\x84\xf4\xd9\x5a\x13\
+\x89\xc0\x1a\x48\x0a\x3b\x95\x96\xf6\xf0\x90\x4c\x8e\x8e\xd1\xe0\
+\xe4\x84\x1c\x9d\xde\x44\x53\xbb\x76\xc8\xbf\xb8\xf3\xcb\xd7\xfd\
+\xdb\xbb\xef\xbe\xdc\xb3\x0e\x58\xf1\x60\xc4\xf3\xe6\x5a\x6b\x01\
+\xe5\x17\x70\x83\x18\x52\xa1\x5c\x5a\xea\x26\xdd\x87\x1b\xb8\x4d\
+\x8d\x79\x00\xf7\x0e\x88\x41\x63\x81\x88\xc7\x03\x23\x91\x10\x46\
+\x26\xc3\xff\x78\x52\x9d\x1d\x0c\x8c\x8f\xcb\xd1\xc9\x49\x63\x64\
+\x7a\xda\x1e\x99\x18\xb7\x6d\x3b\x66\x99\xf8\x9f\x6d\xd9\x14\x8b\
+\xc5\xc8\xb6\x2d\xf4\x71\xe2\xeb\x64\x32\x49\x43\x58\xe7\x79\x93\
+\x93\x15\x08\xa0\xce\x9c\x7a\xd4\x01\xdd\x81\xf0\x78\xa3\x31\x2b\
+\xf0\x8e\xfe\x23\xc9\xe4\xf6\x19\x6a\xa0\x18\x4a\x8e\x8d\x91\x80\
+\x00\x56\x7b\x11\xef\x68\x2d\x69\x73\x64\x0d\x0a\x11\x12\x63\xad\
+\x09\x99\x4a\x49\x2b\x93\x31\x6c\xa4\xd5\x01\x6c\x89\x33\xe3\xe3\
+\xe6\xf0\xf4\x94\x99\xc9\x66\x6d\x32\xd4\xc6\xc2\xe6\xe5\x5a\x96\
+\x45\x71\x45\x0e\x24\xe3\x71\x35\x8e\x27\xb8\x8f\x87\xa4\x63\x98\
+\xb7\x63\xfc\x9c\x7a\x06\x02\x61\x01\xa8\x67\xd2\xa9\x34\xed\x3f\
+\x77\x52\xe9\xad\x67\x29\xbc\xd2\xae\x10\x59\xa0\x02\x12\x15\x14\
+\x43\x19\x95\x0a\x77\xec\xc0\xb6\xf8\xb8\x0a\xa7\x8b\xb5\x5a\xe8\
+\x67\x78\x36\xb0\xac\x40\xc4\x62\x42\x26\x12\x52\x0e\x0c\x48\x99\
+\xce\x20\x58\x8e\xc9\xc4\x86\x73\xcc\xd4\xf8\x46\x63\xdd\xe4\xa4\
+\x3d\x38\x3a\x66\x41\x55\x26\x2f\xce\x34\x94\x43\x92\xc9\x8b\x06\
+\x4c\x1e\x9b\x26\x19\x80\x26\x8c\x7b\x21\x69\xc0\x62\xe0\x1e\xae\
+\x19\xea\x59\x0d\x7d\xe4\x87\x79\x7e\x57\x83\x05\xa4\xe6\x26\x92\
+\x99\x18\x6e\xf7\xda\x0e\xaf\x9e\x0a\xf9\x8f\x24\x49\x21\x32\xae\
+\xe3\xd1\xb6\xa9\x29\xf9\xea\xf1\x13\x1e\xcd\xcc\x48\xfb\xe2\x0f\
+\x1b\xa3\x9b\x36\xd9\x03\x83\x83\x26\x7e\xc8\xd4\x0b\x64\xad\x60\
+\xac\x34\x80\x59\xb2\x15\x19\x73\xf9\xf8\x1b\xd4\x31\x0e\x78\xcc\
+\x8b\x57\xe0\xb5\x99\xfc\x0e\x34\x0c\xe8\x39\x75\xf8\xc9\x82\x37\
+\x00\x7c\x97\x63\x11\xf7\xfc\x0c\x93\x0c\x85\xd8\xfc\x5d\x34\xbe\
+\xd6\xd9\x2c\xdc\xc5\xd6\xeb\x6e\xcc\x94\xa9\x35\x9c\x08\x75\x67\
+\x82\x1a\x8a\xa1\x11\x29\xa7\x38\xf2\x9f\x29\x14\xbc\x89\xcf\x7d\
+\x1e\xe7\x22\x23\x94\x49\xa7\x40\x32\xc1\x0b\x51\x84\x41\x45\xbd\
+\x26\x98\x8c\x8e\xe2\x18\xa3\x0f\x17\x69\x59\xbc\x78\x8c\x2d\x40\
+\x11\x6c\x03\x04\xa2\xc7\x9a\x84\x7a\x3e\x11\x5a\x85\x26\xac\x35\
+\xdd\x9a\xba\x59\x30\x3c\xd7\xf6\x0d\xbe\xae\x17\x8b\x65\xcb\x13\
+\x99\x35\x6c\x87\xa3\x5a\x40\x5b\x40\xa5\x79\x2e\xb0\x1e\x01\xe5\
+\xe4\x9e\x7d\xd6\xa6\xe9\x69\xca\x8e\x8d\x92\xdd\xd4\x34\xb1\x16\
+\x0c\x93\x3b\x6d\xaa\x9a\x44\x44\x8e\x11\x04\xbc\xd0\x30\xa5\x3a\
+\x2e\x6b\x57\x2f\x58\x43\x9b\x34\xa3\x6d\x8e\xdf\xd1\x42\x40\x6b\
+\x8e\xb5\x40\x57\x2e\xf3\xf9\xdb\x8d\x7c\xbe\x4a\xc2\x4f\xb3\x71\
+\xf4\x6b\x01\x2c\x00\xb5\xf3\x09\x3c\x4f\x66\xa6\xa7\x51\x06\x8c\
+\xd0\xf0\xf0\x30\xff\x78\xf3\xbb\xa1\xf6\x74\xbd\x00\x62\x7a\xcc\
+\xe0\x7b\x0a\xda\x2c\xd1\xba\xc9\x47\xd0\x1a\xe6\xbe\x6d\x0c\xa2\
+\xda\x0a\xf8\xdd\xd0\xc4\x9b\xbb\x52\xad\x71\xfd\x8c\x16\x4a\xe5\
+\xf4\xa9\x1a\x1e\x4c\xaf\xc1\x02\xba\x53\x61\xc9\xf7\x95\x00\x6a\
+\xae\x1b\x0c\x25\x93\x76\x22\x9e\x20\x5d\x1b\x60\x31\x6d\x64\xb5\
+\x00\x22\xd2\x91\x70\xb4\x56\x5b\x7d\x94\x7b\x4d\x46\x2f\x5e\x9b\
+\xb4\xe3\x38\xfa\x0f\x20\xda\xf4\xbb\x02\x1d\xe6\x75\x1c\x50\xdf\
+\xd1\xef\xeb\x00\xb9\xf8\xea\x2b\x0d\xc3\xf3\xfa\xb6\x00\xd1\xfc\
+\x17\x23\x73\xfc\xb6\x67\xdb\x42\xfd\xa8\x69\x68\xcd\x6a\xad\x69\
+\x82\xda\x2c\x79\xac\x89\x30\xb4\x50\x34\xda\xde\xd1\x66\xaf\xef\
+\xe9\x6b\xf4\xfa\x5b\x3c\xcf\xdf\x60\x8d\xab\xf9\x0c\x6a\x83\x81\
+\x81\x01\x95\xeb\x13\xcd\x38\xd4\xd9\x1a\xa5\x62\xc3\x39\x72\x78\
+\xc4\xf5\x7c\xd9\x87\x05\x44\xa9\x10\x07\x23\x67\x78\x11\x3e\x56\
+\x8d\x42\x43\x93\xd3\xd2\xd7\x5a\xd4\xda\xd7\x64\x3b\x03\x9b\x16\
+\x4e\x9b\x26\x75\xd3\x04\xb5\xf6\xf4\xb3\x3a\x23\x74\xb6\x72\x3e\
+\xef\xce\xbe\xf3\x4e\x3d\x7f\xf4\xa8\x53\x3a\x79\xc2\xaf\x9e\x99\
+\x95\x41\xa1\x60\x58\x8d\xba\x3d\x20\x45\x7c\xc8\x8e\xa5\x32\xa9\
+\x64\x32\x96\x88\x0f\xbf\x9e\x5b\xfc\xd7\x3e\xb2\x40\x94\x0a\x4f\
+\x39\xce\x82\x90\x92\x3d\x3b\xd0\x8b\x6e\xd5\xa8\x16\x82\xd6\x1a\
+\x34\xd2\xb5\x68\x5c\x6b\xb4\xa5\xaf\xd6\xc6\xef\x71\x2b\xe6\x72\
+\xce\xe9\x23\x47\xea\x0b\x47\x8e\xb8\x85\xe3\xc7\xfd\xf2\xe9\xd3\
+\xd2\x59\x58\x30\xfc\x62\xd1\x36\x1a\x8d\x44\xdc\xf7\x53\xb6\x69\
+\xc6\xf1\x8d\xb8\x0a\x90\x86\x51\x0b\x4c\xa3\xe4\x1a\x0a\x05\x60\
+\x09\xa2\x9c\x43\xd1\x75\xe8\xe9\xd3\xb3\x4f\xbe\x9d\xcf\x1f\xeb\
+\x57\x00\x3a\x13\x34\xea\xbe\x5f\xf2\xa4\x8c\x6b\x72\xda\x84\x5b\
+\xcd\x55\x43\x13\x5d\xa9\x15\x66\x67\x9d\x1c\xc8\x2d\x1d\x3b\xe6\
+\x2c\x1e\x3d\xea\x57\x67\x67\x79\x97\xb9\x4c\x2e\x21\x44\xca\x84\
+\x2c\x08\xc0\xef\x35\x1c\x29\x4b\x7c\x28\x83\x5a\xa4\x58\xc7\xd6\
+\x9c\xff\x0d\x63\x59\x88\x7c\x01\x9b\xb4\x3c\x14\x73\xd4\x75\xe7\
+\x30\x5f\x67\x57\x65\xe8\xcc\x05\xd4\x80\x02\x50\x0c\xe7\xfb\x17\
+\x80\x0b\xd4\x71\x40\x7a\x6c\x7c\x71\x71\x47\x12\x02\xb0\x59\x83\
+\xb6\xdd\x45\x12\xe4\x1a\xb9\x43\x87\xea\x79\x90\xc3\x5f\x7f\x83\
+\x0a\x6b\x0e\xe4\x44\xa9\x14\x53\x9a\x13\x22\xcd\xe4\x02\x64\xd9\
+\x86\x10\x7e\x43\xca\x4a\x93\x9c\x22\x56\xf1\xfd\x7c\x11\xc4\x16\
+\x7c\x3f\x87\x12\x7c\x1e\x3b\xd1\x32\x13\xea\x20\xc7\xf0\x5b\x10\
+\xb4\xf7\x7a\x1c\x3d\xab\xab\xc0\x1e\x02\x58\xb5\x16\x70\x80\xd2\
+\x7b\x8d\xc6\x4b\x9b\x97\x96\xf6\xbe\xf4\xe0\x83\x8b\x89\x7a\xd5\
+\x3c\x35\x9f\xaf\xe1\x80\x54\x82\x9c\x6d\x36\x1a\xc9\x18\x8a\x5f\
+\xfe\x16\x6f\x64\x80\x3a\xff\x59\xad\x2e\x65\xa1\xe6\xfb\x4b\x15\
+\x68\xac\xe8\x79\x0b\x8b\x38\x66\x3f\x89\xcd\xd5\x82\xeb\x96\x34\
+\xa1\x3e\x88\x31\x04\x20\xcf\x06\xdc\xfa\xfe\xbf\xce\x42\x00\x26\
+\x85\xe6\xb8\x11\x52\xda\x7e\xf3\xe4\xe4\x1f\x6f\x4c\x26\x77\xa7\
+\xd2\x29\xff\x8d\xb9\xdc\x4f\xaa\xa8\x0f\x4a\x40\x1e\xc4\x70\x80\
+\x9a\x3b\xe3\xba\x8b\xdd\xa4\x80\xde\xa4\xb8\x17\x8c\x1e\xe4\x28\
+\x1a\x77\xb7\xd5\xc8\xf6\x2b\x00\x2d\x04\x1b\x5d\x1a\x18\x05\x86\
+\x81\x18\x20\xce\x46\x5b\x6b\xd4\x18\x7d\x30\xc4\x3e\x78\x01\x18\
+\xe8\x2c\x26\xde\x84\xa1\x6b\x84\x5f\x2e\x62\xfd\xb7\xff\x05\xc7\
+\xfd\xe7\xdb\x23\x5d\x13\x38\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x20\x1c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\
+\x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd7\x08\x12\x14\x39\x28\x29\x91\x7c\x0e\x00\x00\x1f\xa9\x49\x44\
+\x41\x54\x78\xda\xe5\x9b\x09\xb0\x5c\x57\x99\xdf\xff\xb7\xf7\xbd\
+\x5f\xbf\xfd\xe9\xe9\x3d\x49\xd6\x2e\xd9\xda\x2c\x79\xc1\x78\xc0\
+\x76\x42\x81\xc1\x03\x64\x0c\x13\x1c\x42\x65\x02\x4e\xb1\x84\x78\
+\x5c\xc5\x14\x55\x49\x2a\x54\x48\x05\x2a\x03\xc3\x14\x03\x55\x33\
+\x13\x43\x2a\xae\x21\x9e\x01\x26\x05\x43\x80\xd8\xb2\x0d\x78\xc3\
+\x96\x25\x6b\xb1\xf5\xb4\x3d\x6b\x7d\xd2\xdb\xb7\xde\xb7\xdb\xb7\
+\xf3\x3b\xa7\xbb\x35\x12\x1a\x0a\x18\xb0\x81\x4a\xcb\x9f\xcf\xed\
+\xbb\x9c\x77\xbe\xed\xff\x2d\xf7\xb4\xfe\x7f\xff\x38\xaf\xe7\xdf\
+\x59\xb3\x66\x8d\xaf\xab\xab\xcb\xd7\xdb\xdb\x6b\x29\x91\x48\x38\
+\xd5\x6a\x55\xb9\x5c\xce\x5b\x58\x58\xf0\x96\x97\x97\xbd\x0b\x17\
+\x2e\x78\xd9\x6c\xb6\x29\x09\xfa\x2d\x16\x40\x24\x12\xf1\x6d\xdd\
+\xba\x35\xb0\x7b\xf7\xee\xf8\xdd\x77\xdf\xbd\xb5\xaf\xaf\x6f\x67\
+\x34\x1a\x5d\xcf\xf9\x75\x7e\xbf\xbf\xd7\x71\x9c\x04\x14\x6f\xf2\
+\x69\x34\x1a\x05\x43\x08\x63\xa6\x5c\x2e\x9f\x2a\x16\x8b\xe3\xd3\
+\xd3\xd3\xfb\xbf\xfd\xed\x6f\x9f\x3c\x70\xe0\x40\x0d\xa1\x34\x8c\
+\x40\x7e\x1b\x04\xe0\x6c\xda\xb4\x29\x74\xef\xbd\xf7\xf6\xbe\xf5\
+\xad\x6f\xbd\x07\x2d\xbf\x3d\x16\x8b\xdd\x1c\x0e\x87\xfb\x60\x5a\
+\xf0\x2a\xd7\x75\x2d\xc1\xb0\x3c\xcf\xb3\x0f\xf9\x7c\x3e\x4b\xc1\
+\x60\x50\xdc\x67\xcf\x57\x2a\x15\x15\x0a\x85\x49\xac\xe1\xd9\xa9\
+\xa9\xa9\x6f\x3d\xca\xe7\x5b\xdf\xfa\x56\xde\x58\xca\xaf\x52\x18\
+\xce\xaf\x4a\xdb\xd7\x5f\x7f\x7d\xf4\x13\x9f\xf8\xc4\xae\x6d\xdb\
+\xb6\x7d\x34\x9d\x4e\xdf\x0d\xd3\x29\xc3\x08\x1a\x15\x1a\x55\xa9\
+\x54\x52\x15\xa6\x6a\xb5\x9a\xdc\x7a\xbd\x25\x00\x08\xa1\x40\xad\
+\x95\xc0\xbc\x15\x42\x38\x1a\x55\x2a\x95\xb2\x14\xe5\xb8\xce\xfd\
+\x8b\x8b\x8b\xf3\x33\x33\x33\xff\x7b\x6c\x6c\xec\xcf\x3e\xf7\xb9\
+\xcf\x8d\x4f\x4e\x4e\xba\x46\x10\xbf\x6e\x01\x38\x1b\x37\x6e\x8c\
+\x7e\xfa\xd3\x9f\xbe\x79\xc7\x8e\x1d\x7f\x94\xc9\x64\xde\xe2\xe7\
+\x03\xd3\xc6\xaf\x55\x2c\x14\x54\xe1\xd8\x50\x15\x2a\x23\x04\xc8\
+\x0a\xa2\x8e\x20\x1a\x58\x82\xe1\xde\xe7\x38\xf2\x07\x02\x0a\x05\
+\x43\x0a\x86\x42\x0a\x84\x43\xf2\x9b\x63\xc6\x68\x3c\xae\x9e\xbe\
+\x3e\xf5\x41\x21\xae\x2d\x2d\x2d\xd5\x2f\x5d\xba\xf4\xcd\x23\x47\
+\x8e\x7c\x96\xbf\x7b\x22\x9f\xcf\xbb\xbf\x16\x01\xa0\x9d\xe0\x87\
+\x3f\xfc\xe1\x91\xf7\xbf\xff\xfd\xff\x7e\x68\x68\xe8\x03\x98\x70\
+\x10\x4d\x5b\xc6\x4b\x30\x6e\x28\xbb\xbc\xac\x85\xb9\x79\xcd\xce\
+\xcd\x6a\x6e\x76\x56\x4b\x8b\x4b\xca\xe6\xb2\xd6\x1a\x3a\x02\xf0\
+\x49\x0a\xfa\xfc\x8a\x84\x82\x4a\x18\xcd\x27\x12\xea\x4a\xa7\xd5\
+\x95\xe9\x56\x2a\xd3\xa5\x68\x2a\xad\x50\x22\xae\x70\x2c\xa6\x6e\
+\x84\x30\xbc\x72\xa5\x62\x1c\xcf\xce\xce\x96\xcf\x9c\x39\xf3\xc5\
+\x6f\x7c\xe3\x1b\x9f\xfb\xfa\xd7\xbf\xbe\x2c\xc9\x7b\xbd\x04\xe0\
+\x8c\x8e\x8e\xc6\xbe\xf4\xa5\x2f\xbd\x63\xcf\x9e\x3d\x7f\x8a\x89\
+\x0e\x5d\xd6\x78\x3e\xaf\x1c\x4c\x4f\x4f\x4d\xe9\xfc\xb9\xf3\x3a\
+\x73\xf6\x8c\x26\x26\x26\x34\x03\xf3\xf8\x72\x87\x71\x6b\xfa\xc2\
+\x3d\x1c\xa3\x7d\x49\x01\xc7\xa7\x00\x18\x10\x0a\xf8\x15\x45\xcb\
+\x89\x48\x54\x19\xcc\xbf\xaf\xa7\x5b\x83\x83\x83\xea\x5f\xb1\x42\
+\xe9\x81\x01\x45\x33\x19\x85\xcd\x79\xce\xad\x5a\xb5\x4a\xc2\x72\
+\xce\x9d\x3b\xf7\xea\xc1\x83\x07\xff\xf5\x27\x3f\xf9\xc9\xe7\x5d\
+\x3e\xaf\xb5\x00\x7c\xb7\xdc\x72\x4b\xf7\x97\xbf\xfc\xe5\xff\x40\
+\x48\xfb\xb7\x66\xed\x98\xa0\x0a\x50\x76\x71\x51\x13\x17\x2e\xe8\
+\xc4\xf1\x13\x1a\x3b\x7e\x4c\x68\xc7\x32\x5e\x2e\x96\xd4\xdb\xdb\
+\xa3\x95\x2b\x86\xd5\xc7\xd8\xdd\xd5\xa5\x58\x24\xa2\x30\xbe\xde\
+\x6c\x78\x06\x0f\xb8\xa7\xa0\x02\x02\x5c\x5a\x58\xd0\xfc\xf4\x0c\
+\x34\x8d\x60\x9a\x8a\xe0\x06\x29\x5c\xa0\xbf\xa7\x47\x2b\x56\x0e\
+\x6b\xc5\xea\xd5\xca\x8c\x8c\x2a\xda\xdb\xab\x38\xc2\x19\xe5\x7b\
+\x5f\x7f\xbf\xc0\x86\x2a\xd8\xf0\x1f\x1f\x7c\xf0\xc1\x2f\xe3\x22\
+\x95\xd7\x4a\x00\xfe\xb7\xbf\xfd\xed\x2b\x3e\xff\xf9\xcf\xff\x05\
+\x5a\xb9\x1b\x60\xb2\x8c\xe7\xd0\xec\xe4\xc5\x8b\x3a\xfa\xca\x2b\
+\x3a\xf0\xd2\x4b\x3a\x7e\xf2\xa4\x66\xa6\xa6\xf1\xd9\x5e\x6d\xdb\
+\xba\x55\x9b\x37\x6d\x52\x22\x1c\x91\xaf\xe9\xc9\xef\xb5\xc8\x31\
+\x04\xf3\x62\x84\xac\x45\x34\x0c\x71\xec\x72\x5f\xb5\x5a\xb3\x73\
+\x9e\x3e\x76\x4c\x0b\x08\xd1\x80\x63\x12\xb3\xef\x87\xf1\x95\x30\
+\xbd\x62\xfd\x7a\xa5\x56\x8d\x2a\xc2\xf7\x01\x5c\x62\xf5\x75\xd7\
+\x59\xa0\x45\x08\x5f\xf9\xd4\xa7\x3e\xf5\xe0\xc9\x93\x27\x8b\x3f\
+\x2f\x40\xfa\x7f\x5e\xe6\x3f\xf0\x81\x0f\xac\xf9\xcc\x67\x3e\xf3\
+\x48\x7f\x7f\xff\x9d\x26\x44\xe5\xdb\x1a\x3b\x31\x36\xa6\x1f\xfe\
+\xf0\x87\x7a\xe2\x07\x3f\xd0\xcb\x2f\xbf\xac\x01\x16\xf5\xce\x77\
+\xdc\xa3\xbb\x6e\xbf\x5d\xd7\xa1\xf5\x0c\xbe\x9d\xc4\x54\xd3\x6a\
+\x51\xaa\x43\x9c\x4b\x4a\x4a\x74\x88\x73\x71\xc6\x18\x6e\x11\xe7\
+\x5a\x6f\x32\xa5\x75\x1b\xd6\x69\x04\x06\x6b\x08\xb9\xb0\xb0\xa8\
+\x12\x02\x2f\xf2\x37\x6b\x4b\x4b\xf2\x55\xaa\x0a\x20\x98\x4a\xdd\
+\x55\xae\x84\x95\x81\x0f\x03\x03\x03\xbb\x6e\xb8\xe1\x86\xad\x58\
+\xc4\x63\xe7\xcf\x9f\xaf\xfe\xaa\x04\xe0\xbf\xf3\xce\x3b\x57\x7e\
+\xf6\xb3\x9f\xfd\x5f\xc4\xf5\x5b\x0d\x8a\x1b\xb3\x9f\xc3\x4c\x5f\
+\xda\x7f\x40\x8f\x3d\xbe\x57\xcf\x3e\xfb\xac\x5c\x7c\xfb\xbd\xbf\
+\xf7\x7b\xba\xe3\x8d\x6f\xd4\x20\xc0\x95\xc2\xa7\xd3\x4e\x87\xe9\
+\x0e\xb3\x0e\x0c\xc2\xa4\xa4\xa8\x31\xf1\x26\x24\x99\x11\xe2\x9c\
+\x19\xa1\x98\xbd\xc6\x79\xac\x22\x01\x26\x5c\xb7\x6e\xbd\xba\x01\
+\xc4\xfc\xf4\x94\xaa\x68\xba\x9c\xcb\xab\xba\xbc\x24\x87\xb5\x84\
+\x88\x1e\x0d\x9f\xa3\x3c\xc7\x19\x5c\x05\x21\x6c\x02\xa3\x36\xee\
+\xdb\xb7\xef\xbb\xe0\x52\xfd\x97\x15\x80\x8f\x30\xd7\xff\xd0\x43\
+\x0f\x7d\x85\x89\xef\x00\xc4\xac\xd9\x4f\x5d\xba\xa4\xe7\x9f\x7f\
+\x5e\xff\xf7\xb1\x47\x75\xe8\xe0\x41\xed\xda\xb1\x43\xff\xfc\xde\
+\x7b\xb5\xb2\xa7\x57\xe9\x0e\xe3\x57\x68\x38\x0a\x85\x61\x0c\xaf\
+\x57\x00\xc6\x02\x8c\xfe\xa6\x20\x46\xaf\x75\xec\x33\xc7\xf6\xba\
+\x21\x29\xc8\x18\x16\xe4\xf1\x9c\x5b\x07\x3b\x12\x1a\xc1\x22\xaa\
+\x33\x73\xaa\xb1\x86\x5a\x89\xd0\x4a\x44\xb1\x42\xf0\x33\x23\x96\
+\x96\x03\x8c\xbb\x00\x4a\x42\xe6\x26\xb2\xd0\x81\xef\x7f\xff\xfb\
+\x8f\xe3\x5a\xee\x3f\x56\x00\x0e\x79\x7b\xea\xe1\x87\x1f\xfe\xcf\
+\x6b\xd7\xae\xbd\x8f\x58\x6e\x32\x33\x4d\xc3\xfc\x8f\x9f\x7b\x4e\
+\x8f\xed\xdd\xab\xb3\xa7\x4f\xeb\xdd\xef\x7c\xa7\x6e\xdb\xbd\x47\
+\x5d\x80\x5a\x86\x85\x74\x18\x8f\x59\xa6\x61\xb6\xcd\xa4\x45\x7c\
+\x33\x1a\xbf\x6f\x42\x1c\x37\x6d\x24\x68\x8d\x6a\x9f\x77\xec\xbd\
+\x8c\x1d\xe1\x58\x30\x6c\x32\x59\xdd\x5a\xcf\xf0\x9a\x0d\x6a\x10\
+\x4e\xdd\x42\x8e\x30\x5a\x53\x3d\x57\x40\x08\x65\x2c\x21\x88\xa4\
+\x23\x2a\xd6\x6a\xd6\x1d\x58\xfb\x2e\x92\xb3\x65\x84\xb0\x5f\xcc\
+\xfe\x0b\x0b\x80\xb8\x1e\xf9\xc2\x17\xbe\x70\xef\x6d\xb7\xdd\xf6\
+\x5f\x00\x3c\x1f\xcc\x5b\xb3\x7f\xe1\xf9\x17\xb4\xf7\xf1\xc7\x75\
+\x11\xc4\xbf\xef\xf7\x7f\x5f\x1b\x09\x47\x5d\xf8\x62\x06\xcd\xe3\
+\xd7\x76\x91\x21\x18\x68\x69\xb5\xcd\x58\x9b\xa9\xa6\x65\x9a\xb1\
+\x7d\xac\xf6\xb1\xda\xc7\xba\xea\xd8\x8e\xac\xc3\x53\x20\x0d\x40\
+\x3a\x9e\x42\x45\xc9\x29\xd7\x35\xb4\xf6\x3a\x35\x96\xc1\x02\x37\
+\x27\xa7\xee\x22\x84\xa2\xfc\x60\x42\x08\xb0\x6d\x1a\x21\x10\x0d\
+\x07\x08\x95\xe4\x0b\xbf\x43\x8e\xf2\x14\x2e\x3a\x21\x66\xfc\x45\
+\x04\xe0\xa7\x80\xd9\xf4\x91\x8f\x7c\xe4\xaf\x40\xe0\xa4\xc9\xe8\
+\x96\x09\x73\x07\x0f\x1c\x40\xf3\x8f\xeb\x3c\x21\xce\x30\xbf\x66\
+\x60\x00\xcd\xfb\xd4\xed\xf7\x29\xe9\x39\xd6\x7f\x03\x2d\x2d\x42\
+\xad\x58\xaf\x0e\xa3\x57\x33\x79\x95\x15\xa8\x6d\x05\x96\x38\xee\
+\x8c\x1c\x28\x18\xa7\x2e\xe8\x8a\x28\x56\x73\xe5\xe5\x4c\xf4\x80\
+\x88\x40\xfd\x6b\x56\x03\x86\x17\xb9\xa7\x2a\xaf\x84\x80\x8a\x65\
+\xf9\x39\x1f\x8a\xc7\xd4\x20\xcc\xba\x92\x86\x56\xac\x08\x90\xa7\
+\xdc\x76\xe2\xc4\x89\x47\x00\xc6\xf2\xcf\x2d\x00\x24\xd7\xf5\xc5\
+\x2f\x7e\xf1\xb3\x84\xbb\x5b\x08\x2f\x36\xc1\x39\x41\x48\x7a\xfc\
+\x89\x27\x34\x06\xd2\xbf\xfb\x77\xef\xd1\xda\xa1\x15\xea\x86\xf9\
+\x54\x44\xea\x92\x8f\xe4\x25\x2e\x11\xbe\x3a\xcc\x59\x26\x1a\x10\
+\x82\x40\xcb\x57\x6a\xfe\xaa\x31\x68\xb4\xe6\xba\xc4\xf7\x11\xad\
+\xba\x79\x8f\xfa\xd6\xae\x55\x1f\xbe\xde\x47\xa8\xeb\xdf\xb8\x56\
+\xf1\x35\xbd\x0a\xf7\xf4\x6b\xd5\x75\x5b\xd4\xbf\xe1\x06\x0d\x6e\
+\xde\xac\x9e\xd1\x51\x2d\x9c\x1a\x57\xdf\x48\x9f\x16\x16\x27\x14\
+\xab\x53\x64\x95\x5d\x35\x89\x4e\x01\x39\x0a\xa6\x92\xaa\x01\x9e\
+\x41\x04\xd1\xc3\x07\x2b\xf0\xbe\xf7\xbd\xef\x3d\x2d\xa9\x71\x8d\
+\xa5\xeb\xda\x4f\xf0\x81\x07\x1e\x78\x13\x7e\xff\x1e\xc2\x9d\xcd\
+\xe3\xa7\x88\xc9\xa0\xaa\x8e\x1e\x79\x59\xb7\xec\xd9\xad\x75\xc3\
+\xc3\x4a\x4b\x84\x38\xc1\x78\x40\x41\x98\x1b\x20\x16\xa7\x07\xfb\
+\x5b\x0c\x37\x5a\xc4\xf1\x15\x82\xb8\x96\x12\x84\xcc\x55\x37\xed\
+\x91\x83\xfb\xa8\x69\xdc\xe4\xea\xcc\xc4\xf1\xd7\x55\x27\x19\x8a\
+\x45\xc3\xdc\x1f\x30\x67\x3a\xff\xc9\x2b\x57\x14\x4b\x74\x6b\x64\
+\xeb\xf5\x44\x08\xbf\xe2\xc2\x32\x4c\x74\xc0\x3a\x6b\x27\x4e\xca\
+\x9b\x5f\xd0\x0c\x19\x29\x25\xb7\xe0\xe5\x81\x0f\x7e\xf0\x83\x9b\
+\xcd\x04\x3f\x4b\x00\x0e\xda\xcf\x50\xca\xfe\x21\x26\x18\xb0\xf1\
+\x9e\xd4\x76\xec\xe8\x98\x8e\x1c\x3a\xa4\x34\xfe\x75\xeb\xce\x5d\
+\x4a\x35\x05\xd8\x11\xaf\xc3\x3e\x28\x24\xc7\x6d\x58\x06\x52\x83\
+\x43\x56\x83\xfc\x55\xc3\x34\x74\x25\xf3\x8d\xd6\xb1\x71\x11\x09\
+\x0d\xaf\xd3\x10\x89\x12\xcc\x9b\x73\x96\x3c\xa8\xf3\x8c\xb8\xbf\
+\xd1\x2c\x2b\x90\xea\x95\xcf\x0a\x51\x10\xff\xb3\xd7\x20\xc6\xfa\
+\x72\x4e\xab\x6f\xbc\x49\xc9\xe1\x5e\x25\x03\xb8\x20\xcf\x08\x57\
+\x75\x4f\x9f\x55\x1d\x41\xd4\xb3\x39\xcd\xce\xcc\xa8\xbb\xbb\x3b\
+\x7a\xeb\xad\xb7\xfe\x91\xa4\xf0\xcf\x12\x40\xe0\x43\x1f\xfa\xd0\
+\x1b\x30\x99\xdb\x0d\xf3\xb5\x72\x19\xb0\x9b\xd0\x91\xc3\x87\x34\
+\x4b\x4e\xff\x4f\xde\x7c\x87\x92\x86\x51\x28\x0e\x85\x78\x9a\xe5\
+\x4b\x56\xe3\xae\x65\x32\x92\x4c\x6a\x68\xcb\x66\x05\x11\x56\xc7\
+\x0a\x3a\xcc\x73\xc0\xf9\x80\x86\x77\x6e\x53\x7a\x68\xa8\xe3\x16\
+\x1d\x21\x5d\x1e\xbd\xf6\x33\x35\xaf\xa6\x68\xba\x5b\xf8\xc8\x35\
+\x56\x64\x05\x56\xab\x2a\x46\x6a\xdd\x7b\xfd\x76\xd2\xeb\x16\x77\
+\x81\x5a\x5d\x4d\xc0\xba\x81\x00\x3c\xb2\xc8\x02\x0a\x34\x25\xf8\
+\xca\x95\x2b\xdf\x73\xdf\x7d\xf7\x6d\x90\xe4\xfc\x54\x01\x50\x8b\
+\x27\xdf\xf6\xb6\xb7\xdd\x4f\x1d\xef\x33\x0f\xe5\xc9\xc0\xc6\x4f\
+\x9e\xd0\x19\xd2\xdb\x35\xc3\x2b\xb5\xb2\x3b\xa3\x64\x87\x79\x16\
+\xe4\x73\x01\xa6\x96\x6a\x34\x73\xfc\x24\x7e\x58\xb1\x4c\x53\xda\
+\xe2\xab\xa4\xc0\x7d\xbd\x57\xb9\x43\x72\x20\xad\xe4\x86\x21\x85\
+\x13\x21\xfb\xbd\x01\x68\x4d\x1d\x79\x45\x2e\xc2\xbe\xc6\x6d\x9a\
+\x8c\x12\xf7\xa6\x25\xe6\x6b\xaa\x7e\xf9\x9a\xd7\x06\x53\x5f\x90\
+\x68\x43\xe1\xd4\xbd\x79\xbb\xc2\x71\x8a\x29\x2c\x2f\x64\xc2\x2d\
+\xb9\x81\x26\xa7\xe4\x52\x8c\x09\x25\x2e\x92\x3d\xd2\xa3\x08\xdd\
+\x7e\xfb\xed\x1f\x35\x6c\xfe\x14\x01\xd8\xa4\x67\xd5\xf0\xf0\xf0\
+\x9b\x6d\xd3\x02\x9a\x45\x92\xe3\xc7\x8f\x2b\x37\x33\xab\x3d\xdb\
+\xb7\x2b\xe1\xb5\x98\x0f\x7b\x6d\x34\xae\xd4\x44\x1b\x0b\x33\x6e\
+\xa8\x92\x5d\xd6\xa5\x23\x47\x54\x5e\x5a\x6a\x23\xbb\xd4\x43\xde\
+\xde\x0b\x36\x38\x8e\x0f\xd7\x58\xad\xae\xf5\x83\x72\x9d\x96\x36\
+\x2b\xa4\xd2\xe7\x5f\x78\x41\x59\xf2\x8a\x2b\x35\xeb\x59\x17\x60\
+\x6c\x0b\xc3\x4f\x7c\x0f\xf6\xad\x92\x17\xc8\x09\x6e\x38\x57\x63\
+\xee\x9a\x82\x31\x4f\x91\x95\x09\xa5\x46\x37\x2a\x3e\x30\xc2\xf7\
+\xa0\x65\xc6\x2f\x59\xc5\x80\x8e\x6a\x5e\xbc\x64\xb1\xa0\x8a\x40\
+\x5c\xce\x01\xea\xef\x06\x13\xd3\x3f\x4d\x00\xa1\xfb\xef\xbf\xff\
+\x1e\xc2\x5e\xcc\xdc\x5c\x06\xfd\x2f\x9e\x3b\xa7\x4b\x50\x17\x68\
+\xba\xb2\xaf\xcf\x32\x1f\x31\xc9\x89\xf5\x41\x34\x58\xc2\x02\xaa\
+\x2c\xca\x6f\x17\x6b\x35\x39\x05\x5e\x2c\x9d\xbf\x60\x90\xdd\x32\
+\x11\x27\x3d\x1d\xdd\xbd\x4b\xc9\x15\x5d\x2a\xe3\xef\x31\xc2\xd4\
+\xf2\xc4\xa4\x2e\xec\xdb\xaf\x6a\xbe\xd0\x36\xfd\x46\x27\x62\x40\
+\xae\x25\xbe\x5b\x6c\xa9\x15\x73\xea\x1e\xdd\x2c\x67\x78\xbd\x6a\
+\xf1\xaa\xea\xe1\x05\x79\xf1\xac\xba\x6e\x5a\xa3\xfe\x37\xbf\x13\
+\xdc\x59\x05\x58\xc2\x38\x40\xe9\x48\x90\xcd\x2a\xad\xe6\x1d\x98\
+\xaf\x9d\x3f\x2f\x1f\xf3\x93\xbe\x1b\x2b\xe8\xff\xd8\xc7\x3e\xf6\
+\x96\x2b\xf9\x0e\x74\x0e\x4c\xbc\x5f\xb7\x6e\xdd\x3f\xb5\xfd\x3a\
+\xc8\x80\xdf\xc4\xd9\x73\xca\xcf\xcd\x69\x23\x05\x89\x61\x3e\x6a\
+\xd2\x52\x99\x2c\xcd\x11\xff\xc1\xb0\xf1\x39\x4f\x35\xbf\x83\x96\
+\x1b\x62\xdd\x36\x7e\x2f\xf2\x5c\x79\x69\x59\x7d\xeb\xd6\xca\x47\
+\x8d\x2f\x01\x58\x2a\x29\xda\xb7\x5a\x0b\x2f\x3d\xa5\xec\x89\x39\
+\xee\xbd\x3a\x3a\x74\xa2\x87\xeb\x95\xe4\x73\x4c\x1e\x11\x56\x80\
+\x46\x49\x61\xfa\xac\x62\x3d\x03\xea\xb9\xee\x06\x35\x86\xd7\xa9\
+\x5e\x29\xda\x7b\xd3\x3c\xeb\x0f\x84\x54\x2f\xcd\x6b\xf9\xcc\x01\
+\xf9\x38\xbe\xaa\xbc\x75\x11\x22\x19\x63\x63\x72\x52\x3e\x5c\xb3\
+\x1a\x29\x8b\x2e\xb4\x46\x46\x46\xee\x91\xf4\xb7\x50\xf5\x4a\x01\
+\xf8\xe8\xeb\xf5\x51\xec\x6c\x43\x00\xb6\x46\x5f\x9a\x9f\xd7\x0c\
+\xc0\xe7\x15\x8a\x1a\x1d\x18\x84\x79\x4f\xe0\x7d\x0b\xf4\xd4\x12\
+\x00\xa7\x14\x2a\x4b\x95\x4c\x42\x3d\x23\x61\x92\x91\x90\xb8\x6c\
+\x85\x20\xa8\x00\x08\x25\xfa\xfb\x59\x5c\x55\x0d\xe2\x7d\x94\x92\
+\x36\x68\xd2\x65\xaa\x44\x0b\x1d\xed\x4c\x11\x8b\x69\x9b\xbd\xcb\
+\xbc\xf4\x06\xca\x05\x25\x82\x43\x6a\x54\x29\x74\x66\x2f\xa8\xd0\
+\x33\xc8\x3c\x2b\x69\x93\x05\x99\x2b\x6d\x05\x40\x6f\x0d\x21\x56\
+\x55\xbc\xf4\x8c\xca\xf3\x17\x98\x2c\x70\x75\xaa\x67\xc0\xb5\x84\
+\x30\x97\xb3\xaa\xd3\x91\x0a\x66\xba\x2c\x18\x92\x22\xdf\x2a\x29\
+\x7e\x8d\x00\xde\xf7\xbe\xf7\xed\xa4\xe7\x96\x32\x75\x7e\x1d\xbf\
+\x5e\x64\xf1\xb9\xf9\x39\x85\x78\xa8\x2f\x95\xb4\xa6\x1f\xb8\x42\
+\xfb\x12\xa3\x44\x4e\x8e\x65\xf4\xd3\xcc\x1c\x1a\x54\xaa\xe6\x80\
+\xcc\x2d\x21\x48\x56\x10\x2d\xcd\x3a\x15\x85\x32\xd7\x59\xbb\x4b\
+\x76\xf7\x90\xae\x26\x61\xfc\xef\x05\xb5\x6c\x05\xd0\x10\x12\xc0\
+\xd7\xc1\x1f\xa7\x2e\xa9\xc6\x5c\x01\x42\x20\x45\xce\xd8\x8f\xd1\
+\xf4\x0d\x4a\xaf\x24\xc4\xca\x69\x27\x57\x2e\x65\xf2\x69\x15\x27\
+\x9e\x43\x18\x01\x6b\x8d\x57\x49\x80\x63\x38\x96\x43\x16\x5b\xa3\
+\x3f\x11\xdb\xb8\xd1\xe2\x55\x32\x99\x1c\x7d\xef\x7b\xdf\xbb\x96\
+\x56\xda\x92\xb9\xab\xe3\x0b\xc1\xcd\x9b\x37\xef\x68\x58\xe0\xf1\
+\x6c\x03\x73\x79\x76\x4e\x55\xe2\x68\x8c\xef\x69\x90\x36\xc8\x1f\
+\xf5\x75\x90\xda\x35\xe4\x5a\x72\x2b\x1c\x67\xb3\x30\x38\x48\xd2\
+\xe2\x5a\xc1\xe2\xfb\x68\xc7\xf8\xb1\xa1\xba\xdc\x26\x85\x4c\x77\
+\x9f\xd5\x78\xc7\xd4\xbd\xcb\x73\xb9\x1d\x74\x87\x60\x3c\x88\x30\
+\x09\x7d\xcc\x63\xae\x63\x05\x7e\xf9\xf2\x21\x95\x4f\x1d\xd0\xc2\
+\xab\x87\x39\xc7\xf9\xa6\xc1\x9e\x25\x15\xce\x3f\xa6\xc2\x1c\xbd\
+\x01\x04\x5f\xcf\x5f\x5b\xf9\xda\x39\xc1\x19\x17\x6b\x0e\x4a\x82\
+\x3f\xdb\x7e\xa7\x48\xba\xd1\x28\xfd\x4a\x0b\x08\x63\x1a\xd7\x99\
+\xf0\x02\x59\xd4\x2c\x90\x50\x08\x41\x24\xda\xa5\x6c\x80\xf3\x72\
+\x98\x54\x90\x73\xd9\xd3\x6c\xde\xdf\x58\x32\xa5\xe9\x9c\xa2\x83\
+\x6b\x94\x3d\xf4\x8c\x2a\x97\x6a\x1d\x3c\xb0\xc5\x4c\x78\x75\x4c\
+\x99\x70\x54\x24\x16\x5a\x9a\x9c\xe0\xba\x07\xe3\xcd\xcb\xe9\xb0\
+\x5b\xad\xd1\xe8\x98\x57\xe0\x62\x45\xd1\xeb\xd7\x60\xe6\x61\x2d\
+\x1e\x3b\xa2\xca\x82\x1f\x86\x5b\xf7\xf8\xfc\x35\x85\xce\x9d\x56\
+\xa3\x56\x51\xd7\xaa\xf5\x98\xfe\xb3\xaa\xcc\x8f\xa9\xb4\x80\x5b\
+\x16\xa5\x7a\xe1\xda\xfe\x07\xcc\xd8\xf4\x98\x57\x4e\x56\x79\x00\
+\x9d\x3d\x0d\x18\xae\x6f\x0b\xa0\x61\x05\x40\xba\x18\xe5\xe4\x68\
+\x5b\x00\x36\x01\x2a\xe7\x73\xf2\xd7\xea\xb6\x3b\x13\x70\xeb\x98\
+\x62\xf8\x1f\x2c\xa8\x3c\xa8\x56\xc0\xdf\x27\x4e\xab\x67\xe3\x0e\
+\xe5\x87\x46\xc9\xc2\x9e\x57\x79\xc1\x33\x8b\x87\x19\x68\x68\xc0\
+\x40\x33\xa1\x2a\x8e\x35\xc0\x2c\x9d\xe2\x46\xa5\x53\x00\x59\x37\
+\xc1\xda\x96\x54\xca\xe4\x94\x19\xb8\x9d\x67\x69\xa2\x5e\xbc\xa0\
+\xfc\xc5\xc6\x55\x40\x19\x8c\x73\x5f\xed\xbb\xf2\x6e\xbd\x59\x95\
+\xc9\xa7\x54\x5e\xac\xa9\x59\x8c\xaa\x3c\x57\x27\xa7\xa8\xf2\xb7\
+\xac\x17\x5d\xbd\x4c\x5c\x5a\x46\x08\xf4\x26\xa9\x8c\xac\x52\x00\
+\xc3\x75\x6d\xe5\xd7\x6d\x82\xcd\xc9\x08\xfe\xdf\xdd\xa9\xc4\xea\
+\xa0\xa6\xcb\x03\x41\xd3\x91\x09\x88\x73\x39\x72\x11\x34\x68\x7c\
+\xfc\x27\xd2\x69\x66\xc4\x4c\x9b\xf4\xec\x12\xe4\xe7\x45\x0d\x6c\
+\xd8\xae\xd2\xf8\x51\x98\x58\xb4\x02\x18\xde\xb3\x4b\x4e\xb7\x2b\
+\x07\x21\x86\x58\x40\x64\xc5\x88\x4a\xaf\xce\x6a\x74\xcf\x1b\x25\
+\xaf\x85\x01\x67\x9e\x79\x56\x7e\xea\xfd\x08\x7d\xbe\xee\x61\x22\
+\x45\x31\xcf\xf5\x9b\x55\xdf\x1c\x63\x0e\x33\x7f\x15\x4d\x2f\x68\
+\xe1\xf4\xb8\x8a\x67\xa6\x34\xe1\xfe\x9d\x32\x83\x39\x84\x44\xb4\
+\x28\x86\x55\x99\xcb\x2b\x10\xa9\xcb\x09\xb3\xf6\x25\x3f\x56\x72\
+\x79\x6d\xd6\x0d\x7d\x75\x97\x90\x5d\xc4\x00\xfa\xad\x1b\xc0\x6b\
+\x7f\xc7\xfa\x2f\x63\x00\xbe\x11\x45\x00\xd6\x02\xdc\x3a\x92\x05\
+\x40\xa8\xeb\x61\xcc\x91\x8b\xf9\x05\x42\x36\x5e\x5f\x4d\xae\x6b\
+\x47\xaf\x8e\x58\x08\x87\x15\x6a\xf4\x10\x5a\x0e\x0f\x0e\x81\xd8\
+\xd6\xcf\x6d\xb8\x13\x0c\xd4\x8b\x59\xeb\x42\x19\xac\x24\x3c\x14\
+\x15\x27\x3b\x58\x80\xe6\x5c\xc5\x46\x42\xea\xd9\x76\x8b\xfc\xa1\
+\x20\xf3\x56\xed\x73\x16\x6b\xcc\x75\x4c\x37\xde\xdf\xa7\x91\x9b\
+\x6e\x26\x5b\xcd\xc0\x64\x5e\xf9\x19\xae\xe5\xfd\x58\x4e\x90\x28\
+\xb0\x48\x32\x86\x9b\x76\xb9\x8a\x64\x58\xcb\x95\x3a\x6a\x97\xe6\
+\x5e\x0d\x1e\x02\x81\x4e\xc8\x8f\x9b\xe1\x2a\x01\x70\x32\x72\xb9\
+\x16\x77\x5b\x80\x17\x96\x14\x89\xf9\x31\xdd\x28\x8b\xd4\x15\x49\
+\xcb\xb5\x82\xf0\x4c\x49\x5a\x5a\xb6\xb1\x21\xdc\x3d\x80\x46\xdb\
+\x80\xe7\x1a\xe1\x34\x31\xfb\x49\xc1\x15\x89\xcb\x0a\x65\x76\xdd\
+\x22\x5f\x2c\xcb\x12\x4a\x24\x31\x45\x25\x56\x39\xca\xec\xbe\x55\
+\x99\xd5\x6b\xdb\x00\x57\x62\xc1\xb8\xa3\x4d\xa6\xda\x64\xc1\xd2\
+\x53\xff\xa6\x75\xd6\x2a\x4a\x53\x92\x9b\x8d\x20\xd8\xba\xaa\x26\
+\xde\x57\x1d\x18\xa4\x14\xee\x62\xed\xc1\xab\x2c\x14\x62\xe4\x79\
+\x9a\xa8\x1d\x01\xc4\x7e\x12\x04\x1d\x4c\xc3\xf1\x0c\x83\xf6\x4a\
+\xd3\x5e\x08\x3a\x52\x18\xb2\xe8\x0f\x98\xd9\x30\xe5\x75\x26\xbe\
+\x3a\xe6\x34\xeb\x46\xca\x06\xa1\xeb\x36\x7d\xc5\x96\xda\xd6\x01\
+\x92\x97\x7d\xf2\xa6\xcf\xab\xb1\x9a\x50\x18\x0a\xab\xff\x86\xdd\
+\xca\x12\x59\x34\x77\xc6\x3c\x49\x65\x78\x17\xf8\xb1\x0d\x2d\x8a\
+\x79\xd0\x7e\x39\xaf\x06\x02\x38\xfd\xa3\xa7\x2c\xd3\xe1\x78\x5c\
+\x83\x37\x5c\x8f\x55\x31\xab\x93\xc5\x22\x82\x6a\xe4\x04\x78\x86\
+\x55\x26\x5a\x79\xf8\x39\x38\x06\xcc\x98\x05\x7b\xf8\x7a\x93\xe7\
+\x9d\x2b\x85\x60\xad\x08\x2b\xef\x84\xe7\x4e\xd2\xd8\x11\x00\x42\
+\xe7\xc3\x85\x76\x3b\xcc\x4f\xa3\x11\x62\x45\x7e\x18\xf0\xe1\x54\
+\x75\xb7\x80\xb6\x42\x52\xbd\x3d\xe7\x55\x42\x68\xb6\x42\x98\x5a\
+\x3e\xe7\x96\x0b\xb8\x90\x09\x93\x56\x8b\x00\x1e\x52\x07\x89\x0b\
+\x53\x17\x94\x1a\x59\x85\x80\x7c\xea\xdd\xb8\x55\x8d\x35\x68\x5c\
+\x20\xbc\x31\x7b\xeb\xaf\x35\x35\x8c\xf6\x4b\x05\xc6\x20\xb1\xbf\
+\x64\x05\x50\xcb\x17\x48\x84\x7a\x94\x59\x13\xa3\x29\x7b\x09\x2c\
+\xc1\xdd\x96\x22\xcc\x5b\x47\x00\xb3\xed\x90\x07\xb9\x0e\x2e\xd4\
+\xb4\x02\xa8\xe6\x6c\xc8\xb2\x82\x11\x14\x08\x87\x6d\xe9\xcd\x77\
+\x53\x17\x94\x0c\xcf\x57\xba\x80\x0b\xff\x95\x8e\x00\x02\xc1\x80\
+\xc2\xc1\x90\x15\x40\xb3\xcc\x12\x17\xa7\xd4\xe0\x38\x94\x34\x3c\
+\xa3\xd5\x2b\xfc\x1f\xe2\x24\xa3\x9f\x3e\x7d\x2c\x69\x05\x51\x5b\
+\x9c\x36\xa6\xd9\xbe\xee\xb6\xcc\xb9\xe8\xd3\xd2\xf1\x83\x68\xc6\
+\x30\x55\x13\x92\xc4\x4d\x70\x2f\x88\x63\x90\xd8\x16\x39\x30\x4b\
+\x31\x55\x2a\xa3\xd5\xcb\xee\x86\xe6\xfd\xa4\xc3\x21\x55\xaa\x13\
+\xe4\x13\x45\x04\xd0\x24\x22\x04\x40\xff\x29\xee\xab\xb5\x75\xd0\
+\xae\x03\x1c\xc1\x2c\x7e\xcf\xd8\xd6\x26\x6b\xf3\x29\x9c\x4c\x5e\
+\x16\x00\xd6\x5e\x96\xe4\x5d\x69\x01\x55\x8a\x85\x2c\x17\xe4\xf0\
+\x2f\x88\xb4\xa2\xd4\xf3\x05\x53\x86\x56\x1c\x55\x2f\x4d\x2a\x0a\
+\x6a\xbb\x4b\x53\x0a\xa7\x43\xaa\x2e\xb9\x1d\xe5\x63\x15\x14\x48\
+\x5d\x52\x33\x19\x55\xbc\xb7\x4f\x75\xb4\x5f\x9e\xba\x88\x00\x0c\
+\x00\x36\x21\xd7\x2c\x02\x01\x38\x2a\x2d\x9e\x52\x61\xc3\x46\xac\
+\x60\xd4\x6a\x85\xa7\xda\xeb\x68\xf9\x37\x44\xec\x9f\x46\x0e\x4d\
+\x0b\x82\xa3\xb7\xdc\x6c\x05\x10\x8c\xfa\x15\x88\xcf\xca\xf5\x16\
+\x50\x42\x59\x71\x94\x51\x9e\xe1\x38\x32\xaf\x6a\x10\x86\xea\x6a\
+\x15\x44\x30\x6e\x4a\x82\x9a\x8d\x6d\x86\xe0\x06\x1e\x3c\x53\x84\
+\x51\x94\x75\xde\x99\xa1\xec\x79\x06\xb7\x63\x01\x4d\x88\x28\xb3\
+\x30\xe9\xb5\x93\x9d\x40\x84\xbc\x9d\xc2\x21\x84\x69\xca\x63\xc2\
+\x19\xfa\x82\x17\x4f\x29\xb3\x69\xbb\xe2\x1b\x57\x28\x71\x5d\x58\
+\xb1\x15\x94\xc6\x2b\xa5\xd4\xfa\xa8\xd2\x3b\x37\x72\x6d\x27\x9a\
+\x0a\xa8\x34\x37\xad\xda\xec\x02\xe6\xd9\xd2\x1e\x02\x80\x18\xb1\
+\x82\xf2\xa5\xa2\x96\x8e\x1e\xe0\xb8\x24\x54\x67\x1b\x9a\x6a\x6b\
+\xbe\x69\xc8\xa5\x09\x33\x8f\xb5\x95\x1c\x2e\x5b\xf4\xc7\xa4\x03\
+\x54\x7a\xa4\xb3\xd5\x29\x3a\x3f\xe4\x23\x7c\x0f\xc5\x68\x84\xa4\
+\x27\x94\x1c\xad\xaa\x6b\x6d\x43\xd1\x6e\x62\xfb\x30\x58\x91\xa0\
+\x44\x4e\x19\x16\x3a\xd6\x60\x5c\x22\x24\x7f\x3c\x81\xe2\xd2\xea\
+\x58\x38\xca\x3e\xcb\xe0\x5e\x69\x01\x15\x5e\x37\x5f\x68\xa7\x8a\
+\x56\x00\x71\x3a\x2d\x61\x80\xca\x71\x72\xaa\x2e\x37\x95\x3b\xfa\
+\x8a\x86\x6e\xbc\x59\xdd\xeb\x37\xca\xb9\x7e\x37\xfe\x99\x67\x81\
+\xb8\x45\x22\x69\xcd\x2b\xc4\xbd\x1e\x0c\x94\x2e\x9e\xc5\x05\x4c\
+\x62\xd2\xb0\x21\xc8\x46\x08\x00\x94\x0f\x7e\x4b\x59\xfa\xea\xb8\
+\x4a\x37\x6c\x53\x6a\x68\x58\xb0\x29\x62\x94\x05\x4e\xdb\xe2\x22\
+\x6f\xaf\x13\x4a\xdd\x52\xc8\x0a\x8e\x05\x83\x17\x75\xc6\x59\xc5\
+\x7a\xa9\x27\xd2\x31\xd6\xd3\x24\xaf\x99\x50\x62\x10\x54\xc7\xdf\
+\xb3\xb1\xba\x92\x83\x8e\x55\x54\xac\xdf\xa3\x36\xc1\xcc\xc9\xf0\
+\xf9\x87\xc9\x1b\xcb\x89\xcb\x47\x63\xc6\x6f\x92\x20\xe6\xe7\x63\
+\x36\x5b\x9c\x66\x68\x5c\x89\x01\xb5\x31\x3e\x6e\xfb\x8f\xfa\x90\
+\x5a\x82\xfa\x3f\xc2\xc3\x4c\x62\x4d\xac\x7c\x3e\xaf\xe9\xe7\x7f\
+\x04\x43\x25\xf9\x9d\x0a\x85\xc9\x08\x4c\x0c\x21\x71\xee\x71\x6c\
+\x1e\x4f\x3c\x9e\x21\xef\x9e\xc5\x8f\x6d\x28\x6d\xbd\xf4\xb4\x16\
+\x00\xd5\x4d\xdd\x40\x9a\x3d\x57\x50\x69\xf2\x02\xf7\x57\xed\x33\
+\x1e\xd4\x74\x49\x9d\x99\xb7\x78\xe1\x04\xe8\x5e\x36\xf7\xd9\x6e\
+\xd1\xf9\x67\x9f\xd3\xf4\xb1\x1f\xab\xb4\x7c\x46\xd1\x01\x3f\x16\
+\x66\xc2\xd5\x8c\x22\xe9\xb8\x42\xa9\xa8\x62\x03\x41\xf5\x6d\x75\
+\xd4\xb3\xc9\x53\xcf\x96\x06\x02\x90\x4d\xd6\x1c\xd7\x47\x04\xf3\
+\xb5\x36\x5c\xa0\x9c\x38\x1d\x67\xe1\x0a\x9d\x4c\xf7\xa5\x97\x5e\
+\x3a\x72\x0d\x08\x3e\xf9\xe4\x93\x87\x79\x97\x56\x32\x37\x38\x94\
+\x9d\x71\x04\x10\xc5\x0a\x8c\x09\x35\x25\xea\x7b\x29\x77\xf8\xa8\
+\xe6\xc7\x0e\x61\xde\x79\x62\xef\x84\x8d\xd9\x96\xbc\x9a\x05\xb7\
+\xfc\xe9\x63\xc4\xe6\x26\xd7\x3d\xcb\x7c\xc7\x05\x3a\x84\x50\xb8\
+\x86\x20\xb0\x1e\x98\xb7\x66\xcf\x09\xc2\x24\xf5\xc1\xf4\x5e\xcd\
+\xef\x7f\xc2\x6a\xd0\xab\x59\x90\x45\x08\x15\x18\x68\xd0\xf1\x09\
+\x71\xef\x12\xe7\x2f\xe2\xe7\x30\x97\x48\x51\x7c\xf5\x70\x2d\x4e\
+\xe1\x14\xa2\x90\xf1\x81\xfc\xed\x30\x58\x43\xf7\x35\xbf\x22\x4e\
+\x00\x1c\x8b\xc9\x0b\x85\x08\xbb\xf4\x12\x4c\x94\x81\x30\xff\x69\
+\xb6\x1b\x9d\xfc\x49\x10\xf4\xf8\x5c\x64\x33\xc3\xab\xd4\x04\xdb\
+\x48\x15\x49\x66\x32\x4a\x50\xe2\xe6\xe9\xa8\xd8\x5c\xda\xe5\xe1\
+\x0b\x35\xcd\x3d\xff\x14\xdd\x9d\x21\xc5\xfa\xfa\x55\x5d\x30\x66\
+\x69\xea\xfd\x10\xe0\x35\xa7\x3a\x55\x57\x2d\x17\x31\xcc\xb6\xa3\
+\x83\xc9\x0f\x60\x1e\x57\x41\x8a\x9c\x73\xad\xc9\xe3\x9b\x30\x58\
+\x80\xa1\x79\x79\x95\x33\xb8\xd8\x51\xac\x62\x99\xe2\x86\x34\x35\
+\xe0\xb4\xdc\x47\x02\xe9\x23\x58\x98\x41\xf5\x79\x70\x61\x49\xa1\
+\xae\x1e\x1a\x17\x71\x14\x94\xa0\x59\x02\x40\xc3\xa4\x70\x51\xb1\
+\x36\x61\x31\x6e\x1d\xed\x57\xc0\x8c\x0a\xd1\x05\x73\xf1\x27\x53\
+\xaa\x74\xa5\x71\xdb\xf5\xca\xb6\x37\x66\xcd\xcf\xcf\x1f\x94\x94\
+\xfd\xc9\x96\x58\x13\x9a\xc7\x0b\x9e\x05\x21\xad\x99\xf8\x31\x9d\
+\xf4\x9a\x35\x0a\xa6\x52\xed\xa6\xa4\xd0\x9c\xa3\xfc\x49\x1a\x25\
+\xfb\x9e\x46\x71\x86\x81\x32\x42\xb8\x00\xd3\x33\xaa\x2d\x2f\x81\
+\x65\xa1\xab\xc2\x97\x07\xb5\xcd\x1f\x42\xe3\x6a\xa0\x41\x97\x89\
+\x2e\xaa\x3a\xbf\x17\xac\xd8\x8b\xc6\x8f\x32\x4f\x56\x45\x84\x0b\
+\xd6\xd8\x8c\xce\x41\x60\xe4\x06\x3c\x5f\x67\xfe\xf3\xcc\x3b\x4b\
+\x68\x0e\xc2\x78\x44\x0e\xc2\xf6\x05\xad\x10\xf0\xeb\x2e\xe6\x8b\
+\xf3\xbd\xdd\xaa\xc9\xe1\xf7\x65\x42\x78\x1d\xed\x93\x70\x05\x33\
+\x19\xa5\xae\xdf\x2a\x5f\x3c\x66\x9b\x21\xa6\xd7\xc1\xde\x81\xc7\
+\x84\x4a\xff\xa1\x9e\x60\xe9\x3b\xdf\xf9\xce\xf7\x30\x91\xaa\xc1\
+\x02\x87\x50\x18\xe7\x0d\x4c\x64\x90\xb4\x36\x16\xb5\x21\x05\xb9\
+\x80\xf2\xd2\xf2\xe1\x63\x5a\x3a\x31\x66\x72\x76\xa8\x26\x37\x3f\
+\xa7\xe5\xb1\x7d\x2a\x4d\x2f\xb0\xc0\xa0\x01\x1c\x8b\x1d\x3c\x70\
+\xd9\xfc\x1b\x90\xcf\xef\xa2\x4d\x63\xf6\x27\x08\xaf\x17\x44\xc5\
+\xc5\xb1\xc9\x14\x49\x6d\x67\xc8\xeb\x0b\x71\xc1\x91\x15\x58\x85\
+\x0c\xaf\x1b\x8c\x49\xf6\x0d\x12\x96\xbb\x15\x80\xe9\x96\x19\xc9\
+\xb6\xcd\x85\xf6\x1d\x5f\x08\x0e\x18\x9b\x30\x8e\xe9\x8b\x42\xc8\
+\x57\xc0\xfc\x3d\x08\xe4\x5f\x0e\xfa\xb4\xfa\xce\x3b\x55\x67\x1d\
+\xed\x0d\x1d\xcb\xff\xf3\xab\x5f\x7d\x54\x92\x7b\x4d\x4f\x50\x2c\
+\x85\xed\x25\x63\x48\xe8\x50\x3c\x1e\xbf\x85\x92\x51\x41\xd0\x33\
+\x45\x27\x25\x4b\x77\x55\x24\x27\xcc\x62\x2b\xad\xdc\xb9\x3a\xfe\
+\xba\x4f\x09\x5c\x21\x94\x4e\x09\x75\x63\xa2\x05\x15\xcf\x03\x82\
+\xe5\x59\xe5\xa7\xd1\x98\x79\x3e\x81\x76\x22\x61\xae\xdb\x82\x04\
+\x90\x42\x33\x69\xa8\x2f\x20\xc0\xc5\x76\x8b\xb9\x04\xb3\x2e\x89\
+\x48\x85\x50\x9b\x27\xf5\xbe\x84\x15\xd4\x5a\xcf\xf8\x4d\x76\x88\
+\x40\x8a\x97\x6b\x14\xdc\xa3\x6c\xdd\x11\x0d\xb5\xdc\xac\x0e\x55\
+\xb8\x37\x8f\xd5\x2c\x04\x14\xc8\x13\x26\x11\x8c\x47\xdc\x0f\x6c\
+\xda\xa0\x24\x2f\x6f\xe7\x0a\x79\xdb\x0d\x62\xd3\xc4\xe3\xf9\x62\
+\x71\xca\x4a\xf2\x5a\x01\xd8\x93\xb3\x7b\xf7\xee\x7d\x84\xf6\xb8\
+\xd9\xdc\xe8\x04\x89\x02\x49\x04\x50\xe4\xbd\xa0\x72\x79\x28\x67\
+\xb5\x5a\x2b\x38\xca\x9d\x9e\xd7\x12\xe7\xfb\xf7\xec\x84\x11\x59\
+\x8d\x37\x1d\x17\x01\xd5\x29\x54\xa6\x68\x5e\x56\x6c\x1c\x0f\x63\
+\xce\x84\x22\x50\x1b\xad\x24\x73\x8a\x0f\x61\x5d\x32\x61\xcf\xb1\
+\x59\x9c\xc7\xc2\xb2\x2f\x5f\xd2\xfc\xcb\x0d\x30\xc6\xa7\x64\x66\
+\xb0\x53\x9e\xd8\x66\x4b\xad\x14\xc6\x5d\x7c\x8a\x90\x03\x78\x80\
+\x26\x21\x02\xa1\x76\xf3\xf7\x10\x08\x2e\xa8\xb2\xd1\x08\xb8\x32\
+\x8b\xf6\x97\x30\xff\x32\x18\x80\xdb\x9e\x25\xc3\xdc\xf0\xcf\xde\
+\xad\xba\xcf\xe9\xec\x55\x74\xbf\xff\xdd\xef\x7e\x05\x26\x4b\xe2\
+\x73\x8d\x00\x3a\x49\xd2\xfe\xfd\xfb\x1f\xc7\x0a\x5e\xd9\xbe\x7d\
+\xfb\x36\xfa\x67\x0a\x00\x84\x5d\xbb\x76\x69\x79\x0e\xf3\x86\xa9\
+\x26\xa4\x86\x30\x59\x72\x83\x53\xa7\xd4\xbd\x69\x2d\x0c\x46\xf0\
+\xd7\x12\x3d\xfe\x57\xb4\x34\x0e\x63\x2d\x03\xb3\xa6\x7f\xfe\x99\
+\xe7\x8c\x55\xab\x7b\xa3\xc7\xcb\x4d\x97\x4c\x2e\x88\xb5\xa0\x79\
+\x00\x8b\x66\x08\x02\x80\xc9\x2c\xe9\x33\x9a\xf3\xc8\x00\x27\x5e\
+\xdc\x7f\xe5\x0e\x26\xee\x97\x46\x76\x01\x8e\xfd\x54\x99\x7d\x30\
+\x69\xe6\x75\x0a\x08\x1d\xa0\x2d\x92\x3c\x65\x6b\xf2\x2f\x32\xd7\
+\x14\x82\xce\x05\x01\xbf\xa8\xf2\x7d\xdd\x8a\xdc\xb2\x5b\x29\xc0\
+\x6f\x1e\xed\x9b\x8d\x1d\x67\x4e\x9f\x7e\xe2\x99\xa7\x9e\x3a\x20\
+\x56\xff\x53\xdf\x0e\x77\xb2\x42\x5e\x8b\xf9\xb6\x6c\xd9\xf2\x16\
+\x3a\xc5\x8e\x49\x8a\x82\x50\x9d\xee\x6a\x93\x56\xb7\x8c\x00\x6c\
+\xda\xea\x90\xa2\xd6\xd0\x68\x17\x3e\x38\x21\x77\xf9\x15\xb0\xa0\
+\x2c\x8c\x11\x80\x74\xac\x69\x63\xe1\x24\x55\x52\x7a\xb5\xa7\xde\
+\x55\xae\x7a\x77\x05\x40\x72\x98\x08\xf9\xb0\x0e\x23\x00\x21\x08\
+\xfc\xff\xac\xa7\xec\xb4\x0f\x30\x75\xae\x69\x3a\xe1\x5d\x60\x90\
+\xa3\x44\xcc\x53\xa8\xa7\xfd\x72\xd4\xb6\xa1\x58\xc3\x32\xda\x9f\
+\x02\x57\x26\xb9\xe7\x22\x20\x59\x00\x24\xfb\x07\x75\xaa\x2f\xa5\
+\x1d\x0f\xfe\xa1\x6a\x91\x90\x49\x7a\x44\x92\x57\xfb\xc6\x23\x8f\
+\x3c\x38\x7e\xf6\xec\x31\x33\xe5\xcf\x7a\x3d\xee\xb2\x0d\x75\x86\
+\x77\x69\xdb\xd9\x6a\xb2\x26\x12\x8d\xb2\x80\x98\xc2\x50\x69\x6e\
+\x16\x90\xa1\x2f\x8f\xd9\xa2\x3d\x00\xad\x81\xc4\x27\x15\x0c\x9d\
+\xc5\xa5\x2b\x80\x95\x09\x18\xd4\x06\xa4\xa6\x80\x34\xcd\x89\xa6\
+\xba\x60\xbe\x67\x65\x83\x66\x87\x0f\x40\x0d\x60\xbe\x41\x9b\x5b\
+\xd8\xac\xa6\x2d\x80\xfa\x82\x47\xb2\xe3\x53\x69\xde\x0a\xa5\xa3\
+\xfd\x4e\x25\x6b\x29\xc1\x5c\xb1\x3e\xb5\xdc\xad\xc1\x89\x3c\x37\
+\xce\x50\xfa\xe2\xd1\xc1\x69\x7c\x3f\x6b\x36\x47\xf4\xea\x04\x09\
+\xd2\xba\x7f\xf7\x51\x45\x79\xf9\xba\x48\x64\x9a\x9b\x9b\x63\x2f\
+\xd3\xfe\xaf\xfd\xcd\xc3\x0f\x3f\x64\xf2\xb9\x9f\x77\x83\x44\x89\
+\x0d\x88\xb3\xec\xb8\x7a\x07\x1b\x0c\xc2\x30\x6f\x22\x01\x42\x88\
+\xab\x44\xf9\xe9\x00\x88\x04\x5d\x5b\x76\xc6\xd3\x15\x16\xd6\x80\
+\x29\x07\x40\x74\x38\x86\xf1\x98\xc7\xf9\xa6\x52\x7d\x9e\xd2\xc3\
+\x4d\xa5\xb7\xf8\x31\x5f\x7c\x33\x12\x82\xa2\x58\x40\xbc\x85\xe0\
+\x4d\x59\x60\x13\x0c\xb9\xcb\x9e\x0a\x0b\x3e\xac\x47\xd7\x7e\x9a\
+\xcc\xdb\x83\x10\x98\xd3\x66\x83\x26\xdd\x5d\xa0\xc4\x9d\x26\xde\
+\xcf\x60\x55\xb9\x30\x80\x99\xd1\x59\xf2\xfd\xf0\xbb\xde\xae\x91\
+\xb7\xbd\x55\xd9\x72\xc9\x68\xde\x00\xdf\xe4\x9f\xfd\xf1\x1f\x7f\
+\x14\x0c\xb8\xe4\x32\xd3\xcf\x2b\x80\x06\x7e\x33\x07\x72\x3a\xec\
+\xc8\xbc\xdd\xb8\x42\x10\x21\x18\x30\x0b\x43\x65\xfa\x73\xbe\x4a\
+\x99\xa2\xa4\xa6\x44\x0f\x9d\xa3\x5e\x13\x8d\xa0\xa0\x6c\x46\x16\
+\xee\xf6\x51\x2c\xf9\x14\x1d\xf6\xa3\x75\x3f\x11\xc1\x68\x3e\x0c\
+\xf3\x09\xf0\x20\x45\x0c\xa7\x34\x05\xc5\x65\x30\xc0\xad\xdb\xf6\
+\x99\x93\x6d\x08\x78\xa4\xd1\x69\x31\xe4\xca\x8f\x2d\x61\xa3\xcc\
+\x99\x49\xca\xbe\x2d\xf2\x2d\xa2\xf1\x59\xfc\x7d\x0e\xca\x86\xb9\
+\x9e\xd6\x85\x44\x46\xb9\x9b\x76\x6b\xcb\x07\xff\x40\x45\x22\xce\
+\x2c\x9a\x27\xb3\x73\xbf\xfd\xcd\xbf\x7d\x60\xec\xd0\xa1\xa7\x8b\
+\x92\xfb\x8b\x6e\x92\x32\xfb\xf4\xcf\xd0\x2e\x5f\xcb\x0b\xc5\x8d\
+\xc6\x15\x82\x26\xb4\x25\x13\xb6\xf8\xa9\xd0\xc5\x4d\xc6\x4b\x8a\
+\x67\xaa\x14\x44\x4d\x2b\x00\x27\xe0\x20\x04\x53\x81\xf9\x18\x61\
+\x3a\x1c\xe0\xd8\x6a\x1d\x4a\xf2\x3d\x0d\xf3\x90\x2f\x81\x2a\x5a\
+\x4d\x10\xe2\x9a\xb5\x82\x00\x56\x13\x2c\x21\x04\x62\x77\x35\x27\
+\xce\x31\x9f\x98\xcb\x41\xd3\xe0\x45\x17\x00\x98\x89\xa0\xf1\x3a\
+\xf9\xfd\x42\x58\x21\x28\x98\x37\xf9\x46\x5a\xe7\x48\x17\x67\xe8\
+\x18\xed\x78\xe0\xe3\xaa\x04\xfc\x2d\xe6\xd9\xd4\xf1\xdc\xd3\xcf\
+\xfc\xf9\xb7\xbe\xf6\x57\x7f\xce\x74\xc5\x7f\xcc\x2e\xb1\x26\x54\
+\x38\x76\xec\xd8\x89\x15\x2b\x56\xec\x21\x22\x0c\x21\x04\x6b\x05\
+\x81\x54\xca\x36\x29\x6b\xe5\x9c\x52\xdd\xe6\x5d\x5e\xcd\x34\x25\
+\x21\x41\x7e\xcc\xd1\x6f\xb2\x33\x98\x07\x94\xc2\x31\x4c\x3e\xc1\
+\xf7\x14\xe7\x93\x5c\x8f\x73\x53\xa8\x95\x83\xd9\x1e\xa3\x6b\xdd\
+\xc9\x71\xc0\x93\x18\x7e\x5e\x47\x10\x29\x1f\x58\x40\x37\x0a\x0a\
+\xd3\x0c\x49\x67\x82\x1a\xec\x0e\x28\x19\x20\x45\x07\xe8\x42\xf8\
+\x7b\xa0\x4c\xc7\x38\xd8\xa3\x13\xfe\x08\x9a\xbf\x49\x3b\x3e\xfe\
+\x31\x55\x10\xfa\x0c\xcc\xa3\x38\xb3\x9f\xe9\xd1\xbf\xfc\x93\x2f\
+\x7c\xb2\x5b\x9a\x5b\xfe\x25\xf6\x09\x7a\x68\x69\xe1\xf8\xf1\xe3\
+\x63\xbc\x36\xbf\x0d\x3c\xe8\x09\x1b\x50\x8c\xc7\xa1\x24\x05\xd3\
+\xb0\xf2\x4b\xa0\x30\xd5\xa1\xdf\xd6\xf6\x08\x41\x62\x0c\x30\xfa\
+\xa1\x90\x80\x3e\x04\x84\x20\xcc\xc8\x79\x35\xfc\x26\x77\x87\xcc\
+\x66\xa7\x06\x63\x83\xb1\x2e\x51\x00\xc1\x36\xd6\xe4\x28\xe9\x49\
+\x5d\x34\x63\xbb\x32\x01\xf5\x76\xc3\x3c\x05\x4f\x97\x2f\xac\x70\
+\x93\x88\x54\x04\x43\xdc\x84\xaa\x80\xcd\x8b\x3c\x1f\x7d\xd7\xbb\
+\xb4\xf9\x5f\xfd\x4b\x15\xb1\x94\xe9\x99\x19\xcb\xfc\xcb\x87\x0f\
+\xbf\xf0\x97\x9f\xff\xc2\xbf\x49\x36\xea\x13\xe7\xe0\xe1\x97\xdd\
+\x29\x4a\x16\xeb\xce\x8c\x8f\x8f\x1f\x23\x2a\x98\x04\xa9\x27\x1c\
+\x89\xd8\x4c\xaf\x19\x89\x53\xa7\xaf\x22\xcb\x4a\xab\x9c\xaf\x90\
+\x81\xd5\x2d\x53\x0c\xb6\x2a\x73\xaa\x50\x05\x43\x2e\x0b\xe0\x84\
+\xd9\xa2\x2b\x15\xb0\x96\x62\x95\xe3\x0a\x54\x6b\x51\xc1\x05\xd8\
+\x1a\x8c\xb8\x50\x09\xcc\x00\xe9\xa2\x50\x02\x9c\x48\xf9\xe8\x4d\
+\x40\xa1\x26\xd6\x57\x8f\x23\xdb\x8c\x26\x7c\x51\x1d\x66\x0d\x9b\
+\x1f\x7c\x50\x43\x77\xdd\xa1\x2c\x51\x69\x6a\x7a\xda\x00\x1e\xbb\
+\x59\x0e\xbf\xf8\xb5\xbf\xf8\xef\xf7\x47\xf2\xd9\xf1\xb3\xac\xfd\
+\x57\xb9\x59\x3a\x82\x05\xdc\xc4\xcf\x61\xfe\x94\x24\x69\x17\xdb\
+\x68\x44\xe5\x68\x37\x48\x85\xca\x00\x62\x7e\x5e\xc5\xf1\x17\x15\
+\x29\x8f\x29\x1d\x98\x57\xa8\x51\x6d\xed\x0a\x35\x8d\x55\xfe\xf9\
+\x9a\x10\xff\x1c\x4b\x9d\xfd\x4e\xed\x37\xc4\xed\x1e\x23\x9e\xd4\
+\x29\x67\xa1\x20\xc2\x0c\xa2\x6d\x46\x2f\x2c\x4c\x4e\x34\xc1\x34\
+\x56\xa6\x17\x71\xd7\x5d\xda\xf8\x9e\x7b\xd5\xc0\x12\x17\xb3\xcb\
+\x76\x57\x3a\x95\xac\x8e\x1c\x3c\xf4\xf8\x5f\x3f\xf4\x95\x8f\x77\
+\x57\x4a\xa7\x8f\x4b\xee\x6b\xb1\x5d\x3e\x44\xc7\x68\x2b\x7b\x08\
+\x3f\xc5\x6f\x05\x7e\x97\x5c\xc1\x61\x03\x92\x22\x21\x80\x09\x33\
+\x8e\x19\x7f\xa6\xa7\x57\x3e\x7d\x08\x3f\x3d\xa5\x1e\x65\x11\x48\
+\x49\x81\x6a\xc3\xee\x23\xf0\xd7\x01\x4b\x5b\x11\x43\xcd\x76\xba\
+\x6b\x81\xc3\x69\x63\x82\x9f\xf3\x86\x60\xda\xe4\xfa\x68\xde\xa3\
+\x08\xba\x58\x71\x75\xae\xe1\xd1\x97\xdc\xa3\x4d\xec\x47\x0e\xb2\
+\x1b\x2d\x47\x42\xb6\x40\x92\xc3\xfe\x3f\xa3\xf9\xc6\x81\x7d\xfb\
+\xfe\xc7\xf7\xfe\xfa\x6f\xfe\xeb\x48\xd3\xbb\x78\x04\x91\xbe\x96\
+\x3f\x98\x08\x40\xc3\x3b\x77\xee\xfc\x83\x37\xbd\xe9\x4d\x0f\x12\
+\x26\x53\xec\x20\x17\x20\xa9\xb0\xc9\xfd\x59\x68\xdc\x41\x61\xc5\
+\x9c\x0a\xaf\x9e\x94\x26\xc7\x15\x9a\xbf\xa4\x1e\x9a\x1b\x09\xf2\
+\xf6\x40\x89\xd4\xb5\x4a\xee\x6e\x84\xc0\x3f\xf1\x8c\x7c\x50\x20\
+\x88\x79\x87\x60\x38\xa2\x1a\xe3\x54\xa9\xaa\x59\xee\xa9\x62\x69\
+\x03\x6f\x78\x83\x46\xd8\x7d\xee\x74\xa5\xf1\xa0\xaa\x96\xb2\x59\
+\x9b\xe1\x4d\x63\xf6\x67\xcf\x9c\x99\x7b\xe6\xc9\x1f\xfc\xa7\xa3\
+\xcf\x3d\xff\xcd\x95\xd4\x73\x07\x25\xef\xf5\xf8\xc9\x8c\x03\xa5\
+\xf9\xdc\x7a\xc7\x1d\x77\x7c\x82\xd7\xcd\x6f\xc6\x25\x7c\x84\x4b\
+\xc5\x63\x31\xbb\x83\x3b\x2c\x29\xee\x0f\x28\xe6\x43\xb3\xe4\xe3\
+\x45\x4c\xb4\x3a\x35\xa9\xe6\xec\x8c\x7c\x30\xa0\x82\x79\x77\x50\
+\xb7\x55\x5e\xc3\x54\x85\xe1\x88\x5c\x00\xd6\x4b\x53\xe3\x0f\xf4\
+\xab\x7f\xcb\x56\xf5\x6e\xdd\x22\x1f\x6e\x46\xd9\xa0\x3c\x6e\x96\
+\xe3\x99\x2c\xcf\xd2\xd4\x10\xd9\xaa\xcb\xa6\xcd\xbf\xfb\xc1\xf7\
+\x1f\xfd\x6f\xde\xe2\xe2\xd1\xf5\xf2\x2a\x3f\x92\x9a\xaf\xf7\x8f\
+\xa6\x82\xd0\x8a\x0d\x1b\x36\xdc\x73\xe3\x8d\x37\xde\xbf\x7e\xfd\
+\xfa\x1b\x00\x4a\xb3\xc9\xda\x6e\x47\x09\xe3\x1a\x21\x63\x15\x50\
+\x14\x0d\x47\x8c\x60\x10\x4a\xc0\x74\x6b\x3b\x11\x83\x63\x87\xeb\
+\xe2\x9a\x82\x41\x46\xbf\x5c\x47\xb6\x86\x2f\x03\x6e\x14\x26\x2a\
+\x96\x4a\xc8\xab\xd0\xc9\xeb\xbd\xd3\xe3\xe3\x2f\x1c\xdc\xf7\xe2\
+\x97\xce\x1d\x1d\x7b\x22\xd3\x6c\x2c\x8d\x4b\x8d\x5f\xe7\xcf\xe6\
+\x1c\x28\x02\x0d\xaf\x5b\xbb\xf6\x2d\x3b\x76\xee\xfc\x17\xb8\xc5\
+\x6e\x04\x11\xc2\x42\xac\x20\x00\x4f\x11\x3d\x14\x0c\xc0\x3c\xcc\
+\xf2\xfb\x20\x2c\x3f\x00\x01\x78\x68\x9f\xff\xd9\xa4\xa8\xe1\x79\
+\x96\xea\x00\x62\x0d\xe6\xcb\x30\x6f\x18\xe7\x17\xa5\x26\xa7\x2f\
+\x4f\x9c\x3f\xff\xdc\xe1\xfd\x07\xbe\x7a\xe1\xd4\xf8\xd3\x51\xcf\
+\x9d\x0f\x49\xb5\x73\xbf\x41\x3f\x9c\x74\xa0\x30\xec\xf4\x26\x62\
+\xb1\x2d\xdb\x77\xee\x7c\xc7\xc8\xe8\xe8\xef\x80\x0f\x1b\x32\xec\
+\xd4\x64\x07\xea\xdf\x0b\x02\x4d\x07\x10\x46\xe7\x5d\x9d\xda\xbb\
+\x37\x08\xb7\xb6\x75\x45\x35\x6a\x4b\xd8\xa5\xc5\xc5\xc2\xfc\xdc\
+\xdc\x31\x36\x6b\x3e\x79\xe4\xc5\x17\xff\x4f\xad\x54\x79\x35\xe8\
+\xd5\x97\x03\xa6\x60\x93\x9a\xbf\xa9\x3f\x9d\x75\xd4\x2a\x0d\xa2\
+\xb0\xd7\x8d\x81\x0f\xaf\xdd\xb0\xfe\xc6\x15\xc3\xc3\xd7\x03\x94\
+\xab\x12\xc9\xd4\xca\x70\x24\x9c\xa6\xf1\x8a\x57\x04\xc3\xdc\x6c\
+\x18\xaf\xd0\xb2\x2a\xc1\xfc\x32\x6d\xab\x0b\xec\x4e\x3f\x37\x39\
+\x31\x71\xf8\xec\xa9\xf1\x83\x5c\x9f\xa6\xfa\xcb\x8a\x3e\xd1\xb2\
+\xe4\xfd\x36\xfe\x78\x9a\xba\x0f\xb7\x97\xc8\xf2\x15\x91\x15\x8c\
+\xc3\xe8\x84\x9a\x9c\xc7\xfc\x3d\x47\xb8\x3d\x90\xc8\xf5\x32\x9b\
+\x54\xcb\xa0\x80\xcd\x08\x0c\xd7\xaf\xf5\x8f\xa8\x9d\xdf\xb0\x5f\
+\xad\x37\xf5\x3a\x7f\xfe\x1f\x5f\xbc\xdd\xe6\x1a\x53\x0c\xc2\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x13\x09\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\
+\x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd7\x09\x17\x17\x15\x19\x49\x86\x70\x41\x00\x00\x12\x96\x49\x44\
+\x41\x54\x78\xda\xed\x5b\x09\x74\x5c\xd5\x79\xfe\xee\x7b\xb3\x6b\
+\xb4\x5a\xb2\x25\xd9\x96\x64\x63\x6c\x83\x31\x36\xb6\x81\x00\xe1\
+\xb0\x34\x14\xc2\xda\x94\x86\x04\xd2\x90\x42\x72\x20\x5d\x20\x14\
+\x68\x08\x4b\x48\x09\x87\xda\xad\x73\x52\x52\x02\x24\xad\x7b\x20\
+\xe4\xb0\x95\xcd\x40\xb0\x1b\x56\x2f\x80\xb1\x2d\xdb\xd8\xb2\x6c\
+\x6c\xd9\xb2\x2c\xc9\x1a\x4b\x1a\x69\xf6\xe5\x6d\xf7\xf6\x7f\x33\
+\xef\xf0\xf4\x3a\x9a\x19\x1b\x26\x3d\xc9\x69\x7e\x9d\x4f\xf7\xbd\
+\xfb\xee\x9b\x79\xdf\x77\xff\xe5\xbe\x2b\x1b\x7f\xb4\x3f\xda\xff\
+\x6f\x63\x38\x0e\x1b\xbb\x05\x75\x52\xed\xf4\x8b\x5d\x33\x97\x5c\
+\x06\xb7\xef\x3c\xa1\xa4\x3c\xd0\xb3\xc3\x42\xcd\x0c\x71\x35\x15\
+\x12\x4a\x22\xc4\x53\xe3\x21\x91\x8d\x85\x84\xc0\x10\x80\x10\xe1\
+\xe8\xd4\x9f\x43\xf9\x83\x16\x40\xfc\xd8\x7f\x95\x68\x5d\x76\x37\
+\xe7\x58\xc6\xd3\x51\x99\x08\x42\x70\x01\xe1\x0e\x12\xaa\xc0\x65\
+\x3f\x84\xec\x81\x60\x6e\x82\x0b\x90\x5c\x10\x82\x03\xdc\x00\xd7\
+\xd2\x02\xba\x32\x2e\x0c\x6d\x48\xe8\x6a\x48\x68\x4a\x48\xe8\xd9\
+\x10\x57\xd3\x24\x54\x7c\x48\x68\xd9\x90\x30\x85\x12\x08\x4d\x7f\
+\x0c\x99\xdf\x3b\x01\xc4\x03\x9e\x3f\xc7\xf9\xf7\xbf\x88\xe6\x45\
+\xcc\x24\x04\xae\x03\x26\x39\x43\x05\x32\x11\x80\xc4\x80\x9a\xcc\
+\x43\xcf\x40\x68\x19\xf0\x6c\x82\x90\x02\x57\x92\xe0\xa6\x50\xb2\
+\x0f\x5c\x48\x04\x53\x13\x4e\xd0\xc1\x75\x2d\x27\x14\x40\xd7\x0d\
+\x03\x24\x0a\x41\x8d\x0a\xae\x87\x08\x43\xc2\xa0\x36\x07\x95\x04\
+\x33\xa1\x0c\x09\x6e\x84\x00\x84\x3a\x1e\x47\xf2\xff\x4e\x80\xa7\
+\x2e\xee\xc4\x99\xb7\x2c\x85\xb0\xc8\x73\x23\x07\xc7\xb9\x28\xd6\
+\xa7\xe7\xa1\x98\xe2\x64\xed\x3e\xd3\x84\x00\x57\x33\xa4\xa3\x42\
+\xc8\x82\x73\x0e\x03\x6e\x70\x12\xd6\x50\x32\x39\x01\x0d\x12\x52\
+\xcf\xc4\x01\xba\x26\xcc\x1f\x6e\x80\x3c\x89\xa0\x27\x68\x60\x4e\
+\x90\x1c\x04\x0f\x01\x3c\xc4\x64\x98\xd8\xd9\x71\x29\xba\xd9\xc5\
+\x10\x95\x11\xe0\x85\x6b\x53\x58\x78\x6d\x20\x3f\xf3\x46\x09\x01\
+\x9c\x62\x38\xc6\x8b\xdc\x35\x1b\xa2\xc8\x58\xf2\x1e\x40\x00\x14\
+\x4e\x90\xdc\x80\xcb\x47\xf0\xe7\x3c\x46\xd7\x75\x18\x9a\x96\xf3\
+\x20\x9d\x33\x12\x27\x09\x3d\x35\x06\x75\xa4\x07\x7a\xa2\x0f\xae\
+\x00\x03\xf3\xe4\x6f\x37\x14\xf1\x3a\x35\xdf\xe8\x58\x81\x04\xca\
+\x98\x0b\x65\x8d\xb9\x72\x0f\x97\x8b\x69\x82\x63\xc6\xb9\x89\x82\
+\x63\xc7\x78\x61\x58\x2d\xb7\xfa\x8b\x8c\x35\x21\xc9\xf9\x3e\xcd\
+\xf4\x96\xd4\xa7\xe2\x48\x34\xc6\x63\x0b\x95\x0f\x3f\xd9\x0b\xd4\
+\xd7\x00\xb3\x2e\x85\xde\x34\x97\x9c\xec\x03\xe8\x43\xab\xc1\xb3\
+\x06\xd4\x38\xae\xc8\x8c\x88\x55\xa2\x1b\x5f\x63\x0b\x50\xd2\x24\
+\x94\x35\x0e\x88\x89\x04\x78\x01\x81\xa2\xd7\x45\x31\x91\x8a\x7c\
+\xd6\xb1\x7e\xb6\x69\x5a\x1a\x48\x1c\x01\x0e\xbf\x0f\xd7\xbe\x35\
+\xa8\x5a\xba\x02\x9e\xe9\xcb\x00\x96\x1f\x0a\xce\xbe\xda\xf3\x38\
+\x4e\x00\x3e\xaf\x00\x42\x4c\x70\xdd\x22\x33\x69\x79\x44\xd9\x87\
+\xe7\xe5\xbd\x80\x50\xfe\xb3\xed\x6b\x79\x11\x0e\xbc\x09\xac\xbd\
+\x13\x7a\x66\x16\x52\x43\x02\xe9\x61\x01\x35\x29\x98\xa1\x62\x49\
+\x25\x04\x28\x7c\x38\xce\x8b\xcc\x6c\x31\x61\x8e\x91\x38\x2f\x15\
+\x5a\x93\x08\x13\x27\xf2\xe9\x31\xe4\xec\x93\xd5\x30\x12\x5e\xa4\
+\x8f\x9a\xe4\xf3\xb7\x42\xc0\x5f\x81\x1c\x20\x0a\xc9\xd8\x84\x4a\
+\x92\x71\x1e\x97\x0a\x25\x5e\x46\x9c\x42\xf1\x6c\xf2\xf6\x44\x31\
+\xdd\x2c\xaf\xd6\x23\xc3\xb2\xcf\x2d\x40\xa1\xdb\x15\x78\x41\xb1\
+\xd8\x75\x1e\x17\x0f\x95\xc2\x44\x59\xc6\xc3\xe2\x83\x44\x3e\x8c\
+\x02\xe3\x1a\x84\xc5\xbc\x72\x02\x40\x14\xcd\xe8\x36\x81\xe3\x4d\
+\x88\x45\xae\x17\x92\x2d\x1c\x1f\x1b\x70\x90\x77\x98\xa1\x43\xa0\
+\xd2\x02\x08\x41\x30\x8e\x3d\xa3\x17\x86\x4a\xf9\x24\xc8\x8f\x31\
+\x29\xc6\x4b\x90\x27\x13\xa6\x07\x4c\x9c\xb7\x0a\x09\xe0\x24\x5b\
+\xbe\xd4\x95\x5f\x03\x94\xff\xac\x42\x0f\x8b\xf5\x03\xa9\x51\x94\
+\x34\x43\xb7\x89\x57\x38\x04\x2c\x18\x05\x0f\x57\x9e\x4c\x91\x6b\
+\x28\xa8\x26\xc5\x45\x8d\x1d\x2e\x4f\x1e\xc8\x2f\x93\xe1\x14\xa0\
+\x12\x65\xd0\x41\xb6\x10\x45\x32\x36\x6c\xa2\xb9\x7e\x10\x98\x75\
+\x0e\x6e\x9d\x13\x60\xf7\x4d\x9a\x10\xcb\xcf\xbc\x33\x09\x02\x36\
+\x44\x25\x04\x40\xc9\x44\x35\xb9\x10\xb0\x88\xb1\x63\x24\x6e\xc2\
+\x3e\xb6\xbf\x27\x6a\xce\xfc\x08\x8e\xd5\x04\xd7\x2d\xe2\x16\x2a\
+\xe4\x01\x65\x56\x7a\x0e\x22\xc5\x88\x95\x12\xc3\xea\x73\x0a\x87\
+\x58\x5f\x01\xf9\xb2\x66\x38\xca\x60\x25\x05\x28\x1f\xdb\x4e\x21\
+\x9c\x64\x0a\x3d\xc2\x26\x6e\x0b\x64\x58\xe0\x40\x9c\xc8\x67\x88\
+\xbc\x54\xe4\x7d\xb5\x74\x15\x70\xa0\xd2\x2b\xc1\x82\x38\xb7\x60\
+\x93\x13\xff\xdb\x0b\x2c\x62\xc2\xe1\xe6\x36\x59\x82\xe3\x38\x7e\
+\x88\xc8\x0f\x03\xb2\x35\x54\x58\xe0\x28\x67\xf6\x3a\xc0\xf6\x82\
+\x0a\xaf\x04\x3d\x55\x40\xfd\x09\xf9\xa7\xd1\xd3\x40\x26\x0c\x24\
+\x8f\x02\x5a\xd2\x99\xe8\xec\x58\x2e\x14\x88\x39\x12\xa3\x53\xa8\
+\x78\x6f\x9e\xbc\x64\x3d\x3d\xb3\x45\xb0\xfd\xba\x74\x15\xb0\xcb\
+\x60\xe5\xd6\x01\xb6\x08\xfe\x29\xc0\xdc\x4b\xe1\x34\x91\x17\x61\
+\x6c\x2f\x10\xfa\x28\xe7\xbe\x85\xee\x4f\x10\x13\xfa\x84\xc3\xe5\
+\xf3\x6d\xe2\x90\x93\xbc\x4d\xd6\xd9\xf2\x12\xcc\xac\x24\x58\xe9\
+\x75\x80\x23\xbb\x17\x1a\x03\x82\x2d\x79\xb4\x5f\x98\x17\xe0\xe0\
+\x6b\xc0\x48\xa7\x33\x1c\x18\x01\x36\x79\xb3\xb5\xc9\x9b\x33\x7f\
+\xd4\x72\xfb\x32\x02\xc0\x1e\x53\x72\x1d\x20\x08\x15\x4d\x82\xb0\
+\x50\xce\x6a\x3a\x80\xd3\x6e\x05\xce\xb8\x17\xa8\x9e\x3e\x21\xce\
+\xed\x7c\x60\x9f\x5b\xe4\xb3\x16\x79\x09\xd4\x5a\x90\xca\x80\xa1\
+\xf8\xcb\x90\xa8\x64\x15\xc0\x24\x19\xdf\x50\xca\xaf\x32\xea\xe7\
+\x01\xe7\x2c\x07\x3a\x2e\x73\x84\x84\x0d\x93\xfc\x41\x22\x1f\xb2\
+\x49\x95\x03\x2b\x2d\x82\x30\xf4\xca\x57\x01\x22\x6a\x27\xaa\x48\
+\x0f\xb0\xee\x6e\x40\xe8\xf9\x73\x6f\x35\x10\x6c\x26\xb2\x27\x02\
+\xd3\x96\xd1\x79\x7d\xc1\x76\x22\x4e\xba\x01\xa8\x9b\x03\xec\x5c\
+\x09\x18\x9a\x95\x00\x09\x89\x03\x80\x62\x91\x17\x93\x00\x8e\x44\
+\x68\x1b\xb7\xa7\xad\x20\x1c\xb8\xe6\x8c\x16\x51\xe9\x32\x88\x89\
+\xe5\x4f\x07\xb2\x61\xc2\x30\x30\xba\x1d\xe8\x79\x16\x68\x5c\x04\
+\xcc\xfe\x33\xa0\xba\x1d\x0e\x6b\x39\x17\xf0\x90\x58\x9d\x14\x16\
+\x9a\x0a\x24\x7b\xec\x99\x17\x25\x92\x9c\x70\x10\x76\x92\x66\x13\
+\x20\x9c\x1e\x90\xfb\x55\xb1\x10\x60\x02\xce\x9a\x3f\x59\x19\xb3\
+\xb6\xba\x47\xb6\x00\x9b\x7f\x00\x7c\xb2\x8a\xba\xb2\x70\xd8\x94\
+\xc5\xc0\x92\xfb\x81\x74\x9f\x49\xbe\x78\xcc\xdb\xfd\xc7\x17\x1a\
+\xa6\xd9\x65\x90\x50\xa9\x24\x08\x51\x58\xd7\x6d\xf2\x85\xab\x3e\
+\x53\x88\x81\x35\x24\xc4\x1d\x40\x6a\x10\x0e\x6b\x3a\x13\x38\xf5\
+\xfb\x05\x64\xcb\x82\x4d\x1a\xff\xce\x7e\xf6\x3b\x5d\x09\x5a\x04\
+\xfd\x8d\x40\xfb\x05\x80\xbb\x2a\x17\x6f\x48\x0f\x01\xf1\x83\xc0\
+\x78\x17\x60\xa8\x13\x44\xa0\x36\x75\x18\xd8\x4a\x22\x2c\x79\x10\
+\xa8\x99\x8b\x4f\x6d\xfe\xdf\x00\xa3\x1f\x00\x87\x9e\x01\x50\x26\
+\xfe\x51\xc2\xf5\x25\x47\x9e\xc8\x83\xeb\xf6\xed\xa2\x32\xeb\x00\
+\xe7\xcc\xfb\xea\x80\xd6\xb3\x60\xdb\x52\x02\xf2\x2b\xc1\xa1\x77\
+\x80\xbe\xd5\x74\x1c\xb1\x17\x3b\x5a\x14\xd8\x7e\x17\x89\xf0\xcf\
+\x4e\x11\xce\x7c\x04\x18\x79\xd7\xac\xfd\xc5\xe3\x9f\x17\xf5\x4f\
+\x27\x69\xc9\x3e\x17\x10\x16\xf1\x8a\x87\x80\xed\xee\x93\x9a\x3b\
+\x08\xb4\x5f\x05\x9c\xf5\x53\xa0\x71\xa9\xf3\xe5\x66\x7c\x2b\xb0\
+\xfe\x72\x40\x8b\xd9\xe3\x3d\x0d\xa4\xdd\x4f\xca\xd7\x7c\x66\xb7\
+\x36\x8a\x84\x06\x9b\xc4\xa1\x2a\x23\x80\x73\x25\x58\xd2\x3c\xf5\
+\xc0\xe2\xfb\x80\xb6\x2b\xf2\x5e\x90\xd8\x07\x28\x47\x80\x54\x0f\
+\xb0\xfd\x56\x38\xac\xfd\x5a\xa0\xe1\xb4\xcf\x50\xfb\x4b\xc2\xb1\
+\x12\x14\xa2\x62\x02\x70\x0b\x02\x50\x62\x40\x78\x17\x30\xb2\x0d\
+\x48\x0e\x4e\xf2\x2d\x0c\x98\xfb\x5d\xa0\xf1\x4c\x20\x3b\x68\x3f\
+\x78\xff\x53\x74\xcf\x3b\x13\x86\x51\xe7\x29\xf7\x1d\x67\x22\x2c\
+\x71\xcc\x9c\xc4\x05\x2a\x97\x03\xec\xfa\x3f\xbe\x17\xd8\x70\x1b\
+\x00\xdd\x0a\x09\xeb\x05\xa9\xe3\x4a\x60\xc6\xc5\xce\xa5\xd9\xc2\
+\x1f\x11\xe1\xdf\x02\x91\x4e\xfb\x41\x77\xdf\x05\x5c\xb8\xd5\x1e\
+\xd7\x4a\x61\x13\x6c\x03\x92\xfd\xce\xd8\x67\x36\x0a\x63\xbd\x04\
+\x80\xcf\xb6\x27\xf8\xe0\x7d\x37\x2d\xdc\xf2\xf6\x4f\xa5\xd2\x55\
+\x80\xc0\x55\xe7\x92\x18\x84\x4c\x08\xd8\xfb\x18\xb0\xfd\x87\x80\
+\x91\x99\xf0\xc9\x6e\xe0\x0b\xbf\x06\x5c\x2e\x7b\x16\xe3\xdb\x80\
+\xd1\x89\x5e\x20\x03\xed\xdf\x2c\x3b\xf3\x4e\x14\xef\x17\xec\x33\
+\xe6\x80\xb7\x37\xf7\xae\x7e\x6b\xc3\xbe\x5f\x90\x08\xac\x68\x0e\
+\x28\xdc\xf3\x73\x2e\x90\xc6\x3a\x81\x0f\x6f\xb4\xfa\x2c\xab\x9e\
+\x0f\xb4\x5d\xe7\x8c\xe3\xfe\x5f\xc2\x61\xd3\xaf\x2e\x41\xba\x4c\
+\xdc\xa3\xe0\xdc\x0e\x83\xe3\xc9\x01\xe3\x8a\x9e\xed\xdc\x35\x38\
+\x7f\xc7\xee\xc1\x7f\x25\x11\x4a\x6f\x89\x81\x3b\x84\xb0\x77\x6f\
+\xf7\x00\x87\x9f\x03\xf6\xac\x84\xc3\xe6\xdd\xe5\x24\x37\xba\x06\
+\x30\xd2\xf6\xf5\xda\xc5\x80\x7f\x6a\x01\xe9\xe3\x24\x6e\x0b\x20\
+\x3e\x83\x07\x24\x33\x19\x43\x81\xfb\xce\xd7\xdf\xec\xba\xe6\x50\
+\xff\xd8\x43\xc5\xdf\x06\x09\x81\x16\xe0\x8c\x1f\x03\x17\x3d\x4f\
+\xed\x0a\x20\x38\x33\x4f\x3e\x3d\x80\x9c\xed\xa5\x9a\xaf\xc5\x27\
+\x78\xc1\xc9\x40\xcd\x7c\x9b\x94\x20\xf2\xd1\x0f\x9d\x49\x73\xca\
+\xd9\x85\xa4\x51\x36\xde\x0b\xc9\x33\x27\x71\x21\xb9\xe5\x63\x12\
+\x20\x95\xc9\x1a\x29\xdd\xc8\x8e\x45\x92\xb7\x3c\xbb\x7a\xeb\x3d\
+\x6b\x5f\x78\xf0\x9e\xc2\x3f\x8d\xf1\x7c\xe6\x5e\x72\x27\x50\x6f\
+\x12\x72\x01\x75\xd4\x9e\xbe\xc2\x76\x7b\x86\xfc\xe2\xe7\xc8\xab\
+\x70\xd8\xd4\x8b\x9d\x33\x1b\xdb\x0c\x87\xd5\x2e\x3a\x0e\xa2\x65\
+\x44\x80\x05\xfa\xb5\xcb\x77\xfa\x2f\x96\x3f\x70\xeb\xeb\x8f\x3d\
+\xfc\xc3\xef\xfc\xec\x27\xf7\x4e\x2f\x5a\x05\x32\x8a\xa2\x27\xd2\
+\x19\xff\xf6\x4d\x9b\x5e\x5a\xba\x74\xe9\x6b\xcf\xbc\xbc\xf9\xa1\
+\x0f\xff\x7b\xe5\xc8\xd9\x97\xfc\xc3\x2a\x47\x12\xac\x99\x0d\x54\
+\xb5\xc0\x61\xee\x1a\xe0\xe4\xef\x01\xdb\xbf\x6f\xf7\x8d\x6e\x00\
+\x3a\xbe\x39\xc1\x0b\x4e\x71\xba\x77\x66\x1f\x1c\x56\x75\xc2\xf1\
+\x91\x47\x89\xbe\x09\x25\x70\xe3\xa6\x2e\xcf\x86\xa1\xfd\x97\x37\
+\xd4\xd7\x5e\x3e\x73\x66\x8b\xf8\xea\xd5\x57\xec\x9a\x36\x6d\xda\
+\x7b\x55\x55\x35\xeb\x33\x59\xf5\x83\x7f\x7b\xe4\xe7\xa3\x39\x01\
+\x14\x4d\xe3\x14\x06\x7e\x90\x71\xce\xff\x76\x67\x77\xff\xb9\x2f\
+\xbd\xb1\xed\x71\xca\x07\xc3\x38\xfc\xa4\x2d\x80\x96\x29\xb2\xf9\
+\x71\x0a\x1c\x96\x19\x80\xc3\x7c\xcd\xce\x87\x56\x87\xe0\x30\x6f\
+\x4b\x59\x82\xe5\xc9\x3b\x63\x9f\x83\x61\x6a\x9d\xf7\xad\xda\x54\
+\xed\x02\x26\xb9\x5a\x87\x47\xa2\x6c\x6c\x3c\xb9\xa8\xb7\x6f\x68\
+\x91\x2c\xcb\xb7\xa9\xaa\xca\xe7\xcc\x99\x73\x7b\x4e\x00\x5d\xd7\
+\x59\x3a\x9b\x0d\x80\x6c\xc7\x8e\x1d\x83\x0b\x16\x2c\xf8\xbb\x35\
+\x6f\xef\x7c\xba\x65\x5a\xed\x73\x27\x9d\x30\x53\x0e\x72\xc3\xda\
+\xc1\xe9\x07\xd2\x47\x81\x40\x33\x1c\x96\x3c\x0c\xe7\x02\x5c\x86\
+\xc3\x5c\xb5\xce\x35\xbf\x91\x82\xc3\xe4\x2a\x1c\x97\xb1\xc9\xfb\
+\x46\xb2\x3e\xbc\x1f\xa9\xc3\xc1\x4c\x2d\x0e\x67\x6b\x30\x1e\x4b\
+\x5f\xa4\xeb\x49\xc4\x62\x31\x28\xe4\xe5\x84\x7d\xc4\xb5\x95\x73\
+\x5e\x6f\xf9\xe2\x2c\xf3\x17\xb8\x10\x8c\xf2\x40\x10\x96\x75\x77\
+\x77\x3f\x63\x18\xc6\xd3\xff\xf9\xf4\xba\xc0\x6b\x91\xb9\x72\x5a\
+\x78\x00\x6e\xfd\xe3\xc8\xf5\xb7\xe5\x57\x83\xb0\x2c\x3b\x0a\xec\
+\x7c\xc8\x49\xb0\xaa\x03\x0e\xd3\xe3\x70\xee\xef\x7b\x50\x60\xf6\
+\xfd\xc7\x65\xe3\x59\x37\x7e\xb5\xb7\x19\xd7\xbf\xbd\x00\xcb\xfb\
+\xcf\xc5\x7b\xb1\x99\xd8\xdc\xaf\xe0\xc0\xde\x2e\xd4\x25\xba\x51\
+\xa7\xf4\x3f\x5a\x53\x53\x73\xe1\xca\x95\x2b\x67\x90\x00\x4b\x67\
+\xcf\x9e\xdd\x23\x49\x12\xac\x6f\x7a\xcb\x05\xb2\x80\xcf\xd3\x94\
+\x55\x95\x46\x4c\x30\x12\xe0\x26\x55\x35\x4e\x5e\xfe\xd8\xda\xd3\
+\x3c\xb7\x5c\x86\xcb\x9b\xfa\xe0\x33\x5f\x7b\x93\x7d\x24\xf5\x26\
+\x60\xee\xd7\xf3\x1a\xf6\x3c\x01\xa8\x24\x82\x3c\xe1\xe1\x5b\x2e\
+\x83\xc3\x52\xbd\x36\x79\x46\x90\xeb\xe1\x30\x6d\x1c\x10\xc7\x21\
+\x82\x99\xe0\x46\xaa\xf0\xec\xee\xa9\xd8\x12\x9e\x06\x4d\xd7\x10\
+\x8f\x8f\x43\x44\xdf\xc3\xe5\x73\x0d\xcc\x59\xe4\xc3\x89\xb3\xda\
+\xe0\xad\x6d\xa6\x3c\x7d\x41\x5f\xfb\x95\xf7\x0c\x03\x10\x0f\x3f\
+\xfc\x30\x23\x5b\x2c\x44\x2e\x6b\x5f\x4d\x78\xc3\x75\xcf\xdf\x5f\
+\x83\xc7\xd6\xee\x6c\x4a\xa6\xd5\x16\xcb\x2d\x38\x01\x07\x0f\x1e\
+\x4c\xb7\xb5\xb5\x7d\x25\x1a\x49\x6c\x5d\xf1\xcb\xdf\x36\xc9\x37\
+\x7e\x11\x97\x64\x87\xe0\x96\x00\x16\xeb\x07\xdb\xfe\x2f\x80\x79\
+\x2c\xe3\xd3\xed\x6c\xc6\xac\x87\xdf\xf9\x03\xe0\xc0\xa3\x66\xc9\
+\xcc\x23\xfc\x2e\xc0\x27\xb8\xaf\x6f\x0e\x1c\xa6\x5a\x02\x38\x45\
+\x98\xb4\x6f\xf3\x60\x10\xab\xb6\x35\x63\xd3\x61\x2f\xa2\xd1\x08\
+\x62\x91\x8f\xf1\xa5\x39\x0a\x7e\x74\x9e\x84\xf3\x17\xce\x04\xab\
+\x9b\x87\x3d\x83\x40\x64\xe8\x10\xa2\x07\x3b\x11\xee\xdd\x79\xf0\
+\x9d\x70\xf3\x01\x00\x7c\xc5\x8a\x15\xcb\xc8\x1b\x3c\x24\xc0\xeb\
+\x00\x72\xa5\xca\xd5\xd8\x58\x23\x65\x15\xad\xdf\xd0\x35\x0e\xa0\
+\x86\x90\x26\x68\x04\x31\xbb\xbf\xff\x70\xf4\x84\xa6\xeb\x87\x8e\
+\x8c\xac\x59\xf1\xe4\x26\x96\xb9\xfa\x6a\x9c\x6f\xbc\x08\x8f\xac\
+\x41\x96\xcd\x4a\x48\xa0\x56\xa6\x96\x59\xe7\x8c\x13\xc2\x5d\x60\
+\x11\x82\x9c\xaf\x9c\x29\x5d\xc6\xa1\xb1\x00\x8e\xc4\x3c\x18\x8a\
+\x7a\x10\x7a\xf5\xbf\x10\xd3\xd7\x21\xcd\xa6\x23\x65\xd4\x01\x24\
+\x6c\x2d\xef\x40\x8d\xcf\xc0\xd4\x6a\x0d\x73\x9b\x32\x58\x36\x23\
+\x85\x29\x7e\x1d\xa6\x0d\x27\xdc\xd8\x70\xb0\x1a\x2f\x75\x4d\xc1\
+\xc7\x83\x12\xc2\xe1\x30\x22\xe3\xe3\xf8\x8b\xa5\xc0\x03\x37\x07\
+\x70\xe2\xbc\x2f\xe4\x12\xb1\x88\x1d\x81\x31\xb4\x1d\x91\x7d\x31\
+\xa4\x14\x91\x4f\x37\x6e\xb7\x35\x45\x60\x2d\x2d\x2d\x17\x9b\xf9\
+\x80\xec\x79\x58\xe6\xba\xfd\xde\x55\x1c\x5e\xff\x12\xa8\x59\x93\
+\xfc\x14\x42\x15\x21\x46\xc8\x10\xf8\x99\xd3\x47\xd7\x6d\x3c\x5c\
+\xf7\x60\x6f\xdf\x91\xfb\x1f\x7e\x49\x42\xf4\x4f\xaf\xc2\x32\x75\
+\x35\x3c\x2e\x1d\x2e\x57\x9e\xbc\xcb\x12\x81\x13\xdb\x50\xda\x8b\
+\xc1\xb8\x17\xfd\x51\x1f\x8e\x24\x83\xd8\x3f\xec\x42\x6f\x48\x43\
+\x3a\x93\x45\x36\x9b\x85\xaa\x66\x20\x44\x1a\x3e\x5f\x06\x81\xc0\
+\x28\x82\xf2\x18\x3c\x48\x23\x6f\x12\x09\xe4\x42\x46\xf7\xc0\xef\
+\xaf\xc7\xec\x66\x2f\x3d\x5a\x35\x14\xe1\x43\x86\xee\x1f\x0a\x8d\
+\x20\x3c\x36\x86\xa0\x17\x78\xed\x8e\x7a\x5c\xf2\x27\xe7\x03\xb5\
+\x27\x43\x28\x29\x18\x07\xd7\xe6\x04\x10\x06\xc0\x49\x79\xc1\x04\
+\x84\xe0\x74\xec\xca\x15\x5f\xf3\xbb\xeb\xeb\xeb\xaf\xef\xeb\xeb\
+\xcb\x80\x6e\x77\xbe\x0d\x2a\xf4\xe9\x00\xb7\x50\x47\xf0\x13\xa2\
+\x9b\x81\x44\xbb\x0e\x76\x61\x7b\xf4\xb9\xf7\x0e\xd7\xce\x3e\xd4\
+\x37\xf0\x97\x4f\xbc\xc9\xb0\xff\xa4\xf3\x35\x79\x74\x4b\xca\x60\
+\xae\xa0\xaf\xaa\xc6\xe5\xae\x9e\x82\x81\xa8\x84\x81\x31\x8e\x68\
+\x3c\x8d\x54\x2a\x83\x44\x32\x8d\x80\x34\x88\x93\x5a\x75\x5c\xbb\
+\x54\xc2\xbc\x19\x40\x5b\xb3\x84\xf6\xd6\x20\x9a\xbf\xf4\x22\x24\
+\x33\x51\xba\x48\xf3\x9d\x37\x83\x99\x9b\x26\xba\x02\x28\x49\x30\
+\x35\x85\xa7\xd6\xeb\xb8\xf1\x3f\x52\x18\x19\xe1\x85\xc9\x9e\x01\
+\xab\x6f\x0b\xe0\xbc\x2b\xbe\x05\xe1\x69\x82\x48\x0e\x43\xdb\xf7\
+\x12\x90\x49\x12\x61\x19\x0c\xc8\x91\xe7\xd6\x96\x92\x90\x68\xa6\
+\x00\xf6\xca\x2b\xaf\xdc\x10\x08\x04\x66\x47\xa3\xd1\x55\x20\x5e\
+\xc5\x0a\x8a\x8b\x10\x24\x34\x10\xbc\x84\x64\x73\x10\x89\xf3\xe7\
+\x81\x35\x04\x51\xfb\x9b\xfd\x0d\x77\x29\xdc\xfd\xdd\xd6\xd6\x56\
+\xf4\xf7\xf7\xa1\x2a\xe0\x05\x37\x34\x84\x86\x23\x30\x0c\x8e\x69\
+\xb5\x14\x87\xf3\x25\x9c\x3b\x8f\xe1\x82\xa5\x4d\x68\x9f\x3d\x8b\
+\x2a\x5c\x13\x98\xbf\x01\xcc\x5b\x0b\xe6\x0e\x82\x41\x03\xb8\x92\
+\x03\x33\xb2\x10\x6a\x14\x2c\x3d\x08\xa4\x87\x73\xdb\xec\x4c\xcb\
+\xe2\xd0\x51\x81\xb3\x97\xd7\x62\x24\x1c\x01\x59\x6e\xc6\x3b\x1a\
+\x25\xec\x09\x01\xa7\xb5\x09\x7c\xf0\xb3\x0b\x20\xd1\xeb\x37\x4f\
+\x47\xa0\xed\x79\x06\x22\x9b\xb4\x37\xaa\x75\x81\x4d\x07\x38\x14\
+\x8d\x83\x09\xae\x27\x1b\x16\x2f\x7c\xba\xa7\x4e\x27\xf2\x5b\x3e\
+\xfa\xe8\x23\xcf\xc0\xc0\xc0\xa9\x00\x7a\x8b\xed\x07\xe8\x84\x38\
+\x41\xb5\x44\xa8\x1d\x4e\x22\xf0\x7a\x17\xa2\x27\x35\x23\x7c\xde\
+\xac\xc8\x9d\xef\xf6\x35\xb3\xde\xde\xde\x9b\xcd\x58\x22\x6f\xb4\
+\x66\x85\xe1\x9c\x39\xae\xc8\xbd\x5f\x9f\xe5\x9f\xb5\xe8\x42\x6f\
+\xb0\x75\x21\x73\xfb\x82\x48\x0b\x05\xc4\x90\xa0\x10\x31\x82\xaa\
+\xd0\x61\x14\x3c\xd9\x9f\xdb\x2c\x91\x94\x10\x24\x3d\x01\x99\x09\
+\xc8\x42\x40\x12\x66\xcb\xd0\x3d\x5c\x0d\x0e\x39\x37\xdb\x37\x9e\
+\x03\x7c\xeb\x6c\x50\x68\x00\x7f\xfd\x42\x2d\x66\x34\x24\x10\x97\
+\xdb\xe0\x4a\x2b\x48\xed\x5a\x0d\x91\xce\xd0\x7d\x66\xfc\x09\x08\
+\x9d\x23\x95\x11\x54\x1a\x01\xb3\x27\x65\xf8\x1e\x79\x64\x7d\xba\
+\xba\x75\x7a\xfd\xbf\xf7\xf4\xf4\xd4\x11\xf9\x1b\x4c\xf2\xe5\x36\
+\x44\xb8\x15\xff\x23\x04\x45\x00\x8d\x29\x15\x53\x3b\xfb\x11\xdb\
+\xd6\x2f\xc6\x5b\x1b\x95\xef\x69\x9a\x36\x04\xe0\xdb\x84\x36\x02\
+\xbc\x6e\xb9\x77\xd9\x89\x35\xf7\xb6\x5f\xf9\xe8\x75\x35\x53\x5a\
+\xda\x54\x25\x2d\xa5\x33\x09\xb7\xa6\xa6\x5d\x4a\x72\x14\xa3\xfd\
+\xbd\x99\x70\xff\xc7\x6e\x23\xbe\xbf\x5a\x36\xe2\xbe\x80\x57\x54\
+\x79\x3d\xc2\x13\xf0\x08\x29\xe0\x61\xb9\xca\xe2\x22\xb8\x19\xc0\
+\x0d\xe0\xdd\x81\x39\x48\x24\xba\x30\xb3\x1e\x5b\x82\x6e\xec\x79\
+\x6d\x07\x6a\x3d\x2e\x51\x27\x04\x3f\xef\x70\x18\xfa\xc7\x3d\x11\
+\xc9\x88\xbf\x2a\xf3\x78\x04\x01\xb7\xcc\x3c\x4c\x80\x71\x01\x45\
+\x15\x62\xdf\x30\xd4\xa3\x09\x36\x7a\x28\xea\xde\xf8\xe1\xa0\xdf\
+\x35\xeb\xc4\xa6\xd5\x54\xd1\x9a\xf7\xee\xdd\x7b\x37\x80\x5f\x1d\
+\xeb\x8e\x90\xb0\xbc\x60\xdc\x6a\x1b\x09\x0d\x02\x08\x1c\x09\x8f\
+\x87\x01\xac\x90\x65\xf9\x9f\x7c\x3e\xdf\xf6\x54\x2a\xb5\xd0\xe3\
+\xf5\xbe\xdc\x71\xfa\xd5\xef\xcf\x3e\xe5\xec\xaf\x09\x2e\x06\x0c\
+\x43\x53\xe2\x91\x70\xf7\xde\x1d\x1b\x77\x6f\xfc\xcd\x93\xa3\xaa\
+\x9a\xf6\x41\x57\x7d\x86\x11\x0c\x08\xdd\x5b\x25\xb8\x56\x45\xa1\
+\x13\x64\x42\xaf\x97\x99\xde\xe0\x96\x8c\xda\x6a\x9f\x41\x2d\x0f\
+\xc6\xa4\x99\xf3\x3b\xfb\xa4\x2a\x55\x51\xe2\x0b\xe6\xe0\x0e\x83\
+\x23\xab\xab\xf0\x65\x54\xe1\xf3\xbb\xb8\xa7\xfb\x88\xb1\x64\xcd\
+\x3b\x9d\xcf\xca\x2e\xd6\x00\x78\x83\x0c\xc2\xc7\x60\xb8\x05\x87\
+\x94\x48\xc3\x08\xa7\xb8\x72\x24\x2a\xbc\x9a\x67\xda\x17\x3b\xe6\
+\xcc\x98\xd1\xd5\xd5\x95\x08\x85\x42\xf7\x00\x78\xf4\xb3\x6c\x89\
+\x19\x84\x84\x25\xc2\x14\x0b\x33\x08\x11\xc3\x30\xc6\x1a\x1a\x1a\
+\xb6\x64\x32\x99\x85\xfe\x40\x70\xd7\x57\x6e\xbc\x77\x9a\xcb\xed\
+\x35\xb3\xed\xfb\x5d\xbb\xf7\xbc\xb1\xa3\x73\x6b\x94\x43\x97\x1a\
+\x4f\xfa\x32\xe3\x5c\x65\xa4\x89\xc4\xf5\x2c\x33\xd4\xb4\xa4\x2b\
+\x29\x49\x57\x93\x32\x65\x6f\x59\xa3\x96\x67\x53\xee\x31\x2d\xed\
+\x19\x1c\x63\x0b\xdd\xcd\xcb\x1e\xdd\xd9\xf5\x3a\x24\x86\x07\x3b\
+\xa6\x62\x9b\x00\x1d\x6a\x90\xb8\x4c\xe9\xc4\xa5\xde\x3e\x2c\xd8\
+\x5b\x4f\xae\x1f\x9b\x75\xe1\xb2\x59\xcf\xb7\x34\xf8\xd3\xe3\xb1\
+\xd4\xb4\xd1\x68\xfa\x84\x70\x4c\x9f\x6f\x48\xfe\x99\x9e\x40\x5d\
+\xa3\xab\xc6\x1f\x8c\x86\xc3\xea\xce\xee\xf7\x5e\xd6\x75\x7d\x39\
+\x80\x5d\x04\xed\xf3\xfc\xaf\x31\x66\x89\x55\x4b\x98\x6a\x95\xca\
+\x24\xd5\xd5\x9b\xa8\x26\xdf\xd6\xdc\xdc\xfc\x0d\x7a\x87\x50\xd2\
+\xe9\x74\xe2\x8d\x37\xde\xd8\x3d\xc9\x96\x86\x80\x05\xd3\x98\x10\
+\x9c\xc3\xe0\x42\x37\xe8\x48\xe5\x86\x9a\x11\xdb\xb6\xed\xa8\x86\
+\xb7\x7a\xed\xde\xbd\x9f\xcc\xeb\xec\xec\xdc\x0e\xe0\x4c\x82\xfe\
+\x8f\x00\xd6\x2d\x06\x4b\x8d\x83\x45\x63\x90\x7b\x13\xec\x2c\xba\
+\xf3\x79\xb7\xdb\xdd\xec\xf5\x7a\x55\x6a\x99\xcb\xe5\x72\x93\x81\
+\xc8\x1a\xf1\x78\x7c\xbf\xa2\x28\x6b\x01\xfc\x5a\x08\xd1\x5d\x40\
+\xbc\x9c\x07\x94\x08\x09\x8d\x10\x21\x28\x84\x26\xc2\x14\x55\x55\
+\xe3\xe6\xba\x9a\xda\xa6\x97\xc9\xc8\x2b\x38\x00\x97\x53\x00\xe7\
+\x9f\x3d\x18\x63\x1c\x8c\x41\xa2\x1f\x78\xdc\x02\xf0\xf1\x77\x37\
+\x7c\xd4\xee\xf7\x57\x3d\x91\x88\xc6\xe6\x6d\xdb\xb6\x6d\x14\xc0\
+\x35\xd6\x78\x99\x04\x90\xf0\x31\x64\xab\x2a\xd5\xe4\x77\x54\x70\
+\x0b\xe5\xa1\xb3\x08\xb5\xd6\x73\x85\x09\xfb\x09\xa6\x70\x7d\xd6\
+\x62\x4e\x54\x66\x57\xb8\x30\x24\x92\xd6\x97\x66\x69\xc6\x37\x92\
+\x00\x4a\x22\x91\x38\xe3\xc0\x81\x03\xaf\x51\x79\xe4\x74\x2e\x13\
+\x49\x13\x92\x55\x21\x72\xe4\xf3\x13\x2f\x0c\xab\x95\x48\x2c\xb1\
+\x6e\xdd\xba\x36\xba\x7e\x3d\x2d\x4f\xbf\x73\xe8\xd0\x21\xff\xa6\
+\x4d\x9b\xc6\xe9\xda\x5f\x01\xc8\x12\xda\x26\x7c\xa7\x36\xc1\x0b\
+\x93\x84\xdd\x84\x4e\x42\x8a\x90\xb1\x26\x45\x2f\x47\xba\x74\x08\
+\x1c\xff\x7d\x32\x21\xe0\xf1\x78\xbe\x4d\x1e\xb0\x9c\xc2\x60\xe5\
+\xa9\xa7\x9e\xba\x9e\x92\xa3\x9b\x5c\x93\x51\x82\xe4\xe4\x9a\x3a\
+\x09\xa2\x72\xce\x0d\x1a\x23\x28\x5f\xc8\xe3\xe3\xe3\x33\xfc\x7e\
+\xff\x29\x34\xe6\x22\x6a\x97\x51\x82\x62\x94\xa1\x0d\xea\xff\x10\
+\xc0\x2a\xc2\x51\x8b\x50\xc2\x2a\xc9\xb1\x1c\x51\x27\x41\x6e\x41\
+\xe0\x73\x1a\xab\xc0\xfd\x26\xae\x63\x8c\x3d\x4c\xa4\x6a\xab\xaa\
+\xaa\x86\x89\x58\x8a\xda\x0c\x09\x20\x3c\x79\xf3\xd1\xf5\x06\x42\
+\x8d\x39\xfb\xe4\x39\x88\x44\x22\xc6\xd0\xd0\x50\x2f\x79\xc2\x06\
+\x6b\x69\x3a\x60\x11\x4d\x12\xd2\x96\x08\x9a\x4d\xf6\x77\x63\x0c\
+\x95\xb3\x2a\xc2\x97\x09\xa7\x13\xda\x2c\xc2\x75\x04\x37\xe7\x5c\
+\xb2\x5e\x41\x23\x84\x83\x84\x6e\xc2\xfb\x84\x7e\x6b\xa6\x8d\x72\
+\x7f\xd6\xfb\x03\x10\xa0\xf0\xf3\x1c\xff\x0a\xc0\xf9\x17\x56\x81\
+\xdf\x13\xfb\x1f\x84\xaf\xe2\x02\x22\xe6\xe9\x93\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x10\
+\x0f\xad\xca\x47\
+\x00\x68\
+\x00\x65\x00\x6c\x00\x70\x00\x2d\x00\x62\x00\x72\x00\x6f\x00\x77\x00\x73\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x08\x99\x64\x87\
+\x00\x6b\
+\x00\x63\x00\x68\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x01\xad\xab\x47\
+\x00\x64\
+\x00\x69\x00\x67\x00\x69\x00\x6b\x00\x61\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x1a\
+\x08\xdd\xe1\xa7\
+\x00\x61\
+\x00\x63\x00\x63\x00\x65\x00\x73\x00\x73\x00\x6f\x00\x72\x00\x69\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x69\x00\x63\x00\x74\x00\x69\
+\x00\x6f\x00\x6e\x00\x61\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0e\x95\x57\x87\
+\x00\x6b\
+\x00\x33\x00\x62\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x0b\x34\x2d\xe7\
+\x00\x61\
+\x00\x6b\x00\x72\x00\x65\x00\x67\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x01\
+\x00\x00\x00\x40\x00\x00\x00\x00\x00\x01\x00\x00\x2e\x67\
+\x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x4c\
+\x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x71\
+\x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x70\xa9\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x50\x89\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/dialogs/classwizard/classwizard.py b/examples/widgets/dialogs/classwizard/classwizard.py
new file mode 100755
index 000000000..ff7677f7d
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/classwizard.py
@@ -0,0 +1,404 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import classwizard_rc
+
+
+class ClassWizard(QtWidgets.QWizard):
+ def __init__(self, parent=None):
+ super(ClassWizard, self).__init__(parent)
+
+ self.addPage(IntroPage())
+ self.addPage(ClassInfoPage())
+ self.addPage(CodeStylePage())
+ self.addPage(OutputFilesPage())
+ self.addPage(ConclusionPage())
+
+ self.setPixmap(QtWidgets.QWizard.BannerPixmap,
+ QtGui.QPixmap(':/images/banner.png'))
+ self.setPixmap(QtWidgets.QWizard.BackgroundPixmap,
+ QtGui.QPixmap(':/images/background.png'))
+
+ self.setWindowTitle("Class Wizard")
+
+ def accept(self):
+ className = self.field('className')
+ baseClass = self.field('baseClass')
+ macroName = self.field('macroName')
+ baseInclude = self.field('baseInclude')
+
+ outputDir = self.field('outputDir')
+ header = self.field('header')
+ implementation = self.field('implementation')
+
+ block = ''
+
+ if self.field('comment'):
+ block += '/*\n'
+ block += ' ' + header + '\n'
+ block += '*/\n'
+ block += '\n'
+
+ if self.field('protect'):
+ block += '#ifndef ' + macroName + '\n'
+ block += '#define ' + macroName + '\n'
+ block += '\n'
+
+ if self.field('includeBase'):
+ block += '#include ' + baseInclude + '\n'
+ block += '\n'
+
+ block += 'class ' + className
+ if baseClass:
+ block += ' : public ' + baseClass
+
+ block += '\n'
+ block += '{\n'
+
+ if self.field('qobjectMacro'):
+ block += ' Q_OBJECT\n'
+ block += '\n'
+
+ block += 'public:\n'
+
+ if self.field('qobjectCtor'):
+ block += ' ' + className + '(QObject *parent = 0);\n'
+ elif self.field('qwidgetCtor'):
+ block += ' ' + className + '(QWidget *parent = 0);\n'
+ elif self.field('defaultCtor'):
+ block += ' ' + className + '();\n'
+
+ if self.field('copyCtor'):
+ block += ' ' + className + '(const ' + className + ' &other);\n'
+ block += '\n'
+ block += ' ' + className + ' &operator=' + '(const ' + className + ' &other);\n'
+
+ block += '};\n'
+
+ if self.field('protect'):
+ block += '\n'
+ block += '#endif\n'
+
+ headerFile = QtCore.QFile(outputDir + '/' + header)
+
+ if not headerFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(None, "Class Wizard",
+ "Cannot write file %s:\n%s" % (headerFile.fileName(), headerFile.errorString()))
+ return
+
+ headerFile.write(str(block))
+
+ block = ''
+
+ if self.field('comment'):
+ block += '/*\n'
+ block += ' ' + implementation + '\n'
+ block += '*/\n'
+ block += '\n'
+
+ block += '#include "' + header + '"\n'
+ block += '\n'
+
+ if self.field('qobjectCtor'):
+ block += className + '::' + className + '(QObject *parent)\n'
+ block += ' : ' + baseClass + '(parent)\n'
+ block += '{\n'
+ block += '}\n'
+ elif self.field('qwidgetCtor'):
+ block += className + '::' + className + '(QWidget *parent)\n'
+ block += ' : ' + baseClass + '(parent)\n'
+ block += '{\n'
+ block += '}\n'
+ elif self.field('defaultCtor'):
+ block += className + '::' + className + '()\n'
+ block += '{\n'
+ block += ' // missing code\n'
+ block += '}\n'
+
+ if self.field('copyCtor'):
+ block += '\n'
+ block += className + '::' + className + '(const ' + className + ' &other)\n'
+ block += '{\n'
+ block += ' *this = other;\n'
+ block += '}\n'
+ block += '\n'
+ block += className + ' &' + className + '::operator=(const ' + className + ' &other)\n'
+ block += '{\n'
+
+ if baseClass:
+ block += ' ' + baseClass + '::operator=(other);\n'
+
+ block += ' // missing code\n'
+ block += ' return *this;\n'
+ block += '}\n'
+
+ implementationFile = QtCore.QFile(outputDir + '/' + implementation)
+
+ if not implementationFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(None, "Class Wizard",
+ "Cannot write file %s:\n%s" % (implementationFile.fileName(), implementationFile.errorString()))
+ return
+
+ implementationFile.write(str(block))
+
+ super(ClassWizard, self).accept()
+
+
+class IntroPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super(IntroPage, self).__init__(parent)
+
+ self.setTitle("Introduction")
+ self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
+ QtGui.QPixmap(':/images/watermark1.png'))
+
+ label = QtWidgets.QLabel("This wizard will generate a skeleton C++ class "
+ "definition, including a few functions. You simply need to "
+ "specify the class name and set a few options to produce a "
+ "header file and an implementation file for your new C++ "
+ "class.")
+ label.setWordWrap(True)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(label)
+ self.setLayout(layout)
+
+
+class ClassInfoPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super(ClassInfoPage, self).__init__(parent)
+
+ self.setTitle("Class Information")
+ self.setSubTitle("Specify basic information about the class for "
+ "which you want to generate skeleton source code files.")
+ self.setPixmap(QtWidgets.QWizard.LogoPixmap,
+ QtGui.QPixmap(':/images/logo1.png'))
+
+ classNameLabel = QtWidgets.QLabel("&Class name:")
+ classNameLineEdit = QtWidgets.QLineEdit()
+ classNameLabel.setBuddy(classNameLineEdit)
+
+ baseClassLabel = QtWidgets.QLabel("B&ase class:")
+ baseClassLineEdit = QtWidgets.QLineEdit()
+ baseClassLabel.setBuddy(baseClassLineEdit)
+
+ qobjectMacroCheckBox = QtWidgets.QCheckBox("Generate Q_OBJECT &macro")
+
+ groupBox = QtWidgets.QGroupBox("C&onstructor")
+
+ qobjectCtorRadioButton = QtWidgets.QRadioButton("&QObject-style constructor")
+ qwidgetCtorRadioButton = QtWidgets.QRadioButton("Q&Widget-style constructor")
+ defaultCtorRadioButton = QtWidgets.QRadioButton("&Default constructor")
+ copyCtorCheckBox = QtWidgets.QCheckBox("&Generate copy constructor and operator=")
+
+ defaultCtorRadioButton.setChecked(True)
+
+ defaultCtorRadioButton.toggled.connect(copyCtorCheckBox.setEnabled)
+
+ self.registerField('className*', classNameLineEdit)
+ self.registerField('baseClass', baseClassLineEdit)
+ self.registerField('qobjectMacro', qobjectMacroCheckBox)
+ self.registerField('qobjectCtor', qobjectCtorRadioButton)
+ self.registerField('qwidgetCtor', qwidgetCtorRadioButton)
+ self.registerField('defaultCtor', defaultCtorRadioButton)
+ self.registerField('copyCtor', copyCtorCheckBox)
+
+ groupBoxLayout = QtWidgets.QVBoxLayout()
+ groupBoxLayout.addWidget(qobjectCtorRadioButton)
+ groupBoxLayout.addWidget(qwidgetCtorRadioButton)
+ groupBoxLayout.addWidget(defaultCtorRadioButton)
+ groupBoxLayout.addWidget(copyCtorCheckBox)
+ groupBox.setLayout(groupBoxLayout)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(classNameLabel, 0, 0)
+ layout.addWidget(classNameLineEdit, 0, 1)
+ layout.addWidget(baseClassLabel, 1, 0)
+ layout.addWidget(baseClassLineEdit, 1, 1)
+ layout.addWidget(qobjectMacroCheckBox, 2, 0, 1, 2)
+ layout.addWidget(groupBox, 3, 0, 1, 2)
+ self.setLayout(layout)
+
+
+class CodeStylePage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super(CodeStylePage, self).__init__(parent)
+
+ self.setTitle("Code Style Options")
+ self.setSubTitle("Choose the formatting of the generated code.")
+ self.setPixmap(QtWidgets.QWizard.LogoPixmap,
+ QtGui.QPixmap(':/images/logo2.png'))
+
+ commentCheckBox = QtWidgets.QCheckBox("&Start generated files with a "
+ "comment")
+ commentCheckBox.setChecked(True)
+
+ protectCheckBox = QtWidgets.QCheckBox("&Protect header file against "
+ "multiple inclusions")
+ protectCheckBox.setChecked(True)
+
+ macroNameLabel = QtWidgets.QLabel("&Macro name:")
+ self.macroNameLineEdit = QtWidgets.QLineEdit()
+ macroNameLabel.setBuddy(self.macroNameLineEdit)
+
+ self.includeBaseCheckBox = QtWidgets.QCheckBox("&Include base class "
+ "definition")
+ self.baseIncludeLabel = QtWidgets.QLabel("Base class include:")
+ self.baseIncludeLineEdit = QtWidgets.QLineEdit()
+ self.baseIncludeLabel.setBuddy(self.baseIncludeLineEdit)
+
+ protectCheckBox.toggled.connect(macroNameLabel.setEnabled)
+ protectCheckBox.toggled.connect(self.macroNameLineEdit.setEnabled)
+ self.includeBaseCheckBox.toggled.connect(self.baseIncludeLabel.setEnabled)
+ self.includeBaseCheckBox.toggled.connect(self.baseIncludeLineEdit.setEnabled)
+
+ self.registerField('comment', commentCheckBox)
+ self.registerField('protect', protectCheckBox)
+ self.registerField('macroName', self.macroNameLineEdit)
+ self.registerField('includeBase', self.includeBaseCheckBox)
+ self.registerField('baseInclude', self.baseIncludeLineEdit)
+
+ layout = QtWidgets.QGridLayout()
+ layout.setColumnMinimumWidth(0, 20)
+ layout.addWidget(commentCheckBox, 0, 0, 1, 3)
+ layout.addWidget(protectCheckBox, 1, 0, 1, 3)
+ layout.addWidget(macroNameLabel, 2, 1)
+ layout.addWidget(self.macroNameLineEdit, 2, 2)
+ layout.addWidget(self.includeBaseCheckBox, 3, 0, 1, 3)
+ layout.addWidget(self.baseIncludeLabel, 4, 1)
+ layout.addWidget(self.baseIncludeLineEdit, 4, 2)
+ self.setLayout(layout)
+
+ def initializePage(self):
+ className = self.field('className')
+ self.macroNameLineEdit.setText(className.upper() + "_H")
+
+ baseClass = self.field('baseClass')
+ is_baseClass = bool(baseClass)
+
+ self.includeBaseCheckBox.setChecked(is_baseClass)
+ self.includeBaseCheckBox.setEnabled(is_baseClass)
+ self.baseIncludeLabel.setEnabled(is_baseClass)
+ self.baseIncludeLineEdit.setEnabled(is_baseClass)
+
+ if not is_baseClass:
+ self.baseIncludeLineEdit.clear()
+ elif QtCore.QRegExp('Q[A-Z].*').exactMatch(baseClass):
+ self.baseIncludeLineEdit.setText('<' + baseClass + '>')
+ else:
+ self.baseIncludeLineEdit.setText('"' + baseClass.lower() + '.h"')
+
+
+class OutputFilesPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super(OutputFilesPage, self).__init__(parent)
+
+ self.setTitle("Output Files")
+ self.setSubTitle("Specify where you want the wizard to put the "
+ "generated skeleton code.")
+ self.setPixmap(QtWidgets.QWizard.LogoPixmap,
+ QtGui.QPixmap(':/images/logo3.png'))
+
+ outputDirLabel = QtWidgets.QLabel("&Output directory:")
+ self.outputDirLineEdit = QtWidgets.QLineEdit()
+ outputDirLabel.setBuddy(self.outputDirLineEdit)
+
+ headerLabel = QtWidgets.QLabel("&Header file name:")
+ self.headerLineEdit = QtWidgets.QLineEdit()
+ headerLabel.setBuddy(self.headerLineEdit)
+
+ implementationLabel = QtWidgets.QLabel("&Implementation file name:")
+ self.implementationLineEdit = QtWidgets.QLineEdit()
+ implementationLabel.setBuddy(self.implementationLineEdit)
+
+ self.registerField('outputDir*', self.outputDirLineEdit)
+ self.registerField('header*', self.headerLineEdit)
+ self.registerField('implementation*', self.implementationLineEdit)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(outputDirLabel, 0, 0)
+ layout.addWidget(self.outputDirLineEdit, 0, 1)
+ layout.addWidget(headerLabel, 1, 0)
+ layout.addWidget(self.headerLineEdit, 1, 1)
+ layout.addWidget(implementationLabel, 2, 0)
+ layout.addWidget(self.implementationLineEdit, 2, 1)
+ self.setLayout(layout)
+
+ def initializePage(self):
+ className = self.field('className')
+ self.headerLineEdit.setText(className.lower() + '.h')
+ self.implementationLineEdit.setText(className.lower() + '.cpp')
+ self.outputDirLineEdit.setText(QtCore.QDir.toNativeSeparators(QtCore.QDir.tempPath()))
+
+
+class ConclusionPage(QtWidgets.QWizardPage):
+ def __init__(self, parent=None):
+ super(ConclusionPage, self).__init__(parent)
+
+ self.setTitle("Conclusion")
+ self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
+ QtGui.QPixmap(':/images/watermark2.png'))
+
+ self.label = QtWidgets.QLabel()
+ self.label.setWordWrap(True)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(self.label)
+ self.setLayout(layout)
+
+ def initializePage(self):
+ finishText = self.wizard().buttonText(QtWidgets.QWizard.FinishButton)
+ finishText.replace('&', '')
+ self.label.setText("Click %s to generate the class skeleton." % finishText)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ wizard = ClassWizard()
+ wizard.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/dialogs/classwizard/classwizard.qrc b/examples/widgets/dialogs/classwizard/classwizard.qrc
new file mode 100644
index 000000000..41a5ddc7d
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/classwizard.qrc
@@ -0,0 +1,11 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/background.png</file>
+ <file>images/banner.png</file>
+ <file>images/logo1.png</file>
+ <file>images/logo2.png</file>
+ <file>images/logo3.png</file>
+ <file>images/watermark1.png</file>
+ <file>images/watermark2.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/dialogs/classwizard/classwizard_rc.py b/examples/widgets/dialogs/classwizard/classwizard_rc.py
new file mode 100644
index 000000000..9c5112ea8
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/classwizard_rc.py
@@ -0,0 +1,3928 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Fri Jul 30 17:18:57 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x06\x53\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x02\xeb\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\xff\
+\xff\xff\xff\xff\xbf\x00\x00\xff\xff\xff\x99\x00\x00\xff\xff\xff\
+\x9f\x00\x00\xaa\x00\x00\xb2\x00\x00\xff\xff\xff\xb9\x00\x00\xff\
+\xff\xff\xaa\x00\x00\xff\xff\xff\xb0\x00\x00\xb6\x12\x12\xff\xff\
+\xff\xaa\x00\x00\xae\x00\x00\xff\xff\xff\xff\xff\xff\xaa\x00\x00\
+\xff\xff\xff\xad\x00\x00\xb3\x00\x00\xff\xff\xff\xad\x00\x00\xff\
+\xff\xff\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\xff\xac\x00\x00\xb0\x00\x00\xc4\x47\x47\xff\xff\xff\xff\xff\xff\
+\xad\x00\x00\xaf\x00\x00\xb1\x00\x00\xff\xff\xff\xff\xff\xff\xae\
+\x00\x00\xff\xff\xff\xae\x00\x00\xff\xff\xff\xae\x00\x00\xf2\xd5\
+\xd5\xff\xff\xff\xff\xff\xff\xbf\x38\x38\xad\x00\x00\xff\xff\xff\
+\xff\xff\xff\xff\xff\xff\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xaf\
+\x00\x00\xb0\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\x00\
+\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\xae\x00\x00\xaf\x00\x00\xff\xff\xff\xae\x00\x00\xd1\x70\x70\xae\
+\x00\x00\xae\x02\x02\xaf\x00\x00\xff\xff\xff\xb0\x00\x00\xff\xff\
+\xff\xda\x8c\x8c\xae\x00\x00\xff\xff\xff\xaf\x00\x00\xff\xff\xff\
+\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\x00\x00\xff\
+\xff\xff\xd3\x75\x75\xaf\x00\x00\xc9\x51\x51\xae\x00\x00\xf4\xdc\
+\xdc\xff\xff\xff\xaf\x00\x00\xae\x00\x00\xff\xff\xff\xae\x00\x00\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe6\xb2\xb2\xff\
+\xff\xff\xae\x00\x00\xff\xff\xff\xaf\x00\x00\xaf\x00\x00\xae\x00\
+\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd2\x71\x71\
+\xaf\x00\x00\xff\xff\xff\xba\x27\x27\xae\x00\x00\xaf\x00\x00\xfa\
+\xf4\xf4\xd9\x87\x87\xff\xff\xff\xff\xff\xff\xba\x24\x24\xff\xff\
+\xff\xb8\x1f\x1f\xff\xff\xff\xf3\xd9\xd9\xff\xff\xff\xb7\x1a\x1a\
+\xae\x00\x00\xae\x00\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xae\
+\x00\x00\xaf\x00\x00\xcc\x5c\x5c\xff\xff\xff\xb7\x1b\x1b\xb2\x0a\
+\x0a\xaf\x03\x03\xae\x00\x00\xff\xff\xff\xff\xff\xff\xaf\x02\x02\
+\xff\xff\xff\xb0\x02\x02\xff\xff\xff\xff\xff\xff\xcd\x63\x63\xaf\
+\x00\x00\xaf\x01\x01\xff\xff\xff\xaf\x00\x00\xb1\x08\x08\xae\x00\
+\x00\xff\xff\xff\xd1\x6d\x6d\xaf\x00\x00\xb4\x10\x10\xe6\xae\xae\
+\xae\x00\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xea\xbd\xbd\xfb\
+\xf4\xf4\xae\x00\x00\xaf\x00\x00\xba\x22\x22\xeb\xc1\xc1\xff\xff\
+\xff\xcb\x5a\x5a\xda\x8b\x8b\xff\xff\xff\xaf\x00\x00\xff\xff\xff\
+\xba\x22\x22\xaf\x01\x01\xbf\x32\x32\xc6\x48\x48\xe8\xb7\xb7\xf8\
+\xea\xea\xfa\xf0\xf0\xfb\xf2\xf2\xff\xfe\xfe\xb0\x02\x02\xc7\x4c\
+\x4c\xb7\x1a\x1a\xb0\x04\x04\xbb\x26\x26\xbb\x27\x27\xb1\x05\x05\
+\xbf\x33\x33\xc0\x35\x35\xc2\x3b\x3b\xc2\x3e\x3e\xc4\x44\x44\xb1\
+\x06\x06\xb7\x19\x19\xc8\x4f\x4f\xc9\x52\x52\xca\x57\x57\xcb\x58\
+\x58\xcb\x59\x59\xcd\x61\x61\xce\x62\x62\xcf\x66\x66\xd0\x6a\x6a\
+\xd3\x74\x74\xd4\x75\x75\xd6\x7b\x7b\xd7\x7e\x7e\xd7\x81\x81\xdc\
+\x8f\x8f\xe1\x9e\x9e\xe1\x9f\x9f\xe2\xa2\xa2\xe4\xaa\xaa\xe5\xab\
+\xab\xe6\xb0\xb0\xe7\xb1\xb1\xe7\xb4\xb4\xb2\x09\x09\xeb\xbe\xbe\
+\xec\xc4\xc4\xf0\xd0\xd0\xf2\xd4\xd4\xf2\xd5\xd5\xf4\xdb\xdb\xf5\
+\xde\xde\xf5\xe0\xe0\xf7\xe4\xe4\xb2\x0b\x0b\xf9\xec\xec\xb3\x0e\
+\x0e\xb6\x15\x15\xfc\xf7\xf7\xfe\xfb\xfb\xfe\xfc\xfc\xb6\x16\x16\
+\xb6\x17\x17\xdc\x97\x3c\x09\x00\x00\x00\xb6\x74\x52\x4e\x53\x00\
+\x01\x01\x03\x04\x04\x05\x08\x08\x09\x0a\x0a\x0b\x0b\x0c\x0d\x0d\
+\x0e\x0f\x0f\x13\x13\x14\x15\x15\x16\x1b\x1b\x1c\x1c\x1d\x1e\x1f\
+\x21\x24\x25\x27\x27\x2a\x2b\x2c\x2d\x2e\x2f\x32\x36\x36\x39\x3b\
+\x3c\x3d\x40\x41\x44\x45\x48\x4b\x4c\x4d\x4e\x4f\x50\x54\x54\x55\
+\x5a\x5c\x5d\x5d\x60\x61\x63\x65\x67\x67\x68\x6b\x6c\x6c\x6d\x70\
+\x71\x73\x78\x7c\x7e\x80\x81\x83\x84\x8a\x8b\x8c\x8c\x8d\x91\x93\
+\x95\x95\x95\x96\x98\x99\x9c\x9d\x9e\xa4\xa6\xa7\xa7\xa8\xa8\xa9\
+\xaa\xac\xad\xad\xb0\xb3\xb3\xb4\xb7\xbb\xbc\xbd\xbd\xc0\xc1\xc4\
+\xc6\xca\xcb\xcc\xcd\xcd\xd0\xd2\xd4\xd7\xd8\xd9\xdb\xdc\xdc\xdd\
+\xde\xe0\xe1\xe4\xe5\xe6\xe7\xe8\xe9\xe9\xea\xef\xf0\xf0\xf1\xf3\
+\xf3\xf5\xf6\xf6\xf7\xf7\xf7\xf8\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
+\xfd\xfd\xfe\xfe\xfe\xa0\xb1\xff\x8a\x00\x00\x02\x61\x49\x44\x41\
+\x54\x78\x5e\xdd\xd7\x55\x70\x13\x51\x14\xc7\xe1\xd3\x52\x28\xda\
+\x42\xf1\xe2\x5e\xdc\x5b\x28\x10\xdc\xdd\xdd\xdd\x0a\x45\x8a\xb4\
+\xb8\x7b\x70\x29\x5e\x24\x50\xa0\xe8\xd9\xa4\x2a\xb8\xbb\xbb\xbb\
+\xeb\x23\x93\x3d\x77\xee\xcb\xe6\x66\x98\x93\x17\xa6\xbf\xd7\xff\
+\xe6\x9b\x7d\xc8\x9c\x99\x85\x14\x52\xfa\x52\x39\x5d\xfa\xf9\x80\
+\x28\xc4\x95\x41\x26\x36\x30\x10\xa9\x19\xd9\x78\x80\xc7\x4e\x14\
+\xed\xaa\xca\x02\x72\xa3\xec\x60\x25\x96\xb0\x1e\x65\x1b\x33\x70\
+\x80\xfa\x36\x09\xd8\x46\x00\xa7\x5e\x17\xbe\xa0\xe8\x68\x19\x96\
+\x50\x7d\xca\xee\x68\x02\xae\xb6\x03\x5e\x9e\x7d\x08\xb0\x8e\x02\
+\x66\x45\x09\x38\x61\xe6\x02\x79\x05\x10\xf9\x3f\x03\x6e\x2e\x01\
+\x25\x47\x2f\x39\xb0\x2a\x34\x90\x0d\x34\x8f\xa2\x7d\x32\x13\xf0\
+\xb3\xa0\x68\x2a\x0f\xe8\x84\x22\xbc\x5c\x97\x05\x8c\x95\x80\x75\
+\x3c\x0b\xe8\x2d\x81\x73\x66\x16\x60\x92\xc0\xdd\xe9\x0a\xc0\xd7\
+\x29\xe0\x36\x0b\x29\x6b\x7c\x37\x05\x90\x8e\x80\xa4\xfd\x8e\xe7\
+\x2c\xcb\x2e\xda\xe7\x2b\x1f\xcd\x3e\xa0\x68\x33\x09\x87\x14\x37\
+\xc9\xbb\xdf\xbe\x47\xb1\x9f\xb4\x71\x85\x40\xd5\x42\x02\x62\x5a\
+\xa8\xfe\xb1\x39\x2a\x37\x0a\x28\x08\xea\xc2\x50\xb4\xa2\x95\x17\
+\x70\xaa\x85\xb2\x6d\xc5\x58\xc2\x3c\x94\xed\xc8\xc7\x01\xca\xa2\
+\x2c\xb9\x27\x07\xe8\x81\xb2\x9b\x21\x0c\xc0\x6f\x8f\x04\x6c\xaf\
+\x87\x30\x80\x60\x14\xe1\x9f\x27\xc7\xaa\x30\x80\xf9\x04\x1c\xbf\
+\xf7\x2e\x71\x5d\x03\x60\xb4\x89\x80\x17\xab\xbb\x96\x70\x07\x46\
+\x59\x91\x8a\xab\xe1\xe2\x55\xd6\x72\x39\x9c\xfd\xbb\x88\x9a\x32\
+\x8f\x6a\x28\x8a\x26\x34\x63\x01\x5e\x16\xa4\x4e\xfd\x6c\xcc\x02\
+\x02\x51\xf4\x74\x51\x6a\x16\xd0\x17\xa9\xe8\xc4\x3a\xc0\x02\x96\
+\x22\x15\x3b\xd7\x9d\x05\x14\x41\xea\xbc\x16\x00\x2c\xa0\x35\x52\
+\x6f\xa6\x01\x0f\x98\x48\x63\xb2\x56\x81\x07\xa4\xdd\x4e\x17\xfb\
+\x6d\x08\xf0\x00\x7f\xda\xae\x1f\x2e\x0d\xea\xca\x13\xf0\x2a\x52\
+\x79\x6a\x4e\x7f\x18\x0e\x4e\xea\x40\xc0\xd9\x08\x30\xb6\x40\x9f\
+\x6e\xed\x2d\xac\x04\x7c\xeb\x05\x6f\x25\xe0\xf6\x4c\xe3\x9a\x9f\
+\xde\xed\xf3\x20\x50\x94\x39\x08\x65\x8f\xfb\x1b\xf7\x26\xfa\x72\
+\x27\x22\x8f\x0a\x18\x8c\xb2\xef\x71\x0d\x8d\xfb\x18\xfb\xf2\xed\
+\x6b\x77\x50\x94\xc6\x82\xb2\x67\xe1\xc6\x73\xe0\xa1\xdf\xaa\x07\
+\x5b\xb2\xff\xc3\xf7\xc2\x35\xad\xb6\x71\xaf\xa8\xbf\x5a\x42\x47\
+\x50\xb6\x16\x45\x37\x12\x46\x82\xb1\xb6\xf6\xe9\x61\xb8\xb7\x1a\
+\x30\x25\xe9\xc0\xef\xe7\xda\x50\x47\x4f\xb5\x44\xc4\x93\x3f\xda\
+\x80\x93\xda\x1f\x39\x13\x73\xff\x65\xfc\x86\x9a\x0e\xd7\x8c\xcb\
+\xf1\xd2\xfb\xc5\x9e\xe0\xac\x72\xc3\x66\x4f\xea\x5c\xcd\x47\xb1\
+\x66\x9a\xf3\x6b\x4d\x71\x70\xa9\x02\xa9\x20\x25\xf7\x17\x09\xba\
+\x39\x39\xea\xb1\x61\x75\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\x53\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x02\xeb\x50\x4c\x54\x45\x00\x00\x00\xff\x00\x00\xff\xff\
+\xff\xff\xff\xff\xbf\x00\x00\xff\xff\xff\xcc\x00\x00\xff\xff\xff\
+\xdf\x00\x00\xe2\x00\x00\xe5\x00\x00\xff\xff\xff\xe7\x00\x00\xff\
+\xff\xff\xd4\x00\x00\xff\xff\xff\xd7\x00\x00\xda\x12\x12\xff\xff\
+\xff\xdd\x00\x00\xe4\x00\x00\xff\xff\xff\xff\xff\xff\xda\x00\x00\
+\xff\xff\xff\xdc\x00\x00\xe2\x00\x00\xff\xff\xff\xda\x00\x00\xff\
+\xff\xff\xdb\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\xff\xdc\x00\x00\xde\x00\x00\xe4\x47\x47\xff\xff\xff\xff\xff\xff\
+\xdc\x00\x00\xdd\x00\x00\xdd\x00\x00\xff\xff\xff\xff\xff\xff\xdd\
+\x00\x00\xff\xff\xff\xdf\x00\x00\xff\xff\xff\xdd\x00\x00\xfa\xd5\
+\xd5\xff\xff\xff\xff\xff\xff\xe4\x38\x38\xdd\x00\x00\xff\xff\xff\
+\xff\xff\xff\xff\xff\xff\xdd\x00\x00\xff\xff\xff\xff\xff\xff\xdf\
+\x00\x00\xdd\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdd\x00\
+\x00\xde\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\xde\x00\x00\xde\x00\x00\xff\xff\xff\xdf\x00\x00\xeb\x70\x70\xdd\
+\x00\x00\xe0\x02\x02\xde\x00\x00\xff\xff\xff\xdf\x00\x00\xff\xff\
+\xff\xf0\x8c\x8c\xde\x00\x00\xff\xff\xff\xdf\x00\x00\xff\xff\xff\
+\xdf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xde\x00\x00\xff\
+\xff\xff\xec\x75\x75\xdf\x00\x00\xe8\x51\x51\xde\x00\x00\xf9\xdc\
+\xdc\xff\xff\xff\xde\x00\x00\xdf\x00\x00\xff\xff\xff\xde\x00\x00\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf5\xb2\xb2\xff\
+\xff\xff\xdf\x00\x00\xff\xff\xff\xdf\x00\x00\xdf\x00\x00\xde\x00\
+\x00\xde\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\x71\x71\
+\xde\x00\x00\xff\xff\xff\xe3\x27\x27\xde\x00\x00\xde\x00\x00\xfd\
+\xf4\xf4\xf0\x87\x87\xff\xff\xff\xff\xff\xff\xe3\x24\x24\xff\xff\
+\xff\xe3\x1f\x1f\xff\xff\xff\xfa\xd9\xd9\xff\xff\xff\xe2\x1a\x1a\
+\xdf\x00\x00\xde\x00\x00\xde\x00\x00\xff\xff\xff\xff\xff\xff\xdf\
+\x00\x00\xde\x00\x00\xea\x5c\x5c\xff\xff\xff\xe2\x1b\x1b\xe0\x0a\
+\x0a\xdf\x03\x03\xde\x00\x00\xff\xff\xff\xff\xff\xff\xde\x02\x02\
+\xff\xff\xff\xdf\x02\x02\xff\xff\xff\xff\xff\xff\xeb\x63\x63\xdf\
+\x00\x00\xdf\x01\x01\xff\xff\xff\xdf\x00\x00\xe0\x08\x08\xde\x00\
+\x00\xff\xff\xff\xec\x6d\x6d\xde\x00\x00\xe1\x10\x10\xf4\xae\xae\
+\xdf\x00\x00\xdf\x00\x00\xff\xff\xff\xff\xff\xff\xf6\xbd\xbd\xfd\
+\xf4\xf4\xdf\x00\x00\xde\x00\x00\xe3\x22\x22\xf6\xc1\xc1\xff\xff\
+\xff\xe9\x5a\x5a\xf0\x8b\x8b\xff\xff\xff\xdf\x00\x00\xff\xff\xff\
+\xe3\x22\x22\xdf\x01\x01\xe5\x32\x32\xe8\x48\x48\xf6\xb7\xb7\xfc\
+\xea\xea\xfd\xf0\xf0\xfd\xf2\xf2\xff\xfe\xfe\xdf\x02\x02\xe9\x4c\
+\x4c\xe2\x1a\x1a\xe0\x04\x04\xe4\x26\x26\xe4\x27\x27\xe0\x05\x05\
+\xe5\x33\x33\xe6\x35\x35\xe6\x3b\x3b\xe7\x3e\x3e\xe8\x44\x44\xe0\
+\x06\x06\xe2\x19\x19\xe9\x4f\x4f\xe9\x52\x52\xea\x57\x57\xea\x58\
+\x58\xea\x59\x59\xeb\x61\x61\xeb\x62\x62\xec\x66\x66\xec\x6a\x6a\
+\xee\x74\x74\xee\x75\x75\xee\x7b\x7b\xef\x7e\x7e\xef\x81\x81\xf1\
+\x8f\x8f\xf3\x9e\x9e\xf3\x9f\x9f\xf3\xa2\xa2\xf4\xaa\xaa\xf4\xab\
+\xab\xf5\xb0\xb0\xf5\xb1\xb1\xf6\xb4\xb4\xe0\x09\x09\xf7\xbe\xbe\
+\xf8\xc4\xc4\xf9\xd0\xd0\xfa\xd4\xd4\xfa\xd5\xd5\xfa\xdb\xdb\xfb\
+\xde\xde\xfb\xe0\xe0\xfc\xe4\xe4\xe0\x0b\x0b\xfd\xec\xec\xe1\x0e\
+\x0e\xe2\x15\x15\xfe\xf7\xf7\xfe\xfb\xfb\xff\xfc\xfc\xe2\x16\x16\
+\xe2\x17\x17\x66\xee\x72\x60\x00\x00\x00\xb6\x74\x52\x4e\x53\x00\
+\x01\x01\x03\x04\x04\x05\x08\x08\x09\x0a\x0a\x0b\x0b\x0c\x0d\x0d\
+\x0e\x0f\x0f\x13\x13\x14\x15\x15\x16\x1b\x1b\x1c\x1c\x1d\x1e\x1f\
+\x21\x24\x25\x27\x27\x2a\x2b\x2c\x2d\x2e\x2f\x32\x36\x36\x39\x3b\
+\x3c\x3d\x40\x41\x44\x45\x48\x4b\x4c\x4d\x4e\x4f\x50\x54\x54\x55\
+\x5a\x5c\x5d\x5d\x60\x61\x63\x65\x67\x67\x68\x6b\x6c\x6c\x6d\x70\
+\x71\x73\x78\x7c\x7e\x80\x81\x83\x84\x8a\x8b\x8c\x8c\x8d\x91\x93\
+\x95\x95\x95\x96\x98\x99\x9c\x9d\x9e\xa4\xa6\xa7\xa7\xa8\xa8\xa9\
+\xaa\xac\xad\xad\xb0\xb3\xb3\xb4\xb7\xbb\xbc\xbd\xbd\xc0\xc1\xc4\
+\xc6\xca\xcb\xcc\xcd\xcd\xd0\xd2\xd4\xd7\xd8\xd9\xdb\xdc\xdc\xdd\
+\xde\xe0\xe1\xe4\xe5\xe6\xe7\xe8\xe9\xe9\xea\xef\xf0\xf0\xf1\xf3\
+\xf3\xf5\xf6\xf6\xf7\xf7\xf7\xf8\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
+\xfd\xfd\xfe\xfe\xfe\xa0\xb1\xff\x8a\x00\x00\x02\x61\x49\x44\x41\
+\x54\x78\x5e\xdd\xd7\x55\x70\x13\x51\x14\xc7\xe1\xd3\x52\x28\xda\
+\x42\xf1\xe2\x5e\xdc\x5b\x28\x10\xdc\xdd\xdd\xdd\x0a\x45\x8a\xb4\
+\xb8\x7b\x70\x29\x5e\x24\x50\xa0\xe8\xd9\xa4\x2a\xb8\xbb\xbb\xbb\
+\xeb\x23\x93\x3d\x77\xee\xcb\xe6\x66\x98\x93\x17\xa6\xbf\xd7\xff\
+\xe6\x9b\x7d\xc8\x9c\x99\x85\x14\x52\xfa\x52\x39\x5d\xfa\xf9\x80\
+\x28\xc4\x95\x41\x26\x36\x30\x10\xa9\x19\xd9\x78\x80\xc7\x4e\x14\
+\xed\xaa\xca\x02\x72\xa3\xec\x60\x25\x96\xb0\x1e\x65\x1b\x33\x70\
+\x80\xfa\x36\x09\xd8\x46\x00\xa7\x5e\x17\xbe\xa0\xe8\x68\x19\x96\
+\x50\x7d\xca\xee\x68\x02\xae\xb6\x03\x5e\x9e\x7d\x08\xb0\x8e\x02\
+\x66\x45\x09\x38\x61\xe6\x02\x79\x05\x10\xf9\x3f\x03\x6e\x2e\x01\
+\x25\x47\x2f\x39\xb0\x2a\x34\x90\x0d\x34\x8f\xa2\x7d\x32\x13\xf0\
+\xb3\xa0\x68\x2a\x0f\xe8\x84\x22\xbc\x5c\x97\x05\x8c\x95\x80\x75\
+\x3c\x0b\xe8\x2d\x81\x73\x66\x16\x60\x92\xc0\xdd\xe9\x0a\xc0\xd7\
+\x29\xe0\x36\x0b\x29\x6b\x7c\x37\x05\x90\x8e\x80\xa4\xfd\x8e\xe7\
+\x2c\xcb\x2e\xda\xe7\x2b\x1f\xcd\x3e\xa0\x68\x33\x09\x87\x14\x37\
+\xc9\xbb\xdf\xbe\x47\xb1\x9f\xb4\x71\x85\x40\xd5\x42\x02\x62\x5a\
+\xa8\xfe\xb1\x39\x2a\x37\x0a\x28\x08\xea\xc2\x50\xb4\xa2\x95\x17\
+\x70\xaa\x85\xb2\x6d\xc5\x58\xc2\x3c\x94\xed\xc8\xc7\x01\xca\xa2\
+\x2c\xb9\x27\x07\xe8\x81\xb2\x9b\x21\x0c\xc0\x6f\x8f\x04\x6c\xaf\
+\x87\x30\x80\x60\x14\xe1\x9f\x27\xc7\xaa\x30\x80\xf9\x04\x1c\xbf\
+\xf7\x2e\x71\x5d\x03\x60\xb4\x89\x80\x17\xab\xbb\x96\x70\x07\x46\
+\x59\x91\x8a\xab\xe1\xe2\x55\xd6\x72\x39\x9c\xfd\xbb\x88\x9a\x32\
+\x8f\x6a\x28\x8a\x26\x34\x63\x01\x5e\x16\xa4\x4e\xfd\x6c\xcc\x02\
+\x02\x51\xf4\x74\x51\x6a\x16\xd0\x17\xa9\xe8\xc4\x3a\xc0\x02\x96\
+\x22\x15\x3b\xd7\x9d\x05\x14\x41\xea\xbc\x16\x00\x2c\xa0\x35\x52\
+\x6f\xa6\x01\x0f\x98\x48\x63\xb2\x56\x81\x07\xa4\xdd\x4e\x17\xfb\
+\x6d\x08\xf0\x00\x7f\xda\xae\x1f\x2e\x0d\xea\xca\x13\xf0\x2a\x52\
+\x79\x6a\x4e\x7f\x18\x0e\x4e\xea\x40\xc0\xd9\x08\x30\xb6\x40\x9f\
+\x6e\xed\x2d\xac\x04\x7c\xeb\x05\x6f\x25\xe0\xf6\x4c\xe3\x9a\x9f\
+\xde\xed\xf3\x20\x50\x94\x39\x08\x65\x8f\xfb\x1b\xf7\x26\xfa\x72\
+\x27\x22\x8f\x0a\x18\x8c\xb2\xef\x71\x0d\x8d\xfb\x18\xfb\xf2\xed\
+\x6b\x77\x50\x94\xc6\x82\xb2\x67\xe1\xc6\x73\xe0\xa1\xdf\xaa\x07\
+\x5b\xb2\xff\xc3\xf7\xc2\x35\xad\xb6\x71\xaf\xa8\xbf\x5a\x42\x47\
+\x50\xb6\x16\x45\x37\x12\x46\x82\xb1\xb6\xf6\xe9\x61\xb8\xb7\x1a\
+\x30\x25\xe9\xc0\xef\xe7\xda\x50\x47\x4f\xb5\x44\xc4\x93\x3f\xda\
+\x80\x93\xda\x1f\x39\x13\x73\xff\x65\xfc\x86\x9a\x0e\xd7\x8c\xcb\
+\xf1\xd2\xfb\xc5\x9e\xe0\xac\x72\xc3\x66\x4f\xea\x5c\xcd\x47\xb1\
+\x66\x9a\xf3\x6b\x4d\x71\x70\xa9\x02\xa9\x20\x25\xf7\x17\x09\xba\
+\x39\x39\xea\xb1\x61\x75\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x3a\x40\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\xa8\x00\x00\x01\x77\x08\x03\x00\x00\x00\x06\x8a\xf0\xc8\
+\x00\x00\x02\xd9\x50\x4c\x54\x45\xad\xac\xff\xc4\x90\xc4\xe2\x5a\
+\x63\xe6\xc1\xd5\xe9\x9c\xa7\xb8\xb6\xfe\xc8\xc6\xfe\xcb\xcb\xfe\
+\xbb\xbb\xff\xc0\xbe\xfe\xc3\xc3\xfe\xd2\xd2\xff\xd8\xd7\xff\xdc\
+\xdb\xfe\xb3\xb3\xfe\xe2\xe2\xfe\xb0\xae\xfe\xd0\xce\xfe\xeb\xeb\
+\xfe\xf3\xf3\xfe\xfc\xfb\xfe\xdd\x06\x08\xda\x22\x2c\xdc\x0d\x12\
+\xb7\x8f\xd1\xe0\xde\xfe\xea\x5a\x5a\xdd\x09\x0b\xdd\x19\x1e\xfc\
+\xec\xec\xde\x00\x00\xf0\xef\xfd\xe1\x13\x13\xbf\xa1\xde\xbb\xb2\
+\xf4\xe3\x23\x23\xe5\x32\x32\xe6\x3a\x3a\xe6\x41\x42\xcc\xc3\xf4\
+\xe9\x53\x53\xdc\x14\x1a\xbd\x81\xbb\xec\x6c\x6c\xed\x72\x72\xee\
+\x7b\x7b\xf2\x9b\x9b\xf2\xa2\xa2\xd2\x81\xa2\xf4\xac\xac\xf6\xb9\
+\xb9\xfa\xdb\xdb\xfa\xf5\xfa\xfb\xe2\xe2\xdd\x10\x15\xbd\xab\xeb\
+\xfd\xf2\xf3\xe4\x2c\x2c\xeb\x63\x63\xf0\x8b\x8b\xf5\xcd\xd1\xd6\
+\x2b\x3c\xd8\x2d\x3b\xd8\x46\x58\xca\x56\x7b\xd9\x25\x31\xd9\x34\
+\x43\xd9\x42\x52\xd9\x6d\x83\xda\x1b\x25\xca\x75\x9e\xda\x31\x3d\
+\xda\x52\x64\xdb\x1a\x22\xdb\x85\x9d\xb2\xa9\xf5\xdc\xd3\xf5\xcc\
+\x69\x8d\xcc\x84\xad\xcc\x8b\xb4\xbb\xa3\xe3\xcd\x4a\x69\xdd\x50\
+\x5e\xb7\xb0\xf7\xdf\x30\x37\xcd\x5a\x7b\xcd\xa1\xcd\xe2\x1a\x1a\
+\xce\x71\x94\xce\xc0\xef\xe4\xaa\xbd\xcf\x39\x54\xcf\x40\x5b\xcf\
+\xba\xe7\xd0\x5f\x7e\xe8\x45\x45\xe8\x4c\x4c\xd0\xad\xd8\xe9\x6f\
+\x74\xbe\x8a\xc3\xd1\x56\x71\xea\xe6\xfb\xd2\x7a\x9a\xc4\xab\xe3\
+\xd2\x89\xab\xec\x76\x78\xd2\xcb\xf7\xc5\x83\xb4\xee\x8f\x91\xef\
+\x81\x81\xf0\x84\x84\xf8\xcb\xcb\xd3\x44\x5c\xf1\x93\x93\xd3\x53\
+\x6d\xd4\x35\x49\xd4\x4b\x62\xd4\x69\x84\xf4\xe2\xe9\xf5\xb3\xb3\
+\xe0\x0b\x0b\xd4\xc2\xeb\xf6\xd8\xdc\xf7\xc3\xc3\xd5\x62\x7b\xf9\
+\xd4\xd4\xc8\xbd\xf3\xd5\xa5\xc8\xd6\x27\x37\xbe\x9a\xd5\xd7\x49\
+\x5d\xd4\x5a\x73\xca\x86\xb2\xcb\x74\x9b\xf8\xc5\xc5\xd6\x39\x4c\
+\xce\x80\xa6\xcb\x61\x85\xcd\x9a\xc4\xdf\xa8\xc0\xd3\x9a\xbe\xcb\
+\x7a\xa2\xe4\x79\x84\xd4\x4e\x67\xd5\x40\x54\xe6\x73\x7c\xc4\xba\
+\xf4\xe6\xc6\xda\xe7\x6a\x70\xe7\xb8\xc9\xc5\x66\x92\xe8\x5e\x60\
+\xe8\x84\x8c\xc5\x73\xa1\xcd\x92\xbb\xb6\x9b\xe0\xcd\xb0\xde\xeb\
+\xad\xb7\xeb\xe2\xf4\xc5\x8a\xbb\xd7\xb5\xd8\xcd\xac\xda\xc5\xa0\
+\xd5\xed\xa3\xaa\xcd\xba\xea\xce\x55\x76\xc6\x5c\x86\xc8\x92\xc1\
+\xd9\x59\x6d\xf0\xac\xb1\xc8\xb3\xe8\xd9\x87\xa1\xf1\x9e\xa1\xc0\
+\xb6\xf4\xb9\x87\xc6\xf2\xbf\xc5\xda\x29\x35\xc2\x9b\xd3\xca\x5c\
+\x81\xf4\xe9\xf1\xd0\x6d\x8d\xdb\x4b\x5a\xd0\xa6\xd0\xca\x64\x8c\
+\xdc\x3a\x46\xc2\xa2\xda\xde\x98\xaf\xd1\x8d\xb1\xd1\xc5\xf1\xb9\
+\xa6\xe9\xd2\xbb\xe5\xd2\x9d\xc2\xcc\xa5\xd2\xde\xb1\xcc\xd3\x74\
+\x92\xe1\x3c\x42\xe3\x48\x4e\xcb\x9d\xcb\xe4\x64\x6d\xe2\x4e\x56\
+\xc4\x7b\xac\xcb\xb2\xe2\xd4\x31\x44\xbf\x94\xce\xbc\x9c\xdb\xca\
+\xa8\xd8\xd5\x93\xb4\xcd\x45\x63\xc5\x6c\x98\xb9\x8e\xce\xd0\x6f\
+\x90\xc4\x7f\xb0\xda\x3d\x4c\xb7\xab\xf2\xda\x73\x89\xf4\xc6\xcb\
+\xca\x6c\x93\xd8\x78\x92\xd4\x70\x8d\xc3\xb2\xec\xec\x92\x97\xec\
+\xd3\xe3\xf6\xde\xe3\xc5\x88\xba\xd1\x86\xa9\xe1\x82\x92\xf8\xd3\
+\xd5\xe1\x9b\xaf\xe1\x9c\xb0\xd3\x2e\x42\xd0\xaa\xd3\xdb\x93\xac\
+\xdb\xc7\xe9\xe2\xdb\xf7\xc7\x79\xa7\xdb\x61\x74\xe1\xbd\xd5\xd1\
+\x46\x61\xe4\x54\x5a\xc9\x7e\xa9\xd2\x3a\x52\xe8\xcf\xe2\xc2\x95\
+\xcc\xbd\x3d\xa6\xd0\x00\x00\x37\x22\x49\x44\x41\x54\x78\x5e\x94\
+\x5d\xe3\xa3\x6d\xbb\xae\x5f\x5f\x06\xa7\xb5\x8c\x6d\xdb\x38\xb6\
+\x6d\xdb\xb6\x8d\x4b\xdb\xb6\x6d\x1b\xcf\xb6\xed\xf7\x17\xbc\x36\
+\x0d\x9a\xb6\xf3\xec\xfb\x32\x30\xc7\x39\x9f\x7e\x3b\x6a\x92\xa6\
+\x59\x13\x8d\x46\xb3\x21\xd4\x33\x4f\x51\x98\xc7\x5e\xe6\x06\xc2\
+\x9f\x1c\x1e\xf3\xae\xeb\xc2\x5c\xf6\xd7\x7e\xd5\x79\x5e\x0b\x55\
+\x95\x79\x95\xf6\x2a\xcd\xaf\xa2\xb6\xbd\xe1\x81\xbb\xdd\xc6\x17\
+\xd1\x04\xde\xe6\x32\xb7\x7d\x14\x35\x9a\x4d\x0b\xb5\xc9\x48\x0d\
+\x4c\xc1\x09\x1f\x44\xb9\x45\x57\xd4\x16\x2a\x80\x74\x6f\x86\x59\
+\xd9\x57\x89\x77\x09\x28\xe1\x3b\xa0\xb6\x80\x84\x87\xde\x02\xb6\
+\x6b\x91\x9a\x4b\x93\x05\x69\x51\x36\x89\xa3\x8c\x14\xa0\xf6\x0a\
+\x26\x00\x68\x2e\x8b\x37\x37\x2f\xe0\x26\x22\x65\xac\x15\x20\x23\
+\xa4\xfc\x12\x94\x02\x55\xa1\x14\xa8\x70\x75\x3d\x84\xd3\xee\x87\
+\x50\x32\x4e\x07\xd5\x62\xec\x99\x87\x05\x2f\x84\x38\x9d\x0a\xe4\
+\x9a\xa1\x55\x55\x02\x5f\xe1\x42\xcc\x4c\x22\x7a\x7a\x29\x98\x5d\
+\x80\x08\xfc\xc4\x6f\xf3\xd5\xf5\x44\x6f\x2f\x0f\x29\x0a\xbc\x41\
+\x52\xef\x11\x53\x73\x50\x51\x44\x59\xd7\x80\x95\x18\x5a\xe5\x16\
+\x68\xe5\xae\x4a\x31\x34\xa2\x76\x3b\x33\x44\xf2\xcf\x80\xab\x88\
+\xb4\x0b\x00\x01\x62\x2c\xfa\xd0\x9a\x0a\x78\x03\x4a\x78\x31\x59\
+\x84\xcc\x49\x03\xba\xce\x45\x4b\xf3\xaa\x26\x9c\xc0\x55\xd4\x4e\
+\xf3\x25\x5c\xcd\x32\x10\x37\x7c\x65\x1e\x3f\xb3\x0c\x65\x0e\x60\
+\x01\x24\x50\x37\x30\x26\x43\xc8\x50\x11\x7e\xd1\x13\xa3\x6f\x30\
+\x47\xf9\x05\x1c\x35\x6f\xa0\x9c\xde\x15\xca\xbf\x34\x1c\xa5\x4b\
+\x11\x8b\x3d\x03\x8c\x09\x1d\xed\x76\x01\x30\x1a\x13\x21\x26\x1d\
+\x4d\xb9\x27\x23\x6f\xf8\x70\xc2\x17\x9e\x8a\x73\xaa\xdd\x6f\x0e\
+\x97\x11\x3d\x19\x93\x98\x3d\x72\x52\xc3\xcd\x58\x53\xdb\xb1\x92\
+\x12\x47\xe1\x01\x07\xd5\x15\x83\x6a\x92\xe4\x9b\xca\x3d\x59\x96\
+\xba\x47\x48\xbc\x28\xfe\xb2\xdc\xf3\xdc\x09\x1d\x59\x4a\x30\xe1\
+\xb7\xaa\xc4\x90\x18\xa1\xe1\x2a\x50\x3b\xd3\x48\xbb\xe4\x9d\x62\
+\x1d\x05\x27\xca\x68\xc5\xe8\x41\x3f\x01\xab\x46\x8a\x9c\x25\xbe\
+\x16\x06\x65\x85\x1c\x05\xfd\xb4\xf0\x1c\xd8\x5a\x98\x29\x18\xf9\
+\xdb\x82\x6c\xdb\x9b\xd9\xda\x15\xd3\x07\x90\xf4\x9a\x4e\x19\x53\
+\x4f\x7c\xbd\x05\x0b\x62\x17\x1d\x65\x63\xd2\xc2\xd7\xeb\x52\x69\
+\x11\x03\x4c\xb8\x2b\x73\x31\x3a\x7e\x80\xa3\x68\xfd\x9a\xa5\xa2\
+\x9f\x11\x47\x09\x6a\xec\x49\xc1\x90\x64\x01\x45\xf7\xe4\x50\xb2\
+\xe8\x11\x68\x2e\xa2\x07\x69\x03\xcc\x94\x8a\xb2\x5b\x02\x9e\x66\
+\x4a\x43\xb5\x2d\x85\x40\xc5\xdd\xdb\x0b\x17\xa4\x1e\x72\xd4\x17\
+\x7d\x8d\x70\x59\xec\xc0\x50\x54\xd3\xca\x88\x9f\x78\xa9\x04\xcf\
+\xfe\x29\x63\x96\x66\x4c\x6d\x65\xf9\x5d\xb8\x49\x41\xbb\x91\x1f\
+\x25\xac\x42\x80\x17\x48\x61\xcd\x79\xbd\x17\x99\xc3\x0f\x9a\x53\
+\x55\x3b\xab\x27\xb0\xf0\x1d\x53\x1b\x31\x02\x47\x05\x25\x3a\x7c\
+\x44\x1a\xc5\x25\xca\x92\x88\xa1\x12\x96\x68\xca\x91\x9f\xf6\x8d\
+\xbe\x34\x17\xc1\xa3\xf4\x79\x0d\x0d\x9c\x13\xf9\xd0\x8c\x89\x25\
+\x2f\xb6\x84\x3a\xda\x0e\x84\x3f\x8d\xc6\xa4\xa3\x12\x40\x09\x70\
+\xc9\xea\x1b\x8e\x9b\x68\xf4\xa2\xa6\x20\x75\x74\xf6\x39\x30\x14\
+\xf8\xa9\x38\xaa\xbc\x53\x66\x6e\x7b\x39\xfd\x7c\xfb\x51\x67\x31\
+\x47\xc5\x3d\xbd\x94\x31\x01\x89\x9e\x5a\xa2\x30\x4f\xcc\x3e\x87\
+\xa7\x66\xd1\x13\x54\xa2\xca\x3e\x3e\x59\x8c\x62\xf2\x80\x90\x19\
+\xba\xe2\x97\x4f\x2f\xff\xbd\xc5\xc5\x1f\x35\x30\xdc\x63\x96\x2a\
+\x66\xe2\xcf\x34\xeb\xa8\x8a\x9f\x7a\x40\x18\xe6\x11\x4c\xc4\xea\
+\x0b\x1f\x03\x67\x85\x15\x97\x7c\x21\x34\x26\xc2\xea\xd8\x79\xeb\
+\x65\x7b\x46\x8b\x8e\x0e\x2b\xfd\x10\x0f\x71\xb2\x23\x8d\xe3\x51\
+\xa1\x1e\x42\xb5\x30\x5d\xb4\xe7\xa1\xe4\x98\x94\x3c\xbe\xc0\x44\
+\xef\x54\x05\x30\x2b\x01\x59\x66\xee\x3e\x7f\xfd\xa2\xd0\xcd\x4d\
+\xe0\xa7\x04\x25\x14\xe2\x27\xdc\x53\xe0\xf2\x99\xa3\x8c\x50\xa0\
+\xe2\x2d\x4b\x28\xad\xf6\xc4\x50\x67\xfb\x08\x12\xde\x9a\xb2\x72\
+\xf9\x53\x8b\x3e\xad\x19\xa8\xa8\x59\x8c\x3e\x62\x29\x58\x12\x43\
+\xed\x21\x4f\x0b\x5c\xf3\x7b\x70\x19\xac\x80\x10\x43\xd1\x42\x2c\
+\x49\x67\x23\xd6\x97\x32\x47\x61\x51\x52\x3a\x6a\x9f\xa7\xa7\x14\
+\xce\xd1\xfe\x61\x2a\xc2\x4f\xaf\xf5\x9a\xa1\x05\xf2\x14\xf5\x13\
+\x6d\x89\x29\x47\x5b\xa2\x74\x84\xd9\x59\x29\xc9\x2b\x8e\x3e\x7d\
+\x96\x48\xff\x70\x87\x6f\x76\xcb\x8e\xc3\xb6\x1e\x30\x5f\x57\x19\
+\xa0\x19\x61\x9c\x50\x09\x1e\x39\x7c\xb4\xa7\x26\xc5\xf7\x82\x15\
+\x90\xe2\x12\x8a\x30\x45\x49\xc5\xe6\x49\xf2\xb5\xc7\x4f\x73\xb9\
+\x20\x9f\xc3\xa6\xaa\x7c\xfb\xe2\xe8\x1b\x35\x1a\xfd\xcf\x00\xe6\
+\xe6\x85\x41\xab\x32\xea\x7a\xe6\x9a\x4d\xc3\x3e\x02\x25\xb0\x88\
+\x36\x4e\xef\xd8\xe6\x65\x0d\x35\x18\x1d\x47\x25\x28\x01\x80\x51\
+\xb2\x0c\xaf\x5c\x59\x3d\x46\xf8\x10\x3b\xdf\xf8\xa5\xbb\x3e\x37\
+\x35\x7f\xf4\xd4\x68\xb4\xaa\x8f\x2c\x3d\xdf\x02\xdd\x3c\x6c\x64\
+\x48\x8d\x06\xc1\x9c\xc0\x47\x74\x34\xe0\xaa\x4b\x96\x15\xd4\x1e\
+\x7b\xfc\x84\x31\xb9\x24\xc4\x3c\xe8\x9e\x04\xa5\x76\x4c\xe5\x19\
+\x2f\x82\x0b\x72\x7e\xe8\x85\xdc\x39\xa7\x0f\x5b\xa0\xab\xff\xee\
+\xd6\xe7\xbf\x7a\xd4\xd9\x97\xbd\x78\xef\xd9\x5f\xfd\x76\xdb\x13\
+\xbd\xb9\xd3\xf1\x68\xda\xe1\xcb\x32\x8a\x3c\xed\x31\x37\x73\x90\
+\xbc\x35\xaa\x1c\xd7\x26\xed\xa0\x6a\x5a\xa0\xaa\x4f\xbf\xa8\x8c\
+\xe6\x8e\x19\xc7\xd1\x3f\x5e\x0c\x68\xee\xb8\x73\x55\x56\xdf\xd6\
+\xf1\x68\x9b\x34\x94\x96\xd0\xa6\x06\x0a\x2f\x61\xaa\xcf\x51\x5c\
+\xe1\x41\x07\x48\x49\x73\xc9\xec\xd0\x9a\x96\x9f\x0c\x30\x98\xa5\
+\x9b\xfa\xce\xea\x57\xec\x09\x91\x8e\x56\xe7\xed\x8c\xc5\xae\x63\
+\xbc\x50\x47\xa3\x15\x14\x74\x14\x73\x7a\x6d\x4e\x94\xdb\x81\xc3\
+\x87\x5b\x17\x4b\x48\xf8\x47\x3b\x89\xaf\x9c\xdd\xbc\xf9\x2a\xeb\
+\xdf\x37\xf6\xd1\xea\x6f\x9d\x5b\x0c\x69\x7b\xed\xfb\xa6\xb1\xf1\
+\x28\x46\x24\x02\x14\xdd\x53\xc0\xce\xf7\x3f\x7f\xd7\x15\x3d\xa8\
+\x92\x60\x18\x9a\xe7\x90\xd9\x6b\xb9\x13\xce\x8b\x00\xe7\xba\x1d\
+\xc3\x7e\xb3\x91\x3f\xbc\x7a\xf1\xaa\x7d\x04\xb4\xbc\xf1\xa4\xfd\
+\x96\xc7\x7b\x56\xae\x5a\xb3\x6e\x16\x9c\xea\x85\x7d\x01\xda\x65\
+\x55\x65\xd2\x05\x08\xe5\x9b\xd8\xea\x71\x05\x7d\xff\xb6\x23\xd7\
+\x1b\x0e\xad\x1a\x48\xa5\x04\x90\xe6\x58\xd5\xb9\xe0\xb9\x8b\x9e\
+\xbd\xe8\x97\x4f\x38\x8e\xe6\x16\xed\x89\x16\xc0\xed\xc3\x99\x1c\
+\xfc\x53\x79\x4b\xbf\xe3\xd6\x79\x78\x17\xa7\xfd\xcf\x17\x07\xfd\
+\x4e\x67\xa6\xd9\x7c\x78\xde\x0a\x7f\x58\x8b\x86\x8a\x82\xb6\xbb\
+\xda\xa0\x08\x24\xfe\xaa\x95\x09\x60\x6d\x9b\x74\xba\x34\x9a\x5b\
+\x28\x0a\xd4\x50\x20\xe7\x98\x7e\x7c\x0f\xaa\xdd\xdc\x29\xe8\x42\
+\x0d\x81\x5b\xdf\xda\x5a\x71\xe3\xe7\x3f\x7a\xeb\x09\xa7\x3f\xff\
+\xde\xe5\xfe\xe2\xe4\xd1\xb7\x2d\x4b\x97\x01\x50\xb5\x2c\x49\x68\
+\x72\x48\xf7\xc4\x1c\xfd\x26\x29\xfd\x68\xf4\xee\x16\x31\x94\xa8\
+\x3e\xc3\x5b\xb9\x47\xb3\x05\x09\xff\x5e\x31\xa3\x91\xfd\x19\x9d\
+\x73\x23\x85\x79\x4f\x1f\x7e\xcc\x72\x0a\x9b\xff\xf5\x78\xcb\x82\
+\x2b\x87\xa5\x30\x94\x0b\x3a\x49\xd1\x7b\x2e\x1f\x82\x7b\x0a\x4a\
+\xec\xf3\xa7\x82\x64\x63\x3f\xcf\x61\xbd\x27\x98\xef\x38\x5a\x9b\
+\xc5\x8e\x1c\x79\x7a\x46\x64\x31\x73\xff\x04\x1c\x05\x1e\x5e\x78\
+\xca\x59\x59\x76\xee\xaf\x8e\x5a\xef\x24\xb1\x73\xe0\x67\x77\x6c\
+\x47\x71\x98\x17\x97\x9e\x70\x09\x05\xac\x17\x5b\x30\x93\x6f\xdd\
+\xbf\xe8\x94\x54\x60\xe6\xf5\x0d\x23\xc6\xb1\x6c\x19\x78\xf2\x3e\
+\xad\xf6\x27\x46\x48\x2f\x7c\x0f\xf0\x74\xb9\xc3\x3d\x3f\xc5\xce\
+\xeb\xe0\xb0\x6a\x67\x5e\x72\xa7\xd7\xcf\xb6\x02\xca\x72\x77\x84\
+\x25\x1d\x27\xfc\xde\xe5\x7f\xbf\x63\xf7\xb0\xff\x1a\x0b\x64\xa1\
+\x47\x09\x09\xa8\xe8\xe1\x0e\xc2\xfe\x3f\x5f\x18\xf4\xaf\xff\xa9\
+\xfd\x7c\x3c\xc7\x20\xbf\x3c\x4e\xfe\x11\x0f\x39\x8f\xb4\xb9\x61\
+\x65\xff\x07\x81\x17\x9d\xda\x3e\x6c\x20\x4c\x0e\xf0\x83\xca\xb3\
+\x88\x1e\xee\x66\xe0\x49\x29\xb9\xeb\x39\x47\xfa\x0a\x8b\xe3\xc1\
+\x16\xc0\x24\xba\xc2\x0a\x6e\xf6\x85\x61\xbf\x61\x60\x7f\xc0\x02\
+\xd8\xd2\xaa\x2a\x84\x9a\xbf\xf1\x83\x5b\xb6\xef\xb8\xf3\x91\x07\
+\x06\xfd\xf7\xfc\x0d\xb0\x7b\x50\x5a\x3a\x59\xe1\xbc\x6a\xf7\x00\
+\xfc\x3d\x33\xb4\x8b\x0b\x52\x4c\x41\xfd\xa1\xa0\xb5\xbe\xd0\x25\
+\xb2\xb5\x73\xb0\xbe\x00\x37\xc9\xe6\xeb\xc7\x7e\x7a\x70\x61\xd0\
+\xc9\xf3\x1b\xcf\x3c\xfd\xb5\x20\xec\xd9\x7e\x55\x8a\xd7\xaf\xf2\
+\xda\x65\x4d\x7b\x17\x21\xa0\x83\xea\xc3\xf9\x02\x73\xf2\xb6\x07\
+\x06\xad\xb2\x2d\x40\x4d\x0e\xda\x25\x63\x4a\xc5\xa3\x51\x94\x07\
+\x69\x88\xc3\xca\x75\xdc\x63\xac\x90\x07\x06\xa5\x8f\xb5\xd1\x32\
+\xcc\x3c\xf3\x17\xcc\xa1\xf9\x21\x55\xa0\xce\x3a\xff\xd5\x1c\x91\
+\x7e\x1d\x6c\xee\xc0\x10\xbc\xd3\x59\x7b\x16\xe7\x6f\x3b\xb8\x79\
+\xd3\x6d\x3b\x76\xef\xea\x14\x92\x31\x8b\x41\x71\xf0\xf4\x92\x0e\
+\xbf\xc0\xb5\x1e\x55\x14\xa2\x67\xb8\xef\xb7\x40\xf6\xf5\x1c\x44\
+\x11\xff\x13\x5f\x52\xb2\xdc\x59\xd4\x50\x26\xfb\x80\xf1\xe4\xd7\
+\x3c\x01\x01\xe9\xad\xc7\x38\xe3\xde\xdd\xcf\xc0\x91\xee\xbd\x64\
+\x61\x00\xf1\x17\x96\x71\xb9\x92\xdb\x05\xd9\x8b\x7e\xa6\x45\xaf\
+\xa2\x12\x4c\xeb\x54\x75\xf4\xbb\xa8\xa4\xc0\x4f\x96\xfe\xf7\x0c\
+\x20\x9f\xee\x6e\xb9\xfa\xe8\x09\xa0\x81\x27\xde\xf3\xba\xa7\x70\
+\x39\x18\xdd\x36\xcc\x33\x8b\x14\x88\xb7\x46\xb2\x92\x2d\x5e\x72\
+\x3b\x4a\xee\xe2\x4a\x89\x4e\x46\x5c\x1e\xfa\x9b\xbf\xff\xac\x4e\
+\xee\x46\xa4\xa4\x9e\x96\x5e\x30\x85\x99\xcf\xec\xe6\xad\x77\x5e\
+\x08\x4a\xea\x2a\x7a\x2f\x63\xe8\x8c\xb3\x99\x61\xed\x81\xb1\x96\
+\xc8\x51\x4f\x49\x55\xe0\x6c\x50\x2b\xa0\xd1\x96\xd8\xc5\x4f\x5e\
+\xf0\xbe\x8b\x0d\xae\xed\x06\x36\xc2\x64\x25\x05\x98\x44\x6b\x27\
+\xc1\xfd\x6c\xde\x3d\xec\xb4\x1a\xc5\x5d\xe6\x7b\xfd\xd0\x19\xd2\
+\x72\x8d\x73\xe5\x9d\xc3\x1e\xae\x4c\xee\x41\x69\x03\x5f\xe1\x9b\
+\xcd\x9e\xd7\x25\xf3\xf9\x52\x79\xfd\x2d\x9f\x3c\xc6\x09\x0b\x60\
+\xf5\x84\xa3\xa0\xa4\xa3\x85\xc2\x07\x7a\xba\x05\xb1\xea\x91\x61\
+\xc3\xe6\x4a\x4f\x80\x2e\x1e\x7c\xec\xba\xbd\x46\xf6\xd5\xbc\x44\
+\xa3\xa3\x75\x0f\xee\xea\xe7\x94\xdd\x59\xc2\xdd\x06\x45\xac\xa5\
+\x13\xe4\x48\x85\xb4\xe8\x9b\x86\x97\x0f\x1f\xb7\x5e\x99\x46\x83\
+\xac\x5e\x3c\x29\x21\xad\xcd\x6d\x19\x3a\xbf\x7b\x60\xff\xa3\xfa\
+\x8d\x49\xc0\x65\xa3\xac\xd3\x0c\x57\x4f\x37\xe6\x73\xd5\xea\xfd\
+\xfb\xd7\xdd\xbc\x75\x61\x57\xab\xa6\xea\x13\x70\x95\x44\x0f\x37\
+\x9b\x12\xe0\xa4\x5d\x11\x7a\xd2\x79\x7d\xf3\x55\x41\x54\xbb\x75\
+\xc6\x4f\x95\xd1\x93\x8a\x7b\xba\xd1\x65\x6a\x36\x7a\xae\xce\x9c\
+\x12\x7d\x7c\xb4\x61\x84\x7f\xc3\xcd\x3b\x87\xcd\x56\xa7\xd3\xea\
+\xe5\x54\x25\x13\xc1\x13\x47\xc1\x94\x32\xcd\x52\x85\x34\xad\xa3\
+\x88\x53\xe8\xc0\x12\x30\x94\x3d\x29\x2c\xf7\x39\xd3\xbb\x20\x3a\
+\xbe\xbe\xce\xdf\x70\x03\xb0\x13\x69\xfd\x42\xcb\xba\xcf\xbc\x97\
+\x73\x2d\x4f\x28\xcb\xd8\xf0\x41\x3f\xe1\x42\x94\x8c\xd3\x7c\xcb\
+\x5a\x1f\xeb\xe8\x93\x0e\xe7\xfc\xcd\x5b\x1f\x7d\x61\xeb\x95\x50\
+\x6f\x19\xfa\x1c\x7d\x0c\x94\xb4\x27\x46\xff\x06\xa7\xc9\x5f\x3b\
+\x62\xca\x33\xef\xf5\x9b\x76\x0e\x73\x48\x9b\x21\xab\x57\x48\x7d\
+\xbb\xa7\x4d\xc6\x4c\x6b\x28\xd7\x47\xa3\xb5\x9e\xdd\x68\x6f\x19\
+\x18\xd0\xd6\xe1\xd2\x4c\xd3\xb8\xa8\x2f\x1b\x54\xab\x86\x45\x41\
+\xf5\xdc\x1c\x95\xb4\xe9\xb1\xf4\x3e\x6d\xda\x5b\xd6\xaf\xbb\xfb\
+\x71\x93\x7d\xd4\x5c\xc6\xab\xec\x55\x97\x42\x82\x54\xf6\x98\x32\
+\x65\x4e\x2c\xfa\x90\x38\x65\xfa\x4d\xf0\x23\x0b\x03\xfb\x5d\x18\
+\xa4\xe7\x2d\xee\x79\x74\x48\x69\x93\x5e\xee\x89\x7e\xbe\x07\x02\
+\x6a\xc7\xca\x8d\xfb\x96\x8a\x7e\xab\xa8\xad\xcd\xfb\x65\x9d\x40\
+\xf2\x58\xc6\xe7\xed\x30\xb5\x19\x2a\xdb\x37\xdd\x08\x28\xc7\xf7\
+\x47\x1a\x18\x53\x3b\x87\x16\x26\xac\x4e\xb7\xbc\xef\x81\x5d\xba\
+\x82\xef\x94\x34\x5f\xfe\xb2\x67\x26\xe7\x4f\x82\xbd\xd0\x4f\xfc\
+\x68\xd1\xe1\x5c\xb6\xf1\xb0\x61\xab\x76\x05\x9d\xaa\x74\xaf\x52\
+\xa0\x0a\x33\x19\x26\x60\xa3\x5f\x5e\x95\xba\xe8\xf0\xbb\x00\x18\
+\x49\xd7\xf0\xbf\x35\x67\x38\x33\x3b\xb4\x3a\x80\x64\x3f\xd4\xde\
+\x32\x28\xe9\xec\xbc\x83\x76\x5b\x03\xd6\xa6\x27\xdf\xb6\x6e\xcd\
+\x4f\xae\xf9\xf8\xae\xa5\x26\x55\xca\x4a\xfb\x01\x18\xe9\xf2\x4c\
+\x8a\xb7\x41\x4b\xf7\xab\xc5\x2e\x85\xbc\x74\x21\x17\x6e\x58\xcb\
+\x77\x0c\xdc\xe6\x32\x52\x61\x6f\x66\xe9\xbb\x9e\x65\x75\x04\x1d\
+\x40\x67\x5a\xb4\x3a\xcd\x46\x4f\x2a\x7a\x75\x49\xc2\x47\xb6\x2a\
+\x8b\xf7\x77\x42\x33\x78\x48\xee\xba\x09\x42\xa0\xea\x42\x2e\xaa\
+\xe8\x9d\x1d\x17\x3f\x29\xa4\x00\xf2\x86\x67\xe6\x75\x66\xb1\xb3\
+\x9f\xe3\x6e\x98\x6a\xd6\xb0\x46\x54\x0b\x4a\x8d\xb4\x24\xa0\x60\
+\xf3\x8c\x30\xf3\xc2\x51\x00\xa9\xb2\xa6\x30\xc2\x7f\x12\x38\xda\
+\x81\x22\x3e\xd1\xe5\x27\x3d\xf6\x70\xcf\xc2\xfc\xda\x48\xa1\x9c\
+\x9f\xdd\x3a\xec\xf7\x20\xb1\xcf\x0b\x5d\x23\xb3\xbf\x65\x45\x84\
+\x20\x2b\x56\x52\x14\xbd\x28\x40\x68\xf4\xdd\x20\x6b\x12\xa3\xa2\
+\xc2\xd3\x77\x60\xa5\xee\xcb\xb6\x48\xaf\xb8\xda\x18\xf5\x89\x1d\
+\xe3\xf0\xef\x1b\xc9\xc2\x3d\x3f\xbb\x65\xe7\xb0\x3f\xd3\xe0\x30\
+\x9f\x8b\x4f\xf6\x26\xa0\x22\x77\x36\x25\x78\x89\x31\xc1\x0d\xec\
+\xf4\x63\x12\xe5\x9d\xda\x69\xf7\x64\x45\xbb\x72\x09\x34\xd4\x81\
+\xbd\x7a\xbd\xc5\xb6\xaf\x59\x14\xaf\x23\x79\x9f\x83\x20\x11\x25\
+\x3c\xb5\x47\x95\x88\xbe\x64\xb0\x0a\x2a\xb9\x27\xe1\xa8\xc7\x54\
+\xde\xb9\x83\x8f\x71\x65\xc7\x3f\x84\x32\x4c\x0b\xf9\x59\x7c\xf7\
+\xcb\x73\xb0\x00\x0c\x0d\xd0\xcb\x8d\x7e\x1e\xff\xd6\x2d\x3b\x07\
+\x4b\x9d\x06\x78\x51\x42\x4a\xdc\x14\xaa\x70\xd7\x8e\xc0\xaa\x45\
+\x94\x8c\x09\xe0\x91\xd5\xc7\x1b\xf6\x91\x86\x4e\x73\x84\x0f\xfe\
+\xe9\x21\x28\x5b\x7c\xff\x5b\xbd\xc6\x77\x5e\x75\x1c\x26\x18\x0f\
+\xbd\x30\xb4\xe6\xf4\xa1\x37\x9a\x64\xb2\xd3\xc0\xfd\x86\x00\xa9\
+\x7b\x4a\x2c\xe7\x61\x77\x0e\xa4\x75\xf0\x28\x0d\x45\x33\x02\xb8\
+\x98\x85\xa4\x71\xb6\x13\x56\x8f\x57\xe3\x31\x0a\x2a\x24\x36\x19\
+\x6d\x1d\x36\xf5\x5e\x83\x20\x05\x53\x8a\x38\x5a\xd6\xdc\xf8\xc0\
+\x18\x2b\x96\x3c\x00\x25\xd9\x3b\x8e\x66\x71\x3c\xaa\xeb\x8e\xba\
+\xb1\x00\x5e\xe7\x2c\x06\xb4\xe6\xf1\x61\x8b\x20\x4a\xcd\x59\xb1\
+\xd4\xdb\x65\xc2\xce\x07\x44\x0b\x38\xb5\xc3\xa7\x95\x49\xb4\xd3\
+\x92\x4a\xeb\x39\xc2\x8f\x3b\x75\xfc\x12\xd9\xc7\x14\xcc\xd5\xdb\
+\x4d\x69\x41\x73\x53\x65\x4c\x96\x22\x7e\x52\x37\x51\x4d\x1a\x0a\
+\x38\xc5\x96\xd0\xdf\x67\xa2\xa6\xf1\x16\x23\x2f\x4e\xe3\x77\xee\
+\x3e\xb9\x9f\x50\xae\x3a\x68\xec\xbb\x09\x05\xbd\x90\xa7\x92\xd7\
+\xe3\x25\x30\x81\x2a\xe4\x28\x1b\x53\x15\x59\x53\x96\xd1\x2a\x0f\
+\xfc\x65\xd1\x23\xdc\xe4\x6e\x83\xce\x41\x9b\x6f\xbe\x7b\xe3\xc6\
+\x4d\x07\x77\x98\x6a\x52\x93\x3a\xca\x98\x04\xa4\x92\xbd\x90\x34\
+\xbe\x40\xed\x21\x82\x09\x37\xb0\x51\xae\x52\x5b\x93\x94\x74\x92\
+\xc6\xa4\xa8\x35\x33\x03\xc8\x99\x9b\x0d\xda\x68\xd2\xb2\x67\x94\
+\x9a\x70\xbb\xbe\x2a\x45\x49\x85\x9f\x2c\x7b\xbd\xcc\x97\x58\x78\
+\xf2\x9a\x4a\xe2\x1a\x7e\x5c\x29\x91\xa0\x44\xc2\x3c\xa1\x9a\x2f\
+\x59\x3d\x0b\xf6\xf7\x68\x4d\xd2\x9d\x17\xb6\x40\xf0\x4b\xc1\x14\
+\xa2\x08\x3f\x1d\x8f\x2a\xac\x02\x53\x6f\x84\xe6\x82\x8f\x36\xeb\
+\xe1\xd2\xed\x8e\x28\x7a\xba\x3c\xca\xbc\x9e\xa2\x44\xbf\x23\x32\
+\x51\xfd\xb4\x3d\xff\x04\x38\x83\x5d\x50\x07\x53\xda\x47\xf5\x36\
+\x38\x35\x42\x8c\x93\x7a\x55\xd9\x07\x41\xd6\x9a\xa1\xa0\xa4\x6d\
+\xe6\x68\x92\xc4\x87\xc6\x05\x88\x40\x4b\x7b\x08\xb7\x30\x17\x48\
+\x5f\x70\x52\xd7\x28\x77\x96\x08\xe2\xaa\x62\xab\xb7\xdf\x2c\x76\
+\xc2\x9c\xb1\x7b\x2a\x69\xed\x04\xbc\x21\x53\xc7\xaf\x4c\x7a\x9f\
+\x09\x75\x94\xf7\xc2\x74\x3b\x11\xf4\x8f\x32\x3e\xe5\x9e\x2a\xb8\
+\x4a\x04\x6a\x11\xea\x4e\xd7\x36\xbe\xb3\x52\xf0\x65\x8a\x93\xa2\
+\xa4\x09\x6a\x46\x9b\xa1\xb2\x7b\x47\x85\x47\xd1\x51\x7b\xe7\xac\
+\xa9\x45\x91\x0a\x49\x80\x91\xc0\x61\x0f\x25\x1b\x7b\x09\xcc\xa4\
+\x4e\x52\x88\x4c\x05\x2a\x5f\xd1\xe6\xcd\x34\xea\xa8\xaa\x3a\x02\
+\x35\x02\x25\xad\xf1\x45\x1c\xe5\x1e\xe7\x42\x47\xf8\xd2\x39\x9c\
+\x68\xca\x04\x80\xe0\x4e\xa9\x40\x96\xb0\x79\xb5\x2d\x12\x17\x72\
+\xd1\x75\xba\x08\x9f\x37\x1b\xe2\x1e\xe7\x3a\xd6\xce\xdc\x13\x3d\
+\xf7\x91\x51\x6c\x02\x97\x47\x80\xd2\x01\x0e\x31\xa2\xf0\x59\x49\
+\x35\xe9\x8d\x06\x78\x73\xda\xa4\x76\x6c\x69\x1b\x5c\x50\xc2\x43\
+\x70\x75\x76\xc7\x62\xaf\x6b\x95\x2f\x65\x28\xf1\x64\xa3\xeb\x04\
+\xde\x02\x52\x73\x54\x59\x53\x51\x30\x4f\x0d\x46\xf3\x08\x4b\x45\
+\x51\x2d\x4c\x81\xaa\x71\x02\x36\x88\x4c\x04\x64\x9d\x6a\x77\x2c\
+\xd3\x2e\x5f\xdc\x28\xfc\x26\x5a\xde\x84\x40\xea\xc8\x4f\x6c\xd4\
+\x02\xdd\x74\x0f\x5e\x8e\xab\xa0\xa3\xd1\xb9\x06\x30\xfd\x9a\x20\
+\x46\x59\x28\x94\xc4\xa9\x92\x57\x0a\x3b\x25\x9d\x4f\xd5\x75\x02\
+\x5b\xe2\xe6\x51\x92\x7d\x44\x0c\xb2\xce\xfd\x0e\x88\x92\x8c\xc9\
+\x57\x51\x78\x2b\xb3\x07\x4b\x02\x37\x1a\xf7\x63\x33\x64\x42\x19\
+\xaf\xf5\xc0\x55\x61\xa7\x18\xbc\x94\x1f\x74\xf7\xa0\xbc\x74\x34\
+\x4a\x1c\xc5\x64\x04\x81\xc6\x8b\xbd\x4a\xef\xe2\x45\x29\xf6\xa4\
+\xa1\xe8\x0b\x7c\xa0\x4e\x86\x15\x7c\xc1\x49\xbf\x04\x98\x48\x15\
+\x20\xd8\x39\x55\xe2\xee\x85\x50\x37\xd5\xaa\xc4\xd2\x57\xeb\x53\
+\x2a\x5d\x16\x12\x93\x4a\x72\xd4\xf7\xa7\xfc\xa1\xa1\x02\x91\x6e\
+\xd6\x31\x4a\xf9\x48\x49\x1d\x10\xa6\x33\x7b\xcc\xed\xd8\xdd\x5b\
+\x88\xa8\xa5\x88\x56\x88\xd7\x7a\xf7\x26\xb2\xa0\xd1\xe8\x49\xde\
+\x74\x0a\x03\x38\x2b\xe8\x32\x4f\xec\xca\x37\x95\x7e\xd7\x53\x8a\
+\xa1\xd3\xe1\x7e\x3d\x8b\x1f\x2e\xe0\xac\x8e\x45\xc1\x99\xe2\x8a\
+\x24\xf6\xa4\xe2\x12\xdf\x8c\xea\xb4\xe0\xe1\x8a\xce\x08\x09\x50\
+\xe4\x67\xc8\x51\x45\xc4\x50\xca\x97\x84\x72\x56\x50\x8a\xf3\xc2\
+\xe4\x8e\xac\x5e\xae\x04\x58\xc1\xe9\x70\xeb\xc5\x9e\x1d\xe9\xa1\
+\xdb\xdb\x85\x9f\xda\x96\x30\x22\x09\xda\xdb\x45\x07\x38\xb8\xa7\
+\x57\x2a\xc2\xcf\xda\x5e\xe8\x9c\x0e\x45\xe9\x15\x10\xad\xf4\x68\
+\xea\xa8\x9e\x80\x13\xff\x87\xa1\x86\x1f\x8f\xb2\x97\xd2\xba\x5a\
+\xe2\x8b\x78\x89\x77\x50\x1a\x0f\xdc\x53\x49\x76\x1f\x83\x8d\x9a\
+\xb1\x05\xa7\xb8\x27\x87\x91\x20\x36\x24\x70\x16\xa4\xc2\xd2\x42\
+\xbb\x52\x11\x3d\xac\x4e\xc2\x4c\xbd\x84\xea\xf5\x53\x3c\x7d\xd2\
+\x95\x4e\x8b\xe8\x63\x3d\xa5\x48\x4f\xf5\x8e\x4a\x2c\x2a\x50\x35\
+\x4e\x0f\x69\x85\xa2\xaf\xb5\x72\xf2\xaf\xc2\x7b\xc8\x46\x9d\xc8\
+\x94\x50\xd6\xcc\x51\x9f\x1c\x52\x12\x7b\x1a\x66\x70\x48\xa8\x4a\
+\xe4\xa0\x9e\xe0\x43\xb9\x13\x4f\x63\xa8\x0d\xed\x48\x7b\x08\x17\
+\xfd\xa8\x40\xad\xa3\x65\x94\x6f\x8d\x95\x71\x92\x13\xad\x62\xaf\
+\x9f\x54\x4e\xd5\x8e\x1b\x53\xea\xf8\x45\x41\xbe\x54\x13\xb5\x65\
+\x32\x52\xfa\x12\x9c\x64\x4d\x5e\x72\x57\x7b\x6b\x91\x58\x13\xfb\
+\xfc\x90\xa5\x11\xa5\x39\xea\x4c\x5e\x4e\x0b\xe1\xe5\x91\xc4\xa3\
+\x31\x2f\x45\xf4\x08\x14\x9e\xf8\x80\x98\x68\x67\xe2\x00\xeb\x38\
+\x0a\x63\x51\xdf\xe3\x17\x72\xde\x92\x97\x4e\xfc\xc0\x28\x2f\xc2\
+\x2b\xa2\x27\xf1\x87\x82\x47\x2f\x9a\xce\xed\xd3\x52\x9f\xe6\x54\
+\x44\xa3\x05\x98\x12\x98\x68\xaa\x95\xf0\xe3\x45\x49\x5e\x88\xb6\
+\xf2\xc5\xdf\x26\xac\xc4\x4e\x7e\x4f\xa4\x81\x8e\x5f\x99\xe4\xec\
+\x4d\x4f\x67\xf5\x12\x34\x49\x5e\x2f\x4b\x68\xec\x45\xeb\x14\x4b\
+\xdb\x1c\xe5\x27\xad\xe9\x10\x1c\x85\x5b\x05\x25\xe8\x9f\xe0\x1d\
+\x87\xa3\x79\x8d\xa0\x31\x38\xd1\x3a\xca\x58\x2b\x78\x02\x94\x0e\
+\x9f\xb2\x7d\x71\xf8\x87\xe4\x68\x4c\x64\x4c\x31\x47\xc9\x90\x88\
+\xa7\xf0\x0e\xd9\x2a\xc2\xaf\xf4\x5a\x2f\x2a\x10\x1b\x53\xda\xec\
+\xd3\x6b\x3d\xf3\x13\xcc\x1e\xef\x98\x28\xa9\x8b\x32\xd1\xb2\x14\
+\xa6\xf2\x86\x7d\x1c\xe6\x89\xe0\x15\xcc\xd8\xe8\xd3\x7e\x54\x83\
+\x25\xa4\xee\x75\x8b\x57\xcc\x8b\x30\xea\x42\x49\x29\x77\x2a\x1a\
+\x95\xf3\xf5\x78\x4b\xdc\xcc\xfe\x3e\xbd\x17\x1a\x55\x72\xf5\x15\
+\x14\xc6\x59\x3f\x51\x0d\x04\xaf\x6c\x83\xfb\x71\x53\x25\x58\x35\
+\x57\x05\xa6\x66\xea\xf8\xf3\x4c\xc2\x4e\xc1\x2a\x20\x75\xc6\x9c\
+\xf3\x52\x9f\x0a\x4a\x2a\x08\x98\x08\x27\x20\x56\x06\xc5\x62\xd7\
+\x09\x09\x92\x62\x29\xfc\x26\x0f\xb5\x08\x44\x85\x14\x50\x22\xd4\
+\x5c\x4a\x7a\x3e\xcc\x20\xbb\x2b\xc9\xa2\x38\xb9\xab\x12\xf1\xbd\
+\xc0\xa4\x97\xf2\xa5\x63\x8b\x64\x4c\x92\x2b\x93\xcb\x27\xe1\xcb\
+\x81\x2b\xf0\x50\xb9\x64\xf6\x01\xd1\x22\x4f\x1f\x1a\x24\x3f\x2a\
+\x74\x8e\x65\x1f\xbb\x54\xda\xb8\xd3\x3a\xca\x87\x03\xd1\x90\x98\
+\x10\x1f\x97\x1e\x85\xa7\x60\x48\xc2\xd1\x32\x26\x02\xa8\xa3\x91\
+\x38\x6a\x86\x57\xca\xea\x79\x09\x2d\x84\xab\x3d\x8c\x48\xb4\x31\
+\x49\x2e\x4f\xfe\x29\xd4\x51\x0c\x9f\x88\xa7\xc2\xe0\x76\x60\x4c\
+\xa1\x6f\x4a\x6f\x8a\xa4\x83\x12\x01\x8b\x28\x1d\x43\xb7\xcd\x9f\
+\x7c\x52\xa3\xc8\xd5\x09\x31\x92\x3a\x7c\x85\x35\xe7\xf4\x29\x5b\
+\x11\x39\x6b\xa8\xe4\xcc\x41\x40\x0a\x37\xe7\x23\xd3\x52\x1f\x4d\
+\xa4\xcb\x54\x24\x5b\xfb\x39\xbb\xcb\xfc\xc1\x46\x78\xda\xb2\xe0\
+\x1d\xf0\x42\x2f\xa1\xbc\xc5\xcc\xbb\xa0\x55\x00\x58\x6c\x3e\xb4\
+\x7a\x25\xf9\x76\xcc\xd1\xc8\x9c\x0a\x00\x0a\xce\xe9\x58\xb7\x1d\
+\xde\xc7\x42\x2e\x9f\xb9\x23\xb4\xbe\x1b\x2d\xf9\x06\xab\xc7\xae\
+\x0d\x0f\x29\xaf\xf3\x82\x36\xb2\xfa\x34\xce\x69\x0e\x4a\x84\x7a\
+\x00\x16\x39\xfa\x8f\x8b\x96\xce\xdb\xdd\xc7\x14\x14\x80\xfa\xbb\
+\x22\x4c\xc2\x4e\xb1\xf6\x38\x28\x01\xa0\x5e\x8c\x1f\xc5\x79\x41\
+\xcf\x78\x3b\x88\xf0\xe3\x68\x14\x9b\x89\xfe\xcd\xf2\x73\xd3\xbe\
+\xa5\x1e\xc0\x44\xd1\x73\x6a\x1f\xc3\xac\x18\x2c\xbc\x75\x3b\x11\
+\x82\x44\x94\xfc\xa1\x84\x3f\xd6\x3f\x05\x82\xc7\x62\x0e\x6f\x86\
+\x9d\x64\xb7\xc4\x77\x75\xa4\x88\x5f\xa3\x49\xd5\x29\x37\x2a\xce\
+\x5e\xf8\x2a\x6c\x55\xc6\xa4\xf3\xfa\xd8\x96\x22\x8e\xb6\x7c\x96\
+\x16\x08\x56\x36\x6d\x6d\xaf\xc1\xca\x81\x3e\xba\x0c\x9a\x29\x0b\
+\x53\xa1\x22\x7c\x78\xe8\x5b\x3a\xf3\x62\xeb\x97\xd0\x24\x61\x4e\
+\xf0\x95\xce\xeb\xb5\xe8\x01\x64\xcf\xfa\x26\xab\xa2\xbb\x1b\xfe\
+\x12\xea\xa5\x4d\xc0\xda\x20\x17\xf1\xfd\x3d\x4a\x1f\x49\xe2\xa6\
+\xf1\x79\x3d\x8b\x5f\x9d\x0c\xe4\x63\x42\x1a\x26\x00\xc5\x54\xe4\
+\x6a\x77\x84\x4a\xf6\xeb\x83\xe8\x9e\xa9\x0c\xda\x89\xf0\x57\x82\
+\x12\xc1\xaa\x33\x91\xb4\x86\x26\x2a\xce\xad\x56\xe0\x9e\xf4\x78\
+\xa2\x29\xdb\x42\xdc\x47\x98\xf0\xca\xe1\x85\x2a\x9a\xee\x29\xa0\
+\x10\x5f\x93\xb6\x79\xb8\xd3\x05\x9d\xf4\xbc\xa7\x98\xa4\x36\xda\
+\x70\x5d\x64\x2b\x87\x80\x53\xf5\xe8\x58\xae\x26\x49\x71\xb3\x4e\
+\x54\xc5\x03\x96\x96\x41\x22\xe2\x7e\xc2\x28\x8f\x3a\x20\xe2\x7c\
+\x99\xe0\xfe\x40\x94\x14\x91\x3a\x2a\x38\xcd\x47\xc8\xa5\x2e\x92\
+\x0a\x51\x41\x5f\x62\x92\x30\x38\x89\x1d\xbe\x72\xa3\xe9\x02\x44\
+\x11\x8c\xd0\x02\x8f\xbf\xb5\xa3\xfa\x9e\xdc\xb9\xab\x74\xe5\x01\
+\xb0\x62\x47\xd9\xd8\x15\x1f\x39\xaa\x1c\x14\xd9\x3c\xde\xb1\x1f\
+\xb5\x2a\x1a\xa4\x4b\xea\x94\xed\x1e\xe8\x6a\x2d\x42\x96\xd2\x18\
+\x00\x41\x5b\xaa\x28\x9f\xca\x0f\xda\x94\x10\xa0\xd8\x51\xa9\x94\
+\x54\xb0\xb6\x63\x8e\x2a\xa3\xd7\x11\x3e\x7c\xd8\xa0\x64\xdd\x40\
+\xb8\x89\x48\xbd\xa9\x54\x85\x40\xad\xb0\x43\x4b\xf2\x26\x79\xda\
+\x71\x8c\x5f\xa6\xa3\x3c\x0d\x76\x5a\x38\x9a\x36\x26\xc7\xd0\x27\
+\xad\xd9\xcf\x0e\x91\x9f\x62\x4e\x32\xb5\x40\x2f\xa1\x25\x3c\x20\
+\x74\x6e\x70\x1f\x9f\x30\x87\x86\xaf\x58\x1a\x59\x7d\x0b\x1f\x01\
+\x2a\x11\xa9\xeb\x2c\xdc\x3e\x28\xc4\x37\x01\xa1\x8e\x86\x8a\x5a\
+\x09\x44\x29\x3a\x56\xc9\x6c\xb9\x8c\x4d\x49\xe7\xa1\x01\xd6\xd4\
+\xd6\xb2\xa8\xe8\xd3\x23\x00\x3a\x7b\x3d\x00\x65\x6e\xe2\x71\x60\
+\xf2\xfa\x9a\xd2\x85\x27\x5f\xee\x29\x98\xb2\xce\x27\x19\x3a\x0d\
+\x79\x7d\x94\x87\x16\x04\xf7\x95\x73\x38\xa5\xc3\xf3\x4f\xcc\xd4\
+\x90\x9d\x62\xe8\xfc\x23\xad\x3a\xa4\x9b\x48\x64\x46\xd1\x72\xcf\
+\x2c\x8d\x37\xc4\x62\x12\xb0\xc5\x7f\x3b\xa0\x53\xfb\xd8\x94\x04\
+\x64\x2e\xf3\xd3\xf4\xa6\xad\x18\x7b\xcc\xd4\xb6\x96\x7c\x7a\x70\
+\x5e\xbc\x86\x2a\x87\xdf\x2c\x18\xa2\x38\xd2\xf7\x7d\xfc\x00\x9e\
+\x11\x21\x6b\x42\xf1\x53\xef\xa8\x22\xe9\xc3\xaf\xb5\x0f\xad\x54\
+\xaa\x9c\x2c\x3e\x01\x32\x42\xaa\xc5\xae\xf3\x7a\xfe\x2d\xd4\x5e\
+\x68\xef\x5b\x6e\xb9\xa7\x45\x94\xdc\x13\x3c\x2a\x19\xad\xd0\x9a\
+\x58\xe2\x22\xf6\xa4\x67\x2a\x23\x77\x8f\x97\xc3\x9b\x6e\x7e\x11\
+\x90\x8c\x92\xfb\x74\x8e\xc5\xe5\x3e\xea\x75\x35\x97\xe6\x25\xde\
+\xe2\xf1\xe3\x3a\x2e\x82\x64\xc4\x21\xe9\x13\x18\xf1\xf8\x8f\x74\
+\x79\xd4\x71\x15\x97\x7b\x03\x30\x6e\xc5\xd6\x06\x25\x39\x88\x54\
+\x20\xd3\x2e\x54\xf3\x53\x48\x2d\x4a\x11\x47\x23\x88\x64\x4c\xae\
+\xf2\xf4\x15\x77\xac\x8d\x26\xaa\x68\xac\x51\x44\xaa\xf6\xc3\xd2\
+\x2d\x5a\x0a\xb3\x80\x65\xa1\x27\x9a\x72\xa7\x13\x7e\xb4\x47\x65\
+\x1d\xae\x8f\xed\x41\x25\x05\xe2\x11\x10\x45\xbc\x11\x5e\x55\x15\
+\x3e\xd8\x5f\x10\x28\x28\x1f\x18\x80\x83\x57\xf8\x28\x76\xa6\xe3\
+\x51\x89\xf0\x9b\xd2\x98\xc9\xfb\x4c\xe6\x17\x93\x51\x50\xd2\x5d\
+\x34\x77\xd4\xfe\x00\xce\x31\xed\xed\x95\x01\x08\x0f\xad\xf5\x95\
+\x9a\xa0\x25\x7e\x89\xe6\xe6\x69\x76\x2a\x3d\x55\xee\x89\x2d\xde\
+\x81\xf4\x5a\x35\x80\x50\x49\x47\x3b\x1b\x7e\x83\x1e\x1b\x3b\x43\
+\x2d\xcb\xa8\x15\x1f\xde\x75\xb8\x0f\xae\x7c\x69\x16\x6a\x28\xbd\
+\xe2\xf9\xa3\xa1\x31\xe9\xe0\x09\xa4\xff\x3d\x38\xae\xf8\xca\xf7\
+\x17\x82\x93\x43\x66\x04\x5b\xe9\x6c\x44\x69\xa9\x6a\x2a\xd1\x79\
+\x53\x74\x8e\x55\xc7\xa3\x71\xff\x68\x6a\x9f\xc9\xde\x68\x4e\x38\
+\xeb\x61\xcf\x77\x84\x9d\xbc\xd5\x14\xee\x34\x45\xbb\x4c\x71\xda\
+\x34\x2e\xca\x53\x21\x1e\x7e\xa4\xfd\x68\x41\x0c\x15\xb8\x60\x4f\
+\x37\x2d\xe2\x01\xc0\x0e\x67\x20\xb2\xdb\x90\x27\x12\xbc\xd8\x8f\
+\xb2\xa5\x8b\x92\x86\x6b\xfd\x84\x02\x2b\xa4\x37\x1b\xd2\xdb\xf6\
+\x54\x1a\x7f\xcc\x01\xbd\x79\x00\xc2\x0f\xba\xf3\x94\x6e\x0a\x5b\
+\x4b\xd2\xd4\x80\xb0\x37\x8f\x8e\xb3\xfd\xba\xf1\x68\x33\xa1\xa0\
+\xe2\xa2\x78\x36\x11\x9c\x79\x58\xbd\xbb\x0f\x56\x0f\x28\x99\x99\
+\x9a\xa5\xf1\x26\xa3\x40\x95\xea\x43\x86\xef\x2c\x53\xec\x1c\x1b\
+\x8f\x4e\xf3\x86\x98\xc0\x0c\x92\x3b\x6e\x7b\xfb\xe7\x3f\x3a\x6c\
+\xd0\x07\x86\xb2\xf8\x35\x4c\x01\x18\xe6\xca\x71\xa9\x24\xcd\x50\
+\xd9\x0f\x39\xd4\x74\x22\x81\x9b\xde\x66\xa2\xf2\x78\x54\x23\x8b\
+\xcd\x69\xfc\x1c\x67\xf7\xc2\xf3\xcb\x31\x8d\x8f\x47\xd5\x06\x0e\
+\x71\xd2\x37\xfc\x9e\x6e\x7b\xd2\x00\x8b\x78\xdb\x96\x64\xae\x0d\
+\x4a\x62\x66\x39\xff\x1f\x99\xbd\xea\x78\x8c\xfb\x47\x63\xe2\x31\
+\x4a\x8a\xa7\xb2\x73\x27\x3b\x63\x22\x7e\x4e\xe5\x25\x8e\x4a\xda\
+\xbd\x70\x54\x77\x3b\xea\xca\x78\xba\x2d\x53\x8f\x4c\xf4\xb6\x6b\
+\xb1\x7d\x98\xa8\x06\x7c\xaa\x0f\x1f\x5f\x7a\xe8\x34\xa2\xc4\x77\
+\xe5\xc5\xf6\x19\x3c\x08\x94\x6d\x49\x80\x8e\x8f\x47\xc3\xce\xe1\
+\x82\x9b\x72\xa9\x4b\x4b\xb1\x35\x57\xeb\x52\x11\x04\x25\x78\xe4\
+\x8a\xa2\xbd\xa8\x40\x8a\x53\x20\xc0\x41\x65\xee\x56\x91\xf3\xf8\
+\x99\xe8\x41\xed\xa9\x90\x5e\x22\xb7\xd5\xe4\x71\xb4\x96\xd8\xa9\
+\x66\x73\xf2\x4f\x32\x96\x12\x92\xaa\xc1\xe8\x55\x32\x0b\x35\x10\
+\x11\xa7\x0f\xd5\x73\x4b\xc4\xd3\xe9\x74\x3c\x5a\xa8\xa1\x3f\x21\
+\xd5\x61\x54\x02\x4f\x72\x7a\x7b\xca\x43\xb5\xd9\xe4\x65\xaa\xeb\
+\x98\xcc\x3e\xb5\x0d\x8e\x97\x82\x2a\x91\xb3\x3e\xc9\x86\x56\x2f\
+\x77\x6a\xf9\x14\xb4\x31\xb5\x79\xe6\x30\xcd\xf2\x55\xe7\xd6\xbb\
+\x80\xb2\x0b\x34\xbe\xe5\x2d\x91\xdb\xab\x09\xa4\xb9\xbf\x73\x07\
+\x4f\xc8\xd4\x60\x82\xb3\x70\x36\x6c\xd2\xe2\x59\xbe\xf6\x46\x94\
+\x48\x30\xa1\xc4\xe0\x0c\xe3\xbc\xa6\xee\xd2\x61\xff\xc9\x20\x1b\
+\x7a\x84\x37\x0a\x9f\x26\x64\x27\x59\xea\xa0\x92\x8e\x2a\xc1\x67\
+\x3c\x55\x03\x60\x66\xda\x41\x75\xbd\xb1\x2f\xe9\x95\xa9\x99\x5e\
+\x9b\x74\x57\x01\x59\xbd\x3f\x70\x5a\x3c\x54\xdc\x49\x88\x20\xa3\
+\x71\x15\xe9\x69\xbe\xfe\x18\xe7\xe9\xb7\x5c\x1a\xe5\x23\xa0\x9e\
+\xda\xe8\x0b\xde\xaf\x8f\x67\x63\x87\x4b\x68\x28\x77\x40\xc9\x9e\
+\xb4\xc6\x4b\x9d\xad\x4f\xe3\xec\x32\xd2\x53\x2f\x9d\x32\x15\xaf\
+\xcf\xd6\xe9\x31\x4a\xf1\xca\x14\x2e\x4a\x78\xfb\xfb\xf5\x48\x85\
+\x7f\x5e\xa0\x44\x9f\x1f\x13\xc3\x25\x8c\xf0\xf6\x8d\x09\x8f\x04\
+\x9f\x3c\x32\x40\xef\x68\x06\x76\x9f\xd8\xb7\xf3\xc7\x7a\x2a\xe1\
+\x13\x52\x9c\x91\x8b\xac\x8d\xd2\x7a\xf9\xd2\x31\x09\x8f\xc5\x2e\
+\x15\x47\x23\xe1\xff\x16\x9c\xf6\xee\x27\xe2\xd1\x68\xb3\x01\xd7\
+\x7a\x8a\x48\x7b\x08\x53\x82\x27\xae\xe4\x45\x2e\x2a\xda\xaf\xaf\
+\x3d\x98\x99\xaf\xa5\x6d\xb8\x4a\xb1\x24\x1a\xf9\xb2\xc1\xc6\xe8\
+\xe7\x0d\xdb\xc9\x41\x00\x7a\x9c\x2f\x13\x32\x94\x81\xaa\x6d\xf0\
+\x9c\x57\x50\xbd\x15\x26\x47\x82\x6b\x3e\x65\xcd\xc1\x93\xa7\x9f\
+\x40\xb2\x2e\xd1\x14\xef\xee\x3b\x8f\xde\xb8\x7d\x61\xd0\x31\x9f\
+\xf1\x68\x05\x0d\x93\x36\x6d\x81\x95\x7a\x40\x32\x2f\x4c\xbc\x82\
+\x0a\x54\x9d\x92\x00\xbe\xb0\x40\xc6\x0e\x0a\xe8\xd4\x6b\x8f\xba\
+\x36\x8c\xf2\x00\x6b\x33\xcf\x92\x87\xac\x35\x52\x2a\x3c\xf4\x0a\
+\x16\xbb\x6e\x27\x92\x43\x18\xda\x37\x55\x5e\xfe\x41\x0e\x2a\xdc\
+\x0c\x65\xa0\xe7\x6e\x38\xff\x1f\x4c\x95\xf8\x27\x33\x08\x52\xd6\
+\xa6\x36\x7b\x7b\x5d\x71\xd6\xee\x9e\x66\x3b\xf2\xf4\x0f\xe5\xee\
+\xd1\x96\x08\xac\xee\x22\xd3\xbd\x1a\x08\x52\x9f\xbc\x62\xfd\xdc\
+\x70\xef\x68\x84\xc3\xaf\x3c\xab\x77\x77\xd7\xca\x7c\xc3\x17\x0e\
+\x3f\xbb\x54\xa2\x6f\x69\x63\x2a\x88\xa1\x05\x5e\xc2\xd2\x9c\xa7\
+\xf9\xca\x39\x31\x40\x1c\x9e\x67\x2a\x69\xe6\x4f\x5c\x25\x41\xa8\
+\xbf\x2d\x33\x11\x16\xca\x8c\x5b\x20\x1c\x37\x4f\xdd\x70\xd4\xe1\
+\x23\xa8\x74\x0a\x43\xdf\xc9\x8d\x05\xe1\xf0\x34\x22\x6d\x4a\x20\
+\x79\x75\x78\x59\x53\x45\x27\x42\x69\x8a\x7b\x5c\xcb\x03\xab\xbf\
+\x6b\x91\xe9\xc1\x86\x96\x7d\xf7\x0b\x3c\xc4\xeb\x2f\xcb\xb8\x23\
+\x57\x5b\x93\x93\xbc\xb0\x15\x89\x4c\x09\xde\x14\x94\x84\x58\x01\
+\xe8\xb8\x92\x0e\x99\xfd\x5f\xb9\xe9\xb8\x73\xe6\xbd\xb1\xe3\xa3\
+\xec\x76\x7f\xe6\x0d\xf0\xea\x75\xe3\xf1\xc8\x2a\x6e\x26\x05\x05\
+\xa4\xb1\xe8\x45\xe6\x45\x98\x89\x94\xfa\xc8\x00\x2c\xa5\x02\x52\
+\xbc\xe8\xad\xaf\xb9\x7d\xc7\xbe\xc1\xb1\xa0\xa4\x8a\xa3\x13\xa2\
+\x15\x8b\x07\x3a\x8c\x72\x7c\x0d\x3f\x15\x96\x00\x50\xbc\xf3\xc4\
+\xe1\x30\xe9\x7b\xc3\x29\x25\xf0\x1b\x85\x24\xf0\x54\x45\x9e\x65\
+\x5f\x85\x11\x9c\xda\x9a\x4e\xb5\x03\x18\x57\x6f\x5e\x6d\xde\x93\
+\xa2\xa4\xf1\x78\xe4\xa2\x60\xa4\x78\x2b\xd1\x4b\x75\xbc\x8e\x04\
+\x0f\xf8\xc0\xa2\x90\xca\x4f\x6f\xd8\x80\x7d\x3a\x82\xd3\xde\x14\
+\xe6\xfd\x0e\x28\x69\xcf\x83\xd9\x35\x48\x2f\x38\xec\x8b\x4b\xad\
+\x8b\xac\x6e\xec\xce\x14\x47\xd3\xe5\xfb\x18\x66\xa1\x36\x9a\xd8\
+\x9e\x94\x83\x2a\x2b\xda\xbc\xa9\x36\x5c\x61\x6c\x17\x66\x77\x57\
+\x3a\xb5\x93\xa5\xfe\x5c\x54\xd2\x4c\x8d\xff\x98\xb0\xdf\xd3\xa0\
+\xa4\x85\xe2\xa8\x30\x34\x4c\x47\x10\x2a\xa3\xcd\x55\x63\x41\x2e\
+\x1c\xd5\x33\x92\x2d\x3d\x7d\xb4\x9d\x01\x36\x1a\xed\xab\x83\x61\
+\x15\x7e\x40\x92\xdd\x0b\x33\xb9\xa2\xf1\x69\x5d\x43\x53\xa1\x92\
+\x6a\x8c\x85\xdc\x32\x85\xb2\xe7\xf3\x53\x80\x06\xc9\x32\x1f\x60\
+\x05\xa4\x97\xd1\xd8\xdc\x86\x8f\x13\x63\x27\x46\xfa\x72\xa7\xa4\
+\x99\x72\xf8\xf0\x74\x2f\x85\x3e\x26\xd5\x01\x91\x4c\x46\xa8\xee\
+\xa8\x55\x14\x58\x2a\x3a\x0a\x48\x99\x9b\x70\x13\x47\xef\xc3\xa9\
+\xc3\xaf\xef\x28\x97\x1f\xcc\x47\xbe\x16\xb6\xae\xc9\x93\xca\xe4\
+\x17\x03\xf4\x2d\xb0\x67\x94\x29\x8e\xa6\xcb\x64\xc4\x50\xae\x3c\
+\x22\x52\xad\xa3\xb9\xea\xc4\x16\x43\x5a\x31\xb9\x38\x37\x85\x03\
+\x67\x2b\x07\x72\xc5\x0a\x67\x4c\xa8\xa4\x10\x37\x5b\x25\xbd\x66\
+\x46\x80\xf2\x90\x37\x51\x52\xed\xf0\x95\x6a\x8a\xd5\xa7\xdc\x13\
+\xf0\x94\x74\x14\xb5\x34\x97\xe3\x96\x78\x55\x2b\x4e\x5b\x7a\x3d\
+\xcc\x8b\xca\x0d\xc8\xff\xfd\x8f\xc9\xf5\x46\x63\x8f\x3d\x61\x45\
+\x99\x50\xd2\x25\xc8\x44\xbb\x5d\x1e\x50\x04\x61\x49\xa8\xa4\x02\
+\x53\x6b\x6a\xaa\x46\xa6\x9a\x1f\x64\x6b\xb9\xd0\xe7\xd6\x79\x44\
+\xee\x7b\x47\x4e\x49\xff\x6b\x52\x26\x10\xff\x89\x75\xfd\x02\xf5\
+\xe5\x6e\xb9\x67\x86\xe2\x3d\x61\x80\x1a\x25\x1d\x4d\x0e\x26\x3e\
+\xf3\x91\x7b\xa7\xe6\x8e\x59\x11\x0e\x4a\x05\x78\x52\x7b\x12\xc1\
+\x4b\x4f\x09\x22\xd5\x7d\x3a\xc2\x51\x91\x7e\xbd\x02\x66\xab\x76\
+\x2c\x18\xa1\xd7\x03\x50\x42\x7a\xed\xc8\x2a\x69\x4f\x1b\x93\xd1\
+\x53\x52\xd2\x2b\xb1\x5f\x60\x73\x09\x1c\xc5\x08\x8a\x48\x4a\x0f\
+\x52\xc5\x07\x62\xb8\x1c\x3c\xeb\xe2\x78\xc5\xa3\x3f\x2a\x1e\x39\
+\xbe\xfa\x4d\xc1\x6c\xd7\x73\x6a\x51\x51\xe7\x49\x37\x75\xb4\xcb\
+\x87\x22\xc9\x67\x20\x73\x92\xa1\xdc\x13\x89\xde\x51\xd6\x51\xc5\
+\x52\xd5\x54\x02\x6e\x1e\xf5\x54\xac\x1e\xed\x9e\x07\x7d\xc9\x28\
+\xe4\xb9\x75\x77\x6c\xd9\x7a\x60\x19\xb8\x82\x4f\xe5\xa5\xa4\x76\
+\xbf\x90\xe5\xbe\x4b\x50\x27\xa6\x3f\x62\x62\x6a\x9f\x56\x3e\x72\
+\xbd\xf3\xa3\x71\x43\x11\x7c\x44\x89\x08\x4d\x2a\x81\x07\xf3\x10\
+\x86\xfa\x06\x74\xf8\x7b\x9f\xbb\xee\x3a\x54\x52\xc2\x69\x86\xd3\
+\xb6\x8a\xba\x5c\x7b\x0e\xc4\xca\x7d\x96\xbc\x53\x52\x59\xee\x41\
+\x41\x7f\xf5\x94\x96\xc1\xaa\x8d\x97\x2c\xb5\xda\x10\x38\xc7\x5d\
+\x84\xe1\xc0\x69\xed\x9f\xc0\xd7\x03\xd2\xa8\x55\x63\xc3\x87\x8f\
+\x36\x4c\x9b\xdb\x55\xc3\x5a\x8f\x63\xec\xb6\x0c\xd1\xed\x67\xf7\
+\xc1\xea\x9e\xa3\xe8\x4b\xf2\xa4\x3d\xe4\x27\x5c\x24\x73\xc8\x45\
+\x6d\x9a\xd7\xa2\xbe\xa7\xa6\x67\x4f\x85\x84\x4f\xa4\xa3\x31\x4f\
+\x81\xab\x2a\xb3\x43\xb8\x9f\x7e\x0a\xa1\xdd\xd9\x03\x96\x1e\x01\
+\x38\x37\x01\x4e\x58\x99\xf6\x5a\x91\xae\xe9\x78\x39\x3d\x2e\xf7\
+\xdd\x0d\x2f\xbf\xec\xd2\x0d\xb0\x80\x9e\x4d\x9c\xdc\xf4\xa0\x9d\
+\xbb\x4d\x8b\xd3\x98\x52\x1e\xfd\xc6\x1c\x35\xa0\x98\xa3\x05\x49\
+\xbe\xda\xb0\xd7\x02\x7d\xd9\x08\x81\x1e\x9c\xa9\x4a\x56\xd2\xdd\
+\x1d\x09\x9f\xee\xb1\x9d\x34\x43\x1e\x96\xda\xce\xac\x92\x4e\xbe\
+\xed\x70\xd0\xc9\xa9\x7f\xb7\x48\x4f\x9d\x34\xea\xb1\xd1\x80\x6c\
+\x15\xed\x78\x1b\x3c\x79\x6c\x3d\x5d\x2a\xf1\x7b\xb4\x40\xfa\xcf\
+\x5d\x67\x1c\xe5\x29\x4d\x03\xf4\xcc\x45\x04\x7a\x55\x1f\xac\xe9\
+\x1d\xc0\x99\x61\x21\x61\xde\xe9\xa0\x93\x35\xb3\xb4\xab\x8c\x7b\
+\x4b\xb3\x6b\x91\x5e\xdc\xef\xb7\x7a\x89\xd2\xb8\x40\x8c\x5a\xde\
+\x14\x54\x04\xa9\xdb\x35\xaa\x57\x2f\x03\x68\xeb\xfa\xd6\xe4\xef\
+\xdf\x73\xe1\x95\xab\xad\x63\x77\x4a\x0a\x9e\x74\xf5\x50\x46\xa7\
+\xb9\xb4\x6e\xa1\xe7\x18\x6a\x22\x41\x65\xdd\x73\x0b\x2d\xa9\x97\
+\xa4\x67\x8d\xfb\x0e\x5f\xd6\x26\x65\xf5\xb9\x1e\x46\xc7\xc6\x84\
+\x3c\x5c\x36\x04\xff\x54\xf4\x3b\xdf\x70\x4a\x0a\xd5\x87\xc3\x61\
+\x98\x61\x25\x63\x3d\x2d\x03\x47\xc3\xc2\xc0\x5c\x7e\xf6\xdc\x68\
+\xa4\xac\xfb\x8e\x85\x41\x09\x6e\x34\x1e\x57\x91\x5e\x42\x8b\x02\
+\x1f\xed\x47\xa5\xed\xe9\xe7\xaf\x38\x73\xdb\x45\xaf\x00\x98\xf9\
+\x5a\xe2\xc9\xe3\x05\x3a\xd2\x3f\x1b\x81\x92\x8a\x27\xbd\x33\x2f\
+\x89\x56\xcc\xc1\xc0\x79\x23\x7a\xf0\xa0\x40\x68\x38\xfb\x96\x5a\
+\x39\xcd\x75\x4d\x8e\xff\x48\xf7\xe3\x8a\xdd\x93\xec\x73\xb4\xf9\
+\xb5\xdf\x3c\x06\x87\x7b\x9e\x64\xb0\x1a\x03\x32\xdc\x74\xf3\xd0\
+\x6b\x4c\x96\x26\x9d\x92\x96\xe4\x49\xd7\x75\x38\x6c\x86\x3c\xf9\
+\xe3\x4b\xb6\x36\xbe\x9e\xfe\xfa\x84\x05\x39\x98\x29\x64\x84\xbb\
+\x54\xf0\xd3\xed\x44\x5a\xf4\x28\xf8\x86\x4a\x43\x0d\xc1\x04\x6c\
+\xa4\xd1\x6b\xac\xfc\xd7\xfe\xc5\x60\x25\x28\x29\x46\x4f\xb5\xb5\
+\xec\xb9\x61\xc5\x4a\xba\xb8\xa9\xc6\x40\xef\xb5\x4e\x49\x1a\xd6\
+\x83\xbe\xdd\x26\x00\xe7\x5d\x43\x20\x61\xec\xa8\xe0\xec\xf2\x1f\
+\xb7\x4c\x9f\xb9\x13\x1b\x22\x1d\x15\xb9\x7f\xe8\xa6\x7b\x26\xbf\
+\x72\xf5\x7a\xc4\x88\x19\xed\xda\x3a\x37\xe0\x5e\x8b\x4a\xea\x22\
+\xd2\x33\x58\x49\x61\xb9\x37\xb4\xe6\xaf\xf7\x96\x2b\x3e\x7f\xbe\
+\x9b\xf7\x7c\xc7\xd0\x85\x7a\x1b\x3e\xf8\xd9\x7d\xfd\x4e\x51\xea\
+\x02\xa9\xcb\x9c\x20\x30\xd5\x50\xc5\x94\xb4\xf8\x03\x1d\xbd\xfc\
+\xfe\x49\x8b\x6e\x13\x95\x31\xf6\x20\xd2\xd9\x86\xed\xd6\xd8\x26\
+\x4a\x6a\xa0\xee\x05\x25\x6d\x55\x86\x78\xb9\x1f\xb1\x79\x6f\x1c\
+\xb6\x32\x47\x86\xc9\xfe\xc0\xcc\x2e\x2a\xa8\xa3\x64\x07\x44\x9c\
+\xd4\x73\x44\x8a\xb4\x76\xd2\x0f\x11\x6e\x7f\x7c\xd7\xe0\x3d\x6f\
+\xfe\x21\x00\x78\xc4\xfa\xfc\x4f\x24\x95\xd4\x50\xf9\xdc\x62\x40\
+\x07\x86\x33\x3c\xbb\x9f\x07\x93\x65\xac\x9e\xbc\x17\x9a\xee\x24\
+\x6b\x0a\x4e\x65\xf9\x05\xe9\xe8\x05\x9e\x23\xb9\x7d\xd8\x6f\xe5\
+\x96\x8e\x03\xe1\xcf\x58\xa4\xc7\x83\x92\x82\xd9\xe7\x55\x39\x09\
+\x9e\xd4\xc0\xfc\xfc\x5d\x23\x0d\x73\xfe\x8e\x61\x87\x0b\xb8\xe1\
+\x0c\x6f\x44\x8b\x08\xe3\xde\xbc\x56\x28\x76\xb9\x00\xa8\xbd\xd6\
+\x1e\xcd\x38\xef\x1e\xce\xe4\x48\x5f\x83\x2a\x81\x05\x4a\x4a\x5a\
+\xd9\xeb\x0a\x60\xf5\xe6\x1b\xbe\x4e\x7f\x8d\xe9\xa1\xd5\x38\x7f\
+\xd3\xce\x00\xa6\x94\xa9\x1c\x37\xd6\xd3\x5e\xdd\x78\x78\x7f\x58\
+\x19\x2f\xf4\x81\x01\xa2\xcb\xcf\x79\xd3\xed\xae\xa0\x39\xec\xc8\
+\x5f\x42\x70\x07\x49\x8c\x96\xbe\xda\x7e\x1d\xd6\x03\x9c\x1f\x25\
+\x2e\x5e\xf8\x7d\xd4\xcf\x87\xf6\x9d\xf6\xee\xdb\xb6\x3f\xfa\xc0\
+\xb0\x53\x64\x44\x96\x95\xc0\x50\x01\x0a\x0f\x25\x24\xd1\x96\x18\
+\x80\x6c\xc5\x7e\x34\xca\x45\x9a\x2d\xd0\xd3\x4f\x0d\x65\x00\xe9\
+\x13\xa0\x09\x7d\x52\xd2\x75\x1d\xbb\x6f\x73\xc2\xbc\x94\xe3\xce\
+\x81\xa2\xdd\xcd\x3b\x76\x15\x65\x96\xd7\x54\xd0\x29\x4b\xa7\xa3\
+\x6a\xfa\x2c\xf1\x14\x29\xde\x06\x4f\x77\x91\xe1\x1c\x15\x9d\x86\
+\x3e\x03\x15\x85\x7e\xce\x54\x43\x50\xdc\xb7\xb2\x7f\x1d\x20\xbd\
+\xe9\x8c\xfb\x09\x26\x74\xc9\xfd\xcb\x0f\xb6\xec\x30\x2e\xa8\x51\
+\xa3\xbf\xf7\x4a\x25\x24\xf5\x0c\x7f\xd9\x93\x22\x4b\x63\x1d\x6d\
+\x79\xc9\xb2\xb6\xfc\x30\x28\x39\x05\x80\x76\xa4\x25\xf7\x9b\xa0\
+\xb3\x00\xf4\xc7\x2a\x73\xb8\xdb\xc2\xbc\xca\x0c\x7f\xaf\xf2\x3c\
+\x18\x94\x4a\x24\x47\x5a\x44\x4d\x27\x88\xa5\x13\x29\xf7\xa4\xfb\
+\x89\xc6\xc7\xa3\x66\xaa\x3c\xb8\xc1\x19\x89\x9e\x8e\x00\x63\xea\
+\xd4\x96\x5e\x14\x9c\x53\x8f\x3f\x70\xc4\x66\x53\xfe\x9c\xd1\x6d\
+\x99\x99\x7f\xc9\x9f\xeb\x10\x1d\x45\xac\x70\x75\x0f\x1d\x94\x14\
+\x2a\xb1\x57\x7f\x7c\xd7\x8a\x75\xee\x11\x2e\x3c\x1e\x69\x51\xfd\
+\xe7\xae\x9e\x6b\x7d\xf9\x18\xc5\x42\xf3\x3b\x86\x79\xdd\x6c\x24\
+\x6b\xe3\xd1\x9f\xb0\x2f\xc7\xcd\x1f\x4d\x6f\xdf\x8c\x3d\xb6\xae\
+\x07\xe2\x43\xc6\xb3\xfe\x92\x1c\xe8\x1d\x27\x02\xac\xcf\x0e\x6a\
+\xa4\x9b\xd6\x3c\x64\xb2\xa5\x55\x5b\x87\x4b\x05\xef\x87\x6b\xd2\
+\xa7\x42\x01\x62\x6a\xfe\x68\xfa\xfc\x4d\x4b\xa7\x76\x02\x50\x7e\
+\x18\x28\xfe\xfd\x95\x1f\x3e\xb6\xed\x4b\xcf\xe2\x52\x35\x3b\x68\
+\xd5\x4c\xa7\x99\xb9\xd4\x4b\x9d\xc2\x95\xf1\xd3\x27\xac\x43\x46\
+\x66\x63\x1b\xb4\xa2\xf6\xf6\x06\x99\x53\x2c\xff\x70\xd2\xd7\xbb\
+\x9c\x31\x8f\xfc\x05\xb1\x13\x96\x9c\x2b\xda\x08\xaf\xea\x74\xa3\
+\xab\xcf\xd9\x2c\x3a\x6f\xc9\x57\xba\xa7\x24\x92\x7c\xd8\x54\xd2\
+\x80\x18\xef\x78\xc4\x27\x01\x46\x27\x2a\x3d\x01\x58\xfa\xab\xe0\
+\xf6\x43\x13\xfa\xcf\x2c\x71\xe4\xee\x50\xf3\x47\xc5\x3d\x05\x79\
+\x48\xbc\x65\x0f\x4a\x4a\x0c\x1d\xcd\x1e\x66\x56\x29\xcd\x4e\xc0\
+\x2a\xfa\x69\x91\x0a\xd4\x4c\xba\xdb\xb3\x8c\x60\xfe\x3f\xe6\x8f\
+\xaa\xb2\x93\x7f\xb1\x2f\x65\xa0\xa0\xa4\x77\xbe\x7b\xe3\xca\x95\
+\xab\xd7\xdd\xbe\x30\x9c\xe1\x3a\xa9\xae\x39\x3b\x91\xcb\xb0\x71\
+\xbd\x85\x63\xc1\xa2\x7b\x4a\xd9\xfc\xb8\x5e\x7c\xa9\x3e\x68\x0d\
+\x45\xa4\x7a\x32\x36\x28\xe9\xdd\x9d\xbc\xd1\xe9\x77\x66\x1a\xc1\
+\xbc\xe9\x2a\x9a\x3e\x6b\x6f\xe9\x7d\x51\x23\xbc\xc5\xee\x7f\xfd\
+\xf9\xa3\x96\x5a\x0a\xa5\x62\xa9\x20\xad\x9d\x27\x9d\xf5\x17\x51\
+\x9f\x2a\x2c\xe5\x12\xc9\x66\x7d\xdc\x44\x8a\x5c\xcd\x12\x83\xa9\
+\xa4\x2d\x33\x0c\xf3\x30\x72\x4e\xfb\x51\x45\xf5\x33\x26\xd1\xd9\
+\x33\x2c\xb8\xfe\x10\x9e\xaf\xaf\x62\xa4\x95\xc6\xa8\x8e\x08\x65\
+\x89\x39\x35\xda\xdd\xeb\x29\x6f\xcd\xf4\x36\x53\x02\xe9\x36\x6b\
+\x49\x7f\xdb\x90\xbc\x3e\x3c\x80\x81\x30\x65\x76\x7b\xd2\xec\x05\
+\x6a\x3c\x22\x55\x4b\x3e\xfe\x2b\x18\x61\xb1\x24\x6d\xfa\xcb\x2d\
+\xd0\x2d\x1d\x84\xa9\xaa\xce\xfc\x87\x25\x34\x4b\x45\xf2\xd8\x3a\
+\xe8\x9d\x63\x55\xf3\x9e\xb4\xed\x87\xb2\x8f\x39\x4a\xf8\xd8\x8e\
+\xf4\xd4\xe1\x79\xc8\x39\x5e\xf5\xbb\x57\xdc\x94\xe7\xaa\x3c\xca\
+\xc2\xb7\x54\x0b\x57\xd3\xc7\x57\xe5\xe0\x95\x66\x29\x5f\xe3\xfd\
+\x68\x32\x67\x6a\x44\x4a\x6a\x3d\xe9\x9c\xcd\x28\x47\x97\x80\xe4\
+\x73\x0f\x24\xf2\x95\x51\x8a\xc7\x97\x4d\x26\xb6\x7a\xff\xef\xdf\
+\xc4\xcd\x8e\x81\x3d\xa5\x47\x2b\x44\x03\x7f\x04\xec\x13\xdb\x64\
+\x6d\x9a\xed\xa7\x8e\x33\x45\x62\xd7\x27\x9a\x32\xf6\xa5\x6c\x4e\
+\x91\xdd\x8f\x9f\xed\xa8\xa2\xd1\xa8\xdd\x51\xb0\xd6\xf5\xd4\x68\
+\xe4\x25\x79\xa9\x33\x77\x25\xfe\x45\x21\x0d\x56\x4f\xf3\xf5\x54\
+\x34\xd3\xf3\x47\xf5\x21\x0c\x7d\x9e\x29\xb2\x25\xbd\xdd\xa0\x6a\
+\x64\xcf\x73\x40\x32\x5a\xb3\x7d\x38\x43\x38\x8b\xc4\x80\xbf\x0a\
+\xa7\xb8\x07\x6d\x99\xed\xd0\x47\xbd\xe4\xfc\xd1\x43\x8e\xfa\x4a\
+\xeb\x67\x6e\xb2\xfb\xd1\x08\xaa\x5a\x3b\x16\x06\xd7\xf7\xf2\xe8\
+\x28\x9b\x34\x3a\xa2\x6e\x02\x47\x43\x12\xa4\x40\xbf\xee\xfc\x51\
+\xd8\x64\x8a\xfb\xf0\xc9\x43\x31\x4b\x73\x7b\xdd\x74\xe4\xba\x4d\
+\x26\xc7\xe8\xcb\xdf\xe7\xfa\xbf\xca\xce\xdd\x55\xb2\xac\x0a\xe3\
+\xbe\xea\x3c\x76\x75\xdd\xe6\xf6\xbd\xed\x5c\x54\x1a\xbb\x07\xc4\
+\x99\x40\xc5\x69\x1d\x75\x50\x26\x52\x04\x15\x44\xc4\x89\xd4\x44\
+\x06\xf1\x89\x18\x34\x46\x62\x20\x9a\x75\x64\x24\x18\x0a\xc2\x80\
+\x99\x68\x26\x9a\x75\xa0\xe1\x04\x82\x30\xa1\x88\x7f\x83\x5d\xfb\
+\x7c\xac\xc7\xf9\xed\x25\xed\xa9\x5b\x75\x1a\x3a\x59\xac\xbd\xd7\
+\xf3\xf1\xad\x1d\x95\x4d\x2e\xc9\x22\x8b\x4f\x78\x5c\x49\xba\x8f\
+\xe1\x14\xd0\x44\xc4\x71\x1e\x3e\x81\x9f\xb9\xbe\x7c\xfb\xf6\x69\
+\x8e\x86\x49\x1c\x05\xd4\x57\x6b\x40\xf8\x8b\xb8\x79\xd6\xd7\x5e\
+\xe1\x8f\x12\xd7\xf3\xc4\x4e\x57\xf1\x34\x8d\x8a\x5c\x76\x32\xe3\
+\xec\x32\x14\xbe\xce\x9d\xc3\xc0\x6b\xda\x73\xa7\x63\x97\x4a\x3d\
+\xd4\xf8\xa3\x41\x92\x14\x85\x96\x58\x15\x11\xc8\x79\x12\xa5\xf6\
+\xc0\x84\xae\x69\xb0\x65\x3c\x77\x65\xc8\xd8\x52\x4e\x87\x1a\x7f\
+\x94\xe1\xb2\x17\xc2\xe7\x84\x38\x3d\xc7\x51\x11\x14\x6e\x6d\x2e\
+\x94\xa0\xae\xa2\xd6\x31\x8a\x08\xf3\xa6\x04\x44\xe6\x28\xf1\x47\
+\x99\x80\xe0\x70\xbd\xde\xa9\xba\x9c\x79\xca\x93\x77\x28\xaa\xd5\
+\x26\x99\x9c\xaf\x87\x10\xdf\x05\xc7\xb9\xc6\x1f\xa5\xc2\x67\xb0\
+\x5c\xef\xaf\xcf\x1b\x65\x06\xb3\x96\x11\x15\xbd\x98\x61\xe5\x90\
+\x35\x81\x08\x6b\xac\xf1\x5b\xc8\x3e\x68\x4d\x30\x8f\xdd\x4b\x62\
+\x9d\xa5\x9c\xb1\x6e\x24\xd7\xa7\x6b\x9d\x58\xce\xd9\x82\xd2\x74\
+\xf4\x27\x78\x79\xb5\xd2\x4f\x8b\x4d\xdd\x32\x71\x0e\x43\x7c\x64\
+\xb4\x9c\x31\x6a\xe8\x91\xf2\x91\xd4\xe3\xe4\xfb\xc7\x19\x6a\x39\
+\x1d\xce\x82\xbb\xad\x17\x75\x59\x45\x61\x38\xf0\xe0\x98\x9e\x8a\
+\x98\x0f\x0b\x86\x6f\x6a\x8e\xa2\xbb\x5d\x74\xc6\xfc\xc3\x65\x98\
+\x17\x30\x96\x5a\x5b\x09\x9a\x86\x45\xa5\xc8\xb4\x11\x31\x0c\xde\
+\x01\x2c\xb5\x26\x54\x1c\xf5\xb3\x9f\x93\xd6\x8f\xdd\xc3\xa2\x71\
+\xce\x87\xcf\xc7\x85\x29\xba\x79\xa2\x6e\x87\x88\xff\xff\x40\xcf\
+\x92\xa1\xe2\xa4\x84\xdf\x1f\x0d\x87\x61\x2d\x57\xf2\x47\xf2\x1e\
+\x04\x22\xba\x66\xf0\xf6\x24\x4d\x84\xa3\xa2\x7a\x82\x0d\x15\x47\
+\x01\x43\x39\xe7\xe5\x5c\x40\xff\xc8\x92\x8f\x87\xe0\xed\xba\xa1\
+\xcf\x06\x8f\x9c\xb0\x67\x85\x8f\xdb\x7f\x37\x32\x8f\x49\x8f\x8a\
+\xd2\x61\xf7\xb0\xa2\x65\xc1\x64\x6e\xdc\xc5\xa0\x25\x70\x9c\x31\
+\x72\x37\x1e\x65\x2b\xa6\x18\x6d\x67\x07\xcd\xa7\x1f\xfd\xdc\xa6\
+\x1d\x9d\x4d\x74\xae\x46\x22\x60\xde\x00\x00\x11\x79\x9a\xe3\x25\
+\xc6\x4c\xbe\xb8\x3e\x36\x3a\x52\x8d\xba\x7e\x1a\xe2\xe6\xad\xd6\
+\x4a\x76\x7e\x75\xa9\x82\xa9\x27\x50\xaa\xfe\x65\x14\x8e\x13\x7a\
+\x58\x0d\x6e\x01\x93\xc8\x34\xa1\xcf\x4d\x84\x36\xc5\xa8\xe6\x27\
+\x39\x50\xfd\xe3\x6e\x73\x95\x7f\xc8\x60\xa9\xcc\x93\x10\x42\x8b\
+\xeb\x3a\x66\xbd\x33\xa4\xab\x34\xa8\x9b\xd0\xd6\x49\xdd\xab\x51\
+\x3f\xf6\xed\xcf\xfb\xf1\x2f\x28\x4b\x05\x84\x92\x18\x5b\x2d\x36\
+\xa5\xcc\xd3\x84\x6a\xe6\xae\xa3\xbe\xcc\xb6\x87\x11\xf9\xbc\x04\
+\xa2\x04\x66\x8a\x8f\xf1\x93\x9e\x67\xc3\xcd\xbb\x94\x5d\x2a\x3a\
+\x33\x9b\x06\x04\x03\x30\x15\x12\x7a\xf2\x44\x8d\x9b\x75\x26\x9f\
+\x20\x4a\x3a\xf6\xf8\x43\xf5\x94\x9e\x64\xe5\x2f\xf3\x26\x84\xd6\
+\x8f\x5f\x93\x77\xda\x1c\x19\xb2\xa3\x4d\xa7\xcf\x11\x46\xfd\x45\
+\x86\x22\x0a\xd5\x37\x07\x77\x37\xd5\xba\x0e\x89\x7c\x9c\xb9\xd3\
+\xa3\x9b\xa9\x37\x2d\x67\x5b\x0c\xe5\x2d\xce\x2f\xc3\xd4\x8b\xbc\
+\x3a\x0a\x2d\xb6\x04\xa7\x15\x3d\x9e\x2f\x41\x17\xbe\xff\x13\x5b\
+\xf9\x88\x53\x03\x99\xcf\xbe\xa8\x43\x7d\x29\x4f\x92\x57\x49\x21\
+\x41\x3a\x2a\xdd\x04\x33\x8f\x4d\x77\x2d\xaf\x91\x9a\x87\x70\x3a\
+\x74\x9b\xf5\x74\xd2\xdc\x85\x1e\xca\xd2\x60\xbc\xbe\xc4\xc3\xd7\
+\x0c\xa3\x87\xcc\xde\xdf\x1e\x81\xd1\x47\xbc\x74\x81\x0a\x35\x11\
+\xf0\xb5\x5e\x7f\x12\x24\xca\x5e\xe5\xf4\x4d\xa8\x35\xc5\x99\x50\
+\xfd\xf8\x48\x8b\x1a\xc7\xa7\x9c\x76\xf2\x08\x14\x04\x26\xb6\xba\
+\xc5\x87\xb1\x47\x8c\x47\x3c\x7c\xd9\x79\xf3\x9d\x30\x28\x64\x18\
+\xde\x6d\xca\x30\x25\x04\x01\x91\x83\xbf\xae\x69\x2c\xd8\xee\x69\
+\xa2\x92\x63\xeb\x35\x1e\xfe\x25\x86\xc1\xa5\xa5\xb2\xa1\x6f\x3e\
+\x1c\x98\x57\x73\x65\xf4\x7e\x63\xa8\x11\x49\xc7\x99\x00\x10\x22\
+\x35\xe9\xd3\x9b\x72\xe3\x95\xd0\x15\x2e\x15\x33\x61\x67\x64\xb3\
+\xa5\x67\x50\xf8\x21\x06\xa5\x97\x87\x64\x9e\xf4\x14\x00\x55\xe0\
+\x3a\x0d\xf1\xf0\xf3\x9c\x10\xb6\x09\xb5\x16\x6f\x69\x23\xfa\xb0\
+\x52\xf8\x1a\xbc\xc2\x93\x72\xf8\x2c\x89\xd9\x35\xa5\x65\x2a\xba\
+\x08\xb9\x55\x64\xd2\x37\x0a\x52\xf6\x48\x17\xc7\x7b\x5a\x85\xf7\
+\x04\xe3\x74\x91\x6d\x3e\xcf\x7e\x68\x3f\x6f\xd0\x9b\x67\x5a\x14\
+\xa5\xbb\x84\xa1\x34\x4d\xb8\xa3\xf9\xf8\x97\x0a\xef\x49\xb2\x24\
+\x62\xc7\xb5\xd0\xb1\x1e\x55\x1a\x17\x35\x11\x6f\xd5\x70\x1a\x13\
+\xdc\x7c\x9b\xc1\xd1\x12\xef\x49\xc4\x65\x04\x2d\xc2\x94\xf8\x1f\
+\x8d\x28\xb3\x8e\x8c\xeb\xb1\x46\xcc\x91\x32\xe7\x12\xda\xd1\x7f\
+\x28\xf7\xb1\x7a\xc7\xbc\x38\xd5\x68\x8d\x58\x20\x62\x71\xf0\x36\
+\x0c\x2c\xf4\x97\xf0\xb8\xac\x1b\xb5\xdc\x7b\xc3\x12\x23\x61\xfb\
+\x81\x3f\x59\xe0\xe1\xcf\x73\x59\xb2\x8d\x14\x37\x61\x2c\x60\x5b\
+\xa8\xb3\xb4\xae\x83\xba\x81\x22\x92\x8e\xe7\x9d\x89\x91\x4b\x76\
+\xe6\x0b\x90\x59\x6a\x7c\xa5\xef\xec\xed\x0f\x32\xfb\x9c\xaf\xf7\
+\x2a\x23\x59\xea\x5a\x34\x52\x59\x03\x53\x01\x26\x37\x90\x9a\xa4\
+\x9e\xab\x25\x44\x62\xfc\x5b\x4d\x96\x52\xd3\x93\x47\xcc\x3c\x78\
+\x46\x4d\x37\xaa\x2e\xb3\x6a\x0b\xa1\x37\xb1\x57\x5a\xa7\xd1\x36\
+\x89\xa3\x7e\xfa\xc0\x20\x4c\x29\x47\x64\x47\x51\x0e\xaf\xd1\x89\
+\xdc\x75\x66\x70\x27\x69\x0f\x80\x3f\x9d\xa3\x96\x21\x5d\x7c\x5e\
+\x3d\x2e\x3b\x5b\x17\xc0\xcc\x77\x22\x89\x36\x8e\x06\x2d\x10\x5a\
+\x44\x23\xde\x5b\xc0\xfd\x4c\x21\x56\x86\xb5\x77\xa1\xe7\xe8\x3a\
+\x8a\xb6\x94\x28\x7d\xa8\x9e\x4e\xf5\x72\x89\xac\x9f\xb8\x39\x50\
+\x93\x81\x53\x26\x72\x75\x8b\xd4\xe2\x9c\xfd\x21\xa5\x74\x10\x2b\
+\x9b\x2c\x11\x28\x15\xdb\x2d\x3d\x58\x22\x7e\x96\xee\x67\xb4\xa2\
+\x63\xd8\xbc\x18\x82\x72\x43\xb0\x2b\x7c\xe3\x25\x3d\x52\x7b\x71\
+\x7f\x3d\x05\x49\x92\x14\x48\xc5\x5a\x53\x28\x7c\xc4\x4c\x5c\xcf\
+\x74\x10\x53\x9d\x54\xaa\x52\x5a\x7b\x9a\x50\xc2\xbc\x65\xae\x36\
+\xf7\x9e\x68\xea\x33\x82\x52\x86\xd2\x71\xb4\x4c\x2e\xe4\x83\x83\
+\x3f\xdc\x82\x91\xf1\xf0\x75\xea\x65\xf3\x4b\xd3\x07\x4b\x9a\xe8\
+\x94\x64\x2b\xba\xa6\xdc\x83\x9b\xf9\x25\xd2\x19\x22\x65\x7a\x7b\
+\x63\x6c\xe4\x44\x21\xed\x68\xab\xf1\xf0\x93\xc6\x27\x04\x44\x94\
+\x79\x56\xc3\x76\x8d\xae\xc0\xcd\x3b\xf1\xd4\x1d\x22\x37\x05\x76\
+\x93\x4e\xde\x62\xa7\xd1\x52\x3e\xa7\xaf\x9b\x2a\x7a\xf7\x7e\xec\
+\x20\x57\x7a\xb4\xde\x7d\xc3\xdc\xd3\xd1\xd4\x28\x21\x6a\x6a\x2c\
+\x9d\x33\x71\xb1\x72\x4b\xae\x8a\xa1\xd8\x64\xfd\x36\xe7\xa8\x7d\
+\x50\xb4\x45\x24\x62\xd2\x0f\x8e\xb6\x04\xef\x98\x1b\x9f\x44\x9f\
+\x23\xd2\x29\xf5\xc8\x45\x9c\xe2\x2a\xf3\x8d\x75\x83\x16\x92\xa3\
+\x49\xec\x47\xf9\xf1\xe0\x2e\x03\x13\x5d\x12\xbf\xae\x4b\x81\x91\
+\xea\xae\x5e\x11\x35\x45\x97\x84\x96\xc9\x1c\xd2\xa8\xe8\xf3\x1d\
+\xa5\x8a\x02\x7a\xfb\xe2\xc4\xea\xdb\x92\xad\xbf\xb0\x9a\x48\xb1\
+\xd5\x96\x7b\x4d\x89\x87\x4f\xc1\xf7\xdc\x63\x34\xf2\xa2\x52\x31\
+\x13\x8f\x5d\x2f\xe6\xf3\x12\xb5\xb1\xe7\x2d\xb5\x3d\x39\x95\xe3\
+\x94\x0e\xd4\x68\x60\xed\x11\x71\x3d\xe0\xfd\x26\x64\x20\xf4\xb2\
+\x95\x91\x74\x49\xa3\xa5\x5f\x90\xc5\xa7\xe8\x1b\x1e\x3e\xc5\x09\
+\xc2\xa4\xaf\x3b\x25\x4a\x91\x45\xa7\xc4\x39\xba\x3a\x86\x33\x61\
+\xbc\xb1\xcd\x1a\x71\x3d\xa4\x89\x24\x46\x90\x5c\xa2\xa5\xb6\x94\
+\xd2\x11\x91\xd0\xa5\xbe\x71\x9d\x5b\x9a\x9c\xa3\x34\xf3\xbc\x9f\
+\x84\x4c\x4c\xdd\xe3\xfa\xc6\x48\x44\x1b\xac\x0d\xdd\x4f\x25\x26\
+\x63\xa8\x5b\x4f\x47\xcd\x23\x7c\x7b\x56\x4d\x14\xa8\xa4\x50\xfd\
+\x61\x75\x99\x78\xf8\xd5\x96\xe0\xfe\x07\x27\x2f\x06\x77\x63\x2b\
+\x9a\x6a\x22\x5c\x69\x6b\xf2\x34\xdc\xb6\x0e\xb7\x84\xce\x3d\x43\
+\x12\xd9\xa5\x28\xf7\xdc\x67\xdc\x82\x28\x65\xfd\xc4\xd0\x2e\x6d\
+\xb8\xd4\x2f\x12\x10\x84\xc2\x07\xa5\xb2\xed\x0d\xbb\xac\x27\xb2\
+\x74\xd1\x6f\x10\x7a\x56\x6d\x4d\xe9\xb3\x7c\x03\x13\x5a\xf9\xa3\
+\xfa\x83\x59\x72\x34\xba\x9c\x18\xf7\x44\x6e\x0c\xf1\xea\x26\xc2\
+\x48\x2d\xb6\x09\xf5\x2f\x9e\x21\xfa\x68\x59\x5f\x6e\xc1\x32\x59\
+\x85\xd1\xde\x2b\x6a\xa1\x0d\x2b\x1b\xcc\x86\x9a\x19\x85\x7a\x02\
+\x33\xb9\x8b\x11\x6d\xae\x26\xf5\x99\xad\xcd\x5c\xbe\x69\xce\x9d\
+\x0f\xab\x1d\xfc\x28\x35\x0e\xd3\x44\xe3\xa9\x37\xf3\x79\x1c\xbb\
+\x4a\x10\xa4\xf4\x9e\x24\x4c\xc6\x49\x6a\x51\xe3\x69\x94\xaa\x8b\
+\x24\x52\xce\x55\xda\xa6\x02\xce\xf7\x08\x5c\x4f\x80\xd4\xd0\x1f\
+\x4d\xe4\xce\x11\xf6\xa5\x39\x81\x65\xbd\x56\xa2\x24\xc6\xc2\xcb\
+\x63\xf6\x49\x7a\x14\x93\xcb\xc1\xc9\x23\x47\x13\x9d\x1e\x2d\x4f\
+\x86\xa7\xb2\xae\xa6\xfa\x09\xdd\x0e\x41\x42\x74\x07\x7e\x16\x99\
+\x12\x20\x92\x51\x9e\x1c\x1f\x95\x81\xbd\xfa\x5e\x1c\x83\x90\x86\
+\xc9\x55\x54\x08\x9a\x19\x37\x81\xd2\x4a\x3d\x1d\x4b\x7f\xd4\x02\
+\x66\x38\x4f\xab\xfe\x42\xe7\x4b\x63\xc5\x16\x23\x18\x00\x6f\xf7\
+\x10\x94\x47\x7f\x2b\x49\x92\x91\x6a\x32\x6f\x21\x48\xf4\x9e\xf4\
+\x71\xc8\x1f\xc7\xf6\x34\xc1\x87\x36\xc5\x8a\x9e\x65\xc8\x4c\xe6\
+\x9e\xf2\x25\x35\x32\x4b\x7f\xd4\x93\x0f\x8c\xee\x44\x69\xd8\x61\
+\x0e\x43\x8f\xbd\xf0\x7a\x11\x18\x9d\x52\x3f\x3a\xfb\xca\x1f\xd5\
+\x91\xfb\x6f\x7a\x24\x48\x1e\x8c\x30\xa6\x4f\xf5\xda\x05\xf9\x66\
+\xb0\x12\xe5\x9b\xa1\x22\x75\x60\x15\xab\xdd\xe8\xdf\xc4\xa1\x74\
+\x86\x46\xef\x7e\xcd\xc2\x94\xd4\x3d\x15\x3e\xb1\xe6\x2f\x2a\xa7\
+\x64\x06\xde\x53\x1a\x66\x9b\xe2\xc2\xc8\xe4\x3b\x2f\x46\xa9\x40\
+\x1d\x45\xab\x9f\x3f\x23\xbc\xe0\xe6\x61\xe7\x36\x1e\x6c\x35\xd5\
+\x17\xc5\x9b\x48\x2c\xfd\x51\xdf\x6b\xea\x61\x93\xaa\x77\x2b\x89\
+\xcc\xb7\x94\x69\x47\x90\x4a\x30\x5f\x17\x27\x16\x6e\x25\xf4\x42\
+\x4f\xcb\x3a\x74\xb6\xd5\x5c\xd9\x36\xb5\xe2\x92\xa6\x2c\x3e\x59\
+\x5a\xb4\x13\x55\x0b\xf9\x98\xc9\x75\xc9\x97\xec\x4f\x33\x90\xe6\
+\xf3\x76\x89\x62\x8a\x11\xd9\xbc\x68\xe9\xf5\x2e\x3d\x7c\x96\x99\
+\xce\x5f\x3a\xf7\x41\x98\xd8\xeb\x28\x41\xd2\x0b\x2b\x1b\xf4\x66\
+\xad\xc1\x45\x49\xe7\x4e\x0f\xbf\x1a\x63\xac\x23\x11\x3f\xfa\xcd\
+\xe7\x33\x5e\xea\x92\x6e\xe5\xfa\x35\x44\xcb\x2c\x85\x22\x2f\x5e\
+\x57\x1a\x7c\x6c\x9d\xe5\x50\x3a\x7a\x4e\x9e\xd7\xee\x82\xd0\x7b\
+\x76\x4c\xf5\x06\x81\x4d\xaf\x68\x22\x14\x3f\x99\x1c\x4f\xa5\x86\
+\xba\x68\x9b\x75\xbd\xe7\xf3\x79\xf4\x22\xb9\x70\x48\x3d\xe1\xbc\
+\x9e\xbf\xc5\x66\xae\xc3\x41\x54\x82\xa9\xa5\x30\x9d\xb0\xd3\xd6\
+\x19\x0a\x15\x15\xf1\xf0\x27\x75\xea\xa4\x4c\x49\x8e\x41\x1b\x05\
+\xa9\x0f\x33\xd9\x34\x38\x69\xd4\x67\x34\x78\x05\xb1\x17\x43\xe3\
+\xb1\x1f\xa3\x51\x8a\x51\xe8\x20\x08\x8d\x6d\x2f\x8d\x93\x0d\xa2\
+\xf6\x4c\x2c\x2d\xbd\xf2\xf8\x6c\xd0\xaa\x27\x6d\xed\x86\x0e\x02\
+\xe6\x14\x87\x92\xcc\x58\xc4\xb1\x1e\x67\x9b\x0c\x73\xd9\xdf\xc6\
+\x31\xe0\xdf\xfb\x30\x9b\xd7\xc3\x6e\x1c\x14\x9d\xbe\x68\x65\x9b\
+\xb0\x5a\xc0\x49\x15\x71\xbe\x77\x7b\xcd\x2b\x8f\xf2\xf0\x4d\x3f\
+\xfd\x83\x28\x65\x0e\xaa\xb0\x4c\xd8\xd5\x21\x99\x02\x3b\xfd\x2d\
+\x8b\x0f\x79\xf2\x15\xeb\xab\x46\x2e\xe9\xe3\x4b\x8a\x80\x01\xe1\
+\xe3\xab\x85\x9b\x77\x0b\xf5\x7a\x54\xc4\x9c\xd6\xa0\xa4\x72\xfb\
+\x70\x6c\x75\xd3\xec\x32\x5c\x3d\xcd\xb1\x99\x65\x2a\x7a\x09\x19\
+\x38\x11\x52\x83\x1d\x4f\xd4\xf7\xda\x86\xc0\x1c\xbe\xf5\xe6\x89\
+\xab\x1a\x6a\xa1\x40\xe9\xb3\x1b\x07\x4f\x43\xeb\x4c\x8d\x9b\x38\
+\x89\x40\xd1\xaa\x1f\xe6\x49\x3c\x18\x41\x12\xd7\x24\x49\x13\xc1\
+\x99\x42\xed\xe4\xca\x90\x2a\xf5\xd2\x6d\x36\x63\x9f\xea\x7a\x3d\
+\x7b\x5f\x5a\x0c\xed\xf4\xda\x69\x52\x41\x40\xf4\x4f\xc6\x1a\x8f\
+\x75\x50\x09\x16\x32\x64\x91\x4e\x17\x7d\xa6\xf2\xf6\xd9\xa7\xf4\
+\xf8\xb9\x5b\xd1\x36\x64\xc9\xd4\xee\xa6\x1d\xac\xc2\xc5\xe7\xb9\
+\xdb\x86\x43\x56\x6d\x77\x6d\xce\x8c\x42\x8b\xd1\xe5\x0c\xfb\x63\
+\x42\x64\xed\x99\xad\x71\x93\x94\xfa\x07\xd3\xd9\xb3\xda\x20\xcd\
+\xb4\x8c\x43\xbb\xa2\xdb\xf1\x04\x41\xaa\xc6\x05\x4c\xf6\x7d\x28\
+\x10\x60\x00\x5e\x14\x03\x99\xd6\xf9\x10\x91\x2a\xb8\xdf\x70\x98\
+\x20\xad\xca\x4c\xac\x89\xb5\x9c\x20\x55\x97\x3b\xd5\x93\xad\xeb\
+\x00\x44\x0d\x3c\x67\xf8\x4e\xc1\x84\xb2\x55\xa3\xc6\x4e\x63\x3f\
+\x11\xb7\x48\xcd\xbb\x59\xf0\x08\x02\x20\x40\x15\x0c\x07\x1a\x6f\
+\x19\x34\xf1\xe1\x28\x1b\xf3\xa3\x76\x4f\xb3\x7a\x82\xd4\xcf\xc9\
+\x2a\x25\x52\xa5\x45\x25\x46\xae\xeb\xdd\x92\xee\xc5\x89\x4f\x9d\
+\xc3\xc7\x0d\x8d\xa4\xb2\x37\x8f\x26\xb4\x3f\xdb\x2b\xf2\x53\x13\
+\xd6\x46\x24\xe0\xfd\x4a\x9e\xf2\xe8\x47\xc0\x89\xb9\x83\x30\xf5\
+\x0e\xa7\x47\x11\xa8\xb1\xd4\x00\x6a\x56\x27\xd5\xc0\x69\x96\x0b\
+\xec\x0b\x85\x13\x5a\xdb\xfa\x5c\x0a\x8d\xfe\xfd\xd1\xbb\x5c\x27\
+\xf3\x47\x0d\xbc\x3f\x77\xbc\xad\xc6\xd3\x65\xd1\xaf\x6f\x42\xe8\
+\x72\xa4\x3d\xb1\x0b\x36\x2f\xd7\xc7\x2f\x37\x8f\x0f\xc1\x3f\x7c\
+\xf2\xca\x8e\x1e\xae\x93\x64\x5e\xd0\x44\x4e\xa5\x33\xd4\x4c\xa8\
+\xbc\xfc\xe4\x93\xa2\x7f\xb4\xb8\xa3\x73\xc2\xf8\x42\x72\xdc\xe6\
+\x42\xd3\xa9\xcf\xee\x8b\x3a\xa9\x01\x4c\x67\x7f\x4b\xc3\x28\x23\
+\x9e\xaa\x12\x7a\x83\xf2\x0d\xba\x74\x8a\x42\x93\xb2\x8f\xec\xd4\
+\xf9\xca\x8f\x1e\x3f\x7e\xed\xe5\xc5\xe4\x9e\xc0\x79\x0a\x96\x0c\
+\x2b\x13\xe9\xd1\x82\xa3\xa2\xf1\x64\x14\x02\x45\x89\x88\x3a\xa2\
+\x90\x64\xb6\x07\x1d\x48\xf5\xd1\x9f\x24\xf9\x62\xab\x29\xd1\xdf\
+\xfc\xed\x87\x2f\xba\x72\x02\x53\x73\xb5\x9e\x43\xd6\x05\x4a\x09\
+\x98\x69\xce\xa8\xc5\xf5\x70\xf5\x5e\x14\xe0\xca\xbb\x9a\xa1\xbe\
+\xf8\xe1\x3f\xf8\xf1\xd3\xff\x7d\xf4\x6f\x07\xad\x40\xc6\xb9\x9e\
+\x5f\x16\xaa\x06\xac\x28\x3c\x27\x27\x36\x2e\x0a\x86\xa1\xff\x9d\
+\x10\x47\x9f\xff\x96\xd8\x19\x19\xfa\x5a\xc7\x8c\xf9\xe4\x6d\xf9\
+\xf5\x00\x2d\x28\xc6\x05\x6e\x52\xe5\xee\x84\x0e\xfc\xed\x27\x68\
+\x52\x21\xb7\xeb\x82\x86\x40\x24\x12\xfb\xdb\x77\xfc\xe5\xf9\x8e\
+\xe8\x79\x5c\x44\xa9\xcb\xfd\x57\x3b\xa1\xef\xbf\x5a\xcd\x75\x46\
+\x02\xdf\xff\x51\x78\xf8\x3c\x7a\x9c\xbc\x0f\xb3\xa5\xde\x3c\x5f\
+\xd7\xd1\xbf\xeb\x74\xfc\xc2\x73\x1d\xbb\x28\xa0\x92\xe9\x79\x72\
+\xc6\xb7\x79\x8a\x09\xd8\xb6\x0d\xac\x66\xf1\x79\x49\x41\x27\x51\
+\x35\xd8\x89\x8f\xd5\x5c\x76\x49\x5b\x7e\x0c\x90\xec\x8c\x53\xfa\
+\xbe\x2b\xc5\x4c\x6b\x90\xa5\x37\xef\xde\x7b\xf4\xdd\x87\xb7\xb5\
+\x4b\x8c\x7e\x5e\x8c\x9a\xa0\x9f\xf6\x64\x9a\xa4\x0f\xbc\x92\xb6\
+\x6f\xc8\xf5\x70\x39\x56\x70\x3a\xba\xde\x4f\xe6\x81\x0d\x7d\xfd\
+\x9d\x1f\xbb\xba\xdc\x36\xb0\xe6\x98\x9e\x25\xc6\x91\x7a\x2a\xba\
+\x35\x8c\xe4\xfe\xab\x73\x9f\x82\x9b\x87\xbd\x37\x42\xcf\xba\xdf\
+\x11\xe3\x4f\xe2\x68\x76\xf2\x0e\x86\x3d\x5a\x0e\x36\x80\x4e\xe4\
+\xf0\x2f\x6d\xa7\xed\xf9\xa5\xb1\xab\xfd\x74\xfd\x3c\xc7\xe9\x1b\
+\x75\x13\x19\xa9\x1b\x94\xca\xe7\xcf\xb8\xa4\x77\x88\x9b\x27\x90\
+\x54\x3d\x02\x9e\xad\xf3\xa3\x8c\x99\x9c\x58\x11\xa9\x55\x77\x9a\
+\x0d\x3c\xb2\x73\x78\x9a\x94\xca\xcb\x11\x93\xf2\xb9\x67\x2c\xf9\
+\x17\xae\xbb\xce\xdf\x91\xd9\xa9\x14\xa9\x22\x16\x4c\x35\x05\x55\
+\x97\xc1\x6d\x7f\xbd\x45\x4e\xd8\x10\xac\xbf\xa6\x2b\xd0\x59\xeb\
+\xc4\xca\x73\xfa\xec\x59\x0d\xbd\x35\xeb\xe0\xa3\xbd\x17\xa9\x4e\
+\x27\x2b\xb6\x64\x29\xfd\x51\x51\x3a\x1b\xb1\x45\xb8\xec\xdb\x57\
+\x9d\xa3\x71\xc0\xbe\x43\x40\x7e\xfb\x24\x9d\x5f\x70\x54\x6b\x82\
+\x29\xf3\xec\xcb\x24\x62\x81\x4f\x36\x14\xb9\x71\xff\xb3\x70\x39\
+\x5d\x52\xb9\xcd\xbf\xef\x26\xe8\xf1\x2f\x37\x56\xda\x82\x01\xad\
+\x67\x7a\x72\xff\xfc\xda\xc8\x04\x8e\x52\xe9\x3d\x23\x7d\x5f\x86\
+\xcb\x2d\x2a\x7b\xe7\xaa\xb3\xd4\xe5\xfe\x4d\x21\xc1\xfd\x63\x52\
+\x30\x62\xa4\x3e\xf9\xd5\xe3\xe7\xee\xfd\xf9\xf2\xec\x40\x77\x3a\
+\xd9\xe5\x5a\x4e\x36\x88\xa5\xd5\x76\x26\x90\x1a\x15\x29\x82\x26\
+\xa9\xfc\x37\x3e\xb7\x39\x27\x9f\xba\xb3\x4b\x92\x3c\xe9\xf0\xc9\
+\xd7\x67\x42\x75\xfa\x50\xf9\x7e\xf0\xd9\xe5\xbb\x55\x8e\x30\xa2\
+\x5d\x83\x86\x69\x6a\x50\x4e\xdb\x35\x7d\xf0\x68\xc3\xf0\xbe\x8a\
+\x8e\xde\xd9\xcf\xeb\xbb\x3c\xae\x57\x41\xcf\x16\xf9\xd1\xa1\x71\
+\x62\xc7\x5b\x6e\x2c\x61\x58\x1f\xb2\xb9\x54\x4e\xda\x6d\x78\xff\
+\x6c\xd6\x3f\xfe\xd1\xeb\x5b\xb9\x72\xd7\x57\x06\xde\xfd\xfe\x55\
+\xc0\xc3\x87\x19\xad\xb2\x4f\xb0\x4a\x44\x6e\xcf\xb4\xb6\xd0\x9f\
+\x83\x2b\xaa\xa4\x78\xeb\xdb\x10\xde\xba\x9a\xbb\xca\x0f\xd2\xf4\
+\x9d\x8e\x5d\x7b\x5b\x10\xde\x05\x9a\x4a\x91\x1f\x25\x84\x56\x74\
+\xf6\x98\xc3\x4d\x3b\xf6\x5d\xea\x57\x31\x75\x3b\xfe\xb7\x77\x42\
+\x8f\x4e\xa6\x48\xfd\x57\x87\xf4\x3f\x9e\x69\xce\x33\x62\x7a\xa1\
+\x0e\x5a\x83\x50\xce\x9e\x2c\x2b\x0a\x62\x7e\xf4\x91\xa5\x0e\x01\
+\x71\xbe\x96\xaf\x6f\xe6\x5e\xc6\xde\x95\xfd\xd9\x14\xfc\xf5\xba\
+\x53\x67\xe1\x1d\x2a\x23\xbe\xc6\x1c\x60\x15\xd1\xdc\xcf\x97\x12\
+\x25\xe4\x1d\xf3\x2a\x63\x53\xa2\x7e\xf4\x61\x8d\xd4\x06\xa6\x2b\
+\xf8\x34\x27\xf5\xef\xe7\x45\xc5\x57\xb6\xbf\xbe\x68\x28\xe1\x15\
+\xe5\x1d\xe5\x16\x0c\xc2\xd4\xe4\xfd\xf5\xce\x50\x1d\x7d\x5b\xe5\
+\x93\x7e\xed\x5a\x25\x46\x0f\x95\xcf\x8b\xc1\x7e\x7e\x5b\x10\xa4\
+\x16\x86\x64\xe7\xbe\x94\xfa\xec\x95\xd8\xfe\x7a\xd1\x28\x6a\xeb\
+\xfd\xf5\x59\xdb\x0b\x4f\xa7\x9b\xfb\x7b\x2f\x4d\x39\x41\xda\xf7\
+\x59\xde\xbd\x3e\x3a\xa8\x0a\xfd\xe6\x90\x1f\xad\x11\x5d\xad\xb4\
+\xb8\xed\xb5\x65\x21\xbc\xa5\x38\x94\xfd\x59\x0e\x3a\xfc\x47\xbf\
+\xa4\xcb\xea\x0a\xff\xe9\xde\x89\x0f\x5c\xb7\x8d\xcc\x03\xda\x32\
+\x55\xb1\xf7\x4b\x4a\x24\x42\x7f\x72\x60\x8f\x26\x42\xee\xaf\x0f\
+\xcd\xd8\x01\xa1\x46\x97\x74\xd9\x59\xd0\x57\xcf\xdb\x3e\xcc\x27\
+\x59\x08\xa8\x52\xcf\xdf\x88\x4a\x0c\x0d\x14\x30\x4a\xd8\x5f\x4f\
+\xb8\xc4\xad\xd9\xf5\x67\x7d\x33\xe9\xbe\x17\xff\xd5\x4d\x8b\xca\
+\x85\xaa\x0a\x38\x2c\x2f\x4b\x98\x88\xf4\x95\xb1\xde\x9c\xa5\xd8\
+\x5f\x9f\xf7\x19\x7b\x6b\x73\xfb\x62\xdf\xd4\xb3\xbb\xa4\xcb\xfd\
+\x9f\xbe\x72\x3d\x8b\xc8\x43\x17\x7d\xd8\xa4\x7a\xe6\x0e\xf1\x92\
+\x1f\x3d\x19\x8a\xfd\xf5\xc0\xa0\x54\x26\xf7\xcb\x7d\x63\xd4\x24\
+\x2c\x25\x4f\xe3\x9e\x8e\x9b\x3f\xea\xd0\xd8\x34\xa0\xb5\x7a\xc2\
+\x25\x1d\x2e\x62\x8c\x66\x74\x32\xf3\x34\x65\x85\xbf\xa1\x67\xbd\
+\xdc\xf7\xb1\x7d\xe3\x13\x93\xc8\x0c\xb3\x96\xf2\x9b\xe5\x90\x70\
+\xc2\x1e\x57\xd4\x38\x0a\xa0\x0a\x27\x96\x52\x2f\x65\xaf\x37\xe2\
+\x7a\x81\x7d\xb5\x17\xde\xbb\x39\x4f\xec\x26\x32\xf7\x7e\x39\x14\
+\x08\x10\xfe\xad\x27\x1b\xc8\x54\x91\xea\xd9\x66\xdb\x5f\xcf\xb8\
+\xde\x37\xc5\x3e\xe8\xa0\xbf\x1f\x7c\x78\xb2\x46\x52\x2f\x37\x78\
+\x1c\xd2\xcf\x7e\x21\xe0\x74\x51\xaf\xd7\x4a\x99\xb2\x5e\xaf\xdf\
+\x96\xf2\xa3\x64\xa8\x88\xdc\x08\x5d\x9e\xee\xdd\xbd\xfb\x9e\x87\
+\x77\xf6\x33\x2d\x87\x0b\x0b\x99\x95\x2e\xa1\x83\x57\x21\xa8\xd1\
+\xbb\x77\x79\x2a\xbb\xde\x9a\x2d\x8d\xcc\xf4\x1a\xee\xc7\x1b\x1f\
+\x79\xe5\xa5\xab\x93\xcd\xb0\xe6\xda\x9d\x09\x13\x8c\x68\xbc\xa8\
+\xe0\x28\x53\x25\xe8\x7d\x81\x9f\x97\x5b\xf3\xe6\xec\x3a\x6f\x95\
+\xdb\x69\xb6\x3e\x67\x3e\x5a\x7b\x84\xe6\xf6\xac\xed\x19\xd7\x57\
+\x68\x4f\xe8\x78\xd3\xd1\x63\x44\x2c\x59\xfb\xb8\xc0\x5a\xe5\x70\
+\xcc\x09\x6d\x17\x94\xaa\x09\xa1\x1d\xd4\x13\xbd\xd1\xf3\x0b\xf5\
+\xfa\xc9\xea\xf5\xc3\xb8\x49\x97\x74\xe9\x6f\x2b\x80\x4b\x91\xaa\
+\x06\x2a\x3b\xdf\xdf\x1e\xdc\xb1\x7f\x94\x8d\xae\x27\x48\x3c\x56\
+\xdf\x8c\xb3\xf8\x7a\xed\xa2\x7a\x81\x50\x12\xa4\xc4\x9b\xb1\xad\
+\x51\x0b\xde\x3d\xfa\x47\x11\xd7\xbb\x22\xd5\x9b\x30\x10\xaa\xd1\
+\xbb\xcc\x03\xaf\x42\xca\x29\xf6\x93\x8d\xc8\x5c\xa4\x97\x3a\x8f\
+\x2b\xe4\x61\xde\x51\x1f\x0a\x4d\x34\x8a\xaf\x7c\x9a\xb3\x73\x10\
+\xd3\x37\x6c\xd8\xef\xa6\x3f\xe3\x64\x02\x94\x0a\x53\x8c\xbb\x7a\
+\xfd\x8d\x7a\xf3\x28\x4e\xf2\x45\x3a\xd1\x28\x34\x58\x06\xdf\xc4\
+\x29\x7b\xf8\x19\xef\x29\xc6\x4c\x89\x60\xb4\xe1\x47\xc7\x84\x92\
+\xcf\x04\xae\x11\xeb\x1b\x04\x81\x9b\x67\x4e\x49\xd1\x3f\x2a\x86\
+\xb6\x90\x20\x65\x87\xd6\x52\xb0\x74\x1c\x86\x9e\x50\xbd\x71\x45\
+\x0f\xa7\xc4\x4d\xe9\xe4\x0e\x7e\x1e\x10\xd2\x4b\xd8\xfd\xfd\xe3\
+\x34\x9a\x30\xd9\xe1\x8f\xd3\x8e\xa0\x53\x1c\x2d\xea\xf5\x43\xa7\
+\x44\x31\x9d\xcf\xd7\x4f\xec\x1f\x8d\xa8\x64\xae\x47\xe3\x40\x4b\
+\x48\x8b\x2f\x35\x92\xf3\x2e\x5c\x3e\x0d\xc1\x89\x52\xc0\x4c\x4c\
+\x32\xd9\x4e\xf0\xb4\x13\x9a\x67\xc4\x78\xf4\xe5\x8c\x98\x0e\xbe\
+\x1c\xc1\x18\x91\x59\x78\xa4\x56\x06\xf7\xfd\xf5\x6c\xcc\x14\xa9\
+\x00\x9c\xde\xcd\x88\x1d\x46\xb4\xa6\x81\xa6\x1a\x5a\xc1\x13\x79\
+\x9c\x67\x9a\xbc\x56\x1b\x00\xc9\x26\x00\x2b\x44\xa9\x4f\x11\x93\
+\x84\x88\x50\xa9\xc4\x72\x05\x3f\xb1\xc4\x3c\xdf\xd4\xc2\x2e\xb9\
+\x63\x92\x39\x2a\xe2\xd4\x51\x26\xb6\x8a\xd6\x74\x45\x87\x20\x84\
+\x2e\xf8\xcf\x84\xa5\x43\xa4\x27\x24\x20\x4c\x8a\xe6\x56\xf7\x8f\
+\xb6\x15\xe3\x02\xd4\xa2\xba\xa8\x98\x62\x24\x4f\x7d\xb1\x29\x45\
+\x89\x71\x7d\x8b\x80\x9e\x04\xcd\x0b\xe0\xf2\xba\x02\x9c\x0a\x15\
+\x1e\xba\x1c\xe7\x71\x11\x3c\x4e\x5f\x71\x55\x6c\x76\x44\xeb\xdd\
+\x22\x2d\xc3\x29\x0d\x31\x33\xc3\xdc\x95\xaa\x77\xf4\x47\x47\x46\
+\xd4\xef\x67\x51\xb9\xf3\xb3\xa7\x61\xd2\x27\xb1\xd5\xef\xa8\x53\
+\xba\xa4\xaf\x9c\x27\xb1\x14\xfe\x68\x36\x9f\x85\x22\x65\x92\x0c\
+\x91\x08\x2c\x53\xc2\xcd\xf3\x3b\x9a\x06\x6d\xd9\x3f\xba\xec\xfb\
+\xb1\x13\x0a\xa1\x42\x26\xf8\xa3\xe5\xaa\x58\x1a\x26\x23\x15\xfe\
+\x68\x86\x4e\x6b\x2d\x61\x2b\x2c\xa1\x7f\xd4\xf9\xe9\x98\x64\x19\
+\xfe\x45\x49\x12\xfa\xa3\x59\x3b\x5d\x40\x3d\x39\xb1\x28\x8b\x50\
+\x43\x21\x57\x82\xfe\x51\x71\xd6\xb9\x19\x7d\xbc\x94\x1f\x5d\xea\
+\xfe\xd1\x0b\xa8\xa7\x2a\xa8\xd7\xf1\xc7\x00\x14\xf5\x30\x59\xfb\
+\x0c\xfe\xe1\xa3\xe0\xfa\xb8\xd8\x67\x8c\x37\x50\xc9\xfc\x28\xd1\
+\x32\x59\xc0\x01\x3f\x89\xea\x49\x50\x32\xfd\x09\x3a\x8d\x8f\x1b\
+\x27\xce\xdc\xb9\x09\xc5\xe3\xf3\xab\x1c\x06\x67\x18\xea\xb8\x79\
+\xfa\x62\x67\xc3\x1a\x9e\x86\x56\xb2\x43\x46\x4a\xa5\x9f\x57\x3f\
+\x5e\x6a\xe0\xba\x0e\x76\x67\x05\xdc\x3c\x22\x78\x63\x81\x5c\x08\
+\x41\x45\xa5\xda\x34\xf4\x41\xc8\x4c\x05\x5a\x17\x6d\xe9\x98\x88\
+\x64\x8e\xb2\xc9\xbf\x07\x47\x8d\x54\x6a\xa7\xc3\x12\xd6\x70\x16\
+\x3e\x7e\xf1\x70\xa3\x2d\x87\x03\x79\x47\xcd\x86\x4e\xe1\x9b\x39\
+\xba\xed\x0c\x15\x4b\x39\xd6\x50\x68\x7b\xf0\x14\x63\x42\x99\x4e\
+\x68\x7c\xb1\x52\x62\xef\x74\x22\x8b\xbb\x8a\x52\x55\x6e\x30\xdd\
+\xb0\x1b\x0c\x1d\xfa\xce\xd5\xd1\x0f\x4c\x93\x28\x06\xad\x31\x49\
+\x36\x8f\x51\x9c\x5d\x94\x56\xd8\x50\x15\x16\xb1\xa3\xc7\x98\x09\
+\x93\xf4\xac\xc0\xfd\x3c\x7d\x29\x51\x8e\x83\x77\x2a\x9d\xa3\xb6\
+\xf4\x88\xa0\x1a\xfe\xa1\xbe\x2f\x39\xfa\x5f\xc1\x2a\xd8\xa0\xc5\
+\x51\x93\x08\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x38\xb4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\xa8\x00\x00\x01\x77\x08\x03\x00\x00\x00\x06\x8a\xf0\xc8\
+\x00\x00\x02\xc1\x50\x4c\x54\x45\x7f\x00\x00\xa3\x6d\x93\xa4\x75\
+\xa1\xae\x96\xd0\xbb\xb2\xec\xcb\x9d\xa4\xd7\xcd\xed\xbb\xbb\xfe\
+\xcb\xcb\xfe\xd0\xce\xfe\xd2\xd2\xff\xc8\xc6\xfe\xc3\xc3\xfe\xdc\
+\xdb\xfe\xc0\xbe\xfe\xb8\xb6\xfe\xd8\xd7\xff\xb3\xb3\xfe\xe2\xe2\
+\xfe\xeb\xeb\xfe\xf3\xf3\xfe\xfc\xfb\xfe\xb0\xae\xfe\xf0\xef\xfd\
+\xad\x80\xa3\xf9\xf7\xfb\xaa\x9b\xe0\xad\xac\xfe\xa4\x62\x7b\xbc\
+\x7b\x7b\xbd\xb9\xf5\xbf\x80\x80\x91\x31\x3d\xa7\x50\x50\xa9\x53\
+\x53\xca\xc4\xf2\x95\x2c\x2c\x96\x40\x53\xcc\x9b\x9b\xcf\xcb\xf7\
+\xae\xa6\xf1\x9c\x53\x6d\xdc\xb9\xb9\xe0\xdf\xff\x9c\x5a\x7b\xb5\
+\xb0\xf4\xee\xe0\xe1\xb7\x70\x70\x9e\x41\x42\xf5\xec\xec\xbb\x83\
+\x8f\x8f\x20\x21\xbe\xb1\xe4\xd5\xac\xac\xce\xa0\xa1\xbe\xa8\xd3\
+\xb2\x6c\x72\xd7\xb0\xb0\xdd\xc2\xc8\xed\xe3\xeb\xa9\x76\x99\x8b\
+\x22\x2c\xb6\xa9\xe4\x9d\x6a\x98\x89\x13\x14\xb9\x73\x73\xb9\x76\
+\x78\xb9\x9f\xcc\x9f\x68\x90\xa3\x81\xbb\xbc\xa2\xcb\xbc\xaa\xdb\
+\x9c\x3a\x3a\xa6\x71\x94\xc1\xbb\xf3\xa6\x88\xc2\xc4\x91\x98\xc5\
+\xba\xea\xc6\xba\xe5\xc6\xc0\xf4\x95\x4a\x69\xa8\x85\xb9\x96\x30\
+\x31\xcb\xaa\xbd\xb5\x6c\x6c\xaa\x84\xb3\xcd\xa3\xaa\xb5\xa0\xd5\
+\x8b\x1a\x1b\xd0\xa2\xa2\xac\x5a\x5b\xd1\xac\xb5\xac\x5e\x62\xac\
+\x84\xad\xad\x64\x6d\x97\x56\x7d\x98\x33\x33\xb6\x99\xc4\xdf\xdb\
+\xf7\x99\x46\x59\x9a\x3d\x44\xe4\xcd\xd1\xe6\xd0\xd2\xe8\xe6\xfb\
+\xea\xd7\xd8\xaf\x60\x60\xec\xda\xdb\xb3\x92\xbb\xaf\x8a\xb5\x9b\
+\x4a\x5c\xf1\xe3\xe3\xf3\xed\xf3\xb1\x63\x63\xb1\xa3\xe2\xf7\xf0\
+\xf0\xf8\xf3\xf3\x8c\x26\x32\xb3\x89\xab\xba\xaf\xe8\x8d\x2c\x3b\
+\xb6\x84\x9a\xac\x8a\xbb\xba\xb4\xf4\x89\x1a\x22\xa1\x50\x5c\xcb\
+\xc1\xec\xd9\xb3\xb3\x85\x10\x13\x95\x43\x5c\xc1\x83\x83\xa3\x54\
+\x61\xc2\xb4\xe2\xb0\x9e\xdb\x99\x43\x52\xb1\x86\xa9\xc7\xa8\xc0\
+\xb1\x8b\xb3\xa3\x87\xc6\xb2\x9c\xd3\xa5\x4c\x4c\xa5\x68\x84\xb4\
+\x73\x7c\xb4\xa1\xdb\xb4\xae\xf3\x9a\x4c\x62\x94\x45\x62\xa6\x8e\
+\xce\xd5\xb8\xc5\xd6\xc1\xd5\xb6\x78\x83\xa6\x8f\xd1\xd8\xd3\xf5\
+\xb6\x90\xb2\x9b\x57\x78\xd9\xc6\xda\xa7\x60\x70\xa7\x90\xd1\x9b\
+\x64\x91\xdd\xcf\xe2\x8d\x30\x44\x8e\x38\x52\xe1\xc4\xc4\xb9\x8b\
+\xa3\xe4\xcb\xcb\xa9\x8b\xc3\x8b\x27\x39\xe6\xe1\xf4\x9d\x60\x85\
+\x90\x2e\x3b\xea\xe4\xf2\xbb\x9a\xbe\x90\x35\x49\x9f\x45\x4d\x96\
+\x49\x64\xa1\x44\x44\xad\x90\xc7\xa1\x4d\x56\xae\x72\x86\x92\x34\
+\x43\xa3\x6a\x8d\x91\x2c\x34\xc0\x86\x8a\x83\x0a\x0b\x9f\x52\x66\
+\xbc\x93\xac\xc4\x8b\x8b\xc3\x9c\xb0\x89\x16\x1a\xcf\xc2\xe5\xe9\
+\xd4\xd4\xb1\xa6\xe9\xb5\xab\xeb\xc9\x94\x94\xa1\x6e\x98\xae\x99\
+\xd4\x9e\x58\x73\xd5\xbc\xcc\xbf\xa1\xc3\xae\xa9\xf5\x9b\x55\x73\
+\xaf\x78\x92\xc1\xab\xd4\xc1\xb7\xec\x87\x19\x23\xb6\x9b\xcb\xa4\
+\x72\x9d\xaa\x6c\x83\xb7\x7b\x87\xaa\x72\x8d\xc4\xa9\xc9\x92\x3d\
+\x53\xaa\x98\xdc\xb1\x92\xc1\xc7\x91\x92\xa4\x7a\xab\xba\x95\xb5\
+\xe8\xda\xe3\xba\x9c\xc3\xca\xb1\xcc\xba\xab\xe2\x94\x3b\x4c\x9a\
+\x5c\x82\xae\x95\xcd\x95\x39\x46\xa2\x59\x6d\xcf\xbb\xd7\xb4\x85\
+\xa1\x9d\x63\x8c\xbc\xa5\xd1\x99\x4f\x6d\xa6\x78\xa3\x91\x24\x24\
+\x9f\x6f\xa1\x86\x14\x1a\x8e\x29\x35\x0d\x87\x2a\x70\x00\x00\x35\
+\xae\x49\x44\x41\x54\x78\x5e\x84\x5d\x53\xb7\x2c\xcd\xb2\xed\xb7\
+\x72\xb5\x17\xb6\x6d\x1b\x1f\x6d\xdb\xb6\x8d\x63\xdb\xb6\x6d\xeb\
+\xda\xb6\x6d\xfd\x8a\x9b\x19\xe8\x59\x51\x51\x3d\x4e\x76\x65\x56\
+\xed\x97\x3d\xe6\x08\x67\x44\x64\xae\x5e\x9e\x0f\x72\x8c\x2c\x4f\
+\xc3\x1a\x66\x1a\x7f\xfc\xe8\x28\x75\x2d\x69\xca\xab\x2c\x4a\x19\
+\x75\x9c\x35\x3d\x65\x12\x9e\x32\xb1\xa3\x1f\x9e\xb8\x0c\x87\xf2\
+\xc4\xa5\x1f\x7e\x3a\x56\xc6\x67\x65\x7c\xe2\x57\x5c\x57\xf2\x58\
+\x11\x66\x2f\x1f\x0c\xf2\x01\xd0\x66\x39\x43\x15\xb0\xad\x51\xd2\
+\x14\xa8\x61\xa5\x59\x16\x0a\x97\x41\xd6\x34\x02\xb2\x32\xfe\x04\
+\x70\xcd\x50\xfb\x01\x5d\x12\x27\x23\x0d\x33\xe0\xec\xf7\x81\x34\
+\x0c\x8b\x52\xb1\xf6\x22\xc8\x30\x05\x69\x46\x33\x8d\x38\xe9\xc9\
+\x2c\x45\x89\x8c\xf4\x13\x7a\x82\xa2\xb5\x3c\x34\x93\x00\x34\xac\
+\x34\x4a\x4b\xd6\x00\x92\xa0\x0a\x41\xe9\xb1\x34\x25\xa2\x3a\xac\
+\x3d\xa0\x04\x3d\x99\x98\x59\x78\xe2\xa2\x58\x2d\x60\xb0\xde\x30\
+\x9f\xa9\x19\x49\x9b\xcc\xa8\x39\xa3\x28\x91\x53\x99\x1e\x66\xe0\
+\x3b\x51\xb3\xcf\x28\x01\x95\xb8\x6f\x70\x46\xd6\xc7\x5f\x03\x69\
+\x84\x45\x88\x09\x2d\x81\xcd\x0d\x44\x85\x09\x82\x02\x28\x43\x8d\
+\x13\x1c\xa7\x85\xc9\x29\xbc\x0f\x0c\x27\xa2\x32\x5a\x82\x89\x21\
+\x10\x15\x25\x28\xda\xa5\x4d\x59\x26\x8a\x94\x1b\x42\x42\x99\xf8\
+\xc5\x98\x0b\x03\x53\xa5\x94\xe8\x19\x95\x0a\x5c\xe7\x49\x48\x03\
+\x38\x61\xbf\xd1\x25\xd6\x23\x20\x35\x14\x8d\x9c\x07\xd4\x8c\x39\
+\x4f\x22\xaa\x04\x4d\x31\x3c\x69\x0b\xa1\x6b\x0d\xc5\xa7\x51\x92\
+\x74\xd6\x80\x09\x6d\x1a\x8a\x9c\x86\xc1\x7a\xaf\xac\x5f\xa9\x6f\
+\x91\x55\xa8\x12\xc9\xa8\xa2\x04\xeb\x55\x4a\x9d\xe6\xab\x61\x4a\
+\xe5\x4d\xb3\x28\x9a\xe6\x09\x14\x55\xa4\xa5\xa5\x68\x44\x09\xf3\
+\x04\x5d\x02\x58\x50\x73\x08\xa4\xbd\x81\x72\x7e\x00\xd6\x8b\x0d\
+\x0d\xdf\x2c\x02\x96\xff\x05\x01\x55\xde\x2b\xd0\x24\x4e\x5a\x09\
+\x24\xc1\x34\x4a\xcf\x04\x15\x19\x4d\x48\x8d\xc4\x88\xb6\xb8\xcf\
+\x60\xa1\xf6\x50\x26\x36\xa5\xe0\x7c\x2a\x4f\x06\xbe\x03\x27\xa3\
+\xb4\x56\x14\x43\x84\x94\x91\xd2\x1b\x28\x85\xa2\x42\xcc\x7e\x18\
+\xc0\x6a\xa1\x0e\x41\xce\x79\xca\xd4\x74\x49\xf2\x4a\xed\x00\xdb\
+\xf9\xdb\x23\x65\xb5\x67\xe3\x54\x1b\xa2\xf6\x1b\xbc\x6f\xe0\xa4\
+\x09\x0b\x4a\x53\xe1\x82\xf5\xa4\x49\x46\x99\x94\xa8\xaa\xf5\x59\
+\x1b\x26\xa0\x1a\x82\x12\x32\x75\xa2\x35\x19\xfd\xba\x05\x53\x3c\
+\x13\x53\x94\xb0\x0e\x3d\x4d\xa1\xf3\xde\x8e\x02\x66\x26\x1e\x29\
+\x63\x55\x92\x91\x33\xd7\xc1\x76\x5e\x5a\x86\x34\x01\x41\xc5\x33\
+\xb1\x0c\x60\xb0\x79\x02\x39\x69\xf6\x0d\xd3\xe1\x42\xe9\x31\x2e\
+\x54\xb1\x66\xca\xfd\x68\x48\x19\x25\x78\xef\x6d\x13\x7f\x59\xa8\
+\x49\xc9\x5a\x6f\xe1\xc1\xdc\xb3\x0b\x25\xa0\x82\xd5\x8e\xee\x98\
+\x84\x29\xda\x22\xa9\x38\xfa\x8c\x45\x35\xf3\x40\x4b\xc3\x7a\xb8\
+\x50\x98\x7d\x55\x26\xa2\x71\x0b\xab\x78\x51\xa5\x28\x3f\x0d\xae\
+\xcb\x2b\x4c\xef\xeb\x19\x69\x98\x50\x7b\xfc\x2c\x44\x88\xa8\x13\
+\x52\xe5\xbe\xb8\x4f\x60\x74\xae\x29\xda\x7b\xa6\xe7\xff\xec\x7a\
+\x92\x11\x12\x56\x8b\x72\xd8\x2d\xa3\x83\xa6\x94\x66\x71\xcc\xf4\
+\x29\x53\x65\x2a\xc2\x13\x66\x6a\xd4\x3d\x2d\x8c\x2a\x89\x01\x85\
+\x32\x19\x17\x4a\x3f\x26\xe8\xee\x8f\xff\xda\x93\xe7\xf6\x7a\xdf\
+\xce\x2d\xf3\x05\x2a\xd8\x0f\xd6\x2b\xe3\xc1\xfb\x8c\x46\xca\x30\
+\xdb\xa3\x80\x6f\x22\xb0\x88\x47\x31\x94\xaa\x50\x7b\x8b\xb5\xbc\
+\xf8\xcf\x7a\x3a\xee\x4d\x34\xd4\x53\x8b\x84\xe8\xd9\xc6\xa3\x4c\
+\x4d\x80\xcd\x04\x6a\x9e\x6a\x00\x9d\xcd\x40\x16\xec\x95\x6c\x08\
+\x65\x21\x26\x09\xcf\x40\x49\x82\x89\xc8\x49\xd6\x61\x79\x7a\xaf\
+\x31\xce\xaa\x08\xa6\xa3\x28\x2d\x9e\xf5\xc6\xdd\xf3\x68\x00\x4c\
+\xc1\x7b\xb0\x9e\x41\x42\x99\x12\x4c\x62\x3f\x13\xb4\x76\xf4\xfc\
+\xa5\x9e\x19\xfb\x26\x00\x8a\x40\x94\x40\x3a\x17\x2a\x24\x85\x88\
+\x0a\x5d\x49\x40\xad\xbd\x2f\x14\x29\x82\x92\x96\x2e\xa9\xb0\x12\
+\xcb\x09\xa9\x25\xe9\xbb\x7a\x76\x5c\x35\x31\xa4\xd4\x37\x7d\xb6\
+\x28\xda\x26\x28\x64\x34\xe2\xcc\x32\x13\x8f\x14\xd8\x2f\x15\x85\
+\x0b\x9d\x19\xa4\x2e\x24\xa5\x71\x7d\xfd\x93\xa0\xaa\xe0\xbb\xe5\
+\xe6\x1d\xf7\x5d\xf7\x44\xf8\x58\x3f\x85\x0f\x05\x48\xeb\xee\xd5\
+\xe0\x0f\x80\x15\x5a\xaf\x76\x14\x34\x05\xeb\xc3\xa0\x57\x41\x70\
+\x0d\xd8\x5a\x41\xd2\x9b\xc3\xd2\x2b\x7b\xbd\xbf\x2e\x25\x1e\xbd\
+\x95\x60\xae\xdd\x3f\x19\xd4\xc1\xa6\x3e\xbc\xef\xac\xe5\x91\x41\
+\x09\x62\x1a\x4f\x0f\xd6\x03\x65\x84\x19\x27\xe1\x44\xdc\x5c\x28\
+\x52\x0e\xf4\x09\xab\xc0\x2c\x14\x25\xbb\x25\x25\x69\x52\x9f\x76\
+\xce\xab\xbf\xd0\x5b\x47\x0c\x1e\x0b\xf7\x77\x11\xce\x49\x4e\x66\
+\x34\xcc\x3c\x1f\x26\x80\x09\xa2\x7a\xcd\x37\x14\x65\xc6\xe7\x02\
+\x94\x21\xd2\x9a\x41\x44\x05\xa8\x62\x65\xa0\x30\x4b\x60\xfe\xad\
+\xff\xd0\xc3\xf8\x5c\xc9\x40\x6f\x27\x05\x7a\xd3\x95\x4b\x9f\xb8\
+\xfd\x8a\xf7\x6c\xde\x7e\xfb\x39\xef\x4a\xa0\x4b\x82\x71\x6e\x50\
+\x62\xed\xa8\x1a\xd2\x48\x4d\x11\xd3\xa6\x26\x15\xc2\x7a\x46\xe9\
+\xa3\x3c\x41\x5a\xef\x8e\x30\x31\x0e\x8c\x12\x1a\x6a\x9a\x30\xbe\
+\xb3\xdb\xda\x26\x15\x00\xa0\x5d\xa1\x14\xb5\x66\x54\x79\x4f\x2e\
+\x29\x07\x39\x0b\x36\xa3\x08\xf2\x18\xa7\xb5\xa1\xb2\xd4\xf5\xf5\
+\xbf\x6f\xe1\xec\x1d\x4b\x80\xdf\x73\xe3\x82\xd4\x9b\x51\x81\x68\
+\xa3\x27\x63\x47\x33\x86\x29\xac\x6f\x3a\xd0\xac\xc8\xd8\x87\x96\
+\x4d\x67\x5f\x20\x26\x49\xb0\xd4\xc9\x33\x0c\x62\xd3\x4d\x67\x1d\
+\x78\x22\x7e\x5c\xb3\x38\x64\xde\xdf\xea\x91\x5e\x57\x8b\xda\x43\
+\xe3\xbb\xf7\xf5\xb4\x17\xb1\x04\x4d\x89\xf5\x6a\xf4\xe3\x72\xfe\
+\xd2\xdd\xab\xc2\x1b\x91\xbd\x4d\x40\x14\x8a\x96\x35\xea\x14\x42\
+\xb0\x61\xc7\xf2\xa8\xaa\xd2\x57\xdc\xd3\x5b\xff\xd4\x38\x91\xb1\
+\xfb\x63\x9b\x18\xdf\xd7\xbf\xb9\x61\x03\x7d\xdc\x30\x36\xd4\xd4\
+\xe7\xe7\xed\xeb\xc3\x24\x9a\x6a\xd8\x1c\xbe\x5e\xb7\x74\x37\xdb\
+\x66\x44\x51\xd8\x91\x14\x69\x7d\xf6\xad\x17\x7e\xe4\x94\x3b\xd7\
+\xd4\x1a\x3a\x27\xf5\x77\x49\xb9\xa7\xa3\xa2\xa4\x2c\xce\xd6\xf1\
+\x28\x41\xa6\x24\xad\x3e\xf9\x95\xf1\x78\x3c\x1a\xe5\x83\x94\x90\
+\x4e\x4b\xe8\x3c\x76\x4c\x6e\x5f\xaf\x30\xa1\xf7\x6a\x47\x19\xea\
+\xd2\xf3\xca\xa3\xc7\x4d\x9a\x4c\x74\xea\xfa\x5f\x57\x16\xbe\x20\
+\x24\x0d\x14\x25\x9b\x74\x63\xf5\xd2\x69\x6f\xfd\xd6\x23\x4b\xa7\
+\x2f\x5d\x79\x1a\x12\x4e\xc3\xb4\x0e\xb2\xca\x23\xd9\x1d\x71\x9e\
+\x41\x40\x87\x76\xdf\xe4\x2c\xa9\x33\x4f\x44\x4f\x44\x4f\xf9\x87\
+\x21\x4c\x37\x0f\x40\x4e\x11\xd5\xbf\x68\x0a\xdb\x6b\x67\xfc\xff\
+\x54\x5b\x0e\x7f\x14\xa0\xf2\x78\x7d\xef\xd3\x4f\x6a\x7c\x7f\x2e\
+\xbb\xfb\x69\xdd\x54\x79\x65\x3c\x4d\xc5\x29\xac\x77\x9e\x49\x47\
+\x10\xcf\x03\x00\x72\xe6\x98\x14\xbf\x90\xa1\x30\x31\x76\xa4\xbc\
+\xaf\xeb\x52\x99\x1f\xb3\xbb\xff\xe5\xf0\x79\xf0\xc7\xbb\x93\x7a\
+\xf7\x8a\x25\x21\xc0\x9e\x45\xb7\xb1\x77\x76\x74\x5b\x60\xbd\x17\
+\x51\x1e\x9a\xcd\x23\x08\xc7\xee\x09\xcb\x1d\x13\x42\xa9\x50\xb3\
+\x17\x01\xe3\x8c\x33\xc8\xd2\xdc\xaf\x26\xff\x79\x8f\xf4\x8b\xa4\
+\xf6\x2b\x9c\xd2\xff\xa5\x72\x7e\x61\xb8\x10\x96\xe6\x86\x19\x03\
+\x5b\x11\xe5\xbb\xb8\x51\x80\xcd\x2e\xfa\xe9\x8e\x3d\x93\x31\x11\
+\xf6\xa9\x8c\x02\x13\x1d\x82\x60\xd3\x96\xfd\xcb\xe3\xfb\xbf\x1d\
+\x3f\x1f\x48\xc5\xe0\x27\x7f\x04\x24\x3f\xfc\x21\xbd\x5e\x93\x26\
+\x09\x51\xd4\x8e\xe3\xd3\x1c\x04\x5d\x58\x20\x80\x08\xf3\x9c\xd6\
+\x0f\x8c\x6f\x02\xce\x2c\x95\x38\xff\x4e\xfa\x4f\x2b\xa1\x28\xbd\
+\xca\x55\x11\xc0\x4d\x27\xa6\xf7\xe7\x45\x50\xaa\x08\x60\x4b\x55\
+\x27\xb2\xbf\x2b\xdf\x7f\xdd\x96\xe3\x3b\xee\x7b\xe8\xe4\x64\x72\
+\xff\x0b\x1c\x79\xd2\xe6\xce\xc2\x7c\xdb\x63\xcb\x85\x31\xf7\x0b\
+\x8c\xb3\x53\xeb\x01\x94\x68\x09\xa0\xc4\x7a\xc6\x99\x6e\x64\x21\
+\x0d\x08\x31\xca\xa5\xd7\x1e\xd8\xbf\x1c\xc0\xff\xfd\x23\xdf\xdb\
+\xbe\x8e\x50\x8f\x69\xb7\x9c\xd4\x75\x9c\x65\x51\x72\x94\xff\x1c\
+\x61\x9a\x92\x6f\xfa\x55\xa0\x3c\xf5\x07\x27\x17\x2b\xda\x88\xd0\
+\xf4\x32\x0a\xac\xc6\x85\x7a\x5d\xca\x1a\xa9\xf1\xcd\x64\x49\x49\
+\x87\x18\x65\x78\xd2\xbc\xaa\x8a\xf2\x11\xb2\x9a\x6c\xbb\xa7\xb4\
+\x07\x09\xcb\x69\xbb\x96\x02\x44\x42\x9c\xbc\xf3\xfb\x11\xd6\x13\
+\x93\x80\x93\x2c\xd2\xa6\x03\x07\x5e\x73\xe6\x25\x41\xa0\x46\xa9\
+\xc9\x94\x04\xf9\x5c\x30\x7b\x65\x1f\x3d\x59\x75\x02\xca\x38\x65\
+\xbc\x9d\x84\x34\x67\x7d\x8f\x93\x23\xe7\x4b\x2f\x7c\x99\xa2\x54\
+\x21\xad\xa3\xaf\xff\xdf\x5e\xef\x1d\x97\x53\x78\x7f\xed\xd7\x44\
+\xb9\xc7\xa2\xf7\x47\xf7\x4f\xa2\x65\x2b\xc8\xaa\x82\xe7\xf2\x32\
+\x32\xea\x5d\x28\xd0\x32\xeb\x81\x95\x06\x84\x14\x14\x25\x5b\x7a\
+\xa8\x87\x21\x42\x4a\x16\xea\xbf\x08\xdb\xba\xed\x9b\x9f\x7f\x95\
+\x10\xfb\xb3\xd3\x82\x92\x64\x7d\xb5\xfc\x92\xc7\x6f\xa6\xc6\x23\
+\x45\x11\x3e\x03\xaf\xa7\x28\x74\x3f\x7b\x78\xf3\xc7\x08\xa9\xb2\
+\x7e\xab\x58\x52\x72\xf1\x45\x41\xef\xf2\x39\x8d\x80\x6e\x5a\x7d\
+\xe3\x89\x97\x91\x90\xf2\x56\xd9\x19\xd2\x5f\x59\x1e\x04\x94\x0c\
+\x95\x3c\x53\xb3\xd4\x34\x33\x4f\xe1\x51\x19\x0d\xb3\x9d\xcd\x73\
+\xe5\x86\x8d\xe7\x9d\xf7\xba\x57\xc4\xb0\x26\xe0\x45\xb2\xec\xbb\
+\x6c\x49\x69\x6f\xaf\x14\x65\x10\x6b\xf7\x4c\x47\x55\x9e\xde\x4d\
+\x42\xca\x99\xfc\xb7\x5a\x98\xff\x7d\xef\x34\xd7\xb4\x23\xe3\xec\
+\x2b\x49\x59\x95\x84\xf5\x90\x51\x10\x14\xac\xb7\x35\xa6\x67\x37\
+\x63\x87\xb8\x98\x21\xf7\x94\xad\x22\x77\x9f\xb1\xf3\xe4\x5d\x1e\
+\xf9\x96\x3b\x1e\x9a\x0e\xca\x30\x2e\xfa\x1a\x51\x6e\xd5\x47\x4e\
+\x8b\x44\x6d\x4a\xee\xfa\xe3\xcb\xe3\x72\x96\x72\x8e\xf5\x05\x7a\
+\x09\xce\x26\x45\x45\x46\x5d\x8a\x0c\xac\x17\xac\xaf\xf8\x8e\x21\
+\xc4\x9e\x1c\x42\x5a\x9c\xc7\x42\xca\x51\x49\xa0\xa8\x10\xf4\x86\
+\x93\x8b\xe4\xe2\xcf\x3f\x75\xb6\x03\xfe\x50\x40\xfa\xbd\x68\x90\
+\x2e\xd8\xb4\x69\xfd\x59\x47\xf6\x4f\xab\x82\x04\x13\x65\xc6\x21\
+\x51\x94\xa0\xda\x4d\xa8\xca\xa8\x53\x7b\xeb\x42\x7f\xb3\x67\xc7\
+\x8d\xa3\x14\xe1\x5e\xc9\x91\x3a\xe1\x64\xad\x27\x4d\x5a\x3d\xa5\
+\x48\xea\x91\x1e\xc6\x89\x3c\x88\xe9\xd2\xea\x87\xa6\x55\x35\x0a\
+\x32\x51\x24\x32\xa0\x45\xfa\x21\x39\x7c\x50\x54\xed\xfd\x42\x7b\
+\x27\xba\x4d\x5c\x28\xf1\x5f\x70\x62\x3c\xb8\xd8\xc8\x3d\x64\x9b\
+\x23\x9f\xd9\xb2\x84\xa1\xaa\xb4\x61\x5c\x96\x6b\x4e\x79\xa6\x87\
+\x71\xc6\xe3\x15\x29\x54\x5a\xa0\x20\x46\x04\xc5\x40\x85\x11\x30\
+\x69\x51\x5f\xbf\xd0\x99\x71\x96\x71\x54\xd3\x41\x47\x3e\xf3\x99\
+\xeb\xde\x46\x5e\x6f\x39\xcd\x80\x94\x85\x94\x08\x4a\x23\x5d\xc3\
+\xae\x7e\x73\x70\x4a\x18\x3f\xdb\xfb\xd0\xb4\xd0\xf2\x8d\x24\xa0\
+\x0c\x46\xc9\x3b\x6a\x51\xcc\x72\xde\xc8\xa8\x37\xf8\x71\xe6\xd9\
+\x41\x8a\x30\x6e\x9e\x2e\x8e\x06\x79\xba\xf5\xdb\x91\x7e\x53\x78\
+\xa6\x22\x3b\x9b\x22\xb9\x8a\x71\x92\x8b\x8a\xd0\x31\x36\x1d\xe9\
+\xdd\x74\xc9\x03\xd3\x71\x55\xa2\x20\x46\xe4\xac\x81\x92\x9f\x28\
+\xa3\x02\x32\x7c\x01\x26\x3d\x5d\xbb\xa6\x6d\xdb\xb6\x21\x01\xf1\
+\x55\x52\xe1\xa7\xa6\x03\xb1\xf5\xc1\xef\x7d\x6e\xda\xd8\xd3\x73\
+\xc0\xb7\x3a\x5a\x52\x0d\xf5\x8c\xb9\xdf\xfb\xf4\xb8\x18\x57\x99\
+\xd6\x42\xc9\xe1\xd7\x60\x3d\x8a\x0d\xc0\x0b\x7d\xc2\xb0\xe9\x07\
+\x0c\xe4\xf0\xef\x26\x3d\x9f\xcc\x7c\xd3\xd6\x8f\x7e\x65\xc2\x45\
+\x11\x45\xfa\xcf\x51\x1a\xc6\x61\x9f\xf7\xe8\xa9\xbd\x55\x59\xdc\
+\xd4\x1d\x7a\xb9\xc2\x3c\x16\x54\xc7\x54\xee\x08\x64\x0d\xd6\x0b\
+\x56\xd5\x76\x7d\x68\xf2\x40\x1c\xca\xd3\x85\x79\x62\x99\x28\x77\
+\xb5\x3c\x68\x79\xd0\xb0\x08\x54\xe1\xf4\x6d\x9a\x52\xc8\x29\x30\
+\x39\xef\xc0\x86\x6f\xde\xf2\x8e\xe3\x8f\x2f\x0e\x0a\x94\xc1\x6b\
+\xa1\xa8\xe2\x04\x49\xd5\x81\x0a\x3a\x55\xa7\xbe\xef\x2b\xb0\x96\
+\x14\x75\xa6\x01\xa9\xfc\x2b\x27\xad\x40\x4f\x02\xfd\xad\x11\xe7\
+\xf9\xbb\x4c\x06\x76\x12\x60\xd2\x36\xbf\x1a\x55\x83\x54\x6b\xa1\
+\xa6\x66\x9f\xc8\xaf\x49\x51\x29\xd9\xa3\xca\x0c\xc6\x23\xa5\x03\
+\xb4\x7e\xbb\x4c\x40\xef\x1b\xe5\xb9\x21\x69\xf8\x2c\x22\x41\x0f\
+\xf1\x8e\x19\xe3\x86\x07\x26\x05\x67\x1f\x52\x64\x73\xa4\x76\x23\
+\x93\xb3\xa3\x80\xc9\x5e\x9e\x50\x8a\x32\xc1\x92\xa2\xd0\xe4\xd8\
+\x8e\x4c\x09\x47\xce\x6f\x22\x9d\x1e\x35\x70\xe6\xf9\x65\xdb\x57\
+\x5d\x1a\x53\x24\x87\xd8\xad\x62\xdc\x74\xe3\xf2\x24\x2f\x09\xa9\
+\x1d\x35\xff\x98\xeb\xed\xec\x38\x94\x29\x60\x66\x4b\x0a\xbd\xb7\
+\xbc\xf7\xfa\x34\xcb\xe1\xff\x02\x09\xde\x38\xe2\x53\xf9\xbc\x2c\
+\xe6\x33\x76\x86\xcf\xed\x4d\x90\xb7\x6c\x79\x68\x3a\x1e\x65\x9c\
+\x22\x61\xa4\x29\x83\x44\xfb\x03\x98\x0f\xc5\x27\x4d\x52\xd6\x53\
+\xf4\x34\xa7\x0e\xae\x30\x69\xfa\x12\xe3\x20\x82\x38\xb8\xd8\x60\
+\x3c\x1b\x9f\xa7\xf3\x22\xfb\xd1\x8c\x92\x01\xe4\x64\x94\xab\x25\
+\x2d\xc9\xe5\x5b\x7a\x32\x41\xc5\xe2\x03\x25\xa9\x11\x94\xa9\xaf\
+\xda\x9e\x98\x7a\x58\x78\x80\xd5\x87\x79\x5c\x07\x7f\x81\xd3\x83\
+\xba\x19\xf9\x5b\x46\xb7\x69\x9a\xa7\xe9\x65\x31\x16\x3a\x76\xe4\
+\x6f\x26\x8b\xa3\x9c\x73\x10\x0a\xd3\xd7\xc0\x13\xc9\x3a\x93\x75\
+\x72\xc6\x89\x78\xcf\x5c\x77\xca\x24\x30\xc5\x46\x79\x3b\xaa\xa1\
+\xe8\x46\xde\x16\xfe\xdd\xd6\x2c\xbb\xec\xab\x6f\x3f\x28\x5b\xdd\
+\x13\xd3\x28\x04\x97\x7e\xf4\xe4\x64\x1c\x41\xc6\x78\x19\x4e\x94\
+\xb8\x6f\x68\x8a\x7c\xb3\x58\x28\x57\x66\x12\x3b\xaf\x20\x55\x99\
+\x7c\x7e\xb4\xbb\x41\x2b\x8e\x55\xaa\xd0\xcd\xf8\x69\x9a\x77\x55\
+\x45\xc0\x7b\xc9\x94\xa2\xc6\x44\x5f\xa4\x48\x4a\xd1\x12\x7e\x09\
+\x7e\x34\x82\x12\x21\xb0\xb5\x50\x48\x29\x70\xc2\x33\xd1\xb3\x55\
+\xdc\x0c\xc6\xbe\xe0\x6e\x2c\x4a\x49\x8f\x96\x02\x92\x16\x85\xa9\
+\x6f\x26\x67\x84\x0c\x9c\x02\x55\xab\xcb\xfa\xb3\xd4\x04\x5c\x6b\
+\xf2\x7d\xf9\xe6\x63\x36\x15\x7c\x78\x3a\x96\xbd\xbd\x1d\xa5\x08\
+\xa9\xc1\x89\xa2\x98\x56\x97\x5b\xb5\x70\x54\x42\x15\x25\x87\x51\
+\xc6\x8c\x1a\x11\x05\x50\x57\x15\xf9\xec\x55\x8a\xf2\x8e\x9f\xec\
+\x99\x8e\x07\x06\x64\x64\x32\xd9\x77\x12\x55\x61\xbe\x11\x50\xc6\
+\x19\x16\xfd\x91\xe6\x0b\xeb\x51\x06\x67\x9a\xd2\xe2\xcd\x13\x83\
+\xec\xd4\x7a\xd3\x57\xf0\x1b\x97\x5c\x73\xcd\xde\x9f\xec\x08\xd9\
+\xa4\x4a\x7d\x7d\x06\xa4\xba\x0a\x4a\xb1\xa3\xbe\x6e\xc7\xe0\x4a\
+\x9a\x2d\xbd\x47\x13\x21\x33\xde\x34\x11\x82\xac\x1d\x76\x14\xf9\
+\x51\x0e\x9c\x06\xd5\xce\xaa\x6a\xc6\x24\x88\xa0\xd0\xeb\x48\x20\
+\x1d\x45\x59\x99\x6a\x53\x10\xb7\x6d\x1a\xca\x7a\x6f\x9e\xe0\x98\
+\x1c\xdb\x91\x1f\x35\x05\x46\x7a\x78\x47\x6f\x4a\x62\xbe\x89\x2c\
+\x4c\x6f\xee\x23\x3d\xc1\x77\x5a\x7c\xdc\xcc\x93\x17\x87\x13\x24\
+\x9d\x93\x76\x74\x39\xe7\x0c\x45\x5b\xa8\x91\xab\xd7\x03\xac\x36\
+\xe3\x99\x1f\xc0\x02\x2d\x07\x25\x02\xd2\x82\x85\x1d\x85\xf2\xaf\
+\xe0\x7a\xbd\x2b\x34\x69\x2a\x8f\xcb\x37\x60\x3c\x06\x68\x4a\xb0\
+\x0d\xf3\x99\xf7\xec\x41\xc1\x7a\xd8\x27\x8d\x9e\x34\xd4\x03\x4e\
+\xdb\xab\xd1\x59\x15\x19\x18\x9c\x0c\x35\x7c\x13\x46\xcf\xf8\x30\
+\xc1\xfb\xc6\xa8\xf5\x45\xe1\xc8\x1c\xd6\xf7\x35\x7a\x02\x40\xe3\
+\x40\x81\xd3\x67\x9c\x6d\x0d\x5c\xa1\x6a\x37\xae\xd7\x79\x74\xe5\
+\xa6\x62\x49\xd1\xec\xc6\x32\x2a\x54\x05\x41\x4b\xeb\x42\x79\x12\
+\x71\x15\x30\x94\xde\xb5\x11\x8a\x32\x71\x44\x02\xb4\xb3\xf2\xa2\
+\xd6\xec\xad\x29\xd5\x89\x56\x22\x29\xdc\x83\xaa\xc9\xcc\xd9\x83\
+\xa8\x44\xc5\x30\x89\xfd\x8a\x14\x86\xc9\x08\xa9\x4e\x57\x5d\x36\
+\x20\x69\x65\xd6\x13\x50\xb5\xa4\xa0\x66\x9c\x8e\xf5\xd0\xfa\xe8\
+\xf0\xd1\x44\xe8\x34\x09\xec\xc7\x9e\x29\x31\x30\x31\x7d\x02\xc2\
+\xb2\x5f\x0b\x62\xda\xe7\xec\x6d\x13\xd4\xdf\x1b\xa8\x08\x13\x7d\
+\x4f\x3c\x1d\xd4\xe1\xec\x65\x38\x6f\x18\xef\xf2\xa3\xcc\x78\xf8\
+\xa6\x94\x58\xaf\xed\x59\xb0\x50\xa8\x85\x81\xa2\xbc\x00\x28\xfc\
+\x7c\x6d\x8c\x93\xb3\xf8\x0a\x31\xf1\x3a\xef\xeb\xf5\x68\x79\x33\
+\xea\xc4\x2f\x6d\xcc\x14\x94\x76\x28\x5c\x87\xb5\xe6\x45\x03\x13\
+\x4f\xcd\x3e\xda\x1d\x81\xd2\x6f\x44\xf4\xab\xb3\xd8\xe0\x1b\xde\
+\xe2\xc8\x2d\x4e\x70\x5d\x80\x5a\x9c\xe8\x29\x89\x8f\xa5\xe7\xb0\
+\x0f\xd6\x4b\x82\x84\x16\x97\x86\x50\x80\x06\x2b\x32\xce\x68\x22\
+\x94\x27\x95\xaa\xad\x89\x4a\x4a\x7e\x19\xd6\x17\x66\xbb\x2c\xbd\
+\x4f\x08\x49\xbc\x17\xa5\x1f\x7d\x1a\xeb\x84\xbe\x17\xb7\xaf\x67\
+\xcf\xe4\xdb\xdb\x09\x67\x06\x19\x05\x2d\xad\xa4\x3a\xbe\x87\x07\
+\xca\x94\x04\xe4\x5d\xee\x93\x1f\x24\xc5\x13\x63\xee\x8d\x15\xb5\
+\xad\x1a\xae\xdb\x91\xbb\xc5\x33\x18\x7c\xab\xf7\x82\x4f\xdf\xfc\
+\x82\xd6\xab\x79\xf2\x32\x0a\xb4\xba\x57\xa6\x6f\x2f\xa8\x70\xf9\
+\x36\x1e\xb5\x03\xfd\xcd\x99\x97\x51\x90\x35\x55\x74\xa9\xd1\xa3\
+\x1a\xa6\x49\x56\x6b\x99\xb0\x9f\x77\x18\xfd\xbe\xde\xfb\xfa\x2e\
+\xb4\x71\x69\xf9\x50\xeb\xe8\x49\x54\x5d\x96\xc4\x91\xd4\xb5\x0e\
+\xc3\x86\xd2\x62\x15\xc9\x1f\x6c\x98\xaf\x4c\xaa\xf8\xa0\xa8\x0b\
+\x4a\x8a\xb8\xfa\x6e\x4c\x75\xa1\x82\x12\x40\xed\x90\xe8\x09\x35\
+\x26\x40\xed\x6e\x78\x5b\xd1\xdd\x3f\x4a\x20\x55\xf3\xa1\xf5\x08\
+\x4c\x0a\xae\xde\xd0\xce\xd9\x84\xf8\x89\xb2\x1e\xb3\x9d\x77\x62\
+\x96\x73\x61\x84\xd4\x3e\x71\xbe\xc9\x24\x9b\x87\x36\x35\xee\xb8\
+\xce\xab\xb7\xf6\x08\x99\x71\x5a\x20\xc5\xae\x5e\x95\x49\xe3\x51\
+\xc8\xa9\xed\xc3\xc7\x61\x26\x43\x4d\x79\xe4\xe5\x73\x4f\xf2\x44\
+\x68\x99\x60\xcd\x54\xa7\x28\x84\x76\x68\x5b\x6d\xce\x18\x6a\x43\
+\x6b\x5a\x15\x6c\x9c\x84\x11\x38\x01\xd6\x0c\xa3\x46\x78\x7b\x8a\
+\xa6\xba\x46\xe9\x54\x19\x05\x54\xf6\x45\xea\x3b\xfd\x56\x84\x57\
+\x06\x5b\xf3\x0b\xc3\x22\xf5\x81\x33\x76\xa1\xde\xdb\xfb\xde\x3c\
+\x36\x4c\xcd\x63\x6c\x99\xe1\x3a\x3e\xbd\xa7\x07\x4a\xa4\x49\x8c\
+\x98\x82\x9a\x32\x05\x2d\x6c\x3e\x0c\x3e\x2d\x7e\x5f\xef\x3c\x13\
+\xc3\xf5\x5b\x50\x21\xa8\x85\xe9\x73\x3a\x25\xa4\xd3\xf8\x7b\x17\
+\xe5\x81\xb0\x4e\xef\xbd\x79\x32\x7d\x4f\x30\xa2\x19\x93\x15\xbc\
+\x77\xa7\x9a\x64\x5a\xf9\x04\xf3\x91\xd7\x61\x90\x16\x2e\x60\x26\
+\xde\x27\xe9\xea\xca\x37\xc6\x8e\x52\xef\xa0\xc0\xc5\xe0\x04\x59\
+\x31\xe3\xba\x4c\x4b\x57\x44\xf7\x6e\x6f\x87\xed\x08\x40\x5a\xdb\
+\x04\xc5\x9f\xd7\x01\xe1\x07\xe1\xe4\x98\xc4\xb0\xbf\x40\xa0\xd7\
+\x86\x09\xe1\xa4\xc5\x9f\x6d\xe8\xc3\xd3\xeb\x6a\xa0\x76\x07\x25\
+\xa0\x68\x65\xa5\x54\x39\x8f\xc0\x99\x61\x02\x69\x89\xc0\xd9\x31\
+\x5e\xd9\x5e\x93\x7d\x42\x58\x0a\xa2\xca\xe2\x72\x25\x40\xab\x7c\
+\x6f\x6b\x7d\x6b\x08\x4a\x9c\xc0\x70\x91\x93\x22\x2d\x60\x9c\x7c\
+\xea\xb1\x4c\x40\x52\x83\x12\x91\x13\x62\xd1\x44\x20\xfa\x5a\x18\
+\xa0\xba\xb6\x4c\x06\xca\x10\xad\x6f\x2a\x79\x16\x66\x17\x2a\xae\
+\x09\x3e\x54\xa5\x14\xd9\x92\x76\x80\x07\x39\xb5\x81\xb3\x8f\x97\
+\x3b\x3d\x13\xcc\x3d\xbf\x52\xdd\x88\xba\x5c\x49\x81\x93\x0d\xc6\
+\xd5\x1b\x51\x85\x57\x72\x4a\x4f\xe0\xd0\xa7\xd1\xd2\xa6\xb9\x40\
+\x2b\xbb\x5b\x96\xed\x27\x0c\x7e\x6e\xad\x28\x07\x25\x90\x53\xd4\
+\x99\x12\x5e\x98\xe3\x3c\xbb\xe3\xe6\x59\xc1\xa1\xa5\xf8\x5e\x34\
+\x7d\x7e\x94\x16\x2f\xa7\x80\x69\xad\xe8\xbc\x13\x2d\x00\x8b\x30\
+\xaf\x34\xd1\x93\x2a\x13\x60\x7a\x5d\x72\xe2\x49\xb3\x57\x0d\x2c\
+\xcc\x54\x81\x32\x3d\x69\x31\x32\x8a\x04\xa9\x1b\x7c\x88\x8d\xb0\
+\x39\x9c\xf0\xf3\xb6\x58\xef\x8f\xaf\xce\x73\xa1\x79\x05\x21\x85\
+\xb7\x87\xbd\xf7\x81\x33\xa6\x09\x9f\x6a\x9a\x20\xab\x97\x53\x8d\
+\xef\xb1\x5b\x02\x5d\x11\xe1\xe1\xa0\xb5\x09\x9c\x09\xa7\x0f\x47\
+\x89\x90\x58\xad\x29\xb5\xb9\xd1\xd4\xee\x43\x15\x62\x39\x67\x63\
+\x87\xd0\x49\x00\xfb\x5a\x83\x37\x53\x28\xda\x02\xa7\xe1\x7f\x66\
+\x37\xa2\x88\x43\xc3\x37\x12\x79\xc0\x89\x5d\xa8\xb8\x7a\x53\x6c\
+\xe8\x13\xf3\x01\x18\x3a\x6f\x63\x92\xee\x3e\xfc\xca\xf0\x3d\x15\
+\x8c\x10\x53\x9f\x23\x73\x1b\x7b\x79\xd5\xb0\xf8\x9a\xd2\x49\xb0\
+\xf6\x85\xf9\xb6\x5e\x6f\x30\x9a\xca\x9d\xa7\xa8\x69\x76\x84\x2a\
+\xe9\x23\x0b\x52\xb9\xcd\x9f\x19\x30\xa0\x51\xa9\xcc\xe6\x1e\x15\
+\x31\x5f\xaf\x4f\x3a\x14\xaa\x33\xf7\x34\xb0\x28\xf1\x9b\x01\x06\
+\x54\xd5\xfc\x19\x4a\x9f\x7e\x12\x5f\xef\x6c\xa8\x60\xb5\xf5\x7a\
+\x07\x53\xa0\x82\x9c\xd0\x7a\x2b\xa2\x78\x29\x35\x37\x86\xfa\xf8\
+\xaa\x5c\x83\x7b\x73\x30\xd4\x2a\xbd\xf8\x78\xe3\x9c\x4a\x13\x3b\
+\x71\xab\x86\xad\xd7\xeb\xb2\xd2\xe2\x0c\x6f\x77\xd2\x16\xa3\x83\
+\xf7\xe9\xc6\x2f\xd3\xc1\x13\xb0\x9f\x51\xf2\x2c\xe0\x99\x8c\x88\
+\xaa\x69\xd2\xa9\x58\x35\xed\x88\x82\x18\xc2\x67\xa8\x92\x77\xf9\
+\x62\x9e\x2a\x30\x1f\x8c\x17\xb4\x5b\x37\x73\x39\x7c\xdc\x14\x52\
+\x41\x29\xd3\x46\xa4\xc6\x3d\x41\xe5\xe7\xd5\xeb\xbd\xd6\xbb\x1a\
+\x23\x7c\x3d\xf4\x09\x04\x55\xaa\x1e\xe5\x12\xee\x63\xa3\x66\x36\
+\x0f\xfe\x93\x26\x06\xec\xa8\x2c\xf4\xc0\xd8\xbb\x7a\xbd\x7e\x43\
+\x8f\x90\x18\xf7\xad\xc3\xde\x85\xc2\xd1\xaf\xa2\x8e\xe1\xe5\x09\
+\xf6\xa2\x4e\x4a\x4d\x1c\x0a\x3b\x2a\x4f\x93\xf5\x7d\x5f\xaf\xc7\
+\x00\x54\xb0\xde\x36\x68\xf9\x34\x09\x9c\x68\x1a\x3b\x4b\xae\x5a\
+\x1e\x29\x4c\x94\xeb\x95\xb0\x96\x9a\xb0\xa3\x8a\xd6\x0c\x5f\xaf\
+\x87\x4a\x81\xef\xfa\xb6\x5a\x2f\x45\x11\xbb\x15\x81\xce\xc7\x5e\
+\x83\x83\x13\x77\x63\x41\x51\xc0\xe2\x5b\xb4\x33\x3b\xaa\x7a\x54\
+\xfa\xf3\xf5\x88\x9f\x00\xd2\x15\x1a\x7c\xd1\xd6\x88\xa7\x2e\x02\
+\x75\x2b\xf5\xee\x3c\x96\x2b\x44\x28\x94\x4d\x8f\x5a\x01\x80\x6c\
+\xaa\x36\x01\x6b\xbb\x5e\xef\x93\x8e\x0c\xd5\xda\x52\x5f\x15\x01\
+\xeb\x19\xe9\xef\x92\x71\xaa\x2c\xeb\x51\x5f\x2e\x9c\x8c\xf2\x5b\
+\x9f\xba\xfb\x7c\x3d\xcc\x93\x13\x52\xa0\xf5\x9e\xc9\xe0\x6c\x7b\
+\x7a\x3a\x3d\x31\x46\xf3\x8b\xb4\x8e\x42\x46\x7d\xcc\xac\x3f\x7d\
+\xe9\x30\x81\xb3\xa2\xf5\x5e\x49\x81\x9a\xcc\x38\xf6\x4c\x6d\xa4\
+\x02\x35\x7f\x77\x6c\xa3\x9f\x36\x1b\x75\x78\xf8\x44\x1e\x10\x9b\
+\x94\x8e\x2b\x36\xb5\xc2\xe6\xc4\xd9\xd0\xee\x4e\x32\x5b\xb2\x85\
+\x69\xd2\x68\xf4\x14\x11\x52\x82\x08\x9c\x85\xfa\x28\x0b\x18\xa7\
+\xab\xe3\x8b\xbf\x91\x26\xd1\x0f\xd4\xeb\x15\xa7\x05\xeb\xec\xa8\
+\xdf\x33\xf9\xf8\xf9\x28\x9f\xf3\x4b\xcd\x29\x56\xdf\x9e\x93\xb2\
+\xb3\x47\x4b\x11\x74\xde\xd7\x43\x50\xaf\x57\xbd\x07\xeb\xe7\x1f\
+\xb7\xf4\xca\x84\x6b\x3f\xf2\xad\x69\x46\x5d\xad\xe3\x8c\x71\x42\
+\x4c\x39\x90\x2a\x3a\x7a\x9e\x12\x6c\x46\x6b\x7f\xf3\x0b\xaa\xe0\
+\x1a\x45\x81\x98\x4d\x29\xed\xcc\x38\x2b\xf3\x53\x03\x97\x99\x9f\
+\xfd\x5f\x6c\xb6\x9f\x10\xc2\xd4\xb0\x5e\xea\xf5\x5e\x52\xa5\xa3\
+\x40\x45\xc0\x2a\xfe\x90\xa6\xb6\x64\x3a\xd6\x03\x9f\x0f\x4a\x8c\
+\xb1\x87\x19\x15\xda\xd2\xc9\x8b\x07\xa7\x50\xa5\xd4\x68\xbd\xf3\
+\xf5\x4c\x4a\x7e\x9b\xce\x76\xc8\x69\xbf\xa1\xee\x5c\x1d\x01\x4a\
+\xb4\x3c\x7a\x3b\xea\x92\xe3\x30\xa3\xf9\xe5\x7c\x26\xf2\xf0\x22\
+\x36\x76\x50\xa6\x00\x95\x24\xc0\xb4\x91\x41\x04\x5c\x46\x47\xcd\
+\x28\x32\xb9\x3e\x6a\x06\xeb\x8d\x07\xa5\xed\x32\x50\xfa\xfb\x89\
+\x8e\xca\x59\x0c\x75\xf6\x50\x78\x28\x7b\x6a\x23\x67\x95\x50\x18\
+\x51\xb7\xb7\x77\xbe\xde\x27\x72\x7d\xff\x68\xd5\xd0\xfa\xd4\x15\
+\x1c\xbe\xaa\x3d\xe2\x83\x34\x85\xc6\x23\x5f\x42\x20\x4d\xe0\x0c\
+\x88\xde\xdd\x0f\x55\x93\x6c\xae\x84\x96\x95\x4e\x4c\xb1\x20\x1e\
+\xad\x2c\xeb\x61\x47\x53\x39\xcf\xff\xaa\x09\xb4\xbe\x48\x29\x7a\
+\x72\x22\x0a\xad\x47\xd5\x0e\x2e\x14\x04\x35\xe6\xb3\xef\xe2\x7b\
+\x20\xf5\xc5\x06\xe7\x42\x53\x28\xd3\x2f\xdc\xbc\x97\x0e\x32\x0d\
+\x44\xeb\xc9\x34\xa5\x85\xb4\x91\x5a\xde\x9b\xbd\x28\x40\x22\x24\
+\x21\xa4\x90\x50\xef\xeb\x51\x17\x69\x83\x85\x8c\x0e\x5c\x86\x8c\
+\x66\x96\x6d\x14\x77\xcf\x8c\xe7\x08\xaf\x19\xe5\xa5\xa6\xb1\x00\
+\xed\x83\xbc\xd2\x34\x46\x94\xe5\x13\xf5\x7a\x97\x26\x01\x46\x13\
+\x38\x07\xde\xd3\xec\xa8\x2e\x0b\xde\x37\x50\x53\x36\xeb\x92\x20\
+\x55\x8d\xc2\x40\xec\x6c\xfc\xbc\xa3\x28\x2a\x4c\x88\xa0\xbd\x42\
+\x79\xc5\xef\x59\x80\x88\x98\x91\xc7\xcb\xfe\x84\x8f\xb5\x89\xd6\
+\x4b\x69\x59\xf5\x08\x68\x6b\xa3\x51\xdd\xf7\x3d\x59\x5f\x6a\x82\
+\x7b\x73\x08\x83\x5e\x6e\x73\xd7\x41\x53\x64\xf3\x32\x71\xf7\x47\
+\xaa\x54\x98\xcf\xda\xd4\x11\xdc\xd7\xa8\x81\x32\x4c\x9f\xcb\xe3\
+\x60\xc4\x86\x79\xbe\x6c\xdb\x7d\x65\xa2\x2b\x88\x65\xd4\xa7\xa1\
+\x89\xfc\x0c\x31\x29\xc1\x94\x5a\x53\xe7\x26\x34\x61\x8a\x92\xeb\
+\x94\xc9\x87\x06\x90\x17\x23\xa0\x8a\x54\x13\x26\x18\xf3\x4f\x8b\
+\xf4\xda\x7d\x64\xa9\x1c\x0a\xd6\xd6\xac\x38\x1f\x8d\x31\x29\x1b\
+\x28\x34\xe7\xf1\xbb\xb0\x4a\xaf\x31\x09\xa7\x74\xf4\xe4\x8d\xbd\
+\x4c\x09\x38\x09\xa9\x93\x4e\xab\x4f\xbe\xba\xec\xbb\x4a\x22\x55\
+\x09\xea\x29\x10\x52\x51\x77\x5a\x0d\x45\x7d\x17\x21\x2f\x35\x3d\
+\x2e\xca\xc7\xdd\x9e\x3f\x37\x1e\x85\x1d\x95\x27\x45\x2d\x14\x11\
+\x3e\x01\x25\x21\x5d\xff\xa6\x43\x24\x9e\xa6\x74\x8b\x74\x6e\x22\
+\x13\x45\x31\xbf\xc1\x23\x6c\x66\x25\xc6\x03\xa1\x8b\x47\x3d\x45\
+\xad\x12\xc1\x96\x32\x52\x3d\x4d\xf9\x21\xa9\xdc\x35\xda\x88\x5c\
+\xed\xce\x10\x14\x22\x6a\xb7\x4c\x48\x96\x00\x28\xaf\x2e\x1e\x45\
+\x83\x56\x77\x87\x0e\x4f\x69\x7e\x79\xa3\x00\xbd\x6d\x14\x94\xc9\
+\xd2\xb3\x9c\x53\xb0\xef\xa2\x28\x94\xca\x44\x24\xa6\x82\x03\x7c\
+\x00\x69\x1b\xb4\xa0\xf6\x30\xf6\xaa\x51\x7a\xb0\x72\xf5\x04\xc5\
+\x30\x6f\x9e\x92\x04\x38\xf9\xa3\x2d\xa1\x0c\x0a\xde\xc9\x27\xf0\
+\x5d\x3c\x3a\xaf\x5e\xcf\x4c\xf7\x1d\x10\xff\x16\xcf\x3c\xec\xdb\
+\x33\x2e\xb4\xd8\x10\xde\x04\xd5\x53\x15\x22\x0a\x9d\xf7\xea\xa4\
+\x67\xeb\xbd\x71\xf2\xf1\x28\x6e\xd0\xf2\xd9\xbc\xf8\x12\xdd\x17\
+\xb0\xff\x7a\xe2\xbe\xc9\x38\x2b\x1a\x09\x7c\xa3\x4c\x2d\x5d\x42\
+\xfc\xe4\xa2\x7c\x98\xa7\x2e\xcd\xf7\xf1\x28\x28\xda\x1d\x39\xbb\
+\xb6\x27\x71\xf5\xf3\x65\x14\x05\x46\x5d\x69\x76\x75\x11\xce\x2d\
+\x88\xcd\x8f\x47\x73\x9b\x24\x4b\x79\xb5\x5a\x8f\x41\x04\x85\x81\
+\xf2\xaa\x64\x3c\x3d\x6f\xef\xc0\xfd\x21\xd2\x63\x50\x7b\x9f\x27\
+\xf1\xe4\x5c\x21\x11\xbe\xdf\xd0\xe3\x2e\x1d\x53\x06\x67\x8a\xa2\
+\x5e\xef\x7b\x89\xd0\x55\x22\x37\x0e\x03\x25\x16\x93\xc9\xe3\xcf\
+\x9f\x1f\x8f\x56\xad\xb3\x22\xec\xde\x19\xaf\xf8\xfa\xcc\x92\x14\
+\x62\x5a\xd2\x3f\xac\xaf\xa7\xc9\x42\x0a\x82\xf2\x00\xcb\x91\x23\
+\xa3\xb0\xcf\x5f\xf7\xe4\xc2\x51\xc9\x94\x54\xd6\x3c\x19\xbe\x9b\
+\x7e\x5c\x8a\xf2\x05\xa9\xab\x82\xab\x07\xc5\xa1\x16\x1c\x08\xae\
+\x51\xaf\xf7\xbe\xde\xb0\x7f\x7e\x3c\xea\x7b\x4a\xe0\xef\x6d\x0b\
+\x21\x6a\xf5\xb6\x5e\x6f\xbb\x20\xa0\x4e\xa5\x3f\x66\xad\x12\x0a\
+\xe6\xfb\x02\x23\xae\x4b\xf5\x09\x08\xb7\xfd\x24\xe9\x0c\xd3\x75\
+\xe2\xf3\x52\xb8\xbe\x3c\xc8\xa7\x46\x4f\xa2\xf5\xf3\xce\xd7\x1b\
+\x5f\xef\xfb\xf0\x01\xd2\x1a\x7c\x0c\xa8\xbc\x70\xbf\x68\x5f\x97\
+\x09\x19\xa5\xd5\x94\xc1\x21\x9d\xb8\xdf\xd1\x07\x4e\xfa\x78\xee\
+\x83\xf7\x18\xae\xc7\x19\x03\x38\xa1\xf5\x2c\x9f\xa6\x5e\x5f\xf2\
+\xe2\x8f\x36\x98\x0c\xa9\x73\xf5\x4a\xd5\x46\x82\x5c\x41\x02\x63\
+\x2b\x93\xcb\x05\xb1\xbc\x4d\x50\x6c\xee\xe4\x4a\x9d\x22\x33\xf7\
+\x7a\x02\x61\xd1\x2a\xd7\x1b\x6f\xef\x60\x12\xb3\x91\x23\x0d\x08\
+\x69\xb1\x66\xc9\xd7\x99\x7c\x75\x19\x9a\xc4\x0b\x43\xe4\x29\x8f\
+\xb2\x5e\x2a\x77\xae\x57\xc3\xd5\xeb\x25\xd2\xc3\xd0\x3e\x6c\x36\
+\x4e\xf1\xed\x38\xff\xc1\xd3\xaf\xb0\x06\x0a\xf5\x7a\x0c\x25\x24\
+\x7d\xc4\x2f\x08\x29\x8b\xa8\xd6\x99\x8c\xd6\xab\x12\xb9\x7a\x7d\
+\xc0\x6d\xf8\x8e\x32\xb8\x37\x50\x42\xce\x4f\xd3\x65\x27\x65\xd7\
+\x35\xf3\xe1\xb1\x15\xb1\x2c\x6b\xb5\x12\x21\x8d\xab\x75\x26\x5f\
+\x0f\xa3\xc5\xd5\xeb\xad\x74\x9a\xd4\x38\x28\xab\xb4\xa4\x37\x5d\
+\xb7\xf8\x83\xdc\xd0\xd4\xd6\xeb\x81\x15\xdd\x59\x7a\x9c\xa9\xc8\
+\x54\xe9\x71\x62\xc4\xf6\x95\xf0\x9d\x54\x73\xeb\xf5\xc0\x8b\xd4\
+\xb8\xc2\xb4\x29\xb2\x2b\x22\xd0\x6f\xde\xa5\xfa\xb4\xc2\x9b\x27\
+\x98\x52\x65\x3d\x88\x9a\x05\x94\x71\xe2\x46\xf4\xce\xb6\xcc\xba\
+\x95\x22\x87\x84\x22\x26\x51\x8a\x12\x68\x6f\xf0\xf9\x3a\xbd\x0b\
+\xc6\x1d\xbe\xde\x3a\x26\x46\x8a\x03\x8c\xe4\xef\x35\x35\xae\x51\
+\xb3\xf6\xe1\x03\x66\x82\xb7\xf8\xfb\xda\x79\x26\x01\xaa\x77\xcc\
+\xf3\xe3\x62\xbd\x15\xbd\x63\xc7\xf7\x8f\xef\x72\x7d\x4f\x83\xf9\
+\xfd\x8e\xb8\x7e\x14\xca\xc4\x24\x45\x1f\xbe\xad\x82\xf2\xca\xb9\
+\x71\xa7\xef\xa8\x86\x09\xd2\x8b\x77\x7d\xbe\x79\x2d\xba\xd6\xc1\
+\x93\x2a\xed\xab\x31\x85\xd6\x0f\x9a\xea\x94\x32\x31\xf5\x95\xb5\
+\xc2\xe6\xd4\xee\x42\x11\x94\x80\x9a\x6a\x4b\x6b\xb9\xac\x02\x37\
+\x95\x08\xb3\x59\x3e\x77\x07\x90\xf1\x62\xc5\x63\xa3\xbe\x6f\xc3\
+\x1f\x76\x27\x20\xaa\xbc\xeb\x70\x83\xdc\x9a\x07\x92\x82\xa2\x08\
+\x9e\x3b\x2b\x22\x04\x51\x6f\xd6\xf0\x09\x88\x7e\x5c\xae\xdd\xac\
+\xa7\xce\xc7\x96\xf1\xba\x0d\xb9\xf8\xf6\xe7\xaf\x48\x6c\x4f\x89\
+\x17\xd0\x94\x4f\x04\xd3\x84\x3a\xb1\x8c\x0a\xc0\x02\x6a\xef\xa0\
+\xea\x20\x88\xae\xbf\x9d\xd8\xdf\xb8\x3c\x6f\xbf\x9e\x1a\x00\x21\
+\x2f\x3e\x87\x2f\xb8\x1b\x1b\x17\x8a\x2c\x2e\x86\x22\x05\x48\x90\
+\x54\x6e\x56\x80\xde\xe3\xa0\x90\x9e\x69\x00\xd2\x12\xc4\x44\x16\
+\x3f\x08\xe5\xab\x01\xf4\x78\xde\xb7\x61\xf3\x3f\xf6\x74\x3c\x96\
+\xb4\x33\x25\x95\xcb\x37\x66\x34\x5a\x91\x73\x01\x8a\x3a\x98\x6a\
+\xec\x81\x12\xc2\x59\x8b\x95\x47\x7f\xc1\xc5\x04\xe4\x9e\x1e\x09\
+\xa9\xb9\x76\x78\xe5\xb9\x20\xf6\x75\xb9\xeb\x1a\x77\x22\xca\x12\
+\x8a\xab\xb1\x0b\x5a\x94\xa2\xa6\x0f\xdf\x79\x7b\x60\x25\x6d\x52\
+\xa8\xa0\x68\x18\xd7\x7e\xe0\xc0\x8e\xa7\x27\x94\xca\x5e\x34\xac\
+\x5f\xb9\x04\xa0\x0f\x8e\xda\x14\x35\x26\x1f\xe7\x99\xb0\x1b\xa1\
+\xa0\xb4\x68\xe6\xc6\xad\x80\xa6\xba\xa9\xaf\xe5\xd6\x61\x04\xce\
+\xfe\xa2\x92\x3e\x3d\xf1\x26\xc2\x2f\xd1\xed\x86\x14\x97\x20\x70\
+\x5e\x17\xad\xfd\xea\x0b\x28\xd3\x89\xeb\x47\xdd\xbe\x1e\x09\x1d\
+\xc6\xcc\x8c\x27\xa7\x94\x15\x85\x6d\x1b\x86\x73\xc2\x10\xb8\x12\
+\x94\xbc\xf8\x22\x45\x7a\x48\x8e\x0a\x4e\x89\xee\xde\x4b\x42\x9a\
+\x5a\x9d\xff\xad\xb3\xef\x7d\x7c\xb1\xba\x90\x85\x74\x61\x06\x15\
+\xcd\x2f\x66\xe0\xcc\x65\x26\x38\xc5\x7f\x4a\x49\xa4\x2c\x70\xaa\
+\x0d\x5c\x97\x6c\x33\x53\xf4\x9d\xab\x82\x9d\xfc\xfe\xd8\x18\xfd\
+\xbe\x50\x54\x0d\x3e\xdd\xbc\x35\x6a\x02\xd5\xe7\xe3\x54\x7d\x4f\
+\xe7\xc9\xa8\xed\x7e\xd0\x02\x8e\x70\x3e\x43\xdc\x2c\xb5\x26\x37\
+\x12\x5e\x03\xce\xeb\xf5\x02\x60\x44\xf9\x52\x65\x8a\x00\x13\xf1\
+\xa0\xeb\x70\xd1\x3c\x33\x1e\xc9\x51\x08\xa9\x95\x51\x8b\x35\x55\
+\x17\x0a\x19\x15\xa5\xb7\x94\x94\xd4\x38\x30\xd6\xba\x0d\x79\x54\
+\x80\xbe\x2f\x67\x98\x8a\x93\x40\x92\x52\x45\xdf\xf9\xef\x6a\x49\
+\xa1\xf9\xfc\x5b\x58\x78\x4f\x00\xfa\xcc\xd4\x50\xd4\x85\xf8\x80\
+\x2b\xa9\xf1\x82\x63\x67\x68\x3f\xf6\xf5\xce\xda\xcb\x66\xf9\x1b\
+\x02\x74\xf5\x68\x16\x94\xf4\x31\xd5\xdb\x7f\x1c\x42\x6a\xfb\x9b\
+\x17\x16\x4e\x87\x25\xc5\x76\x79\x00\x90\xe8\x28\x41\x12\x42\x29\
+\x4a\x53\x8c\x13\x81\xe5\x37\x46\x8d\x2a\xe3\x4b\x5f\x96\xeb\x63\
+\x26\x33\x65\x7a\x89\xb0\x69\x88\x47\xbc\x37\x42\xaa\x50\x99\xa2\
+\x1f\x84\x90\xce\xef\x29\x81\x94\x42\xeb\xd5\x90\xc6\x51\x32\xe0\
+\x8e\xa3\x6c\x38\x24\xb2\xa6\x1a\x7f\x80\xac\x4f\x14\xd2\x7f\xfa\
+\xc6\x33\x3f\x0b\xdf\x6f\x58\xda\xdd\xd7\xab\x20\x58\x9b\x3e\x45\
+\xb7\x1b\x5a\x65\x62\x8a\x92\x90\x3e\x31\x32\x5b\x91\xaa\x6a\xb3\
+\xdd\x1c\x6a\xa1\xa7\x60\x88\x92\x79\x40\x25\xd4\xed\x96\x25\x1e\
+\x89\x9f\x74\x7d\xf2\x8e\x2c\xf9\xab\xc6\x85\x8a\xbf\xa3\xd1\x28\
+\x9f\x0c\xfc\x12\x0b\xa9\x6f\xd6\x58\x58\xf9\x69\xb6\xa4\x6f\xf9\
+\x44\x88\x5f\x36\x0f\x29\x70\xf6\xaa\x84\xba\xc8\xcc\x3e\x21\x3d\
+\x6a\x4e\x89\xb5\x46\xd3\xd5\x27\x7d\xaa\xf4\xef\xb4\xf7\x15\x1e\
+\x13\xef\xc4\x3d\xd9\x6c\x49\x33\x90\x13\x8d\xae\x24\xa4\x5f\x57\
+\x51\xaf\x11\xe1\x9b\xae\x71\x34\x37\x67\x7a\xc5\xbc\xf0\x9e\x21\
+\x16\x90\x4d\xc0\xd5\xea\x72\xad\x5e\x34\x32\xf6\x82\x63\x3d\x3b\
+\x5e\x5e\x0a\x49\xfb\x43\x15\xd2\x9d\x4d\xe9\x8c\x6c\x0f\x60\xdf\
+\x12\x76\x4e\x18\xd7\x8c\x7b\xa8\x82\x3b\x6b\x2f\x66\x94\x70\x66\
+\xda\xa3\xa3\x77\xe9\xe8\xde\xbe\x9d\xd2\x61\xaf\xc4\x40\x77\x01\
+\xde\x86\xb5\x5b\x0e\xdf\x76\x06\x7d\x1e\x29\x84\xf5\x11\xf0\xa7\
+\xc8\x92\xc2\xd9\xd3\xa5\xae\x1f\xfc\x52\xeb\xb2\xf2\x53\xf7\x8c\
+\x18\xa8\xab\x34\xb5\x94\x09\x96\x09\x59\x3c\x6c\xf2\x8c\xbd\xaf\
+\xd3\xf2\xca\x55\xbb\x98\xa4\x9f\x57\x98\xab\x1f\x5b\xae\xb2\x32\
+\xe1\xab\xaf\x36\x8d\x59\xfb\x89\xaa\x46\x48\xf9\x3a\xdf\x3f\xff\
+\x82\x45\x79\xd5\x35\x57\x4f\x46\xc3\xee\x7a\x3d\xc3\x74\xa9\xf1\
+\xc2\x16\x43\x8d\xd6\x27\xfc\xf9\x4e\xbe\x75\x7e\x42\x57\xd1\xad\
+\x11\x9c\x47\xa6\x03\xb1\xa4\xef\xa6\xfb\x0e\x23\x49\xc5\x94\xbe\
+\x28\x96\x14\xe5\x9b\x68\xea\x01\x72\xef\xcd\xfb\x17\x2b\x57\xaf\
+\x77\xd6\xd4\x50\x94\x7d\xbd\x3f\x2d\x80\x91\x28\xb2\xde\xe7\x52\
+\x0a\x48\x99\x83\x67\x4e\x73\xf6\xf3\x72\x01\xfe\xbe\x51\x40\x28\
+\x82\xba\x40\x0a\xb6\x33\xec\xf3\x6e\xff\xc6\xe6\x73\x57\x46\x8a\
+\x5e\x31\x03\x79\x78\xff\x64\x67\x3a\xa4\x5b\x3d\xb5\x5e\x3f\x98\
+\xd3\x98\xe9\x8b\x0d\xa0\x66\x13\xf0\x9a\x47\x9e\x8b\xaf\xa5\xc6\
+\x5f\xbd\x08\x40\x45\x48\xf7\xdc\x8f\xb0\xe4\x3f\x63\x27\xcd\x34\
+\xc1\x1f\xe6\x22\x2b\x74\x40\x64\xf2\xfd\x91\xa2\xdb\x9e\x21\x4a\
+\x3e\x35\xe1\xbd\xe8\xfc\xde\xbc\x14\x40\xfd\x5e\x44\x3b\xc9\x70\
+\xc1\x5f\x51\x5e\xfb\xdb\xc1\x50\xbe\x90\x07\xa0\x2f\x2a\xd0\xf5\
+\x13\xa2\x28\xfd\xfb\x8e\x69\x8a\xd8\xe9\x1c\x8a\x54\x88\xf7\x71\
+\x0e\x87\x46\xb9\xb7\xe4\x24\x01\x1b\xc7\xe3\x9d\x01\xa4\xbf\x93\
+\x0c\x01\x54\x96\x81\xf9\x0c\xd5\x6e\xec\x0b\x45\x89\x1b\xfe\x96\
+\x5e\xc5\xd0\xc6\x01\x68\x11\x0a\xe6\x37\xed\x23\x21\xe5\xdd\x1d\
+\x79\xd1\x29\xc2\x3c\xde\xd6\x3d\x95\xf6\x69\xbc\x77\x57\x4b\xbb\
+\x4f\x56\x6c\x43\x17\x16\x16\x3a\xb6\xcb\xce\x3a\x29\x35\xe9\x87\
+\xe4\x78\x21\x50\x2d\xd2\x8b\xf4\x0a\xdf\x65\x2e\xe0\x8f\x47\x3f\
+\xa5\x7b\x37\x33\x4a\x91\xac\xa3\xbe\x99\x1a\xcd\x2f\x44\xc0\x49\
+\x04\xfa\x4b\x86\x96\x91\xf2\x6b\x9f\x9e\x24\xac\xf9\x61\xf8\x23\
+\xc1\xb8\xa0\x86\x67\x6a\xf4\xa9\xb5\x05\x65\x98\x87\xce\x7b\xf8\
+\x8d\x17\xde\x59\x16\xf1\x57\x28\x35\x7e\x31\xe3\x10\x8f\x75\x7d\
+\x4b\x55\xce\x84\xf4\x5e\xec\x98\x77\x13\xf1\x97\x4b\x71\xf3\x00\
+\x79\xe6\x2b\xa3\x4c\xaa\xd1\x0f\xc3\xa5\xc6\x5d\x1f\xbe\xad\x2e\
+\x2b\xef\x81\x76\xeb\x23\xeb\xe4\x7e\xe1\xed\x11\x6b\x7a\x6b\xa0\
+\x26\xdd\x7a\xfe\x45\x89\x4a\x6a\x2a\x98\x8f\xeb\x44\x2d\xe9\x86\
+\x91\x6e\x98\x78\x9f\x7c\x7c\x1c\x4d\x93\x01\x39\x1e\x15\x62\xf4\
+\xc9\x37\x85\xa5\x41\xcd\x6d\xb8\x55\xc3\x67\xf0\x81\x35\xb3\x3a\
+\x7f\xb4\x79\x39\xf7\x1f\x93\x00\x7c\x72\x72\x30\xc2\x59\xd4\x90\
+\x74\xbb\x58\x52\x15\xd2\xde\xde\x52\x02\x3d\xe6\xf6\xf2\x20\x9a\
+\xfb\x25\x92\xdf\xb3\x5e\xf9\xf4\xe2\x28\x4d\x9a\x95\xf0\x05\xa2\
+\x28\x80\x76\xfe\xa5\x16\x45\x87\x56\x57\x18\xa8\x43\xcf\x6e\x3f\
+\xf5\xe8\xf9\x56\xae\x6e\xe1\x0d\xc9\x76\x12\xd2\x22\x29\xf1\x37\
+\x30\xee\x4d\x69\xaf\x2c\x77\x2f\x3e\xbb\x3b\x79\xe9\xf5\xbb\x58\
+\xed\x0e\x4c\x6b\x32\xa1\xef\xbd\xee\x7d\x8f\x8f\x03\xc8\x7e\x03\
+\x25\xc2\x3c\x73\x3b\x72\xcb\x3c\xf9\xed\x08\x28\x7a\xe9\x39\x07\
+\x89\x36\x7a\x43\xa5\xbe\x1f\xcc\x23\xd2\x25\xd6\x1f\xa9\x37\xec\
+\x66\x4b\x1a\x63\xbd\xf2\x0f\x7b\xed\xb1\x77\x5a\x69\xd7\x63\x42\
+\xfe\xa9\xe3\x7c\x58\x97\xd6\x9b\xba\x9d\x6f\x77\xe3\x94\x5e\xba\
+\xf1\xd4\x1e\xc6\xc1\xb5\x0f\x4c\x26\x5f\xbc\x7a\x1f\x01\x78\x20\
+\x02\x7d\x8e\xf5\x47\xa3\x92\x18\x7f\xbe\x6d\x91\x0c\xd4\xb5\xee\
+\x5a\xf0\xe9\x4e\x89\xf4\x13\x7f\x09\x25\x8e\xb4\xb8\x23\x03\xdd\
+\x27\x1b\x04\x24\x3c\xd3\xd1\x1e\xc6\xda\xe9\x62\x45\x96\xff\x3b\
+\x14\x84\x57\x51\xf7\x4f\xe5\x4b\xfb\x19\x29\x01\xed\x2d\x07\x98\
+\x6f\x45\x92\x49\x18\xb1\x76\x3a\x22\x9c\x0c\x4f\x36\x79\x18\x9d\
+\x17\x7d\x6d\x73\x49\x32\x75\xa0\xfa\x03\xd2\xcb\xaf\x82\xf7\x98\
+\x56\x85\x8c\xcd\xe4\x20\x23\x49\x29\xd8\x98\xca\x95\x44\xec\x38\
+\xd7\x2e\x5d\x5f\x2b\xbe\x7b\x64\x03\x75\xe3\xf2\x38\x27\x98\x26\
+\x87\xcf\x13\x52\x1a\x9e\x28\xa2\xc0\x89\x5a\xa8\x27\xaa\xd8\x7b\
+\x68\xd2\x6b\xf7\xae\xed\xb1\x9f\xa9\x52\x35\xf7\x67\x53\xff\x73\
+\xa5\x42\x7a\x2f\x97\x1c\xbe\x35\x13\x91\xf7\xeb\xd7\xf4\xae\xab\
+\x0f\x1c\x3e\xb1\x67\x3a\x2a\x24\x05\x81\x3f\x19\x4b\x20\x5d\xd9\
+\x76\x41\x4a\x62\xe6\x08\x46\x3b\xc2\x47\xb1\xde\xdc\x04\x50\x55\
+\x2f\xe3\x90\x2d\x55\xaf\x54\x5c\x44\x94\x1b\x15\x22\xa4\x1b\x76\
+\x96\x65\x91\x2c\x35\xd2\x71\x8f\x12\x1d\x57\xef\x58\x4e\x93\xb2\
+\xa8\x93\xa1\xfa\x27\xa1\x28\x85\x7a\x40\xea\xae\xcb\xc4\x30\x32\
+\xea\xcf\xdf\xcc\xcc\xd3\x56\x7a\x13\x7f\x77\x8c\xe0\x41\x4b\x02\
+\x1a\xed\x67\x41\xc2\xb8\xfe\xd9\x6b\x4f\xf9\xfd\x1e\xc6\x43\x77\
+\x2d\x6d\xd9\xf1\xd4\xe2\x28\xab\x4d\x52\x87\x86\xb4\xe9\xe8\x03\
+\x90\xdd\x2d\x5a\xdb\xa8\x55\xa3\xb3\xd4\x94\x3a\x83\xbf\xc4\x40\
+\xc9\x8f\x12\x45\xdf\x4c\x7f\xa5\x61\x1c\x85\xf4\x0f\x7a\x4d\xb3\
+\xb0\x85\x60\x7f\x66\x39\x5d\x13\x34\xad\x91\xcb\xa3\x85\x07\x71\
+\xde\xd7\x96\x2d\x3e\x6b\x47\xfd\x31\x5b\x98\x28\x13\x3e\x1d\x22\
+\x2d\x07\x45\x0b\xf2\xa5\x8f\x8d\xc8\xe6\x93\x62\xa9\xdb\x3f\xb9\
+\x2e\xb0\x7b\x71\x27\xe7\x1c\xeb\xda\x24\xf3\x84\xaa\x8d\x7b\x7f\
+\xfa\x8e\xf3\xb0\x4d\xa0\x68\x17\xe7\x81\xd3\x8c\x92\xd3\x5e\x7a\
+\xdf\x74\x4a\x0e\xf1\xe5\x93\xbc\x8c\xe3\xf2\x7f\x11\x94\x74\x8d\
+\x7e\x52\xe5\xd2\x9d\x87\xb6\xb7\xa1\xb9\xd1\x95\x81\x26\x5d\x7f\
+\x6b\x1d\x34\xf5\xf5\x7a\x4f\x54\xa8\x15\x00\xf3\x7e\xe8\x4f\xf9\
+\x4f\x06\xde\xc9\x34\x3c\x31\x2e\x65\x7c\x98\x3c\xc0\x1d\x87\x27\
+\x93\x4c\xfe\x2c\xbc\x1f\x80\xe9\xee\x7d\x41\x46\xcf\x1d\x0c\x5d\
+\xe1\x32\xce\x2e\x22\xb1\x64\x7d\x56\xac\xe2\xae\xa5\x03\xba\x13\
+\x7e\x62\x5c\x61\xcf\x34\xf8\xe8\xc9\xc5\xc9\x28\xd3\xb4\xb8\x69\
+\x72\x16\xe6\xa3\x67\x1c\x50\x9d\xc1\x9f\xd3\x91\x5b\xe5\x08\x9e\
+\x53\xdb\xad\x61\x39\x4f\x42\x6a\xc7\x6d\x93\x11\xce\xac\x9b\x14\
+\xbe\xf0\x5d\xd8\x0e\xa8\xee\x26\xc2\xc4\xdd\xe0\x0d\xdf\xe4\xef\
+\xd2\xf1\xe6\x1e\x09\x5d\xa8\x7d\xde\xc6\x79\xcd\x74\x94\xba\x0c\
+\x44\x78\x11\x50\x73\xe5\x30\x14\x5f\xcf\x31\xa1\x29\xd7\x88\xa8\
+\xa7\x27\xfa\x47\x6d\xbd\x5e\xa7\xd7\xa5\x34\xdf\x6e\xe3\x8b\xfb\
+\xa6\x23\x86\x98\xa2\xff\x41\x29\xaa\xcd\x44\xad\x1a\x93\xb0\x1e\
+\xa7\x83\x1c\xeb\x65\xb5\x48\xfd\x91\x60\xa7\x44\x26\x72\xe6\x48\
+\xf3\xe6\x63\xbd\x7b\xee\xd9\xb0\x76\xff\x72\x55\x94\x85\xbb\xe1\
+\x8d\x50\xb2\x8c\x72\xe9\xd6\xda\x51\xd3\x44\x98\x00\xad\x3f\x19\
+\x4a\x0b\x4e\x36\x18\x6a\xba\x14\x04\x04\x15\x96\xf4\x92\x51\x3a\
+\xa0\x3f\xfc\x47\x76\xdf\xe4\xc8\x78\x36\x65\xb4\xf6\x77\x95\xa0\
+\xe3\x4d\x86\x7e\x18\x62\xfa\xb3\x22\xf0\xf4\x96\xf7\xc0\x88\x51\
+\x90\x4b\x1f\x93\x15\xc5\x5d\xe3\xb6\xb6\xac\x09\x52\x1c\xb8\x83\
+\x6f\xb2\x76\x34\xce\x3e\x50\x6a\xe2\x11\x54\xb5\x8d\xae\x1d\xda\
+\x94\x42\x4c\x2d\xda\x22\x5a\xd2\x1b\x26\x05\x0d\x45\x9a\x5a\xa8\
+\x8d\x12\x63\x69\x19\x4f\xab\xc2\x44\xe8\x64\xd8\xef\x49\xe9\x6f\
+\x22\xb4\xe7\x2c\x9d\x6b\x2a\xe3\xf2\x30\x05\xf5\xb9\xa0\x2c\xdd\
+\x1d\xde\x5c\xb8\x53\xb0\xd0\x7a\x7b\x86\x51\x2d\x3d\x90\x7a\x17\
+\xea\xa2\x27\xd0\xd3\xc7\x4f\x5e\x48\x7f\x8f\x42\xe7\x91\xa6\x21\
+\xd0\x58\x80\xa1\x76\x54\x7e\xfe\xcc\x1d\x9a\x72\xfd\x31\x46\x14\
+\x70\xa0\x4f\x5e\xeb\x53\x2c\xc2\x7e\x7f\x41\x0d\x0b\xe9\x9d\xa7\
+\xac\x7a\xb3\xb0\x9e\x50\xda\xcb\x89\x94\xf5\x65\xe7\xa1\x16\x6d\
+\x7e\xe9\xf2\xf5\xf0\x9d\x9e\xa2\xb6\x71\x58\x57\xa5\xa3\xbc\xd1\
+\xab\x83\x24\xf2\xd5\x8c\xd4\x8f\x5a\x86\xf3\xf7\x4d\x3b\xda\x77\
+\x67\x6f\x0c\x5e\x50\xd3\xdc\xde\xee\xf2\xcd\xfc\xe9\x39\x8f\xbc\
+\x62\xdc\xcb\x05\xa0\x4e\xed\x13\x75\xa2\xa0\x64\xd7\x4d\x84\x08\
+\x43\xbd\x25\x75\xd7\xd1\xa1\x23\x97\xa7\x33\xfa\xce\xd9\xaf\x31\
+\x29\xc2\x49\x4b\xeb\x13\xd0\x33\xac\xe8\x1d\xef\xf0\xa0\xb2\xb2\
+\x75\x82\x2a\xf9\x4b\x5f\x86\xad\x30\xaf\x72\x59\x5c\xd5\x7c\x93\
+\x78\x6a\xd0\x73\xdf\xe1\xe5\x9d\x0c\xd4\xf6\xe8\xf8\x6b\x52\x95\
+\xfd\x43\x7b\xe4\x92\x1e\x47\x51\x1f\x35\xc3\xd7\x57\x4e\xe5\x9b\
+\x09\x08\xf3\xb7\xac\xff\x83\x30\x52\xc2\x28\x44\x73\x5e\x46\x71\
+\x54\xdd\x5d\x4a\xe5\x6e\xee\xa7\xe1\x5d\xa8\xe2\xf4\xd7\x7a\xce\
+\x2f\x35\xd8\x9b\x67\x29\xd3\xfc\xec\x1b\xd6\x9f\xb5\x63\x79\x3a\
+\x1e\xa4\xb3\x44\xee\xff\x37\x76\x36\xad\xb6\x1d\x45\x18\xbe\xd1\
+\xab\x6b\x7f\xac\xbd\xd6\x59\xd7\xbb\xb9\xde\x13\x50\x07\x5e\x41\
+\x49\x40\x74\x20\x38\x88\xa0\x01\x11\x27\x89\xa0\x44\xf1\x6b\x92\
+\x20\x19\x29\x82\x1f\x71\x60\x06\x8e\x1c\x38\xf0\x27\x38\x53\x34\
+\x19\x38\x0a\xfe\x80\x8c\xfc\x05\x01\x41\x32\x50\xfc\x15\xe6\x74\
+\xd7\x5e\x4f\x57\xbf\x55\x6b\xdf\x3e\x7b\x9f\x73\x86\x45\x77\x57\
+\x75\x7d\xbd\x6f\x09\xa4\x6d\x70\x16\xa0\x13\xd4\x31\x16\xe8\x2d\
+\x85\x1e\x59\x89\x00\x20\xd0\x42\x9f\x14\xdd\xb0\x4a\xfb\xe0\x41\
+\x15\x92\xd9\x12\x09\x59\x85\x4e\x17\x98\x61\x2c\xe0\xf4\xe5\xe4\
+\x5b\x1b\xda\x4d\xb2\xa6\xbd\xdd\x67\x73\x6c\x47\x91\x92\x9d\xad\
+\x2b\x18\x81\x51\x8f\x5c\xb0\xcb\xa3\x5d\x51\x2b\xd5\x83\x15\xd1\
+\x14\x99\x42\xee\x34\x91\xab\x45\x5b\x28\xfe\xa0\xa1\x3b\xb2\x2a\
+\x99\x8e\x48\x6b\xa2\x29\xf5\x2c\xc4\x3f\xf6\x90\xf6\x72\x2a\x55\
+\x85\xe2\xeb\x63\x92\x1a\x65\xc9\xed\x73\xf8\x5e\xcc\x2a\x9a\x9a\
+\xa6\x5e\xe3\x57\x4c\xd3\x2c\x2a\x05\xda\x4e\xba\x1d\xb9\xa3\x44\
+\xf5\x48\xca\x00\xb9\x75\xba\x21\x62\x0a\x17\x04\xf6\x89\x7b\xca\
+\x66\xfa\x99\x0d\x4c\x42\xe8\xb7\x14\x6e\x0d\x01\xb0\xb2\x9c\xa0\
+\xc2\x96\x39\x56\x08\x86\x69\x92\x37\xa3\x0e\x59\x5f\x3e\x8a\x5b\
+\x07\xd1\x14\xb2\xfe\x84\x2c\x00\x66\x47\xb1\x4f\xf2\xd6\x77\xef\
+\x27\x0d\xe3\x91\x3e\x79\x81\xb9\xa1\x4a\xe6\x4c\x02\x42\x19\x13\
+\xf9\x46\xdc\x8e\x8a\x05\x0f\xcd\x13\x72\x72\xf8\xc4\x76\x81\xcd\
+\x47\xab\xc8\x3c\x39\xfe\xee\x61\x96\xfc\x83\x28\xbc\x8c\x3d\x92\
+\xc2\x88\xea\x13\xd2\x16\x7d\x2f\xa2\x0a\xda\xb2\x01\x09\xc6\x7e\
+\x09\x18\x21\x21\x20\x05\xd5\xa0\x3b\x0a\x5b\x41\xaf\x4d\x7d\x8e\
+\xcc\xda\x85\xa1\x23\xcb\xfc\x3c\x30\x77\xfc\x76\xfe\x68\xc3\x94\
+\x99\xf2\x8f\xaa\xd6\x73\x49\xdd\x35\x45\x5c\xb7\x56\x49\x19\x24\
+\xd5\x8e\xe6\x02\xc2\xca\x93\xaf\x0e\x29\x89\x07\xf5\xf3\xb2\x85\
+\xa0\x27\x54\x1e\x07\x5f\xa9\x9c\x4d\x99\xd8\xd1\x9e\x97\x8a\xa3\
+\x57\x62\x2a\xc0\xe0\x8c\x39\x74\xea\xbe\x49\x94\xaa\x3e\x89\xaf\
+\x84\xea\xcc\x86\x0a\x1c\x30\x5d\x2a\x92\x0e\x1e\x67\x8b\x21\x95\
+\x67\x29\x99\x81\x91\x6f\xe9\x75\x7c\xfd\x8e\xc9\x0d\x32\x4f\x06\
+\xe4\xb2\xea\xfc\x80\xb8\x42\x8c\xcd\x3e\x22\xaa\x52\x92\x09\x3e\
+\x2c\xc7\xd7\x17\x61\x2f\x9b\x79\x10\xde\x61\xb0\xa1\x29\xdf\x93\
+\xba\xa4\x4b\x8b\x15\x22\x60\x42\x4a\xa1\x44\xbf\x8e\xaf\xb7\xec\
+\xbd\x94\x6c\xab\x94\x34\xe4\x06\x31\x13\xa0\xf0\xee\x8a\x22\x2f\
+\x96\x34\xe1\x1f\xe5\xae\x2e\x80\xac\x43\x7c\x3d\x68\x4b\xc9\xe9\
+\x15\x4d\x32\xc3\x1f\x3c\xf5\xe0\xea\x95\xe8\xcb\x65\x9c\xc5\x3a\
+\x21\x2a\x1f\xcc\x53\x8c\xaf\x27\x00\x65\x4b\x57\x64\x35\x58\x11\
+\xe9\x1b\x1f\x1a\xc5\x4f\xa3\x91\x35\x5c\xe2\x9b\xf2\x8f\x7a\xc6\
+\x02\xc4\x54\x30\x63\x67\x9f\x7a\xac\xc8\x18\xa2\x97\xb1\xa3\x91\
+\x2a\xa1\x48\xa2\xf7\x19\xff\x68\x82\xaf\xa7\x81\x30\xec\x80\x30\
+\x5d\x32\xc8\xe5\x31\x47\xad\x23\x35\x0b\x6d\xf2\xa0\x70\x30\x22\
+\xc2\x3f\xba\x85\xaf\xe7\x97\xb3\xa3\x7e\xbe\x80\xe8\x12\xd8\x45\
+\xec\xa8\xc8\x88\x7d\x8a\x9d\x3c\x9f\xd8\xe9\x76\x74\x0b\x5f\x2f\
+\x6c\xd3\x15\xc6\xc6\xfd\x54\x6d\x52\x43\xaa\x53\xa4\x70\xf2\x52\
+\xfe\x51\xdd\xd1\xd8\x3c\x91\x76\x3a\xe8\x6b\x0f\x7f\xbf\x5a\x27\
+\xaf\xee\xd0\xbf\x2c\x28\x3f\x31\xd3\x36\xff\xa8\x32\x68\xdd\x64\
+\xf8\x7a\x35\x4d\x3c\x4f\x0e\xd9\xa0\x7b\x89\xa1\x52\xbd\x07\x13\
+\x1e\xf3\x8f\x2e\x82\x0b\xbd\x8e\xaf\xc7\x6b\xc6\x79\xe2\x5d\xb2\
+\xdf\xba\xb3\x3c\xf6\xa2\xf7\x68\x51\xca\x3f\x9a\x95\x18\x73\x7c\
+\x3d\xaf\x13\xac\xc3\x20\xc1\x81\x30\xf6\xd6\x89\x0f\x82\x32\x1a\
+\x3a\xcf\x95\x64\xfc\xa3\xd7\xf1\xf5\x09\xdb\xb8\x32\x16\x0c\x6e\
+\x47\x11\xd2\xbf\x4d\x20\x6d\x49\x43\x39\x19\x73\xfe\xd1\xd3\x35\
+\x7c\x3d\x0b\x0a\xd2\x11\x0f\x4a\xd5\x1d\xa5\x4f\xea\xb6\xc4\xf6\
+\x3a\xf4\x48\x11\xcc\x78\xf8\x57\xf0\xf5\xe5\x83\xb0\x63\xcb\x3a\
+\xdc\xc9\x29\xa1\x88\xb8\x79\x38\x79\xc2\x46\x17\x33\x3e\x51\x5d\
+\x3e\x65\xf8\xfa\xb0\xcf\xf5\x68\xc2\xa2\x4c\x89\x26\x11\xd6\xcb\
+\x02\x5f\x1f\xb3\x62\x13\xdb\x6b\xda\x31\xc7\xd7\x6b\x52\x07\x5a\
+\x85\xf5\x2b\x03\x8d\x45\xe7\xf5\x61\x6a\xe4\x65\x09\x6d\x3f\x8b\
+\x44\x6e\x88\xaf\x07\x6e\x8b\x88\xf6\x3f\x6c\x99\x6e\x61\x41\x75\
+\xe4\x15\x0a\xa5\x15\x7b\xf6\x14\x9a\x79\xc9\x3d\x6d\xe1\xeb\x19\
+\x84\x50\x17\x47\x0f\x5b\x26\x79\x71\x0d\xf0\x9a\x25\x49\x12\xf4\
+\x09\x31\x91\xb6\x1d\xc2\xb9\x8d\xaf\x4f\xde\xfa\x31\x65\x28\xaa\
+\x82\x21\x6a\x08\x05\xef\x08\x9f\x9e\x8e\x7f\xf4\xf6\x2a\xbe\x3e\
+\x19\x10\x0d\xe7\xb4\x2e\x94\x49\x3d\x7c\x1d\xc1\xfb\x94\xfc\xa3\
+\xd7\xf1\xf5\x88\x39\xd6\x0f\x14\xc9\x86\x1b\x91\xe5\x67\x72\x65\
+\x44\xbe\x5a\x6f\x50\xfe\x51\x84\x4e\xf1\xf5\x07\x18\xb4\x5c\x80\
+\x67\xd2\x9a\x88\xfe\x71\xa2\x1a\xe2\x42\xd1\x60\x63\x79\x9b\xae\
+\xf1\x8f\xe6\x50\x36\x2a\xe0\x46\xa8\x81\xa4\xe8\xfe\x51\xe8\x0a\
+\xe4\x7d\x92\xf8\x0e\x63\xef\x72\xce\xd7\xf8\x47\x29\x31\x26\xf8\
+\x7a\x26\x33\xf9\xa8\xde\xe6\xdc\x31\x4d\x4a\xa7\xd7\x63\xa2\xc2\
+\xe5\xa7\xb4\xd8\x7f\x39\xff\x28\xc1\x1d\x06\x9f\x00\x84\x1d\x45\
+\xd4\x51\x20\xeb\x5e\x48\xd8\x1c\xc5\x8b\x72\x42\xfa\x51\xd6\x29\
+\xff\x68\xee\xe6\xb1\xe0\x24\xdb\xa3\xf5\x58\x53\x62\x26\x2d\x85\
+\xea\x70\xcb\x51\xc3\x7a\xe4\xcc\x38\x72\x23\xfe\xd1\x80\x00\xa2\
+\xda\x51\xdb\x53\x84\x84\x7b\xd2\xb8\x4a\xdc\x08\x56\x2d\x88\xe6\
+\x47\x8f\x42\xd9\x52\xbe\xa7\x04\x82\x71\xea\xb6\x73\xbf\x87\xfb\
+\xe3\xd0\xe7\x75\x72\x98\x50\xfd\x10\x86\x28\x53\x89\x67\xcf\x0a\
+\x1f\xfb\x96\x48\x69\x03\x5f\x7f\x01\xd8\x83\x13\x41\xcc\xe6\xd8\
+\xa3\x34\xd9\x80\xb4\x81\x09\xf5\xe2\xf2\x1b\x09\x95\x7f\x54\xf1\
+\xf5\x6a\xf2\xed\xe8\xfb\xb3\xf7\x13\x9a\xb4\x70\x47\x58\x2f\xe6\
+\xc9\xf4\x28\xa8\xdf\x0c\x79\x63\x26\x51\xa8\x89\x99\xe2\xeb\xf7\
+\xba\x9d\x8c\xba\xd3\x01\xd1\xae\x6c\x0b\xc0\x1a\x74\x3d\xd1\x9d\
+\xbb\x00\xd2\x49\x18\xbc\x4c\x37\x31\xbe\x1e\xa7\x44\xf6\x15\x6a\
+\x4f\x65\x2b\xc0\x77\xa2\x3d\xcb\x67\x9c\x39\xf8\x84\xe1\x2d\xb9\
+\xa3\xf8\x79\x62\xf3\xd9\x52\x3f\x6e\x3b\x87\xaf\x32\x7e\x53\xed\
+\xe8\xdc\xcc\x10\xa3\x6b\x3c\x0d\x45\x58\x4f\x8d\xaf\x97\xe7\xc9\
+\xc4\xcc\x20\xc1\xe5\xeb\x58\xbe\x26\x47\xde\xbf\xb8\xae\x71\xcd\
+\x38\x73\xec\xdb\x06\x1f\x2c\xf8\x7a\xf2\x92\x25\x73\x23\x8d\x8f\
+\x9d\xa4\x45\x46\xb6\xd2\x75\xb6\xb7\xf9\xfb\xb9\x4f\x3c\xf1\x41\
+\x9f\x32\xa7\x64\xa7\xf8\xfa\x4e\x9b\x50\xa6\xf0\x8a\x32\xb1\x85\
+\xc1\x7c\xed\x1d\x75\x53\x06\xe2\x61\x2d\xf6\xc1\xc7\x07\x78\x25\
+\x9e\x53\xd4\xf3\xc4\x8e\x3a\xe6\xbc\x60\x98\xb1\x9a\x51\x74\xa9\
+\x2e\x2c\x68\xc7\x44\x48\x10\x9a\xb0\xb7\xe7\xf8\x7a\x74\x1e\xfb\
+\x24\x05\x1c\xa4\x15\xdf\xc4\x98\x08\x69\x7c\x72\xbc\xd8\x02\x12\
+\x42\xca\x65\x91\x28\xf4\x14\x46\x76\x72\xf4\x08\x8b\x98\xa2\xf6\
+\xd8\x51\x98\x54\x58\x45\xe3\x7d\x0e\x7f\x50\xea\x51\xfb\x2f\xc3\
+\x8a\xb0\xc0\xd7\xfb\x58\x04\xd3\xc4\x0f\x02\x73\xf8\x75\x2b\xe1\
+\x79\x34\xbd\x72\x7c\x15\x4e\x46\x79\x45\xa9\x31\x0b\x83\xd6\x4d\
+\x8c\xaf\xc7\x3a\x89\xa7\xc7\xd1\x87\x73\xee\xca\x9a\x64\x06\x06\
+\x7e\xbe\xcc\xb5\x55\xe0\x55\x0e\xb7\x44\xa3\x28\xd6\xb3\xad\x44\
+\x76\xeb\x8f\xef\x19\x77\xf3\x99\xb8\xa0\xee\x09\x75\x1e\xbe\xef\
+\x73\x25\x99\x9b\xf3\xe1\x67\xf8\xfa\x68\x2b\x19\x1a\x29\xec\xed\
+\x2d\x6f\x9e\xce\x35\x75\x43\x0e\xab\xcc\x01\xf1\x6c\x92\xc3\xdf\
+\xc6\xd7\x7b\x07\x1f\x0b\xda\x19\x27\x64\x85\x37\xcf\xcf\x3c\xe3\
+\xf0\xcd\x69\xae\x60\x3b\xa5\xc3\xc7\xde\xb3\x36\xf0\xf5\xf6\xe5\
+\xec\xdd\x4a\x95\x1e\x65\x12\x97\x64\xb6\xdf\x0b\x3f\xb3\x28\x93\
+\x7d\xc8\xe2\x67\x7c\xf8\x8a\xaf\x57\x7f\x74\x64\x5f\x51\xfb\x89\
+\x69\xeb\x8d\x5f\xca\x20\x0c\x2e\x29\xf1\xb2\x9a\x27\x0d\x42\xf3\
+\xf9\xf5\xdb\xf8\xfa\x91\xbe\xa7\xc2\x8f\xab\xed\xa3\x13\x75\x11\
+\xb6\xd5\x5d\x52\x57\xb3\x4b\x4e\x5e\xfa\xc9\x6e\x25\xae\x8f\xf1\
+\xf5\xda\xaa\x01\xf1\x6c\x3c\x4d\x4a\x03\x26\x3d\x7a\x64\xf5\xa2\
+\x6e\xd7\xeb\x73\x7c\xfd\x6e\x0f\xe7\x2c\xe3\x8c\xd5\xc9\x23\xa5\
+\xe3\xcc\x92\x6f\xc8\xf5\x6c\xf8\x45\x9f\xd4\x8a\xea\x24\x46\x9d\
+\x5f\xaf\xf8\xfa\xbd\xb8\x7a\x8e\xca\x55\x75\xaa\x6a\x7d\x5f\x11\
+\x25\xe9\xe8\x5e\x7b\xc5\x06\x02\x0a\x8e\x76\x34\xc7\xd7\xab\x4b\
+\x42\x68\x6f\xdf\xee\x65\xba\x44\x23\x38\xa6\xed\xc2\x1f\x9d\x3b\
+\x7f\x34\x8f\xf0\xd4\xc3\x57\x34\x1b\x62\x6e\x9b\x27\xb8\xf3\xcc\
+\x86\xc2\xe3\xac\x61\x72\x5c\xbc\x21\x45\x66\x9f\xed\x7a\x7d\xab\
+\xf5\x7e\x36\x38\xde\x28\x5e\xbe\x8c\x5d\x9e\x68\xce\xe2\x09\x95\
+\x45\x70\xa7\x0b\x9f\x64\xd9\xe4\xc3\x6f\xb5\x5e\x0d\xa9\x7b\xeb\
+\x35\xe5\x8c\x87\x3f\xb4\xc9\x52\x15\x90\x70\x19\x4b\x9a\xcc\x6c\
+\xb8\xed\xf8\xf0\xc3\x51\x08\xbb\x36\x91\x7b\x84\x7e\x74\x54\xb5\
+\x67\x49\x26\x4f\x94\xc9\x61\xee\x74\x54\x8b\x1e\x3c\x5a\x1f\xe3\
+\xeb\xe3\x72\x28\x6f\x93\x32\x68\x91\xbc\x67\x2f\x35\x3b\x4e\xbc\
+\xa4\x45\x26\x01\x38\x08\x1f\x7e\x8c\xaf\x4f\x1a\x5f\x98\x79\x84\
+\xdf\x5c\xfd\xbc\x2a\xe2\xe4\xa0\x96\x62\x48\x17\x18\x0b\x36\x07\
+\x1a\x2b\x1f\x7e\x8e\xaf\x97\xc4\x73\x11\x96\x9f\x78\xfe\x49\x55\
+\xfc\xde\x3a\xe1\x2d\xd3\xde\x8e\xf2\x83\x6a\xc8\xb5\x9e\xe5\xf1\
+\xf5\x28\x13\x05\x3b\x52\x10\xb5\x20\x26\x64\xe3\xf8\xf8\x2e\xad\
+\xb7\xac\x6f\x3d\xde\x53\x94\x79\x92\xfd\xbc\xd5\x7a\xbd\xe2\xeb\
+\xf5\x8e\xc2\x3a\x1d\x28\xfe\xd4\x06\xcc\x7a\x47\x81\x34\x30\x2a\
+\x18\x95\xf7\x61\x68\x7f\xf8\xd4\xeb\x63\x7c\x7d\x18\x2a\x37\xb9\
+\xa7\xa3\x97\x72\x98\xf0\x46\xd0\xa6\xa8\xce\x98\x03\x58\xb3\x29\
+\xc1\xdb\xf8\x7a\x5b\xea\x3d\x51\x60\x74\xc3\xb9\xa4\x75\x78\x0c\
+\xcc\x13\x08\x56\x9f\x7c\x22\x89\x2f\x4a\x2f\xf5\x7a\xe2\xfa\x48\
+\xce\xa6\xa5\x24\x9e\x69\x3b\x55\x8d\xaf\x5a\xb4\x62\x43\xe9\x28\
+\xd1\x66\xc7\x00\xd3\x12\xbd\xa2\x32\xbf\x5e\xeb\xf5\x87\x5e\x4a\
+\xbe\x91\xb0\x36\xf8\xaa\xe2\x81\xa7\xbc\x2d\xd3\xa1\x2e\x63\xd8\
+\x7a\x3e\xbf\x9e\xb0\x8e\xc8\x49\x56\x3f\x6c\x9d\x3a\x38\x4f\x28\
+\xda\xef\x82\x11\x92\xb8\x33\x9d\x25\x12\x87\x6a\x6d\x39\x9f\x5f\
+\xcf\xe9\x87\x99\x32\x24\x0d\x0a\x77\xae\xed\x69\xf2\x31\xe8\x52\
+\x23\x27\xd0\xe0\x9a\xd0\x63\x3f\x7d\x5b\x89\xcc\xaf\x37\x01\xa3\
+\x1d\x1d\x11\xf0\x78\x64\x47\xb5\x7f\x94\x87\x14\x8b\x8f\xb0\xbe\
+\x55\x43\x79\x1d\xa9\x8c\x64\x7c\xf8\xfa\xd8\xdb\x57\x63\xbc\xe3\
+\x31\xf6\x48\x10\x51\x03\x3b\x90\x57\x46\xfc\x81\x83\x2f\xea\xf4\
+\xb4\xf5\x7a\x8f\x61\xf5\x7b\x6a\xed\x3a\x91\x8c\x48\x6a\x2f\xbe\
+\x3f\x7a\x86\xb2\xb1\xa7\xf3\x90\x95\xc1\x89\x9c\xf2\x7a\xbd\x05\
+\x77\xa2\xf3\x48\x7b\xf4\xbd\x3a\x5a\x67\xb2\x2b\xca\xd1\x0b\x58\
+\x04\x84\xd8\x80\x94\x00\x58\xd1\x27\x66\x83\x07\xd3\x25\x08\x98\
+\xa5\x99\xc8\x3e\xcc\xb9\x0b\xdb\xc9\xc6\x15\x66\x2d\x34\xf3\x94\
+\xc3\xb2\xc7\xe9\xea\xd1\x6b\x4d\x4c\x22\x50\x7f\x09\xdc\x63\x0f\
+\xe6\xc6\x8e\xbd\xc8\xaa\x3b\xca\xe3\x04\x7e\x99\x52\x18\xe9\x87\
+\x64\xd8\x19\xf5\x7a\xbc\x3c\x1a\xc7\x15\xdb\x20\x73\xee\x48\x90\
+\x18\x24\xbc\x27\xab\x30\xd3\x04\x9d\x4a\x6c\x45\xf1\xa1\x94\xfe\
+\x43\xd1\xb6\x80\x58\x3d\x4e\x88\xa4\x53\x3e\x97\xed\x52\x0b\x99\
+\x78\x9a\xc0\x58\xf7\x75\x50\x11\x96\x3b\x2a\xe5\x1b\x89\x97\x70\
+\x4b\xe4\xec\xed\x57\x6b\x45\x11\xd5\xde\xf9\x89\x70\x69\x05\x85\
+\x03\x0e\x64\x8e\xd0\x1c\xbe\xf5\x18\x7c\x85\xad\x37\x7b\x8a\xd2\
+\x67\x75\x26\x9d\x1b\xa8\x6f\x3d\xe6\x74\xc2\x3e\x61\x46\xcb\xd7\
+\xfc\x66\x9d\x72\xc7\x9e\xea\xfc\x7a\xa4\x24\x58\x0a\x10\x77\xa3\
+\x26\x75\x1a\xcc\xdd\xc0\xae\xe2\xe8\x4d\xbd\x94\x33\xe9\x31\x9d\
+\x6c\xa9\xe0\x0b\xc1\xd7\xfb\x85\xb9\x2f\x29\x09\xd6\x88\x32\xa5\
+\x13\xee\x7c\xbc\x3c\xf1\x42\x31\xdb\x32\xe6\x80\x78\x36\x68\x2a\
+\xda\xe2\xc3\x17\x0a\x4a\xcd\xe1\x73\xf4\xbd\x8f\x37\xc1\x3a\x8c\
+\xb1\x0f\xa1\x6c\xb6\xb9\x71\x04\xba\x28\xbe\x3e\x8c\xeb\x31\xf7\
+\x87\xd0\x71\x8e\xb5\x7e\x6a\xae\xa8\x09\x8a\x3a\xa1\xf5\xeb\x0f\
+\x88\x60\xcd\x8d\xcb\x12\x12\x4a\x21\xa7\x41\xf3\x47\x37\x05\x41\
+\x94\xde\xc4\x2c\xa2\x32\x5c\xa2\x88\xea\x41\x77\xe4\x47\xa3\x6d\
+\x15\x35\xca\xd1\x37\x88\x9b\x5d\x00\x24\xf5\xe5\xfa\xfa\xb1\x93\
+\x9f\x2c\x1c\xd1\xa2\xed\x42\xe1\x4e\xd3\xa3\x32\xe0\x32\xe7\xc8\
+\x45\xf1\x99\xcb\x26\xba\xe4\x8d\x53\x2b\x2e\xbb\x39\x51\xb0\x35\
+\x39\xa9\xd7\x03\xb2\x57\x65\x52\x31\xf1\x9e\xc2\xa2\x18\xcb\x67\
+\x1d\xe3\x7a\x3d\x83\x10\x6c\x43\xcd\x71\x9e\x92\x27\x94\x08\x54\
+\x23\x26\x56\xc6\x87\x6f\x1f\xea\xa1\x7e\x80\x1c\xb2\x2a\xe1\xb4\
+\xb2\xa9\x90\x7c\x42\xe5\xbd\x53\xa2\x4b\x04\x25\x53\xa2\xe6\x89\
+\x8a\x6d\x14\x8c\x60\xf1\x11\x16\x40\xc3\x1b\x9f\x7d\xf2\xe4\x1b\
+\xf7\xab\x9c\xb0\x68\x45\x3d\x3a\x14\xc5\x00\x5e\xc5\x37\x14\xc0\
+\xc0\xa9\x8f\x42\x9c\xa8\x72\xfe\x48\x28\xe3\xce\xee\xdf\x2b\xeb\
+\x2f\xc5\x1d\x2d\x1f\x77\xf4\xdf\x7c\xe9\xcd\x97\x8b\x26\xcd\x92\
+\x1c\x97\xa8\xbe\xc3\xd7\x4b\x36\x0f\x71\x23\x98\x90\x3f\xf8\xde\
+\xd5\x1b\xc6\xdf\xdf\xab\xeb\x23\xa3\x79\x79\x45\x54\x9b\x81\xf1\
+\x7c\x61\x04\xfc\x77\xa1\x4d\x4c\x30\xd6\xd8\xd2\x7e\xc5\x7c\xf8\
+\x76\xe4\xf6\x4d\xeb\xf5\x9a\xd1\xfb\xc5\x85\xdd\xf1\x51\x51\x25\
+\xbf\xa3\xcf\x54\x92\xe1\x93\xd9\x4e\x53\xa8\x6e\x57\xd3\x82\xd8\
+\x21\x63\x9c\x0e\x71\x2d\xbe\x5e\xbf\x8a\xca\x25\xfd\xda\xf7\xdf\
+\xfa\x74\x1d\xb0\x33\xc8\xcc\xab\x1f\xdd\x33\x66\xf7\x36\x66\x1a\
+\xe2\xa2\xed\x76\x92\x4c\x93\x0f\xb6\x0e\x54\xee\xc8\x38\x33\x3c\
+\xd0\xf9\xf8\x87\x8f\xc2\xe3\x6c\x9a\x64\x9d\x2f\xff\xaa\xdc\x85\
+\x67\xd7\xfb\xa0\x6f\x68\x24\xe8\xf5\xf9\xf5\xfa\xdc\xfb\x1c\x3e\
+\x27\x8f\xc1\xff\xdb\x85\x6c\x7c\xe8\x02\xbc\x8f\x17\x52\xa3\x42\
+\x3f\x5d\x58\x32\x87\x5e\x46\x9f\x2b\x61\x5d\x9f\x5f\xdf\xc7\xf5\
+\x5a\x10\x43\x4c\x6b\x29\x18\x2b\xa7\xeb\xeb\xc7\xa2\x4b\xbe\x57\
+\xe3\xfe\x97\xff\xfc\x70\x37\xd3\x03\xa1\xfe\x7d\x9e\x1f\xdd\x9e\
+\x5f\xaf\x3a\x2f\xf5\x7a\xdd\x51\x23\x4b\x9e\x6c\x4f\x7b\xa3\x3f\
+\xcf\x02\x69\xd1\x0c\xc4\xd6\x5b\x0f\x6c\xfd\xee\xcb\x6c\x4b\x87\
+\x67\xb2\x23\x67\x28\xe3\xc8\xc6\xae\xa8\xb0\xdf\x14\x82\xad\x22\
+\xa4\xd8\xd2\xc5\x66\x49\x2d\xf6\x9a\x46\x31\x13\x9f\x56\x50\x6a\
+\x8c\xfb\xf2\x29\x7f\xee\xe4\xdd\xfb\x3e\x32\xa4\xb5\xe4\xbd\x10\
+\xaa\xac\xec\x1f\x77\x97\xf4\x1f\xe7\x6e\x86\x18\x84\x44\x8c\xeb\
+\xd0\xb6\x12\xe2\x7a\x96\x8b\x42\x29\x31\xc2\x46\x46\x0d\x5c\x3b\
+\x08\x99\x6e\xa9\x47\x3f\x7d\xa8\xb0\xeb\xed\x64\xac\x29\x72\x56\
+\x92\x5c\x62\x11\xc5\xdf\x5c\x2d\xda\xf2\x34\x61\xa3\x92\x44\x2e\
+\x1b\xcb\x2a\xde\xd3\x7b\x65\x44\xcb\xa9\xa4\xca\xb1\xa4\xf3\xfa\
+\xb7\xca\xc9\x0c\xce\x84\xa4\x46\x47\x21\xa8\x61\x0a\xbb\x9e\xf4\
+\xfd\x64\x1d\x1b\x96\xb7\x69\xfa\x5f\x99\x62\xf1\xe4\x7d\x0b\x46\
+\xea\x5a\x2c\x14\x99\x7e\xf7\xb3\x32\x5c\xc2\xec\x3d\x3b\x4a\xa0\
+\x1c\x2b\x13\x5b\xea\x61\x8c\xcc\x42\xd0\xc8\x3e\xec\x72\xc6\xd1\
+\x7b\xc6\x5e\xd2\x3f\xed\x70\x9d\xcb\x9a\x3f\xfc\xe2\x07\xd4\xba\
+\x5f\xda\x17\x3a\x4a\xf6\xd3\x61\xc3\x42\x60\x0b\x50\xb6\xc8\xe0\
+\x87\x78\x26\xd7\x5d\xd2\x63\x58\x87\xea\x36\x7f\xe2\x53\xc6\xa0\
+\xfb\xa8\x33\xa4\x7f\xac\xcc\xfd\xfb\x9a\xc5\xcd\xd1\x0d\x51\x89\
+\x31\xe9\x71\xb6\xed\x54\x3c\x13\x47\xaf\x1c\x10\x83\x45\x77\xd3\
+\x1b\x95\xa3\xff\xbb\x8f\x07\x3f\x16\xbe\xcc\xef\xf8\xeb\x79\xb4\
+\x4b\xea\x5d\x12\x0f\x63\xd3\x3b\x1a\x61\xeb\x09\xeb\x38\x7a\x69\
+\xd4\x22\x72\x12\x24\xdb\x1f\x0a\xa7\xfc\xe7\xce\x37\x93\x77\xf2\
+\x5f\x2e\x9c\xfe\x0f\xe7\xcb\xd2\x70\x24\x62\x2c\x40\xeb\x91\x54\
+\x19\x5d\xb3\x0e\x7c\x5c\x3d\xdf\x4e\x50\xc2\xd1\xc2\x51\xfb\xda\
+\xc3\x5d\x51\x25\xdc\x92\xca\xe3\xff\xea\x83\x8b\x90\x72\x49\x1b\
+\xca\x44\x0d\x45\x58\x32\x9a\x49\x6b\xa1\xf4\xe1\xfb\x6c\x33\xe2\
+\x16\x8b\xf4\x76\x11\xf4\xd0\x45\xa1\x73\x75\x03\xce\x87\x99\x2d\
+\x1d\xb6\xc8\x5f\x34\xb8\xf3\x3b\x6a\xd4\x2f\x1c\xbd\x80\xaf\x8e\
+\x61\x9f\xc6\xb0\xde\xd3\xf7\xea\x73\x6f\x2e\x3e\xeb\xbf\x77\x63\
+\x75\xcf\xf6\x34\x95\x2f\x42\x3a\x9c\x48\x8c\xb9\xe3\xe8\xf7\x9e\
+\x9d\xe8\x70\x79\x9a\xc8\x8b\x96\xdf\x9a\x71\x46\xd4\x3a\x81\xb1\
+\x3e\xf7\xc0\x05\xa6\x9a\xd0\xf9\x4a\x19\xa5\xd0\xdc\xd0\x39\x76\
+\x4b\x78\x9b\xf0\x9e\xa2\x54\x89\xdb\x4e\x09\xf0\xa9\xd7\xdb\xff\
+\xca\xe8\x3b\xbd\x79\xa7\x4c\x67\xfc\x51\x63\x78\x7b\xf1\x8e\x9d\
+\xbc\xb9\xa2\xb3\xc4\x4b\xe8\x7c\x5e\x62\x84\x9e\xc8\x54\x89\x1e\
+\x67\x28\x4a\xbc\xc6\x7b\xa7\x84\x01\x72\xd3\x3f\xab\x4f\xda\xb7\
+\x3d\xbd\x6f\xf3\x4f\xea\xc1\x9b\xa0\x2c\x5f\x6d\xd0\xe0\x4e\x5a\
+\x5f\xaa\xab\x27\x58\x70\x8c\xfe\x51\xf3\xa3\x53\x5b\x69\x9a\xbe\
+\x5e\x2f\x69\x75\x9d\x79\xeb\x9f\xfb\x80\x10\xf4\x3c\xb6\x47\xef\
+\x02\x3b\xef\xe0\xe7\x5d\x3a\x18\x27\x25\xa6\x52\x4c\x53\x92\xc7\
+\xb5\xee\x2c\x0b\x9c\x3a\x3a\xd7\xe7\xb8\xa2\x28\x53\x67\x4a\x13\
+\x56\x8d\x38\xe1\x0c\xa8\x6d\x6f\xb2\x82\x07\xf6\x20\xeb\x84\xf0\
+\xa9\xf8\xa4\xff\x39\xfb\xdc\x78\x09\x44\x5f\x7b\xb0\x8e\xe1\x64\
+\x43\x11\x31\x88\x45\x6e\x5d\x63\x01\x62\x62\x49\xc3\x77\xc9\x1e\
+\x23\xcb\xe1\x53\x5f\x1e\xec\xf0\xad\x24\xfa\xf7\x62\x31\x77\x1d\
+\x79\xda\xed\x2f\xdf\x39\xef\x6d\x0c\x27\x73\x25\x70\xee\xed\x77\
+\xc6\x3f\x9a\x00\xaf\x76\xa0\x6d\x25\xe5\xcc\x7e\x76\x8f\x93\xd9\
+\xa7\xe1\xa5\x8b\xa0\x1d\x64\xe0\x74\x53\xe0\x42\xb6\xe2\x17\x94\
+\xd3\xef\x94\x09\xf1\x72\x7c\x3d\xe6\x9e\xc9\x81\x81\xcd\xb7\xce\
+\xac\x17\x8a\x4f\xf2\xd6\xe3\x63\xc7\xe7\x59\x65\x34\xad\xc7\x3c\
+\x21\x63\x18\x2c\xd3\x44\x88\xa8\xbc\x4c\xda\xe3\x3c\x12\xd7\xdb\
+\xa0\x7d\xaf\x49\x40\xee\xc6\x7b\xd5\x79\x7a\xe8\x4f\x9e\xd9\xbb\
+\x68\x7d\xca\xe6\xab\x5d\xe3\x91\x12\x01\x10\x91\xfb\x59\xe4\xc5\
+\xbf\xeb\x14\xca\x10\x0d\x95\xe9\xf9\xf1\x09\x31\xdd\x00\x14\xc6\
+\xad\x0b\x9e\x09\xac\x88\x94\x6f\x42\x1c\x23\x95\x5b\xcd\xe4\xea\
+\x9c\x3b\x22\x26\xb3\xa6\xef\xde\xc9\xf9\xf3\x8f\xb5\xa0\x01\x3b\
+\xfa\x22\xe7\xe2\xcd\x53\xd8\x98\x29\xa3\x10\x0e\x5d\x78\x47\x8f\
+\x8e\x43\x83\x8f\x1a\x8b\x50\x11\xdd\xad\x95\x06\xab\x2e\x3f\xff\
+\xab\x77\x5e\x7f\x74\x1a\x46\x6f\x9c\x96\x15\x7a\x65\x82\x72\xf2\
+\x2e\x54\x0e\xe3\x7a\x38\x28\x95\x08\xc0\x36\xd3\x07\x23\x00\xd9\
+\x34\x52\xa6\xdd\x71\xa8\x26\x8b\xe5\xc0\x0d\xee\x8e\xca\x0a\xac\
+\x93\xd9\x51\x4c\x29\x09\x7c\x84\xed\x72\xf7\xc0\x59\xec\x8f\x0a\
+\x0a\xee\x86\x2d\xf5\x09\x1d\xf6\x94\x30\x54\x77\xd5\x1b\x7c\x1d\
+\x17\x4a\x0c\x9a\x06\x22\xf6\xc3\x3b\xca\xd1\x2b\x6e\x7d\x6c\xd1\
+\x22\xeb\x2d\x5d\xea\xd9\x3b\xfa\x51\xa9\xd6\x2f\xb1\x79\x02\x76\
+\xb7\x07\x0d\x8e\xa4\x0e\xd3\x40\xcb\x9b\x13\x75\x6a\xfa\x74\x82\
+\x2b\xca\x80\x1e\x3d\xfa\x67\xb5\x01\x66\x1b\x69\x6b\xf0\x7a\x53\
+\x27\x0f\x5f\x1d\x31\x53\x31\x26\x18\xb6\xa7\xa0\x7b\x14\xad\x2f\
+\x3b\x5a\xbe\xea\x38\xa3\xf2\x89\x53\xa2\xe9\x92\xbd\x3c\xa1\xf8\
+\xf9\x75\x73\xa5\x68\x3b\xd5\x73\xa6\x20\xde\xc2\xae\x30\xf9\xb6\
+\xa7\xbc\xf5\xe2\x36\x2b\xab\x06\xe3\x8c\x7d\x58\x6f\x1a\x9f\xb4\
+\xbe\xf8\x3d\xa5\x1d\x9b\x36\x2d\xf4\x49\x86\x98\xdb\x9e\xb2\xa5\
+\x51\x7e\x54\xe3\xfa\x28\xf5\x44\x35\x4c\xc0\xb6\x88\xaa\x0c\x5a\
+\x0e\x22\x16\x15\xeb\xd9\xd0\xbc\x5e\xaf\x95\x70\x85\xad\x63\x48\
+\x3d\xf0\xea\xa0\x05\x46\xc5\x5b\x4e\xbc\xa0\x40\x9a\x5a\x7a\xaa\
+\x75\x34\xd7\x56\xbd\x9e\x4e\xa2\x25\x05\x0c\x28\x24\x58\x8b\x37\
+\x98\x52\x9c\xbc\x76\x01\xbd\x91\x46\x42\xd4\x09\x7c\xbd\x6c\x6b\
+\x95\x8f\x0b\xa0\x43\x7a\x34\x4b\xe2\xc9\x15\x50\x78\xb5\x4f\x8d\
+\xe5\x74\xdd\x79\x32\x46\x0a\xdf\x69\xc8\xea\xf5\x4b\x52\x0e\xb5\
+\xb7\x3e\xc5\xd7\xb3\xa9\x31\xbe\x5e\x82\x26\x85\x8a\xe0\x93\x98\
+\xa8\x36\x4d\x26\x64\x55\x91\x2c\x2e\x3b\xaa\x16\x9f\x17\x4a\x63\
+\x7a\xad\xd7\xab\xac\xd0\xd5\xe8\x53\x6f\xea\x04\x2e\x54\x18\x4a\
+\x36\xfd\xd1\x7c\x7e\xbd\xc2\x57\x3b\x88\x75\x44\xf9\xd3\x1e\xbc\
+\x1c\x3e\xa8\x9b\xd9\x89\xa9\x59\x67\xbd\xa3\x58\x28\xc5\xd7\x2b\
+\xa3\x4a\x06\xbb\x63\x2b\x51\x25\x7e\xd1\xaa\xe1\xe1\xd5\x82\x67\
+\xca\xb0\x22\x87\x78\x11\xd9\x13\x2f\x6b\x2b\xb6\x89\xaa\x2d\xce\
+\xd0\x3d\x89\x29\x75\x97\x33\xc6\x33\x51\x63\xee\xb2\x79\x27\x73\
+\xa0\x76\xd1\xfc\x7a\xd4\x9e\x0d\x15\x30\xb8\x13\x11\x28\x5b\xf0\
+\x32\x0d\x34\x8d\x67\xe6\x9e\xb7\x7e\xdb\x29\x21\x49\x4a\x17\x61\
+\x5a\xaf\xf7\x0b\x29\x95\xe7\x4b\x47\xca\x00\x69\xda\x86\x0c\x10\
+\x2e\xc7\x53\xd9\x0e\x1a\x86\x6a\xbd\x5e\x7a\xdb\x31\x50\xad\x94\
+\xd0\xcc\xb7\xf7\x33\xae\xd7\x9b\x90\x5a\x15\xf1\xf5\x5a\xc1\x33\
+\xe9\x56\x86\x50\x5b\xb8\x1f\xc8\x93\xcb\x0d\xcd\x40\x18\xca\xec\
+\xa9\x99\x12\x13\xf3\xe6\x3a\xbe\x9e\xce\x66\x14\x5f\x2d\x69\xf6\
+\x7e\xfa\x36\x7c\xeb\xc3\x8f\xf0\x4c\xf4\x40\x2c\x92\xcd\x53\xcc\
+\x3a\xa0\x16\x89\x42\x15\xcd\xc2\xff\x7a\xf4\x55\x6e\x7c\xbc\x22\
+\x9d\xd6\xeb\xf3\xfc\xa8\x92\x50\x9e\xbc\xac\xf6\x89\xbc\x12\x57\
+\xaf\xd7\x57\x69\x90\x93\x77\x03\x26\x1c\x07\x61\xf9\x72\xec\x69\
+\x10\x2a\x13\xaf\xd0\x22\xf1\x9e\xd0\x26\x93\x50\x8f\x7f\x32\x0f\
+\xdf\x3e\xf6\x57\xa7\x9d\x65\xe4\xed\xa8\x52\xde\x9b\x97\x95\x18\
+\x0f\x57\xfa\xdd\xd4\x1f\x65\x4f\xd9\x4e\x3f\x52\xc6\xab\x92\xd0\
+\x7f\xc4\xad\x64\x6e\xb0\x29\x87\xce\x0c\x94\x80\x24\x17\xcb\xe4\
+\xed\x13\xb8\x50\x3b\xf7\xf6\xfc\x17\x99\x71\x88\x1d\x8d\xb8\x15\
+\xb2\xc6\x02\xe5\x7f\x00\xc6\xe8\x29\x48\xf1\x9e\x42\x5a\x8d\x96\
+\xcf\x95\x3d\x45\x58\x48\xd1\x7b\x3b\x0a\x54\x40\x6f\x28\x64\xbe\
+\x1c\xb9\xbc\x4e\x38\x25\xa3\x00\xc4\xec\x2f\x42\x76\xfe\xd3\x06\
+\x27\x3a\x24\x94\xc2\x9d\x16\xad\x7e\x9c\x31\x22\xea\xd1\x63\xee\
+\x13\xb2\x2f\xc7\x8d\x8c\x4e\xc5\xbc\xe8\xc3\x2c\x08\xb1\xed\x59\
+\x8c\x88\xa9\x96\x74\xe7\x61\x42\xa0\x18\xd9\x4a\x99\xc0\xaa\x3c\
+\xe3\xa3\x03\x5b\x7a\x9e\x12\x62\x11\xec\x53\x38\xa9\xe5\xff\x47\
+\x8a\xa8\x96\xa8\x5a\x04\xd8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x0f\x6b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\xf4\x00\x00\x00\x4b\x08\x03\x00\x00\x00\xb1\xe3\x85\xac\
+\x00\x00\x00\x42\x50\x4c\x54\x45\xd5\xd5\xff\xf6\xf7\xff\xda\xdb\
+\xff\xef\xef\xff\xdf\xe0\xff\xe7\xe7\xff\xea\xea\xff\xea\xeb\xff\
+\xeb\xeb\xff\xdf\xdf\xff\xf7\xf7\xff\xfa\xfb\xff\xf3\xf3\xff\xd7\
+\xd7\xff\xff\xff\xff\xe6\xe7\xff\xdb\xdb\xff\xe3\xe3\xff\xd5\xd6\
+\xff\xf2\xf3\xff\xee\xef\xff\xe5\xe6\xff\x96\xf6\xba\x85\x00\x00\
+\x0e\xe4\x49\x44\x41\x54\x78\x5e\xed\x5d\xd9\x92\x24\x37\x08\x1c\
+\xa4\x3a\x8f\xbe\x66\x76\xff\xff\x57\x0d\x24\x14\x52\xd7\x4e\xd8\
+\x0f\x23\x47\x6c\x84\x52\x05\xd5\xf6\x9b\x9d\x83\x0e\x20\x55\x1f\
+\xf7\x1f\x45\xc7\x7e\xdf\x77\x76\xf7\xed\x4e\xf7\x6d\xdf\xb7\x3b\
+\x0f\xc1\x2e\x8e\xb6\x63\x3b\x88\x87\x81\x32\x2d\x94\xf9\xf9\xca\
+\x05\x96\x3c\x2f\x6a\xcb\x3c\x09\x1e\xd3\x43\x9e\x71\x1c\x1f\x8c\
+\xd7\xe3\x35\xb2\x29\x56\x19\x70\xc3\xb0\x0e\x6c\x6b\x5a\x13\x3f\
+\xcf\xe7\x73\x65\x4b\x29\x3d\xd3\x2d\xdd\x6e\x1f\xec\x3f\x3e\xf0\
+\x30\x7e\x94\x80\x8e\x1d\x9e\x84\xf5\x8d\xf9\xdf\x95\x6d\xf1\x02\
+\x12\x53\xde\xc1\xbc\x72\x9e\x29\x33\xc0\xfb\xaf\x99\xc9\x16\xd6\
+\xf3\x22\x98\x95\x72\xc6\xfc\x98\x9d\xf4\x51\x59\x07\xed\x41\xbd\
+\x93\x9e\xd6\xf5\x29\x8e\xc9\x06\xe9\x37\x19\xcf\xf4\x71\xbb\x81\
+\xf0\x06\xa4\xf7\x30\x87\x17\xe3\x58\xdf\xc5\xf1\x6b\x33\x10\xf3\
+\x6d\xd1\x2e\xc8\x94\xd9\xd3\x42\xcb\x97\xc5\xfa\xfc\x4b\x1c\xa2\
+\xfc\x8f\x91\xfe\x1a\x65\x54\x94\xaf\xaf\xd7\x60\xd1\x9e\x56\x01\
+\x07\x79\x5a\x11\xe9\x37\xe6\x3b\xdd\xf0\xdc\x3e\x38\xda\xd9\xb5\
+\x21\xbd\xc7\xfa\x2e\x41\x2e\xb1\xce\xcf\xae\xe3\xee\x91\x7e\x90\
+\x71\x4e\x94\x65\x1c\x59\xc3\x3d\x30\xcf\x12\xe7\x32\x9c\xf4\x49\
+\x49\x9f\x10\xe9\xc6\xbb\xd1\xbe\xca\x33\x30\xe9\x80\x44\x7a\x7a\
+\x1a\xe1\x6e\xe9\x79\xbb\xd9\x14\xaf\x9c\x37\x20\xbd\x83\x84\x6d\
+\x21\x9f\xd8\x8c\xf3\x3d\xd6\x74\xe7\x1c\x91\x9e\x17\x3a\x98\xf8\
+\xaf\xe0\x9c\x1f\xb0\xee\xd3\x3b\xc6\xc8\xcc\x0b\xe9\x55\xa4\xaf\
+\x6c\x03\x48\x1f\xd8\x56\x5d\xd3\x95\x78\x7e\x40\xba\x32\xfe\x94\
+\x18\x67\x28\xeb\xb7\x9f\x26\xbd\x63\x87\xdb\x09\x3b\x38\x59\xd5\
+\x85\x79\x00\x6b\x3a\x06\xf6\x71\x6c\xf9\xf0\x35\x3d\x38\x9f\x75\
+\x76\x8f\x48\x9f\x46\x79\xc6\xc7\x0b\xac\x57\x91\xce\x9c\x8b\x07\
+\xf1\xe0\x5c\xe7\x77\x4c\xef\x29\xdd\x94\xf7\x60\x9d\x9f\x1f\x26\
+\xa0\x53\xbe\xcb\x20\x9d\xde\x39\xde\x69\x33\xec\x14\x6b\x7a\xec\
+\xde\x25\xda\x63\x4d\x37\xcc\xc5\xee\x1d\xd0\xa9\x5d\x4d\xf6\x71\
+\x3a\x04\x60\xdd\xa6\xf7\x97\xd0\xad\x90\x30\x07\x12\x66\x77\x9b\
+\xdf\x99\xef\x26\x6b\x7a\xe7\x1c\x26\x5e\x28\x67\xf3\x75\xdd\xd7\
+\x74\x1e\x94\x6d\x8e\x97\x20\xc7\x16\x1e\x98\x84\x70\x7e\x62\xf7\
+\xce\x78\xf0\x33\x8a\x8d\x16\xe9\xfc\xc4\xee\x5d\x23\x7d\x78\xad\
+\x80\xed\xde\x13\x3b\x90\xce\xb4\x4b\x98\xa7\x9b\x20\xf9\x9a\x3e\
+\x01\xf3\xbc\x00\x59\xc7\x9c\x27\xfb\xb5\xe4\x1a\xf8\x67\x6c\x41\
+\xf8\xb1\x5d\xe8\xc2\xe3\x50\x6c\x78\x9d\xab\x57\x3e\xb6\x12\x98\
+\xf3\xf8\xa1\x8d\xa3\x00\xef\x4d\xd7\x40\x71\x9b\x9c\x71\xe5\x8d\
+\xb5\xb1\x0d\x3a\x0a\xd2\x03\x33\x3f\xe0\x5c\x80\x3f\x82\x80\x10\
+\x2c\x3e\xfb\x5f\x2a\xce\x1e\x01\x61\x1b\x9e\x0e\xda\xc1\xfe\x76\
+\xc1\x5d\x6c\x07\xe5\x4c\x36\x69\x3a\x83\xdf\x08\x16\x62\x93\x7f\
+\xe3\x53\x66\x03\x74\xd2\xa7\xe0\x3b\xcb\x5b\xa9\xce\xf3\xac\xaf\
+\x12\x87\xbd\x41\xb8\xc4\x37\x58\x3f\x00\xda\xd8\xf0\xd6\x41\x1b\
+\x50\x6c\x65\xee\xf8\x67\xb8\xfb\x1d\x26\xf1\x4d\xf8\x4d\x4e\xb9\
+\x1f\x79\xf1\x6a\x86\x4e\xfa\x24\x9c\xcf\x59\xdf\xba\xb6\x30\xa6\
+\xe0\x5d\x7e\x21\x75\x28\xac\xf3\x0f\x7e\x1f\xfa\xeb\x08\xe4\x63\
+\xf3\x41\xf8\x4d\x94\x83\x74\x65\x9b\x30\x9b\x6b\xc4\x13\x29\xf5\
+\x32\x24\xb4\xf5\x07\xf1\x60\xd7\x82\xec\x8e\x9f\xdd\xc8\x75\xec\
+\x18\xd8\x98\x60\xc7\xe2\x3b\xb9\xcc\xbf\x62\xa7\xa3\x20\x2c\x95\
+\xb4\x2c\x6c\x88\x2f\xc6\x82\xcd\xdc\x54\xec\xde\x1f\x23\x36\x72\
+\x91\x9b\x79\xd8\xde\x5d\x73\xef\x76\x46\x5f\x93\x3d\x29\x79\xee\
+\xfd\xa6\xc7\xb6\x27\xdb\xc7\xf3\x23\x35\x4d\xc3\x76\xea\xc9\x6c\
+\x43\x36\x2e\x56\x38\x9c\xd3\xe9\xf0\xdd\x3b\x61\x8f\x54\x16\x5b\
+\x2c\x33\x63\xa4\x33\xcf\xec\x41\x7a\x9c\xd3\x1d\xab\xda\xc0\x76\
+\xee\xde\x93\xba\x74\xe6\xde\x8d\x79\x1c\xd9\x5a\x64\xe4\x3a\x34\
+\x2d\x63\xb9\x77\xec\x4f\xad\xe6\x42\x1b\xc3\xcf\xe9\x9e\x7b\x17\
+\x4f\x4c\xbd\x63\x0e\xe2\x05\x73\x04\xfa\x58\xe5\xde\x03\x5e\x65\
+\x53\x73\xe2\x53\xe4\xde\xc5\xf0\x30\x9a\xe4\xde\x3b\x88\x0d\xe7\
+\x0e\x75\x98\xd9\xeb\x73\x7a\x99\x7b\xb7\xf3\x4f\xce\x14\xbc\x6b\
+\x8d\x6d\x2e\x48\x7f\x48\x72\xa6\xce\xbd\x3f\xca\x44\x2c\x58\x2f\
+\xcf\xe9\x4c\x38\x22\x5d\x89\xe7\xa3\x3a\xd0\x22\xf7\xde\xb1\xbb\
+\x27\xf1\x1b\xdb\xbf\xd4\xd3\x17\x1e\x5f\x19\x83\xf1\xeb\x2d\x0f\
+\x3b\xcf\x73\x44\xfa\x03\x69\x58\xb1\xd7\xeb\xf7\x6f\x4b\xcc\xac\
+\x2f\xa7\x7c\x18\x12\xc2\xbc\x5a\xd3\x51\x5d\xfd\x3c\x59\x6f\x44\
+\x7a\xe7\x5d\x52\x4c\x36\xb3\xff\x5b\x3d\x9d\x07\x18\x07\x9c\x73\
+\xcd\x92\xd5\xd3\xfb\x14\x4d\x14\xec\x02\xeb\x8a\x42\x1b\xa3\x5c\
+\xd3\xad\xca\xa6\xc9\x38\x75\x40\x9b\x8d\x5c\xcf\xbd\x47\x94\x5b\
+\xce\x69\xfb\xae\x9e\x4e\x19\xb9\x77\xe1\xbc\xce\xbd\x83\xf7\xa8\
+\xa7\x8f\xbe\x7b\x37\xc6\x7f\x47\xc5\x45\x06\xca\xaa\x8a\x54\xaf\
+\xe9\xfc\x28\xe3\x9f\xc5\xfc\xfe\xd9\x8a\xf4\x1e\xea\xc8\xbd\x7f\
+\x5f\x4f\x07\xef\xc8\x7a\x44\xac\x4b\x80\x2b\xe3\x58\xd4\x27\xc7\
+\xe8\x4d\x14\x0f\xc5\xef\x32\xd4\x6d\x78\x3d\x3d\xbd\xd2\x1a\xeb\
+\xb9\x45\xfa\x1a\xab\x7a\x13\xd2\x3b\xe9\xc4\xb6\xe9\x60\xae\x7d\
+\x8e\xa7\xa2\x9e\x4e\x45\x0e\xb3\x9e\xdd\x79\x78\x2d\xfd\x0c\xf4\
+\xc7\x3c\x71\xa4\xb3\xe9\xb2\xce\x28\xf8\x1e\x94\xef\x24\xbe\xae\
+\xa7\x6b\x7b\x1c\xea\xe9\x4a\xbb\xae\xe7\x0d\xce\xe9\x1d\xbb\x97\
+\xd9\xb0\x77\xd7\xf4\x32\x69\xfe\x71\x83\xed\x79\x23\xcd\xcd\x90\
+\x4c\xed\xb4\xa0\x8f\xc2\x76\x72\x53\x16\x4c\x1a\xe9\xec\x8d\x74\
+\x9f\xe0\x1f\x4a\x3a\x12\x33\x30\xc1\x60\x47\x36\x85\xae\xea\x5e\
+\x4f\x47\x59\x35\x25\xdf\xc9\xa5\x14\xc9\x99\x09\x98\x97\x05\xa9\
+\xd8\x09\x96\xc5\x66\xf5\xfc\x3b\xe7\xd3\xc8\x72\xb2\x07\xbf\x49\
+\x72\x49\x3a\x55\xa9\x3f\xc4\x67\x36\xf6\xba\x72\x65\x92\x42\x4b\
+\xde\xd9\x9d\x6f\x2a\x4c\xba\xc8\xf8\xd9\x50\x6c\x81\x69\x2d\xda\
+\xff\xc7\x01\xf4\x5f\x4b\x2e\x7d\x92\xf9\x6f\x08\xd2\x03\x59\x4d\
+\x93\x04\xd1\xb7\x55\x62\xa1\x6c\x75\x60\xab\xb5\xc9\x0b\x20\x31\
+\xf5\x36\x93\xc1\xd3\xa5\xbe\xe6\x53\x1f\xce\x34\x9e\xb7\x44\xc7\
+\xc9\xc9\x3f\x42\xa7\x31\x7a\xc1\xe5\x5c\x4f\x72\x59\x4f\xbf\x02\
+\x89\x05\x78\x79\x88\xad\x00\xc8\xb6\x2a\x9b\xfe\x0c\xc6\x81\xa8\
+\xb6\x59\x9b\x01\xc8\x16\x92\xc1\xba\x2d\x90\x0d\x2b\xeb\x9d\x74\
+\xd0\x3e\x63\x76\xcf\x66\x5e\x63\x8b\x19\x7e\xc1\xbc\x8e\x5f\xf2\
+\xdb\x6a\x6c\x19\xb3\x3c\x3b\xab\xad\x09\xeb\xa8\xb1\xed\x79\xdb\
+\x48\x3c\x83\x48\x1c\xaa\x6c\x62\xcc\xb5\xfe\xc2\xec\xce\xcf\x2e\
+\x6f\x79\x29\xf9\xf4\x57\x31\xde\xab\x6c\xbd\xfb\x1d\x7f\xcd\xf6\
+\x37\xee\xbb\x9a\x83\x34\x12\x32\x91\xac\x89\x1a\x25\xb4\x2c\xe7\
+\x3e\x6e\x16\x6f\x3b\x39\x17\x3b\xa8\x63\x58\x72\x46\x53\xb0\xfc\
+\x00\xb1\x75\x4f\x2b\x80\x8c\x1c\x12\xb1\xc8\xbd\x27\x6d\x8c\xc4\
+\xd6\x1d\xfe\xa7\x09\xe8\xe7\x35\x14\x5d\x4c\xd1\x84\x07\x59\xb9\
+\xb2\xe2\xa2\xf8\xbe\xef\x7d\x5e\xea\x1e\x39\x7e\x81\x74\x10\x2e\
+\xa3\xca\xbd\xaf\xea\xa2\xd8\xa2\xa7\xf4\x90\x35\x99\xb4\x29\xb5\
+\xca\xbd\x77\xf8\x1e\x14\xbb\xd2\x6d\x8f\xce\xc8\xa8\xa7\x1b\xbe\
+\xeb\x7b\xaf\xb5\x6c\x28\xaf\x22\xc8\xd5\xd5\x0a\x17\x88\x5b\xd8\
+\xa2\x9e\x1e\x5a\x36\x61\x3f\xa1\xbe\x26\x68\x58\x65\xeb\x7d\xef\
+\x42\x3c\x1e\x64\xe3\x2e\x7d\xef\x60\xfe\xda\xf7\xbe\xe4\xfc\xa7\
+\x6e\xd8\xc7\xe4\x2d\xd0\x4c\xf7\x58\x74\xc3\xae\xa7\x94\x6d\xb8\
+\xd4\xd3\x43\xdd\xf2\x2c\xfb\xde\x3f\x7f\x9a\xf4\x9e\x9c\x71\x1d\
+\x9b\x98\x32\x4e\x45\x3d\x9d\xa2\x9e\x0e\xfc\xb1\xef\xdd\xa2\xbc\
+\x10\x30\x22\x23\xe7\xd9\x19\x70\xee\xb8\x94\xd3\x8b\x1e\xe8\xf4\
+\x34\x2d\x5b\xd9\xf7\xde\x86\xf4\x1e\xea\x5a\x65\xd3\x73\xc9\xf7\
+\xf5\x74\xf0\x1e\x7d\xef\x45\xe7\xf1\x82\x11\x79\x58\x61\x1c\x91\
+\xfe\xe2\x17\x5b\x10\x0e\xc7\xf6\x4d\x3d\xfd\xc6\x3f\xa2\x87\xa2\
+\x59\xa4\x77\xd2\x23\xd7\xe4\xeb\xb9\x81\xe8\x40\xfe\xdd\x38\xcf\
+\x59\x1d\x31\xc3\x91\x7b\x77\xc1\x43\x31\xbd\x83\x74\x8b\x74\x4d\
+\xc5\x7e\xaf\x4f\x4f\xb5\x3e\x1d\xcd\x52\x1f\x09\xe2\xf4\x56\x6b\
+\x7a\x5f\xd1\x49\x4d\x13\xcc\xf7\x4d\x5d\x28\x18\x7d\x3d\x07\xe7\
+\xe2\xa1\x23\x10\x03\x42\x9d\x5e\xd6\xd3\x99\x79\x44\x7a\x74\xce\
+\x5c\xf5\xe9\x6b\x7a\xaf\xa7\x0b\x70\x60\x0b\xce\x9b\x91\xde\xbb\
+\x67\x78\xa0\x96\xee\x1d\xfe\x78\xd9\xba\xee\x9b\x77\x21\x9b\x34\
+\xb3\xe9\x98\x8b\x1e\xb9\xd9\x54\xab\xde\x23\x87\xc3\xfa\x6b\xbc\
+\xe8\xd3\x11\xed\x86\xd7\x59\x4f\xf7\x9e\x48\xb8\x36\xfa\xf4\x0e\
+\x57\x66\x10\x8a\x07\xbb\x86\x7a\x71\x4e\xcf\x16\xe5\xfa\xc6\x31\
+\x5d\x94\x03\xba\x94\x13\xb4\x6c\xfa\x7b\x42\x39\x7d\x3a\x31\x5a\
+\xe3\xcc\xf8\xba\x34\xc3\x96\x7c\x87\x6a\x15\xe2\x45\xc6\x13\xe9\
+\x19\x7d\x3c\x37\x53\x15\x5c\x26\xcb\xbd\x87\x96\x6d\xae\x94\x0e\
+\x53\xf6\x2e\xbe\x85\x2c\x0b\x4b\x8b\xe9\x1b\xe4\x8d\x5f\x50\x36\
+\x65\x36\x7d\x18\x59\x3d\x40\xa1\x70\x21\x8a\x53\xec\xee\x55\x36\
+\x79\x21\x4c\x5c\xec\xb0\xc3\xfd\x18\x3a\x2e\xa4\x33\x72\xa1\x65\
+\x9b\xc5\x09\xf9\x05\x0e\xa9\xc0\xa1\xd6\x42\x78\x65\xdf\x8c\xea\
+\x1b\x75\x35\x2b\xb8\xf0\x6f\x4f\x43\xd6\x40\x51\x8d\x1d\x66\x41\
+\x71\x62\xca\x2f\x89\xc3\xef\xff\x05\xbd\xca\x16\x5a\x36\xb6\x77\
+\x7c\xd9\xfa\x43\x47\xc6\xc8\x11\xdf\xa8\xa3\x97\x2a\x46\xd4\xd0\
+\x0f\x04\x75\x09\x21\xd9\xb5\x6c\xc4\x86\xcb\x59\xc4\xe0\x37\x17\
+\x2f\xb6\x97\x36\x75\xd2\x01\x68\xd9\x30\xec\x55\x01\x5a\x36\x0c\
+\x53\x2a\x1f\x00\x65\xe5\x9b\x0e\x44\x78\xde\xf3\x81\xdc\xa3\x91\
+\x4e\xae\xf3\x61\xb8\x96\x4d\x6c\x27\xaf\xa7\x8b\xe9\x10\x6c\x6c\
+\x7f\x89\x6e\xb5\x57\xd9\xfa\xfe\x9d\xde\x7b\xe4\xbc\x6d\x08\x19\
+\xb9\x4c\xe7\x39\x3d\x17\x19\xb9\x5f\x93\x9f\xd3\x97\x8b\xc2\xc5\
+\x1b\xe4\x90\x7a\x67\xe7\xb0\xbc\x3b\xbf\x79\x58\xdf\xbb\x6f\xe6\
+\x90\x8e\x93\xf4\xbb\x0b\x9b\xc4\x5a\x90\xde\x13\x72\xea\xd0\x08\
+\x76\x07\xeb\x40\xd9\xf3\x5e\x9f\xd3\x81\x5f\x9e\x7b\xcf\xf5\xe5\
+\x81\xd1\xf7\x7e\xd9\xbd\x0f\xc3\x4b\x86\xe6\xe2\xe2\x1e\x39\x88\
+\x5b\x40\xba\xeb\x5b\x8c\xf5\x56\xa4\xf7\xbe\x77\xbb\x5d\x6a\xdb\
+\x91\x9c\x8b\xdc\xbb\xf1\xfe\x76\x4e\xbf\xf4\xbd\xcf\xcb\x9c\x6b\
+\x59\x93\x0b\x18\x85\x77\xa8\x56\x1d\xab\x8f\xb8\x73\x86\xf3\x71\
+\x48\xc3\x2a\x6e\xb8\x68\xa8\x75\x95\xad\xe7\xde\x37\x3f\xa7\xa3\
+\xfb\xd9\x73\xef\xbe\xc3\x29\xce\xe9\x39\x38\x8f\xbe\x77\xf6\x0a\
+\x50\xce\x66\x7d\xef\x3c\xca\xc2\xea\xea\xc9\x77\xc7\x79\x8f\x5c\
+\x3a\xef\x9c\xb9\xdd\xd8\xb7\xd3\xb2\x75\xec\x30\x72\x95\x0b\x69\
+\x8c\x57\x0a\x97\x4a\xcf\x26\x5b\x62\xfa\x53\xdf\xfb\x8c\x84\x5c\
+\x5c\x34\xe4\x55\x36\x49\xc1\x56\xb4\xf3\x03\x7d\x3a\xac\xae\xa7\
+\x43\xbc\x28\x9c\xab\x42\x5d\xa2\xbd\xcb\x9a\x9a\xb0\x8e\x7b\x53\
+\x38\xca\xd9\x61\x4d\xc7\xa8\x14\x2e\x5e\x56\xfd\x22\xeb\x7a\x0f\
+\xe6\x17\x10\xef\xa4\x3f\x66\xb6\xa8\xb2\x5d\x72\xef\x43\xe8\xd3\
+\x87\xa1\xca\xbd\x3b\xe9\x89\x4d\xa8\x17\xba\x3f\x1b\x92\xde\xa7\
+\x77\x35\xe5\x1a\x3e\x04\x8c\x88\x72\x31\x88\x17\x2b\xc6\xab\xdd\
+\xbb\x47\x7a\x90\x2e\x0e\x1b\x39\x36\x60\x88\x82\xfa\x90\xde\xeb\
+\xe9\xb0\xe4\x8a\xd5\x67\x2b\x01\x63\xa7\x9c\xe4\xb5\xfb\x9a\x8e\
+\x19\x1e\xe6\x33\x3b\x19\xe7\xf4\xc5\x00\xe7\x62\xe0\x3c\xd6\xf4\
+\xe9\x84\x57\xd9\x94\x70\x71\x8e\xe1\x1b\x7d\xba\x13\x0e\xf9\x22\
+\xc7\xfb\x53\x58\x6f\xd4\x18\xd9\x49\x47\x05\xc1\xef\x7b\x67\xaa\
+\xb5\xcd\xfb\x04\xf2\x56\x27\x4c\x41\xe0\x88\xce\x99\x7a\x23\xe7\
+\xdd\xb0\xa5\xa4\xc9\xf5\xe9\x75\xeb\x4c\x4a\xa5\x3e\xfd\x5d\xa9\
+\xdc\x6a\x23\xd7\xa7\xf6\xb8\xef\x9d\x4c\xcb\xb6\x6d\xea\xf7\x7c\
+\x88\xa1\x0f\x9a\xb4\xf9\x99\xc4\x84\x68\x8d\xf4\x49\x09\x57\x35\
+\xdb\x3c\x95\xc9\x19\x36\x24\x67\xae\x0a\x75\xe1\x3d\x79\x0f\x74\
+\xac\xe9\x02\xbb\x94\x80\x17\x73\xa3\xdd\x0a\xea\x55\x1a\x56\x9c\
+\x6b\x1e\x50\xe1\x43\x65\xad\xf4\x4b\x16\x67\x35\x36\xbb\x4b\x8e\
+\x32\x65\x54\xd9\x16\x68\xd8\x8e\x83\xd8\x23\xf7\xb4\x6f\x6c\xc8\
+\xc2\x8b\xdd\xed\xbf\xff\xd4\xb2\x6d\xa4\xe9\x2b\xcf\xbb\xb3\xdb\
+\xed\xb4\xcb\x1e\xef\x86\xe8\xb9\xf7\xa9\xa8\xb9\x54\xb9\xf7\x39\
+\x97\x20\x1e\xd9\x55\x4d\xae\xb1\xa6\x23\x40\xa1\x64\xb3\x93\x29\
+\xbd\x5f\x22\xe8\x1a\x36\x7e\xe3\x89\x2a\x1b\x3f\x74\x76\xa0\xec\
+\x1e\x42\x2d\xd0\x4b\xab\xc0\x1c\x7c\x9b\x3c\x3e\xc3\x3b\x48\x2d\
+\xda\xf4\x85\x74\x33\x52\x03\xe2\xc6\x48\x63\x7d\xab\x81\x3c\x15\
+\xf8\xd6\x41\xe2\x2c\xd6\xd1\x4b\x4a\xec\x83\xfb\x06\xe8\xa4\x23\
+\xd6\x31\xc3\xcf\xa8\xb3\x99\xca\x46\xcd\xfd\x22\xb6\xe0\xd7\x71\
+\x2c\xaa\x62\x5b\xec\xc6\x48\xb1\x83\xb2\xdf\x03\x4c\x6a\x1b\xd4\
+\x6c\x0a\xbc\xa1\x63\x93\x37\x33\x0e\x2d\x5b\xa8\x95\x77\x36\xd0\
+\x2e\xa0\xbf\x81\xed\x5e\x65\xeb\xd8\x31\xb0\x7b\x67\xc3\x2e\x86\
+\x47\xde\x37\xca\x3b\x99\x92\x0d\x5a\x36\xb1\x42\xcb\x06\x5b\xf2\
+\x6c\x11\x08\x20\x25\xf7\x50\x03\x5e\x27\x92\x9f\xd8\x8a\xdc\x3b\
+\x76\xef\xb0\xdb\x99\x7d\x6f\xaa\x70\xe9\xa4\x17\x97\x0d\x6d\xdb\
+\x7b\x95\x6d\x0b\xad\x03\xf2\xee\x97\xbe\xf7\x45\x5d\x34\x46\x8a\
+\xb1\x03\xe9\x2f\x3c\xd7\x7a\x8b\x21\xc9\x03\x97\xe2\xc8\x26\x8f\
+\xa2\xe9\x8d\x91\xbd\xef\x1d\x37\x99\xdb\x5e\xf5\x92\x7b\x37\x44\
+\xff\x51\xd5\xf7\x7e\xd5\xb2\x8d\xd6\x19\xf9\x3a\x2f\x0f\x54\x0c\
+\xe6\xd0\x04\xeb\x61\x5e\xdd\x2e\x65\xca\x55\xb4\x45\xb6\x8e\xf4\
+\xde\xf7\xce\x5c\xbb\x6d\x97\xdc\x3b\xa2\x5d\xb7\x45\xc2\xf9\xa5\
+\xef\x3d\xbf\xab\x56\x47\x41\x7c\x96\x8d\x3d\x08\x1f\xca\x48\x8f\
+\x7a\x3a\x90\x54\xe2\x82\xc1\x87\xf5\x76\xc9\x99\x9e\x9c\x11\xd0\
+\xee\x79\x58\xda\xdf\x72\xef\x31\xbf\x53\x16\xa3\x6a\x7e\x9f\xdf\
+\xb5\x6c\xe3\x24\x0e\x78\x08\xe3\x9a\x88\xf5\x50\xff\x8d\x46\x0a\
+\xe3\x7d\x88\x7a\x3a\x48\x7f\x5a\xd3\xcc\x67\xfa\x4c\x6d\xd7\xf4\
+\xfe\xe5\x1e\xbb\x47\xae\x54\xb7\xa8\x95\x51\x4e\xc6\x37\x46\x5e\
+\xa8\xe0\xfc\xa2\x65\x1b\x2d\xd2\x79\x44\xa0\x87\x98\x0d\x64\xa7\
+\x61\x88\x7a\xba\x91\x8e\xa2\x2a\x87\xfc\xfa\xe9\x71\xde\x88\xf4\
+\xbe\x77\x8f\xc6\xee\xcd\x39\xb7\x48\x0f\xce\x11\xe9\xc6\x79\x66\
+\xbb\xce\xef\xbe\xa6\x8f\xe7\x8d\x91\xf2\x44\xa0\x5f\xd4\x0e\xd7\
+\x7a\x3a\xae\x92\xfb\xe4\x50\x17\xdf\x3e\xd2\x7b\x79\x15\x92\x65\
+\x0c\xdf\xbd\x57\x5a\xb6\x7c\x78\xb4\x57\xf7\xbd\x97\xdf\x65\x63\
+\xaa\xc5\xf3\x1b\xbb\xf7\xd0\xa7\x03\xab\x8d\xaa\xca\x66\x4d\x72\
+\xc8\xbe\x4b\xa4\x33\xeb\xb7\xf4\xd9\x32\xd2\xfb\x7d\xef\xe8\x93\
+\xb3\x1b\xd3\xaa\xdd\x3b\x86\x21\xfb\x70\xcc\xd5\x77\xd9\xae\xf7\
+\xbd\xbf\x34\xd2\xe5\x16\xe8\xd7\xb5\x9e\x9e\xd6\xe1\xaa\x4f\xc7\
+\x4e\x8e\x29\x57\x7c\xf2\xf8\x79\xd2\xfb\x17\x1d\x00\x66\x1b\xba\
+\x0d\x21\x9e\xde\x3b\x62\x61\xc0\xe5\xbe\xf7\xea\x26\x0a\xc1\x58\
+\xde\xf7\x3e\x62\xfb\x0e\x0c\x55\x3d\x3d\xbe\xaa\x0c\xc2\x15\xd0\
+\xa7\xcb\xec\x0e\xd6\x2f\x5a\xb6\xf2\xbb\x6c\xfa\xf6\x17\x0f\x87\
+\x7f\x82\x42\xdf\x4b\x3e\xb5\x6c\x8e\x0d\x2f\xa2\xd0\xb2\x1d\x3c\
+\x02\xa5\xce\x01\xfa\x3e\xfc\xf0\x0a\x1b\xf2\xb0\x3c\x14\xbb\x3d\
+\xcd\xd0\x0b\x2e\xf5\x77\xd9\xa0\x8e\xbf\x02\xb5\x37\x5c\x14\xe9\
+\x5a\xb6\x12\xae\xba\x87\x96\x8d\x30\xaf\x01\xd1\x2f\x86\x14\x65\
+\x7c\x97\xed\x4e\x20\x5f\xa3\x03\x34\x6f\xff\x57\xee\xbd\xcb\x9a\
+\x2e\x5a\xb6\x77\xde\x43\xcb\x46\xf2\xdb\xdb\xf6\x05\x54\x7d\x97\
+\x0d\x5a\xb6\xe3\xd4\xb2\xed\x88\x71\xc0\xd6\xba\x1d\x65\xd5\xb8\
+\x31\x92\x47\x68\xd9\x4c\xb9\xda\x94\xf9\x4e\xfa\x5c\x7d\x97\x8d\
+\x6d\x62\xe7\xd5\x36\xab\xad\x55\x5a\xb6\xc5\xbf\xba\x69\xdc\xe7\
+\xf8\x2e\x1b\xb4\x6c\x5b\x68\xd9\x72\x11\xed\xe4\xbf\xfc\xbb\x6c\
+\x88\x70\x92\xf8\x0f\x9a\xb7\xbf\x25\xd2\x7b\x95\xad\x0b\xd9\xd8\
+\x61\xde\x52\x49\x5b\x2c\x6f\x94\x91\x7b\x8f\xef\xb2\xe9\x7d\xef\
+\x84\x62\x75\x68\xd9\xe2\xbb\x6c\x51\x71\x81\x96\x0d\x1f\x77\xb8\
+\x1e\xd9\xce\xf6\x67\x6c\xe4\xd2\x93\x3d\xa4\x0e\xa8\xb4\x7d\x40\
+\xdd\xf4\xd1\x44\xd6\xd4\xb1\x63\x47\xaa\xe9\x19\x14\x5c\xc2\x68\
+\xb7\x9d\x3b\x1d\xe5\x37\x5c\x16\xca\xec\x4b\x2d\x9b\x7f\x97\x2d\
+\xee\x0e\xf4\x4f\x74\x79\xcd\xa5\xbe\x7e\xc4\x53\xb0\xce\x79\x9c\
+\xd3\x71\xdd\xfb\x07\x3f\xad\xab\x6c\x9d\x78\xcf\xbd\x13\xfb\x6f\
+\x73\xef\x38\x05\xb9\xd2\x41\x49\xff\xd3\x77\xd9\x46\x65\x1d\x55\
+\x36\x8b\xf4\xf1\x22\x6b\x7a\xc5\x05\xff\xea\x93\x67\xe4\x20\x58\
+\x85\x6b\x15\xe9\x3d\xf5\x1e\x7d\xef\xdb\xbf\xe6\xde\xe3\x6b\x4d\
+\x6a\x90\x34\xa9\x03\xe9\xd5\x97\x1d\xe2\x9c\x7e\xf9\x5a\x13\x5b\
+\x80\x59\x8f\x2a\x5b\xd9\x03\xfd\xf1\x4c\xcd\x32\x72\x5d\xcb\x26\
+\x5e\x0b\x6c\xca\x39\xbe\x24\x1d\xb9\xf7\xc8\xc9\xa1\xb4\x5a\xde\
+\x0d\x3b\x63\x78\xeb\xfb\xc9\x39\x3b\xdc\x22\x67\xa3\x84\x7e\xc6\
+\xe3\x25\x6e\x4d\x6a\x18\xa8\xac\x6a\xc9\xa5\x90\xa7\x37\x8b\xf4\
+\x1e\xed\x68\xf0\xd4\x04\x84\x67\xa2\xea\xdc\xfb\x21\x86\xd4\x3b\
+\x3f\x8c\x9a\xf7\xc5\x3f\xd1\x65\x60\xc2\xdd\x5c\xe5\x02\xac\x1e\
+\xe9\xf8\x16\x9f\x73\xfe\x4c\xd6\x31\x25\x79\x77\x95\xb7\xa4\x96\
+\xaa\xd5\x4e\xb8\x18\x34\x2e\xec\x91\x79\x02\xeb\x00\x73\x4d\xca\
+\xb8\x07\xfb\x42\x84\x63\xb1\x60\xae\xd7\xf4\xd0\xb2\xd9\xb7\xd9\
+\x4c\xbe\xe8\xac\xaf\x70\x2e\x70\x19\x10\xe9\x4f\x1e\xab\x92\xee\
+\x84\xd7\xdd\x52\xff\x00\x0e\x5e\x0c\x4e\xab\x94\x1d\x32\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x58\x32\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\xdc\x00\x00\x01\x7c\x08\x06\x00\x00\x00\xa4\x31\xd5\xdb\
+\x00\x00\x57\xf9\x49\x44\x41\x54\x78\x5e\xec\xdd\xc1\x4b\x55\x69\
+\x18\xc7\xf1\xdf\xb9\xd7\xeb\x95\x0b\x95\x61\x10\x3a\xad\x24\x50\
+\x50\x08\x12\x0a\x71\x56\x21\x83\x25\x48\x10\x11\x2d\x6c\x51\x11\
+\x42\x81\x04\xdd\x6a\x46\xbc\xaf\x60\x50\xa3\xb6\x28\x89\x20\x72\
+\x71\x21\x5c\xb4\x90\xac\x08\x93\x36\xcd\xb4\x72\x06\x23\x62\x86\
+\x1a\x37\x52\xdc\xc8\x82\xb1\xc2\x6c\x91\xf2\xf4\x6c\x82\x10\xbc\
+\x48\x59\x69\x7e\x3f\xf0\xe5\xf9\x0b\x7e\xbc\x8b\xb3\x38\xfa\x11\
+\x00\x00\x00\x00\x00\x00\x00\x00\x82\xf4\x8b\xb7\x43\x79\x00\x31\
+\x7d\x11\x9c\x94\xd6\x06\xa9\x5f\xd2\xed\xa8\xa0\xa0\x45\x5f\x0f\
+\x18\x1c\xaf\x5a\x52\x7a\x68\xd2\x9e\x9f\xb6\x6e\x1d\x4a\x4f\x4c\
+\x3c\x30\xb3\x94\xe6\x01\x14\xe8\x73\x30\xb4\x94\x49\xbf\x4b\x3a\
+\x1c\x4f\x24\x26\xea\xbb\xbb\xfb\x6a\x5b\x5b\x9f\x4a\xba\xeb\xbd\
+\xd3\xa2\x01\x18\xdb\x16\xef\x91\x67\xbd\x15\x15\x7f\x4c\x8e\x8f\
+\x9f\x36\xb3\xc3\x5e\x99\x16\x07\x80\x43\x52\x22\x48\x1d\x19\xe9\
+\x7d\x47\x2c\x36\x39\x7c\xfc\x78\xd6\xcc\x82\xb7\xdd\x2b\xf8\x64\
+\x90\x45\xde\x21\xaf\x72\xb7\x14\xf7\x3b\xe4\x1d\xd3\xc2\x00\x08\
+\x52\xa5\x37\xe2\x59\x4f\x69\xe9\xdf\xb9\xd1\xd1\xb3\x66\x76\xd4\
+\x2b\xd7\x1c\xbf\x4a\xeb\x83\x34\x15\xa2\xe8\x49\x46\xea\x0c\x92\
+\xf5\xd5\xd5\x75\x69\x41\x00\xc6\x76\xd0\x9b\xf6\x01\x4d\x0f\x34\
+\x37\x5f\x9d\x9d\x9d\xed\x30\xb3\x5d\x5e\x91\xe6\x71\xa7\xad\xad\
+\xcb\x5f\xc1\x99\x20\x59\x67\x32\xf9\xf6\xbf\x5b\xb7\xba\x42\x08\
+\x31\xe5\x07\xc0\x87\x76\xfd\x4c\x49\xc9\xfd\xb1\xe1\xe1\x73\x66\
+\x76\xc2\xab\x56\x1e\xed\x52\xcd\xa9\x54\xea\x5e\x90\x6c\x4e\x37\
+\x95\x1f\x00\x33\xab\xf1\x82\xd7\xec\xad\x56\x7e\xca\x48\x17\x7d\
+\xa4\x53\x17\xaa\xaa\xfe\x0a\x92\x5d\xae\xad\xbd\xdf\xdf\xd4\x74\
+\x63\x60\xdf\xbe\x1e\x33\x4b\x28\x2f\xf0\x59\x00\x8f\xbd\x97\x51\
+\x14\x3d\xd1\x02\x1c\x18\x19\xe9\x2e\xdb\xb4\xe9\xc5\x9b\x5c\x2e\
+\x71\xbe\xbc\xbc\x26\x59\x5c\xfc\x7a\xef\xe0\xe0\xa0\xa4\x42\x6f\
+\x95\xf7\xbf\x56\x2c\x44\x5a\x54\x30\xb3\xa4\xa4\x6a\x6f\x2c\x5b\
+\x5f\x9f\xdd\xd8\xd0\x90\xfb\x39\x9d\x3e\xa2\xaf\x0e\x60\x7c\xdb\
+\xbc\x16\x7d\x13\x00\x83\x8b\xb4\x52\x01\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\xf8\
+\x47\x1f\x80\x8c\xd4\x16\xa4\x57\x7e\xc3\xca\x18\x1e\x62\xfa\x6e\
+\xb0\x7a\xc3\x86\x7f\x24\xad\x89\x45\x51\x26\x23\xdd\x0b\x52\x8b\
+\x96\x13\x30\xb8\x20\x15\xfe\x26\x95\x6a\x19\x98\x7a\xfe\xfc\x48\
+\x2c\x1e\x9f\x29\xdd\xbc\xf9\xdf\xd4\xba\x75\x25\x51\x14\xf5\x06\
+\x69\x67\xbb\x54\xb7\x5b\x8a\x6b\x29\x02\x32\x52\x3a\x48\x5d\x92\
+\x22\xbf\x97\xbc\x67\x5a\xe2\x82\xd4\xe4\xd9\x95\xc6\xc6\x3f\xcd\
+\x2c\x5c\xdb\xbf\x7f\x28\x48\xf6\xb1\x8c\x94\xd5\x52\x04\x7c\x68\
+\xef\x2a\xa0\xaa\xca\xda\xf6\xbe\xa2\x82\xd9\x1d\x60\x8c\x9d\x63\
+\x8d\xdd\xdd\x39\xea\x98\x63\xd7\xd8\x8d\x88\x08\x16\x12\x62\x61\
+\xa0\x98\x01\x82\x8d\x05\x82\x01\x8a\x8a\x58\x58\x18\x08\x62\x22\
+\x29\x20\xa1\xf2\x3f\xef\x5d\xfb\xac\x75\xbf\xfb\xe3\xcc\xe0\x10\
+\xd7\x99\xf7\x59\xeb\x59\x87\xb3\xcf\x61\x3e\xef\xb7\x79\xef\xde\
+\xfb\x8d\xe7\x5d\x96\x23\xc7\x7a\xf9\x47\x7a\x08\xd7\xaf\x1b\x6b\
+\xd5\xa2\x3f\xe2\xc2\x3a\x6a\x68\x79\xc1\xc9\x60\xa0\x79\xae\x5c\
+\x51\xd1\xaf\x5e\x99\x7b\x5b\x5a\x56\x82\x81\x85\xad\x2e\x5a\xf4\
+\xbd\xfb\x82\x05\x07\xb6\x36\x6e\xec\x4b\x46\xb7\x2c\x67\xce\xea\
+\x42\xd7\xc0\x60\xc4\x85\x85\x35\xb4\x2e\x53\xe6\x95\xb2\x3a\xec\
+\xeb\xd1\xc3\x7b\x47\xdb\xb6\xdd\x74\xd4\xe0\x9a\xc0\xb8\xbe\x90\
+\x41\xed\xea\xd0\xc1\x17\xab\x5b\x07\xdc\xdb\xd2\xfd\x15\x5b\xdb\
+\x3d\xb8\x1f\xb3\xae\x6a\xd5\xeb\xa6\x2a\xd5\xd7\xd7\xfe\xfe\xad\
+\x31\x5e\x07\xdc\x6d\x22\x44\x4f\xc1\x60\xe8\xc0\x8a\xf1\x13\x56\
+\x87\x5b\xd2\xd8\xb4\xf9\x93\xd0\x41\x5c\xb5\xb5\x5d\x67\x55\xaa\
+\xd4\x9b\x35\xa5\x4a\x85\x5a\x97\x2d\x5b\x1b\x06\x95\xb4\xbe\x7a\
+\xf5\x07\x30\xb6\x29\x66\xfa\xfa\x6d\xc9\xf8\xb6\xb7\x68\xe1\x8f\
+\xfb\xe6\x78\xd6\x50\x63\x9b\x69\x2f\xb2\x12\x0c\x76\x9a\x7c\x11\
+\x22\x57\x76\x7d\xfd\x6c\x3f\x75\xe9\xe2\x9a\xa7\x58\xb1\xb0\x7c\
+\xa5\x4b\xbf\x1d\xe4\xea\xba\xb9\xd7\xf6\xed\x9b\xe6\x44\x44\xe4\
+\x12\x3a\x88\x26\x33\x66\x6c\x9d\xf1\xf2\xa5\xed\x8c\xe7\xcf\x1d\
+\x12\xa2\xa3\xcd\x31\x94\x23\x6f\xc9\x92\x71\x31\x61\x61\xee\x5f\
+\x13\x13\xad\xb3\xe5\xc8\xf1\xa9\xfb\xa6\x4d\x1e\x18\x7f\x96\xb7\
+\x44\x89\x10\x01\xe4\x29\x5e\x3c\xac\xec\x2f\xbf\xe4\x81\x11\xaa\
+\xe7\x2c\xcb\x9c\x2a\x0c\x06\x56\x82\xd9\xe0\xc2\x0d\x35\x6a\xf8\
+\xaf\xc8\x9f\x3f\x1a\xf7\x5d\xc0\xbe\x60\xa5\xbf\x58\x1d\xab\x61\
+\xd5\x70\xc4\xb5\x49\x16\xfc\x9b\x73\x81\xb5\x2e\x59\x59\x55\xd9\
+\xd3\xa5\x8b\xb7\xf3\xc0\x81\x47\xb0\x82\x8d\xa3\x95\xcc\x75\xe8\
+\x50\x77\x3c\xeb\x25\x57\xf0\xf2\x34\x76\x68\xd0\xa0\xf3\x18\x5b\
+\x02\x16\xc1\xbd\x33\x9d\xf9\xc0\x49\x59\x11\xbf\x63\xb0\xc1\x15\
+\x02\x73\x7a\x2c\x5c\x38\xe0\xc6\x96\x2d\x8e\xb8\x2f\x2b\xfe\x1c\
+\xe4\xcd\x9c\x06\xc6\xe3\xac\x14\xbb\xbd\x79\xf3\x5f\xb3\xf0\xdf\
+\x5e\x18\x1c\x06\x1a\xc3\x89\xe2\x44\xc6\x65\x5f\xaf\xde\x5d\xdc\
+\xe7\x95\x06\x57\x8b\xc6\x5c\x7e\xfb\xed\x30\xc6\x72\x90\x81\xad\
+\x2c\x58\x70\xab\xc6\x36\x73\x8a\xc8\x22\x30\xd8\xf0\xf2\xc9\x3f\
+\xde\xc2\x7f\xb2\xaa\x95\xc5\xca\xe0\x8e\x6b\xca\xca\xc2\x85\x03\
+\x9e\x5f\xb8\x60\x8b\xf7\x47\xea\xc0\x2a\x9d\x13\xac\xe3\xbf\x7d\
+\xfb\xf6\x9b\xdb\xb6\x59\xe2\x3e\xbb\x00\x4c\x84\x68\x4a\x86\x75\
+\x74\xec\xd8\x3d\x8b\x85\xa8\x0d\x03\xf3\xa1\x7b\x72\x12\x9d\x9a\
+\x31\xe3\xd8\xfd\x23\x47\x86\xcb\xcf\xe3\x02\x56\x14\x3a\x04\x06\
+\xc7\xeb\x86\x82\x91\xe4\xa4\xd8\xdf\xb3\xe7\x91\xe4\xc4\x44\x33\
+\x18\xdb\x6f\x60\x5e\x1d\x59\xa9\xf5\xc0\xa6\xe0\x10\x30\x87\x34\
+\xb8\x8e\x64\x60\x70\xb0\x3c\xc1\x35\x69\xa9\x4a\x15\x77\xb0\x5f\
+\x3f\xe7\xe4\x4f\x9f\xe8\xdf\x3e\x09\xec\x62\xae\xaf\xef\x2b\x57\
+\xbb\x8f\xb8\x56\x11\x59\x09\x06\x63\x81\x10\x45\x60\x68\xea\xed\
+\x9a\x45\xee\xdc\xcf\x03\x9c\x9c\x36\xc2\xc8\x16\x81\x0d\x85\x8e\
+\x61\xa1\x10\xc5\xb0\x92\x55\xd7\x58\x91\x27\x2a\xdb\xc7\x35\x25\
+\x4b\xde\x7c\xe1\xed\x4d\x2b\xf2\x02\xb0\x11\xa8\x12\x80\xb9\x81\
+\xc1\xdb\x55\x85\x0b\x47\x38\x0d\x18\x70\xea\xd1\x99\x33\xd5\x44\
+\x16\x82\xc1\x61\x83\x2e\x30\x36\x8a\xd1\x7d\xdd\xf6\xcb\x2f\x67\
+\xe2\xc2\xc3\x2d\x28\xd6\xa5\xc3\x81\x71\x17\xf0\x33\xb8\x19\xdc\
+\x44\x31\x3b\x9c\xed\x62\xdd\xe7\xcf\x77\xa5\x8c\x14\x70\x10\x98\
+\x4f\xe3\xfd\x1a\x60\x0a\x1c\x2f\x57\x2e\x2d\x5f\xbe\x6d\x65\xa1\
+\x42\x37\xe4\xd6\xd3\x09\xf4\xa1\x2d\xe9\xb7\x52\xe0\x44\x7a\x81\
+\xc1\x98\x0d\x4f\x3a\xfd\xc1\x82\x5f\x91\x89\xf2\xe6\xea\xda\xb5\
+\xdb\x60\x64\x26\x60\x2b\x50\x67\xc3\x21\x5e\xa6\xa6\xf5\x90\x29\
+\xe3\xaf\xac\x6a\xcb\xf3\xe6\x7d\xf3\xe1\xf1\xe3\xd5\x30\xb2\x59\
+\x60\xf5\x54\xb6\xc9\xb3\xe9\xbd\x0d\xd5\xab\x3f\x96\x86\x9a\xb2\
+\xb2\x48\x91\x29\xab\x8a\x16\x35\xa1\x71\x32\xd8\xd4\x82\xe6\x78\
+\xe6\x09\xee\x98\x2f\x44\x01\xc1\x60\xfc\xd3\x6d\x19\xa5\x4e\x81\
+\x29\xc8\xda\xb8\x1c\xf9\xe2\xc5\x4a\x0a\x2a\x83\xa5\x7f\x10\xc7\
+\xcf\x78\xf2\xb6\x5a\x95\x2e\xfd\x86\x56\x66\x04\xca\xa7\x61\xcc\
+\x40\xa4\x02\x78\x59\x3d\x14\xe3\x34\xcb\x91\x23\x96\xae\xa7\xa7\
+\x4f\xdf\x82\xb4\xb0\x17\xb8\x4f\xda\xdd\xa9\xd3\xe5\x8b\x16\x16\
+\xbd\x35\xd2\xca\x72\x92\x91\x2d\xd3\xd7\xf7\xc1\xf6\x3a\xc8\x71\
+\xe4\x48\x03\xf1\x0f\xc1\xe0\x6d\xa4\xc1\x8a\x02\x05\xce\x21\x4c\
+\xb0\x53\x6e\xc3\xba\x82\xd9\x7f\x20\x6f\xab\x0a\xac\x9f\x94\x90\
+\x30\xef\x99\xa7\xe7\x3a\x72\xa4\x7c\xeb\x73\xc2\xe0\x12\xd4\xe9\
+\x6c\xdd\xbb\x7b\xef\xea\xd4\x49\xed\x3c\xc1\x99\x2e\x0a\xce\x95\
+\xc4\x2b\x36\x36\x8e\xf2\xbc\xd7\x5f\xbe\x7f\x17\x2b\x5e\x10\x38\
+\x30\x39\x39\xb9\xdf\xdb\x80\x80\x35\xf4\xbf\x23\x18\x8c\x74\x58\
+\x29\x86\x83\x33\xc1\x8a\x3f\xf0\x67\x30\x00\x5b\xff\xd9\xca\xec\
+\xbe\x70\xe1\xcc\xf3\x26\x26\x87\xf0\xce\x62\x38\x55\xae\x92\xc1\
+\x2d\xcd\x96\xed\xf3\xc5\xe5\xcb\x77\x63\x6c\x9a\xe6\x79\xcf\xa1\
+\x79\xf3\xd1\x58\xd5\xc2\xe9\x1d\x18\xea\x41\x3c\x6b\x9c\x5e\xdb\
+\x6b\x06\x1b\x9c\xfe\x7f\xe4\x73\xd6\x04\x27\x82\x86\x70\xae\xdc\
+\x81\xb1\x7d\xf1\x5a\xba\xd4\x09\xf7\x33\xc0\x02\x5a\xef\x56\x76\
+\x19\x32\xe4\x2c\x19\x9c\x53\xff\xfe\xb6\x72\x9b\xfa\x3d\x60\x30\
+\x18\x2f\x7d\x7d\xdb\xf9\x6d\xdd\xba\x43\x3a\x58\x0a\xa5\xb2\x05\
+\x2d\x89\x95\x2d\xc6\xa6\x5c\xb9\xd0\xcf\x49\x49\x73\x28\xd8\x2e\
+\xfe\x11\x18\x0c\x4e\x71\xeb\x07\x16\x55\x9c\x47\x32\x0b\x65\x32\
+\x98\x1d\x3f\x6f\xc7\xf5\xeb\xad\x9d\x3b\x1d\xf0\x4e\x3d\xf1\x37\
+\x20\x43\x0c\xa7\xf1\x7b\x7f\x51\xee\xc4\x60\xb0\xf3\xa8\x20\xb2\
+\x50\x02\x64\x78\xe0\x21\xf8\x65\x73\x83\x06\xb7\x60\x6c\xe3\x40\
+\x95\xd6\xbb\x55\x64\x22\xf7\x75\x32\x30\x70\xa0\x34\xb8\xea\x66\
+\x7a\x7a\xef\xe4\x7f\x63\x9c\xf8\x36\x18\x0c\x46\x62\x6c\xec\xe8\
+\xe3\xe3\xc7\xbb\x21\x4c\xf0\x91\x8c\x06\x75\x77\x4f\x8e\x4f\x9e\
+\xdc\x42\xbb\x6a\x02\x8c\x90\x31\xcb\x30\x7a\x4f\x72\x86\xa9\x91\
+\x91\x01\xb2\x58\x3e\x58\xe4\xc9\x13\xfb\xca\xdf\xbf\xb7\x60\x30\
+\x18\x7f\x59\x06\xd4\x2d\xfc\xe9\xd3\x15\xbb\xda\xb7\xbf\x46\x4e\
+\x95\x25\xb0\x43\x13\x21\x7a\x6b\x18\xdc\x51\x8c\x27\x5c\x34\x37\
+\xdf\x47\x61\x94\x88\x67\xcf\x56\x91\x61\xca\xca\xf4\x93\x60\xca\
+\xa9\x69\xd3\x8e\xe1\x59\x27\xf1\xb7\xc0\x60\xb0\xe1\x15\x07\x87\
+\x3f\x3e\x71\x62\x23\xca\x7f\x6e\xed\xed\xd9\x73\x94\x90\x40\xcc\
+\xee\x93\xad\x91\x51\x88\xf4\x6c\x56\x03\xeb\x86\x3d\x7e\x3c\x1e\
+\x21\x04\x75\x20\x7d\x4d\x89\x12\x2f\xe1\x64\x99\x9b\x76\xcf\x2f\
+\x83\xc1\x86\x57\x15\xfc\x03\x9c\x24\x24\xb0\xdd\x8c\xa2\xac\x96\
+\x57\x01\x01\x86\x1a\xef\x65\xc7\xf9\x2f\x8e\xb6\x99\xe4\xf9\xfc\
+\xfe\x00\x39\x83\xc1\x46\x97\x4d\x33\xf3\xc6\xbe\x6e\xdd\x63\xb4\
+\x92\xc1\xc0\x76\x2d\x10\xa2\x90\x2c\xd0\x9d\x45\x63\x70\xb2\x04\
+\xe0\xdd\x09\xa0\x8a\xb6\xa1\xe4\xf5\x04\xef\xe0\x99\x03\x1c\x2a\
+\x55\x45\xda\xc0\x60\x30\x9e\x79\x78\xb4\x44\xce\xe9\x33\x0d\x67\
+\xc9\x07\xba\xc2\x3b\x99\x18\x72\xf5\x2a\x05\xc8\x8d\x70\x3f\x55\
+\x66\xb1\xc4\x99\x65\xcf\x1e\xa9\xfe\x59\xa5\x7a\x89\x6b\x5a\xf3\
+\x53\x19\x0c\x5e\xf1\x12\x3f\x7d\x1a\xeb\x63\x6d\xbd\x77\x4f\xd7\
+\xae\xc7\x51\xa1\x40\x86\x94\x02\x7d\xcc\x3b\x78\x36\x80\x92\x9d\
+\x71\x9f\x00\x6f\xe5\x0b\xd4\xe3\xad\xc5\x98\xe9\xdd\x7d\xfb\xb6\
+\xc2\xf0\x92\x60\x80\x81\xb2\x0a\xbd\xb1\xf8\xdb\x60\x30\xd8\xe8\
+\xb2\x83\xed\xc0\xb1\xa8\xab\xdb\x4b\x62\x4c\x6a\x51\xdd\x7a\xf5\
+\x5a\x2b\x2a\xd1\xa4\x0e\x2d\xab\xd1\xcb\x83\xf5\xf7\x76\xeb\xe6\
+\xa5\xa1\xad\x92\x2c\x6b\xef\xd2\x08\x06\x83\x8d\xaf\xe4\xc7\x77\
+\xef\xcc\x7c\xd7\xad\xdb\x99\x98\x98\x58\x1f\x06\xd5\x01\x4c\x39\
+\xd0\xa7\xcf\x49\xa1\x01\x24\x4b\xef\x95\x82\xb6\xd7\x8e\x8c\x1a\
+\x75\xf2\xd9\x85\x0b\x8d\xc4\x77\x81\xc1\x60\xa3\x2b\x00\xf6\x04\
+\x7f\xfa\x43\x08\x7d\xac\x78\x51\x38\xd3\xd1\x2a\xd6\x9f\x72\x32\
+\xc1\xc1\x38\xc3\x45\xd3\x78\xec\xfb\xf7\x54\x02\x35\xea\x7d\x60\
+\x20\xad\x86\xe3\xb1\xda\x1d\xc1\xf5\x28\xae\x53\x70\xcd\x2f\xd2\
+\x06\x06\x83\x81\xf3\xdd\x52\x25\x2e\xa7\x49\x0f\x63\x63\x17\x18\
+\x5b\x9b\xf1\x42\xe4\xa0\x94\x30\xe9\x58\x89\x05\xe3\xe5\x3b\x81\
+\x7f\xd3\x9b\xc9\xca\xcb\x0c\x06\xad\x6e\xa4\x1c\x56\x6f\xe4\xc8\
+\x6d\x93\xee\xdc\xb1\xe9\x64\x65\xb5\xab\x6c\x93\x26\x9e\x02\x28\
+\x58\xbe\x7c\x48\x1b\x33\xb3\x2b\x64\x8f\x25\x85\xf8\x4d\x25\x44\
+\x17\xbd\x9c\x39\x13\xbb\xad\x5f\xef\x32\x3f\x3c\xdc\xba\xd9\xec\
+\xd9\x47\x55\xd9\xb2\x55\xcc\xa1\xa7\x77\x38\x35\xa5\x68\xf2\x70\
+\x82\x79\x05\x83\xc1\x50\x8c\x42\x8c\x90\x4e\x91\x9b\xeb\x6b\xd6\
+\x1c\x1c\xe0\xec\x3c\xca\xba\x5c\xb9\x07\xd4\x6c\xe4\x9e\xb3\xf3\
+\x16\x52\x8f\x96\xef\xed\xc5\x16\xf3\x8b\x65\xc9\x92\xef\xe8\xd9\
+\xaa\x22\x45\x0e\x23\xab\x65\xb0\xcb\xd0\xa1\xe7\xe8\xf7\x2d\x8b\
+\x15\xeb\x22\x24\x34\x2a\x19\xde\x81\xd6\x72\x88\xc1\x60\xf8\xf9\
+\xf9\xe5\x80\xcc\xfa\x61\x24\x35\xc7\x29\xdb\x48\x18\x54\xfc\x99\
+\x59\xb3\xa8\xca\x7c\xb4\x90\x80\x5a\xd8\x0e\x7a\x16\xe4\xe5\xb5\
+\x16\xc9\xd2\xc7\xf0\x7e\x34\xe9\x64\xae\x2a\x54\xe8\x3c\x8d\xef\
+\xef\xd3\x67\xb9\x14\x3d\x1a\x88\x7b\x5f\xf0\x14\x8d\x5f\x58\xb6\
+\x0c\x17\x4d\x30\x18\xec\x40\xe9\x0c\xe5\xb0\x55\xc7\xc6\x8c\x39\
+\xe9\xd8\xba\xb5\xdb\x03\x57\x57\x8a\xc5\xcd\x01\x4b\x08\x89\xfd\
+\x7d\xfb\xf6\xa2\x95\x0d\x4e\x94\x47\x4f\xcf\x9d\x1b\x42\xc9\xd2\
+\x3b\x5a\xb5\xba\x80\x31\xb5\x92\x18\x56\xc6\x59\x02\x30\x33\x30\
+\x68\xa9\x04\xce\x51\x81\x10\xf3\xe8\xf8\xf1\x25\xe2\xff\x83\xc1\
+\xe0\x50\x01\x38\x00\x9c\x0d\x8e\x00\xf3\x69\x3d\xcf\xed\x3a\x6c\
+\x98\x1b\x19\x1d\x18\xb1\x3c\x7f\xfe\x9d\x3e\x56\x56\x66\x8f\xdd\
+\xdc\x36\x62\x75\xbb\x84\xe7\x7d\xe4\x7b\xf9\xd7\x56\xaa\xf4\x9c\
+\x3c\x9e\xa4\xbd\x82\x77\x93\x60\x7c\x56\x73\x85\xc8\x27\xd2\x04\
+\x06\x83\x8d\xb2\xd1\x75\x7b\xfb\x9d\xd0\xc8\xbc\x2d\x0d\x29\x05\
+\x2b\x9e\xa7\x4c\x96\xfe\x49\x9e\xf5\x06\xd0\x38\xe4\xda\x2f\x04\
+\x9e\x39\xb3\x61\x5d\x95\x2a\x8f\xe4\x19\xd1\x5d\xa4\x19\x0c\x06\
+\x1b\x5d\x6d\x70\xf6\x87\x27\x4f\x56\xe3\x2c\x77\xf4\xd4\x1f\x7f\
+\x2c\xc3\x7d\x2e\x45\xd6\x8f\x64\xfa\x48\x39\x8c\x02\xeb\x18\xff\
+\x19\x9c\x0a\x91\xde\xdd\x57\xd7\xad\x5b\xf1\x5f\x28\xff\x51\x89\
+\x74\x06\x83\x21\xa5\xf7\x2a\x82\x75\xc0\x62\xe0\x41\x15\x82\xe4\
+\x14\x2c\xc7\xfd\x81\xa6\x33\x67\x1e\xeb\x6c\x63\x63\x87\x31\x2f\
+\xf9\xee\x2f\xe0\x4f\xa0\x2b\xc6\xe2\xc5\x3f\x07\x83\xc1\x90\x1e\
+\xca\x14\xc7\x36\x6d\x2e\x07\x04\x04\x64\xa4\x62\x18\x83\xc1\x08\
+\x0c\x0c\xd4\x27\x99\x07\x19\x5e\x78\x01\x03\x5c\x8f\x6b\x8f\xef\
+\x6d\x9f\xbc\x58\x88\x9f\xf1\xfb\xfd\xbe\xb1\x53\x63\x30\x18\x90\
+\x58\xef\x7a\x62\xf2\xe4\x93\x56\xa5\x4a\xdd\x57\x9a\x8f\x98\x08\
+\xd1\xf6\x3b\x83\xf2\xbb\xa5\xf1\x7a\x53\x20\x5d\xa4\x0a\x06\x83\
+\xcf\x78\x1d\xc1\x45\xd4\x15\x28\xf8\xca\x15\x2b\xdc\xb7\x11\xdf\
+\x81\xb3\xf3\xe7\xb7\xa3\xec\x16\xd4\xe9\x05\x7e\x08\x0c\xfc\x93\
+\x24\x69\x06\x83\x8d\x2e\x87\x14\x2c\xea\x00\x96\x15\xdf\x81\xa5\
+\x7a\x7a\xfb\xd4\xc2\xb6\xbb\x76\x39\x90\xf0\x91\x48\x3b\x18\x0c\
+\x06\x55\x8f\x93\x4a\xb4\xb1\x10\xe5\xfe\xe4\x9d\x26\xe0\xd7\x0d\
+\x35\x6a\x3c\x7c\x70\xe4\x88\x89\xf3\xc0\x81\x7a\xe2\xbb\xc0\x60\
+\xb0\xc1\xed\x04\x53\xcc\x72\xe6\xdc\x2e\x52\x87\x0a\x06\xa9\x76\
+\xbe\x28\xc4\x7d\x30\xae\x15\xb9\x3c\x47\xfd\x7f\x8e\xa0\x6e\x9c\
+\xad\xc4\xdf\x00\x83\xd1\xc1\xca\x6a\x7d\xd5\x3e\x7d\x2e\x0f\x3d\
+\x75\x2a\xe4\x1b\x06\x39\x5c\x85\x55\xd0\xb0\x55\x2b\xff\xee\x1b\
+\x37\x3a\xa0\x74\x68\x97\x5e\x8e\x1c\xc5\x54\x7a\x7a\x67\xfe\xf3\
+\x29\x62\xb2\xea\x37\x65\x75\xb1\x62\x4b\x71\xcd\x6f\x2c\x44\x25\
+\xc1\x60\xfc\x75\x5f\xbc\x31\xe0\x20\xcd\x71\x2a\x72\x85\xb1\x15\
+\xa7\x9e\xed\x10\x3a\xfa\x10\xfb\xe1\x03\x55\x9a\x0f\x04\xfb\x61\
+\x4b\xa9\x2e\x03\xb2\x2a\x57\xae\xe3\x7f\x75\x5b\x50\x1f\xac\x02\
+\xc6\xa2\x36\x2a\x34\x36\x2c\x6c\x1e\x8c\xcf\x0b\xf7\x97\xc4\xf7\
+\x81\xc1\x81\x73\xd2\xcf\x4c\x02\x53\x3c\x97\x2c\x71\xa6\x7e\xed\
+\x42\x02\xe9\x62\x97\x28\x21\xfa\xe5\x8d\x1b\x03\xfe\x73\x5b\x4a\
+\x18\x15\xb9\x79\x6f\x82\x77\x85\x4a\x65\x80\x65\xdf\x6d\x7f\x8f\
+\x1e\xe5\x54\x18\xaf\xde\xb7\x6f\xc4\xf7\xf4\x25\x63\x30\x0c\x9b\
+\x35\xdb\xae\x9f\x3f\x7f\x98\x00\x9e\x9e\x39\x63\x84\xcb\x15\x50\
+\x98\x08\xd1\x3d\x39\x3e\xbe\x65\xa5\x4e\x9d\xae\x97\x6d\xd8\x30\
+\x42\xfc\x17\x61\x5b\xb1\xe2\x75\xe5\x40\x6b\xf7\xd3\x4f\x77\xb0\
+\xba\x7d\x42\xb0\xf3\x39\xfa\x56\x1b\xcb\xd2\x8e\xb4\x82\xc1\x5b\
+\xcd\xd2\x09\xb1\xb1\x8b\xa8\x1b\xd0\xb9\xb9\x73\xad\x97\xe5\xcb\
+\x57\x15\xab\xde\x1a\xf0\x31\xfa\x9a\x47\x47\x86\x84\x58\xe0\x9d\
+\xc2\xff\xa5\x6d\x64\x5e\x18\x96\x19\x29\x3b\x21\x46\x92\x00\xbd\
+\xfa\xd7\xdb\x5b\xb4\xb8\xa9\x18\xde\x8e\xd6\xad\xfd\x92\x92\x92\
+\xfe\x89\x94\x1a\x83\x8d\x2e\x37\xd8\x03\x9c\xba\xb2\x48\x11\x92\
+\x5e\x4f\x56\x4b\xb2\xd7\xaf\x7f\x1f\x59\x2c\x9d\xff\x6b\xe7\xb6\
+\xf2\xa8\x83\x8a\x52\x0c\xec\xfa\xc6\x8d\x3b\x0f\xf6\xed\x7b\x82\
+\xee\x91\x0d\x10\x41\x7b\x6c\xe8\xd7\x57\x10\x40\x2a\xcd\x00\x2f\
+\xa6\x55\xbd\x97\xc1\x7d\xdc\xef\xbb\xb8\x6c\xb4\xab\x54\x29\x08\
+\x2b\xdc\x27\xc7\x6e\xdd\x4a\x8a\xff\x1a\x76\x77\xea\x74\x52\x31\
+\x38\x74\x65\x89\xc3\x35\xc1\xb6\x7c\xf9\x67\x5f\x92\x93\x97\x46\
+\x04\x05\xad\xc2\x92\xdf\x44\xbb\x3c\x88\xb4\x0c\x29\x45\x67\x79\
+\xbe\x7c\xcb\x44\xda\xc0\x60\xa3\xab\x02\x4e\x8f\x0b\x0b\xb3\xc0\
+\xf5\x67\xf1\x5f\x02\xb5\xa7\xc5\x0a\x97\x60\x63\x64\xf4\xf2\xda\
+\x86\x0d\xbb\xc8\x88\xd4\x8a\x4d\xc5\x8b\xbf\x7b\x78\xe4\x48\x67\
+\x18\x5b\x03\xb0\x80\x3c\xe8\xb6\xc4\xaa\x16\x86\xe7\x4b\xae\x6e\
+\xdb\x56\x02\xda\x16\xeb\xe3\xc3\xc3\xe7\xcb\xae\x2e\x69\x05\x83\
+\x65\xda\xeb\x81\xb9\xff\x6b\x6e\x5b\x1f\xea\xa4\xf9\xf4\xec\xd9\
+\xf5\x10\x9b\xd9\xa7\x6e\x08\xd1\xa4\xc9\x9d\x75\x95\x2b\x07\xee\
+\xeb\xd1\xa3\x9a\xb6\x4c\x1a\xb6\x99\xb7\x95\x52\x8d\xc3\xa3\x46\
+\x0d\x24\x83\x14\x7f\x0f\x0c\x06\x03\xc1\xc8\x63\xe7\xe6\xcd\x73\
+\xf1\xdf\xb1\x63\x11\xb5\xb5\xc5\x56\xf2\xf1\xe7\xcf\x9f\x17\xc1\
+\x90\x16\xa7\xd6\xae\x36\x29\x2e\x6e\x0a\x49\x65\x2f\xd3\xd7\x8f\
+\xbd\xb0\x6a\x55\x75\x91\x66\x30\x18\x5c\x76\x31\x17\x86\x67\x4b\
+\xba\x84\xb2\xb5\x51\x6d\x30\x0f\xa8\x12\x5a\x80\x03\xe5\x0f\x5a\
+\xe1\xc8\xcd\x8b\xe7\x5d\xff\x4a\x01\xf8\xff\xab\xf4\x32\x18\xbc\
+\x97\xce\xfb\xf0\xe8\xd1\xd2\xef\x1f\x3e\x5c\x8d\xfb\xc1\x5a\xde\
+\xc8\x6e\x14\x37\x59\x20\x44\x11\xfc\x5c\x18\xfc\xb0\xba\x48\x91\
+\xd7\x49\xf1\xf1\x0b\x14\xa1\x19\xad\xf7\xf3\xcb\x74\x9e\x3a\xb2\
+\xeb\x66\x12\x78\x05\x1c\x25\xfe\x07\x0c\x06\x1b\x5e\x4b\x50\x5f\
+\xeb\x8c\x37\x57\x66\x76\x87\xe3\x7a\x01\x4c\x81\x5a\xd3\x6e\xbc\
+\x97\x5a\x38\x40\x85\xe7\xa1\x14\xd4\xc4\xf5\x2d\xc4\x43\x43\xe0\
+\x01\x75\x86\x78\x68\xb0\x3c\xf7\xed\x07\xff\x24\x53\x86\xc1\x60\
+\x43\x2c\x4f\xde\x4b\xe8\xcc\xbf\x92\x61\x83\xc4\x8b\x2b\x56\xac\
+\xc3\x78\xaa\x86\xb3\xa3\x4d\x9b\xe9\x66\x39\x72\xc4\xd3\xbb\x36\
+\xe5\xca\x85\xa2\xee\xc9\x22\x3e\x22\xc2\x74\x67\xbb\x76\xd7\x69\
+\xcb\xba\xaa\x54\x29\x43\xf1\xa7\x60\x30\xd8\xe8\x1a\x20\xbd\x6b\
+\xc1\x89\x89\x13\x4f\x5a\xe4\xca\x15\xa7\xac\x56\xa9\x09\xc9\x5c\
+\x30\x33\xeb\x4a\xc1\x72\x0a\x9a\x23\x73\x85\xf4\x2f\x92\x70\xee\
+\xb3\xfa\x9c\x98\x38\x98\xe2\x7a\x30\xd4\xa6\xe2\x2f\xc1\x60\xb0\
+\xd1\xe5\x02\xbb\x86\x3f\x7f\xbe\x62\x77\xc7\x8e\x57\xd0\xf0\xe1\
+\xbe\x5d\xe3\xc6\xf9\x53\xcd\x0e\x87\x36\x7d\xe0\xa9\x53\x1b\x9e\
+\x79\x7a\xae\x83\xa2\xef\x7d\x6c\x2d\xa3\x97\xe7\xc9\x53\x82\x94\
+\x7c\xd3\x96\x93\xc9\x60\xb0\xe1\x15\x03\x87\x81\xa6\x60\x03\x19\
+\x10\xa7\xfc\xb8\x91\xb8\x76\xa6\xd5\x6f\x67\x87\x0e\x57\xe4\x3b\
+\x95\xc0\xc9\xc9\x9f\x3e\x99\x29\x67\x3e\x3c\xef\x03\xfe\x1d\x01\
+\x1a\x06\x83\x1b\x32\x42\x65\x37\x0c\xdc\x8b\x9b\xcd\xa0\xbf\xcc\
+\xf5\x1a\x05\xee\x04\x4f\xa2\xb9\x5f\x6c\xcf\xad\x5b\x2f\x60\xf8\
+\x2c\xde\x7b\x46\xef\x65\x37\x30\x70\xc2\xf5\x1e\x0c\x2d\x27\xae\
+\x6b\x41\x4f\xfc\x3c\x55\xde\xa7\x05\x0c\x06\xe3\x43\x50\x50\x93\
+\xc3\x23\x46\x9c\x93\xce\x92\xaf\x6b\x2b\x54\xf0\x4a\x4d\x4c\x86\
+\x3c\x94\xd8\x8a\x3e\x91\x2d\x6e\x93\x70\xfd\x4c\x5b\xd0\xb4\xc7\
+\xea\x18\x0c\x96\x4f\xeb\xf9\x36\x20\xc0\x92\x4a\x7b\xd4\xed\x8f\
+\x84\x88\xa1\x3c\x4d\xad\xf3\xdd\x18\x59\x96\x11\xe0\x36\x65\x8a\
+\xd3\xc6\xda\xb5\xcf\x90\x81\xc2\xf8\xce\xa7\x3d\x5c\xc0\x60\xb0\
+\xe1\x95\x02\x7f\xbf\x7f\xe8\xd0\xe6\x5d\x1d\x3a\x78\xfa\xda\xdb\
+\xd7\xd5\x88\xcf\xe5\x07\xdf\xae\x28\x50\x20\xec\x53\x74\x34\x9d\
+\xe9\xc6\x83\x13\xa1\x59\x7f\x83\x8c\x10\xc1\xf4\xef\x6c\xe2\xce\
+\x60\xb0\xe1\xd5\x02\xa7\x83\xad\xe4\xca\xe6\x46\x01\x71\x30\xe5\
+\x82\x85\xc5\x41\x8c\xb7\x10\x12\xd8\x62\x5e\xa7\xd8\xde\x9b\x7b\
+\xf7\xda\xfe\x45\xdd\x5e\x3d\xea\x2d\xbd\x48\x88\x32\x42\x57\xc1\
+\x60\xc8\x7c\xc6\x1a\x22\x0b\xb1\xa6\x74\xe9\xb9\x54\x4d\x4e\x06\
+\x77\x74\xf4\x68\x27\x18\x9c\x9e\x92\x36\x46\x63\x7b\xbb\x76\xf5\
+\x21\x23\x94\x63\xa5\x61\x58\xcb\x65\x56\xca\x0a\x6c\x4b\x2b\x2b\
+\x5d\x5c\x40\x2a\x1d\x8a\xa5\x32\x21\xa1\x8b\x60\xb0\x97\xb2\xb0\
+\x10\x8e\x29\xea\x9c\x46\x91\x65\x75\x47\x73\x5e\xbd\x3a\x33\xc6\
+\xc7\x67\xa3\x61\x8b\x16\xfe\x30\xac\xc0\x79\x2a\x55\x6e\xea\xaa\
+\x89\x47\x36\xf0\x60\xc6\x74\xdf\xb2\xc5\x0b\x3f\x07\x60\xac\x46\
+\x8a\x10\xf7\x55\x42\x2c\xc2\xfd\x10\x70\x21\x3e\x2c\x95\x03\x35\
+\x6e\x6b\x6a\x7a\x59\x3f\x6f\xde\x78\xfd\x7c\xf9\x12\xc7\xfb\xfb\
+\xc7\x08\x5d\x05\x83\x7b\x7b\x6d\x69\xd0\xe0\x32\xa4\x13\x1a\xe1\
+\x67\x5f\xb0\x4a\x16\x6d\x33\x0d\xe5\xb9\x6d\x36\x32\x51\xfa\x2a\
+\x15\xe6\x07\xfa\xf6\xbd\x28\xcb\x80\x94\xda\xbc\x78\x94\x0b\x1d\
+\xa4\x4a\xf3\x1b\x9b\x37\x3b\xa2\x8a\x21\x0a\x63\x1f\xa4\xb2\xaf\
+\x22\xb5\xd6\x5a\xe8\x10\x18\x6c\x68\xd6\x30\xac\x33\xb8\x86\x41\
+\xfb\xef\x03\x94\x91\x56\x20\xd3\x83\xee\xbf\xec\xef\xdb\xb7\xbb\
+\x0e\x24\x49\xab\xdc\xa6\x4e\x3d\x80\x7f\xd3\x47\xa8\x82\xbd\xc4\
+\xbd\xfe\x42\x21\x4a\x90\xc7\x72\x4b\xc3\x86\x77\x65\x13\xf8\x5f\
+\xc0\x8e\x77\xf6\xec\xb1\x92\x5e\xcf\x14\x92\x7d\x40\xad\xde\x4c\
+\x9d\xaa\x30\x67\x30\xe0\x09\x9c\x43\xee\x76\x30\x05\x8d\x13\x02\
+\x77\xb6\x6f\x6f\x4f\x3f\x23\x73\xdf\x9b\x14\x6f\x75\xc4\xb1\xd2\
+\x02\x3d\xa3\x97\x45\xbf\x7a\x45\xfd\xa4\xa9\xf4\xa7\x28\x98\xb2\
+\xad\x69\xd3\xdb\xb8\x2f\x28\x24\x7c\xd7\xad\xab\x40\xe3\x64\x74\
+\x10\x9f\xd9\x8c\x67\x35\x85\x2e\x80\xc1\xa0\x73\x1a\x0e\x3f\xa5\
+\x1c\x9a\x37\x27\x83\x4b\x59\x59\xa8\x50\xa4\x86\x38\x50\x2c\xfe\
+\xb8\x49\xb4\xa5\xa4\x0e\x79\x33\x0b\x83\x4d\xe4\x8a\xa5\x5a\x53\
+\xb2\xe4\x53\xf9\x45\xf1\xab\xc6\x67\x9a\x01\xa6\x6c\x6f\xd5\xea\
+\x26\xde\x1b\x25\x75\x58\x6a\x62\xcc\x02\x2b\xb6\x2d\x38\x08\xcf\
+\x0d\x44\x16\x80\xc1\x06\xe7\x4c\xe2\xad\xb8\x46\x61\x95\x7b\xf7\
+\xf1\xcd\x9b\xe5\x36\x86\x86\xa1\x8a\xd1\xad\xab\x56\xcd\x45\xe8\
+\x30\x7c\xac\xac\xa6\xe0\xcc\x16\x43\x46\x07\x43\x7a\x09\xde\x94\
+\x5f\x16\xf1\xef\x1f\x3c\xa0\xe2\xd8\x92\x18\x9b\xa0\xac\xde\xca\
+\x15\x63\xcf\x32\xdd\x13\xcb\x60\xb8\x8e\x1c\xd9\x84\xfe\x38\xc9\
+\xb8\x20\x5f\x17\x63\x57\xa5\xca\x49\xb5\xdb\xbd\x7b\x77\x9f\x33\
+\x33\x67\x1e\x45\x5d\xdb\xec\xbf\x30\xd8\x8a\xf3\x85\x28\x90\x85\
+\x2b\x5e\xfe\xd7\x37\x6f\x2e\x77\x1d\x36\xec\x2c\x54\xc4\x7c\x10\
+\x4a\x20\xe3\x4b\x39\xd8\xbf\xff\x05\xca\x64\x21\x0d\x4d\xf0\x33\
+\x6d\x2f\x4f\x4e\x9e\x7c\x0c\x46\x68\x89\xeb\x09\xbc\x97\x04\xc7\
+\xca\xbb\x4c\x4d\x11\x63\x30\xb0\x25\x9b\x48\x06\xb6\xa9\x4e\x9d\
+\x87\xca\x76\x92\x64\xef\x20\x77\xb7\x01\xab\x43\x6f\x70\x24\xa8\
+\x47\xb1\x39\x8a\x65\x81\x6d\x35\xb7\x63\x58\x29\xa2\xc1\x77\xe0\
+\xb8\x2c\xde\x66\x0e\x07\x17\x1e\xe8\xd3\xe7\x22\x0c\xe9\x0b\x09\
+\x86\xba\x0e\x1d\x5a\x56\x26\x3c\xa7\x90\xb3\x85\x3e\x17\x9c\x28\
+\x87\x5f\xf8\xf8\x0c\xf7\x58\xb4\xc8\x49\x76\xfb\x99\xfb\x27\xab\
+\x7f\xc1\x74\x4b\x1f\x63\x30\x28\x03\x03\x86\x12\xb9\xb2\x60\xc1\
+\xd7\x10\xd8\x5c\xb6\xae\x4a\x95\x40\xfa\x63\xa5\x2c\x0e\xc8\x97\
+\x7b\x0b\x09\x18\x59\x7b\x25\xeb\x43\x32\x82\xce\x41\x02\x70\x68\
+\xd6\x6c\x25\x8d\x61\x3b\x7a\x5c\x07\xce\x77\x2a\xb0\xe9\xe3\x13\
+\x27\x36\xc2\xa3\xe9\x14\xf7\xe1\x43\x19\xd4\xd5\xa9\xbf\x50\x2e\
+\x2c\x5b\x76\xf0\xf0\xf0\xe1\x27\x11\x5e\xf8\x48\x9f\xd9\xba\x6c\
+\x59\x7b\x1a\xdf\xd2\xa8\xd1\x71\xa1\x01\xd2\x61\xa1\xab\xdc\x86\
+\xc6\x4a\x99\x88\xc3\xe9\xb1\xfd\x64\x70\x28\x60\x12\x0c\x2c\xf1\
+\xf6\xde\xbd\xdb\x76\xb5\x6f\xbf\x86\x0c\xc7\x69\xe0\x40\x2f\x6a\
+\x82\x1e\xfb\xee\xdd\x42\xea\xdf\x85\x31\x43\x90\xe2\x5a\x9f\xa0\
+\x39\x79\x6c\x4f\x97\x2e\x9e\x48\xad\x0a\xc5\x6a\x91\x48\x86\x88\
+\x6a\x6e\x7f\x64\xfc\x27\x85\x5e\xbb\x66\x83\xf7\x8b\x0a\x1d\x80\
+\xec\x29\x3d\x16\xac\xb4\xa9\x61\xc3\xaa\x30\xba\x24\x54\x93\x07\
+\x3f\x3e\x7d\x7a\x14\x9d\xeb\xb6\x36\x6e\xec\x4d\xdb\x4c\xa9\x24\
+\xe6\xa4\xb1\xa2\xb5\x93\x67\x3c\x7a\x9e\x02\xa3\x3c\x8f\x90\x83\
+\x1b\xc5\xf9\xf0\x79\xe3\x30\x36\x58\x7c\x2f\x18\x8c\xdb\xbb\x77\
+\xe7\x09\xf6\xf1\xb1\x8c\x78\xf1\x62\x1a\x65\xea\x63\x7b\x15\x82\
+\xae\x25\x26\x32\xaf\xb1\x29\x48\x5d\x4d\x17\x92\x21\x5e\xb1\xb5\
+\xdd\x83\xfb\xb9\xe0\x64\x64\xf8\xaf\x86\xd1\x45\xe0\x5c\x94\xa4\
+\x36\xd2\x01\x03\xbc\x30\xde\x5f\xe8\x28\x60\x54\xce\x6a\x75\x68\
+\x95\xea\x3d\x7a\xd8\xad\x0d\x70\x71\x59\xf0\xc0\xd5\xd5\x7e\x43\
+\xcd\x9a\x8f\xde\x3d\x78\xb0\x50\xc3\xe0\x72\xa2\xda\xfc\x8c\xb2\
+\x92\xe3\xcb\xc5\x3b\xfa\xf5\xeb\x99\x24\x78\x8b\xad\xf7\x6b\xec\
+\x04\xce\x08\x06\xe3\x1f\x6e\xc1\x5a\x45\x44\x44\x14\x40\xf0\xd8\
+\x3e\xe4\xea\x55\x5b\xad\x9e\x00\x02\x5b\xb0\xcd\x64\x54\x21\x57\
+\xae\xcc\x53\xa4\x0e\x70\x35\xd8\xd7\xb3\xe7\x49\x1a\x87\x87\x30\
+\x22\xf6\xfd\x7b\x53\x8c\x15\xd0\xe1\xcf\x59\xf3\xea\xda\xb5\xbb\
+\xe1\x7d\x55\x87\x10\x88\x70\x10\x5d\x87\x6c\xdf\x2c\x0a\x94\x0b\
+\x0d\xec\xea\xd8\x71\x3f\x19\x1b\x04\x90\xde\x4b\xc3\x0b\x45\xf9\
+\xd0\xb0\xcf\x49\x49\x33\x65\xc5\x7a\xba\x39\x59\x18\x2c\xee\x3a\
+\x50\x5b\xc8\x15\x4e\x86\x25\xd2\xa9\xb2\x5f\x73\x1c\x4e\x88\xa3\
+\x34\x7e\xde\xd8\xf8\x10\x7e\xa7\x8d\xd2\xc6\x4a\xc6\xbb\x0c\x75\
+\xd1\xe8\xc0\x05\x2f\x2e\x5d\x5a\x0b\xc7\xca\x99\xcd\x3f\xff\x7c\
+\x28\x32\x28\xa8\xa0\xa6\xc4\x9f\x4c\x82\xfe\x88\xad\xe4\x8b\x2f\
+\x5f\xbe\x2c\xf5\x5a\xba\xd4\x09\x8a\xd1\x61\x30\xce\xa3\x52\x9f\
+\xa5\x0a\xa8\x27\x32\x0a\x0c\xc6\xbd\x03\x07\xca\x91\x9a\x96\x8c\
+\x73\xed\x01\x49\x45\x79\x37\x98\x82\x66\x8c\xc1\x48\x9b\xa2\x55\
+\x82\x44\x5c\xe7\x81\x51\x1a\xb1\x2e\x5f\x13\x21\x1a\xe8\x60\xd1\
+\x6b\x6d\xa9\x9d\x62\x0c\x56\x95\x95\x11\x0b\x64\x29\xcf\x2e\xfa\
+\x9c\x74\xa6\xc5\xb3\xfa\x60\x4b\xac\x82\xc6\x58\xdd\x4c\x32\x6d\
+\x65\x63\x30\x5e\xf9\xf9\x4d\xb7\xaf\x5b\xf7\x01\x9c\x0f\xb1\x64\
+\x50\x4a\xda\xd4\x3d\x67\xe7\x2d\x74\xde\xc3\xfd\x68\x1a\x43\x0e\
+\xe6\x4b\xac\x1e\x87\xe0\x94\xb8\x88\x77\x3f\xe2\x1d\x8a\xef\xb5\
+\xd0\xd1\x15\x3d\x9b\xc6\xaa\x16\x89\xeb\x67\x99\x97\x79\x8b\x1c\
+\x2e\x1a\xef\xe5\x03\xab\x89\xcc\x02\x83\x41\xe7\x33\x70\x02\x69\
+\x44\x92\x7b\x9d\x8c\x8b\x74\x24\xb1\x9d\xb4\x95\x5b\x31\x7f\x1a\
+\x83\x91\x25\xef\xeb\xde\xdd\x1d\x8e\x86\xd9\x10\x73\xb5\x27\x3d\
+\x4a\xc4\xc3\xee\x09\x1d\xc7\x93\x73\xe7\x66\xdb\xd7\xab\x77\x97\
+\x3e\x03\xc5\xef\xac\xcb\x95\x5b\x4a\xd2\xeb\x22\x0b\xc1\x60\xa3\
+\xd3\x03\x0d\xc1\xa6\xd7\x37\x6d\xda\x8c\xb3\x5d\xb0\x43\x8b\x16\
+\x2b\x05\x80\xac\x8d\x08\x4a\x07\x43\xd8\xe0\x12\x85\x0b\xc8\xd1\
+\x00\x6f\xdf\x34\xc4\xb8\xfc\xc8\x10\x4f\x4e\x9a\x54\xe8\x1b\x61\
+\x89\xa1\xa0\x2b\x38\xdd\x58\x88\x0a\x59\xf8\xd9\x4a\x82\x13\x6e\
+\x6c\xd9\xe2\x88\x4a\x84\x57\x32\xf5\xcb\xeb\x3b\x53\xe5\x4a\x4b\
+\xd9\xf6\xb5\x60\x41\xf1\x4f\xc1\x60\xc8\xf3\xcd\x1c\x70\x81\x00\
+\x2c\x4b\x94\xb8\x8d\x56\x54\x09\xf7\x0f\x1f\x9e\x1b\x74\xf1\xa2\
+\x1d\x02\xe8\xfe\x72\xdb\x99\x40\x4a\xca\x2f\x7d\x7d\x9b\x68\xf6\
+\x1d\x00\xed\xf0\x7c\x83\xcc\x79\x0c\x92\xe7\xc3\x38\x70\x4c\x16\
+\x7b\x6c\xeb\x43\x2d\x7a\x1e\xa5\xb4\x1d\xe8\xd7\x6f\x07\xee\xf5\
+\xbf\x27\x19\x1c\xab\x7f\xb4\xdc\x7a\xa7\x5f\x1e\x2a\x83\xfb\x2e\
+\x2b\xa1\x80\xb3\xf3\xe6\x4d\x40\x70\xf8\x33\xb6\x99\xe1\x28\x5c\
+\x9d\x1a\x17\x11\xf1\x07\x4a\x64\x76\x22\x55\xec\xe5\xc6\x5a\xb5\
+\x1e\x6b\x86\x1a\xd0\x2b\x40\x1d\x60\x97\xfd\xc0\x43\x48\xf0\x95\
+\x32\x43\xd6\x94\x28\xf1\x4a\x8e\xb7\xd2\x81\xcf\xd5\x49\xd6\xd7\
+\x95\xf8\x0e\x83\x1b\xa0\x7c\xbe\xad\x8d\x1a\x5d\x26\x47\x8d\x48\
+\x67\x30\xd8\xf8\xf2\xa1\x3a\x7c\x1b\x9c\x26\x31\x4a\xea\x17\xb6\
+\x9c\x2e\x38\x1b\x59\xbe\xbd\x7b\x77\x0d\x29\x73\x69\xbc\x5b\x4f\
+\xb3\x1a\x61\x99\x81\xc1\x53\xa7\xfe\xfd\xc7\xc5\x86\x85\xcd\x25\
+\x37\x7c\xd0\x85\x0b\x6d\x7f\xe0\xca\x0b\x03\xac\xd2\x41\x74\xbe\
+\x95\x95\xe9\x94\x40\xad\x52\xf2\x32\x97\xe0\x92\x5e\x5b\x67\x06\
+\x1b\x5d\xe5\x84\x98\x18\xe3\x0b\xe6\xe6\x07\xd0\x7a\xd8\x8f\xce\
+\x72\xc8\xcc\x58\xac\xdd\x88\x43\xca\x96\xa7\xc0\xb9\xe2\x7d\x62\
+\xf2\xe4\x93\xd8\x8a\xaa\x4b\x6b\x90\xc9\xd1\x4a\x26\x4b\x37\x14\
+\x1a\x30\x11\xa2\x2b\x55\x24\xfc\x20\xa9\x72\xc6\x64\x68\x48\x93\
+\xbb\x46\x57\xb4\x57\x3e\x22\x8d\xad\x15\xf8\x42\x9e\x0d\x3f\x81\
+\x83\x04\x83\x91\x2e\x59\xfb\x72\x3b\x96\xf8\xf1\xe3\x32\x5c\xa7\
+\x08\x80\x3c\x7e\x24\x87\x20\x63\x5e\x4f\xe1\xbd\x8c\x44\x61\xab\
+\x39\x9e\xf7\x08\x7f\xfa\x74\xc5\xb9\xf9\xf3\x0f\x45\x05\x07\x37\
+\x48\x65\xc5\xc8\x4b\xc9\xc3\x60\x1c\xf5\x0a\xd7\xf5\x44\x70\x19\
+\x34\x0f\xf2\x34\x31\xd9\x41\xc6\xe5\xf6\xc7\x1f\x8e\xb8\x5a\x80\
+\x9f\x35\xb6\xd1\xef\xb0\xcd\x36\xc7\xfd\x1c\x70\x98\x5a\xf5\x9d\
+\xc1\xf8\xa7\x31\x2e\xd9\xf5\xc6\x48\x1a\xce\x66\xf9\xcd\x7e\x9e\
+\x56\x80\xb3\x73\xe6\x1c\xc1\xb3\xf6\xf2\xdd\xa2\xe0\xaf\x60\x3d\
+\x0d\x43\x1b\x8d\x77\x7f\xc7\x35\x9b\xcb\xb0\x61\x53\x91\xab\x79\
+\x8a\x12\x91\x85\x8e\x42\x26\x3d\x1f\x24\xfd\x97\xbb\x07\x0e\x6c\
+\x45\x1c\xd2\x54\x86\x18\xa2\xa5\x91\x3d\xc1\xd9\x35\x11\x69\x70\
+\x1f\xa3\x43\x43\x57\xc4\x7e\xf8\xb0\x04\x0e\xa5\x00\xb9\xe2\x5d\
+\x4c\x57\x75\x34\x06\x63\x7f\xaf\x5e\x3f\xe3\x9b\xff\x81\x52\x6b\
+\x77\x7a\xfa\xf4\x03\x81\x81\x81\xdf\xf4\x00\xe2\x9d\xb3\x72\xfb\
+\x75\xf3\xe8\xef\xbf\xff\x2e\x93\xa6\x4b\x0a\x1d\x84\xb1\x10\x46\
+\x52\xfb\x32\xc5\xb6\x42\x85\xe7\xc8\xbc\x19\x6b\x9a\x2d\xdb\x22\
+\x25\x39\x00\x09\xd0\x67\x50\x97\xe7\x4e\xf7\xe4\xfd\xc4\xe7\xe8\
+\x0c\xe6\x83\xca\xf4\x5e\x59\x91\xe0\xef\xd8\xad\x9b\xfa\xb3\xc9\
+\xde\x79\xff\x1c\x0c\x0e\x9c\xe3\x0f\x71\x9a\x97\x99\x99\x13\x55\
+\x19\x48\x63\xba\xaa\x34\xef\xd0\x06\x64\x1e\xda\xec\xee\xdc\xf9\
+\x2a\xbd\x87\xd2\x9f\xd3\xba\xae\xb8\x75\x72\xea\xd4\x15\x38\xaf\
+\x86\x93\x01\xc1\xdb\x6a\x8d\x1a\xc1\xaa\x0e\x4d\x9b\xde\xba\x6e\
+\x6f\xbf\xf3\xed\xbd\x7b\x2b\x11\x1a\x89\xc5\x19\x35\x04\x29\x62\
+\x73\x94\x50\x83\x55\x99\x32\xd3\xe9\x7d\x5a\x11\xe9\x9c\x8b\x9f\
+\x3b\x81\x51\xe0\x22\xda\x7a\x8b\xf4\x00\x83\xfb\x81\xa3\x95\xb0\
+\x89\xcb\x90\x21\x1e\x88\xbf\xc5\xac\x2e\x51\x62\xd0\x37\xde\xcd\
+\x69\x5d\xa6\x8c\x1f\xc5\xf0\x9e\xb9\xbb\xdb\xe2\xbe\xa0\x8e\x7f\
+\xb6\xba\xf4\xb9\x50\x06\xe4\x86\xaa\x84\xc9\xb8\xcf\x85\x78\xe4\
+\x02\xa4\xc4\x2d\x5c\x91\x2f\xdf\x3e\x72\x0a\xf9\x3b\x3a\x6e\xc7\
+\xf8\xcf\x42\x02\xdb\xcb\x7e\x64\x70\x90\x7b\x30\xa5\xf3\x2d\x56\
+\xc9\x6d\x74\x2f\x57\x76\x57\x91\x5e\x60\x70\x08\x01\xec\x4b\xd9\
+\xf8\xb8\x8e\xd4\x38\x07\xd5\x07\x0d\x14\x39\x73\xa5\x1e\x0d\xef\
+\x0c\x49\xe5\xcc\x94\x53\x47\x3f\x57\x1f\x70\x84\xfc\x0c\x0f\xc8\
+\x89\x02\x7e\x41\x6c\xf2\xb6\x14\xb4\x55\x69\x7c\x86\x66\xea\xf3\
+\x5d\xd1\xa2\x8f\x70\x8d\x57\xb6\xa4\x47\xc7\x8e\x3d\x7d\x7a\xe6\
+\x4c\x1b\xac\x8a\x4e\x18\x3b\x07\xd6\x11\xe9\x04\x06\x77\xcd\x29\
+\x22\xcf\x41\x95\x14\x25\x2d\xa9\xfc\xfc\x88\x1c\x0e\x10\xa3\xb5\
+\x50\xde\x51\x40\xed\xac\xe4\x1f\xf2\x65\xbc\xa7\xb3\x49\xc5\x27\
+\xa6\x4c\xe9\x8b\x34\xb1\xe7\x64\x48\xc8\xbc\x79\x06\x63\x2b\xa7\
+\xe5\x68\x69\x42\xcf\x64\x48\xe4\xaa\xdf\xd6\xad\x9b\x64\xbd\xdd\
+\x14\x22\x62\x9a\xe7\xe8\xb9\xec\x87\xb7\x5c\xa4\x27\x18\x0c\xe8\
+\x8d\xac\x32\xcf\x95\x2b\x42\xd9\x56\x39\x0f\x1a\xe4\x49\x21\x86\
+\xd4\x1a\x34\x22\x76\xf7\x9a\xde\x81\xe7\xef\x24\xae\x5b\xc1\x66\
+\x3a\xb8\xe2\x95\xc6\x99\x6d\xb6\xc7\xc2\x85\x2e\xa7\x67\xcc\xd8\
+\x47\xdb\x64\x0a\x8f\x28\x31\x45\x18\x11\x49\x37\x24\xdf\xda\xb5\
+\xcb\x41\x1a\xda\x68\xb0\xb2\x12\x40\x47\x22\x78\x94\x65\xc9\x92\
+\xef\x50\xa5\x71\x0f\xe7\x5e\x3f\x8d\x26\x2b\xe9\x72\x9e\x65\xf0\
+\x8a\xd7\x10\xce\x12\xb3\xfd\xbd\x7b\x53\x69\x4f\x32\x79\x33\x61\
+\x50\x5b\xb4\x65\xec\x70\x3f\x58\x51\xe1\x5a\x53\xaa\xd4\x13\x2a\
+\x01\x92\xba\x9a\xed\x74\xd0\xe8\x72\x82\xed\xc0\x3f\xc0\x22\x24\
+\x27\x0f\x26\x83\xc7\xe4\x96\xd9\x47\x6e\x35\x8d\xb4\x3e\xe3\x28\
+\x7a\xee\x36\x6d\xda\x71\x38\x9b\x66\xa3\x37\x9e\x39\x85\x59\xf0\
+\x7b\xb7\x68\xab\x0a\x76\x11\xe9\x00\x06\x1b\x5d\x41\xf0\xd7\x17\
+\xde\xde\x6b\xe9\x9b\x5d\x86\x11\x96\x6b\x26\x06\xc3\xb8\x82\x2d\
+\xf2\xe4\x89\x80\xe4\xf9\x72\x5a\x19\x42\xaf\x5f\xb7\x81\x87\x30\
+\x12\x46\xfa\x46\xe8\x38\x8e\x8d\x19\xf3\xd3\xfa\x6a\xd5\xfc\x94\
+\x55\xdc\xf9\xd7\x5f\x3d\xde\x3c\x7d\x5a\x3c\x95\x8c\x95\x1b\xa4\
+\x15\xfa\xe1\xc9\x13\x63\x7c\xfe\x3d\xf8\x6c\x41\x26\x42\xfc\xb2\
+\xa9\x6e\xdd\x29\x18\x8f\x91\xdb\xef\x2d\x22\x9d\xc0\x60\xc3\x2b\
+\x0f\x4e\x24\xa1\x1f\xe8\xa5\x50\x31\x28\x89\x19\xcd\x07\xf7\x91\
+\x11\xba\x2f\x58\xe0\x8a\xe7\xdd\xc1\x22\x60\x05\x78\x34\x5f\x50\
+\xed\x5d\x74\x74\x74\x11\x1d\xff\x5c\xb9\xc0\x71\x14\x2e\xc0\xea\
+\xfc\x56\x1a\xde\x32\xa1\x01\x32\x2c\x1a\xa7\xb0\x02\x44\x9d\x14\
+\xe3\xa4\xea\xfa\x09\xc8\x57\x6d\x4d\x2b\x3b\x09\xf6\x42\xc6\x7d\
+\x33\x25\x18\xe0\x59\xe1\xf4\x12\xb3\x65\xb0\xc0\x51\x03\x19\xa3\
+\x32\xc0\xd6\xf1\x85\x2c\xe7\x49\x40\x42\xb4\x89\x92\x85\x8f\xb1\
+\x36\x34\xbe\xab\x53\x27\x5f\x8c\xd5\xd4\x4c\xb5\x82\x83\xa5\x36\
+\x9e\xe5\xd7\xc1\xcf\xd5\x10\x65\x40\xf3\xcf\x9b\x98\x1c\x7a\x74\
+\xfc\xf8\x58\xad\xed\xe4\x6e\xe5\x73\x92\x87\x13\x61\x85\x70\xba\
+\x0f\x38\x74\xc8\x04\xd7\x4b\x38\xf7\x25\xdd\x3b\x78\x90\x2a\xed\
+\x17\x82\x25\x31\x16\xa8\x08\xf1\xa6\x9b\x68\x2d\x83\xf1\xfa\xf6\
+\xed\x11\x14\x0c\xa7\x32\xa0\xed\xcd\x9b\x2f\x55\x32\x33\x60\x50\
+\xb7\xa9\xe9\x08\xb4\x34\x57\x91\x6b\x7e\x81\x10\x85\xb0\x12\x9e\
+\xd0\xe8\x21\x10\x87\xab\x83\xae\xad\x02\xa4\x7c\x26\xb3\x4e\xfa\
+\x0a\x09\xca\x17\x85\xd1\x24\x28\x15\xf5\x70\xb8\xec\xb5\xfb\xe9\
+\xa7\x67\x54\x85\x6e\x5f\xbf\xbe\x2b\x8d\x1f\x1b\x37\xee\x38\xad\
+\x92\x4a\x32\x00\x2a\x2d\x86\xad\x2c\x50\xe0\xb5\x5c\x09\xfd\xd3\
+\xb3\xd3\x2b\x83\x65\x1e\x86\x42\xbe\x61\x05\xae\x23\x61\x48\xb3\
+\xc1\x68\xd9\x92\xf8\x34\x6d\x31\xe5\xf9\xc7\x8b\xc6\x50\x02\xe4\
+\x8b\x1c\x4c\x67\x6c\xc5\xee\xc8\x34\x2b\x7f\x5d\xcf\xe0\x80\xc1\
+\x8c\x00\x53\xcc\xf5\xf5\x3f\xd1\xb6\x93\x1c\x26\xa4\x23\x43\x4a\
+\xd8\x14\x3e\x40\xd2\x33\x75\x03\x9a\xaf\x99\x08\x40\x5b\xea\x67\
+\x9e\x9e\x6b\x94\x7e\x78\x44\xda\x7a\xcf\x16\x22\x8f\x48\x07\x30\
+\xd8\xf0\x2a\x81\x46\x96\x65\xca\xd4\x41\xb6\x86\xba\xae\x6e\x77\
+\xc7\x8e\x54\xe8\x99\x5b\x4a\xf4\xa5\x10\x21\xf8\x1a\xee\xbe\x70\
+\xa1\x3d\xc6\x17\x28\xb9\x8c\x88\x6d\xcd\xd5\xf5\x6c\x9c\x8b\xcb\
+\x97\xef\x78\x78\xf4\x28\xc5\xe4\xa6\x20\xdf\xb2\xa1\x62\x44\x28\
+\xe6\x7d\x47\x89\xcf\x18\xaf\x2a\xb4\x00\xa3\x3c\x44\x5e\x5d\xd2\
+\xde\xdc\xd1\xb2\xe5\x0d\x32\x52\x8b\x02\x05\xea\x89\x74\x04\x83\
+\x0d\x2f\x2f\xea\xef\xe6\x9d\x98\x38\xf1\xa4\xaf\x9d\x1d\x95\x02\
+\xa9\xc8\x5d\x2e\xdd\xed\x57\xd6\x56\xa8\xf0\x48\x7a\x39\xdd\x2f\
+\x5a\x58\x8c\xa2\x2d\x9a\x4d\xf9\xf2\x57\x7e\x00\xdd\x98\xa6\x52\
+\xc6\x2f\x17\x0c\xed\x37\x29\xce\x94\x44\xa2\x4c\xa9\xc5\x25\x69\
+\x0b\x49\xab\x1f\x19\x9a\xdc\x6a\x8e\x4a\x4e\x4c\x34\xc3\xb5\x8b\
+\x4c\x19\x3b\x44\xff\x9d\xf4\x28\x03\x62\xb0\xd1\xe5\x01\x7b\x82\
+\x63\xc0\xec\x94\xb9\x4f\xcd\x48\x50\x00\x7b\x3f\xe1\xe3\xc7\x99\
+\x30\xb4\xfd\xf0\xea\xbd\xa6\xd8\x17\x9d\xfd\x36\xd7\xaf\x7f\x8f\
+\x3c\x7b\x3f\x50\x05\x79\x71\x24\x42\xfb\x9e\x9a\x31\xe3\x98\x0c\
+\x8c\x67\xd3\x4e\x02\xa0\x8a\x0a\xc4\x2b\xe3\x94\x5e\x78\x02\x90\
+\xa5\x51\xf9\xe8\xf7\xf1\xb9\xdf\xc8\x55\xd2\x1b\x6c\x28\xd2\x13\
+\x0c\xc6\x8e\xd6\xad\x3d\x94\x95\xed\xfc\xe2\xc5\xa3\x29\xa9\x18\
+\xf1\xae\x53\x08\xa2\x7f\x22\xaf\x20\x6d\x3d\x7f\x30\xa5\xb4\x51\
+\xb2\x3c\x29\xbf\x46\x0e\xe6\x00\x5a\xb1\x70\x1d\x0b\xa6\x1c\x19\
+\x35\xea\x2c\x7d\xf1\xa4\x62\xb0\xe5\xb1\xb2\x27\xae\x2e\x52\xe4\
+\x03\xae\x9f\xc8\xeb\x09\x62\x38\x9d\xc0\x60\x24\xc5\xc5\xfd\xb2\
+\xbf\x4f\x1f\x92\xeb\x53\xd7\xa8\x61\x65\xbb\x8f\xb3\x90\x23\x32\
+\xf7\xad\x92\x3e\x7d\xfa\x23\x8d\x2b\x4c\x13\x92\xf0\xcb\x6a\x67\
+\x0b\xad\x56\x1a\x41\x71\x27\x8d\x15\xeb\x2d\x82\xfe\x6f\x49\xda\
+\x82\x56\xfb\x54\x02\xe8\xea\xb3\x1d\x6d\x47\xf1\xf9\xad\x6d\x8d\
+\x8c\x14\x99\x87\x99\x22\x1d\xc1\xe0\xf8\x5d\xf7\x37\x77\xee\x58\
+\x51\x3f\x38\xfc\x41\x3e\x87\xd1\xc5\x1e\x19\x37\xae\x59\x5a\x15\
+\x94\x61\x70\xeb\xa4\xd7\xef\x09\xae\x65\x85\x0e\xe0\x5d\x40\x40\
+\x3d\xac\xd8\xe7\x69\xc5\x22\xe3\x59\x5f\xb5\xea\xd3\x07\x87\x0f\
+\xf7\x48\xe5\x6c\xd7\x9a\x9e\x3b\xb6\x6e\x7d\x5d\x36\xd5\x2c\x47\
+\x0d\x59\x90\xa5\x13\x8b\x5c\xd4\x0f\xe9\x1e\xb3\x63\xb0\xa8\x11\
+\x38\x08\x5c\x2c\xf5\x55\xd2\x1c\x9f\x82\xa7\xf3\xa0\xe2\x25\xdc\
+\xdf\xbf\x7f\x43\x1d\xca\xcf\xec\x47\x2b\x16\xa4\x1c\xee\x4a\x4d\
+\xcf\x68\xe5\x7c\xa6\xc4\x27\x31\x76\x0b\xc5\xbb\xb1\xef\x1f\x3e\
+\x5c\xad\xc8\xfd\xe1\xaa\x8f\x33\xe1\x65\x32\xc4\x8b\x56\x56\xe5\
+\x04\x83\x91\x41\xe9\x54\x75\xc0\x7c\x22\x0d\x40\x88\xe1\x67\x45\
+\x3a\x81\x88\x9e\x78\xbd\x84\x04\x62\x0b\x14\x60\x2f\x92\xc5\x86\
+\x57\x0e\x1c\x77\x6b\xe7\x4e\x07\xc8\xb4\xdf\x70\x1e\x38\xb0\x8b\
+\x52\x2b\x08\x8e\xd7\x88\x4f\xf6\x10\x1a\xc0\x0a\x77\x9d\x3c\xb6\
+\x58\x29\x5b\x68\xac\xe4\x75\xc0\xb1\xd4\xf5\x35\x2b\x56\x72\x06\
+\x43\xa5\x4e\xa3\xd2\xd3\x4b\x40\xeb\xe5\x37\xd4\xe1\x95\xdc\xf5\
+\x1a\x75\x6c\x4f\x65\x2b\xe2\xb1\x3a\xb0\xe2\xd5\x03\x67\x82\x43\
+\x28\xd8\x2d\x6b\x05\x93\xd5\x67\xbb\xd8\xd8\x45\xd2\x49\xa4\x18\
+\x56\x49\x6c\xaf\xe3\xa8\x31\x0b\xc6\x1b\x4b\x1d\x4d\x27\x25\x2b\
+\x47\xa3\xfe\x6e\x3d\xeb\xab\x30\x32\xd3\x1d\xff\xab\xd2\xd9\xd5\
+\xa6\x5c\xb9\x17\xa4\xc3\x12\x1b\x19\x59\x0f\x63\x4b\x28\xc4\xa0\
+\xac\x7a\x72\x05\x2c\xad\x0b\xe2\xae\xb2\x6f\x9d\x6a\x7d\x8d\x1a\
+\x9b\x28\xdf\x12\xfc\xb2\xb6\x52\x25\x8a\xc1\x15\x97\x45\xbe\x15\
+\x60\x48\xf7\x29\x23\xc5\x7f\xfb\xf6\xed\xb1\xb1\xb1\x94\x87\xe9\
+\x02\xa6\x20\x91\xfa\x36\x72\x3a\xd7\x93\xbe\x0a\xad\x96\x8a\x4c\
+\x3b\x15\x03\x8b\x0c\x06\x83\x8d\x2d\x37\xf8\x02\xf1\xbb\x70\xea\
+\xec\x6a\x9e\x3b\x77\x28\xf5\xc7\x43\x96\x8a\x9f\x14\x35\x8a\xa5\
+\x2b\x4a\x65\x1e\x52\x73\x47\xbb\x4a\x95\x1c\xa4\x01\x1e\x05\x4b\
+\xeb\x80\xe1\xb5\xa2\xfe\x0e\xf4\xef\x93\x86\x93\x40\x82\x4d\x60\
+\x38\xdd\xbb\x0e\x1b\x46\x92\x83\x63\x95\x2f\x95\x6d\x4d\x9b\x5e\
+\x91\x81\xf2\x81\x60\x5b\x70\x02\x54\xd6\x2e\x2b\x5f\x28\x14\x3c\
+\x17\x19\x04\x06\x1b\xdb\x32\xac\x02\x6f\x34\x3b\xbb\x92\xe2\x96\
+\xb2\x9a\x41\x51\xf9\x2c\x0c\x4c\x2d\x65\x4e\xc6\x86\xe7\x5d\x1f\
+\x9f\x3d\x5b\x8f\x56\x0d\x99\x11\xb2\x55\x47\xce\xad\x15\xc1\x49\
+\x74\xbe\x43\xbf\xbb\xab\xe8\xe2\xfa\x00\x32\x0e\x3e\x3e\xd6\xd6\
+\x3b\x65\x95\x41\x71\x0a\x2b\xa0\xa4\x29\x3a\x2e\x2c\x8c\x8c\xad\
+\x81\xd0\xc0\xd9\xb9\x73\x27\x4b\x63\xa4\xdc\xcd\x46\xf8\x79\x15\
+\x8c\x6f\x65\xba\x56\x5e\x30\x18\xab\x8b\x17\xef\x85\x00\xb9\x3a\
+\x21\x1a\x5b\x2b\x7f\xe7\xc9\x93\xf3\xae\x2e\x5a\xf4\x1e\x09\xb8\
+\x5e\xb5\xb3\xdb\x75\xd1\xdc\x7c\x1f\x3d\x43\x7f\xf3\x4b\xe4\x01\
+\x55\xf2\x1f\x91\xcd\x1f\x83\xc2\xd2\xa7\x90\x54\x98\x86\x7b\x15\
+\x75\x08\x52\x84\x6c\xb3\x58\x8c\xb7\xa1\xd4\x48\x31\x95\x9c\x04\
+\x1a\x51\xe5\x04\xf8\x15\xf1\xc9\x6b\xb8\x6f\x23\xab\x2e\x7a\x51\
+\xa5\x85\x52\xb5\x80\x8a\x0c\xef\x88\xe7\xcf\x57\x92\x54\x04\xbe\
+\x48\x76\xcb\xd5\xf2\x2d\x38\x3a\x5d\x3e\x17\x83\x41\xee\xf3\xb0\
+\xc0\xc0\xe5\x08\x94\xfb\x22\x24\xf0\x1c\xa5\x31\xc5\x92\x93\x93\
+\x7b\x51\x85\x42\x5c\x64\xe4\x0c\xac\x6c\x41\x1a\x32\xed\x85\x84\
+\x04\x0a\x42\x83\x71\x5e\x7a\x41\x2b\x05\x79\x09\x11\x6c\x56\xb6\
+\x73\xbe\x60\x71\x1d\x91\xa0\xcf\xaf\xd1\x58\xc4\x80\x56\x65\xfb\
+\x9f\x7f\x0e\x20\x2f\x2e\x25\x7d\xcb\x2c\x94\x30\x3c\x9b\x48\x06\
+\x28\xd3\xe5\x3a\xcb\xec\x1d\x2b\x32\x38\xc4\xef\x94\xd5\xfe\x86\
+\x89\x10\xcd\x45\x3a\x80\xc1\x46\x57\x0c\x1c\x2e\x57\x84\x26\x58\
+\xdd\x5a\xe2\xfc\x16\x08\x27\x84\xab\xb6\x4c\xbb\x02\xa4\x4e\xdd\
+\xa6\xea\x04\xd4\xa5\xcd\xc5\x3b\x21\x60\xca\x8a\x02\x05\xa2\xf0\
+\xbb\xef\x56\x97\x2c\x49\x92\x7f\x8b\xa5\xe8\xad\xce\x00\x2b\xf2\
+\x45\x69\x3c\xa6\x02\x70\x5f\xb4\x68\x35\x79\x36\x15\x83\x52\x56\
+\x3b\xba\x92\x21\xe2\x33\xbe\x87\xe6\xcc\xf2\xc3\x23\x46\x9c\xc3\
+\x39\x36\x5e\xae\x78\xfb\xd3\xeb\x73\x31\xd8\xf0\x4a\x83\xd9\x48\
+\xc2\x0f\xf5\x69\xc1\x64\x44\x38\xcf\x25\xbd\xbc\x7e\x9d\x82\xe8\
+\x39\x85\x06\x2c\x8b\x17\x3f\xaf\xd1\x7e\xeb\x39\x2a\x18\xf6\x24\
+\xc6\xc5\xd1\x7b\xa6\x10\x02\x32\x53\x0a\x61\x41\x13\x5d\x51\xdd\
+\xba\x7b\xf0\x60\x1f\x48\x38\x84\x49\x03\xdb\x75\x70\xc0\x80\x09\
+\xa8\xb2\x50\x1b\x21\x2a\x2d\x6e\xec\xed\xd6\x4d\xe9\x0b\xb1\x96\
+\xc6\xce\xcc\x9a\x75\x14\xfa\x31\xbd\xae\xae\x5f\x3f\x1d\x15\xf7\
+\x96\x78\x27\x88\xc6\x97\x66\xcf\x3e\x5f\x30\x18\xe9\x79\x16\x8a\
+\x8f\x8c\x9c\x87\x34\xb1\x73\x70\x3e\x44\x1d\x1e\x39\x72\xa2\x90\
+\x50\x56\x00\x6a\xb9\x8c\x7a\xb5\x48\x24\x4b\xef\xa5\x3e\xe8\x32\
+\x2e\xd6\x04\x2c\x05\xbd\x95\x81\x64\x70\x08\x38\x2b\xbd\xf3\x26\
+\xea\x4a\xed\x5d\xe4\x8b\x17\x73\x51\x41\x11\xa0\x19\x87\x93\x1a\
+\x9a\xa6\x60\x2b\xd2\x00\xc5\x58\x92\x74\x08\x25\x52\x58\x01\xbc\
+\x15\xe4\xe5\x55\x9e\x1c\x2e\xb4\xaa\x53\xf3\x4d\xbc\xab\x68\xce\
+\x0c\x4a\x97\x32\x20\x06\xd7\xde\x81\xbd\xc0\x25\xe0\x10\xd9\x46\
+\xeb\xac\x5c\xb1\x36\x83\x29\x54\xfc\x29\xe5\xf0\xea\x83\x7a\x1a\
+\x09\xc4\xa7\xc9\xab\x89\xf2\x19\x4b\x92\x3b\x8f\xfb\xf0\x81\x24\
+\xce\xab\xd1\xaa\x82\x6b\x7d\x1d\x28\x6f\x1a\xf5\xcc\xc3\x63\x1d\
+\x2a\x0e\x4e\x6f\x6f\xd1\xc2\xeb\xb1\x9b\xdb\x46\xa4\xc2\xd5\xa1\
+\x95\x98\xfe\xed\x38\x8f\x26\x53\xa3\x4c\x88\xda\xbe\x24\xc3\x83\
+\xcc\x85\xc7\x33\x3f\xbf\x02\xb8\x3f\x49\x5e\x50\xfc\x7e\x73\x8c\
+\x57\xc1\xbb\x89\xd2\x68\x2f\xa5\xd7\xe7\x62\xb0\xe1\x15\x07\xf3\
+\x51\xf5\x00\x9c\x27\x17\x95\x55\x01\xab\x58\x08\xe4\x10\xa6\xa4\
+\x52\xaf\x46\x5a\x92\x5f\xb6\x36\x69\x72\x27\xf2\xe5\xcb\xfe\x38\
+\x37\x39\xa1\xf1\x07\x69\x4e\x36\x83\x63\x25\x8e\x9e\x49\x21\xdb\
+\xdc\x59\xec\xcd\xac\x0d\x8e\x00\x67\x81\xc3\x61\x30\x7b\x49\x98\
+\x48\x6d\x60\x9d\x3a\x5d\xc1\xd8\x38\x68\xaa\xdc\xa0\x15\x5e\x3a\
+\x8c\x0a\xca\x2f\xa0\x89\x20\x79\x38\x4f\x92\x61\xd2\xbb\x94\x9d\
+\x23\xb3\x55\xb6\xa5\x5b\x0c\x8f\xc1\x80\xf7\xb2\x3f\xc5\xea\xa0\
+\xaa\x15\x49\x46\x07\x4f\xe5\x65\x52\x56\xd6\x2a\x8f\xb1\xa6\x67\
+\x97\x57\xae\xdc\x8f\x70\xc3\x75\xa9\xad\xf2\xc1\xcb\xcb\x2b\x3b\
+\xa4\xfe\x9c\xe4\x7d\x92\x59\xce\x9c\x7d\x85\x0e\x01\xd9\x2a\xbd\
+\xb0\x65\x54\x9f\xef\xd0\x3a\x3a\xd8\xa1\x55\xab\xb6\x57\xd6\xad\
+\x6b\x4c\x1a\xa0\x41\x97\x2f\xf7\x25\xcf\xab\xac\xd5\xcb\x81\x03\
+\x5c\x01\x5a\xdd\x70\xe6\xa3\x50\xc9\x6c\xca\xce\xd1\x48\x13\x8b\
+\x02\xe7\xa4\x57\x2f\x08\x06\x77\x03\x6a\x43\xd9\x28\x48\x1c\xf6\
+\x44\xce\xa5\x1f\xae\x05\x34\x33\x56\xb0\x8a\x45\x22\x46\x17\x8f\
+\x95\xe1\x2d\xad\x66\xb2\x9c\x26\xd0\xdb\xd2\xb2\x1e\x56\x82\xb7\
+\x64\xac\x48\x8a\x5e\x43\xd9\xff\x26\x42\x34\x92\x0d\x2b\x7b\xe8\
+\xc0\x67\x2b\x83\xcf\xb5\x84\x8c\x87\xce\x6e\xb4\x62\xe1\x4b\xc1\
+\xf1\xe1\xf1\xe3\xbf\xe1\x33\xdd\xa3\x15\x4d\x68\x00\xa9\x62\xd3\
+\x92\xe2\xe3\x4d\x4f\x4e\x9f\x5e\x1d\xde\x5c\xea\x02\xfb\x0a\xbd\
+\x12\x76\xc0\x99\xf4\x4a\x1a\xde\x3a\x91\x1e\x60\x30\x64\x7c\x6b\
+\x00\x68\xaa\xd9\x9f\x5c\xa9\xc6\x96\x0e\x87\x4f\x54\x9b\x47\xf7\
+\x94\x36\x05\xaf\x27\x15\xc8\x26\xcb\x33\xd0\xaf\x60\x71\xd2\xd0\
+\xc4\x7b\x8a\xd7\xf0\x2c\xae\x35\x74\x40\x25\xad\x7f\xe8\xb5\x6b\
+\x36\x70\xac\xdc\x26\xc7\x8a\x92\x47\xea\x3a\x62\xc4\x4e\x5a\xdd\
+\xb4\x4a\xa1\x6a\x49\x39\x42\xa5\x35\x57\x1f\x74\x03\x7a\x4a\x7a\
+\x2c\x81\x67\xce\xcc\x90\xe7\xda\xf4\x03\x83\x65\xfc\xb4\xb6\x93\
+\xb7\xa4\x77\x32\xf6\xee\xfe\xfd\x5b\xdc\xa6\x4c\xd9\x43\xf7\x48\
+\xb1\x7a\x2d\x73\x1a\xdd\xe4\x19\x28\xbb\x92\x7c\x1c\x15\x12\xb2\
+\x64\x43\x8d\x1a\x8f\xa5\xa1\x26\xc1\xf0\xec\x68\xcb\x96\xc5\x86\
+\x67\x08\x8e\xa7\x84\x67\xcb\x12\x25\x42\xd0\x70\xf2\x25\x44\x6c\
+\xe7\x69\x87\x46\xb0\x42\x37\xd0\x68\xcd\x35\x0e\x8e\xa2\xf6\x64\
+\x9c\x07\xfb\xf5\xbb\x80\xfb\x0c\x4d\x82\x66\x30\x54\x9b\xea\xd5\
+\x5b\x84\xf3\x4f\x08\x5c\xe8\x76\xf4\x07\x8b\xad\xa5\xbd\xb2\xe2\
+\xc1\x79\x72\x07\x4e\x96\x85\xda\xad\xb8\x7c\xb7\x6e\x2d\x8b\xb3\
+\x53\x38\x55\x27\x6c\xa8\x59\xf3\xbe\x92\x14\xad\x23\x55\xf4\x3f\
+\x23\x75\x6d\x2e\x55\xd2\x93\x27\x56\xa3\x9b\x4f\x79\x29\x45\x7f\
+\x99\x1c\x26\x74\xce\xa3\x5a\x3d\x8c\xe7\x47\xee\xe9\xb1\xf8\xa8\
+\x28\x53\x5a\x2d\xff\x8b\x89\xb9\xad\x44\xa6\x81\x21\xc3\x03\x8b\
+\x65\xd6\x4a\x4e\xc5\x69\x42\xc6\x14\x11\x14\xb4\x4a\x91\x65\xd7\
+\x5a\x15\xcd\xe9\x1d\x6a\xcd\x8c\xe7\xf3\x6e\x6c\xde\xec\x18\xe0\
+\xec\x4c\xa1\x88\x1c\x18\x37\xcc\xea\x74\x2a\xaa\x18\x07\x9b\x69\
+\xa4\x88\x6d\x92\x2b\xb1\x1b\x7d\x36\x3a\xcb\xd2\x36\x54\xe3\xfd\
+\x51\x60\x13\xf1\x5f\x04\x26\x3c\x48\x5d\x0f\x25\xc4\x2c\x91\x99\
+\xe0\x6e\x40\x7a\x52\xae\x41\x1d\x8f\x93\x7d\x01\xba\xa5\xa6\xb0\
+\x45\x6d\xb7\x90\xc1\xf1\x04\xcf\xa7\x4b\x29\x85\xc6\xb2\x6c\x86\
+\xaa\xb8\x15\xb9\x87\xc3\x60\x45\xa1\x03\x38\xfa\xfb\xef\x35\x90\
+\x6f\x7a\x5b\x59\xb9\x91\xf6\xe5\x16\x19\x14\x44\xaa\xd0\x0c\x2a\
+\x2d\x41\xae\x9f\x72\x3e\x98\x27\x32\x1b\x6c\x7c\xad\x43\xae\x5e\
+\xb5\x95\x62\xad\x7a\xd2\xc8\xf2\xa6\xa6\xb0\x85\xe7\xd5\x85\x16\
+\xd6\x55\xab\xb6\x40\xd9\x92\xca\x7e\x78\x4b\xc1\x6c\x3a\x10\x38\
+\x9f\x78\xc5\xd6\x76\x0f\x3c\x92\xef\xff\xe9\xdf\x16\xad\xe2\xa4\
+\x92\xf6\xaf\xe8\x06\x44\x5b\x14\xc8\xa9\x2d\x41\x90\xf6\x15\xf6\
+\xda\xf1\x9c\x82\x93\x25\x01\xe6\xc6\x60\x41\x69\x6c\x0d\x29\x7e\
+\x05\xba\x82\x23\xc9\x90\x90\x95\x7f\x4d\xe9\x7b\xae\x40\x31\x4c\
+\xc4\xeb\x5e\xa3\x10\x36\x9c\x56\x48\x5a\x05\xa5\xe1\x1d\xd0\x91\
+\xcf\xf5\x0b\xc9\x39\x50\x5c\xf2\x99\xbb\xfb\xd0\x7f\x60\x70\x13\
+\xa5\xd1\xbe\x06\x7b\x89\x1f\x1d\x81\x81\x81\xfa\xc8\x62\x7f\x09\
+\x46\xc5\xc7\xc7\x1b\x8a\x2c\x03\x83\x82\xc1\xeb\xab\x57\x77\x85\
+\x21\x7d\x96\xc2\xb5\x5f\x42\x7c\x7c\x6c\xa4\xc2\x96\xf6\xbb\x2b\
+\xc0\x14\x28\x49\x1f\xa0\x98\x5d\x42\x74\xf4\x4c\x1b\x23\xa3\x97\
+\x34\x66\xa6\xaf\xdf\x56\x47\x56\xf0\xdc\x60\x57\xb0\x9b\xf8\x4e\
+\xe0\xef\x72\x86\x6c\xd5\x15\x87\x52\x20\xf2\xf2\x66\x47\xb8\xa4\
+\xaa\xf8\x51\x81\xe5\x7a\xb8\x74\x49\xbb\x6b\x1e\xda\xe5\x81\xbc\
+\x3d\x29\x55\x89\x4c\x03\x83\x62\x55\x08\x26\x6f\x5a\x5b\xb1\xa2\
+\x7a\xc5\x82\x27\x33\x1c\xf3\xd0\x5b\xcb\xd8\x2a\xd2\x16\x12\x95\
+\xe6\x81\x78\x7f\x1a\xa8\x47\x84\x33\x65\xb6\xf4\x78\xee\x11\x3a\
+\x86\x34\x0b\xe7\x6a\x97\x01\xa1\xbb\xed\xa7\xc8\x48\xb3\x55\x45\
+\x8b\x5a\xca\x3a\x3d\x0a\xa9\x94\x14\x3f\x12\x60\x4c\x75\x31\x71\
+\xaf\x90\xf5\xf0\x9e\xe4\xbf\xa9\x3f\x99\x54\xa7\x5a\xa7\x04\x34\
+\x25\x1f\x64\xaa\xe1\xb1\xd1\x55\x43\x88\x60\xfa\x05\x0b\x8b\x83\
+\xa8\x47\x7b\x07\xe7\xd6\x63\x2d\xcf\xa5\x7a\x15\x24\xc3\xd4\x14\
+\xb2\x45\xc8\xe1\x17\xf5\x36\xb4\x55\x2b\x2f\xa1\x85\x99\x42\xe4\
+\xca\x2a\xd5\x2d\x5a\x95\x40\x6f\x70\x56\x5a\x52\xba\x94\x32\xa0\
+\x73\x73\xe7\x1e\xa6\x7a\x43\xf0\xe7\x33\xc6\xc6\xe5\x10\x4e\xf9\
+\x28\x53\xe0\xae\xfc\x68\x5b\x98\x14\x8d\x0f\xd4\x42\x4e\xa6\x09\
+\x8d\x61\xa2\x9f\x21\x13\xe2\xb0\x43\xf3\xe6\x3e\xd4\x43\x1a\x13\
+\x1c\x83\x67\x43\xa8\x3c\x43\xfb\x2c\x41\xab\x24\xf7\x1e\xcb\x90\
+\x1e\x02\x2d\x60\x78\x8b\xa0\x31\xb2\x8c\xb6\x95\x58\xe9\x3a\x53\
+\x81\x27\x98\xe2\xd8\xb6\xad\x2f\xc6\x46\x08\x40\x3b\x93\xc5\xd3\
+\xc4\x64\xb7\xbc\x2f\x0c\x5a\x91\x4c\x9e\x3c\xdf\xbd\x04\xcd\xb3\
+\x22\x8f\x31\x3c\x28\xa8\x29\xbc\x97\x54\x25\xee\x87\xcf\xd1\x5d\
+\xfc\x05\x94\x32\x20\x29\xd2\x94\x80\x1a\x3b\x63\xdc\x1b\x98\xe7\
+\xc9\x33\x84\xc6\xd0\x5e\xf9\x26\x52\xc5\xac\x7e\xa4\xbe\x10\x02\
+\xe9\x39\x3e\x54\x56\x0f\x35\x27\x12\x86\xc9\x2e\xcb\x2f\xc2\x20\
+\x91\x16\x14\x17\x1e\x6e\x21\xf5\x2e\x66\x51\x79\x06\x2a\x95\x95\
+\xda\x2d\x17\xad\x49\xee\xa3\x31\x99\x43\xd9\xf1\x92\xfe\x3d\x04\
+\xc0\x06\x60\x0e\x72\xa4\x28\xf9\x97\x48\x0c\xbe\xfc\xe4\xcc\x99\
+\x72\x1a\xbb\x95\xaa\x78\x16\x8c\x79\x8a\x46\x3d\xda\x54\x12\xa6\
+\xc5\xbd\x5a\xde\x0e\x5b\x32\x7f\xa8\x2b\xbb\xc2\x6b\xf8\x50\xae\
+\x0c\x1e\x52\xfc\x47\x95\xc9\xe5\x4c\x7d\x82\x2e\x5d\x9a\x8c\x6a\
+\xf9\x03\x32\x4e\x57\xed\x4f\x16\x83\x33\x38\xc3\x52\xc7\x57\x17\
+\x38\xf5\x94\xfe\x07\xcf\xc0\x97\xa4\x9e\x86\x2f\x21\xaa\x31\x1c\
+\x0c\xe6\xfa\x91\x26\x73\x04\x6d\x4b\xa0\xb8\x3b\x9f\x0c\x8e\x26\
+\x49\xc9\xed\x93\xf2\x68\x2a\xf9\x5e\xc9\x2d\x8d\x1a\xf9\xd1\xb3\
+\xcb\x96\x96\xf6\x14\x03\xd2\xf4\x48\xa1\xc8\x72\xa7\xa2\x6d\x41\
+\xfa\xf5\x22\xc3\xc0\x52\x0f\xa4\x13\x89\x06\x1c\x21\x72\xc5\x0a\
+\xc6\x75\x31\xae\x33\xc1\x70\x72\xb2\x5c\xb1\xb1\xd9\x23\x7b\xa0\
+\xef\x00\xbf\xee\xeb\xd1\xc3\x53\x4a\xde\xcd\x02\x17\xa1\xda\xfc\
+\x38\x6d\x47\x65\xdb\x65\xcb\xac\x48\x82\x06\x47\x5d\x30\x33\x9b\
+\x86\xa4\xe6\xcb\x30\x20\x5b\x18\x53\x41\x8d\xed\xf2\x7c\xdc\x87\
+\x6a\x94\x01\x8d\xa7\xae\xaf\xe7\xe6\xcd\x3b\xac\xfc\x8d\x91\x11\
+\x62\xbc\xcd\x8f\x3a\x89\xb5\xc1\x4e\xb2\x6e\x4b\x85\xf3\xdc\x6b\
+\x7c\x03\xc5\x52\x1e\x9c\xd0\x00\x56\xc1\xf9\x94\x29\x4e\xab\x9e\
+\xd0\xc2\x55\x5b\xdb\x7e\x08\x2b\x7c\xc6\x61\xfd\x09\x19\xaa\xc8\
+\x48\xb0\xd1\xd5\xc4\x36\x73\x16\x4a\x79\x5c\xa1\x1e\xa6\xfe\xe6\
+\x97\x5e\xbc\x77\x1e\xc6\xc6\x4e\xe4\x44\xb1\xaa\x50\xa1\x8a\xcc\
+\x61\xa4\x9d\x8b\x31\xf8\xb3\xfc\xdd\x1c\x60\x2b\x6c\xed\x9e\xcb\
+\x2c\x10\x0b\x5c\x0d\xc0\x1e\x54\x46\x94\xd9\x7f\x77\x30\xa4\x89\
+\x3b\xdb\xb7\x5f\x4c\x7d\xc8\xc1\xb1\x52\x9a\xa2\x03\x0c\x4b\x1d\
+\xbf\x43\x0e\x69\x60\x4c\x4c\x4c\x31\x0a\xf2\xdf\x77\x71\x19\x84\
+\xb3\x6c\x22\xa5\xc6\xd1\xe7\x97\x89\xd2\x3f\x3e\x4e\x4e\x99\xb2\
+\x8c\x14\x7a\xe9\xcc\x86\x89\x18\x06\xe6\x54\xfa\x46\x83\x26\x60\
+\xf9\x54\x3c\x9d\xc7\x68\xf9\x0f\x3c\x75\x6a\x03\x9e\x57\x11\x19\
+\x0a\x86\x34\x9c\xb6\xe0\x22\xca\xcb\x24\x91\x57\xd9\x9c\x64\x36\
+\x48\x4d\xf8\xd5\x01\x71\x19\x30\x57\x14\xa0\x55\x42\x02\xca\xd1\
+\x9e\xf4\xc7\x0c\xc3\x9d\x61\x9a\x2d\xdb\x60\x69\xb4\x8f\xc0\x6e\
+\x59\xf1\x39\xa2\x42\x43\xa7\x38\xb4\x6c\x39\x4a\x59\xc5\x63\xde\
+\xbe\x35\x3d\xd8\xbf\xff\x85\x8d\xb5\x6b\xdf\x80\xb7\xd6\x90\x02\
+\xe7\xa0\x0b\x1d\x7f\x64\x56\x4e\xed\x7f\xd5\xb6\xe5\xa6\x83\x83\
+\x03\x56\xba\x48\x45\x77\x50\xf9\x06\xd2\xce\x06\x27\x28\x2d\x7d\
+\x77\x76\xe8\x40\xcb\xff\x30\x91\x99\x60\xc3\x33\x90\x3a\x93\xed\
+\xe5\x35\x87\x00\xb0\xdb\x50\x17\xb9\x7e\x78\xfa\xf4\x77\xb9\x4d\
+\x5b\x2f\xdb\x6b\xf5\x11\x40\x62\x6c\x6c\x5d\x59\x3a\x54\xd3\xd9\
+\xd9\x59\x0f\x19\xff\xea\x2d\x9c\xe4\x29\x3a\x0f\x66\x45\xd9\x0f\
+\x98\x5f\x23\xfd\x6d\x20\x68\x0a\x79\xc2\x89\x8a\xbe\x0a\xe2\x8c\
+\xc1\x18\x1b\xfd\x6f\x9c\xc8\xaa\x28\xb7\x58\xe8\x63\x65\xb5\x67\
+\x43\xf5\xea\x57\xb0\xcc\x5f\x74\x1e\x34\x68\xd4\x37\xdc\xbd\x01\
+\xd8\x02\xc4\x84\x3f\x7f\xbe\x82\x8c\x55\x64\x39\x18\x76\x95\x2b\
+\x8f\x97\x32\x0f\x27\x70\xcd\x86\x3e\xe6\xbd\x51\x6f\xa7\x7c\x81\
+\x7a\xac\xab\x55\xab\x1a\xcd\xb1\x9c\xc3\x0e\x34\xee\xd0\xb4\xe9\
+\x2d\x68\x93\x78\x63\x77\x93\x2c\xb5\x48\x6c\xc0\x82\x3a\xa0\x1b\
+\xa3\x77\xdd\xde\x7e\x1b\x1c\x79\xea\x12\xa6\x7d\xdd\xbb\x77\xfe\
+\xd7\xd6\x72\x81\xed\x64\xd2\xac\x29\x38\x41\xb6\x3d\x9a\xa6\x44\
+\xfa\x31\x31\x7f\xd0\x64\x9d\x98\x3c\xf9\x24\x9e\x77\xd1\x32\xc6\
+\x2a\xe0\x92\xcc\x6f\xe1\xc4\x88\x8c\x8c\x2c\x48\x32\x08\xd2\xc0\
+\x36\x5f\xb6\xb1\xa9\x89\x04\x62\x73\x94\xf9\xc4\xc9\xe2\xd7\x3d\
+\x02\x90\x5e\xe9\x7b\x38\xff\xc5\x7e\x78\xfc\x78\x15\x39\xd1\x48\
+\x3c\x08\x67\xf1\x07\xca\xee\x86\x6a\xef\x74\xc1\xcf\x80\x32\xa0\
+\x79\x4f\xcf\x9e\x5d\x4f\x0e\xa1\xff\x4c\x21\x25\x09\x7c\x52\x4c\
+\x47\x29\x84\x04\xc3\x2d\x8b\x15\x7b\x85\xd5\x90\xbc\x9c\x06\x5a\
+\x06\x37\x5a\x7a\xd2\xc2\x33\xbf\x84\x84\xf1\xfe\xf1\xe3\x21\x90\
+\x66\x7f\x20\xe7\x20\x19\x46\x76\x47\x29\x97\x91\x4e\x07\x32\xb6\
+\x29\x32\x9b\x25\x7e\x57\xa7\x4e\x5b\x70\x7f\xcb\x75\xe8\xd0\xbe\
+\x57\xac\xad\xd7\xd2\x38\x7a\x10\x90\xb7\xba\xb4\x94\x3d\x6f\xa6\
+\x03\x65\x40\xad\xc1\x32\xe2\xbf\x84\x80\x43\x87\xe6\xc3\x1b\xa9\
+\x8e\xe7\x10\x31\x51\xbe\x71\x51\x51\x8d\x05\xa0\xa5\x69\x51\x0c\
+\xe7\xc0\x68\x78\x3c\xa3\x1e\xba\xb9\xd5\x56\x14\xab\x44\xa6\x81\
+\x9b\x4e\xc2\xb0\x46\x52\xb6\x0a\xbc\x92\x01\x58\xc5\xde\xa3\xee\
+\x4e\xe9\xfd\x5d\x4f\x06\xc5\x3f\x20\xc1\xe1\x3d\x2a\xce\xdf\x2a\
+\xf3\x79\xb0\x6f\xdf\xc1\x70\xa4\x2c\xc1\xbc\x45\x43\xc6\x6f\x35\
+\xe9\x68\x6a\x24\x10\x3b\x83\xe5\x45\xa6\x82\x27\xb2\x2c\x38\x05\
+\x5d\x57\xf6\x6a\xa8\xf4\xde\xd2\x3e\x68\x63\xcc\x98\x9e\x9d\x9d\
+\x3d\x9b\x64\xc0\x3b\xe0\x7e\x88\x9c\xb4\xe3\x78\xb7\xb2\xc8\x2c\
+\x70\x35\x42\x2b\x70\x2e\x68\xfa\xe5\xcb\x97\xa5\xd8\x96\x75\xa5\
+\x6d\x26\xe6\xe3\x08\xcd\x07\xc5\xed\x5e\x5c\xbc\x68\x2d\x9b\x95\
+\x04\x50\x43\x92\xa0\x6b\xd7\x4a\x42\x10\x96\x9a\x76\xf4\x54\xf2\
+\x19\x29\x06\x46\x71\x3e\xca\xe1\x04\xcd\x33\x3f\xb3\x88\x27\xb2\
+\x09\xbe\x2d\x17\x51\x0b\x5b\xea\x8f\x86\x6f\xca\x45\x42\x82\xb4\
+\x07\x69\xeb\x09\xd5\xaa\x60\xec\xbd\xe7\x90\x77\x13\x8d\xdc\x0d\
+\x10\xff\xb9\x2e\xcf\x10\x0e\x22\xb3\xc1\x6a\x62\x65\xc0\x1a\x88\
+\xdd\x55\x86\xe1\xa8\xbf\x28\x29\xde\xfa\xdc\xd3\x73\xc9\x95\x6d\
+\xdb\x0a\xc3\x69\xe2\x25\xd5\xc2\xca\x83\x2a\x59\x36\x94\x43\xa9\
+\x38\xa7\xfa\xb6\x87\x47\x8f\x6e\xc2\x4a\x99\x40\xf7\x32\x38\x3d\
+\x8c\x33\x8b\x32\xbf\xfc\xa2\x07\x32\x19\x96\xe2\x3a\x4d\xe3\xfc\
+\x36\x0d\x4c\xf1\x5e\xb3\x66\x1f\x6d\x5f\xe4\x58\x36\xa4\x18\x3d\
+\x83\xb7\xec\xd3\xeb\xdb\xb7\x4d\xc9\x08\xff\xa2\x97\xf6\x90\x8c\
+\x29\xa6\x64\xbc\xb9\x7b\x77\xbe\x63\x9b\x36\x37\x68\xc5\x02\xa9\
+\x70\x75\x59\x64\x70\xf0\x28\x64\xb1\x8c\xa7\x46\x8d\x9a\x3d\xbd\
+\x57\x16\x2d\xda\x0a\x95\x24\x27\x68\x57\xb3\xbb\x63\xc7\x69\x4a\
+\xe3\x49\x1c\x17\x94\xdd\xcd\xd5\xac\x11\x77\x65\xf5\xe1\x72\x42\
+\x02\x67\x80\x59\x34\x19\x68\x60\xb1\x03\xe3\x2a\x4d\x27\xca\x91\
+\x91\x23\xcf\xd2\x56\x45\x29\xbf\xc0\xd8\x54\x70\x19\xd8\x47\xc9\
+\x76\xc0\x24\x2a\xe2\x3a\x7e\x19\xd2\x41\x94\xe7\xab\x28\x38\x92\
+\x02\xe3\x24\x5b\xa7\x91\x0b\x7b\x93\x44\x68\x0f\xfe\xfa\x6b\x7d\
+\x2d\x6f\xf5\xbc\x97\xfe\xfe\x95\xa9\x8f\x39\x56\xc5\x48\x74\xcc\
+\x59\x16\xec\xe3\xb3\x9a\x12\x24\x50\x00\xfb\xf4\x43\x60\x60\x56\
+\x36\x65\x64\xb8\x9b\x9a\x1a\x62\x3b\xf9\x9a\xb2\x4f\xe8\xcc\x26\
+\x35\x37\xa2\xa8\xd4\x44\x1e\xda\xf3\x48\x09\x35\x75\x6c\x48\x21\
+\x4d\x38\xe5\x73\x7a\x59\x58\x34\x91\x93\x19\x14\x7c\xf7\x6e\x21\
+\x91\x51\x60\xc3\xab\x0e\x4e\xa7\x3e\x01\x50\x89\x0e\x53\x92\xa2\
+\xbf\xa1\xaf\xb2\x40\xb3\x35\x17\xce\x74\x3b\x71\xaf\xee\x0d\x2e\
+\x53\xc7\x18\x59\x29\xa1\x16\x7a\xe3\xc6\xac\x1d\x2d\x5b\xde\x80\
+\xd1\xdc\xa6\x4e\x32\x34\x59\xc8\xf5\x73\x21\x85\x27\xe9\x66\x7e\
+\x01\xa3\x8a\x87\x36\xa3\xd3\x8d\x2d\x5b\x1c\x0f\xfd\xf6\x9b\x3b\
+\xa5\xee\x60\x8c\xae\xbb\xe9\x7d\x1a\x97\xad\x6f\x33\x16\x7c\xbe\
+\x6b\x19\xfb\xe1\xc3\x12\xea\xf3\x16\xfd\xf2\xa5\x39\xee\x0b\x0b\
+\x0d\xe0\x70\x4e\x9e\xca\x18\x9c\xc9\x5f\x50\x22\x31\x1d\x07\x70\
+\x96\x73\x46\x89\x90\x3a\xb9\x18\xd4\x91\x73\x1c\x9f\xef\xc6\x91\
+\x67\x0c\x1d\x58\x6e\xd2\xb7\x21\xca\x81\xae\xcb\x46\x0f\x2d\xc0\
+\x14\xa7\x81\x03\xbd\x70\x3f\x07\xec\x0c\x0e\x73\x19\x3a\xf4\x1c\
+\x8d\x4b\x8f\xd9\x5d\x0a\xb6\x67\xea\x64\x72\x19\x50\x5f\xb0\x83\
+\x5c\xd1\x0a\x82\x1e\xd8\x75\x2c\xc4\x75\x2f\xf8\xf5\xf6\xee\xdd\
+\xdb\xf0\xbc\xae\x7c\xbf\x21\xb8\x04\xe4\xe6\x8b\x3a\x98\xb1\xd2\
+\x9a\xce\x0b\x61\x0f\x1f\xce\x25\x83\x53\xd2\x89\x8e\x8d\x1b\x47\
+\x85\xaf\x79\x85\xc4\x89\x29\x53\x46\x4a\x2f\x66\x12\xb4\x3c\x48\
+\xcd\xca\x48\x64\x09\x18\x54\x21\x8e\x80\xf8\x55\x65\xbb\x0f\x39\
+\x07\xea\x11\x37\x56\x33\xf1\x58\x87\x8d\x8d\xb7\x98\x60\x5d\xb0\
+\x23\xa8\xa2\x06\xed\xd8\x92\x24\x52\x03\x3f\x63\x21\x8c\x34\x62\
+\x77\xa6\x34\xb9\x07\xfa\xf6\xbd\x28\xa5\xb0\x95\xec\x96\x31\xe0\
+\xb8\xcc\xd5\x5e\x64\x60\xfb\x38\x98\xd4\x00\xa8\xa8\x55\x1d\x46\
+\xc8\x9b\xf7\xdc\x3f\xf1\x1c\xd3\xf9\x3c\x8b\xba\xbd\x32\xe0\x6a\
+\xde\xaf\x3e\xb3\xa9\x54\xe1\x94\xa1\xae\x28\xf5\xe2\xf0\x1e\x05\
+\xc1\x18\x2a\x98\xa4\x2d\xcd\x0c\xa5\xcc\x5e\xf2\xab\x6c\x5a\x68\
+\x20\x32\x0b\x5c\x06\xd4\x1e\x5e\x49\xb3\x03\x7d\xfa\x5c\xb4\x2a\
+\x5b\xf6\xea\x29\x3b\x3b\x7d\xf1\x1d\x20\x43\x05\xdf\x4b\xe1\xe1\
+\x4e\x22\xd3\xc1\x93\x59\x83\xb2\x1c\xec\xeb\xd6\xf5\x43\x6c\xee\
+\xa5\x52\x82\xe1\x3e\x7f\xbe\x2b\xd5\x48\x51\xfe\x25\x8d\x91\x5e\
+\xa6\xc7\xe2\xc5\xfb\x29\xf0\x8a\x73\xdd\x2d\x29\x1f\xe7\x2a\x32\
+\x1b\xac\x16\xfd\x2b\x68\xfa\x4f\x6a\xd1\x10\x52\xb8\xab\x7c\x71\
+\x66\x76\xed\x1d\xc0\x90\xdb\xcc\x79\xe4\x58\x51\x34\x15\x91\xe5\
+\xfe\x44\xea\xe6\xaf\x93\x06\xf7\x19\x5b\x9a\x08\x97\xdf\x7e\x5b\
+\x85\xac\x95\xc9\x70\xc0\xf8\xd3\x7b\xd8\x8e\x36\x14\x99\x0e\x6e\
+\xc3\x25\xbe\x13\xca\xb9\x7d\x5b\xd3\xa6\xb7\x4f\x4c\x98\x70\xfc\
+\xc1\xb1\x63\x1d\x65\x8b\xe6\x35\x99\x5f\x91\xc0\x13\x59\x04\x15\
+\xcb\xc3\xd0\x7a\xf7\x04\x5a\x19\x39\x91\xdb\x19\x07\xf6\xed\x64\
+\x70\x7e\x0e\x0e\x3b\xd6\x56\xaa\xa4\x68\xd5\x7b\x6f\x6b\xd6\x4c\
+\x1d\x32\x80\x4c\xbb\x89\xc8\x74\x30\x4c\x84\xe8\x89\x79\xf8\x2d\
+\x2d\x29\x5d\x4a\xdd\xa4\x46\x19\xd0\xb0\x4f\x1f\x3f\xb6\x35\xcf\
+\x95\xeb\x8c\xa2\xaa\x9c\x35\xe2\xae\x5c\xbd\xdc\x05\x9c\x07\x96\
+\xda\xda\xa8\xd1\x1f\x32\x8d\xe8\x34\x56\xb6\x29\xd8\x52\xee\x46\
+\x3a\x51\x08\x8d\x11\xcf\x9b\x98\x58\x88\x4c\x07\x83\xb2\x83\x90\
+\xc0\x40\x3d\xc8\x2f\x50\x87\xd6\xbf\x69\x70\x53\xe5\xae\x24\xee\
+\x40\xbf\x7e\xb6\x8a\xe3\x05\x9d\x5f\xcf\xd2\x2e\x06\xbb\x9a\x87\
+\x07\x7a\xf7\x6e\x29\xb2\x0e\x8c\xa8\xa8\xa8\x42\x1b\x6b\xd5\x7a\
+\xac\xc8\xba\x39\xf5\xef\x3f\x07\x2d\x6f\x17\xa3\x3b\xcb\x71\x2a\
+\x27\x81\x4c\xc0\x08\x91\x55\xe0\x2f\xc6\xa1\x7e\xdb\xb7\x4f\x41\
+\xf8\x86\xb6\x84\x8e\x14\x18\xff\x13\x63\x2b\x4c\x35\x91\x90\x2c\
+\x0f\x43\xb7\xa0\x70\x9a\x4f\x29\xdf\x37\x1e\xd7\x2f\xf8\x62\xbd\
+\x2b\xcf\x86\xfd\x44\xd6\x82\x91\x10\x17\xd7\x17\x92\x7d\x97\xa0\
+\xd6\x14\x27\x9d\x25\x61\x50\x15\xde\x01\x77\x35\x4d\x50\x23\x91\
+\x95\x60\xc3\xab\x02\x8e\x77\x19\x32\x64\x2e\xe6\xe5\x26\xc9\xdb\
+\x69\xca\x99\x53\x5e\x2c\xc6\x4c\x35\xcb\x80\x3e\x45\x47\x9b\x41\
+\x5c\xf8\x1c\xaa\x4b\xe2\x69\x4c\xa3\x59\xe3\x4f\xa0\x8e\x84\x0b\
+\x38\xed\xa8\x0f\x89\xd2\x42\x4d\xd8\x09\x89\xb6\xfe\xd6\x86\x86\
+\x3b\x31\x56\x42\x67\x64\xd2\x58\x1d\xba\xe9\xa7\xa8\xa8\xc9\x28\
+\x4a\x5e\x4d\xb9\xb0\x8a\x50\x11\xae\x45\xb1\x33\x51\xcb\xdd\x41\
+\xb8\xf5\x63\xd8\xe3\xc7\x73\x65\xef\xf3\x5e\x6e\x53\xa7\x1e\xd7\
+\x6a\xd6\xa8\x63\xe0\x89\x2d\x0d\x76\x55\x0a\x29\x53\xe9\x26\xc3\
+\xc8\xfa\x9e\x70\x3d\xb1\x5a\x4d\xc6\x39\x9b\x9a\x6c\x34\x11\x40\
+\x88\xaf\xef\x14\x4a\xeb\xa3\x78\xab\x5d\x95\x2a\x56\x18\xcf\x0f\
+\x16\xc6\xca\x16\x4a\xaa\x70\xc8\xdf\x34\x95\x9e\x4f\x5d\x05\x17\
+\xbe\xea\xf4\x04\xf1\xfc\x94\x02\x47\x82\xcd\x15\xef\x33\xf8\xfb\
+\x2b\x3f\x3f\x6b\x1c\x03\x46\x63\x05\x7c\x08\xaa\x8f\x07\xd4\x37\
+\x0e\xcf\xfe\x6d\x2a\xdd\x0c\x92\x02\xa0\x8c\x15\x4c\xf4\xef\xb8\
+\xf6\x21\x29\x76\xea\x1a\x84\x31\x43\x4a\x35\xe2\x8a\xe5\x8c\x91\
+\xb7\xd3\x4e\x72\x00\x6b\x22\x94\x33\x1a\xdb\x4b\x75\x19\x10\x14\
+\x00\x2e\xfd\x4b\xcf\x6d\x0c\xc4\x7f\xb6\xd2\x24\x7f\x83\xb1\x94\
+\xaf\x29\x32\x03\x6c\x88\x95\x69\x1b\x49\x8e\x93\xd3\x33\x66\x58\
+\xfd\x4b\x2b\x41\x18\xd8\xd2\x74\xa2\x0e\xaf\xd4\x01\x08\x7d\x10\
+\xec\xd1\x48\x62\x13\x0e\xee\x5b\x0e\x0d\x1e\xbc\x0d\x9a\x2c\x56\
+\x51\xc1\xc1\x15\x05\x20\xeb\xf4\xea\x53\x70\x17\x46\x58\x49\x64\
+\x08\x38\x5b\x05\xec\x07\xce\x00\x73\x89\xff\x10\x54\xff\xa5\xb3\
+\xdf\x85\xa5\x4b\x6d\x60\x68\xd3\x2b\x74\xe8\xb0\x7f\xa4\xbb\xbb\
+\x0b\x86\xf5\xc1\x9c\x60\x76\xd0\x7b\x89\x4a\x55\x06\xd1\x58\x3b\
+\xdc\x6b\xe6\x0a\x5e\x04\x07\x98\x09\xf1\x41\xa4\x0d\x0c\x06\xeb\
+\xae\x20\x2d\xcc\xdf\x4c\x4f\x2f\x51\x5b\x1f\x13\x2b\x5a\x53\x92\
+\x7f\x23\x49\x88\x3d\x5d\xba\xb8\x5c\x5a\xb1\xc2\x01\x9a\xf6\xe7\
+\x65\xec\xef\xde\x77\x74\x0e\x65\x30\x18\xc1\x97\x2f\xf7\xa4\x6d\
+\x25\xb2\xd6\xbd\x35\x57\x78\x18\xdb\x63\x64\x4d\xc4\x40\xc3\x9e\
+\x62\x7c\xf3\x65\x66\xfc\xa8\x6d\x4d\x9a\xa8\x73\x38\x91\x21\xf1\
+\x9b\x48\x3b\x18\x0c\x0e\x2b\xa0\xfc\x47\xad\x08\x86\x92\xa0\x2e\
+\xb2\xc0\xb5\x92\x54\x18\x3b\x49\x52\x70\x9a\x7a\x1e\xc1\xbe\xbe\
+\xbd\x65\x9f\x32\x17\x8d\x96\xbe\x07\xd3\x70\xbe\x63\x30\x38\x88\
+\xee\x6d\x65\xb5\xfb\xdd\xc3\x87\x9d\xa5\x11\x8d\x07\x53\x1e\x1c\
+\x3e\xbc\x46\xbb\x3f\x02\xda\xf4\xe6\xa3\x67\xdb\x5b\xb6\xf4\x16\
+\x00\xb6\x97\x76\x74\x0f\x26\x80\x4b\xff\x5e\xf5\x33\x83\xc1\x46\
+\xd7\x04\x6c\x2c\x00\x53\x3d\xbd\x6e\x64\x44\xf0\x5a\x9a\xa4\x92\
+\x78\x3b\x40\x4a\xc3\x39\x09\x00\xdb\x51\x1f\xe4\x01\x26\xa1\x1d\
+\xd4\x63\x64\x4b\xc4\xa4\xb1\x33\x10\x83\xc1\xf0\xda\xb0\x21\x2f\
+\x95\x8d\x58\xe4\xc9\xf3\x8a\x82\xe4\x5a\x05\x93\x11\xa8\xd9\x8a\
+\x89\x0c\x09\x99\x8d\xfb\x6a\xe0\x57\x2a\x80\x85\xb1\x2e\x46\x22\
+\xae\x39\xae\xa4\xad\x69\x8d\xf1\x2b\x7f\xd1\x5d\x86\xc1\x60\x90\
+\xf7\x91\x3c\x94\xd0\xdb\x57\xf7\xbc\x86\x07\xf3\x2a\x0c\x88\x8c\
+\x6b\x9d\x6c\xf1\x14\x45\x7a\xfa\xd4\xc0\x9d\xc6\xc0\x94\x7b\x07\
+\x0e\x6c\x46\x1b\xdc\x89\x10\xd4\xb9\x67\x63\x68\xd8\x6e\x55\xb1\
+\x62\x23\xb1\xda\xc5\x4a\xbd\x95\x6d\xbc\xcd\x64\x30\xbe\x5d\xab\
+\xb5\x0a\x4c\x21\x42\x33\xf3\xbe\x75\xd9\xb2\xf7\xd5\xdd\x3f\x55\
+\xaa\xd7\x48\xb6\x75\x97\x3d\xb2\xc7\x20\xab\xbd\x30\xc6\x62\xd0\
+\x1b\x3b\x74\x4f\xb7\x6e\x07\x15\xfd\x15\x6c\x31\xed\xa2\xde\xbd\
+\xab\xb4\xae\x4a\x95\x67\x10\xb0\xfd\x8c\x3a\x3d\x6f\x34\x2c\x49\
+\x4d\x64\x87\xc1\x60\x6c\xaa\x5d\xbb\xc1\xa6\x3a\x75\x7c\x50\x6f\
+\x47\x46\xf6\x15\x86\xe5\x0e\xc5\xb0\xe5\xa4\xb1\x22\xab\x12\x46\
+\x82\xfa\x30\xc2\x49\x52\x51\x2c\x86\xae\x48\x15\xfb\x48\x57\x8f\
+\x45\x8b\xf6\xe1\x99\x19\x8d\x1d\x19\x35\xea\xac\xfc\x9d\x3a\x1a\
+\x06\xdd\x49\x3a\x57\x72\x0b\x35\x18\x0c\x16\xa9\xfd\x23\x3a\x34\
+\x74\xc5\x8e\xd6\xad\xaf\xc8\xda\xad\x9b\x90\xf4\x3e\x74\xc9\xce\
+\x4e\xe9\x57\xae\xa2\xb6\xbc\x1a\x8a\xd0\x97\xa9\x09\x25\xdd\x43\
+\xea\x6f\x37\x55\x2d\x43\x2a\xe0\x36\xb2\xe1\x17\x6a\x77\xe7\x54\
+\x8a\x2f\x4d\x84\xe8\x2b\x14\x30\x18\x82\x0d\xcf\x90\x44\x4f\x49\
+\x5b\x1f\x5d\x42\x9f\x41\xc0\xe8\xce\xd6\xc6\x8d\xcb\xca\x55\xaa\
+\x89\x62\x6c\xa4\xcd\x48\xd5\xe6\x38\xf3\xdd\xa5\x56\x4f\x58\xe9\
+\xa8\xc3\xeb\x5b\xd9\xbc\xb0\xa6\x7c\x7f\x18\x0c\xcd\x1d\x46\xf6\
+\x4b\xd8\xa3\x47\xd5\x3c\x16\x2e\x74\x49\x5d\x3e\x80\xc1\x60\xc3\
+\x6b\x0f\x9a\x4a\x2a\xb5\x5a\xaa\xe3\x13\x26\x6c\x72\x9b\x36\xed\
+\x38\xc6\x8c\xa1\x2e\x56\x13\xe7\xb5\x58\xe9\x64\x49\xbe\x77\xf0\
+\xe0\x16\x8c\x77\xd5\xa8\x4c\xe8\x85\xe7\x71\x74\xce\x33\xcb\x99\
+\x73\xdf\x9b\x7b\xf7\x06\xe1\x79\x75\x91\x3a\x18\x0c\xae\xe5\x02\
+\x0d\xc1\x6c\x1a\x63\x6d\xc0\xd9\xa0\x11\x0c\xa9\x86\xb2\xe2\x1d\
+\x9f\x38\xd1\x0d\x63\xe3\x40\x3d\xcd\xde\x6b\x81\x6e\x6e\xeb\xe8\
+\x4c\x88\xed\xe9\x73\x2f\x53\xd3\xb4\xaa\x44\x33\x18\x0c\x8d\xc6\
+\x92\x45\x71\x66\xbb\xba\xa5\x41\x83\x7b\x32\xef\xb2\xa0\xd0\x02\
+\x72\x2f\xb7\x93\x41\x5e\x5d\xbb\x76\x37\x9e\xd7\x17\xff\x08\x0c\
+\x06\x1b\xdf\x88\x2f\xc9\xc9\xe4\xc9\xac\x2a\xab\x0d\xfa\x82\x5d\
+\x05\x20\x57\xc0\xa4\x0d\x35\x6b\xde\xc7\xf3\xc9\xe0\x5f\xc6\xe5\
+\xa4\x63\x86\x3a\x07\xd5\x12\xa9\x82\xc1\xe0\x6e\x40\x86\x1a\xee\
+\x7f\x5f\x30\x45\x36\x25\xb9\x88\x33\x5c\xf2\x33\x4f\xcf\x75\x78\
+\xa7\x52\x2a\xb1\xbf\xfa\xe0\x62\xbc\x67\xbc\x58\x88\x9a\x8a\x0c\
+\x04\xee\xc3\x30\xfe\x19\x5c\x25\xfe\x1c\x0c\x06\x57\x94\x23\x20\
+\xee\x4d\x86\x46\x86\x67\x55\xa6\x4c\xe8\xfb\xfb\xf7\x47\x0b\x2d\
+\xc0\xa8\x96\x2b\x41\x73\x85\x18\x5b\x28\x80\x9d\xed\xda\xed\xa6\
+\x7b\x78\x47\xd7\xfe\xf5\xaa\xc8\x60\xb0\x4c\xdc\x10\x5a\xd5\x14\
+\xb5\x68\x18\x5f\x38\xae\x03\xb4\x9b\x59\xa0\x05\xf3\xb3\x5b\x8e\
+\x8e\xdb\x2e\xae\x58\x71\x00\x5a\x8e\x0f\x65\x4a\xd8\x74\xbc\x1f\
+\x81\x70\x43\x58\x42\x6c\xec\x22\xea\x1e\x2b\xfe\x12\x0c\x06\x1b\
+\x5e\x25\x90\xfa\x20\xec\x81\x61\xbd\x46\x42\xf4\x25\x0d\x83\xdb\
+\x01\xa6\x84\x5e\xbb\x66\x43\x67\x40\xb0\xd7\xc7\xb7\x6f\x67\x60\
+\x35\x7c\x4d\xe3\x44\x9f\x35\x6b\xf6\x62\xbc\x89\x48\x13\x18\x0c\
+\xd6\xce\xfc\x05\x0d\x48\x16\x24\x27\x26\x92\x63\xa5\xa8\x00\x10\
+\x4c\x3f\x44\xab\x59\x78\x50\xd0\x10\xc5\xe3\x89\xab\xde\x96\x86\
+\x0d\x3d\xc9\xd8\xd6\x57\xaf\xfe\x08\xf7\x53\xbf\x6f\x3b\xc9\x60\
+\xb0\xe1\xe5\x06\xab\x83\x2a\x99\xb7\xa9\xce\xb9\x5c\x53\xaa\xd4\
+\x69\x45\xde\x81\xfa\xa2\x21\x8f\xf3\x3e\x25\x3e\x3f\x75\x77\x5f\
+\x4f\x32\x72\xb2\xb5\xd3\x60\x70\x19\x38\x99\xda\x33\x8b\xb4\x81\
+\xc1\x60\xbc\xf4\xf5\x2d\x8b\xb6\x4c\xc1\x72\xfb\x18\x80\x73\xdb\
+\x3e\xf0\x19\xdd\x43\xb8\xe8\x0a\x8c\xed\x37\x12\xa6\xc5\xd8\x0d\
+\x2d\xa7\xca\x3b\x5c\xcb\x8b\xb4\x81\xc1\x60\xc4\x47\x44\x8c\x40\
+\xb7\x19\x0f\x24\x47\xdf\xa1\x8a\x71\x32\x28\x14\xb8\xc6\x22\x17\
+\x73\x39\xc9\x82\xe3\x7e\x2b\x8d\x6d\xfb\xe5\x97\x0b\x0f\x8f\x1f\
+\xdf\x44\x72\xe0\x48\x15\x8b\xc7\xbb\x8f\x30\xbe\xc4\x58\x08\x23\
+\xf1\xef\x03\x83\xb6\x35\x22\xa3\xc0\x4d\xea\xfb\x83\x26\xb7\xf7\
+\xee\xdd\x06\x63\x52\x97\x05\x1d\xe8\xdb\xd7\x8a\xb6\x92\x48\x88\
+\x8e\x46\x4d\x5e\x30\x3d\x07\x7b\x80\x7d\xdc\x17\x2c\xd8\xa7\xb1\
+\xe2\xc5\x9b\x08\xf1\x2f\xeb\x36\xc3\xc6\x96\x8d\xb6\x3a\xa0\x17\
+\x69\xf0\x8b\x8c\x02\x1b\x9e\xd1\x6b\x7f\xff\x55\xbb\x3b\x77\xbe\
+\x7a\x76\xde\xbc\x31\x54\x29\x4e\x15\x08\x1b\xeb\xd4\x21\xe7\x49\
+\x35\x21\xb1\xbb\x63\xc7\x81\x64\x6c\xf0\x78\xc6\x22\xa5\xec\x3e\
+\xb4\x35\x67\x8a\x7f\x17\x18\xf0\xa8\xf9\x4b\x11\xd4\x67\x22\x23\
+\xc1\x86\x57\x06\x1c\x4d\x14\x80\x65\x89\x12\xf7\xc9\xe8\x56\x97\
+\x28\xd1\x43\xee\x34\x72\x2a\xe1\x04\xa5\x5a\x01\x9c\x2b\x33\x53\
+\x86\x60\x7c\x22\x56\xbc\xe6\x3f\xb6\x8a\x36\xaf\x70\x0d\xa9\xa8\
+\x92\x26\x19\x9a\x1d\xc1\xd2\xad\x9d\x09\x60\x78\x2d\x5d\x3a\x09\
+\xe1\x83\x78\x18\x1d\x65\xac\x3c\x00\x03\xc1\x14\xab\x52\xa5\x5e\
+\x25\x25\x24\xcc\xa3\x00\x3b\x1c\x2f\xad\x30\xf6\x41\xcb\xb1\x72\
+\xcb\x58\x88\x0a\x42\xa7\xc1\x48\x2d\xde\xa3\x4a\x11\xc2\x4e\x4f\
+\x4f\x2f\x49\x00\x06\x85\x0a\xc5\xd3\x7b\xd2\x10\xf3\x92\x42\x95\
+\x4c\xd2\xcd\x00\xf0\xb9\xb9\x8d\xa9\xe9\xde\x41\x47\x8f\xda\x57\
+\xe9\xd9\xd3\x3b\x4f\xc9\x92\x31\x2a\x95\xca\x48\x00\x6d\xcc\xcc\
+\xce\xe6\xd0\xd7\xf7\x98\xa6\x52\x7d\x8e\x7a\xf1\xc2\x05\x43\x45\
+\x2a\x75\xea\xe4\xd1\x77\xef\x5e\x87\xea\xfd\xfa\x9d\xcf\x96\x2d\
+\x5b\xed\x1c\x2a\x15\x55\xac\xff\x48\xbd\xf3\xd8\xe0\x30\x61\x43\
+\x54\x42\x34\xab\xd4\xa5\x8b\x9f\x00\x72\x15\x2a\x14\x8b\x4b\x1c\
+\x8c\xac\x11\xae\xfe\x78\x36\x0b\xbf\x44\x09\xba\x76\x22\x3d\xc1\
+\xc6\x46\xbb\x88\xb7\x58\xd9\xf6\x04\xec\xdb\xe7\x32\xe4\xd8\xb1\
+\x03\xed\x96\x2d\xbb\x8f\xb1\xec\xa5\x20\x6e\xd4\x60\xdc\xb8\x6b\
+\x78\x7e\xab\xb0\x10\xed\x71\x2d\x96\x2d\x7b\xf6\xcf\x41\x9e\x9e\
+\xad\x6f\xac\x5f\x9f\xa7\x8b\x9d\x9d\x73\x2b\x63\x63\x57\xac\x7e\
+\x25\xf1\x05\x39\x27\x95\xfc\xcd\xb9\x98\xd7\xa3\x42\xb7\xc0\x90\
+\xe7\x82\x97\x10\xca\x09\x7b\x74\xec\x98\x5a\x61\x78\x7f\xef\xde\
+\x94\xf9\x6e\x4c\xe5\x26\x74\x4f\xb4\x2c\x5e\xfc\xdd\xb6\xa6\x4d\
+\x1d\xd2\xb7\xb7\x17\x3b\xaa\xd6\x56\xa8\xe0\x68\x8a\x15\x8c\xe4\
+\xf9\x70\x7f\x1b\xd7\xc4\x95\x05\x0a\xbc\x96\x4d\xe7\x8d\xe4\x7b\
+\x7d\xc0\x94\xe3\xe3\xc7\xbb\x41\x57\xe5\x3c\x0c\x34\x91\xe6\x0c\
+\xd9\x2a\x0b\xe9\xec\x87\xdc\xcc\xcb\x02\xa0\x78\x1e\x85\x11\x4c\
+\x84\xe8\x4d\xff\x9d\x35\x25\x4a\x5c\xd1\xa1\xe6\x87\x0c\xda\x26\
+\x62\x82\x36\x83\x29\x9e\xa6\xa6\xce\xe7\xe6\xce\x9d\x28\xd5\xa9\
+\x12\xe8\xba\xb2\x60\xc1\x27\x2b\xf2\xe5\x8b\x86\x4e\x63\x52\x88\
+\x8f\x8f\x2d\x26\x6f\x09\x58\x50\xa4\x27\xd8\x81\xd2\xf1\xb1\x9b\
+\xdb\x46\xc4\xe0\xae\x43\x7e\x2f\x18\x72\x7b\x1e\xd1\xaf\x5f\xaf\
+\xd0\xd4\x43\x59\x24\x44\x29\x52\x18\xc3\x97\x5e\x10\x2a\x14\xc6\
+\x05\x79\x79\xd9\x41\xa2\xef\x16\xcd\x91\x0c\xa0\x7b\x0b\x00\xde\
+\xe5\xca\x30\xb4\x8f\xca\xb8\xbf\xa3\xe3\x76\xcc\x57\x59\xa1\x13\
+\x60\xa8\x30\x29\x6f\xa5\xeb\x39\x06\xcd\x09\xe7\x43\x89\xb8\xaf\
+\x9c\xac\xaf\xdb\x5b\xb5\x3a\x8f\x58\x90\x2b\xdd\x23\x5e\x74\x31\
+\x3e\x3c\x7c\x08\x26\x9d\xca\x4c\xa6\xa6\x7b\xbc\x8e\x8d\xae\x0a\
+\x38\x05\x34\x95\xec\xa4\x9d\x5b\xe9\xf2\xdb\x6f\xea\x9c\x4c\xac\
+\x86\xcf\x37\x54\xaf\xbe\x38\xec\xe1\xc3\xb9\x57\xed\xec\x76\xad\
+\x2e\x5e\xfc\xcd\x7d\x17\x97\x8d\x8a\xdc\xc3\xf1\x71\xe3\xf6\xd0\
+\x9c\xc9\xc6\x25\x1f\x75\x68\xbe\x18\xd7\xb7\x6c\x19\x8e\xc9\x53\
+\x97\x95\x60\x1b\xe3\x8d\xab\x01\x34\x1a\xdd\xbc\xd7\xac\xd9\xf7\
+\x29\x32\xd2\x0c\x9e\xb3\xd7\x50\xa7\x8a\x80\x66\xa3\xd9\xd3\xb3\
+\x67\x8b\x63\xb2\x43\xa4\x77\xec\x66\x86\x1c\xd4\xd9\xf0\x8a\x81\
+\x45\xbe\xf1\xac\x86\xe7\x92\x25\xce\xe8\xe8\x1a\xa6\x34\x16\x81\
+\x00\xed\xb9\x98\xb7\x6f\x17\x53\x89\x90\x00\xc6\x0b\x91\x03\xbb\
+\x91\x40\xcc\x59\xec\x45\x0b\x8b\x03\x96\xc5\x8a\xbd\x92\xef\xfa\
+\x49\x39\xf7\x2c\x06\x4f\x70\x49\x70\xea\xb5\xf5\xeb\x77\xa1\x47\
+\x9a\x39\xee\xf5\x1f\x9d\x3c\x39\xc6\x6f\xdb\x36\xeb\x35\xa5\x4b\
+\xaf\xa6\xc9\xa2\x55\x0e\xe3\x6d\x05\x00\x37\xf5\xfd\x65\xfa\xfa\
+\x09\x08\x1b\xdc\x71\x1d\x3a\xb4\x94\xf8\x06\x32\xac\x91\x21\xcf\
+\x57\x03\xc8\xf5\x99\xf8\x6f\xdf\xbe\x7d\x4b\xa3\x46\x97\xa0\xa1\
+\xe2\x7b\x76\xf6\xec\x0a\x8a\x91\x52\x7d\x1d\xcd\xd9\xc9\xa9\x53\
+\x4f\x60\x6c\x24\x42\x0a\x0b\xa8\x1d\x17\xce\x78\xde\xa7\x16\x2e\
+\x2c\xa6\x79\x76\xcc\xda\x86\x24\x5c\x56\xd2\x04\x1c\x0a\xe6\xc6\
+\x64\xec\x97\x5b\x92\x24\xd4\x6c\x05\x61\x82\x49\xb5\x2a\x87\x00\
+\xb0\xda\x3d\x40\x3e\xe0\x1b\xb9\xed\x69\x29\x83\xb0\x6f\x71\x25\
+\xe3\xcc\x2b\x27\xd3\x8a\x0e\xf4\xe0\xd0\x0c\x0b\xcc\x72\xaf\xec\
+\x16\xe0\x64\x39\x0f\xcd\x95\xd5\x8d\xe4\x1a\x68\x55\x83\xa1\x91\
+\xc8\x91\x01\x98\x0b\xec\x0a\x9a\x80\x0d\x35\x0c\x6e\x34\x18\xa5\
+\x03\x39\x9a\x8c\xeb\x0e\x0e\xb5\x1c\x9a\x37\xf7\x25\xef\x17\xa5\
+\x15\x85\xdc\xb8\xd1\x58\x48\x20\xe1\x36\x18\x0d\x2d\x5e\xc8\x82\
+\x4b\x95\x99\x81\x41\x6b\x0d\xe9\x80\x33\x02\xc0\xef\xac\xa4\x7b\
+\x49\xcf\x0c\x95\xfb\x66\xe3\x2b\xa8\xe9\x58\x51\x7a\x25\x24\x25\
+\x25\x35\x14\x1a\xd0\xee\x7f\x07\xc7\x4c\x31\x1c\x17\xa2\x70\x66\
+\xf7\xd2\x8d\x2f\x45\xae\xe7\x1a\xf9\xc0\xd5\xd5\x1e\x5d\x43\x5d\
+\xe9\x5c\xa1\x21\x76\x1a\x06\x55\xaa\xc0\x9b\xfb\xf7\x97\xc6\xe4\
+\x5a\x90\xeb\x99\xbc\x67\xe4\x54\xf1\x32\x33\xb3\xc2\xbb\x39\x21\
+\x82\x1a\x80\x95\x30\xce\x79\xf0\x60\x0f\x6c\x41\xef\xec\xef\xd9\
+\xb3\xc4\x1f\x42\xe8\x67\xf8\x16\x86\xa1\x82\x2e\xca\x39\x32\x3a\
+\x9c\xb5\xcf\x90\x1a\xd8\xb7\x6a\xea\x28\xb4\x83\x94\x31\xb5\xa4\
+\xdf\xd2\x1c\x39\xc6\x08\x9d\x00\x1b\x5e\x0d\x70\x0c\x68\x24\x24\
+\xa0\x38\x1c\x47\xf1\x38\xc4\xe8\x82\x68\xb2\x90\x03\x78\x1d\xe1\
+\x02\x6b\xbc\xb3\x80\xde\xb5\x32\x34\x6c\x4f\xe3\xfb\xba\x77\xf7\
+\x26\xaf\xdb\x87\x27\x4f\x56\xe3\xda\x14\x63\xce\x60\x0c\xb8\x80\
+\x8c\x4f\x64\x08\x18\xc9\xc9\xc9\x6d\xf6\xf7\xea\x75\x09\xde\x64\
+\x25\x34\x40\xba\x29\x26\xdf\x98\xdf\xb2\x68\xa9\x1c\x08\x27\x0b\
+\xcd\x4b\x69\xa1\x13\xe0\xb0\x41\x0d\x8d\x7d\x7f\x41\x2a\x29\xa1\
+\x89\xc4\x24\x45\x9c\x99\x39\x73\xb7\x3c\x43\xfc\x0a\xe6\x93\xef\
+\xec\xa7\x77\x9e\x7b\x7a\xda\x60\x35\xdc\x80\x9f\xe3\x61\x9c\xe3\
+\x0e\xf4\xee\xdd\x72\x75\x91\x22\x4a\x11\xe6\x5d\x30\xe3\x54\x89\
+\x79\x87\xd2\x2d\x31\x2e\x6e\x19\x39\xc2\x0e\xf6\xeb\x77\xf8\xea\
+\xba\x75\xc3\x34\xe6\xb0\x22\x58\x0d\x2c\x4b\x55\xe7\x28\x15\x1a\
+\x43\x3b\x14\x6c\x2d\x4f\x8b\xac\x05\x43\x3a\x44\x52\x70\x3d\x0d\
+\x8e\xc3\xcf\xaf\xc1\xaf\x0e\x4d\x9b\xde\x92\x2b\xd7\x2c\xb0\x9a\
+\xc6\x64\x96\xa4\x2d\x26\xce\x07\x41\xb6\x15\x2a\x5c\x55\xce\x71\
+\x76\x95\x2a\xd9\xfb\x6c\xd8\x60\x04\x71\x9d\x77\x38\x03\xc6\x63\
+\xf5\x3b\xf8\xcc\xcf\xaf\x80\x90\xc8\x98\x33\x04\xf7\x33\x07\xdb\
+\x81\x13\xc1\x81\x32\xc9\xa1\x39\xcd\x87\x16\x29\xae\xf7\x55\xaa\
+\x8d\x0d\x11\x59\x07\x86\x69\x8d\x1a\x39\x77\xb4\x6c\x79\x42\xd1\
+\x5c\x24\x27\xca\x85\x65\xcb\x76\xca\x6c\x93\xee\xa0\xbe\x96\x81\
+\x9a\xc8\xd5\x4f\xfd\x3e\xa4\xdf\x42\xe9\x7a\xd1\xdc\x7c\x17\x9e\
+\x39\xd1\xe4\x52\x7c\x0f\xbf\x37\x4f\xcb\x50\xc7\x82\x9e\x8b\x85\
+\xc8\xe0\xc6\x17\x9c\x46\x06\x89\xbe\x39\x88\xe5\xad\x3f\x39\x69\
+\xd2\x96\x83\x03\x06\xec\x74\x6c\xd7\x6e\xbf\x63\x9b\x36\xe7\x90\
+\xe4\x70\x13\xce\xb0\x23\x59\x1c\x20\x67\x50\x95\xb2\x5a\x73\xb1\
+\x66\xcd\x87\x64\x3c\x10\x3d\x3d\xa5\x28\x0f\x6b\x42\x56\x2d\xbf\
+\x52\x0c\xf3\xd8\xd8\xb1\xce\x10\x38\xf5\xa5\x7b\xf4\x5f\x3b\x29\
+\xd3\x8f\x3c\xf1\xbb\xd3\x41\x03\xf9\x3b\xca\xd5\x8a\x7e\xc7\xd6\
+\xc8\xa8\x8d\xc8\x50\x30\x64\xf8\xa7\x0f\x38\x04\xfc\x1d\x9c\x04\
+\xce\x04\x17\x82\xc6\xba\x53\x92\xc5\x9a\x8b\x93\xa9\x3d\x53\xec\
+\xfb\xf7\xa3\xbf\xf1\xed\x59\x8f\x12\x6a\x29\xe7\x92\x32\x1c\xa8\
+\xd9\x05\xf2\x02\xef\xd2\x76\x85\x56\x48\xeb\x32\x65\x1e\x27\xc5\
+\xc7\xd3\xca\x58\x5a\xae\x86\x0b\x29\x0e\x04\xce\x89\x78\xf6\xac\
+\xce\x0b\x6f\x6f\x52\x1d\x1e\x26\xb2\x1a\x1c\x8f\xd5\xa1\x15\x8e\
+\x27\xa3\x11\xd8\x4c\x7c\x03\x4f\xce\x9c\x31\xbe\xbb\x6f\xdf\x56\
+\xfa\xc6\x0c\xbe\x79\xb3\x34\x8c\x2d\x41\x8a\xe5\xc4\xbc\xf2\xf7\
+\xb7\xa6\xdf\x17\x12\x6b\xab\x55\xab\x85\x33\xdd\x53\x7a\x0e\x06\
+\xde\x39\x78\xb0\x95\x34\xc6\xbf\x09\x06\x83\x8d\xb2\x82\xf4\x58\
+\xe6\xc7\x79\xec\x67\x19\x0f\xfa\x0a\x2f\x19\x79\x33\x07\x68\xf7\
+\x62\x0b\x3c\x73\x66\x05\x6d\x25\xad\x0d\x0d\x03\xbe\x77\x2b\xc3\
+\x60\x30\x64\x2e\xe5\xa1\xc1\x83\x77\x51\x2b\x5f\xa9\x2a\x9c\x53\
+\x68\x01\x5b\xcd\xa3\xe0\x97\xc7\x27\x4e\x6c\x94\xed\x9f\xfe\x01\
+\x18\x0c\x5e\xf1\x3a\xc8\x80\x78\x09\x79\x6e\x33\xc7\xaa\xb7\x02\
+\xcc\x6f\x22\x84\x3a\x40\x4e\x8e\x15\x3c\x1f\xfe\x77\xa5\x08\xc0\
+\xcd\xf8\xef\x4c\x4a\x25\x39\x9a\xc1\x60\x68\x86\x0e\xe0\x50\xd9\
+\x21\xe3\x7a\x6f\x70\x7d\x8e\xc0\xf8\x47\xc4\xf3\xa8\x29\x7d\x71\
+\x2d\xc3\x32\xc0\x3b\x53\xc0\xd3\x44\xdc\x4f\x04\x73\xab\x4b\x4f\
+\xf4\xf4\xae\xc9\x73\xdf\x71\xf1\xa7\x60\x30\xd8\xf8\x9a\x5e\x5e\
+\xb5\x6a\x3f\xaa\xc8\xdf\xc9\xf6\x4d\x11\xe7\x4d\x4c\xe6\x68\x6f\
+\x45\x61\x64\x27\x64\x20\x36\x5e\x43\x9d\xea\x18\x3d\xdb\xda\xa4\
+\x89\x2b\xdd\xa3\xe4\xc4\xfa\xaf\x5b\x3b\x31\x18\xdc\x3d\xb4\x69\
+\x42\x4c\x8c\xf1\x91\x91\x23\xcf\x52\x5d\x9d\x34\x28\x4b\xed\xec\
+\x16\x68\x75\x5c\x8b\x0b\x0b\xb3\xa0\x8c\x16\x14\xc4\x7a\xca\xf8\
+\xde\x21\x5c\x13\xd6\x56\xaa\xf4\x9c\xe2\x79\x7f\xdf\x85\xcd\x60\
+\x70\x13\xc3\x5e\x6f\x03\x02\x2c\xb7\xb7\x6c\x79\x1d\xc5\x91\x4e\
+\x1a\x8d\xeb\x77\x83\x29\xaf\x6e\xde\xb4\x92\xa9\x49\x75\xc1\x9e\
+\xf6\xf5\xea\x3d\x50\x82\xea\x0f\x8e\x1c\xb1\xc7\x58\x1a\xb3\x52\
+\x18\x0c\x36\xbc\x52\x32\xdb\x61\x89\xe2\x58\x81\x7c\x00\xe9\xe9\
+\x7f\xbd\x77\xe0\xc0\x70\xa1\x01\x48\x7d\x9f\x22\x83\x43\x1a\xd2\
+\x0d\x2a\x1d\x12\xdf\x0d\x06\x83\x0d\x2f\xaf\x90\x40\x6e\xdf\x28\
+\x32\x2c\xd4\xd3\x05\x2a\xb5\x5c\xb8\xaf\x83\x2e\x32\xa1\x28\x98\
+\xfc\xf4\xfe\xe1\xc3\xd5\x64\x9c\xc6\x42\x94\xc3\xf8\x3a\xd0\x13\
+\xdb\xd0\x03\xb8\xb6\x13\x69\x07\x83\xc1\xf2\x01\x7b\xbb\x75\xbb\
+\xac\x64\xb2\x83\x21\x60\x3c\xdd\x1f\x1d\x3d\xfa\x34\x9e\xf7\xc0\
+\x7d\x45\xd9\x3b\x2d\x05\x5e\x4b\xa5\xee\x2b\x09\xec\x24\x74\x12\
+\x0c\x56\x5e\xd6\x51\x40\xe2\x3b\x66\xa8\x9b\xdb\x92\x9e\x5b\xb7\
+\x3a\x56\xe9\xd1\xe3\x54\x9e\x62\xc5\xa2\x30\x9c\x2b\x07\xca\x7a\
+\x3a\x58\x5a\xfa\xe0\x67\x4f\xd0\x06\xef\x15\x68\x3a\x6b\x96\xcb\
+\x92\xcf\x9f\xad\x26\xde\xba\x65\x9d\xa7\x78\xf1\x28\x55\xb6\x6c\
+\x2e\x30\xc4\xb3\xe0\x40\x91\x26\x30\x18\xbc\xd2\x35\x04\xc7\x3c\
+\x39\x7b\xd6\x16\x89\xcf\xea\x2a\x04\xb4\xee\x75\x90\xad\x9d\x12\
+\x6d\x8c\x8c\x82\xf1\x7c\x8e\x74\xaa\xd4\xf7\xdd\xb0\x61\x95\x56\
+\x9d\xd7\x12\x91\x66\x30\x18\x6c\x78\xd9\xd1\xa4\x7e\x3a\x55\x20\
+\x04\x5d\xbe\x3c\x5a\x00\x38\xcf\xc5\xa3\x93\x4c\x48\x5c\x5c\x5c\
+\x59\x21\x61\x53\xb1\x62\x77\x32\x34\x28\x56\xbd\x77\x19\x3a\xf4\
+\x9c\x97\xa9\xe9\x54\xf1\x7d\x60\x30\x38\x5b\x05\x6c\x0f\x76\x15\
+\xc0\xba\xaa\x55\x3d\xa4\xaa\xb0\x05\xae\x45\x41\x43\xd0\x9b\xc6\
+\xae\xd8\xd8\xec\x91\x55\xce\x24\x1d\xd0\x00\xcb\xdc\x7a\x29\xfb\
+\xb7\x00\x4c\xab\xe4\x37\x83\xc1\x78\x78\xe4\x48\x67\x65\x9b\x49\
+\x54\x7a\xda\x41\x4d\xec\x91\x94\x0b\xcf\x86\xb1\xe1\x8a\x7c\x1f\
+\xe9\xaa\xc8\xf7\x3e\x9a\x08\xd1\x53\x30\x18\xec\x34\xf9\xdb\x32\
+\x01\xb5\x2e\x6d\xdc\xe8\x3b\xfe\xe6\x4d\xcb\xce\x36\x36\x7b\x2b\
+\x77\xef\xee\xaa\x87\xa2\x57\x95\x9e\xde\x97\xae\x76\x76\xe7\xf0\
+\xca\xd9\x05\x2a\x55\x3e\x5c\xb7\x82\xaa\x6a\x90\xef\x5b\x1c\x1f\
+\xbf\xa6\xdb\x86\x0d\xbb\xf5\xf3\xe6\xfd\xa2\xa7\x52\x1d\x86\xf1\
+\xfd\x24\xb4\x40\x79\x9a\xb2\x75\x14\x83\xc1\x90\xc6\x56\x18\xfc\
+\x4c\xaa\xce\x88\xd3\x8d\x7e\x7b\xf7\x6e\x5f\xe7\x5f\x7f\x55\xab\
+\x44\xef\xed\xda\xd5\x87\x64\x03\x34\x5b\x3b\x41\x06\x3c\x9c\xae\
+\xe8\xfe\x73\x03\x67\xc0\xb1\x0f\x0e\x1f\x5e\x43\xf7\xd0\xe3\x77\
+\x4c\xc5\x90\x77\x82\x81\x1a\x43\x0c\x06\xe3\xe8\xef\xbf\x1b\xc3\
+\x80\xde\x6b\xc4\xe9\x52\xec\x2a\x57\xbe\x81\x66\x23\xcb\x14\x7d\
+\x7d\x13\x21\x3a\x2a\x71\xbb\xcb\x96\x96\x7b\xf1\x7e\x28\x19\xea\
+\xf2\x3c\x79\x76\x21\x21\xfa\x33\x52\xc9\xfc\xa5\x91\x95\x06\x3d\
+\x40\x4b\x30\x05\xe9\x63\xe7\x29\x0e\x28\x14\x30\x18\x82\x1d\x28\
+\xb5\xe2\x23\x22\x4c\x4e\xcf\x9c\x79\x04\x92\xde\x17\x5c\x87\x0d\
+\xdb\xf3\xe5\xcb\x97\xa5\x18\x6f\xa1\xb1\x5a\xe5\x46\x45\x42\x24\
+\x32\x53\x62\xdc\xa6\x4f\x1f\x97\x10\x1b\xbb\xe8\xf0\xf0\xe1\x27\
+\x51\x1e\xa4\x0e\x92\x1f\x1a\x34\x88\x0c\x4b\x8f\x94\xa0\xcd\x72\
+\xe4\x78\x40\x63\x44\xa8\x59\x39\x69\x95\x0a\x31\x18\x0c\x12\x9d\
+\x05\x7b\x80\xf3\xc1\xb9\x60\x0d\xa1\x05\xc8\xc1\x2d\xa7\x54\x30\
+\x29\x6c\xe4\x74\x6a\xda\x34\xd3\x37\x77\xee\xac\x41\x2e\xe6\xf5\
+\x60\x6f\xef\x55\x4a\x2f\x35\x84\x10\x76\xc9\x52\xa0\xcf\x52\xa5\
+\xf8\x10\xae\xe5\x45\xda\xc0\x60\x70\x1b\xae\xa7\x1e\x1e\xd6\xe8\
+\x2a\x7a\x93\xe2\x76\x64\x54\xb8\xbe\x7e\x79\xed\xda\x34\x92\x89\
+\x13\x00\x29\x0f\xc3\x83\xf9\x1e\x8a\xd0\xef\x61\x8c\x56\x8e\xad\
+\x5b\x5f\xa7\x6a\x04\x18\x5d\x24\xde\xff\x8e\x95\x8e\xc1\xe0\xde\
+\x77\x53\x70\xbe\x5b\x8e\x56\xca\x87\x1c\xdb\xb6\x3d\x14\x70\xfc\
+\xb8\x21\xc6\x72\x28\x7a\x98\x60\x8a\xcf\x9a\x35\x7b\x31\xd6\x05\
+\x1c\x49\xa5\x3f\x38\x27\xba\x84\x87\x86\x96\x13\xdf\x05\x06\x83\
+\x0d\xaf\x1c\xd8\x5d\x4a\xb3\xd7\x55\xce\x79\x60\x3c\x64\xd9\x03\
+\xa5\xc8\x51\x36\xf9\x6e\x75\x70\x02\x58\x4d\xa4\x0f\x18\x0c\xc6\
+\x5c\x21\xf2\x61\x3b\xf9\x19\x9d\x5c\x5f\x3e\x38\x7e\xbc\xbe\xc8\
+\x58\x30\x18\x8c\x13\x93\x26\x6d\x20\x99\x3e\x18\x1e\x85\x19\x1c\
+\xc0\x3e\x19\xd4\xb7\x9c\xc1\x99\x26\x8c\x1e\x9b\x36\x6d\x6c\xbf\
+\x72\xe5\xfe\xc2\x15\x2b\xbe\x43\xb9\x0f\x55\x98\x1f\x01\x57\x88\
+\x8c\x03\x83\xc1\x71\x3d\x70\x41\x74\x68\xe8\x8a\x9b\xdb\xb7\x6f\
+\x8b\xfd\xf0\x21\xdd\xbb\x81\x32\x18\x2a\x50\x82\x21\x63\x72\xe5\
+\xc1\x2a\x60\x14\x56\xbb\xab\xe2\xc7\x00\x83\xc1\x3d\xd8\x32\xe1\
+\x0b\x8d\xc1\x60\x50\x20\x1d\x41\xf3\x27\x30\x3a\x3f\x30\x23\x45\
+\x6a\x19\x0c\x06\x79\x38\x91\x46\xf6\x1a\xfc\xb4\xad\x49\x93\x9f\
+\x44\xc6\x82\xc1\x60\xbc\xbd\x7f\x7f\xe2\x2b\x3f\x3f\x92\x61\x6f\
+\x2b\x24\x18\x8c\x0c\x92\x08\x67\x94\xa8\x51\xc3\x19\x97\xfa\xe0\
+\x75\x91\xfe\x60\x30\x18\x24\x54\x0b\xda\x64\x42\xc2\x33\x83\x03\
+\xdf\x8c\x14\x21\x16\xe2\x32\x53\x2f\x07\x54\x1a\x32\x16\x0c\x06\
+\xc3\x7d\xc1\x82\xa6\xa8\x44\xb8\x06\x09\x87\x8c\xd6\xc2\x64\xf0\
+\x19\x8e\xd1\x61\xe5\xca\x7b\xb8\xec\x01\xa3\xc5\x0f\x01\x06\x83\
+\xcf\x81\x27\xb1\x3c\x5e\xc4\xb5\xa1\xf8\xd7\x81\x41\xba\x8d\x13\
+\x48\x1a\x4e\xe8\x04\x18\x79\x4b\x96\xf4\x55\x09\xd1\x4a\xa8\x54\
+\x9e\xd4\x09\xc8\x58\x08\x23\xf1\xef\x01\x43\x0a\xa3\x3e\xc4\xb5\
+\x8b\xc8\x72\x30\xd0\xff\x6e\x23\xcd\x89\xa6\xb8\x2d\xb8\xef\x5f\
+\x92\xb1\xc2\x38\x39\x75\xea\x09\x48\x85\x47\xcb\x09\x3e\xb9\x58\
+\x88\xca\x22\x4b\xc0\xa0\x5e\x77\x30\xae\x38\x8b\x5c\xb9\x3e\x9e\
+\x9d\x3d\xfb\x08\xfa\x22\x38\x6c\xaa\x53\xe7\xa6\x54\x8d\x3e\x29\
+\xfe\x15\xe0\x0c\xf9\x4e\x90\x17\x78\x0e\x61\x9d\xcf\x10\xce\x49\
+\xc6\x84\x93\xf1\x15\x9d\x29\x44\x2e\x91\xa9\x60\xc8\xde\x07\x4a\
+\xff\xbb\xd9\x60\x8f\xcf\x9f\x3f\x4f\x75\x68\xda\xf4\x16\x8d\x9b\
+\xe5\xca\xd5\x48\xfc\xf0\xe0\x49\xee\x07\xa6\xec\xeb\xd1\xc3\xfb\
+\xa9\xbb\xfb\xfa\xd3\x33\x66\x1c\x40\xbb\xdf\x3d\xd4\xe8\x10\x1c\
+\x37\x50\x08\x3d\x91\xe1\x60\x98\x08\xd1\x5c\x11\xb4\x75\x1e\x38\
+\xf0\x38\x35\x2e\x11\x12\x07\xfa\xf5\xb3\xa5\xf1\x3d\x5d\xba\x18\
+\xcb\x39\xdb\x8a\xb9\xb1\xc3\xb5\xb0\xf8\xe1\xc0\x06\xf7\xdc\x3c\
+\x57\xae\xa8\xe8\x97\x2f\xcd\xa9\xbf\x1a\xf8\xfb\xc9\xc9\x93\x47\
+\x91\xce\x87\xdc\x66\xfa\x83\xad\x44\x46\x82\xe7\x80\x9c\x57\x37\
+\x20\x46\x1b\xbf\xb1\x56\xad\x47\xe8\xe6\x9a\x8c\xb1\x6e\x78\xa4\
+\xc2\xd5\x00\x73\x71\x90\xe6\xe2\xfa\xe6\xcd\x73\x05\xb0\x4c\x5f\
+\x7f\xaf\x9c\x9b\x47\x3f\x60\x09\x10\x3b\x4d\xce\xcc\x9a\x75\x14\
+\x86\xd6\x41\x48\x58\x95\x2b\x37\x8b\xc6\x37\xd6\xac\xf9\x18\x7f\
+\x04\xb1\x52\x18\xd5\x29\x7d\x3d\x66\x0c\xf2\x0e\xc3\xd0\xc6\x80\
+\x0b\x69\x1e\x0e\x8f\x18\x71\x2e\xe6\xed\x5b\x63\x9b\x72\xe5\x42\
+\xa5\x41\xbd\xc7\xb3\x60\xd9\x11\x88\x54\xc5\xfa\x0b\x00\x5b\xcc\
+\x4d\x34\x76\x64\xd4\xa8\xfd\x18\xa3\x36\x5d\x4d\xc0\x36\x42\x03\
+\xd2\x58\xe7\x80\x1d\x84\xce\x80\x91\x2d\x5f\xe9\xd2\x21\x1d\x56\
+\xad\xf2\xc6\xcd\x65\xa5\x96\x2b\xe6\xe5\xcb\xf9\x06\x05\x0b\x86\
+\xfd\xee\xe3\xb3\x7f\xd2\xdd\xbb\x1b\x0d\x5b\xb6\xf4\xcb\xa6\x52\
+\x0d\x40\x94\xfc\xe1\x12\x7a\x25\x5d\xc0\x28\x25\x84\x91\x4a\x88\
+\x8d\xe0\x0a\xbd\x9c\x39\x13\xda\x9a\x9b\x5f\xc9\x57\xa2\xc4\xfa\
+\x81\xce\xce\x96\x95\x3a\x75\xf2\xd1\xcf\x9f\x3f\x29\x67\xee\xdc\
+\x02\x3f\x9f\x1f\xe9\xe9\x79\x48\x08\x11\xb0\x50\x88\x12\x21\x57\
+\xaf\x0e\x45\xf8\xe0\x4d\xf7\xcd\x9b\xef\x60\x2c\x36\x45\x08\x73\
+\x5c\xbd\x60\x5c\x47\xc9\xf1\x22\x57\x4d\x3a\x83\x4f\x03\xdd\x31\
+\x67\xdb\x84\x6e\x80\xf1\xcc\xd3\x73\x1d\x56\xb7\x7a\x42\x02\x93\
+\x63\x4d\xab\x1b\xf4\xfa\xef\x5f\x5d\xb7\x6e\x10\xd4\x88\xd7\xe3\
+\xf9\x28\xe7\x41\x83\x3c\x69\x1c\x0d\x30\xec\x44\xba\x81\xe1\xb7\
+\x65\xcb\x12\x5b\x23\xa3\x17\xb4\x62\xc1\x3b\x19\x02\x83\x2a\x86\
+\xf9\xc8\x05\xfe\x0e\x9a\x4a\x2e\x06\x5b\x49\x43\x5a\x07\xa6\xdc\
+\xd8\xbc\xd9\x11\x63\x0d\x04\xf0\xe8\xf8\xf1\x16\xe8\x22\x14\x47\
+\xca\xd2\x1b\xaa\x57\x37\x12\x12\x3b\xdb\xb7\xdf\x2d\x3b\x0a\xd9\
+\xe2\xdd\x9c\x42\x27\xc0\x5e\xca\x61\xa0\x4a\x00\x08\x09\x54\x85\
+\xc1\x25\x22\x4c\xf0\x49\x23\x06\x94\x88\x43\x7c\x01\xe8\xf3\x07\
+\xae\x2a\x5c\x38\x82\x1a\x68\xe0\xfd\x3c\x22\xbd\xc0\x5e\xe2\x4a\
+\xf0\x44\xce\xf2\x30\x36\x76\xd9\x58\xbb\xf6\x15\xf7\xf9\xf3\x0d\
+\x35\x9e\x15\x96\xe2\xb5\xb9\x85\x04\xce\x73\xaf\xd1\x66\xeb\x35\
+\xc6\x26\x2a\xf3\x86\x79\x19\x43\xf3\xe5\x32\x64\x88\x07\xc6\xba\
+\x09\x80\x0c\x17\xef\x46\x59\x95\x2e\xfd\x26\x29\x21\x61\x9e\x74\
+\xc2\xe8\x02\xb8\x8d\x2f\x75\x8f\xa1\xc0\x37\x78\x92\x9c\x25\x8f\
+\xdd\xdc\x36\x3a\x0d\x18\xe0\x45\x93\xb8\xbb\x4b\x97\x4b\xa4\x52\
+\xec\x3c\x64\xc8\xef\xcf\x3c\x3c\x68\x35\x6c\x29\xb7\x2c\x9d\x64\
+\xc3\x0b\x6f\xd0\x01\x6c\x21\xbe\x17\x3c\x07\x39\xc0\x36\xa0\x31\
+\xd8\x4c\xfc\x09\x56\xe4\xcf\xff\x80\x9a\x93\xb8\x0e\x1d\xda\x57\
+\xce\x43\x5e\x30\x14\xe3\x61\xf2\xcb\x30\x9f\x1c\xdf\x0c\xa6\xec\
+\xea\xd4\xc9\xd7\x75\xc4\x88\x09\x3a\xe4\x6d\x66\xc0\x70\x4c\x94\
+\xcc\x86\xad\x8d\x1a\xdd\xc6\xa4\x8d\xd8\xdf\xab\xd7\x62\x7c\x3b\
+\xbe\x96\xde\xcb\xc2\x60\x79\x70\x20\xa8\xa7\x6c\x6b\x10\xb7\xfb\
+\x88\x6d\x50\x20\x8c\x34\x49\xae\x86\xe3\xc4\x77\x83\xf1\x77\xb6\
+\x7d\x37\xec\xed\x47\x58\xe4\xc9\x13\x2b\xe7\xeb\x29\x98\x00\xa6\
+\x78\x99\x99\x39\xd1\x97\xa1\xdc\xa9\xd4\xc5\x98\xe2\x65\x56\x18\
+\x08\xd6\x11\x59\x0f\xc6\x23\x2f\xaf\xa2\x07\xfb\xf5\x3b\x8b\xe6\
+\xf3\x89\xe4\x91\x5c\x9e\x37\xef\xfe\x7d\xdd\xbb\x57\xc4\x04\x2e\
+\xf1\xdd\xb0\x61\x34\x0c\xe9\x77\x0d\xaf\xe6\x78\x30\x65\x75\xd1\
+\xa2\xcf\x43\xaf\x5f\xb7\xa1\x33\xc6\x87\x27\x4f\x56\xaf\xad\x58\
+\x31\x48\x6e\x43\xf7\x60\xc2\x6b\x8a\x8c\x02\x1b\x65\xa1\xe7\x5e\
+\x5e\xcb\xb1\x03\x39\x8b\x34\xb0\x53\x34\x17\x38\xbf\xc5\x24\x44\
+\x47\x53\xbf\x84\xec\xf2\x1c\xee\x45\xf3\xb8\xab\x43\x07\x5f\x74\
+\x7c\xdd\x7f\xa0\x4f\x9f\xf3\x50\x96\x4e\xa6\x2f\x48\x8c\x97\x14\
+\x12\x5a\x73\xba\x28\x13\x93\x1d\x58\x8f\x11\xec\x4d\x1a\x1c\xb4\
+\xc2\xc9\x30\x40\xb4\xb5\xa1\xe1\x4a\x5c\xef\xd3\xb9\x41\x00\x34\
+\x21\x78\x16\x81\x16\xbe\x21\x71\xe1\xe1\x16\xf8\x9d\x41\x60\x19\
+\xb0\x72\x54\x68\xe8\x94\x65\x39\x73\x26\xaa\x5b\xfb\x16\x2c\x68\
+\x2c\x80\x3f\x84\xc8\x98\x73\x03\xcf\x57\x71\x70\x54\xa8\x9f\x9f\
+\xe9\x96\x86\x0d\x6f\x43\xac\x28\xe9\xd8\xf8\xf1\x03\x31\x37\xcd\
+\x30\x5f\x43\x69\x0e\xec\xeb\xd6\x7d\x80\x77\x4c\xe4\xae\x64\x1c\
+\xfa\xe2\x1d\xa1\x71\xcb\x62\xc5\xd6\x0a\x2d\xc0\x10\xb7\xcb\x55\
+\xf0\x05\x7e\x7f\x90\xc8\x34\xf0\x44\x96\x05\xc7\xdd\xda\xb5\xcb\
+\x01\xdb\xc9\x60\x65\x3b\x02\xed\xfd\x13\x18\xaf\x88\xfb\x3e\xb2\
+\x43\xa8\x33\xc5\xed\xb4\xb7\x43\x58\x19\x3f\x2c\xcf\x97\x2f\x26\
+\xfa\xd5\xab\xe9\x78\x2f\xa7\x4c\x8a\xde\x40\x67\x44\x91\x11\xe0\
+\xf9\x52\x81\xa3\x3e\x45\x46\x9a\x63\x25\x9b\xaa\xb9\x85\xdc\xdd\
+\xb9\xf3\x55\x3c\x33\x12\x12\x8f\x4f\x9e\xfc\x45\xc6\xf3\xae\x0a\
+\x2d\x24\x25\x25\x35\x42\x67\xd8\x73\xf4\x1c\x0e\xb3\x0b\x22\xd3\
+\xc1\x93\x58\x17\x9e\xb3\x39\x94\x40\x8b\x6d\x4b\x20\xbc\x5c\xf3\
+\x31\x66\x80\x09\x99\x01\xa6\x3c\x39\x7b\x76\x29\xbd\x27\xb4\x80\
+\x6a\xe7\xb5\x64\xac\x78\xd6\x4e\x06\x5d\x95\x8c\xf7\x70\x5c\xa7\
+\x82\x19\x53\xf0\xca\xf3\x55\x03\x2c\x74\x64\xf4\xe8\x0d\xd8\x5e\
+\x46\x91\x97\x19\xd9\x43\xf1\xe4\x75\xd6\x48\x1d\xeb\x49\x73\x81\
+\xad\xa8\x67\x2a\x73\x9e\x0d\xe7\x75\x6f\x6a\x68\x02\xc3\xdc\x80\
+\xfb\x12\x22\xf3\xc1\x07\x78\xb0\xbd\x8c\x01\x35\x14\x00\xb6\x23\
+\x03\x69\xd2\xb6\x35\x6b\xb6\xfd\x1b\xbf\xd3\x08\x1c\xbf\xfe\xe7\
+\x9f\x4b\xd3\x96\x14\xee\xeb\x90\x6b\xeb\xd7\xef\x82\xdb\xfa\x8d\
+\x34\xbe\x00\x6a\x74\x2f\x32\x0a\x3c\x67\x4d\x3f\xbe\x79\xb3\x8c\
+\x72\x62\x61\x78\xb1\x30\xa0\x77\x32\x21\x7a\x03\x98\x84\x94\xb0\
+\xd8\x60\x1f\x9f\xd5\x64\x60\x42\x03\x34\x27\x6a\x8f\x66\xfb\xf6\
+\xb4\x2a\x0e\x17\x59\x0a\x9e\xc4\x82\xca\x6a\xb6\x65\xfc\xf8\x1c\
+\x96\x25\x4b\xbe\x93\x49\xb6\x23\xc4\x37\xb0\x48\x88\x32\x70\x5d\
+\x87\xde\x73\x76\xde\x92\x9c\x9c\xdc\xcf\xba\x5c\xb9\x60\x72\xc8\
+\x60\xc2\x63\xe4\x8a\x77\x0c\xd7\x0c\x12\x48\x65\xa7\x0a\x58\xf7\
+\xd6\xce\x9d\x76\xab\x8b\x15\x7b\xad\xec\x32\xb0\xd5\x0f\x92\xbb\
+\x8f\x3e\x5a\x0e\x93\xec\x98\x8f\x7b\x58\x15\x3f\x86\x3f\x7d\xba\
+\x02\xcf\x8b\xfd\xa9\x7c\x7b\xe6\x82\xe1\xe7\xe0\x30\x77\x65\xc1\
+\x82\x91\x14\x06\xc0\x04\x5c\x00\x17\xc8\xec\x14\x03\xad\x89\x9f\
+\x00\x8e\xc5\x36\x65\xb8\x12\x94\x8d\x08\x0a\x5a\x45\x8d\x0f\xe9\
+\x1e\x71\xa3\xa1\x22\xa3\xc1\x6d\x96\x17\x04\x5d\xbc\x68\xf7\xe2\
+\xd2\xa5\xb5\x5f\xbe\x7c\x59\x2a\x83\xe5\x06\x5a\x21\xa1\x29\x34\
+\x1f\xc7\x27\x4e\x74\xc3\xb3\xae\xe2\x4f\x20\xe7\xfa\x84\xb1\x10\
+\x15\x44\xe6\x81\xdd\xd2\xef\xee\xdd\x5b\xea\xd8\xa6\xcd\x0d\x64\
+\xb5\xab\x33\x52\x68\xeb\x82\x42\xc9\x5a\x5a\xef\x15\xc1\x19\xb0\
+\xb8\x66\x50\xd6\xd3\xc4\xa4\x39\x3c\x6a\x89\x08\x21\xbc\xc0\x19\
+\x31\xe3\x63\x76\x3c\x57\xb9\xc1\xc6\x60\x3b\xb0\x36\x98\x8d\x1c\
+\x5f\xb2\x82\xfc\x27\xb0\x30\xf8\x61\x55\xd1\xa2\xaf\x92\xe2\xe3\
+\x17\x50\x4a\x99\xd0\x86\xac\x58\x90\xde\x4c\x47\x30\x79\x6d\x85\
+\x0a\x99\x1c\xcf\xe3\x89\x2c\x00\x8e\xf9\x14\x1d\x6d\x1e\xe2\xe3\
+\x63\x4b\x57\x3a\xef\xa5\xb2\x05\xb1\x00\x53\x2e\x2c\x5b\x76\x90\
+\x82\xb2\xb8\x9f\x48\xf1\xa0\x07\xae\xae\xf6\xb8\xcf\x82\x58\x1d\
+\x83\x76\x1c\xb2\xf4\x2a\x01\x86\xa7\xae\x26\xa7\x73\x36\x9d\xbf\
+\xbf\x91\x14\x61\x2d\xab\x16\x26\xc5\x45\x45\x35\x7a\xe1\xed\xbd\
+\x16\xef\xf6\x13\x59\x06\x6e\x52\xdf\x0c\xfc\x05\x34\xd0\x38\x80\
+\x0f\x03\x2b\x62\x92\x3e\xe1\xdb\xf0\x09\x9e\x4d\x07\xb3\x43\x32\
+\xa0\x20\xbc\x60\x34\x61\xbf\x8b\x2c\x03\x6f\x35\x03\x4f\x9d\xda\
+\x60\x57\xb9\xf2\x63\x32\x36\xaa\xbd\x43\x0c\x6f\x37\xe6\x26\x55\
+\x0f\x32\xe2\x79\xcd\xb1\x43\x09\x91\x67\xc1\xdb\xaf\x6e\xdf\x6e\
+\x41\x25\x41\x42\x67\xc0\x69\x62\x07\xe4\xe4\xc4\x62\xfb\xf1\xe5\
+\xe1\xd1\xa3\x9b\x30\x41\xd5\x85\x84\xdc\xde\x14\x14\x59\x09\x36\
+\xba\xca\xe0\x1f\x97\x57\xad\xda\x8f\x6a\x90\x0f\xd2\x91\x75\x59\
+\x5b\xa8\x48\x49\xa0\x86\x03\x46\x9d\xca\xb7\xae\x4a\x15\x1f\x1d\
+\x9b\x3b\x46\x64\x68\x68\x3d\x2a\xa4\xa4\xea\x65\xf2\x66\x52\xa0\
+\x75\xae\x10\xf9\x84\x2e\x82\xb3\x8b\x9a\x25\xc4\xc4\x18\x1f\x19\
+\x39\xf2\x2c\x4a\x84\x6e\xb8\x0e\x1b\x96\x5a\x4f\x04\x15\xb6\xa1\
+\x97\xe9\xec\x1d\x7a\xed\x1a\xa5\xf2\x19\x0a\x9d\x03\x67\xbe\xf7\
+\x7c\x7b\xf7\xae\xe5\xf6\x16\x2d\x6e\xd2\x2a\x87\x04\xe7\x81\x42\
+\x57\xc1\xf3\x95\x07\xec\x05\x2e\x01\x1b\xcb\x5d\xca\x7a\xd0\x44\
+\xa6\xf2\xfd\x2a\x03\xe6\x5e\xb2\xe2\x5c\x47\xc1\x13\x59\x0a\xfc\
+\x3d\x32\x24\x64\x25\xae\x3a\x6e\x70\x0c\xa5\xac\x87\x80\xd5\xec\
+\x18\x19\x99\x94\x77\x08\x5d\x9e\x27\x4f\x78\xec\xfb\xf7\xa6\xe4\
+\x2c\x4b\xc5\x31\x56\x16\xef\xcd\x05\xcd\xa8\x64\x2b\xeb\xcb\x80\
+\x78\x22\xab\x83\x65\xc5\x8f\x04\x9e\xb3\xf6\xe7\x8d\x8d\x0f\xa1\
+\x0c\x48\x7d\xbe\x43\xc6\xd0\x5b\xaf\xa5\x4b\xc7\xa5\xa2\x34\xd6\
+\x9f\x0a\x94\xb5\x84\x6b\x6f\xca\x8a\x84\x34\x80\xc1\xe0\xf3\x5d\
+\x6b\x5a\xd5\x9c\x06\x0e\xf4\xc2\x79\x3c\x49\x26\x3a\x2c\xd0\x58\
+\xd9\xca\x83\xf1\x78\x16\x85\xc4\xe9\xdd\x14\x5a\x80\x32\xc0\x79\
+\x0a\x39\xe0\x18\x11\x84\xf7\x4d\xd3\xde\x27\x8f\xc1\xe0\x78\x6b\
+\x7f\x72\x96\x6c\x6d\xdc\xf8\x26\x92\x1b\x36\x0b\x09\x25\x39\x5d\
+\xa6\x8b\x4d\x05\xbb\x80\x23\x2e\x98\x99\x1d\xa0\x71\xa2\x4d\xa5\
+\x4a\xf5\x45\x9a\xc1\x60\xb0\xe1\x19\x82\xe3\x41\x13\x30\xbf\x00\
+\x10\xbf\x5b\x4a\x46\x85\x62\xd8\xb9\x9a\x7a\x29\xde\xd6\xd6\x6d\
+\x69\xdc\xbe\x5e\x3d\xaa\xc7\xeb\x2e\xbe\x1b\x0c\x06\x97\x01\xe5\
+\x15\x12\x0e\xcd\x9a\x91\x61\x7d\xc5\x39\xef\x89\xe6\x99\x8d\x9c\
+\x26\x07\xfb\xf7\xdf\x4d\x2a\x00\x24\xcb\x21\xd2\x07\x0c\x06\x97\
+\x6f\x41\x1e\xdf\x4b\x36\x1a\xa1\x4a\x71\x52\x0e\xcb\x3b\x5b\x08\
+\x0a\x33\x74\x02\xd3\xb9\x1b\x13\x83\xc1\x46\xd7\xdc\xd3\xd4\xd4\
+\x79\x65\xa1\x42\xef\x34\xbc\x94\x89\x24\x56\x2b\x32\x04\x0c\x06\
+\x1b\x5d\x23\x54\x7e\x98\xdc\xde\xbb\x77\xdb\xce\x76\xed\x4e\x9c\
+\x9a\x3e\x7d\xf5\xa7\xa8\xa8\x8a\xdf\x21\xb9\x9f\x1b\x1c\x0d\x5a\
+\xc0\x68\x67\xe3\x5a\x51\xfc\x0b\xa1\x12\xff\x10\x0c\x86\x3c\xdb\
+\xd5\x06\xeb\x80\x5f\xc1\xf3\x2a\x95\xea\x79\x1a\x3a\x07\x75\x56\
+\x09\xb1\x03\x2c\xad\x31\xfc\x25\x45\x88\x71\xcb\x84\x70\x14\xe9\
+\x06\x06\x83\x9b\xc9\xd4\xc3\x8a\xf6\x11\xb1\xbb\xc4\x13\x13\x27\
+\x1e\xa4\xcc\x24\x2a\xdf\x42\x91\xf3\x07\xa9\x2c\xd0\x4c\xfc\x6b\
+\x90\xc5\x25\xf3\x0c\x06\x56\x31\x13\x3d\x3d\x3d\xd1\x6b\xc7\x8e\
+\xbd\x3d\xec\xed\xfd\x0a\x96\x2b\x77\xaa\x7a\xbf\x7e\x7b\xda\x9a\
+\x99\xed\x15\x2a\x95\xc8\x5d\xb4\xa8\x89\x90\xf8\x67\x69\x63\x0c\
+\x06\xaf\x6e\xd9\x51\x89\x10\x4d\x82\xb5\xd8\x96\x4e\x02\x0b\x6a\
+\x2a\x06\xd8\x18\x19\x05\x5b\x96\x28\x11\x8a\x71\x15\xe9\x65\x82\
+\x91\xf8\x9d\xc5\xdf\x21\x58\xcb\x60\x30\x16\x0b\xf1\x33\x79\x36\
+\xd1\x00\xf4\xb8\x12\xe3\xd3\x04\x74\x4e\x9f\x93\xdc\xbe\xba\x07\
+\x9e\x9e\x5e\x37\x7a\x57\xf2\x79\x1a\x45\xa8\x18\x0c\x06\x29\x73\
+\x43\xad\x3b\x6e\x63\x9d\x3a\x57\x53\x71\xa4\xa8\x85\x6b\xd1\xe3\
+\xe2\x12\x55\x9e\x40\xf5\x6d\x0b\xdd\xbb\xfc\xf6\x9b\x07\x8c\x30\
+\xd0\xa1\x65\x4b\x6a\xdf\xa5\x5a\x44\x6d\xf6\xfe\x1e\x18\x0c\x06\
+\x8c\xed\x92\x5c\xb5\x7a\x69\x18\x5b\x77\xd2\x35\x25\x59\x45\x28\
+\x8e\x59\xed\xee\xdb\xb7\x38\x82\xeb\xb1\xb6\x15\x2a\xbc\xa0\x4a\
+\x75\xc8\xf9\x59\xe0\xfa\x2b\xde\x99\x09\x7e\x01\xb7\x50\x7b\x2e\
+\x91\x3a\x18\x0c\x06\x29\x81\x81\x63\xa1\x97\x72\x53\x76\x62\x4a\
+\xc4\xf5\x0c\x8c\xc7\x1d\xd7\xcf\xa8\xc9\x8b\x86\xb7\x92\xe4\x39\
+\xfa\x61\xec\x0f\x7a\x87\x7a\xe8\xd9\xff\xfc\xf3\x3c\x3c\x4f\x40\
+\x2e\xe7\xa6\x3d\x9d\x3b\x97\xb2\xab\x54\xc9\x4f\x51\xf7\x96\x4a\
+\xd3\x0c\x06\x23\x95\x2d\x63\x6f\xe5\x4c\x66\x5b\xb1\x62\x30\xba\
+\x37\x79\xa0\x23\xd3\xb5\xe5\xf9\xf3\x5f\xd9\xdd\xa9\xd3\x4e\xd2\
+\xd2\x24\x5d\xd3\xa0\xa0\x20\x03\xea\x51\x01\x25\xe9\x8f\x7b\xba\
+\x76\x3d\x43\xa1\x02\xd9\xbd\xc9\xef\xd5\xab\x57\xb9\xd1\x91\xd7\
+\x0f\xab\xdf\x57\x04\xdd\x3d\xce\x2f\x5b\x56\x97\x85\x6b\xb5\xc1\
+\x60\x48\x17\x3f\x74\x4a\xb7\x6e\xaa\x5b\xf7\x21\x3c\x95\x9f\xb1\
+\xd2\xbd\x7d\x72\xfa\xb4\xad\x6c\xb1\x3c\x17\xec\x23\xfb\x59\x74\
+\x00\x53\xa8\x43\x10\x5d\x91\x46\xf6\x42\x9e\xed\x2e\xa3\x30\x76\
+\xb1\xfa\xe7\x3e\x7d\xbc\x64\x33\xcb\x56\x1a\xc6\x56\x87\x0c\x95\
+\x82\xea\xb8\x65\x30\x18\x54\xe4\x0a\xce\x7a\x70\xe4\x88\x3d\x35\
+\x21\xa1\xfe\x07\xe8\x53\xfe\x02\xdb\xc5\xf6\x1a\x2a\x70\x47\x94\
+\x95\x10\x35\x79\xde\x67\xe7\xcc\x51\xdf\x63\x3b\x79\x99\xde\xb7\
+\x29\x57\xee\x21\x9a\xcd\x98\x90\xfc\x9f\xd2\x52\x4d\xfe\xde\x50\
+\x18\xf2\x27\xcb\xe2\xc5\x8d\x05\xc0\x60\x30\x64\xe7\x1e\xb0\xda\
+\x33\x77\xf7\x55\x68\x02\xea\x61\xf7\xd3\x4f\x67\x4e\xcf\x99\xd3\
+\x41\x39\xe7\xc1\x68\xde\x6a\x88\x18\x2d\xc1\xf6\x73\x9f\xd4\xd3\
+\xa4\x5e\x15\x11\x10\xab\x5a\x83\xf1\x06\xf2\xfd\x0e\x52\xe0\x76\
+\xe3\x91\x09\x13\xca\xbf\xba\x71\x63\x4d\x42\x6c\xec\x7c\xd9\xa8\
+\x92\xc1\x60\x68\x06\xba\xc1\x71\xa0\x09\xd8\x5b\x48\xbc\xb9\x7b\
+\x77\xa0\x8f\xb5\xf5\x5e\xb9\x65\xac\x0a\x49\x87\xab\xd2\xc9\xf2\
+\xe5\xba\xbd\xfd\x4e\x4d\x15\x68\x8c\xe7\x47\x13\x51\xc5\xeb\x19\
+\xb1\xb3\x63\xc7\xbe\x7f\xa1\xf0\xcd\x60\xb0\x9e\x4a\x2a\x86\x38\
+\x00\x2c\x47\x4e\x10\xac\x78\xf1\x64\x50\x87\x06\x0d\x3a\x8f\xb1\
+\x29\xda\x7d\xd1\xd1\x9c\x92\x3c\x9f\x51\xd8\xa2\x46\x3f\x74\x73\
+\xab\x2d\xbe\x1f\x0c\x06\xe3\xf8\xf8\xf1\x0b\xd0\xf8\xf3\xc6\xe7\
+\xa4\x24\xe3\xd4\x5a\x6b\x99\x66\xcb\x36\x8f\x0c\xf2\xcc\xac\x59\
+\x47\x65\x97\x5e\x9d\xc2\x0f\xb5\xb7\x65\x30\x7a\x6e\xd9\xe2\x86\
+\x4b\x0a\x78\x06\x25\x40\x61\x94\x63\xa9\x12\xa2\x2b\xee\x97\x26\
+\x61\x81\x4b\xf9\xfa\xd5\x38\x1f\x1a\x81\x76\x58\xb5\xca\x1b\x63\
+\x97\xfe\x66\x4c\x70\x16\x2e\xc5\xc1\x15\x66\x42\xc4\x68\x3c\x62\
+\x30\x18\x9a\xa2\x45\xd8\x62\x8e\xa3\x40\x39\x18\x0f\xe3\xbb\x85\
+\xeb\x57\xf4\x42\x20\x25\xb1\x7a\xda\xb5\x9f\x32\xf6\x77\x14\xef\
+\x9d\xc7\x75\x89\xa2\xc5\x02\xcf\xe8\x7a\x79\xee\x0b\x01\x0d\xc4\
+\x37\xc1\x60\xb0\xf1\x95\xa5\xb0\x02\xd2\xbe\x9e\x92\xd1\x50\xa7\
+\xdd\x93\x93\x26\x6d\x37\x35\x35\xcd\xa6\xd5\x64\xc6\x44\x3a\x5b\
+\x3e\x49\x8d\xcd\x14\x30\x10\x2c\x8a\x98\xde\x4c\xba\xdf\xd1\xaa\
+\x95\xfb\x5f\xf7\x37\x67\x30\xd8\xe8\xaa\x81\xd3\xbd\xcc\xcc\x9c\
+\x56\x15\x2a\x14\x41\xc6\x23\x57\xb1\x9c\x02\xa0\x8e\xad\xb4\xf2\
+\xa1\xd4\xe7\xc9\x2b\x3f\x3f\xeb\x8f\xef\xde\x2d\xa7\x9e\x85\x14\
+\x70\xc7\xea\x76\x1d\xef\x3e\x31\xcf\x95\x2b\x06\xc5\xaf\x16\xe4\
+\xa4\x11\x7f\x09\x06\x83\x8d\x2e\x3b\xd8\x92\x3a\xed\x3a\x0f\x1e\
+\xec\x81\xd6\xd6\xbe\xe8\x0a\x54\x50\x9e\xd1\x26\x83\x29\x90\x6b\
+\x77\xa2\x3e\x17\x60\x0d\xb0\xed\xe1\xe1\xc3\x4f\xd3\x38\xd1\x6d\
+\xda\x34\x2a\x11\xea\x24\xd2\x06\x06\x83\x9b\x92\x80\x7d\x41\x53\
+\xb0\xbe\x00\xb0\xcd\x1c\x2b\xeb\xee\xb6\x08\x0d\x6c\xfd\xe5\x97\
+\xc5\x34\x4e\x35\x77\xc8\x56\x99\x27\xcf\x86\xff\x04\x0c\x06\x77\
+\x03\x5a\x5b\xa3\x86\x21\x9d\xed\xc0\x8f\x8b\x85\xa8\x2b\x00\x2a\
+\xe7\xc1\x56\xf2\x22\x19\x9c\xdf\xd6\xad\x3b\xc8\x38\xa9\x8f\x21\
+\xee\x17\x81\xe7\xf0\xcc\x0d\xd7\x51\x22\xed\x60\x30\x18\x88\xcb\
+\xed\x44\x02\x74\xb2\x3c\xdf\x85\x11\xe9\xe7\xcd\xf5\xeb\x07\xc0\
+\xd8\x26\xac\x29\x51\x22\x0f\xee\x7d\x69\x0c\x67\xbb\x58\x0d\x9d\
+\x4d\x63\x16\x11\x4a\x23\x18\x8c\xce\xd6\xd6\x2b\x87\x9c\x38\x61\
+\x5f\x67\xd8\xb0\x93\x45\x2a\x55\x7a\xa4\x12\xa2\x88\x00\x5a\x19\
+\x1b\x5f\x26\x7b\x84\x23\x65\x2a\xae\xbf\x54\xea\xd4\xe9\xc2\xc2\
+\x8f\x1f\x6d\x66\x85\x86\xae\x2c\xdd\xa0\x41\x00\xde\x33\x87\xe1\
+\x79\x52\x0f\x3c\xe9\x84\xf9\x9b\x60\x30\x78\x9b\x59\x01\x1c\x1e\
+\x15\x1a\xba\x84\x9a\x8d\xa8\xcf\x6f\x65\xcb\xde\x16\x00\xc2\x05\
+\x17\xb1\xb2\x7d\xc1\x59\x8e\x3a\xc1\x36\x03\xeb\x44\x04\x07\x8f\
+\xa0\xad\xa8\xc6\x6a\x77\x5a\x7c\x17\x18\x0c\x36\xbe\x01\xfe\xdb\
+\xb7\x6f\xbf\x7b\xe0\x80\x39\x39\x4b\x90\x7f\xe9\x8d\xea\x83\x84\
+\x97\xbe\xbe\xed\x84\xc4\x86\xd6\xad\xf3\x52\x38\x81\x6a\xf1\x8e\
+\x8d\x1d\x7b\xea\xf8\x84\x09\xeb\x28\x77\x93\x53\xbb\xd2\x0e\x06\
+\xc3\xf5\xe7\xd1\xa3\x5f\xe0\x5a\x09\x14\xc5\x6a\xd5\xf2\x0a\xbd\
+\x72\xa5\xf9\xde\x2e\x5d\x16\x1a\x23\x2e\x07\xc3\x88\x0c\xbb\x78\
+\x71\x1d\x1e\xa9\xaa\xf6\xee\x7d\xa5\xd7\xb6\x6d\x6e\x74\x04\x3b\
+\xf4\xeb\xaf\x3f\x51\xad\x1d\xc6\x0d\xc1\xb7\x5f\x85\xd8\x6b\x21\
+\xc4\x1d\xf1\xf7\xc1\x60\x30\x5e\x05\x04\x18\xa2\xc0\xf5\x8e\x86\
+\x14\xdf\x67\xba\x42\xaa\x2f\x22\x2e\x2c\x6c\x29\x35\xa7\x24\x59\
+\x3f\x12\x37\x92\x1d\x83\xe2\xe5\x36\xf3\x4b\xda\x1c\x2b\x0c\x06\
+\x0b\x1a\x19\x92\xdc\x5e\x72\x72\x72\x3f\x7f\x47\xc7\xed\x90\xe2\
+\x73\x5e\x9e\x2f\xdf\x2b\x45\xb8\x08\xc6\xd6\x46\x00\xb2\x7f\x79\
+\xca\x86\x1a\x35\x1e\xc5\x85\x87\x5b\x3c\x3c\x7e\x7c\x93\xad\x91\
+\xd1\x0b\x69\xa0\x83\xbf\xf1\xdf\x2e\xfd\xbf\x5e\x4a\x06\x83\x71\
+\x32\x07\xb6\x91\x16\xfa\xfa\xb5\x72\x15\x2c\x78\xb4\x58\x8d\x1a\
+\x4f\xbe\x24\x24\x14\x2d\x58\xbe\x7c\x48\x1b\x33\xb3\x2b\x78\xee\
+\x43\x2d\xb8\x54\x42\xd4\x37\x28\x54\x28\xea\xc3\xa3\x47\x95\xad\
+\x4b\x97\x1e\x71\x6f\xcf\x9e\xa0\xd1\xde\xde\xb6\x39\xf3\xe6\x8d\
+\xd5\xcf\x9f\x7f\x89\xd0\x02\x06\x26\xa4\x08\x11\xa4\x61\x74\x0c\
+\x06\xc3\x6d\xfa\xf4\x3e\x56\x65\xca\x3c\xd3\xd8\x4e\x7e\x5d\x91\
+\x2f\xdf\x53\xa9\x1c\x56\x4b\x00\xd4\x68\x52\xc6\xed\xee\xd1\xca\
+\x66\x5d\xb6\x6c\x80\x8c\xd9\x79\x40\xd8\xe8\x0d\xb6\x9e\x31\x78\
+\x97\xf4\x54\x54\x18\x3f\x08\x5a\x91\x34\x3b\x9e\x3d\x8f\x7e\xff\
+\xbe\xb2\x00\x00\x06\x83\x41\x02\x44\xe8\x71\x37\xcb\x7b\xcd\x9a\
+\x7d\xdb\x9a\x34\xb9\x88\x02\xd7\xc3\xb4\x65\xc4\xf8\x60\xa1\x01\
+\xd2\xc0\xa4\xd0\xc1\x96\x06\x0d\xa8\xf8\x75\x1a\x12\xa0\xf7\xa3\
+\xe5\xf2\x1b\xb9\xcd\x0c\xc4\x98\x91\x00\xcc\x0d\x0c\x8e\x29\xc6\
+\xbb\xb7\x6b\x57\x9f\xc4\xd8\xd8\xfa\xe2\x7f\xc0\x60\xb0\xd1\xe5\
+\x90\x2a\x62\x33\xc0\x85\x60\x1b\x50\x25\x34\x70\xd7\xc9\xe9\xd7\
+\xd5\xc5\x8a\x85\xd1\x0a\x08\xa7\x89\x07\x8c\xc9\x22\x2c\x30\xd0\
+\xdc\x75\xe8\x50\x77\xef\xd5\xab\xf7\x29\xca\x61\x97\x2d\x2d\x27\
+\xd0\x3b\xa8\x44\xf8\x2c\x0d\xef\xba\x89\x10\x4d\x45\xda\xc0\x60\
+\x70\x5f\xf3\xf0\xe7\xcf\xe7\xef\xed\xde\xdd\xc7\x5c\x5f\x3f\x5c\
+\x7a\x2b\x63\xd1\x76\x79\x11\xe9\xab\xc8\xd7\x54\x18\xbb\x40\xb1\
+\xbb\xa7\xee\xee\xeb\x51\x91\x70\x0e\xc2\x47\xf1\xb2\x06\xaf\x9d\
+\x48\x13\x18\x0c\x36\xba\x3c\xe0\xb0\xe4\x4f\x9f\xcc\xae\xd8\xda\
+\xee\x71\x6c\xd3\xc6\xed\xa2\xb9\x79\x2b\x32\x46\xa9\x28\xdd\x9f\
+\x0c\xf1\x40\xdf\xbe\x17\x30\x36\x04\xec\x0d\x29\x3f\x4b\xd7\xe1\
+\xc3\x4f\x3d\x3e\x71\xa2\xa5\x4a\x7c\x0f\x18\x0c\x36\xbc\xc2\xb8\
+\xd4\x05\x6b\x83\x4f\xa0\xaf\x72\x5a\x7a\x26\xaf\xe6\x30\x30\xa8\
+\x31\x23\x38\x78\x6d\xde\xe2\xc5\x6d\x31\x1e\x45\xdd\x7f\xf0\xa8\
+\x23\x18\x2c\xd2\x0f\x0c\x06\x03\x0e\x93\xfb\xcb\xf3\xe4\xf9\x78\
+\x6d\xfd\xfa\x91\x19\x5c\x2d\xc0\x60\x30\xda\x98\x9a\x5a\x93\x9a\
+\xf4\xe9\x69\xd3\x36\x99\x0a\x71\x18\x1c\x85\xa0\x7a\x99\x0c\x30\
+\x38\x06\x83\xd1\x62\xc1\x82\xe3\x7d\xf7\xec\xd9\x5c\xaa\x7e\xfd\
+\x47\x2a\x3d\x3d\xd2\xc5\x74\x44\x50\xfd\x84\xc8\x18\x30\x18\x0c\
+\x52\xfe\x02\x67\x24\xc6\xc5\x2d\x23\xc9\xbe\xb0\xc7\x8f\xe7\x2a\
+\x15\xe8\x19\xe7\x34\x61\x30\xd8\xf0\x4a\xe3\x52\x4d\xda\x99\x0f\
+\x1c\x28\x09\xe2\x5f\x09\x06\x83\xc1\x60\x30\xfe\x0f\x1d\x9b\x1f\
+\x99\x66\xa1\x3a\xad\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x06\x53\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x40\x00\x00\x00\x40\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
+\x00\x00\x02\xeb\x50\x4c\x54\x45\x00\x00\x00\x00\x00\x00\xff\xff\
+\xff\xff\xff\xff\x7f\x00\x00\xff\xff\xff\x66\x00\x00\xff\xff\xff\
+\x7f\x00\x00\x71\x00\x00\x7f\x00\x00\xff\xff\xff\x73\x00\x00\xff\
+\xff\xff\x7f\x00\x00\xff\xff\xff\x75\x00\x00\x7f\x12\x12\xff\xff\
+\xff\x77\x00\x00\x78\x00\x00\xff\xff\xff\xff\xff\xff\x79\x00\x00\
+\xff\xff\xff\x7f\x00\x00\x7a\x00\x00\xff\xff\xff\x7f\x00\x00\xff\
+\xff\xff\x7b\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\xff\x7c\x00\x00\x7c\x00\x00\xa3\x47\x47\xff\xff\xff\xff\xff\xff\
+\x7f\x00\x00\x7c\x00\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\x7f\
+\x00\x00\xff\xff\xff\x7d\x00\x00\xff\xff\xff\x7f\x00\x00\xea\xd5\
+\xd5\xff\xff\xff\xff\xff\xff\x99\x38\x38\x7d\x00\x00\xff\xff\xff\
+\xff\xff\xff\xff\xff\xff\x7d\x00\x00\xff\xff\xff\xff\xff\xff\x7f\
+\x00\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\
+\x00\x7e\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\x7e\x00\x00\x7e\x00\x00\xff\xff\xff\x7f\x00\x00\xb7\x70\x70\x7f\
+\x00\x00\x7f\x02\x02\x7e\x00\x00\xff\xff\xff\x7e\x00\x00\xff\xff\
+\xff\xc5\x8c\x8c\x7f\x00\x00\xff\xff\xff\x7f\x00\x00\xff\xff\xff\
+\x7e\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x00\xff\
+\xff\xff\xba\x75\x75\x7e\x00\x00\xa8\x51\x51\x7e\x00\x00\xed\xdc\
+\xdc\xff\xff\xff\x7f\x00\x00\x7f\x00\x00\xff\xff\xff\x7f\x00\x00\
+\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd8\xb2\xb2\xff\
+\xff\xff\x7f\x00\x00\xff\xff\xff\x7e\x00\x00\x7f\x00\x00\x7f\x00\
+\x00\x7e\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb7\x71\x71\
+\x7f\x00\x00\xff\xff\xff\x93\x27\x27\x7f\x00\x00\x7e\x00\x00\xf9\
+\xf4\xf4\xc3\x87\x87\xff\xff\xff\xff\xff\xff\x91\x24\x24\xff\xff\
+\xff\x8f\x1f\x1f\xff\xff\xff\xec\xd9\xd9\xff\xff\xff\x8c\x1a\x1a\
+\x7f\x00\x00\x7f\x00\x00\x7e\x00\x00\xff\xff\xff\xff\xff\xff\x7e\
+\x00\x00\x7f\x00\x00\xad\x5c\x5c\xff\xff\xff\x8d\x1b\x1b\x84\x0a\
+\x0a\x81\x03\x03\x7f\x00\x00\xff\xff\xff\xff\xff\xff\x80\x02\x02\
+\xff\xff\xff\x80\x02\x02\xff\xff\xff\xff\xff\xff\xb1\x63\x63\x7f\
+\x00\x00\x7f\x01\x01\xff\xff\xff\x7e\x00\x00\x83\x08\x08\x7e\x00\
+\x00\xff\xff\xff\xb6\x6d\x6d\x7e\x00\x00\x87\x10\x10\xd6\xae\xae\
+\x7f\x00\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\xde\xbd\xbd\xf9\
+\xf4\xf4\x7e\x00\x00\x7f\x00\x00\x90\x22\x22\xdf\xc1\xc1\xff\xff\
+\xff\xac\x5a\x5a\xc4\x8b\x8b\xff\xff\xff\x7f\x00\x00\xff\xff\xff\
+\x90\x22\x22\x80\x01\x01\x98\x32\x32\xa3\x48\x48\xdb\xb7\xb7\xf4\
+\xea\xea\xf7\xf0\xf0\xf8\xf2\xf2\xfe\xfe\xfe\x80\x02\x02\xa5\x4c\
+\x4c\x8c\x1a\x1a\x81\x04\x04\x92\x26\x26\x93\x27\x27\x82\x05\x05\
+\x99\x33\x33\x9a\x35\x35\x9d\x3b\x3b\x9e\x3e\x3e\xa1\x44\x44\x82\
+\x06\x06\x8c\x19\x19\xa7\x4f\x4f\xa8\x52\x52\xab\x57\x57\xab\x58\
+\x58\xac\x59\x59\xb0\x61\x61\xb0\x62\x62\xb2\x66\x66\xb4\x6a\x6a\
+\xb9\x74\x74\xba\x75\x75\xbd\x7b\x7b\xbe\x7e\x7e\xc0\x81\x81\xc7\
+\x8f\x8f\xce\x9e\x9e\xcf\x9f\x9f\xd0\xa2\xa2\xd4\xaa\xaa\xd5\xab\
+\xab\xd7\xb0\xb0\xd8\xb1\xb1\xd9\xb4\xb4\x84\x09\x09\xde\xbe\xbe\
+\xe1\xc4\xc4\xe7\xd0\xd0\xe9\xd4\xd4\xea\xd5\xd5\xed\xdb\xdb\xee\
+\xde\xde\xef\xe0\xe0\xf1\xe4\xe4\x85\x0b\x0b\xf5\xec\xec\x86\x0e\
+\x0e\x8a\x15\x15\xfb\xf7\xf7\xfd\xfb\xfb\xfd\xfc\xfc\x8a\x16\x16\
+\x8b\x17\x17\xd2\x67\xa5\xb8\x00\x00\x00\xb6\x74\x52\x4e\x53\x00\
+\x01\x01\x03\x04\x04\x05\x08\x08\x09\x0a\x0a\x0b\x0b\x0c\x0d\x0d\
+\x0e\x0f\x0f\x13\x13\x14\x15\x15\x16\x1b\x1b\x1c\x1c\x1d\x1e\x1f\
+\x21\x24\x25\x27\x27\x2a\x2b\x2c\x2d\x2e\x2f\x32\x36\x36\x39\x3b\
+\x3c\x3d\x40\x41\x44\x45\x48\x4b\x4c\x4d\x4e\x4f\x50\x54\x54\x55\
+\x5a\x5c\x5d\x5d\x60\x61\x63\x65\x67\x67\x68\x6b\x6c\x6c\x6d\x70\
+\x71\x73\x78\x7c\x7e\x80\x81\x83\x84\x8a\x8b\x8c\x8c\x8d\x91\x93\
+\x95\x95\x95\x96\x98\x99\x9c\x9d\x9e\xa4\xa6\xa7\xa7\xa8\xa8\xa9\
+\xaa\xac\xad\xad\xb0\xb3\xb3\xb4\xb7\xbb\xbc\xbd\xbd\xc0\xc1\xc4\
+\xc6\xca\xcb\xcc\xcd\xcd\xd0\xd2\xd4\xd7\xd8\xd9\xdb\xdc\xdc\xdd\
+\xde\xe0\xe1\xe4\xe5\xe6\xe7\xe8\xe9\xe9\xea\xef\xf0\xf0\xf1\xf3\
+\xf3\xf5\xf6\xf6\xf7\xf7\xf7\xf8\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
+\xfd\xfd\xfe\xfe\xfe\xa0\xb1\xff\x8a\x00\x00\x02\x61\x49\x44\x41\
+\x54\x78\x5e\xdd\xd7\x55\x70\x13\x51\x14\xc7\xe1\xd3\x52\x28\xda\
+\x42\xf1\xe2\x5e\xdc\x5b\x28\x10\xdc\xdd\xdd\xdd\x0a\x45\x8a\xb4\
+\xb8\x7b\x70\x29\x5e\x24\x50\xa0\xe8\xd9\xa4\x2a\xb8\xbb\xbb\xbb\
+\xeb\x23\x93\x3d\x77\xee\xcb\xe6\x66\x98\x93\x17\xa6\xbf\xd7\xff\
+\xe6\x9b\x7d\xc8\x9c\x99\x85\x14\x52\xfa\x52\x39\x5d\xfa\xf9\x80\
+\x28\xc4\x95\x41\x26\x36\x30\x10\xa9\x19\xd9\x78\x80\xc7\x4e\x14\
+\xed\xaa\xca\x02\x72\xa3\xec\x60\x25\x96\xb0\x1e\x65\x1b\x33\x70\
+\x80\xfa\x36\x09\xd8\x46\x00\xa7\x5e\x17\xbe\xa0\xe8\x68\x19\x96\
+\x50\x7d\xca\xee\x68\x02\xae\xb6\x03\x5e\x9e\x7d\x08\xb0\x8e\x02\
+\x66\x45\x09\x38\x61\xe6\x02\x79\x05\x10\xf9\x3f\x03\x6e\x2e\x01\
+\x25\x47\x2f\x39\xb0\x2a\x34\x90\x0d\x34\x8f\xa2\x7d\x32\x13\xf0\
+\xb3\xa0\x68\x2a\x0f\xe8\x84\x22\xbc\x5c\x97\x05\x8c\x95\x80\x75\
+\x3c\x0b\xe8\x2d\x81\x73\x66\x16\x60\x92\xc0\xdd\xe9\x0a\xc0\xd7\
+\x29\xe0\x36\x0b\x29\x6b\x7c\x37\x05\x90\x8e\x80\xa4\xfd\x8e\xe7\
+\x2c\xcb\x2e\xda\xe7\x2b\x1f\xcd\x3e\xa0\x68\x33\x09\x87\x14\x37\
+\xc9\xbb\xdf\xbe\x47\xb1\x9f\xb4\x71\x85\x40\xd5\x42\x02\x62\x5a\
+\xa8\xfe\xb1\x39\x2a\x37\x0a\x28\x08\xea\xc2\x50\xb4\xa2\x95\x17\
+\x70\xaa\x85\xb2\x6d\xc5\x58\xc2\x3c\x94\xed\xc8\xc7\x01\xca\xa2\
+\x2c\xb9\x27\x07\xe8\x81\xb2\x9b\x21\x0c\xc0\x6f\x8f\x04\x6c\xaf\
+\x87\x30\x80\x60\x14\xe1\x9f\x27\xc7\xaa\x30\x80\xf9\x04\x1c\xbf\
+\xf7\x2e\x71\x5d\x03\x60\xb4\x89\x80\x17\xab\xbb\x96\x70\x07\x46\
+\x59\x91\x8a\xab\xe1\xe2\x55\xd6\x72\x39\x9c\xfd\xbb\x88\x9a\x32\
+\x8f\x6a\x28\x8a\x26\x34\x63\x01\x5e\x16\xa4\x4e\xfd\x6c\xcc\x02\
+\x02\x51\xf4\x74\x51\x6a\x16\xd0\x17\xa9\xe8\xc4\x3a\xc0\x02\x96\
+\x22\x15\x3b\xd7\x9d\x05\x14\x41\xea\xbc\x16\x00\x2c\xa0\x35\x52\
+\x6f\xa6\x01\x0f\x98\x48\x63\xb2\x56\x81\x07\xa4\xdd\x4e\x17\xfb\
+\x6d\x08\xf0\x00\x7f\xda\xae\x1f\x2e\x0d\xea\xca\x13\xf0\x2a\x52\
+\x79\x6a\x4e\x7f\x18\x0e\x4e\xea\x40\xc0\xd9\x08\x30\xb6\x40\x9f\
+\x6e\xed\x2d\xac\x04\x7c\xeb\x05\x6f\x25\xe0\xf6\x4c\xe3\x9a\x9f\
+\xde\xed\xf3\x20\x50\x94\x39\x08\x65\x8f\xfb\x1b\xf7\x26\xfa\x72\
+\x27\x22\x8f\x0a\x18\x8c\xb2\xef\x71\x0d\x8d\xfb\x18\xfb\xf2\xed\
+\x6b\x77\x50\x94\xc6\x82\xb2\x67\xe1\xc6\x73\xe0\xa1\xdf\xaa\x07\
+\x5b\xb2\xff\xc3\xf7\xc2\x35\xad\xb6\x71\xaf\xa8\xbf\x5a\x42\x47\
+\x50\xb6\x16\x45\x37\x12\x46\x82\xb1\xb6\xf6\xe9\x61\xb8\xb7\x1a\
+\x30\x25\xe9\xc0\xef\xe7\xda\x50\x47\x4f\xb5\x44\xc4\x93\x3f\xda\
+\x80\x93\xda\x1f\x39\x13\x73\xff\x65\xfc\x86\x9a\x0e\xd7\x8c\xcb\
+\xf1\xd2\xfb\xc5\x9e\xe0\xac\x72\xc3\x66\x4f\xea\x5c\xcd\x47\xb1\
+\x66\x9a\xf3\x6b\x4d\x71\x70\xa9\x02\xa9\x20\x25\xf7\x17\x09\xba\
+\x39\x39\xea\xb1\x61\x75\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\
+\x0e\x25\xb1\xe7\
+\x00\x6c\
+\x00\x6f\x00\x67\x00\x6f\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0e\x26\xb1\xe7\
+\x00\x6c\
+\x00\x6f\x00\x67\x00\x6f\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x09\xbc\x6f\x27\
+\x00\x77\
+\x00\x61\x00\x74\x00\x65\x00\x72\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x09\xbd\x6f\x27\
+\x00\x77\
+\x00\x61\x00\x74\x00\x65\x00\x72\x00\x6d\x00\x61\x00\x72\x00\x6b\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x04\xc8\x47\xe7\
+\x00\x62\
+\x00\x61\x00\x6e\x00\x6e\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x07\x04\x9f\x87\
+\x00\x62\
+\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0e\x24\xb1\xe7\
+\x00\x6c\
+\x00\x6f\x00\x67\x00\x6f\x00\x31\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\x07\x00\x00\x00\x02\
+\x00\x00\x00\x86\x00\x00\x00\x00\x00\x01\x00\x00\x7f\xaa\
+\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x8f\x19\
+\x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xae\
+\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x46\xf2\
+\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\xe7\x4f\
+\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\x06\x57\
+"
+
+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()
diff --git a/examples/widgets/dialogs/classwizard/images/background.png b/examples/widgets/dialogs/classwizard/images/background.png
new file mode 100644
index 000000000..44c7badb8
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/background.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/banner.png b/examples/widgets/dialogs/classwizard/images/banner.png
new file mode 100644
index 000000000..3169152b8
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/banner.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/logo1.png b/examples/widgets/dialogs/classwizard/images/logo1.png
new file mode 100644
index 000000000..f9b594aaf
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/logo1.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/logo2.png b/examples/widgets/dialogs/classwizard/images/logo2.png
new file mode 100644
index 000000000..5dcbd4669
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/logo2.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/logo3.png b/examples/widgets/dialogs/classwizard/images/logo3.png
new file mode 100644
index 000000000..9fd3ea235
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/logo3.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/watermark1.png b/examples/widgets/dialogs/classwizard/images/watermark1.png
new file mode 100644
index 000000000..0091f5c17
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/watermark1.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/watermark2.png b/examples/widgets/dialogs/classwizard/images/watermark2.png
new file mode 100644
index 000000000..3b88f2e36
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/images/watermark2.png
Binary files differ
diff --git a/examples/widgets/dialogs/extension.py b/examples/widgets/dialogs/extension.py
new file mode 100755
index 000000000..866e04b30
--- /dev/null
+++ b/examples/widgets/dialogs/extension.py
@@ -0,0 +1,114 @@
+#!/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 widgets/dialogs/extension example from Qt v5.x"""
+
+from PySide2 import QtCore, QtWidgets
+
+
+class FindDialog(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(FindDialog, self).__init__(parent)
+
+ label = QtWidgets.QLabel("Find &what:")
+ lineEdit = QtWidgets.QLineEdit()
+ label.setBuddy(lineEdit)
+
+ caseCheckBox = QtWidgets.QCheckBox("Match &case")
+ fromStartCheckBox = QtWidgets.QCheckBox("Search from &start")
+ fromStartCheckBox.setChecked(True)
+
+ findButton = QtWidgets.QPushButton("&Find")
+ findButton.setDefault(True)
+
+ moreButton = QtWidgets.QPushButton("&More")
+ moreButton.setCheckable(True)
+ moreButton.setAutoDefault(False)
+
+ buttonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical)
+ buttonBox.addButton(findButton, QtWidgets.QDialogButtonBox.ActionRole)
+ buttonBox.addButton(moreButton, QtWidgets.QDialogButtonBox.ActionRole)
+
+ extension = QtWidgets.QWidget()
+
+ wholeWordsCheckBox = QtWidgets.QCheckBox("&Whole words")
+ backwardCheckBox = QtWidgets.QCheckBox("Search &backward")
+ searchSelectionCheckBox = QtWidgets.QCheckBox("Search se&lection")
+
+ moreButton.toggled.connect(extension.setVisible)
+
+ extensionLayout = QtWidgets.QVBoxLayout()
+ extensionLayout.setContentsMargins(0, 0, 0, 0)
+ extensionLayout.addWidget(wholeWordsCheckBox)
+ extensionLayout.addWidget(backwardCheckBox)
+ extensionLayout.addWidget(searchSelectionCheckBox)
+ extension.setLayout(extensionLayout)
+
+ topLeftLayout = QtWidgets.QHBoxLayout()
+ topLeftLayout.addWidget(label)
+ topLeftLayout.addWidget(lineEdit)
+
+ leftLayout = QtWidgets.QVBoxLayout()
+ leftLayout.addLayout(topLeftLayout)
+ leftLayout.addWidget(caseCheckBox)
+ leftLayout.addWidget(fromStartCheckBox)
+ leftLayout.addStretch(1)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
+ mainLayout.addLayout(leftLayout, 0, 0)
+ mainLayout.addWidget(buttonBox, 0, 1)
+ mainLayout.addWidget(extension, 1, 0, 1, 2)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Extension")
+ extension.hide()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ dialog = FindDialog()
+ sys.exit(dialog.exec_())
diff --git a/examples/widgets/dialogs/findfiles.py b/examples/widgets/dialogs/findfiles.py
new file mode 100755
index 000000000..cc410335f
--- /dev/null
+++ b/examples/widgets/dialogs/findfiles.py
@@ -0,0 +1,211 @@
+#!/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 widgets/dialogs/findfiles example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Window(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(Window, self).__init__(parent)
+
+ self.browseButton = self.createButton("&Browse...", self.browse)
+ self.findButton = self.createButton("&Find", self.find)
+
+ self.fileComboBox = self.createComboBox("*")
+ self.textComboBox = self.createComboBox()
+ self.directoryComboBox = self.createComboBox(QtCore.QDir.currentPath())
+
+ fileLabel = QtWidgets.QLabel("Named:")
+ textLabel = QtWidgets.QLabel("Containing text:")
+ directoryLabel = QtWidgets.QLabel("In directory:")
+ self.filesFoundLabel = QtWidgets.QLabel()
+
+ self.createFilesTable()
+
+ buttonsLayout = QtWidgets.QHBoxLayout()
+ buttonsLayout.addStretch()
+ buttonsLayout.addWidget(self.findButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(fileLabel, 0, 0)
+ mainLayout.addWidget(self.fileComboBox, 0, 1, 1, 2)
+ mainLayout.addWidget(textLabel, 1, 0)
+ mainLayout.addWidget(self.textComboBox, 1, 1, 1, 2)
+ mainLayout.addWidget(directoryLabel, 2, 0)
+ mainLayout.addWidget(self.directoryComboBox, 2, 1)
+ mainLayout.addWidget(self.browseButton, 2, 2)
+ mainLayout.addWidget(self.filesTable, 3, 0, 1, 3)
+ mainLayout.addWidget(self.filesFoundLabel, 4, 0)
+ mainLayout.addLayout(buttonsLayout, 5, 0, 1, 3)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Find Files")
+ self.resize(500, 300)
+
+ def browse(self):
+ directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find Files",
+ QtCore.QDir.currentPath())
+
+ if directory:
+ if self.directoryComboBox.findText(directory) == -1:
+ self.directoryComboBox.addItem(directory)
+
+ self.directoryComboBox.setCurrentIndex(self.directoryComboBox.findText(directory))
+
+ @staticmethod
+ def updateComboBox(comboBox):
+ if comboBox.findText(comboBox.currentText()) == -1:
+ comboBox.addItem(comboBox.currentText())
+
+ def find(self):
+ self.filesTable.setRowCount(0)
+
+ fileName = self.fileComboBox.currentText()
+ text = self.textComboBox.currentText()
+ path = self.directoryComboBox.currentText()
+
+ self.updateComboBox(self.fileComboBox)
+ self.updateComboBox(self.textComboBox)
+ self.updateComboBox(self.directoryComboBox)
+
+ self.currentDir = QtCore.QDir(path)
+ if not fileName:
+ fileName = "*"
+ files = self.currentDir.entryList([fileName],
+ QtCore.QDir.Files | QtCore.QDir.NoSymLinks)
+
+ if text:
+ files = self.findFiles(files, text)
+ self.showFiles(files)
+
+ def findFiles(self, files, text):
+ progressDialog = QtWidgets.QProgressDialog(self)
+
+ progressDialog.setCancelButtonText("&Cancel")
+ progressDialog.setRange(0, len(files))
+ progressDialog.setWindowTitle("Find Files")
+
+ foundFiles = []
+
+ for i in range(len(files)):
+ progressDialog.setValue(i)
+ progressDialog.setLabelText("Searching file number %d of %d..." % (i, len(files)))
+ QtCore.qApp.processEvents()
+
+ if progressDialog.wasCanceled():
+ break
+
+ inFile = QtCore.QFile(self.currentDir.absoluteFilePath(files[i]))
+
+ if inFile.open(QtCore.QIODevice.ReadOnly):
+ stream = QtCore.QTextStream(inFile)
+ while not stream.atEnd():
+ if progressDialog.wasCanceled():
+ break
+ line = stream.readLine()
+ if text in line:
+ foundFiles.append(files[i])
+ break
+
+ progressDialog.close()
+
+ return foundFiles
+
+ def showFiles(self, files):
+ for fn in files:
+ file = QtCore.QFile(self.currentDir.absoluteFilePath(fn))
+ size = QtCore.QFileInfo(file).size()
+
+ fileNameItem = QtWidgets.QTableWidgetItem(fn)
+ fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable)
+ sizeItem = QtWidgets.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024)))
+ sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
+ sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable)
+
+ row = self.filesTable.rowCount()
+ self.filesTable.insertRow(row)
+ self.filesTable.setItem(row, 0, fileNameItem)
+ self.filesTable.setItem(row, 1, sizeItem)
+
+ self.filesFoundLabel.setText("%d file(s) found (Double click on a file to open it)" % len(files))
+
+ def createButton(self, text, member):
+ button = QtWidgets.QPushButton(text)
+ button.clicked.connect(member)
+ return button
+
+ def createComboBox(self, text=""):
+ comboBox = QtWidgets.QComboBox()
+ comboBox.setEditable(True)
+ comboBox.addItem(text)
+ comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
+ QtWidgets.QSizePolicy.Preferred)
+ return comboBox
+
+ def createFilesTable(self):
+ self.filesTable = QtWidgets.QTableWidget(0, 2)
+ self.filesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+
+ self.filesTable.setHorizontalHeaderLabels(("File Name", "Size"))
+ self.filesTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
+ self.filesTable.verticalHeader().hide()
+ self.filesTable.setShowGrid(False)
+
+ self.filesTable.cellActivated.connect(self.openFileOfItem)
+
+ def openFileOfItem(self, row, column):
+ item = self.filesTable.item(row, 0)
+
+ QtGui.QDesktopServices.openUrl(QtCore.QUrl(self.currentDir.absoluteFilePath(item.text())))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/dialogs/standarddialogs.py b/examples/widgets/dialogs/standarddialogs.py
new file mode 100644
index 000000000..41039a3af
--- /dev/null
+++ b/examples/widgets/dialogs/standarddialogs.py
@@ -0,0 +1,320 @@
+#!/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 widgets/dialogs/standarddialogs example from Qt v5.x"""
+
+import sys
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Dialog(QtWidgets.QDialog):
+ MESSAGE = "<p>Message boxes have a caption, a text, and up to three " \
+ "buttons, each with standard or custom texts.</p>" \
+ "<p>Click a button to close the message box. Pressing the Esc " \
+ "button will activate the detected escape button (if any).</p>"
+
+ def __init__(self, parent=None):
+ super(Dialog, self).__init__(parent)
+
+ self.openFilesPath = ''
+
+ self.errorMessageDialog = QtWidgets.QErrorMessage(self)
+
+ frameStyle = QtWidgets.QFrame.Sunken | QtWidgets.QFrame.Panel
+
+ self.integerLabel = QtWidgets.QLabel()
+ self.integerLabel.setFrameStyle(frameStyle)
+ self.integerButton = QtWidgets.QPushButton("QInputDialog.get&Integer()")
+
+ self.doubleLabel = QtWidgets.QLabel()
+ self.doubleLabel.setFrameStyle(frameStyle)
+ self.doubleButton = QtWidgets.QPushButton("QInputDialog.get&Double()")
+
+ self.itemLabel = QtWidgets.QLabel()
+ self.itemLabel.setFrameStyle(frameStyle)
+ self.itemButton = QtWidgets.QPushButton("QInputDialog.getIte&m()")
+
+ self.textLabel = QtWidgets.QLabel()
+ self.textLabel.setFrameStyle(frameStyle)
+ self.textButton = QtWidgets.QPushButton("QInputDialog.get&Text()")
+
+ self.colorLabel = QtWidgets.QLabel()
+ self.colorLabel.setFrameStyle(frameStyle)
+ self.colorButton = QtWidgets.QPushButton("QColorDialog.get&Color()")
+
+ self.fontLabel = QtWidgets.QLabel()
+ self.fontLabel.setFrameStyle(frameStyle)
+ self.fontButton = QtWidgets.QPushButton("QFontDialog.get&Font()")
+
+ self.directoryLabel = QtWidgets.QLabel()
+ self.directoryLabel.setFrameStyle(frameStyle)
+ self.directoryButton = QtWidgets.QPushButton("QFileDialog.getE&xistingDirectory()")
+
+ self.openFileNameLabel = QtWidgets.QLabel()
+ self.openFileNameLabel.setFrameStyle(frameStyle)
+ self.openFileNameButton = QtWidgets.QPushButton("QFileDialog.get&OpenFileName()")
+
+ self.openFileNamesLabel = QtWidgets.QLabel()
+ self.openFileNamesLabel.setFrameStyle(frameStyle)
+ self.openFileNamesButton = QtWidgets.QPushButton("QFileDialog.&getOpenFileNames()")
+
+ self.saveFileNameLabel = QtWidgets.QLabel()
+ self.saveFileNameLabel.setFrameStyle(frameStyle)
+ self.saveFileNameButton = QtWidgets.QPushButton("QFileDialog.get&SaveFileName()")
+
+ self.criticalLabel = QtWidgets.QLabel()
+ self.criticalLabel.setFrameStyle(frameStyle)
+ self.criticalButton = QtWidgets.QPushButton("QMessageBox.critica&l()")
+
+ self.informationLabel = QtWidgets.QLabel()
+ self.informationLabel.setFrameStyle(frameStyle)
+ self.informationButton = QtWidgets.QPushButton("QMessageBox.i&nformation()")
+
+ self.questionLabel = QtWidgets.QLabel()
+ self.questionLabel.setFrameStyle(frameStyle)
+ self.questionButton = QtWidgets.QPushButton("QMessageBox.&question()")
+
+ self.warningLabel = QtWidgets.QLabel()
+ self.warningLabel.setFrameStyle(frameStyle)
+ self.warningButton = QtWidgets.QPushButton("QMessageBox.&warning()")
+
+ self.errorLabel = QtWidgets.QLabel()
+ self.errorLabel.setFrameStyle(frameStyle)
+ self.errorButton = QtWidgets.QPushButton("QErrorMessage.show&M&essage()")
+
+ self.integerButton.clicked.connect(self.setInteger)
+ self.doubleButton.clicked.connect(self.setDouble)
+ self.itemButton.clicked.connect(self.setItem)
+ self.textButton.clicked.connect(self.setText)
+ self.colorButton.clicked.connect(self.setColor)
+ self.fontButton.clicked.connect(self.setFont)
+ self.directoryButton.clicked.connect(self.setExistingDirectory)
+ self.openFileNameButton.clicked.connect(self.setOpenFileName)
+ self.openFileNamesButton.clicked.connect(self.setOpenFileNames)
+ self.saveFileNameButton.clicked.connect(self.setSaveFileName)
+ self.criticalButton.clicked.connect(self.criticalMessage)
+ self.informationButton.clicked.connect(self.informationMessage)
+ self.questionButton.clicked.connect(self.questionMessage)
+ self.warningButton.clicked.connect(self.warningMessage)
+ self.errorButton.clicked.connect(self.errorMessage)
+
+ self.native = QtWidgets.QCheckBox()
+ self.native.setText("Use native file dialog.")
+ self.native.setChecked(True)
+ if sys.platform not in ("win32", "darwin"):
+ self.native.hide()
+
+ layout = QtWidgets.QGridLayout()
+ layout.setColumnStretch(1, 1)
+ layout.setColumnMinimumWidth(1, 250)
+ layout.addWidget(self.integerButton, 0, 0)
+ layout.addWidget(self.integerLabel, 0, 1)
+ layout.addWidget(self.doubleButton, 1, 0)
+ layout.addWidget(self.doubleLabel, 1, 1)
+ layout.addWidget(self.itemButton, 2, 0)
+ layout.addWidget(self.itemLabel, 2, 1)
+ layout.addWidget(self.textButton, 3, 0)
+ layout.addWidget(self.textLabel, 3, 1)
+ layout.addWidget(self.colorButton, 4, 0)
+ layout.addWidget(self.colorLabel, 4, 1)
+ layout.addWidget(self.fontButton, 5, 0)
+ layout.addWidget(self.fontLabel, 5, 1)
+ layout.addWidget(self.directoryButton, 6, 0)
+ layout.addWidget(self.directoryLabel, 6, 1)
+ layout.addWidget(self.openFileNameButton, 7, 0)
+ layout.addWidget(self.openFileNameLabel, 7, 1)
+ layout.addWidget(self.openFileNamesButton, 8, 0)
+ layout.addWidget(self.openFileNamesLabel, 8, 1)
+ layout.addWidget(self.saveFileNameButton, 9, 0)
+ layout.addWidget(self.saveFileNameLabel, 9, 1)
+ layout.addWidget(self.criticalButton, 10, 0)
+ layout.addWidget(self.criticalLabel, 10, 1)
+ layout.addWidget(self.informationButton, 11, 0)
+ layout.addWidget(self.informationLabel, 11, 1)
+ layout.addWidget(self.questionButton, 12, 0)
+ layout.addWidget(self.questionLabel, 12, 1)
+ layout.addWidget(self.warningButton, 13, 0)
+ layout.addWidget(self.warningLabel, 13, 1)
+ layout.addWidget(self.errorButton, 14, 0)
+ layout.addWidget(self.errorLabel, 14, 1)
+ layout.addWidget(self.native, 15, 0)
+ self.setLayout(layout)
+
+ self.setWindowTitle("Standard Dialogs")
+
+ def setInteger(self):
+ i, ok = QtWidgets.QInputDialog.getInt(self,
+ "QInputDialog.getInteger()", "Percentage:", 25, 0, 100, 1)
+ if ok:
+ self.integerLabel.setText("%d%%" % i)
+
+ def setDouble(self):
+ d, ok = QtWidgets.QInputDialog.getDouble(self, "QInputDialog.getDouble()",
+ "Amount:", 37.56, -10000, 10000, 2)
+ if ok:
+ self.doubleLabel.setText("$%g" % d)
+
+ def setItem(self):
+ items = ("Spring", "Summer", "Fall", "Winter")
+
+ item, ok = QtWidgets.QInputDialog.getItem(self, "QInputDialog.getItem()",
+ "Season:", items, 0, False)
+ if ok and item:
+ self.itemLabel.setText(item)
+
+ def setText(self):
+ text, ok = QtWidgets.QInputDialog.getText(self, "QInputDialog.getText()",
+ "User name:", QtWidgets.QLineEdit.Normal,
+ QtCore.QDir.home().dirName())
+ if ok and text != '':
+ self.textLabel.setText(text)
+
+ def setColor(self):
+ color = QtWidgets.QColorDialog.getColor(QtCore.Qt.green, self)
+ if color.isValid():
+ self.colorLabel.setText(color.name())
+ self.colorLabel.setPalette(QtGui.QPalette(color))
+ self.colorLabel.setAutoFillBackground(True)
+
+ def setFont(self):
+ font, ok = QtWidgets.QFontDialog.getFont(QtGui.QFont(self.fontLabel.text()), self)
+ if ok:
+ self.fontLabel.setText(font.key())
+ self.fontLabel.setFont(font)
+
+ def setExistingDirectory(self):
+ options = QtWidgets.QFileDialog.DontResolveSymlinks | QtWidgets.QFileDialog.ShowDirsOnly
+ directory = QtWidgets.QFileDialog.getExistingDirectory(self,
+ "QFileDialog.getExistingDirectory()",
+ self.directoryLabel.text(), options)
+ if directory:
+ self.directoryLabel.setText(directory)
+
+ def setOpenFileName(self):
+ options = QtWidgets.QFileDialog.Options()
+ if not self.native.isChecked():
+ options |= QtWidgets.QFileDialog.DontUseNativeDialog
+ fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self,
+ "QFileDialog.getOpenFileName()",
+ self.openFileNameLabel.text(),
+ "All Files (*);;Text Files (*.txt)", "", options)
+ if fileName:
+ self.openFileNameLabel.setText(fileName)
+
+ def setOpenFileNames(self):
+ options = QtWidgets.QFileDialog.Options()
+ if not self.native.isChecked():
+ options |= QtWidgets.QFileDialog.DontUseNativeDialog
+ files, filtr = QtWidgets.QFileDialog.getOpenFileNames(self,
+ "QFileDialog.getOpenFileNames()", self.openFilesPath,
+ "All Files (*);;Text Files (*.txt)", "", options)
+ if files:
+ self.openFilesPath = files[0]
+ self.openFileNamesLabel.setText("[%s]" % ', '.join(files))
+
+ def setSaveFileName(self):
+ options = QtWidgets.QFileDialog.Options()
+ if not self.native.isChecked():
+ options |= QtWidgets.QFileDialog.DontUseNativeDialog
+ fileName, filtr = QtWidgets.QFileDialog.getSaveFileName(self,
+ "QFileDialog.getSaveFileName()",
+ self.saveFileNameLabel.text(),
+ "All Files (*);;Text Files (*.txt)", "", options)
+ if fileName:
+ self.saveFileNameLabel.setText(fileName)
+
+ def criticalMessage(self):
+ reply = QtWidgets.QMessageBox.critical(self, "QMessageBox.critical()",
+ Dialog.MESSAGE,
+ QtWidgets.QMessageBox.Abort | QtWidgets.QMessageBox.Retry | QtWidgets.QMessageBox.Ignore)
+ if reply == QtWidgets.QMessageBox.Abort:
+ self.criticalLabel.setText("Abort")
+ elif reply == QtWidgets.QMessageBox.Retry:
+ self.criticalLabel.setText("Retry")
+ else:
+ self.criticalLabel.setText("Ignore")
+
+ def informationMessage(self):
+ reply = QtWidgets.QMessageBox.information(self,
+ "QMessageBox.information()", Dialog.MESSAGE)
+ if reply == QtWidgets.QMessageBox.Ok:
+ self.informationLabel.setText("OK")
+ else:
+ self.informationLabel.setText("Escape")
+
+ def questionMessage(self):
+ reply = QtWidgets.QMessageBox.question(self, "QMessageBox.question()",
+ Dialog.MESSAGE,
+ QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Cancel)
+ if reply == QtWidgets.QMessageBox.Yes:
+ self.questionLabel.setText("Yes")
+ elif reply == QtWidgets.QMessageBox.No:
+ self.questionLabel.setText("No")
+ else:
+ self.questionLabel.setText("Cancel")
+
+ def warningMessage(self):
+ msgBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning,
+ "QMessageBox.warning()", Dialog.MESSAGE,
+ QtWidgets.QMessageBox.NoButton, self)
+ msgBox.addButton("Save &Again", QtWidgets.QMessageBox.AcceptRole)
+ msgBox.addButton("&Continue", QtWidgets.QMessageBox.RejectRole)
+ if msgBox.exec_() == QtWidgets.QMessageBox.AcceptRole:
+ self.warningLabel.setText("Save Again")
+ else:
+ self.warningLabel.setText("Continue")
+
+ def errorMessage(self):
+ self.errorMessageDialog.showMessage("This dialog shows and remembers "
+ "error messages. If the checkbox is checked (as it is by "
+ "default), the shown message will be shown again, but if the "
+ "user unchecks the box the message will not appear again if "
+ "QErrorMessage.showMessage() is called with the same message.")
+ self.errorLabel.setText("If the box is unchecked, the message won't "
+ "appear again.")
+
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+ dialog = Dialog()
+ sys.exit(dialog.exec_())
diff --git a/examples/widgets/dialogs/trivialwizard.py b/examples/widgets/dialogs/trivialwizard.py
new file mode 100755
index 000000000..64a25878e
--- /dev/null
+++ b/examples/widgets/dialogs/trivialwizard.py
@@ -0,0 +1,113 @@
+#!/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 widgets/dialogs/trivialwizard example from Qt v5.x"""
+
+from PySide2 import QtWidgets
+
+
+def createIntroPage():
+ page = QtWidgets.QWizardPage()
+ page.setTitle("Introduction")
+
+ label = QtWidgets.QLabel("This wizard will help you register your copy of "
+ "Super Product Two.")
+ label.setWordWrap(True)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(label)
+ page.setLayout(layout)
+
+ return page
+
+
+def createRegistrationPage():
+ page = QtWidgets.QWizardPage()
+ page.setTitle("Registration")
+ page.setSubTitle("Please fill both fields.")
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ nameLineEdit = QtWidgets.QLineEdit()
+
+ emailLabel = QtWidgets.QLabel("Email address:")
+ emailLineEdit = QtWidgets.QLineEdit()
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(nameLabel, 0, 0)
+ layout.addWidget(nameLineEdit, 0, 1)
+ layout.addWidget(emailLabel, 1, 0)
+ layout.addWidget(emailLineEdit, 1, 1)
+ page.setLayout(layout)
+
+ return page
+
+
+def createConclusionPage():
+ page = QtWidgets.QWizardPage()
+ page.setTitle("Conclusion")
+
+ label = QtWidgets.QLabel("You are now successfully registered. Have a nice day!")
+ label.setWordWrap(True)
+
+ layout = QtWidgets.QVBoxLayout()
+ layout.addWidget(label)
+ page.setLayout(layout)
+
+ return page
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ wizard = QtWidgets.QWizard()
+ wizard.addPage(createIntroPage())
+ wizard.addPage(createRegistrationPage())
+ wizard.addPage(createConclusionPage())
+
+ wizard.setWindowTitle("Trivial Wizard")
+ wizard.show()
+
+ sys.exit(wizard.exec_())
diff --git a/examples/widgets/draganddrop/draggabletext/draggabletext.py b/examples/widgets/draganddrop/draggabletext/draggabletext.py
new file mode 100755
index 000000000..eaddc57d1
--- /dev/null
+++ b/examples/widgets/draganddrop/draggabletext/draggabletext.py
@@ -0,0 +1,156 @@
+#!/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 widgets/draganddrop/draggabletext example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import QFile, QIODevice, QMimeData, QPoint, Qt, QTextStream
+from PySide2.QtGui import QDrag, QPalette, QPixmap
+from PySide2.QtWidgets import QApplication, QFrame, QLabel, QWidget
+
+import draggabletext_rc
+
+
+class DragLabel(QLabel):
+ def __init__(self, text, parent):
+ super(DragLabel, self).__init__(text, parent)
+
+ self.setAutoFillBackground(True)
+ self.setFrameShape(QFrame.Panel)
+ self.setFrameShadow(QFrame.Raised)
+
+ def mousePressEvent(self, event):
+ hotSpot = event.pos()
+
+ mimeData = QMimeData()
+ mimeData.setText(self.text())
+ mimeData.setData('application/x-hotspot',
+ '%d %d' % (hotSpot.x(), hotSpot.y()))
+
+ pixmap = QPixmap(self.size())
+ self.render(pixmap)
+
+ drag = QDrag(self)
+ drag.setMimeData(mimeData)
+ drag.setPixmap(pixmap)
+ drag.setHotSpot(hotSpot)
+
+ dropAction = drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction)
+
+ if dropAction == Qt.MoveAction:
+ self.close()
+ self.update()
+
+
+class DragWidget(QWidget):
+ def __init__(self, parent=None):
+ super(DragWidget, self).__init__(parent)
+
+ dictionaryFile = QFile(':/dictionary/words.txt')
+ dictionaryFile.open(QIODevice.ReadOnly)
+
+ x = 5
+ y = 5
+
+ for word in QTextStream(dictionaryFile).readAll().split():
+ wordLabel = DragLabel(word, self)
+ wordLabel.move(x, y)
+ wordLabel.show()
+ x += wordLabel.width() + 2
+ if x >= 195:
+ x = 5
+ y += wordLabel.height() + 2
+
+ newPalette = self.palette()
+ newPalette.setColor(QPalette.Window, Qt.white)
+ self.setPalette(newPalette)
+
+ self.setAcceptDrops(True)
+ self.setMinimumSize(400, max(200, y))
+ self.setWindowTitle("Draggable Text")
+
+ def dragEnterEvent(self, event):
+ if event.mimeData().hasText():
+ if event.source() in self.children():
+ event.setDropAction(Qt.MoveAction)
+ event.accept()
+ else:
+ event.acceptProposedAction()
+ else:
+ event.ignore()
+
+ def dropEvent(self, event):
+ if event.mimeData().hasText():
+ mime = event.mimeData()
+ pieces = mime.text().split()
+ position = event.pos()
+ hotSpot = QPoint()
+
+ hotSpotPos = mime.data('application/x-hotspot').split(' ')
+ if len(hotSpotPos) == 2:
+ hotSpot.setX(hotSpotPos[0].toInt()[0])
+ hotSpot.setY(hotSpotPos[1].toInt()[0])
+
+ for piece in pieces:
+ newLabel = DragLabel(piece, self)
+ newLabel.move(position - hotSpot)
+ newLabel.show()
+
+ position += QPoint(newLabel.width(), 0)
+
+ if event.source() in self.children():
+ event.setDropAction(Qt.MoveAction)
+ event.accept()
+ else:
+ event.acceptProposedAction()
+ else:
+ event.ignore()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ window = DragWidget()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/draganddrop/draggabletext/draggabletext.qrc b/examples/widgets/draganddrop/draggabletext/draggabletext.qrc
new file mode 100644
index 000000000..b72217d70
--- /dev/null
+++ b/examples/widgets/draganddrop/draggabletext/draggabletext.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/dictionary">
+ <file>words.txt</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py b/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py
new file mode 100644
index 000000000..21874a6b4
--- /dev/null
+++ b/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py
@@ -0,0 +1,97 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Fri Jul 30 17:41:35 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x00\xf7\
+\x51\
+\x74\x0a\x51\x75\x61\x72\x74\x65\x72\x6c\x79\x0a\x69\x73\x0a\x61\
+\x0a\x70\x61\x70\x65\x72\x0a\x62\x61\x73\x65\x64\x0a\x6e\x65\x77\
+\x73\x6c\x65\x74\x74\x65\x72\x0a\x65\x78\x63\x6c\x75\x73\x69\x76\
+\x65\x6c\x79\x0a\x61\x76\x61\x69\x6c\x61\x62\x6c\x65\x0a\x74\x6f\
+\x0a\x51\x74\x0a\x63\x75\x73\x74\x6f\x6d\x65\x72\x73\x0a\x45\x76\
+\x65\x72\x79\x0a\x71\x75\x61\x72\x74\x65\x72\x0a\x77\x65\x0a\x6d\
+\x61\x69\x6c\x0a\x6f\x75\x74\x0a\x61\x6e\x0a\x69\x73\x73\x75\x65\
+\x0a\x74\x68\x61\x74\x0a\x77\x65\x0a\x68\x6f\x70\x65\x0a\x77\x69\
+\x6c\x6c\x0a\x62\x72\x69\x6e\x67\x0a\x61\x64\x64\x65\x64\x0a\x69\
+\x6e\x73\x69\x67\x68\x74\x0a\x61\x6e\x64\x0a\x70\x6c\x65\x61\x73\
+\x75\x72\x65\x0a\x74\x6f\x0a\x79\x6f\x75\x72\x0a\x51\x74\x0a\x70\
+\x72\x6f\x67\x72\x61\x6d\x6d\x69\x6e\x67\x0a\x77\x69\x74\x68\x0a\
+\x68\x69\x67\x68\x0a\x71\x75\x61\x6c\x69\x74\x79\x0a\x74\x65\x63\
+\x68\x6e\x69\x63\x61\x6c\x0a\x61\x72\x74\x69\x63\x6c\x65\x73\x0a\
+\x77\x72\x69\x74\x74\x65\x6e\x0a\x62\x79\x0a\x51\x74\x0a\x65\x78\
+\x70\x65\x72\x74\x73\x0a\
+"
+
+qt_resource_name = b"\
+\x00\x0a\
+\x0b\x0b\x17\xd9\
+\x00\x64\
+\x00\x69\x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x61\x00\x72\x00\x79\
+\x00\x09\
+\x08\xb6\xa7\x34\
+\x00\x77\
+\x00\x6f\x00\x72\x00\x64\x00\x73\x00\x2e\x00\x74\x00\x78\x00\x74\
+"
+
+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\x01\x00\x00\x00\x02\
+\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/draganddrop/draggabletext/words.txt b/examples/widgets/draganddrop/draggabletext/words.txt
new file mode 100644
index 000000000..19b8b0325
--- /dev/null
+++ b/examples/widgets/draganddrop/draggabletext/words.txt
@@ -0,0 +1,41 @@
+Qt
+Quarterly
+is
+a
+paper
+based
+newsletter
+exclusively
+available
+to
+Qt
+customers
+Every
+quarter
+we
+mail
+out
+an
+issue
+that
+we
+hope
+will
+bring
+added
+insight
+and
+pleasure
+to
+your
+Qt
+programming
+with
+high
+quality
+technical
+articles
+written
+by
+Qt
+experts
diff --git a/examples/widgets/effects/lighting.py b/examples/widgets/effects/lighting.py
new file mode 100755
index 000000000..efbb74711
--- /dev/null
+++ b/examples/widgets/effects/lighting.py
@@ -0,0 +1,145 @@
+#!/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$
+##
+#############################################################################
+
+import math
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Lighting(QtWidgets.QGraphicsView):
+ def __init__(self, parent=None):
+ super(Lighting, self).__init__(parent)
+
+ self.angle = 0.0
+ self.m_scene = QtWidgets.QGraphicsScene()
+ self.m_lightSource = None
+ self.m_items = []
+
+ self.setScene(self.m_scene)
+
+ self.setupScene()
+
+ timer = QtCore.QTimer(self)
+ timer.timeout.connect(self.animate)
+ timer.setInterval(30)
+ timer.start()
+
+ self.setRenderHint(QtGui.QPainter.Antialiasing)
+ self.setFrameStyle(QtWidgets.QFrame.NoFrame)
+
+ def setupScene(self):
+ self.m_scene.setSceneRect(-300, -200, 600, 460)
+
+ linearGrad = QtGui.QLinearGradient(QtCore.QPointF(-100, -100),
+ QtCore.QPointF(100, 100))
+ linearGrad.setColorAt(0, QtGui.QColor(255, 255, 255))
+ linearGrad.setColorAt(1, QtGui.QColor(192, 192, 255))
+ self.setBackgroundBrush(linearGrad)
+
+ radialGrad = QtGui.QRadialGradient(30, 30, 30)
+ radialGrad.setColorAt(0, QtCore.Qt.yellow)
+ radialGrad.setColorAt(0.2, QtCore.Qt.yellow)
+ radialGrad.setColorAt(1, QtCore.Qt.transparent)
+
+ pixmap = QtGui.QPixmap(60, 60)
+ pixmap.fill(QtCore.Qt.transparent)
+
+ painter = QtGui.QPainter(pixmap)
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(radialGrad)
+ painter.drawEllipse(0, 0, 60, 60)
+ painter.end()
+
+ self.m_lightSource = self.m_scene.addPixmap(pixmap)
+ self.m_lightSource.setZValue(2)
+
+ for i in range(-2, 3):
+ for j in range(-2, 3):
+ if (i + j) & 1:
+ item = QtWidgets.QGraphicsEllipseItem(0, 0, 50, 50)
+ else:
+ item = QtWidgets.QGraphicsRectItem(0, 0, 50, 50)
+
+ item.setPen(QtGui.QPen(QtCore.Qt.black, 1))
+ item.setBrush(QtGui.QBrush(QtCore.Qt.white))
+
+ effect = QtWidgets.QGraphicsDropShadowEffect(self)
+ effect.setBlurRadius(8)
+ item.setGraphicsEffect(effect)
+ item.setZValue(1)
+ item.setPos(i * 80, j * 80)
+ self.m_scene.addItem(item)
+ self.m_items.append(item)
+
+ def animate(self):
+ self.angle += (math.pi / 30)
+ xs = 200 * math.sin(self.angle) - 40 + 25
+ ys = 200 * math.cos(self.angle) - 40 + 25
+ self.m_lightSource.setPos(xs, ys)
+
+ for item in self.m_items:
+ effect = item.graphicsEffect()
+
+ delta = QtCore.QPointF(item.x() - xs, item.y() - ys)
+ effect.setOffset(QtCore.QPointF(delta.toPoint() / 30))
+
+ dd = math.hypot(delta.x(), delta.y())
+ color = effect.color()
+ color.setAlphaF(max(0.4, min(1 - dd / 200.0, 0.7)))
+ effect.setColor(color)
+
+ self.m_scene.update()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ lighting = Lighting()
+ lighting.setWindowTitle("Lighting and Shadows")
+ lighting.resize(640, 480)
+ lighting.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/anchorlayout.py b/examples/widgets/graphicsview/anchorlayout.py
new file mode 100755
index 000000000..86cea5cf8
--- /dev/null
+++ b/examples/widgets/graphicsview/anchorlayout.py
@@ -0,0 +1,126 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+def createItem(minimum, preferred, maximum, name):
+ w = QtWidgets.QGraphicsProxyWidget()
+
+ w.setWidget(QtWidgets.QPushButton(name))
+ w.setMinimumSize(minimum)
+ w.setPreferredSize(preferred)
+ w.setMaximumSize(maximum)
+ w.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
+
+ return w
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ scene = QtWidgets.QGraphicsScene()
+ scene.setSceneRect(0, 0, 800, 480)
+
+ minSize = QtCore.QSizeF(30, 100)
+ prefSize = QtCore.QSizeF(210, 100)
+ maxSize = QtCore.QSizeF(300, 100)
+
+ a = createItem(minSize, prefSize, maxSize, "A")
+ b = createItem(minSize, prefSize, maxSize, "B")
+ c = createItem(minSize, prefSize, maxSize, "C")
+ d = createItem(minSize, prefSize, maxSize, "D")
+ e = createItem(minSize, prefSize, maxSize, "E")
+ f = createItem(QtCore.QSizeF(30, 50), QtCore.QSizeF(150, 50), maxSize, "F")
+ g = createItem(QtCore.QSizeF(30, 50), QtCore.QSizeF(30, 100), maxSize, "G")
+
+ l = QtWidgets.QGraphicsAnchorLayout()
+ l.setSpacing(0)
+
+ w = QtWidgets.QGraphicsWidget(None, QtCore.Qt.Window)
+ w.setPos(20, 20)
+ w.setLayout(l)
+
+ # Vertical.
+ l.addAnchor(a, QtCore.Qt.AnchorTop, l, QtCore.Qt.AnchorTop)
+ l.addAnchor(b, QtCore.Qt.AnchorTop, l, QtCore.Qt.AnchorTop)
+
+ l.addAnchor(c, QtCore.Qt.AnchorTop, a, QtCore.Qt.AnchorBottom)
+ l.addAnchor(c, QtCore.Qt.AnchorTop, b, QtCore.Qt.AnchorBottom)
+ l.addAnchor(c, QtCore.Qt.AnchorBottom, d, QtCore.Qt.AnchorTop)
+ l.addAnchor(c, QtCore.Qt.AnchorBottom, e, QtCore.Qt.AnchorTop)
+
+ l.addAnchor(d, QtCore.Qt.AnchorBottom, l, QtCore.Qt.AnchorBottom)
+ l.addAnchor(e, QtCore.Qt.AnchorBottom, l, QtCore.Qt.AnchorBottom)
+
+ l.addAnchor(c, QtCore.Qt.AnchorTop, f, QtCore.Qt.AnchorTop)
+ l.addAnchor(c, QtCore.Qt.AnchorVerticalCenter, f, QtCore.Qt.AnchorBottom)
+ l.addAnchor(f, QtCore.Qt.AnchorBottom, g, QtCore.Qt.AnchorTop)
+ l.addAnchor(c, QtCore.Qt.AnchorBottom, g, QtCore.Qt.AnchorBottom)
+
+ # Horizontal.
+ l.addAnchor(l, QtCore.Qt.AnchorLeft, a, QtCore.Qt.AnchorLeft)
+ l.addAnchor(l, QtCore.Qt.AnchorLeft, d, QtCore.Qt.AnchorLeft)
+ l.addAnchor(a, QtCore.Qt.AnchorRight, b, QtCore.Qt.AnchorLeft)
+
+ l.addAnchor(a, QtCore.Qt.AnchorRight, c, QtCore.Qt.AnchorLeft)
+ l.addAnchor(c, QtCore.Qt.AnchorRight, e, QtCore.Qt.AnchorLeft)
+
+ l.addAnchor(b, QtCore.Qt.AnchorRight, l, QtCore.Qt.AnchorRight)
+ l.addAnchor(e, QtCore.Qt.AnchorRight, l, QtCore.Qt.AnchorRight)
+ l.addAnchor(d, QtCore.Qt.AnchorRight, e, QtCore.Qt.AnchorLeft)
+
+ l.addAnchor(l, QtCore.Qt.AnchorLeft, f, QtCore.Qt.AnchorLeft)
+ l.addAnchor(l, QtCore.Qt.AnchorLeft, g, QtCore.Qt.AnchorLeft)
+ l.addAnchor(f, QtCore.Qt.AnchorRight, g, QtCore.Qt.AnchorRight)
+
+ scene.addItem(w)
+ scene.setBackgroundBrush(QtCore.Qt.darkGreen)
+
+ view = QtWidgets.QGraphicsView(scene)
+ view.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/collidingmice/collidingmice.py b/examples/widgets/graphicsview/collidingmice/collidingmice.py
new file mode 100644
index 000000000..03c7ed199
--- /dev/null
+++ b/examples/widgets/graphicsview/collidingmice/collidingmice.py
@@ -0,0 +1,217 @@
+#!/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$
+##
+#############################################################################
+
+import math
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import mice_rc
+
+
+class Mouse(QtWidgets.QGraphicsItem):
+ Pi = math.pi
+ TwoPi = 2.0 * Pi
+
+ # Create the bounding rectangle once.
+ adjust = 0.5
+ BoundingRect = QtCore.QRectF(-20 - adjust, -22 - adjust, 40 + adjust,
+ 83 + adjust)
+
+ def __init__(self):
+ super(Mouse, self).__init__()
+
+ self.angle = 0.0
+ self.speed = 0.0
+ self.mouseEyeDirection = 0.0
+ self.color = QtGui.QColor(QtCore.qrand() % 256, QtCore.qrand() % 256,
+ QtCore.qrand() % 256)
+
+ self.setTransform(QtGui.QTransform().rotate(QtCore.qrand() % (360 * 16)))
+
+ # In the C++ version of this example, this class is also derived from
+ # QObject in order to receive timer events. PySide2 does not support
+ # deriving from more than one wrapped class so we just create an
+ # explicit timer instead.
+ self.timer = QtCore.QTimer()
+ self.timer.timeout.connect(self.timerEvent)
+ self.timer.start(1000 / 33)
+
+ @staticmethod
+ def normalizeAngle(angle):
+ while angle < 0:
+ angle += Mouse.TwoPi
+ while angle > Mouse.TwoPi:
+ angle -= Mouse.TwoPi
+ return angle
+
+ def boundingRect(self):
+ return Mouse.BoundingRect
+
+ def shape(self):
+ path = QtGui.QPainterPath()
+ path.addRect(-10, -20, 20, 40)
+ return path;
+
+ def paint(self, painter, option, widget):
+ # Body.
+ painter.setBrush(self.color)
+ painter.drawEllipse(-10, -20, 20, 40)
+
+ # Eyes.
+ painter.setBrush(QtCore.Qt.white)
+ painter.drawEllipse(-10, -17, 8, 8)
+ painter.drawEllipse(2, -17, 8, 8)
+
+ # Nose.
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawEllipse(QtCore.QRectF(-2, -22, 4, 4))
+
+ # Pupils.
+ painter.drawEllipse(QtCore.QRectF(-8.0 + self.mouseEyeDirection, -17, 4, 4))
+ painter.drawEllipse(QtCore.QRectF(4.0 + self.mouseEyeDirection, -17, 4, 4))
+
+ # Ears.
+ if self.scene().collidingItems(self):
+ painter.setBrush(QtCore.Qt.red)
+ else:
+ painter.setBrush(QtCore.Qt.darkYellow)
+
+ painter.drawEllipse(-17, -12, 16, 16)
+ painter.drawEllipse(1, -12, 16, 16)
+
+ # Tail.
+ path = QtGui.QPainterPath(QtCore.QPointF(0, 20))
+ path.cubicTo(-5, 22, -5, 22, 0, 25)
+ path.cubicTo(5, 27, 5, 32, 0, 30)
+ path.cubicTo(-5, 32, -5, 42, 0, 35)
+ painter.setBrush(QtCore.Qt.NoBrush)
+ painter.drawPath(path)
+
+ def timerEvent(self):
+ # Don't move too far away.
+ lineToCenter = QtCore.QLineF(QtCore.QPointF(0, 0), self.mapFromScene(0, 0))
+ if lineToCenter.length() > 150:
+ angleToCenter = math.acos(lineToCenter.dx() / lineToCenter.length())
+ if lineToCenter.dy() < 0:
+ angleToCenter = Mouse.TwoPi - angleToCenter;
+ angleToCenter = Mouse.normalizeAngle((Mouse.Pi - angleToCenter) + Mouse.Pi / 2)
+
+ if angleToCenter < Mouse.Pi and angleToCenter > Mouse.Pi / 4:
+ # Rotate left.
+ self.angle += [-0.25, 0.25][self.angle < -Mouse.Pi / 2]
+ elif angleToCenter >= Mouse.Pi and angleToCenter < (Mouse.Pi + Mouse.Pi / 2 + Mouse.Pi / 4):
+ # Rotate right.
+ self.angle += [-0.25, 0.25][self.angle < Mouse.Pi / 2]
+ elif math.sin(self.angle) < 0:
+ self.angle += 0.25
+ elif math.sin(self.angle) > 0:
+ self.angle -= 0.25
+
+ # Try not to crash with any other mice.
+ dangerMice = self.scene().items(QtGui.QPolygonF([self.mapToScene(0, 0),
+ self.mapToScene(-30, -50),
+ self.mapToScene(30, -50)]))
+
+ for item in dangerMice:
+ if item is self:
+ continue
+
+ lineToMouse = QtCore.QLineF(QtCore.QPointF(0, 0), self.mapFromItem(item, 0, 0))
+ angleToMouse = math.acos(lineToMouse.dx() / lineToMouse.length())
+ if lineToMouse.dy() < 0:
+ angleToMouse = Mouse.TwoPi - angleToMouse
+ angleToMouse = Mouse.normalizeAngle((Mouse.Pi - angleToMouse) + Mouse.Pi / 2)
+
+ if angleToMouse >= 0 and angleToMouse < Mouse.Pi / 2:
+ # Rotate right.
+ self.angle += 0.5
+ elif angleToMouse <= Mouse.TwoPi and angleToMouse > (Mouse.TwoPi - Mouse.Pi / 2):
+ # Rotate left.
+ self.angle -= 0.5
+
+ # Add some random movement.
+ if len(dangerMice) > 1 and (QtCore.qrand() % 10) == 0:
+ if QtCore.qrand() % 1:
+ self.angle += (QtCore.qrand() % 100) / 500.0
+ else:
+ self.angle -= (QtCore.qrand() % 100) / 500.0
+
+ self.speed += (-50 + QtCore.qrand() % 100) / 100.0
+
+ dx = math.sin(self.angle) * 10
+ self.mouseEyeDirection = [dx / 5, 0.0][QtCore.qAbs(dx / 5) < 1]
+
+ self.setTransform(QtGui.QTransform().rotate(dx))
+ self.setPos(self.mapToParent(0, -(3 + math.sin(self.speed) * 3)))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ MouseCount = 7
+
+ app = QtWidgets.QApplication(sys.argv)
+ QtCore.qsrand(QtCore.QTime(0,0,0).secsTo(QtCore.QTime.currentTime()))
+
+ scene = QtWidgets.QGraphicsScene()
+ scene.setSceneRect(-300, -300, 600, 600)
+ scene.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)
+
+ for i in range(MouseCount):
+ mouse = Mouse()
+ mouse.setPos(math.sin((i * 6.28) / MouseCount) * 200,
+ math.cos((i * 6.28) / MouseCount) * 200)
+ scene.addItem(mouse)
+
+ view = QtWidgets.QGraphicsView(scene)
+ view.setRenderHint(QtGui.QPainter.Antialiasing)
+ view.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/cheese.jpg')))
+ view.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
+ view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate)
+ view.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag)
+ view.setWindowTitle("Colliding Mice")
+ view.resize(400, 300)
+ view.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/collidingmice/mice_rc.py b/examples/widgets/graphicsview/collidingmice/mice_rc.py
new file mode 100644
index 000000000..bf3243b06
--- /dev/null
+++ b/examples/widgets/graphicsview/collidingmice/mice_rc.py
@@ -0,0 +1,271 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Fri Jul 30 17:52:15 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x0b\xd5\
+\xff\
+\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x02\x01\x00\x48\x00\
+\x48\x00\x00\xff\xee\x00\x0e\x41\x64\x6f\x62\x65\x00\x64\x40\x00\
+\x00\x00\x01\xff\xdb\x00\x84\x00\x02\x02\x02\x02\x02\x02\x02\x02\
+\x02\x02\x03\x02\x02\x02\x03\x04\x03\x02\x02\x03\x04\x05\x04\x04\
+\x04\x04\x04\x05\x06\x05\x05\x05\x05\x05\x05\x06\x06\x07\x07\x08\
+\x07\x07\x06\x09\x09\x0a\x0a\x09\x09\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
+\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\x03\x03\x03\x05\x04\x05\x09\
+\x06\x06\x09\x0d\x0a\x09\x0a\x0d\x0f\x0e\x0e\x0e\x0e\x0f\x0f\x0c\
+\x0c\x0c\x0c\x0c\x0f\x0f\x0c\x0c\x0c\x0c\x0c\x0c\x0f\x0c\x0c\x0c\
+\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
+\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\x5e\
+\x00\x5e\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\
+\x00\x0c\xff\xc4\x01\xa2\x00\x00\x00\x07\x01\x01\x01\x01\x01\x00\
+\x00\x00\x00\x00\x00\x00\x00\x04\x05\x03\x02\x06\x01\x00\x07\x08\
+\x09\x0a\x0b\x01\x00\x02\x02\x03\x01\x01\x01\x01\x01\x00\x00\x00\
+\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\
+\x10\x00\x02\x01\x03\x03\x02\x04\x02\x06\x07\x03\x04\x02\x06\x02\
+\x73\x01\x02\x03\x11\x04\x00\x05\x21\x12\x31\x41\x51\x06\x13\x61\
+\x22\x71\x81\x14\x32\x91\xa1\x07\x15\xb1\x42\x23\xc1\x52\xd1\xe1\
+\x33\x16\x62\xf0\x24\x72\x82\xf1\x25\x43\x34\x53\x92\xa2\xb2\x63\
+\x73\xc2\x35\x44\x27\x93\xa3\xb3\x36\x17\x54\x64\x74\xc3\xd2\xe2\
+\x08\x26\x83\x09\x0a\x18\x19\x84\x94\x45\x46\xa4\xb4\x56\xd3\x55\
+\x28\x1a\xf2\xe3\xf3\xc4\xd4\xe4\xf4\x65\x75\x85\x95\xa5\xb5\xc5\
+\xd5\xe5\xf5\x66\x76\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6\x37\x47\x57\
+\x67\x77\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x38\x48\x58\x68\x78\x88\
+\x98\xa8\xb8\xc8\xd8\xe8\xf8\x29\x39\x49\x59\x69\x79\x89\x99\xa9\
+\xb9\xc9\xd9\xe9\xf9\x2a\x3a\x4a\x5a\x6a\x7a\x8a\x9a\xaa\xba\xca\
+\xda\xea\xfa\x11\x00\x02\x02\x01\x02\x03\x05\x05\x04\x05\x06\x04\
+\x08\x03\x03\x6d\x01\x00\x02\x11\x03\x04\x21\x12\x31\x41\x05\x51\
+\x13\x61\x22\x06\x71\x81\x91\x32\xa1\xb1\xf0\x14\xc1\xd1\xe1\x23\
+\x42\x15\x52\x62\x72\xf1\x33\x24\x34\x43\x82\x16\x92\x53\x25\xa2\
+\x63\xb2\xc2\x07\x73\xd2\x35\xe2\x44\x83\x17\x54\x93\x08\x09\x0a\
+\x18\x19\x26\x36\x45\x1a\x27\x64\x74\x55\x37\xf2\xa3\xb3\xc3\x28\
+\x29\xd3\xe3\xf3\x84\x94\xa4\xb4\xc4\xd4\xe4\xf4\x65\x75\x85\x95\
+\xa5\xb5\xc5\xd5\xe5\xf5\x46\x56\x66\x76\x86\x96\xa6\xb6\xc6\xd6\
+\xe6\xf6\x47\x57\x67\x77\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x38\x48\
+\x58\x68\x78\x88\x98\xa8\xb8\xc8\xd8\xe8\xf8\x39\x49\x59\x69\x79\
+\x89\x99\xa9\xb9\xc9\xd9\xe9\xf9\x2a\x3a\x4a\x5a\x6a\x7a\x8a\x9a\
+\xaa\xba\xca\xda\xea\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\
+\x11\x00\x3f\x00\xfb\x41\xd3\x6f\xa2\x87\xc7\x3c\x37\x89\xe9\xd4\
+\xe9\xe2\x6b\x90\x29\x6e\xa3\x72\x4d\x0d\x0f\x8f\xf0\xc8\x82\xa5\
+\xb2\x41\x5a\x86\xfa\x46\xf9\x22\x37\x50\xa6\x63\xe5\xe2\x76\xf9\
+\x60\xe4\x95\xc1\x48\xd8\x74\x3d\x46\x0b\x56\xa4\x9a\x18\x14\x31\
+\x60\xa4\xec\x6b\xe3\x92\x1b\xa0\xac\x49\x92\x51\x1b\x02\xad\xc8\
+\x91\xb7\xea\xc2\x84\x34\xaf\xc5\x8e\xfb\x77\xc9\x81\x6c\x49\x62\
+\x3a\xaf\x9e\x3c\xbf\xa3\xcc\x6d\xee\xef\x2b\x38\x34\x68\x61\x1e\
+\xa3\x03\xfe\x55\x36\x1f\x7e\x3c\x51\x09\x11\x94\x91\xfa\x47\x9a\
+\xb4\x9d\x6e\xa9\x61\x75\xce\x50\x2a\x60\x70\x51\xe9\xec\x0f\x5f\
+\xa3\x11\x38\xc8\xd2\x0c\x65\x16\x48\x25\x3c\x5b\x7f\x0c\x4c\x37\
+\x5e\x2d\x9f\xff\xd0\xfb\x3a\xfb\x0a\xee\x4d\x6b\x4c\xf0\xb0\x1e\
+\xa1\x6f\x2d\xfa\x6e\x71\x21\x34\xb8\x11\x5e\x9b\xe4\x50\xd3\x53\
+\xa7\x8e\xe7\x25\x6a\xda\xd0\xee\x48\x03\xc7\x04\x95\x4e\x59\x12\
+\x15\x2e\xce\x02\x81\x52\x7e\x59\x00\x2d\x2f\x9c\xbf\x36\xbc\xc7\
+\xa8\x98\xa5\x5d\x1f\xce\x9a\x7e\x8f\x67\x14\x6c\xb7\x36\xf1\xd5\
+\xef\x5d\xc8\x20\x08\xe8\x0f\x1a\xd7\xae\xc4\x65\xb8\xf2\x00\x6a\
+\x89\xfb\x99\xc6\x16\x37\x67\x9f\x93\xcf\xa8\xdc\xf9\x2a\xda\xe2\
+\xfe\x49\xa6\x9d\xee\x65\x58\xee\x2e\x09\x77\x68\xd4\x2d\x0d\x4e\
+\xf5\xa9\x3d\x72\x73\x02\xb8\xbb\xda\xe5\xb4\xa9\x96\xf9\xa2\x6b\
+\x8b\x2d\x12\xfa\xea\xdc\x11\x3d\x38\x44\x47\x50\x5b\x6a\xfd\x19\
+\x5c\xe5\x51\xd9\x61\x1e\x29\x51\x7c\xdf\x17\x97\xda\xf2\x43\x35\
+\xc2\x16\x66\x35\x24\xd4\xd0\x93\x95\x44\x97\x22\x42\x99\x5e\x9b\
+\xa3\x5c\xe9\x77\x56\xd7\x56\xfc\x97\x83\x06\x53\x4e\x84\x65\x73\
+\xca\x8e\x0b\x7b\xbf\xac\x46\x9e\x2f\x3d\x3d\xcc\x3e\xa7\xa7\xef\
+\x4e\x9f\x7e\x65\xf8\x9e\x9e\x2f\x27\x13\x87\x7a\x7f\xff\xd1\xfb\
+\x3f\x4a\xed\xd4\xf6\xcf\x0b\xa7\xa8\x51\x79\x15\x3f\xd6\x3d\xb0\
+\x88\x71\x2d\xd2\x81\x9a\x84\x16\x6a\x7b\x64\xbc\x26\x06\x61\xc6\
+\x70\x4a\x91\x4a\x74\x22\x98\xf8\x74\x8e\x30\x55\xd4\x87\x07\x6e\
+\xdb\x8c\x8f\x0b\x3b\x40\xde\xda\x0b\x88\x9a\x16\x62\x12\x4a\x83\
+\xc4\xd1\xa8\x7c\x0e\xf9\x20\x05\xee\xac\x15\xbf\x2b\x7c\xb5\x3d\
+\xe0\xbb\x9e\x59\x1b\xe2\xe4\xc8\x62\x42\xff\x00\x21\x25\x4f\xdf\
+\xc7\x2c\x88\xc5\xd6\xfd\xcc\xbc\x49\x8e\x54\xf4\x6b\x2b\x5b\x2d\
+\x3a\xd6\x1b\x2b\x0b\x65\xb6\xb4\x80\x11\x1c\x29\xfe\x51\xab\x13\
+\xee\x4e\xe7\x21\x96\x7c\x67\x95\x00\xc0\x0e\xa7\x9a\xdd\x4e\xca\
+\x3d\x4e\xc2\xe6\xcd\xb6\x12\x80\x50\x9e\xcc\x37\x15\xca\xc4\x44\
+\xbd\x27\xab\x21\x23\x13\x61\x85\x69\xbe\x5c\x92\xdd\xbd\x3b\x8b\
+\x76\x4a\x1d\xd5\xc6\xff\x00\xdb\x98\xd9\x23\x2c\x47\x84\xb9\x3c\
+\x42\x7b\xb2\xdf\xd0\x29\x38\x58\x91\x15\x55\x57\x76\x3f\x65\x47\
+\x72\x4f\xb6\x47\x06\x9a\x59\x32\xd0\x3b\x75\x3d\xc1\xae\x79\xc4\
+\x42\x61\xe9\xdb\x95\x16\xf4\xff\x00\x47\x54\xf4\xf9\x53\xf6\x69\
+\xc7\x95\x3f\x1c\xd8\xdc\x38\xab\xf8\x7f\x43\x8b\x52\xab\xea\xff\
+\x00\xff\xd2\xfb\x3e\x0f\x2d\x80\xa9\xcf\x0a\xb7\xa8\x4a\x2f\xe7\
+\x8e\xda\x39\xee\x66\x71\x1c\x50\x21\x79\x1c\xf4\x01\x45\x49\x39\
+\x7c\x48\x02\xcb\x59\xb2\x68\x3e\x52\xf3\x27\xe6\x7f\x9a\xf5\x4b\
+\xe9\x62\xd0\x49\xd3\x6c\x51\x88\x8d\xd2\x9e\xab\x81\xdd\x9c\x83\
+\xd7\xc0\x65\x3e\x29\x9f\x5a\x72\x23\x86\x31\xe7\xba\x71\xe5\x5f\
+\x3e\x79\xa2\xd6\xee\x08\xf5\x8b\x87\xbe\xb5\x94\x81\x22\x4c\x01\
+\x60\x0f\x52\xac\x05\x76\xf7\xc8\x1c\x86\x06\xed\x12\xc4\x25\xc8\
+\x53\xe9\x9b\x49\x96\x45\x8a\x68\xdb\x9c\x52\x85\x64\x61\xd0\xa9\
+\x1b\x66\x41\x20\x8b\x0e\x3c\x6c\x1a\x4c\x4d\x08\x3b\x74\x39\x53\
+\x6a\xd0\xb4\xad\x0d\x3d\xb0\x5a\xb7\xb8\x20\x56\x83\x1b\x55\xe2\
+\x4e\x3d\x45\x6a\x30\x91\x6a\xa1\x15\xed\xd4\x44\x8a\x2c\xb1\x8f\
+\xb0\x8e\xa1\xa9\xf2\xae\xf9\x31\x9a\x63\x6d\x8f\xbc\x02\xd6\x60\
+\x3d\xcb\xa4\xbc\xbc\xb9\xf8\x5d\xb8\x45\xfc\x8a\x02\x83\xf3\x00\
+\x63\x3c\xb2\x90\xa3\xb0\xee\x00\x01\xf6\x2c\x71\x81\xc9\xc6\x36\
+\xe2\x14\x1d\x89\xf8\xbe\xef\xeb\x95\x58\x6c\xa7\xff\xd3\xfb\x3c\
+\xa4\x0e\x9b\x30\xf0\xcf\x07\xb7\xa9\x48\xfc\xc9\x66\xf7\xbe\x5f\
+\xd6\xe0\x88\x16\x96\x58\x1b\x8a\x8e\xa4\x0a\x13\xf8\x64\xc8\x33\
+\x89\x01\x61\xb4\xc1\x2f\x9e\x34\x6f\x29\x2b\x86\x01\x0a\x90\x76\
+\x04\x6f\x53\x98\xd0\x90\xe4\x79\xb9\x99\x3c\x99\xef\xf8\x20\x08\
+\x22\x67\x00\x48\xa7\x96\xc3\x31\x67\x9a\xe7\xc3\xd1\x63\x10\x05\
+\xbd\x3f\x46\xb2\x7b\x4d\x26\xc6\x19\x3e\xd8\x5a\xa8\x3d\x81\x35\
+\x19\xb5\x84\x0c\x31\x80\x7b\x9d\x7c\x88\x33\x34\x9b\x00\x6a\x7a\
+\xef\x4e\x4d\xef\xed\x90\x3c\x99\x86\xb8\x35\x09\x00\x91\x5a\x57\
+\xb7\xcb\x10\x0f\x35\xb5\x8c\xac\x0d\x6b\x81\x2d\xa9\xad\x01\xf0\
+\x39\x24\x2e\xe3\x4e\x84\x0f\x0e\xf8\x15\x7d\x48\x1e\x07\x25\x41\
+\x5d\xc8\xd4\xf8\xf8\xd7\x23\x4a\xff\x00\xff\xd4\xfb\x43\xc9\x29\
+\xd8\x1c\xf0\x7a\x7a\x85\x1e\x7f\x1f\x7a\x74\x20\xf4\xc9\xc4\xf0\
+\x9b\x1c\xd4\x8b\x4b\xad\xb4\x7d\x14\x4e\xed\x0c\xbf\x55\x94\xb1\
+\x66\x8e\x5a\x94\xff\x00\x60\xc0\x7e\x07\x27\x9b\x06\x3c\xfb\xc6\
+\x5c\x27\xb8\xdd\x7c\x08\xfd\x2b\x1c\xd2\x86\xc4\x5a\x7f\x27\xe8\
+\xab\x60\xbe\xa4\xab\x78\xca\x28\x21\x8c\x1a\x13\xdb\x93\x35\x36\
+\xc4\x69\xf1\x42\x62\x52\x90\xc9\x5d\x22\x0e\xfe\xf2\x40\x6a\xf1\
+\x72\x4f\x90\xaf\x34\x2a\xb3\xdc\xb9\x9d\xf8\xaa\xb1\x3c\x40\xd8\
+\x7c\x80\xf0\x18\x72\xe4\x96\x42\x65\x2e\x65\x94\x00\x88\xa0\xaa\
+\x40\x3f\x3e\x94\xca\x3a\x33\x73\x31\x20\x06\xdc\x2e\xca\xb5\xfd\
+\x58\x6c\xf5\x45\x21\xdc\x6f\xb0\x26\xa7\x14\xac\x0a\x7a\xd7\xe5\
+\x8a\x55\x14\x13\xd0\xf6\xeb\x8d\xa1\x7d\x09\x34\x1d\xf0\xda\xb8\
+\xc4\x79\xaa\x72\x52\x4f\x5d\xf6\x1f\x4f\x4c\x3c\x3b\xd5\xa3\x89\
+\xff\xd5\xfb\x38\xc0\xd6\xa3\xae\x78\x5d\xbd\x42\x93\x47\x5e\x84\
+\xd7\xb9\xc4\x2a\x80\xb7\x5d\xd9\xb6\x35\xdb\xc4\xe2\x00\x28\x56\
+\x48\xa0\x5f\x89\xba\xf8\x9d\xf2\x44\x1e\x8c\x78\x82\x36\xaa\x63\
+\xa2\x80\x05\x36\x23\x23\xcd\x92\x9f\xa8\x54\x7c\x40\x9d\xfa\xe2\
+\x60\x96\xea\x5c\xf1\x14\x1f\x3d\xce\x42\x92\xba\xaa\x2a\xa4\xd7\
+\xdf\x0f\x0a\x16\x54\x03\x4a\x54\x7b\x63\x4a\xbb\x9d\x77\x51\xb7\
+\x6c\x95\x2a\xe0\x6b\xfe\x4b\x78\x64\x24\x15\xdb\xd4\x6f\xf4\x60\
+\x57\xff\xd6\xfb\x3d\x51\xd7\x7f\x96\x78\x53\xd4\x2f\x24\x71\x24\
+\x6c\x69\xd3\x01\xd9\x52\x8d\x6e\x4b\x8b\x7d\x1b\x51\xbb\xb3\xa1\
+\xba\x86\x12\x6d\xc1\x1b\x06\x62\x00\x34\xf6\xad\x72\x32\x91\x11\
+\x24\x26\x31\x12\x90\x05\xe2\xba\x66\x87\xe6\x68\xee\x06\xaa\x35\
+\x3b\xc9\xae\x39\x09\x24\x32\x48\xc5\x18\x1e\xa2\x84\xd2\x9e\xd8\
+\x80\x40\x07\xab\x74\xa2\x39\x3d\xe2\xd4\xb9\x86\x27\x91\x78\x34\
+\x88\xae\xc9\xe0\x58\x54\x8c\xc8\xc9\xb5\x17\x16\x2a\xc6\x87\xae\
+\xf4\x34\xca\xec\xb3\x52\x63\xc7\x7a\x6e\x7b\xe2\x16\xd4\x4c\xbd\
+\x87\x5c\xb0\x06\x04\xb4\x26\x00\xd0\xb6\xfe\x03\x1e\x04\x71\xaf\
+\xf5\x96\x94\xaf\xd1\x80\xc1\x22\x6a\xab\x29\x24\x50\x8e\xbb\xe4\
+\x08\xa6\x56\xa6\x25\x23\x9a\x92\x79\x12\x29\x91\xa5\x7f\xff\xd7\
+\xfb\x3b\xd0\x50\x1a\x0f\xc7\x3c\x2a\xde\xa1\x50\x50\xfb\xf5\xc4\
+\xab\xa4\x55\x28\x41\x5e\x4a\xc0\x86\x53\xd0\x82\x28\x41\xc6\x04\
+\x83\x61\x05\x0f\x6e\xf6\xd1\x47\xe9\xc3\x61\x46\xaf\xd9\x67\xe4\
+\x83\xe8\xa5\x4f\xdf\x99\x7e\x2e\x21\xbf\x0e\xfe\xfd\xbf\x1f\x16\
+\x24\x4c\xf5\x54\x53\x23\x33\x99\x00\x24\xb6\xd4\x1e\xd9\x8b\x93\
+\x27\x19\xbe\xac\x80\xa6\x85\x6a\x46\xd5\x34\x60\xbd\xc7\xcf\x01\
+\xe4\x94\x35\xc1\x22\x83\xb9\xe9\x92\xc7\xbb\x19\x30\x2f\x38\xf9\
+\xc2\xc7\xca\x76\x42\x7b\xa0\xd3\x5c\x4b\x51\x6d\x6a\x86\x8d\x21\
+\x1d\x6a\x7f\x65\x45\x7a\xe5\xb2\x98\x80\xf3\x63\x08\x19\x97\xcf\
+\xf2\xfe\x73\xf9\xa6\xe6\xea\x96\x91\x43\x6b\x6b\x5f\x86\x31\x0f\
+\x30\x07\xbb\x31\xa9\xca\x8c\xe6\x7a\xb7\x8c\x31\x0f\x52\xf2\x6f\
+\xe6\x3c\xfa\xc4\xf1\x58\xea\xf0\xa4\x72\xcc\x42\xc5\x73\x10\x2a\
+\x39\x1e\x81\x94\x93\x4a\xf8\x8c\x11\xcc\x41\xa9\x35\xcf\x10\xab\
+\x0f\x64\x8d\x8a\xb0\x27\xa5\x77\x19\x74\xe3\xb3\x54\x64\x8d\xf4\
+\x96\xb5\xed\x4e\x99\x8e\xdc\xff\x00\xff\xd0\xfb\x34\xca\xdb\x1e\
+\xfd\xc6\x78\x43\xd4\xb6\x8c\x41\x5a\x91\xd6\xa7\x24\x82\xa8\x4f\
+\x26\x00\x12\x40\xaf\xb0\xdb\x02\xaf\xf8\x54\x6f\x40\x72\x2a\xb4\
+\x02\xcd\x55\x0d\x41\xd4\xf8\x7b\xe2\x02\x57\x15\xa7\x41\xd7\xae\
+\x1e\x88\x43\xbc\x6d\x2b\x2d\x0d\x46\xe3\x6c\xb3\x19\x63\x37\xcb\
+\xbf\x99\xb6\x37\x3a\x8f\x9a\x65\x88\x82\xd6\xd6\xa1\x62\x44\xeb\
+\x40\x00\x3f\x89\x39\x8b\x92\x77\x37\x37\x0c\x00\xc6\x12\x4b\x1f\
+\x2c\x8a\x46\x1a\x1d\x9b\x75\xf0\xcb\x2c\xc4\x30\x20\x5b\x21\x87\
+\xcb\x32\x59\xdc\x45\x3c\x51\xb2\x0d\x89\xa7\x6a\x66\x2c\xf3\x71\
+\x36\x08\x3e\x85\xd2\x7d\x5b\x8d\x2e\xd2\x69\x7f\xbd\x31\x81\x21\
+\xf1\x23\xbe\x6c\x71\x4a\xf1\x82\x5d\x7c\xc5\x4a\x93\x7e\x27\xd3\
+\xfa\x32\xbe\xad\x8f\xff\xd1\xfb\x39\x2d\x06\xfc\x4e\x78\x43\xd4\
+\x30\x2f\x32\x6b\x5e\x65\xb0\xd4\xf4\xfb\x2d\x0b\x46\x8b\x51\x8a\
+\x78\xda\x7b\xb9\xa6\x76\x50\x15\x5b\x8f\x08\xf8\xfe\xd6\xd5\xa9\
+\xf6\xc6\x79\x04\x06\xec\xa3\x8c\xcb\xab\x3f\xb5\x76\x78\x91\x9d\
+\x0a\x3d\x01\x74\x3d\x41\x22\xb4\x3e\xe3\x24\x46\xec\x02\xb9\x41\
+\xb9\x1d\x70\x14\xb6\xa0\x70\x55\x0c\x76\xdf\x7f\xd7\x86\x90\xef\
+\x87\xa7\x8f\x51\x80\xec\x97\x72\xe2\x00\x34\xc3\x19\x20\x87\x99\
+\x79\xc3\xcb\x6b\x75\xa8\x26\xab\x14\x6c\xde\xb5\x04\xe5\x77\x2a\
+\xe0\x01\x53\xec\x72\x59\xf4\xfc\x51\xe3\x8f\xc7\xcb\xf6\x16\xec\
+\x19\xab\xd2\x51\x5a\x46\x86\x84\xa7\xab\x0e\xe2\x82\x94\xa8\xda\
+\x9e\x1f\x2c\xc0\xe3\x32\x3c\x37\xbb\x71\xa1\xbb\x27\x6d\x01\xae\
+\x5c\x45\x14\x7c\x98\xec\x06\xd4\x1f\x4f\x86\x43\x49\xa3\x9e\x4c\
+\xfc\x11\xde\xcf\xf6\xb0\xc9\xa9\x88\x8d\x94\xcf\xd2\x8a\x08\xe2\
+\xb4\x82\x8f\x1d\xba\x88\xc3\xff\x00\x37\x11\xc4\x9f\xa6\x99\xb8\
+\xcd\xc1\x13\xc3\x0e\x43\x6f\x96\xdf\x6f\x37\x06\x16\x77\x3d\x55\
+\x39\x1a\xd3\x8f\x4d\xa9\x98\xf6\xdd\x4f\xff\xd2\xfb\x3c\x69\xc8\
+\xf5\x23\xbe\x78\x4e\xcf\x50\xd0\xe4\x5c\x7a\x5e\xa2\xb5\x0e\xc9\
+\xe1\xf4\x54\xe4\xa3\x7d\x11\x2a\xea\xbd\x00\xe3\x50\x41\xf6\xc8\
+\xa5\x78\xe7\xe1\x51\xf4\x62\x50\xb8\xd6\x83\xae\x05\x51\x25\xb9\
+\x8a\x83\xf3\xed\x85\x2b\x8f\x2a\x0c\x21\x0e\x53\x74\x18\x9b\x55\
+\xe4\xc3\xed\x03\x4e\x05\x7b\xf2\xe5\xb5\x3e\x79\x93\xa7\x39\x2f\
+\xd1\xf1\xee\xf8\xf4\x61\x3e\x1a\xdd\x5e\xda\xea\xdc\x90\x65\xd3\
+\x14\x4c\x2b\xc8\x24\xd4\x42\x7c\x77\xe4\x47\xdf\x95\x9c\xda\x7e\
+\x2b\x9e\x3b\x3b\xdd\x48\x81\xfa\x7e\xc2\x89\x47\x2d\x7d\x5b\x7b\
+\x95\x27\x9f\x50\x96\x29\xbe\xa9\x64\x96\xd6\xe1\x7f\x7d\xe9\xba\
+\xbb\xf1\xef\x53\xca\xb4\xf1\xa0\xc9\xe3\x99\x9c\x25\xe1\x44\x46\
+\x35\xbd\x6f\x2a\xeb\x77\xbf\xbe\x80\x0d\x62\x20\x11\xc4\x49\x3e\
+\x69\x64\x03\xe2\x1c\x8f\xc5\xe1\x94\x1a\xa7\x21\x19\xf0\xd4\x65\
+\x69\x7f\xff\xd9\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03\x7d\xc3\
+\x00\x69\
+\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
+\x00\x0a\
+\x0c\x9d\x6c\x07\
+\x00\x63\
+\x00\x68\x00\x65\x00\x65\x00\x73\x00\x65\x00\x2e\x00\x6a\x00\x70\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\x01\x00\x00\x00\x02\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.py b/examples/widgets/graphicsview/diagramscene/diagramscene.py
new file mode 100755
index 000000000..ea0af84f9
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene.py
@@ -0,0 +1,825 @@
+#!/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$
+##
+#############################################################################
+
+import math
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import diagramscene_rc
+
+
+class Arrow(QtWidgets.QGraphicsLineItem):
+ def __init__(self, startItem, endItem, parent=None, scene=None):
+ super(Arrow, self).__init__(parent, scene)
+
+ self.arrowHead = QtGui.QPolygonF()
+
+ self.myStartItem = startItem
+ self.myEndItem = endItem
+ self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
+ self.myColor = QtCore.Qt.black
+ self.setPen(QtGui.QPen(self.myColor, 2, QtCore.Qt.SolidLine,
+ QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
+
+ def setColor(self, color):
+ self.myColor = color
+
+ def startItem(self):
+ return self.myStartItem
+
+ def endItem(self):
+ return self.myEndItem
+
+ def boundingRect(self):
+ extra = (self.pen().width() + 20) / 2.0
+ p1 = self.line().p1()
+ p2 = self.line().p2()
+ return QtCore.QRectF(p1, QtCore.QSizeF(p2.x() - p1.x(), p2.y() - p1.y())).normalized().adjusted(-extra, -extra, extra, extra)
+
+ def shape(self):
+ path = super(Arrow, self).shape()
+ path.addPolygon(self.arrowHead)
+ return path
+
+ def updatePosition(self):
+ line = QtCore.QLineF(self.mapFromItem(self.myStartItem, 0, 0), self.mapFromItem(self.myEndItem, 0, 0))
+ self.setLine(line)
+
+ def paint(self, painter, option, widget=None):
+ if (self.myStartItem.collidesWithItem(self.myEndItem)):
+ return
+
+ myStartItem = self.myStartItem
+ myEndItem = self.myEndItem
+ myColor = self.myColor
+ myPen = self.pen()
+ myPen.setColor(self.myColor)
+ arrowSize = 20.0
+ painter.setPen(myPen)
+ painter.setBrush(self.myColor)
+
+ centerLine = QtCore.QLineF(myStartItem.pos(), myEndItem.pos())
+ endPolygon = myEndItem.polygon()
+ p1 = endPolygon.at(0) + myEndItem.pos()
+
+ intersectPoint = QtCore.QPointF()
+ for i in endPolygon:
+ p2 = i + myEndItem.pos()
+ polyLine = QtCore.QLineF(p1, p2)
+ intersectType, intersectPoint = polyLine.intersect(centerLine)
+ if intersectType == QtCore.QLineF.BoundedIntersection:
+ break
+ p1 = p2
+
+ self.setLine(QtCore.QLineF(intersectPoint, myStartItem.pos()))
+ line = self.line()
+
+ angle = math.acos(line.dx() / line.length())
+ if line.dy() >= 0:
+ angle = (math.pi * 2.0) - angle
+
+ arrowP1 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi / 3.0) * arrowSize,
+ math.cos(angle + math.pi / 3) * arrowSize)
+ arrowP2 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrowSize,
+ math.cos(angle + math.pi - math.pi / 3.0) * arrowSize)
+
+ self.arrowHead.clear()
+ for point in [line.p1(), arrowP1, arrowP2]:
+ self.arrowHead.append(point)
+
+ painter.drawLine(line)
+ painter.drawPolygon(self.arrowHead)
+ if self.isSelected():
+ painter.setPen(QtGui.QPen(myColor, 1, QtCore.Qt.DashLine))
+ myLine = QtCore.QLineF(line)
+ myLine.translate(0, 4.0)
+ painter.drawLine(myLine)
+ myLine.translate(0,-8.0)
+ painter.drawLine(myLine)
+
+
+class DiagramTextItem(QtWidgets.QGraphicsTextItem):
+ lostFocus = QtCore.Signal(QtWidgets.QGraphicsTextItem)
+
+ selectedChange = QtCore.Signal(QtWidgets.QGraphicsItem)
+
+ def __init__(self, parent=None, scene=None):
+ super(DiagramTextItem, self).__init__(parent, scene)
+
+ self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
+ self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable)
+
+ def itemChange(self, change, value):
+ if change == QtWidgets.QGraphicsItem.ItemSelectedChange:
+ self.selectedChange.emit(self)
+ return value
+
+ def focusOutEvent(self, event):
+ self.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+ self.lostFocus.emit(self)
+ super(DiagramTextItem, self).focusOutEvent(event)
+
+ def mouseDoubleClickEvent(self, event):
+ if self.textInteractionFlags() == QtCore.Qt.NoTextInteraction:
+ self.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
+ super(DiagramTextItem, self).mouseDoubleClickEvent(event)
+
+
+class DiagramItem(QtWidgets.QGraphicsPolygonItem):
+ Step, Conditional, StartEnd, Io = range(4)
+
+ def __init__(self, diagramType, contextMenu, parent=None, scene=None):
+ super(DiagramItem, self).__init__(parent, scene)
+
+ self.arrows = []
+
+ self.diagramType = diagramType
+ self.myContextMenu = contextMenu
+
+ path = QtGui.QPainterPath()
+ if self.diagramType == self.StartEnd:
+ path.moveTo(200, 50)
+ path.arcTo(150, 0, 50, 50, 0, 90)
+ path.arcTo(50, 0, 50, 50, 90, 90)
+ path.arcTo(50, 50, 50, 50, 180, 90)
+ path.arcTo(150, 50, 50, 50, 270, 90)
+ path.lineTo(200, 25)
+ self.myPolygon = path.toFillPolygon()
+ elif self.diagramType == self.Conditional:
+ self.myPolygon = QtGui.QPolygonF([
+ QtCore.QPointF(-100, 0), QtCore.QPointF(0, 100),
+ QtCore.QPointF(100, 0), QtCore.QPointF(0, -100),
+ QtCore.QPointF(-100, 0)])
+ elif self.diagramType == self.Step:
+ self.myPolygon = QtGui.QPolygonF([
+ QtCore.QPointF(-100, -100), QtCore.QPointF(100, -100),
+ QtCore.QPointF(100, 100), QtCore.QPointF(-100, 100),
+ QtCore.QPointF(-100, -100)])
+ else:
+ self.myPolygon = QtGui.QPolygonF([
+ QtCore.QPointF(-120, -80), QtCore.QPointF(-70, 80),
+ QtCore.QPointF(120, 80), QtCore.QPointF(70, -80),
+ QtCore.QPointF(-120, -80)])
+
+ self.setPolygon(self.myPolygon)
+ self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
+ self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
+
+ def removeArrow(self, arrow):
+ try:
+ self.arrows.remove(arrow)
+ except ValueError:
+ pass
+
+ def removeArrows(self):
+ for arrow in self.arrows[:]:
+ arrow.startItem().removeArrow(arrow)
+ arrow.endItem().removeArrow(arrow)
+ self.scene().removeItem(arrow)
+
+ def addArrow(self, arrow):
+ self.arrows.append(arrow)
+
+ def image(self):
+ pixmap = QtGui.QPixmap(250, 250)
+ pixmap.fill(QtCore.Qt.transparent)
+ painter = QtGui.QPainter(pixmap)
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 8))
+ painter.translate(125, 125)
+ painter.drawPolyline(self.myPolygon)
+ return pixmap
+
+ def contextMenuEvent(self, event):
+ self.scene().clearSelection()
+ self.setSelected(True)
+ self.myContextMenu.exec_(event.screenPos())
+
+ def itemChange(self, change, value):
+ if change == QtWidgets.QGraphicsItem.ItemPositionChange:
+ for arrow in self.arrows:
+ arrow.updatePosition()
+
+ return value
+
+
+class DiagramScene(QtWidgets.QGraphicsScene):
+ InsertItem, InsertLine, InsertText, MoveItem = range(4)
+
+ itemInserted = QtCore.Signal(DiagramItem)
+
+ textInserted = QtCore.Signal(QtWidgets.QGraphicsTextItem)
+
+ itemSelected = QtCore.Signal(QtWidgets.QGraphicsItem)
+
+ def __init__(self, itemMenu, parent=None):
+ super(DiagramScene, self).__init__(parent)
+
+ self.myItemMenu = itemMenu
+ self.myMode = self.MoveItem
+ self.myItemType = DiagramItem.Step
+ self.line = None
+ self.textItem = None
+ self.myItemColor = QtCore.Qt.white
+ self.myTextColor = QtCore.Qt.black
+ self.myLineColor = QtCore.Qt.black
+ self.myFont = QtGui.QFont()
+
+ def setLineColor(self, color):
+ self.myLineColor = color
+ if self.isItemChange(Arrow):
+ item = self.selectedItems()[0]
+ item.setColor(self.myLineColor)
+ self.update()
+
+ def setTextColor(self, color):
+ self.myTextColor = color
+ if self.isItemChange(DiagramTextItem):
+ item = self.selectedItems()[0]
+ item.setDefaultTextColor(self.myTextColor)
+
+ def setItemColor(self, color):
+ self.myItemColor = color
+ if self.isItemChange(DiagramItem):
+ item = self.selectedItems()[0]
+ item.setBrush(self.myItemColor)
+
+ def setFont(self, font):
+ self.myFont = font
+ if self.isItemChange(DiagramTextItem):
+ item = self.selectedItems()[0]
+ item.setFont(self.myFont)
+
+ def setMode(self, mode):
+ self.myMode = mode
+
+ def setItemType(self, type):
+ self.myItemType = type
+
+ def editorLostFocus(self, item):
+ cursor = item.textCursor()
+ cursor.clearSelection()
+ item.setTextCursor(cursor)
+
+ if not item.toPlainText():
+ self.removeItem(item)
+ item.deleteLater()
+
+ def mousePressEvent(self, mouseEvent):
+ if (mouseEvent.button() != QtCore.Qt.LeftButton):
+ return
+
+ if self.myMode == self.InsertItem:
+ item = DiagramItem(self.myItemType, self.myItemMenu)
+ item.setBrush(self.myItemColor)
+ self.addItem(item)
+ item.setPos(mouseEvent.scenePos())
+ self.itemInserted.emit(item)
+ elif self.myMode == self.InsertLine:
+ self.line = QtWidgets.QGraphicsLineItem(QtCore.QLineF(mouseEvent.scenePos(),
+ mouseEvent.scenePos()))
+ self.line.setPen(QtGui.QPen(self.myLineColor, 2))
+ self.addItem(self.line)
+ elif self.myMode == self.InsertText:
+ textItem = DiagramTextItem()
+ textItem.setFont(self.myFont)
+ textItem.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
+ textItem.setZValue(1000.0)
+ textItem.lostFocus.connect(self.editorLostFocus)
+ textItem.selectedChange.connect(self.itemSelected)
+ self.addItem(textItem)
+ textItem.setDefaultTextColor(self.myTextColor)
+ textItem.setPos(mouseEvent.scenePos())
+ self.textInserted.emit(textItem)
+
+ super(DiagramScene, self).mousePressEvent(mouseEvent)
+
+ def mouseMoveEvent(self, mouseEvent):
+ if self.myMode == self.InsertLine and self.line:
+ newLine = QtCore.QLineF(self.line.line().p1(), mouseEvent.scenePos())
+ self.line.setLine(newLine)
+ elif self.myMode == self.MoveItem:
+ super(DiagramScene, self).mouseMoveEvent(mouseEvent)
+
+ def mouseReleaseEvent(self, mouseEvent):
+ if self.line and self.myMode == self.InsertLine:
+ startItems = self.items(self.line.line().p1())
+ if len(startItems) and startItems[0] == self.line:
+ startItems.pop(0)
+ endItems = self.items(self.line.line().p2())
+ if len(endItems) and endItems[0] == self.line:
+ endItems.pop(0)
+
+ self.removeItem(self.line)
+ self.line = None
+
+ if len(startItems) and len(endItems) and \
+ isinstance(startItems[0], DiagramItem) and \
+ isinstance(endItems[0], DiagramItem) and \
+ startItems[0] != endItems[0]:
+ startItem = startItems[0]
+ endItem = endItems[0]
+ arrow = Arrow(startItem, endItem)
+ arrow.setColor(self.myLineColor)
+ startItem.addArrow(arrow)
+ endItem.addArrow(arrow)
+ arrow.setZValue(-1000.0)
+ self.addItem(arrow)
+ arrow.updatePosition()
+
+ self.line = None
+ super(DiagramScene, self).mouseReleaseEvent(mouseEvent)
+
+ def isItemChange(self, type):
+ for item in self.selectedItems():
+ if isinstance(item, type):
+ return True
+ return False
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ InsertTextButton = 10
+
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.createActions()
+ self.createMenus()
+ self.createToolBox()
+
+ self.scene = DiagramScene(self.itemMenu)
+ self.scene.setSceneRect(QtCore.QRectF(0, 0, 5000, 5000))
+ self.scene.itemInserted.connect(self.itemInserted)
+ self.scene.textInserted.connect(self.textInserted)
+ self.scene.itemSelected.connect(self.itemSelected)
+
+ self.createToolbars()
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.addWidget(self.toolBox)
+ self.view = QtWidgets.QGraphicsView(self.scene)
+ layout.addWidget(self.view)
+
+ self.widget = QtWidgets.QWidget()
+ self.widget.setLayout(layout)
+
+ self.setCentralWidget(self.widget)
+ self.setWindowTitle("Diagramscene")
+
+ def backgroundButtonGroupClicked(self, button):
+ buttons = self.backgroundButtonGroup.buttons()
+ for myButton in buttons:
+ if myButton != button:
+ button.setChecked(False)
+
+ text = button.text()
+ if text == "Blue Grid":
+ self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background1.png')))
+ elif text == "White Grid":
+ self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background2.png')))
+ elif text == "Gray Grid":
+ self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background3.png')))
+ else:
+ self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background4.png')))
+
+ self.scene.update()
+ self.view.update()
+
+ def buttonGroupClicked(self, id):
+ buttons = self.buttonGroup.buttons()
+ for button in buttons:
+ if self.buttonGroup.button(id) != button:
+ button.setChecked(False)
+
+ if id == self.InsertTextButton:
+ self.scene.setMode(DiagramScene.InsertText)
+ else:
+ self.scene.setItemType(id)
+ self.scene.setMode(DiagramScene.InsertItem)
+
+ def deleteItem(self):
+ for item in self.scene.selectedItems():
+ if isinstance(item, DiagramItem):
+ item.removeArrows()
+ self.scene.removeItem(item)
+
+ def pointerGroupClicked(self, i):
+ self.scene.setMode(self.pointerTypeGroup.checkedId())
+
+ def bringToFront(self):
+ if not self.scene.selectedItems():
+ return
+
+ selectedItem = self.scene.selectedItems()[0]
+ overlapItems = selectedItem.collidingItems()
+
+ zValue = 0
+ for item in overlapItems:
+ if (item.zValue() >= zValue and isinstance(item, DiagramItem)):
+ zValue = item.zValue() + 0.1
+ selectedItem.setZValue(zValue)
+
+ def sendToBack(self):
+ if not self.scene.selectedItems():
+ return
+
+ selectedItem = self.scene.selectedItems()[0]
+ overlapItems = selectedItem.collidingItems()
+
+ zValue = 0
+ for item in overlapItems:
+ if (item.zValue() <= zValue and isinstance(item, DiagramItem)):
+ zValue = item.zValue() - 0.1
+ selectedItem.setZValue(zValue)
+
+ def itemInserted(self, item):
+ self.pointerTypeGroup.button(DiagramScene.MoveItem).setChecked(True)
+ self.scene.setMode(self.pointerTypeGroup.checkedId())
+ self.buttonGroup.button(item.diagramType).setChecked(False)
+
+ def textInserted(self, item):
+ self.buttonGroup.button(self.InsertTextButton).setChecked(False)
+ self.scene.setMode(self.pointerTypeGroup.checkedId())
+
+ def currentFontChanged(self, font):
+ self.handleFontChange()
+
+ def fontSizeChanged(self, font):
+ self.handleFontChange()
+
+ def sceneScaleChanged(self, scale):
+ newScale = int(scale[:-1]) / 100.0
+ oldMatrix = self.view.matrix()
+ self.view.resetMatrix()
+ self.view.translate(oldMatrix.dx(), oldMatrix.dy())
+ self.view.scale(newScale, newScale)
+
+ def textColorChanged(self):
+ self.textAction = self.sender()
+ self.fontColorToolButton.setIcon(self.createColorToolButtonIcon(
+ ':/images/textpointer.png',
+ QtGui.QColor(self.textAction.data())))
+ self.textButtonTriggered()
+
+ def itemColorChanged(self):
+ self.fillAction = self.sender()
+ self.fillColorToolButton.setIcon(self.createColorToolButtonIcon(
+ ':/images/floodfill.png',
+ QtGui.QColor(self.fillAction.data())))
+ self.fillButtonTriggered()
+
+ def lineColorChanged(self):
+ self.lineAction = self.sender()
+ self.lineColorToolButton.setIcon(self.createColorToolButtonIcon(
+ ':/images/linecolor.png',
+ QtGui.QColor(self.lineAction.data())))
+ self.lineButtonTriggered()
+
+ def textButtonTriggered(self):
+ self.scene.setTextColor(QtGui.QColor(self.textAction.data()))
+
+ def fillButtonTriggered(self):
+ self.scene.setItemColor(QtGui.QColor(self.fillAction.data()))
+
+ def lineButtonTriggered(self):
+ self.scene.setLineColor(QtGui.QColor(self.lineAction.data()))
+
+ def handleFontChange(self):
+ font = self.fontCombo.currentFont()
+ font.setPointSize(int(self.fontSizeCombo.currentText()))
+ if self.boldAction.isChecked():
+ font.setWeight(QtGui.QFont.Bold)
+ else:
+ font.setWeight(QtGui.QFont.Normal)
+ font.setItalic(self.italicAction.isChecked())
+ font.setUnderline(self.underlineAction.isChecked())
+
+ self.scene.setFont(font)
+
+ def itemSelected(self, item):
+ font = item.font()
+ color = item.defaultTextColor()
+ self.fontCombo.setCurrentFont(font)
+ self.fontSizeCombo.setEditText(str(font.pointSize()))
+ self.boldAction.setChecked(font.weight() == QtGui.QFont.Bold)
+ self.italicAction.setChecked(font.italic())
+ self.underlineAction.setChecked(font.underline())
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About Diagram Scene",
+ "The <b>Diagram Scene</b> example shows use of the graphics framework.")
+
+ def createToolBox(self):
+ self.buttonGroup = QtWidgets.QButtonGroup()
+ self.buttonGroup.setExclusive(False)
+ self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(self.createCellWidget("Conditional", DiagramItem.Conditional),
+ 0, 0)
+ layout.addWidget(self.createCellWidget("Process", DiagramItem.Step), 0,
+ 1)
+ layout.addWidget(self.createCellWidget("Input/Output", DiagramItem.Io),
+ 1, 0)
+
+ textButton = QtWidgets.QToolButton()
+ textButton.setCheckable(True)
+ self.buttonGroup.addButton(textButton, self.InsertTextButton)
+ textButton.setIcon(QtGui.QIcon(QtGui.QPixmap(':/images/textpointer.png')
+ .scaled(30, 30)))
+ textButton.setIconSize(QtCore.QSize(50, 50))
+
+ textLayout = QtWidgets.QGridLayout()
+ textLayout.addWidget(textButton, 0, 0, QtCore.Qt.AlignHCenter)
+ textLayout.addWidget(QtWidgets.QLabel("Text"), 1, 0,
+ QtCore.Qt.AlignCenter)
+ textWidget = QtWidgets.QWidget()
+ textWidget.setLayout(textLayout)
+ layout.addWidget(textWidget, 1, 1)
+
+ layout.setRowStretch(3, 10)
+ layout.setColumnStretch(2, 10)
+
+ itemWidget = QtWidgets.QWidget()
+ itemWidget.setLayout(layout)
+
+ self.backgroundButtonGroup = QtWidgets.QButtonGroup()
+ self.backgroundButtonGroup.buttonClicked.connect(self.backgroundButtonGroupClicked)
+
+ backgroundLayout = QtWidgets.QGridLayout()
+ backgroundLayout.addWidget(self.createBackgroundCellWidget("Blue Grid",
+ ':/images/background1.png'), 0, 0)
+ backgroundLayout.addWidget(self.createBackgroundCellWidget("White Grid",
+ ':/images/background2.png'), 0, 1)
+ backgroundLayout.addWidget(self.createBackgroundCellWidget("Gray Grid",
+ ':/images/background3.png'), 1, 0)
+ backgroundLayout.addWidget(self.createBackgroundCellWidget("No Grid",
+ ':/images/background4.png'), 1, 1)
+
+ backgroundLayout.setRowStretch(2, 10)
+ backgroundLayout.setColumnStretch(2, 10)
+
+ backgroundWidget = QtWidgets.QWidget()
+ backgroundWidget.setLayout(backgroundLayout)
+
+ self.toolBox = QtWidgets.QToolBox()
+ self.toolBox.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Ignored))
+ self.toolBox.setMinimumWidth(itemWidget.sizeHint().width())
+ self.toolBox.addItem(itemWidget, "Basic Flowchart Shapes")
+ self.toolBox.addItem(backgroundWidget, "Backgrounds")
+
+ def createActions(self):
+ self.toFrontAction = QtWidgets.QAction(
+ QtGui.QIcon(':/images/bringtofront.png'), "Bring to &Front",
+ self, shortcut="Ctrl+F", statusTip="Bring item to front",
+ triggered=self.bringToFront)
+
+ self.sendBackAction = QtWidgets.QAction(
+ QtGui.QIcon(':/images/sendtoback.png'), "Send to &Back", self,
+ shortcut="Ctrl+B", statusTip="Send item to back",
+ triggered=self.sendToBack)
+
+ self.deleteAction = QtWidgets.QAction(QtGui.QIcon(':/images/delete.png'),
+ "&Delete", self, shortcut="Delete",
+ statusTip="Delete item from diagram",
+ triggered=self.deleteItem)
+
+ self.exitAction = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+X",
+ statusTip="Quit Scenediagram example", triggered=self.close)
+
+ self.boldAction = QtWidgets.QAction(QtGui.QIcon(':/images/bold.png'),
+ "Bold", self, checkable=True, shortcut="Ctrl+B",
+ triggered=self.handleFontChange)
+
+ self.italicAction = QtWidgets.QAction(QtGui.QIcon(':/images/italic.png'),
+ "Italic", self, checkable=True, shortcut="Ctrl+I",
+ triggered=self.handleFontChange)
+
+ self.underlineAction = QtWidgets.QAction(
+ QtGui.QIcon(':/images/underline.png'), "Underline", self,
+ checkable=True, shortcut="Ctrl+U",
+ triggered=self.handleFontChange)
+
+ self.aboutAction = QtWidgets.QAction("A&bout", self, shortcut="Ctrl+B",
+ triggered=self.about)
+
+ def createMenus(self):
+ self.fileMenu = self.menuBar().addMenu("&File")
+ self.fileMenu.addAction(self.exitAction)
+
+ self.itemMenu = self.menuBar().addMenu("&Item")
+ self.itemMenu.addAction(self.deleteAction)
+ self.itemMenu.addSeparator()
+ self.itemMenu.addAction(self.toFrontAction)
+ self.itemMenu.addAction(self.sendBackAction)
+
+ self.aboutMenu = self.menuBar().addMenu("&Help")
+ self.aboutMenu.addAction(self.aboutAction)
+
+ def createToolbars(self):
+ self.editToolBar = self.addToolBar("Edit")
+ self.editToolBar.addAction(self.deleteAction)
+ self.editToolBar.addAction(self.toFrontAction)
+ self.editToolBar.addAction(self.sendBackAction)
+
+ self.fontCombo = QtWidgets.QFontComboBox()
+ self.fontCombo.currentFontChanged.connect(self.currentFontChanged)
+
+ self.fontSizeCombo = QtWidgets.QComboBox()
+ self.fontSizeCombo.setEditable(True)
+ for i in range(8, 30, 2):
+ self.fontSizeCombo.addItem(str(i))
+ validator = QtGui.QIntValidator(2, 64, self)
+ self.fontSizeCombo.setValidator(validator)
+ self.fontSizeCombo.currentIndexChanged.connect(self.fontSizeChanged)
+
+ self.fontColorToolButton = QtWidgets.QToolButton()
+ self.fontColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
+ self.fontColorToolButton.setMenu(
+ self.createColorMenu(self.textColorChanged, QtCore.Qt.black))
+ self.textAction = self.fontColorToolButton.menu().defaultAction()
+ self.fontColorToolButton.setIcon(
+ self.createColorToolButtonIcon(':/images/textpointer.png',
+ QtCore.Qt.black))
+ self.fontColorToolButton.setAutoFillBackground(True)
+ self.fontColorToolButton.clicked.connect(self.textButtonTriggered)
+
+ self.fillColorToolButton = QtWidgets.QToolButton()
+ self.fillColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
+ self.fillColorToolButton.setMenu(
+ self.createColorMenu(self.itemColorChanged, QtCore.Qt.white))
+ self.fillAction = self.fillColorToolButton.menu().defaultAction()
+ self.fillColorToolButton.setIcon(
+ self.createColorToolButtonIcon(':/images/floodfill.png',
+ QtCore.Qt.white))
+ self.fillColorToolButton.clicked.connect(self.fillButtonTriggered)
+
+ self.lineColorToolButton = QtWidgets.QToolButton()
+ self.lineColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
+ self.lineColorToolButton.setMenu(
+ self.createColorMenu(self.lineColorChanged, QtCore.Qt.black))
+ self.lineAction = self.lineColorToolButton.menu().defaultAction()
+ self.lineColorToolButton.setIcon(
+ self.createColorToolButtonIcon(':/images/linecolor.png',
+ QtCore.Qt.black))
+ self.lineColorToolButton.clicked.connect(self.lineButtonTriggered)
+
+ self.textToolBar = self.addToolBar("Font")
+ self.textToolBar.addWidget(self.fontCombo)
+ self.textToolBar.addWidget(self.fontSizeCombo)
+ self.textToolBar.addAction(self.boldAction)
+ self.textToolBar.addAction(self.italicAction)
+ self.textToolBar.addAction(self.underlineAction)
+
+ self.colorToolBar = self.addToolBar("Color")
+ self.colorToolBar.addWidget(self.fontColorToolButton)
+ self.colorToolBar.addWidget(self.fillColorToolButton)
+ self.colorToolBar.addWidget(self.lineColorToolButton)
+
+ pointerButton = QtWidgets.QToolButton()
+ pointerButton.setCheckable(True)
+ pointerButton.setChecked(True)
+ pointerButton.setIcon(QtGui.QIcon(':/images/pointer.png'))
+ linePointerButton = QtWidgets.QToolButton()
+ linePointerButton.setCheckable(True)
+ linePointerButton.setIcon(QtGui.QIcon(':/images/linepointer.png'))
+
+ self.pointerTypeGroup = QtWidgets.QButtonGroup()
+ self.pointerTypeGroup.addButton(pointerButton, DiagramScene.MoveItem)
+ self.pointerTypeGroup.addButton(linePointerButton,
+ DiagramScene.InsertLine)
+ self.pointerTypeGroup.buttonClicked[int].connect(self.pointerGroupClicked)
+
+ self.sceneScaleCombo = QtWidgets.QComboBox()
+ self.sceneScaleCombo.addItems(["50%", "75%", "100%", "125%", "150%"])
+ self.sceneScaleCombo.setCurrentIndex(2)
+ self.sceneScaleCombo.currentIndexChanged[str].connect(self.sceneScaleChanged)
+
+ self.pointerToolbar = self.addToolBar("Pointer type")
+ self.pointerToolbar.addWidget(pointerButton)
+ self.pointerToolbar.addWidget(linePointerButton)
+ self.pointerToolbar.addWidget(self.sceneScaleCombo)
+
+ def createBackgroundCellWidget(self, text, image):
+ button = QtWidgets.QToolButton()
+ button.setText(text)
+ button.setIcon(QtGui.QIcon(image))
+ button.setIconSize(QtCore.QSize(50, 50))
+ button.setCheckable(True)
+ self.backgroundButtonGroup.addButton(button)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter)
+ layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter)
+
+ widget = QtWidgets.QWidget()
+ widget.setLayout(layout)
+
+ return widget
+
+ def createCellWidget(self, text, diagramType):
+ item = DiagramItem(diagramType, self.itemMenu)
+ icon = QtGui.QIcon(item.image())
+
+ button = QtWidgets.QToolButton()
+ button.setIcon(icon)
+ button.setIconSize(QtCore.QSize(50, 50))
+ button.setCheckable(True)
+ self.buttonGroup.addButton(button, diagramType)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter)
+ layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter)
+
+ widget = QtWidgets.QWidget()
+ widget.setLayout(layout)
+
+ return widget
+
+ def createColorMenu(self, slot, defaultColor):
+ colors = [QtCore.Qt.black, QtCore.Qt.white, QtCore.Qt.red, QtCore.Qt.blue, QtCore.Qt.yellow]
+ names = ["black", "white", "red", "blue", "yellow"]
+
+ colorMenu = QtWidgets.QMenu(self)
+ for color, name in zip(colors, names):
+ action = QtWidgets.QAction(self.createColorIcon(color), name, self,
+ triggered=slot)
+ action.setData(QtGui.QColor(color))
+ colorMenu.addAction(action)
+ if color == defaultColor:
+ colorMenu.setDefaultAction(action)
+ return colorMenu
+
+ def createColorToolButtonIcon(self, imageFile, color):
+ pixmap = QtGui.QPixmap(50, 80)
+ pixmap.fill(QtCore.Qt.transparent)
+ painter = QtGui.QPainter(pixmap)
+ image = QtGui.QPixmap(imageFile)
+ target = QtCore.QRect(0, 0, 50, 60)
+ source = QtCore.QRect(0, 0, 42, 42)
+ painter.fillRect(QtCore.QRect(0, 60, 50, 80), color)
+ painter.drawPixmap(target, image, source)
+ painter.end()
+
+ return QtGui.QIcon(pixmap)
+
+ def createColorIcon(self, color):
+ pixmap = QtGui.QPixmap(20, 20)
+ painter = QtGui.QPainter(pixmap)
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.fillRect(QtCore.QRect(0, 0, 20, 20), color)
+ painter.end()
+
+ return QtGui.QIcon(pixmap)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ mainWindow = MainWindow()
+ mainWindow.setGeometry(100, 100, 800, 500)
+ mainWindow.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.qrc b/examples/widgets/graphicsview/diagramscene/diagramscene.qrc
new file mode 100644
index 000000000..c4d845e75
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene.qrc
@@ -0,0 +1,19 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/pointer.png</file>
+ <file>images/linepointer.png</file>
+ <file>images/textpointer.png</file>
+ <file>images/bold.png</file>
+ <file>images/italic.png</file>
+ <file>images/underline.png</file>
+ <file>images/floodfill.png</file>
+ <file>images/bringtofront.png</file>
+ <file>images/delete.png</file>
+ <file>images/sendtoback.png</file>
+ <file>images/linecolor.png</file>
+ <file>images/background1.png</file>
+ <file>images/background2.png</file>
+ <file>images/background3.png</file>
+ <file>images/background4.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py b/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py
new file mode 100644
index 000000000..aab76d9d6
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py
@@ -0,0 +1,445 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Fri Jul 30 17:58:19 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x01\x12\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x0b\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x7f\xf5\x94\x3b\
+\x00\x00\x00\xd9\x49\x44\x41\x54\x28\x53\x7d\x90\x31\x0e\x45\x40\
+\x10\x86\x47\x24\x24\x1a\x0d\x0d\xd1\x22\x51\x70\x80\x6d\x5c\x40\
+\xe7\x3c\x0e\x21\x0a\x47\x71\x19\xb5\x4e\xa9\xc1\x78\x33\xb2\x8b\
+\xf7\xec\xdb\xe4\xcb\x66\x76\xfe\xf9\x67\x76\xc0\x30\x0c\x04\x80\
+\x07\xf4\x66\x59\x16\x26\x49\x82\x9f\x03\xc4\xbe\xef\x94\x3b\x05\
+\x69\x9a\x32\x24\x08\xc3\xf0\x51\x58\xd7\x35\x17\x01\x05\x04\x55\
+\xde\x5d\xe8\x76\x1c\x87\x73\xb6\x6d\xe3\xc3\x59\x0a\xef\x44\x51\
+\xc4\xe2\x20\x08\xf4\xce\xeb\xba\x62\xdb\xb6\x6a\x94\xbe\xef\x4f\
+\xb1\x7c\x28\x8a\x82\xc9\xf3\x1c\x7d\xdf\x67\x03\x21\x04\x0e\xc3\
+\xa0\x4c\x40\xb7\x0d\xd3\x34\x59\xdc\x75\xdd\x25\xfe\x9e\x79\xdb\
+\x36\x9c\xa6\x89\x63\xd9\x21\x8e\x63\x1c\xc7\x11\xd5\xcc\x6f\x1f\
+\x24\x64\xbe\xaa\xaa\xff\xdb\x58\x96\x45\x8d\x46\x5d\x5e\xb7\x41\
+\xcc\xf3\x8c\x4d\xd3\xa0\xcc\x67\x59\x76\x39\x7b\x9e\xa7\x70\x5d\
+\xf7\xe7\xd3\xda\x6d\x48\xa8\xa8\x2c\x4b\xd5\xf1\x00\xd0\xc0\x13\
+\xc8\x06\xaf\x16\x28\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x00\xf7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9\x47\x9e\
+\x00\x00\x00\xbe\x49\x44\x41\x54\x28\x53\x85\x91\x31\x0e\x40\x40\
+\x10\x45\x57\x4d\x24\x4a\x37\xa1\xa4\x91\x38\x85\x5e\x74\xaa\x3d\
+\x8a\x4e\x54\x7b\x80\xad\x75\x6e\xa0\xd1\x6c\xe7\x12\xc4\x97\x19\
+\xb1\x21\x59\x51\xfc\x62\xfe\xbc\xfc\x99\xcc\x08\x00\x82\x74\x1c\
+\x07\xa6\x69\x82\x10\xc2\x29\xcf\xf3\x2e\xf0\xd6\x38\x8e\xa8\xaa\
+\x8a\x55\x14\x05\x03\x49\x92\x58\xef\x05\x3f\xd5\x75\x1d\xc3\x5a\
+\x6b\xd0\x54\xf2\x9c\x20\x35\xeb\xba\x66\x78\x5d\x57\xdc\xfe\x67\
+\x72\x9a\xa6\x88\xe3\x18\x4f\xcf\x09\x6e\xdb\x06\xdf\xf7\x51\x96\
+\xa5\x5d\xc1\x09\x53\x73\x9e\x67\x5e\x41\x4a\xf9\x9f\x3c\x0c\x03\
+\xc3\x4a\xa9\xff\xe4\xb6\x6d\x19\x5e\x96\xe5\x3f\x39\xcf\x73\x84\
+\x61\x88\x7d\xdf\xdf\xc9\x54\x18\x63\xec\xe1\x49\x41\x10\x20\x8a\
+\x22\x5b\x37\x4d\x03\x9b\xdc\xf7\xfd\xf5\xce\x8f\x57\x67\x59\xc6\
+\x13\x4e\xfa\x57\x56\x58\xe8\x40\xda\xc6\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\x72\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfc\x73\x8f\x50\
+\x00\x00\x00\x06\x50\x4c\x54\x45\xff\xff\xff\x00\x00\x00\x55\xc2\
+\xd3\x7e\x00\x00\x00\x27\x49\x44\x41\x54\x48\xc7\x63\x60\x80\x82\
+\x06\x06\x34\x30\x2a\x30\x2a\x30\x2a\x30\x2a\x80\x2a\xf0\x1f\x15\
+\xfc\x1b\x0d\xa0\x51\x81\x51\x81\x51\x01\x22\x05\x00\xd5\x3b\x4e\
+\xf0\x73\xe3\x6f\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x01\x25\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\xda\x49\x44\x41\x54\x48\xc7\xed\x94\x41\x0e\
+\x82\x30\x10\x45\x1f\x46\x38\x83\x77\xf0\xfe\x87\xf0\x1a\x5e\x40\
+\xb1\xa5\x74\xa6\x1a\x5c\xb4\x04\x8c\xa2\x11\xca\xc2\xc4\x49\xd8\
+\xd0\xe4\xe5\xf5\xf7\x67\x8a\xb2\x2c\x3b\x16\x4c\x08\xa1\x78\xf5\
+\x7f\x0b\xa0\xaa\xb3\xa0\x55\x55\x4d\x9e\x6d\x58\x69\xfe\xe0\x1f\
+\x06\x6f\x33\x30\xba\x55\xc0\xdd\xed\x0a\x37\x0f\xa1\x05\x75\x20\
+\x96\x62\xb7\xcf\x60\x1c\x5c\x82\x36\xa0\x16\xc4\x66\x8a\x42\xed\
+\x00\xf5\x16\xe4\x92\x09\x2c\x97\x68\x29\x26\x7e\x9a\xcb\xd8\xd7\
+\xe0\xcd\x08\xdc\x64\x02\xbb\xf3\x60\xaa\x39\xc1\xed\x39\x41\xfb\
+\xac\xcd\x00\x7e\xb7\xfe\x3e\x67\x5c\xc7\x8c\x43\x93\xe2\x48\x19\
+\x4f\x2d\xea\x57\x95\xed\x8e\x87\x21\x4b\x49\x96\xbe\x8e\xa6\x92\
+\x1a\x31\xeb\xf1\xfc\x29\x56\xaa\xef\x6b\xb0\x20\xc9\x54\x47\x0f\
+\xf8\x35\xb8\x4d\xd7\x56\x03\xe2\x20\x98\xc7\xaa\xf5\xb7\x98\x05\
+\xd6\xde\xd4\x3e\xf7\x57\x1a\xb8\x3a\x00\x8a\xa5\xcb\x66\x6a\xee\
+\x91\x61\xa9\x66\xc0\x0f\xb5\x5d\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x00\x74\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfc\x73\x8f\x50\
+\x00\x00\x00\x06\x50\x4c\x54\x45\xc0\xc0\xc0\xff\xff\xff\x2b\x69\
+\x87\xb4\x00\x00\x00\x29\x49\x44\x41\x54\x48\x4b\x63\xf8\x0f\x05\
+\x0d\x0c\x50\x30\x2a\x30\x2a\x30\x2a\x30\x2a\x40\xa4\x00\x0c\xd8\
+\x43\xc4\xff\x8d\x0a\x8c\x0a\x8c\x0a\x8c\x0a\x60\x17\x00\x00\x3f\
+\x78\xe4\xb7\xe3\x90\x30\x5f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x00\xfa\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9\x47\x9e\
+\x00\x00\x00\xc1\x49\x44\x41\x54\x28\x53\xcd\x90\x31\x0a\x84\x30\
+\x10\x45\xc7\xce\x56\xb0\xd3\x46\x10\x6f\x60\xe5\x01\xbc\x42\x40\
+\x0b\x9b\x74\x22\x11\xbc\x94\x9d\x27\xd2\x03\x78\x03\x03\x19\xf7\
+\x0f\xb8\xd9\x2c\x6c\xbf\x81\x4f\x66\xde\xfc\x7c\xc8\x50\x1c\xc7\
+\x4c\x44\xa2\x28\x8a\x38\xcf\x73\x7e\x1d\xc2\xfd\xc9\xd3\x34\x65\
+\xd2\x5a\x73\x51\x14\x02\x86\x61\xe0\x79\x9e\xc5\x8c\x1b\x3d\x38\
+\xe6\xe3\x38\x32\x61\xa0\x94\x12\x88\xfa\x5b\xe0\x98\x3b\xe7\x42\
+\x33\xc0\x2f\x33\xea\x7f\x4a\xee\xba\x4e\xcc\xd7\x75\x05\x0f\xd0\
+\x83\xf7\x7d\xef\x93\xb1\x26\xc0\x7d\xdf\x03\xf3\x71\x1c\xc2\x97\
+\x65\xf1\xc9\xeb\xba\x0a\x9c\xa6\x29\x30\x3f\x21\xdb\xb6\xf9\x64\
+\xa8\xae\x6b\x19\x94\x65\xc9\x6d\xdb\x72\x55\x55\xd2\x37\x4d\xc3\
+\xd6\x5a\x9f\xfc\xc8\x18\xc3\x59\x96\x89\x29\x49\x12\xc6\x5f\xce\
+\xf3\x7c\x6f\xe9\x06\x33\x20\x38\xcd\x08\x1e\x78\x76\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\x60\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfc\x73\x8f\x50\
+\x00\x00\x00\x03\x50\x4c\x54\x45\xff\xff\xff\xa7\xc4\x1b\xc8\x00\
+\x00\x00\x18\x49\x44\x41\x54\x78\x5e\xed\xc0\x31\x01\x00\x00\x00\
+\xc2\x20\xfb\xa7\x36\xc5\x3e\x58\x0b\x00\xe0\x08\x6f\x00\x01\x01\
+\x3e\xc3\x31\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\x8d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x1b\x00\x00\x00\x1b\x01\x03\x00\x00\x00\xb7\x1a\x66\x16\
+\x00\x00\x00\x06\x50\x4c\x54\x45\xff\xff\xff\x00\x00\x00\x55\xc2\
+\xd3\x7e\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\
+\x00\x00\x35\x49\x44\x41\x54\x08\x99\x63\x60\xc0\x02\xd8\x1b\x80\
+\x04\xff\x01\x4c\x82\xfd\x01\x48\xba\x00\x44\x58\x80\x08\x19\x10\
+\xc1\x07\xd6\x02\x22\x98\x41\xfa\x18\x41\x0a\x19\xc0\x0a\xeb\x40\
+\x84\x3d\x16\x42\x0e\xdd\x46\x00\xb5\x00\x09\x40\xa3\x31\xbf\x5e\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x3f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x02\xd1\x49\x44\x41\x54\x38\xcb\x7d\
+\x95\x4b\x68\x53\x41\x14\x86\x93\xe6\xd1\x08\x49\x28\x04\x5b\x17\
+\x05\x35\xee\x5a\xbb\x50\xb2\xb1\xda\x85\x8f\x5d\xb5\xbe\x16\x76\
+\x29\x2d\x42\x49\x57\xed\xce\x8d\x0a\xa2\xe0\xba\xab\x14\x84\x8a\
+\x2b\x51\x44\x45\x17\x0a\x8a\x55\xf1\x01\x1a\xb0\x56\x23\xad\xa2\
+\xc5\xb6\x92\x6a\x95\xbe\x34\xcd\xc3\xe3\x7f\x6e\xce\x64\xe6\x4e\
+\xd2\x16\x3e\xe6\xde\xce\x3f\x7f\x66\xce\x63\xae\x87\x88\x3c\x26\
+\xf8\xf3\x01\x7e\xa8\x07\x01\x50\x67\x6b\x0c\x6d\x9d\xa1\x0d\xf2\
+\xda\xca\x9c\x21\xf2\x8a\x11\x51\x7f\x7f\x5e\x16\x6c\x04\x61\xe0\
+\xaf\x61\xea\x77\xb4\x03\x03\x4a\xdb\x08\x22\xe2\xe1\x35\x85\x8e\
+\xe9\xbf\xa1\x21\x2a\x75\x77\x53\xa1\x2c\x66\x36\x83\x28\xcf\x57\
+\x69\x53\x29\x2a\xf5\xf4\x50\x29\x18\x54\xda\x38\x68\x70\xe6\xcd\
+\xe3\x97\x60\x5a\xec\xed\xa5\x42\x4b\x0b\xe5\xf0\xfe\x5d\x9b\x6f\
+\x55\xe6\xca\xb4\x34\x3c\x4c\xc5\x64\x92\x0a\x6d\x6d\xb4\x8c\xf7\
+\x71\xad\x8d\x3b\x5a\x31\xa6\xd5\x64\x32\xbf\x8a\x9d\xe6\x5a\x5b\
+\xe9\x2f\xde\xff\x80\x05\x30\xed\x5e\x10\xe3\xe7\x02\x4c\xa1\xaf\
+\x68\x27\xc1\x65\x70\xd6\xe3\x29\x8a\xb6\x49\x19\x87\xf8\x1f\x4b\
+\x60\x51\x46\xc5\x2f\xb7\x39\xe5\x61\x9a\x83\xe9\x0a\x4c\x97\xc4\
+\x74\x04\x1c\xd7\x9a\x76\xd0\xac\x8c\x83\x12\x7c\xfa\x0c\xe6\xc4\
+\xf0\xb7\x8c\xcc\x62\x22\x41\x2b\x83\x83\xb4\xdc\xd7\x47\x0b\x30\
+\xe5\xb9\x8c\xec\xf4\x98\x36\xed\x02\x3b\x1c\x2f\x23\xc6\x61\x49\
+\x14\x7d\x04\x33\x20\x2b\x3f\xc2\xfc\x88\xc5\x68\x1e\xf1\xfc\x19\
+\x8f\x3b\xef\xef\x40\x0a\x1c\xd1\xa6\xd8\xb4\x67\x97\x78\x84\xed\
+\xf2\x89\x4a\xa2\x1c\x73\x0e\xc1\x6c\x0d\xde\x8b\xe9\x61\xb7\x69\
+\xbb\x91\x64\xbf\x5d\x9b\x01\x99\xe0\x44\xd1\x0c\x8e\xff\x0d\x3b\
+\x9d\xc2\xb3\xc9\x4b\x70\x41\x9b\x9e\x00\x1d\x95\x6a\x90\xb2\xac\
+\xd5\x4d\x01\x95\xfd\x2c\x62\xfa\x15\xc7\xff\x84\x67\x13\x0e\xc3\
+\x4d\x6d\xdc\x09\xb6\xcb\x9a\x40\x55\xe7\xd9\xc5\x3f\x8f\xec\x4f\
+\x23\x51\x13\x88\x69\x46\x12\xa5\xf8\x00\xd2\xe0\x89\x36\x5f\xdf\
+\x58\x99\xce\xc1\x74\x0a\x25\x95\x41\xf6\xc7\xc4\xe0\x01\x78\x05\
+\xde\x82\x31\x19\xdf\x80\x51\xbb\x31\xec\x50\xa8\xde\xcf\xc2\xf4\
+\x0b\x4c\xc7\x61\xca\xbb\xba\x0f\x2e\x81\xd3\xe0\x2a\x78\x2e\x86\
+\x69\x19\xf9\xc7\x1e\x55\x77\xa8\xdf\xd5\xd2\xb3\xe8\xfd\x49\x98\
+\xa6\x61\xca\x09\xba\x0b\xce\x83\x03\x46\x83\xdc\x03\xcf\xc0\x0b\
+\x49\x22\x8f\x8f\xc1\x35\xf7\xdd\x12\xae\xb4\xf4\x04\x6e\xa9\x0c\
+\x2e\x94\xd7\x48\x16\x2f\xbc\x0d\xce\x81\xfd\xee\xec\x77\x2a\x73\
+\x36\x7b\x2a\x3f\x72\x4b\x36\x90\xd4\x2d\xdd\xe8\x6a\xe9\xd1\x50\
+\x88\x1e\x62\xbc\x0e\xce\x80\x7d\xee\x3a\xed\x90\x24\x31\x74\x47\
+\xc2\x74\x03\x5c\x04\x87\xb4\x76\xb7\xdd\xd2\x4d\x3c\x71\x45\xe2\
+\xb9\xb7\xba\xf8\xd5\x25\x14\x53\x75\x3e\x52\xbe\x78\xe8\xa0\xd6\
+\x1e\x05\x09\xf3\x12\xf2\x49\xd0\xb7\xb1\xe0\xa4\x3e\x52\x97\xb4\
+\xa9\x7d\x6d\x56\x3a\xf4\x94\xd6\xb2\xe9\x1e\xf1\x88\xda\xa5\xd6\
+\xa0\xcc\xe5\x48\x3b\xc1\x96\x35\x2e\xfa\xa8\xcc\x29\x6d\x42\xd6\
+\xea\x8b\xde\xfa\x34\xf1\x82\x4d\x4e\x9c\xca\xe1\x89\xac\xf3\x69\
+\x8a\x88\xa6\x59\xd6\xa8\x53\x79\x6b\x75\x9e\x4f\x3e\x8e\x1b\xec\
+\x0f\xe4\x1a\xda\xa0\x68\xeb\x4d\xed\x7f\x3d\xa9\x97\x96\x02\xf1\
+\x2b\x1c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\x91\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x2a\x00\x00\x00\x2b\x01\x03\x00\x00\x00\x34\x51\x88\xbd\
+\x00\x00\x00\x06\x50\x4c\x54\x45\xff\xff\xff\x00\x00\x00\x55\xc2\
+\xd3\x7e\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\
+\x00\x00\x39\x49\x44\x41\x54\x18\x57\x63\x60\xc0\x05\x14\x20\x54\
+\x01\x84\xfa\x01\x26\x19\xff\x80\x29\x66\x08\x8f\xfd\x03\x98\xe2\
+\x7f\x00\xa6\xe4\x0f\x80\x29\xfb\x06\x30\x55\x0f\xd1\xf6\x6f\x50\
+\x6b\xe3\x87\x68\x63\x83\x50\x2c\x0c\x84\x00\x00\x91\xca\x1c\x09\
+\xf6\x23\x2a\xfe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x00\x70\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfc\x73\x8f\x50\
+\x00\x00\x00\x06\x50\x4c\x54\x45\x00\xff\xff\xff\xff\xff\xb1\xb8\
+\x5e\xa0\x00\x00\x00\x25\x49\x44\x41\x54\x78\x5e\xed\xcc\x21\x12\
+\x00\x00\x04\x00\x41\xff\x7f\x34\x82\x11\x64\x75\x2f\x6e\xb8\xd8\
+\x6a\xca\x0b\x00\x00\xf0\x9d\x01\x00\x40\x03\x94\x98\xeb\xc0\x19\
+\x38\xa1\x84\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x00\xad\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x0f\x00\x00\x00\x18\x02\x03\x00\x00\x00\x58\x6b\x4f\xfa\
+\x00\x00\x00\x09\x50\x4c\x54\x45\xff\xff\xff\xff\xff\xff\x00\x00\
+\x00\x8e\xf4\xc3\xec\x00\x00\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\
+\xd8\x66\x00\x00\x00\x52\x49\x44\x41\x54\x08\x1d\x05\xc1\xb1\x0d\
+\xc2\x30\x14\x05\xc0\x8b\x04\x1b\xd0\x3c\x4f\xe3\x8a\x9a\xe6\x47\
+\x72\x1f\x17\x61\x1a\x57\x9e\x80\x41\xb9\xf3\x82\x40\xeb\xc8\x42\
+\x2e\x64\x20\x67\x27\xb5\x48\x5d\xa4\x06\xa9\xb3\x4b\xd5\x92\xfa\
+\xfe\x64\xcc\x8f\xdc\x17\xd9\x83\xf6\x1e\xe4\xd8\xdd\xe3\xd8\x1d\
+\x73\x61\x2e\xb4\x8e\x27\xf0\x07\xd5\x18\x11\x1b\xed\x4d\x23\xf4\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xf1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x2a\x00\x00\x00\x2c\x08\x03\x00\x00\x00\x24\x44\xda\x74\
+\x00\x00\x01\x32\x50\x4c\x54\x45\xff\xff\xff\xfe\xfe\xfe\x01\x01\
+\x01\xbe\xbe\xbe\xfd\xfd\xfd\x00\x00\x00\x64\x64\x64\xd2\xd2\xd2\
+\x7c\x7c\x7c\xfb\xfb\xfb\xe7\xe7\xe7\x84\x84\x84\xd7\xd7\xd7\xe0\
+\xe0\xe0\xe1\xe1\xe1\x0c\x0c\x0c\x28\x28\x28\xf5\xf5\xf5\xb3\xb3\
+\xb3\x02\x02\x02\x95\x95\x95\x2e\x2e\x2e\x11\x11\x11\x6b\x6b\x6b\
+\x03\x03\x03\x72\x72\x72\x49\x49\x49\xfc\xfc\xfc\x13\x13\x13\x04\
+\x04\x04\x9f\x9f\x9f\xc4\xc4\xc4\xa9\xa9\xa9\x05\x05\x05\x57\x57\
+\x57\x17\x17\x17\xf6\xf6\xf6\x16\x16\x16\xa6\xa6\xa6\xa0\xa0\xa0\
+\x60\x60\x60\x24\x24\x24\x3e\x3e\x3e\x23\x23\x23\xb7\xb7\xb7\x4d\
+\x4d\x4d\xf8\xf8\xf8\xc0\xc0\xc0\x30\x30\x30\x09\x09\x09\xec\xec\
+\xec\x20\x20\x20\x8a\x8a\x8a\xda\xda\xda\xf1\xf1\xf1\x0d\x0d\x0d\
+\x99\x99\x99\x19\x19\x19\xf9\xf9\xf9\xcd\xcd\xcd\xf4\xf4\xf4\x39\
+\x39\x39\x2d\x2d\x2d\x3b\x3b\x3b\x12\x12\x12\x43\x43\x43\xc2\xc2\
+\xc2\xa4\xa4\xa4\xdc\xdc\xdc\x55\x55\x55\x68\x68\x68\x5a\x5a\x5a\
+\x50\x50\x50\xf0\xf0\xf0\x06\x06\x06\x1f\x1f\x1f\x74\x74\x74\xb1\
+\xb1\xb1\x5d\x5d\x5d\x21\x21\x21\x36\x36\x36\x08\x08\x08\xea\xea\
+\xea\xdb\xdb\xdb\x81\x81\x81\x9c\x9c\x9c\x8b\x8b\x8b\x75\x75\x75\
+\xf2\xf2\xf2\x25\x25\x25\xce\xce\xce\x48\x48\x48\x63\x63\x63\xba\
+\xba\xba\x53\x53\x53\x38\x38\x38\xf7\xf7\xf7\xe4\xe4\xe4\xa2\xa2\
+\xa2\x4a\x4a\x4a\xf3\xf3\xf3\x5f\x5f\x5f\xf1\x69\x00\xec\x00\x00\
+\x00\x01\x74\x52\x4e\x53\x00\x40\xe6\xd8\x66\x00\x00\x01\x6d\x49\
+\x44\x41\x54\x78\x5e\xd5\x92\xc5\x76\xc3\x30\x10\x45\x3d\x92\x1d\
+\x66\xe6\x94\x99\x99\x99\x99\x99\xe1\xff\x7f\xa1\x9e\x89\x93\x53\
+\xa9\xb2\x4e\x76\x6d\xdf\xf2\xea\xfa\xbd\x59\xd8\xf8\x2b\xf1\x30\
+\xeb\x5b\x58\xcc\x04\x37\x13\x3c\x96\x10\xc6\xb5\xad\x42\xda\x9a\
+\x6f\x6d\x0d\x40\xb3\xad\x2c\xe8\xda\x1a\xe2\xb5\xf4\xd4\xdd\x71\
+\xbf\xa1\x0d\x14\x7b\x1b\xed\x09\xd0\xbb\x03\x0d\x93\x0d\xea\x4d\
+\xd8\x41\x2b\x33\x82\x6e\x2e\xac\x35\xc3\x39\xbb\x95\xe5\xbb\xa9\
+\xdb\xa7\xbd\xc0\x47\xce\x64\x47\x27\x7e\x31\x3b\xa7\x71\x87\xda\
+\xd1\x2c\x00\xf8\xe8\xda\x16\xcd\x7e\x17\x19\x09\xc3\x88\x94\xd1\
+\x5d\xd5\xb4\xf6\xe1\x6e\xbf\xdf\x36\x36\xe9\x92\x90\xab\xeb\xa5\
+\xf7\x09\xdb\x84\x61\xea\xcf\xbb\xee\x67\xd1\x1c\x1d\x43\x60\xa6\
+\xd1\x5d\x89\xbb\x98\x53\xd3\xb8\xef\xa9\x81\x19\x5a\xa8\x80\xda\
+\x4d\xd1\xeb\x3c\xbd\xc2\x42\x06\xbf\x5b\x54\x9b\xe6\x12\x9a\xcb\
+\x4e\x0f\x1c\xd0\xb5\x77\xca\xfd\x35\x7a\x5b\xaf\x83\x8d\x24\xba\
+\x5b\xca\x0b\xb6\x71\x5f\x0a\x8b\xee\x2a\xdc\xc0\x9e\xa5\x08\x4b\
+\x29\xf6\x83\x96\x32\x69\xf3\x87\xe9\xdf\x67\x6a\xb7\x0a\xb2\x7b\
+\xe8\x62\xb2\x23\xd9\x84\x02\xf2\x63\x2e\xe4\x04\xd9\xe9\x99\x64\
+\x9e\x53\xc3\x85\x48\x2f\x69\xe9\x0a\x44\x7a\x6d\x53\x96\x8c\x08\
+\x14\x6e\xa2\x48\x6f\x8b\x02\x8d\x97\xb0\xf5\x1e\xa4\xad\x07\xda\
+\x7a\x14\x58\x45\xfd\xd7\x57\xe9\x82\x27\xa1\xe1\x19\x97\x4a\x2f\
+\x72\xab\x19\x43\x5e\x7e\xad\x73\xce\xf9\x1b\x7d\xfd\xce\x31\x1f\
+\xe0\x60\xcc\x27\xad\x65\x6d\x4c\xcc\x12\xc2\xbc\x4e\x23\x13\x39\
+\x41\x89\x79\xc1\x50\x35\xfc\x7e\xeb\xff\xca\x17\x55\x71\x20\xbb\
+\xd7\xbb\x2e\xca\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x01\x1a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x2a\x00\x00\x00\x2b\x02\x03\x00\x00\x00\x73\xf1\xf2\x6d\
+\x00\x00\x00\x0c\x50\x4c\x54\x45\xff\xff\xff\x80\x80\x80\x00\x00\
+\x00\xff\xff\xff\x45\x4a\x4b\x38\x00\x00\x00\x01\x74\x52\x4e\x53\
+\x00\x40\xe6\xd8\x66\x00\x00\x00\xbc\x49\x44\x41\x54\x78\x5e\x4d\
+\xcb\xbd\x89\x04\x31\x0c\x86\x61\xa1\xd0\x55\x38\x1c\xdc\x8f\x26\
+\xd8\x12\xa6\x0a\xb3\xe1\xe6\x4e\x2e\x32\x07\x02\xdb\x07\x5b\xc0\
+\x96\xb4\x55\x9c\x47\x3f\x33\x56\xf4\x21\xde\x07\x42\xcd\xe0\x17\
+\x46\xbd\xf6\xb6\xec\x1a\xef\xa6\x41\x02\x34\xb2\x41\x80\x60\x24\
+\xcf\x9d\x9a\xee\x38\x8b\x7e\x78\x83\x4f\x7e\x64\xb3\x30\x68\x57\
+\x10\x32\x74\x22\x05\x98\x91\x89\x0c\xe4\x50\x88\x0c\xd4\x44\xe4\
+\x20\xce\xdc\xc1\x98\x89\x83\x33\x71\x20\x89\x02\xe4\x9d\x1d\x60\
+\xa1\x2e\x40\xff\xe9\x02\xfd\xf1\x2a\x0e\xd2\xfe\x7b\x81\x50\xda\
+\x02\x8e\xef\x02\x3e\x0b\x78\xb3\x6c\x01\x7f\x5d\x1a\x03\x66\x1d\
+\x34\x00\x03\x42\x15\xb0\xe4\x0a\x24\x37\x50\x24\x57\xc0\x92\x2b\
+\xe8\x92\x1b\x90\xdc\x80\xe4\x0a\x24\x37\xf0\x73\x6f\x1c\x70\x5f\
+\x5b\x76\x3c\xc7\x3f\xd6\x51\x68\x20\x52\x85\xdb\x5f\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\x3e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\xf3\x49\x44\x41\x54\x38\xcb\xed\x94\x41\x6e\
+\x83\x30\x10\x45\x9f\x25\xe0\x0c\xbd\x43\x2f\xd0\x13\xe5\xfa\x55\
+\x62\x9b\xd8\x33\x01\x77\x81\x0d\x24\x85\xaa\x31\xca\xaa\x1d\x89\
+\x8d\x0d\x4f\xef\x7b\x06\x37\x6d\xdb\x26\x0e\x94\xaa\x9a\xad\xf5\
+\x06\x40\x44\xaa\xa0\x5d\xd7\xed\xee\x35\xbc\xa8\xfe\xc1\x7f\x01\
+\x6c\x8c\xd9\xdb\x4a\x87\x8d\x53\xda\x60\x8c\x03\x0c\x01\xf4\x0a\
+\xd2\x43\x74\x98\xb7\xf7\x83\x47\x31\x2a\x68\x81\x7a\x10\x07\xd1\
+\x1d\x3c\xe3\x41\x26\xa0\xf6\x0b\x34\x38\x88\x97\x4a\x70\x1a\x61\
+\x88\x4b\x74\xf5\x93\x65\xb4\xd3\x23\x35\xc6\x69\x80\x5b\x00\x29\
+\xd1\x3d\xa8\x83\x60\x57\x60\x5f\x01\x96\x1c\x7d\xb6\x7c\x30\x95\
+\x6a\x70\xfe\x70\x06\xba\x15\xd4\xe5\x14\x76\x01\xff\x74\xfd\xdd\
+\x55\xb8\xe4\xce\xdb\x05\x5c\x26\x41\xfd\xb2\x06\x34\x7b\x17\xf5\
+\xe6\x8f\x10\xce\xdf\xa1\xc5\x34\xe6\x89\xa8\x6a\x5e\xf8\x9c\x46\
+\x6a\xb6\x74\x10\xb3\xa9\xac\x1a\xf8\x34\xf8\x7a\xce\xa6\x16\x62\
+\x0f\x6a\xef\x1b\x58\x52\x54\x81\xa5\x98\x6e\x4c\x45\xf4\x70\xeb\
+\x9f\x07\x9b\x8f\xd3\xaf\xdf\xfd\x02\xd6\xbd\xde\xdf\x70\xdb\x04\
+\x83\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\x08\
+\x06\x27\x5a\x67\
+\x00\x62\
+\x00\x6f\x00\x6c\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x02\xfc\x42\x47\
+\x00\x69\
+\x00\x74\x00\x61\x00\x6c\x00\x69\x00\x63\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x00\x49\xdb\xa7\
+\x00\x62\
+\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x32\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x10\
+\x0f\x9b\x88\x67\
+\x00\x62\
+\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x74\x00\x6f\x00\x66\x00\x72\x00\x6f\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x00\x4a\xdb\xa7\
+\x00\x62\
+\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x33\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x08\xd5\xc4\xe7\
+\x00\x75\
+\x00\x6e\x00\x64\x00\x65\x00\x72\x00\x6c\x00\x69\x00\x6e\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x00\x4b\xdb\xa7\
+\x00\x62\
+\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x03\x4a\x23\xe7\
+\x00\x6c\
+\x00\x69\x00\x6e\x00\x65\x00\x70\x00\x6f\x00\x69\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0a\
+\x0c\xad\x0f\x07\
+\x00\x64\
+\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x05\x6c\x22\xc7\
+\x00\x6c\
+\x00\x69\x00\x6e\x00\x65\x00\x63\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x00\x50\xdb\xa7\
+\x00\x62\
+\x00\x61\x00\x63\x00\x6b\x00\x67\x00\x72\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x31\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x0a\x2b\x97\xe7\
+\x00\x70\
+\x00\x6f\x00\x69\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0f\
+\x05\xaa\x0c\xc7\
+\x00\x74\
+\x00\x65\x00\x78\x00\x74\x00\x70\x00\x6f\x00\x69\x00\x6e\x00\x74\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0d\
+\x06\x43\xe3\x67\
+\x00\x66\
+\x00\x6c\x00\x6f\x00\x6f\x00\x64\x00\x66\x00\x69\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0e\
+\x0f\x0d\x22\x27\
+\x00\x73\
+\x00\x65\x00\x6e\x00\x64\x00\x74\x00\x6f\x00\x62\x00\x61\x00\x63\x00\x6b\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\x0f\x00\x00\x00\x02\
+\x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x02\x11\
+\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x03\xb0\
+\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x05\x26\
+\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x09\xf3\
+\x00\x00\x00\x28\x00\x00\x00\x00\x00\x01\x00\x00\x01\x16\
+\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x05\x8a\
+\x00\x00\x01\x32\x00\x00\x00\x00\x00\x01\x00\x00\x09\x5e\
+\x00\x00\x01\x92\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x18\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x0d\
+\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x04\x28\
+\x00\x00\x01\x76\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x67\
+\x00\x00\x01\x18\x00\x00\x00\x00\x00\x01\x00\x00\x06\x1b\
+\x00\x00\x01\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x2b\
+\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x02\x87\
+"
+
+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()
diff --git a/examples/widgets/graphicsview/diagramscene/images/background1.png b/examples/widgets/graphicsview/diagramscene/images/background1.png
new file mode 100644
index 000000000..0f93c6bf4
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/background1.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/background2.png b/examples/widgets/graphicsview/diagramscene/images/background2.png
new file mode 100644
index 000000000..1e293db67
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/background2.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/background3.png b/examples/widgets/graphicsview/diagramscene/images/background3.png
new file mode 100644
index 000000000..3db4f8ea5
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/background3.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/background4.png b/examples/widgets/graphicsview/diagramscene/images/background4.png
new file mode 100644
index 000000000..9c1f3bfd7
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/background4.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/bold.png b/examples/widgets/graphicsview/diagramscene/images/bold.png
new file mode 100644
index 000000000..986e65e25
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/bold.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/bringtofront.png b/examples/widgets/graphicsview/diagramscene/images/bringtofront.png
new file mode 100644
index 000000000..bda27578a
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/bringtofront.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/delete.png b/examples/widgets/graphicsview/diagramscene/images/delete.png
new file mode 100644
index 000000000..df2a147d2
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/delete.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/floodfill.png b/examples/widgets/graphicsview/diagramscene/images/floodfill.png
new file mode 100644
index 000000000..54c0dae23
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/floodfill.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/italic.png b/examples/widgets/graphicsview/diagramscene/images/italic.png
new file mode 100644
index 000000000..9a438b57a
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/italic.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/linecolor.png b/examples/widgets/graphicsview/diagramscene/images/linecolor.png
new file mode 100644
index 000000000..98a821f27
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/linecolor.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/linepointer.png b/examples/widgets/graphicsview/diagramscene/images/linepointer.png
new file mode 100644
index 000000000..66933d43b
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/linepointer.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/pointer.png b/examples/widgets/graphicsview/diagramscene/images/pointer.png
new file mode 100644
index 000000000..0b0b0aa69
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/pointer.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/sendtoback.png b/examples/widgets/graphicsview/diagramscene/images/sendtoback.png
new file mode 100644
index 000000000..5aa3b0a24
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/sendtoback.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/textpointer.png b/examples/widgets/graphicsview/diagramscene/images/textpointer.png
new file mode 100644
index 000000000..b25832cad
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/textpointer.png
Binary files differ
diff --git a/examples/widgets/graphicsview/diagramscene/images/underline.png b/examples/widgets/graphicsview/diagramscene/images/underline.png
new file mode 100644
index 000000000..9b8209f52
--- /dev/null
+++ b/examples/widgets/graphicsview/diagramscene/images/underline.png
Binary files differ
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
new file mode 100644
index 000000000..a0d685f85
--- /dev/null
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
@@ -0,0 +1,287 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import dragdroprobot_rc
+
+
+class ColorItem(QtWidgets.QGraphicsItem):
+ n = 0
+
+ def __init__(self):
+ super(ColorItem, self).__init__()
+
+ self.color = QtGui.QColor(QtCore.qrand() % 256, QtCore.qrand() % 256,
+ QtCore.qrand() % 256)
+
+ self.setToolTip(
+ "QColor(%d, %d, %d)\nClick and drag this color onto the robot!" %
+ (self.color.red(), self.color.green(), self.color.blue())
+ )
+ self.setCursor(QtCore.Qt.OpenHandCursor)
+
+ def boundingRect(self):
+ return QtCore.QRectF(-15.5, -15.5, 34, 34)
+
+ def paint(self, painter, option, widget):
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.darkGray)
+ painter.drawEllipse(-12, -12, 30, 30)
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
+ painter.setBrush(QtGui.QBrush(self.color))
+ painter.drawEllipse(-15, -15, 30, 30)
+
+ def mousePressEvent(self, event):
+ if event.button() != QtCore.Qt.LeftButton:
+ event.ignore()
+ return
+
+ self.setCursor(QtCore.Qt.ClosedHandCursor)
+
+ def mouseMoveEvent(self, event):
+ if QtCore.QLineF(QtCore.QPointF(event.screenPos()), QtCore.QPointF(event.buttonDownScreenPos(QtCore.Qt.LeftButton))).length() < QtWidgets.QApplication.startDragDistance():
+ return
+
+ drag = QtGui.QDrag(event.widget())
+ mime = QtCore.QMimeData()
+ drag.setMimeData(mime)
+
+ ColorItem.n += 1
+ if ColorItem.n > 2 and QtCore.qrand() % 3 == 0:
+ image = QtGui.QImage(':/images/head.png')
+ mime.setImageData(image)
+ drag.setPixmap(QtGui.QPixmap.fromImage(image).scaled(30,40))
+ drag.setHotSpot(QtCore.QPoint(15, 30))
+ else:
+ mime.setColorData(self.color)
+ mime.setText("#%02x%02x%02x" % (self.color.red(), self.color.green(), self.color.blue()))
+
+ pixmap = QtGui.QPixmap(34, 34)
+ pixmap.fill(QtCore.Qt.white)
+
+ painter = QtGui.QPainter(pixmap)
+ painter.translate(15, 15)
+ painter.setRenderHint(QtGui.QPainter.Antialiasing)
+ self.paint(painter, None, None)
+ painter.end()
+
+ pixmap.setMask(pixmap.createHeuristicMask())
+
+ drag.setPixmap(pixmap)
+ drag.setHotSpot(QtCore.QPoint(15, 20))
+
+ drag.exec_()
+ self.setCursor(QtCore.Qt.OpenHandCursor)
+
+ def mouseReleaseEvent(self, event):
+ self.setCursor(QtCore.Qt.OpenHandCursor)
+
+
+class RobotPart(QtWidgets.QGraphicsItem):
+ def __init__(self, parent=None):
+ super(RobotPart, self).__init__(parent)
+
+ self.color = QtGui.QColor(QtCore.Qt.lightGray)
+ self.pixmap = None
+ self.dragOver = False
+
+ self.setAcceptDrops(True)
+
+ def dragEnterEvent(self, event):
+ if event.mimeData().hasColor() or \
+ (isinstance(self, RobotHead) and event.mimeData().hasImage()):
+ event.setAccepted(True)
+ self.dragOver = True
+ self.update()
+ else:
+ event.setAccepted(False)
+
+ def dragLeaveEvent(self, event):
+ self.dragOver = False
+ self.update()
+
+ def dropEvent(self, event):
+ self.dragOver = False
+ if event.mimeData().hasColor():
+ self.color = QtGui.QColor(event.mimeData().colorData())
+ elif event.mimeData().hasImage():
+ self.pixmap = QtGui.QPixmap(event.mimeData().imageData())
+
+ self.update()
+
+
+class RobotHead(RobotPart):
+ def boundingRect(self):
+ return QtCore.QRectF(-15, -50, 30, 50)
+
+ def paint(self, painter, option, widget=None):
+ if not self.pixmap:
+ painter.setBrush(self.dragOver and self.color.lighter(130)
+ or self.color)
+ painter.drawRoundedRect(-10, -30, 20, 30, 25, 25,
+ QtCore.Qt.RelativeSize)
+ painter.setBrush(QtCore.Qt.white)
+ painter.drawEllipse(-7, -3 - 20, 7, 7)
+ painter.drawEllipse(0, -3 - 20, 7, 7)
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawEllipse(-5, -1 - 20, 2, 2)
+ painter.drawEllipse(2, -1 - 20, 2, 2)
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 2))
+ painter.setBrush(QtCore.Qt.NoBrush)
+ painter.drawArc(-6, -2 - 20, 12, 15, 190 * 16, 160 * 16)
+ else:
+ painter.scale(.2272, .2824)
+ painter.drawPixmap(QtCore.QPointF(-15*4.4, -50*3.54), self.pixmap)
+
+
+class RobotTorso(RobotPart):
+ def boundingRect(self):
+ return QtCore.QRectF(-30, -20, 60, 60)
+
+ def paint(self, painter, option, widget=None):
+ painter.setBrush(self.dragOver and self.color.lighter(130)
+ or self.color)
+ painter.drawRoundedRect(-20, -20, 40, 60, 25, 25,
+ QtCore.Qt.RelativeSize)
+ painter.drawEllipse(-25, -20, 20, 20)
+ painter.drawEllipse(5, -20, 20, 20)
+ painter.drawEllipse(-20, 22, 20, 20)
+ painter.drawEllipse(0, 22, 20, 20)
+
+
+class RobotLimb(RobotPart):
+ def boundingRect(self):
+ return QtCore.QRectF(-5, -5, 40, 10)
+
+ def paint(self, painter, option, widget=None):
+ painter.setBrush(self.dragOver and self.color.lighter(130) or self.color)
+ painter.drawRoundedRect(self.boundingRect(), 50, 50,
+ QtCore.Qt.RelativeSize)
+ painter.drawEllipse(-5, -5, 10, 10)
+
+
+class Robot(RobotPart):
+ def __init__(self):
+ super(Robot, self).__init__()
+
+ self.torsoItem = RobotTorso(self)
+ self.headItem = RobotHead(self.torsoItem)
+ self.upperLeftArmItem = RobotLimb(self.torsoItem)
+ self.lowerLeftArmItem = RobotLimb(self.upperLeftArmItem)
+ self.upperRightArmItem = RobotLimb(self.torsoItem)
+ self.lowerRightArmItem = RobotLimb(self.upperRightArmItem)
+ self.upperRightLegItem = RobotLimb(self.torsoItem)
+ self.lowerRightLegItem = RobotLimb(self.upperRightLegItem)
+ self.upperLeftLegItem = RobotLimb(self.torsoItem)
+ self.lowerLeftLegItem = RobotLimb(self.upperLeftLegItem)
+
+ self.timeline = QtCore.QTimeLine()
+ settings = [
+ # item position rotation at
+ # x y time 0 / 1
+ ( self.headItem, 0, -18, 20, -20 ),
+ ( self.upperLeftArmItem, -15, -10, 190, 180 ),
+ ( self.lowerLeftArmItem, 30, 0, 50, 10 ),
+ ( self.upperRightArmItem, 15, -10, 300, 310 ),
+ ( self.lowerRightArmItem, 30, 0, 0, -70 ),
+ ( self.upperRightLegItem, 10, 32, 40, 120 ),
+ ( self.lowerRightLegItem, 30, 0, 10, 50 ),
+ ( self.upperLeftLegItem, -10, 32, 150, 80 ),
+ ( self.lowerLeftLegItem, 30, 0, 70, 10 ),
+ ( self.torsoItem, 0, 0, 5, -20 )
+ ]
+ self.animations = []
+ for item, pos_x, pos_y, rotation1, rotation2 in settings:
+ item.setPos(pos_x,pos_y)
+ animation = QtWidgets.QGraphicsItemAnimation()
+ animation.setItem(item)
+ animation.setTimeLine(self.timeline)
+ animation.setRotationAt(0, rotation1)
+ animation.setRotationAt(1, rotation2)
+ self.animations.append(animation)
+ self.animations[0].setScaleAt(1, 1.1, 1.1)
+
+ self.timeline.setUpdateInterval(1000 / 25)
+ self.timeline.setCurveShape(QtCore.QTimeLine.SineCurve)
+ self.timeline.setLoopCount(0)
+ self.timeline.setDuration(2000)
+ self.timeline.start()
+
+ def boundingRect(self):
+ return QtCore.QRectF()
+
+ def paint(self, painter, option, widget=None):
+ pass
+
+
+if __name__== '__main__':
+
+ import sys
+ import math
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ QtCore.qsrand(QtCore.QTime(0, 0, 0).secsTo(QtCore.QTime.currentTime()))
+
+ scene = QtWidgets.QGraphicsScene(-200, -200, 400, 400)
+
+ for i in range(10):
+ item = ColorItem()
+ angle = i*6.28 / 10.0
+ item.setPos(math.sin(angle)*150, math.cos(angle)*150)
+ scene.addItem(item)
+
+ robot = Robot()
+ robot.setTransform(QtGui.QTransform().scale(1.2, 1.2))
+ robot.setPos(0, -20)
+ scene.addItem(robot)
+
+ view = QtWidgets.QGraphicsView(scene)
+ view.setRenderHint(QtGui.QPainter.Antialiasing)
+ view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate)
+ view.setBackgroundBrush(QtGui.QColor(230, 200, 167))
+ view.setWindowTitle("Drag and Drop Robot")
+ view.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.qrc b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.qrc
new file mode 100644
index 000000000..b0969d2a6
--- /dev/null
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/" >
+ <file>images/head.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py
new file mode 100644
index 000000000..240a23d43
--- /dev/null
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py
@@ -0,0 +1,1017 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Fri Jul 30 18:00:51 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x3a\x7c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x84\x00\x00\x00\xb1\x08\x04\x00\x00\x00\xaf\xfa\xdd\x32\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd6\x03\
+\x10\x0a\x31\x18\xc7\xac\x62\xef\x00\x00\x00\x1d\x74\x45\x58\x74\
+\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\
+\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\
+\x6e\x00\x00\x00\x02\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\
+\x00\x39\xe4\x49\x44\x41\x54\x78\xda\xd5\xbd\xd9\xb2\x5d\xc7\xb5\
+\x9e\xf9\x65\xe6\x6c\x57\xbb\xf7\x06\x36\x00\xf6\x24\xa8\xc6\x75\
+\x8e\x1d\x61\x59\xf2\x45\xd5\x45\x5d\x54\xd1\xe1\x8b\xba\x26\x1f\
+\x81\x7a\x04\xea\x11\xc8\x47\x10\x1f\x41\x7a\x04\x31\xea\xae\xae\
+\x7c\x8e\xe3\xd4\x29\x47\x58\x16\x4d\x1c\x51\x02\x89\x6e\x77\xab\
+\x9d\x7d\xa6\x2f\x72\xcc\x5c\x73\x2d\x6c\x10\x0d\x49\x85\x0b\x0c\
+\x92\x00\x76\xb7\xd6\x98\x99\xa3\xf9\xc7\x3f\xfe\xa1\x56\xfc\xb8\
+\xbf\xdc\xe0\xf7\x2a\xfc\x9d\x02\x2c\x4a\x7e\x3f\xfc\x53\x4b\x07\
+\xc4\x18\x2a\xda\x8f\xdb\xdf\x72\x19\xfd\x26\xfe\x3c\x46\x63\x9f\
+\xf1\x13\x2c\xa0\xe4\xbb\x70\xcd\x4f\x7b\xb1\x5f\xea\x6f\x67\x08\
+\xb5\xf7\x37\x8a\x0e\x85\x1a\x18\xa2\xa2\xfd\xb4\xf9\xa4\x43\x61\
+\x30\xbf\x57\xf7\x16\x9f\x14\x40\x4e\x0c\x8c\x3e\x9b\xfc\xa6\xa1\
+\xc3\xde\x8d\xee\xc5\x68\xc0\xe1\x00\x15\xbe\x9b\xda\x33\xf9\xff\
+\xd4\x86\xf0\x2f\xdb\xc9\x5b\x77\x68\x1c\x96\x4e\x8c\xd2\x7c\x7a\
+\xf1\x49\x41\x4d\xca\x98\x88\x92\x35\x5b\x1c\x09\x19\x0a\x4b\x42\
+\x4e\x8d\x05\x52\x26\xe4\x2a\x12\xf3\x29\xf9\x09\xea\xe0\x27\xbd\
+\xbc\x21\x22\xfe\x66\xbf\xfa\x0b\x01\x1a\xb0\x68\x3a\xca\x8f\xb7\
+\xbf\xad\xb1\x54\x94\x6c\x51\xa4\x28\x1a\x36\x5c\xb2\x24\x26\xa7\
+\xe2\x8a\x0a\x03\xb4\x14\x68\x62\x72\xe6\x1c\xbb\x39\xb9\xca\xe4\
+\xad\x2a\x39\x1d\xdf\xef\xd7\xdf\xd0\x10\x6a\x70\x84\x2d\x0d\xd5\
+\xdd\xf2\xab\x4b\x2e\xa8\xe8\x68\xd8\x72\xcc\x31\x73\x1c\x0b\xce\
+\xd8\x62\xd1\x94\x14\x3c\x62\x43\x06\x14\x18\x12\x32\xb6\x6c\x29\
+\xe9\x98\x3b\xad\x22\x8c\x7c\xd7\xff\x5f\x19\xa2\x3f\x17\x16\x47\
+\xc3\xd6\x2d\x58\x73\xc6\x25\x30\x22\x22\x26\x05\x0a\x0a\x9e\x70\
+\x41\x45\xc4\x15\x0d\x25\x05\x1d\x25\x06\x47\x8c\xc2\x51\x51\x51\
+\x53\xb1\xe0\xc4\xa5\x8c\x2f\x47\x27\x11\xfa\xda\xab\xc1\xff\xac\
+\x3e\xc2\x7b\x85\x9a\x0e\x28\xdd\x8a\xfb\x6c\x38\xa3\x60\xc2\x29\
+\x33\x34\x11\x5b\x56\xac\x28\xa9\x29\x69\x38\x63\x83\xe1\x98\x31\
+\x2d\x96\x0c\x87\x01\x6a\x1a\x14\x19\x29\x77\x98\x73\xca\x09\xe3\
+\xf7\xd3\x7b\xe6\x7b\x3b\xcb\xe8\xd5\xdf\x9c\x7a\xea\x8d\xf6\xb7\
+\xbf\x43\xc9\x53\xe2\xc0\x55\xb6\x34\x1f\x17\xbf\xdd\xb2\xa1\xe4\
+\x3e\x1d\x96\x11\x63\x12\x34\x86\x2b\x36\x5c\xb1\x66\xcb\x96\x25\
+\x25\x57\x4c\x99\xd3\xf0\x98\x16\x4d\x4c\xd3\xc7\x16\x22\x66\x4c\
+\x80\x05\x6b\xd6\xcc\xbf\x9a\x31\x57\x99\x44\x21\xff\x1a\xa0\xc5\
+\x1c\x38\xd3\x1f\xe1\x44\xb8\x67\x58\xdc\x49\x36\xe0\x7f\xf5\x41\
+\x4e\x0d\x4e\x44\xcd\x85\x5b\x52\x72\xce\x43\x2e\xb0\x8c\xb8\xc1\
+\x18\x47\x83\x43\xb3\xe1\x82\x15\x1b\x4a\xb6\x54\x28\x12\x62\x34\
+\x1d\x2d\x00\xe7\x00\xc4\xa4\xa4\xc4\x18\x6e\x62\xd1\x44\x64\x9c\
+\xf0\x26\xb7\x78\x53\xc5\x98\xf0\xca\xdc\xde\xef\x86\xa1\x5b\xfd\
+\x18\x3e\x62\xdf\x24\x3e\x18\x6a\x1c\x0d\xb5\xb3\xe8\xcb\xf4\xa4\
+\xf7\xed\x0d\x06\x47\xf5\xe9\x39\xe7\x94\x3c\xe0\x4b\x22\x72\xc6\
+\x28\xd6\x2c\x68\x48\x49\xb9\xe2\x21\x17\x94\x34\x58\x2c\x73\x3a\
+\x3a\xac\x18\xb8\xa3\xa6\x45\xa1\x18\x13\x63\xd9\xb2\x92\x8f\x6b\
+\xe6\x9c\xf1\x0e\xb8\x19\xe3\x5f\xeb\xcf\x15\x86\x18\xb5\xf7\x50\
+\x86\x67\xf7\x7a\x63\x7c\xcf\x13\x31\xbc\x97\xed\x20\x2e\x94\x77\
+\xb7\x5f\xad\x51\xc4\x8c\x2f\x27\x27\x11\x8e\x0e\x43\xc9\x63\xf7\
+\x35\x8f\xd9\xf0\x98\x87\x24\xdc\xe6\x84\x96\x4b\x1a\x26\xcc\xf8\
+\x86\x25\x17\xac\xb0\x44\x24\xc4\xa4\x28\x8c\x98\x01\xa0\xa2\xa2\
+\x21\x66\x4c\x4c\x4b\xcd\x82\x88\x84\x08\x48\xb9\xcd\x1d\xde\xe1\
+\x84\x13\x72\x12\x72\x95\x60\xb0\x72\x55\x86\x79\x86\x1b\xc4\xaf\
+\x1f\x25\x6a\xa8\x70\x19\x2c\x0e\x4d\x7a\x4f\xab\x09\x6b\x77\xc1\
+\xf9\xf1\xc8\x1d\x33\x55\x31\x9b\x0f\x1e\xfd\xe1\x6b\xce\xb9\xe2\
+\x9c\x0d\x13\x40\xb1\xe0\x31\x35\xc7\x38\x9e\xf0\xdf\x68\xb1\x40\
+\x42\x8c\x4f\xa9\x33\x72\xa0\xa2\x41\x11\x61\x69\xa9\xd9\xb0\xc1\
+\x88\x07\xf2\x97\xa7\xa5\xe6\x9c\x86\x29\x2d\x1d\xc7\x1c\x01\x8e\
+\x6e\xcf\x87\xb9\xe7\x86\xd8\xe8\x87\x88\x07\x4a\x6e\xaf\xa5\xb8\
+\xbb\xf8\xaa\xc6\xa0\x68\xb9\xf1\x59\xc5\x9a\x05\x09\x25\x85\xcb\
+\x78\xcc\x3d\xee\xd3\xb2\xe1\x09\x96\x39\x8e\x2b\xb6\x6c\x99\x10\
+\x71\xce\x5f\x29\x31\x24\x68\x1c\x25\x0b\x5a\x26\x8c\xa8\xb1\x6c\
+\x28\x81\x08\x47\x4d\x45\x41\x87\x26\x23\x46\xd1\xe1\x48\x71\x40\
+\x89\xe1\x4b\x26\x9c\xf2\x3a\x11\x63\x0c\x4a\x2e\xd5\xbe\xb3\xfe\
+\x51\x9c\xa5\x93\x3c\xb1\x2f\x86\x62\x2a\xce\xdd\x37\xac\x70\x54\
+\x2c\xb9\x43\xc1\x8a\x12\x48\x48\x31\xac\x79\xc2\x0a\x45\xc1\x05\
+\x35\x39\x19\x1d\x90\x12\x51\x70\xc9\x92\x11\x96\x96\x8a\x92\x9a\
+\x0e\xcb\x1c\x83\xa6\xa5\xa4\x06\x14\x29\x96\x8e\x0e\x87\x26\xc2\
+\xe0\x80\x84\x8c\x94\x88\x8c\x9c\x2d\x19\x47\xbc\xc5\xff\xc2\x4f\
+\x39\x51\xd1\xc0\x47\xb8\xa7\x6a\x11\xf5\x43\x9e\x08\x9f\xda\xb6\
+\x74\x1f\xb7\x9f\xda\x63\xc7\x44\x55\xff\xe0\x1d\x5d\xc7\x15\xdf\
+\x72\xc1\x96\x05\x2b\x6a\x14\x31\x31\x13\x1c\xd0\x51\x61\xa9\xd8\
+\x70\x8c\xe2\x84\x23\x9e\xf0\x67\x6a\x8e\x68\xd8\xb2\x64\x43\x43\
+\x4c\xce\x88\x86\x8a\x8e\x16\x8b\x95\x24\xcc\x07\x68\x03\x34\x54\
+\xf2\xd2\x63\x3a\x1c\x2d\x25\x13\xa0\xe4\x9c\xc7\xdc\x20\xfd\x87\
+\xd1\xaf\x8c\x44\x2c\xf7\x7d\xf3\x88\xa7\x13\x94\x0e\x27\x5f\xe0\
+\xd0\x40\x4d\x71\xd1\x1c\xb7\x94\x94\x74\x94\x6e\xc9\x23\x1e\x71\
+\xc6\x86\x0a\xcb\x29\x96\x92\x92\x05\x1b\x6a\x1c\x37\x98\x32\xa1\
+\x65\xc9\x96\x88\x11\x0d\xff\x9a\x9c\xff\x8f\x7f\x21\x62\x42\xc9\
+\x5f\x68\xa8\x51\x64\x8c\xa4\xe6\xac\x68\x68\x48\xc8\xb0\x54\x74\
+\xe4\x44\x38\x22\x32\xa0\x64\x89\xc2\xe2\xe8\x98\x30\x22\x61\x4c\
+\x44\x46\xc4\x92\xc7\x8c\x7e\x19\xdd\xcd\xef\xa9\x67\x84\x4a\xf5\
+\xaa\x3e\x42\x85\xcc\xc0\xed\xfd\x4d\x7b\x77\x73\x5c\x52\xb3\x61\
+\x41\xc1\x92\x4b\x1e\xb3\xa2\x15\xff\xfc\x98\x96\x82\x35\x05\x9a\
+\x31\x63\x46\x68\x36\xac\x59\xd1\x31\x22\xe5\x94\x6f\x59\x72\x81\
+\xa6\x66\x49\x41\x81\xc3\x61\x29\xe9\xa8\x49\xd8\x62\xe9\xd0\x18\
+\x71\x93\x71\x40\x2c\x2a\x14\x8e\x1b\xf2\xd1\x0c\x43\x4b\x87\x22\
+\x27\x27\x21\xf1\xce\xf4\x9e\x1b\xbc\x61\xf5\x7d\x4e\x84\xba\xa6\
+\x7a\x54\xc1\x03\xb7\x54\x77\x2f\xbf\x7a\xcc\x9a\x8a\x2b\xce\x58\
+\xe0\xb8\x62\x41\x4b\x8c\xa2\xa4\xa0\xc0\xd2\xd0\x00\x29\x33\x66\
+\x2c\xe9\xc4\x03\x24\xa4\xe4\x38\xfe\xca\x63\x14\x8a\x15\x6b\xc9\
+\x0b\x15\x96\x9a\x96\x96\x94\x0c\x7c\x00\x26\xa1\x40\x01\x11\x29\
+\xd0\x62\xe9\xb0\x92\xbe\xa5\x80\xc6\xd2\xb1\x65\x2a\xaf\x3b\x25\
+\xa5\x71\x77\x54\x44\xf4\xc2\xb9\x65\xf4\x32\x2e\x52\x85\xff\xd6\
+\xac\xdd\x43\x2e\x39\x67\x4b\xc1\x25\x67\x6c\x18\x51\xca\x5d\xae\
+\x59\xb1\x21\x45\x33\x22\x21\x26\x42\xb1\x61\x25\x3f\xd0\x47\xff\
+\x8e\x6f\x59\xd2\xe1\x28\x59\xe2\xc8\x05\xab\xf0\x7e\x40\x03\x39\
+\xa0\x88\xc8\x18\x91\x92\xb0\xc0\x90\x12\x53\xb1\xa1\xc5\x52\xd3\
+\xa1\x70\x24\xc4\x40\x4b\xcd\x16\x45\xc1\x15\x57\x5c\x72\x83\xad\
+\x9b\x32\x23\x57\x26\xa4\xdd\xdf\xdb\x10\xee\xe0\x4f\x1d\x4b\xf7\
+\x90\xaf\xd8\x52\x52\xb3\xe6\x92\x15\x0d\x1b\x6a\x1a\x1a\xc9\x03\
+\x0d\xa7\x28\x62\x46\xc4\x94\x5c\xb0\x22\xc6\x04\xef\x5d\xd3\xb0\
+\x25\x66\xcc\x86\x46\x70\x06\x45\x43\x85\x21\x26\xc6\xa0\x59\x89\
+\xd9\xb7\x8c\x88\xe9\xe8\xd8\xd2\x90\xd1\x52\xe1\xe4\xcd\xbb\x41\
+\x4d\x33\x25\x92\xef\xdc\xd0\x70\xc9\x82\x37\x78\x8f\xd3\xdf\xe5\
+\x1f\x99\x6b\x11\xac\x97\x34\x84\x1b\xfc\xd7\x07\xca\x8e\xb5\x7b\
+\xc8\x7d\x2e\xe4\x47\xae\x59\x51\x60\xb9\xa0\x91\x80\x38\x62\x44\
+\xca\x2d\x2a\x1a\xf1\xf0\x15\x25\x11\x84\x97\xad\x31\x01\x6c\xcb\
+\xc8\x50\x38\x52\xa0\xc3\x11\xcb\x19\x8a\x50\x72\x99\x5a\xc9\x1a\
+\x7c\x44\x89\x80\x8c\x29\x5b\x79\x28\x2d\x56\xaa\x92\xfe\x12\x58\
+\x36\xb4\x8c\x69\x31\xc4\x1f\x45\xa8\x83\x2a\xe8\x15\x0c\xe1\x06\
+\xa6\xd0\x92\x39\x6c\x2e\x1e\xf1\x0d\x17\x74\x14\x6c\x28\xd9\xb0\
+\xa1\xa0\xa5\xc4\x61\x18\x71\xcc\x9c\x1c\x43\x22\x61\xb2\xa4\xa6\
+\x25\xa1\x23\x26\x23\x0e\x60\x9d\xa6\xc0\x91\x60\x80\x8e\x4e\xae\
+\x81\xcf\x12\x22\x34\xb7\x48\x81\x15\x2b\x5a\x34\x8a\x86\x9a\x82\
+\x98\x04\x85\xa6\xa6\xa1\x93\xbc\xc2\x31\x26\x61\x2b\x3e\x25\xc3\
+\x51\xb2\xe5\x26\xed\xc0\xaf\x7d\xef\xf0\xe9\xc2\xbf\x4a\xfe\x5f\
+\x1c\x9f\x71\x41\x85\xa5\xe0\x52\x60\x12\xff\xec\x0d\x23\x6e\x71\
+\x9b\x9c\x92\x15\x1d\x0d\x2d\x25\x6b\x1a\x22\x52\x14\x63\x4e\x48\
+\xa8\x59\x53\xd2\x62\x68\x80\x8c\x9a\x12\xc5\x98\x92\x98\x44\x0a\
+\x37\x30\x6c\x49\x18\x01\x8e\x06\x85\xa1\xc6\x60\x88\x89\xe8\xa8\
+\x58\x33\xa1\xa1\xa2\x65\x43\x47\x4d\x4a\x07\x82\x58\x75\x34\x54\
+\x7c\x49\xc4\x29\x53\xa7\xd5\xee\xb4\xbc\x72\xd4\xd8\x41\xe5\xfe\
+\xd0\x6d\xef\x5e\x7e\xf5\x84\x82\x48\xea\x8a\x8a\x85\xd4\x80\x2d\
+\x0d\xb7\x78\x93\x63\x34\x4b\xce\x58\x70\x8b\x86\x92\x12\xc8\x99\
+\x30\x66\xc6\x88\x31\xb0\x41\x13\xd3\xb1\x06\x1a\x1a\x34\x39\xe0\
+\x88\x50\x18\x22\xa9\x5e\x5b\x14\x5b\x4a\x5a\x2a\x2a\x09\xdd\xb7\
+\xd8\xe0\xc8\x58\xb1\x25\x65\x83\x96\x1c\x53\x71\xc5\x86\x39\x9a\
+\x44\xa2\x86\x22\x42\x73\xc1\x3d\x32\x22\x37\x57\xec\x5d\x8d\xeb\
+\x60\x84\xe8\xc5\xa2\x85\x37\x48\xc3\xfa\xab\x73\x9e\x70\xc9\x9a\
+\x86\x42\x52\xe1\x1a\x87\x21\xe7\x16\xb7\xb8\x85\x62\x2d\x29\x8e\
+\xcf\x04\x63\x62\xc6\x9c\x70\xc4\x29\x19\x09\x0d\x4b\xb4\x9c\x06\
+\x0d\x54\x38\x49\xd5\x54\x00\x63\x41\xa1\x71\x28\x32\x34\x19\x05\
+\x15\x2d\x73\x22\x0c\x15\x11\x31\x31\xd0\x61\xe9\x68\xd1\x82\x50\
+\x74\x38\x6a\x89\x38\xb1\xc0\xbd\x4b\x2e\x39\x11\x2c\xfc\x7b\x45\
+\x0d\x35\xb8\x1a\x96\xea\xd3\x35\x2b\x96\x5c\xb1\xa6\xa1\xa3\x0e\
+\xb9\x7f\x4a\xc2\x0d\xa6\xf2\x2c\xbd\x63\xad\x25\xce\x27\xdc\xe0\
+\x35\x8e\x99\x13\x11\x51\x4b\x47\xa3\x22\x95\x3a\xa3\xa3\xa5\x93\
+\xd4\xbb\xa3\x13\x5c\xa3\xa3\x20\x65\xca\x98\x94\x44\x12\xa6\x8c\
+\x84\x05\x8e\x91\x9c\x4f\x25\x91\x43\x91\x32\x66\x85\xa5\xa5\xc0\
+\xd2\x92\x12\x49\x0d\x73\xc6\x9c\xd4\x45\x2a\xf9\xbe\x51\x43\x0d\
+\xf0\x06\xdf\x7e\x89\x80\x92\x92\x88\x9a\x1a\x48\xc9\xc8\x89\x49\
+\xa9\xa9\xe4\x2b\x36\x5c\x91\x63\x48\x49\x98\x72\x93\x1b\x1c\x61\
+\x30\x18\x14\x53\x20\xa3\x61\x43\x4a\x4c\x41\x45\x43\x4d\x87\x91\
+\x53\xd6\xd2\x61\xb1\x68\x1a\x5a\xa9\x42\x33\x14\x1b\x34\x19\x15\
+\x0d\x19\x8e\x82\x58\xaa\xd5\x92\x4e\xea\x93\x86\x5a\x6a\x9d\x96\
+\x18\x83\xe3\x82\x87\x8c\x48\x88\xdc\x4c\x99\x57\x2f\xba\xdc\x41\
+\x87\xaa\xa1\xa4\x09\x5d\x84\x86\x82\x0a\x18\x33\x25\xc2\x31\x01\
+\x1a\x36\x54\x94\x6c\xa8\xc9\x49\x98\x73\xc4\x11\x27\x1c\x33\xa6\
+\x22\x12\x18\x25\xa7\xa6\xe3\x31\x63\x72\xc1\x28\x15\x35\x11\x25\
+\x6d\xf8\xfe\x8a\x31\x8a\x08\x47\x85\x0d\x7e\x43\x03\x1d\x86\x54\
+\x4a\x39\x0f\xf0\x57\xb4\x94\x8c\x70\xe1\xba\xb4\x18\x36\x54\x28\
+\x72\x52\x62\x52\xa2\xdf\x4d\x3f\x7a\xc5\x5a\xc3\xed\xfd\xde\xd1\
+\x7c\xbc\xe6\x9c\x4b\x96\x14\xb4\x68\x29\xa5\x52\x26\x4c\x71\xd2\
+\x7e\x71\x6c\x79\x4c\x4d\xca\x11\x13\x66\xdc\xe1\x94\x19\x53\x46\
+\x24\x18\x01\x54\x1c\x09\xad\x3c\xf1\x92\x15\x0b\x96\xac\xa9\x28\
+\x71\x74\x40\x14\x20\x3a\x1f\x23\x1c\x25\x96\x96\x88\x0d\x31\x8e\
+\x92\x08\x43\x22\xd7\x28\x17\x8f\xe3\x42\x81\xee\x30\x68\xe9\xa3\
+\xb5\x6c\xb8\x60\xc4\x09\xb3\x0f\x27\xdf\x99\x68\x47\xcf\xf3\x0f\
+\x48\x29\x64\x59\xfc\xf6\x8c\x33\x96\x14\x6c\xd8\xd2\x51\x63\x18\
+\x33\x66\xce\x98\x06\xcb\x43\x60\xcb\x25\x15\x19\x47\x4c\x38\xe5\
+\x88\x9b\x1c\xf9\xa3\x89\x26\x0b\xd8\x76\x2c\x00\x7d\x47\x4b\xc1\
+\x8a\x25\x6b\x1a\xbe\xa5\xa5\xa1\xa6\xa6\xa0\xa0\xa2\x42\x49\x38\
+\xf4\x10\x6d\xcb\x8a\x12\xcd\x86\x98\x29\x09\x0d\x2d\x5b\x52\x0c\
+\xbe\x01\xe8\xaf\xad\xc1\x4a\x44\xf3\x0e\x73\xcb\x25\x19\x0b\x4e\
+\xbf\x8f\xb3\xec\x9b\x69\xde\x79\x5d\x72\xc9\x06\x2b\xdf\xbe\x22\
+\x25\x21\x66\xca\x84\x14\x03\xfc\x99\x0d\x6b\x34\xa7\xbc\xc1\x14\
+\xcb\xeb\x62\xa4\x48\x7a\xdc\xb9\x54\x11\x4a\x92\x70\x1f\x8d\x26\
+\x4c\x98\x0b\x1c\xe7\x6b\xcb\x82\x2b\x2e\xd9\xd2\xa0\x31\x74\x58\
+\x0c\x13\x46\x5c\xd0\xd1\xa1\xa9\x70\x38\x12\x14\x5b\x6a\x3a\x12\
+\xc0\xa0\xb1\x68\x29\xbf\xac\xb8\x50\x5f\x9a\xd5\x18\x2e\x58\x7f\
+\xbf\xa8\xe1\xb0\x18\x0c\x57\xee\x1b\x16\x58\x12\xd6\x3c\xe2\x9c\
+\x0a\x85\x62\xc6\x31\x29\x1b\x1e\x70\xce\x9a\x4b\x20\xe1\x98\xdb\
+\xdc\xe6\x98\x84\x23\x66\xcc\x88\x68\xb1\x44\xc4\x12\xe3\xfb\x80\
+\xec\xdf\xa2\xc2\x90\x4b\x1a\x95\x53\x51\xd0\x60\xa9\x29\x28\xb9\
+\x92\xe4\xbc\x93\x40\x1b\xf1\x3a\x35\x25\x9a\x92\x4b\x72\x14\x11\
+\x31\x06\x43\x42\x84\x61\x2d\x10\x4e\x43\x23\xc5\x79\x42\x47\x4d\
+\x4e\xc9\x7d\x72\x5e\x77\x73\xa5\xf6\x4a\xc7\x97\x0a\x9f\x1a\x47\
+\xc5\x15\x0f\xd8\xd2\x50\xb2\xe6\x9c\x2b\x22\x66\xdc\xa6\xe4\x5b\
+\x2a\x4a\x2a\x4a\x1a\x0c\x09\x13\x6e\x72\x9b\x53\x8e\x48\xc9\x48\
+\x42\xd3\x57\x4b\x5e\xe0\x06\x08\xb2\x1e\x70\x1a\x14\x9a\x13\x6a\
+\x2a\x81\x5a\x4a\xc1\xac\x4a\x0a\x4a\x5a\x3a\x1c\x09\x5b\xb6\x24\
+\x18\x22\x20\x26\x11\x88\xd6\x10\x91\x62\xa4\x5b\xde\x49\x6e\xea\
+\x41\xc4\x1e\xff\x7e\x42\xca\x3b\x70\x31\x3b\x51\x07\xdd\x96\x17\
+\x30\x84\x95\x63\xdc\xb2\x76\x4f\xf8\x36\x40\x64\x35\x96\x9c\x9b\
+\x64\xac\xb9\x60\x25\x57\x48\x91\x33\xe5\x36\x6f\xf2\x1a\x37\x98\
+\x08\x9a\xe0\x3f\xa2\x31\x21\x37\xdd\xfd\xab\xa5\x14\x52\x68\x2c\
+\x0e\x45\x44\x22\x65\x5d\x43\xc3\x11\x96\x9a\x2d\x5b\xd6\x14\x12\
+\xa8\x63\x0a\x22\x12\x3a\x14\xa9\x64\x31\x8a\x58\x8a\xfb\xde\x9b\
+\xb5\x74\xb4\x6c\x71\x74\x8c\x04\x1b\x1d\x71\xc1\xcd\xe3\xe9\x33\
+\x0b\xf2\xe7\xe6\x11\x96\xfa\xe3\xad\x60\xc7\x0d\x5b\x5a\x12\x66\
+\x4c\xc9\xb9\x60\x8b\x66\x24\x21\xad\x25\xe7\x26\x6f\x73\x87\x63\
+\xc6\xe4\x24\xb4\x62\x79\x1f\x2d\x76\x67\x4c\x1d\x9c\xb8\xde\x60\
+\xde\xe7\xf7\x6d\x01\x45\x8e\xa3\x63\xcc\x96\x94\x35\x55\xc0\x20\
+\x0c\xb1\x74\x40\x8d\x54\x25\xbe\xfb\x11\x0b\x6e\xdd\x52\xd1\xd2\
+\x52\x48\xd7\x5d\x33\xe6\x84\xdb\x9c\x32\xfe\xcc\xbc\x8a\x8f\xd0\
+\xf2\x8d\xca\xdf\x96\xc0\x84\x35\x57\x2c\x68\x18\xe1\xd0\x2c\x79\
+\x82\x22\x11\x1f\x60\x88\x78\x9b\x9b\xbc\xce\x31\xa9\x27\x7e\xd0\
+\x02\x9a\x98\x48\x5e\xa8\x0a\xff\xf4\x26\xde\xb1\x5d\xf4\xa0\xa8\
+\x73\x52\x76\x39\x34\x5a\xcc\x18\x53\xb1\xa4\x91\xaa\x24\x93\x0b\
+\xa9\x89\x04\xcc\xdd\x99\xcf\x49\xf5\xd1\xe7\x14\x8a\x35\x09\x27\
+\xfc\x8c\x37\x3f\x9b\xfe\x86\xd0\xf6\x79\x69\x67\xd9\x7d\x5c\x52\
+\x48\x82\xe2\xf1\x80\x11\x0d\x1b\x56\x82\x30\x54\x94\x68\x66\xcc\
+\xb8\xcb\x8c\x39\x39\x0a\x47\x4d\x23\x2f\x49\x63\xa4\x80\xd7\x03\
+\x3c\xa2\x0f\xcb\xc3\xee\x53\xff\x46\xfa\x7c\xa0\x09\x9e\x45\x11\
+\xd3\x08\x16\xb5\xa1\x95\xcc\x76\x41\x24\xa7\xa1\x4f\xcd\x3b\x81\
+\xed\x1a\x71\xf2\x2d\x8d\x3c\x14\x4d\x46\xf2\x1b\x7f\x5e\xa2\x6b\
+\x4d\xf1\x7c\x60\xe6\x6e\xc3\x92\x73\x16\x9c\xe3\x18\x31\xc2\x52\
+\x52\xb0\x05\x6a\x2a\x4a\x2c\xc7\xbc\xc9\xdb\xbc\x49\x42\x86\x91\
+\x00\xe6\xdf\x9a\xde\x33\x02\x03\x5a\x87\x3b\x00\x82\xa1\x93\x0b\
+\xd4\x17\x5d\xf1\x80\x1e\xa4\xa5\xab\x31\x62\x49\x23\x78\x83\x0e\
+\xde\xa5\x95\xb3\xd3\x49\x20\x75\x18\x2c\x8e\x8a\x12\xe5\x5b\x8d\
+\x3c\xe0\x3d\x77\xa4\xcc\x20\x6e\xbd\x64\xd4\x50\xf7\x5a\x7c\x46\
+\x79\xce\x94\x39\x39\x2b\x36\xac\xa9\x49\xa8\xa9\x68\xc8\xb9\xc5\
+\x4f\x79\x8f\x4c\xb2\x84\xfe\xc6\xab\x70\x7b\xad\xfc\xee\x90\x50\
+\xb6\x9f\xf2\xba\x80\x2d\x1a\x79\xb2\xfd\xdf\xfa\x0e\xc5\x48\xfa\
+\x5d\x05\x56\x80\x7c\x8f\x4f\x35\xf2\x3d\xbc\xe1\x7c\x46\xd1\x5f\
+\x4e\x7f\xb1\x1a\x1e\x73\x8f\xbf\x23\xff\x78\xfc\xf9\xb3\xe0\xdc\
+\xef\xe8\x74\xf9\x4f\xae\xb9\xef\xfe\x89\x2f\x29\x78\xc4\x09\xc7\
+\x38\xce\x78\xc2\x96\x8e\x52\x90\xe5\xd7\xf9\x37\xbc\xcf\x8c\x34\
+\xf8\x00\x7f\xe8\xe3\x90\xf3\x31\xb8\x14\x4a\x7c\x82\x12\x1c\xba\
+\x6f\xdf\x80\x19\x38\xe8\xbe\xf0\xea\x42\x42\x67\xa5\xe4\x2f\xd8\
+\x4a\xc5\xb3\x11\xc4\xbb\xa1\xa4\x12\xa6\x95\x93\xf0\xdb\x08\x7e\
+\xf5\x10\xcb\xeb\xb4\x74\xbc\xcb\x7f\xe4\xdf\x73\xaa\x90\xcc\xf3\
+\x25\x33\xcb\x21\x60\xab\x68\x58\xd3\xb2\xa5\x45\x61\x98\x60\x88\
+\x19\xf3\x0e\x77\x98\x92\x0d\x0e\x72\x4f\xd8\xd0\x72\xf3\x19\xb8\
+\xc9\xde\x0c\x43\x0e\xc3\x21\x1d\x6c\x98\x5f\xf4\x57\xcc\xca\x53\
+\xb7\x58\x69\x09\xfb\xfb\x5e\x0b\x24\xac\xa9\x71\x12\xf2\x7d\x2d\
+\xe2\x48\x29\x39\xa7\x24\xa6\xe5\x09\xf7\xf8\x19\x37\x9f\x09\xef\
+\xbf\x40\x5f\xa3\x7f\xca\x31\x1d\x5b\x5a\x29\x71\x3d\xe9\x6f\x3c\
+\x88\x14\x51\x78\x3b\x7a\xf0\x76\x77\x7d\x72\x73\x60\x90\x3e\x70\
+\xda\x70\x86\x76\x89\x8e\x0a\x6f\x5d\x85\x33\xe4\xb3\x0e\x8d\x26\
+\x16\x28\xbf\xa3\x21\x11\x40\xb7\xe6\x52\x7e\x72\x84\x21\x07\x1a\
+\x8e\x58\x71\x25\xc8\x47\xc5\x57\x9c\xf1\x36\xf1\xab\x60\x96\x7d\
+\xc1\x93\x90\x48\x09\xdd\x81\xa0\xce\x8a\x15\x09\x23\x4e\x38\x22\
+\x0d\xb4\x8c\x9d\x29\xf4\x81\xd5\xd5\x9e\x11\xd8\x0b\x79\x56\x6e\
+\xf5\xfe\x67\x0f\x19\x37\x7d\x62\xe6\x82\x89\x7d\x4f\x34\xa2\x95\
+\xd8\x14\xb1\x91\xd8\xa1\x89\x84\x56\x60\x98\x30\xc1\x62\xc9\x18\
+\xd1\xd2\xd2\x3d\xf3\x0d\x47\xcf\x6f\xe9\x18\x61\x2c\xf4\x81\xac\
+\x27\xf5\xf9\xca\xe2\x88\x31\x69\xe8\x88\x0e\x9f\xe9\xae\x05\xa0\
+\x0f\x28\x86\x87\x94\x82\x3e\x03\x75\x83\x7c\x43\x4b\xb7\xb5\xaf\
+\x78\x6c\xc8\x3c\x34\x31\x56\x12\xa8\xfe\xc4\x59\x20\x97\xae\x4a\
+\x6f\xaa\x9c\x8e\x11\xb7\x39\x63\xc1\x8c\x9b\x1c\x93\x85\xcb\xf3\
+\x74\xdc\x78\x01\x84\x4a\xcb\x97\x76\x18\x22\xb1\xbf\xff\x41\x19\
+\x53\xa6\xa4\x20\x8c\xb7\xdd\xdb\xfa\x6e\x66\xb4\x1b\x98\xf9\x59\
+\x6d\x5a\xff\xfc\x87\x0c\x6c\x2d\xdc\x19\x9f\xb2\xfb\x9a\xb6\xbf\
+\x62\x16\x18\xd3\x50\xd2\x06\xbf\x34\xa7\x64\x4e\x4a\xc9\x19\x96\
+\x39\x6f\x09\x41\xf1\x15\xf1\x08\x27\x00\x47\x2d\x66\xf0\x07\xd9\
+\x60\x88\xc8\x98\x30\x22\x96\x00\xe9\x5f\xaa\x93\xec\x61\x68\x8e\
+\xa1\x83\xd4\x07\x3c\x26\x35\x68\x2e\xab\x3d\x6a\x8f\x0b\x27\x03\
+\x81\x8f\x11\xc2\xb2\x22\x96\xb3\xd1\xc9\x75\x00\x25\x3c\xba\x3a\
+\x5c\xcc\x88\x88\x39\x9a\x05\x4f\xe8\x24\x2b\x1e\x46\xaf\x97\x8e\
+\x1a\xde\x0c\x95\xf8\x09\x27\x04\x1f\x43\x4c\xce\x84\x09\x29\x4e\
+\x3a\x57\xfd\x5b\xe8\xa9\x3d\x7a\x60\x06\x2d\x4f\x4f\xed\x71\x59\
+\xf4\xe0\x59\x5f\x47\xe5\xd8\x77\xad\x8e\x88\x2e\x54\x16\x7d\x55\
+\xdb\x9f\x94\x4a\xc0\x98\xfe\xf0\x37\x28\x46\xe4\xdc\xe2\x8c\x15\
+\x2d\xe7\x14\xc1\xb0\xaf\xe4\x23\x34\x09\x39\x39\x8d\x54\x0d\x11\
+\x9a\x84\x98\x9c\x37\xb8\x81\xc1\x92\xa2\xa9\x49\x06\x1d\xf3\x9d\
+\xb3\x53\x21\x54\xea\x01\xbd\x60\xc7\x6b\xda\xfd\x33\xf4\x26\xfe\
+\xab\x5a\xc9\x23\x08\xd9\x86\x96\xef\xea\xe1\xb9\xfe\x6d\x45\x02\
+\xdf\x44\x74\x81\x7a\xe6\xb0\x82\x6c\xbe\x86\xe2\x1e\x8f\x51\x94\
+\xb4\x1f\xa4\x5f\x74\xa1\x5c\x7b\xc9\xbe\x86\xa5\x11\x04\x29\x66\
+\x84\xa2\xc5\x11\x11\x0b\xd0\x1e\x85\xb2\xc8\x3d\x15\x1f\x86\x66\
+\xe1\xa9\xa2\xeb\xba\x4b\xe0\xf6\x3a\x6c\x87\x83\x0d\x6e\xef\xcf\
+\x26\x50\x09\xd8\xfb\x73\xef\x33\x1a\x34\x2d\x63\x32\x2c\x05\x8a\
+\x98\x96\xf6\x0f\x4e\xbd\xa2\xb3\x74\x58\x6a\x6a\x4a\x22\xc6\xe4\
+\xd2\x7f\x82\x88\x91\x74\xad\xd5\x20\xee\xef\x07\x3f\x75\x60\x98\
+\x7d\x33\xec\xa2\x8b\xba\xa6\x02\x3d\x74\xb1\xea\x20\xf5\xea\x83\
+\x28\x21\xec\x1a\xb9\xba\x5d\x30\x65\x4d\x2b\x4c\xef\x4a\x1a\xcc\
+\x0d\x36\x44\x38\xf5\x72\x3e\xc2\x09\x40\x6e\x31\x64\x4c\xb0\x94\
+\xf2\xe3\x23\x71\x8e\x96\x76\x2f\xe2\xab\x80\x4c\xee\x67\x92\x4f\
+\x67\x11\xbb\xe6\xf2\xf0\x49\x0e\xa3\xca\xae\xed\xf8\x34\xb3\xd3\
+\x60\x31\x82\x59\x7b\xaa\xa1\x23\x11\x9e\x96\xa6\x23\x92\x14\xdc\
+\xa2\x89\x89\x49\x25\x0e\xbd\x32\x3f\xa2\x47\x8f\x8e\x38\x66\x46\
+\xcb\x46\xf2\xb7\x68\x8f\x71\xab\x0f\x12\xec\xc3\x74\xfa\xe9\xf4\
+\xf9\xba\xc2\x4b\x85\xb9\x9c\xde\x99\x76\xe1\x9a\xa8\x6b\xd2\x70\
+\x27\xa0\xad\xa1\x45\x13\x85\x41\x98\x36\x60\xd9\x3d\x2e\x12\xc9\
+\xe9\xed\xd3\x3e\xfd\xf2\x86\xf0\x00\x6b\x47\x4e\x82\xa1\xa2\x96\
+\xaa\x2e\x92\x26\xec\x0e\xdb\x3c\xac\x13\xfa\x68\xc1\x41\x03\xf6\
+\xba\x68\xee\x0e\x48\xc2\x87\x79\x86\x1a\x64\xaf\x87\x59\x8e\x7f\
+\x1d\xad\x64\x98\x0c\x2e\x97\x12\xd2\x4a\xcc\x88\x9a\x86\xfa\x99\
+\xd4\xd3\x17\x32\x44\xcc\x18\x43\x1c\x30\x4b\x27\x00\xaa\x0b\xd4\
+\x73\x06\xfc\xaa\xdd\x91\x1f\xba\x4a\x37\xf8\xa8\x3b\xe0\x46\xbb\
+\xa7\x38\x9b\xbb\xb3\xa1\xf6\xd0\xad\x5d\x72\xd5\x0d\x4c\x61\x88\
+\x24\xae\xf4\xf1\xc0\x05\x3c\x14\x39\x11\x39\x25\x1b\xd6\x34\xa4\
+\xd7\x9a\x42\xbf\x88\x21\x22\x12\x72\xb2\x10\xa5\x3d\x0f\xd2\x06\
+\xb0\xcd\xc9\x8b\x50\x7b\x6f\xfa\xb0\xbe\xd8\xb5\x93\xdd\x35\xc3\
+\x47\x6e\x10\xf8\x5e\x84\xda\xa6\x0e\x9c\xa8\x1e\x94\x7b\xc3\xbc\
+\xc5\xd2\xd1\x08\xbe\xbd\x66\x43\xf3\x01\x2f\x8b\x50\x59\xf9\x66\
+\x11\x63\x26\x6c\x89\x85\x1a\x94\x61\xc8\xc9\xc9\x48\x42\xc6\xa7\
+\xc2\xad\x1b\xbe\xf1\xc3\xcc\x80\x01\x5b\x46\xc9\xed\x77\x52\x4e\
+\x69\x6a\x31\x96\x1e\x9c\x10\x04\x01\xdf\x75\x43\xfa\xf6\x90\x95\
+\x9c\xa1\xa5\x95\xd7\x35\x24\xb0\x3b\x69\x34\x3b\xc9\x83\x23\x62\
+\xe6\x38\xd6\x54\x7f\x98\xa8\x57\xa2\x17\x7a\x32\x4e\x42\x41\x23\
+\x00\x98\x96\xbe\xb6\x13\x94\x48\xbd\xf0\xac\x8c\x3b\xf0\x08\x2e\
+\x14\x52\xee\x9a\xab\x72\xf8\xa7\x1e\xac\x77\x21\xc7\xf0\x81\xbd\
+\x0e\xfd\x8b\xdd\xd5\xda\x65\x90\x56\x00\x1e\x2b\xae\xb3\x09\x90\
+\xe0\x4b\x1a\x42\x13\x5f\x66\xc7\x09\x4a\x9c\xa4\x15\x42\xb1\x11\
+\x0c\xc9\xed\x11\x3b\xae\x4b\x8f\x87\x6f\x69\x3f\x3f\x19\x5e\x14\
+\xb7\x67\x9e\x43\x43\x38\x71\x96\x36\x54\x16\x86\x8e\x8e\x5a\x5a\
+\xd1\x5a\x20\xba\x9d\xd7\x70\x72\xea\x5a\xaa\x60\x8a\x56\x98\x57\
+\xd7\x3d\x3a\xfd\xdd\x4f\xd0\x01\xd1\x47\x89\xdc\xb5\x96\x46\x0a\
+\x2e\x35\x78\x36\xfb\x07\xdf\x1d\x20\x52\xd7\x99\xc1\xed\x99\xc0\
+\x0e\x00\x3b\x2b\x7f\xe3\xa4\x1e\xd9\x37\x95\x0b\xe0\x1d\x82\x88\
+\x3a\x5a\x5a\xc1\x26\x5c\x38\x2b\x2a\xb4\x8f\x9d\x34\x96\x5b\xb9\
+\x4c\xdd\x33\xc9\xa7\x2f\xc0\x8f\xd0\x5f\x68\x2c\x15\x48\xac\xde\
+\xa5\x39\x1c\x60\x58\xea\xa9\x13\xa5\x9e\x82\x67\x0e\xcd\xe2\x0e\
+\x80\xfd\xe1\xef\xd5\x33\xda\x42\x04\x3a\xba\x11\x6c\x42\x07\xcf\
+\x42\xc0\xcc\x3b\xb4\xf4\x48\x9c\x34\xa1\xf4\x5e\xd7\xed\x15\x08\
+\xa7\x96\x86\x92\x48\xea\xff\x58\x52\x29\xbd\x97\x33\xee\xa7\xad\
+\xea\x19\x66\xd8\x9f\xad\xea\x61\x3a\x75\x70\x1d\xd8\xab\x36\x86\
+\x95\xcb\xae\x9d\xe3\x24\x9b\xcc\xa5\xdf\x89\x10\x0d\xf5\xe0\xea\
+\xf5\xb5\xb3\x91\xb7\xaf\xbf\x83\x97\xfd\x42\xe0\x6d\x27\xd8\x4f\
+\x0b\xc2\x80\x8f\x9e\x42\x1d\x9e\x9e\xa1\x52\xd7\xfc\x59\xed\xa5\
+\xd6\x7d\x6c\xb2\x52\x4a\xbb\x41\x0e\xa1\xf6\xfa\x60\x9e\xff\xa0\
+\x03\x7c\x67\xe5\x6d\xfb\x8e\x67\x89\xa5\x19\x44\xb0\x5d\x33\xc0\
+\x8a\x89\x7a\x44\xbd\x27\x25\xbd\xa2\x21\x7a\x27\xd5\x84\xe7\x12\
+\x89\x85\xf5\x53\x9e\xe0\xe9\xa2\x8a\xa7\x4e\x89\xdb\xcb\x00\x86\
+\x39\x81\xdb\x23\xa8\xec\x17\x6d\x36\x54\xa8\x7d\x8f\xb3\xef\x7c\
+\x6a\x2c\xed\x00\x96\x55\x03\xe7\xb7\xc3\x50\x23\x39\x1f\xf6\x65\
+\x33\x4b\x1b\x92\x14\x4b\xc3\x48\x6a\xce\x58\x7c\x71\x2c\x63\x47\
+\x5d\xc8\x37\xfc\x8b\xea\x68\x65\xd6\x8a\x81\x2f\x51\x32\xdf\xed\
+\xf9\x8f\x56\x2e\x96\x0d\x1f\x69\xa8\xa9\x42\xfe\x21\x4e\x5a\x7a\
+\x97\x4a\xee\x7f\x47\x23\x90\xa0\x05\x19\x93\xf6\xf0\x40\x42\x4b\
+\x23\x8e\x3c\x06\x69\x15\x23\x7c\x3d\x23\x8c\xfe\x29\x2d\x15\x6b\
+\x21\xa8\xbc\x34\x9c\xef\xe8\xee\xfa\x16\x4a\x27\x2d\x5d\x3d\x80\
+\xdc\x87\x35\x6a\x86\x13\x9a\xb8\x91\x82\x57\x87\xca\xd0\xec\xc1\
+\x76\xfe\x2c\xb5\xa1\xe5\xdb\x33\x6a\x86\x10\xcd\x2e\x67\xd0\xf2\
+\xff\x48\x60\x39\x23\x28\x59\x29\x83\xb6\xbe\xac\x8a\x83\x63\x74\
+\x12\x23\x08\xdf\xad\x67\x62\x9b\x80\xbf\xaa\x97\xcd\x23\x1c\x96\
+\xf6\x77\x95\xb4\xe1\x3d\x21\xa3\x0b\x17\x64\x97\x52\xfb\xe3\xd6\
+\xca\x33\x89\xe8\x84\x14\xe0\x06\x35\x43\x2c\x2f\xc7\x0e\xfc\x87\
+\x09\xc7\x37\x92\xd6\x9d\x0d\x9f\x5f\x87\xf8\xa1\xa4\x73\xa6\x06\
+\x6e\xd6\x9b\x3c\x09\x0d\x67\x2d\x6f\xbd\x1b\xc4\x1d\x1b\xfc\x89\
+\x11\xfc\x3a\x7a\xf5\x32\xdc\xe1\x7e\xe9\x6f\x67\x4a\x4c\x24\xbd\
+\x81\xec\xe0\x9b\x3a\x2c\x6b\x10\xdf\xd1\x48\x73\x58\x87\x52\x59\
+\x63\x48\x50\xd2\x1a\xea\xf1\x84\xde\x23\x34\x92\x58\x77\x83\x48\
+\xaf\x42\xbe\xb8\xff\x7b\x27\xcc\x28\x2d\x20\x0c\xf4\x3a\x24\x5a\
+\x4a\x70\x27\xa7\xb5\x16\x23\x28\x31\x42\x43\x3e\x98\xfe\x7b\x89\
+\xab\xe1\x06\x18\x63\xc2\x58\x80\x8d\x8a\x56\xa6\xfb\x4d\xf8\x11\
+\x4a\xe0\x90\x84\x14\x2d\x94\x41\x3f\xd4\xac\x85\x11\x97\x91\x50\
+\x91\x30\x62\x2c\x06\x88\x04\x69\xd6\x74\x94\x01\x05\xb7\x83\xe8\
+\x61\x07\xa9\xb4\x15\xb2\x80\x91\xb3\x86\xd0\xd4\x7d\xc7\x2b\x0e\
+\x4d\x67\xa4\x27\xee\x06\x73\x3e\x04\x94\xdb\x8f\x3e\xb8\x97\x47\
+\xa8\x76\x9f\x94\xc9\x45\xf0\xe0\x57\x4a\x4e\x26\x13\x17\x36\x70\
+\xe2\x33\xe1\xc1\x9e\xf1\x90\x2b\xc1\xb1\x7a\xb7\x97\x92\xf2\x90\
+\x11\x73\x66\x44\x92\xa6\xcf\x88\x99\x32\x16\x27\xaa\x07\x59\x9f\
+\xdb\x8b\x19\xfb\x25\x7b\x2b\x97\xae\x93\x39\xd0\x46\x1e\x94\xa1\
+\x0c\xaf\xb7\xa3\x91\xec\x62\xe7\xaa\x7d\xf8\x4d\xbe\x0f\x42\x85\
+\xf4\x35\x5b\x71\x5d\x09\x53\xa6\x8c\x30\x02\xec\x23\x2e\x71\x8d\
+\xa3\xe4\x82\x6f\x79\x42\x25\x2d\x7c\x3f\x01\xe8\x69\x5e\x6b\x12\
+\xc6\x8c\x85\xd5\x92\x73\x87\x9c\xdb\xdc\xc4\x50\xa1\x19\xc9\x74\
+\xe7\x21\xb6\xb9\x03\x64\x94\x70\x7d\x15\x9a\xad\x0c\xcb\xf8\x41\
+\x05\x3f\xf5\xd3\x08\xc8\xbf\x33\x87\x0d\xd7\xc4\xb3\x26\x22\x61\
+\x7c\x5e\x97\xa9\x3e\xc7\x59\x0e\x59\x6f\x9d\x1c\xe6\x8c\x31\xb9\
+\xb8\x2e\x1b\xfa\x97\x8a\x7b\x14\x5c\xf0\x80\x73\x6a\x91\xc5\xf0\
+\xdc\x99\xad\x30\xac\x33\x1a\x61\x36\x39\x12\xc6\x28\x46\xe2\xea\
+\xae\xe8\x98\x30\x93\x2e\x6b\x2a\xa0\xb0\x1d\xe4\x95\x08\x3b\x6e\
+\x29\xfd\x95\x25\x0f\x78\x80\xc2\xb2\x65\x0b\x8c\x19\x71\x84\x21\
+\x13\x98\x06\x14\xd5\x20\x87\xf0\x45\x5a\x14\x62\xde\x77\x46\x0d\
+\x7b\x00\x91\x3a\xc9\xd9\x7b\xbe\x41\x24\x93\x38\x53\x32\x0c\x11\
+\x0d\x2d\x39\x9a\x9a\x98\x96\x3f\x73\x9f\x0b\x2e\xa8\x88\x39\xe6\
+\x84\x09\xb0\xa5\xa1\xe1\xb1\xd0\x4a\x52\x20\x65\x4a\xc1\x9a\x88\
+\x91\x50\xda\xad\x28\x44\x4c\x79\x44\xc6\x9c\x13\xe1\xca\x38\x1c\
+\x35\x29\x46\x98\x96\x25\x9a\x15\x8f\x59\x12\x63\x38\xe3\x01\x8f\
+\x68\x65\x84\xa5\x22\x61\xca\x9c\x88\x29\xb7\x38\x0a\x19\x8a\x1b\
+\xcc\x00\x2b\xa6\xd4\x24\xcc\x07\x19\xed\x33\x0c\xa1\x0f\xda\x7d\
+\x5a\x32\xb1\x86\x3a\x38\x9d\x28\x24\x52\x9e\x23\xe1\x7f\xe0\x92\
+\x4b\x1e\x00\x09\x33\x12\x4e\xb8\xc9\x94\x94\x8a\x9a\x2d\x0d\x6f\
+\xf0\x33\x1e\xf2\x84\x2b\x2c\x8a\x8c\x09\x29\x96\x25\xaf\xb1\xe2\
+\x42\x32\xbe\x9a\x05\x05\x73\x8c\x74\xaf\xad\xa4\xf0\xc3\xb3\xb9\
+\xe2\x8c\x6f\xb9\x40\xa1\x59\x71\x8e\x9f\x2a\xae\xa8\x28\xd8\xb0\
+\x62\x49\xc4\x98\x25\x13\x52\x72\xc6\x02\xf4\x37\x32\xc6\xc0\xc1\
+\x95\x78\xc1\xab\xe1\x64\x30\xa1\x67\x4f\x1b\x0c\x85\x70\x99\x12\
+\xe9\x80\x1a\x8c\xf4\x1b\xcf\xf9\x92\x0b\x12\x22\x6e\x72\x83\x5b\
+\xcc\x89\xe8\x18\x13\x51\x53\x11\xa1\x79\xc4\x3d\xbe\xe2\x9c\x73\
+\x96\xdc\xe0\x98\x88\x96\x35\x25\x31\x25\x11\x25\x15\x0d\x6b\x32\
+\x89\x23\x3b\x6a\x88\x0d\xdd\xae\x96\x15\x57\x3c\xe1\x02\x45\xc4\
+\x96\x0d\x2d\x75\x68\x36\x55\x54\x6c\x88\x18\xb3\x25\x23\x63\xc2\
+\x94\x19\x63\x22\x0a\xac\xc8\xf4\xc8\x49\xbf\xd4\xcf\x33\x84\x3d\
+\xf8\xb0\xc5\x12\xe3\x58\xf3\x2d\x8f\x50\x4c\x25\x06\x18\xa9\x3f\
+\x95\xcc\xdf\x44\xac\x79\x02\x8c\x18\x73\xc2\x9c\x29\x09\x2d\x2d\
+\x39\x19\x33\xe9\x2c\xdc\x62\xc4\x31\x0f\xf9\x9a\x2b\x20\x66\x44\
+\xc7\xa5\x38\xcf\x86\x0e\x4b\x4c\x4a\x4e\x8e\xc1\x49\xc1\xdc\xe7\
+\x14\x25\x86\x8e\x82\x0b\xae\x28\xe8\x30\xc2\x74\xd8\xd2\xe2\x48\
+\x98\x30\x62\x43\xc9\x45\x80\xf2\x4b\x0a\x56\xb4\x18\x26\x44\x74\
+\x32\xf3\x23\xc8\xea\xbd\x57\xe0\x59\x6a\x14\x9b\x0f\xbe\xe4\x3f\
+\xb3\x21\xe5\xef\x24\x19\x76\x18\x91\x3c\xb1\x42\x51\xb7\x8c\x19\
+\xf1\x2e\x53\xc6\x92\x3c\xf9\x63\xbd\x95\xb4\x67\x4b\xcb\x94\xb7\
+\xb9\xc3\xbb\x3c\xa1\x20\x26\xc7\x90\x01\x19\x29\x29\x96\x12\xc8\
+\x18\x13\x61\x69\x42\xea\x6d\x05\x95\x74\xb4\x6c\x79\xc0\x05\x25\
+\x0e\x47\xc5\x8a\xb5\x38\xc3\x58\x94\x03\x1c\x09\x0d\x05\x2d\x39\
+\x29\x85\x24\xe4\xa7\x81\x75\xe9\x06\x88\x85\xbb\x06\x3d\x89\x9e\
+\xcd\x60\xf0\xb5\x44\xf9\x87\x07\x14\xcc\x98\x85\x32\xa6\xc7\x05\
+\x3c\x63\xc5\x51\x11\xf1\x3a\x13\x6e\x93\xd1\xab\x02\x69\x34\xf7\
+\xb9\xc2\x72\x44\xca\x9a\x95\xc0\xea\x0d\x15\x6b\x62\xa6\xdc\xe6\
+\x0e\x17\x6c\x51\x8c\x99\xb0\xa1\x20\x66\x44\x1a\xaa\x12\x8f\x2d\
+\x69\x29\xb5\x6a\xd6\xac\xd8\x50\xe1\xe8\xd8\xca\xb8\x8b\x21\xc2\
+\x90\x91\x32\x25\xc6\xb1\x60\x23\x53\x1f\x09\x96\x15\x1a\xc3\x0d\
+\xc6\xa4\xc4\xe4\x92\x6a\xeb\x2f\x9e\xdb\xd7\x50\x21\x43\xf7\xe5\
+\x4e\x84\x23\xa6\xa1\x66\xc4\x2d\x92\x41\x72\xbc\xcb\xe2\x13\x5a\
+\x0a\x62\x6e\x93\x4a\x89\x5b\x62\xa9\x58\x71\xc1\x5f\x31\x32\x85\
+\xb3\x61\xc1\x1a\x45\xc9\x96\x0d\x2b\x14\x5b\x1c\xb7\xc8\x88\x48\
+\x49\xe8\x18\x91\x90\x92\x90\x49\xc7\xbd\x11\xd1\x04\x23\x18\x75\
+\xc1\x82\x9a\x92\x42\xc2\xa8\x93\x6e\x9b\xcf\x6f\x53\x52\xa6\xcc\
+\xb9\xe0\x4a\x26\x02\x7d\xa2\x7f\x85\x61\x4a\x42\x4a\xc6\x44\x46\
+\x2c\xcd\x6f\x9e\xcb\x8f\xd8\x4d\x66\x74\x1f\xb7\x9f\xba\x63\xd0\
+\xff\xc8\xaf\x2a\xd6\x94\x5c\xb0\xe1\x17\xd2\x6d\x54\x82\x05\x68\
+\x2c\x29\x50\xc9\xd8\x51\x19\x22\xff\x86\xff\xce\x1f\x89\xf9\x19\
+\xef\xa0\xd9\x92\x32\xa2\x65\xc4\x4a\x38\xb4\x4f\x58\xf1\x80\xbf\
+\xe7\x94\x3b\x24\xac\x29\xd1\x4c\xa5\x70\xf2\x67\xae\xa1\x16\x16\
+\x54\x4b\x4d\xc4\x86\x25\x35\x5b\x36\x38\x69\xef\x25\xe4\xa4\x18\
+\x1c\x89\xd4\x3d\xaf\x71\xc2\x4a\xc6\x6a\x1a\xa0\xa5\x44\x73\x2a\
+\x7a\x88\x86\x38\xd0\x0a\xae\xcd\x9a\x56\x7b\xb5\x45\xc7\xe6\x77\
+\x97\x1f\x16\x64\x22\x7b\x51\xb1\xe4\x9c\x87\x3c\xe6\x8a\x88\x92\
+\x94\xb7\x79\x87\x09\x1d\x25\xb7\x68\x29\x28\x24\xc5\xee\x98\x70\
+\xc5\x25\x15\x2b\x96\x18\x66\xac\x79\x8c\xa5\xe0\x3e\x1d\x13\x2a\
+\x0c\x39\x9a\x86\x94\x9c\x2d\x4f\x58\xf3\x3a\x7f\xcf\xfb\x4c\xa8\
+\x29\x69\x49\x31\xcc\x49\xa8\xe8\x50\xd4\x74\x94\x94\xf2\xaa\x56\
+\xac\xf9\x0b\x97\xac\x64\x22\x50\x93\x70\x2c\x95\x8b\x67\xea\x67\
+\x52\x5e\x95\xac\x59\xb0\x16\xbd\x02\xc3\x1b\xfc\x8c\xb7\xb9\xcd\
+\x9c\x12\xcb\x7b\xfc\x44\xe6\xfd\xbe\xf3\x44\x28\x1c\xd5\x87\x97\
+\xac\x99\x93\x48\x17\x23\x62\x4a\x43\xc1\x96\x0c\x87\x0a\x48\x76\
+\xce\x7f\xe6\x92\x9c\xbb\xcc\x58\x70\x4e\x4b\xce\x96\x9a\x8a\x25\
+\x0b\x52\x12\x0a\x19\x59\x79\x8d\x11\x8a\x07\x94\x6c\x04\x72\xdb\
+\xa2\x39\x22\xa6\xe2\x4f\x6c\x79\x9b\x39\xd0\x31\x95\x21\xc7\xad\
+\xa8\x0c\x2c\x29\x59\xd3\x01\x15\x57\x2c\xd8\x50\x50\x86\xa6\x70\
+\xcb\x8a\x2d\x17\xa1\x24\x1c\x31\xc1\x90\x30\xe7\x06\x57\x3c\x94\
+\xc1\x5c\x9f\xd9\x5a\x22\x22\xe2\x50\xca\x3f\x07\xc5\xf6\xb7\x7e\
+\xcb\x05\x5b\x92\xe0\x05\x22\x26\x58\x19\x23\x32\xe4\x8c\x88\x25\
+\x65\xfd\x67\xbe\xe6\x94\xd7\x98\x73\x9f\x7f\xa2\xa6\x21\x16\x81\
+\x9c\x9a\x04\x23\x91\x7b\xca\x84\x88\x88\x1c\xcb\x25\x5b\x5a\xb6\
+\x14\x4c\x78\x8d\x9c\x4b\x1e\xb3\xc5\xf2\x1e\x39\xd0\x4a\x92\xa6\
+\x45\x84\xab\x95\x72\xbe\x65\xc3\x39\x0b\x39\xf4\x2e\x10\x83\x5a\
+\x09\xe4\x86\x96\x8d\x50\xd6\xa7\xdc\x60\xc6\x84\x63\x0c\x4a\x26\
+\x00\x17\x94\x81\xec\x94\xbe\x48\xd1\xe5\xa4\x6e\xeb\x24\xdb\x6b\
+\xc4\x21\x41\x82\xa1\x65\x45\xce\x31\xb7\x39\x92\x2a\xf4\x26\x17\
+\xc4\xb4\xac\x78\xc8\xd7\x14\x3c\x61\xc6\xeb\xbc\xce\x58\x34\x29\
+\x6f\xb0\x66\x45\xc3\x25\x17\x1c\xf1\x2e\x2b\x62\x26\x52\x29\x1a\
+\x0a\x72\x3a\x2c\x05\xff\x42\xcd\x6b\x8c\xf8\x0b\x8a\x53\x6e\x31\
+\xc7\xb2\xe0\xb1\x0c\xb7\x16\x5c\x72\xc1\x25\x1b\x56\x22\xed\xd2\
+\x77\x59\x2a\xb4\x88\xed\x28\x5a\x6a\x2e\x88\xb8\x62\xc1\x8c\x0c\
+\x45\xc6\x0d\x2a\x0c\x5b\x0a\xb6\x01\x40\x4c\x06\x03\x34\xcf\x34\
+\x84\x01\xba\x8f\x3b\x62\x52\x41\x7e\x12\xf9\xb0\x2f\x85\x16\x4c\
+\x99\x32\x23\x13\x85\xb0\x7f\xc7\x6d\x3a\x22\x0a\x72\x6e\xb3\x66\
+\x49\xc6\x88\x31\x13\x5a\x36\xac\xf9\x13\x6b\x9e\x70\x49\x89\x25\
+\x61\x44\xce\x88\x23\xe6\x8c\x48\x29\x58\x90\x30\xc7\xf0\x17\xfe\
+\xc4\xd7\xbc\xc3\x1b\x7c\x8b\xe1\x27\x44\xdc\xc2\x72\xc1\x1f\x69\
+\x80\x9a\x4b\x1e\x73\x49\x85\x65\x45\x3c\x28\xc8\x3a\x2a\x1c\x15\
+\x35\x63\x46\xc4\xc4\x62\xe0\x92\x52\x38\x5e\x13\x20\xa7\x13\xd6\
+\xb7\xa2\x93\xb9\xb2\xe7\x1a\x42\x61\xe9\x3e\xb6\xc4\x21\x0f\xeb\
+\xe1\x8e\x94\x31\x13\x2a\x72\x32\x01\x4f\x62\x52\x32\x46\x6c\xa9\
+\x69\xb8\x43\xc6\x8a\x88\x09\xc7\xe4\xd4\x5c\x70\xc6\x9a\x25\x37\
+\xb8\x62\xcb\x98\x77\xd8\x70\x9f\x0d\x11\x67\x4c\x38\xe5\x94\x9c\
+\x88\x96\x11\x29\x96\x35\x97\x54\x9c\xf3\x57\x14\x0f\xd8\xf0\x73\
+\x12\xfe\x85\x7b\x3c\x14\x91\xcf\x15\x8d\x88\xae\x25\x8c\x49\x50\
+\x74\xd4\xd4\xa4\x44\xe4\x4c\xc8\x50\x54\xd4\x42\x5d\x69\xa4\x4b\
+\x1b\x09\xf0\x3b\x22\x97\xaa\xb9\x44\x13\xfd\x5e\x89\x54\x97\x7d\
+\x76\x42\xe5\x70\xd8\x5f\x76\xa2\xfb\x93\xc9\x13\x81\x9c\x88\x88\
+\x4e\x9e\x87\xcf\xcf\x0c\x29\x1b\x72\x34\x1b\x19\x7c\x4e\xb9\xc9\
+\x94\x89\xa4\x3b\x05\x35\x53\x6e\xb0\x22\x67\xc6\x98\x25\x25\x77\
+\xa8\xe4\xc7\x97\x68\x52\x5a\x5a\x22\x6e\x93\xb0\x61\xc3\x7d\x2c\
+\x8a\x96\x8a\x02\xc3\x88\x13\xd6\xac\x58\x70\xc5\x56\x72\xd9\x58\
+\x0e\xb7\x17\xee\xeb\x64\xc2\x37\x25\xa2\x1d\x00\xc6\x95\x8c\xee\
+\x5b\x16\x18\x32\xc6\x4c\xa4\xf3\xd1\xa1\x89\x3e\x7a\x01\x67\xd9\
+\xc9\x29\x50\xc2\x7f\xa8\x68\xa9\x65\xc2\xb2\x11\x18\x3c\x21\x96\
+\x9a\x73\x87\x09\x77\x34\x94\xa1\xfd\xae\x88\xe4\x49\xdf\x20\xe2\
+\x82\x19\x35\xff\x85\xc7\xd4\x9c\x02\xc7\xfc\x1d\x47\x9c\xb3\x20\
+\x66\x8e\x25\xe3\xe7\x4c\x58\xf2\x9f\x38\xe7\xe7\x18\xee\xf2\x6f\
+\x79\x8b\x31\x6f\x70\xc2\x4f\xb8\xc7\xff\xcb\x15\xad\x74\x30\x62\
+\x20\x23\x66\xc4\x94\x09\x09\xf7\x25\xcd\x8a\x98\x73\x83\x19\x1b\
+\x0a\x89\x32\x9e\x1f\x5c\x8a\x50\x57\x4a\x4b\x21\x28\xbc\x79\x91\
+\x4e\x57\x24\xa1\x31\x93\x52\x65\x1c\xb4\x80\x7a\x1a\x48\x1c\xf0\
+\x49\x3f\x22\xe0\x85\x51\x5a\xf9\xd1\x33\xe1\x6c\x6f\xf1\x3a\x43\
+\xc7\xb4\x9c\xf2\x0d\x97\x4c\x99\xb3\xe5\x26\x11\xb7\x79\x9b\x29\
+\x29\x17\x38\x32\x1a\x3a\x8e\x78\x8f\x35\xff\x89\x07\xfc\x8c\x11\
+\xb7\xb9\xcb\x9b\x58\x52\xa6\x5c\x32\xe2\x4b\x62\x4e\x59\xb2\x41\
+\xf3\x96\x0c\xdb\x26\x94\x7c\xcb\x13\x96\x24\xc2\xf6\xcb\xc8\x99\
+\x32\xc2\x89\x4e\xae\x57\x4f\xb6\x02\x17\x68\x26\xe4\xc0\x4a\x1e\
+\x9a\x0b\x3d\x97\x67\x76\xc3\x55\x38\x82\xbd\x6c\xa2\x15\x3a\x96\
+\xd7\x14\x8d\xa5\x35\x67\x03\xbd\xc3\x08\x09\x23\x26\xe5\x88\x63\
+\xe6\x4c\x98\x32\x27\xa5\x63\x8d\xe1\x36\x6f\x71\x4c\x42\xc6\x31\
+\x25\x31\x6f\xf0\x3e\xaf\x73\x44\x8a\x61\xc4\x5b\x18\x6a\x4e\x19\
+\xd3\x31\x67\x45\xc4\x11\x59\x98\xdd\x54\xe4\xcc\x19\x49\x4f\x2d\
+\x62\x84\x62\xcb\x05\x17\x6c\xb0\x32\x79\x3a\x95\x57\x51\xb3\xa0\
+\xa2\xa1\x0a\x59\xe5\x5a\x06\x16\x3c\xbc\x57\xb2\xe6\xbf\x73\x49\
+\xf7\xa9\x83\x01\x0d\xe5\x19\xd5\xa7\xc7\x12\xdb\xc0\xb7\x4e\xc8\
+\xa4\xe4\xed\x30\x64\x8c\x64\xb6\xd2\x05\xaa\x71\xff\xdf\x11\xad\
+\x8c\xcb\xfb\x03\xb8\xa6\x22\x65\xc4\x9c\x39\xef\xb1\x02\x34\x5b\
+\x8e\x78\x8f\x9c\x0a\xc5\x11\x29\xf0\x3a\x57\x34\xcc\x59\xa0\x78\
+\x0b\xc3\x4d\x5e\x93\xe2\xc8\x8a\xa0\xeb\x11\x89\x88\xbc\x65\xa4\
+\x94\xd4\x64\x1c\x73\xcc\x39\x05\x47\xcc\xb9\xa4\x12\x44\x2b\x21\
+\xa6\xa3\x10\x0d\x23\x4d\x21\xe7\xe1\x8a\x11\x11\x73\x52\x2c\x0d\
+\xab\x4f\x2e\x3e\xd9\x72\xc4\x0d\x15\x7f\x97\x8f\xb0\xe8\x7f\x4c\
+\x7f\x69\x24\xe0\x78\xe0\x7d\x2b\x3e\xba\x63\xca\x28\x08\x66\xea\
+\x40\xf3\xf1\x0d\x39\x3f\xc2\x3e\x46\x93\xca\x41\x2b\xb8\x8d\x22\
+\xe1\x06\xef\xb1\x66\x45\x29\x99\xdd\x92\x15\x25\x23\x8e\x29\x25\
+\xc9\x69\x68\x38\x26\x67\xc2\xcf\x79\x8d\x34\x50\xd5\x62\x66\xdc\
+\x26\xa7\xa6\x25\x62\x4a\xcd\x9a\x96\x1b\xfc\x3d\x6f\xf0\x47\x2e\
+\x69\x58\xb1\xc5\x91\x92\x61\x98\x73\x83\x35\x4f\xd8\x02\x33\x14\
+\x1d\x25\x8e\x9a\x25\x86\x8a\x8a\x29\x1b\x2e\x79\xc4\x13\x9e\xf0\
+\x36\xa9\x3b\x51\xee\xd9\xe1\x53\x13\xff\x2a\x76\x36\xa4\xd1\xbe\
+\xd5\x87\x94\x2d\x99\x88\x27\x32\x50\xb4\x55\x01\xaa\xc9\x59\x09\
+\x0c\x97\xd1\xe1\x18\x91\x0a\xc2\xe5\xb9\xbb\x8d\xa8\x3a\x24\x52\
+\x53\xae\x98\xb1\x60\xcc\x11\x4f\x28\xf9\x09\x0b\x7e\xca\xfb\x4c\
+\x84\x13\xe9\x95\x28\x46\xbc\xcb\x1b\x3c\xa0\x22\x25\x13\x24\xc4\
+\xa0\x30\x9c\xf0\x36\x5f\xb2\x02\x66\x9c\x10\xe3\xc8\xb8\x49\x4a\
+\x25\x91\xc9\x49\x3b\xd0\x33\x3b\x1e\xb0\x25\xa6\xe2\x18\x45\xc1\
+\x8a\x95\x0c\x70\x3e\x13\xb3\xec\x59\x28\x5e\x83\x70\x4d\xc5\x16\
+\xcb\x14\x2d\xe5\xae\x09\x83\x08\x43\x42\xb0\x95\xce\xe3\x29\x8e\
+\x25\x23\xd2\xa0\x60\x3b\x22\xc7\xb0\xa6\x26\x65\x42\x4d\x41\x1b\
+\x84\x7c\x6b\xa0\xe0\x98\x39\x67\x74\xbc\xcf\x92\x9f\x33\x17\x08\
+\x30\xc2\x91\x70\x8e\x66\xc6\x5b\xfc\x15\x87\xa2\x91\xeb\xa4\xf8\
+\x9a\x86\x23\x7e\x41\xce\x7d\xb9\xb4\x8e\x29\x27\xc4\x8c\xb8\x45\
+\x4a\x11\xf8\x94\x29\x13\x72\x6a\x12\x46\xc4\x14\x6c\xf8\x26\xf4\
+\x46\xdd\x77\x23\x54\x3e\xcd\xf6\xdd\x44\x0f\x7f\xa4\x4c\x44\x04\
+\xab\x0b\xf4\x9e\xbe\x17\xa9\x03\x2f\xd7\x90\xf0\x0b\xfe\xcc\x9a\
+\x96\xa9\xa0\xdd\x0d\x19\x19\x8e\x9c\x44\x78\xd3\x1b\xd6\xb4\x58\
+\x81\xe4\x96\x24\x4c\x50\x54\x18\x8e\x38\xe1\x88\x48\x5c\x71\x4d\
+\x49\x4d\x4c\x49\xc3\x88\xdb\x68\x0a\x0a\xa9\x14\x12\x4a\x56\xdc\
+\xe0\x94\x8c\x8c\x19\x6b\x16\x64\xbc\xcd\x11\x8d\x38\xdb\x25\x57\
+\x62\x4e\xcd\x88\x63\x62\x26\xdc\xe6\x04\xc5\x96\x25\x35\xb3\xbd\
+\xf9\xe1\x6b\x13\xaa\x2e\x70\x27\x55\xa0\x67\x29\x99\x90\xea\x02\
+\x53\xc9\x86\xa4\x6a\x9f\x5a\xfa\x53\x56\x2c\x69\xc3\x90\xe3\x09\
+\x9a\x96\x8e\x94\x88\x8a\x25\x05\x8e\x94\x51\x38\xb8\xdf\xf2\x06\
+\x89\x74\x28\x15\x37\xe4\xda\xf9\xe2\x6b\xc3\x86\x63\x1e\x53\x01\
+\x73\x62\x96\x3c\xa1\x40\x91\x4a\x16\x61\x59\xd1\x30\xe3\x16\x15\
+\x5f\x93\x71\x47\x94\xf0\x0c\x39\x25\x8a\x44\x86\x2f\x2d\x8a\x84\
+\x39\x6f\xf3\x36\x31\x5f\x72\x0e\xcc\x99\x5f\x33\xe2\xb6\x67\x88\
+\x9e\x5d\x5b\xcb\xb7\x84\x96\x84\x1c\x45\x2d\x9d\x22\x85\x15\xe2\
+\xd0\x8e\xb2\xd3\xf7\x13\x97\xbc\x4b\xc2\x9f\xb8\xcf\xbb\x9c\xd2\
+\xb0\x24\x92\xf9\xbb\x2d\x2d\x1a\xc7\x98\x4c\x5a\x3a\x1d\x5b\x5e\
+\x47\x53\x92\x31\x63\xcc\x48\x8c\xa7\x02\xfb\x21\x91\x56\x8e\x62\
+\x42\x22\xd5\xa6\xa3\x65\x4d\x42\x46\x4c\x8d\x16\xbd\x02\x47\xc5\
+\x23\x22\x2e\xa4\x8d\xec\xd5\x6e\xc0\x31\x21\x27\x23\xa7\xe2\x09\
+\x27\xe4\xc4\xdc\x62\x8b\x61\xc6\xe4\xfd\xf6\xc0\x18\x7b\x3e\xa2\
+\x07\xcf\xbd\x3f\x68\xc8\x38\x22\x13\xe1\x94\x72\x8f\x4b\x7b\x5d\
+\x3f\xb9\xc6\x31\xe3\x5d\xce\x78\xc4\x82\x11\x33\xc1\x0a\x12\x69\
+\xca\x7b\xca\xea\x15\x17\x94\x20\xc2\x4c\x23\x46\xa2\x2d\x60\xf6\
+\xc0\x80\xbe\xfb\x19\x8b\x5a\x89\x21\x63\x83\x96\x74\xde\x1b\xad\
+\x24\x21\xe7\x84\x82\x96\x9a\xf5\x80\x9e\x10\x4b\x7e\x33\x16\x35\
+\xe5\x98\x11\x63\xc1\xb1\xbc\x19\xf5\x3d\xf3\xdd\x3e\xa2\xfb\x78\
+\x37\xa8\xd4\x0a\xfa\x90\xd2\xd2\xb0\x0d\x33\x76\xea\x19\xed\xc1\
+\x84\x9a\x09\x33\xe6\xdc\x63\x89\xe3\x98\x8a\x86\x42\xe6\xc5\x6b\
+\x0c\x2d\x05\x8f\x39\x47\x73\xc4\x4c\x84\x37\x46\x64\x72\xa6\xa2\
+\x01\x39\xd4\xc9\x30\xdd\x88\x31\x31\x05\x86\x54\x84\x3f\x9d\xa0\
+\x14\xbd\x20\x64\xca\x84\x92\x15\xad\xe4\xb8\xad\xcc\x25\x1a\x66\
+\x8c\x30\x68\x12\x22\xc6\x8c\x04\x97\xcf\x18\x93\x5d\xc3\x93\x38\
+\x48\xa8\xb8\xa7\x05\x91\x8c\x49\x18\xcb\x19\xe8\x84\x98\xe3\x06\
+\xbd\xa2\xa7\xf9\xd4\x09\x35\x96\x8c\x5b\xb4\x3c\xa6\xe3\x01\x05\
+\x5b\xea\x30\xc8\xf0\xae\x08\x7e\x46\xcc\xb8\xc5\x4c\x44\x5b\x7b\
+\xd1\x3e\x27\x1d\x8d\x5e\x86\x4f\x49\xcd\x33\x16\x71\x8d\x98\x89\
+\x08\x80\x55\x6c\x88\x25\xd3\x6c\xa5\xfb\x92\x32\x62\x2d\xf5\x8f\
+\xef\xa0\xc6\x72\x31\xf5\x80\xbf\xef\x55\x32\x27\x64\xd7\x50\x0c\
+\xa3\xfd\xb9\x0c\xf3\x45\x8c\x96\x14\x66\x42\x8e\x15\x03\xf4\x73\
+\xbe\xee\xda\x86\x99\x12\x6c\x19\x81\xe1\x66\xa2\x42\xd9\x49\xfe\
+\xd0\x33\xa7\x7c\xf9\x1e\x31\x61\x12\xc6\x1c\x74\x98\xf3\xeb\x82\
+\x46\x59\xaf\x03\xe1\x03\xe0\x98\x05\xe0\xb8\xc5\x5a\x4e\x85\x57\
+\xa4\xf2\x3d\x95\x26\x44\xbb\x4a\x46\x5f\x53\x72\x52\x22\x36\x22\
+\xd8\xd5\x33\x7b\xfc\xe4\x57\xca\x8c\xe4\x79\x4d\x60\x87\x22\xba\
+\x4c\x8e\xb5\xa8\xce\x26\x82\x29\x7b\xee\xd4\x6e\xc0\x4c\x3d\x35\
+\xee\xea\xbb\xcf\x39\xb0\xa5\x24\xe2\x88\x19\x5b\x22\x22\x21\x26\
+\xf6\x7d\x68\x07\xa4\x22\xb5\x91\x1c\x4c\x89\x6e\xe5\x27\xec\x8f\
+\xa5\x8c\x39\x92\x7e\x45\x42\x22\x6d\xc0\x9a\x0d\xb1\x34\x00\x6c\
+\x60\x61\xdd\x1e\xcc\x18\x3a\x2c\x39\x63\x51\xca\xb4\xf2\xf3\x2d\
+\x8e\x11\x13\x92\xff\xc0\x77\xe5\x11\x86\x9a\xee\xae\xfe\x22\xfd\
+\x70\x24\xc2\xbb\x2e\x8c\x86\x20\x8a\x61\xc3\x59\xbb\xc3\x19\xd1\
+\x58\xe4\xf2\xb4\xcc\x56\xa5\x72\xdf\x77\xf4\xe0\x58\x14\x0a\x3d\
+\xcf\x2d\x3a\x18\x67\xd9\x5d\x89\x3e\x73\xf5\xc5\xde\x09\x4b\x96\
+\x14\x22\xeb\x92\xd1\xb2\x65\x8b\x23\x97\x11\x25\x83\x62\x22\x3d\
+\xf9\x4a\x48\xea\x8e\x96\x5b\x4c\x85\xea\xd4\x49\x61\x8e\x60\x2d\
+\xc9\x35\x4d\x9e\x83\x06\x4f\xf3\x0f\x5e\x74\xbb\x91\x79\x28\x82\
+\x97\x28\x06\xa3\xc9\xd7\x83\x1b\x49\xd0\xb6\xd7\x34\x34\xd2\x47\
+\xf0\xd5\x6c\x2b\x45\x54\x24\xe9\x3a\x61\xb0\xda\x49\x2f\xc5\x86\
+\xb1\x84\xa1\xac\x82\x23\x66\xcc\x8c\x0c\x43\x8d\x62\xcc\x5c\x62\
+\x58\xcd\xa5\x0c\xec\xa7\x4c\x98\xa0\xd9\x08\xa1\x54\x49\xdd\x39\
+\x65\x22\x17\x89\x81\xb4\x57\x32\x88\x50\xcf\xbc\x1a\x11\xe6\xf3\
+\xe5\x27\x96\x09\x19\x1b\x3a\x1e\x10\x71\x2c\x7a\xb3\x06\x45\x8d\
+\x22\x0d\x2c\x7d\x0e\x26\x6c\x6a\x8c\xa0\xc4\x7d\x08\x4e\x43\x48\
+\xd3\xe4\xe2\x15\x62\x59\x13\xa1\xa4\xcd\xdb\x89\x6f\xb0\xc2\xaa\
+\x26\xf8\x8d\x9e\x91\x9f\x30\xe7\x98\x05\x2b\xd1\xc7\x9e\x71\x07\
+\x4b\xc9\x23\x1e\xf3\x95\x6c\xdb\x38\x66\xc4\x39\x15\x0d\x11\x27\
+\xbc\xc9\x1b\xcc\x59\x90\xb3\xa0\x90\x86\x94\xe7\x5c\x6c\x51\x8c\
+\xdf\x37\xd7\x08\x30\x1d\x14\x5d\xfa\x73\xfd\x89\x95\x09\x4f\x0f\
+\xb8\xd5\x1c\xcb\x88\xa0\x67\x2c\xf9\xb7\x13\x5d\xe3\x2c\x4d\xf0\
+\x33\xbd\x12\x90\x66\x28\x0d\xea\xbb\x1c\x1a\x25\xc0\x48\x2b\x14\
+\x94\x4e\xbe\x4a\x0f\x58\xff\x4a\x1a\x37\x7e\x9e\x74\xcc\x8c\x63\
+\xd1\xcb\x36\x54\xc4\x64\xcc\xb8\xc1\x86\x25\x2b\x2a\x1c\x6b\x36\
+\xe4\x8c\xc8\x99\x71\xc4\x18\xc5\x86\x0a\x44\x92\xa7\x57\xd8\xed\
+\x06\x93\x1d\xea\xbb\xae\x86\xc2\xdc\x8b\x64\x58\x29\xa1\x10\xd7\
+\x67\x84\x2d\x77\xc6\x88\xa9\xbc\xdc\x4e\xc6\x8f\x87\x54\x63\x13\
+\x46\x9a\x4c\x18\x91\x76\xe1\xb0\x9b\xa0\x13\xd5\xb3\x21\x1b\x5a\
+\x1a\x5a\xf9\x0a\x13\x92\xfa\x66\x6f\x14\xbe\x23\x22\x61\xcc\x94\
+\x0b\xd6\x54\x28\x32\x1a\x72\x66\xcc\x83\xc2\x88\x57\x63\xd6\xe4\
+\xcc\x99\x93\x63\x59\x53\xa2\xa8\xe4\xf5\x67\xd2\xb2\x6e\x7c\xc2\
+\x78\x97\x7b\xcf\xa5\x05\x44\xa4\xbf\xe7\x43\x43\xf4\x99\xfe\x7c\
+\xf6\x95\x27\x0b\x2a\xb9\xe7\x0b\xe9\x5d\x49\xa0\x7d\x26\xe7\x4a\
+\x07\xa5\x97\xdd\xfc\x84\x11\x5a\x49\x2b\xd5\x8a\x17\xdc\x23\x8c\
+\x37\xf7\x1c\x5d\x2b\x24\x34\x2b\xd4\xe1\x9d\x86\x44\x44\xca\x15\
+\x5b\x22\xc6\x92\x34\x79\x31\xe1\x23\x5a\x69\x19\x6e\x03\xe5\xd0\
+\x3b\x4d\x2f\x3a\xef\x0d\x14\x0b\xaa\x62\x51\xa8\x7b\xd7\xcd\x19\
+\x46\xfb\xdc\x6b\x43\xfa\x11\xbf\x73\x77\xd5\x3d\x7d\x6f\xfa\xeb\
+\x29\xa3\xdf\xae\x24\x11\xf1\x14\xcf\x5e\x52\xd5\x8b\x9b\xb0\x97\
+\x6c\xbb\x40\xcf\xd1\x81\x1d\xb9\x53\x18\xf1\x2c\x89\x3a\xa0\x05\
+\x9d\x68\x8c\x45\x81\x6a\xee\x67\xc6\x62\xd9\xd5\x55\xc2\x80\x6f\
+\xd9\x9f\xa8\x5a\x34\x95\xbd\x66\x9d\x92\x04\xca\xb3\xab\x67\x41\
+\x18\xb4\x15\xd2\x50\x1d\x66\xba\xb4\x28\x6d\x6a\x12\xf4\x3d\x9e\
+\x3f\xaf\xa1\x88\xb0\x1f\xb5\x9f\xda\x0f\x40\x7d\x11\xdf\xe3\x1e\
+\x7f\xf0\x92\xae\x3a\x30\x18\x5d\x80\x73\x87\x53\xdf\xc3\x49\x60\
+\x42\x5b\xc5\x89\x1c\x46\x07\xf2\x06\x1a\xc9\x1d\x2d\x91\xac\x84\
+\xb0\x81\x50\xda\xd1\x89\x7a\x89\x8f\x53\x43\x53\x46\x02\xc1\x95\
+\x2c\x31\x24\x24\x24\xb4\x32\xf9\xab\xf1\xa3\x56\x08\x9e\xe2\xc7\
+\x96\x7c\xa9\x88\xc4\xbe\x2d\x0b\x59\x48\x60\x9e\xef\x23\xc2\x44\
+\xe6\x5d\xfb\x81\xfd\x80\xe3\xee\xf7\xed\x87\xfe\x09\x1a\x26\xd4\
+\x02\x89\xc6\x52\x0d\x46\x83\x45\x74\x6a\x8f\x89\xbf\x3f\xc7\xdd\
+\xcf\xe2\x39\x19\x80\xe9\xf5\x08\xc7\x42\xf4\xe8\xbf\xce\x8b\xf8\
+\xb8\x30\xe7\xdd\x08\x36\xe6\x6b\x8b\x02\xcb\x98\x8a\x35\xe7\xc0\
+\x24\x08\x41\xea\x30\xaa\xf0\x68\x30\xaf\xe1\x85\x40\x5b\x09\xdd\
+\x1d\x1d\x1b\x96\x34\x02\x15\xf1\x3c\xa2\x48\x98\xa2\xba\xeb\x8e\
+\xa1\xc1\x7e\xd8\x4a\xd9\x1d\x33\xa3\x94\x9e\xe7\x88\x4c\x78\xb2\
+\x6e\xf0\x66\x87\x03\x6b\x3a\x70\xe2\x94\x98\xa1\x92\xc3\x6e\xe5\
+\xd8\x26\xc4\x92\x6e\xa9\x10\x33\x96\x40\x22\xac\x59\x1b\xe4\xc8\
+\x5b\x2a\xb6\x2c\xb8\x92\x55\x34\x4b\xb6\xa4\x34\x83\x8c\xd4\x8a\
+\xf6\xd8\x46\x7c\x91\xbf\x46\x48\x03\x49\x89\x8c\x9f\x37\x65\x1c\
+\x14\xd5\x9f\x43\x14\x11\x48\xff\x57\xcd\x3f\xd8\x5f\xee\x18\xab\
+\x1d\x39\x6f\x50\x49\xc9\xac\x68\x45\x7a\x47\x0d\x38\xfc\x4a\x6e\
+\xb3\x15\x38\xc4\x4a\x6b\xad\x13\x55\xca\xde\x39\xf6\xfa\x75\x11\
+\x0d\x95\xe8\x9e\xf6\x18\x44\x43\x21\xaa\xd9\x7e\xed\x80\x1f\x48\
+\x58\xf2\x0d\xf7\x39\xa7\x25\x13\x7e\xe6\x8a\x33\x26\x28\x34\xb9\
+\xcc\xff\xa8\x30\xc6\xe0\x49\xa8\xad\x40\x3c\x15\x19\x19\x23\x60\
+\x43\x8d\xe5\x16\xf3\x30\xde\xaf\xbe\xdb\x47\xf8\xab\xe1\x7e\xd9\
+\x4a\x3e\x80\x48\x78\xb6\x6c\x64\x6c\xc5\x1d\x0c\xb2\x33\x18\x79\
+\xb4\x61\xc8\x44\x85\x3c\xd4\x49\xba\xdc\x05\xef\x1f\xe1\x68\x18\
+\x03\x9a\x8a\x0d\x57\x94\x28\x51\xaf\x8d\x84\x9e\xa6\x65\x98\xf1\
+\x09\xdf\xf2\x80\x2b\x11\x1a\xf6\xb3\xc8\x25\x0b\x9e\x30\x96\x82\
+\xae\x7f\x43\x47\x41\xa7\xdb\x0a\xa3\xc7\xbb\xe5\x94\x18\x47\x41\
+\x47\x16\x3c\xc4\x73\xc2\xe7\x21\xf3\xb6\xa7\x9c\x1b\x52\x26\x81\
+\xff\x78\x38\xdb\x4d\x50\x88\xda\x5d\x2f\x7f\x5b\x1b\xc1\xb1\x7b\
+\xce\xb4\xe7\x44\xe6\x44\xa2\xa1\xde\x51\x70\xc6\x9f\xf8\x8a\x2b\
+\x3a\xc6\xdc\xe1\xe7\xbc\xcb\x11\x48\x73\xb9\xe6\x82\xfb\x7c\xcd\
+\x19\x05\x8e\x5a\xd6\x0b\x40\xcd\x8a\x0b\x4e\xc9\x28\x84\x18\x6b\
+\x80\x29\x95\x44\x8d\x5a\x94\x66\x3c\xf9\xcd\xf7\xef\x37\x28\x8e\
+\x39\x21\xf9\xb5\xbe\x76\x68\x37\xba\x4e\x65\xc8\xdc\x33\xbf\x77\
+\x1f\x76\x61\x8e\xd6\xff\x6d\xb2\x47\xf8\xe6\xa9\x89\xbd\xc3\xa1\
+\xd5\xdd\x3c\xa7\x0f\x7a\x06\x4d\x2a\x50\xae\xc6\x70\xc1\x86\x47\
+\x7c\xc9\x7f\xe5\x3e\x25\x86\x9c\x85\x3c\xf3\x84\x42\xf4\xf0\xae\
+\x38\xe3\x9c\xc7\x54\x68\x0c\x95\x68\xe9\xf7\x8b\xaa\x52\x72\xf9\
+\x0a\x17\x76\x7a\xb5\xb2\x58\x62\x37\xa5\x9e\xc8\xfe\xd0\x13\xee\
+\x70\x93\xe4\x73\xf5\x22\x3e\xa2\x97\xe0\x52\x1f\x45\x94\xce\x4f\
+\xe0\xd9\xa0\xda\xb1\x1b\x23\xd8\x65\x96\xfd\x84\x94\x1a\x4c\xe6\
+\xb8\x60\x2c\x4d\xcd\x56\x18\x2b\x7e\xcf\x8a\xef\x9f\x26\xb2\x27\
+\xa3\x64\x03\xdc\x60\xce\x29\xb7\x69\x50\x9c\xd1\x92\x63\xa9\x78\
+\xc2\x9a\x0b\x1e\xf1\x0d\xe7\x34\x02\xbc\x19\xaa\x90\x94\x17\x94\
+\xb2\xf7\xb1\xd7\x0f\x68\x04\xd9\xf4\xf9\x45\x25\x72\x1a\x19\x0d\
+\x6b\x11\x17\x9c\xff\x63\x34\x08\xf5\xcf\x21\x9c\x2a\xf1\xbc\xf5\
+\x9e\x3e\x90\x12\x4e\x15\x07\x33\xbf\x3b\x51\x83\xee\x80\xd3\xdf\
+\x0a\x93\xa1\xa0\x09\x7a\x03\x59\x88\x12\x31\xc7\x54\xe4\x8c\xb8\
+\xc9\x88\x9f\xf0\x1e\x37\x59\x73\xc5\x96\x8a\x73\x2e\x58\x52\x72\
+\xc1\x19\xe7\x5c\xb0\xc5\x49\x85\x63\xa5\x83\xb5\x2b\xed\x3b\xc9\
+\x44\x7d\x70\xee\x42\xb2\x6f\x28\x04\xe3\x8c\x58\x71\x85\xc2\x30\
+\x25\xff\x95\x7a\xbe\x8f\x18\x1e\x19\x8d\x23\x7e\x1f\xcc\xa7\xd1\
+\x87\x4e\x9e\x66\x21\x23\xe6\xfb\xcf\x7d\x98\x57\xee\x8f\x44\xd7\
+\xa2\xad\xee\x88\x85\x61\xbb\x43\xaa\x3b\x51\x9a\xbc\xc1\x5d\x6e\
+\x91\x70\x9b\x29\x1d\x63\x46\x94\x3c\xe6\x09\xf7\x39\xa3\x63\x21\
+\x53\x19\xfd\xd5\xf3\x1d\x38\x15\x0a\xbf\x48\xc2\x25\xe2\x8e\xdb\
+\xb0\xd9\xa1\x6f\xe1\x68\x32\x0c\xe7\x2c\xb8\x49\x17\x84\xdb\x5e\
+\x68\x12\x78\x07\xc6\x8d\xee\x81\xfb\x68\x37\x4f\x7b\xee\xf4\xc0\
+\x63\xa8\xa7\x74\x40\xf4\x40\x92\x51\x05\xde\x84\x57\x17\xed\x71\
+\xea\x5e\xbb\xba\x11\xec\xeb\x16\xa7\x82\x55\xc4\x94\x02\xd3\x97\
+\x2c\xd9\x50\x73\x45\x41\x4b\x02\x68\x09\xd8\x3d\xb5\xd9\x08\xd6\
+\x19\x49\xab\xc6\x84\xb8\xe4\x27\xc5\x6b\x01\xf0\x7a\x95\xcb\x2d\
+\x85\xcc\x31\xf7\xa3\x57\x2f\x30\xe5\x77\xa8\x24\x67\x42\x9d\x91\
+\x0d\x86\x81\x5c\xc0\x13\x76\x9a\x0e\x76\x4f\xa8\xc0\xdf\x61\x4f\
+\x46\xcd\x48\xc3\xbc\x56\x9f\x6f\x78\x86\x85\x4f\x81\x0d\x95\x28\
+\xa6\x3a\x14\x37\x78\x0f\xc3\x05\x67\x5c\xb1\x09\x13\x7a\xa9\x4c\
+\x89\xf8\x81\x83\x29\x73\x4e\xc9\x85\x9a\xd6\x05\xf9\xd7\xbe\xd2\
+\xb0\xe2\x33\xee\x70\x0b\x47\xc2\x31\x11\xb1\x68\xa9\xbf\xf4\xb8\
+\xe3\xd3\x9f\xda\xf7\xbe\xdc\x30\x0b\x3d\xc8\x2c\xfb\xa3\xd9\x0a\
+\x8c\x13\x49\xd3\x68\x28\xed\xe8\x02\x03\xa6\xc7\x3d\xbd\xea\x99\
+\x0f\xb3\x8e\x19\x77\x79\x9d\x87\x3c\xe1\x4c\x96\x18\x5a\x52\x69\
+\xf8\x65\x18\x8c\x48\x8f\x0f\x05\x7f\x7a\xd1\xdf\xdd\x03\xf1\xe0\
+\xaf\x91\x4e\x6c\x7c\xc0\x27\xfd\x1e\xdb\x1d\xa3\xcf\xcc\x27\x26\
+\x4c\x59\xed\x9c\xe5\xae\x05\xd8\x0a\x94\xda\x4a\x17\x3d\x91\x9e\
+\x05\xb2\x10\x44\x0d\xc6\x67\x9d\xb8\xbe\x4e\x68\x00\x5a\x06\x9d\
+\x2a\x3a\x09\x8b\x63\x72\x0c\x57\x42\x15\xf5\x13\x40\x91\x78\x9b\
+\x89\x70\x67\xfa\xae\x6c\x27\x86\x70\x83\xa1\xe7\x52\xe4\x60\xda\
+\xd0\xb1\xbf\x5e\xef\xe8\x85\x35\x66\x82\x21\x7e\x13\x07\x85\x80\
+\xa1\xf4\x81\x3b\x80\xd8\x90\x26\x8c\xa7\x96\x8c\x06\x94\x3e\xf5\
+\x94\x3c\x06\x82\x45\x44\xa2\x67\xd4\xc8\x35\xd4\x22\x38\x3e\x63\
+\xce\x09\x37\x39\xe5\x26\x13\xc6\xe4\x64\x4c\x98\x33\x11\x9a\x92\
+\x09\xc5\x5d\x27\x8f\xa0\x96\x1e\x8c\x15\x10\x27\x91\x93\x68\x18\
+\x87\xa7\xee\x5e\x55\x36\xa1\xff\x54\x3d\x50\x12\x1a\x6e\x72\x77\
+\xe1\x87\xb9\x90\xdc\x18\x59\x33\xa6\x02\x53\x21\x0a\x43\xd4\xfb\
+\x4a\x97\x66\x2f\x18\x6b\xa9\x63\xc0\x31\xe6\x88\x48\x5a\x8e\xc8\
+\x38\x63\x24\x30\xbe\xde\xd3\xa2\xe8\xa4\xf4\xaa\x43\x64\xd3\xe4\
+\x42\x3c\xdc\xd0\x30\x62\xc4\x0d\xd2\x57\x5b\x2b\x71\xdd\x20\xcb\
+\x7e\xa6\xd0\x5f\x92\x9d\xca\x6d\x24\x82\x15\xb1\xec\xe4\x24\xcc\
+\x77\x47\x03\x21\x60\xbb\xa7\xfd\xd1\xbf\x0d\x23\xfa\x40\x7e\x39\
+\x88\xa6\x63\xc4\x14\x45\x46\x4d\x4d\x23\xac\x59\x27\x88\x85\x6f\
+\x08\x74\x81\x9a\xe0\x44\x14\xb8\x0d\x4d\x81\x29\xb9\xa0\x99\x30\
+\x61\xce\x4d\x72\xf5\xb4\xb0\xe8\x2b\x18\x62\xe7\x20\xf7\xc7\xdd\
+\xbb\x10\x3c\x75\x18\x77\x4b\x24\xde\x74\x03\x01\xb7\x7d\xf5\x11\
+\x17\xe6\xc2\x6d\x48\xc8\x9c\x80\x80\x1e\x5f\xc8\x84\x3c\xaa\x44\
+\x2f\x24\x16\x77\xba\xbb\x7e\x86\x58\xa2\x9a\x6f\x42\xd7\x41\xea\
+\xd3\x60\x18\x73\xc4\x4d\xa6\x1c\x51\x72\xca\x5b\x1c\x7d\x96\x0e\
+\x84\x04\xbf\x87\x21\x86\xa5\xba\xda\x83\x60\x5c\x58\xf4\xd1\x1f\
+\xd8\x48\xc6\x94\x7b\xc1\x0b\x1f\x24\xd5\x40\x37\x1b\xf9\x8c\x6e\
+\x87\xa0\x13\x89\xb4\x93\x47\x13\x46\x74\x6c\x05\x65\xaa\xd1\xb4\
+\xc4\x32\x4a\xd5\x85\xc4\xdf\x8a\x80\x4a\x3f\xa2\xdf\xef\x84\xf3\
+\x25\xfa\x4d\xde\xe1\x16\x96\x8a\x31\xc7\x2a\x0e\xe9\xf8\x0b\x64\
+\x96\xcf\x1a\x6a\xf2\x07\x3a\xfe\x75\xfe\xdb\x22\x80\x74\x51\x20\
+\xa8\xea\xb0\x2f\xdc\x05\x1d\x01\x27\x00\xbe\x97\x5f\xcd\x98\x0a\
+\x27\xcb\xfb\xfd\x5e\xc3\xde\x85\x69\xf0\xfe\x6a\x39\x99\x1b\x76\
+\xa4\x68\xc6\x20\x33\x21\x91\xf0\x40\x7d\xd3\xbf\xa2\x91\x45\xb9\
+\x09\x39\x09\x1d\x6b\x5a\xc0\xb2\xc5\x12\x93\x11\x91\xf0\x06\x6f\
+\x70\xac\xfc\xf6\x8e\x68\x00\x24\x7e\xcf\x3c\x42\x0d\x26\xb5\xaf\
+\xb3\x6c\xbf\x35\xc1\xc8\x3d\x2d\x04\x58\x3b\xa7\xe5\x98\x5b\xbc\
+\x87\x96\xbb\xbf\x11\x02\x61\xaf\x5c\xdb\x8a\x30\x67\x22\xfb\xfe\
+\x90\x49\x11\x4b\x1e\x26\xcf\x7b\x95\x90\x48\x7e\x8a\xa3\x0e\x72\
+\xaf\x7d\x5b\xa0\x0d\x2c\x5d\xdf\x02\x98\x91\xff\x5e\xef\xa9\x52\
+\xf1\x43\x38\x4b\x50\x5f\xec\xeb\x56\x5e\x6f\x88\x48\x3a\x57\x5a\
+\x66\x6f\x1e\xb2\xe6\x8c\x2b\xf1\xf7\x4a\xf6\x7b\x59\x69\xe4\x1a\
+\xe9\x74\xed\x94\xd5\x77\x5d\x57\x2b\x10\x4f\x8a\x93\x8d\x5e\x26\
+\x5c\x37\x4b\x5f\x1b\xb7\x52\x67\xb4\x61\xa7\x93\x43\x93\x71\xc4\
+\x31\xe3\x8f\x7e\x04\x43\x28\xf4\x3d\xf3\x9c\x45\xa2\x4a\xb8\x2a\
+\x48\xdf\x7b\xc6\x5b\xa4\x5c\x61\x18\xf1\x40\x38\x39\x8d\xec\xca\
+\xc8\x85\xc1\xd0\xff\xf3\x48\x3c\x8b\x97\x43\xd1\x83\x0e\x18\xd2\
+\x18\xb4\x01\x6f\x70\xd2\xf2\x27\xcc\xfb\x76\x01\x97\xea\xe1\xdf\
+\x09\x23\xcc\xde\x58\xf4\x0f\x77\x22\x06\x82\xac\xd7\x69\xd2\x0c\
+\x83\xa8\x87\xcc\x22\x4e\xb9\x29\x0c\x89\x73\x96\x5c\xb0\xa0\x94\
+\xe6\xe1\x2a\xe4\x1c\x29\x63\x32\x8e\xe5\xc0\x37\xb2\xea\xd2\x48\
+\xb5\xb9\x73\xc0\xbe\x15\xe0\x67\xfd\x52\xe9\x5e\x79\x3d\x19\x8f\
+\x52\x38\xd1\x92\xf0\xad\xc2\x11\xd1\x3f\xb2\xb7\xe7\xe5\x87\x3b\
+\x11\x7b\x55\xe7\x75\x31\xa5\x1b\x70\x1e\x32\x01\xe8\x73\xc9\x1e\
+\xe7\x2c\x98\xb0\xa4\x11\xcd\x38\x4d\x4b\x21\xa0\xaa\x41\xf1\x84\
+\x86\x2d\x05\x55\x90\xd9\xeb\x35\x65\xfc\x36\xcf\x58\x82\x63\xc9\
+\x56\x10\x87\x3e\x29\x8b\x06\x5d\x15\x2d\xc5\xf7\x84\x09\xe6\xf3\
+\x97\x49\x17\x5f\xea\x97\x1e\x5c\x0d\x77\x4d\xb6\x6e\x07\x93\xa3\
+\x51\xd8\xd7\xeb\x4f\x4a\xca\x9c\x98\x93\xa0\x2f\xe8\x04\xaf\x58\
+\xb3\xa1\x92\x45\xca\x95\xc0\x70\xbd\x3e\x6d\x8f\x3e\x18\xf9\x0a\
+\x23\x73\xe0\x89\xb4\xf4\xac\xd4\x2f\x91\x34\x95\x7b\xc3\x4c\x38\
+\x61\x8e\xf9\x7c\xa8\xb8\xfc\x03\x5f\x8d\x67\x7f\x43\x13\x42\xa1\
+\x8f\xf3\x3e\x90\x25\x12\x49\x12\x19\x5f\x50\xb2\x6f\xcf\x6b\x90\
+\xcc\x89\xb1\x94\xb2\x35\x67\xc5\x13\xce\x59\x4a\x53\xf7\xb1\x30\
+\x61\x2a\x69\x0c\xf7\xd4\xa3\x96\x9a\x0c\xcb\x8d\x80\x4f\xf8\x39\
+\xaf\x42\xb2\x4d\x88\xc8\x85\x4a\x76\x9d\x3e\xd6\x2b\x19\x62\x5f\
+\x6f\x50\x13\xbf\xaf\xbf\x52\xe1\x12\xa8\x00\xc6\xd8\x20\x7c\xb1\
+\x13\x66\xb2\x82\x2a\xf5\xbb\x9d\x3a\xd9\x84\xd0\x85\x5c\xb4\xa2\
+\x22\x65\xcc\x94\x11\x35\x5b\x40\x73\x2a\xcb\x2f\x4b\x16\x58\x96\
+\x9c\xb3\x92\x45\xec\x17\x54\x92\x2b\x28\x26\x68\x96\x1c\x91\xcb\
+\x38\x53\xc7\x5a\xf2\x0c\xef\x80\x73\x8e\x38\x51\x6a\xa0\xa5\xf5\
+\x3c\x53\xbc\xec\x89\xb8\xa7\x0e\x74\x08\x19\xd0\x8b\x86\x32\xf3\
+\xee\x29\x2d\xec\x9e\xd2\x97\x88\xa7\x6f\x43\xc9\xec\xe9\x87\x69\
+\xd0\x27\xf2\xe8\x56\x2e\xa3\xd2\x39\x6b\x19\x6c\xac\x64\x80\x1e\
+\xe6\xdc\xe4\x26\x73\x26\x41\xb0\xa7\xa3\xc0\x11\x93\x10\x93\x89\
+\x84\xcb\xcb\xfc\x7a\xe9\x84\x4a\xb1\x2f\xc1\xb9\x23\x79\x74\x1c\
+\x4a\xb9\xee\x84\xbb\x86\x22\x7e\x7d\x6f\xc4\x48\xe4\x6f\x02\xb1\
+\x70\x47\x34\xd5\x24\xcc\x85\x99\x63\x85\xc1\x35\x92\xe9\x6e\xdf\
+\x80\xbc\xc9\x09\x53\xb2\xf0\xf1\x46\xae\x62\x4c\xc2\x84\x23\x66\
+\x5c\xaf\x9b\xf8\x03\x3b\xcb\x43\x45\x73\xb5\x57\x14\xbb\x3d\x49\
+\xd7\xfe\x65\x74\x01\xc8\xeb\xcd\xe7\xa4\x17\x6a\x24\x39\x66\x6f\
+\xd1\x80\xa5\xa1\xa0\x94\x6d\xf4\x8d\x94\x52\x7e\xbb\x68\x3f\x36\
+\x19\x63\x45\xde\xad\x91\xcf\xf0\xdb\x7a\xe6\x4c\x7e\x7f\xbd\xb8\
+\xe4\x0f\x74\x35\x74\x20\xef\xf1\x14\xc8\x62\x0f\x8c\x74\x08\xe1\
+\xd8\xd0\x1b\x47\x66\x00\xca\x20\x9f\xa4\x82\x08\xdf\x4e\x61\x7d\
+\x4d\xcd\x9a\x2b\x2e\xb9\x92\x1d\x7f\x8e\x88\x94\x9c\x99\x9c\x85\
+\x2e\x68\x14\xee\x24\x1c\xfd\x10\xf7\x84\xe4\x23\xf5\x52\x97\xe3\
+\x25\x37\xc9\xeb\xb0\x16\xd9\xee\xe9\x58\x76\x07\x9b\xb9\xd5\x1e\
+\x1f\x13\xc9\x2f\x08\xe2\xbe\x16\x4d\x49\x4d\x23\x0b\x70\x7d\x7f\
+\xa2\x15\x2e\x8c\x47\xba\xcf\x28\x44\x66\x61\x43\x8b\x0e\x9c\xaa\
+\x8c\x09\x39\x26\x6c\x5d\x42\xa4\x15\x94\x50\x47\xe6\x9c\x32\xdd\
+\x23\x2f\xfe\x28\x86\xd0\xbf\xd7\x1f\x22\x44\x0c\x33\x40\xb0\x15\
+\x87\xe2\xe0\xd7\xa9\x99\x76\x03\x85\xbb\x3e\x45\x2e\x64\x02\xdc\
+\x6b\x0f\xd8\xb0\xdc\x72\x23\x27\xa6\x14\xbe\x5e\x2a\x53\x66\x5e\
+\x0c\xcc\x57\x28\x06\x47\xc5\x96\x2d\x85\xd0\x0a\x27\xdc\xe6\x0e\
+\x93\x5f\xeb\x17\x48\xab\x5f\xd9\x10\xa0\xd0\x5f\xe8\x0f\x87\x6d\
+\x5f\x06\x70\x8d\x0a\xb3\x3d\x6e\x0f\x28\x75\x83\xc9\x52\x17\xe6\
+\x7e\xa6\x34\xa2\x49\x50\xe1\x68\x58\xb1\x62\x49\x2d\x0c\xbc\x5a\
+\xd2\x6d\x2b\x4a\x32\x31\x23\x19\x75\x8e\x24\xaa\x20\x1f\xf3\xaa\
+\x43\x05\x23\xc0\x30\xe6\x98\x39\xe9\xe7\x6a\x0f\x48\x7c\x81\x6b\
+\xbf\x7a\x29\x58\xc6\x52\xb1\x72\x57\x2c\x44\xb9\x23\x0a\x44\x9c\
+\x7e\x21\x95\x19\x64\x8d\x2a\x38\x57\x7f\xf8\xfb\x55\xb8\x8d\x6c\
+\x7d\xee\x64\xf2\xb7\xa4\xa4\x65\xcd\x8a\x73\x16\xa2\x5a\xec\x44\
+\xe6\xb9\xef\xc7\xfb\xb9\xb1\xa9\xc8\x05\x26\x61\xbd\x89\x1f\x72\
+\x29\x69\x48\x89\x38\xe2\x5f\xf1\x0b\xde\x7d\x7f\x74\xef\x45\xa3\
+\xc5\x2b\x46\x0d\x70\x77\x7b\xe7\xd8\x4a\x71\xa5\x06\xad\x20\x78\
+\x7a\x99\x04\xa1\x26\x1c\xee\x4f\x71\x54\x72\xae\x22\x69\xff\xb4\
+\x34\x8c\xa4\x87\xea\xcb\x29\x42\x87\xd3\xc9\x28\xa6\x9f\x32\xac\
+\xe9\x68\xc8\x24\x1d\x2f\x45\xba\x2f\x41\x91\x73\xcc\x8c\xe4\xde\
+\xcb\x5d\x8b\x57\x32\xc4\xae\xd6\xac\x65\x3d\x91\x1e\x90\xc9\x7a\
+\xfd\x07\x0d\x07\x7b\xba\x86\x86\xf0\x90\x59\x23\xe6\x74\x03\xfc\
+\x33\x91\x53\xd6\x0d\xb8\x15\x9d\x2c\x2e\x48\x05\xa1\xb4\xd2\x0f\
+\x89\x84\x13\xb3\x11\x36\x44\x42\xe4\x37\x94\xff\x3a\x7e\x85\xf7\
+\xf3\xca\x86\x20\x4c\xd8\xc5\xc2\xab\x69\x05\x4c\xd1\xb2\x1f\x67\
+\xa8\x83\xbc\xaf\xda\xe0\xeb\xc5\x7e\x59\x54\x2b\x79\x45\x24\x9a\
+\xc6\x99\xd0\x8a\x7a\x30\xcf\x67\x13\x0d\x0c\xba\xf3\x0a\x84\x5c\
+\x5c\xc9\xd0\x82\x01\x26\xbc\xc6\x2d\xf2\xcf\x79\xe6\xce\x84\x1f\
+\xd0\x10\xea\x9e\x0a\x63\x91\x76\x80\x51\xf6\xfb\x90\x5c\x80\xd2\
+\xf6\x2b\x54\xb5\x57\x07\x6a\x60\x36\x68\xc9\xb4\x74\xc4\x8c\x85\
+\xde\x6a\x64\x67\x43\xbf\x97\x2f\x61\x44\x2b\xe3\x6b\x3b\x31\xd8\
+\x2a\x84\xc8\x9e\xf1\x7f\x83\x37\x99\x7f\xa6\x9f\x41\x88\xfd\x41\
+\xa3\x06\x83\x89\x70\x5f\x21\xf4\xe9\xb2\x47\x9a\xfb\xb3\x61\x07\
+\x7b\x9a\x14\xfb\x8b\xca\x5c\x28\xd9\xd5\x8e\xdb\x49\x47\x1a\xea\
+\x52\x9f\x38\xf5\xcc\xcb\x3a\x40\x32\x3d\x89\xb8\x27\x26\x39\xd9\
+\xe9\xe7\xab\xdb\x9c\x3b\xdc\x22\xfd\x8d\xbb\x46\xda\xf7\x07\x3f\
+\x11\x2a\xd8\x3f\x96\xa1\x14\xff\xc4\xa2\x41\xa6\x61\xd9\x57\x42\
+\x1c\x6e\xe3\x73\x83\x31\x07\xcb\x50\xf8\x4b\x09\xf3\xba\x11\xfe\
+\x6d\x2c\x86\x68\xc2\xf9\x4a\x43\xfb\xc6\x89\x43\xed\x04\xe2\x51\
+\x44\x64\x9c\x48\x22\x45\xd8\x32\xfa\xe3\x5e\x8d\xa0\x62\x6c\xc4\
+\x59\x35\x32\x5e\x9c\x0d\xea\x8f\xe1\xda\x4a\xbd\xa7\x8d\xbb\xe3\
+\xe0\x45\xec\xd6\xa1\x29\x81\xd9\x6c\x60\x60\xf7\x2a\xc9\xdd\x01\
+\x19\xd9\xc9\x89\xb2\x62\x8e\x5a\x96\x1a\xa6\xcc\x99\x91\xa8\x97\
+\x6c\xe8\xbe\x6a\xad\xb1\x93\xe8\x8f\x49\xc8\x44\x12\x29\x62\x4a\
+\x4e\x21\xf9\x5e\x3f\x3c\xdd\x2b\x9f\xfa\x5e\x44\x24\x29\xd8\xae\
+\x8b\xd1\x27\x65\x56\xc0\x7c\x27\xe4\x0f\x47\x25\xd8\x63\xaf\x74\
+\xec\xf9\xd4\x1b\x09\xd8\x08\xb8\x57\x07\x66\xb7\x23\xe1\x94\x9f\
+\xf2\x9a\x0c\x4d\x1f\x2e\xb0\x50\x3f\x5e\xd4\xe8\x67\x32\x62\xd2\
+\x40\x2f\xad\x45\x97\xb8\x17\xed\x4b\x84\xd5\xdf\x4b\xf1\x9a\x70\
+\x36\x5c\xd0\xad\x66\xb0\x43\x41\x05\xb2\xea\x90\x4c\x62\x65\xdd\
+\x4d\x33\x18\x73\x69\x82\x78\x5b\x3f\xf4\x38\x62\xc2\x9c\xec\x33\
+\x33\xd8\xdc\xe3\x7e\xec\xf0\xd9\x17\xd8\x31\x31\x19\x99\x34\xde\
+\x4a\x2a\x12\x29\x85\xfd\xbf\xb9\x64\x85\x3b\x3e\x6e\xb4\xb7\x9a\
+\x46\x0f\x4c\xd1\x5f\xa9\x36\x0c\xad\x74\xe2\x10\x2b\xa9\x37\x1a\
+\x69\x05\xb7\xf2\x7f\x23\x54\xf9\x88\x88\x11\x47\x9c\x70\x4c\xfa\
+\x9b\x67\x13\x41\x7e\x50\x43\xb8\x3d\xb4\xb8\x4f\x75\x3b\x4a\x79\
+\x79\x6d\xd0\xd4\x37\x18\xe9\x3c\x45\xc1\x11\x12\x98\xb8\xec\x65\
+\x99\x0c\x16\x5b\xba\x60\xba\x56\xce\x85\x4f\xbf\xbd\x5a\xaa\x5f\
+\xde\x5e\x51\x88\x57\xe9\x48\xd0\xa4\x4c\x38\xe6\x58\xe8\xe6\x1d\
+\xea\x15\x62\xc6\x2b\x5e\x8d\x7e\x05\xa5\x97\xfd\x6e\x45\x0e\xd6\
+\xc9\xf4\xb6\x93\x37\xee\xe9\x22\x91\xb0\x2a\xa3\xbd\x36\xdd\x4e\
+\x65\x12\x38\x58\x80\xb8\xbb\x3a\x48\x17\xa3\xa3\xa1\x60\x45\x25\
+\x6c\xfd\x62\xb0\x7f\xc9\x2b\x0b\x4d\x99\x92\xfc\x7e\xc7\xa0\x74\
+\x2f\x1d\x37\x5e\xbe\xd6\x08\x75\xa6\x91\xdd\xbb\xde\x3f\xf4\xe6\
+\xe9\x04\x52\x6f\x05\x27\xf0\x53\xe6\xbe\xa9\xdb\x53\xce\xa2\xd0\
+\xb5\xb4\x92\xa1\xee\x66\x7f\x9c\x9c\xae\xdd\x32\xe4\x35\x50\xb1\
+\x65\x2d\x27\xa2\x5f\x26\x60\x24\x6c\x66\xa2\x7f\x13\x7f\xa4\x0e\
+\x62\xd4\xdf\x20\xc5\xd6\xc1\x59\x76\x32\x4a\xd0\x0a\x66\x69\x25\
+\x9d\xd2\xa1\xfe\xf0\x49\x50\x26\xdb\x12\x9c\xb4\x89\x23\x52\xa9\
+\x33\x1a\x59\x73\xde\x27\x69\x8d\x24\xd4\x05\xb0\x61\xcd\x1a\x4d\
+\xc9\x5a\x88\x20\x3b\x69\x60\x25\x52\xc4\xa9\x68\x6d\x9a\x01\x26\
+\x62\xff\x76\x45\x57\xbf\x33\xcd\x88\x92\x59\x1c\x9a\x3b\x9d\xd4\
+\x10\x56\x00\xfc\x3e\xf1\x49\x05\xa1\x56\x02\xed\x2b\x61\x34\x34\
+\x72\xe3\x9d\x74\x2a\x6b\xd9\x93\x50\x00\xa5\xb0\xf2\x3d\xac\x57\
+\x0b\x60\xe7\x45\x47\x8d\xf8\xa2\xa7\x89\xf2\xee\x60\x01\xef\x0f\
+\x60\x88\xa1\x7b\xdc\x29\x9b\xfa\x43\x5c\xa2\x65\x69\xba\x95\xb2\
+\xa7\xa6\x46\xcb\x0c\x76\x23\x8a\xb7\x1e\x48\xa9\x65\x54\x35\x15\
+\x78\x35\x21\x61\x11\xbe\xd6\xca\x89\x68\xd1\x82\x48\x79\xde\xe4\
+\x15\x4b\x6a\x99\xfc\xed\xb3\x58\x9f\x95\xf4\xdb\x04\x73\x51\xcc\
+\xcd\xb8\x2d\x43\x94\x4a\x68\xa6\xee\x87\x86\xea\x54\xc0\x79\xf4\
+\x60\x25\x25\x03\x8e\xad\x21\x16\xf5\x28\x1d\x6a\x91\x2e\x50\x47\
+\x54\x98\xea\xf3\x12\x49\x7d\x83\xb6\x1f\x3b\xb0\x92\x84\x69\x59\
+\x6b\x6d\x25\x44\x76\xa2\x6b\xeb\x85\x9e\x0b\x3a\xe9\x86\xd9\x30\
+\x2e\xe1\x2f\x52\x27\x2e\x3b\xe6\xfb\xfd\x8a\x9e\xe7\x16\x9f\x3e\
+\x21\x84\xbd\x6b\x3d\x01\x3c\x95\x26\x8d\x77\x8d\xad\x88\x26\xfa\
+\x99\x2c\x8f\x47\x55\x61\x74\xc0\x61\x44\xbf\xce\x0f\x92\x20\x6a\
+\x44\x91\x9c\x26\xa4\xcd\xd7\x70\xc9\x8a\x95\xcc\x73\x55\x58\xaa\
+\x81\xe9\xbd\x77\xf0\x17\xc9\xf3\x71\xd3\xff\xf0\xa3\x19\xe2\x90\
+\x8c\x2c\x9c\xa8\x4f\x7b\x9c\x40\xef\x7d\x9e\x16\xf9\x95\xbe\x2a\
+\x30\x52\x23\x74\x41\x72\x7e\x2b\x25\x92\xe7\x4d\x8c\x38\x0a\xfb\
+\xc2\xbd\x21\x12\xa0\xa4\x61\xc5\x15\x2b\x6a\x61\xdd\xd6\x92\x52\
+\x39\x69\xfb\x1b\x51\x2b\x8d\xa5\x57\x52\x13\x7b\x1d\x8a\x2f\x7e\
+\x34\x43\xec\x17\xdf\x04\xd2\x46\xdf\xb9\xe8\x8f\xb5\x92\xcc\x31\
+\x91\x50\xd8\x4f\x73\x69\x31\xc2\x8e\x51\xe9\x27\x34\x3a\xb6\x6c\
+\x89\x29\x88\x45\x6a\xd3\x57\x25\x33\x5a\xb6\x2c\xb9\x64\xc1\x46\
+\xb6\xce\x56\x92\xa5\xd8\xa0\x33\x61\x84\x4b\x67\xa4\x6d\x68\x84\
+\x4d\xa1\xf9\x91\x0d\xc1\x60\x8f\x96\x0e\x3d\x8d\xbe\xba\xec\xd9\
+\x29\xb1\xf4\x34\xfb\x1b\x6f\x05\x4a\xab\x83\x06\x80\x96\x36\x7e\
+\x2b\xca\xd6\x4a\x9a\xbe\xb1\x78\x0e\xc7\x94\x8a\x25\x4b\x56\x6c\
+\xc4\x5d\x36\x61\x72\x18\xd1\x3e\xd2\x03\x95\x81\x26\x94\x76\xd9\
+\x8f\x6b\x08\xb7\x47\x1e\xb3\xd4\x1f\x64\x5f\x40\xf7\x49\x23\x47\
+\xd4\x0d\x1a\x74\x7e\x9b\xa2\x7e\x4a\x70\xa5\x0e\x07\x1a\x61\xcb\
+\x1a\x99\xd6\xea\x58\x8b\x98\x78\x22\x18\x65\x2a\x02\x7b\xb5\xb0\
+\x5f\x90\x3c\x03\x21\x94\xf5\x1a\xec\x4a\xce\x99\xef\x8d\xf8\x7a\
+\x27\x82\x1f\xd3\x10\x7d\x82\xe2\x6b\xbe\xd5\x1f\xdc\x67\xe6\x37\
+\x3d\x10\x12\x53\x85\xd0\xba\x5b\x45\xd9\xc9\x74\xae\x3f\x07\xad\
+\x9c\x1f\x23\x88\x55\x5f\xbe\x57\x28\xa9\x1a\x2a\x59\x8e\x57\x0d\
+\x56\x0f\xda\xbd\x15\x44\xbb\x2c\xf6\xb0\xb3\xe6\x13\xb0\x5e\x6e\
+\xf4\x47\x33\x84\x93\x14\xd8\xa0\xa9\xf9\x8b\xfb\x9a\x2d\xff\xee\
+\x93\x63\xa9\xf9\x5a\xd9\xba\xaa\x84\x41\xe7\x24\x7a\x6b\x12\x2a\
+\xb6\x28\x51\x83\x4b\x24\x1c\x5a\x3a\xe2\xa0\x20\x13\xcb\x46\x56\
+\xbf\x18\xc2\xca\x49\xe8\x85\x76\x86\xab\xb6\x75\xc0\xc3\x34\x3d\
+\x4f\xbb\x0f\xd2\x9d\x44\x27\xaf\xaa\xa8\x9f\x8a\x6b\xdf\xcd\xf6\
+\x78\xce\x98\x82\x7b\x6a\x99\x6d\xcd\xa5\xfb\x33\x7f\xe2\x5b\x7e\
+\x4a\x45\xf5\x89\x0d\x9e\x82\x01\x04\xa7\x43\x36\x69\x44\xf0\xa6\
+\x8f\x34\xdd\x80\x07\xd9\x4f\x62\x79\x44\x61\x26\xe2\xbd\x9d\x90\
+\xc8\x75\x58\x26\xc1\x80\x4e\x60\x0e\x74\xaf\x76\x25\x7b\x26\x84\
+\xb3\x5e\xdc\x75\x58\xb6\xbd\xc2\x89\xd8\x0f\x90\x3b\xce\x91\xc3\
+\xb2\x70\x0b\x2e\xf8\x67\xfe\x09\xc5\xbb\xfc\x9c\xe3\x01\xbc\x46\
+\xc8\xe4\x7a\xb3\xf4\xb1\x21\x11\xd8\x2d\x92\x1a\x40\xc9\x8a\xed\
+\xed\x20\xb8\x36\x02\xb3\x19\x72\xb9\x2e\x5d\xd8\xe5\xea\x06\x68\
+\xa6\x19\x0c\x1e\xa9\xbd\xde\x3b\x42\x27\x88\x48\x19\xc9\xc6\xa8\
+\xe1\x93\xfe\x1e\x99\xe5\x2e\x3f\xef\x28\x3e\xa8\xfe\x70\xc9\x1f\
+\xf9\x92\x33\xfe\xcc\x25\xbf\xe0\x7f\xe5\x5d\x52\xb6\x94\x32\x82\
+\x14\x0d\x58\x6c\x04\x69\x1c\x5f\x1a\xa7\x02\xca\x27\xc2\xa0\xf4\
+\xdc\x88\x9d\x80\x8f\x4f\xd5\x1f\x61\x84\x79\x5d\xcb\xa2\x80\xbe\
+\xfe\x70\x62\xd8\xe1\xe2\xc4\x43\x05\x2c\x47\x25\x9a\x65\x89\x08\
+\xba\xb8\x01\x14\x7c\x1d\xf3\xef\xa5\xa8\x43\x16\x47\xc5\xa5\x7b\
+\xc8\x39\x5f\xf2\x57\xbe\xe6\x9c\x98\x9f\xf3\xbf\xf1\x26\x0d\x2d\
+\x0b\x59\xe6\xa0\x83\x7e\x84\x0a\xab\xb2\x75\xc8\x34\x7a\x8a\x7a\
+\x22\x99\x42\x44\xc4\x56\x8a\xea\x2a\xc8\xff\xf5\x88\xb4\xa7\x79\
+\x58\xe9\x7c\x31\x70\xc1\xc3\x85\x73\x7a\xef\x74\x20\x9a\xa7\x8a\
+\x8a\x52\xe8\xa6\xfa\x80\xc0\xf2\xca\x27\x42\x63\xd9\x7e\xb0\xfe\
+\xc3\x05\xdf\xf0\x15\x0f\xb8\xa4\xe2\x92\x4b\x7e\xc2\xff\xc9\xbf\
+\x25\x66\x03\x32\x97\xa3\x65\x34\x69\x08\xe9\x32\xe8\x7d\xba\xc0\
+\x91\x31\x52\x76\xc5\x14\xc2\x89\x69\xc2\x10\x5a\x3c\x10\x57\xf1\
+\x9a\xa8\x2a\x4c\x10\xab\xc1\xe2\x6b\xb5\x17\x3a\x77\xff\xa4\xd2\
+\xf4\x6b\xf6\xb6\x52\x3f\x8b\x29\xfe\x12\x86\xa8\x59\xb8\x6f\xf8\
+\x0b\x8f\x38\xe3\x9c\x0d\x35\x4f\xd8\xf0\x26\xff\x3b\x3f\x93\x8d\
+\xcb\x88\xcc\x8a\xf7\xd6\xf1\xc1\x8f\x8c\xf7\xdc\xd9\xee\x29\x6a\
+\xf9\x68\x47\x41\x2a\x93\xfa\x8d\x34\xfd\xeb\x80\x5e\xec\xc8\x24\
+\xf6\x29\xb2\xda\xee\x3c\x0c\x77\x91\x97\x72\x36\x5b\x16\x3c\xa4\
+\x70\x37\xdf\x4f\xee\xc5\x83\xc7\xfa\xca\x08\xd5\x63\xf7\x0d\xff\
+\xcc\x1f\x45\x16\x53\x73\xc1\x97\x8c\xf8\x3f\xf8\xbf\x48\xb8\x12\
+\x3c\xb0\x92\x2f\x31\xd2\x89\x3a\xfc\x56\x36\x60\x01\x3b\x49\x0c\
+\x2b\xd2\x1b\x37\xa9\x99\x30\x66\xcc\x39\x89\x2c\x1c\xd1\xa2\x38\
+\xd5\x84\xb0\x69\xaf\xd9\xd8\xd6\xb7\x15\xf7\x4f\xc4\x56\x46\xe7\
+\xd6\xdc\xe3\x02\xf8\x8f\x5f\x4d\x98\xaa\x68\xaf\x0e\x7a\x09\x43\
+\xf8\x36\x6b\x73\xd7\x7e\xfc\xff\xf0\x47\xfe\x2c\xd4\xe0\x46\xda\
+\xef\x6f\xf3\xaf\x70\xac\x83\xb0\xa7\xef\x53\x44\x68\x6a\xb1\xe1\
+\x6e\x3f\x67\x3b\x98\xc1\xe8\x84\x89\xb9\x3b\x11\x09\x15\x23\x66\
+\x1c\xb3\xe4\x88\x05\x5b\x1e\xb3\x64\x1b\xe4\xc5\xd5\xde\x4e\x7a\
+\xb5\xa7\x4d\xa0\x44\x21\x64\x5f\x46\x32\xa6\xa6\x60\x4e\xc6\x82\
+\xff\xca\x37\xac\xf9\x37\xfc\x9d\xbb\xa1\x7a\xe5\x55\x2d\x2a\xb9\
+\x2a\xd0\xd2\x77\x5b\x67\xaf\xc9\x23\x2a\x56\xce\x6b\xdd\x3f\x66\
+\x41\x49\x1b\x10\x24\x98\x73\x2a\xea\x3e\x26\x88\xa3\x20\xd9\xc2\
+\x7e\x57\x0b\x49\x88\x6d\x20\x07\x0c\x57\xd2\xfa\x29\x8d\x2c\x34\
+\xf0\xfc\xc0\x5a\xce\x82\x95\x88\x67\x94\xc1\x59\xda\xf0\x3d\x76\
+\x6d\xc2\x61\x66\xa9\x42\xae\x59\x0b\xeb\xaa\xa5\xe1\x82\xc7\xfc\
+\xdf\x9c\x63\x79\xdf\xcd\x19\xa9\xdd\xf0\x33\xd2\x5e\xec\x88\x04\
+\x40\xba\xbe\x17\xf6\x3f\x00\xe1\x00\x14\x01\xde\x26\x16\xb2\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\x08\
+\x0b\x77\x5a\x87\
+\x00\x68\
+\x00\x65\x00\x61\x00\x64\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\x01\x00\x00\x00\x02\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/graphicsview/dragdroprobot/images/head.png b/examples/widgets/graphicsview/dragdroprobot/images/head.png
new file mode 100644
index 000000000..1e520e09b
--- /dev/null
+++ b/examples/widgets/graphicsview/dragdroprobot/images/head.png
Binary files differ
diff --git a/examples/widgets/graphicsview/elasticnodes.py b/examples/widgets/graphicsview/elasticnodes.py
new file mode 100755
index 000000000..8da21334b
--- /dev/null
+++ b/examples/widgets/graphicsview/elasticnodes.py
@@ -0,0 +1,414 @@
+#!/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$
+##
+#############################################################################
+
+import sys
+import weakref
+import math
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Edge(QtWidgets.QGraphicsItem):
+ Pi = math.pi
+ TwoPi = 2.0 * Pi
+
+ Type = QtWidgets.QGraphicsItem.UserType + 2
+
+ def __init__(self, sourceNode, destNode):
+ QtWidgets.QGraphicsItem.__init__(self)
+
+ self.arrowSize = 10.0
+ self.sourcePoint = QtCore.QPointF()
+ self.destPoint = QtCore.QPointF()
+ self.setAcceptedMouseButtons(QtCore.Qt.NoButton)
+ self.source = weakref.ref(sourceNode)
+ self.dest = weakref.ref(destNode)
+ self.source().addEdge(self)
+ self.dest().addEdge(self)
+ self.adjust()
+
+ def type(self):
+ return Edge.Type
+
+ def sourceNode(self):
+ return self.source()
+
+ def setSourceNode(self, node):
+ self.source = weakref.ref(node)
+ self.adjust()
+
+ def destNode(self):
+ return self.dest()
+
+ def setDestNode(self, node):
+ self.dest = weakref.ref(node)
+ self.adjust()
+
+ def adjust(self):
+ if not self.source() or not self.dest():
+ return
+
+ line = QtCore.QLineF(self.mapFromItem(self.source(), 0, 0), self.mapFromItem(self.dest(), 0, 0))
+ length = line.length()
+
+ if length == 0.0:
+ return
+
+ edgeOffset = QtCore.QPointF((line.dx() * 10) / length, (line.dy() * 10) / length)
+
+ self.prepareGeometryChange()
+ self.sourcePoint = line.p1() + edgeOffset
+ self.destPoint = line.p2() - edgeOffset
+
+ def boundingRect(self):
+ if not self.source() or not self.dest():
+ return QtCore.QRectF()
+
+ penWidth = 1
+ extra = (penWidth + self.arrowSize) / 2.0
+
+ return QtCore.QRectF(self.sourcePoint,
+ QtCore.QSizeF(self.destPoint.x() - self.sourcePoint.x(),
+ self.destPoint.y() - self.sourcePoint.y())).normalized().adjusted(-extra, -extra, extra, extra)
+
+ def paint(self, painter, option, widget):
+ if not self.source() or not self.dest():
+ return
+
+ # Draw the line itself.
+ line = QtCore.QLineF(self.sourcePoint, self.destPoint)
+
+ if line.length() == 0.0:
+ return
+
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
+ painter.drawLine(line)
+
+ # Draw the arrows if there's enough room.
+ angle = math.acos(line.dx() / line.length())
+ if line.dy() >= 0:
+ angle = Edge.TwoPi - angle
+
+ sourceArrowP1 = self.sourcePoint + QtCore.QPointF(math.sin(angle + Edge.Pi / 3) * self.arrowSize,
+ math.cos(angle + Edge.Pi / 3) * self.arrowSize)
+ sourceArrowP2 = self.sourcePoint + QtCore.QPointF(math.sin(angle + Edge.Pi - Edge.Pi / 3) * self.arrowSize,
+ math.cos(angle + Edge.Pi - Edge.Pi / 3) * self.arrowSize);
+ destArrowP1 = self.destPoint + QtCore.QPointF(math.sin(angle - Edge.Pi / 3) * self.arrowSize,
+ math.cos(angle - Edge.Pi / 3) * self.arrowSize)
+ destArrowP2 = self.destPoint + QtCore.QPointF(math.sin(angle - Edge.Pi + Edge.Pi / 3) * self.arrowSize,
+ math.cos(angle - Edge.Pi + Edge.Pi / 3) * self.arrowSize)
+
+ painter.setBrush(QtCore.Qt.black)
+ painter.drawPolygon(QtGui.QPolygonF([line.p1(), sourceArrowP1, sourceArrowP2]))
+ painter.drawPolygon(QtGui.QPolygonF([line.p2(), destArrowP1, destArrowP2]))
+
+
+class Node(QtWidgets.QGraphicsItem):
+ Type = QtWidgets.QGraphicsItem.UserType + 1
+
+ def __init__(self, graphWidget):
+ QtWidgets.QGraphicsItem.__init__(self)
+
+ self.graph = weakref.ref(graphWidget)
+ self.edgeList = []
+ self.newPos = QtCore.QPointF()
+ self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
+ self.setFlag(QtWidgets.QGraphicsItem.ItemSendsGeometryChanges)
+ self.setCacheMode(self.DeviceCoordinateCache)
+ self.setZValue(-1)
+
+ def type(self):
+ return Node.Type
+
+ def addEdge(self, edge):
+ self.edgeList.append(weakref.ref(edge))
+ edge.adjust()
+
+ def edges(self):
+ return self.edgeList
+
+ def calculateForces(self):
+ if not self.scene() or self.scene().mouseGrabberItem() is self:
+ self.newPos = self.pos()
+ return
+
+ # Sum up all forces pushing this item away.
+ xvel = 0.0
+ yvel = 0.0
+ for item in self.scene().items():
+ if not isinstance(item, Node):
+ continue
+
+ line = QtCore.QLineF(self.mapFromItem(item, 0, 0), QtCore.QPointF(0, 0))
+ dx = line.dx()
+ dy = line.dy()
+ l = 2.0 * (dx * dx + dy * dy)
+ if l > 0:
+ xvel += (dx * 150.0) / l
+ yvel += (dy * 150.0) / l
+
+ # Now subtract all forces pulling items together.
+ weight = (len(self.edgeList) + 1) * 10.0
+ for edge in self.edgeList:
+ if edge().sourceNode() is self:
+ pos = self.mapFromItem(edge().destNode(), 0, 0)
+ else:
+ pos = self.mapFromItem(edge().sourceNode(), 0, 0)
+ xvel += pos.x() / weight
+ yvel += pos.y() / weight
+
+ if QtCore.qAbs(xvel) < 0.1 and QtCore.qAbs(yvel) < 0.1:
+ xvel = yvel = 0.0
+
+ sceneRect = self.scene().sceneRect()
+ self.newPos = self.pos() + QtCore.QPointF(xvel, yvel)
+ self.newPos.setX(min(max(self.newPos.x(), sceneRect.left() + 10), sceneRect.right() - 10))
+ self.newPos.setY(min(max(self.newPos.y(), sceneRect.top() + 10), sceneRect.bottom() - 10))
+
+ def advance(self):
+ if self.newPos == self.pos():
+ return False
+
+ self.setPos(self.newPos)
+ return True
+
+ def boundingRect(self):
+ adjust = 2.0
+ return QtCore.QRectF(-10 - adjust, -10 - adjust,
+ 23 + adjust, 23 + adjust)
+
+ def shape(self):
+ path = QtGui.QPainterPath()
+ path.addEllipse(-10, -10, 20, 20)
+ return path
+
+ def paint(self, painter, option, widget):
+ painter.setPen(QtCore.Qt.NoPen)
+ painter.setBrush(QtCore.Qt.darkGray)
+ painter.drawEllipse(-7, -7, 20, 20)
+
+ gradient = QtGui.QRadialGradient(-3, -3, 10)
+ if option.state & QtWidgets.QStyle.State_Sunken:
+ gradient.setCenter(3, 3)
+ gradient.setFocalPoint(3, 3)
+ gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.yellow).lighter(120))
+ gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.darkYellow).lighter(120))
+ else:
+ gradient.setColorAt(0, QtCore.Qt.yellow)
+ gradient.setColorAt(1, QtCore.Qt.darkYellow)
+
+ painter.setBrush(QtGui.QBrush(gradient))
+ painter.setPen(QtGui.QPen(QtCore.Qt.black, 0))
+ painter.drawEllipse(-10, -10, 20, 20)
+
+ def itemChange(self, change, value):
+ if change == QtWidgets.QGraphicsItem.ItemPositionChange:
+ for edge in self.edgeList:
+ edge().adjust()
+ self.graph().itemMoved()
+
+ return QtWidgets.QGraphicsItem.itemChange(self, change, value)
+
+ def mousePressEvent(self, event):
+ self.update()
+ QtWidgets.QGraphicsItem.mousePressEvent(self, event)
+
+ def mouseReleaseEvent(self, event):
+ self.update()
+ QtWidgets.QGraphicsItem.mouseReleaseEvent(self, event)
+
+
+class GraphWidget(QtWidgets.QGraphicsView):
+ def __init__(self):
+ QtWidgets.QGraphicsView.__init__(self)
+
+ self.timerId = 0
+
+ scene = QtWidgets.QGraphicsScene(self)
+ scene.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)
+ scene.setSceneRect(-200, -200, 400, 400)
+ self.setScene(scene)
+ self.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
+ self.setRenderHint(QtGui.QPainter.Antialiasing)
+ self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
+ self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorViewCenter)
+
+ node1 = Node(self)
+ node2 = Node(self)
+ node3 = Node(self)
+ node4 = Node(self)
+ self.centerNode = Node(self)
+ node6 = Node(self)
+ node7 = Node(self)
+ node8 = Node(self)
+ node9 = Node(self)
+ scene.addItem(node1)
+ scene.addItem(node2)
+ scene.addItem(node3)
+ scene.addItem(node4)
+ scene.addItem(self.centerNode)
+ scene.addItem(node6)
+ scene.addItem(node7)
+ scene.addItem(node8)
+ scene.addItem(node9)
+ scene.addItem(Edge(node1, node2))
+ scene.addItem(Edge(node2, node3))
+ scene.addItem(Edge(node2, self.centerNode))
+ scene.addItem(Edge(node3, node6))
+ scene.addItem(Edge(node4, node1))
+ scene.addItem(Edge(node4, self.centerNode))
+ scene.addItem(Edge(self.centerNode, node6))
+ scene.addItem(Edge(self.centerNode, node8))
+ scene.addItem(Edge(node6, node9))
+ scene.addItem(Edge(node7, node4))
+ scene.addItem(Edge(node8, node7))
+ scene.addItem(Edge(node9, node8))
+
+ node1.setPos(-50, -50)
+ node2.setPos(0, -50)
+ node3.setPos(50, -50)
+ node4.setPos(-50, 0)
+ self.centerNode.setPos(0, 0)
+ node6.setPos(50, 0)
+ node7.setPos(-50, 50)
+ node8.setPos(0, 50)
+ node9.setPos(50, 50)
+
+ self.scale(0.8, 0.8)
+ self.setMinimumSize(400, 400)
+ self.setWindowTitle(self.tr("Elastic Nodes"))
+
+ def itemMoved(self):
+ if not self.timerId:
+ self.timerId = self.startTimer(1000 / 25)
+
+ def keyPressEvent(self, event):
+ key = event.key()
+
+ if key == QtCore.Qt.Key_Up:
+ self.centerNode.moveBy(0, -20)
+ elif key == QtCore.Qt.Key_Down:
+ self.centerNode.moveBy(0, 20)
+ elif key == QtCore.Qt.Key_Left:
+ self.centerNode.moveBy(-20, 0)
+ elif key == QtCore.Qt.Key_Right:
+ self.centerNode.moveBy(20, 0)
+ elif key == QtCore.Qt.Key_Plus:
+ self.scaleView(1.2)
+ elif key == QtCore.Qt.Key_Minus:
+ self.scaleView(1 / 1.2)
+ elif key == QtCore.Qt.Key_Space or key == QtCore.Qt.Key_Enter:
+ for item in self.scene().items():
+ if isinstance(item, Node):
+ item.setPos(-150 + QtCore.qrand() % 300, -150 + QtCore.qrand() % 300)
+ else:
+ QtWidgets.QGraphicsView.keyPressEvent(self, event)
+
+
+ def timerEvent(self, event):
+ nodes = [item for item in self.scene().items() if isinstance(item, Node)]
+
+ for node in nodes:
+ node.calculateForces()
+
+ itemsMoved = False
+ for node in nodes:
+ if node.advance():
+ itemsMoved = True
+
+ if not itemsMoved:
+ self.killTimer(self.timerId)
+ self.timerId = 0
+
+ def wheelEvent(self, event):
+ self.scaleView(math.pow(2.0, -event.delta() / 240.0))
+
+ def drawBackground(self, painter, rect):
+ # Shadow.
+ sceneRect = self.sceneRect()
+ rightShadow = QtCore.QRectF(sceneRect.right(), sceneRect.top() + 5, 5, sceneRect.height())
+ bottomShadow = QtCore.QRectF(sceneRect.left() + 5, sceneRect.bottom(), sceneRect.width(), 5)
+ if rightShadow.intersects(rect) or rightShadow.contains(rect):
+ painter.fillRect(rightShadow, QtCore.Qt.darkGray)
+ if bottomShadow.intersects(rect) or bottomShadow.contains(rect):
+ painter.fillRect(bottomShadow, QtCore.Qt.darkGray)
+
+ # Fill.
+ gradient = QtGui.QLinearGradient(sceneRect.topLeft(), sceneRect.bottomRight())
+ gradient.setColorAt(0, QtCore.Qt.white)
+ gradient.setColorAt(1, QtCore.Qt.lightGray)
+ painter.fillRect(rect.intersected(sceneRect), QtGui.QBrush(gradient))
+ painter.setBrush(QtCore.Qt.NoBrush)
+ painter.drawRect(sceneRect)
+
+ # Text.
+ textRect = QtCore.QRectF(sceneRect.left() + 4, sceneRect.top() + 4,
+ sceneRect.width() - 4, sceneRect.height() - 4)
+ message = self.tr("Click and drag the nodes around, and zoom with the "
+ "mouse wheel or the '+' and '-' keys")
+
+ font = painter.font()
+ font.setBold(True)
+ font.setPointSize(14)
+ painter.setFont(font)
+ painter.setPen(QtCore.Qt.lightGray)
+ painter.drawText(textRect.translated(2, 2), message)
+ painter.setPen(QtCore.Qt.black)
+ painter.drawText(textRect, message)
+
+ def scaleView(self, scaleFactor):
+ factor = self.matrix().scale(scaleFactor, scaleFactor).mapRect(QtCore.QRectF(0, 0, 1, 1)).width()
+
+ if factor < 0.07 or factor > 100:
+ return
+
+ self.scale(scaleFactor, scaleFactor)
+
+
+if __name__ == "__main__":
+ app = QtWidgets.QApplication(sys.argv)
+ QtCore.qsrand(QtCore.QTime(0,0,0).secsTo(QtCore.QTime.currentTime()))
+
+ widget = GraphWidget()
+ widget.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/addressbook/adddialogwidget.py b/examples/widgets/itemviews/addressbook/adddialogwidget.py
new file mode 100644
index 000000000..c0dcaf6c0
--- /dev/null
+++ b/examples/widgets/itemviews/addressbook/adddialogwidget.py
@@ -0,0 +1,103 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtCore import Qt
+from PySide2.QtWidgets import (QDialog, QLabel, QTextEdit, QLineEdit,
+ QDialogButtonBox, QGridLayout, QVBoxLayout)
+
+class AddDialogWidget(QDialog):
+ """ A dialog to add a new address to the addressbook. """
+
+ def __init__(self, parent=None):
+ super(AddDialogWidget, self).__init__(parent)
+
+ nameLabel = QLabel("Name")
+ addressLabel = QLabel("Address")
+ buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
+ QDialogButtonBox.Cancel)
+
+ self.nameText = QLineEdit()
+ self.addressText = QTextEdit()
+
+ grid = QGridLayout()
+ grid.setColumnStretch(1, 2)
+ grid.addWidget(nameLabel, 0, 0)
+ grid.addWidget(self.nameText, 0, 1)
+ grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop)
+ grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft)
+
+ layout = QVBoxLayout()
+ layout.addLayout(grid)
+ layout.addWidget(buttonBox)
+
+ self.setLayout(layout)
+
+ self.setWindowTitle("Add a Contact")
+
+ buttonBox.accepted.connect(self.accept)
+ buttonBox.rejected.connect(self.reject)
+
+ # These properties make using this dialog a little cleaner. It's much
+ # nicer to type "addDialog.address" to retrieve the address as compared
+ # to "addDialog.addressText.toPlainText()"
+ @property
+ def name(self):
+ return self.nameText.text()
+
+ @property
+ def address(self):
+ return self.addressText.toPlainText()
+
+
+if __name__ == "__main__":
+ import sys
+ from PySide2.QtWidgets import QApplication
+
+ app = QApplication(sys.argv)
+
+ dialog = AddDialogWidget()
+ if (dialog.exec_()):
+ name = dialog.name
+ address = dialog.address
+ print("Name:" + name)
+ print("Address:" + address)
diff --git a/examples/widgets/itemviews/addressbook/addressbook.py b/examples/widgets/itemviews/addressbook/addressbook.py
new file mode 100644
index 000000000..f8927be5e
--- /dev/null
+++ b/examples/widgets/itemviews/addressbook/addressbook.py
@@ -0,0 +1,131 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import (QMainWindow, QAction, QFileDialog, QApplication)
+
+from addresswidget import AddressWidget
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super(MainWindow, self).__init__(parent)
+
+ self.addressWidget = AddressWidget()
+ self.setCentralWidget(self.addressWidget)
+ self.createMenus()
+ self.setWindowTitle("Address Book")
+
+ def createMenus(self):
+ # Create the main menuBar menu items
+ fileMenu = self.menuBar().addMenu("&File")
+ toolMenu = self.menuBar().addMenu("&Tools")
+
+ # Populate the File menu
+ openAction = self.createAction("&Open...", fileMenu, self.openFile)
+ saveAction = self.createAction("&Save As...", fileMenu, self.saveFile)
+ fileMenu.addSeparator()
+ exitAction = self.createAction("E&xit", fileMenu, self.close)
+
+ # Populate the Tools menu
+ addAction = self.createAction("&Add Entry...", toolMenu, self.addressWidget.addEntry)
+ self.editAction = self.createAction("&Edit Entry...", toolMenu, self.addressWidget.editEntry)
+ toolMenu.addSeparator()
+ self.removeAction = self.createAction("&Remove Entry", toolMenu, self.addressWidget.removeEntry)
+
+ # Disable the edit and remove menu items initially, as there are
+ # no items yet.
+ self.editAction.setEnabled(False)
+ self.removeAction.setEnabled(False)
+
+ # Wire up the updateActions slot
+ self.addressWidget.selectionChanged.connect(self.updateActions)
+
+ def createAction(self, text, menu, slot):
+ """ Helper function to save typing when populating menus
+ with action.
+ """
+ action = QAction(text, self)
+ menu.addAction(action)
+ action.triggered.connect(slot)
+ return action
+
+ # Quick gotcha:
+ #
+ # QFiledialog.getOpenFilename and QFileDialog.get.SaveFileName don't
+ # behave in PySide2 as they do in Qt, where they return a QString
+ # containing the filename.
+ #
+ # In PySide2, these functions return a tuple: (filename, filter)
+
+ def openFile(self):
+ filename, _ = QFileDialog.getOpenFileName(self)
+ if filename:
+ self.addressWidget.readFromFile(filename)
+
+ def saveFile(self):
+ filename, _ = QFileDialog.getSaveFileName(self)
+ if filename:
+ self.addressWidget.writeToFile(filename)
+
+ def updateActions(self, selection):
+ """ Only allow the user to remove or edit an item if an item
+ is actually selected.
+ """
+ indexes = selection.indexes()
+
+ if len(indexes) > 0:
+ self.removeAction.setEnabled(True)
+ self.editAction.setEnabled(True)
+ else:
+ self.removeAction.setEnabled(False)
+ self.editAction.setEnabled(False)
+
+
+if __name__ == "__main__":
+ """ Run the application. """
+ import sys
+ app = QApplication(sys.argv)
+ mw = MainWindow()
+ mw.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/addressbook/addresswidget.py b/examples/widgets/itemviews/addressbook/addresswidget.py
new file mode 100644
index 000000000..7ecd42e7d
--- /dev/null
+++ b/examples/widgets/itemviews/addressbook/addresswidget.py
@@ -0,0 +1,249 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+try:
+ import cpickle as pickle
+except ImportError:
+ import pickle
+
+from PySide2.QtCore import (Qt, Signal, QRegExp, QModelIndex,
+ QItemSelection, QItemSelectionModel, QSortFilterProxyModel)
+from PySide2.QtWidgets import (QWidget, QTabWidget, QMessageBox, QTableView,
+ QAbstractItemView)
+
+from tablemodel import TableModel
+from newaddresstab import NewAddressTab
+from adddialogwidget import AddDialogWidget
+
+
+class AddressWidget(QTabWidget):
+ """ The central widget of the application. Most of the addressbook's
+ functionality is contained in this class.
+ """
+
+ selectionChanged = Signal(QItemSelection)
+
+ def __init__(self, parent=None):
+ """ Initialize the AddressWidget. """
+ super(AddressWidget, self).__init__(parent)
+
+ self.tableModel = TableModel()
+ self.newAddressTab = NewAddressTab()
+ self.newAddressTab.sendDetails.connect(self.addEntry)
+
+ self.addTab(self.newAddressTab, "Address Book")
+
+ self.setupTabs()
+
+ def addEntry(self, name=None, address=None):
+ """ Add an entry to the addressbook. """
+ if name is None and address is None:
+ addDialog = AddDialogWidget()
+
+ if addDialog.exec_():
+ name = addDialog.name
+ address = addDialog.address
+
+ address = {"name": name, "address": address}
+ addresses = self.tableModel.addresses[:]
+
+ # The QT docs for this example state that what we're doing here
+ # is checking if the entered name already exists. What they
+ # (and we here) are actually doing is checking if the whole
+ # name/address pair exists already - ok for the purposes of this
+ # example, but obviously not how a real addressbook application
+ # should behave.
+ try:
+ addresses.remove(address)
+ QMessageBox.information(self, "Duplicate Name",
+ "The name \"%s\" already exists." % name)
+ except ValueError:
+ # The address didn't already exist, so let's add it to the model.
+
+ # Step 1: create the row
+ self.tableModel.insertRows(0)
+
+ # Step 2: get the index of the newly created row and use it.
+ # to set the name
+ ix = self.tableModel.index(0, 0, QModelIndex())
+ self.tableModel.setData(ix, address["name"], Qt.EditRole)
+
+ # Step 3: lather, rinse, repeat for the address.
+ ix = self.tableModel.index(0, 1, QModelIndex())
+ self.tableModel.setData(ix, address["address"], Qt.EditRole)
+
+ # Remove the newAddressTab, as we now have at least one
+ # address in the model.
+ self.removeTab(self.indexOf(self.newAddressTab))
+
+ # The screenshot for the QT example shows nicely formatted
+ # multiline cells, but the actual application doesn't behave
+ # quite so nicely, at least on Ubuntu. Here we resize the newly
+ # created row so that multiline addresses look reasonable.
+ tableView = self.currentWidget()
+ tableView.resizeRowToContents(ix.row())
+
+ def editEntry(self):
+ """ Edit an entry in the addressbook. """
+ tableView = self.currentWidget()
+ proxyModel = tableView.model()
+ selectionModel = tableView.selectionModel()
+
+ # Get the name and address of the currently selected row.
+ indexes = selectionModel.selectedRows()
+
+ for index in indexes:
+ row = proxyModel.mapToSource(index).row()
+ ix = self.tableModel.index(row, 0, QModelIndex())
+ name = self.tableModel.data(ix, Qt.DisplayRole)
+ ix = self.tableModel.index(row, 1, QModelIndex())
+ address = self.tableModel.data(ix, Qt.DisplayRole)
+
+ # Open an addDialogWidget, and only allow the user to edit the address.
+ addDialog = AddDialogWidget()
+ addDialog.setWindowTitle("Edit a Contact")
+
+ addDialog.nameText.setReadOnly(True)
+ addDialog.nameText.setText(name)
+ addDialog.addressText.setText(address)
+
+ # If the address is different, add it to the model.
+ if addDialog.exec_():
+ newAddress = addDialog.address
+ if newAddress != address:
+ ix = self.tableModel.index(row, 1, QModelIndex())
+ self.tableModel.setData(ix, newAddress, Qt.EditRole)
+
+ def removeEntry(self):
+ """ Remove an entry from the addressbook. """
+ tableView = self.currentWidget()
+ proxyModel = tableView.model()
+ selectionModel = tableView.selectionModel()
+
+ # Just like editEntry, but this time remove the selected row.
+ indexes = selectionModel.selectedRows()
+
+ for index in indexes:
+ row = proxyModel.mapToSource(index).row()
+ self.tableModel.removeRows(row)
+
+ # If we've removed the last address in the model, display the
+ # newAddressTab
+ if self.tableModel.rowCount() == 0:
+ self.insertTab(0, self.newAddressTab, "Address Book")
+
+ def setupTabs(self):
+ """ Setup the various tabs in the AddressWidget. """
+ groups = ["ABC", "DEF", "GHI", "JKL", "MNO", "PQR", "STU", "VW", "XYZ"]
+
+ for group in groups:
+ proxyModel = QSortFilterProxyModel(self)
+ proxyModel.setSourceModel(self.tableModel)
+ proxyModel.setDynamicSortFilter(True)
+
+ tableView = QTableView()
+ tableView.setModel(proxyModel)
+ tableView.setSortingEnabled(True)
+ tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
+ tableView.horizontalHeader().setStretchLastSection(True)
+ tableView.verticalHeader().hide()
+ tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ tableView.setSelectionMode(QAbstractItemView.SingleSelection)
+
+ # This here be the magic: we use the group name (e.g. "ABC") to
+ # build the regex for the QSortFilterProxyModel for the group's
+ # tab. The regex will end up looking like "^[ABC].*", only
+ # allowing this tab to display items where the name starts with
+ # "A", "B", or "C". Notice that we set it to be case-insensitive.
+ reFilter = "^[%s].*" % group
+
+ proxyModel.setFilterRegExp(QRegExp(reFilter, Qt.CaseInsensitive))
+ proxyModel.setFilterKeyColumn(0) # Filter on the "name" column
+ proxyModel.sort(0, Qt.AscendingOrder)
+
+ # This prevents an application crash (see: http://www.qtcentre.org/threads/58874-QListView-SelectionModel-selectionChanged-Crash)
+ viewselectionmodel = tableView.selectionModel()
+ tableView.selectionModel().selectionChanged.connect(self.selectionChanged)
+
+ self.addTab(tableView, group)
+
+ # Note: the QT example uses a QDataStream for the saving and loading.
+ # Here we're using a python dictionary to store the addresses, which
+ # can't be streamed using QDataStream, so we just use cpickle for this
+ # example.
+ def readFromFile(self, filename):
+ """ Read contacts in from a file. """
+ try:
+ f = open(filename, "rb")
+ addresses = pickle.load(f)
+ except IOError:
+ QMessageBox.information(self, "Unable to open file: %s" % filename)
+ finally:
+ f.close()
+
+ if len(addresses) == 0:
+ QMessageBox.information(self, "No contacts in file: %s" % filename)
+ else:
+ for address in addresses:
+ self.addEntry(address["name"], address["address"])
+
+ def writeToFile(self, filename):
+ """ Save all contacts in the model to a file. """
+ try:
+ f = open(filename, "wb")
+ pickle.dump(self.tableModel.addresses, f)
+
+ except IOError:
+ QMessageBox.information(self, "Unable to open file: %s" % filename)
+ finally:
+ f.close()
+
+
+if __name__ == "__main__":
+ import sys
+ from PySide2.QtWidgets import QApplication
+
+ app = QApplication(sys.argv)
+ addressWidget = AddressWidget()
+ addressWidget.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/addressbook/newaddresstab.py b/examples/widgets/itemviews/addressbook/newaddresstab.py
new file mode 100644
index 000000000..82dcff441
--- /dev/null
+++ b/examples/widgets/itemviews/addressbook/newaddresstab.py
@@ -0,0 +1,94 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtCore import (Qt, Signal)
+from PySide2.QtWidgets import (QWidget, QLabel, QPushButton, QVBoxLayout)
+
+from adddialogwidget import AddDialogWidget
+
+class NewAddressTab(QWidget):
+ """ An extra tab that prompts the user to add new contacts.
+ To be displayed only when there are no contacts in the model.
+ """
+
+ sendDetails = Signal(str, str)
+
+ def __init__(self, parent=None):
+ super(NewAddressTab, self).__init__(parent)
+
+ descriptionLabel = QLabel("There are no contacts in your address book."
+ "\nClick Add to add new contacts.")
+
+ addButton = QPushButton("Add")
+
+ layout = QVBoxLayout()
+ layout.addWidget(descriptionLabel)
+ layout.addWidget(addButton, 0, Qt.AlignCenter)
+
+ self.setLayout(layout)
+
+ addButton.clicked.connect(self.addEntry)
+
+ def addEntry(self):
+ addDialog = AddDialogWidget()
+
+ if addDialog.exec_():
+ name = addDialog.name
+ address = addDialog.address
+ self.sendDetails.emit(name, address)
+
+
+if __name__ == "__main__":
+
+ def printAddress(name, address):
+ print("Name:" + name)
+ print("Address:" + address)
+
+ import sys
+ from PySide2.QtWidgets import QApplication
+
+ app = QApplication(sys.argv)
+ newAddressTab = NewAddressTab()
+ newAddressTab.sendDetails.connect(printAddress)
+ newAddressTab.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/addressbook/tablemodel.py b/examples/widgets/itemviews/addressbook/tablemodel.py
new file mode 100644
index 000000000..24316f981
--- /dev/null
+++ b/examples/widgets/itemviews/addressbook/tablemodel.py
@@ -0,0 +1,147 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtCore import (Qt, QAbstractTableModel, QModelIndex)
+
+class TableModel(QAbstractTableModel):
+
+ def __init__(self, addresses=None, parent=None):
+ super(TableModel, self).__init__(parent)
+
+ if addresses is None:
+ self.addresses = []
+ else:
+ self.addresses = addresses
+
+ def rowCount(self, index=QModelIndex()):
+ """ Returns the number of rows the model holds. """
+ return len(self.addresses)
+
+ def columnCount(self, index=QModelIndex()):
+ """ Returns the number of columns the model holds. """
+ return 2
+
+ def data(self, index, role=Qt.DisplayRole):
+ """ Depending on the index and role given, return data. If not
+ returning data, return None (PySide equivalent of QT's
+ "invalid QVariant").
+ """
+ if not index.isValid():
+ return None
+
+ if not 0 <= index.row() < len(self.addresses):
+ return None
+
+ if role == Qt.DisplayRole:
+ name = self.addresses[index.row()]["name"]
+ address = self.addresses[index.row()]["address"]
+
+ if index.column() == 0:
+ return name
+ elif index.column() == 1:
+ return address
+
+ return None
+
+ def headerData(self, section, orientation, role=Qt.DisplayRole):
+ """ Set the headers to be displayed. """
+ if role != Qt.DisplayRole:
+ return None
+
+ if orientation == Qt.Horizontal:
+ if section == 0:
+ return "Name"
+ elif section == 1:
+ return "Address"
+
+ return None
+
+ def insertRows(self, position, rows=1, index=QModelIndex()):
+ """ Insert a row into the model. """
+ self.beginInsertRows(QModelIndex(), position, position + rows - 1)
+
+ for row in range(rows):
+ self.addresses.insert(position + row, {"name":"", "address":""})
+
+ self.endInsertRows()
+ return True
+
+ def removeRows(self, position, rows=1, index=QModelIndex()):
+ """ Remove a row from the model. """
+ self.beginRemoveRows(QModelIndex(), position, position + rows - 1)
+
+ del self.addresses[position:position+rows]
+
+ self.endRemoveRows()
+ return True
+
+ def setData(self, index, value, role=Qt.EditRole):
+ """ Adjust the data (set it to <value>) depending on the given
+ index and role.
+ """
+ if role != Qt.EditRole:
+ return False
+
+ if index.isValid() and 0 <= index.row() < len(self.addresses):
+ address = self.addresses[index.row()]
+ if index.column() == 0:
+ address["name"] = value
+ elif index.column() == 1:
+ address["address"] = value
+ else:
+ return False
+
+ self.dataChanged.emit(index, index, 0)
+ return True
+
+ return False
+
+ def flags(self, index):
+ """ Set the item flags at the given index. Seems like we're
+ implementing this function just to see how it's done, as we
+ manually adjust each tableView to have NoEditTriggers.
+ """
+ if not index.isValid():
+ return Qt.ItemIsEnabled
+ return Qt.ItemFlags(QAbstractTableModel.flags(self, index) |
+ Qt.ItemIsEditable)
diff --git a/examples/widgets/itemviews/basicsortfiltermodel.py b/examples/widgets/itemviews/basicsortfiltermodel.py
new file mode 100755
index 000000000..3051c9fa0
--- /dev/null
+++ b/examples/widgets/itemviews/basicsortfiltermodel.py
@@ -0,0 +1,203 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Window(QtWidgets.QWidget):
+ def __init__(self):
+ super(Window, self).__init__()
+
+ self.proxyModel = QtCore.QSortFilterProxyModel()
+ self.proxyModel.setDynamicSortFilter(True)
+
+ self.sourceGroupBox = QtWidgets.QGroupBox("Original Model")
+ self.proxyGroupBox = QtWidgets.QGroupBox("Sorted/Filtered Model")
+
+ self.sourceView = QtWidgets.QTreeView()
+ self.sourceView.setRootIsDecorated(False)
+ self.sourceView.setAlternatingRowColors(True)
+
+ self.proxyView = QtWidgets.QTreeView()
+ self.proxyView.setRootIsDecorated(False)
+ self.proxyView.setAlternatingRowColors(True)
+ self.proxyView.setModel(self.proxyModel)
+ self.proxyView.setSortingEnabled(True)
+
+ self.sortCaseSensitivityCheckBox = QtWidgets.QCheckBox("Case sensitive sorting")
+ self.filterCaseSensitivityCheckBox = QtWidgets.QCheckBox("Case sensitive filter")
+
+ self.filterPatternLineEdit = QtWidgets.QLineEdit()
+ self.filterPatternLabel = QtWidgets.QLabel("&Filter pattern:")
+ self.filterPatternLabel.setBuddy(self.filterPatternLineEdit)
+
+ self.filterSyntaxComboBox = QtWidgets.QComboBox()
+ self.filterSyntaxComboBox.addItem("Regular expression",
+ QtCore.QRegExp.RegExp)
+ self.filterSyntaxComboBox.addItem("Wildcard",
+ QtCore.QRegExp.Wildcard)
+ self.filterSyntaxComboBox.addItem("Fixed string",
+ QtCore.QRegExp.FixedString)
+ self.filterSyntaxLabel = QtWidgets.QLabel("Filter &syntax:")
+ self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox)
+
+ self.filterColumnComboBox = QtWidgets.QComboBox()
+ self.filterColumnComboBox.addItem("Subject")
+ self.filterColumnComboBox.addItem("Sender")
+ self.filterColumnComboBox.addItem("Date")
+ self.filterColumnLabel = QtWidgets.QLabel("Filter &column:")
+ self.filterColumnLabel.setBuddy(self.filterColumnComboBox)
+
+ self.filterPatternLineEdit.textChanged.connect(self.filterRegExpChanged)
+ self.filterSyntaxComboBox.currentIndexChanged.connect(self.filterRegExpChanged)
+ self.filterColumnComboBox.currentIndexChanged.connect(self.filterColumnChanged)
+ self.filterCaseSensitivityCheckBox.toggled.connect(self.filterRegExpChanged)
+ self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged)
+
+ sourceLayout = QtWidgets.QHBoxLayout()
+ sourceLayout.addWidget(self.sourceView)
+ self.sourceGroupBox.setLayout(sourceLayout)
+
+ proxyLayout = QtWidgets.QGridLayout()
+ proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
+ proxyLayout.addWidget(self.filterPatternLabel, 1, 0)
+ proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2)
+ proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0)
+ proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 2)
+ proxyLayout.addWidget(self.filterColumnLabel, 3, 0)
+ proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 2)
+ proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2)
+ proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2)
+ self.proxyGroupBox.setLayout(proxyLayout)
+
+ mainLayout = QtWidgets.QVBoxLayout()
+ mainLayout.addWidget(self.sourceGroupBox)
+ mainLayout.addWidget(self.proxyGroupBox)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Basic Sort/Filter Model")
+ self.resize(500, 450)
+
+ self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder)
+ self.filterColumnComboBox.setCurrentIndex(1)
+
+ self.filterPatternLineEdit.setText("Andy|Grace")
+ self.filterCaseSensitivityCheckBox.setChecked(True)
+ self.sortCaseSensitivityCheckBox.setChecked(True)
+
+ def setSourceModel(self, model):
+ self.proxyModel.setSourceModel(model)
+ self.sourceView.setModel(model)
+
+ def filterRegExpChanged(self):
+ syntax_nr = self.filterSyntaxComboBox.itemData(self.filterSyntaxComboBox.currentIndex())
+ syntax = QtCore.QRegExp.PatternSyntax(syntax_nr)
+
+ if self.filterCaseSensitivityCheckBox.isChecked():
+ caseSensitivity = QtCore.Qt.CaseSensitive
+ else:
+ caseSensitivity = QtCore.Qt.CaseInsensitive
+
+ regExp = QtCore.QRegExp(self.filterPatternLineEdit.text(),
+ caseSensitivity, syntax)
+ self.proxyModel.setFilterRegExp(regExp)
+
+ def filterColumnChanged(self):
+ self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex())
+
+ def sortChanged(self):
+ if self.sortCaseSensitivityCheckBox.isChecked():
+ caseSensitivity = QtCore.Qt.CaseSensitive
+ else:
+ caseSensitivity = QtCore.Qt.CaseInsensitive
+
+ self.proxyModel.setSortCaseSensitivity(caseSensitivity)
+
+
+def addMail(model, subject, sender, date):
+ model.insertRow(0)
+ model.setData(model.index(0, 0), subject)
+ model.setData(model.index(0, 1), sender)
+ model.setData(model.index(0, 2), date)
+
+
+def createMailModel(parent):
+ model = QtGui.QStandardItemModel(0, 3, parent)
+
+ model.setHeaderData(0, QtCore.Qt.Horizontal, "Subject")
+ model.setHeaderData(1, QtCore.Qt.Horizontal, "Sender")
+ model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
+
+ addMail(model, "Happy New Year!", "Grace K. <grace@software-inc.com>",
+ QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(17, 3)))
+ addMail(model, "Radically new concept", "Grace K. <grace@software-inc.com>",
+ QtCore.QDateTime(QtCore.QDate(2006, 12, 22), QtCore.QTime(9, 44)))
+ addMail(model, "Accounts", "pascale@nospam.com",
+ QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(12, 50)))
+ addMail(model, "Expenses", "Joe Bloggs <joe@bloggs.com>",
+ QtCore.QDateTime(QtCore.QDate(2006, 12, 25), QtCore.QTime(11, 39)))
+ addMail(model, "Re: Expenses", "Andy <andy@nospam.com>",
+ QtCore.QDateTime(QtCore.QDate(2007, 1, 2), QtCore.QTime(16, 5)))
+ addMail(model, "Re: Accounts", "Joe Bloggs <joe@bloggs.com>",
+ QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 18)))
+ addMail(model, "Re: Accounts", "Andy <andy@nospam.com>",
+ QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 26)))
+ addMail(model, "Sports", "Linda Smith <linda.smith@nospam.com>",
+ QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(11, 33)))
+ addMail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>",
+ QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 0)))
+ addMail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>",
+ QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 1)))
+
+ return model
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = Window()
+ window.setSourceModel(createMailModel(window))
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/fetchmore.py b/examples/widgets/itemviews/fetchmore.py
new file mode 100755
index 000000000..08655db0d
--- /dev/null
+++ b/examples/widgets/itemviews/fetchmore.py
@@ -0,0 +1,148 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2009 Darryl Wallace, 2009 <wallacdj@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class FileListModel(QtCore.QAbstractListModel):
+ numberPopulated = QtCore.Signal(int)
+
+ def __init__(self, parent=None):
+ super(FileListModel, self).__init__(parent)
+
+ self.fileCount = 0
+ self.fileList = []
+
+ def rowCount(self, parent=QtCore.QModelIndex()):
+ return self.fileCount
+
+ def data(self, index, role=QtCore.Qt.DisplayRole):
+ if not index.isValid():
+ return None
+
+ if index.row() >= len(self.fileList) or index.row() < 0:
+ return None
+
+ if role == QtCore.Qt.DisplayRole:
+ return self.fileList[index.row()]
+
+ if role == QtCore.Qt.BackgroundRole:
+ batch = (index.row() // 100) % 2
+# FIXME: QGuiApplication::palette() required
+ if batch == 0:
+ return QtWidgets.qApp.palette().base()
+
+ return QtWidgets.qApp.palette().alternateBase()
+
+ return None
+
+ def canFetchMore(self, index):
+ return self.fileCount < len(self.fileList)
+
+ def fetchMore(self, index):
+ remainder = len(self.fileList) - self.fileCount
+ itemsToFetch = min(100, remainder)
+
+ self.beginInsertRows(QtCore.QModelIndex(), self.fileCount,
+ self.fileCount + itemsToFetch)
+
+ self.fileCount += itemsToFetch
+
+ self.endInsertRows()
+
+ self.numberPopulated.emit(itemsToFetch)
+
+ def setDirPath(self, path):
+ dir = QtCore.QDir(path)
+
+ self.beginResetModel()
+ self.fileList = list(dir.entryList())
+ self.fileCount = 0
+ self.endResetModel()
+
+
+class Window(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ super(Window, self).__init__(parent)
+
+ model = FileListModel(self)
+ model.setDirPath(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PrefixPath))
+
+ label = QtWidgets.QLabel("Directory")
+ lineEdit = QtWidgets.QLineEdit()
+ label.setBuddy(lineEdit)
+
+ view = QtWidgets.QListView()
+ view.setModel(model)
+
+ self.logViewer = QtWidgets.QTextBrowser()
+ self.logViewer.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred))
+
+ lineEdit.textChanged.connect(model.setDirPath)
+ lineEdit.textChanged.connect(self.logViewer.clear)
+ model.numberPopulated.connect(self.updateLog)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(label, 0, 0)
+ layout.addWidget(lineEdit, 0, 1)
+ layout.addWidget(view, 1, 0, 1, 2)
+ layout.addWidget(self.logViewer, 2, 0, 1, 2)
+
+ self.setLayout(layout)
+ self.setWindowTitle("Fetch More Example")
+
+ def updateLog(self, number):
+ self.logViewer.append("%d items added." % number)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ window = Window()
+ window.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/stardelegate/stardelegate.py b/examples/widgets/itemviews/stardelegate/stardelegate.py
new file mode 100644
index 000000000..44a2d6694
--- /dev/null
+++ b/examples/widgets/itemviews/stardelegate/stardelegate.py
@@ -0,0 +1,174 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import (QItemDelegate, QStyledItemDelegate, QStyle)
+
+from starrating import StarRating
+from stareditor import StarEditor
+
+class StarDelegate(QStyledItemDelegate):
+ """ A subclass of QStyledItemDelegate that allows us to render our
+ pretty star ratings.
+ """
+
+ def __init__(self, parent=None):
+ super(StarDelegate, self).__init__(parent)
+
+ def paint(self, painter, option, index):
+ """ Paint the items in the table.
+
+ If the item referred to by <index> is a StarRating, we handle the
+ painting ourselves. For the other items, we let the base class
+ handle the painting as usual.
+
+ In a polished application, we'd use a better check than the
+ column number to find out if we needed to paint the stars, but
+ it works for the purposes of this example.
+ """
+ if index.column() == 3:
+ starRating = StarRating(index.data())
+
+ # If the row is currently selected, we need to make sure we
+ # paint the background accordingly.
+ if option.state & QStyle.State_Selected:
+ # The original C++ example used option.palette.foreground() to
+ # get the brush for painting, but there are a couple of
+ # problems with that:
+ # - foreground() is obsolete now, use windowText() instead
+ # - more importantly, windowText() just returns a brush
+ # containing a flat color, where sometimes the style
+ # would have a nice subtle gradient or something.
+ # Here we just use the brush of the painter object that's
+ # passed in to us, which keeps the row highlighting nice
+ # and consistent.
+ painter.fillRect(option.rect, painter.brush())
+
+ # Now that we've painted the background, call starRating.paint()
+ # to paint the stars.
+ starRating.paint(painter, option.rect, option.palette)
+ else:
+ QStyledItemDelegate.paint(self, painter, option, index)
+
+ def sizeHint(self, option, index):
+ """ Returns the size needed to display the item in a QSize object. """
+ if index.column() == 3:
+ starRating = StarRating(index.data())
+ return starRating.sizeHint()
+ else:
+ return QStyledItemDelegate.sizeHint(self, option, index)
+
+ # The next 4 methods handle the custom editing that we need to do.
+ # If this were just a display delegate, paint() and sizeHint() would
+ # be all we needed.
+
+ def createEditor(self, parent, option, index):
+ """ Creates and returns the custom StarEditor object we'll use to edit
+ the StarRating.
+ """
+ if index.column() == 3:
+ editor = StarEditor(parent)
+ editor.editingFinished.connect(self.commitAndCloseEditor)
+ return editor
+ else:
+ return QStyledItemDelegate.createEditor(self, parent, option, index)
+
+ def setEditorData(self, editor, index):
+ """ Sets the data to be displayed and edited by our custom editor. """
+ if index.column() == 3:
+ editor.starRating = StarRating(index.data())
+ else:
+ QStyledItemDelegate.setEditorData(self, editor, index)
+
+ def setModelData(self, editor, model, index):
+ """ Get the data from our custom editor and stuffs it into the model.
+ """
+ if index.column() == 3:
+ model.setData(index, editor.starRating.starCount)
+ else:
+ QStyledItemDelegate.setModelData(self, editor, model, index)
+
+ def commitAndCloseEditor(self):
+ """ Erm... commits the data and closes the editor. :) """
+ editor = self.sender()
+
+ # The commitData signal must be emitted when we've finished editing
+ # and need to write our changed back to the model.
+ self.commitData.emit(editor)
+ self.closeEditor.emit(editor, QStyledItemDelegate.NoHint)
+
+
+if __name__ == "__main__":
+ """ Run the application. """
+ from PySide2.QtWidgets import (QApplication, QTableWidget, QTableWidgetItem,
+ QAbstractItemView)
+ import sys
+
+ app = QApplication(sys.argv)
+
+ # Create and populate the tableWidget
+ tableWidget = QTableWidget(4, 4)
+ tableWidget.setItemDelegate(StarDelegate())
+ tableWidget.setEditTriggers(QAbstractItemView.DoubleClicked |
+ QAbstractItemView.SelectedClicked)
+ tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
+ tableWidget.setHorizontalHeaderLabels(["Title", "Genre", "Artist", "Rating"])
+
+ data = [ ["Mass in B-Minor", "Baroque", "J.S. Bach", 5],
+ ["Three More Foxes", "Jazz", "Maynard Ferguson", 4],
+ ["Sex Bomb", "Pop", "Tom Jones", 3],
+ ["Barbie Girl", "Pop", "Aqua", 5] ]
+
+ for r in range(len(data)):
+ tableWidget.setItem(r, 0, QTableWidgetItem(data[r][0]))
+ tableWidget.setItem(r, 1, QTableWidgetItem(data[r][1]))
+ tableWidget.setItem(r, 2, QTableWidgetItem(data[r][2]))
+ item = QTableWidgetItem()
+ item.setData(0, StarRating(data[r][3]).starCount)
+ tableWidget.setItem(r, 3, item)
+
+ tableWidget.resizeColumnsToContents()
+ tableWidget.resize(500, 300)
+ tableWidget.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/stardelegate/stareditor.py b/examples/widgets/itemviews/stardelegate/stareditor.py
new file mode 100644
index 000000000..440659a4f
--- /dev/null
+++ b/examples/widgets/itemviews/stardelegate/stareditor.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import (QWidget)
+from PySide2.QtGui import (QPainter)
+from PySide2.QtCore import Signal
+
+
+class StarEditor(QWidget):
+ """ The custome editor for editing StarRatings. """
+
+ # A signal to tell the delegate when we've finished editing.
+ editingFinished = Signal()
+
+ def __init__(self, parent=None):
+ """ Initialize the editor object, making sure we can watch mouse
+ events.
+ """
+ super(StarEditor, self).__init__(parent)
+
+ self.setMouseTracking(True)
+ self.setAutoFillBackground(True)
+
+ def sizeHint(self):
+ """ Tell the caller how big we are. """
+ return self.starRating.sizeHint()
+
+ def paintEvent(self, event):
+ """ Paint the editor, offloading the work to the StarRating class. """
+ painter = QPainter(self)
+ self.starRating.paint(painter, self.rect(), self.palette(), isEditable=True)
+
+ def mouseMoveEvent(self, event):
+ """ As the mouse moves inside the editor, track the position and
+ update the editor to display as many stars as necessary.
+ """
+ star = self.starAtPosition(event.x())
+
+ if (star != self.starRating.starCount) and (star != -1):
+ self.starRating.starCount = star
+ self.update()
+
+ def mouseReleaseEvent(self, event):
+ """ Once the user has clicked his/her chosen star rating, tell the
+ delegate we're done editing.
+ """
+ self.editingFinished.emit()
+
+ def starAtPosition(self, x):
+ """ Calculate which star the user's mouse cursor is currently
+ hovering over.
+ """
+ star = (x / (self.starRating.sizeHint().width() /
+ self.starRating.maxStarCount)) + 1
+ if (star <= 0) or (star > self.starRating.maxStarCount):
+ return -1
+
+ return star
diff --git a/examples/widgets/itemviews/stardelegate/starrating.py b/examples/widgets/itemviews/stardelegate/starrating.py
new file mode 100644
index 000000000..b573db424
--- /dev/null
+++ b/examples/widgets/itemviews/stardelegate/starrating.py
@@ -0,0 +1,102 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
+## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+## 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$
+##
+#############################################################################
+
+from math import (cos, sin, pi)
+
+from PySide2.QtGui import (QPainter, QPolygonF)
+from PySide2.QtCore import (QPointF, QSize, Qt)
+
+PAINTING_SCALE_FACTOR = 20
+
+
+class StarRating(object):
+ """ Handle the actual painting of the stars themselves. """
+
+ def __init__(self, starCount=1, maxStarCount=5):
+ self.starCount = starCount
+ self.maxStarCount = maxStarCount
+
+ # Create the star shape we'll be drawing.
+ self.starPolygon = QPolygonF()
+ self.starPolygon.append(QPointF(1.0, 0.5))
+ for i in range(1, 5):
+ self.starPolygon.append(QPointF(0.5 + 0.5 * cos(0.8 * i * pi),
+ 0.5 + 0.5 * sin(0.8 * i * pi)))
+
+ # Create the diamond shape we'll show in the editor
+ self.diamondPolygon = QPolygonF()
+ diamondPoints = [QPointF(0.4, 0.5), QPointF(0.5, 0.4),
+ QPointF(0.6, 0.5), QPointF(0.5, 0.6),
+ QPointF(0.4, 0.5)]
+ for point in diamondPoints:
+ self.diamondPolygon.append(point)
+
+ def sizeHint(self):
+ """ Tell the caller how big we are. """
+ return PAINTING_SCALE_FACTOR * QSize(self.maxStarCount, 1)
+
+ def paint(self, painter, rect, palette, isEditable=False):
+ """ Paint the stars (and/or diamonds if we're in editing mode). """
+ painter.save()
+
+ painter.setRenderHint(QPainter.Antialiasing, True)
+ painter.setPen(Qt.NoPen)
+
+ if isEditable:
+ painter.setBrush(palette.highlight())
+ else:
+ painter.setBrush(palette.windowText())
+
+ yOffset = (rect.height() - PAINTING_SCALE_FACTOR) / 2
+ painter.translate(rect.x(), rect.y() + yOffset)
+ painter.scale(PAINTING_SCALE_FACTOR, PAINTING_SCALE_FACTOR)
+
+ for i in range(self.maxStarCount):
+ if i < self.starCount:
+ painter.drawPolygon(self.starPolygon, Qt.WindingFill)
+ elif isEditable:
+ painter.drawPolygon(self.diamondPolygon, Qt.WindingFill)
+ painter.translate(1.0, 0.0)
+
+ painter.restore()
diff --git a/examples/widgets/layouts/basiclayouts.py b/examples/widgets/layouts/basiclayouts.py
new file mode 100755
index 000000000..03f3315d5
--- /dev/null
+++ b/examples/widgets/layouts/basiclayouts.py
@@ -0,0 +1,135 @@
+#!/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 widgets/layouts/basiclayout example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Dialog(QtWidgets.QDialog):
+ NumGridRows = 3
+ NumButtons = 4
+
+ def __init__(self):
+ super(Dialog, self).__init__()
+
+ self.createMenu()
+ self.createHorizontalGroupBox()
+ self.createGridGroupBox()
+ self.createFormGroupBox()
+
+ bigEditor = QtWidgets.QTextEdit()
+ bigEditor.setPlainText("This widget takes up all the remaining space "
+ "in the top-level layout.")
+
+ buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
+
+ buttonBox.accepted.connect(self.accept)
+ buttonBox.rejected.connect(self.reject)
+
+ mainLayout = QtWidgets.QVBoxLayout()
+ mainLayout.setMenuBar(self.menuBar)
+ mainLayout.addWidget(self.horizontalGroupBox)
+ mainLayout.addWidget(self.gridGroupBox)
+ mainLayout.addWidget(self.formGroupBox)
+ mainLayout.addWidget(bigEditor)
+ mainLayout.addWidget(buttonBox)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle("Basic Layouts")
+
+ def createMenu(self):
+ self.menuBar = QtWidgets.QMenuBar()
+
+ self.fileMenu = QtWidgets.QMenu("&File", self)
+ self.exitAction = self.fileMenu.addAction("E&xit")
+ self.menuBar.addMenu(self.fileMenu)
+
+ self.exitAction.triggered.connect(self.accept)
+
+ def createHorizontalGroupBox(self):
+ self.horizontalGroupBox = QtWidgets.QGroupBox("Horizontal layout")
+ layout = QtWidgets.QHBoxLayout()
+
+ for i in range(Dialog.NumButtons):
+ button = QtWidgets.QPushButton("Button %d" % (i + 1))
+ layout.addWidget(button)
+
+ self.horizontalGroupBox.setLayout(layout)
+
+ def createGridGroupBox(self):
+ self.gridGroupBox = QtWidgets.QGroupBox("Grid layout")
+ layout = QtWidgets.QGridLayout()
+
+ for i in range(Dialog.NumGridRows):
+ label = QtWidgets.QLabel("Line %d:" % (i + 1))
+ lineEdit = QtWidgets.QLineEdit()
+ layout.addWidget(label, i + 1, 0)
+ layout.addWidget(lineEdit, i + 1, 1)
+
+ self.smallEditor = QtWidgets.QTextEdit()
+ self.smallEditor.setPlainText("This widget takes up about two thirds "
+ "of the grid layout.")
+
+ layout.addWidget(self.smallEditor, 0, 2, 4, 1)
+
+ layout.setColumnStretch(1, 10)
+ layout.setColumnStretch(2, 20)
+ self.gridGroupBox.setLayout(layout)
+
+ def createFormGroupBox(self):
+ self.formGroupBox = QtWidgets.QGroupBox("Form layout")
+ layout = QtWidgets.QFormLayout()
+ layout.addRow(QtWidgets.QLabel("Line 1:"), QtWidgets.QLineEdit())
+ layout.addRow(QtWidgets.QLabel("Line 2, long text:"), QtWidgets.QComboBox())
+ layout.addRow(QtWidgets.QLabel("Line 3:"), QtWidgets.QSpinBox())
+ self.formGroupBox.setLayout(layout)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ dialog = Dialog()
+ sys.exit(dialog.exec_())
diff --git a/examples/widgets/layouts/dynamiclayouts.py b/examples/widgets/layouts/dynamiclayouts.py
new file mode 100644
index 000000000..e80b8c885
--- /dev/null
+++ b/examples/widgets/layouts/dynamiclayouts.py
@@ -0,0 +1,171 @@
+#!/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 widgets/layouts/dynamiclayouts example from Qt v5.x"""
+
+from PySide2.QtCore import Qt, QSize
+from PySide2.QtWidgets import (QApplication, QDialog, QLayout, QGridLayout,
+ QMessageBox, QGroupBox, QSpinBox, QSlider,
+ QProgressBar, QDial, QDialogButtonBox,
+ QComboBox, QLabel)
+
+class Dialog(QDialog):
+ def __init__(self):
+ super(Dialog, self).__init__()
+
+ self.rotableWidgets = []
+
+ self.createRotableGroupBox()
+ self.createOptionsGroupBox()
+ self.createButtonBox()
+
+ mainLayout = QGridLayout()
+ mainLayout.addWidget(self.rotableGroupBox, 0, 0)
+ mainLayout.addWidget(self.optionsGroupBox, 1, 0)
+ mainLayout.addWidget(self.buttonBox, 2, 0)
+ mainLayout.setSizeConstraint(QLayout.SetMinimumSize)
+
+ self.mainLayout = mainLayout
+ self.setLayout(self.mainLayout)
+
+ self.setWindowTitle("Dynamic Layouts")
+
+ def rotateWidgets(self):
+ count = len(self.rotableWidgets)
+ if count % 2 == 1:
+ raise AssertionError("Number of widgets must be even")
+
+ for widget in self.rotableWidgets:
+ self.rotableLayout.removeWidget(widget)
+
+ self.rotableWidgets.append(self.rotableWidgets.pop(0))
+
+ for i in range(count//2):
+ self.rotableLayout.addWidget(self.rotableWidgets[count - i - 1], 0, i)
+ self.rotableLayout.addWidget(self.rotableWidgets[i], 1, i)
+
+
+ def buttonsOrientationChanged(self, index):
+ self.mainLayout.setSizeConstraint(QLayout.SetNoConstraint);
+ self.setMinimumSize(0, 0);
+
+ orientation = Qt.Orientation(int(self.buttonsOrientationComboBox.itemData(index)))
+
+ if orientation == self.buttonBox.orientation():
+ return
+
+ self.mainLayout.removeWidget(self.buttonBox);
+
+ spacing = self.mainLayout.spacing()
+
+ oldSizeHint = self.buttonBox.sizeHint() + QSize(spacing, spacing);
+ self.buttonBox.setOrientation(orientation)
+ newSizeHint = self.buttonBox.sizeHint() + QSize(spacing, spacing)
+
+ if orientation == Qt.Horizontal:
+ self.mainLayout.addWidget(self.buttonBox, 2, 0);
+ self.resize(self.size() + QSize(-oldSizeHint.width(), newSizeHint.height()))
+ else:
+ self.mainLayout.addWidget(self.buttonBox, 0, 3, 2, 1);
+ self.resize(self.size() + QSize(newSizeHint.width(), -oldSizeHint.height()))
+
+ self.mainLayout.setSizeConstraint(QLayout.SetDefaultConstraint)
+
+ def show_help(self):
+ QMessageBox.information(self, "Dynamic Layouts Help",
+ "This example shows how to change layouts "
+ "dynamically.")
+
+ def createRotableGroupBox(self):
+ self.rotableGroupBox = QGroupBox("Rotable Widgets")
+
+ self.rotableWidgets.append(QSpinBox())
+ self.rotableWidgets.append(QSlider())
+ self.rotableWidgets.append(QDial())
+ self.rotableWidgets.append(QProgressBar())
+ count = len(self.rotableWidgets)
+ for i in range(count):
+ self.rotableWidgets[i].valueChanged[int].\
+ connect(self.rotableWidgets[(i+1) % count].setValue)
+
+ self.rotableLayout = QGridLayout()
+ self.rotableGroupBox.setLayout(self.rotableLayout)
+
+ self.rotateWidgets()
+
+ def createOptionsGroupBox(self):
+ self.optionsGroupBox = QGroupBox("Options")
+
+ buttonsOrientationLabel = QLabel("Orientation of buttons:")
+
+ buttonsOrientationComboBox = QComboBox()
+ buttonsOrientationComboBox.addItem("Horizontal", Qt.Horizontal)
+ buttonsOrientationComboBox.addItem("Vertical", Qt.Vertical)
+ buttonsOrientationComboBox.currentIndexChanged[int].connect(self.buttonsOrientationChanged)
+
+ self.buttonsOrientationComboBox = buttonsOrientationComboBox
+
+ optionsLayout = QGridLayout()
+ optionsLayout.addWidget(buttonsOrientationLabel, 0, 0)
+ optionsLayout.addWidget(self.buttonsOrientationComboBox, 0, 1)
+ optionsLayout.setColumnStretch(2, 1)
+ self.optionsGroupBox.setLayout(optionsLayout)
+
+ def createButtonBox(self):
+ self.buttonBox = QDialogButtonBox()
+
+ closeButton = self.buttonBox.addButton(QDialogButtonBox.Close)
+ helpButton = self.buttonBox.addButton(QDialogButtonBox.Help)
+ rotateWidgetsButton = self.buttonBox.addButton("Rotate &Widgets", QDialogButtonBox.ActionRole)
+
+ rotateWidgetsButton.clicked.connect(self.rotateWidgets)
+ closeButton.clicked.connect(self.close)
+ helpButton.clicked.connect(self.show_help)
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QApplication(sys.argv)
+ dialog = Dialog()
+ dialog.exec_()
diff --git a/examples/widgets/layouts/flowlayout.py b/examples/widgets/layouts/flowlayout.py
new file mode 100755
index 000000000..75dfa4679
--- /dev/null
+++ b/examples/widgets/layouts/flowlayout.py
@@ -0,0 +1,156 @@
+#!/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 widgets/layouts/flowlayout example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class Window(QtWidgets.QWidget):
+ def __init__(self):
+ super(Window, self).__init__()
+
+ flowLayout = FlowLayout()
+ flowLayout.addWidget(QtWidgets.QPushButton("Short"))
+ flowLayout.addWidget(QtWidgets.QPushButton("Longer"))
+ flowLayout.addWidget(QtWidgets.QPushButton("Different text"))
+ flowLayout.addWidget(QtWidgets.QPushButton("More text"))
+ flowLayout.addWidget(QtWidgets.QPushButton("Even longer button text"))
+ self.setLayout(flowLayout)
+
+ self.setWindowTitle("Flow Layout")
+
+
+class FlowLayout(QtWidgets.QLayout):
+ def __init__(self, parent=None, margin=0, spacing=-1):
+ super(FlowLayout, self).__init__(parent)
+
+ if parent is not None:
+ self.setMargin(margin)
+
+ self.setSpacing(spacing)
+
+ self.itemList = []
+
+ def __del__(self):
+ item = self.takeAt(0)
+ while item:
+ item = self.takeAt(0)
+
+ def addItem(self, item):
+ self.itemList.append(item)
+
+ def count(self):
+ return len(self.itemList)
+
+ def itemAt(self, index):
+ if index >= 0 and index < len(self.itemList):
+ return self.itemList[index]
+
+ return None
+
+ def takeAt(self, index):
+ if index >= 0 and index < len(self.itemList):
+ return self.itemList.pop(index)
+
+ return None
+
+ def expandingDirections(self):
+ return QtCore.Qt.Orientations(QtCore.Qt.Orientation(0))
+
+ def hasHeightForWidth(self):
+ return True
+
+ def heightForWidth(self, width):
+ height = self.doLayout(QtCore.QRect(0, 0, width, 0), True)
+ return height
+
+ def setGeometry(self, rect):
+ super(FlowLayout, self).setGeometry(rect)
+ self.doLayout(rect, False)
+
+ def sizeHint(self):
+ return self.minimumSize()
+
+ def minimumSize(self):
+ size = QtCore.QSize()
+
+ for item in self.itemList:
+ size = size.expandedTo(item.minimumSize())
+
+ size += QtCore.QSize(2 * self.contentsMargins().top(), 2 * self.contentsMargins().top())
+ return size
+
+ def doLayout(self, rect, testOnly):
+ x = rect.x()
+ y = rect.y()
+ lineHeight = 0
+
+ for item in self.itemList:
+ wid = item.widget()
+ spaceX = self.spacing() + wid.style().layoutSpacing(QtWidgets.QSizePolicy.PushButton, QtWidgets.QSizePolicy.PushButton, QtCore.Qt.Horizontal)
+ spaceY = self.spacing() + wid.style().layoutSpacing(QtWidgets.QSizePolicy.PushButton, QtWidgets.QSizePolicy.PushButton, QtCore.Qt.Vertical)
+ nextX = x + item.sizeHint().width() + spaceX
+ if nextX - spaceX > rect.right() and lineHeight > 0:
+ x = rect.x()
+ y = y + lineHeight + spaceY
+ nextX = x + item.sizeHint().width() + spaceX
+ lineHeight = 0
+
+ if not testOnly:
+ item.setGeometry(QtCore.QRect(QtCore.QPoint(x, y), item.sizeHint()))
+
+ x = nextX
+ lineHeight = max(lineHeight, item.sizeHint().height())
+
+ return y + lineHeight - rect.y()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ mainWin = Window()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/mainwindows/application/application.py b/examples/widgets/mainwindows/application/application.py
new file mode 100755
index 000000000..f1f2ca7c2
--- /dev/null
+++ b/examples/widgets/mainwindows/application/application.py
@@ -0,0 +1,273 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import application_rc
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.curFile = ''
+
+ self.textEdit = QtWidgets.QTextEdit()
+ self.setCentralWidget(self.textEdit)
+
+ self.createActions()
+ self.createMenus()
+ self.createToolBars()
+ self.createStatusBar()
+
+ self.readSettings()
+
+ self.textEdit.document().contentsChanged.connect(self.documentWasModified)
+
+ self.setCurrentFile('')
+ self.setUnifiedTitleAndToolBarOnMac(True)
+
+ def closeEvent(self, event):
+ if self.maybeSave():
+ self.writeSettings()
+ event.accept()
+ else:
+ event.ignore()
+
+ def newFile(self):
+ if self.maybeSave():
+ self.textEdit.clear()
+ self.setCurrentFile('')
+
+ def open(self):
+ if self.maybeSave():
+ fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self)
+ if fileName:
+ self.loadFile(fileName)
+
+ def save(self):
+ if self.curFile:
+ return self.saveFile(self.curFile)
+
+ return self.saveAs()
+
+ def saveAs(self):
+ fileName, filtr = QtWidgets.QFileDialog.getSaveFileName(self)
+ if fileName:
+ return self.saveFile(fileName)
+
+ return False
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About Application",
+ "The <b>Application</b> example demonstrates how to write "
+ "modern GUI applications using Qt, with a menu bar, "
+ "toolbars, and a status bar.")
+
+ def documentWasModified(self):
+ self.setWindowModified(self.textEdit.document().isModified())
+
+ def createActions(self):
+ self.newAct = QtWidgets.QAction(QtGui.QIcon(':/images/new.png'), "&New",
+ self, shortcut=QtGui.QKeySequence.New,
+ statusTip="Create a new file", triggered=self.newFile)
+
+ self.openAct = QtWidgets.QAction(QtGui.QIcon(':/images/open.png'),
+ "&Open...", self, shortcut=QtGui.QKeySequence.Open,
+ statusTip="Open an existing file", triggered=self.open)
+
+ self.saveAct = QtWidgets.QAction(QtGui.QIcon(':/images/save.png'),
+ "&Save", self, shortcut=QtGui.QKeySequence.Save,
+ statusTip="Save the document to disk", triggered=self.save)
+
+ self.saveAsAct = QtWidgets.QAction("Save &As...", self,
+ shortcut=QtGui.QKeySequence.SaveAs,
+ statusTip="Save the document under a new name",
+ triggered=self.saveAs)
+
+ self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q",
+ statusTip="Exit the application", triggered=self.close)
+
+ self.cutAct = QtWidgets.QAction(QtGui.QIcon(':/images/cut.png'), "Cu&t",
+ self, shortcut=QtGui.QKeySequence.Cut,
+ statusTip="Cut the current selection's contents to the clipboard",
+ triggered=self.textEdit.cut)
+
+ self.copyAct = QtWidgets.QAction(QtGui.QIcon(':/images/copy.png'),
+ "&Copy", self, shortcut=QtGui.QKeySequence.Copy,
+ statusTip="Copy the current selection's contents to the clipboard",
+ triggered=self.textEdit.copy)
+
+ self.pasteAct = QtWidgets.QAction(QtGui.QIcon(':/images/paste.png'),
+ "&Paste", self, shortcut=QtGui.QKeySequence.Paste,
+ statusTip="Paste the clipboard's contents into the current selection",
+ triggered=self.textEdit.paste)
+
+ self.aboutAct = QtWidgets.QAction("&About", self,
+ statusTip="Show the application's About box",
+ triggered=self.about)
+
+ self.aboutQtAct = QtWidgets.QAction("About &Qt", self,
+ statusTip="Show the Qt library's About box",
+ triggered=QtWidgets.qApp.aboutQt)
+
+ self.cutAct.setEnabled(False)
+ self.copyAct.setEnabled(False)
+ self.textEdit.copyAvailable.connect(self.cutAct.setEnabled)
+ self.textEdit.copyAvailable.connect(self.copyAct.setEnabled)
+
+ def createMenus(self):
+ self.fileMenu = self.menuBar().addMenu("&File")
+ self.fileMenu.addAction(self.newAct)
+ self.fileMenu.addAction(self.openAct)
+ self.fileMenu.addAction(self.saveAct)
+ self.fileMenu.addAction(self.saveAsAct)
+ self.fileMenu.addSeparator();
+ self.fileMenu.addAction(self.exitAct)
+
+ self.editMenu = self.menuBar().addMenu("&Edit")
+ self.editMenu.addAction(self.cutAct)
+ self.editMenu.addAction(self.copyAct)
+ self.editMenu.addAction(self.pasteAct)
+
+ self.menuBar().addSeparator()
+
+ self.helpMenu = self.menuBar().addMenu("&Help")
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+ def createToolBars(self):
+ self.fileToolBar = self.addToolBar("File")
+ self.fileToolBar.addAction(self.newAct)
+ self.fileToolBar.addAction(self.openAct)
+ self.fileToolBar.addAction(self.saveAct)
+
+ self.editToolBar = self.addToolBar("Edit")
+ self.editToolBar.addAction(self.cutAct)
+ self.editToolBar.addAction(self.copyAct)
+ self.editToolBar.addAction(self.pasteAct)
+
+ def createStatusBar(self):
+ self.statusBar().showMessage("Ready")
+
+ def readSettings(self):
+ settings = QtCore.QSettings("Trolltech", "Application Example")
+ pos = settings.value("pos", QtCore.QPoint(200, 200))
+ size = settings.value("size", QtCore.QSize(400, 400))
+ self.resize(size)
+ self.move(pos)
+
+ def writeSettings(self):
+ settings = QtCore.QSettings("Trolltech", "Application Example")
+ settings.setValue("pos", self.pos())
+ settings.setValue("size", self.size())
+
+ def maybeSave(self):
+ if self.textEdit.document().isModified():
+ ret = QtWidgets.QMessageBox.warning(self, "Application",
+ "The document has been modified.\nDo you want to save "
+ "your changes?",
+ QtWidgets.QMessageBox.Save | QtWidgets.QMessageBox.Discard |
+ QtWidgets.QMessageBox.Cancel)
+ if ret == QtWidgets.QMessageBox.Save:
+ return self.save()
+ elif ret == QtWidgets.QMessageBox.Cancel:
+ return False
+ return True
+
+ def loadFile(self, fileName):
+ file = QtCore.QFile(fileName)
+ if not file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(self, "Application",
+ "Cannot read file %s:\n%s." % (fileName, file.errorString()))
+ return
+
+ inf = QtCore.QTextStream(file)
+ QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.textEdit.setPlainText(inf.readAll())
+ QtWidgets.QApplication.restoreOverrideCursor()
+
+ self.setCurrentFile(fileName)
+ self.statusBar().showMessage("File loaded", 2000)
+
+ def saveFile(self, fileName):
+ file = QtCore.QFile(fileName)
+ if not file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(self, "Application",
+ "Cannot write file %s:\n%s." % (fileName, file.errorString()))
+ return False
+
+ outf = QtCore.QTextStream(file)
+ QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+
+ # FIXME: Once file is out of scope, the file is empty, instead of having text.
+ outf << self.textEdit.toPlainText()
+ QtWidgets.QApplication.restoreOverrideCursor()
+
+ self.setCurrentFile(fileName);
+ self.statusBar().showMessage("File saved", 2000)
+ return True
+
+ def setCurrentFile(self, fileName):
+ self.curFile = fileName
+ self.textEdit.document().setModified(False)
+ self.setWindowModified(False)
+
+ if self.curFile:
+ shownName = self.strippedName(self.curFile)
+ else:
+ shownName = 'untitled.txt'
+
+ self.setWindowTitle("%s[*] - Application" % shownName)
+
+ def strippedName(self, fullFileName):
+ return QtCore.QFileInfo(fullFileName).fileName()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/mainwindows/application/application.qrc b/examples/widgets/mainwindows/application/application.qrc
new file mode 100644
index 000000000..0a776fab4
--- /dev/null
+++ b/examples/widgets/mainwindows/application/application.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/copy.png</file>
+ <file>images/cut.png</file>
+ <file>images/new.png</file>
+ <file>images/open.png</file>
+ <file>images/paste.png</file>
+ <file>images/save.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/mainwindows/application/application_rc.py b/examples/widgets/mainwindows/application/application_rc.py
new file mode 100644
index 000000000..f5cc2c078
--- /dev/null
+++ b/examples/widgets/mainwindows/application/application_rc.py
@@ -0,0 +1,645 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Tue Aug 3 15:36:52 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x03\x54\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x02\xe6\x49\x44\x41\x54\x58\xc3\xd5\
+\x97\xcd\x4e\x13\x61\x14\x86\xeb\x35\x94\x95\x7b\x71\xe1\xd2\xc4\
+\xe0\x05\xb8\xe2\x0e\x5c\xb8\xf4\x02\x5c\xb1\x30\xea\x05\x18\x96\
+\x26\x62\x58\xb8\xb0\x91\x58\x20\xd1\x9d\xbf\x89\xa4\x14\xb1\x52\
+\xa4\x48\x45\x94\xfe\xd0\x02\x43\xff\xa6\x9d\x19\xa6\x65\x80\xe3\
+\x79\x7b\xfa\x85\x51\x4a\x82\xc9\x21\x86\x49\xde\x9c\x33\xa7\xf3\
+\xcd\xfb\x9c\xf3\x4d\x9b\x4e\x84\x88\x22\xff\x53\x91\x73\x01\xc0\
+\xc7\xd5\x90\x6e\xff\xa5\xfb\xac\xc7\x3d\x3d\x64\x0d\xa9\x02\xf0\
+\x31\x32\x3c\x3c\xbc\x6a\x34\x3a\x3a\xba\x19\x56\x3c\x1e\xaf\x26\
+\x93\xc9\x56\x3a\x9d\x76\x13\x89\x44\x6b\x60\x60\x20\xcd\x6b\x6e\
+\x68\x02\xa4\x38\xd2\xe1\xe1\x71\x99\xba\xef\xb7\xc9\xb2\x2c\xda\
+\xdf\xdf\x27\x86\xf1\x78\xcd\x18\xeb\x8a\x1a\x40\x3f\xf3\xb0\x1c\
+\xc7\xa5\x4c\x66\xb9\x0b\x14\x04\x01\xc5\x62\xb1\x3a\xaf\x7b\x70\
+\x1a\x88\x53\x01\x1c\x1c\x10\x77\x77\xb2\x6c\xdb\xa1\xf9\xf9\xcf\
+\x64\x0e\xd7\x75\xe9\xf9\xc4\x44\x17\x42\x05\x00\x26\x7b\xc1\xc9\
+\xaa\x37\x1c\x4a\xce\xcd\x53\xf8\x70\x5d\x0f\x8b\x17\x54\x00\x82\
+\x10\x40\x67\x4f\x14\xce\xed\xa6\x47\x1f\x67\x66\xe9\xf5\x9b\xb7\
+\x14\x9f\x9c\xa4\xa9\xa9\x69\x7a\xf7\xfe\x03\x45\xa3\xd1\x65\x5e\
+\x7f\x41\x05\xc0\xef\x10\xed\xb6\x25\x86\x85\x9a\xe3\x05\x94\x5d\
+\xcd\xd1\xe4\xf4\x2b\x7a\x32\xfe\x94\x9e\xc5\x5e\xd0\x4c\x62\x0e\
+\x8b\x17\x55\x00\xda\x81\x18\xf5\x13\x20\x3c\xff\x90\x6a\xcd\x36\
+\x15\x37\xab\x94\x2f\x6e\x53\x89\x63\x8d\xb7\x85\xd7\x7e\x51\x01\
+\xf0\x79\xcc\xcd\x5d\x1e\xb5\xc7\x7b\xdb\xee\x9f\x3b\xbe\xe4\x88\
+\x5d\xb8\xbd\xee\xe2\x94\xca\x33\xe0\x75\xe4\xc6\x75\x57\x62\xd8\
+\x10\x39\xea\xe6\x33\x44\xd4\x01\xa7\x06\xe0\xf4\x3a\xad\x39\x22\
+\x98\x98\x68\x72\x80\x98\x6b\x50\x53\x9d\x00\x00\x2a\x2d\xb9\x31\
+\xe2\x4e\x53\x8c\x10\x0d\x04\xf2\x6d\xfb\x28\xb6\x7c\x45\x00\x9b\
+\x3b\xdb\x6a\xfc\x69\x8e\x3c\x6c\x88\x1a\xae\x39\x13\x80\x3a\x8f\
+\xb7\x54\x23\x2a\xd7\xc5\x04\x06\x06\x00\x35\x28\x9c\x17\xab\xbc\
+\x25\xbb\xca\x13\xc0\x4d\x61\x0e\x15\x2a\x72\x6e\xcc\x7e\x5a\x02\
+\x68\x6a\xdd\xad\xf1\x94\x27\x00\x53\xdc\x1c\x71\x6d\x5b\x40\x60\
+\x9a\xab\x1c\x75\x9e\xeb\x81\x41\x15\x47\x11\xc0\x6a\x89\x31\x0c\
+\xd6\x77\x04\x20\x0c\x64\x26\x62\xb6\x69\x75\x8b\xa8\xaa\x09\x50\
+\xb6\xc5\xbc\xd0\x03\xf8\xbe\x29\x63\x87\x29\x60\x0c\x18\x84\x1c\
+\x00\x5b\x4d\x45\x00\x74\x03\x53\x98\xad\x94\xc5\x1c\xe7\x46\xe6\
+\x1c\x00\xc8\x71\x5d\xa9\xa1\x08\x80\xfd\xfc\x56\x12\x73\x33\x01\
+\x08\x35\x18\x42\xe8\xda\x7c\x8e\x29\xa8\x4e\x00\x5b\x00\x03\xc8\
+\x98\x67\x36\x04\x00\x32\xe6\x85\xde\xf8\x17\x0b\xfc\x2c\xd8\x8a\
+\x00\x18\x67\x3a\x4f\xb4\x54\x14\x23\x98\x02\x00\x02\x0c\x3e\xfb\
+\xc5\x53\x28\xf0\x43\xb8\x66\x49\xf7\x6b\xf9\x52\x87\xd7\xbe\x54\
+\x01\xc8\x55\x8f\xba\x4e\xad\x4b\x0e\x90\xaf\x85\xde\xb7\xc2\x92\
+\x3d\x4f\xa6\xb3\xde\xa3\xb1\x71\xeb\xda\xd0\xf5\x15\x98\xb3\x6e\
+\xa9\x00\x6c\x34\xa4\x6b\x18\xff\xe0\x11\x7f\x5a\x17\x53\xd4\x13\
+\x0b\x59\x6f\xe4\xee\xbd\xe2\xa5\xc1\xcb\x4b\x7c\x6d\x8c\x75\x87\
+\x35\xa8\xfa\xb7\x1c\xdd\x65\xd9\x3c\x8f\x1f\x19\xfe\x9e\xcf\x1e\
+\x37\xbd\xc9\xba\x78\x26\x6f\x46\x00\x68\xf2\xff\x81\x99\x94\x9e\
+\xe9\x3f\xbf\x19\x01\x42\xd3\xf4\xfc\xbd\x9c\x9e\xa5\x7e\x03\x51\
+\x6c\x25\xa1\x92\x95\x0a\x77\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x05\x3a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\xcc\x49\x44\x41\x54\x58\xc3\xb5\
+\x97\x5d\x4c\x5b\x65\x1c\xc6\x77\x6f\xbc\xd9\xe5\x12\x49\x20\x71\
+\xd7\x26\xe3\x4e\x13\xb8\x70\xd1\x85\x44\xbd\x50\xe3\x10\x18\xe5\
+\x2b\x2e\x26\x4a\x04\x27\x86\xaa\x8b\x99\xe0\xd0\xa2\x6c\x19\x86\
+\x39\x17\xdc\x1a\x16\x98\x80\x40\x6c\xa6\x43\xca\x20\x2b\x83\x1e\
+\x28\xcc\xda\xd1\x96\xd2\xd2\x4a\x7b\xfa\x01\xa5\xd0\xef\x16\x1e\
+\xdf\xff\xdb\x1d\xc7\xcc\x04\x2a\x87\x93\x3c\x39\x6f\x21\x9c\xe7\
+\xf7\x3c\xef\x47\x0f\x87\x00\x1c\xca\x46\xcf\xbd\xfa\xe9\xbb\x4c\
+\x5a\x26\x61\x0f\x6a\x60\xca\xd9\xe9\x79\xd9\x9a\x3f\x5d\x50\xf2\
+\xa5\xc1\xe9\x8f\xa7\x57\xc3\x40\x30\x02\x84\xa2\x19\xad\xc7\x32\
+\x8a\x27\x81\x58\x22\x73\xbf\x79\x6b\xda\x4b\x10\x72\x02\x1c\x7b\
+\xe7\xac\xda\x1c\xd8\xc8\x98\x12\x40\x84\x99\x85\xe3\x19\x91\x31\
+\x29\x1a\x4b\x61\x25\x94\x44\x38\x9a\x42\x73\x87\xc6\xbe\x13\xc4\
+\xff\x02\x90\x12\x93\x79\x24\xf1\xc8\x58\x92\xcf\x1f\x84\x5d\x8c\
+\xc2\xe5\x09\x22\x12\x4b\xa3\xf4\xc3\xef\x4d\x34\x75\x59\x01\xb0\
+\xeb\xd8\x36\xd5\x90\x9e\x3a\xfc\xcc\xb9\xe7\x5f\x2e\x11\x3f\x56\
+\x9e\x45\x45\x55\x0d\x2a\x99\xde\xaf\xad\xc3\x9d\xb1\x89\xc7\x00\
+\xac\xb6\x25\xfc\xb9\xe8\x87\x6b\x15\x58\xf6\x04\x10\x08\xc6\xd2\
+\xaf\x9c\xbe\x70\x9f\x41\x1c\xd9\x15\x80\x5d\x87\x99\x1a\x8a\x8a\
+\x8a\xcc\x92\x5a\x5b\x5b\xdd\xa4\xaf\x55\xad\xfe\xaf\x54\xdf\xa6\
+\x06\x06\x06\x31\x39\x35\x85\xd9\xb9\x39\xe8\x26\x26\x50\x50\x50\
+\x80\x21\xcd\x6f\x7c\xde\x49\xa6\xf9\x05\xcc\x98\x5c\x1c\xc0\xe1\
+\x4f\x41\xf4\x85\xf0\x43\xaf\xce\xcd\x00\x6a\xf6\x02\x50\x43\x66\
+\xd8\xe5\x8a\xc7\xe3\xf0\x7a\xbd\x48\xa7\xd3\x98\x9c\x9c\x44\x65\
+\x65\x35\x66\x67\x8d\xbc\x81\x07\x66\x1b\x74\xd3\x16\x0e\x40\x32\
+\x2d\x78\xf0\xdd\x8d\x51\x8f\xac\x00\xe1\x70\x18\x46\xa3\x91\x8f\
+\x53\xa9\x14\x7e\xea\xed\x45\xe3\x27\x9f\x61\x86\x41\x38\x96\xdc\
+\x50\x77\x75\xe3\x4c\x43\x23\xce\x35\x9d\xc7\xed\x91\x71\x5c\xbc\
+\x3e\x2c\x2f\xc0\xc6\xc6\x06\xf4\x7a\xfd\x63\x40\x7d\x7d\xfd\x50\
+\x32\x88\xd0\x46\x1c\x66\x9b\x0b\x82\xc1\x88\xa9\x19\x13\xac\x0e\
+\x11\x97\xba\x64\x6e\x80\x00\xa6\xd8\x3a\xd8\x7e\x45\x22\x11\x94\
+\x2b\x2a\x30\xae\x13\x40\xe7\x04\x6d\x57\xda\xaa\x34\xbe\x7c\x53\
+\xe6\x35\x40\x66\x3a\x9d\x0e\xc3\xc3\xc3\xe8\x65\xf5\xf7\xf7\xf7\
+\x43\xab\xd5\xa2\xaa\xba\x06\x63\x77\xf5\x90\x0e\x2a\x77\x90\xed\
+\x04\xb6\x0e\xda\xbb\x65\x06\xa0\x79\xb7\xdb\xed\x18\x1a\x1a\x42\
+\x67\x67\x27\x7a\x7a\x7a\x38\x50\x49\x69\x19\x6e\x69\xf5\x10\xd7\
+\x00\x6f\x08\xb0\xf9\x00\x67\x00\xb8\xd0\x25\x33\xc0\xd6\xd6\x16\
+\xdf\x09\x81\x40\x00\xa2\x28\xc2\xef\xf7\x63\x6d\x6d\x0d\xa7\x14\
+\x95\xd0\xfc\xae\xe7\xa9\xc9\x7c\xc1\x0b\x98\x3d\x40\x9b\xdc\x00\
+\xdb\x41\x36\x37\x37\xf9\x76\xa4\x56\x14\x15\xd5\xe8\xfb\x55\xe0\
+\xa9\x1d\x81\x47\x00\xe7\x3b\x0f\x00\x80\xcc\x25\x80\x24\x33\x4f\
+\x24\x12\x28\x2b\xaf\xe2\x00\x7f\xb8\x00\x8b\x98\x01\xa0\x36\x5a\
+\xd5\x07\x30\x05\xff\x98\x27\x93\x3c\x3d\x4d\x49\xc9\xa9\x4a\x0e\
+\xa0\xb7\xb3\x03\x89\x3d\xc5\xf8\x17\x30\xb1\x00\x7c\x71\xf5\x00\
+\x00\xa4\xea\xc9\x98\x14\x8b\xc5\x50\xa6\xa8\x82\x7a\x48\xc0\x98\
+\x19\xb8\x6b\x05\xe6\x9c\x99\xfb\xe7\x57\x64\x04\x90\xd2\x53\x6a\
+\x02\x88\x46\xa3\xdc\x3c\x14\x0a\xa1\xb8\xb4\x02\xd7\x06\x05\xdc\
+\x66\x87\xe4\xa0\x01\x1c\x64\xc4\x04\x28\x3b\x64\x06\x48\x3d\x9c\
+\x73\x12\x99\xd3\xb9\x40\x20\xc5\x65\x55\xb8\xd8\x2d\xa0\x7f\x3a\
+\x63\xae\x7d\x90\x69\xe0\xa3\x76\x99\x00\xfe\x5d\x3d\xa5\x26\xad\
+\xae\xae\x72\x88\xb7\x4a\x2a\x70\xb9\x57\xc0\x3d\x1b\xb8\x7e\x9e\
+\x01\xee\xcc\x03\x67\x2e\xed\x13\x40\xaa\x9d\x44\x8b\x8e\x92\xd3\
+\x71\x4c\xdf\x01\x2b\x2b\x2b\x58\x5f\x5f\xe7\x10\x27\x59\x03\xdf\
+\x74\x09\x50\x4f\x00\xbf\xcc\x65\x1a\xb8\x32\x06\x34\xec\xa7\x01\
+\xc9\x58\xda\xeb\x64\x4e\x69\x29\x39\x1d\x44\x04\x40\xf5\xd3\xcf\
+\xde\x7c\x5b\x81\x96\xeb\x02\x4f\x7e\x75\x1c\xb8\x71\x0f\xf8\x71\
+\x2c\x9e\x7e\xbd\x4e\x6d\xa6\x37\xaa\xac\x00\x9e\x64\x2c\x6d\x37\
+\x32\x25\x00\xd1\x23\xf2\xe4\x12\xcc\x1b\x27\x15\x68\xef\x11\xa0\
+\xbc\x66\x5b\x7f\x4f\x35\xe2\x3c\x71\x9a\xbf\x8e\x69\xf7\xfc\x4a\
+\x26\x01\x90\xa9\x24\x69\xb5\x53\x42\x32\x0f\x06\x83\x70\xb9\x5c\
+\xdc\x90\x5e\x4a\xe8\xb3\xc7\xe3\x81\xdb\xed\xc6\xf1\x13\xaf\x25\
+\x9f\x7d\xa1\x9c\x4c\x3b\x98\x8a\x99\x8e\x3e\xc9\x78\x47\x00\x95\
+\x4a\xc5\x01\xa4\x15\x2e\xcd\x37\x19\x52\x52\x3a\xf7\x29\xb5\xc3\
+\xe1\xe0\x22\xe3\xc5\xc5\x45\x0e\xf5\xe2\xf1\x97\x5c\xf4\x1e\xb9\
+\x93\xe9\xae\x00\x2d\x2d\x2d\x6e\xe9\x60\xa1\xd4\xd2\x97\x0d\x8d\
+\x97\x97\x97\xe1\xf3\xf9\x60\xb3\xd9\xf8\x7d\x69\x69\x89\x43\x10\
+\x00\x8d\x0b\x0b\x0b\xcd\xb2\x00\xd0\xa2\x92\x52\x93\x11\x8d\xe9\
+\x4e\xdf\x78\x54\x3b\x35\x60\xb5\x5a\x79\xf5\xd4\x0a\xfd\xce\x60\
+\x30\x24\xf2\xf2\xf2\xee\xb3\x67\x1c\xd9\x17\x40\x53\x53\x93\x5b\
+\x9a\x67\x4a\x4f\x22\x13\xaa\x9a\xc6\x16\x8b\x99\x37\x40\x9f\x47\
+\x47\x47\x23\x6d\x6d\x6d\xde\xfc\xfc\x7c\x13\xfb\xdb\x41\xa6\xb2\
+\xbd\x9a\xff\x27\x40\x73\x73\x33\x9f\x02\x4a\x47\x10\x54\x3f\x55\
+\x3f\x3f\x3f\xcf\xeb\xd6\x68\x34\x91\xba\xba\x3a\xe7\xc3\xb4\x5d\
+\x4c\x1f\x30\x1d\xcd\xc6\x78\x47\x00\xa5\x52\xe9\x76\x3a\x9d\xbc\
+\x62\x4a\x4a\x6f\x3e\x94\xb4\xbe\xbe\xde\x99\x93\x93\x23\x99\x16\
+\x67\x53\x75\x56\x00\x8d\x8d\x8d\x6e\x8b\xc5\x82\x81\x81\x81\x48\
+\x6d\x6d\xad\x33\x37\x37\x57\x56\xd3\xdd\x00\xf8\x7f\x46\x4c\xc2\
+\x41\x99\x6e\xd7\xdf\x43\x39\x56\x18\x85\x70\xc8\x04\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x2b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\xbd\x49\x44\x41\x54\x58\xc3\xed\
+\x57\x6b\x4c\x93\x57\x18\x3e\x23\x71\xc9\x32\xe9\x16\x97\xa8\x54\
+\x65\x38\x9d\x02\x15\xf6\x03\x87\x32\x93\x01\x66\x2c\x5b\x70\xc4\
+\x30\xff\x60\xa2\x2e\x1a\x3a\x1d\x4e\x03\xba\x31\x89\x5b\xb3\x80\
+\xd9\x0c\x84\x02\x19\x58\x1c\x14\x8b\x85\xb2\x82\x95\x5e\xe4\x66\
+\x0b\x8e\x31\xf8\xc3\x46\xcb\x2d\x81\x15\xdc\xa8\xc2\x1c\x1b\xb7\
+\x6a\x69\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0d\x61\xd9\xb2\x93\
+\x3c\xed\x97\xf3\x7d\xfd\xde\xe7\xbc\xef\xf3\x5e\x4a\x00\x80\xfc\
+\x93\x20\xff\x0a\x02\x74\x09\x28\x44\x14\xd9\x14\x71\x14\x01\x2b\
+\x46\x80\xae\xdd\x64\xdd\xc6\x66\x22\x4c\xf8\x95\xc4\x8b\x47\xc8\
+\xa1\xd3\xf7\xc8\x8e\x97\x3b\x38\x32\x61\x2b\x41\x20\x85\x9c\xbe\
+\x30\x48\x2e\xdd\x80\x19\x40\x32\xab\x79\x4d\xf4\xbe\xfb\x72\x13\
+\x68\x64\x06\x91\x04\x5e\xa3\x51\xf4\x06\xee\x85\x47\xf5\xd0\xbd\
+\x83\xcb\x4d\x20\x9b\x9d\xf6\x40\x74\x2f\xbd\x16\x32\x3d\x20\x89\
+\x3f\x48\xa5\x2c\x1b\x01\x8c\x31\x79\xc1\xbb\x9d\x88\x4b\xc6\xd7\
+\xc6\x26\x0e\xa0\x10\xb9\xfd\x42\xfe\xc5\x2b\x36\x46\x8c\x12\x5c\
+\x4e\x02\x93\xa7\xa7\xa7\x0d\xcc\xd3\x39\xb9\x98\x63\x36\x14\x0a\
+\xd2\xe4\xa3\x2b\x41\x20\x8c\x29\x9e\x2a\xdf\x37\x47\xeb\xdc\x7b\
+\xb5\xcc\x89\x9e\x40\x44\x96\x54\x83\x2b\x2c\x0b\x36\x46\x48\x08\
+\x13\xf5\x64\x2a\x7b\x2e\x54\x03\x01\xf8\x03\x37\xbf\xc0\x0e\x34\
+\x2a\x54\xdf\x62\x88\x52\xd5\x2c\x58\x03\x74\x1d\x16\x08\x04\x7a\
+\x45\x55\xf5\xc8\xa0\x6d\x74\xc2\xd4\x73\xf7\x21\xbe\x73\x51\x95\
+\x90\xae\x8f\xd0\x13\xcf\xe5\x94\x83\x87\xb4\x02\x9e\xcc\x2e\x03\
+\xd4\x06\xdd\xaf\x99\xcb\xb0\xaf\xaf\xaf\x3e\xbf\xd2\x60\xb5\xdb\
+\xed\x80\xf8\x79\xe4\x3e\xc4\x5e\xab\xb4\xb9\x88\x2f\x86\x80\x27\
+\xd3\xc0\x67\xf9\x8e\x19\xf5\x60\xd7\x5e\x33\xba\x76\xda\x73\xee\
+\x68\xd8\xc7\xc7\x47\x9f\xab\xab\xb0\x0e\x0f\x0d\xc1\x10\x87\xb2\
+\xf6\x2e\xe7\x96\x37\xf7\x77\x73\x61\xd8\xbd\xe8\x5e\x80\x2f\x66\
+\x9a\xa0\x86\xdf\xa9\x36\x42\xf7\xf0\x03\xd8\x19\x9f\xd4\xcf\xa5\
+\xe7\x1a\x8a\x98\x2d\x7e\xfe\x6d\x97\x54\x1a\x6b\x5f\x5f\x1f\xb8\
+\xd0\xd1\x73\x07\x62\x72\x15\x56\x4e\xc4\x87\x97\xd4\x8c\x30\x14\
+\xe9\x15\xb7\x1e\x38\x1c\x0e\x40\xa4\xd6\x19\x31\x9e\x85\x9b\x05\
+\x7e\x6d\xa9\x25\x1a\x5b\x97\xd9\x0c\xe6\x2e\x0a\xf3\x24\x14\xdf\
+\x36\x8e\x7b\xbd\x1e\xd1\xcd\x42\xc8\x09\x6f\xa9\x04\x3c\xd1\xbd\
+\x56\xab\x15\x10\x77\x7f\x1b\x84\xf3\x92\x5c\xbb\x52\xa9\x84\xfa\
+\xfa\x7a\x30\x99\x4c\x0c\x75\xdf\x35\xc1\x51\xb1\x64\x18\xc9\x51\
+\x44\x3e\xb6\x76\xcc\xb4\x40\x4f\x93\x5f\x7e\xd3\xd6\xdf\xdf\x0f\
+\x32\x99\x0c\x44\x22\x11\xa8\x54\x2a\x90\x4a\xa5\xa0\xd1\x68\x20\
+\x4b\x5b\x39\xbe\xe9\x95\xe0\x1f\xb8\x53\xaf\x79\x2c\xf3\x00\x97\
+\x8e\x22\x9e\xc7\x86\xe6\x53\x29\x19\xf6\x82\x82\x02\xe6\xe2\xa0\
+\xa0\x20\xe0\xf1\x78\x60\xb1\x58\x40\x5b\x5e\x01\xfb\xcf\x26\x0c\
+\x2d\xa6\x53\xce\x67\x94\xcf\x09\x4c\x83\xe2\x5b\x7b\xe6\xc2\x60\
+\x9a\xb2\x14\x14\x0a\x05\x88\xc5\x62\xc8\xcc\xcc\x84\xa2\xa2\x22\
+\x50\xab\xd5\xd0\xd9\xd9\xc9\x60\xec\xfe\xc9\xb9\xc9\xdb\xa7\x75\
+\x2e\xb7\xcf\x4b\x80\xae\xb7\xd8\x29\x70\x0e\xc0\x6a\x97\xac\x78\
+\x88\xca\x7f\x82\xe2\x29\x89\x0e\x3e\x97\x2b\x21\x5b\x96\x0f\x07\
+\x63\xe3\x47\x84\x1f\x26\xd8\x92\x72\x64\x8e\x6f\x1a\xbf\x07\xa3\
+\xd1\x08\x2d\xad\x2d\xf0\xcb\xc0\x20\x1c\x38\xf1\xbe\x05\xb3\x62\
+\xc1\x04\x5c\x69\x84\x85\x85\x84\x46\xdc\x26\xe7\x32\xac\x2c\xcf\
+\x33\xb5\x13\xec\x3b\xe3\xba\xd3\x33\xaf\x82\xe5\xfe\x7a\x89\x06\
+\x9e\xde\xfc\x62\x1b\xf7\x3c\x92\x8d\x7b\x66\xab\x4f\x5b\xca\x35\
+\xed\x58\x43\x43\x3d\x34\x34\x34\x80\xa5\xb7\x17\x32\x14\xc5\xc3\
+\xf3\xe9\xc0\x65\x3c\x92\xe5\x28\x9e\x36\x5d\xe5\x9c\x2a\x32\x78\
+\x7d\xf4\x83\x2e\x5a\x6c\x12\x31\x0c\x1b\x25\xea\x71\xf7\x2f\xcb\
+\x27\xef\x05\x87\x5f\xfe\xd3\xe4\x44\x0b\x4c\x68\xf4\xc9\x3e\x75\
+\x95\x1e\x0c\x06\x03\xb4\xb7\xb7\xc3\xd7\xc6\x96\x31\xae\x81\x09\
+\x66\xf1\x36\x6d\x38\x68\x3c\x49\x3a\x3a\x65\xf8\x62\x81\x83\x44\
+\xbd\x57\x43\xb6\x0a\x5e\x9b\x2a\xc3\x94\x5c\xb0\x42\x0f\xab\x24\
+\xb4\x04\x9f\x4a\xaa\x9b\x43\x37\x31\x28\xd4\x4f\xf2\x0a\xc7\x74\
+\x3a\x1d\xd4\xd6\xd6\x82\xc9\x7c\xdb\xb9\x61\x9b\xf7\x5f\xea\x62\
+\xb2\xe5\x7e\x9c\x75\x1f\x0d\xf3\xb2\xd4\x4e\xf2\xf6\xb1\xeb\x2e\
+\xb6\xae\x94\xc3\x90\x6c\x97\x55\xc1\x4b\x57\xab\x80\x9c\x4d\x6e\
+\x5a\xd0\x1c\x49\xbd\xb1\xe7\x88\xb0\xef\xca\x57\xc5\x50\x5a\x5a\
+\x0a\x1d\x3f\xf6\x4c\x04\x06\x87\x74\x3c\xaa\x0b\xc2\x84\x46\x8d\
+\x07\xc8\x6f\x02\xd9\xf9\xaa\x7e\x9a\xf1\x30\x46\x8e\x36\x20\xaf\
+\xbc\x4a\x78\x43\x69\x00\x92\x28\x1d\x98\xcd\x95\xb3\x79\xc3\x7d\
+\x3d\xbf\xf9\x44\x6a\xa6\x5d\x2e\x97\x43\x53\x4b\x2b\x44\x1c\x7b\
+\xf7\xce\xf4\x14\x25\xae\xf1\x8a\xf5\x77\x9c\xf5\x70\x02\xc2\xd9\
+\x0f\x89\xd1\x81\x03\x4f\x8e\xf7\xdc\xd2\x69\xe7\xf3\xdf\x75\xfc\
+\x6f\x14\x2e\x36\xd2\xef\xd8\x17\x69\x49\xbe\x2c\x9d\xc8\xd3\x96\
+\x3b\xa7\x0f\x31\x8c\x25\xc6\xdf\x9f\xba\x77\x5f\x71\x35\xa0\x41\
+\x6c\xb5\x08\x8c\xf9\x94\xf1\xe0\xf0\x33\x4b\x9a\x7c\x68\x13\x5a\
+\xbd\xce\xa3\xd9\x6b\x4f\x48\xf7\x0c\x0f\xb0\x0f\xfe\xf3\x87\xc8\
+\xf9\x2f\xee\xb9\x49\x6e\x00\xf6\x7b\x3e\xed\xf7\x08\x1e\x2a\x3e\
+\x5d\xe5\x58\xaa\xf1\x47\x5a\xf5\xb6\x59\x0b\x11\x1d\xb3\x43\xc9\
+\x91\x38\x09\x39\xf9\xa9\x96\x21\xfa\x5c\x1a\x0d\xcf\xb3\xff\xff\
+\x37\xfc\x4f\x13\xf8\x1d\xe7\x87\x19\xb9\x44\xc3\x01\xcf\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xa3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\x35\x49\x44\x41\x54\x58\xc3\xe5\
+\x97\xcd\x8f\x54\x45\x14\xc5\x7f\xb7\xea\xd6\x7b\xaf\xdb\x6e\xc7\
+\xf9\x40\x9d\x89\x46\x4d\x34\x99\x44\x8d\x1a\x48\x98\xc4\x8c\x1f\
+\x1b\xfe\x02\x4c\x5c\xf1\x07\x18\x16\x2e\x4d\x5c\x6b\x58\xc3\x8e\
+\xc4\x8d\x1b\x17\xce\x82\x68\x74\x41\x5c\x18\x0d\xe2\xc4\xc6\x00\
+\x3d\x60\x50\x51\x19\x60\x02\xa2\x0e\x0c\x83\xd3\xfd\x5e\xf7\x94\
+\x8b\xaa\xee\xf9\x60\xe6\x0d\x84\x51\x16\x56\x52\xa9\xce\x7b\xb7\
+\xeb\x9e\x3a\xf7\xd4\xa9\x7a\xea\xbd\xe7\x7e\x36\xe5\x3e\xb7\x3e\
+\x80\x5d\xbb\x76\xbd\x03\xec\xfd\x8f\xf2\x4e\x35\x1a\x8d\x03\xeb\
+\x19\xd8\xbb\xef\xbd\xa3\x3b\x1f\x1f\x76\x00\x9c\x3c\x3a\xcf\xcc\
+\x97\x37\x58\x9c\xef\xdc\x53\xa6\xda\xa0\xf2\xdc\x6b\x03\xbc\xb8\
+\x67\x10\x80\x8b\x7f\x16\x7c\xf8\xee\x1e\x80\xdb\x00\x70\xfc\xec\
+\x1c\xdf\x3f\x30\x04\x78\x2e\xfd\xb8\xc0\xfe\xb7\xce\x6f\xcb\x72\
+\x0f\x1d\x79\x9a\x0b\x23\x96\xd3\x9f\x1f\x64\xfc\xd5\x7d\x9b\x6b\
+\x40\x45\xb0\x16\x40\x78\x70\x2c\x23\xcb\xb2\x6d\x01\x30\x30\x96\
+\x61\x8d\x50\x1b\x7c\x14\x23\x25\x22\x14\x2b\xd8\x18\x91\xd5\x95\
+\x73\xe7\xce\x83\x2a\xb8\x04\xd2\x14\xb2\x0c\xd2\x2c\x8c\x49\x0a\
+\x49\x12\xde\x77\x3a\x90\xe7\x90\xb7\xa1\xd5\x82\x76\x2b\x8e\x6d\
+\x28\x72\xb2\xfa\x38\xd6\x0a\xe3\xaf\xbc\x49\x6b\xf1\xfa\xe6\x00\
+\xac\x15\xac\x15\x04\xb0\x46\xd8\xbd\x7b\xe7\x16\x6b\xeb\x86\xae\
+\x80\x5a\xa8\x56\x81\xea\x6d\x51\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\
+\x84\x01\x67\x05\x35\x82\x08\xa8\x0a\x95\x2c\xc3\x23\x20\x1e\x08\
+\xc0\xf0\x1e\x2f\x02\xde\x23\x12\x26\x15\x7c\x88\x23\xc4\x21\x1e\
+\x3c\x21\x5e\x40\x4d\x58\x18\x40\xd7\x4a\x89\x06\xac\xa0\xda\x63\
+\x00\x9a\x33\xbf\x05\x8a\x53\x07\x69\x02\x95\x04\xb2\x34\xf6\x04\
+\x12\x07\x4e\xa1\xe8\x40\x5e\x40\x2b\x8f\xbd\x05\x4b\x39\xb4\x73\
+\xc8\x0b\x54\x87\x71\x3d\x00\x2a\xe5\x25\x70\x31\x40\xd5\x30\x39\
+\xf9\xd2\xd6\x0a\xf3\x3e\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8\x27\x61\
+\x61\xbd\x1c\x25\x25\x20\x00\xf0\x81\x8d\x34\x4d\xa3\x3a\xc3\xb3\
+\x98\x11\x89\x6c\x07\xda\x63\x09\x56\x98\x5f\x29\x46\xfc\x61\xcd\
+\x72\x7f\x61\x1d\x2d\xd1\x80\x3a\x09\x54\x49\x18\x4f\x34\x2f\xe0\
+\x9d\x85\xc4\x21\x89\xc3\x67\x09\x92\x69\xd8\x11\x89\xe2\x13\x87\
+\x58\x8b\xef\x76\x91\xbc\x80\xbc\x03\xed\x02\xdf\x6a\x23\xed\x02\
+\xf2\x02\x9f\x77\x50\x1d\x45\xd5\x20\x78\x3a\xeb\x54\x78\x9b\x06\
+\x9c\x33\x78\x0f\x03\x8f\x24\xbc\xfe\xf2\xf3\x77\x68\xe8\x36\x68\
+\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04\x52\x5e\x82\x44\x4d\x5f\x84\
+\x8f\x0d\xa5\x38\xe7\xb6\xc5\x88\x9e\x18\x4b\xb9\x76\xb3\x03\x08\
+\x9d\x52\x11\xaa\x90\xb8\x50\xef\x5a\xc5\x30\x7d\xb1\xcb\x40\xc5\
+\xb0\x0e\xf4\x26\xad\x57\xf9\x55\x2e\xe1\xe1\xc6\xd2\x32\xf5\xcc\
+\x70\x7d\xc9\x84\x2d\xe9\x4a\x19\x10\x9c\x1a\xc0\x73\xe5\x66\x97\
+\x2b\x37\xbb\xac\x51\x57\x3f\xd7\xaa\x64\x7e\xc5\x27\xa2\x29\xac\
+\x05\x15\xc3\x9c\x0b\xb5\x77\xa6\x6c\x17\xa8\xc1\xa9\x20\xc8\x1a\
+\x35\xaf\x9b\x35\x1a\x8f\x59\x31\x9e\xfe\x7b\xe9\xef\x14\x00\xf1\
+\x82\xef\x9b\x58\x30\x2b\x57\x56\x02\x55\x21\xd1\x90\xfc\xe7\x53\
+\xdf\xf2\xeb\x99\x13\x2c\x2d\xde\xb8\xa7\xfa\x57\x6a\x03\x3c\xf5\
+\xec\x4e\x9e\x79\x61\x02\x0f\xa8\x33\x5b\x31\x10\x03\x7c\x87\xf7\
+\xf7\xbf\xc1\xc2\xc2\x02\xb7\x6e\xdd\xa2\x28\x0a\x44\x04\x6b\x2d\
+\xd6\x5a\x54\x15\x55\xc5\x39\x87\xaa\x62\xad\xc5\x98\xf0\xdf\xe5\
+\xe5\x65\xf2\x3c\xef\xf7\x23\xcd\xf9\xb8\xf2\x2d\x18\x70\x56\x50\
+\x17\x18\xdc\x31\x3a\xb6\x72\x4f\x38\x7e\x9c\xe9\xe9\x69\x8c\x31\
+\x78\xef\x99\x98\x98\x60\x72\x72\xf2\x8e\x59\xd8\x31\x3a\xd6\xdf\
+\x86\xae\xd4\x09\x55\x70\x36\xac\xa2\x56\xaf\xf7\x6b\x39\x33\x33\
+\xc3\xd0\xd0\x10\xd6\x5a\xbc\xf7\x34\x9b\xcd\xbb\x02\x50\xab\xd7\
+\x70\xd1\x88\xb4\xd4\x88\x14\x9c\x0b\x27\x5c\xa0\x2a\x00\xa8\x56\
+\xab\x64\x59\xd6\xa7\xb8\x37\xde\x69\x73\x1a\xa9\x17\x41\x4b\xad\
+\x38\x1e\xc7\xbd\x23\xb4\xd7\x8c\x31\x88\x44\xdf\x8f\x3a\xb8\xab\
+\x9b\xaf\x35\xa8\x0d\xf3\xf6\x18\x2e\x3d\x8e\x83\x29\x6d\xe3\xd5\
+\xdb\x12\xa9\xf7\xe5\x56\x6c\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\
+\xdb\x02\xe0\xa1\x91\x61\xd4\xc2\xb5\x2b\x97\x59\x9c\xbf\xbe\x05\
+\x03\x36\xf8\xc0\x60\xad\x02\x0b\xdb\xc3\xc0\x50\xad\xc2\xec\xc5\
+\x4b\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa6\x36\x04\x60\x24\x5e\
+\x4a\x05\x12\x0b\xed\x91\x27\xa9\x3d\x0c\x6f\x1f\x38\xc8\x66\xc7\
+\x81\x27\x3a\xf1\x2a\xe7\x35\x1e\x32\x81\x14\x28\xba\x70\xf9\xea\
+\x55\xce\x34\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1f\x4e\x1d\x02\x0e\x6f\
+\x08\xe0\xb3\x8f\x3e\xe0\xa7\xd3\x27\x57\x99\xe9\xda\xa3\x86\x55\
+\xe6\xbb\x1e\x04\x1b\x3c\x5f\x1d\x6f\x7c\x77\xee\x8f\xd9\x5f\x0e\
+\x01\x87\x1b\x8d\xc6\x5f\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5\x73\
+\x6c\x7d\xf2\x35\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1\x3f\x4d\xf0\
+\x4b\xb9\xe8\x46\x89\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\x6d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x06\x34\x49\x44\x41\x54\x78\x5e\xad\x97\x5b\x6c\x54\xc7\
+\x1d\xc6\x7f\x73\xce\xd9\x8b\xbd\xf6\xfa\x16\xa0\xbe\x00\x0e\xb2\
+\x69\x63\x24\x42\x4a\x21\x22\xa1\x2d\x95\x62\xa5\x2f\xee\x4b\x68\
+\x2b\x95\xa6\x55\xa5\xc6\x60\x55\xaa\xda\xb4\xaa\xfa\x56\x09\x55\
+\xca\x03\x94\x27\xda\x07\x84\x14\x29\xad\xc4\x8b\xa5\x52\x83\x79\
+\x08\xc5\x18\x39\x0e\x69\xd3\x84\x9a\x9b\x63\x6a\xec\xb2\x04\x1b\
+\x3b\xbb\xf6\x7a\x8f\xbd\xbb\xde\xb3\x67\xa6\xc3\x68\x85\xe5\x72\
+\x6c\x88\xc9\x27\x7d\xfa\x9f\x9d\x87\xfd\x7e\xf3\x9f\x99\x73\x11\
+\x4a\x29\x82\x24\x84\x78\x05\x78\x9e\xc7\x6b\x48\x29\xf5\x77\xd6\
+\x28\x27\x20\xb8\x43\xbb\x01\x68\x97\x52\xbe\xc6\x63\x64\x59\xd6\
+\x07\x1a\xf6\xbb\x40\xb7\x06\x39\xff\x14\x00\x26\xfc\xb7\xed\xf5\
+\xe2\x60\x5d\x44\x44\x6e\xce\x89\x8a\x2b\x57\xae\x50\x5d\x53\x8d\
+\x40\x00\xa0\x50\x08\x65\x28\x41\x29\x66\xd3\x69\x5e\xa9\x17\x2f\
+\xbc\xb4\x4e\x6c\x3b\xf1\x1f\xb9\x47\x83\x7c\x5b\x43\x4c\x3c\x4d\
+\x07\xf6\xff\x60\x8b\xdd\x2c\x25\xf8\x4a\x32\x3c\x3c\x4c\x65\x65\
+\x25\x2b\xc9\x75\x5d\x1e\xc0\x6e\xa9\xb0\x22\x1b\xa2\x2a\x72\x3f\
+\xa7\xea\x81\xb5\x03\x08\x2d\x05\x48\xa1\x0d\xf4\x5d\xbc\x48\x2e\
+\x97\xc3\x2f\x16\x51\x4a\x91\xcf\xe7\x59\x5c\x5c\xa4\x50\x28\x50\
+\xd4\x63\xb5\xb5\xb5\x94\x01\x58\x80\xf8\x82\xf6\x80\x01\x00\x36\
+\x44\x05\x1f\x0f\xbc\x4b\x3e\x3b\x8f\x85\x44\x95\x32\xe2\xb6\xc4\
+\xb6\x04\x21\x21\x70\x3e\x53\x6c\x8c\x3b\x80\x44\x2a\x04\xf0\x9c\
+\x10\x02\xe0\xcb\x40\x05\x50\x0f\x34\x60\xc4\x48\x69\x9f\x24\x02\
+\x01\x4e\x9c\x38\x21\x00\x81\x05\xd2\x87\x96\x96\x67\x09\x65\x6d\
+\x14\xe5\x28\xa5\xb4\x41\x08\x58\x57\x19\x25\xe2\xd8\x44\x42\x16\
+\xc3\x13\x73\x5c\xbc\x3d\x41\xf7\x58\x8e\x5c\x24\xbe\xa9\xbd\x7d\
+\xf7\xef\x2d\xcb\x5a\xdc\xb1\x63\x47\x59\x55\x55\x95\xd3\xd8\xd8\
+\x18\x7e\xe0\x86\x86\x86\xd0\xa5\x4b\x97\xdc\xae\xae\xae\x08\xf0\
+\xd6\xaa\x1d\x00\x13\x44\x55\x2c\xc2\x73\xd5\x31\xf2\x9e\x4f\xa1\
+\x28\x91\x4a\x61\x09\x41\xd8\xb1\x88\x86\x6c\xe6\x72\x05\x12\xa2\
+\x8e\x3f\x9f\xff\x2b\x0d\x4d\x1b\x01\x22\xc0\x66\x96\x84\xef\xfb\
+\x78\x9e\x47\x75\x75\xb5\x9e\x50\x4b\xf4\xea\xd5\xab\x87\x84\x10\
+\x28\xa5\xde\x5a\x11\xc0\xb2\x41\x00\xb6\x2d\x90\xda\xb6\x14\x38\
+\x08\xa4\x12\x58\xc2\x8c\x1b\x8f\x4c\xb9\xec\x7b\xf5\x3b\xd4\x37\
+\x36\x11\x7c\x2f\xc1\x84\x67\x32\x19\xca\xcb\xcb\xcd\x66\x3e\x76\
+\xec\xd8\x26\xbd\x7f\x0e\x2e\x41\x2c\x01\xd0\xd9\xd9\xa9\x0e\x1d\
+\x3a\xa4\x6c\x21\x08\x59\x10\xb6\x2d\x1c\xc7\xc6\x42\x50\xb4\xcd\
+\x1a\x1b\x00\xc7\xb2\x88\x38\x96\xae\x02\x60\x59\x78\x10\xc0\xdc\
+\xdc\x1c\x35\x35\x35\x06\x20\x1a\x8d\x72\xe4\xc8\x91\xcd\xc0\x03\
+\x88\x1b\x1a\xa2\xc7\x62\xb9\xb0\x6d\x74\x30\x66\x8d\xcb\x23\x36\
+\xb1\xa8\xa3\xc7\x2c\x32\x8b\x1e\x93\x99\x1c\x63\xa9\x79\xee\xcc\
+\x2e\xe8\xdf\x45\x72\xf9\x3c\xab\xc8\x2c\x41\x36\x9b\x35\xa7\x66\
+\xe9\xff\x6d\x0e\x1c\x38\xb0\x1e\xe8\x00\x58\x06\xa0\xb4\x74\x16\
+\x8e\x0d\xe1\x90\xc0\x53\x8a\xb1\xa4\xcb\x8d\x8c\x83\xd3\xb2\x97\
+\xa6\x7d\xaf\xb3\xb5\xe3\x17\xac\xdb\xfb\x3a\x0d\x2f\xb4\x73\xfb\
+\xce\x24\xfd\xfd\xfd\x24\x93\x49\x94\x52\xe6\xfa\xf8\xf1\xe3\xe8\
+\xba\xac\x33\xe7\xce\x9d\xe3\xe8\xd1\xa3\x1c\x3e\x7c\x98\xde\xde\
+\x5e\x12\x89\x84\x04\x2c\xa1\x15\xdc\x01\xed\xff\xce\xe6\xf8\xe7\
+\x94\x4f\x6b\xc7\xcf\xf8\xe6\x2f\xdf\x26\xf6\xf5\x37\x99\x7c\xa6\
+\x83\x6b\xfe\x2e\xae\xf1\x2d\x64\x6b\x17\xad\x7b\x7f\x4e\x5e\x56\
+\x73\xfa\x6f\x67\xd1\x77\x4d\xee\xdc\x9d\xe2\x1b\xaf\x76\x72\xfd\
+\xfa\x75\x03\xa0\x67\x6b\xd6\x3f\x16\x8b\x99\xeb\x78\x3c\x8e\xe3\
+\x38\x25\x38\x04\xc0\x23\x00\x96\x25\x98\xca\x41\x3a\xde\xca\xfe\
+\xdf\xbd\x4d\xd5\xae\xd7\x28\x84\x62\x08\xdb\x42\x59\x82\x6c\x41\
+\x72\x7f\x66\x91\x4f\xee\x66\x18\xb8\xea\x72\xfa\x1f\x61\x64\xd5\
+\x5e\xae\x8f\xdc\x67\x32\xd7\xc6\x85\x0f\xee\x9b\x00\xed\x87\xa1\
+\xcd\xcd\xcd\xb4\xb5\xb5\x19\x37\x35\x35\xa1\xa1\x14\x20\x83\x1f\
+\x46\x16\xdc\x71\x15\xdf\xff\xe9\x6f\xa8\x6c\xd8\x48\xe2\xec\x3b\
+\x4c\x8f\x5e\xc3\x89\x94\xb1\xb5\x79\x07\x9b\x5b\xb6\xf3\x49\x79\
+\x25\x63\x09\x97\xcf\x66\xf2\xdc\x9d\xce\x32\xa1\xed\x88\x0d\x4c\
+\x27\xe7\xd8\xb7\x2b\xca\xfa\x25\x00\x33\x7b\x3d\x6b\xea\xea\xea\
+\x00\xcc\x75\x2a\x95\x32\x00\x4a\x2b\x10\xa0\xb9\x5a\x70\xe1\x9d\
+\x63\x28\x2c\xca\xe6\xc6\xd9\x10\x8f\x52\x94\x92\x7b\xc3\x7d\x24\
+\x65\x05\xdb\xda\x7f\x4c\x4d\xdb\xcb\x7c\x3c\x9c\x66\xd2\x5f\xc0\
+\xcd\x78\x2c\xcc\x6b\x2f\x78\x20\x00\xb5\x74\x3a\x42\xa1\x90\x09\
+\x2d\xdd\xea\x1f\x8e\x01\x2a\xf8\x3e\x60\xc1\xc6\xb8\xa0\x50\x1c\
+\x23\x1c\x8b\x53\xb7\xa5\x96\x92\x78\x76\x7d\x05\xe9\xac\xc7\x68\
+\xff\x9f\x98\xae\xbc\x4c\xcb\xf6\x83\xb8\x0b\x61\xbc\x82\xa4\x58\
+\x94\x78\xda\x21\xc7\x42\x2d\xaa\x80\xe3\x69\xa0\x96\xd5\x15\x01\
+\x00\xd6\xc7\x43\x84\xca\x23\xfc\xbf\x6a\x63\x21\x9e\xa9\x0c\x73\
+\xe1\xdf\x83\xec\xd9\xf9\x13\xca\xa3\x0e\xb9\x32\x47\x03\x28\x03\
+\x61\x6b\x00\x16\x4b\x21\xa5\x1c\x25\x30\x2a\x15\xa4\x5c\x05\x40\
+\x58\xa5\x2a\xcc\xf5\x23\xfa\x70\x6c\x86\xf1\x59\x8f\xef\xfd\xfa\
+\x8f\xdc\xca\xd4\xe0\x44\x5c\xa2\x11\x1b\xcf\x93\x14\x3d\x07\xd3\
+\x01\xa5\x90\x52\xf2\x50\x6a\x59\x01\x56\x05\x10\x08\x4c\x0d\x04\
+\x18\x9d\x76\xf9\xd5\x5f\x86\x18\xbd\xb7\x80\x3d\x93\x67\xd3\xba\
+\x32\xf2\x79\x5f\xbb\x68\xea\xce\xaf\xd4\x70\xf9\xdd\xe0\x25\x00\
+\x9e\x78\x09\x4c\xb8\x10\x3c\xa2\xd6\x2f\x55\xf2\x87\x1f\x3e\xcf\
+\xf5\x4f\x33\x44\x1b\xb7\xb1\xf3\xc5\x97\x59\x12\x5c\x4e\x60\x8e\
+\xdb\x53\x01\x28\xc0\x12\x25\x00\x6d\xd4\x52\x7d\xb1\xb5\x96\xdd\
+\x5b\xe2\x74\xbf\x97\xa5\x6a\xf7\x57\xf9\xd1\x1b\x6f\x10\xa0\xb5\
+\x03\x98\xb5\x37\xd5\xd8\x08\x01\xd2\xcb\x53\x70\x53\x78\xf3\x33\
+\x14\xb3\x69\x0a\x19\x1f\x25\xfd\xd5\x82\xd6\x08\xf0\xf0\x29\xe7\
+\xe3\xe7\x33\x14\xe6\x75\xa8\x0e\xd6\x00\xcb\xf7\x89\x10\xc1\x33\
+\x7d\xfa\xd7\x72\x8c\xb2\x13\x37\x03\xc7\x01\xb2\x1e\xfe\xad\x94\
+\xcc\x6f\xf7\x44\x54\x03\xd8\x5f\x70\x07\x08\x92\x09\xfd\xd7\x3d\
+\x3f\xfd\x7e\x42\xa6\xcf\xdf\xf6\xef\x02\xee\x76\x3b\xfc\x92\x06\
+\xa8\xe3\x73\xca\x75\x5d\x1f\x70\x57\xed\x00\x40\x32\xab\x0a\x1f\
+\x7e\x2a\xd3\xbd\xb7\xfc\xd4\xcd\x69\x39\x05\xf4\x03\x97\x74\x68\
+\xbf\x10\xa2\xd3\xb6\xed\xaf\x7d\x9e\x25\x58\x58\x58\xf0\x07\x06\
+\x06\xd2\x27\x4f\x9e\x9c\x06\xba\x83\x00\x3e\x1a\x49\xca\xad\xe3\
+\xb3\x2a\xd7\x3b\xe2\xa7\x6e\x4c\xcb\xd1\x52\xe8\x59\x1d\x74\x8b\
+\x00\x3d\x09\xc0\xd0\xd0\x90\xdb\xd3\xd3\x93\xd2\x4e\xcf\xce\xce\
+\x9e\x2e\xbd\x1d\xdf\x08\x02\xe8\xee\xea\x29\x00\x8c\x04\x84\x06\
+\x85\xaf\x08\x30\x35\x35\x55\xd0\x2f\x22\xa9\x53\xa7\x4e\x25\xc7\
+\xc7\xc7\x2f\x03\x67\x81\x7e\x1d\xec\xae\xb8\x09\x4b\xdf\x76\xda\
+\x4f\x26\x85\x01\x40\x08\x40\x61\x5a\xfc\xde\xe0\x60\xba\xbb\xbb\
+\x3b\xa5\xdf\x8a\xcc\x24\xd0\x5e\xed\x73\xcd\x61\xed\x9a\x77\x33\
+\x6e\x11\x60\x70\xf0\xfd\x74\x5f\x5f\x5f\xfa\xcc\x99\x33\xa6\xc5\
+\xa5\xd0\x8f\x78\x02\x89\xb5\x9e\x63\x21\x44\x18\x78\x13\xd8\x4f\
+\x69\x73\x06\xb4\xf8\xb1\xfa\x1f\xbd\xfa\x2a\x5f\xf2\xd8\x15\x9d\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x08\x19\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x07\xab\x49\x44\x41\x54\x58\xc3\xad\
+\x57\x5b\x50\x93\x67\x1a\xf6\xca\xce\xec\xcc\xf6\x62\x2f\xbc\xd9\
+\xe9\xce\xec\x6e\xbd\xda\xd9\x9b\xb5\xce\xba\x3b\x7b\xb0\xad\xcc\
+\x7a\xb1\xce\xce\x3a\xb3\x76\x54\x70\x75\xdb\xe2\x81\xd6\xb6\x54\
+\x04\xbb\xa5\x20\x6d\xc1\x82\x06\x08\x07\x51\x42\x80\x80\x80\x02\
+\x21\x81\x10\x92\x40\x48\x10\x73\x24\x21\x67\x72\x80\x04\x42\x20\
+\x9c\x09\x47\xb5\x54\x78\xf6\xfb\x7e\x13\x16\x30\x58\x8b\x7d\x67\
+\x9e\xf9\x2f\x92\xfc\xcf\xfb\x3e\xcf\xfb\xbe\xdf\x97\x5d\x00\x76\
+\xfd\x98\x20\xf1\x0b\x82\x14\x02\x03\xc1\x75\x82\x03\xcf\xfd\xfe\
+\x8f\x48\xbc\x9b\x20\xe1\x57\xaf\xef\xb5\x2a\x8c\xd6\x65\xdb\x02\
+\x60\x19\x1e\x5b\x09\x27\xf1\x33\xfa\x19\x81\x22\xfc\xdc\x3e\x76\
+\x48\x7e\x8a\xa0\xb9\xb6\x59\x1c\x32\xcf\xad\x42\x39\xfe\x1d\x44\
+\xf6\x51\xd8\xc7\xe6\xe8\x87\x86\x3d\x7b\xf6\x58\x53\x52\xae\x2c\
+\xca\x3a\x3a\x10\x4e\xe2\xe5\x49\xc3\xc4\x31\x04\xb7\x3e\x49\xf9\
+\x2c\x60\x9b\x5d\x59\x53\x4d\x03\x4d\xb6\x11\x34\xeb\xfb\x20\x31\
+\x79\x60\x19\x9d\xc5\xbb\xef\xbe\x3f\xc5\xab\xbe\x83\xf1\x89\x29\
+\x4c\x4f\xcf\xae\x92\xef\xd7\xbc\x74\x02\x11\x9f\x0f\xbe\x1d\xe3\
+\xb2\x04\x43\x4f\xb4\x33\x40\x8b\x7b\x06\xcd\x3d\x2e\x34\xeb\xec\
+\xa8\x57\xf6\x20\x87\x53\x85\x32\x5e\x35\x43\xbc\xb0\xf4\x90\x81\
+\xc1\x60\x5c\x26\xbf\x4b\x7c\xe1\x04\x48\x1c\x24\x38\x41\xfd\xdd\
+\xea\x73\x27\xf1\xb9\x27\x04\x48\x87\x97\xc1\xd7\xbb\x20\x22\x55\
+\x37\xdc\x37\xa2\xb8\x4e\x88\x2c\x56\x3e\xcc\x56\xdb\x3a\x71\x04\
+\x2c\x16\x6b\x2c\xfc\xce\xe7\x27\x10\x91\x36\x93\x95\x3f\x46\x7d\
+\xa5\xfe\x12\xc4\x6f\xf4\x59\x31\xb6\x02\x7e\xef\x20\x5a\x7b\x9c\
+\xe0\x3f\x30\xa1\x4c\x28\x43\x46\x0e\x1b\xb2\x0e\xf9\x26\xd2\xf9\
+\xc5\x65\xcc\x2d\x2c\x21\x34\xbf\x88\xbd\x7b\xf7\x5a\xc9\x3b\x7e\
+\xba\x6d\x02\x24\x7e\x43\x90\x46\x3d\x35\x13\x69\x75\xb3\x80\xd2\
+\x3f\x0f\xcb\xc4\xe2\x9a\x50\xa1\x5a\xb4\x6c\xf1\x59\xa0\xb6\xa0\
+\xa6\x5d\x8d\x2f\xb2\x73\x71\xb7\x9e\xff\x0c\x31\x25\x9d\x09\xcd\
+\x63\x62\x6a\x06\x83\x43\x81\x27\xe4\xdd\xbc\x2d\xd3\xb0\x3b\x92\
+\x03\x33\x26\xd4\x53\xb5\xd3\xfb\x58\x4f\x88\xc5\x03\x21\x88\x2c\
+\x43\x50\xba\x46\xd0\xed\x09\x42\xe5\x9b\x42\x9b\x73\xfc\xa9\xcf\
+\x5a\x1b\xee\x2a\x74\xc8\xbc\xc9\x45\x09\xa7\x6c\x93\xcf\x9b\x88\
+\x27\xa7\x11\x18\x1d\xc3\x80\x6f\x08\xa2\xd6\xd6\x25\xc2\x51\xdb\
+\x28\x12\x87\xc6\x1f\xaf\x82\x2f\x62\x94\x4d\x89\x24\x90\x22\xea\
+\x52\x2d\x9a\x42\xab\xe8\x18\x79\x04\xa1\xc5\xcf\x10\x53\x74\xf6\
+\x0d\xa3\xd3\xe1\x87\xd4\x3c\x80\x16\xbd\x03\x0d\x5d\x06\x14\xd5\
+\x0a\x90\x91\x95\x0d\x2f\x79\xf1\xc6\xaa\xa9\xd4\xb3\x73\x0b\x4c\
+\xc5\x94\xd8\xdd\xef\x85\xc9\x62\x05\xb7\xbc\x12\xa5\xe5\x95\x4b\
+\x13\xf3\xcb\xab\x23\x0f\x01\x37\xd9\x11\xe6\xd9\x15\x84\x97\x15\
+\x13\x06\xcb\x3c\xd0\x68\xf2\xa3\xdd\xee\x5f\x27\x96\x3b\x86\x20\
+\xb3\x78\xd7\x7d\xe6\x08\xa4\xf8\x3c\x33\x1b\x2a\x8d\x36\xaa\xdc\
+\x53\x33\x21\x8c\x8e\x8d\x33\x15\xd3\x26\xe4\x37\x09\xf1\xc1\xc5\
+\x8f\x51\x73\xaf\x01\xbe\x65\x60\xfc\x11\xa0\x23\x13\x23\xf2\xce\
+\xa1\xbe\x5d\xb9\xb8\x51\x01\x83\x81\x74\x74\x4d\xa7\x1e\x0a\x67\
+\x80\xa9\xb8\xdd\xea\x83\xd8\xe8\x42\x93\xca\xcc\xf8\x7c\xe5\xcb\
+\x2c\x88\xda\x24\x51\x89\xa7\x67\xe7\x18\x1b\x86\x86\x47\x60\x77\
+\x38\x49\x82\x3a\x24\x7c\xf8\x21\xae\xb3\x0b\xe1\x99\x5c\x80\x6f\
+\x09\xd0\x90\xde\xe1\x0f\x2c\x81\xab\x1f\xc4\x7d\xef\x04\xdd\x07\
+\x1d\x61\xeb\xff\x9f\xc0\x1d\xb9\x16\x1d\xf6\x21\x48\xcc\xfd\x4f\
+\x7d\xee\xd4\x22\x9d\x55\x84\xaa\x9a\xba\x4d\x3e\x47\xe4\x8e\xf8\
+\x3c\x3c\x12\x84\xd3\xdd\x0f\xbd\xc1\x88\xc2\xe2\x62\x9c\x7e\x2f\
+\x1e\x3d\x03\x01\xf4\x2f\x02\x83\x84\xbc\xc5\xff\x2d\xee\x3a\x43\
+\x28\x51\x91\xf7\xf6\x05\xf1\x4e\xdc\xbf\x7d\x84\x33\x69\xe3\x20\
+\x18\xf4\x33\xab\xe0\xc9\x54\x68\x35\x38\xd1\xd8\xdd\x0b\x9e\x58\
+\x89\xac\x5c\xf6\x33\x3e\x47\xaa\x9e\x9c\x9e\x65\xe4\xee\xf7\x0e\
+\xa2\xd7\x6c\x41\x43\x03\x1f\x27\x62\xe3\x20\xe9\xd6\xc0\x45\xcf\
+\x01\x52\x90\x24\xb8\x86\xb2\x9e\x00\x6e\xb4\xdb\x50\xd1\x1b\x44\
+\x85\xce\x8b\x4a\x7e\x0b\x6d\xbe\x9b\x5b\x27\xd1\xa0\x99\xf8\x16\
+\x65\x22\x05\xee\x29\xf4\x28\x13\xc8\x90\x78\x35\x0b\x1a\xad\x3e\
+\xaa\xdc\x63\x13\x93\xf0\x0d\x0d\xc3\x66\xef\x83\xb4\x5d\x8e\xc4\
+\x4b\x97\x90\xc3\xca\xc3\xd4\x63\xc0\x4e\x7a\x49\x31\x4e\xfa\x89\
+\x94\x7f\x5b\x3b\x84\x7c\x85\x13\x25\x6a\x1f\x4a\xd5\x03\xe8\xf2\
+\x30\xa3\x28\x22\xf8\xf9\x33\x09\x74\x8f\x2e\xa1\xa8\xbe\x15\xa5\
+\x7c\x09\xb2\x4a\x2a\xf0\xcf\xe3\x71\x51\xe5\xf6\x07\x46\xd1\xe7\
+\xf2\x40\xab\x37\x20\xfd\x6a\x06\x92\xbf\x48\x83\xcd\x37\x02\x27\
+\xa9\xda\x40\x1a\x4c\xe0\x7b\x88\x52\x9d\x1f\x45\xdd\xfd\x0c\x71\
+\x41\x97\x1b\xc5\xdd\x1e\x88\x9c\x41\xfc\xf9\xcd\xb7\x5d\x84\xeb\
+\x6c\xb4\x43\xd0\x28\xf7\x4e\x23\xa7\xfc\x1e\xb2\x4b\xab\xf1\x51\
+\xea\x57\x48\xfe\x6f\xea\xfa\x58\x51\xb9\x47\x82\xe3\xf0\x0c\xf8\
+\x60\x34\x99\x51\xc9\xab\xc2\xfb\x67\xcf\x41\xfe\x40\x03\x3f\xe9\
+\x6e\xb2\x8d\x19\xb9\x6f\x69\x06\x19\xd2\x9b\x2a\x2f\x72\xe5\x0e\
+\xe4\x75\xf6\xa1\xf0\xbe\x1b\x1c\x95\x1b\xf9\x9c\xca\x29\xc2\x53\
+\xb8\xdd\x29\xdc\x2b\x76\x04\x90\x51\xc8\xc5\x95\x6b\x79\x38\x11\
+\x9f\x80\x9b\xb7\x6e\x33\x63\x15\x91\xdb\x6a\x73\x40\x22\x6d\xc7\
+\x85\x84\x0f\x50\x74\xbb\x0c\xf3\x2b\x80\x9f\x34\x58\xf7\x24\x20\
+\x1c\x7c\x84\x4a\xd3\x18\x38\xfa\x61\x86\x9c\x56\xfd\x55\xb3\x1e\
+\xac\x0e\x3b\xb8\x3a\x1f\xd9\x21\x1e\x7a\x2f\xe0\x13\xbc\xba\x5d\
+\x02\x26\xbe\xc1\x83\x94\x6f\xd8\x38\x9f\x9c\x8a\x03\x7f\x3d\x04\
+\x63\xaf\x99\xe9\x6e\x2a\xb7\x46\xd7\x83\xa4\xcb\xc9\x48\xff\x3a\
+\x8b\x8c\xd5\x3c\x53\xb5\x71\xf6\xa9\xdc\x35\xf6\x69\x5c\x97\x59\
+\x19\xd9\xbf\x6e\x21\xa7\xa0\xd4\x82\x74\xbe\x1a\x57\x9b\x34\x60\
+\xc9\xcc\x10\xbb\x82\xf8\xe5\xaf\x5f\xa7\x67\xc0\x3b\xe1\x75\x1f\
+\x35\xcc\x35\xdd\x66\x7c\x94\x96\x85\xb8\x73\x17\xf1\x97\x43\x31\
+\x4c\xd5\x74\x99\xf0\xaa\xaa\x71\xfa\xf4\x19\x68\xcc\x0e\x8c\x92\
+\x2d\x36\x14\x1e\xab\x5a\xc7\x0c\x78\xe6\x71\x70\x0d\x23\x4c\xa3\
+\x65\x8a\x0c\x8c\xec\xb4\xfa\x9c\xb6\x5e\x94\x74\x39\xd0\x66\xf7\
+\xaf\x1e\x3d\x11\x4b\x47\x2e\x6f\xc3\x79\x13\x35\x2c\x5c\x99\x1a\
+\xf1\x97\x3e\xc7\xd1\xd8\x33\xf8\x38\x31\x09\x86\x5e\x13\x1a\x9b\
+\x04\xf8\xdd\x1b\xfb\x51\x4f\xd4\xf1\x90\x99\xee\x9a\x00\xaa\xad\
+\x93\x60\x2b\x5d\x0c\x39\xf5\xbc\xf0\xbe\x67\xbd\xea\xcc\x16\x3d\
+\x4a\x55\x1e\x08\x6d\x01\x94\xd4\xf1\x43\xe1\x65\x53\x40\xf0\xca\
+\xf7\x25\x60\x2b\x6e\x6a\xc7\xa9\x84\x44\xc4\x1c\x39\x8a\xdc\x7c\
+\x36\x5a\x5a\xc5\x38\x14\x13\x83\x2f\x39\x35\xc8\x14\x6a\x98\xe6\
+\xa2\xd5\xd2\x27\xf5\x9a\x7a\x4c\x13\xa1\x49\x64\xb7\x99\x90\xdb\
+\x6e\x46\xb9\xda\x8d\x06\xa5\x76\x39\x2c\x39\x3d\xf9\x4e\x13\xec\
+\xd9\x72\xd4\x47\x0d\x3b\xab\x46\x88\x63\xff\x39\x8f\xdf\xee\xfb\
+\x3d\x1a\xf9\x02\x9c\xbf\x90\x80\x93\xf1\x17\x70\xa3\xad\x07\x19\
+\xc4\x4f\x4a\x14\xe9\x6e\xba\x58\xa8\xef\x2c\xfa\x94\x98\x50\x28\
+\xb7\x40\xe9\x0e\x3c\xf9\x57\xec\x29\x2a\x77\x2d\xc1\x67\x04\xfb\
+\xb6\xb9\xe4\x44\x8d\xbe\xcc\xb2\x5a\xfc\xe3\xe4\x19\x1c\x3c\xf4\
+\x37\xb0\x72\xf3\xb0\xef\xc0\x1f\x50\x20\xd1\x21\x89\x27\x65\x2a\
+\xa6\x4b\x85\x3e\xbf\x21\xd5\x46\xe4\x2e\x90\x5b\x21\xb0\x0c\xae\
+\xe5\xdc\xe2\xd2\x11\x13\x13\xe4\x87\x6f\x3c\xaf\x3c\xe7\x96\x15\
+\x35\x9c\x69\x45\xe5\xf8\xfb\xb1\x58\x1c\x3f\x19\x87\x37\xf6\xef\
+\xc7\x8d\x3a\x11\x92\xab\xa4\x0c\x21\xed\x70\xea\x35\x55\x21\x8b\
+\x34\x5b\xc9\x03\x37\x2a\x34\x6e\xd4\x49\x3a\x17\xc3\x72\x73\x08\
+\x8e\x6d\x95\xfb\x87\x24\xe0\x4a\x65\x73\x70\xe4\xf8\x29\x1c\x3e\
+\x7c\x98\x8c\x63\x2e\x32\x05\x2a\x5c\x22\xd5\xd3\x5d\x7e\x4d\xdc\
+\x0b\x36\xe9\x74\x76\xa7\x1d\x77\x8c\xe4\x88\xb6\xf9\x9e\x84\xb7\
+\x1a\x95\xfb\x22\xbd\x49\xfd\x80\x0b\x6d\xf4\x04\x32\x4a\x78\x4c\
+\x0f\x9c\x4b\x49\xc3\xb5\xa6\x2e\x7c\xc2\x6d\x65\x36\x59\xf1\x83\
+\x01\x5c\x97\x9a\xc1\x51\x7b\x20\xf3\x04\xd7\xce\x25\x26\x05\x36\
+\xc8\xfd\xc7\x9d\xc8\x1d\xd5\x82\xdc\x1a\x01\xce\x5e\x4e\x45\x81\
+\x58\x85\x78\xf6\x5d\x5c\xa9\x55\x90\xaa\xfb\xc0\x96\xdb\x50\xad\
+\x75\xe3\xae\x54\x41\x2f\x10\xca\x0d\x72\xbf\xba\xd3\x6a\xa3\x05\
+\xb7\xa2\x51\xf8\x1d\xaf\x43\x8d\x4f\xb9\x2d\x88\xcb\xe6\xe1\x9a\
+\x48\x8f\xaa\x1e\x2f\x9a\x35\xe6\xc7\x7f\x7a\xf3\x2d\x57\x78\xac\
+\xa8\xdc\xaf\xbd\xac\xdc\xd1\xe2\x08\xdd\x05\x5c\x75\x1f\xde\xcb\
+\xaf\x45\xb9\x76\x00\x32\x67\x60\xf5\xc2\xa7\x97\xa9\xdc\xf7\x08\
+\xd2\xa9\xdc\x3b\xf8\x03\xf3\xc2\xf1\x13\x82\xca\x1c\xee\x9d\x50\
+\x0b\x39\x94\xb8\x0d\xc2\xc8\x16\xa3\x17\x87\xc3\x2f\x22\xf7\x0e\
+\xff\xda\x6d\x8a\xdd\x61\x99\xd5\x1b\xb6\xd8\x6b\xbb\x5e\x32\xbe\
+\x2f\x89\xff\x01\x66\xb9\x5f\xfc\x11\x80\x3d\xcf\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\x07\
+\x04\xca\x57\xa7\
+\x00\x6e\
+\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x7c\x5a\x07\
+\x00\x63\
+\x00\x6f\x00\x70\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0a\xc7\x57\x87\
+\x00\x63\
+\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xc8\x58\x67\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\xa8\xba\x47\
+\x00\x70\
+\x00\x61\x00\x73\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xc1\x59\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\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\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x03\x58\
+\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x18\xdd\
+\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc5\
+\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x12\x6c\
+\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x08\x96\
+"
+
+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()
diff --git a/examples/widgets/mainwindows/application/images/copy.png b/examples/widgets/mainwindows/application/images/copy.png
new file mode 100644
index 000000000..2aeb28288
--- /dev/null
+++ b/examples/widgets/mainwindows/application/images/copy.png
Binary files differ
diff --git a/examples/widgets/mainwindows/application/images/cut.png b/examples/widgets/mainwindows/application/images/cut.png
new file mode 100644
index 000000000..54638e938
--- /dev/null
+++ b/examples/widgets/mainwindows/application/images/cut.png
Binary files differ
diff --git a/examples/widgets/mainwindows/application/images/new.png b/examples/widgets/mainwindows/application/images/new.png
new file mode 100644
index 000000000..12131b010
--- /dev/null
+++ b/examples/widgets/mainwindows/application/images/new.png
Binary files differ
diff --git a/examples/widgets/mainwindows/application/images/open.png b/examples/widgets/mainwindows/application/images/open.png
new file mode 100644
index 000000000..45fa2883a
--- /dev/null
+++ b/examples/widgets/mainwindows/application/images/open.png
Binary files differ
diff --git a/examples/widgets/mainwindows/application/images/paste.png b/examples/widgets/mainwindows/application/images/paste.png
new file mode 100644
index 000000000..c14425cad
--- /dev/null
+++ b/examples/widgets/mainwindows/application/images/paste.png
Binary files differ
diff --git a/examples/widgets/mainwindows/application/images/save.png b/examples/widgets/mainwindows/application/images/save.png
new file mode 100644
index 000000000..daba865fa
--- /dev/null
+++ b/examples/widgets/mainwindows/application/images/save.png
Binary files differ
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets.py b/examples/widgets/mainwindows/dockwidgets/dockwidgets.py
new file mode 100644
index 000000000..29443878a
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets.py
@@ -0,0 +1,304 @@
+#!/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 widgets/mainwindows/dockwidgets example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import QDate, QFile, Qt, QTextStream
+from PySide2.QtGui import (QFont, QIcon, QKeySequence, QTextCharFormat,
+ QTextCursor, QTextTableFormat)
+from PySide2.QtPrintSupport import QPrintDialog, QPrinter
+from PySide2.QtWidgets import (QAction, QApplication, QDialog, QDockWidget,
+ QFileDialog, QListWidget, QMainWindow, QMessageBox, QTextEdit)
+
+import dockwidgets_rc
+
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.textEdit = QTextEdit()
+ self.setCentralWidget(self.textEdit)
+
+ self.createActions()
+ self.createMenus()
+ self.createToolBars()
+ self.createStatusBar()
+ self.createDockWindows()
+
+ self.setWindowTitle("Dock Widgets")
+
+ self.newLetter()
+
+ def newLetter(self):
+ self.textEdit.clear()
+
+ cursor = self.textEdit.textCursor()
+ cursor.movePosition(QTextCursor.Start)
+ topFrame = cursor.currentFrame()
+ topFrameFormat = topFrame.frameFormat()
+ topFrameFormat.setPadding(16)
+ topFrame.setFrameFormat(topFrameFormat)
+
+ textFormat = QTextCharFormat()
+ boldFormat = QTextCharFormat()
+ boldFormat.setFontWeight(QFont.Bold)
+ italicFormat = QTextCharFormat()
+ italicFormat.setFontItalic(True)
+
+ tableFormat = QTextTableFormat()
+ tableFormat.setBorder(1)
+ tableFormat.setCellPadding(16)
+ tableFormat.setAlignment(Qt.AlignRight)
+ cursor.insertTable(1, 1, tableFormat)
+ cursor.insertText("The Firm", boldFormat)
+ cursor.insertBlock()
+ cursor.insertText("321 City Street", textFormat)
+ cursor.insertBlock()
+ cursor.insertText("Industry Park")
+ cursor.insertBlock()
+ cursor.insertText("Some Country")
+ cursor.setPosition(topFrame.lastPosition())
+ cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"),
+ textFormat)
+ cursor.insertBlock()
+ cursor.insertBlock()
+ cursor.insertText("Dear ", textFormat)
+ cursor.insertText("NAME", italicFormat)
+ cursor.insertText(",", textFormat)
+ for i in range(3):
+ cursor.insertBlock()
+ cursor.insertText("Yours sincerely,", textFormat)
+ for i in range(3):
+ cursor.insertBlock()
+ cursor.insertText("The Boss", textFormat)
+ cursor.insertBlock()
+ cursor.insertText("ADDRESS", italicFormat)
+
+ def print_(self):
+ document = self.textEdit.document()
+ printer = QPrinter()
+
+ dlg = QPrintDialog(printer, self)
+ if dlg.exec_() != QDialog.Accepted:
+ return
+
+ document.print_(printer)
+
+ self.statusBar().showMessage("Ready", 2000)
+
+ def save(self):
+ filename, _ = QFileDialog.getSaveFileName(self,
+ "Choose a file name", '.', "HTML (*.html *.htm)")
+ if not filename:
+ return
+
+ file = QFile(filename)
+ if not file.open(QFile.WriteOnly | QFile.Text):
+ QMessageBox.warning(self, "Dock Widgets",
+ "Cannot write file %s:\n%s." % (filename, file.errorString()))
+ return
+
+ out = QTextStream(file)
+ QApplication.setOverrideCursor(Qt.WaitCursor)
+ out << self.textEdit.toHtml()
+ QApplication.restoreOverrideCursor()
+
+ self.statusBar().showMessage("Saved '%s'" % filename, 2000)
+
+ def undo(self):
+ document = self.textEdit.document()
+ document.undo()
+
+ def insertCustomer(self, customer):
+ if not customer:
+ return
+ customerList = customer.split(', ')
+ document = self.textEdit.document()
+ cursor = document.find('NAME')
+ if not cursor.isNull():
+ cursor.beginEditBlock()
+ cursor.insertText(customerList[0])
+ oldcursor = cursor
+ cursor = document.find('ADDRESS')
+ if not cursor.isNull():
+ for i in customerList[1:]:
+ cursor.insertBlock()
+ cursor.insertText(i)
+ cursor.endEditBlock()
+ else:
+ oldcursor.endEditBlock()
+
+ def addParagraph(self, paragraph):
+ if not paragraph:
+ return
+ document = self.textEdit.document()
+ cursor = document.find("Yours sincerely,")
+ if cursor.isNull():
+ return
+ cursor.beginEditBlock()
+ cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor,
+ 2)
+ cursor.insertBlock()
+ cursor.insertText(paragraph)
+ cursor.insertBlock()
+ cursor.endEditBlock()
+
+ def about(self):
+ QMessageBox.about(self, "About Dock Widgets",
+ "The <b>Dock Widgets</b> example demonstrates how to use "
+ "Qt's dock widgets. You can enter your own text, click a "
+ "customer to add a customer name and address, and click "
+ "standard paragraphs to add them.")
+
+ def createActions(self):
+ self.newLetterAct = QAction(QIcon.fromTheme('document-new', QIcon(':/images/new.png')), "&New Letter",
+ self, shortcut=QKeySequence.New,
+ statusTip="Create a new form letter", triggered=self.newLetter)
+
+ self.saveAct = QAction(QIcon.fromTheme('document-save', QIcon(':/images/save.png')), "&Save...", self,
+ shortcut=QKeySequence.Save,
+ statusTip="Save the current form letter", triggered=self.save)
+
+ self.printAct = QAction(QIcon.fromTheme('document-print', QIcon(':/images/print.png')), "&Print...", self,
+ shortcut=QKeySequence.Print,
+ statusTip="Print the current form letter",
+ triggered=self.print_)
+
+ self.undoAct = QAction(QIcon.fromTheme('edit-undo', QIcon(':/images/undo.png')), "&Undo", self,
+ shortcut=QKeySequence.Undo,
+ statusTip="Undo the last editing action", triggered=self.undo)
+
+ self.quitAct = QAction("&Quit", self, shortcut="Ctrl+Q",
+ statusTip="Quit the application", triggered=self.close)
+
+ self.aboutAct = QAction("&About", self,
+ statusTip="Show the application's About box",
+ triggered=self.about)
+
+ self.aboutQtAct = QAction("About &Qt", self,
+ statusTip="Show the Qt library's About box",
+ triggered=QApplication.instance().aboutQt)
+
+ def createMenus(self):
+ self.fileMenu = self.menuBar().addMenu("&File")
+ self.fileMenu.addAction(self.newLetterAct)
+ self.fileMenu.addAction(self.saveAct)
+ self.fileMenu.addAction(self.printAct)
+ self.fileMenu.addSeparator()
+ self.fileMenu.addAction(self.quitAct)
+
+ self.editMenu = self.menuBar().addMenu("&Edit")
+ self.editMenu.addAction(self.undoAct)
+
+ self.viewMenu = self.menuBar().addMenu("&View")
+
+ self.menuBar().addSeparator()
+
+ self.helpMenu = self.menuBar().addMenu("&Help")
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+ def createToolBars(self):
+ self.fileToolBar = self.addToolBar("File")
+ self.fileToolBar.addAction(self.newLetterAct)
+ self.fileToolBar.addAction(self.saveAct)
+ self.fileToolBar.addAction(self.printAct)
+
+ self.editToolBar = self.addToolBar("Edit")
+ self.editToolBar.addAction(self.undoAct)
+
+ def createStatusBar(self):
+ self.statusBar().showMessage("Ready")
+
+ def createDockWindows(self):
+ dock = QDockWidget("Customers", self)
+ dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
+ self.customerList = QListWidget(dock)
+ self.customerList.addItems((
+ "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton",
+ "Jane Doe, Memorabilia, 23 Watersedge, Beaton",
+ "Tammy Shea, Tiblanka, 38 Sea Views, Carlton",
+ "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal",
+ "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston",
+ "Sally Hobart, Tiroli Tea, 67 Long River, Fedula"))
+ dock.setWidget(self.customerList)
+ self.addDockWidget(Qt.RightDockWidgetArea, dock)
+ self.viewMenu.addAction(dock.toggleViewAction())
+
+ dock = QDockWidget("Paragraphs", self)
+ self.paragraphsList = QListWidget(dock)
+ self.paragraphsList.addItems((
+ "Thank you for your payment which we have received today.",
+ "Your order has been dispatched and should be with you within "
+ "28 days.",
+ "We have dispatched those items that were in stock. The rest of "
+ "your order will be dispatched once all the remaining items "
+ "have arrived at our warehouse. No additional shipping "
+ "charges will be made.",
+ "You made a small overpayment (less than $5) which we will keep "
+ "on account for you, or return at your request.",
+ "You made a small underpayment (less than $1), but we have sent "
+ "your order anyway. We'll add this underpayment to your next "
+ "bill.",
+ "Unfortunately you did not send enough money. Please remit an "
+ "additional $. Your order will be dispatched as soon as the "
+ "complete amount has been received.",
+ "You made an overpayment (more than $5). Do you wish to buy more "
+ "items, or should we return the excess to you?"))
+ dock.setWidget(self.paragraphsList)
+ self.addDockWidget(Qt.RightDockWidgetArea, dock)
+ self.viewMenu.addAction(dock.toggleViewAction())
+
+ self.customerList.currentTextChanged.connect(self.insertCustomer)
+ self.paragraphsList.currentTextChanged.connect(self.addParagraph)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets.qrc b/examples/widgets/mainwindows/dockwidgets/dockwidgets.qrc
new file mode 100644
index 000000000..968feac7e
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets.qrc
@@ -0,0 +1,8 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/new.png</file>
+ <file>images/print.png</file>
+ <file>images/save.png</file>
+ <file>images/undo.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py b/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py
new file mode 100644
index 000000000..0a9c622ed
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py
@@ -0,0 +1,503 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Tue Aug 3 15:48:46 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x06\xc4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd9\x04\xdc\xb2\xda\x02\
+\x00\x00\x06\x7b\x49\x44\x41\x54\x58\xc3\xad\x57\x69\x4c\x54\x57\
+\x14\x76\x21\x62\x95\x04\x97\xa8\x25\x18\x52\x1b\x0d\x11\x45\x04\
+\xaa\xa4\x49\xb5\x56\x4d\x6c\x69\xb0\x68\xa3\xb6\xc5\xb2\x46\xfd\
+\xa3\x2c\x61\x51\x48\x24\x08\x64\xc2\x12\xd0\x22\x42\x11\x59\x44\
+\x40\x40\xf6\x91\x7d\x53\x36\x09\xb2\xa9\x08\x0e\x24\x0c\x62\x01\
+\x83\x02\x82\x0b\x08\xa9\x5f\xcf\xb9\x99\x31\xa3\x80\x9d\xb4\xf3\
+\x92\x2f\xf3\xde\xbc\x7b\xce\xf7\xdd\x73\xce\x3d\xf7\xbe\x79\xf3\
+\x54\x2e\x3b\xbb\xe8\x2f\x1c\x1d\x23\x1d\x1d\x1d\x23\x02\x1d\x1c\
+\x2e\x48\xd2\xd3\xab\x25\x97\x2e\x15\x56\x47\x46\xde\xac\x4d\x4c\
+\xac\xa8\xad\xaa\x6a\xbf\x2f\x95\x36\x41\x89\x2b\x57\x4a\xdb\x8d\
+\x8d\xf7\x7c\x49\xa6\xf3\xe7\x69\xe8\x5a\x68\x6f\xff\x47\xa1\xfc\
+\xf1\x73\x4c\xff\x0d\xb5\x10\x10\x98\x3c\x48\x76\xc6\x1a\x13\xc1\
+\x33\xf2\xf4\x4a\x7a\x3d\x36\x09\xa8\x03\xf9\xc0\x38\x2c\x2c\x7e\
+\xce\x21\xd3\xb5\x9a\x8a\xc2\xfc\xc3\x87\xfd\xa3\x8a\xab\x64\x18\
+\x7a\x0d\xb5\xe0\xe3\x1b\x3f\x4a\x76\x3f\x11\x3e\xd3\x88\x82\xed\
+\xdb\x0f\xac\x3d\xeb\x97\x89\xde\x17\x50\x0b\xf9\xe5\x32\x18\x18\
+\x18\xc7\x91\xe9\xe7\x1a\x8b\x82\xad\x6d\x58\x79\x63\xf7\x38\x64\
+\xcf\xf1\xaf\xe0\x71\x16\x16\x07\x5b\xc8\xee\x2b\x82\x96\x46\x14\
+\xd8\xd8\x04\xfb\xa4\x15\xc9\xd0\x3a\x08\xb5\x60\xe7\x18\xf4\x9c\
+\xcc\x7e\x21\x2c\xd1\x88\x00\x4b\x4b\xaf\x8d\xa1\x97\xaa\xd0\xf0\
+\x17\xd4\x42\x08\x8d\x25\x33\x7f\xc2\x0a\x8d\x2d\x49\x17\xf7\xa4\
+\xfe\x4a\x39\xa0\x0e\x22\x92\x9a\xa0\xa7\x67\x28\xd5\xe4\x6a\x98\
+\x47\xcd\xa8\x28\xbf\xfd\x2d\x8a\xba\x31\x27\x0a\xba\x80\xdc\x4e\
+\x20\xb6\x74\x00\x86\x86\x3b\xea\xc9\xcc\x54\x63\x75\x60\x67\x17\
+\x1e\xc4\x8e\xb3\x3a\x80\x8c\x36\x20\xad\x09\x48\x69\x00\x92\xea\
+\x80\x84\x6a\x20\xa6\x1c\xc8\x6c\x04\x4a\x1e\x00\xf5\xed\xe3\x68\
+\x6a\xea\x80\xaf\xaf\xef\x2b\x32\x35\xf8\xdf\xe4\x12\x89\x44\x2e\
+\x95\x96\x20\xab\x70\x00\xa9\x52\x08\x94\x10\x31\x71\x50\xf3\x01\
+\x7a\x9e\x8c\x61\x68\x68\x08\xbd\xbd\xbd\x78\xf8\xf0\x21\x1e\x3c\
+\x78\x20\x7e\x13\x13\x13\xb1\x7b\xf7\xee\xda\x43\x87\x0e\x05\x58\
+\x5a\x5a\x6e\xe4\x54\xfe\x27\x01\xa1\xa1\xa1\x7d\x13\x13\x13\x98\
+\x9c\x9c\xc4\xd4\xd4\x14\xba\xba\xba\x70\xe7\xce\x1d\xdc\xbe\x7d\
+\x1b\xf9\xf9\xf9\x28\x29\x29\x41\x55\x55\x15\xea\xeb\xeb\xd1\xdc\
+\xdc\x2c\x04\x30\x92\x92\x92\x70\xe3\xc6\x0d\xe4\xe5\xe5\x89\xfb\
+\x13\x27\x4e\xdc\xdd\xb1\x63\x87\x99\xda\x42\xec\xec\xec\x96\xd9\
+\xda\xda\x7e\x17\x12\x12\xd2\xce\x33\x54\xa2\xb0\xb0\x50\x38\x56\
+\x25\xcf\xca\xca\x42\x42\x42\x02\xc2\xc3\xc3\x11\x17\x17\x87\xab\
+\x57\xaf\x0a\x81\x7d\x7d\x7d\xe8\xe9\xe9\x11\x36\x75\x75\x75\x38\
+\x7d\xfa\xf4\x84\xb9\xb9\xf9\x6f\xe4\x5e\xfb\x93\xe4\x47\x8f\x1e\
+\xb5\xa7\xc1\x2f\xa2\xa2\xa2\x10\x1d\x1d\x8d\x8c\x8c\x0c\xc4\xc6\
+\xc6\x22\x37\x37\x17\x39\x39\x39\x88\x8c\x8c\x04\x09\x03\xbf\xbf\
+\x76\xed\x1a\x2a\x2a\x2a\x44\xd8\x47\x46\x46\x30\x3c\x3c\x8c\x67\
+\xcf\x9e\x09\xb1\x4f\x9f\x3e\xc5\xe0\xe0\x20\x06\x06\x06\x50\x50\
+\x50\x80\x86\x86\x06\x78\x78\x78\x4c\x6e\xda\xb4\xc9\x69\xce\x76\
+\x6d\x63\x63\xb3\x2b\x2c\x2c\x4c\x84\xba\xa3\xa3\x03\xf7\xee\xdd\
+\x13\xbf\x72\xb9\x5c\x08\xb8\x7c\xf9\xb2\xf8\xef\xd5\xab\x57\x18\
+\x1f\x1f\xc7\xd8\xd8\x18\x46\x47\x47\x3f\x49\xde\xdd\xdd\x8d\xca\
+\xca\x4a\x11\xb9\xb6\xb6\x36\x1c\x38\x70\x60\x88\xa8\xbe\x99\x75\
+\x95\x1c\x39\x72\x24\x4f\x26\x93\x89\xd0\xa9\x8a\x60\x43\x26\xe2\
+\xfc\x96\x95\x95\x7d\x92\x9c\xc5\x36\x36\x36\x8a\xd0\x73\x0d\x30\
+\x79\x6b\x6b\xab\x28\x54\xf6\x1b\x14\x14\x04\x13\x13\x93\xbc\x59\
+\x7b\x05\x55\x6d\x0d\xab\x56\xe6\x4f\x55\x04\x3b\x61\x42\xbe\xe7\
+\x9c\x2a\xc9\x79\xb6\xf7\xef\xdf\x17\xa9\xe0\xda\x60\x81\x2d\x2d\
+\x2d\x82\xf0\xc9\x93\x27\x78\xfc\xf8\x31\x1e\x3d\x7a\x24\x8a\xb4\
+\xa6\xa6\x06\xc1\xc1\xc1\xa0\x5a\xe8\x20\xba\xef\x67\xa4\x82\xc2\
+\x53\xdb\xd9\xd9\x89\xb9\x44\xb4\xb7\xb7\x8b\x99\x73\xf1\x71\x11\
+\x4a\xa5\x52\x14\x17\x17\x8b\x77\x4c\xa6\x0c\x3b\x93\xb2\x60\x26\
+\xe4\x48\x30\x6e\xde\xbc\x29\x0a\xd4\xdd\xdd\x1d\x5b\xb7\x6e\x95\
+\x11\xdd\xef\x04\x9d\x0f\x04\xec\xdf\xbf\xbf\x96\x0a\x50\x38\x9d\
+\x4b\x04\x3f\xf3\xcc\xf9\x9d\x6a\xce\x95\x4b\x94\x0b\x8e\x57\x06\
+\xd7\x4c\x76\x76\xb6\x28\x64\x3f\x3f\x3f\x38\x39\x39\xe1\xd8\xb1\
+\x63\xf0\xf6\xf6\xe6\x14\xb0\x00\xfb\x19\x02\xa8\x69\x14\x14\x15\
+\x15\x21\x26\x26\x06\xce\xce\xce\x48\x49\x49\x11\x8e\x55\x45\x70\
+\x1d\x30\x31\xcf\x92\x43\xcd\x62\xd3\xd2\xd2\x70\xfd\xfa\x75\xb1\
+\x62\x92\x93\x93\x71\xfe\xfc\x79\xae\x78\xb8\xba\xba\x82\x7a\x09\
+\x32\x33\x33\xe1\x1b\xef\x0c\xef\xaa\xc3\x42\x84\xb1\xb1\xf1\xec\
+\x02\xf6\xed\xdb\x17\x74\xf7\xee\x5d\x51\x64\xfd\xfd\xfd\x48\x4f\
+\x4f\x87\x97\x97\x97\x58\x7a\x4c\xa6\x14\xc1\xa1\x8f\x8f\x8f\x17\
+\x4d\x86\x09\x79\x75\x04\x04\x04\x88\xf0\x32\x31\x17\x1a\x0b\xe2\
+\x34\x95\x97\x97\x8b\x94\xf9\x25\xba\xc2\x2b\xe7\x57\xee\x07\xd8\
+\xbc\x79\xf3\xec\x02\xf6\xee\xdd\x2b\x61\xa2\x37\x6f\xde\x08\x11\
+\x1c\x6a\x9e\x29\x3b\x63\x21\x11\x11\x11\x22\xaf\x1c\x62\x9e\xe5\
+\xb9\x73\xe7\x44\xa4\x98\x98\x9f\x79\x1c\x8b\xe3\x9c\xab\x92\xb3\
+\x0d\xe7\x9f\x7b\x01\x17\xa1\x91\x91\xd1\xec\x02\xa8\x7f\x4b\x78\
+\xc9\x4d\x4f\x4f\x7f\x20\x82\xf3\xcc\x35\xc1\x85\xe4\xe9\xe9\x89\
+\xe3\xc7\x8f\xc3\xc7\xc7\x47\x84\x97\xa3\xa0\xcc\xb9\x2a\x39\xa7\
+\x92\xdf\x5d\xb8\x70\x01\x54\x5b\x5c\xf9\xe2\xff\x33\x67\xce\xd0\
+\x8e\x69\x38\xbb\x80\x9d\x3b\x77\x4a\x58\xe9\xbb\x77\xef\xe6\x14\
+\xc1\xc5\xc7\x4d\x45\x99\xf3\x8f\xc9\xb9\x7e\x02\x03\x03\x85\x50\
+\xda\x15\xdf\xb7\x68\x1e\xcf\x4d\xce\xcd\xcd\x0d\xa6\xa6\xa6\x7d\
+\x44\xe7\x34\x43\xc0\x86\x0d\x1b\xf4\x69\x89\x64\x50\x3f\x78\xcb\
+\x61\x9b\x4b\x04\x13\xa9\x92\x73\x24\x4e\x9d\x3a\x05\x6a\x64\xa0\
+\x7d\x04\x2e\x2e\x2e\x1f\x90\x73\x0b\xe7\x0d\x8b\x6d\x79\x53\xa3\
+\x31\xc3\x44\xe7\x46\xd0\x9d\x71\x10\xe5\x7d\x5c\x57\x57\xd7\x63\
+\xcb\x96\x2d\x72\x76\xca\x45\xf7\xb1\x88\xd2\xd2\xd2\xf7\xe4\x1c\
+\x0d\xda\xe9\x60\x6d\x6d\x3d\x2b\x39\x37\x2d\xb6\xe1\xab\xa9\xa9\
+\x09\x27\x4f\x9e\x1c\x25\xff\x7c\x68\xf1\x98\xeb\xe8\x36\x5f\xa1\
+\xcc\x7c\xcd\x9a\x35\xd1\x66\x66\x66\x23\xfe\xfe\xfe\xc2\x89\x52\
+\x04\x77\x3d\x65\xd8\xb3\xb3\xcb\x20\x91\x64\x51\x04\x7c\xde\x93\
+\xf3\xe6\xc5\xdd\xf1\xe5\xcb\x97\xc2\x26\x35\x35\x15\x94\xde\xc1\
+\xa5\x4b\x97\xd6\x92\xdf\x54\xc2\x59\xc5\x7e\xb0\xe8\x93\xe7\x41\
+\xc2\x6a\xc2\x9e\x75\xeb\xd6\x95\xec\xda\xb5\x6b\x8a\x77\x40\x76\
+\x78\xeb\xd6\x2d\xb1\x13\xf2\x0a\xb0\xb2\xb2\xa6\xa2\xf4\xc3\xc5\
+\x8b\xd5\xb4\x4a\x8a\xa9\x5b\x76\x89\xd9\x72\xb8\x49\xcc\x34\x45\
+\xb2\x6f\xf1\xe2\xc5\x95\xe4\xe7\x2a\xc1\x95\xf0\xb5\xc2\xef\x22\
+\x75\xcf\x25\x3c\xd0\x40\x5b\x5b\xdb\x71\xfd\xfa\xf5\x6d\x56\x56\
+\x56\xa0\x2d\x1b\xdb\xb6\x6d\x03\x3d\x0f\xae\x5a\xb5\xaa\x59\x47\
+\x47\xa7\xd2\xc4\xc4\x7c\x88\x85\xa4\xa6\xe6\xc2\xc1\xc1\x61\x42\
+\x4f\x4f\x4f\xa6\xa5\xa5\x55\x40\xb6\x7f\x12\x4e\x28\xce\x89\x2b\
+\xfe\xcf\x59\x91\x2b\xd6\x68\xf9\xf2\xe5\x81\xfa\xfa\xfa\x8d\x0b\
+\x16\x2c\x28\xa2\xe7\x44\x82\x3b\xe1\x07\x8e\xd4\xca\x95\x2b\xe3\
+\x56\xaf\x5e\xdd\x40\xf7\x59\x84\x70\xc5\x37\x82\xa1\x22\xa5\x0b\
+\x35\xf2\xb5\xa4\x98\x05\x87\xf1\x20\x0b\x22\x2c\x53\x9c\x72\xb4\
+\x14\x9f\x65\xdf\x12\x7e\x54\x1c\x4a\x97\xa8\xf3\xc5\xfc\x0f\xd1\
+\xc2\x47\xb4\x63\xf2\xc9\xfc\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x03\xd1\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x03\x63\x49\x44\x41\x54\x58\xc3\xc5\
+\x97\xcd\x6f\x1b\x55\x14\xc5\x7f\x77\x66\x92\x89\xd3\x7c\xd4\xad\
+\x17\x09\x20\xd2\x4d\x55\x51\x10\x08\x51\x84\xca\x0a\x09\xd8\x20\
+\xc4\xa2\x52\x17\x2c\x2a\x24\x28\x6b\x36\x2c\x90\xfa\x1f\xc0\x82\
+\x0d\xa8\x3b\x04\x2c\xd8\x82\x10\xaa\xda\x45\x05\x64\x07\x08\x04\
+\xa1\x34\x40\x85\x11\x6e\x21\xb5\x13\x9c\xe6\xc3\xb5\xd3\x79\xef\
+\x5d\x16\xf3\xec\x8c\x9d\xc4\xa6\xf5\x54\x1d\xe9\x4a\x1e\x69\x3c\
+\xe7\xdc\x73\xce\xbb\xef\x8d\xa8\x2a\xf7\xf2\x0a\xb8\xc7\x57\xf4\
+\x7f\x1e\x7a\xff\x35\x79\xf2\xe6\x16\x91\x55\xa4\x30\xca\x13\xc6\
+\x12\xaa\x22\x00\x51\xc0\x4c\x18\x30\xeb\x94\xc0\x3a\x1a\xd5\x35\
+\x3e\x7b\xfb\x73\xe6\x81\xa6\xaa\xba\x41\xef\x96\x41\x16\x9c\x7d\
+\x5d\xce\x3c\xf8\xc8\x0b\xaf\x3a\xa7\xa1\xaa\x06\x0f\x1c\x7d\x76\
+\xdc\x39\x15\x54\x05\x60\xaa\x34\x17\x8d\x17\xef\x1f\x09\xc2\x82\
+\x98\xad\x86\x7e\xf1\xde\x89\xea\x77\x8b\xff\xbe\xfb\xe1\x57\x7c\
+\x02\xd4\x55\xd5\xf6\x05\x50\xd5\xbe\x75\xf6\x34\x3f\xaa\xaa\xaa\
+\x3a\x5f\xb6\xab\x9c\x5a\x6d\xb5\x6e\x6a\xb5\xba\xa4\xc6\x18\xbd\
+\xb2\xf0\x75\xf2\xe6\x8b\x7c\xfb\xfc\xa3\xbc\x02\x14\xdb\x4d\xee\
+\x55\x03\x33\xe0\x94\x10\x2c\x60\x7c\x39\xd2\xfb\xb4\x04\x8b\x31\
+\xb7\x58\x5e\xae\x11\x86\x21\x87\x1e\x7a\x3a\x3a\xf9\xc6\x07\x8f\
+\x1d\x9e\xe1\xe5\x97\x8e\xf1\x1c\x30\x21\x22\x72\xc7\x21\x4c\xbd\
+\xd6\x2e\xd0\xb4\x1c\xe0\x50\x2c\xaa\x09\xcd\x66\x23\x0d\x55\x14\
+\xf1\xf0\xf1\x93\xa3\xa7\xdf\xfa\xf8\x99\xb9\x12\xa7\x80\x43\x40\
+\x61\xc8\x55\x90\x02\x81\x45\x31\x9e\x40\x02\x18\xc4\x93\xc9\xe6\
+\x6d\xdf\xbe\x09\x8e\x3c\x75\x22\x2e\x4d\x72\x1c\x38\x0a\x4c\x0e\
+\xb5\x0a\x14\x87\x60\xd2\xd4\x6e\xe7\x97\x54\x19\x08\x02\xc5\x98\
+\x16\x17\x2f\x5e\x60\x6d\x6d\x83\x20\x80\xfd\xfb\x8b\x68\x54\x8c\
+\x61\x75\x0e\x98\x00\xaa\x77\xac\x80\x64\x2c\xd0\x4e\x1e\x12\xda\
+\xd9\x18\x1d\x15\x66\x66\x0f\xd2\x6c\xd6\xd9\xdc\xac\x61\xcc\x26\
+\x85\xc2\x08\xad\xe6\x2a\x5e\xfe\x68\x48\x05\xac\x57\x40\x3b\x7d\
+\x4b\x46\x85\x20\x54\xee\x9b\x2d\x31\x35\xf9\x38\xc6\x18\xa2\x28\
+\x22\x8e\x0f\x70\x7e\x04\xcd\x65\x10\x09\xce\x77\x4c\xc6\x06\x45\
+\x11\x04\x25\x10\x21\x8e\x85\x38\xce\x5a\x3d\x46\x18\x74\xa4\xd3\
+\x1c\x32\x90\xf8\xb7\xa4\xa0\xda\x87\x6e\x4a\xce\xe5\x37\x8a\xdb\
+\x5e\xb7\x3b\x6f\x83\x48\x4f\x2c\xb7\x1b\x15\xff\x9f\x9c\x08\x08\
+\x0e\xcd\x58\xd0\x26\xa1\x3b\xd6\xc3\x36\x1d\xc9\x57\x81\xd4\x82\
+\xfe\x24\x7b\xe9\xe5\x48\x40\xfd\xe0\x91\x2e\x03\xba\x41\xe9\x49\
+\x9a\xe6\x69\x41\x56\x01\xd9\xa5\x63\x7a\x08\xe5\xae\x40\x9a\x01\
+\xd3\xe9\x51\x76\x89\x1c\x3e\x96\xd2\x09\xa7\xcd\xdf\x82\xde\x5e\
+\xa5\x13\xc6\x14\x7a\xfb\x79\xbd\x1b\x0a\x24\x3b\xe4\xee\xf6\x5c\
+\xbb\x16\x67\xce\x0a\xec\x9c\x84\xba\xeb\x73\xd9\xdd\x43\xf3\x1f\
+\x44\x83\x62\xd7\xfd\xfb\x2e\x0c\xa2\xac\xf3\xfd\x94\x68\x0f\xec\
+\x5c\x97\x61\xba\x15\x0f\x3a\xe1\xc7\xc0\x38\x50\x64\x6d\x25\x70\
+\x1b\x4d\x5a\xb9\x6d\x46\x3b\x2d\x80\xf4\x48\x39\x86\x30\x8d\x52\
+\xa4\x56\x59\xb1\x95\xc5\xcb\xf6\xa7\x2f\x3f\x4a\xae\x2c\xfe\xd0\
+\xb8\x74\x95\x3f\x80\x55\x60\x6b\x48\x05\xd4\x1f\x40\x15\x25\x04\
+\x0a\x08\x53\x28\x07\xa8\x55\x56\xed\xc2\xfc\xb9\xe4\xd7\x6f\x3e\
+\x35\xe5\x72\x79\xfd\xef\x3a\xcb\xdf\xff\xc9\x6f\xe5\x2a\x65\xe0\
+\x1a\x70\x19\x58\x1f\x32\x03\xa0\x8c\xa1\x4c\x03\x07\x3d\xe8\x85\
+\x0e\xe8\x2f\xd7\xa8\x5c\xaa\xf0\xfb\xd2\x0d\xfe\x02\x6a\xc0\x12\
+\xf0\x8f\x3f\x86\xd5\x81\xcd\x21\x15\x38\x42\xad\xb2\x6c\x17\xe6\
+\xcf\xef\x05\x7a\x1d\xb8\xea\x41\xeb\xc0\x86\x07\xdd\xd2\x01\x5f\
+\x3e\x03\x09\xac\x37\x39\xf7\xce\xa9\xc2\xf4\xf5\x1b\xd8\x9f\x2b\
+\x2c\xed\x01\xba\xe2\x65\x6e\x00\x89\xde\xc6\x17\xef\xc0\x4f\x33\
+\x11\x29\x01\xc7\x80\xc3\xc0\x2d\x0f\x38\x14\xe8\xed\x12\x18\x01\
+\xa6\xfd\xd1\xda\x7a\x69\x87\x02\xcd\x5e\xff\x01\xf9\x68\x10\x8e\
+\x11\x57\x76\x24\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x07\x66\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x07\x2d\x49\x44\x41\x54\x78\x5e\xb5\x56\x5d\x6f\x1c\x57\
+\x19\x7e\xce\xc7\x7c\xec\x97\xd7\x6e\x9c\x38\xc6\x89\x03\x49\x9a\
+\x26\x4d\x21\xaa\x08\x95\xb8\x40\xca\x25\x08\x89\xfb\x8a\x2b\xee\
+\xb8\x41\x48\x48\x20\x21\x21\x04\x37\x5c\xf1\x03\xb8\x00\xa9\x70\
+\x83\xa2\x0a\x51\x22\x01\x37\x20\x15\xd1\xa0\xe6\xb3\xad\x53\x2b\
+\x49\x9b\xa4\xb1\xe3\x8f\xb5\xbd\x3b\x9b\x59\xef\xcc\xce\xce\xcc\
+\x39\x87\xf3\x1e\x2d\x2b\xd3\x3a\xf5\x02\xe2\x58\x8f\xde\x39\xc7\
+\x1a\x3f\xcf\xfb\xbc\xef\x79\xc7\xcc\x18\x83\xff\x75\x5d\xbc\xf8\
+\x6d\x0e\x20\x54\xaa\xa8\x68\x5d\xd6\x19\xe3\x14\xa7\x74\xa9\xea\
+\x5a\x95\x15\xad\xf4\x94\x31\x68\x7a\x15\xb9\xba\xbc\x7c\xf9\x4d\
+\x00\x99\xe5\xd5\x00\x20\xf7\x12\x5c\xf8\xc2\xb7\xbe\x94\xa5\x83\
+\x53\x40\x59\x63\xe0\x75\x3f\x0c\x6b\x42\x7a\x55\x18\x56\x07\x50\
+\x63\x8c\xd5\x00\xd4\xc1\x10\x5a\xd0\x59\x08\x98\x0a\x98\x0e\xb5\
+\x31\x81\x86\xf6\x34\x2b\x3d\x4b\x2a\x99\x27\xc5\xdc\xe9\xe7\xd9\
+\xd9\x17\xcf\xf2\xc6\xcc\x0c\x13\xcd\x19\xf1\x97\x5f\xbd\xf6\x00\
+\xc0\xab\x16\x14\xe3\x4f\x08\x38\x3c\x7f\xf8\x97\x5f\xfc\xca\xcb\
+\x2f\x65\xda\x53\x79\x51\xb0\x3b\x37\xdf\x62\x1f\xdc\x7d\x17\x5e\
+\xe0\x81\x0b\x30\xce\x01\x21\xb8\x83\xe7\x09\x16\x04\x92\x85\xa1\
+\x8f\x8a\x45\xb5\x1a\xda\x18\xa2\x5e\xab\xa2\x56\xab\x60\xee\xe8\
+\x02\x4e\x5f\xf8\x32\xae\x6c\x7f\x16\xed\xf6\x03\xf0\xd6\x32\x94\
+\x2a\xe7\x01\xbc\x62\xd1\xd9\x57\xc0\xc9\x73\xa7\xce\x7f\xe3\x7b\
+\xaf\xf2\xdf\xfd\x63\xc8\x3f\xba\xf9\x16\xe6\x16\x24\x7e\xf8\xdd\
+\x1f\xa1\x54\x40\x18\x04\xf0\x3d\x89\x6a\xa5\x82\x30\x0c\x10\xf8\
+\x9e\xdd\xfb\x90\x52\x40\x08\x01\xce\x18\x98\x05\x18\x20\xa5\xe7\
+\xce\xb3\x5c\xe1\x27\x57\x3b\x78\x78\x7b\x09\xcf\x9b\x77\xe1\xab\
+\x5c\x00\x20\x11\xa1\x05\x3e\x21\x60\x37\xc9\xb3\x37\x6f\x0f\x6b\
+\xbf\xf9\xeb\x0a\x3a\xd7\x96\xf0\xcd\x53\x06\x5f\xff\xea\xd7\xb0\
+\xb1\xbe\x8e\x7e\xd2\x47\x96\x0d\xa1\x94\x42\x59\x14\xc8\x87\x43\
+\x68\xad\x61\x8c\x71\xb1\x2c\xcb\x31\xe8\xcc\x89\x11\x3e\x4e\x1e\
+\x3a\x89\xf5\x13\xaf\xa0\x9a\xe7\x28\x57\xaf\x01\x00\x23\xec\x2b\
+\x80\x5e\x54\xf4\xc7\x94\x71\x2f\x47\x4f\x63\xdc\x78\xfb\x2a\xd6\
+\x36\xb7\x51\x14\x85\x23\xe3\x9c\xec\xa7\x0c\x25\xc1\x65\x4f\x8b\
+\x44\xd0\xa2\xdf\xfb\xbe\x6f\xcb\x50\x43\xb5\xd1\x84\xfc\x40\x21\
+\xac\x56\x21\x94\x40\xb9\x87\x6b\x5f\x01\x24\x5a\x0a\x8e\xc0\x13\
+\x80\x64\x08\xc3\x0a\x16\x17\x17\xc1\xbd\x90\x32\x27\x01\x44\x48\
+\xd9\x8d\x41\xcb\xed\x39\x07\xed\x38\xf5\x87\xf4\x5c\x3f\x88\xa0\
+\x0a\xc9\x13\x04\x82\xc1\xe3\x40\x7e\x90\x00\x80\x41\x70\x06\x5f\
+\x70\x80\x19\xd4\x6d\x16\x73\x9f\x39\x8a\x24\x2b\x9c\xfd\x45\x31\
+\x1c\x59\x6e\xe0\x7e\x94\x86\x36\xe4\x9c\x76\x0e\x39\x94\x05\x54\
+\xa9\xe0\x16\xb7\x42\x2a\x2f\xc2\xf7\x32\x27\x1c\x07\x3a\x60\x41\
+\xdc\xbe\xc7\x20\x7d\x89\xa8\x1b\xe1\xf6\xf5\x9b\xd8\xdc\x89\xc8\
+\xe2\xb1\xbd\x41\x10\x50\x19\xe8\x99\x1a\x93\x1c\xb0\x44\x15\xb2\
+\x9f\x88\xdc\x79\xd5\xda\xee\x59\x07\x7e\xfd\x46\x8c\x40\x0a\x97\
+\x18\xd8\x81\x0e\x18\x48\xce\xe0\x49\x61\x23\x50\xaf\xd7\xf1\xc2\
+\xf9\xcf\x63\xb6\x13\x8d\xad\xfe\xb7\x12\xb8\x37\x00\xce\xc8\xb1\
+\x71\x1c\x97\x85\x1a\x32\x94\x02\xa1\xa7\x21\x05\x3b\xd8\x01\x22\
+\x90\x92\x23\xb0\x90\x8c\x51\x23\x59\xd4\x51\x14\xa5\x43\xa9\x4a\
+\xa8\x51\x97\x13\x40\x11\xb0\x67\x64\x7d\x89\xe1\x30\x47\x59\x94\
+\x50\xda\xf5\x0b\x0c\x97\xa8\x86\xc7\x10\xf8\x8a\x12\x9b\xac\x04\
+\x94\x79\xe8\xb9\x46\x44\xa7\xbd\x83\x7b\xcb\x4b\x68\x77\x7b\x2e\
+\x73\xcf\xf7\xdd\x3c\xa8\x84\x15\x04\x81\x0f\x3f\x08\x21\x3d\x39\
+\xb6\x9e\x40\x37\xc3\x73\x65\xe1\xa0\xf5\xfb\xf5\x6d\x57\x02\x8f\
+\xcc\x39\x48\x00\x29\xf0\x84\x73\xc0\x92\x79\x98\x3d\x64\xa7\xd9\
+\x99\x73\x38\x39\xba\x7e\xd2\x35\xe7\x7e\x99\x18\x17\xb4\x32\xc8\
+\x4a\x20\x4e\x34\xb2\x42\x21\xb7\xfb\x6a\x40\x25\x30\x93\x36\x21\
+\x83\xeb\x01\x01\x54\x67\xe6\x30\x7f\xa6\x09\xe9\x79\x6e\x36\x64\
+\x85\x41\x77\xa0\x90\xe4\x06\x69\xae\xd1\xb7\xb1\x3f\xd4\xd8\xcd\
+\x34\x7a\x43\xe3\x62\x6c\x41\x67\x69\x6e\xa0\x0c\x5c\x89\x3a\x03\
+\x8d\x66\x35\x04\x04\x0e\x16\xc0\x19\x29\x05\x7c\xa1\xec\xf5\x3b\
+\x81\x3b\x9a\xe1\xfb\x57\x76\x30\x5b\x15\x18\x94\x06\x89\x25\x1c\
+\x14\x06\x79\x39\x82\x02\x4a\x63\x50\x8e\x9e\x15\x18\xc0\x38\x04\
+\x97\x60\xe4\x96\x2e\x1d\x6f\x73\x4a\xa0\xa0\xfd\x24\x73\x80\x6a\
+\x15\x70\x86\xe9\xa9\x06\x4a\x0e\xdc\x6f\x15\xb8\x8b\x02\xca\xd0\
+\xb0\x11\x60\x42\x42\xba\x9a\x73\x70\xc9\xc0\x8d\x86\x60\x39\xbc\
+\xb2\x0f\x3d\xe8\x23\xdd\x8d\x30\xe8\x45\x28\x8b\x1c\x53\x47\x4f\
+\x62\xfe\xd8\x09\x54\x7c\x01\x23\x30\xc9\x35\x84\xb3\x3f\xf4\x05\
+\x18\x37\x90\x9e\xef\xb2\x28\xb3\x14\x26\xdd\x45\x96\xc6\xc8\x7a\
+\x16\x49\x17\xc3\x24\x86\xca\xfa\x10\x6a\x80\x9a\xd4\x98\xae\x49\
+\x1c\x6e\x56\x71\xee\xb9\x06\xe6\x4e\x37\x70\xe4\xd0\x34\x9a\x33\
+\x1a\x6f\x74\x7c\xd7\x57\x1e\x4d\xca\xc9\x46\x31\x09\x90\x96\x34\
+\xc6\xfa\x3b\x7f\x42\xda\xfa\x10\x53\x15\x89\x43\x8d\x10\x0b\xd3\
+\x35\xcc\x1f\x6d\x62\x76\xba\x8e\x99\xc6\x09\x1c\x9d\x9d\xc6\x9c\
+\xc5\x73\x53\x75\x54\x2b\x81\x6b\xd4\x52\x29\xa4\x83\x0c\xbb\xfd\
+\x04\xbd\xfe\x10\x8b\x26\xc0\x40\x0b\xe4\x93\xcc\x01\x0e\x27\xc0\
+\x5a\xe6\x63\x3b\x6a\xe1\xe2\x91\x1c\x3f\xfd\xf1\x77\xb0\xb1\xb9\
+\x85\xcd\x8d\x75\xb4\x5a\x2d\x44\xdd\x36\x9a\xd0\x38\x73\xfc\x38\
+\x82\x30\x74\x9f\xe1\x24\xcb\xa9\xeb\xdd\x1c\x31\xc6\x8c\x46\xb2\
+\x86\x61\x40\x3d\x14\xd0\x05\x47\x3a\x89\x00\x8c\x1c\xf0\x03\x09\
+\x66\x4a\x57\x0e\xc6\x04\xee\x7d\xf8\x08\x97\x2f\x5f\xc6\x60\x30\
+\x70\x23\x76\x6a\x6a\x0a\xc7\x4e\x7c\xce\xcd\x81\x4f\x5b\x44\x19\
+\xd0\xb5\x06\x0d\xb6\xfd\x9b\xf0\x63\xa7\xcc\x91\x06\xa3\x41\xc4\
+\x19\x77\x83\x65\x7d\x7d\x9d\xc8\xdd\x97\xf1\xb8\xcd\x9c\xbe\x03\
+\x93\x2e\x9f\x26\xab\xcf\xe0\xfb\xf2\x60\x01\x9c\x8d\x26\xa1\xe4\
+\xee\x45\xce\x01\x03\x43\x84\xf4\xb1\x71\x1f\x19\x21\x04\xed\xc9\
+\xee\xc9\x04\xf8\x1c\x01\x33\x28\xd2\x0e\x98\x19\xdb\xc0\x9e\xe1\
+\x80\x13\xe0\xc8\x7d\xc1\x5d\x7d\x61\xc6\xdf\x89\x71\x8d\xff\x93\
+\x15\x48\xa0\xfb\xf0\x06\x56\x97\xde\x47\xb7\xbb\xb2\x0e\x60\x68\
+\x51\x3e\x53\x80\x10\x80\x27\xb9\x05\x95\xc0\x69\xfd\xaf\x17\xe9\
+\x67\xfd\x16\xee\xfe\xed\x0f\xb8\x7f\xeb\xc1\xf6\xda\xda\x8d\xeb\
+\x00\x56\x2c\x7a\xfb\xdf\x02\x3e\x6a\x42\xc9\x20\xe5\xbf\x32\x06\
+\x14\x5d\xad\x34\xa5\x3e\x20\xfb\x69\xff\xa9\x25\x10\x82\xbb\x9a\
+\x6b\x53\x62\xe5\xfa\x9f\x71\xef\xda\x72\x6f\x75\xe5\xd6\xad\xa2\
+\x48\x48\xc0\x7b\x16\xdd\x7d\x05\xc0\x30\x67\x89\x20\x21\x16\x9c\
+\x33\x68\xad\x31\x3b\x3b\x8b\x4b\x97\x2e\x61\x61\x61\x01\xd3\xd3\
+\xd3\x68\x34\x1a\xee\x3f\x63\x29\x85\x8d\x9e\x7b\xe6\x5c\x20\xcf\
+\x4b\x3c\x7d\x9a\x98\x76\xbb\xc7\xda\xed\x18\xbd\xdd\x0c\x77\xaf\
+\x3d\x1a\x3e\x79\x7c\xe7\x4e\x92\x6c\xbd\x0d\xe0\x9a\xc5\x47\x16\
+\xf9\x33\x07\x51\xa3\x0a\xcc\x1f\x06\xe2\xc3\x4d\x84\xba\x81\xbc\
+\xc8\x71\xe1\xc2\x4b\x38\x7f\xfe\x05\x4b\x90\x43\x29\xed\x66\x7f\
+\xb7\x9b\x22\x49\x62\xc4\x71\x86\x28\x4a\xcc\xf6\x76\x57\x6d\x6d\
+\xed\x0c\xdb\xed\xad\x7e\xaf\x17\xc5\x69\xda\xe9\xc6\xf1\x56\x7b\
+\x75\xf5\xe1\xd6\x60\xb0\xfb\x00\x00\x65\x7f\xdf\xa2\x6f\xec\xda\
+\x57\x80\xe7\x4b\x7f\xd0\x4f\x71\xf5\xb7\xaf\x61\x63\xed\x09\xce\
+\xce\x1f\x31\x0f\x1f\x6d\xe3\xf1\x4a\x8b\x45\x51\xdf\x92\x26\x26\
+\x8a\x76\xcb\x4e\x27\xca\xba\xdd\x9d\x7e\x1c\xb7\xe3\x38\xde\x89\
+\xba\xdd\xcd\x76\xbb\xbd\xd1\x4e\xd3\x5e\x44\x04\x16\xb1\x45\x6f\
+\x14\x9f\x5a\xb4\x2c\x36\x69\x3f\x26\xdf\x4f\xc0\xe3\x47\x6b\x1b\
+\x3f\xff\xc1\x2f\x16\xef\xbe\xf7\x7e\x91\x26\x59\xb1\x94\xdf\xcb\
+\xae\xbc\xfe\xf7\x7e\xad\x86\xdd\x7e\x3f\xea\x46\xd1\x46\x7b\x67\
+\x67\x6d\x7b\x38\x1c\x10\xc1\xee\x98\x64\x0c\xb7\x4f\x2c\x32\x8b\
+\xe1\x9e\x98\x5b\xde\xf2\xc0\x49\x78\x6f\xe9\xf6\xcf\x7a\xbd\x27\
+\x2f\xa7\x83\x56\x7d\x30\x88\x22\xad\x4b\x52\xdf\x27\xec\x21\x7c\
+\x3a\x7a\x4e\x1d\xc1\x98\x64\x4c\xa4\x70\xf0\xda\x5f\xc0\xc3\x47\
+\x7f\x7c\x1d\xc0\x3b\x16\xcd\x51\x26\xbd\xbd\x59\x7c\x8c\x48\x4f\
+\xc8\x31\xb9\x80\x11\xe1\xf2\x68\x3e\x14\x23\x22\x83\xff\xe3\xfa\
+\x27\x0a\xd7\x77\xe2\xf8\x4e\x6d\x80\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\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x06\x7a\x49\x44\x41\x54\x58\xc3\xed\
+\x57\x09\x4c\x54\x57\x14\x1d\x6a\xed\xa6\x4d\x69\x69\xb5\x2e\x15\
+\xf7\x1d\xb1\x20\x8a\x0a\x28\x2a\xb2\xa9\x88\xc0\x20\x28\x22\xae\
+\xe0\x30\x08\x6e\x6c\x23\x42\x01\xc5\x71\x41\x76\x71\xa1\x0a\x28\
+\xe2\x5a\xc0\x0a\x5a\x91\x60\xc0\x15\xad\x88\x68\xcd\x18\xd4\xaa\
+\xd4\x5a\xb1\x2e\xe8\x8c\x0a\x9e\x9e\x0f\x3f\x8d\x52\x29\x9a\x9a\
+\x36\x69\x9c\xe4\x64\x32\x33\xff\xdd\x73\xef\x39\xf7\xde\xff\x47\
+\x02\x40\xf2\x5f\x42\xf2\x36\x81\xff\x65\x02\x66\x52\x85\x91\x99\
+\x34\x58\x66\xea\x14\x14\x6f\xea\x18\x98\x66\xea\x18\x90\x3e\xd4\
+\x7e\xc1\xaa\x81\xb6\xde\x93\x25\x12\xc9\xc7\x44\x33\xc9\x9b\x7e\
+\x0d\x9b\x18\xd2\x97\xc4\x11\xc3\x9c\x17\x17\x7b\x2c\xdc\x7c\x39\
+\x60\xf9\xe1\xdb\xa1\xd1\x17\xab\x15\x2b\xae\xa8\x15\xcb\xaf\xa8\
+\x03\xa3\xce\x3c\x90\x29\x76\xdf\x1a\x6c\xe7\x97\x6f\x60\x31\x5d\
+\xc6\x23\x9f\x10\xef\xbe\x01\xe2\xc5\x96\x24\x4d\x99\x34\x37\x59\
+\x15\x91\x50\x76\x37\x3c\x41\x53\x2b\x0f\x07\x26\x2d\x00\xc6\x7a\
+\x02\xa3\xa7\x02\x23\xdd\x00\x6b\x77\xc0\x7d\x1e\x10\x16\x5d\xf9\
+\xc4\xc2\x75\xc9\xb5\xd6\xba\x7a\x52\x1e\xd7\xf9\xc7\xc4\xd3\x17\
+\xa5\x56\x28\x93\xaf\x3e\x0c\x8c\x06\xdc\x02\x49\x24\x03\x4c\xa6\
+\x01\x86\x93\x01\x3d\x29\xd0\xdb\x1e\xe8\x66\x4b\x8c\x06\xfa\xd9\
+\x00\xd2\x39\xc0\x82\xf0\x22\x75\xaf\xc1\x13\x72\x18\xc6\xe0\xf5\
+\x89\x9d\x17\xeb\x12\x8a\x49\xbe\xc9\xaa\x95\x1b\x49\xbc\x06\x70\
+\x0d\x02\x2c\xe4\xc0\x50\x56\x6c\x4c\x0c\x64\x12\x83\xbc\x09\x92\
+\xe9\x7b\x00\x3d\x5d\x80\x4e\x63\x00\x5d\x0b\x60\x88\x13\x10\x10\
+\xa5\x7e\x36\xd0\x56\x56\xc9\x70\x4e\xaf\x45\x3e\x7c\x62\x88\xdc\
+\xc6\x23\xaa\x2c\x3c\xbe\xa4\x2a\x3c\x19\x98\xba\x84\x15\xfb\x01\
+\x66\x73\x89\xf9\x94\x5b\x01\xd8\x47\x01\x93\xa9\xc6\xd4\x38\x26\
+\xc6\xf7\x71\xdf\x50\x11\x5f\xa0\xef\x14\xa0\xab\x1d\x60\xe4\x0c\
+\xcc\xa5\x45\xe6\x4e\x01\x77\x19\xd2\xf7\xb5\xaa\x96\x2d\xd9\x71\
+\x35\x26\x5d\x53\xeb\x4d\x92\xf1\x01\xf4\x96\xa4\x23\xfc\x01\x9b\
+\x08\x92\x92\x70\x7e\x3a\xb0\x7c\x2f\xb0\xbe\x10\xd8\x54\x04\x24\
+\xfc\x00\xf8\x6f\xa5\xec\x2b\xa8\x0e\x13\xed\xc3\x5e\x18\xcc\x5e\
+\xf0\x5d\xc6\xe4\xbc\xe3\xab\x19\x5a\xf1\x0a\xe4\x0a\x27\xa1\xea\
+\xc8\xc4\x92\xaa\x88\x75\x24\x0a\x63\xd5\x24\x1d\x45\xbf\x6d\x22\
+\xd9\x6c\x09\xf4\x74\x1b\x10\x7b\x08\xc8\x2a\x03\xb6\x1e\x54\xd5\
+\x84\xc4\xee\x51\x7b\x2c\x88\x7b\x18\xb9\x2e\x4f\xb3\xbd\x84\x92\
+\x67\x50\x09\x5e\x6b\x4c\x6b\x46\xd1\x2a\x45\x2c\xed\x19\x23\xbf\
+\xc7\xf0\x4b\xfe\x1c\x1f\x8e\x86\x31\xbf\xf8\x88\xd0\x7a\x5e\x72\
+\x07\xcf\x98\x0b\xb1\x69\x37\x35\xf3\xe9\xb5\x53\x08\x60\x49\x99\
+\xad\x59\xb1\x34\x06\x90\xb1\x62\xe5\x01\x60\x57\x29\xb0\xad\x40\
+\x55\x33\xc6\x23\xf4\x41\x5f\xd3\x89\x57\x3b\xf4\x1a\x5a\xac\xd3\
+\xae\xfb\x4e\x36\xda\xb1\xb5\xbb\x4a\x34\x89\xf9\xb4\x24\x91\x7d\
+\x12\x54\x1f\x63\x55\x9a\xfa\x99\x91\xb5\xe7\xed\x3a\x05\x04\xf2\
+\xc4\xd4\xb2\xdf\x0d\x2d\x67\x6d\xea\xd2\xdf\x62\xbc\xb8\x28\xb4\
+\x98\x58\xf0\x0c\xff\xd4\x8a\xd8\x2d\x9a\x5a\x2f\x25\xbd\xe5\x41\
+\x2b\xfa\x69\xbf\x0a\xf0\x48\x61\x15\x39\x40\xca\x31\x20\xfb\xf4\
+\x9d\x5a\x59\xe8\x86\x47\x02\xf1\x97\x9d\xf4\xf3\x79\x76\x39\xe1\
+\x45\x8c\x63\x3c\x7f\xdf\xc8\xf4\xdf\x32\x4f\x02\x3e\xa9\x4c\x9a\
+\x71\x7c\xe3\x81\xc8\xa4\x13\x4f\xba\x1b\x8d\x39\xcf\x6b\xfc\x04\
+\x05\x4a\x0b\x8f\x30\xab\x75\xa7\x1f\xe9\x9b\xbb\x65\xe9\x99\xb9\
+\xc8\xb9\xc1\xb6\xf9\x45\xe4\x5c\x57\x6e\x06\xa6\xd1\x6f\x3b\xca\
+\x6e\xcb\x77\x97\x24\x40\x9e\x09\xac\x2c\x00\xf6\x94\x03\x69\xfb\
+\xcb\x9e\x8e\x70\xf6\xbf\xdf\xa1\xb7\x49\x09\x83\xad\x21\x3c\x09\
+\x73\xa2\x33\xf1\x59\xff\x11\xee\x16\x5e\x21\x29\xd7\x77\xfd\x48\
+\x1b\xb6\x53\x31\x5a\x18\x9f\x45\x05\xdd\x42\x1f\x68\xb7\xea\xb8\
+\x9b\xd7\xb8\x08\x0d\x56\x96\xcb\x80\x2b\xf9\xa3\x97\xe2\x94\xda\
+\x78\x9c\xef\x85\xf0\xa4\xeb\x1a\x7f\x7a\xeb\xb6\x94\xcb\x84\x72\
+\xdb\x0b\x5d\xfd\x2d\x83\xb0\xc1\xd6\x1e\x07\xf2\xca\xd5\xcf\x16\
+\x29\xb7\x70\x96\xed\x2b\x3e\x6f\xdf\x63\x5f\x9d\x97\x12\x89\x1d\
+\xd1\xf5\xf9\x55\x6b\xe2\xb0\x68\xda\xb2\x0d\xfb\x7f\xcd\x64\x1f\
+\x84\x91\x58\xf9\x1d\x10\x9e\x74\xf8\x71\x57\x03\x2b\xa1\xfa\x30\
+\xc2\x58\xb0\xe0\xdc\xae\x5c\x60\x4e\x28\x3b\xdb\x07\x70\x5c\x54\
+\x5d\xeb\x42\x52\x07\x62\x1c\xbb\x55\x4a\xc9\x66\x6d\x01\x42\xe9\
+\x75\x2a\x2b\xc9\x2d\xbb\x53\x3b\x51\xae\xac\xee\xd4\x6f\x44\x29\
+\x03\xc4\x10\x33\x89\x21\x44\xeb\x86\xab\x55\xb8\x17\x64\x1c\xbc\
+\x58\x9d\xce\xa4\xe3\x38\x11\x69\x07\xef\xd4\x9a\x3b\xf9\xdf\x6f\
+\xa1\xdd\x3a\x93\x3f\xbb\x12\x6d\xeb\x12\xd8\xb9\x9f\xbe\x72\xa6\
+\x4d\xbc\x00\x53\x8e\x8b\x55\x58\x7d\xd5\x93\xd6\x03\x9e\x94\x6e\
+\x29\x3b\x3c\x93\x92\xe7\x9c\xba\x51\x23\x4a\x7e\x92\x87\x95\x84\
+\x83\x58\x75\x0b\xe2\x9d\x86\xf7\x06\xa9\x3c\xe6\x42\xf1\x65\x36\
+\x28\x7b\x60\xe7\x51\xf5\x33\x47\x2f\x65\xb5\x78\x36\x98\x30\x24\
+\x3e\xa8\x4b\x60\x0f\x09\x66\x2b\xeb\x67\x7a\x24\x95\xb0\x67\x87\
+\x4f\xa1\xff\x3e\x94\x2c\x92\x33\x9d\x41\xf2\xb5\x59\x27\x9e\x8c\
+\x24\x79\xbb\x6e\x03\x8f\xf0\x60\x24\x31\x96\x68\xdf\xd8\x0d\x45\
+\x68\xee\xf4\xbc\xb2\xbb\x85\x2a\x20\xff\x02\x30\x2f\x72\x8b\x5a\
+\x54\x4d\x48\xdc\x96\xf8\xa2\x6e\xe2\x84\x04\x72\x8a\xd9\x9d\xdc\
+\x6c\x76\x4c\xc2\x81\x92\x4f\xe5\x78\x79\xd3\xb3\x10\xf6\x46\xf2\
+\x19\x56\x70\xec\x46\x0d\x1b\xb4\x52\xbb\x95\x6e\x8e\xb8\x3c\xac\
+\x88\x36\x8d\x91\x0b\xbb\xc3\xc3\x3f\x59\x55\xfe\x0b\x70\xfa\x2a\
+\xf7\xc4\xd2\xad\x8f\x44\xdf\x57\x13\x13\x5e\x48\x5c\x48\x20\xef\
+\x14\xc7\x8a\xdd\xed\xbe\x11\x98\xc1\xa5\x31\x97\xcd\x16\x4c\x55\
+\xa2\x38\x66\x6b\x0a\xea\xc9\xdb\x77\x1f\x54\xc8\xcb\x17\x0a\xd6\
+\x8a\xd9\xbf\xbc\x72\xa7\x20\x1d\x26\xb0\xf3\x50\xe9\x4d\x4d\x79\
+\x25\xc9\xa3\xb6\x3e\x14\xc9\x85\x7e\x11\xee\x80\xba\x2f\x9c\x15\
+\x12\x28\xa2\x44\x71\x5c\x16\x41\x9c\xed\xc5\x6c\xb6\x65\x5c\xa3\
+\xd1\xec\xdc\xb5\xdc\x6c\x99\x97\xb8\x52\xb3\x4e\x3e\xee\x3d\x64\
+\xc2\x51\x9d\xb6\xdd\x3c\xc5\xec\x1b\x7d\xa0\x60\xbc\x39\x71\x19\
+\x45\xb7\x4a\x2a\x34\xb5\xce\xb2\x15\xf7\xba\x19\x5a\x97\x8b\x23\
+\xea\x4c\x74\x24\x9a\x37\x3c\x70\xee\xec\xcf\xc0\xc1\x9f\x48\x56\
+\x5a\xdf\x6c\x7b\xe8\x5b\x76\x05\xb0\x8f\xf2\x15\xdc\x00\xce\x56\
+\x01\xeb\x76\x17\xa9\xfb\x98\x48\x77\xf0\x48\x1f\xe2\xfd\x46\x1e\
+\x4a\xec\x42\x13\xf7\x5e\xcb\x3f\x7d\x53\x33\x76\x7a\xc4\xed\xce\
+\xfa\xa3\x84\xfd\xb0\x52\xbc\xeb\xfd\x95\x5c\x9c\xd5\x8c\xec\xa2\
+\xcb\x9a\xec\xe2\x4b\x4f\xb3\x8a\x54\x35\xd9\x47\x55\x35\x39\xc4\
+\xde\x63\xc4\x71\x55\xcd\xf7\x44\xee\x09\x01\x97\x9e\xba\xfa\xae\
+\xae\x6a\xa5\xab\xe7\x23\xfa\xaf\xd5\xe0\xf9\xa0\x87\x47\xc0\xfa\
+\x8b\xab\xd3\x0a\xab\x0c\x2d\x67\x9e\xfb\xaa\xe7\xe0\x03\xfc\x3a\
+\x82\xb0\x17\x65\x6f\xfe\x52\xc9\x0c\x46\xcf\x70\x19\x60\x35\xbb\
+\xa0\xdf\xf0\xc9\xe7\xf5\xcc\x5c\x2f\x35\x8a\x61\xae\xaa\x36\x5d\
+\x0c\x72\xc4\xb9\xef\xf2\x12\x1b\x9a\x75\x37\xb2\x35\xef\x3d\xd4\
+\x71\xe3\x87\x2d\x3f\x8d\xe2\x67\x39\x31\x92\x68\xd7\xd4\xa3\x97\
+\xb0\xb9\x06\x88\x8b\x61\x76\x13\x70\x13\x44\x13\x1f\xa5\xb4\x1a\
+\xc4\x11\x3e\x6b\x13\x5f\x0b\xf7\x31\xd1\x2a\xed\x57\x79\xee\x6b\
+\x26\x26\xd1\x46\x6c\xb0\xbf\x43\x9b\x26\x9e\x6a\xb5\xea\x96\x8b\
+\x44\xd2\x92\x78\xef\x25\x49\xfe\xfb\xaf\xb7\xff\x8c\xde\x26\xd0\
+\x14\xfe\x00\xc6\x8f\x6d\x5f\x51\xaa\x96\x24\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\
+\x00\x57\xb8\x67\
+\x00\x70\
+\x00\x72\x00\x69\x00\x6e\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x04\xca\x57\xa7\
+\x00\x6e\
+\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xc8\x58\x67\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x04\xb2\x58\xc7\
+\x00\x75\
+\x00\x6e\x00\x64\x00\x6f\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\x04\x00\x00\x00\x02\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x54\x00\x00\x00\x00\x00\x01\x00\x00\x12\x07\
+\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x06\xc8\
+\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x9d\
+"
+
+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()
diff --git a/examples/widgets/mainwindows/dockwidgets/images/new.png b/examples/widgets/mainwindows/dockwidgets/images/new.png
new file mode 100644
index 000000000..dd795cfff
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/images/new.png
Binary files differ
diff --git a/examples/widgets/mainwindows/dockwidgets/images/print.png b/examples/widgets/mainwindows/dockwidgets/images/print.png
new file mode 100644
index 000000000..2afb769ee
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/images/print.png
Binary files differ
diff --git a/examples/widgets/mainwindows/dockwidgets/images/save.png b/examples/widgets/mainwindows/dockwidgets/images/save.png
new file mode 100644
index 000000000..46eac82ad
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/images/save.png
Binary files differ
diff --git a/examples/widgets/mainwindows/dockwidgets/images/undo.png b/examples/widgets/mainwindows/dockwidgets/images/undo.png
new file mode 100644
index 000000000..eee23d24a
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/images/undo.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/copy.png b/examples/widgets/mainwindows/mdi/images/copy.png
new file mode 100644
index 000000000..2aeb28288
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/images/copy.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/cut.png b/examples/widgets/mainwindows/mdi/images/cut.png
new file mode 100644
index 000000000..54638e938
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/images/cut.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/new.png b/examples/widgets/mainwindows/mdi/images/new.png
new file mode 100644
index 000000000..12131b010
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/images/new.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/open.png b/examples/widgets/mainwindows/mdi/images/open.png
new file mode 100644
index 000000000..45fa2883a
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/images/open.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/paste.png b/examples/widgets/mainwindows/mdi/images/paste.png
new file mode 100644
index 000000000..c14425cad
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/images/paste.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/save.png b/examples/widgets/mainwindows/mdi/images/save.png
new file mode 100644
index 000000000..daba865fa
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/images/save.png
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/mdi.py b/examples/widgets/mainwindows/mdi/mdi.py
new file mode 100755
index 000000000..b8bdd9aee
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/mdi.py
@@ -0,0 +1,448 @@
+#!/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 widgets/draganddrop/draggabletext example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import (QFile, QFileInfo, QPoint, QSettings, QSignalMapper,
+ QSize, QTextStream, Qt)
+from PySide2.QtGui import QIcon, QKeySequence
+from PySide2.QtWidgets import (QAction, QApplication, QFileDialog, QMainWindow,
+ QMdiArea, QMessageBox, QTextEdit, QWidget)
+
+import mdi_rc
+
+
+class MdiChild(QTextEdit):
+ sequenceNumber = 1
+
+ def __init__(self):
+ super(MdiChild, self).__init__()
+
+ self.setAttribute(Qt.WA_DeleteOnClose)
+ self.isUntitled = True
+
+ def newFile(self):
+ self.isUntitled = True
+ self.curFile = "document%d.txt" % MdiChild.sequenceNumber
+ MdiChild.sequenceNumber += 1
+ self.setWindowTitle(self.curFile + '[*]')
+
+ self.document().contentsChanged.connect(self.documentWasModified)
+
+ def loadFile(self, fileName):
+ file = QFile(fileName)
+ if not file.open(QFile.ReadOnly | QFile.Text):
+ QMessageBox.warning(self, "MDI",
+ "Cannot read file %s:\n%s." % (fileName, file.errorString()))
+ return False
+
+ instr = QTextStream(file)
+ QApplication.setOverrideCursor(Qt.WaitCursor)
+ self.setPlainText(instr.readAll())
+ QApplication.restoreOverrideCursor()
+
+ self.setCurrentFile(fileName)
+
+ self.document().contentsChanged.connect(self.documentWasModified)
+
+ return True
+
+ def save(self):
+ if self.isUntitled:
+ return self.saveAs()
+ else:
+ return self.saveFile(self.curFile)
+
+ def saveAs(self):
+ fileName, _ = QFileDialog.getSaveFileName(self, "Save As", self.curFile)
+ if not fileName:
+ return False
+
+ return self.saveFile(fileName)
+
+ def saveFile(self, fileName):
+ file = QFile(fileName)
+
+ if not file.open(QFile.WriteOnly | QFile.Text):
+ QMessageBox.warning(self, "MDI",
+ "Cannot write file %s:\n%s." % (fileName, file.errorString()))
+ return False
+
+ outstr = QTextStream(file)
+ QApplication.setOverrideCursor(Qt.WaitCursor)
+ outstr << self.toPlainText()
+ QApplication.restoreOverrideCursor()
+
+ self.setCurrentFile(fileName)
+ return True
+
+ def userFriendlyCurrentFile(self):
+ return self.strippedName(self.curFile)
+
+ def currentFile(self):
+ return self.curFile
+
+ def closeEvent(self, event):
+ if self.maybeSave():
+ event.accept()
+ else:
+ event.ignore()
+
+ def documentWasModified(self):
+ self.setWindowModified(self.document().isModified())
+
+ def maybeSave(self):
+ if self.document().isModified():
+ ret = QMessageBox.warning(self, "MDI",
+ "'%s' has been modified.\nDo you want to save your "
+ "changes?" % self.userFriendlyCurrentFile(),
+ QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
+
+ if ret == QMessageBox.Save:
+ return self.save()
+
+ if ret == QMessageBox.Cancel:
+ return False
+
+ return True
+
+ def setCurrentFile(self, fileName):
+ self.curFile = QFileInfo(fileName).canonicalFilePath()
+ self.isUntitled = False
+ self.document().setModified(False)
+ self.setWindowModified(False)
+ self.setWindowTitle(self.userFriendlyCurrentFile() + "[*]")
+
+ def strippedName(self, fullFileName):
+ return QFileInfo(fullFileName).fileName()
+
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ self.mdiArea = QMdiArea()
+ self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
+ self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
+ self.setCentralWidget(self.mdiArea)
+
+ self.mdiArea.subWindowActivated.connect(self.updateMenus)
+ self.windowMapper = QSignalMapper(self)
+ self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)
+
+ self.createActions()
+ self.createMenus()
+ self.createToolBars()
+ self.createStatusBar()
+ self.updateMenus()
+
+ self.readSettings()
+
+ self.setWindowTitle("MDI")
+
+ def closeEvent(self, event):
+ self.mdiArea.closeAllSubWindows()
+ if self.mdiArea.currentSubWindow():
+ event.ignore()
+ else:
+ self.writeSettings()
+ event.accept()
+
+ def newFile(self):
+ child = self.createMdiChild()
+ child.newFile()
+ child.show()
+
+ def open(self):
+ fileName, _ = QFileDialog.getOpenFileName(self)
+ if fileName:
+ existing = self.findMdiChild(fileName)
+ if existing:
+ self.mdiArea.setActiveSubWindow(existing)
+ return
+
+ child = self.createMdiChild()
+ if child.loadFile(fileName):
+ self.statusBar().showMessage("File loaded", 2000)
+ child.show()
+ else:
+ child.close()
+
+ def save(self):
+ if self.activeMdiChild() and self.activeMdiChild().save():
+ self.statusBar().showMessage("File saved", 2000)
+
+ def saveAs(self):
+ if self.activeMdiChild() and self.activeMdiChild().saveAs():
+ self.statusBar().showMessage("File saved", 2000)
+
+ def cut(self):
+ if self.activeMdiChild():
+ self.activeMdiChild().cut()
+
+ def copy(self):
+ if self.activeMdiChild():
+ self.activeMdiChild().copy()
+
+ def paste(self):
+ if self.activeMdiChild():
+ self.activeMdiChild().paste()
+
+ def about(self):
+ QMessageBox.about(self, "About MDI",
+ "The <b>MDI</b> example demonstrates how to write multiple "
+ "document interface applications using Qt.")
+
+ def updateMenus(self):
+ hasMdiChild = (self.activeMdiChild() is not None)
+ self.saveAct.setEnabled(hasMdiChild)
+ self.saveAsAct.setEnabled(hasMdiChild)
+ self.pasteAct.setEnabled(hasMdiChild)
+ self.closeAct.setEnabled(hasMdiChild)
+ self.closeAllAct.setEnabled(hasMdiChild)
+ self.tileAct.setEnabled(hasMdiChild)
+ self.cascadeAct.setEnabled(hasMdiChild)
+ self.nextAct.setEnabled(hasMdiChild)
+ self.previousAct.setEnabled(hasMdiChild)
+ self.separatorAct.setVisible(hasMdiChild)
+
+ hasSelection = (self.activeMdiChild() is not None and
+ self.activeMdiChild().textCursor().hasSelection())
+ self.cutAct.setEnabled(hasSelection)
+ self.copyAct.setEnabled(hasSelection)
+
+ def updateWindowMenu(self):
+ self.windowMenu.clear()
+ self.windowMenu.addAction(self.closeAct)
+ self.windowMenu.addAction(self.closeAllAct)
+ self.windowMenu.addSeparator()
+ self.windowMenu.addAction(self.tileAct)
+ self.windowMenu.addAction(self.cascadeAct)
+ self.windowMenu.addSeparator()
+ self.windowMenu.addAction(self.nextAct)
+ self.windowMenu.addAction(self.previousAct)
+ self.windowMenu.addAction(self.separatorAct)
+
+ windows = self.mdiArea.subWindowList()
+ self.separatorAct.setVisible(len(windows) != 0)
+
+ for i, window in enumerate(windows):
+ child = window.widget()
+
+ text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
+ if i < 9:
+ text = '&' + text
+
+ action = self.windowMenu.addAction(text)
+ action.setCheckable(True)
+ action.setChecked(child is self.activeMdiChild())
+ action.triggered.connect(self.windowMapper.map)
+ self.windowMapper.setMapping(action, window)
+
+ def createMdiChild(self):
+ child = MdiChild()
+ self.mdiArea.addSubWindow(child)
+
+ child.copyAvailable.connect(self.cutAct.setEnabled)
+ child.copyAvailable.connect(self.copyAct.setEnabled)
+
+ return child
+
+ def createActions(self):
+
+ self.newAct = QAction(QIcon.fromTheme("document-new", QIcon(':/images/new.png')), "&New", self,
+ shortcut=QKeySequence.New, statusTip="Create a new file",
+ triggered=self.newFile)
+
+ self.openAct = QAction(QIcon.fromTheme("document-open", QIcon(':/images/open.png')), "&Open...", self,
+ shortcut=QKeySequence.Open, statusTip="Open an existing file",
+ triggered=self.open)
+
+ self.saveAct = QAction(QIcon.fromTheme("document-save", QIcon(':/images/save.png')), "&Save", self,
+ shortcut=QKeySequence.Save,
+ statusTip="Save the document to disk", triggered=self.save)
+
+ self.saveAsAct = QAction("Save &As...", self,
+ shortcut=QKeySequence.SaveAs,
+ statusTip="Save the document under a new name",
+ triggered=self.saveAs)
+
+ self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
+ statusTip="Exit the application",
+ triggered=QApplication.instance().closeAllWindows)
+
+ self.cutAct = QAction(QIcon.fromTheme("edit-cut", QIcon(':/images/cut.png')), "Cu&t", self,
+ shortcut=QKeySequence.Cut,
+ statusTip="Cut the current selection's contents to the clipboard",
+ triggered=self.cut)
+
+ self.copyAct = QAction(QIcon.fromTheme("edit-copy", QIcon(':/images/copy.png')), "&Copy", self,
+ shortcut=QKeySequence.Copy,
+ statusTip="Copy the current selection's contents to the clipboard",
+ triggered=self.copy)
+
+ self.pasteAct = QAction(QIcon.fromTheme("edit-paste", QIcon(':/images/paste.png')), "&Paste", self,
+ shortcut=QKeySequence.Paste,
+ statusTip="Paste the clipboard's contents into the current selection",
+ triggered=self.paste)
+
+ self.closeAct = QAction("Cl&ose", self,
+ statusTip="Close the active window",
+ triggered=self.mdiArea.closeActiveSubWindow)
+
+ self.closeAllAct = QAction("Close &All", self,
+ statusTip="Close all the windows",
+ triggered=self.mdiArea.closeAllSubWindows)
+
+ self.tileAct = QAction("&Tile", self, statusTip="Tile the windows",
+ triggered=self.mdiArea.tileSubWindows)
+
+ self.cascadeAct = QAction("&Cascade", self,
+ statusTip="Cascade the windows",
+ triggered=self.mdiArea.cascadeSubWindows)
+
+ self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild,
+ statusTip="Move the focus to the next window",
+ triggered=self.mdiArea.activateNextSubWindow)
+
+ self.previousAct = QAction("Pre&vious", self,
+ shortcut=QKeySequence.PreviousChild,
+ statusTip="Move the focus to the previous window",
+ triggered=self.mdiArea.activatePreviousSubWindow)
+
+ self.separatorAct = QAction(self)
+ self.separatorAct.setSeparator(True)
+
+ self.aboutAct = QAction("&About", self,
+ statusTip="Show the application's About box",
+ triggered=self.about)
+
+ self.aboutQtAct = QAction("About &Qt", self,
+ statusTip="Show the Qt library's About box",
+ triggered=QApplication.instance().aboutQt)
+
+ def createMenus(self):
+ self.fileMenu = self.menuBar().addMenu("&File")
+ self.fileMenu.addAction(self.newAct)
+ self.fileMenu.addAction(self.openAct)
+ self.fileMenu.addAction(self.saveAct)
+ self.fileMenu.addAction(self.saveAsAct)
+ self.fileMenu.addSeparator()
+ action = self.fileMenu.addAction("Switch layout direction")
+ action.triggered.connect(self.switchLayoutDirection)
+ self.fileMenu.addAction(self.exitAct)
+
+ self.editMenu = self.menuBar().addMenu("&Edit")
+ self.editMenu.addAction(self.cutAct)
+ self.editMenu.addAction(self.copyAct)
+ self.editMenu.addAction(self.pasteAct)
+
+ self.windowMenu = self.menuBar().addMenu("&Window")
+ self.updateWindowMenu()
+ self.windowMenu.aboutToShow.connect(self.updateWindowMenu)
+
+ self.menuBar().addSeparator()
+
+ self.helpMenu = self.menuBar().addMenu("&Help")
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+ def createToolBars(self):
+ self.fileToolBar = self.addToolBar("File")
+ self.fileToolBar.addAction(self.newAct)
+ self.fileToolBar.addAction(self.openAct)
+ self.fileToolBar.addAction(self.saveAct)
+
+ self.editToolBar = self.addToolBar("Edit")
+ self.editToolBar.addAction(self.cutAct)
+ self.editToolBar.addAction(self.copyAct)
+ self.editToolBar.addAction(self.pasteAct)
+
+ def createStatusBar(self):
+ self.statusBar().showMessage("Ready")
+
+ def readSettings(self):
+ settings = QSettings('Trolltech', 'MDI Example')
+ pos = settings.value('pos', QPoint(200, 200))
+ size = settings.value('size', QSize(400, 400))
+ self.move(pos)
+ self.resize(size)
+
+ def writeSettings(self):
+ settings = QSettings('Trolltech', 'MDI Example')
+ settings.setValue('pos', self.pos())
+ settings.setValue('size', self.size())
+
+ def activeMdiChild(self):
+ activeSubWindow = self.mdiArea.activeSubWindow()
+ if activeSubWindow:
+ return activeSubWindow.widget()
+ return None
+
+ def findMdiChild(self, fileName):
+ canonicalFilePath = QFileInfo(fileName).canonicalFilePath()
+
+ for window in self.mdiArea.subWindowList():
+ if window.widget().currentFile() == canonicalFilePath:
+ return window
+ return None
+
+ def switchLayoutDirection(self):
+ if self.layoutDirection() == Qt.LeftToRight:
+ QApplication.setLayoutDirection(Qt.RightToLeft)
+ else:
+ QApplication.setLayoutDirection(Qt.LeftToRight)
+
+ def setActiveSubWindow(self, window):
+ if window:
+ self.mdiArea.setActiveSubWindow(window)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/mainwindows/mdi/mdi.qrc b/examples/widgets/mainwindows/mdi/mdi.qrc
new file mode 100644
index 000000000..0a776fab4
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/mdi.qrc
@@ -0,0 +1,10 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/copy.png</file>
+ <file>images/cut.png</file>
+ <file>images/new.png</file>
+ <file>images/open.png</file>
+ <file>images/paste.png</file>
+ <file>images/save.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/mainwindows/mdi/mdi_rc.py b/examples/widgets/mainwindows/mdi/mdi_rc.py
new file mode 100644
index 000000000..3e586f4fa
--- /dev/null
+++ b/examples/widgets/mainwindows/mdi/mdi_rc.py
@@ -0,0 +1,645 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Tue Aug 3 16:19:17 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x03\x54\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x02\xe6\x49\x44\x41\x54\x58\xc3\xd5\
+\x97\xcd\x4e\x13\x61\x14\x86\xeb\x35\x94\x95\x7b\x71\xe1\xd2\xc4\
+\xe0\x05\xb8\xe2\x0e\x5c\xb8\xf4\x02\x5c\xb1\x30\xea\x05\x18\x96\
+\x26\x62\x58\xb8\xb0\x91\x58\x20\xd1\x9d\xbf\x89\xa4\x14\xb1\x52\
+\xa4\x48\x45\x94\xfe\xd0\x02\x43\xff\xa6\x9d\x19\xa6\x65\x80\xe3\
+\x79\x7b\xfa\x85\x51\x4a\x82\xc9\x21\x86\x49\xde\x9c\x33\xa7\xf3\
+\xcd\xfb\x9c\xf3\x4d\x9b\x4e\x84\x88\x22\xff\x53\x91\x73\x01\xc0\
+\xc7\xd5\x90\x6e\xff\xa5\xfb\xac\xc7\x3d\x3d\x64\x0d\xa9\x02\xf0\
+\x31\x32\x3c\x3c\xbc\x6a\x34\x3a\x3a\xba\x19\x56\x3c\x1e\xaf\x26\
+\x93\xc9\x56\x3a\x9d\x76\x13\x89\x44\x6b\x60\x60\x20\xcd\x6b\x6e\
+\x68\x02\xa4\x38\xd2\xe1\xe1\x71\x99\xba\xef\xb7\xc9\xb2\x2c\xda\
+\xdf\xdf\x27\x86\xf1\x78\xcd\x18\xeb\x8a\x1a\x40\x3f\xf3\xb0\x1c\
+\xc7\xa5\x4c\x66\xb9\x0b\x14\x04\x01\xc5\x62\xb1\x3a\xaf\x7b\x70\
+\x1a\x88\x53\x01\x1c\x1c\x10\x77\x77\xb2\x6c\xdb\xa1\xf9\xf9\xcf\
+\x64\x0e\xd7\x75\xe9\xf9\xc4\x44\x17\x42\x05\x00\x26\x7b\xc1\xc9\
+\xaa\x37\x1c\x4a\xce\xcd\x53\xf8\x70\x5d\x0f\x8b\x17\x54\x00\x82\
+\x10\x40\x67\x4f\x14\xce\xed\xa6\x47\x1f\x67\x66\xe9\xf5\x9b\xb7\
+\x14\x9f\x9c\xa4\xa9\xa9\x69\x7a\xf7\xfe\x03\x45\xa3\xd1\x65\x5e\
+\x7f\x41\x05\xc0\xef\x10\xed\xb6\x25\x86\x85\x9a\xe3\x05\x94\x5d\
+\xcd\xd1\xe4\xf4\x2b\x7a\x32\xfe\x94\x9e\xc5\x5e\xd0\x4c\x62\x0e\
+\x8b\x17\x55\x00\xda\x81\x18\xf5\x13\x20\x3c\xff\x90\x6a\xcd\x36\
+\x15\x37\xab\x94\x2f\x6e\x53\x89\x63\x8d\xb7\x85\xd7\x7e\x51\x01\
+\xf0\x79\xcc\xcd\x5d\x1e\xb5\xc7\x7b\xdb\xee\x9f\x3b\xbe\xe4\x88\
+\x5d\xb8\xbd\xee\xe2\x94\xca\x33\xe0\x75\xe4\xc6\x75\x57\x62\xd8\
+\x10\x39\xea\xe6\x33\x44\xd4\x01\xa7\x06\xe0\xf4\x3a\xad\x39\x22\
+\x98\x98\x68\x72\x80\x98\x6b\x50\x53\x9d\x00\x00\x2a\x2d\xb9\x31\
+\xe2\x4e\x53\x8c\x10\x0d\x04\xf2\x6d\xfb\x28\xb6\x7c\x45\x00\x9b\
+\x3b\xdb\x6a\xfc\x69\x8e\x3c\x6c\x88\x1a\xae\x39\x13\x80\x3a\x8f\
+\xb7\x54\x23\x2a\xd7\xc5\x04\x06\x06\x00\x35\x28\x9c\x17\xab\xbc\
+\x25\xbb\xca\x13\xc0\x4d\x61\x0e\x15\x2a\x72\x6e\xcc\x7e\x5a\x02\
+\x68\x6a\xdd\xad\xf1\x94\x27\x00\x53\xdc\x1c\x71\x6d\x5b\x40\x60\
+\x9a\xab\x1c\x75\x9e\xeb\x81\x41\x15\x47\x11\xc0\x6a\x89\x31\x0c\
+\xd6\x77\x04\x20\x0c\x64\x26\x62\xb6\x69\x75\x8b\xa8\xaa\x09\x50\
+\xb6\xc5\xbc\xd0\x03\xf8\xbe\x29\x63\x87\x29\x60\x0c\x18\x84\x1c\
+\x00\x5b\x4d\x45\x00\x74\x03\x53\x98\xad\x94\xc5\x1c\xe7\x46\xe6\
+\x1c\x00\xc8\x71\x5d\xa9\xa1\x08\x80\xfd\xfc\x56\x12\x73\x33\x01\
+\x08\x35\x18\x42\xe8\xda\x7c\x8e\x29\xa8\x4e\x00\x5b\x00\x03\xc8\
+\x98\x67\x36\x04\x00\x32\xe6\x85\xde\xf8\x17\x0b\xfc\x2c\xd8\x8a\
+\x00\x18\x67\x3a\x4f\xb4\x54\x14\x23\x98\x02\x00\x02\x0c\x3e\xfb\
+\xc5\x53\x28\xf0\x43\xb8\x66\x49\xf7\x6b\xf9\x52\x87\xd7\xbe\x54\
+\x01\xc8\x55\x8f\xba\x4e\xad\x4b\x0e\x90\xaf\x85\xde\xb7\xc2\x92\
+\x3d\x4f\xa6\xb3\xde\xa3\xb1\x71\xeb\xda\xd0\xf5\x15\x98\xb3\x6e\
+\xa9\x00\x6c\x34\xa4\x6b\x18\xff\xe0\x11\x7f\x5a\x17\x53\xd4\x13\
+\x0b\x59\x6f\xe4\xee\xbd\xe2\xa5\xc1\xcb\x4b\x7c\x6d\x8c\x75\x87\
+\x35\xa8\xfa\xb7\x1c\xdd\x65\xd9\x3c\x8f\x1f\x19\xfe\x9e\xcf\x1e\
+\x37\xbd\xc9\xba\x78\x26\x6f\x46\x00\x68\xf2\xff\x81\x99\x94\x9e\
+\xe9\x3f\xbf\x19\x01\x42\xd3\xf4\xfc\xbd\x9c\x9e\xa5\x7e\x03\x51\
+\x6c\x25\xa1\x92\x95\x0a\x77\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x05\x3a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\xcc\x49\x44\x41\x54\x58\xc3\xb5\
+\x97\x5d\x4c\x5b\x65\x1c\xc6\x77\x6f\xbc\xd9\xe5\x12\x49\x20\x71\
+\xd7\x26\xe3\x4e\x13\xb8\x70\xd1\x85\x44\xbd\x50\xe3\x10\x18\xe5\
+\x2b\x2e\x26\x4a\x04\x27\x86\xaa\x8b\x99\xe0\xd0\xa2\x6c\x19\x86\
+\x39\x17\xdc\x1a\x16\x98\x80\x40\x6c\xa6\x43\xca\x20\x2b\x83\x1e\
+\x28\xcc\xda\xd1\x96\xd2\xd2\x4a\x7b\xfa\x01\xa5\xd0\xef\x16\x1e\
+\xdf\xff\xdb\x1d\xc7\xcc\x04\x2a\x87\x93\x3c\x39\x6f\x21\x9c\xe7\
+\xf7\x3c\xef\x47\x0f\x87\x00\x1c\xca\x46\xcf\xbd\xfa\xe9\xbb\x4c\
+\x5a\x26\x61\x0f\x6a\x60\xca\xd9\xe9\x79\xd9\x9a\x3f\x5d\x50\xf2\
+\xa5\xc1\xe9\x8f\xa7\x57\xc3\x40\x30\x02\x84\xa2\x19\xad\xc7\x32\
+\x8a\x27\x81\x58\x22\x73\xbf\x79\x6b\xda\x4b\x10\x72\x02\x1c\x7b\
+\xe7\xac\xda\x1c\xd8\xc8\x98\x12\x40\x84\x99\x85\xe3\x19\x91\x31\
+\x29\x1a\x4b\x61\x25\x94\x44\x38\x9a\x42\x73\x87\xc6\xbe\x13\xc4\
+\xff\x02\x90\x12\x93\x79\x24\xf1\xc8\x58\x92\xcf\x1f\x84\x5d\x8c\
+\xc2\xe5\x09\x22\x12\x4b\xa3\xf4\xc3\xef\x4d\x34\x75\x59\x01\xb0\
+\xeb\xd8\x36\xd5\x90\x9e\x3a\xfc\xcc\xb9\xe7\x5f\x2e\x11\x3f\x56\
+\x9e\x45\x45\x55\x0d\x2a\x99\xde\xaf\xad\xc3\x9d\xb1\x89\xc7\x00\
+\xac\xb6\x25\xfc\xb9\xe8\x87\x6b\x15\x58\xf6\x04\x10\x08\xc6\xd2\
+\xaf\x9c\xbe\x70\x9f\x41\x1c\xd9\x15\x80\x5d\x87\x99\x1a\x8a\x8a\
+\x8a\xcc\x92\x5a\x5b\x5b\xdd\xa4\xaf\x55\xad\xfe\xaf\x54\xdf\xa6\
+\x06\x06\x06\x31\x39\x35\x85\xd9\xb9\x39\xe8\x26\x26\x50\x50\x50\
+\x80\x21\xcd\x6f\x7c\xde\x49\xa6\xf9\x05\xcc\x98\x5c\x1c\xc0\xe1\
+\x4f\x41\xf4\x85\xf0\x43\xaf\xce\xcd\x00\x6a\xf6\x02\x50\x43\x66\
+\xd8\xe5\x8a\xc7\xe3\xf0\x7a\xbd\x48\xa7\xd3\x98\x9c\x9c\x44\x65\
+\x65\x35\x66\x67\x8d\xbc\x81\x07\x66\x1b\x74\xd3\x16\x0e\x40\x32\
+\x2d\x78\xf0\xdd\x8d\x51\x8f\xac\x00\xe1\x70\x18\x46\xa3\x91\x8f\
+\x53\xa9\x14\x7e\xea\xed\x45\xe3\x27\x9f\x61\x86\x41\x38\x96\xdc\
+\x50\x77\x75\xe3\x4c\x43\x23\xce\x35\x9d\xc7\xed\x91\x71\x5c\xbc\
+\x3e\x2c\x2f\xc0\xc6\xc6\x06\xf4\x7a\xfd\x63\x40\x7d\x7d\xfd\x50\
+\x32\x88\xd0\x46\x1c\x66\x9b\x0b\x82\xc1\x88\xa9\x19\x13\xac\x0e\
+\x11\x97\xba\x64\x6e\x80\x00\xa6\xd8\x3a\xd8\x7e\x45\x22\x11\x94\
+\x2b\x2a\x30\xae\x13\x40\xe7\x04\x6d\x57\xda\xaa\x34\xbe\x7c\x53\
+\xe6\x35\x40\x66\x3a\x9d\x0e\xc3\xc3\xc3\xe8\x65\xf5\xf7\xf7\xf7\
+\x43\xab\xd5\xa2\xaa\xba\x06\x63\x77\xf5\x90\x0e\x2a\x77\x90\xed\
+\x04\xb6\x0e\xda\xbb\x65\x06\xa0\x79\xb7\xdb\xed\x18\x1a\x1a\x42\
+\x67\x67\x27\x7a\x7a\x7a\x38\x50\x49\x69\x19\x6e\x69\xf5\x10\xd7\
+\x00\x6f\x08\xb0\xf9\x00\x67\x00\xb8\xd0\x25\x33\xc0\xd6\xd6\x16\
+\xdf\x09\x81\x40\x00\xa2\x28\xc2\xef\xf7\x63\x6d\x6d\x0d\xa7\x14\
+\x95\xd0\xfc\xae\xe7\xa9\xc9\x7c\xc1\x0b\x98\x3d\x40\x9b\xdc\x00\
+\xdb\x41\x36\x37\x37\xf9\x76\xa4\x56\x14\x15\xd5\xe8\xfb\x55\xe0\
+\xa9\x1d\x81\x47\x00\xe7\x3b\x0f\x00\x80\xcc\x25\x80\x24\x33\x4f\
+\x24\x12\x28\x2b\xaf\xe2\x00\x7f\xb8\x00\x8b\x98\x01\xa0\x36\x5a\
+\xd5\x07\x30\x05\xff\x98\x27\x93\x3c\x3d\x4d\x49\xc9\xa9\x4a\x0e\
+\xa0\xb7\xb3\x03\x89\x3d\xc5\xf8\x17\x30\xb1\x00\x7c\x71\xf5\x00\
+\x00\xa4\xea\xc9\x98\x14\x8b\xc5\x50\xa6\xa8\x82\x7a\x48\xc0\x98\
+\x19\xb8\x6b\x05\xe6\x9c\x99\xfb\xe7\x57\x64\x04\x90\xd2\x53\x6a\
+\x02\x88\x46\xa3\xdc\x3c\x14\x0a\xa1\xb8\xb4\x02\xd7\x06\x05\xdc\
+\x66\x87\xe4\xa0\x01\x1c\x64\xc4\x04\x28\x3b\x64\x06\x48\x3d\x9c\
+\x73\x12\x99\xd3\xb9\x40\x20\xc5\x65\x55\xb8\xd8\x2d\xa0\x7f\x3a\
+\x63\xae\x7d\x90\x69\xe0\xa3\x76\x99\x00\xfe\x5d\x3d\xa5\x26\xad\
+\xae\xae\x72\x88\xb7\x4a\x2a\x70\xb9\x57\xc0\x3d\x1b\xb8\x7e\x9e\
+\x01\xee\xcc\x03\x67\x2e\xed\x13\x40\xaa\x9d\x44\x8b\x8e\x92\xd3\
+\x71\x4c\xdf\x01\x2b\x2b\x2b\x58\x5f\x5f\xe7\x10\x27\x59\x03\xdf\
+\x74\x09\x50\x4f\x00\xbf\xcc\x65\x1a\xb8\x32\x06\x34\xec\xa7\x01\
+\xc9\x58\xda\xeb\x64\x4e\x69\x29\x39\x1d\x44\x04\x40\xf5\xd3\xcf\
+\xde\x7c\x5b\x81\x96\xeb\x02\x4f\x7e\x75\x1c\xb8\x71\x0f\xf8\x71\
+\x2c\x9e\x7e\xbd\x4e\x6d\xa6\x37\xaa\xac\x00\x9e\x64\x2c\x6d\x37\
+\x32\x25\x00\xd1\x23\xf2\xe4\x12\xcc\x1b\x27\x15\x68\xef\x11\xa0\
+\xbc\x66\x5b\x7f\x4f\x35\xe2\x3c\x71\x9a\xbf\x8e\x69\xf7\xfc\x4a\
+\x26\x01\x90\xa9\x24\x69\xb5\x53\x42\x32\x0f\x06\x83\x70\xb9\x5c\
+\xdc\x90\x5e\x4a\xe8\xb3\xc7\xe3\x81\xdb\xed\xc6\xf1\x13\xaf\x25\
+\x9f\x7d\xa1\x9c\x4c\x3b\x98\x8a\x99\x8e\x3e\xc9\x78\x47\x00\x95\
+\x4a\xc5\x01\xa4\x15\x2e\xcd\x37\x19\x52\x52\x3a\xf7\x29\xb5\xc3\
+\xe1\xe0\x22\xe3\xc5\xc5\x45\x0e\xf5\xe2\xf1\x97\x5c\xf4\x1e\xb9\
+\x93\xe9\xae\x00\x2d\x2d\x2d\x6e\xe9\x60\xa1\xd4\xd2\x97\x0d\x8d\
+\x97\x97\x97\xe1\xf3\xf9\x60\xb3\xd9\xf8\x7d\x69\x69\x89\x43\x10\
+\x00\x8d\x0b\x0b\x0b\xcd\xb2\x00\xd0\xa2\x92\x52\x93\x11\x8d\xe9\
+\x4e\xdf\x78\x54\x3b\x35\x60\xb5\x5a\x79\xf5\xd4\x0a\xfd\xce\x60\
+\x30\x24\xf2\xf2\xf2\xee\xb3\x67\x1c\xd9\x17\x40\x53\x53\x93\x5b\
+\x9a\x67\x4a\x4f\x22\x13\xaa\x9a\xc6\x16\x8b\x99\x37\x40\x9f\x47\
+\x47\x47\x23\x6d\x6d\x6d\xde\xfc\xfc\x7c\x13\xfb\xdb\x41\xa6\xb2\
+\xbd\x9a\xff\x27\x40\x73\x73\x33\x9f\x02\x4a\x47\x10\x54\x3f\x55\
+\x3f\x3f\x3f\xcf\xeb\xd6\x68\x34\x91\xba\xba\x3a\xe7\xc3\xb4\x5d\
+\x4c\x1f\x30\x1d\xcd\xc6\x78\x47\x00\xa5\x52\xe9\x76\x3a\x9d\xbc\
+\x62\x4a\x4a\x6f\x3e\x94\xb4\xbe\xbe\xde\x99\x93\x93\x23\x99\x16\
+\x67\x53\x75\x56\x00\x8d\x8d\x8d\x6e\x8b\xc5\x82\x81\x81\x81\x48\
+\x6d\x6d\xad\x33\x37\x37\x57\x56\xd3\xdd\x00\xf8\x7f\x46\x4c\xc2\
+\x41\x99\x6e\xd7\xdf\x43\x39\x56\x18\x85\x70\xc8\x04\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x2b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\xbd\x49\x44\x41\x54\x58\xc3\xed\
+\x57\x6b\x4c\x93\x57\x18\x3e\x23\x71\xc9\x32\xe9\x16\x97\xa8\x54\
+\x65\x38\x9d\x02\x15\xf6\x03\x87\x32\x93\x01\x66\x2c\x5b\x70\xc4\
+\x30\xff\x60\xa2\x2e\x1a\x3a\x1d\x4e\x03\xba\x31\x89\x5b\xb3\x80\
+\xd9\x0c\x84\x02\x19\x58\x1c\x14\x8b\x85\xb2\x82\x95\x5e\xe4\x66\
+\x0b\x8e\x31\xf8\xc3\x46\xcb\x2d\x81\x15\xdc\xa8\xc2\x1c\x1b\xb7\
+\x6a\x69\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0d\x61\xd9\xb2\x93\
+\x3c\xed\x97\xf3\x7d\xfd\xde\xe7\xbc\xef\xf3\x5e\x4a\x00\x80\xfc\
+\x93\x20\xff\x0a\x02\x74\x09\x28\x44\x14\xd9\x14\x71\x14\x01\x2b\
+\x46\x80\xae\xdd\x64\xdd\xc6\x66\x22\x4c\xf8\x95\xc4\x8b\x47\xc8\
+\xa1\xd3\xf7\xc8\x8e\x97\x3b\x38\x32\x61\x2b\x41\x20\x85\x9c\xbe\
+\x30\x48\x2e\xdd\x80\x19\x40\x32\xab\x79\x4d\xf4\xbe\xfb\x72\x13\
+\x68\x64\x06\x91\x04\x5e\xa3\x51\xf4\x06\xee\x85\x47\xf5\xd0\xbd\
+\x83\xcb\x4d\x20\x9b\x9d\xf6\x40\x74\x2f\xbd\x16\x32\x3d\x20\x89\
+\x3f\x48\xa5\x2c\x1b\x01\x8c\x31\x79\xc1\xbb\x9d\x88\x4b\xc6\xd7\
+\xc6\x26\x0e\xa0\x10\xb9\xfd\x42\xfe\xc5\x2b\x36\x46\x8c\x12\x5c\
+\x4e\x02\x93\xa7\xa7\xa7\x0d\xcc\xd3\x39\xb9\x98\x63\x36\x14\x0a\
+\xd2\xe4\xa3\x2b\x41\x20\x8c\x29\x9e\x2a\xdf\x37\x47\xeb\xdc\x7b\
+\xb5\xcc\x89\x9e\x40\x44\x96\x54\x83\x2b\x2c\x0b\x36\x46\x48\x08\
+\x13\xf5\x64\x2a\x7b\x2e\x54\x03\x01\xf8\x03\x37\xbf\xc0\x0e\x34\
+\x2a\x54\xdf\x62\x88\x52\xd5\x2c\x58\x03\x74\x1d\x16\x08\x04\x7a\
+\x45\x55\xf5\xc8\xa0\x6d\x74\xc2\xd4\x73\xf7\x21\xbe\x73\x51\x95\
+\x90\xae\x8f\xd0\x13\xcf\xe5\x94\x83\x87\xb4\x02\x9e\xcc\x2e\x03\
+\xd4\x06\xdd\xaf\x99\xcb\xb0\xaf\xaf\xaf\x3e\xbf\xd2\x60\xb5\xdb\
+\xed\x80\xf8\x79\xe4\x3e\xc4\x5e\xab\xb4\xb9\x88\x2f\x86\x80\x27\
+\xd3\xc0\x67\xf9\x8e\x19\xf5\x60\xd7\x5e\x33\xba\x76\xda\x73\xee\
+\x68\xd8\xc7\xc7\x47\x9f\xab\xab\xb0\x0e\x0f\x0d\xc1\x10\x87\xb2\
+\xf6\x2e\xe7\x96\x37\xf7\x77\x73\x61\xd8\xbd\xe8\x5e\x80\x2f\x66\
+\x9a\xa0\x86\xdf\xa9\x36\x42\xf7\xf0\x03\xd8\x19\x9f\xd4\xcf\xa5\
+\xe7\x1a\x8a\x98\x2d\x7e\xfe\x6d\x97\x54\x1a\x6b\x5f\x5f\x1f\xb8\
+\xd0\xd1\x73\x07\x62\x72\x15\x56\x4e\xc4\x87\x97\xd4\x8c\x30\x14\
+\xe9\x15\xb7\x1e\x38\x1c\x0e\x40\xa4\xd6\x19\x31\x9e\x85\x9b\x05\
+\x7e\x6d\xa9\x25\x1a\x5b\x97\xd9\x0c\xe6\x2e\x0a\xf3\x24\x14\xdf\
+\x36\x8e\x7b\xbd\x1e\xd1\xcd\x42\xc8\x09\x6f\xa9\x04\x3c\xd1\xbd\
+\x56\xab\x15\x10\x77\x7f\x1b\x84\xf3\x92\x5c\xbb\x52\xa9\x84\xfa\
+\xfa\x7a\x30\x99\x4c\x0c\x75\xdf\x35\xc1\x51\xb1\x64\x18\xc9\x51\
+\x44\x3e\xb6\x76\xcc\xb4\x40\x4f\x93\x5f\x7e\xd3\xd6\xdf\xdf\x0f\
+\x32\x99\x0c\x44\x22\x11\xa8\x54\x2a\x90\x4a\xa5\xa0\xd1\x68\x20\
+\x4b\x5b\x39\xbe\xe9\x95\xe0\x1f\xb8\x53\xaf\x79\x2c\xf3\x00\x97\
+\x8e\x22\x9e\xc7\x86\xe6\x53\x29\x19\xf6\x82\x82\x02\xe6\xe2\xa0\
+\xa0\x20\xe0\xf1\x78\x60\xb1\x58\x40\x5b\x5e\x01\xfb\xcf\x26\x0c\
+\x2d\xa6\x53\xce\x67\x94\xcf\x09\x4c\x83\xe2\x5b\x7b\xe6\xc2\x60\
+\x9a\xb2\x14\x14\x0a\x05\x88\xc5\x62\xc8\xcc\xcc\x84\xa2\xa2\x22\
+\x50\xab\xd5\xd0\xd9\xd9\xc9\x60\xec\xfe\xc9\xb9\xc9\xdb\xa7\x75\
+\x2e\xb7\xcf\x4b\x80\xae\xb7\xd8\x29\x70\x0e\xc0\x6a\x97\xac\x78\
+\x88\xca\x7f\x82\xe2\x29\x89\x0e\x3e\x97\x2b\x21\x5b\x96\x0f\x07\
+\x63\xe3\x47\x84\x1f\x26\xd8\x92\x72\x64\x8e\x6f\x1a\xbf\x07\xa3\
+\xd1\x08\x2d\xad\x2d\xf0\xcb\xc0\x20\x1c\x38\xf1\xbe\x05\xb3\x62\
+\xc1\x04\x5c\x69\x84\x85\x85\x84\x46\xdc\x26\xe7\x32\xac\x2c\xcf\
+\x33\xb5\x13\xec\x3b\xe3\xba\xd3\x33\xaf\x82\xe5\xfe\x7a\x89\x06\
+\x9e\xde\xfc\x62\x1b\xf7\x3c\x92\x8d\x7b\x66\xab\x4f\x5b\xca\x35\
+\xed\x58\x43\x43\x3d\x34\x34\x34\x80\xa5\xb7\x17\x32\x14\xc5\xc3\
+\xf3\xe9\xc0\x65\x3c\x92\xe5\x28\x9e\x36\x5d\xe5\x9c\x2a\x32\x78\
+\x7d\xf4\x83\x2e\x5a\x6c\x12\x31\x0c\x1b\x25\xea\x71\xf7\x2f\xcb\
+\x27\xef\x05\x87\x5f\xfe\xd3\xe4\x44\x0b\x4c\x68\xf4\xc9\x3e\x75\
+\x95\x1e\x0c\x06\x03\xb4\xb7\xb7\xc3\xd7\xc6\x96\x31\xae\x81\x09\
+\x66\xf1\x36\x6d\x38\x68\x3c\x49\x3a\x3a\x65\xf8\x62\x81\x83\x44\
+\xbd\x57\x43\xb6\x0a\x5e\x9b\x2a\xc3\x94\x5c\xb0\x42\x0f\xab\x24\
+\xb4\x04\x9f\x4a\xaa\x9b\x43\x37\x31\x28\xd4\x4f\xf2\x0a\xc7\x74\
+\x3a\x1d\xd4\xd6\xd6\x82\xc9\x7c\xdb\xb9\x61\x9b\xf7\x5f\xea\x62\
+\xb2\xe5\x7e\x9c\x75\x1f\x0d\xf3\xb2\xd4\x4e\xf2\xf6\xb1\xeb\x2e\
+\xb6\xae\x94\xc3\x90\x6c\x97\x55\xc1\x4b\x57\xab\x80\x9c\x4d\x6e\
+\x5a\xd0\x1c\x49\xbd\xb1\xe7\x88\xb0\xef\xca\x57\xc5\x50\x5a\x5a\
+\x0a\x1d\x3f\xf6\x4c\x04\x06\x87\x74\x3c\xaa\x0b\xc2\x84\x46\x8d\
+\x07\xc8\x6f\x02\xd9\xf9\xaa\x7e\x9a\xf1\x30\x46\x8e\x36\x20\xaf\
+\xbc\x4a\x78\x43\x69\x00\x92\x28\x1d\x98\xcd\x95\xb3\x79\xc3\x7d\
+\x3d\xbf\xf9\x44\x6a\xa6\x5d\x2e\x97\x43\x53\x4b\x2b\x44\x1c\x7b\
+\xf7\xce\xf4\x14\x25\xae\xf1\x8a\xf5\x77\x9c\xf5\x70\x02\xc2\xd9\
+\x0f\x89\xd1\x81\x03\x4f\x8e\xf7\xdc\xd2\x69\xe7\xf3\xdf\x75\xfc\
+\x6f\x14\x2e\x36\xd2\xef\xd8\x17\x69\x49\xbe\x2c\x9d\xc8\xd3\x96\
+\x3b\xa7\x0f\x31\x8c\x25\xc6\xdf\x9f\xba\x77\x5f\x71\x35\xa0\x41\
+\x6c\xb5\x08\x8c\xf9\x94\xf1\xe0\xf0\x33\x4b\x9a\x7c\x68\x13\x5a\
+\xbd\xce\xa3\xd9\x6b\x4f\x48\xf7\x0c\x0f\xb0\x0f\xfe\xf3\x87\xc8\
+\xf9\x2f\xee\xb9\x49\x6e\x00\xf6\x7b\x3e\xed\xf7\x08\x1e\x2a\x3e\
+\x5d\xe5\x58\xaa\xf1\x47\x5a\xf5\xb6\x59\x0b\x11\x1d\xb3\x43\xc9\
+\x91\x38\x09\x39\xf9\xa9\x96\x21\xfa\x5c\x1a\x0d\xcf\xb3\xff\xff\
+\x37\xfc\x4f\x13\xf8\x1d\xe7\x87\x19\xb9\x44\xc3\x01\xcf\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xa3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x04\x35\x49\x44\x41\x54\x58\xc3\xe5\
+\x97\xcd\x8f\x54\x45\x14\xc5\x7f\xb7\xea\xd6\x7b\xaf\xdb\x6e\xc7\
+\xf9\x40\x9d\x89\x46\x4d\x34\x99\x44\x8d\x1a\x48\x98\xc4\x8c\x1f\
+\x1b\xfe\x02\x4c\x5c\xf1\x07\x18\x16\x2e\x4d\x5c\x6b\x58\xc3\x8e\
+\xc4\x8d\x1b\x17\xce\x82\x68\x74\x41\x5c\x18\x0d\xe2\xc4\xc6\x00\
+\x3d\x60\x50\x51\x19\x60\x02\xa2\x0e\x0c\x83\xd3\xfd\x5e\xf7\x94\
+\x8b\xaa\xee\xf9\x60\xe6\x0d\x84\x51\x16\x56\x52\xa9\xce\x7b\xb7\
+\xeb\x9e\x3a\xf7\xd4\xa9\x7a\xea\xbd\xe7\x7e\x36\xe5\x3e\xb7\x3e\
+\x80\x5d\xbb\x76\xbd\x03\xec\xfd\x8f\xf2\x4e\x35\x1a\x8d\x03\xeb\
+\x19\xd8\xbb\xef\xbd\xa3\x3b\x1f\x1f\x76\x00\x9c\x3c\x3a\xcf\xcc\
+\x97\x37\x58\x9c\xef\xdc\x53\xa6\xda\xa0\xf2\xdc\x6b\x03\xbc\xb8\
+\x67\x10\x80\x8b\x7f\x16\x7c\xf8\xee\x1e\x80\xdb\x00\x70\xfc\xec\
+\x1c\xdf\x3f\x30\x04\x78\x2e\xfd\xb8\xc0\xfe\xb7\xce\x6f\xcb\x72\
+\x0f\x1d\x79\x9a\x0b\x23\x96\xd3\x9f\x1f\x64\xfc\xd5\x7d\x9b\x6b\
+\x40\x45\xb0\x16\x40\x78\x70\x2c\x23\xcb\xb2\x6d\x01\x30\x30\x96\
+\x61\x8d\x50\x1b\x7c\x14\x23\x25\x22\x14\x2b\xd8\x18\x91\xd5\x95\
+\x73\xe7\xce\x83\x2a\xb8\x04\xd2\x14\xb2\x0c\xd2\x2c\x8c\x49\x0a\
+\x49\x12\xde\x77\x3a\x90\xe7\x90\xb7\xa1\xd5\x82\x76\x2b\x8e\x6d\
+\x28\x72\xb2\xfa\x38\xd6\x0a\xe3\xaf\xbc\x49\x6b\xf1\xfa\xe6\x00\
+\xac\x15\xac\x15\x04\xb0\x46\xd8\xbd\x7b\xe7\x16\x6b\xeb\x86\xae\
+\x80\x5a\xa8\x56\x81\xea\x6d\x51\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\
+\x84\x01\x67\x05\x35\x82\x08\xa8\x0a\x95\x2c\xc3\x23\x20\x1e\x08\
+\xc0\xf0\x1e\x2f\x02\xde\x23\x12\x26\x15\x7c\x88\x23\xc4\x21\x1e\
+\x3c\x21\x5e\x40\x4d\x58\x18\x40\xd7\x4a\x89\x06\xac\xa0\xda\x63\
+\x00\x9a\x33\xbf\x05\x8a\x53\x07\x69\x02\x95\x04\xb2\x34\xf6\x04\
+\x12\x07\x4e\xa1\xe8\x40\x5e\x40\x2b\x8f\xbd\x05\x4b\x39\xb4\x73\
+\xc8\x0b\x54\x87\x71\x3d\x00\x2a\xe5\x25\x70\x31\x40\xd5\x30\x39\
+\xf9\xd2\xd6\x0a\xf3\x3e\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8\x27\x61\
+\x61\xbd\x1c\x25\x25\x20\x00\xf0\x81\x8d\x34\x4d\xa3\x3a\xc3\xb3\
+\x98\x11\x89\x6c\x07\xda\x63\x09\x56\x98\x5f\x29\x46\xfc\x61\xcd\
+\x72\x7f\x61\x1d\x2d\xd1\x80\x3a\x09\x54\x49\x18\x4f\x34\x2f\xe0\
+\x9d\x85\xc4\x21\x89\xc3\x67\x09\x92\x69\xd8\x11\x89\xe2\x13\x87\
+\x58\x8b\xef\x76\x91\xbc\x80\xbc\x03\xed\x02\xdf\x6a\x23\xed\x02\
+\xf2\x02\x9f\x77\x50\x1d\x45\xd5\x20\x78\x3a\xeb\x54\x78\x9b\x06\
+\x9c\x33\x78\x0f\x03\x8f\x24\xbc\xfe\xf2\xf3\x77\x68\xe8\x36\x68\
+\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04\x52\x5e\x82\x44\x4d\x5f\x84\
+\x8f\x0d\xa5\x38\xe7\xb6\xc5\x88\x9e\x18\x4b\xb9\x76\xb3\x03\x08\
+\x9d\x52\x11\xaa\x90\xb8\x50\xef\x5a\xc5\x30\x7d\xb1\xcb\x40\xc5\
+\xb0\x0e\xf4\x26\xad\x57\xf9\x55\x2e\xe1\xe1\xc6\xd2\x32\xf5\xcc\
+\x70\x7d\xc9\x84\x2d\xe9\x4a\x19\x10\x9c\x1a\xc0\x73\xe5\x66\x97\
+\x2b\x37\xbb\xac\x51\x57\x3f\xd7\xaa\x64\x7e\xc5\x27\xa2\x29\xac\
+\x05\x15\xc3\x9c\x0b\xb5\x77\xa6\x6c\x17\xa8\xc1\xa9\x20\xc8\x1a\
+\x35\xaf\x9b\x35\x1a\x8f\x59\x31\x9e\xfe\x7b\xe9\xef\x14\x00\xf1\
+\x82\xef\x9b\x58\x30\x2b\x57\x56\x02\x55\x21\xd1\x90\xfc\xe7\x53\
+\xdf\xf2\xeb\x99\x13\x2c\x2d\xde\xb8\xa7\xfa\x57\x6a\x03\x3c\xf5\
+\xec\x4e\x9e\x79\x61\x02\x0f\xa8\x33\x5b\x31\x10\x03\x7c\x87\xf7\
+\xf7\xbf\xc1\xc2\xc2\x02\xb7\x6e\xdd\xa2\x28\x0a\x44\x04\x6b\x2d\
+\xd6\x5a\x54\x15\x55\xc5\x39\x87\xaa\x62\xad\xc5\x98\xf0\xdf\xe5\
+\xe5\x65\xf2\x3c\xef\xf7\x23\xcd\xf9\xb8\xf2\x2d\x18\x70\x56\x50\
+\x17\x18\xdc\x31\x3a\xb6\x72\x4f\x38\x7e\x9c\xe9\xe9\x69\x8c\x31\
+\x78\xef\x99\x98\x98\x60\x72\x72\xf2\x8e\x59\xd8\x31\x3a\xd6\xdf\
+\x86\xae\xd4\x09\x55\x70\x36\xac\xa2\x56\xaf\xf7\x6b\x39\x33\x33\
+\xc3\xd0\xd0\x10\xd6\x5a\xbc\xf7\x34\x9b\xcd\xbb\x02\x50\xab\xd7\
+\x70\xd1\x88\xb4\xd4\x88\x14\x9c\x0b\x27\x5c\xa0\x2a\x00\xa8\x56\
+\xab\x64\x59\xd6\xa7\xb8\x37\xde\x69\x73\x1a\xa9\x17\x41\x4b\xad\
+\x38\x1e\xc7\xbd\x23\xb4\xd7\x8c\x31\x88\x44\xdf\x8f\x3a\xb8\xab\
+\x9b\xaf\x35\xa8\x0d\xf3\xf6\x18\x2e\x3d\x8e\x83\x29\x6d\xe3\xd5\
+\xdb\x12\xa9\xf7\xe5\x56\x6c\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\
+\xdb\x02\xe0\xa1\x91\x61\xd4\xc2\xb5\x2b\x97\x59\x9c\xbf\xbe\x05\
+\x03\x36\xf8\xc0\x60\xad\x02\x0b\xdb\xc3\xc0\x50\xad\xc2\xec\xc5\
+\x4b\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa6\x36\x04\x60\x24\x5e\
+\x4a\x05\x12\x0b\xed\x91\x27\xa9\x3d\x0c\x6f\x1f\x38\xc8\x66\xc7\
+\x81\x27\x3a\xf1\x2a\xe7\x35\x1e\x32\x81\x14\x28\xba\x70\xf9\xea\
+\x55\xce\x34\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1f\x4e\x1d\x02\x0e\x6f\
+\x08\xe0\xb3\x8f\x3e\xe0\xa7\xd3\x27\x57\x99\xe9\xda\xa3\x86\x55\
+\xe6\xbb\x1e\x04\x1b\x3c\x5f\x1d\x6f\x7c\x77\xee\x8f\xd9\x5f\x0e\
+\x01\x87\x1b\x8d\xc6\x5f\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5\x73\
+\x6c\x7d\xf2\x35\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1\x3f\x4d\xf0\
+\x4b\xb9\xe8\x46\x89\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x06\x6d\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x06\x34\x49\x44\x41\x54\x78\x5e\xad\x97\x5b\x6c\x54\xc7\
+\x1d\xc6\x7f\x73\xce\xd9\x8b\xbd\xf6\xfa\x16\xa0\xbe\x00\x0e\xb2\
+\x69\x63\x24\x42\x4a\x21\x22\xa1\x2d\x95\x62\xa5\x2f\xee\x4b\x68\
+\x2b\x95\xa6\x55\xa5\xc6\x60\x55\xaa\xda\xb4\xaa\xfa\x56\x09\x55\
+\xca\x03\x94\x27\xda\x07\x84\x14\x29\xad\xc4\x8b\xa5\x52\x83\x79\
+\x08\xc5\x18\x39\x0e\x69\xd3\x84\x9a\x9b\x63\x6a\xec\xb2\x04\x1b\
+\x3b\xbb\xf6\x7a\x8f\xbd\xbb\xde\xb3\x67\xa6\xc3\x68\x85\xe5\x72\
+\x6c\x88\xc9\x27\x7d\xfa\x9f\x9d\x87\xfd\x7e\xf3\x9f\x99\x73\x11\
+\x4a\x29\x82\x24\x84\x78\x05\x78\x9e\xc7\x6b\x48\x29\xf5\x77\xd6\
+\x28\x27\x20\xb8\x43\xbb\x01\x68\x97\x52\xbe\xc6\x63\x64\x59\xd6\
+\x07\x1a\xf6\xbb\x40\xb7\x06\x39\xff\x14\x00\x26\xfc\xb7\xed\xf5\
+\xe2\x60\x5d\x44\x44\x6e\xce\x89\x8a\x2b\x57\xae\x50\x5d\x53\x8d\
+\x40\x00\xa0\x50\x08\x65\x28\x41\x29\x66\xd3\x69\x5e\xa9\x17\x2f\
+\xbc\xb4\x4e\x6c\x3b\xf1\x1f\xb9\x47\x83\x7c\x5b\x43\x4c\x3c\x4d\
+\x07\xf6\xff\x60\x8b\xdd\x2c\x25\xf8\x4a\x32\x3c\x3c\x4c\x65\x65\
+\x25\x2b\xc9\x75\x5d\x1e\xc0\x6e\xa9\xb0\x22\x1b\xa2\x2a\x72\x3f\
+\xa7\xea\x81\xb5\x03\x08\x2d\x05\x48\xa1\x0d\xf4\x5d\xbc\x48\x2e\
+\x97\xc3\x2f\x16\x51\x4a\x91\xcf\xe7\x59\x5c\x5c\xa4\x50\x28\x50\
+\xd4\x63\xb5\xb5\xb5\x94\x01\x58\x80\xf8\x82\xf6\x80\x01\x00\x36\
+\x44\x05\x1f\x0f\xbc\x4b\x3e\x3b\x8f\x85\x44\x95\x32\xe2\xb6\xc4\
+\xb6\x04\x21\x21\x70\x3e\x53\x6c\x8c\x3b\x80\x44\x2a\x04\xf0\x9c\
+\x10\x02\xe0\xcb\x40\x05\x50\x0f\x34\x60\xc4\x48\x69\x9f\x24\x02\
+\x01\x4e\x9c\x38\x21\x00\x81\x05\xd2\x87\x96\x96\x67\x09\x65\x6d\
+\x14\xe5\x28\xa5\xb4\x41\x08\x58\x57\x19\x25\xe2\xd8\x44\x42\x16\
+\xc3\x13\x73\x5c\xbc\x3d\x41\xf7\x58\x8e\x5c\x24\xbe\xa9\xbd\x7d\
+\xf7\xef\x2d\xcb\x5a\xdc\xb1\x63\x47\x59\x55\x55\x95\xd3\xd8\xd8\
+\x18\x7e\xe0\x86\x86\x86\xd0\xa5\x4b\x97\xdc\xae\xae\xae\x08\xf0\
+\xd6\xaa\x1d\x00\x13\x44\x55\x2c\xc2\x73\xd5\x31\xf2\x9e\x4f\xa1\
+\x28\x91\x4a\x61\x09\x41\xd8\xb1\x88\x86\x6c\xe6\x72\x05\x12\xa2\
+\x8e\x3f\x9f\xff\x2b\x0d\x4d\x1b\x01\x22\xc0\x66\x96\x84\xef\xfb\
+\x78\x9e\x47\x75\x75\xb5\x9e\x50\x4b\xf4\xea\xd5\xab\x87\x84\x10\
+\x28\xa5\xde\x5a\x11\xc0\xb2\x41\x00\xb6\x2d\x90\xda\xb6\x14\x38\
+\x08\xa4\x12\x58\xc2\x8c\x1b\x8f\x4c\xb9\xec\x7b\xf5\x3b\xd4\x37\
+\x36\x11\x7c\x2f\xc1\x84\x67\x32\x19\xca\xcb\xcb\xcd\x66\x3e\x76\
+\xec\xd8\x26\xbd\x7f\x0e\x2e\x41\x2c\x01\xd0\xd9\xd9\xa9\x0e\x1d\
+\x3a\xa4\x6c\x21\x08\x59\x10\xb6\x2d\x1c\xc7\xc6\x42\x50\xb4\xcd\
+\x1a\x1b\x00\xc7\xb2\x88\x38\x96\xae\x02\x60\x59\x78\x10\xc0\xdc\
+\xdc\x1c\x35\x35\x35\x06\x20\x1a\x8d\x72\xe4\xc8\x91\xcd\xc0\x03\
+\x88\x1b\x1a\xa2\xc7\x62\xb9\xb0\x6d\x74\x30\x66\x8d\xcb\x23\x36\
+\xb1\xa8\xa3\xc7\x2c\x32\x8b\x1e\x93\x99\x1c\x63\xa9\x79\xee\xcc\
+\x2e\xe8\xdf\x45\x72\xf9\x3c\xab\xc8\x2c\x41\x36\x9b\x35\xa7\x66\
+\xe9\xff\x6d\x0e\x1c\x38\xb0\x1e\xe8\x00\x58\x06\xa0\xb4\x74\x16\
+\x8e\x0d\xe1\x90\xc0\x53\x8a\xb1\xa4\xcb\x8d\x8c\x83\xd3\xb2\x97\
+\xa6\x7d\xaf\xb3\xb5\xe3\x17\xac\xdb\xfb\x3a\x0d\x2f\xb4\x73\xfb\
+\xce\x24\xfd\xfd\xfd\x24\x93\x49\x94\x52\xe6\xfa\xf8\xf1\xe3\xe8\
+\xba\xac\x33\xe7\xce\x9d\xe3\xe8\xd1\xa3\x1c\x3e\x7c\x98\xde\xde\
+\x5e\x12\x89\x84\x04\x2c\xa1\x15\xdc\x01\xed\xff\xce\xe6\xf8\xe7\
+\x94\x4f\x6b\xc7\xcf\xf8\xe6\x2f\xdf\x26\xf6\xf5\x37\x99\x7c\xa6\
+\x83\x6b\xfe\x2e\xae\xf1\x2d\x64\x6b\x17\xad\x7b\x7f\x4e\x5e\x56\
+\x73\xfa\x6f\x67\xd1\x77\x4d\xee\xdc\x9d\xe2\x1b\xaf\x76\x72\xfd\
+\xfa\x75\x03\xa0\x67\x6b\xd6\x3f\x16\x8b\x99\xeb\x78\x3c\x8e\xe3\
+\x38\x25\x38\x04\xc0\x23\x00\x96\x25\x98\xca\x41\x3a\xde\xca\xfe\
+\xdf\xbd\x4d\xd5\xae\xd7\x28\x84\x62\x08\xdb\x42\x59\x82\x6c\x41\
+\x72\x7f\x66\x91\x4f\xee\x66\x18\xb8\xea\x72\xfa\x1f\x61\x64\xd5\
+\x5e\xae\x8f\xdc\x67\x32\xd7\xc6\x85\x0f\xee\x9b\x00\xed\x87\xa1\
+\xcd\xcd\xcd\xb4\xb5\xb5\x19\x37\x35\x35\xa1\xa1\x14\x20\x83\x1f\
+\x46\x16\xdc\x71\x15\xdf\xff\xe9\x6f\xa8\x6c\xd8\x48\xe2\xec\x3b\
+\x4c\x8f\x5e\xc3\x89\x94\xb1\xb5\x79\x07\x9b\x5b\xb6\xf3\x49\x79\
+\x25\x63\x09\x97\xcf\x66\xf2\xdc\x9d\xce\x32\xa1\xed\x88\x0d\x4c\
+\x27\xe7\xd8\xb7\x2b\xca\xfa\x25\x00\x33\x7b\x3d\x6b\xea\xea\xea\
+\x00\xcc\x75\x2a\x95\x32\x00\x4a\x2b\x10\xa0\xb9\x5a\x70\xe1\x9d\
+\x63\x28\x2c\xca\xe6\xc6\xd9\x10\x8f\x52\x94\x92\x7b\xc3\x7d\x24\
+\x65\x05\xdb\xda\x7f\x4c\x4d\xdb\xcb\x7c\x3c\x9c\x66\xd2\x5f\xc0\
+\xcd\x78\x2c\xcc\x6b\x2f\x78\x20\x00\xb5\x74\x3a\x42\xa1\x90\x09\
+\x2d\xdd\xea\x1f\x8e\x01\x2a\xf8\x3e\x60\xc1\xc6\xb8\xa0\x50\x1c\
+\x23\x1c\x8b\x53\xb7\xa5\x96\x92\x78\x76\x7d\x05\xe9\xac\xc7\x68\
+\xff\x9f\x98\xae\xbc\x4c\xcb\xf6\x83\xb8\x0b\x61\xbc\x82\xa4\x58\
+\x94\x78\xda\x21\xc7\x42\x2d\xaa\x80\xe3\x69\xa0\x96\xd5\x15\x01\
+\x00\xd6\xc7\x43\x84\xca\x23\xfc\xbf\x6a\x63\x21\x9e\xa9\x0c\x73\
+\xe1\xdf\x83\xec\xd9\xf9\x13\xca\xa3\x0e\xb9\x32\x47\x03\x28\x03\
+\x61\x6b\x00\x16\x4b\x21\xa5\x1c\x25\x30\x2a\x15\xa4\x5c\x05\x40\
+\x58\xa5\x2a\xcc\xf5\x23\xfa\x70\x6c\x86\xf1\x59\x8f\xef\xfd\xfa\
+\x8f\xdc\xca\xd4\xe0\x44\x5c\xa2\x11\x1b\xcf\x93\x14\x3d\x07\xd3\
+\x01\xa5\x90\x52\xf2\x50\x6a\x59\x01\x56\x05\x10\x08\x4c\x0d\x04\
+\x18\x9d\x76\xf9\xd5\x5f\x86\x18\xbd\xb7\x80\x3d\x93\x67\xd3\xba\
+\x32\xf2\x79\x5f\xbb\x68\xea\xce\xaf\xd4\x70\xf9\xdd\xe0\x25\x00\
+\x9e\x78\x09\x4c\xb8\x10\x3c\xa2\xd6\x2f\x55\xf2\x87\x1f\x3e\xcf\
+\xf5\x4f\x33\x44\x1b\xb7\xb1\xf3\xc5\x97\x59\x12\x5c\x4e\x60\x8e\
+\xdb\x53\x01\x28\xc0\x12\x25\x00\x6d\xd4\x52\x7d\xb1\xb5\x96\xdd\
+\x5b\xe2\x74\xbf\x97\xa5\x6a\xf7\x57\xf9\xd1\x1b\x6f\x10\xa0\xb5\
+\x03\x98\xb5\x37\xd5\xd8\x08\x01\xd2\xcb\x53\x70\x53\x78\xf3\x33\
+\x14\xb3\x69\x0a\x19\x1f\x25\xfd\xd5\x82\xd6\x08\xf0\xf0\x29\xe7\
+\xe3\xe7\x33\x14\xe6\x75\xa8\x0e\xd6\x00\xcb\xf7\x89\x10\xc1\x33\
+\x7d\xfa\xd7\x72\x8c\xb2\x13\x37\x03\xc7\x01\xb2\x1e\xfe\xad\x94\
+\xcc\x6f\xf7\x44\x54\x03\xd8\x5f\x70\x07\x08\x92\x09\xfd\xd7\x3d\
+\x3f\xfd\x7e\x42\xa6\xcf\xdf\xf6\xef\x02\xee\x76\x3b\xfc\x92\x06\
+\xa8\xe3\x73\xca\x75\x5d\x1f\x70\x57\xed\x00\x40\x32\xab\x0a\x1f\
+\x7e\x2a\xd3\xbd\xb7\xfc\xd4\xcd\x69\x39\x05\xf4\x03\x97\x74\x68\
+\xbf\x10\xa2\xd3\xb6\xed\xaf\x7d\x9e\x25\x58\x58\x58\xf0\x07\x06\
+\x06\xd2\x27\x4f\x9e\x9c\x06\xba\x83\x00\x3e\x1a\x49\xca\xad\xe3\
+\xb3\x2a\xd7\x3b\xe2\xa7\x6e\x4c\xcb\xd1\x52\xe8\x59\x1d\x74\x8b\
+\x00\x3d\x09\xc0\xd0\xd0\x90\xdb\xd3\xd3\x93\xd2\x4e\xcf\xce\xce\
+\x9e\x2e\xbd\x1d\xdf\x08\x02\xe8\xee\xea\x29\x00\x8c\x04\x84\x06\
+\x85\xaf\x08\x30\x35\x35\x55\xd0\x2f\x22\xa9\x53\xa7\x4e\x25\xc7\
+\xc7\xc7\x2f\x03\x67\x81\x7e\x1d\xec\xae\xb8\x09\x4b\xdf\x76\xda\
+\x4f\x26\x85\x01\x40\x08\x40\x61\x5a\xfc\xde\xe0\x60\xba\xbb\xbb\
+\x3b\xa5\xdf\x8a\xcc\x24\xd0\x5e\xed\x73\xcd\x61\xed\x9a\x77\x33\
+\x6e\x11\x60\x70\xf0\xfd\x74\x5f\x5f\x5f\xfa\xcc\x99\x33\xa6\xc5\
+\xa5\xd0\x8f\x78\x02\x89\xb5\x9e\x63\x21\x44\x18\x78\x13\xd8\x4f\
+\x69\x73\x06\xb4\xf8\xb1\xfa\x1f\xbd\xfa\x2a\x5f\xf2\xd8\x15\x9d\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x08\x19\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\
+\x79\x71\xc9\x65\x3c\x00\x00\x07\xab\x49\x44\x41\x54\x58\xc3\xad\
+\x57\x5b\x50\x93\x67\x1a\xf6\xca\xce\xec\xcc\xf6\x62\x2f\xbc\xd9\
+\xe9\xce\xec\x6e\xbd\xda\xd9\x9b\xb5\xce\xba\x3b\x7b\xb0\xad\xcc\
+\x7a\xb1\xce\xce\x3a\xb3\x76\x54\x70\x75\xdb\xe2\x81\xd6\xb6\x54\
+\x04\xbb\xa5\x20\x6d\xc1\x82\x06\x08\x07\x51\x42\x80\x80\x80\x02\
+\x21\x81\x10\x92\x40\x48\x10\x73\x24\x21\x67\x72\x80\x04\x42\x20\
+\x9c\x09\x47\xb5\x54\x78\xf6\xfb\x7e\x13\x16\x30\x58\x8b\x7d\x67\
+\x9e\xf9\x2f\x92\xfc\xcf\xfb\x3e\xcf\xfb\xbe\xdf\x97\x5d\x00\x76\
+\xfd\x98\x20\xf1\x0b\x82\x14\x02\x03\xc1\x75\x82\x03\xcf\xfd\xfe\
+\x8f\x48\xbc\x9b\x20\xe1\x57\xaf\xef\xb5\x2a\x8c\xd6\x65\xdb\x02\
+\x60\x19\x1e\x5b\x09\x27\xf1\x33\xfa\x19\x81\x22\xfc\xdc\x3e\x76\
+\x48\x7e\x8a\xa0\xb9\xb6\x59\x1c\x32\xcf\xad\x42\x39\xfe\x1d\x44\
+\xf6\x51\xd8\xc7\xe6\xe8\x87\x86\x3d\x7b\xf6\x58\x53\x52\xae\x2c\
+\xca\x3a\x3a\x10\x4e\xe2\xe5\x49\xc3\xc4\x31\x04\xb7\x3e\x49\xf9\
+\x2c\x60\x9b\x5d\x59\x53\x4d\x03\x4d\xb6\x11\x34\xeb\xfb\x20\x31\
+\x79\x60\x19\x9d\xc5\xbb\xef\xbe\x3f\xc5\xab\xbe\x83\xf1\x89\x29\
+\x4c\x4f\xcf\xae\x92\xef\xd7\xbc\x74\x02\x11\x9f\x0f\xbe\x1d\xe3\
+\xb2\x04\x43\x4f\xb4\x33\x40\x8b\x7b\x06\xcd\x3d\x2e\x34\xeb\xec\
+\xa8\x57\xf6\x20\x87\x53\x85\x32\x5e\x35\x43\xbc\xb0\xf4\x90\x81\
+\xc1\x60\x5c\x26\xbf\x4b\x7c\xe1\x04\x48\x1c\x24\x38\x41\xfd\xdd\
+\xea\x73\x27\xf1\xb9\x27\x04\x48\x87\x97\xc1\xd7\xbb\x20\x22\x55\
+\x37\xdc\x37\xa2\xb8\x4e\x88\x2c\x56\x3e\xcc\x56\xdb\x3a\x71\x04\
+\x2c\x16\x6b\x2c\xfc\xce\xe7\x27\x10\x91\x36\x93\x95\x3f\x46\x7d\
+\xa5\xfe\x12\xc4\x6f\xf4\x59\x31\xb6\x02\x7e\xef\x20\x5a\x7b\x9c\
+\xe0\x3f\x30\xa1\x4c\x28\x43\x46\x0e\x1b\xb2\x0e\xf9\x26\xd2\xf9\
+\xc5\x65\xcc\x2d\x2c\x21\x34\xbf\x88\xbd\x7b\xf7\x5a\xc9\x3b\x7e\
+\xba\x6d\x02\x24\x7e\x43\x90\x46\x3d\x35\x13\x69\x75\xb3\x80\xd2\
+\x3f\x0f\xcb\xc4\xe2\x9a\x50\xa1\x5a\xb4\x6c\xf1\x59\xa0\xb6\xa0\
+\xa6\x5d\x8d\x2f\xb2\x73\x71\xb7\x9e\xff\x0c\x31\x25\x9d\x09\xcd\
+\x63\x62\x6a\x06\x83\x43\x81\x27\xe4\xdd\xbc\x2d\xd3\xb0\x3b\x92\
+\x03\x33\x26\xd4\x53\xb5\xd3\xfb\x58\x4f\x88\xc5\x03\x21\x88\x2c\
+\x43\x50\xba\x46\xd0\xed\x09\x42\xe5\x9b\x42\x9b\x73\xfc\xa9\xcf\
+\x5a\x1b\xee\x2a\x74\xc8\xbc\xc9\x45\x09\xa7\x6c\x93\xcf\x9b\x88\
+\x27\xa7\x11\x18\x1d\xc3\x80\x6f\x08\xa2\xd6\xd6\x25\xc2\x51\xdb\
+\x28\x12\x87\xc6\x1f\xaf\x82\x2f\x62\x94\x4d\x89\x24\x90\x22\xea\
+\x52\x2d\x9a\x42\xab\xe8\x18\x79\x04\xa1\xc5\xcf\x10\x53\x74\xf6\
+\x0d\xa3\xd3\xe1\x87\xd4\x3c\x80\x16\xbd\x03\x0d\x5d\x06\x14\xd5\
+\x0a\x90\x91\x95\x0d\x2f\x79\xf1\xc6\xaa\xa9\xd4\xb3\x73\x0b\x4c\
+\xc5\x94\xd8\xdd\xef\x85\xc9\x62\x05\xb7\xbc\x12\xa5\xe5\x95\x4b\
+\x13\xf3\xcb\xab\x23\x0f\x01\x37\xd9\x11\xe6\xd9\x15\x84\x97\x15\
+\x13\x06\xcb\x3c\xd0\x68\xf2\xa3\xdd\xee\x5f\x27\x96\x3b\x86\x20\
+\xb3\x78\xd7\x7d\xe6\x08\xa4\xf8\x3c\x33\x1b\x2a\x8d\x36\xaa\xdc\
+\x53\x33\x21\x8c\x8e\x8d\x33\x15\xd3\x26\xe4\x37\x09\xf1\xc1\xc5\
+\x8f\x51\x73\xaf\x01\xbe\x65\x60\xfc\x11\xa0\x23\x13\x23\xf2\xce\
+\xa1\xbe\x5d\xb9\xb8\x51\x01\x83\x81\x74\x74\x4d\xa7\x1e\x0a\x67\
+\x80\xa9\xb8\xdd\xea\x83\xd8\xe8\x42\x93\xca\xcc\xf8\x7c\xe5\xcb\
+\x2c\x88\xda\x24\x51\x89\xa7\x67\xe7\x18\x1b\x86\x86\x47\x60\x77\
+\x38\x49\x82\x3a\x24\x7c\xf8\x21\xae\xb3\x0b\xe1\x99\x5c\x80\x6f\
+\x09\xd0\x90\xde\xe1\x0f\x2c\x81\xab\x1f\xc4\x7d\xef\x04\xdd\x07\
+\x1d\x61\xeb\xff\x9f\xc0\x1d\xb9\x16\x1d\xf6\x21\x48\xcc\xfd\x4f\
+\x7d\xee\xd4\x22\x9d\x55\x84\xaa\x9a\xba\x4d\x3e\x47\xe4\x8e\xf8\
+\x3c\x3c\x12\x84\xd3\xdd\x0f\xbd\xc1\x88\xc2\xe2\x62\x9c\x7e\x2f\
+\x1e\x3d\x03\x01\xf4\x2f\x02\x83\x84\xbc\xc5\xff\x2d\xee\x3a\x43\
+\x28\x51\x91\xf7\xf6\x05\xf1\x4e\xdc\xbf\x7d\x84\x33\x69\xe3\x20\
+\x18\xf4\x33\xab\xe0\xc9\x54\x68\x35\x38\xd1\xd8\xdd\x0b\x9e\x58\
+\x89\xac\x5c\xf6\x33\x3e\x47\xaa\x9e\x9c\x9e\x65\xe4\xee\xf7\x0e\
+\xa2\xd7\x6c\x41\x43\x03\x1f\x27\x62\xe3\x20\xe9\xd6\xc0\x45\xcf\
+\x01\x52\x90\x24\xb8\x86\xb2\x9e\x00\x6e\xb4\xdb\x50\xd1\x1b\x44\
+\x85\xce\x8b\x4a\x7e\x0b\x6d\xbe\x9b\x5b\x27\xd1\xa0\x99\xf8\x16\
+\x65\x22\x05\xee\x29\xf4\x28\x13\xc8\x90\x78\x35\x0b\x1a\xad\x3e\
+\xaa\xdc\x63\x13\x93\xf0\x0d\x0d\xc3\x66\xef\x83\xb4\x5d\x8e\xc4\
+\x4b\x97\x90\xc3\xca\xc3\xd4\x63\xc0\x4e\x7a\x49\x31\x4e\xfa\x89\
+\x94\x7f\x5b\x3b\x84\x7c\x85\x13\x25\x6a\x1f\x4a\xd5\x03\xe8\xf2\
+\x30\xa3\x28\x22\xf8\xf9\x33\x09\x74\x8f\x2e\xa1\xa8\xbe\x15\xa5\
+\x7c\x09\xb2\x4a\x2a\xf0\xcf\xe3\x71\x51\xe5\xf6\x07\x46\xd1\xe7\
+\xf2\x40\xab\x37\x20\xfd\x6a\x06\x92\xbf\x48\x83\xcd\x37\x02\x27\
+\xa9\xda\x40\x1a\x4c\xe0\x7b\x88\x52\x9d\x1f\x45\xdd\xfd\x0c\x71\
+\x41\x97\x1b\xc5\xdd\x1e\x88\x9c\x41\xfc\xf9\xcd\xb7\x5d\x84\xeb\
+\x6c\xb4\x43\xd0\x28\xf7\x4e\x23\xa7\xfc\x1e\xb2\x4b\xab\xf1\x51\
+\xea\x57\x48\xfe\x6f\xea\xfa\x58\x51\xb9\x47\x82\xe3\xf0\x0c\xf8\
+\x60\x34\x99\x51\xc9\xab\xc2\xfb\x67\xcf\x41\xfe\x40\x03\x3f\xe9\
+\x6e\xb2\x8d\x19\xb9\x6f\x69\x06\x19\xd2\x9b\x2a\x2f\x72\xe5\x0e\
+\xe4\x75\xf6\xa1\xf0\xbe\x1b\x1c\x95\x1b\xf9\x9c\xca\x29\xc2\x53\
+\xb8\xdd\x29\xdc\x2b\x76\x04\x90\x51\xc8\xc5\x95\x6b\x79\x38\x11\
+\x9f\x80\x9b\xb7\x6e\x33\x63\x15\x91\xdb\x6a\x73\x40\x22\x6d\xc7\
+\x85\x84\x0f\x50\x74\xbb\x0c\xf3\x2b\x80\x9f\x34\x58\xf7\x24\x20\
+\x1c\x7c\x84\x4a\xd3\x18\x38\xfa\x61\x86\x9c\x56\xfd\x55\xb3\x1e\
+\xac\x0e\x3b\xb8\x3a\x1f\xd9\x21\x1e\x7a\x2f\xe0\x13\xbc\xba\x5d\
+\x02\x26\xbe\xc1\x83\x94\x6f\xd8\x38\x9f\x9c\x8a\x03\x7f\x3d\x04\
+\x63\xaf\x99\xe9\x6e\x2a\xb7\x46\xd7\x83\xa4\xcb\xc9\x48\xff\x3a\
+\x8b\x8c\xd5\x3c\x53\xb5\x71\xf6\xa9\xdc\x35\xf6\x69\x5c\x97\x59\
+\x19\xd9\xbf\x6e\x21\xa7\xa0\xd4\x82\x74\xbe\x1a\x57\x9b\x34\x60\
+\xc9\xcc\x10\xbb\x82\xf8\xe5\xaf\x5f\xa7\x67\xc0\x3b\xe1\x75\x1f\
+\x35\xcc\x35\xdd\x66\x7c\x94\x96\x85\xb8\x73\x17\xf1\x97\x43\x31\
+\x4c\xd5\x74\x99\xf0\xaa\xaa\x71\xfa\xf4\x19\x68\xcc\x0e\x8c\x92\
+\x2d\x36\x14\x1e\xab\x5a\xc7\x0c\x78\xe6\x71\x70\x0d\x23\x4c\xa3\
+\x65\x8a\x0c\x8c\xec\xb4\xfa\x9c\xb6\x5e\x94\x74\x39\xd0\x66\xf7\
+\xaf\x1e\x3d\x11\x4b\x47\x2e\x6f\xc3\x79\x13\x35\x2c\x5c\x99\x1a\
+\xf1\x97\x3e\xc7\xd1\xd8\x33\xf8\x38\x31\x09\x86\x5e\x13\x1a\x9b\
+\x04\xf8\xdd\x1b\xfb\x51\x4f\xd4\xf1\x90\x99\xee\x9a\x00\xaa\xad\
+\x93\x60\x2b\x5d\x0c\x39\xf5\xbc\xf0\xbe\x67\xbd\xea\xcc\x16\x3d\
+\x4a\x55\x1e\x08\x6d\x01\x94\xd4\xf1\x43\xe1\x65\x53\x40\xf0\xca\
+\xf7\x25\x60\x2b\x6e\x6a\xc7\xa9\x84\x44\xc4\x1c\x39\x8a\xdc\x7c\
+\x36\x5a\x5a\xc5\x38\x14\x13\x83\x2f\x39\x35\xc8\x14\x6a\x98\xe6\
+\xa2\xd5\xd2\x27\xf5\x9a\x7a\x4c\x13\xa1\x49\x64\xb7\x99\x90\xdb\
+\x6e\x46\xb9\xda\x8d\x06\xa5\x76\x39\x2c\x39\x3d\xf9\x4e\x13\xec\
+\xd9\x72\xd4\x47\x0d\x3b\xab\x46\x88\x63\xff\x39\x8f\xdf\xee\xfb\
+\x3d\x1a\xf9\x02\x9c\xbf\x90\x80\x93\xf1\x17\x70\xa3\xad\x07\x19\
+\xc4\x4f\x4a\x14\xe9\x6e\xba\x58\xa8\xef\x2c\xfa\x94\x98\x50\x28\
+\xb7\x40\xe9\x0e\x3c\xf9\x57\xec\x29\x2a\x77\x2d\xc1\x67\x04\xfb\
+\xb6\xb9\xe4\x44\x8d\xbe\xcc\xb2\x5a\xfc\xe3\xe4\x19\x1c\x3c\xf4\
+\x37\xb0\x72\xf3\xb0\xef\xc0\x1f\x50\x20\xd1\x21\x89\x27\x65\x2a\
+\xa6\x4b\x85\x3e\xbf\x21\xd5\x46\xe4\x2e\x90\x5b\x21\xb0\x0c\xae\
+\xe5\xdc\xe2\xd2\x11\x13\x13\xe4\x87\x6f\x3c\xaf\x3c\xe7\x96\x15\
+\x35\x9c\x69\x45\xe5\xf8\xfb\xb1\x58\x1c\x3f\x19\x87\x37\xf6\xef\
+\xc7\x8d\x3a\x11\x92\xab\xa4\x0c\x21\xed\x70\xea\x35\x55\x21\x8b\
+\x34\x5b\xc9\x03\x37\x2a\x34\x6e\xd4\x49\x3a\x17\xc3\x72\x73\x08\
+\x8e\x6d\x95\xfb\x87\x24\xe0\x4a\x65\x73\x70\xe4\xf8\x29\x1c\x3e\
+\x7c\x98\x8c\x63\x2e\x32\x05\x2a\x5c\x22\xd5\xd3\x5d\x7e\x4d\xdc\
+\x0b\x36\xe9\x74\x76\xa7\x1d\x77\x8c\xe4\x88\xb6\xf9\x9e\x84\xb7\
+\x1a\x95\xfb\x22\xbd\x49\xfd\x80\x0b\x6d\xf4\x04\x32\x4a\x78\x4c\
+\x0f\x9c\x4b\x49\xc3\xb5\xa6\x2e\x7c\xc2\x6d\x65\x36\x59\xf1\x83\
+\x01\x5c\x97\x9a\xc1\x51\x7b\x20\xf3\x04\xd7\xce\x25\x26\x05\x36\
+\xc8\xfd\xc7\x9d\xc8\x1d\xd5\x82\xdc\x1a\x01\xce\x5e\x4e\x45\x81\
+\x58\x85\x78\xf6\x5d\x5c\xa9\x55\x90\xaa\xfb\xc0\x96\xdb\x50\xad\
+\x75\xe3\xae\x54\x41\x2f\x10\xca\x0d\x72\xbf\xba\xd3\x6a\xa3\x05\
+\xb7\xa2\x51\xf8\x1d\xaf\x43\x8d\x4f\xb9\x2d\x88\xcb\xe6\xe1\x9a\
+\x48\x8f\xaa\x1e\x2f\x9a\x35\xe6\xc7\x7f\x7a\xf3\x2d\x57\x78\xac\
+\xa8\xdc\xaf\xbd\xac\xdc\xd1\xe2\x08\xdd\x05\x5c\x75\x1f\xde\xcb\
+\xaf\x45\xb9\x76\x00\x32\x67\x60\xf5\xc2\xa7\x97\xa9\xdc\xf7\x08\
+\xd2\xa9\xdc\x3b\xf8\x03\xf3\xc2\xf1\x13\x82\xca\x1c\xee\x9d\x50\
+\x0b\x39\x94\xb8\x0d\xc2\xc8\x16\xa3\x17\x87\xc3\x2f\x22\xf7\x0e\
+\xff\xda\x6d\x8a\xdd\x61\x99\xd5\x1b\xb6\xd8\x6b\xbb\x5e\x32\xbe\
+\x2f\x89\xff\x01\x66\xb9\x5f\xfc\x11\x80\x3d\xcf\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\x07\
+\x04\xca\x57\xa7\
+\x00\x6e\
+\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\x7c\x5a\x07\
+\x00\x63\
+\x00\x6f\x00\x70\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x07\
+\x0a\xc7\x57\x87\
+\x00\x63\
+\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x08\xc8\x58\x67\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x09\
+\x0a\xa8\xba\x47\
+\x00\x70\
+\x00\x61\x00\x73\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x08\
+\x06\xc1\x59\x87\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\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\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x03\x58\
+\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x01\x00\x00\x18\xdd\
+\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc5\
+\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x12\x6c\
+\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x08\x96\
+"
+
+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()
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing.py b/examples/widgets/painting/basicdrawing/basicdrawing.py
new file mode 100755
index 000000000..c2f3e672c
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/basicdrawing.py
@@ -0,0 +1,350 @@
+#!/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 widgets/painting/basicdrawing example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import QPoint, QRect, QSize, Qt, qVersion
+from PySide2.QtGui import (QBrush, QConicalGradient, QLinearGradient, QPainter,
+ QPainterPath, QPalette, QPen, QPixmap, QPolygon, QRadialGradient)
+from PySide2.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout,
+ QLabel, QSpinBox, QWidget)
+
+import basicdrawing_rc
+
+
+class RenderArea(QWidget):
+ points = QPolygon([
+ QPoint(10, 80),
+ QPoint(20, 10),
+ QPoint(80, 30),
+ QPoint(90, 70)
+ ])
+
+ Line, Points, Polyline, Polygon, Rect, RoundedRect, Ellipse, Arc, Chord, \
+ Pie, Path, Text, Pixmap = range(13)
+
+ def __init__(self, parent=None):
+ super(RenderArea, self).__init__(parent)
+
+ self.pen = QPen()
+ self.brush = QBrush()
+ self.pixmap = QPixmap()
+
+ self.shape = RenderArea.Polygon
+ self.antialiased = False
+ self.transformed = False
+ self.pixmap.load(':/images/qt-logo.png')
+
+ self.setBackgroundRole(QPalette.Base)
+ self.setAutoFillBackground(True)
+
+ def minimumSizeHint(self):
+ return QSize(100, 100)
+
+ def sizeHint(self):
+ return QSize(400, 200)
+
+ def setShape(self, shape):
+ self.shape = shape
+ self.update()
+
+ def setPen(self, pen):
+ self.pen = pen
+ self.update()
+
+ def setBrush(self, brush):
+ self.brush = brush
+ self.update()
+
+ def setAntialiased(self, antialiased):
+ self.antialiased = antialiased
+ self.update()
+
+ def setTransformed(self, transformed):
+ self.transformed = transformed
+ self.update()
+
+ def paintEvent(self, event):
+ rect = QRect(10, 20, 80, 60)
+
+ path = QPainterPath()
+ path.moveTo(20, 80)
+ path.lineTo(20, 30)
+ path.cubicTo(80, 0, 50, 50, 80, 80)
+
+ startAngle = 30 * 16
+ arcLength = 120 * 16
+
+ painter = QPainter(self)
+ painter.setPen(self.pen)
+ painter.setBrush(self.brush)
+ if self.antialiased:
+ painter.setRenderHint(QPainter.Antialiasing)
+
+ for x in range(0, self.width(), 100):
+ for y in range(0, self.height(), 100):
+ painter.save()
+ painter.translate(x, y)
+ if self.transformed:
+ painter.translate(50, 50)
+ painter.rotate(60.0)
+ painter.scale(0.6, 0.9)
+ painter.translate(-50, -50)
+
+ if self.shape == RenderArea.Line:
+ painter.drawLine(rect.bottomLeft(), rect.topRight())
+ elif self.shape == RenderArea.Points:
+ painter.drawPoints(RenderArea.points)
+ elif self.shape == RenderArea.Polyline:
+ painter.drawPolyline(RenderArea.points)
+ elif self.shape == RenderArea.Polygon:
+ painter.drawPolygon(RenderArea.points)
+ elif self.shape == RenderArea.Rect:
+ painter.drawRect(rect)
+ elif self.shape == RenderArea.RoundedRect:
+ painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
+ elif self.shape == RenderArea.Ellipse:
+ painter.drawEllipse(rect)
+ elif self.shape == RenderArea.Arc:
+ painter.drawArc(rect, startAngle, arcLength)
+ elif self.shape == RenderArea.Chord:
+ painter.drawChord(rect, startAngle, arcLength)
+ elif self.shape == RenderArea.Pie:
+ painter.drawPie(rect, startAngle, arcLength)
+ elif self.shape == RenderArea.Path:
+ painter.drawPath(path)
+ elif self.shape == RenderArea.Text:
+ painter.drawText(rect, Qt.AlignCenter,
+ "PySide 2\nQt %s" % qVersion())
+ elif self.shape == RenderArea.Pixmap:
+ painter.drawPixmap(10, 10, self.pixmap)
+
+ painter.restore()
+
+ painter.setPen(self.palette().dark().color())
+ painter.setBrush(Qt.NoBrush)
+ painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
+
+
+IdRole = Qt.UserRole
+
+class Window(QWidget):
+ def __init__(self):
+ super(Window, self).__init__()
+
+ self.renderArea = RenderArea()
+
+ self.shapeComboBox = QComboBox()
+ self.shapeComboBox.addItem("Polygon", RenderArea.Polygon)
+ self.shapeComboBox.addItem("Rectangle", RenderArea.Rect)
+ self.shapeComboBox.addItem("Rounded Rectangle", RenderArea.RoundedRect)
+ self.shapeComboBox.addItem("Ellipse", RenderArea.Ellipse)
+ self.shapeComboBox.addItem("Pie", RenderArea.Pie)
+ self.shapeComboBox.addItem("Chord", RenderArea.Chord)
+ self.shapeComboBox.addItem("Path", RenderArea.Path)
+ self.shapeComboBox.addItem("Line", RenderArea.Line)
+ self.shapeComboBox.addItem("Polyline", RenderArea.Polyline)
+ self.shapeComboBox.addItem("Arc", RenderArea.Arc)
+ self.shapeComboBox.addItem("Points", RenderArea.Points)
+ self.shapeComboBox.addItem("Text", RenderArea.Text)
+ self.shapeComboBox.addItem("Pixmap", RenderArea.Pixmap)
+
+ shapeLabel = QLabel("&Shape:")
+ shapeLabel.setBuddy(self.shapeComboBox)
+
+ self.penWidthSpinBox = QSpinBox()
+ self.penWidthSpinBox.setRange(0, 20)
+ self.penWidthSpinBox.setSpecialValueText("0 (cosmetic pen)")
+
+ penWidthLabel = QLabel("Pen &Width:")
+ penWidthLabel.setBuddy(self.penWidthSpinBox)
+
+ self.penStyleComboBox = QComboBox()
+ self.penStyleComboBox.addItem("Solid", Qt.SolidLine)
+ self.penStyleComboBox.addItem("Dash", Qt.DashLine)
+ self.penStyleComboBox.addItem("Dot", Qt.DotLine)
+ self.penStyleComboBox.addItem("Dash Dot", Qt.DashDotLine)
+ self.penStyleComboBox.addItem("Dash Dot Dot", Qt.DashDotDotLine)
+ self.penStyleComboBox.addItem("None", Qt.NoPen)
+
+ penStyleLabel = QLabel("&Pen Style:")
+ penStyleLabel.setBuddy(self.penStyleComboBox)
+
+ self.penCapComboBox = QComboBox()
+ self.penCapComboBox.addItem("Flat", Qt.FlatCap)
+ self.penCapComboBox.addItem("Square", Qt.SquareCap)
+ self.penCapComboBox.addItem("Round", Qt.RoundCap)
+
+ penCapLabel = QLabel("Pen &Cap:")
+ penCapLabel.setBuddy(self.penCapComboBox)
+
+ self.penJoinComboBox = QComboBox()
+ self.penJoinComboBox.addItem("Miter", Qt.MiterJoin)
+ self.penJoinComboBox.addItem("Bevel", Qt.BevelJoin)
+ self.penJoinComboBox.addItem("Round", Qt.RoundJoin)
+
+ penJoinLabel = QLabel("Pen &Join:")
+ penJoinLabel.setBuddy(self.penJoinComboBox)
+
+ self.brushStyleComboBox = QComboBox()
+ self.brushStyleComboBox.addItem("Linear Gradient",
+ Qt.LinearGradientPattern)
+ self.brushStyleComboBox.addItem("Radial Gradient",
+ Qt.RadialGradientPattern)
+ self.brushStyleComboBox.addItem("Conical Gradient",
+ Qt.ConicalGradientPattern)
+ self.brushStyleComboBox.addItem("Texture", Qt.TexturePattern)
+ self.brushStyleComboBox.addItem("Solid", Qt.SolidPattern)
+ self.brushStyleComboBox.addItem("Horizontal", Qt.HorPattern)
+ self.brushStyleComboBox.addItem("Vertical", Qt.VerPattern)
+ self.brushStyleComboBox.addItem("Cross", Qt.CrossPattern)
+ self.brushStyleComboBox.addItem("Backward Diagonal", Qt.BDiagPattern)
+ self.brushStyleComboBox.addItem("Forward Diagonal", Qt.FDiagPattern)
+ self.brushStyleComboBox.addItem("Diagonal Cross", Qt.DiagCrossPattern)
+ self.brushStyleComboBox.addItem("Dense 1", Qt.Dense1Pattern)
+ self.brushStyleComboBox.addItem("Dense 2", Qt.Dense2Pattern)
+ self.brushStyleComboBox.addItem("Dense 3", Qt.Dense3Pattern)
+ self.brushStyleComboBox.addItem("Dense 4", Qt.Dense4Pattern)
+ self.brushStyleComboBox.addItem("Dense 5", Qt.Dense5Pattern)
+ self.brushStyleComboBox.addItem("Dense 6", Qt.Dense6Pattern)
+ self.brushStyleComboBox.addItem("Dense 7", Qt.Dense7Pattern)
+ self.brushStyleComboBox.addItem("None", Qt.NoBrush)
+
+ brushStyleLabel = QLabel("&Brush Style:")
+ brushStyleLabel.setBuddy(self.brushStyleComboBox)
+
+ otherOptionsLabel = QLabel("Other Options:")
+ self.antialiasingCheckBox = QCheckBox("&Antialiasing")
+ self.transformationsCheckBox = QCheckBox("&Transformations")
+
+ self.shapeComboBox.activated.connect(self.shapeChanged)
+ self.penWidthSpinBox.valueChanged.connect(self.penChanged)
+ self.penStyleComboBox.activated.connect(self.penChanged)
+ self.penCapComboBox.activated.connect(self.penChanged)
+ self.penJoinComboBox.activated.connect(self.penChanged)
+ self.brushStyleComboBox.activated.connect(self.brushChanged)
+ self.antialiasingCheckBox.toggled.connect(self.renderArea.setAntialiased)
+ self.transformationsCheckBox.toggled.connect(self.renderArea.setTransformed)
+
+ mainLayout = QGridLayout()
+ mainLayout.setColumnStretch(0, 1)
+ mainLayout.setColumnStretch(3, 1)
+ mainLayout.addWidget(self.renderArea, 0, 0, 1, 4)
+ mainLayout.setRowMinimumHeight(1, 6)
+ mainLayout.addWidget(shapeLabel, 2, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.shapeComboBox, 2, 2)
+ mainLayout.addWidget(penWidthLabel, 3, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.penWidthSpinBox, 3, 2)
+ mainLayout.addWidget(penStyleLabel, 4, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.penStyleComboBox, 4, 2)
+ mainLayout.addWidget(penCapLabel, 5, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.penCapComboBox, 5, 2)
+ mainLayout.addWidget(penJoinLabel, 6, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.penJoinComboBox, 6, 2)
+ mainLayout.addWidget(brushStyleLabel, 7, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.brushStyleComboBox, 7, 2)
+ mainLayout.setRowMinimumHeight(8, 6)
+ mainLayout.addWidget(otherOptionsLabel, 9, 1, Qt.AlignRight)
+ mainLayout.addWidget(self.antialiasingCheckBox, 9, 2)
+ mainLayout.addWidget(self.transformationsCheckBox, 10, 2)
+ self.setLayout(mainLayout)
+
+ self.shapeChanged()
+ self.penChanged()
+ self.brushChanged()
+ self.antialiasingCheckBox.setChecked(True)
+
+ self.setWindowTitle("Basic Drawing")
+
+ def shapeChanged(self):
+ shape = self.shapeComboBox.itemData(self.shapeComboBox.currentIndex(),
+ IdRole)
+ self.renderArea.setShape(shape)
+
+ def penChanged(self):
+ width = self.penWidthSpinBox.value()
+ style = Qt.PenStyle(self.penStyleComboBox.itemData(
+ self.penStyleComboBox.currentIndex(), IdRole))
+ cap = Qt.PenCapStyle(self.penCapComboBox.itemData(
+ self.penCapComboBox.currentIndex(), IdRole))
+ join = Qt.PenJoinStyle(self.penJoinComboBox.itemData(
+ self.penJoinComboBox.currentIndex(), IdRole))
+
+ self.renderArea.setPen(QPen(Qt.blue, width, style, cap, join))
+
+ def brushChanged(self):
+ style = Qt.BrushStyle(self.brushStyleComboBox.itemData(
+ self.brushStyleComboBox.currentIndex(), IdRole))
+
+ if style == Qt.LinearGradientPattern:
+ linearGradient = QLinearGradient(0, 0, 100, 100)
+ linearGradient.setColorAt(0.0, Qt.white)
+ linearGradient.setColorAt(0.2, Qt.green)
+ linearGradient.setColorAt(1.0, Qt.black)
+ self.renderArea.setBrush(QBrush(linearGradient))
+ elif style == Qt.RadialGradientPattern:
+ radialGradient = QRadialGradient(50, 50, 50, 70, 70)
+ radialGradient.setColorAt(0.0, Qt.white)
+ radialGradient.setColorAt(0.2, Qt.green)
+ radialGradient.setColorAt(1.0, Qt.black)
+ self.renderArea.setBrush(QBrush(radialGradient))
+ elif style == Qt.ConicalGradientPattern:
+ conicalGradient = QConicalGradient(50, 50, 150)
+ conicalGradient.setColorAt(0.0, Qt.white)
+ conicalGradient.setColorAt(0.2, Qt.green)
+ conicalGradient.setColorAt(1.0, Qt.black)
+ self.renderArea.setBrush(QBrush(conicalGradient))
+ elif style == Qt.TexturePattern:
+ self.renderArea.setBrush(QBrush(QPixmap(':/images/brick.png')))
+ else:
+ self.renderArea.setBrush(QBrush(Qt.green, style))
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing.qrc b/examples/widgets/painting/basicdrawing/basicdrawing.qrc
new file mode 100644
index 000000000..9d8a23a1c
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/basicdrawing.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>images/brick.png</file>
+ <file>images/qt-logo.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing_rc.py b/examples/widgets/painting/basicdrawing/basicdrawing_rc.py
new file mode 100644
index 000000000..b9de90387
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/basicdrawing_rc.py
@@ -0,0 +1,174 @@
+#############################################################################
+##
+## 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:54:31 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\x03\x58\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x10\x08\x02\x00\x00\x00\xf8\x62\xea\x0e\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8e\x7c\xfb\x51\x93\
+\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\
+\x00\x00\xf9\xff\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\
+\x00\x00\x3a\x97\x00\x00\x17\x6f\x97\xa9\x99\xd4\x00\x00\x02\xe3\
+\x49\x44\x41\x54\x38\xcb\x45\x94\xcb\x8d\x1e\x45\x10\xc7\x7f\x55\
+\xd5\x33\xb3\xf6\x6a\x9d\x09\x49\x90\x04\x0e\x05\x09\x99\x78\xe0\
+\xc4\xc1\x12\x07\x42\x20\x04\x08\xc1\x96\xd7\xcb\xb7\xf3\xcd\xf4\
+\xa3\xaa\x38\x4c\x5b\xee\x73\xbd\xfa\xff\x92\xcf\xff\xfc\xa6\x86\
+\x1a\x28\x2a\x20\x64\x42\x92\x41\x04\x38\x1e\xa4\x93\x41\x38\x39\
+\x40\x11\x41\x94\x8c\x59\x93\x57\x41\x42\x62\x2b\x65\xc3\x16\xac\
+\x20\x85\xf7\x3f\xbd\x2f\x08\xf5\xf6\x6f\xd9\x50\x25\x0c\x35\xc4\
+\x48\xc7\x3b\x31\x18\x8d\x18\xa4\x13\x4e\x74\x7c\x20\x82\x16\x80\
+\x74\xdc\xf1\x46\x0c\xc2\x11\x00\xa4\xb0\xbc\xe1\xe1\x09\xdb\xf8\
+\xf5\xc3\x87\x0c\x8a\x1a\xaa\xd4\x97\xbf\xcb\x82\x2e\xf3\x04\x9c\
+\xa8\xd4\x9d\x7e\xa7\x9f\xf3\xd8\xd1\xf0\x93\x70\xb4\x20\x82\x77\
+\xfa\xc1\x68\x10\x44\x02\xa8\x62\x0b\xeb\x23\xfd\x1d\x7f\xfe\xf5\
+\x31\x02\x51\x8a\x16\xd4\x10\xa5\xdd\x3e\x6a\x61\x7b\x22\x20\x06\
+\x7d\xe7\xfc\xc2\xf9\x1f\xc7\x33\xf5\x75\x82\xd0\x76\x46\x45\x94\
+\x18\x78\xa7\xef\x8c\x8e\x2a\xde\xc9\xc4\x0a\xdb\x3b\x1e\x9e\x58\
+\x1e\xf1\x0e\x01\x50\x44\x10\xc3\x0a\x61\x94\x07\xca\x86\x2e\x84\
+\x93\x01\x4c\x32\xc6\x81\x0f\xd2\x69\x07\x5e\x01\xc4\x88\x81\x18\
+\x0c\xbc\x33\x1a\xd1\xf1\x42\xd9\x68\x85\x4c\x62\x90\x49\x06\xe5\
+\xc2\x54\x0c\x51\x6c\x45\x0b\x19\x64\xe2\x83\x76\xe7\xf8\x4a\xdb\
+\x49\x68\x77\xc6\x9d\xd1\x89\x41\x06\xb6\x20\x4a\x3f\x21\x18\x8d\
+\xbe\x93\x49\x11\xbc\x61\x1b\xfd\xa0\xef\x8c\x13\xef\x17\x07\x05\
+\x51\x44\x11\x21\x9c\x51\xa9\x37\xce\x17\x8e\xaf\xd4\xdb\xe4\x60\
+\x9c\xdc\xbf\x90\x17\xb7\x83\xf5\x11\x51\xfa\x7d\x76\x89\x92\x8e\
+\x08\x11\x78\x87\xa4\x9f\xf4\x93\x51\x2f\x88\x14\xb9\x78\x1b\x8c\
+\xca\xf9\xc2\xf1\xc2\xf1\x3c\xfb\xc9\x89\xd5\x68\x78\xbb\xb4\x42\
+\x0c\x80\x51\x51\xa3\x6c\x2c\x6f\x21\x27\x6e\x5e\x51\x9d\xda\x8d\
+\xa0\x44\x00\x98\x12\x2b\x80\x57\xfa\x49\xbb\x51\x6f\xb4\x57\x32\
+\x09\x67\x1c\x64\xa0\x85\x7e\xc7\x3b\x5a\xe8\x8a\x15\xc8\x39\xb7\
+\xac\x08\x88\x52\x1e\xa6\x82\x33\x41\x20\x29\x17\x99\x62\xa8\x11\
+\x8e\x77\xbc\x11\x41\x38\x75\xa7\x1f\x53\x91\xa3\x7e\xf7\x97\x77\
+\x32\x88\x95\x70\x60\xee\x36\xc3\x16\x96\x47\x32\xbe\x41\xa7\x20\
+\x14\x51\x08\x62\xd0\x0e\x54\x19\x95\xe8\x4c\x62\x8c\x4c\x46\x65\
+\x1c\xd4\x1d\x3f\x49\x07\x21\x83\x14\xa2\x91\x49\xef\xa0\xac\x6f\
+\x91\x85\x64\xb2\x7d\xad\xbc\x0e\x2a\x99\x78\xa7\xed\xec\x9f\xb0\
+\x85\x18\x93\x0f\x35\xca\x4a\x37\x86\x53\x5f\x69\xfb\x34\xd4\x25\
+\x41\x35\x10\x46\x23\x1d\x35\xfa\x1d\x35\xb2\x93\x81\x28\x6a\x13\
+\x15\x5b\x28\x31\xe8\x07\xf7\x67\xf6\x4f\xac\x4f\xa8\xe1\x8d\x51\
+\x21\xb0\x82\x95\xef\x6e\xb8\xac\x24\x42\x0f\x60\xc6\x43\x79\x83\
+\x6d\x84\xd3\x4f\x00\xdb\xe6\xee\xeb\x44\x2b\x94\x70\x7c\xf0\xc7\
+\xef\x1f\x23\xd8\x9e\xa6\x4b\x11\xa2\xd1\x76\xda\x9d\xfa\x4a\xbb\
+\x31\x2a\x97\xf5\x2f\x45\x66\x80\x20\x8a\x1e\x58\xc5\xf6\xc9\xa2\
+\x1a\xba\x00\x94\x6f\x9b\x4a\x38\xbf\xfc\xfc\xe1\x32\x9e\xad\x88\
+\xcc\x54\xf1\x41\xdd\x89\x2b\xf2\xea\x4c\xba\xab\x87\x2b\x68\xa1\
+\xac\xe8\x82\x74\x54\x41\xd0\x05\x55\x00\x51\x74\x41\x8d\x4c\xe4\
+\xc7\x1f\x40\x67\x16\x5e\xc0\x5d\xef\x92\x53\xe6\x84\x3e\x06\x04\
+\x57\x5d\x06\xe4\xfc\x41\x59\xbf\xb5\x08\x57\x6e\x8a\xce\x39\x97\
+\xe4\xfe\x07\xb6\x84\x15\x24\x5c\xbc\x4f\xce\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\x15\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x50\x00\x00\x00\x50\x04\x03\x00\x00\x00\x7c\x3f\xef\x9e\
+\x00\x00\x00\x15\x50\x4c\x54\x45\xa3\xc2\x00\xf4\xf8\xe1\x8a\xa1\
+\x09\x14\x14\x18\x3f\x47\x16\xd3\xe2\x86\x70\x82\x0e\xfd\x17\x22\
+\x39\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\x00\
+\x48\x00\x46\xc9\x6b\x3e\x00\x00\x01\xa6\x49\x44\x41\x54\x48\xc7\
+\xed\x56\x4b\x6e\x84\x30\x0c\x45\x66\xc4\x39\xa2\x49\xd5\x35\x22\
+\x11\x6b\xd4\x48\x73\x0e\x54\x10\xf7\x3f\x42\x0b\xc4\x4c\xfc\x83\
+\xd9\x75\xd1\xf1\x0a\xa2\x97\x17\xdb\xb1\x9f\x53\x55\x6f\xfb\x6b\
+\xbb\x2f\xcb\xfd\x1a\x05\x73\x0a\xbf\x16\x1f\xee\x1c\xd7\x6c\xb0\
+\x0d\x3a\x9e\xe2\x42\x61\xe3\x8b\xb8\x13\x24\x24\x0a\x8c\x96\x9f\
+\x53\x60\xd6\xeb\xb8\x5b\x10\x36\xa8\xc0\x24\x81\xf1\x45\x42\x9d\
+\x12\x09\xe3\x63\x59\xe6\x64\x53\x62\x6a\xf6\x2b\x81\xd9\xa4\xf4\
+\x19\x87\xff\x1f\x56\xe0\x89\xaf\xe7\x64\x39\x3d\x14\x27\xd2\x3f\
+\xa8\x27\x7f\xc9\xbd\x9d\x7a\xf2\x93\x6e\xc4\x35\x16\x37\xb0\xdd\
+\x7e\x75\xb6\x56\x4a\xe3\x46\xd7\x60\xfb\x06\xc5\xc9\x9a\x9e\xe2\
+\xf7\xf8\x93\x74\x72\x22\x4b\x90\xe9\x6b\x99\xc9\x44\x0e\xf1\x19\
+\xd0\xc8\x68\x52\x99\x44\xc0\x02\x07\x91\x72\x20\x5b\xf3\x6d\xb6\
+\x6c\xff\x51\x11\x3d\x25\x5c\x9d\x9c\x78\x7e\x08\x30\x13\x76\xf8\
+\x39\xf0\x34\x76\x94\xd0\x61\xd6\x04\xb0\x15\x84\xfb\xba\x01\x84\
+\xb2\xa9\x75\xe0\x50\x12\xf6\xd5\x05\x23\x84\x6b\xc6\xb6\x20\xcc\
+\x94\x37\x33\x6a\xa0\xca\x23\xa2\x3e\xf2\xe8\xa9\x9e\x78\x15\x18\
+\x09\xa1\x7e\x33\x78\xd7\x35\x93\x28\x71\xd7\xb8\x02\x54\x1f\x81\
+\x36\x52\x59\x8f\x9b\x53\x1d\xe6\x52\xa9\x47\xac\x70\x28\x98\x42\
+\x98\x64\x85\x1f\x3d\xb3\x77\x4b\x11\x3c\xeb\x99\xa3\x0b\x61\x73\
+\x1e\x4c\xe5\x7b\xf6\xb5\xef\x2a\x9a\x4f\xa7\x29\x85\xcb\x1a\x51\
+\x50\x46\x55\x7b\x3a\xae\x82\x52\x7b\x1a\x76\x0e\x98\xe2\xcc\xf5\
+\x11\x29\x2d\xc5\x3d\x90\xb3\x35\xbe\x50\xc3\x7b\xaa\xe1\xa6\x36\
+\xb3\xa9\xa0\x51\xaa\x73\xe6\x94\x92\xdb\x78\x31\x84\x4f\xa6\xd7\
+\xa4\xe2\xe2\x0b\xf3\x7a\xb2\xc6\x61\x93\x64\x85\xc7\x8b\xb7\xc7\
+\x1e\x84\xb7\x46\x36\x7f\xa5\x80\x41\xb8\xda\x92\xdf\x3d\xf9\x62\
+\x87\xb3\x97\xd4\xe7\xf7\xf1\x92\x02\xf7\x7e\x59\xfe\x3f\xfb\x01\
+\xbd\xf6\xdd\x91\xa2\xf3\xda\xd4\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\
+\x0f\x9e\x84\x47\
+\x00\x62\
+\x00\x72\x00\x69\x00\x63\x00\x6b\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x0b\
+\x05\x52\xbf\x27\
+\x00\x71\
+\x00\x74\x00\x2d\x00\x6c\x00\x6f\x00\x67\x00\x6f\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\x02\x00\x00\x00\x02\
+\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x03\x5c\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/painting/basicdrawing/images/brick.png b/examples/widgets/painting/basicdrawing/images/brick.png
new file mode 100644
index 000000000..ab5e383dc
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/images/brick.png
Binary files differ
diff --git a/examples/widgets/painting/basicdrawing/images/qt-logo.png b/examples/widgets/painting/basicdrawing/images/qt-logo.png
new file mode 100644
index 000000000..9c27cf63a
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/images/qt-logo.png
Binary files differ
diff --git a/examples/widgets/painting/concentriccircles.py b/examples/widgets/painting/concentriccircles.py
new file mode 100755
index 000000000..5fecfc0b5
--- /dev/null
+++ b/examples/widgets/painting/concentriccircles.py
@@ -0,0 +1,147 @@
+#!/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 widgets/painting/concentriccircles example from Qt v5.x, originating from PyQt"""
+
+from PySide2.QtCore import QRect, QRectF, QSize, Qt, QTimer
+from PySide2.QtGui import QColor, QPainter, QPalette, QPen
+from PySide2.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel,
+ QSizePolicy, QWidget)
+
+
+class CircleWidget(QWidget):
+ def __init__(self, parent=None):
+ super(CircleWidget, self).__init__(parent)
+
+ self.floatBased = False
+ self.antialiased = False
+ self.frameNo = 0
+
+ self.setBackgroundRole(QPalette.Base)
+ self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+
+ def setFloatBased(self, floatBased):
+ self.floatBased = floatBased
+ self.update()
+
+ def setAntialiased(self, antialiased):
+ self.antialiased = antialiased
+ self.update()
+
+ def minimumSizeHint(self):
+ return QSize(50, 50)
+
+ def sizeHint(self):
+ return QSize(180, 180)
+
+ def nextAnimationFrame(self):
+ self.frameNo += 1
+ self.update()
+
+ def paintEvent(self, event):
+ painter = QPainter(self)
+ painter.setRenderHint(QPainter.Antialiasing, self.antialiased)
+ painter.translate(self.width() / 2, self.height() / 2)
+
+ for diameter in range(0, 256, 9):
+ delta = abs((self.frameNo % 128) - diameter / 2)
+ alpha = 255 - (delta * delta) / 4 - diameter
+ if alpha > 0:
+ painter.setPen(QPen(QColor(0, diameter / 2, 127, alpha), 3))
+
+ if self.floatBased:
+ painter.drawEllipse(QRectF(-diameter / 2.0,
+ -diameter / 2.0, diameter, diameter))
+ else:
+ painter.drawEllipse(QRect(-diameter / 2,
+ -diameter / 2, diameter, diameter))
+
+
+class Window(QWidget):
+ def __init__(self):
+ super(Window, self).__init__()
+
+ aliasedLabel = self.createLabel("Aliased")
+ antialiasedLabel = self.createLabel("Antialiased")
+ intLabel = self.createLabel("Int")
+ floatLabel = self.createLabel("Float")
+
+ layout = QGridLayout()
+ layout.addWidget(aliasedLabel, 0, 1)
+ layout.addWidget(antialiasedLabel, 0, 2)
+ layout.addWidget(intLabel, 1, 0)
+ layout.addWidget(floatLabel, 2, 0)
+
+ timer = QTimer(self)
+
+ for i in range(2):
+ for j in range(2):
+ w = CircleWidget()
+ w.setAntialiased(j != 0)
+ w.setFloatBased(i != 0)
+
+ timer.timeout.connect(w.nextAnimationFrame)
+
+ layout.addWidget(w, i + 1, j + 1)
+
+ timer.start(100)
+ self.setLayout(layout)
+
+ self.setWindowTitle("Concentric Circles")
+
+ def createLabel(self, text):
+ label = QLabel(text)
+ label.setAlignment(Qt.AlignCenter)
+ label.setMargin(2)
+ label.setFrameStyle(QFrame.Box | QFrame.Sunken)
+ return label
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/richtext/orderform.py b/examples/widgets/richtext/orderform.py
new file mode 100755
index 000000000..e068db2b2
--- /dev/null
+++ b/examples/widgets/richtext/orderform.py
@@ -0,0 +1,297 @@
+#!/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 widgets/richtext/orderform example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtPrintSupport
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+
+ fileMenu = QtWidgets.QMenu("&File", self)
+ newAction = fileMenu.addAction("&New...")
+ newAction.setShortcut("Ctrl+N")
+ self.printAction = fileMenu.addAction("&Print...", self.printFile)
+ self.printAction.setShortcut("Ctrl+P")
+ self.printAction.setEnabled(False)
+ quitAction = fileMenu.addAction("E&xit")
+ quitAction.setShortcut("Ctrl+Q")
+ self.menuBar().addMenu(fileMenu)
+
+ self.letters = QtWidgets.QTabWidget()
+
+ newAction.triggered.connect(self.openDialog)
+ quitAction.triggered.connect(self.close)
+
+ self.setCentralWidget(self.letters)
+ self.setWindowTitle("Order Form")
+
+ def createLetter(self, name, address, orderItems, sendOffers):
+ editor = QtWidgets.QTextEdit()
+ tabIndex = self.letters.addTab(editor, name)
+ self.letters.setCurrentIndex(tabIndex)
+
+ cursor = editor.textCursor()
+ cursor.movePosition(QtGui.QTextCursor.Start)
+ topFrame = cursor.currentFrame()
+ topFrameFormat = topFrame.frameFormat()
+ topFrameFormat.setPadding(16)
+ topFrame.setFrameFormat(topFrameFormat)
+
+ textFormat = QtGui.QTextCharFormat()
+ boldFormat = QtGui.QTextCharFormat()
+ boldFormat.setFontWeight(QtGui.QFont.Bold)
+
+ referenceFrameFormat = QtGui.QTextFrameFormat()
+ referenceFrameFormat.setBorder(1)
+ referenceFrameFormat.setPadding(8)
+ referenceFrameFormat.setPosition(QtGui.QTextFrameFormat.FloatRight)
+ referenceFrameFormat.setWidth(QtGui.QTextLength(QtGui.QTextLength.PercentageLength, 40))
+ cursor.insertFrame(referenceFrameFormat)
+
+ cursor.insertText("A company", boldFormat)
+ cursor.insertBlock()
+ cursor.insertText("321 City Street")
+ cursor.insertBlock()
+ cursor.insertText("Industry Park")
+ cursor.insertBlock()
+ cursor.insertText("Another country")
+
+ cursor.setPosition(topFrame.lastPosition())
+
+ cursor.insertText(name, textFormat)
+ for line in address.split("\n"):
+ cursor.insertBlock()
+ cursor.insertText(line)
+
+ cursor.insertBlock()
+ cursor.insertBlock()
+
+ date = QtCore.QDate.currentDate()
+ cursor.insertText("Date: %s" % date.toString('d MMMM yyyy'),
+ textFormat)
+ cursor.insertBlock()
+
+ bodyFrameFormat = QtGui.QTextFrameFormat()
+ bodyFrameFormat.setWidth(QtGui.QTextLength(QtGui.QTextLength.PercentageLength, 100))
+ cursor.insertFrame(bodyFrameFormat)
+
+ cursor.insertText("I would like to place an order for the following "
+ "items:", textFormat)
+ cursor.insertBlock()
+ cursor.insertBlock()
+
+ orderTableFormat = QtGui.QTextTableFormat()
+ orderTableFormat.setAlignment(QtCore.Qt.AlignHCenter)
+ orderTable = cursor.insertTable(1, 2, orderTableFormat)
+
+ orderFrameFormat = cursor.currentFrame().frameFormat()
+ orderFrameFormat.setBorder(1)
+ cursor.currentFrame().setFrameFormat(orderFrameFormat)
+
+ cursor = orderTable.cellAt(0, 0).firstCursorPosition()
+ cursor.insertText("Product", boldFormat)
+ cursor = orderTable.cellAt(0, 1).firstCursorPosition()
+ cursor.insertText("Quantity", boldFormat)
+
+ for text, quantity in orderItems:
+ row = orderTable.rows()
+
+ orderTable.insertRows(row, 1)
+ cursor = orderTable.cellAt(row, 0).firstCursorPosition()
+ cursor.insertText(text, textFormat)
+ cursor = orderTable.cellAt(row, 1).firstCursorPosition()
+ cursor.insertText(str(quantity), textFormat)
+
+ cursor.setPosition(topFrame.lastPosition())
+
+ cursor.insertBlock()
+
+ cursor.insertText("Please update my records to take account of the "
+ "following privacy information:")
+ cursor.insertBlock()
+
+ offersTable = cursor.insertTable(2, 2)
+
+ cursor = offersTable.cellAt(0, 1).firstCursorPosition()
+ cursor.insertText("I want to receive more information about your "
+ "company's products and special offers.", textFormat)
+ cursor = offersTable.cellAt(1, 1).firstCursorPosition()
+ cursor.insertText("I do not want to receive any promotional "
+ "information from your company.", textFormat)
+
+ if sendOffers:
+ cursor = offersTable.cellAt(0, 0).firstCursorPosition()
+ else:
+ cursor = offersTable.cellAt(1, 0).firstCursorPosition()
+
+ cursor.insertText('X', boldFormat)
+
+ cursor.setPosition(topFrame.lastPosition())
+ cursor.insertBlock()
+ cursor.insertText("Sincerely,", textFormat)
+ cursor.insertBlock()
+ cursor.insertBlock()
+ cursor.insertBlock()
+ cursor.insertText(name)
+
+ self.printAction.setEnabled(True)
+
+ def createSample(self):
+ dialog = DetailsDialog('Dialog with default values', self)
+ self.createLetter('Mr Smith',
+ '12 High Street\nSmall Town\nThis country',
+ dialog.orderItems(), True)
+
+ def openDialog(self):
+ dialog = DetailsDialog("Enter Customer Details", self)
+
+ if dialog.exec_() == QtWidgets.QDialog.Accepted:
+ self.createLetter(dialog.senderName(), dialog.senderAddress(),
+ dialog.orderItems(), dialog.sendOffers())
+
+ def printFile(self):
+ editor = self.letters.currentWidget()
+ printer = QtPrintSupport.QPrinter()
+
+ dialog = QtPrintSupport.QPrintDialog(printer, self)
+ dialog.setWindowTitle("Print Document")
+
+ if editor.textCursor().hasSelection():
+ dialog.addEnabledOption(QtPrintSupport.QAbstractPrintDialog.PrintSelection)
+
+ if dialog.exec_() != QtWidgets.QDialog.Accepted:
+ return
+
+ editor.print_(printer)
+
+
+class DetailsDialog(QtWidgets.QDialog):
+ def __init__(self, title, parent):
+ super(DetailsDialog, self).__init__(parent)
+
+ self.items = ("T-shirt", "Badge", "Reference book", "Coffee cup")
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ addressLabel = QtWidgets.QLabel("Address:")
+ addressLabel.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
+
+ self.nameEdit = QtWidgets.QLineEdit()
+ self.addressEdit = QtWidgets.QTextEdit()
+ self.offersCheckBox = QtWidgets.QCheckBox("Send information about "
+ "products and special offers:")
+
+ self.setupItemsTable()
+
+ buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
+
+ buttonBox.accepted.connect(self.verify)
+ buttonBox.rejected.connect(self.reject)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameEdit, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0)
+ mainLayout.addWidget(self.addressEdit, 1, 1)
+ mainLayout.addWidget(self.itemsTable, 0, 2, 2, 1)
+ mainLayout.addWidget(self.offersCheckBox, 2, 1, 1, 2)
+ mainLayout.addWidget(buttonBox, 3, 0, 1, 3)
+ self.setLayout(mainLayout)
+
+ self.setWindowTitle(title)
+
+ def setupItemsTable(self):
+ self.itemsTable = QtWidgets.QTableWidget(len(self.items), 2)
+
+ for row, item in enumerate(self.items):
+ name = QtWidgets.QTableWidgetItem(item)
+ name.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable)
+ self.itemsTable.setItem(row, 0, name)
+ quantity = QtWidgets.QTableWidgetItem('1')
+ self.itemsTable.setItem(row, 1, quantity)
+
+ def orderItems(self):
+ orderList = []
+
+ for row in range(len(self.items)):
+ text = self.itemsTable.item(row, 0).text()
+ quantity = int(self.itemsTable.item(row, 1).data(QtCore.Qt.DisplayRole))
+ orderList.append((text, max(0, quantity)))
+
+ return orderList
+
+ def senderName(self):
+ return self.nameEdit.text()
+
+ def senderAddress(self):
+ return self.addressEdit.toPlainText()
+
+ def sendOffers(self):
+ return self.offersCheckBox.isChecked()
+
+ def verify(self):
+ if self.nameEdit.text() and self.addressEdit.toPlainText():
+ self.accept()
+ return
+
+ answer = QtWidgets.QMessageBox.warning(self, "Incomplete Form",
+ "The form does not contain all the necessary information.\n"
+ "Do you want to discard it?",
+ QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
+
+ if answer == QtWidgets.QMessageBox.Yes:
+ self.reject()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = MainWindow()
+ window.resize(640, 480)
+ window.show()
+ window.createSample()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/richtext/syntaxhighlighter.py b/examples/widgets/richtext/syntaxhighlighter.py
new file mode 100755
index 000000000..8a14632fe
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter.py
@@ -0,0 +1,203 @@
+#!/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 widgets/richtext/syntaxhighlighter example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self, parent=None):
+ super(MainWindow, self).__init__(parent)
+
+ self.setupFileMenu()
+ self.setupHelpMenu()
+ self.setupEditor()
+
+ self.setCentralWidget(self.editor)
+ self.setWindowTitle("Syntax Highlighter")
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About Syntax Highlighter",
+ "<p>The <b>Syntax Highlighter</b> example shows how to " \
+ "perform simple syntax highlighting by subclassing the " \
+ "QSyntaxHighlighter class and describing highlighting " \
+ "rules using regular expressions.</p>")
+
+ def newFile(self):
+ self.editor.clear()
+
+ def openFile(self, path=None):
+ if not path:
+ path = QtWidgets.QFileDialog.getOpenFileName(self, "Open File",
+ '', "C++ Files (*.cpp *.h)")
+
+ if path:
+ inFile = QtCore.QFile(path[0])
+ if inFile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
+ text = inFile.readAll()
+
+ try:
+ # Python v3.
+ text = str(text, encoding='ascii')
+ except TypeError:
+ # Python v2.
+ text = str(text)
+
+ self.editor.setPlainText(text)
+
+ def setupEditor(self):
+ font = QtGui.QFont()
+ font.setFamily('Courier')
+ font.setFixedPitch(True)
+ font.setPointSize(10)
+
+ self.editor = QtWidgets.QTextEdit()
+ self.editor.setFont(font)
+
+ self.highlighter = Highlighter(self.editor.document())
+
+ def setupFileMenu(self):
+ fileMenu = QtWidgets.QMenu("&File", self)
+ self.menuBar().addMenu(fileMenu)
+
+ fileMenu.addAction("&New...", self.newFile, "Ctrl+N")
+ fileMenu.addAction("&Open...", self.openFile, "Ctrl+O")
+ fileMenu.addAction("E&xit", QtWidgets.qApp.quit, "Ctrl+Q")
+
+ def setupHelpMenu(self):
+ helpMenu = QtWidgets.QMenu("&Help", self)
+ self.menuBar().addMenu(helpMenu)
+
+ helpMenu.addAction("&About", self.about)
+ helpMenu.addAction("About &Qt", QtWidgets.qApp.aboutQt)
+
+
+class Highlighter(QtGui.QSyntaxHighlighter):
+ def __init__(self, parent=None):
+ super(Highlighter, self).__init__(parent)
+
+ keywordFormat = QtGui.QTextCharFormat()
+ keywordFormat.setForeground(QtCore.Qt.darkBlue)
+ keywordFormat.setFontWeight(QtGui.QFont.Bold)
+
+ keywordPatterns = ["\\bchar\\b", "\\bclass\\b", "\\bconst\\b",
+ "\\bdouble\\b", "\\benum\\b", "\\bexplicit\\b", "\\bfriend\\b",
+ "\\binline\\b", "\\bint\\b", "\\blong\\b", "\\bnamespace\\b",
+ "\\boperator\\b", "\\bprivate\\b", "\\bprotected\\b",
+ "\\bpublic\\b", "\\bshort\\b", "\\bsignals\\b", "\\bsigned\\b",
+ "\\bslots\\b", "\\bstatic\\b", "\\bstruct\\b",
+ "\\btemplate\\b", "\\btypedef\\b", "\\btypename\\b",
+ "\\bunion\\b", "\\bunsigned\\b", "\\bvirtual\\b", "\\bvoid\\b",
+ "\\bvolatile\\b"]
+
+ self.highlightingRules = [(QtCore.QRegExp(pattern), keywordFormat)
+ for pattern in keywordPatterns]
+
+ classFormat = QtGui.QTextCharFormat()
+ classFormat.setFontWeight(QtGui.QFont.Bold)
+ classFormat.setForeground(QtCore.Qt.darkMagenta)
+ self.highlightingRules.append((QtCore.QRegExp("\\bQ[A-Za-z]+\\b"),
+ classFormat))
+
+ singleLineCommentFormat = QtGui.QTextCharFormat()
+ singleLineCommentFormat.setForeground(QtCore.Qt.red)
+ self.highlightingRules.append((QtCore.QRegExp("//[^\n]*"),
+ singleLineCommentFormat))
+
+ self.multiLineCommentFormat = QtGui.QTextCharFormat()
+ self.multiLineCommentFormat.setForeground(QtCore.Qt.red)
+
+ quotationFormat = QtGui.QTextCharFormat()
+ quotationFormat.setForeground(QtCore.Qt.darkGreen)
+ self.highlightingRules.append((QtCore.QRegExp("\".*\""),
+ quotationFormat))
+
+ functionFormat = QtGui.QTextCharFormat()
+ functionFormat.setFontItalic(True)
+ functionFormat.setForeground(QtCore.Qt.blue)
+ self.highlightingRules.append((QtCore.QRegExp("\\b[A-Za-z0-9_]+(?=\\()"),
+ functionFormat))
+
+ self.commentStartExpression = QtCore.QRegExp("/\\*")
+ self.commentEndExpression = QtCore.QRegExp("\\*/")
+
+ def highlightBlock(self, text):
+ for pattern, format in self.highlightingRules:
+ expression = QtCore.QRegExp(pattern)
+ index = expression.indexIn(text)
+ while index >= 0:
+ length = expression.matchedLength()
+ self.setFormat(index, length, format)
+ index = expression.indexIn(text, index + length)
+
+ self.setCurrentBlockState(0)
+
+ startIndex = 0
+ if self.previousBlockState() != 1:
+ startIndex = self.commentStartExpression.indexIn(text)
+
+ while startIndex >= 0:
+ endIndex = self.commentEndExpression.indexIn(text, startIndex)
+
+ if endIndex == -1:
+ self.setCurrentBlockState(1)
+ commentLength = len(text) - startIndex
+ else:
+ commentLength = endIndex - startIndex + self.commentEndExpression.matchedLength()
+
+ self.setFormat(startIndex, commentLength,
+ self.multiLineCommentFormat)
+ startIndex = self.commentStartExpression.indexIn(text,
+ startIndex + commentLength);
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = MainWindow()
+ window.resize(640, 512)
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/richtext/syntaxhighlighter/examples/example b/examples/widgets/richtext/syntaxhighlighter/examples/example
new file mode 100644
index 000000000..db8e7b189
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter/examples/example
@@ -0,0 +1,79 @@
+TEMPLATE = app
+LANGUAGE = C++
+TARGET = assistant
+
+CONFIG += qt warn_on
+QT += xml network
+
+PROJECTNAME = Assistant
+DESTDIR = ../../bin
+
+FORMS += finddialog.ui \
+ helpdialog.ui \
+ mainwindow.ui \
+ settingsdialog.ui \
+ tabbedbrowser.ui \
+ topicchooser.ui
+
+SOURCES += main.cpp \
+ helpwindow.cpp \
+ topicchooser.cpp \
+ docuparser.cpp \
+ settingsdialog.cpp \
+ index.cpp \
+ profile.cpp \
+ config.cpp \
+ finddialog.cpp \
+ helpdialog.cpp \
+ mainwindow.cpp \
+ tabbedbrowser.cpp
+
+HEADERS += helpwindow.h \
+ topicchooser.h \
+ docuparser.h \
+ settingsdialog.h \
+ index.h \
+ profile.h \
+ finddialog.h \
+ helpdialog.h \
+ mainwindow.h \
+ tabbedbrowser.h \
+ config.h
+
+RESOURCES += assistant.qrc
+
+DEFINES += QT_KEYWORDS
+#DEFINES += QT_PALMTOPCENTER_DOCS
+!network:DEFINES += QT_INTERNAL_NETWORK
+else:QT += network
+!xml: DEFINES += QT_INTERNAL_XML
+else:QT += xml
+include( ../../src/qt_professional.pri )
+
+win32 {
+ LIBS += -lshell32
+ RC_FILE = assistant.rc
+}
+
+macos {
+ ICON = assistant.icns
+ TARGET = assistant
+# QMAKE_INFO_PLIST = Info_mac.plist
+}
+
+#target.path = $$[QT_INSTALL_BINS]
+#INSTALLS += target
+
+#assistanttranslations.files = *.qm
+#assistanttranslations.path = $$[QT_INSTALL_TRANSLATIONS]
+#INSTALLS += assistanttranslations
+
+TRANSLATIONS = assistant_de.ts \
+ assistant_fr.ts
+
+
+unix:!contains(QT_CONFIG, zlib):LIBS += -lz
+
+
+target.path=$$[QT_INSTALL_BINS]
+INSTALLS += target
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py
new file mode 100644
index 000000000..6b913f177
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py
@@ -0,0 +1,180 @@
+#!/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 widgets/richtext/syntaxhighlighter example from Qt v5.x"""
+
+import sys
+import re
+from PySide2 import QtCore, QtGui, QtWidgets
+
+import syntaxhighlighter_rc
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self, parent=None):
+ QtWidgets.QMainWindow.__init__(self, parent)
+
+ self.highlighter = Highlighter()
+
+ self.setupFileMenu()
+ self.setupEditor()
+
+ self.setCentralWidget(self.editor)
+ self.setWindowTitle(self.tr("Syntax Highlighter"))
+
+ def newFile(self):
+ self.editor.clear()
+
+ def openFile(self, path=""):
+ fileName = path
+
+ if fileName=="":
+ fileName,_ = QtWidgets.QFileDialog.getOpenFileName(self, self.tr("Open File"), "",
+ "qmake Files (*.pro *.prf *.pri)")
+
+ if fileName!="":
+ inFile = QtCore.QFile(fileName)
+ if inFile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
+ self.editor.setPlainText(unicode(inFile.readAll()))
+
+ def setupEditor(self):
+ variableFormat = QtGui.QTextCharFormat()
+ variableFormat.setFontWeight(QtGui.QFont.Bold)
+ variableFormat.setForeground(QtCore.Qt.blue)
+ self.highlighter.addMapping("\\b[A-Z_]+\\b", variableFormat)
+
+ singleLineCommentFormat = QtGui.QTextCharFormat()
+ singleLineCommentFormat.setBackground(QtGui.QColor("#77ff77"))
+ self.highlighter.addMapping("#[^\n]*", singleLineCommentFormat)
+
+ quotationFormat = QtGui.QTextCharFormat()
+ quotationFormat.setBackground(QtCore.Qt.cyan)
+ quotationFormat.setForeground(QtCore.Qt.blue)
+ self.highlighter.addMapping("\".*\"", quotationFormat)
+
+ functionFormat = QtGui.QTextCharFormat()
+ functionFormat.setFontItalic(True)
+ functionFormat.setForeground(QtCore.Qt.blue)
+ self.highlighter.addMapping("\\b[a-z0-9_]+\\(.*\\)", functionFormat)
+
+ font = QtGui.QFont()
+ font.setFamily("Courier")
+ font.setFixedPitch(True)
+ font.setPointSize(10)
+
+ self.editor = QtWidgets.QTextEdit()
+ self.editor.setFont(font)
+ self.highlighter.addToDocument(self.editor.document())
+
+ def setupFileMenu(self):
+ fileMenu = QtWidgets.QMenu(self.tr("&File"), self)
+ self.menuBar().addMenu(fileMenu)
+
+ newFileAct = QtWidgets.QAction(self.tr("&New..."), self)
+ newFileAct.setShortcut(QtGui.QKeySequence(self.tr("Ctrl+N", "File|New")))
+ self.connect(newFileAct, QtCore.SIGNAL("triggered()"), self.newFile)
+ fileMenu.addAction(newFileAct)
+
+ openFileAct = QtWidgets.QAction(self.tr("&Open..."), self)
+ openFileAct.setShortcut(QtGui.QKeySequence(self.tr("Ctrl+O", "File|Open")))
+ self.connect(openFileAct, QtCore.SIGNAL("triggered()"), self.openFile)
+ fileMenu.addAction(openFileAct)
+
+ fileMenu.addAction(self.tr("E&xit"), QtWidgets.qApp, QtCore.SLOT("quit()"),
+ QtGui.QKeySequence(self.tr("Ctrl+Q", "File|Exit")))
+
+
+class Highlighter(QtCore.QObject):
+ def __init__(self, parent=None):
+ QtCore.QObject.__init__(self, parent)
+
+ self.mappings = {}
+
+ def addToDocument(self, doc):
+ self.connect(doc, QtCore.SIGNAL("contentsChange(int, int, int)"), self.highlight)
+
+ def addMapping(self, pattern, format):
+ self.mappings[pattern] = format
+
+ def highlight(self, position, removed, added):
+ doc = self.sender()
+
+ block = doc.findBlock(position)
+ if not block.isValid():
+ return
+
+ if added > removed:
+ endBlock = doc.findBlock(position + added)
+ else:
+ endBlock = block
+
+ while block.isValid() and not (endBlock < block):
+ self.highlightBlock(block)
+ block = block.next()
+
+ def highlightBlock(self, block):
+ layout = block.layout()
+ text = block.text()
+
+ overrides = []
+
+ for pattern in self.mappings:
+ for m in re.finditer(pattern,text):
+ range = QtGui.QTextLayout.FormatRange()
+ s,e = m.span()
+ range.start = s
+ range.length = e-s
+ range.format = self.mappings[pattern]
+ overrides.append(range)
+
+ layout.setAdditionalFormats(overrides)
+ block.document().markContentsDirty(block.position(), block.length())
+
+
+if __name__ == '__main__':
+ app = QtWidgets.QApplication(sys.argv)
+ window = MainWindow()
+ window.resize(640, 512)
+ window.show()
+ window.openFile(":/examples/example")
+ sys.exit(app.exec_())
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc
new file mode 100644
index 000000000..e5f9abf1e
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/" >
+ <file>examples/example</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py
new file mode 100644
index 000000000..81321bb65
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py
@@ -0,0 +1,183 @@
+#############################################################################
+##
+## 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:56:58 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\x06\x79\
+\x54\
+\x45\x4d\x50\x4c\x41\x54\x45\x20\x3d\x20\x61\x70\x70\x0a\x4c\x41\
+\x4e\x47\x55\x41\x47\x45\x20\x3d\x20\x43\x2b\x2b\x0a\x54\x41\x52\
+\x47\x45\x54\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3d\x20\x61\x73\
+\x73\x69\x73\x74\x61\x6e\x74\x0a\x0a\x43\x4f\x4e\x46\x49\x47\x20\
+\x20\x20\x20\x20\x20\x20\x20\x2b\x3d\x20\x71\x74\x20\x77\x61\x72\
+\x6e\x5f\x6f\x6e\x0a\x51\x54\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x2b\x3d\x20\x78\x6d\x6c\x20\x6e\x65\x74\x77\x6f\x72\
+\x6b\x0a\x0a\x50\x52\x4f\x4a\x45\x43\x54\x4e\x41\x4d\x45\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3d\x20\x41\x73\x73\x69\x73\x74\x61\x6e\
+\x74\x0a\x44\x45\x53\x54\x44\x49\x52\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3d\x20\x2e\x2e\x2f\x2e\x2e\x2f\x62\x69\x6e\
+\x0a\x0a\x46\x4f\x52\x4d\x53\x20\x2b\x3d\x20\x66\x69\x6e\x64\x64\
+\x69\x61\x6c\x6f\x67\x2e\x75\x69\x20\x5c\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x68\x65\x6c\x70\x64\x69\x61\x6c\x6f\x67\x2e\x75\x69\
+\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x61\x69\x6e\x77\
+\x69\x6e\x64\x6f\x77\x2e\x75\x69\x20\x5c\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x73\x65\x74\x74\x69\x6e\x67\x73\x64\x69\x61\x6c\x6f\
+\x67\x2e\x75\x69\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\
+\x61\x62\x62\x65\x64\x62\x72\x6f\x77\x73\x65\x72\x2e\x75\x69\x20\
+\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\x6f\x70\x69\x63\x63\
+\x68\x6f\x6f\x73\x65\x72\x2e\x75\x69\x0a\x0a\x53\x4f\x55\x52\x43\
+\x45\x53\x20\x2b\x3d\x20\x6d\x61\x69\x6e\x2e\x63\x70\x70\x20\x5c\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x68\x65\x6c\x70\x77\x69\x6e\
+\x64\x6f\x77\x2e\x63\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x74\x6f\x70\x69\x63\x63\x68\x6f\x6f\x73\x65\x72\x2e\x63\
+\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x64\x6f\x63\
+\x75\x70\x61\x72\x73\x65\x72\x2e\x63\x70\x70\x20\x5c\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x73\x65\x74\x74\x69\x6e\x67\x73\x64\x69\
+\x61\x6c\x6f\x67\x2e\x63\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x69\x6e\x64\x65\x78\x2e\x63\x70\x70\x20\x5c\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x66\x69\x6c\x65\x2e\x63\
+\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\
+\x66\x69\x67\x2e\x63\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x66\x69\x6e\x64\x64\x69\x61\x6c\x6f\x67\x2e\x63\x70\x70\
+\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x68\x65\x6c\x70\x64\
+\x69\x61\x6c\x6f\x67\x2e\x63\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x6d\x61\x69\x6e\x77\x69\x6e\x64\x6f\x77\x2e\x63\
+\x70\x70\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x62\
+\x62\x65\x64\x62\x72\x6f\x77\x73\x65\x72\x2e\x63\x70\x70\x0a\x0a\
+\x48\x45\x41\x44\x45\x52\x53\x20\x20\x20\x20\x20\x20\x20\x20\x2b\
+\x3d\x20\x68\x65\x6c\x70\x77\x69\x6e\x64\x6f\x77\x2e\x68\x20\x5c\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\x6f\x70\x69\x63\x63\x68\
+\x6f\x6f\x73\x65\x72\x2e\x68\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x64\x6f\x63\x75\x70\x61\x72\x73\x65\x72\x2e\x68\x20\x5c\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x73\x65\x74\x74\x69\x6e\x67\
+\x73\x64\x69\x61\x6c\x6f\x67\x2e\x68\x20\x5c\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x69\x6e\x64\x65\x78\x2e\x68\x20\x5c\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x66\x69\x6c\x65\x2e\x68\x20\
+\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6e\x64\x64\x69\
+\x61\x6c\x6f\x67\x2e\x68\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x68\x65\x6c\x70\x64\x69\x61\x6c\x6f\x67\x2e\x68\x20\x5c\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x61\x69\x6e\x77\x69\x6e\x64\
+\x6f\x77\x2e\x68\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x74\
+\x61\x62\x62\x65\x64\x62\x72\x6f\x77\x73\x65\x72\x2e\x68\x20\x5c\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x63\x6f\x6e\x66\x69\x67\x2e\
+\x68\x0a\x0a\x52\x45\x53\x4f\x55\x52\x43\x45\x53\x20\x2b\x3d\x20\
+\x61\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x71\x72\x63\x0a\x0a\x44\
+\x45\x46\x49\x4e\x45\x53\x20\x2b\x3d\x20\x51\x54\x5f\x4b\x45\x59\
+\x57\x4f\x52\x44\x53\x0a\x23\x44\x45\x46\x49\x4e\x45\x53\x20\x2b\
+\x3d\x20\x20\x51\x54\x5f\x50\x41\x4c\x4d\x54\x4f\x50\x43\x45\x4e\
+\x54\x45\x52\x5f\x44\x4f\x43\x53\x0a\x21\x6e\x65\x74\x77\x6f\x72\
+\x6b\x3a\x44\x45\x46\x49\x4e\x45\x53\x20\x20\x20\x20\x20\x20\x20\
+\x20\x2b\x3d\x20\x51\x54\x5f\x49\x4e\x54\x45\x52\x4e\x41\x4c\x5f\
+\x4e\x45\x54\x57\x4f\x52\x4b\x0a\x65\x6c\x73\x65\x3a\x51\x54\x20\
+\x2b\x3d\x20\x6e\x65\x74\x77\x6f\x72\x6b\x0a\x21\x78\x6d\x6c\x3a\
+\x20\x44\x45\x46\x49\x4e\x45\x53\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x2b\x3d\x20\x51\x54\x5f\x49\x4e\
+\x54\x45\x52\x4e\x41\x4c\x5f\x58\x4d\x4c\x0a\x65\x6c\x73\x65\x3a\
+\x51\x54\x20\x2b\x3d\x20\x78\x6d\x6c\x0a\x69\x6e\x63\x6c\x75\x64\
+\x65\x28\x20\x2e\x2e\x2f\x2e\x2e\x2f\x73\x72\x63\x2f\x71\x74\x5f\
+\x70\x72\x6f\x66\x65\x73\x73\x69\x6f\x6e\x61\x6c\x2e\x70\x72\x69\
+\x20\x29\x0a\x0a\x77\x69\x6e\x33\x32\x20\x7b\x0a\x20\x20\x20\x20\
+\x4c\x49\x42\x53\x20\x2b\x3d\x20\x2d\x6c\x73\x68\x65\x6c\x6c\x33\
+\x32\x0a\x20\x20\x20\x20\x52\x43\x5f\x46\x49\x4c\x45\x20\x3d\x20\
+\x61\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x72\x63\x0a\x7d\x0a\x0a\
+\x6d\x61\x63\x20\x7b\x0a\x20\x20\x20\x20\x49\x43\x4f\x4e\x20\x3d\
+\x20\x61\x73\x73\x69\x73\x74\x61\x6e\x74\x2e\x69\x63\x6e\x73\x0a\
+\x20\x20\x20\x20\x54\x41\x52\x47\x45\x54\x20\x3d\x20\x61\x73\x73\
+\x69\x73\x74\x61\x6e\x74\x0a\x23\x20\x20\x20\x20\x51\x4d\x41\x4b\
+\x45\x5f\x49\x4e\x46\x4f\x5f\x50\x4c\x49\x53\x54\x20\x3d\x20\x49\
+\x6e\x66\x6f\x5f\x6d\x61\x63\x2e\x70\x6c\x69\x73\x74\x0a\x7d\x0a\
+\x0a\x23\x74\x61\x72\x67\x65\x74\x2e\x70\x61\x74\x68\x20\x3d\x20\
+\x24\x24\x5b\x51\x54\x5f\x49\x4e\x53\x54\x41\x4c\x4c\x5f\x42\x49\
+\x4e\x53\x5d\x0a\x23\x49\x4e\x53\x54\x41\x4c\x4c\x53\x20\x2b\x3d\
+\x20\x74\x61\x72\x67\x65\x74\x0a\x0a\x23\x61\x73\x73\x69\x73\x74\
+\x61\x6e\x74\x74\x72\x61\x6e\x73\x6c\x61\x74\x69\x6f\x6e\x73\x2e\
+\x66\x69\x6c\x65\x73\x20\x3d\x20\x2a\x2e\x71\x6d\x0a\x23\x61\x73\
+\x73\x69\x73\x74\x61\x6e\x74\x74\x72\x61\x6e\x73\x6c\x61\x74\x69\
+\x6f\x6e\x73\x2e\x70\x61\x74\x68\x20\x3d\x20\x24\x24\x5b\x51\x54\
+\x5f\x49\x4e\x53\x54\x41\x4c\x4c\x5f\x54\x52\x41\x4e\x53\x4c\x41\
+\x54\x49\x4f\x4e\x53\x5d\x0a\x23\x49\x4e\x53\x54\x41\x4c\x4c\x53\
+\x20\x2b\x3d\x20\x61\x73\x73\x69\x73\x74\x61\x6e\x74\x74\x72\x61\
+\x6e\x73\x6c\x61\x74\x69\x6f\x6e\x73\x0a\x0a\x54\x52\x41\x4e\x53\
+\x4c\x41\x54\x49\x4f\x4e\x53\x20\x20\x20\x20\x20\x20\x20\x20\x3d\
+\x20\x61\x73\x73\x69\x73\x74\x61\x6e\x74\x5f\x64\x65\x2e\x74\x73\
+\x20\x5c\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x61\x73\x73\x69\x73\x74\x61\x6e\x74\x5f\x66\
+\x72\x2e\x74\x73\x0a\x0a\x0a\x75\x6e\x69\x78\x3a\x21\x63\x6f\x6e\
+\x74\x61\x69\x6e\x73\x28\x51\x54\x5f\x43\x4f\x4e\x46\x49\x47\x2c\
+\x20\x7a\x6c\x69\x62\x29\x3a\x4c\x49\x42\x53\x20\x2b\x3d\x20\x2d\
+\x6c\x7a\x0a\x0a\x0a\x74\x61\x72\x67\x65\x74\x2e\x70\x61\x74\x68\
+\x3d\x24\x24\x5b\x51\x54\x5f\x49\x4e\x53\x54\x41\x4c\x4c\x5f\x42\
+\x49\x4e\x53\x5d\x0a\x49\x4e\x53\x54\x41\x4c\x4c\x53\x20\x2b\x3d\
+\x20\x74\x61\x72\x67\x65\x74\x0a\
+"
+
+qt_resource_name = b"\
+\x00\x08\
+\x0e\x84\x7f\x43\
+\x00\x65\
+\x00\x78\x00\x61\x00\x6d\x00\x70\x00\x6c\x00\x65\x00\x73\
+\x00\x07\
+\x0c\xe8\x47\xe5\
+\x00\x65\
+\x00\x78\x00\x61\x00\x6d\x00\x70\x00\x6c\x00\x65\
+"
+
+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\x01\x00\x00\x00\x02\
+\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/widgets/richtext/textobject/files/heart.svg b/examples/widgets/richtext/textobject/files/heart.svg
new file mode 100644
index 000000000..ba5f050b0
--- /dev/null
+++ b/examples/widgets/richtext/textobject/files/heart.svg
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) --><svg viewBox="100 200 550 500" height="595.27559pt" id="svg1" inkscape:version="0.40+cvs" sodipodi:docbase="C:\Documents and Settings\Jon Phillips\My Documents\projects\clipart-project\submissions" sodipodi:docname="heart-left-highlight.svg" sodipodi:version="0.32" width="595.27559pt" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
+<metadata>
+<rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+<cc:Work rdf:about="">
+<dc:title>Heart Left-Highlight</dc:title>
+<dc:description>This is a normal valentines day heart.</dc:description>
+<dc:subject>
+<rdf:Bag>
+<rdf:li>holiday</rdf:li>
+<rdf:li>valentines</rdf:li>
+<rdf:li></rdf:li>
+<rdf:li>valentine</rdf:li>
+<rdf:li>hash(0x8a091c0)</rdf:li>
+<rdf:li>hash(0x8a0916c)</rdf:li>
+<rdf:li>signs_and_symbols</rdf:li>
+<rdf:li>hash(0x8a091f0)</rdf:li>
+<rdf:li>day</rdf:li>
+</rdf:Bag>
+</dc:subject>
+<dc:publisher>
+<cc:Agent rdf:about="http://www.openclipart.org">
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:publisher>
+<dc:creator>
+<cc:Agent>
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:creator>
+<dc:rights>
+<cc:Agent>
+<dc:title>Jon Phillips</dc:title>
+</cc:Agent>
+</dc:rights>
+<dc:date></dc:date>
+<dc:format>image/svg+xml</dc:format>
+<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+<cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
+<dc:language>en</dc:language>
+</cc:Work>
+<cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
+<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+</cc:License>
+</rdf:RDF>
+</metadata>
+<defs id="defs3"/>
+<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="549.40674" inkscape:cy="596.00159" inkscape:document-units="px" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="615" inkscape:window-width="866" inkscape:window-x="88" inkscape:window-y="116" inkscape:zoom="0.35000000" pagecolor="#ffffff" showguides="true"/>
+<g id="layer1" inkscape:groupmode="layer" inkscape:label="Layer 1">
+<path d="M 263.41570,235.14588 C 197.17570,235.14588 143.41575,288.90587 143.41575,355.14588 C 143.41575,489.90139 279.34890,525.23318 371.97820,658.45392 C 459.55244,526.05056 600.54070,485.59932 600.54070,355.14588 C 600.54070,288.90588 546.78080,235.14587 480.54070,235.14588 C 432.49280,235.14588 391.13910,263.51631 371.97820,304.33338 C 352.81740,263.51630 311.46370,235.14587 263.41570,235.14588 z " id="path7" sodipodi:nodetypes="ccccccc" style="fill:#e60000;fill-opacity:1.0000000;stroke:#000000;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
+<path d="M 265.00000,253.59375 C 207.04033,253.59375 160.00000,300.63407 160.00000,358.59375 C 160.00000,476.50415 278.91857,507.43251 359.96875,624.00000 C 366.52868,614.08205 220.00000,478.47309 220.00000,378.59375 C 220.00000,320.63407 267.04033,273.59375 325.00000,273.59375 C 325.50453,273.59375 325.99718,273.64912 326.50000,273.65625 C 309.22436,261.07286 288.00557,253.59374 265.00000,253.59375 z " id="path220" sodipodi:nodetypes="ccccccc" style="fill:#e6e6e6;fill-opacity:0.64556962;stroke:none;stroke-width:18.700001;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"/>
+</g>
+</svg>
diff --git a/examples/widgets/richtext/textobject/textobject.py b/examples/widgets/richtext/textobject/textobject.py
new file mode 100755
index 000000000..3e7b75ddc
--- /dev/null
+++ b/examples/widgets/richtext/textobject/textobject.py
@@ -0,0 +1,130 @@
+#!/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 widgets/richtext/textobject example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtSvg
+
+
+class SvgTextObject(QtCore.QObject, QtGui.QTextObjectInterface):
+
+ def intrinsicSize(self, doc, posInDocument, format):
+ renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray())
+ size = renderer.defaultSize()
+
+ if size.height() > 25:
+ size *= 25.0 / size.height()
+
+ return QtCore.QSizeF(size)
+
+ def drawObject(self, painter, rect, doc, posInDocument, format):
+ renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray())
+ renderer.render(painter, rect)
+
+
+class Window(QtWidgets.QWidget):
+
+ SvgTextFormat = QtGui.QTextFormat.UserObject + 1
+
+ SvgData = 1
+
+ def __init__(self):
+ super(Window, self).__init__()
+
+ self.setupGui()
+ self.setupTextObject()
+
+ self.setWindowTitle(self.tr("Text Object Example"))
+
+ def insertTextObject(self):
+ fileName = self.fileNameLineEdit.text()
+ file = QtCore.QFile(fileName)
+
+ if not file.open(QtCore.QIODevice.ReadOnly):
+ QtWidgets.QMessageBox.warning(self, self.tr("Error Opening File"),
+ self.tr("Could not open '%1'").arg(fileName))
+
+ svgData = file.readAll()
+
+ svgCharFormat = QtGui.QTextCharFormat()
+ svgCharFormat.setObjectType(Window.SvgTextFormat)
+ svgCharFormat.setProperty(Window.SvgData, svgData)
+
+ cursor = self.textEdit.textCursor()
+ cursor.insertText(u"\uFFFD", svgCharFormat)
+ self.textEdit.setTextCursor(cursor)
+
+ def setupTextObject(self):
+ svgInterface = SvgTextObject(self)
+ self.textEdit.document().documentLayout().registerHandler(Window.SvgTextFormat, svgInterface)
+
+ def setupGui(self):
+ fileNameLabel = QtWidgets.QLabel(self.tr("Svg File Name:"))
+ self.fileNameLineEdit = QtWidgets.QLineEdit()
+ insertTextObjectButton = QtWidgets.QPushButton(self.tr("Insert Image"))
+
+ self.fileNameLineEdit.setText('./files/heart.svg')
+ QtCore.QObject.connect(insertTextObjectButton, QtCore.SIGNAL('clicked()'), self.insertTextObject)
+
+ bottomLayout = QtWidgets.QHBoxLayout()
+ bottomLayout.addWidget(fileNameLabel)
+ bottomLayout.addWidget(self.fileNameLineEdit)
+ bottomLayout.addWidget(insertTextObjectButton)
+
+ self.textEdit = QtWidgets.QTextEdit()
+
+ mainLayout = QtWidgets.QVBoxLayout()
+ mainLayout.addWidget(self.textEdit)
+ mainLayout.addLayout(bottomLayout)
+
+ self.setLayout(mainLayout)
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/eventtrans.py b/examples/widgets/state-machine/eventtrans.py
new file mode 100755
index 000000000..68e21a81f
--- /dev/null
+++ b/examples/widgets/state-machine/eventtrans.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import *
+from PySide2.QtCore import *
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+ button = QPushButton(self)
+ button.setGeometry(QRect(100, 100, 100, 100))
+
+ machine = QStateMachine(self)
+ s1 = QState()
+ s1.assignProperty(button, 'text', 'Outside')
+ s2 = QState()
+ s2.assignProperty(button, 'text', 'Inside')
+
+ enterTransition = QEventTransition(button, QEvent.Enter)
+ enterTransition.setTargetState(s2)
+ s1.addTransition(enterTransition)
+
+ leaveTransition = QEventTransition(button, QEvent.Leave)
+ leaveTransition.setTargetState(s1)
+ s2.addTransition(leaveTransition)
+
+ s3 = QState()
+ s3.assignProperty(button, 'text', 'Pressing...')
+
+ pressTransition = QEventTransition(button, QEvent.MouseButtonPress)
+ pressTransition.setTargetState(s3)
+ s2.addTransition(pressTransition)
+
+ releaseTransition = QEventTransition(button, QEvent.MouseButtonRelease)
+ releaseTransition.setTargetState(s2)
+ s3.addTransition(releaseTransition)
+
+ machine.addState(s1)
+ machine.addState(s2)
+ machine.addState(s3)
+
+ machine.setInitialState(s1)
+ machine.start()
+
+ self.setCentralWidget(button)
+ self.show()
+
+if __name__ == '__main__':
+ import sys
+
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/factstates.py b/examples/widgets/state-machine/factstates.py
new file mode 100755
index 000000000..8550c3f39
--- /dev/null
+++ b/examples/widgets/state-machine/factstates.py
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import *
+from PySide2.QtCore import *
+
+class Factorial(QObject):
+ xChanged = Signal(int)
+ def __init__(self):
+ super(Factorial, self).__init__()
+ self.xval = -1
+ self.facval = 1
+ def getX(self):
+ return self.xval
+ def setX(self, x):
+ if self.xval == x:
+ return
+ self.xval = x
+ self.xChanged.emit(x)
+ x = Property(int, getX, setX)
+ def getFact(self):
+ return self.facval
+ def setFact(self, fac):
+ self.facval = fac
+ fac = Property(int, getFact, setFact)
+
+class FactorialLoopTransition(QSignalTransition):
+ def __init__(self, fact):
+ super(FactorialLoopTransition, self).__init__(fact, SIGNAL('xChanged(int)'))
+ self.fact = fact
+ def eventTest(self, e):
+ if not super(FactorialLoopTransition, self).eventTest(e):
+ return False
+ return e.arguments()[0] > 1
+ def onTransition(self, e):
+ x = e.arguments()[0]
+ fac = self.fact.fac
+ self.fact.fac = x * fac
+ self.fact.x = x - 1
+
+class FactorialDoneTransition(QSignalTransition):
+ def __init__(self, fact):
+ super(FactorialDoneTransition, self).__init__(fact, SIGNAL('xChanged(int)'))
+ self.fact = fact
+ def eventTest(self, e):
+ if not super(FactorialDoneTransition, self).eventTest(e):
+ return False
+ return e.arguments()[0] <= 1
+ def onTransition(self, e):
+ print(self.fact.fac)
+
+if __name__ == '__main__':
+ import sys
+ app = QCoreApplication(sys.argv)
+ factorial = Factorial()
+ machine = QStateMachine()
+
+ compute = QState(machine)
+ compute.assignProperty(factorial, 'fac', 1)
+ compute.assignProperty(factorial, 'x', 6)
+ compute.addTransition(FactorialLoopTransition(factorial))
+
+ done = QFinalState(machine)
+ doneTransition = FactorialDoneTransition(factorial)
+ doneTransition.setTargetState(done)
+ compute.addTransition(doneTransition)
+
+ machine.setInitialState(compute)
+ machine.finished.connect(app.quit)
+ machine.start()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/pingpong.py b/examples/widgets/state-machine/pingpong.py
new file mode 100755
index 000000000..f0233ffc0
--- /dev/null
+++ b/examples/widgets/state-machine/pingpong.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import *
+from PySide2.QtCore import *
+
+class PingEvent(QEvent):
+ def __init__(self):
+ super(PingEvent, self).__init__(QEvent.Type(QEvent.User+2))
+class PongEvent(QEvent):
+ def __init__(self):
+ super(PongEvent, self).__init__(QEvent.Type(QEvent.User+3))
+
+class Pinger(QState):
+ def __init__(self, parent):
+ super(Pinger, self).__init__(parent)
+ def onEntry(self, e):
+ self.p = PingEvent()
+ self.machine().postEvent(self.p)
+ print('ping?')
+
+class PongTransition(QAbstractTransition):
+ def eventTest(self, e):
+ return e.type() == QEvent.User+3
+ def onTransition(self, e):
+ self.p = PingEvent()
+ machine.postDelayedEvent(self.p, 500)
+ print('ping?')
+class PingTransition(QAbstractTransition):
+ def eventTest(self, e):
+ return e.type() == QEvent.User+2
+ def onTransition(self, e):
+ self.p = PongEvent()
+ machine.postDelayedEvent(self.p, 500)
+ print('pong!')
+
+if __name__ == '__main__':
+ import sys
+ app = QCoreApplication(sys.argv)
+
+ machine = QStateMachine()
+ group = QState(QState.ParallelStates)
+ group.setObjectName('group')
+
+ pinger = Pinger(group)
+ pinger.setObjectName('pinger')
+ pinger.addTransition(PongTransition())
+
+ ponger = QState(group)
+ ponger.setObjectName('ponger')
+ ponger.addTransition(PingTransition())
+
+ machine.addState(group)
+ machine.setInitialState(group)
+ machine.start()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/rogue.py b/examples/widgets/state-machine/rogue.py
new file mode 100755
index 000000000..e6ab3faef
--- /dev/null
+++ b/examples/widgets/state-machine/rogue.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import *
+from PySide2.QtGui import *
+from PySide2.QtCore import *
+
+class MovementTransition(QEventTransition):
+ def __init__(self, window):
+ super(MovementTransition, self).__init__(window, QEvent.KeyPress)
+ self.window = window
+ def eventTest(self, event):
+ if event.type() == QEvent.StateMachineWrapped and \
+ event.event().type() == QEvent.KeyPress:
+ key = event.event().key()
+ return key == Qt.Key_2 or key == Qt.Key_8 or \
+ key == Qt.Key_6 or key == Qt.Key_4
+ return False
+ def onTransition(self, event):
+ key = event.event().key()
+ if key == Qt.Key_4:
+ self.window.movePlayer(self.window.Left)
+ if key == Qt.Key_8:
+ self.window.movePlayer(self.window.Up)
+ if key == Qt.Key_6:
+ self.window.movePlayer(self.window.Right)
+ if key == Qt.Key_2:
+ self.window.movePlayer(self.window.Down)
+
+class Custom(QState):
+ def __init__(self, parent, mw):
+ super(Custom, self).__init__(parent)
+ self.mw = mw
+
+ def onEntry(self, e):
+ print(self.mw.status)
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super(MainWindow, self).__init__()
+ self.pX = 5
+ self.pY = 5
+ self.width = 35
+ self.height = 20
+ self.statusStr = ''
+
+ database = QFontDatabase()
+ font = QFont()
+ if 'Monospace' in database.families():
+ font = QFont('Monospace', 12)
+ else:
+ for family in database.families():
+ if database.isFixedPitch(family):
+ font = QFont(family, 12)
+ self.setFont(font)
+
+ self.setupMap()
+ self.buildMachine()
+ self.show()
+ def setupMap(self):
+ self.map = []
+ qsrand(QTime(0, 0, 0).secsTo(QTime.currentTime()))
+ for x in range(self.width):
+ column = []
+ for y in range(self.height):
+ if x == 0 or x == self.width - 1 or y == 0 or \
+ y == self.height - 1 or qrand() % 40 == 0:
+ column.append('#')
+ else:
+ column.append('.')
+ self.map.append(column)
+
+ def buildMachine(self):
+ machine = QStateMachine(self)
+
+ inputState = Custom(machine, self)
+ # this line sets the status
+ self.status = 'hello!'
+ # however this line does not
+ inputState.assignProperty(self, 'status', 'Move the rogue with 2, 4, 6, and 8')
+
+ machine.setInitialState(inputState)
+ machine.start()
+
+ transition = MovementTransition(self)
+ inputState.addTransition(transition)
+
+ quitState = QState(machine)
+ quitState.assignProperty(self, 'status', 'Really quit(y/n)?')
+
+ yesTransition = QKeyEventTransition(self, QEvent.KeyPress, Qt.Key_Y)
+ self.finalState = QFinalState(machine)
+ yesTransition.setTargetState(self.finalState)
+ quitState.addTransition(yesTransition)
+
+ noTransition = QKeyEventTransition(self, QEvent.KeyPress, Qt.Key_N)
+ noTransition.setTargetState(inputState)
+ quitState.addTransition(noTransition)
+
+ quitTransition = QKeyEventTransition(self, QEvent.KeyPress, Qt.Key_Q)
+ quitTransition.setTargetState(quitState)
+ inputState.addTransition(quitTransition)
+
+ machine.setInitialState(inputState)
+ machine.finished.connect(qApp.quit)
+ machine.start()
+
+ def sizeHint(self):
+ metrics = QFontMetrics(self.font())
+ return QSize(metrics.width('X') * self.width, metrics.height() * (self.height + 1))
+ def paintEvent(self, event):
+ metrics = QFontMetrics(self.font())
+ painter = QPainter(self)
+ fontHeight = metrics.height()
+ fontWidth = metrics.width('X')
+
+ painter.fillRect(self.rect(), Qt.black)
+ painter.setPen(Qt.white)
+
+ yPos = fontHeight
+ painter.drawText(QPoint(0, yPos), self.status)
+ for y in range(self.height):
+ yPos += fontHeight
+ xPos = 0
+ for x in range(self.width):
+ if y == self.pY and x == self.pX:
+ xPos += fontWidth
+ continue
+ painter.drawText(QPoint(xPos, yPos), self.map[x][y])
+ xPos += fontWidth
+ painter.drawText(QPoint(self.pX * fontWidth, (self.pY + 2) * fontHeight), '@')
+ def movePlayer(self, direction):
+ if direction == self.Left:
+ if self.map[self.pX - 1][self.pY] != '#':
+ self.pX -= 1
+ elif direction == self.Right:
+ if self.map[self.pX + 1][self.pY] != '#':
+ self.pX += 1
+ elif direction == self.Up:
+ if self.map[self.pX][self.pY - 1] != '#':
+ self.pY -= 1
+ elif direction == self.Down:
+ if self.map[self.pX][self.pY + 1] != '#':
+ self.pY += 1
+ self.repaint()
+ def getStatus(self):
+ return self.statusStr
+ def setStatus(self, status):
+ self.statusStr = status
+ self.repaint()
+ status = Property(str, getStatus, setStatus)
+ Up = 0
+ Down = 1
+ Left = 2
+ Right = 3
+ Width = 35
+ Height = 20
+
+if __name__ == '__main__':
+ import sys
+ app = QApplication(sys.argv)
+ mainWin = MainWindow()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/trafficlight.py b/examples/widgets/state-machine/trafficlight.py
new file mode 100755
index 000000000..8e1d71d94
--- /dev/null
+++ b/examples/widgets/state-machine/trafficlight.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import *
+from PySide2.QtGui import *
+from PySide2.QtCore import *
+
+class LightWidget(QWidget):
+ def __init__(self, color):
+ super(LightWidget, self).__init__()
+ self.color = color
+ self.onVal = False
+ def isOn(self):
+ return self.onVal
+ def setOn(self, on):
+ if self.onVal == on:
+ return
+ self.onVal = on
+ self.update()
+ @Slot()
+ def turnOff(self):
+ self.setOn(False)
+ @Slot()
+ def turnOn(self):
+ self.setOn(True)
+ def paintEvent(self, e):
+ if not self.onVal:
+ return
+ painter = QPainter(self)
+ painter.setRenderHint(QPainter.Antialiasing)
+ painter.setBrush(self.color)
+ painter.drawEllipse(0, 0, self.width(), self.height())
+
+ on = Property(bool, isOn, setOn)
+
+class TrafficLightWidget(QWidget):
+ def __init__(self):
+ super(TrafficLightWidget, self).__init__()
+ vbox = QVBoxLayout(self)
+ self.redLight = LightWidget(Qt.red)
+ vbox.addWidget(self.redLight)
+ self.yellowLight = LightWidget(Qt.yellow)
+ vbox.addWidget(self.yellowLight)
+ self.greenLight = LightWidget(Qt.green)
+ vbox.addWidget(self.greenLight)
+ pal = QPalette()
+ pal.setColor(QPalette.Background, Qt.black)
+ self.setPalette(pal)
+ self.setAutoFillBackground(True)
+
+def createLightState(light, duration, parent=None):
+ lightState = QState(parent)
+ timer = QTimer(lightState)
+ timer.setInterval(duration)
+ timer.setSingleShot(True)
+ timing = QState(lightState)
+ timing.entered.connect(light.turnOn)
+ timing.entered.connect(timer.start)
+ timing.exited.connect(light.turnOff)
+ done = QFinalState(lightState)
+ timing.addTransition(timer, SIGNAL('timeout()'), done)
+ lightState.setInitialState(timing)
+ return lightState
+
+class TrafficLight(QWidget):
+ def __init__(self):
+ super(TrafficLight, self).__init__()
+ vbox = QVBoxLayout(self)
+ widget = TrafficLightWidget()
+ vbox.addWidget(widget)
+ vbox.setContentsMargins(0, 0, 0, 0)
+
+ machine = QStateMachine(self)
+ redGoingYellow = createLightState(widget.redLight, 1000)
+ redGoingYellow.setObjectName('redGoingYellow')
+ yellowGoingGreen = createLightState(widget.redLight, 1000)
+ yellowGoingGreen.setObjectName('redGoingYellow')
+ redGoingYellow.addTransition(redGoingYellow, SIGNAL('finished()'), yellowGoingGreen)
+ greenGoingYellow = createLightState(widget.yellowLight, 3000)
+ greenGoingYellow.setObjectName('redGoingYellow')
+ yellowGoingGreen.addTransition(yellowGoingGreen, SIGNAL('finished()'), greenGoingYellow)
+ yellowGoingRed = createLightState(widget.greenLight, 1000)
+ yellowGoingRed.setObjectName('redGoingYellow')
+ greenGoingYellow.addTransition(greenGoingYellow, SIGNAL('finished()'), yellowGoingRed)
+ yellowGoingRed.addTransition(yellowGoingRed, SIGNAL('finished()'), redGoingYellow)
+
+ machine.addState(redGoingYellow)
+ machine.addState(yellowGoingGreen)
+ machine.addState(greenGoingYellow)
+ machine.addState(yellowGoingRed)
+ machine.setInitialState(redGoingYellow)
+ machine.start()
+
+if __name__ == '__main__':
+ import sys
+ app = QApplication(sys.argv)
+ widget = TrafficLight()
+ widget.resize(110, 300)
+ widget.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/twowaybutton.py b/examples/widgets/state-machine/twowaybutton.py
new file mode 100755
index 000000000..6b27787b5
--- /dev/null
+++ b/examples/widgets/state-machine/twowaybutton.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
+## 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$
+##
+#############################################################################
+
+from PySide2.QtWidgets import *
+from PySide2.QtCore import *
+
+if __name__ == '__main__':
+ import sys
+ app = QApplication(sys.argv)
+ button = QPushButton()
+ machine = QStateMachine()
+
+ off = QState()
+ off.assignProperty(button, 'text', 'Off')
+ off.setObjectName('off')
+
+ on = QState()
+ on.setObjectName('on')
+ on.assignProperty(button, 'text', 'On')
+
+ off.addTransition(button, SIGNAL('clicked()'), on)
+ # Let's use the new style signals just for the kicks.
+ on.addTransition(button.clicked, off)
+
+ machine.addState(off)
+ machine.addState(on)
+ machine.setInitialState(off)
+ machine.start()
+ button.resize(100, 50)
+ button.show()
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part1.py b/examples/widgets/tutorials/addressbook/part1.py
new file mode 100755
index 000000000..c14aab96b
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part1.py
@@ -0,0 +1,75 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class AddressBook(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part2.py b/examples/widgets/tutorials/addressbook/part2.py
new file mode 100755
index 000000000..62fe157a7
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part2.py
@@ -0,0 +1,182 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class SortedDict(dict):
+ class Iterator(object):
+ def __init__(self, sorted_dict):
+ self._dict = sorted_dict
+ self._keys = sorted(self._dict.keys())
+ self._nr_items = len(self._keys)
+ self._idx = 0
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self._idx >= self._nr_items:
+ raise StopIteration
+
+ key = self._keys[self._idx]
+ value = self._dict[key]
+ self._idx += 1
+
+ return key, value
+
+ __next__ = next
+
+ def __iter__(self):
+ return SortedDict.Iterator(self)
+
+ iterkeys = __iter__
+
+
+class AddressBook(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ self.contacts = SortedDict()
+ self.oldName = ''
+ self.oldAddress = ''
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+ self.nameLine.setReadOnly(True)
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+ self.addressText.setReadOnly(True)
+
+ self.addButton = QtWidgets.QPushButton("&Add")
+ self.addButton.show()
+ self.submitButton = QtWidgets.QPushButton("&Submit")
+ self.submitButton.hide()
+ self.cancelButton = QtWidgets.QPushButton("&Cancel")
+ self.cancelButton.hide()
+
+ self.addButton.clicked.connect(self.addContact)
+ self.submitButton.clicked.connect(self.submitContact)
+ self.cancelButton.clicked.connect(self.cancel)
+
+ buttonLayout1 = QtWidgets.QVBoxLayout()
+ buttonLayout1.addWidget(self.addButton, QtCore.Qt.AlignTop)
+ buttonLayout1.addWidget(self.submitButton)
+ buttonLayout1.addWidget(self.cancelButton)
+ buttonLayout1.addStretch()
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+ mainLayout.addLayout(buttonLayout1, 1, 2)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+ def addContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(False)
+ self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
+ self.addressText.setReadOnly(False)
+
+ self.addButton.setEnabled(False)
+ self.submitButton.show()
+ self.cancelButton.show()
+
+ def submitContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name == "" or address == "":
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name and address.")
+ return
+
+ if name not in self.contacts:
+ self.contacts[name] = address
+ QtWidgets.QMessageBox.information(self, "Add Successful",
+ "\"%s\" has been added to your address book." % name)
+ else:
+ QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+ def cancel(self):
+ self.nameLine.setText(self.oldName)
+ self.nameLine.setReadOnly(True)
+
+ self.addressText.setText(self.oldAddress)
+ self.addressText.setReadOnly(True)
+
+ self.addButton.setEnabled(True)
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part3.py b/examples/widgets/tutorials/addressbook/part3.py
new file mode 100755
index 000000000..8db6e6a3d
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part3.py
@@ -0,0 +1,247 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class SortedDict(dict):
+ class Iterator(object):
+ def __init__(self, sorted_dict):
+ self._dict = sorted_dict
+ self._keys = sorted(self._dict.keys())
+ self._nr_items = len(self._keys)
+ self._idx = 0
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self._idx >= self._nr_items:
+ raise StopIteration
+
+ key = self._keys[self._idx]
+ value = self._dict[key]
+ self._idx += 1
+
+ return key, value
+
+ __next__ = next
+
+ def __iter__(self):
+ return SortedDict.Iterator(self)
+
+ iterkeys = __iter__
+
+
+class AddressBook(QtWidgets.QWidget):
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ self.contacts = SortedDict()
+ self.oldName = ''
+ self.oldAddress = ''
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+ self.nameLine.setReadOnly(True)
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+ self.addressText.setReadOnly(True)
+
+ self.addButton = QtWidgets.QPushButton("&Add")
+ self.addButton.show()
+ self.submitButton = QtWidgets.QPushButton("&Submit")
+ self.submitButton.hide()
+ self.cancelButton = QtWidgets.QPushButton("&Cancel")
+ self.cancelButton.hide()
+ self.nextButton = QtWidgets.QPushButton("&Next")
+ self.nextButton.setEnabled(False)
+ self.previousButton = QtWidgets.QPushButton("&Previous")
+ self.previousButton.setEnabled(False)
+
+ self.addButton.clicked.connect(self.addContact)
+ self.submitButton.clicked.connect(self.submitContact)
+ self.cancelButton.clicked.connect(self.cancel)
+ self.nextButton.clicked.connect(self.next)
+ self.previousButton.clicked.connect(self.previous)
+
+ buttonLayout1 = QtWidgets.QVBoxLayout()
+ buttonLayout1.addWidget(self.addButton, QtCore.Qt.AlignTop)
+ buttonLayout1.addWidget(self.submitButton)
+ buttonLayout1.addWidget(self.cancelButton)
+ buttonLayout1.addStretch()
+
+ buttonLayout2 = QtWidgets.QHBoxLayout()
+ buttonLayout2.addWidget(self.previousButton)
+ buttonLayout2.addWidget(self.nextButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+ mainLayout.addLayout(buttonLayout1, 1, 2)
+ mainLayout.addLayout(buttonLayout2, 3, 1)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+ def addContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(False)
+ self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
+ self.addressText.setReadOnly(False)
+
+ self.addButton.setEnabled(False)
+ self.nextButton.setEnabled(False)
+ self.previousButton.setEnabled(False)
+ self.submitButton.show()
+ self.cancelButton.show()
+
+ def submitContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name == "" or address == "":
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name and address.")
+ return
+
+ if name not in self.contacts:
+ self.contacts[name] = address
+ QtWidgets.QMessageBox.information(self, "Add Successful",
+ "\"%s\" has been added to your address book." % name)
+ else:
+ QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+
+ number = len(self.contacts)
+ self.nextButton.setEnabled(number > 1)
+ self.previousButton.setEnabled(number > 1)
+
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+ def cancel(self):
+ self.nameLine.setText(self.oldName)
+ self.addressText.setText(self.oldAddress)
+
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+
+ number = len(self.contacts)
+ self.nextButton.setEnabled(number > 1)
+ self.previousButton.setEnabled(number > 1)
+
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+ def next(self):
+ name = self.nameLine.text()
+ it = iter(self.contacts)
+
+ try:
+ while True:
+ this_name, _ = it.next()
+
+ if this_name == name:
+ next_name, next_address = it.next()
+ break
+ except StopIteration:
+ next_name, next_address = iter(self.contacts).next()
+
+ self.nameLine.setText(next_name)
+ self.addressText.setText(next_address)
+
+ def previous(self):
+ name = self.nameLine.text()
+
+ prev_name = prev_address = None
+ for this_name, this_address in self.contacts:
+ if this_name == name:
+ break
+
+ prev_name = this_name
+ prev_address = this_address
+ else:
+ self.nameLine.clear()
+ self.addressText.clear()
+ return
+
+ if prev_name is None:
+ for prev_name, prev_address in self.contacts:
+ pass
+
+ self.nameLine.setText(prev_name)
+ self.addressText.setText(prev_address)
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part4.py b/examples/widgets/tutorials/addressbook/part4.py
new file mode 100755
index 000000000..80ef32535
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part4.py
@@ -0,0 +1,301 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class SortedDict(dict):
+ class Iterator(object):
+ def __init__(self, sorted_dict):
+ self._dict = sorted_dict
+ self._keys = sorted(self._dict.keys())
+ self._nr_items = len(self._keys)
+ self._idx = 0
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self._idx >= self._nr_items:
+ raise StopIteration
+
+ key = self._keys[self._idx]
+ value = self._dict[key]
+ self._idx += 1
+
+ return key, value
+
+ __next__ = next
+
+ def __iter__(self):
+ return SortedDict.Iterator(self)
+
+ iterkeys = __iter__
+
+
+class AddressBook(QtWidgets.QWidget):
+ NavigationMode, AddingMode, EditingMode = range(3)
+
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ self.contacts = SortedDict()
+ self.oldName = ''
+ self.oldAddress = ''
+ self.currentMode = self.NavigationMode
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+ self.nameLine.setReadOnly(True)
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+ self.addressText.setReadOnly(True)
+
+ self.addButton = QtWidgets.QPushButton("&Add")
+ self.addButton.show()
+ self.editButton = QtWidgets.QPushButton("&Edit")
+ self.editButton.setEnabled(False)
+ self.removeButton = QtWidgets.QPushButton("&Remove")
+ self.removeButton.setEnabled(False)
+ self.submitButton = QtWidgets.QPushButton("&Submit")
+ self.submitButton.hide()
+ self.cancelButton = QtWidgets.QPushButton("&Cancel")
+ self.cancelButton.hide()
+
+ self.nextButton = QtWidgets.QPushButton("&Next")
+ self.nextButton.setEnabled(False)
+ self.previousButton = QtWidgets.QPushButton("&Previous")
+ self.previousButton.setEnabled(False)
+
+ self.addButton.clicked.connect(self.addContact)
+ self.submitButton.clicked.connect(self.submitContact)
+ self.editButton.clicked.connect(self.editContact)
+ self.removeButton.clicked.connect(self.removeContact)
+ self.cancelButton.clicked.connect(self.cancel)
+ self.nextButton.clicked.connect(self.next)
+ self.previousButton.clicked.connect(self.previous)
+
+ buttonLayout1 = QtWidgets.QVBoxLayout()
+ buttonLayout1.addWidget(self.addButton)
+ buttonLayout1.addWidget(self.editButton)
+ buttonLayout1.addWidget(self.removeButton)
+ buttonLayout1.addWidget(self.submitButton)
+ buttonLayout1.addWidget(self.cancelButton)
+ buttonLayout1.addStretch()
+
+ buttonLayout2 = QtWidgets.QHBoxLayout()
+ buttonLayout2.addWidget(self.previousButton)
+ buttonLayout2.addWidget(self.nextButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+ mainLayout.addLayout(buttonLayout1, 1, 2)
+ mainLayout.addLayout(buttonLayout2, 3, 1)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+ def addContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.updateInterface(self.AddingMode)
+
+ def editContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.updateInterface(self.EditingMode)
+
+ def submitContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name == "" or address == "":
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name and address.")
+ return
+
+ if self.currentMode == self.AddingMode:
+ if name not in self.contacts:
+ self.contacts[name] = address
+ QtWidgets.QMessageBox.information(self, "Add Successful",
+ "\"%s\" has been added to your address book." % name)
+ else:
+ QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+
+ elif self.currentMode == self.EditingMode:
+ if self.oldName != name:
+ if name not in self.contacts:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % self.oldName)
+ del self.contacts[self.oldName]
+ self.contacts[name] = address
+ else:
+ QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+ elif self.oldAddress != address:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % name)
+ self.contacts[name] = address
+
+ self.updateInterface(self.NavigationMode)
+
+ def cancel(self):
+ self.nameLine.setText(self.oldName)
+ self.addressText.setText(self.oldAddress)
+ self.updateInterface(self.NavigationMode)
+
+ def removeContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name in self.contacts:
+ button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
+ "Are you sure you want to remove \"%s\"?" % name,
+ QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+
+ if button == QtWidgets.QMessageBox.Yes:
+ self.previous()
+ del self.contacts[name]
+
+ QtWidgets.QMessageBox.information(self, "Remove Successful",
+ "\"%s\" has been removed from your address book." % name)
+
+ self.updateInterface(self.NavigationMode)
+
+ def next(self):
+ name = self.nameLine.text()
+ it = iter(self.contacts)
+
+ try:
+ while True:
+ this_name, _ = it.next()
+
+ if this_name == name:
+ next_name, next_address = it.next()
+ break
+ except StopIteration:
+ next_name, next_address = iter(self.contacts).next()
+
+ self.nameLine.setText(next_name)
+ self.addressText.setText(next_address)
+
+ def previous(self):
+ name = self.nameLine.text()
+
+ prev_name = prev_address = None
+ for this_name, this_address in self.contacts:
+ if this_name == name:
+ break
+
+ prev_name = this_name
+ prev_address = this_address
+ else:
+ self.nameLine.clear()
+ self.addressText.clear()
+ return
+
+ if prev_name is None:
+ for prev_name, prev_address in self.contacts:
+ pass
+
+ self.nameLine.setText(prev_name)
+ self.addressText.setText(prev_address)
+
+ def updateInterface(self, mode):
+ self.currentMode = mode
+
+ if self.currentMode in (self.AddingMode, self.EditingMode):
+ self.nameLine.setReadOnly(False)
+ self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
+ self.addressText.setReadOnly(False)
+
+ self.addButton.setEnabled(False)
+ self.editButton.setEnabled(False)
+ self.removeButton.setEnabled(False)
+
+ self.nextButton.setEnabled(False)
+ self.previousButton.setEnabled(False)
+
+ self.submitButton.show()
+ self.cancelButton.show()
+
+ elif self.currentMode == self.NavigationMode:
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+
+ number = len(self.contacts)
+ self.editButton.setEnabled(number >= 1)
+ self.removeButton.setEnabled(number >= 1)
+ self.nextButton.setEnabled(number > 1)
+ self.previousButton.setEnabled(number >1 )
+
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part5.py b/examples/widgets/tutorials/addressbook/part5.py
new file mode 100755
index 000000000..a40033ca9
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part5.py
@@ -0,0 +1,361 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class SortedDict(dict):
+ class Iterator(object):
+ def __init__(self, sorted_dict):
+ self._dict = sorted_dict
+ self._keys = sorted(self._dict.keys())
+ self._nr_items = len(self._keys)
+ self._idx = 0
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self._idx >= self._nr_items:
+ raise StopIteration
+
+ key = self._keys[self._idx]
+ value = self._dict[key]
+ self._idx += 1
+
+ return key, value
+
+ __next__ = next
+
+ def __iter__(self):
+ return SortedDict.Iterator(self)
+
+ iterkeys = __iter__
+
+
+class AddressBook(QtWidgets.QWidget):
+ NavigationMode, AddingMode, EditingMode = range(3)
+
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ self.contacts = SortedDict()
+ self.oldName = ''
+ self.oldAddress = ''
+ self.currentMode = self.NavigationMode
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+ self.nameLine.setReadOnly(True)
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+ self.addressText.setReadOnly(True)
+
+ self.addButton = QtWidgets.QPushButton("&Add")
+ self.addButton.show()
+ self.editButton = QtWidgets.QPushButton("&Edit")
+ self.editButton.setEnabled(False)
+ self.removeButton = QtWidgets.QPushButton("&Remove")
+ self.removeButton.setEnabled(False)
+ self.findButton = QtWidgets.QPushButton("&Find")
+ self.findButton.setEnabled(False)
+ self.submitButton = QtWidgets.QPushButton("&Submit")
+ self.submitButton.hide()
+ self.cancelButton = QtWidgets.QPushButton("&Cancel")
+ self.cancelButton.hide()
+
+ self.nextButton = QtWidgets.QPushButton("&Next")
+ self.nextButton.setEnabled(False)
+ self.previousButton = QtWidgets.QPushButton("&Previous")
+ self.previousButton.setEnabled(False)
+
+ self.dialog = FindDialog()
+
+ self.addButton.clicked.connect(self.addContact)
+ self.submitButton.clicked.connect(self.submitContact)
+ self.editButton.clicked.connect(self.editContact)
+ self.removeButton.clicked.connect(self.removeContact)
+ self.findButton.clicked.connect(self.findContact)
+ self.cancelButton.clicked.connect(self.cancel)
+ self.nextButton.clicked.connect(self.next)
+ self.previousButton.clicked.connect(self.previous)
+
+ buttonLayout1 = QtWidgets.QVBoxLayout()
+ buttonLayout1.addWidget(self.addButton)
+ buttonLayout1.addWidget(self.editButton)
+ buttonLayout1.addWidget(self.removeButton)
+ buttonLayout1.addWidget(self.findButton)
+ buttonLayout1.addWidget(self.submitButton)
+ buttonLayout1.addWidget(self.cancelButton)
+ buttonLayout1.addStretch()
+
+ buttonLayout2 = QtWidgets.QHBoxLayout()
+ buttonLayout2.addWidget(self.previousButton)
+ buttonLayout2.addWidget(self.nextButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+ mainLayout.addLayout(buttonLayout1, 1, 2)
+ mainLayout.addLayout(buttonLayout2, 2, 1)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+ def addContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.updateInterface(self.AddingMode)
+
+ def editContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.updateInterface(self.EditingMode)
+
+ def submitContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name == "" or address == "":
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name and address.")
+ return
+
+ if self.currentMode == self.AddingMode:
+ if name not in self.contacts:
+ self.contacts[name] = address
+ QtWidgets.QMessageBox.information(self, "Add Successful",
+ "\"%s\" has been added to your address book." % name)
+ else:
+ QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+
+ elif self.currentMode == self.EditingMode:
+ if self.oldName != name:
+ if name not in self.contacts:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % self.oldName)
+ del self.contacts[self.oldName]
+ self.contacts[name] = address
+ else:
+ QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+ elif self.oldAddress != address:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % name)
+ self.contacts[name] = address
+
+ self.updateInterface(self.NavigationMode)
+
+ def cancel(self):
+ self.nameLine.setText(self.oldName)
+ self.addressText.setText(self.oldAddress)
+ self.updateInterface(self.NavigationMode)
+
+ def removeContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name in self.contacts:
+ button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
+ "Are you sure you want to remove \"%s\"?" % name,
+ QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+
+ if button == QtWidgets.QMessageBox.Yes:
+ self.previous()
+ del self.contacts[name]
+
+ QtWidgets.QMessageBox.information(self, "Remove Successful",
+ "\"%s\" has been removed from your address book." % name)
+
+ self.updateInterface(self.NavigationMode)
+
+ def next(self):
+ name = self.nameLine.text()
+ it = iter(self.contacts)
+
+ try:
+ while True:
+ this_name, _ = it.next()
+
+ if this_name == name:
+ next_name, next_address = it.next()
+ break
+ except StopIteration:
+ next_name, next_address = iter(self.contacts).next()
+
+ self.nameLine.setText(next_name)
+ self.addressText.setText(next_address)
+
+ def previous(self):
+ name = self.nameLine.text()
+
+ prev_name = prev_address = None
+ for this_name, this_address in self.contacts:
+ if this_name == name:
+ break
+
+ prev_name = this_name
+ prev_address = this_address
+ else:
+ self.nameLine.clear()
+ self.addressText.clear()
+ return
+
+ if prev_name is None:
+ for prev_name, prev_address in self.contacts:
+ pass
+
+ self.nameLine.setText(prev_name)
+ self.addressText.setText(prev_address)
+
+ def findContact(self):
+ self.dialog.show()
+
+ if self.dialog.exec_() == QtWidgets.QDialog.Accepted:
+ contactName = self.dialog.getFindText()
+
+ if contactName in self.contacts:
+ self.nameLine.setText(contactName)
+ self.addressText.setText(self.contacts[contactName])
+ else:
+ QtWidgets.QMessageBox.information(self, "Contact Not Found",
+ "Sorry, \"%s\" is not in your address book." % contactName)
+ return
+
+ self.updateInterface(self.NavigationMode)
+
+ def updateInterface(self, mode):
+ self.currentMode = mode
+
+ if self.currentMode in (self.AddingMode, self.EditingMode):
+ self.nameLine.setReadOnly(False)
+ self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
+ self.addressText.setReadOnly(False)
+
+ self.addButton.setEnabled(False)
+ self.editButton.setEnabled(False)
+ self.removeButton.setEnabled(False)
+
+ self.nextButton.setEnabled(False)
+ self.previousButton.setEnabled(False)
+
+ self.submitButton.show()
+ self.cancelButton.show()
+
+ elif self.currentMode == self.NavigationMode:
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+
+ number = len(self.contacts)
+ self.editButton.setEnabled(number >= 1)
+ self.removeButton.setEnabled(number >= 1)
+ self.findButton.setEnabled(number > 2)
+ self.nextButton.setEnabled(number > 1)
+ self.previousButton.setEnabled(number >1 )
+
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+
+class FindDialog(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(FindDialog, self).__init__(parent)
+
+ findLabel = QtWidgets.QLabel("Enter the name of a contact:")
+ self.lineEdit = QtWidgets.QLineEdit()
+
+ self.findButton = QtWidgets.QPushButton("&Find")
+ self.findText = ''
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.addWidget(findLabel)
+ layout.addWidget(self.lineEdit)
+ layout.addWidget(self.findButton)
+
+ self.setLayout(layout)
+ self.setWindowTitle("Find a Contact")
+
+ self.findButton.clicked.connect(self.findClicked)
+ self.findButton.clicked.connect(self.accept)
+
+ def findClicked(self):
+ text = self.lineEdit.text()
+
+ if not text:
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name.")
+ return
+ else:
+ self.findText = text
+ self.lineEdit.clear()
+ self.hide()
+
+ def getFindText(self):
+ return self.findText
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part6.py b/examples/widgets/tutorials/addressbook/part6.py
new file mode 100755
index 000000000..5476a2704
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part6.py
@@ -0,0 +1,426 @@
+#!/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$
+##
+#############################################################################
+
+import pickle
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class SortedDict(dict):
+ class Iterator(object):
+ def __init__(self, sorted_dict):
+ self._dict = sorted_dict
+ self._keys = sorted(self._dict.keys())
+ self._nr_items = len(self._keys)
+ self._idx = 0
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self._idx >= self._nr_items:
+ raise StopIteration
+
+ key = self._keys[self._idx]
+ value = self._dict[key]
+ self._idx += 1
+
+ return key, value
+
+ __next__ = next
+
+ def __iter__(self):
+ return SortedDict.Iterator(self)
+
+ iterkeys = __iter__
+
+
+class AddressBook(QtWidgets.QWidget):
+ NavigationMode, AddingMode, EditingMode = range(3)
+
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ self.contacts = SortedDict()
+ self.oldName = ''
+ self.oldAddress = ''
+ self.currentMode = self.NavigationMode
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+ self.nameLine.setReadOnly(True)
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+ self.addressText.setReadOnly(True)
+
+ self.addButton = QtWidgets.QPushButton("&Add")
+ self.addButton.show()
+ self.editButton = QtWidgets.QPushButton("&Edit")
+ self.editButton.setEnabled(False)
+ self.removeButton = QtWidgets.QPushButton("&Remove")
+ self.removeButton.setEnabled(False)
+ self.findButton = QtWidgets.QPushButton("&Find")
+ self.findButton.setEnabled(False)
+ self.submitButton = QtWidgets.QPushButton("&Submit")
+ self.submitButton.hide()
+ self.cancelButton = QtWidgets.QPushButton("&Cancel")
+ self.cancelButton.hide()
+
+ self.nextButton = QtWidgets.QPushButton("&Next")
+ self.nextButton.setEnabled(False)
+ self.previousButton = QtWidgets.QPushButton("&Previous")
+ self.previousButton.setEnabled(False)
+
+ self.loadButton = QtWidgets.QPushButton("&Load...")
+ self.loadButton.setToolTip("Load contacts from a file")
+ self.saveButton = QtWidgets.QPushButton("Sa&ve...")
+ self.saveButton.setToolTip("Save contacts to a file")
+ self.saveButton.setEnabled(False)
+
+ self.dialog = FindDialog()
+
+ self.addButton.clicked.connect(self.addContact)
+ self.submitButton.clicked.connect(self.submitContact)
+ self.editButton.clicked.connect(self.editContact)
+ self.removeButton.clicked.connect(self.removeContact)
+ self.findButton.clicked.connect(self.findContact)
+ self.cancelButton.clicked.connect(self.cancel)
+ self.nextButton.clicked.connect(self.next)
+ self.previousButton.clicked.connect(self.previous)
+ self.loadButton.clicked.connect(self.loadFromFile)
+ self.saveButton.clicked.connect(self.saveToFile)
+
+ buttonLayout1 = QtWidgets.QVBoxLayout()
+ buttonLayout1.addWidget(self.addButton)
+ buttonLayout1.addWidget(self.editButton)
+ buttonLayout1.addWidget(self.removeButton)
+ buttonLayout1.addWidget(self.findButton)
+ buttonLayout1.addWidget(self.submitButton)
+ buttonLayout1.addWidget(self.cancelButton)
+ buttonLayout1.addWidget(self.loadButton)
+ buttonLayout1.addWidget(self.saveButton)
+ buttonLayout1.addStretch()
+
+ buttonLayout2 = QtWidgets.QHBoxLayout()
+ buttonLayout2.addWidget(self.previousButton)
+ buttonLayout2.addWidget(self.nextButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+ mainLayout.addLayout(buttonLayout1, 1, 2)
+ mainLayout.addLayout(buttonLayout2, 2, 1)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+ def addContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.updateInterface(self.AddingMode)
+
+ def editContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.updateInterface(self.EditingMode)
+
+ def submitContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name == "" or address == "":
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name and address.")
+ return
+
+ if self.currentMode == self.AddingMode:
+ if name not in self.contacts:
+ self.contacts[name] = address
+ QtWidgets.QMessageBox.information(self, "Add Successful",
+ "\"%s\" has been added to your address book." % name)
+ else:
+ QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+
+ elif self.currentMode == self.EditingMode:
+ if self.oldName != name:
+ if name not in self.contacts:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % self.oldName)
+ del self.contacts[self.oldName]
+ self.contacts[name] = address
+ else:
+ QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+ elif self.oldAddress != address:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % name)
+ self.contacts[name] = address
+
+ self.updateInterface(self.NavigationMode)
+
+ def cancel(self):
+ self.nameLine.setText(self.oldName)
+ self.addressText.setText(self.oldAddress)
+ self.updateInterface(self.NavigationMode)
+
+ def removeContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name in self.contacts:
+ button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
+ "Are you sure you want to remove \"%s\"?" % name,
+ QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+
+ if button == QtWidgets.QMessageBox.Yes:
+ self.previous()
+ del self.contacts[name]
+
+ QtWidgets.QMessageBox.information(self, "Remove Successful",
+ "\"%s\" has been removed from your address book." % name)
+
+ self.updateInterface(self.NavigationMode)
+
+ def next(self):
+ name = self.nameLine.text()
+ it = iter(self.contacts)
+
+ try:
+ while True:
+ this_name, _ = it.next()
+
+ if this_name == name:
+ next_name, next_address = it.next()
+ break
+ except StopIteration:
+ next_name, next_address = iter(self.contacts).next()
+
+ self.nameLine.setText(next_name)
+ self.addressText.setText(next_address)
+
+ def previous(self):
+ name = self.nameLine.text()
+
+ prev_name = prev_address = None
+ for this_name, this_address in self.contacts:
+ if this_name == name:
+ break
+
+ prev_name = this_name
+ prev_address = this_address
+ else:
+ self.nameLine.clear()
+ self.addressText.clear()
+ return
+
+ if prev_name is None:
+ for prev_name, prev_address in self.contacts:
+ pass
+
+ self.nameLine.setText(prev_name)
+ self.addressText.setText(prev_address)
+
+ def findContact(self):
+ self.dialog.show()
+
+ if self.dialog.exec_() == QtWidgets.QDialog.Accepted:
+ contactName = self.dialog.getFindText()
+
+ if contactName in self.contacts:
+ self.nameLine.setText(contactName)
+ self.addressText.setText(self.contacts[contactName])
+ else:
+ QtWidgets.QMessageBox.information(self, "Contact Not Found",
+ "Sorry, \"%s\" is not in your address book." % contactName)
+ return
+
+ self.updateInterface(self.NavigationMode)
+
+ def updateInterface(self, mode):
+ self.currentMode = mode
+
+ if self.currentMode in (self.AddingMode, self.EditingMode):
+ self.nameLine.setReadOnly(False)
+ self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
+ self.addressText.setReadOnly(False)
+
+ self.addButton.setEnabled(False)
+ self.editButton.setEnabled(False)
+ self.removeButton.setEnabled(False)
+
+ self.nextButton.setEnabled(False)
+ self.previousButton.setEnabled(False)
+
+ self.submitButton.show()
+ self.cancelButton.show()
+
+ self.loadButton.setEnabled(False)
+ self.saveButton.setEnabled(False)
+
+ elif self.currentMode == self.NavigationMode:
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+
+ number = len(self.contacts)
+ self.editButton.setEnabled(number >= 1)
+ self.removeButton.setEnabled(number >= 1)
+ self.findButton.setEnabled(number > 2)
+ self.nextButton.setEnabled(number > 1)
+ self.previousButton.setEnabled(number >1 )
+
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+ self.loadButton.setEnabled(True)
+ self.saveButton.setEnabled(number >= 1)
+
+ def saveToFile(self):
+ fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self,
+ "Save Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
+
+ if not fileName:
+ return
+
+ try:
+ out_file = open(str(fileName), 'wb')
+ except IOError:
+ QtWidgets.QMessageBox.information(self, "Unable to open file",
+ "There was an error opening \"%s\"" % fileName)
+ return
+
+ pickle.dump(self.contacts, out_file)
+ out_file.close()
+
+ def loadFromFile(self):
+ fileName,_ = QtWidgets.QFileDialog.getOpenFileName(self,
+ "Open Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
+
+ if not fileName:
+ return
+
+ try:
+ in_file = open(str(fileName), 'rb')
+ except IOError:
+ QtWidgets.QMessageBox.information(self, "Unable to open file",
+ "There was an error opening \"%s\"" % fileName)
+ return
+
+ self.contacts = pickle.load(in_file)
+ in_file.close()
+
+ if len(self.contacts) == 0:
+ QtWidgets.QMessageBox.information(self, "No contacts in file",
+ "The file you are attempting to open contains no "
+ "contacts.")
+ else:
+ for name, address in self.contacts:
+ self.nameLine.setText(name)
+ self.addressText.setText(address)
+
+ self.updateInterface(self.NavigationMode)
+
+
+class FindDialog(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(FindDialog, self).__init__(parent)
+
+ findLabel = QtWidgets.QLabel("Enter the name of a contact:")
+ self.lineEdit = QtWidgets.QLineEdit()
+
+ self.findButton = QtWidgets.QPushButton("&Find")
+ self.findText = ''
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.addWidget(findLabel)
+ layout.addWidget(self.lineEdit)
+ layout.addWidget(self.findButton)
+
+ self.setLayout(layout)
+ self.setWindowTitle("Find a Contact")
+
+ self.findButton.clicked.connect(self.findClicked)
+ self.findButton.clicked.connect(self.accept)
+
+ def findClicked(self):
+ text = self.lineEdit.text()
+
+ if not text:
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name.")
+ return
+
+ self.findText = text
+ self.lineEdit.clear()
+ self.hide()
+
+ def getFindText(self):
+ return self.findText
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/tutorials/addressbook/part7.py b/examples/widgets/tutorials/addressbook/part7.py
new file mode 100755
index 000000000..5458a7516
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/part7.py
@@ -0,0 +1,478 @@
+#!/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$
+##
+#############################################################################
+
+import pickle
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+class SortedDict(dict):
+ class Iterator(object):
+ def __init__(self, sorted_dict):
+ self._dict = sorted_dict
+ self._keys = sorted(self._dict.keys())
+ self._nr_items = len(self._keys)
+ self._idx = 0
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ if self._idx >= self._nr_items:
+ raise StopIteration
+
+ key = self._keys[self._idx]
+ value = self._dict[key]
+ self._idx += 1
+
+ return key, value
+
+ __next__ = next
+
+ def __iter__(self):
+ return SortedDict.Iterator(self)
+
+ iterkeys = __iter__
+
+
+class AddressBook(QtWidgets.QWidget):
+ NavigationMode, AddingMode, EditingMode = range(3)
+
+ def __init__(self, parent=None):
+ super(AddressBook, self).__init__(parent)
+
+ self.contacts = SortedDict()
+ self.oldName = ''
+ self.oldAddress = ''
+ self.currentMode = self.NavigationMode
+
+ nameLabel = QtWidgets.QLabel("Name:")
+ self.nameLine = QtWidgets.QLineEdit()
+ self.nameLine.setReadOnly(True)
+
+ addressLabel = QtWidgets.QLabel("Address:")
+ self.addressText = QtWidgets.QTextEdit()
+ self.addressText.setReadOnly(True)
+
+ self.addButton = QtWidgets.QPushButton("&Add")
+ self.addButton.show()
+ self.editButton = QtWidgets.QPushButton("&Edit")
+ self.editButton.setEnabled(False)
+ self.removeButton = QtWidgets.QPushButton("&Remove")
+ self.removeButton.setEnabled(False)
+ self.findButton = QtWidgets.QPushButton("&Find")
+ self.findButton.setEnabled(False)
+ self.submitButton = QtWidgets.QPushButton("&Submit")
+ self.submitButton.hide()
+ self.cancelButton = QtWidgets.QPushButton("&Cancel")
+ self.cancelButton.hide()
+
+ self.nextButton = QtWidgets.QPushButton("&Next")
+ self.nextButton.setEnabled(False)
+ self.previousButton = QtWidgets.QPushButton("&Previous")
+ self.previousButton.setEnabled(False)
+
+ self.loadButton = QtWidgets.QPushButton("&Load...")
+ self.loadButton.setToolTip("Load contacts from a file")
+ self.saveButton = QtWidgets.QPushButton("Sa&ve...")
+ self.saveButton.setToolTip("Save contacts to a file")
+ self.saveButton.setEnabled(False)
+
+ self.exportButton = QtWidgets.QPushButton("Ex&port")
+ self.exportButton.setToolTip("Export as vCard")
+ self.exportButton.setEnabled(False)
+
+ self.dialog = FindDialog()
+
+ self.addButton.clicked.connect(self.addContact)
+ self.submitButton.clicked.connect(self.submitContact)
+ self.editButton.clicked.connect(self.editContact)
+ self.removeButton.clicked.connect(self.removeContact)
+ self.findButton.clicked.connect(self.findContact)
+ self.cancelButton.clicked.connect(self.cancel)
+ self.nextButton.clicked.connect(self.next)
+ self.previousButton.clicked.connect(self.previous)
+ self.loadButton.clicked.connect(self.loadFromFile)
+ self.saveButton.clicked.connect(self.saveToFile)
+ self.exportButton.clicked.connect(self.exportAsVCard)
+
+ buttonLayout1 = QtWidgets.QVBoxLayout()
+ buttonLayout1.addWidget(self.addButton)
+ buttonLayout1.addWidget(self.editButton)
+ buttonLayout1.addWidget(self.removeButton)
+ buttonLayout1.addWidget(self.findButton)
+ buttonLayout1.addWidget(self.submitButton)
+ buttonLayout1.addWidget(self.cancelButton)
+ buttonLayout1.addWidget(self.loadButton)
+ buttonLayout1.addWidget(self.saveButton)
+ buttonLayout1.addWidget(self.exportButton)
+ buttonLayout1.addStretch()
+
+ buttonLayout2 = QtWidgets.QHBoxLayout()
+ buttonLayout2.addWidget(self.previousButton)
+ buttonLayout2.addWidget(self.nextButton)
+
+ mainLayout = QtWidgets.QGridLayout()
+ mainLayout.addWidget(nameLabel, 0, 0)
+ mainLayout.addWidget(self.nameLine, 0, 1)
+ mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
+ mainLayout.addWidget(self.addressText, 1, 1)
+ mainLayout.addLayout(buttonLayout1, 1, 2)
+ mainLayout.addLayout(buttonLayout2, 2, 1)
+
+ self.setLayout(mainLayout)
+ self.setWindowTitle("Simple Address Book")
+
+ def addContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.updateInterface(self.AddingMode)
+
+ def editContact(self):
+ self.oldName = self.nameLine.text()
+ self.oldAddress = self.addressText.toPlainText()
+
+ self.updateInterface(self.EditingMode)
+
+ def submitContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name == "" or address == "":
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name and address.")
+ return
+
+ if self.currentMode == self.AddingMode:
+ if name not in self.contacts:
+ self.contacts[name] = address
+ QtWidgets.QMessageBox.information(self, "Add Successful",
+ "\"%s\" has been added to your address book." % name)
+ else:
+ QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+
+ elif self.currentMode == self.EditingMode:
+ if self.oldName != name:
+ if name not in self.contacts:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % self.oldName)
+ del self.contacts[self.oldName]
+ self.contacts[name] = address
+ else:
+ QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
+ "Sorry, \"%s\" is already in your address book." % name)
+ return
+ elif self.oldAddress != address:
+ QtWidgets.QMessageBox.information(self, "Edit Successful",
+ "\"%s\" has been edited in your address book." % name)
+ self.contacts[name] = address
+
+ self.updateInterface(self.NavigationMode)
+
+ def cancel(self):
+ self.nameLine.setText(self.oldName)
+ self.addressText.setText(self.oldAddress)
+ self.updateInterface(self.NavigationMode)
+
+ def removeContact(self):
+ name = self.nameLine.text()
+ address = self.addressText.toPlainText()
+
+ if name in self.contacts:
+ button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
+ "Are you sure you want to remove \"%s\"?" % name,
+ QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+
+ if button == QtWidgets.QMessageBox.Yes:
+ self.previous()
+ del self.contacts[name]
+
+ QtWidgets.QMessageBox.information(self, "Remove Successful",
+ "\"%s\" has been removed from your address book." % name)
+
+ self.updateInterface(self.NavigationMode)
+
+ def next(self):
+ name = self.nameLine.text()
+ it = iter(self.contacts)
+
+ try:
+ while True:
+ this_name, _ = it.next()
+
+ if this_name == name:
+ next_name, next_address = it.next()
+ break
+ except StopIteration:
+ next_name, next_address = iter(self.contacts).next()
+
+ self.nameLine.setText(next_name)
+ self.addressText.setText(next_address)
+
+ def previous(self):
+ name = self.nameLine.text()
+
+ prev_name = prev_address = None
+ for this_name, this_address in self.contacts:
+ if this_name == name:
+ break
+
+ prev_name = this_name
+ prev_address = this_address
+ else:
+ self.nameLine.clear()
+ self.addressText.clear()
+ return
+
+ if prev_name is None:
+ for prev_name, prev_address in self.contacts:
+ pass
+
+ self.nameLine.setText(prev_name)
+ self.addressText.setText(prev_address)
+
+ def findContact(self):
+ self.dialog.show()
+
+ if self.dialog.exec_() == QtWidgets.QDialog.Accepted:
+ contactName = self.dialog.getFindText()
+
+ if contactName in self.contacts:
+ self.nameLine.setText(contactName)
+ self.addressText.setText(self.contacts[contactName])
+ else:
+ QtWidgets.QMessageBox.information(self, "Contact Not Found",
+ "Sorry, \"%s\" is not in your address book." % contactName)
+ return
+
+ self.updateInterface(self.NavigationMode)
+
+ def updateInterface(self, mode):
+ self.currentMode = mode
+
+ if self.currentMode in (self.AddingMode, self.EditingMode):
+ self.nameLine.setReadOnly(False)
+ self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
+ self.addressText.setReadOnly(False)
+
+ self.addButton.setEnabled(False)
+ self.editButton.setEnabled(False)
+ self.removeButton.setEnabled(False)
+
+ self.nextButton.setEnabled(False)
+ self.previousButton.setEnabled(False)
+
+ self.submitButton.show()
+ self.cancelButton.show()
+
+ self.loadButton.setEnabled(False)
+ self.saveButton.setEnabled(False)
+ self.exportButton.setEnabled(False)
+
+ elif self.currentMode == self.NavigationMode:
+ if not self.contacts:
+ self.nameLine.clear()
+ self.addressText.clear()
+
+ self.nameLine.setReadOnly(True)
+ self.addressText.setReadOnly(True)
+ self.addButton.setEnabled(True)
+
+ number = len(self.contacts)
+ self.editButton.setEnabled(number >= 1)
+ self.removeButton.setEnabled(number >= 1)
+ self.findButton.setEnabled(number > 2)
+ self.nextButton.setEnabled(number > 1)
+ self.previousButton.setEnabled(number >1 )
+
+ self.submitButton.hide()
+ self.cancelButton.hide()
+
+ self.exportButton.setEnabled(number >= 1)
+
+ self.loadButton.setEnabled(True)
+ self.saveButton.setEnabled(number >= 1)
+
+ def saveToFile(self):
+ fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self,
+ "Save Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
+
+ if not fileName:
+ return
+
+ try:
+ out_file = open(str(fileName), 'wb')
+ except IOError:
+ QtWidgets.QMessageBox.information(self, "Unable to open file",
+ "There was an error opening \"%s\"" % fileName)
+ return
+
+ pickle.dump(self.contacts, out_file)
+ out_file.close()
+
+ def loadFromFile(self):
+ fileName,_ = QtWidgets.QFileDialog.getOpenFileName(self,
+ "Open Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
+
+ if not fileName:
+ return
+
+ try:
+ in_file = open(str(fileName), 'rb')
+ except IOError:
+ QtWidgets.QMessageBox.information(self, "Unable to open file",
+ "There was an error opening \"%s\"" % fileName)
+ return
+
+ self.contacts = pickle.load(in_file)
+ in_file.close()
+
+ if len(self.contacts) == 0:
+ QtWidgets.QMessageBox.information(self, "No contacts in file",
+ "The file you are attempting to open contains no "
+ "contacts.")
+ else:
+ for name, address in self.contacts:
+ self.nameLine.setText(name)
+ self.addressText.setText(address)
+
+ self.updateInterface(self.NavigationMode)
+
+ def exportAsVCard(self):
+ name = str(self.nameLine.text())
+ address = self.addressText.toPlainText()
+
+ nameList = name.split()
+
+ if len(nameList) > 1:
+ firstName = nameList[0]
+ lastName = nameList[-1]
+ else:
+ firstName = name
+ lastName = ''
+
+ fileName = QtWidgets.QFileDialog.getSaveFileName(self, "Export Contact",
+ '', "vCard Files (*.vcf);;All Files (*)")[0]
+
+ if not fileName:
+ return
+
+ out_file = QtCore.QFile(fileName)
+
+ if not out_file.open(QtCore.QIODevice.WriteOnly):
+ QtWidgets.QMessageBox.information(self, "Unable to open file",
+ out_file.errorString())
+ return
+
+ out_s = QtCore.QTextStream(out_file)
+
+ out_s << 'BEGIN:VCARD' << '\n'
+ out_s << 'VERSION:2.1' << '\n'
+ out_s << 'N:' << lastName << ';' << firstName << '\n'
+ out_s << 'FN:' << ' '.join(nameList) << '\n'
+
+ address.replace(';', '\\;')
+ address.replace('\n', ';')
+ address.replace(',', ' ')
+
+ out_s << 'ADR;HOME:;' << address << '\n'
+ out_s << 'END:VCARD' << '\n'
+
+ QtWidgets.QMessageBox.information(self, "Export Successful",
+ "\"%s\" has been exported as a vCard." % name)
+
+
+class FindDialog(QtWidgets.QDialog):
+ def __init__(self, parent=None):
+ super(FindDialog, self).__init__(parent)
+
+ findLabel = QtWidgets.QLabel("Enter the name of a contact:")
+ self.lineEdit = QtWidgets.QLineEdit()
+
+ self.findButton = QtWidgets.QPushButton("&Find")
+ self.findText = ''
+
+ layout = QtWidgets.QHBoxLayout()
+ layout.addWidget(findLabel)
+ layout.addWidget(self.lineEdit)
+ layout.addWidget(self.findButton)
+
+ self.setLayout(layout)
+ self.setWindowTitle("Find a Contact")
+
+ self.findButton.clicked.connect(self.findClicked)
+ self.findButton.clicked.connect(self.accept)
+
+ def findClicked(self):
+ text = self.lineEdit.text()
+
+ if not text:
+ QtWidgets.QMessageBox.information(self, "Empty Field",
+ "Please enter a name.")
+ return
+
+ self.findText = text
+ self.lineEdit.clear()
+ self.hide()
+
+ def getFindText(self):
+ return self.findText
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+
+ addressBook = AddressBook()
+ addressBook.show()
+
+ sys.exit(app.exec_())
diff --git a/examples/widgets/widgets/hellogl_openglwidget_legacy.py b/examples/widgets/widgets/hellogl_openglwidget_legacy.py
new file mode 100755
index 000000000..c2e918671
--- /dev/null
+++ b/examples/widgets/widgets/hellogl_openglwidget_legacy.py
@@ -0,0 +1,289 @@
+#!/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/legacy/hellogl example from Qt v5.x modified to use a QOpenGLWidget to demonstrate porting from QGLWidget to QOpenGLWidget"""
+
+import sys
+import math
+from PySide2 import QtCore, QtGui, QtWidgets
+
+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("QOpenGLWidget"))
+
+ 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(QtWidgets.QOpenGLWidget):
+ xRotationChanged = QtCore.Signal(int)
+ yRotationChanged = QtCore.Signal(int)
+ zRotationChanged = QtCore.Signal(int)
+
+ def __init__(self, parent=None):
+ QtWidgets.QOpenGLWidget.__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.update()
+
+ def setYRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.yRot:
+ self.yRot = angle
+ self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
+ self.update()
+
+ def setZRotation(self, angle):
+ angle = self.normalizeAngle(angle)
+ if angle != self.zRot:
+ self.zRot = angle
+ self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
+ self.update()
+
+ def initializeGL(self):
+ darkTrolltechPurple = self.trolltechPurple.darker()
+ GL.glClearColor(darkTrolltechPurple.redF(), darkTrolltechPurple.greenF(), darkTrolltechPurple.blueF(), darkTrolltechPurple.alphaF())
+ 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):
+ GL.glColor(self.trolltechGreen.redF(), self.trolltechGreen.greenF(), self.trolltechGreen.blueF(), self.trolltechGreen.alphaF())
+
+ 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):
+ darkTrolltechGreen = self.trolltechGreen.darker(250 + int(100 * x1))
+ GL.glColor(darkTrolltechGreen.redF(), darkTrolltechGreen.greenF(), darkTrolltechGreen.blueF(), darkTrolltechGreen.alphaF())
+
+ 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/widgets/widgets/tetrix.py b/examples/widgets/widgets/tetrix.py
new file mode 100644
index 000000000..9045ac7af
--- /dev/null
+++ b/examples/widgets/widgets/tetrix.py
@@ -0,0 +1,499 @@
+#!/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 widgets/widgets/tetrix example from Qt v5.x"""
+
+import random
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+
+NoShape, ZShape, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape = range(8)
+
+
+class TetrixWindow(QtWidgets.QWidget):
+ def __init__(self):
+ super(TetrixWindow, self).__init__()
+
+ self.board = TetrixBoard()
+
+ nextPieceLabel = QtWidgets.QLabel()
+ nextPieceLabel.setFrameStyle(QtWidgets.QFrame.Box | QtWidgets.QFrame.Raised)
+ nextPieceLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.board.setNextPieceLabel(nextPieceLabel)
+
+ scoreLcd = QtWidgets.QLCDNumber(5)
+ scoreLcd.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
+ levelLcd = QtWidgets.QLCDNumber(2)
+ levelLcd.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
+ linesLcd = QtWidgets.QLCDNumber(5)
+ linesLcd.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
+
+ startButton = QtWidgets.QPushButton("&Start")
+ startButton.setFocusPolicy(QtCore.Qt.NoFocus)
+ quitButton = QtWidgets.QPushButton("&Quit")
+ quitButton.setFocusPolicy(QtCore.Qt.NoFocus)
+ pauseButton = QtWidgets.QPushButton("&Pause")
+ pauseButton.setFocusPolicy(QtCore.Qt.NoFocus)
+
+ startButton.clicked.connect(self.board.start)
+ pauseButton.clicked.connect(self.board.pause)
+ quitButton.clicked.connect(QtWidgets.qApp.quit)
+ self.board.scoreChanged.connect(scoreLcd.display)
+ self.board.levelChanged.connect(levelLcd.display)
+ self.board.linesRemovedChanged.connect(linesLcd.display)
+
+ layout = QtWidgets.QGridLayout()
+ layout.addWidget(self.createLabel("NEXT"), 0, 0)
+ layout.addWidget(nextPieceLabel, 1, 0)
+ layout.addWidget(self.createLabel("LEVEL"), 2, 0)
+ layout.addWidget(levelLcd, 3, 0)
+ layout.addWidget(startButton, 4, 0)
+ layout.addWidget(self.board, 0, 1, 6, 1)
+ layout.addWidget(self.createLabel("SCORE"), 0, 2)
+ layout.addWidget(scoreLcd, 1, 2)
+ layout.addWidget(self.createLabel("LINES REMOVED"), 2, 2)
+ layout.addWidget(linesLcd, 3, 2)
+ layout.addWidget(quitButton, 4, 2)
+ layout.addWidget(pauseButton, 5, 2)
+ self.setLayout(layout)
+
+ self.setWindowTitle("Tetrix")
+ self.resize(550, 370)
+
+ def createLabel(self, text):
+ lbl = QtWidgets.QLabel(text)
+ lbl.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
+ return lbl
+
+
+class TetrixBoard(QtWidgets.QFrame):
+ BoardWidth = 10
+ BoardHeight = 22
+
+ scoreChanged = QtCore.Signal(int)
+
+ levelChanged = QtCore.Signal(int)
+
+ linesRemovedChanged = QtCore.Signal(int)
+
+ def __init__(self, parent=None):
+ super(TetrixBoard, self).__init__(parent)
+
+ self.timer = QtCore.QBasicTimer()
+ self.nextPieceLabel = None
+ self.isWaitingAfterLine = False
+ self.curPiece = TetrixPiece()
+ self.nextPiece = TetrixPiece()
+ self.curX = 0
+ self.curY = 0
+ self.numLinesRemoved = 0
+ self.numPiecesDropped = 0
+ self.score = 0
+ self.level = 0
+ self.board = None
+
+ self.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken)
+ self.setFocusPolicy(QtCore.Qt.StrongFocus)
+ self.isStarted = False
+ self.isPaused = False
+ self.clearBoard()
+
+ self.nextPiece.setRandomShape()
+
+ def shapeAt(self, x, y):
+ return self.board[(y * TetrixBoard.BoardWidth) + x]
+
+ def setShapeAt(self, x, y, shape):
+ self.board[(y * TetrixBoard.BoardWidth) + x] = shape
+
+ def timeoutTime(self):
+ return 1000 / (1 + self.level)
+
+ def squareWidth(self):
+ return self.contentsRect().width() / TetrixBoard.BoardWidth
+
+ def squareHeight(self):
+ return self.contentsRect().height() / TetrixBoard.BoardHeight
+
+ def setNextPieceLabel(self, label):
+ self.nextPieceLabel = label
+
+ def sizeHint(self):
+ return QtCore.QSize(TetrixBoard.BoardWidth * 15 + self.frameWidth() * 2,
+ TetrixBoard.BoardHeight * 15 + self.frameWidth() * 2)
+
+ def minimumSizeHint(self):
+ return QtCore.QSize(TetrixBoard.BoardWidth * 5 + self.frameWidth() * 2,
+ TetrixBoard.BoardHeight * 5 + self.frameWidth() * 2)
+
+ def start(self):
+ if self.isPaused:
+ return
+
+ self.isStarted = True
+ self.isWaitingAfterLine = False
+ self.numLinesRemoved = 0
+ self.numPiecesDropped = 0
+ self.score = 0
+ self.level = 1
+ self.clearBoard()
+
+ self.linesRemovedChanged.emit(self.numLinesRemoved)
+ self.scoreChanged.emit(self.score)
+ self.levelChanged.emit(self.level)
+
+ self.newPiece()
+ self.timer.start(self.timeoutTime(), self)
+
+ def pause(self):
+ if not self.isStarted:
+ return
+
+ self.isPaused = not self.isPaused
+ if self.isPaused:
+ self.timer.stop()
+ else:
+ self.timer.start(self.timeoutTime(), self)
+
+ self.update()
+
+ def paintEvent(self, event):
+ super(TetrixBoard, self).paintEvent(event)
+
+ painter = QtGui.QPainter(self)
+ rect = self.contentsRect()
+
+ if self.isPaused:
+ painter.drawText(rect, QtCore.Qt.AlignCenter, "Pause")
+ return
+
+ boardTop = rect.bottom() - TetrixBoard.BoardHeight * self.squareHeight()
+
+ for i in range(TetrixBoard.BoardHeight):
+ for j in range(TetrixBoard.BoardWidth):
+ shape = self.shapeAt(j, TetrixBoard.BoardHeight - i - 1)
+ if shape != NoShape:
+ self.drawSquare(painter,
+ rect.left() + j * self.squareWidth(),
+ boardTop + i * self.squareHeight(), shape)
+
+ if self.curPiece.shape() != NoShape:
+ for i in range(4):
+ x = self.curX + self.curPiece.x(i)
+ y = self.curY - self.curPiece.y(i)
+ self.drawSquare(painter, rect.left() + x * self.squareWidth(),
+ boardTop + (TetrixBoard.BoardHeight - y - 1) * self.squareHeight(),
+ self.curPiece.shape())
+
+ def keyPressEvent(self, event):
+ if not self.isStarted or self.isPaused or self.curPiece.shape() == NoShape:
+ super(TetrixBoard, self).keyPressEvent(event)
+ return
+
+ key = event.key()
+ if key == QtCore.Qt.Key_Left:
+ self.tryMove(self.curPiece, self.curX - 1, self.curY)
+ elif key == QtCore.Qt.Key_Right:
+ self.tryMove(self.curPiece, self.curX + 1, self.curY)
+ elif key == QtCore.Qt.Key_Down:
+ self.tryMove(self.curPiece.rotatedRight(), self.curX, self.curY)
+ elif key == QtCore.Qt.Key_Up:
+ self.tryMove(self.curPiece.rotatedLeft(), self.curX, self.curY)
+ elif key == QtCore.Qt.Key_Space:
+ self.dropDown()
+ elif key == QtCore.Qt.Key_D:
+ self.oneLineDown()
+ else:
+ super(TetrixBoard, self).keyPressEvent(event)
+
+ def timerEvent(self, event):
+ if event.timerId() == self.timer.timerId():
+ if self.isWaitingAfterLine:
+ self.isWaitingAfterLine = False
+ self.newPiece()
+ self.timer.start(self.timeoutTime(), self)
+ else:
+ self.oneLineDown()
+ else:
+ super(TetrixBoard, self).timerEvent(event)
+
+ def clearBoard(self):
+ self.board = [NoShape for i in range(TetrixBoard.BoardHeight * TetrixBoard.BoardWidth)]
+
+ def dropDown(self):
+ dropHeight = 0
+ newY = self.curY
+ while newY > 0:
+ if not self.tryMove(self.curPiece, self.curX, newY - 1):
+ break
+ newY -= 1
+ dropHeight += 1
+
+ self.pieceDropped(dropHeight)
+
+ def oneLineDown(self):
+ if not self.tryMove(self.curPiece, self.curX, self.curY - 1):
+ self.pieceDropped(0)
+
+ def pieceDropped(self, dropHeight):
+ for i in range(4):
+ x = self.curX + self.curPiece.x(i)
+ y = self.curY - self.curPiece.y(i)
+ self.setShapeAt(x, y, self.curPiece.shape())
+
+ self.numPiecesDropped += 1
+ if self.numPiecesDropped % 25 == 0:
+ self.level += 1
+ self.timer.start(self.timeoutTime(), self)
+ self.levelChanged.emit(self.level)
+
+ self.score += dropHeight + 7
+ self.scoreChanged.emit(self.score)
+ self.removeFullLines()
+
+ if not self.isWaitingAfterLine:
+ self.newPiece()
+
+ def removeFullLines(self):
+ numFullLines = 0
+
+ for i in range(TetrixBoard.BoardHeight - 1, -1, -1):
+ lineIsFull = True
+
+ for j in range(TetrixBoard.BoardWidth):
+ if self.shapeAt(j, i) == NoShape:
+ lineIsFull = False
+ break
+
+ if lineIsFull:
+ numFullLines += 1
+ for k in range(TetrixBoard.BoardHeight - 1):
+ for j in range(TetrixBoard.BoardWidth):
+ self.setShapeAt(j, k, self.shapeAt(j, k + 1))
+
+ for j in range(TetrixBoard.BoardWidth):
+ self.setShapeAt(j, TetrixBoard.BoardHeight - 1, NoShape)
+
+ if numFullLines > 0:
+ self.numLinesRemoved += numFullLines
+ self.score += 10 * numFullLines
+ self.linesRemovedChanged.emit(self.numLinesRemoved)
+ self.scoreChanged.emit(self.score)
+
+ self.timer.start(500, self)
+ self.isWaitingAfterLine = True
+ self.curPiece.setShape(NoShape)
+ self.update()
+
+ def newPiece(self):
+ self.curPiece = self.nextPiece
+ self.nextPiece.setRandomShape()
+ self.showNextPiece()
+ self.curX = TetrixBoard.BoardWidth // 2 + 1
+ self.curY = TetrixBoard.BoardHeight - 1 + self.curPiece.minY()
+
+ if not self.tryMove(self.curPiece, self.curX, self.curY):
+ self.curPiece.setShape(NoShape)
+ self.timer.stop()
+ self.isStarted = False
+
+ def showNextPiece(self):
+ if self.nextPieceLabel is not None:
+ return
+
+ dx = self.nextPiece.maxX() - self.nextPiece.minX() + 1
+ dy = self.nextPiece.maxY() - self.nextPiece.minY() + 1
+
+ pixmap = QtGui.QPixmap(dx * self.squareWidth(), dy * self.squareHeight())
+ painter = QtGui.QPainter(pixmap)
+ painter.fillRect(pixmap.rect(), self.nextPieceLabel.palette().background())
+
+ for int in range(4):
+ x = self.nextPiece.x(i) - self.nextPiece.minX()
+ y = self.nextPiece.y(i) - self.nextPiece.minY()
+ self.drawSquare(painter, x * self.squareWidth(),
+ y * self.squareHeight(), self.nextPiece.shape())
+
+ self.nextPieceLabel.setPixmap(pixmap)
+
+ def tryMove(self, newPiece, newX, newY):
+ for i in range(4):
+ x = newX + newPiece.x(i)
+ y = newY - newPiece.y(i)
+ if x < 0 or x >= TetrixBoard.BoardWidth or y < 0 or y >= TetrixBoard.BoardHeight:
+ return False
+ if self.shapeAt(x, y) != NoShape:
+ return False
+
+ self.curPiece = newPiece
+ self.curX = newX
+ self.curY = newY
+ self.update()
+ return True
+
+ def drawSquare(self, painter, x, y, shape):
+ colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,
+ 0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]
+
+ color = QtGui.QColor(colorTable[shape])
+ painter.fillRect(x + 1, y + 1, self.squareWidth() - 2,
+ self.squareHeight() - 2, color)
+
+ painter.setPen(color.lighter())
+ painter.drawLine(x, y + self.squareHeight() - 1, x, y)
+ painter.drawLine(x, y, x + self.squareWidth() - 1, y)
+
+ painter.setPen(color.darker())
+ painter.drawLine(x + 1, y + self.squareHeight() - 1,
+ x + self.squareWidth() - 1, y + self.squareHeight() - 1)
+ painter.drawLine(x + self.squareWidth() - 1,
+ y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)
+
+
+class TetrixPiece(object):
+ coordsTable = (
+ ((0, 0), (0, 0), (0, 0), (0, 0)),
+ ((0, -1), (0, 0), (-1, 0), (-1, 1)),
+ ((0, -1), (0, 0), (1, 0), (1, 1)),
+ ((0, -1), (0, 0), (0, 1), (0, 2)),
+ ((-1, 0), (0, 0), (1, 0), (0, 1)),
+ ((0, 0), (1, 0), (0, 1), (1, 1)),
+ ((-1, -1), (0, -1), (0, 0), (0, 1)),
+ ((1, -1), (0, -1), (0, 0), (0, 1))
+ )
+
+ def __init__(self):
+ self.coords = [[0,0] for _ in range(4)]
+ self.pieceShape = NoShape
+
+ self.setShape(NoShape)
+
+ def shape(self):
+ return self.pieceShape
+
+ def setShape(self, shape):
+ table = TetrixPiece.coordsTable[shape]
+ for i in range(4):
+ for j in range(2):
+ self.coords[i][j] = table[i][j]
+
+ self.pieceShape = shape
+
+ def setRandomShape(self):
+ self.setShape(random.randint(1, 7))
+
+ def x(self, index):
+ return self.coords[index][0]
+
+ def y(self, index):
+ return self.coords[index][1]
+
+ def setX(self, index, x):
+ self.coords[index][0] = x
+
+ def setY(self, index, y):
+ self.coords[index][1] = y
+
+ def minX(self):
+ m = self.coords[0][0]
+ for i in range(4):
+ m = min(m, self.coords[i][0])
+
+ return m
+
+ def maxX(self):
+ m = self.coords[0][0]
+ for i in range(4):
+ m = max(m, self.coords[i][0])
+
+ return m
+
+ def minY(self):
+ m = self.coords[0][1]
+ for i in range(4):
+ m = min(m, self.coords[i][1])
+
+ return m
+
+ def maxY(self):
+ m = self.coords[0][1]
+ for i in range(4):
+ m = max(m, self.coords[i][1])
+
+ return m
+
+ def rotatedLeft(self):
+ if self.pieceShape == SquareShape:
+ return self
+
+ result = TetrixPiece()
+ result.pieceShape = self.pieceShape
+ for i in range(4):
+ result.setX(i, self.y(i))
+ result.setY(i, -self.x(i))
+
+ return result
+
+ def rotatedRight(self):
+ if self.pieceShape == SquareShape:
+ return self
+
+ result = TetrixPiece()
+ result.pieceShape = self.pieceShape
+ for i in range(4):
+ result.setX(i, -self.y(i))
+ result.setY(i, self.x(i))
+
+ return result
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = TetrixWindow()
+ window.show()
+ random.seed(None)
+ sys.exit(app.exec_())
diff --git a/examples/xml/dombookmarks/dombookmarks.py b/examples/xml/dombookmarks/dombookmarks.py
new file mode 100755
index 000000000..77c2bad67
--- /dev/null
+++ b/examples/xml/dombookmarks/dombookmarks.py
@@ -0,0 +1,263 @@
+#!/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 xml/dombookmarks example from Qt v5.x"""
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtXml
+
+
+class MainWindow(QtWidgets.QMainWindow):
+ def __init__(self, parent=None):
+ super(MainWindow, self).__init__(parent)
+
+ self.xbelTree = XbelTree()
+ self.setCentralWidget(self.xbelTree)
+
+ self.createActions()
+ self.createMenus()
+
+ self.statusBar().showMessage("Ready")
+
+ self.setWindowTitle("DOM Bookmarks")
+ self.resize(480, 320)
+
+ def open(self):
+ fileName = QtWidgets.QFileDialog.getOpenFileName(self,
+ "Open Bookmark File", QtCore.QDir.currentPath(),
+ "XBEL Files (*.xbel *.xml)")[0]
+
+ if not fileName:
+ return
+
+ inFile = QtCore.QFile(fileName)
+ if not inFile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(self, "DOM Bookmarks",
+ "Cannot read file %s:\n%s." % (fileName, inFile.errorString()))
+ return
+
+ if self.xbelTree.read(inFile):
+ self.statusBar().showMessage("File loaded", 2000)
+
+ def saveAs(self):
+ fileName = QtWidgets.QFileDialog.getSaveFileName(self,
+ "Save Bookmark File", QtCore.QDir.currentPath(),
+ "XBEL Files (*.xbel *.xml)")[0]
+
+ if not fileName:
+ return
+
+ outFile = QtCore.QFile(fileName)
+ if not outFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
+ QtWidgets.QMessageBox.warning(self, "DOM Bookmarks",
+ "Cannot write file %s:\n%s." % (fileName, outFile.errorString()))
+ return
+
+ if self.xbelTree.write(outFile):
+ self.statusBar().showMessage("File saved", 2000)
+
+ def about(self):
+ QtWidgets.QMessageBox.about(self, "About DOM Bookmarks",
+ "The <b>DOM Bookmarks</b> example demonstrates how to use Qt's "
+ "DOM classes to read and write XML documents.")
+
+ def createActions(self):
+ self.openAct = QtWidgets.QAction("&Open...", self, shortcut="Ctrl+O",
+ triggered=self.open)
+
+ self.saveAsAct = QtWidgets.QAction("&Save As...", self, shortcut="Ctrl+S",
+ triggered=self.saveAs)
+
+ 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.openAct)
+ self.fileMenu.addAction(self.saveAsAct)
+ self.fileMenu.addAction(self.exitAct)
+
+ self.menuBar().addSeparator()
+
+ self.helpMenu = self.menuBar().addMenu("&Help")
+ self.helpMenu.addAction(self.aboutAct)
+ self.helpMenu.addAction(self.aboutQtAct)
+
+
+class XbelTree(QtWidgets.QTreeWidget):
+ def __init__(self, parent=None):
+ super(XbelTree, self).__init__(parent)
+
+ self.header().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
+ self.setHeaderLabels(("Title", "Location"))
+
+ self.domDocument = QtXml.QDomDocument()
+
+ self.domElementForItem = {}
+
+ self.folderIcon = QtGui.QIcon()
+ self.bookmarkIcon = QtGui.QIcon()
+
+ self.folderIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_DirClosedIcon),
+ QtGui.QIcon.Normal, QtGui.QIcon.Off)
+ self.folderIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_DirOpenIcon),
+ QtGui.QIcon.Normal, QtGui.QIcon.On)
+ self.bookmarkIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_FileIcon))
+
+ def read(self, device):
+ ok, errorStr, errorLine, errorColumn = self.domDocument.setContent(device, True)
+ if not ok:
+ QtWidgets.QMessageBox.information(self.window(), "DOM Bookmarks",
+ "Parse error at line %d, column %d:\n%s" % (errorLine, errorColumn, errorStr))
+ return False
+
+ root = self.domDocument.documentElement()
+ if root.tagName() != 'xbel':
+ QtWidgets.QMessageBox.information(self.window(), "DOM Bookmarks",
+ "The file is not an XBEL file.")
+ return False
+ elif root.hasAttribute('version') and root.attribute('version') != '1.0':
+ QtWidgets.QMessageBox.information(self.window(), "DOM Bookmarks",
+ "The file is not an XBEL version 1.0 file.")
+ return False
+
+ self.clear()
+
+ # It might not be connected.
+ try:
+ self.itemChanged.disconnect(self.updateDomElement)
+ except:
+ pass
+
+ child = root.firstChildElement('folder')
+ while not child.isNull():
+ self.parseFolderElement(child)
+ child = child.nextSiblingElement('folder')
+
+ self.itemChanged.connect(self.updateDomElement)
+
+ return True
+
+ def write(self, device):
+ indentSize = 4
+
+ out = QtCore.QTextStream(device)
+ self.domDocument.save(out, indentSize)
+ return True
+
+ def updateDomElement(self, item, column):
+ element = self.domElementForItem.get(id(item))
+ if not element.isNull():
+ if column == 0:
+ oldTitleElement = element.firstChildElement('title')
+ newTitleElement = self.domDocument.createElement('title')
+
+ newTitleText = self.domDocument.createTextNode(item.text(0))
+ newTitleElement.appendChild(newTitleText)
+
+ element.replaceChild(newTitleElement, oldTitleElement)
+ else:
+ if element.tagName() == 'bookmark':
+ element.setAttribute('href', item.text(1))
+
+ def parseFolderElement(self, element, parentItem=None):
+ item = self.createItem(element, parentItem)
+
+ title = element.firstChildElement('title').text()
+ if not title:
+ title = "Folder"
+
+ item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
+ item.setIcon(0, self.folderIcon)
+ item.setText(0, title)
+
+ folded = (element.attribute('folded') != 'no')
+ self.setItemExpanded(item, not folded)
+
+ child = element.firstChildElement()
+ while not child.isNull():
+ if child.tagName() == 'folder':
+ self.parseFolderElement(child, item)
+ elif child.tagName() == 'bookmark':
+ childItem = self.createItem(child, item)
+
+ title = child.firstChildElement('title').text()
+ if not title:
+ title = "Folder"
+
+ childItem.setFlags(item.flags() | QtCore.Qt.ItemIsEditable)
+ childItem.setIcon(0, self.bookmarkIcon)
+ childItem.setText(0, title)
+ childItem.setText(1, child.attribute('href'))
+ elif child.tagName() == 'separator':
+ childItem = self.createItem(child, item)
+ childItem.setFlags(item.flags() & ~(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable))
+ childItem.setText(0, 30 * "\xb7")
+
+ child = child.nextSiblingElement()
+
+ def createItem(self, element, parentItem=None):
+ item = QtWidgets.QTreeWidgetItem()
+
+ if parentItem is not None:
+ item = QtWidgets.QTreeWidgetItem(parentItem)
+ else:
+ item = QtWidgets.QTreeWidgetItem(self)
+
+ self.domElementForItem[id(item)] = element
+ return item
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ mainWin = MainWindow()
+ mainWin.show()
+ mainWin.open()
+ sys.exit(app.exec_())
diff --git a/examples/xml/dombookmarks/frank.xbel b/examples/xml/dombookmarks/frank.xbel
new file mode 100644
index 000000000..f498a5e04
--- /dev/null
+++ b/examples/xml/dombookmarks/frank.xbel
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xbel>
+<xbel version="1.0">
+ <folder folded="yes">
+ <title>Literate Programming</title>
+ <bookmark href="http://www.vivtek.com/litprog.html">
+ <title>Synopsis of Literate Programming</title>
+ </bookmark>
+ <bookmark href="http://vasc.ri.cmu.edu/old_help/Programming/Literate/literate.html">
+ <title>Literate Programming: Propaganda and Tools</title>
+ </bookmark>
+ <bookmark href="http://www.isy.liu.se/%7Eturbell/litprog/">
+ <title>Literate Programming by Henrik Turbell</title>
+ </bookmark>
+ <bookmark href="http://www.desy.de/user/projects/LitProg.html">
+ <title>Literate Programming Library</title>
+ </bookmark>
+ <bookmark href="http://www.loria.fr/services/tex/english/litte.html">
+ <title>Literate Programming Basics</title>
+ </bookmark>
+ <bookmark href="http://ei.cs.vt.edu/%7Ecs5014/courseNotes/4.LiterateProgramming/literate_prog.html">
+ <title>Literate Programming Overview</title>
+ </bookmark>
+ <bookmark href="http://www.perl.com/pub/a/tchrist/litprog.html">
+ <title>POD is not Literate Programming</title>
+ </bookmark>
+ <bookmark href="http://www.cornellcollege.edu/%7Eltabak/publications/articles/swsafety.html">
+ <title>Computers That We Can Count On</title>
+ </bookmark>
+ <bookmark href="http://www.cs.auc.dk/%7Enormark/litpro/issues-and-problems.html">
+ <title>Literate Programming - Issues and Problems</title>
+ </bookmark>
+ <bookmark href="http://c2.com/cgi/wiki?LiterateProgramming">
+ <title>Literate Programming - Wiki Pages</title>
+ </bookmark>
+ <bookmark href="http://developers.slashdot.org/developers/02/05/19/2216233.shtml">
+ <title>What is well-commented code?</title>
+ </bookmark>
+ <bookmark href="http://liinwww.ira.uka.de/bibliography/SE/litprog.html">
+ <title>Bibliography on literate programming - A searchable bibliography</title>
+ </bookmark>
+ <bookmark href="http://www2.umassd.edu/SWPI/ProcessBibliography/bib-codereading.html">
+ <title>Program comprehension and code reading bibliography</title>
+ </bookmark>
+ <bookmark href="http://www.cs.auc.dk/%7Enormark/elucidative-programming/">
+ <title>Elucidative Programming</title>
+ </bookmark>
+ <bookmark href="http://www.msu.edu/%7Epfaffben/avl/index.html">
+ <title>AVL Trees (TexiWeb)</title>
+ </bookmark>
+ <bookmark href="http://literate-programming.wikiverse.org/">
+ <title>Literate Programming on Wikiverse</title>
+ </bookmark>
+ <bookmark href="http://www.pbrt.org/">
+ <title>Physically Based Rendering: From Theory to Implementation</title>
+ </bookmark>
+ </folder>
+ <folder folded="no">
+ <title>Useful C++ Links</title>
+ <folder folded="no">
+ <title>STL</title>
+ <bookmark href="http://www.sgi.com/tech/stl/table_of_contents.html">
+ <title>STL Reference Documentation</title>
+ </bookmark>
+ <bookmark href="http://www.yrl.co.uk/~phil/stl/stl.htmlx">
+ <title>STL Tutorial</title>
+ </bookmark>
+ <bookmark href="http://www.cppreference.com/cpp_stl.html">
+ <title>STL Reference</title>
+ </bookmark>
+ </folder>
+ <folder folded="no">
+ <title>Qt</title>
+ <bookmark href="http://doc.trolltech.com/2.3/">
+ <title>Qt 2.3 Reference</title>
+ </bookmark>
+ <bookmark href="http://doc.trolltech.com/3.3/">
+ <title>Qt 3.3 Reference</title>
+ </bookmark>
+ <bookmark href="http://doc.trolltech.com/4.0/">
+ <title>Qt 4.0 Reference</title>
+ </bookmark>
+ <bookmark href="http://www.trolltech.com/">
+ <title>Trolltech Home Page</title>
+ </bookmark>
+ </folder>
+ <folder folded="yes">
+ <title>IOStreams</title>
+ <bookmark href="http://www.cplusplus.com/ref/iostream/index.html">
+ <title>IO Stream Library</title>
+ </bookmark>
+ <bookmark href="http://courses.cs.vt.edu/~cs2604/fall01/binio.html">
+ <title>Binary I/O</title>
+ </bookmark>
+ <bookmark href="http://www.parashift.com/c++-faq-lite/input-output.html">
+ <title>I/O Stream FAQ</title>
+ </bookmark>
+ </folder>
+ <folder folded="yes">
+ <title>gdb</title>
+ <bookmark href="http://www.cs.princeton.edu/~benjasik/gdb/gdbtut.html">
+ <title>GDB Tutorial</title>
+ </bookmark>
+ <bookmark href="http://www.gnu.org/manual/gdb-4.17/html_mono/gdb.html">
+ <title>Debugging with GDB</title>
+ </bookmark>
+ <bookmark href="http://www.cs.washington.edu/orgs/acm/tutorials/dev-in-unix/gdb-refcard.pdf">
+ <title>GDB Quick Reference Page (PDF) (Handy)</title>
+ </bookmark>
+ </folder>
+ <folder folded="yes">
+ <title>Classes and Constructors</title>
+ <bookmark href="http://www.parashift.com/c++-faq-lite/ctors.html">
+ <title>Constructor FAQ</title>
+ </bookmark>
+ <bookmark href="http://www.juicystudio.com/tutorial/cpp/index.html">
+ <title>Organizing Classes</title>
+ </bookmark>
+ </folder>
+ </folder>
+ <folder folded="yes">
+ <title>Software Documentation or System Documentation</title>
+ <bookmark href="http://www.martinfowler.com/distributedComputing/thud.html">
+ <title>The Almighty Thud</title>
+ </bookmark>
+ <bookmark href="http://msdn.microsoft.com/library/techart/cfr.htm">
+ <title>Microsoft Coding Techniques and Programming Practices</title>
+ </bookmark>
+ <bookmark href="http://www.bearcave.com/software/prog_docs.html">
+ <title>Software and Documentation</title>
+ </bookmark>
+ <bookmark href="http://c2.com/cgi/wiki?TheSourceCodeIsTheDesign">
+ <title>The Source Code is the Design</title>
+ </bookmark>
+ <bookmark href="http://www.bleading-edge.com/Publications/C++Journal/Cpjour2.htm">
+ <title>What is Software Design?</title>
+ </bookmark>
+ <bookmark href="http://www.mindprod.com/unmain.html">
+ <title>How To Write Unmaintainable Code</title>
+ </bookmark>
+ <bookmark href="http://www.idinews.com/selfDoc.html">
+ <title>Self Documenting Program Code Remains a Distant Goal</title>
+ </bookmark>
+ <bookmark href="http://www.sdmagazine.com/documents/s=730/sdm0106m/0106m.htm">
+ <title>Place Tab A in Slot B</title>
+ </bookmark>
+ <bookmark href="http://www.holub.com/class/uml/uml.html">
+ <title>UML Reference Card</title>
+ </bookmark>
+ </folder>
+ <folder folded="yes">
+ <title>TeX Resources</title>
+ <bookmark href="http://www.tug.org/">
+ <title>The TeX User's Group</title>
+ </bookmark>
+ <bookmark href="http://www.miktex.org/">
+ <title>MikTeX website</title>
+ </bookmark>
+ <bookmark href="http://cm.bell-labs.com/who/hobby/MetaPost.html">
+ <title>MetaPost website</title>
+ </bookmark>
+ <bookmark href="http://pauillac.inria.fr/%7Emaranget/hevea/">
+ <title>HEVEA is a quite complete and fast LATEX to HTML translator</title>
+ </bookmark>
+ </folder>
+ <folder folded="no">
+ <title>Portable Document Format (PDF)</title>
+ <bookmark href="http://www.adobe.com/">
+ <title>Adobe - The postscript and PDF standards</title>
+ </bookmark>
+ <bookmark href="http://partners.adobe.com/asn/developer/technotes/acrobatpdf.html">
+ <title>Reference Manual Portable Document Format</title>
+ </bookmark>
+ <bookmark href="http://partners.adobe.com/asn/developer/acrosdk/main.html">
+ <title>Adobe Acrobat Software Development Kit</title>
+ </bookmark>
+ </folder>
+ <folder folded="yes">
+ <title>Literature Sites</title>
+ <bookmark href="http://www.cc.columbia.edu/cu/libraries/subjects/speccol.html">
+ <title>Guide to Special Collections (Columbia University)</title>
+ </bookmark>
+ <bookmark href="http://www.ipl.org/ref/litcrit/">
+ <title>Literary Criticism on the Web from the Internet Public Library</title>
+ </bookmark>
+ <bookmark href="http://www.victorianweb.org/">
+ <title>Victorian Web.</title>
+ </bookmark>
+ <bookmark href="http://vos.ucsb.edu/">
+ <title>Voice of the Shuttle.</title>
+ </bookmark>
+ <bookmark href="http://www.modjourn.brown.edu/">
+ <title>Modernist Journals Project</title>
+ </bookmark>
+ <bookmark href="http://www.poetspath.com">
+ <title>Museum of American Poetics</title>
+ </bookmark>
+ <bookmark href="http://www.english.uiuc.edu/maps/">
+ <title>Modern American Poetry</title>
+ </bookmark>
+ <bookmark href="http://www.findarticles.com/">
+ <title>FindArticles.com</title>
+ </bookmark>
+ <bookmark href="http://www.literaryhistory.com">
+ <title>Literary History</title>
+ </bookmark>
+ <bookmark href="http://www.litencyc.com/LitEncycFrame.htm">
+ <title>Literary Encyclopedia</title>
+ </bookmark>
+ <separator/>
+ <bookmark href="http://texts.cdlib.org/ucpress/">
+ <title>The University of California Press</title>
+ </bookmark>
+ <bookmark href="http://www.letrs.indiana.edu/web/w/wright2/">
+ <title>Wright American Fiction, 1851-1875</title>
+ </bookmark>
+ <bookmark href="http://docsouth.unc.edu/">
+ <title>Documenting the American South: Beginnings to 1920</title>
+ </bookmark>
+ <bookmark href="http://etext.lib.virginia.edu/eng-on.html">
+ <title>Electronic Text Center at the University of Virginia</title>
+ </bookmark>
+ <bookmark href="http://digital.nypl.org/schomburg/writers_aa19/">
+ <title>The Schomburg Center for Research in Black Culture</title>
+ </bookmark>
+ <bookmark href="http://www.infomotions.com/alex2/">
+ <title>Alex Catalog of Electronic Texts.</title>
+ </bookmark>
+ </folder>
+</xbel>
diff --git a/examples/xml/dombookmarks/jennifer.xbel b/examples/xml/dombookmarks/jennifer.xbel
new file mode 100644
index 000000000..1f7810b94
--- /dev/null
+++ b/examples/xml/dombookmarks/jennifer.xbel
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xbel>
+<xbel version="1.0">
+ <folder folded="no">
+ <title>Qt Resources</title>
+ <folder folded="yes">
+ <title>Trolltech Partners</title>
+ <bookmark href="http://partners.trolltech.com/partners/training.html">
+ <title>Training Partners</title>
+ </bookmark>
+ <bookmark href="http://partners.trolltech.com/partners/service.html">
+ <title>Consultants and System Integrators</title>
+ </bookmark>
+ <bookmark href="http://partners.trolltech.com/partners/tech.html">
+ <title>Technology Partners</title>
+ </bookmark>
+ <bookmark href="http://partners.trolltech.com/partners/resellers.html">
+ <title>Value Added Resellers (VARs)</title>
+ </bookmark>
+ </folder>
+ <folder folded="yes">
+ <title>Community Resources</title>
+ <bookmark href="http://www.qtforum.org/">
+ <title>QtForum.org</title>
+ </bookmark>
+ <bookmark href="http://www.digitalfanatics.org/projects/qt_tutorial/">
+ <title>The Independent Qt Tutorial</title>
+ </bookmark>
+ <bookmark href="http://prog.qt.free.fr/">
+ <title>French PROG.Qt</title>
+ </bookmark>
+ <bookmark href="http://www.qtforum.de/">
+ <title>German Qt Forum</title>
+ </bookmark>
+ <bookmark href="http://www.korone.net/">
+ <title>Korean Qt Community Site</title>
+ </bookmark>
+ <bookmark href="http://prog.org.ru/forum/forum_14.html">
+ <title>Russian Qt Forum</title>
+ </bookmark>
+ <bookmark href="http://qt4.digitalfanatics.org/">
+ <title>Digitalfanatics: The QT 4 Resource Center</title>
+ </bookmark>
+ <bookmark href="http://www.qtquestions.org/">
+ <title>QtQuestions</title>
+ </bookmark>
+ </folder>
+ <bookmark href="http://doc.trolltech.com/qq/">
+ <title>Qt Quarterly</title>
+ </bookmark>
+ <bookmark href="http://www.trolltech.com/">
+ <title>Trolltech's home page</title>
+ </bookmark>
+ <bookmark href="http://doc.trolltech.com/4.0/">
+ <title>Qt 4.0 documentation</title>
+ </bookmark>
+ <bookmark href="http://www.trolltech.com/developer/faqs/">
+ <title>Frequently Asked Questions</title>
+ </bookmark>
+ </folder>
+ <folder folded="no">
+ <title>Online Dictionaries</title>
+ <bookmark href="http://www.dictionary.com/">
+ <title>Dictionary.com</title>
+ </bookmark>
+ <bookmark href="http://www.m-w.com/">
+ <title>Merriam-Webster Online</title>
+ </bookmark>
+ <bookmark href="http://dictionary.cambridge.org/">
+ <title>Cambridge Dictionaries Online</title>
+ </bookmark>
+ <bookmark href="http://www.onelook.com/">
+ <title>OneLook Dictionary Search</title>
+ </bookmark>
+ <separator/>
+ <bookmark href="www.iee.et.tu-dresden.de/">
+ <title>The New English-German Dictionary</title>
+ </bookmark>
+ <bookmark href="http://dict.tu-chemnitz.de/">
+ <title>TU Chemnitz German-English Dictionary</title>
+ </bookmark>
+ <separator/>
+ <bookmark href="http://atilf.atilf.fr/tlf.htm">
+ <title>Trésor de la Langue Française informatisé</title>
+ </bookmark>
+ <bookmark href="http://dictionnaires.atilf.fr/dictionnaires/ACADEMIE/">
+ <title>Dictionnaire de l'Académie Française</title>
+ </bookmark>
+ <bookmark href="http://elsap1.unicaen.fr/cgi-bin/cherches.cgi">
+ <title>Dictionnaire des synonymes</title>
+ </bookmark>
+ </folder>
+</xbel>
diff --git a/examples/xmlpatterns/schema/files/contact.xsd b/examples/xmlpatterns/schema/files/contact.xsd
new file mode 100644
index 000000000..3e1b5704c
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/contact.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="contact">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="givenName" type="xsd:string"/>
+ <xsd:element name="familyName" type="xsd:string"/>
+ <xsd:element name="birthdate" type="xsd:date" minOccurs="0"/>
+ <xsd:element name="homeAddress" type="address"/>
+ <xsd:element name="workAddress" type="address" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="address">
+ <xsd:sequence>
+ <xsd:element name="street" type="xsd:string"/>
+ <xsd:element name="zipCode" type="xsd:string"/>
+ <xsd:element name="city" type="xsd:string"/>
+ <xsd:element name="country" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema>
diff --git a/examples/xmlpatterns/schema/files/invalid_contact.xml b/examples/xmlpatterns/schema/files/invalid_contact.xml
new file mode 100644
index 000000000..42f1edd67
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/invalid_contact.xml
@@ -0,0 +1,11 @@
+<contact>
+ <givenName>John</givenName>
+ <familyName>Doe</familyName>
+ <title>Prof.</title>
+ <workAddress>
+ <street>Sandakerveien 116</street>
+ <zipCode>N-0550</zipCode>
+ <city>Oslo</city>
+ <country>Norway</country>
+ </workAddress>
+</contact>
diff --git a/examples/xmlpatterns/schema/files/invalid_order.xml b/examples/xmlpatterns/schema/files/invalid_order.xml
new file mode 100644
index 000000000..8ffc5fda4
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/invalid_order.xml
@@ -0,0 +1,13 @@
+<order>
+ <customerId>234219</customerId>
+ <article>
+ <articleId>21692</articleId>
+ <count>3</count>
+ </article>
+ <article>
+ <articleId>24749</articleId>
+ <count>9</count>
+ </article>
+ <deliveryDate>2009-01-23</deliveryDate>
+ <payed>yes</payed>
+</order>
diff --git a/examples/xmlpatterns/schema/files/invalid_recipe.xml b/examples/xmlpatterns/schema/files/invalid_recipe.xml
new file mode 100644
index 000000000..4d75af6a1
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/invalid_recipe.xml
@@ -0,0 +1,14 @@
+<recipe>
+ <title>Cheese on Toast</title>
+ <ingredient name="Bread" quantity="2" unit="slices"/>
+ <ingredient name="Cheese" quantity="2" unit="slices"/>
+ <time quantity="3" unit="days"/>
+ <method>
+ <step>1. Slice the bread and cheese.</step>
+ <step>2. Grill one side of each slice of bread.</step>
+ <step>3. Turn over the bread and place a slice of cheese on each piece.</step>
+ <step>4. Grill until the cheese has started to melt.</step>
+ <step>5. Serve and enjoy!</step>
+ </method>
+ <comment>Tell your friends about it!</comment>
+</recipe>
diff --git a/examples/xmlpatterns/schema/files/order.xsd b/examples/xmlpatterns/schema/files/order.xsd
new file mode 100644
index 000000000..405cafe43
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/order.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="order">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="customerId" type="xsd:positiveInteger"/>
+ <xsd:element name="article" type="articleType" maxOccurs="unbounded"/>
+ <xsd:element name="deliveryDate" type="xsd:date"/>
+ <xsd:element name="payed" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="articleType">
+ <xsd:sequence>
+ <xsd:element name="articleId" type="xsd:positiveInteger"/>
+ <xsd:element name="count" type="xsd:positiveInteger"/>
+ <xsd:element name="comment" type="xsd:string" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema>
diff --git a/examples/xmlpatterns/schema/files/recipe.xsd b/examples/xmlpatterns/schema/files/recipe.xsd
new file mode 100644
index 000000000..bbbafd9a3
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/recipe.xsd
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="recipe">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="title" type="xsd:string"/>
+ <xsd:element name="ingredient" type="ingredientType" maxOccurs="unbounded"/>
+ <xsd:element name="time" type="timeType"/>
+ <xsd:element name="method">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="step" type="xsd:string" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="ingredientType">
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="quantity" type="xsd:positiveInteger"/>
+ <xsd:attribute name="unit" type="xsd:string"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="timeType">
+ <xsd:attribute name="quantity" type="xsd:positiveInteger"/>
+ <xsd:attribute name="unit">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="seconds"/>
+ <xsd:enumeration value="minutes"/>
+ <xsd:enumeration value="hours"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:complexType>
+
+</xsd:schema>
diff --git a/examples/xmlpatterns/schema/files/valid_contact.xml b/examples/xmlpatterns/schema/files/valid_contact.xml
new file mode 100644
index 000000000..53c04d4b5
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/valid_contact.xml
@@ -0,0 +1,11 @@
+<contact>
+ <givenName>John</givenName>
+ <familyName>Doe</familyName>
+ <birthdate>1977-12-25</birthdate>
+ <homeAddress>
+ <street>Sandakerveien 116</street>
+ <zipCode>N-0550</zipCode>
+ <city>Oslo</city>
+ <country>Norway</country>
+ </homeAddress>
+</contact>
diff --git a/examples/xmlpatterns/schema/files/valid_order.xml b/examples/xmlpatterns/schema/files/valid_order.xml
new file mode 100644
index 000000000..f83c36cb1
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/valid_order.xml
@@ -0,0 +1,18 @@
+<order>
+ <customerId>194223</customerId>
+ <article>
+ <articleId>22242</articleId>
+ <count>5</count>
+ </article>
+ <article>
+ <articleId>32372</articleId>
+ <count>12</count>
+ <comment>without stripes</comment>
+ </article>
+ <article>
+ <articleId>23649</articleId>
+ <count>2</count>
+ </article>
+ <deliveryDate>2009-01-23</deliveryDate>
+ <payed>true</payed>
+</order>
diff --git a/examples/xmlpatterns/schema/files/valid_recipe.xml b/examples/xmlpatterns/schema/files/valid_recipe.xml
new file mode 100644
index 000000000..f6499ba21
--- /dev/null
+++ b/examples/xmlpatterns/schema/files/valid_recipe.xml
@@ -0,0 +1,13 @@
+<recipe>
+ <title>Cheese on Toast</title>
+ <ingredient name="Bread" quantity="2" unit="slices"/>
+ <ingredient name="Cheese" quantity="2" unit="slices"/>
+ <time quantity="3" unit="minutes"/>
+ <method>
+ <step>1. Slice the bread and cheese.</step>
+ <step>2. Grill one side of each slice of bread.</step>
+ <step>3. Turn over the bread and place a slice of cheese on each piece.</step>
+ <step>4. Grill until the cheese has started to melt.</step>
+ <step>5. Serve and enjoy!</step>
+ </method>
+</recipe>
diff --git a/examples/xmlpatterns/schema/schema.py b/examples/xmlpatterns/schema/schema.py
new file mode 100755
index 000000000..1a3c51e69
--- /dev/null
+++ b/examples/xmlpatterns/schema/schema.py
@@ -0,0 +1,278 @@
+#!/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$
+##
+#############################################################################
+
+from PySide2 import QtCore, QtGui, QtWidgets, QtXmlPatterns
+
+import schema_rc
+from ui_schema import Ui_SchemaMainWindow
+
+
+try:
+ # Python v2.
+ unicode
+
+ def encode_utf8(ba):
+ return unicode(ba, encoding='utf8')
+
+ def decode_utf8(qs):
+ return QtCore.QByteArray(str(qs))
+
+except NameError:
+ # Python v3.
+
+ def encode_utf8(ba):
+ return str(ba, encoding='utf8')
+
+ def decode_utf8(qs):
+ return QtCore.QByteArray(bytes(qs, encoding='utf8'))
+
+
+class XmlSyntaxHighlighter(QtGui.QSyntaxHighlighter):
+
+ def __init__(self, parent=None):
+ super(XmlSyntaxHighlighter, self).__init__(parent)
+
+ self.highlightingRules = []
+
+ # Tag format.
+ format = QtGui.QTextCharFormat()
+ format.setForeground(QtCore.Qt.darkBlue)
+ format.setFontWeight(QtGui.QFont.Bold)
+ pattern = QtCore.QRegExp("(<[a-zA-Z:]+\\b|<\\?[a-zA-Z:]+\\b|\\?>|>|/>|</[a-zA-Z:]+>)")
+ self.highlightingRules.append((pattern, format))
+
+ # Attribute format.
+ format = QtGui.QTextCharFormat()
+ format.setForeground(QtCore.Qt.darkGreen)
+ pattern = QtCore.QRegExp("[a-zA-Z:]+=")
+ self.highlightingRules.append((pattern, format))
+
+ # Attribute content format.
+ format = QtGui.QTextCharFormat()
+ format.setForeground(QtCore.Qt.red)
+ pattern = QtCore.QRegExp("(\"[^\"]*\"|'[^']*')")
+ self.highlightingRules.append((pattern, format))
+
+ # Comment format.
+ self.commentFormat = QtGui.QTextCharFormat()
+ self.commentFormat.setForeground(QtCore.Qt.lightGray)
+ self.commentFormat.setFontItalic(True)
+
+ self.commentStartExpression = QtCore.QRegExp("<!--")
+ self.commentEndExpression = QtCore.QRegExp("-->")
+
+ def highlightBlock(self, text):
+ for pattern, format in self.highlightingRules:
+ expression = QtCore.QRegExp(pattern)
+ index = expression.indexIn(text)
+ while index >= 0:
+ length = expression.matchedLength()
+ self.setFormat(index, length, format)
+ index = expression.indexIn(text, index + length)
+
+ self.setCurrentBlockState(0)
+
+ startIndex = 0
+ if self.previousBlockState() != 1:
+ startIndex = self.commentStartExpression.indexIn(text)
+
+ while startIndex >= 0:
+ endIndex = self.commentEndExpression.indexIn(text, startIndex)
+ if endIndex == -1:
+ self.setCurrentBlockState(1)
+ commentLength = text.length() - startIndex
+ else:
+ commentLength = endIndex - startIndex + self.commentEndExpression.matchedLength()
+
+ self.setFormat(startIndex, commentLength, self.commentFormat)
+ startIndex = self.commentStartExpression.indexIn(text,
+ startIndex + commentLength)
+
+
+class MessageHandler(QtXmlPatterns.QAbstractMessageHandler):
+
+ def __init__(self):
+ super(MessageHandler, self).__init__()
+
+ self.m_description = ""
+ self.m_sourceLocation = QtXmlPatterns.QSourceLocation()
+
+ def statusMessage(self):
+ return self.m_description
+
+ def line(self):
+ return self.m_sourceLocation.line()
+
+ def column(self):
+ return self.m_sourceLocation.column()
+
+ def handleMessage(self, type, description, identifier, sourceLocation):
+ self.m_description = description
+ self.m_sourceLocation = sourceLocation
+
+
+class MainWindow(QtWidgets.QMainWindow, Ui_SchemaMainWindow):
+
+ def __init__(self):
+ QtWidgets.QMainWindow.__init__(self)
+
+ self.setupUi(self)
+
+ XmlSyntaxHighlighter(self.schemaView.document())
+ XmlSyntaxHighlighter(self.instanceEdit.document())
+
+ self.schemaSelection.addItem("Contact Schema")
+ self.schemaSelection.addItem("Recipe Schema")
+ self.schemaSelection.addItem("Order Schema")
+
+ self.instanceSelection.addItem("Valid Contact Instance")
+ self.instanceSelection.addItem("Invalid Contact Instance")
+
+ self.schemaSelection.currentIndexChanged[int].connect(self.schemaSelected)
+ self.instanceSelection.currentIndexChanged[int].connect(self.instanceSelected)
+ self.validateButton.clicked.connect(self.validate)
+ self.instanceEdit.textChanged.connect(self.textChanged)
+
+ self.validationStatus.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
+
+ self.schemaSelected(0)
+ self.instanceSelected(0)
+
+ def schemaSelected(self, index):
+ self.instanceSelection.clear()
+
+ if index == 0:
+ self.instanceSelection.addItem("Valid Contact Instance")
+ self.instanceSelection.addItem("Invalid Contact Instance")
+ elif index == 1:
+ self.instanceSelection.addItem("Valid Recipe Instance")
+ self.instanceSelection.addItem("Invalid Recipe Instance")
+ elif index == 2:
+ self.instanceSelection.addItem("Valid Order Instance")
+ self.instanceSelection.addItem("Invalid Order Instance")
+
+ self.textChanged()
+
+ schemaFile = QtCore.QFile(':/schema_%d.xsd' % index)
+ schemaFile.open(QtCore.QIODevice.ReadOnly)
+ schemaData = schemaFile.readAll()
+ self.schemaView.setPlainText(encode_utf8(schemaData))
+
+ self.validate()
+
+ def instanceSelected(self, index):
+ if index is -1:
+ return
+
+ index += 2 * self.schemaSelection.currentIndex()
+ instanceFile = QtCore.QFile(':/instance_%d.xml' % index)
+ instanceFile.open(QtCore.QIODevice.ReadOnly)
+ instanceData = instanceFile.readAll()
+ self.instanceEdit.setPlainText(encode_utf8(instanceData))
+
+ self.validate()
+
+ def validate(self):
+ schemaData = decode_utf8(self.schemaView.toPlainText())
+ instanceData = decode_utf8(self.instanceEdit.toPlainText())
+
+ messageHandler = MessageHandler()
+
+ schema = QtXmlPatterns.QXmlSchema()
+ schema.setMessageHandler(messageHandler)
+ schema.load(schemaData, QtCore.QUrl())
+
+ errorOccurred = False
+ if not schema.isValid():
+ errorOccurred = True
+ else:
+ validator = QtXmlPatterns.QXmlSchemaValidator(schema)
+ if not validator.validate(instanceData):
+ errorOccurred = True
+
+ if errorOccurred:
+ self.validationStatus.setText(messageHandler.statusMessage())
+ self.moveCursor(messageHandler.line(), messageHandler.column())
+ background = QtCore.Qt.red
+ else:
+ self.validationStatus.setText("validation successful")
+ background = QtCore.Qt.green
+
+ styleSheet = 'QLabel {background: %s; padding: 3px}' % QtGui.QColor(background).lighter(160).name()
+ self.validationStatus.setStyleSheet(styleSheet)
+
+ def textChanged(self):
+ self.instanceEdit.setExtraSelections([])
+
+ def moveCursor(self, line, column):
+ self.instanceEdit.moveCursor(QtGui.QTextCursor.Start)
+
+ for i in range(1, line):
+ self.instanceEdit.moveCursor(QtGui.QTextCursor.Down)
+
+ for i in range(1, column):
+ self.instanceEdit.moveCursor(QtGui.QTextCursor.Right)
+
+ extraSelections = []
+ selection = QtWidgets.QTextEdit.ExtraSelection()
+
+ lineColor = QtGui.QColor(QtCore.Qt.red).lighter(160)
+ selection.format.setBackground(lineColor)
+ selection.format.setProperty(QtGui.QTextFormat.FullWidthSelection, True)
+ selection.cursor = self.instanceEdit.textCursor()
+ selection.cursor.clearSelection()
+ extraSelections.append(selection)
+
+ self.instanceEdit.setExtraSelections(extraSelections)
+
+ self.instanceEdit.setFocus()
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QtWidgets.QApplication(sys.argv)
+ window = MainWindow()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/examples/xmlpatterns/schema/schema.qrc b/examples/xmlpatterns/schema/schema.qrc
new file mode 100644
index 000000000..eb7ddfd7c
--- /dev/null
+++ b/examples/xmlpatterns/schema/schema.qrc
@@ -0,0 +1,13 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file alias="schema_0.xsd">files/contact.xsd</file>
+ <file alias="schema_1.xsd">files/recipe.xsd</file>
+ <file alias="schema_2.xsd">files/order.xsd</file>
+ <file alias="instance_0.xml">files/valid_contact.xml</file>
+ <file alias="instance_1.xml">files/invalid_contact.xml</file>
+ <file alias="instance_2.xml">files/valid_recipe.xml</file>
+ <file alias="instance_3.xml">files/invalid_recipe.xml</file>
+ <file alias="instance_4.xml">files/valid_order.xml</file>
+ <file alias="instance_5.xml">files/invalid_order.xml</file>
+</qresource>
+</RCC>
diff --git a/examples/xmlpatterns/schema/schema.ui b/examples/xmlpatterns/schema/schema.ui
new file mode 100644
index 000000000..b67f444d2
--- /dev/null
+++ b/examples/xmlpatterns/schema/schema.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SchemaMainWindow</class>
+ <widget class="QMainWindow" name="SchemaMainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>417</width>
+ <height>594</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>XML Schema Validation</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="schemaLabel">
+ <property name="text">
+ <string>XML Schema Document:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" colspan="2">
+ <widget class="QComboBox" name="schemaSelection"/>
+ </item>
+ <item row="1" column="0" colspan="4">
+ <widget class="QTextBrowser" name="schemaView"/>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QLabel" name="instanceLabel">
+ <property name="text">
+ <string>XML Instance Document:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2" colspan="2">
+ <widget class="QComboBox" name="instanceSelection"/>
+ </item>
+ <item row="3" column="0" colspan="4">
+ <widget class="QTextEdit" name="instanceEdit"/>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Status:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" colspan="2">
+ <widget class="QLabel" name="validationStatus">
+ <property name="text">
+ <string>not validated</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QPushButton" name="validateButton">
+ <property name="text">
+ <string>Validate</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/xmlpatterns/schema/schema_rc.py b/examples/xmlpatterns/schema/schema_rc.py
new file mode 100644
index 000000000..c4df53030
--- /dev/null
+++ b/examples/xmlpatterns/schema/schema_rc.py
@@ -0,0 +1,501 @@
+# -*- coding: utf-8 -*-
+
+#############################################################################
+##
+## 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: Tue Jul 27 10:50:50 2010
+# by: The Resource Compiler for PySide (Qt v4.6.2)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x03\x67\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x3f\x3e\x0a\x3c\x78\x73\x64\x3a\x73\x63\x68\x65\x6d\x61\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x73\x64\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
+\x30\x31\x2f\x58\x4d\x4c\x53\x63\x68\x65\x6d\x61\x22\x3e\x0a\x0a\
+\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\
+\x20\x6e\x61\x6d\x65\x3d\x22\x6f\x72\x64\x65\x72\x22\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x63\x6f\x6d\x70\
+\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\
+\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\
+\x20\x6e\x61\x6d\x65\x3d\x22\x63\x75\x73\x74\x6f\x6d\x65\x72\x49\
+\x64\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x70\x6f\x73\
+\x69\x74\x69\x76\x65\x49\x6e\x74\x65\x67\x65\x72\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\
+\x65\x3d\x22\x61\x72\x74\x69\x63\x6c\x65\x22\x20\x74\x79\x70\x65\
+\x3d\x22\x61\x72\x74\x69\x63\x6c\x65\x54\x79\x70\x65\x22\x20\x6d\
+\x61\x78\x4f\x63\x63\x75\x72\x73\x3d\x22\x75\x6e\x62\x6f\x75\x6e\
+\x64\x65\x64\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\
+\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x64\x65\x6c\x69\x76\x65\
+\x72\x79\x44\x61\x74\x65\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\
+\x64\x3a\x64\x61\x74\x65\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\
+\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x70\x61\x79\
+\x65\x64\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x62\x6f\
+\x6f\x6c\x65\x61\x6e\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x73\x65\x71\x75\x65\
+\x6e\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x2f\x78\
+\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\
+\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\
+\x74\x3e\x0a\x0a\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x63\x6f\x6d\
+\x70\x6c\x65\x78\x54\x79\x70\x65\x20\x6e\x61\x6d\x65\x3d\x22\x61\
+\x72\x74\x69\x63\x6c\x65\x54\x79\x70\x65\x22\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\
+\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\
+\x65\x3d\x22\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x22\x20\x74\x79\
+\x70\x65\x3d\x22\x78\x73\x64\x3a\x70\x6f\x73\x69\x74\x69\x76\x65\
+\x49\x6e\x74\x65\x67\x65\x72\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\
+\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x63\x6f\x75\x6e\x74\x22\
+\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x70\x6f\x73\x69\x74\
+\x69\x76\x65\x49\x6e\x74\x65\x67\x65\x72\x22\x2f\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\
+\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x63\x6f\x6d\
+\x6d\x65\x6e\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\
+\x73\x74\x72\x69\x6e\x67\x22\x20\x6d\x69\x6e\x4f\x63\x63\x75\x72\
+\x73\x3d\x22\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x2f\x78\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\x63\x65\x3e\x0a\
+\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\
+\x78\x54\x79\x70\x65\x3e\x0a\x0a\x3c\x2f\x78\x73\x64\x3a\x73\x63\
+\x68\x65\x6d\x61\x3e\x0a\
+\x00\x00\x01\x1d\
+\x3c\
+\x63\x6f\x6e\x74\x61\x63\x74\x3e\x0a\x20\x20\x20\x20\x3c\x67\x69\
+\x76\x65\x6e\x4e\x61\x6d\x65\x3e\x4a\x6f\x68\x6e\x3c\x2f\x67\x69\
+\x76\x65\x6e\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x66\x61\
+\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x3e\x44\x6f\x65\x3c\x2f\x66\x61\
+\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x74\
+\x69\x74\x6c\x65\x3e\x50\x72\x6f\x66\x2e\x3c\x2f\x74\x69\x74\x6c\
+\x65\x3e\x0a\x20\x20\x20\x20\x3c\x77\x6f\x72\x6b\x41\x64\x64\x72\
+\x65\x73\x73\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\
+\x72\x65\x65\x74\x3e\x53\x61\x6e\x64\x61\x6b\x65\x72\x76\x65\x69\
+\x65\x6e\x20\x31\x31\x36\x3c\x2f\x73\x74\x72\x65\x65\x74\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x7a\x69\x70\x43\x6f\x64\x65\
+\x3e\x4e\x2d\x30\x35\x35\x30\x3c\x2f\x7a\x69\x70\x43\x6f\x64\x65\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x63\x69\x74\x79\x3e\
+\x4f\x73\x6c\x6f\x3c\x2f\x63\x69\x74\x79\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x63\x6f\x75\x6e\x74\x72\x79\x3e\x4e\x6f\x72\
+\x77\x61\x79\x3c\x2f\x63\x6f\x75\x6e\x74\x72\x79\x3e\x0a\x20\x20\
+\x20\x20\x3c\x2f\x77\x6f\x72\x6b\x41\x64\x64\x72\x65\x73\x73\x3e\
+\x0a\x3c\x2f\x63\x6f\x6e\x74\x61\x63\x74\x3e\x0a\
+\x00\x00\x02\x25\
+\x3c\
+\x72\x65\x63\x69\x70\x65\x3e\x0a\x20\x20\x20\x20\x3c\x74\x69\x74\
+\x6c\x65\x3e\x43\x68\x65\x65\x73\x65\x20\x6f\x6e\x20\x54\x6f\x61\
+\x73\x74\x3c\x2f\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\x20\x20\x3c\
+\x69\x6e\x67\x72\x65\x64\x69\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\
+\x22\x42\x72\x65\x61\x64\x22\x20\x71\x75\x61\x6e\x74\x69\x74\x79\
+\x3d\x22\x32\x22\x20\x75\x6e\x69\x74\x3d\x22\x73\x6c\x69\x63\x65\
+\x73\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x69\x6e\x67\x72\x65\x64\
+\x69\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x43\x68\x65\x65\x73\
+\x65\x22\x20\x71\x75\x61\x6e\x74\x69\x74\x79\x3d\x22\x32\x22\x20\
+\x75\x6e\x69\x74\x3d\x22\x73\x6c\x69\x63\x65\x73\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x3c\x74\x69\x6d\x65\x20\x71\x75\x61\x6e\x74\x69\
+\x74\x79\x3d\x22\x33\x22\x20\x75\x6e\x69\x74\x3d\x22\x6d\x69\x6e\
+\x75\x74\x65\x73\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6d\x65\x74\
+\x68\x6f\x64\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\
+\x65\x70\x3e\x31\x2e\x20\x53\x6c\x69\x63\x65\x20\x74\x68\x65\x20\
+\x62\x72\x65\x61\x64\x20\x61\x6e\x64\x20\x63\x68\x65\x65\x73\x65\
+\x2e\x3c\x2f\x73\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x73\x74\x65\x70\x3e\x32\x2e\x20\x47\x72\x69\x6c\x6c\x20\
+\x6f\x6e\x65\x20\x73\x69\x64\x65\x20\x6f\x66\x20\x65\x61\x63\x68\
+\x20\x73\x6c\x69\x63\x65\x20\x6f\x66\x20\x62\x72\x65\x61\x64\x2e\
+\x3c\x2f\x73\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x73\x74\x65\x70\x3e\x33\x2e\x20\x54\x75\x72\x6e\x20\x6f\x76\
+\x65\x72\x20\x74\x68\x65\x20\x62\x72\x65\x61\x64\x20\x61\x6e\x64\
+\x20\x70\x6c\x61\x63\x65\x20\x61\x20\x73\x6c\x69\x63\x65\x20\x6f\
+\x66\x20\x63\x68\x65\x65\x73\x65\x20\x6f\x6e\x20\x65\x61\x63\x68\
+\x20\x70\x69\x65\x63\x65\x2e\x3c\x2f\x73\x74\x65\x70\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x65\x70\x3e\x34\x2e\x20\
+\x47\x72\x69\x6c\x6c\x20\x75\x6e\x74\x69\x6c\x20\x74\x68\x65\x20\
+\x63\x68\x65\x65\x73\x65\x20\x68\x61\x73\x20\x73\x74\x61\x72\x74\
+\x65\x64\x20\x74\x6f\x20\x6d\x65\x6c\x74\x2e\x3c\x2f\x73\x74\x65\
+\x70\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x65\x70\
+\x3e\x35\x2e\x20\x53\x65\x72\x76\x65\x20\x61\x6e\x64\x20\x65\x6e\
+\x6a\x6f\x79\x21\x3c\x2f\x73\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\
+\x3c\x2f\x6d\x65\x74\x68\x6f\x64\x3e\x0a\x3c\x2f\x72\x65\x63\x69\
+\x70\x65\x3e\x0a\
+\x00\x00\x03\xbb\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x3f\x3e\x0a\x3c\x78\x73\x64\x3a\x73\x63\x68\x65\x6d\x61\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x73\x64\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
+\x30\x31\x2f\x58\x4d\x4c\x53\x63\x68\x65\x6d\x61\x22\x3e\x0a\x0a\
+\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\
+\x20\x6e\x61\x6d\x65\x3d\x22\x63\x6f\x6e\x74\x61\x63\x74\x22\x3e\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x63\x6f\
+\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x73\x65\x71\x75\
+\x65\x6e\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\
+\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x67\x69\x76\x65\x6e\x4e\x61\
+\x6d\x65\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x73\x74\
+\x72\x69\x6e\x67\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\
+\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x66\x61\x6d\x69\x6c\
+\x79\x4e\x61\x6d\x65\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\
+\x3a\x73\x74\x72\x69\x6e\x67\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\
+\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x62\x69\
+\x72\x74\x68\x64\x61\x74\x65\x22\x20\x74\x79\x70\x65\x3d\x22\x78\
+\x73\x64\x3a\x64\x61\x74\x65\x22\x20\x6d\x69\x6e\x4f\x63\x63\x75\
+\x72\x73\x3d\x22\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\
+\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x68\x6f\x6d\x65\
+\x41\x64\x64\x72\x65\x73\x73\x22\x20\x74\x79\x70\x65\x3d\x22\x61\
+\x64\x64\x72\x65\x73\x73\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\
+\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x77\x6f\x72\
+\x6b\x41\x64\x64\x72\x65\x73\x73\x22\x20\x74\x79\x70\x65\x3d\x22\
+\x61\x64\x64\x72\x65\x73\x73\x22\x20\x6d\x69\x6e\x4f\x63\x63\x75\
+\x72\x73\x3d\x22\x30\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x73\x65\x71\x75\x65\
+\x6e\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x2f\x78\
+\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\
+\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\
+\x74\x3e\x0a\x0a\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x63\x6f\x6d\
+\x70\x6c\x65\x78\x54\x79\x70\x65\x20\x6e\x61\x6d\x65\x3d\x22\x61\
+\x64\x64\x72\x65\x73\x73\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x78\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\x63\x65\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\
+\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x73\
+\x74\x72\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\
+\x3a\x73\x74\x72\x69\x6e\x67\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\
+\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x7a\x69\x70\x43\x6f\x64\
+\x65\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x73\x74\x72\
+\x69\x6e\x67\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\
+\x6e\x61\x6d\x65\x3d\x22\x63\x69\x74\x79\x22\x20\x74\x79\x70\x65\
+\x3d\x22\x78\x73\x64\x3a\x73\x74\x72\x69\x6e\x67\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\
+\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x63\
+\x6f\x75\x6e\x74\x72\x79\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\
+\x64\x3a\x73\x74\x72\x69\x6e\x67\x22\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\
+\x63\x65\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x63\x6f\
+\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\x0a\x3c\x2f\x78\x73\
+\x64\x3a\x73\x63\x68\x65\x6d\x61\x3e\x0a\
+\x00\x00\x01\xb6\
+\x3c\
+\x6f\x72\x64\x65\x72\x3e\x0a\x20\x20\x20\x20\x3c\x63\x75\x73\x74\
+\x6f\x6d\x65\x72\x49\x64\x3e\x31\x39\x34\x32\x32\x33\x3c\x2f\x63\
+\x75\x73\x74\x6f\x6d\x65\x72\x49\x64\x3e\x0a\x20\x20\x20\x20\x3c\
+\x61\x72\x74\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x3e\x32\x32\x32\x34\
+\x32\x3c\x2f\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x63\x6f\x75\x6e\x74\x3e\x35\x3c\x2f\
+\x63\x6f\x75\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x61\x72\x74\
+\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\x20\x3c\x61\x72\x74\x69\x63\
+\x6c\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x61\x72\x74\
+\x69\x63\x6c\x65\x49\x64\x3e\x33\x32\x33\x37\x32\x3c\x2f\x61\x72\
+\x74\x69\x63\x6c\x65\x49\x64\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x63\x6f\x75\x6e\x74\x3e\x31\x32\x3c\x2f\x63\x6f\x75\x6e\
+\x74\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x63\x6f\x6d\x6d\
+\x65\x6e\x74\x3e\x77\x69\x74\x68\x6f\x75\x74\x20\x73\x74\x72\x69\
+\x70\x65\x73\x3c\x2f\x63\x6f\x6d\x6d\x65\x6e\x74\x3e\x0a\x20\x20\
+\x20\x20\x3c\x2f\x61\x72\x74\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\
+\x20\x3c\x61\x72\x74\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x3e\x32\x33\
+\x36\x34\x39\x3c\x2f\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x63\x6f\x75\x6e\x74\x3e\x32\
+\x3c\x2f\x63\x6f\x75\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x61\
+\x72\x74\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\x20\x3c\x64\x65\x6c\
+\x69\x76\x65\x72\x79\x44\x61\x74\x65\x3e\x32\x30\x30\x39\x2d\x30\
+\x31\x2d\x32\x33\x3c\x2f\x64\x65\x6c\x69\x76\x65\x72\x79\x44\x61\
+\x74\x65\x3e\x0a\x20\x20\x20\x20\x3c\x70\x61\x79\x65\x64\x3e\x74\
+\x72\x75\x65\x3c\x2f\x70\x61\x79\x65\x64\x3e\x0a\x3c\x2f\x6f\x72\
+\x64\x65\x72\x3e\x0a\
+\x00\x00\x02\x55\
+\x3c\
+\x72\x65\x63\x69\x70\x65\x3e\x0a\x20\x20\x20\x20\x3c\x74\x69\x74\
+\x6c\x65\x3e\x43\x68\x65\x65\x73\x65\x20\x6f\x6e\x20\x54\x6f\x61\
+\x73\x74\x3c\x2f\x74\x69\x74\x6c\x65\x3e\x0a\x20\x20\x20\x20\x3c\
+\x69\x6e\x67\x72\x65\x64\x69\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\
+\x22\x42\x72\x65\x61\x64\x22\x20\x71\x75\x61\x6e\x74\x69\x74\x79\
+\x3d\x22\x32\x22\x20\x75\x6e\x69\x74\x3d\x22\x73\x6c\x69\x63\x65\
+\x73\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x69\x6e\x67\x72\x65\x64\
+\x69\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x43\x68\x65\x65\x73\
+\x65\x22\x20\x71\x75\x61\x6e\x74\x69\x74\x79\x3d\x22\x32\x22\x20\
+\x75\x6e\x69\x74\x3d\x22\x73\x6c\x69\x63\x65\x73\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x3c\x74\x69\x6d\x65\x20\x71\x75\x61\x6e\x74\x69\
+\x74\x79\x3d\x22\x33\x22\x20\x75\x6e\x69\x74\x3d\x22\x64\x61\x79\
+\x73\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x6d\x65\x74\x68\x6f\x64\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x65\x70\x3e\
+\x31\x2e\x20\x53\x6c\x69\x63\x65\x20\x74\x68\x65\x20\x62\x72\x65\
+\x61\x64\x20\x61\x6e\x64\x20\x63\x68\x65\x65\x73\x65\x2e\x3c\x2f\
+\x73\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\
+\x74\x65\x70\x3e\x32\x2e\x20\x47\x72\x69\x6c\x6c\x20\x6f\x6e\x65\
+\x20\x73\x69\x64\x65\x20\x6f\x66\x20\x65\x61\x63\x68\x20\x73\x6c\
+\x69\x63\x65\x20\x6f\x66\x20\x62\x72\x65\x61\x64\x2e\x3c\x2f\x73\
+\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\
+\x65\x70\x3e\x33\x2e\x20\x54\x75\x72\x6e\x20\x6f\x76\x65\x72\x20\
+\x74\x68\x65\x20\x62\x72\x65\x61\x64\x20\x61\x6e\x64\x20\x70\x6c\
+\x61\x63\x65\x20\x61\x20\x73\x6c\x69\x63\x65\x20\x6f\x66\x20\x63\
+\x68\x65\x65\x73\x65\x20\x6f\x6e\x20\x65\x61\x63\x68\x20\x70\x69\
+\x65\x63\x65\x2e\x3c\x2f\x73\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x73\x74\x65\x70\x3e\x34\x2e\x20\x47\x72\x69\
+\x6c\x6c\x20\x75\x6e\x74\x69\x6c\x20\x74\x68\x65\x20\x63\x68\x65\
+\x65\x73\x65\x20\x68\x61\x73\x20\x73\x74\x61\x72\x74\x65\x64\x20\
+\x74\x6f\x20\x6d\x65\x6c\x74\x2e\x3c\x2f\x73\x74\x65\x70\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x65\x70\x3e\x35\x2e\
+\x20\x53\x65\x72\x76\x65\x20\x61\x6e\x64\x20\x65\x6e\x6a\x6f\x79\
+\x21\x3c\x2f\x73\x74\x65\x70\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6d\
+\x65\x74\x68\x6f\x64\x3e\x0a\x20\x20\x20\x20\x3c\x63\x6f\x6d\x6d\
+\x65\x6e\x74\x3e\x54\x65\x6c\x6c\x20\x79\x6f\x75\x72\x20\x66\x72\
+\x69\x65\x6e\x64\x73\x20\x61\x62\x6f\x75\x74\x20\x69\x74\x21\x3c\
+\x2f\x63\x6f\x6d\x6d\x65\x6e\x74\x3e\x0a\x3c\x2f\x72\x65\x63\x69\
+\x70\x65\x3e\x0a\
+\x00\x00\x06\x05\
+\x3c\
+\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
+\x30\x22\x3f\x3e\x0a\x3c\x78\x73\x64\x3a\x73\x63\x68\x65\x6d\x61\
+\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x73\x64\x3d\x22\x68\x74\x74\x70\
+\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\
+\x30\x31\x2f\x58\x4d\x4c\x53\x63\x68\x65\x6d\x61\x22\x3e\x0a\x0a\
+\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\
+\x20\x6e\x61\x6d\x65\x3d\x22\x72\x65\x63\x69\x70\x65\x22\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x63\x6f\x6d\
+\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x73\x65\x71\x75\x65\
+\x6e\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\
+\x74\x20\x6e\x61\x6d\x65\x3d\x22\x74\x69\x74\x6c\x65\x22\x20\x74\
+\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x73\x74\x72\x69\x6e\x67\x22\
+\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\
+\x6e\x61\x6d\x65\x3d\x22\x69\x6e\x67\x72\x65\x64\x69\x65\x6e\x74\
+\x22\x20\x74\x79\x70\x65\x3d\x22\x69\x6e\x67\x72\x65\x64\x69\x65\
+\x6e\x74\x54\x79\x70\x65\x22\x20\x6d\x61\x78\x4f\x63\x63\x75\x72\
+\x73\x3d\x22\x75\x6e\x62\x6f\x75\x6e\x64\x65\x64\x22\x2f\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\
+\x65\x3d\x22\x74\x69\x6d\x65\x22\x20\x74\x79\x70\x65\x3d\x22\x74\
+\x69\x6d\x65\x54\x79\x70\x65\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\
+\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\x65\x3d\x22\x6d\x65\
+\x74\x68\x6f\x64\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\
+\x63\x6f\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\
+\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x20\x6e\x61\x6d\
+\x65\x3d\x22\x73\x74\x65\x70\x22\x20\x74\x79\x70\x65\x3d\x22\x78\
+\x73\x64\x3a\x73\x74\x72\x69\x6e\x67\x22\x20\x6d\x61\x78\x4f\x63\
+\x63\x75\x72\x73\x3d\x22\x75\x6e\x62\x6f\x75\x6e\x64\x65\x64\x22\
+\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\
+\x3a\x73\x65\x71\x75\x65\x6e\x63\x65\x3e\x0a\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\
+\x2f\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x3c\x2f\x78\x73\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x3e\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x2f\x78\
+\x73\x64\x3a\x73\x65\x71\x75\x65\x6e\x63\x65\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\
+\x65\x78\x54\x79\x70\x65\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x78\x73\
+\x64\x3a\x65\x6c\x65\x6d\x65\x6e\x74\x3e\x0a\x0a\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\
+\x20\x6e\x61\x6d\x65\x3d\x22\x69\x6e\x67\x72\x65\x64\x69\x65\x6e\
+\x74\x54\x79\x70\x65\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x61\x74\x74\x72\x69\x62\x75\x74\x65\x20\x6e\
+\x61\x6d\x65\x3d\x22\x6e\x61\x6d\x65\x22\x20\x74\x79\x70\x65\x3d\
+\x22\x78\x73\x64\x3a\x73\x74\x72\x69\x6e\x67\x22\x2f\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x61\x74\x74\x72\
+\x69\x62\x75\x74\x65\x20\x6e\x61\x6d\x65\x3d\x22\x71\x75\x61\x6e\
+\x74\x69\x74\x79\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\
+\x70\x6f\x73\x69\x74\x69\x76\x65\x49\x6e\x74\x65\x67\x65\x72\x22\
+\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\
+\x61\x74\x74\x72\x69\x62\x75\x74\x65\x20\x6e\x61\x6d\x65\x3d\x22\
+\x75\x6e\x69\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\
+\x73\x74\x72\x69\x6e\x67\x22\x2f\x3e\x0a\x20\x20\x20\x20\x3c\x2f\
+\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\x78\x54\x79\x70\x65\x3e\
+\x0a\x0a\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\
+\x65\x78\x54\x79\x70\x65\x20\x6e\x61\x6d\x65\x3d\x22\x74\x69\x6d\
+\x65\x54\x79\x70\x65\x22\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x3c\x78\x73\x64\x3a\x61\x74\x74\x72\x69\x62\x75\x74\x65\x20\x6e\
+\x61\x6d\x65\x3d\x22\x71\x75\x61\x6e\x74\x69\x74\x79\x22\x20\x74\
+\x79\x70\x65\x3d\x22\x78\x73\x64\x3a\x70\x6f\x73\x69\x74\x69\x76\
+\x65\x49\x6e\x74\x65\x67\x65\x72\x22\x2f\x3e\x0a\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x61\x74\x74\x72\x69\x62\x75\
+\x74\x65\x20\x6e\x61\x6d\x65\x3d\x22\x75\x6e\x69\x74\x22\x3e\x0a\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\
+\x3a\x73\x69\x6d\x70\x6c\x65\x54\x79\x70\x65\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\
+\x64\x3a\x72\x65\x73\x74\x72\x69\x63\x74\x69\x6f\x6e\x20\x62\x61\
+\x73\x65\x3d\x22\x78\x73\x64\x3a\x73\x74\x72\x69\x6e\x67\x22\x3e\
+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6e\x75\x6d\x65\x72\
+\x61\x74\x69\x6f\x6e\x20\x76\x61\x6c\x75\x65\x3d\x22\x73\x65\x63\
+\x6f\x6e\x64\x73\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x78\x73\x64\
+\x3a\x65\x6e\x75\x6d\x65\x72\x61\x74\x69\x6f\x6e\x20\x76\x61\x6c\
+\x75\x65\x3d\x22\x6d\x69\x6e\x75\x74\x65\x73\x22\x2f\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x78\x73\x64\x3a\x65\x6e\x75\x6d\x65\x72\x61\x74\
+\x69\x6f\x6e\x20\x76\x61\x6c\x75\x65\x3d\x22\x68\x6f\x75\x72\x73\
+\x22\x2f\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x72\x65\x73\x74\x72\x69\
+\x63\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\
+\x20\x20\x20\x3c\x2f\x78\x73\x64\x3a\x73\x69\x6d\x70\x6c\x65\x54\
+\x79\x70\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x2f\x78\
+\x73\x64\x3a\x61\x74\x74\x72\x69\x62\x75\x74\x65\x3e\x0a\x20\x20\
+\x20\x20\x3c\x2f\x78\x73\x64\x3a\x63\x6f\x6d\x70\x6c\x65\x78\x54\
+\x79\x70\x65\x3e\x0a\x0a\x3c\x2f\x78\x73\x64\x3a\x73\x63\x68\x65\
+\x6d\x61\x3e\x0a\
+\x00\x00\x01\x2e\
+\x3c\
+\x6f\x72\x64\x65\x72\x3e\x0a\x20\x20\x20\x20\x3c\x63\x75\x73\x74\
+\x6f\x6d\x65\x72\x49\x64\x3e\x32\x33\x34\x32\x31\x39\x3c\x2f\x63\
+\x75\x73\x74\x6f\x6d\x65\x72\x49\x64\x3e\x0a\x20\x20\x20\x20\x3c\
+\x61\x72\x74\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x3e\x32\x31\x36\x39\
+\x32\x3c\x2f\x61\x72\x74\x69\x63\x6c\x65\x49\x64\x3e\x0a\x20\x20\
+\x20\x20\x20\x20\x20\x20\x3c\x63\x6f\x75\x6e\x74\x3e\x33\x3c\x2f\
+\x63\x6f\x75\x6e\x74\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x61\x72\x74\
+\x69\x63\x6c\x65\x3e\x0a\x20\x20\x20\x20\x3c\x61\x72\x74\x69\x63\
+\x6c\x65\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x61\x72\x74\
+\x69\x63\x6c\x65\x49\x64\x3e\x32\x34\x37\x34\x39\x3c\x2f\x61\x72\
+\x74\x69\x63\x6c\x65\x49\x64\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x63\x6f\x75\x6e\x74\x3e\x39\x3c\x2f\x63\x6f\x75\x6e\x74\
+\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x61\x72\x74\x69\x63\x6c\x65\x3e\
+\x0a\x20\x20\x20\x20\x3c\x64\x65\x6c\x69\x76\x65\x72\x79\x44\x61\
+\x74\x65\x3e\x32\x30\x30\x39\x2d\x30\x31\x2d\x32\x33\x3c\x2f\x64\
+\x65\x6c\x69\x76\x65\x72\x79\x44\x61\x74\x65\x3e\x0a\x20\x20\x20\
+\x20\x3c\x70\x61\x79\x65\x64\x3e\x79\x65\x73\x3c\x2f\x70\x61\x79\
+\x65\x64\x3e\x0a\x3c\x2f\x6f\x72\x64\x65\x72\x3e\x0a\
+\x00\x00\x01\x2a\
+\x3c\
+\x63\x6f\x6e\x74\x61\x63\x74\x3e\x0a\x20\x20\x20\x20\x3c\x67\x69\
+\x76\x65\x6e\x4e\x61\x6d\x65\x3e\x4a\x6f\x68\x6e\x3c\x2f\x67\x69\
+\x76\x65\x6e\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x66\x61\
+\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x3e\x44\x6f\x65\x3c\x2f\x66\x61\
+\x6d\x69\x6c\x79\x4e\x61\x6d\x65\x3e\x0a\x20\x20\x20\x20\x3c\x62\
+\x69\x72\x74\x68\x64\x61\x74\x65\x3e\x31\x39\x37\x37\x2d\x31\x32\
+\x2d\x32\x35\x3c\x2f\x62\x69\x72\x74\x68\x64\x61\x74\x65\x3e\x0a\
+\x20\x20\x20\x20\x3c\x68\x6f\x6d\x65\x41\x64\x64\x72\x65\x73\x73\
+\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\x72\x65\x65\
+\x74\x3e\x53\x61\x6e\x64\x61\x6b\x65\x72\x76\x65\x69\x65\x6e\x20\
+\x31\x31\x36\x3c\x2f\x73\x74\x72\x65\x65\x74\x3e\x0a\x20\x20\x20\
+\x20\x20\x20\x20\x20\x3c\x7a\x69\x70\x43\x6f\x64\x65\x3e\x4e\x2d\
+\x30\x35\x35\x30\x3c\x2f\x7a\x69\x70\x43\x6f\x64\x65\x3e\x0a\x20\
+\x20\x20\x20\x20\x20\x20\x20\x3c\x63\x69\x74\x79\x3e\x4f\x73\x6c\
+\x6f\x3c\x2f\x63\x69\x74\x79\x3e\x0a\x20\x20\x20\x20\x20\x20\x20\
+\x20\x3c\x63\x6f\x75\x6e\x74\x72\x79\x3e\x4e\x6f\x72\x77\x61\x79\
+\x3c\x2f\x63\x6f\x75\x6e\x74\x72\x79\x3e\x0a\x20\x20\x20\x20\x3c\
+\x2f\x68\x6f\x6d\x65\x41\x64\x64\x72\x65\x73\x73\x3e\x0a\x3c\x2f\
+\x63\x6f\x6e\x74\x61\x63\x74\x3e\x0a\
+"
+
+qt_resource_name = b"\
+\x00\x0c\
+\x08\x16\x87\xf4\
+\x00\x73\
+\x00\x63\x00\x68\x00\x65\x00\x6d\x00\x61\x00\x5f\x00\x32\x00\x2e\x00\x78\x00\x73\x00\x64\
+\x00\x0e\
+\x00\x79\x4a\x1c\
+\x00\x69\
+\x00\x6e\x00\x73\x00\x74\x00\x61\x00\x6e\x00\x63\x00\x65\x00\x5f\x00\x31\x00\x2e\x00\x78\x00\x6d\x00\x6c\
+\x00\x0e\
+\x00\x70\x4a\x1c\
+\x00\x69\
+\x00\x6e\x00\x73\x00\x74\x00\x61\x00\x6e\x00\x63\x00\x65\x00\x5f\x00\x32\x00\x2e\x00\x78\x00\x6d\x00\x6c\
+\x00\x0c\
+\x08\x10\x87\xf4\
+\x00\x73\
+\x00\x63\x00\x68\x00\x65\x00\x6d\x00\x61\x00\x5f\x00\x30\x00\x2e\x00\x78\x00\x73\x00\x64\
+\x00\x0e\
+\x00\x72\x4a\x1c\
+\x00\x69\
+\x00\x6e\x00\x73\x00\x74\x00\x61\x00\x6e\x00\x63\x00\x65\x00\x5f\x00\x34\x00\x2e\x00\x78\x00\x6d\x00\x6c\
+\x00\x0e\
+\x00\x73\x4a\x1c\
+\x00\x69\
+\x00\x6e\x00\x73\x00\x74\x00\x61\x00\x6e\x00\x63\x00\x65\x00\x5f\x00\x33\x00\x2e\x00\x78\x00\x6d\x00\x6c\
+\x00\x0c\
+\x08\x13\x87\xf4\
+\x00\x73\
+\x00\x63\x00\x68\x00\x65\x00\x6d\x00\x61\x00\x5f\x00\x31\x00\x2e\x00\x78\x00\x73\x00\x64\
+\x00\x0e\
+\x00\x75\x4a\x1c\
+\x00\x69\
+\x00\x6e\x00\x73\x00\x74\x00\x61\x00\x6e\x00\x63\x00\x65\x00\x5f\x00\x35\x00\x2e\x00\x78\x00\x6d\x00\x6c\
+\x00\x0e\
+\x00\x76\x4a\x1c\
+\x00\x69\
+\x00\x6e\x00\x73\x00\x74\x00\x61\x00\x6e\x00\x63\x00\x65\x00\x5f\x00\x30\x00\x2e\x00\x78\x00\x6d\x00\x6c\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x01\
+\x00\x00\x00\x40\x00\x00\x00\x00\x00\x01\x00\x00\x04\x8c\
+\x00\x00\x00\x80\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x74\
+\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x2e\
+\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x14\x90\
+\x00\x00\x01\x04\x00\x00\x00\x00\x00\x01\x00\x00\x15\xc2\
+\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x03\x6b\
+\x00\x00\x00\x62\x00\x00\x00\x00\x00\x01\x00\x00\x06\xb5\
+\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x87\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+"
+
+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()
diff --git a/examples/xmlpatterns/schema/ui_schema.py b/examples/xmlpatterns/schema/ui_schema.py
new file mode 100644
index 000000000..a5690c28d
--- /dev/null
+++ b/examples/xmlpatterns/schema/ui_schema.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'schema.ui'
+#
+# Created: Fri Feb 5 15:27:54 2010
+# by: PyQt4 UI code generator snapshot-4.7.1-c39e85a8e2ec
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide2 import QtCore, QtGui, QtWidgets
+
+class Ui_SchemaMainWindow(object):
+ def setupUi(self, SchemaMainWindow):
+ SchemaMainWindow.setObjectName("SchemaMainWindow")
+ SchemaMainWindow.resize(417, 594)
+ self.centralwidget = QtWidgets.QWidget(SchemaMainWindow)
+ self.centralwidget.setObjectName("centralwidget")
+ self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
+ self.gridLayout.setObjectName("gridLayout")
+ self.schemaLabel = QtWidgets.QLabel(self.centralwidget)
+ self.schemaLabel.setObjectName("schemaLabel")
+ self.gridLayout.addWidget(self.schemaLabel, 0, 0, 1, 2)
+ self.schemaSelection = QtWidgets.QComboBox(self.centralwidget)
+ self.schemaSelection.setObjectName("schemaSelection")
+ self.gridLayout.addWidget(self.schemaSelection, 0, 2, 1, 2)
+ self.schemaView = QtWidgets.QTextBrowser(self.centralwidget)
+ self.schemaView.setObjectName("schemaView")
+ self.gridLayout.addWidget(self.schemaView, 1, 0, 1, 4)
+ self.instanceLabel = QtWidgets.QLabel(self.centralwidget)
+ self.instanceLabel.setObjectName("instanceLabel")
+ self.gridLayout.addWidget(self.instanceLabel, 2, 0, 1, 2)
+ self.instanceSelection = QtWidgets.QComboBox(self.centralwidget)
+ self.instanceSelection.setObjectName("instanceSelection")
+ self.gridLayout.addWidget(self.instanceSelection, 2, 2, 1, 2)
+ self.instanceEdit = QtWidgets.QTextEdit(self.centralwidget)
+ self.instanceEdit.setObjectName("instanceEdit")
+ self.gridLayout.addWidget(self.instanceEdit, 3, 0, 1, 4)
+ self.label = QtWidgets.QLabel(self.centralwidget)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 4, 0, 1, 1)
+ self.validationStatus = QtWidgets.QLabel(self.centralwidget)
+ self.validationStatus.setObjectName("validationStatus")
+ self.gridLayout.addWidget(self.validationStatus, 4, 1, 1, 2)
+ self.validateButton = QtWidgets.QPushButton(self.centralwidget)
+ self.validateButton.setObjectName("validateButton")
+ self.gridLayout.addWidget(self.validateButton, 4, 3, 1, 1)
+ SchemaMainWindow.setCentralWidget(self.centralwidget)
+ self.statusbar = QtWidgets.QStatusBar(SchemaMainWindow)
+ self.statusbar.setObjectName("statusbar")
+ SchemaMainWindow.setStatusBar(self.statusbar)
+
+ self.retranslateUi(SchemaMainWindow)
+ QtCore.QMetaObject.connectSlotsByName(SchemaMainWindow)
+
+ def retranslateUi(self, SchemaMainWindow):
+ SchemaMainWindow.setWindowTitle(QtWidgets.QApplication.translate("SchemaMainWindow", "XML Schema Validation", None))
+ self.schemaLabel.setText(QtWidgets.QApplication.translate("SchemaMainWindow", "XML Schema Document:", None))
+ self.instanceLabel.setText(QtWidgets.QApplication.translate("SchemaMainWindow", "XML Instance Document:", None))
+ self.label.setText(QtWidgets.QApplication.translate("SchemaMainWindow", "Status:", None))
+ self.validationStatus.setText(QtWidgets.QApplication.translate("SchemaMainWindow", "not validated", None))
+ self.validateButton.setText(QtWidgets.QApplication.translate("SchemaMainWindow", "Validate", None))
+
diff --git a/ez_setup.py b/ez_setup.py
index a523401e9..eee5013c4 100644
--- a/ez_setup.py
+++ b/ez_setup.py
@@ -1,4 +1,43 @@
#!/usr/bin/env python
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
"""Bootstrap setuptools installation
To use setuptools in your package's setup.py, include this
diff --git a/sources/pyside2/header.BSD-OLD b/header.BSD-OLD
index 5d73a99e9..687705fee 100644
--- a/sources/pyside2/header.BSD-OLD
+++ b/header.BSD-OLD
@@ -37,4 +37,3 @@
** $QT_END_LICENSE$
**
****************************************************************************/
-
diff --git a/missing_bindings.py b/missing_bindings.py
index 1b7b42441..894fdbd58 100644
--- a/missing_bindings.py
+++ b/missing_bindings.py
@@ -201,7 +201,9 @@ types_to_ignore.add('QSqlDriverPlugin')
qt_documentation_website_prefixes = OrderedDict()
qt_documentation_website_prefixes['5.6'] = 'http://doc.qt.io/qt-5.6/'
qt_documentation_website_prefixes['5.8'] = 'http://doc.qt.io/qt-5.8/'
-qt_documentation_website_prefixes['5.9'] = 'http://doc-snapshots.qt.io/qt5-5.9/'
+qt_documentation_website_prefixes['5.9'] = 'http://doc.qt.io/qt-5.9/'
+qt_documentation_website_prefixes['5.10'] = 'http://doc.qt.io/qt-5.10/'
+qt_documentation_website_prefixes['5.11'] = 'http://doc-snapshots.qt.io/qt5-5.11/'
qt_documentation_website_prefixes['dev'] = 'http://doc-snapshots.qt.io/qt5-dev/'
diff --git a/popenasync.py b/popenasync.py
index eb1a238fc..eedc2fd8b 100644
--- a/popenasync.py
+++ b/popenasync.py
@@ -1,3 +1,42 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
################################################################################
"""
@@ -29,10 +68,10 @@ if mswindows:
if sys.version_info >= (3,):
# Test date should be in ascii.
def encode(s):
- return s.encode('ascii')
-
+ return s.encode('ascii', 'ignore')
+
def decode(b):
- return b.decode('ascii')
+ return b.decode('ascii', 'ignore')
else:
# Strings only; do nothing
def encode(s):
diff --git a/prepare_coin_sources.py b/prepare_coin_sources.py
index 24dae1551..7ef291d77 100644
--- a/prepare_coin_sources.py
+++ b/prepare_coin_sources.py
@@ -51,8 +51,7 @@ QT_CI_TESTED_SUBMODULE = option_value("module")
SUBMODULE_BRANCH = option_value("branch")
submodules = {
- "pyside2-tools" : "pyside-tools",
- "pyside2-examples" : "examples"
+ "pyside2-tools" : "pyside-tools"
}
def usage():
diff --git a/qtinfo.py b/qtinfo.py
index 606bc6804..c61e796b0 100644
--- a/qtinfo.py
+++ b/qtinfo.py
@@ -1,3 +1,42 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
import os, sys, re, subprocess
from distutils.spawn import find_executable
diff --git a/setup.py b/setup.py
index 5f5235da3..ccce48e9c 100644
--- a/setup.py
+++ b/setup.py
@@ -38,6 +38,7 @@
#############################################################################
from __future__ import print_function
+from distutils.version import LooseVersion
"""This is a distutils setup-script for the PySide2 project
@@ -131,7 +132,6 @@ from utils import memoize, has_option, get_python_dict
OPTION_SNAPSHOT_BUILD = has_option("snapshot-build")
script_dir = os.getcwd()
-
@memoize
def get_package_timestamp():
return int(time.time())
@@ -207,7 +207,7 @@ except ImportError:
pass
from qtinfo import QtInfo
-from utils import rmtree
+from utils import rmtree, detectClang
from utils import makefile
from utils import copyfile
from utils import copydir
@@ -279,8 +279,10 @@ OPTION_REUSE_BUILD = has_option("reuse-build")
OPTION_SKIP_CMAKE = has_option("skip-cmake")
OPTION_SKIP_MAKE_INSTALL = has_option("skip-make-install")
OPTION_SKIP_PACKAGING = has_option("skip-packaging")
+OPTION_MODULE_SUBSET = option_value("module-subset")
OPTION_RPATH_VALUES = option_value("rpath")
OPTION_QT_CONF_PREFIX = option_value("qt-conf-prefix")
+OPTION_QT_SRC = option_value("qt-src-dir")
OPTION_ICULIB = option_value("iculib-url") # Deprecated
OPTION_VERBOSE_BUILD = has_option("verbose-build")
OPTION_SANITIZE_ADDRESS = has_option("sanitize-address")
@@ -363,6 +365,9 @@ this_file = os.path.abspath(this_file)
if os.path.dirname(this_file):
os.chdir(os.path.dirname(this_file))
+def is_debug_python():
+ return getattr(sys, "gettotalrefcount", None) is not None
+
if OPTION_NOEXAMPLES:
# Remove pyside2-examples from submodules so they will not be included.
for idx, item in enumerate(submodules):
@@ -376,6 +381,8 @@ def prefix():
name += str(sys.version_info[0])
if OPTION_DEBUG:
name += 'd'
+ if is_debug_python():
+ name += 'p'
return name
# Initialize, pull and checkout submodules
@@ -444,10 +451,14 @@ def prepareBuild():
pkg_dir = os.path.join(script_dir, pkg)
os.makedirs(pkg_dir)
# locate Qt sources for the documentation
- qt_src_dir = qtinfo.src_dir
- if qt_src_dir:
- global qtSrcDir
- qtSrcDir = qt_src_dir
+ if OPTION_QT_SRC is None:
+ installPrefix = qtinfo.prefix_dir
+ if installPrefix:
+ global qtSrcDir
+ if installPrefix.endswith("qtbase"): # In-source, developer build
+ qtSrcDir = installPrefix
+ else: # SDK: Use 'Src' directory
+ qtSrcDir = os.path.join(os.path.dirname(installPrefix), 'Src', 'qtbase')
class pyside_install(_install):
def __init__(self, *args, **kwargs):
@@ -763,7 +774,20 @@ class pyside_build(_build):
qt_version = get_qt_version()
# Update the PATH environment variable
- update_env_path([py_scripts_dir, qt_dir])
+ additionalPaths = [py_scripts_dir, qt_dir]
+
+ # Add Clang to path for Windows. Revisit once Clang is bundled with Qt.
+ if sys.platform == "win32" and LooseVersion(self.qtinfo.version) >= LooseVersion("5.7.0"):
+ clangDir = detectClang()
+ if clangDir[0]:
+ clangBinDir = os.path.join(clangDir[0], 'bin')
+ if not clangBinDir in os.environ.get('PATH'):
+ log.info("Adding %s as detected by %s to PATH" % (clangBinDir, clangDir[1]))
+ additionalPaths.append(clangBinDir)
+ else:
+ log.error("Failed to detect Clang by checking LLVM_INSTALL_DIR, CLANG_INSTALL_DIR, llvm-config")
+
+ update_env_path(additionalPaths)
build_name = "py%s-qt%s-%s-%s" % \
(py_version, qt_version, platform.architecture()[0], build_type.lower())
@@ -800,6 +824,9 @@ class pyside_build(_build):
if OPTION_FINAL_INSTALL_PREFIX:
setuptools_install_prefix = OPTION_FINAL_INSTALL_PREFIX
+ # Save the shiboken build dir path for clang deployment purposes.
+ self.shiboken_build_dir = os.path.join(self.build_dir, "shiboken2")
+
log.info("=" * 30)
log.info("Package version: %s" % get_package_version())
log.info("Build type: %s" % self.build_type)
@@ -1007,9 +1034,20 @@ class pyside_build(_build):
cmake_cmd.append("-DPYTHON_EXECUTABLE=%s" % self.py_executable)
cmake_cmd.append("-DPYTHON_INCLUDE_DIR=%s" % self.py_include_dir)
cmake_cmd.append("-DPYTHON_LIBRARY=%s" % self.py_library)
+ if OPTION_MODULE_SUBSET:
+ moduleSubSet = ''
+ for m in OPTION_MODULE_SUBSET.split(','):
+ if m.startswith('Qt'):
+ m = m[2:]
+ if moduleSubSet:
+ moduleSubSet += ';'
+ moduleSubSet += m
+ cmake_cmd.append("-DMODULES=%s" % moduleSubSet)
# Add source location for generating documentation
- if qtSrcDir:
- cmake_cmd.append("-DQT_SRC_DIR=%s" % qtSrcDir)
+ cmake_src_dir = OPTION_QT_SRC if OPTION_QT_SRC else qtSrcDir
+ cmake_cmd.append("-DQT_SRC_DIR=%s" % cmake_src_dir)
+ log.info("Qt Source dir: %s" % cmake_src_dir)
+
if self.build_type.lower() == 'debug':
cmake_cmd.append("-DPYTHON_DEBUG_LIBRARY=%s" % self.py_library)
@@ -1240,12 +1278,10 @@ class pyside_build(_build):
"{pyside_package_dir}/PySide2/support",
vars=vars)
if not OPTION_NOEXAMPLES:
- # <sources>/pyside2-examples/examples/* -> <setup>/PySide2/examples
- folder = get_extension_folder('pyside2-examples')
- copydir(
- "{sources_dir}/%s/examples" % folder,
- "{pyside_package_dir}/PySide2/examples",
- force=False, vars=vars)
+ # examples/* -> <setup>/PySide2/examples
+ copydir(os.path.join(self.script_dir, "examples"),
+ "{pyside_package_dir}/PySide2/examples",
+ force=False, vars=vars)
# Re-generate examples Qt resource files for Python 3 compatibility
if sys.version_info[0] == 3:
examples_path = "{pyside_package_dir}/PySide2/examples".format(**vars)
@@ -1261,6 +1297,9 @@ class pyside_build(_build):
else:
self.prepare_standalone_package_linux(executables, vars)
+ # Copy over clang before rpath patching.
+ self.prepare_standalone_clang(is_win=False)
+
# Update rpath to $ORIGIN
if sys.platform.startswith('linux') or sys.platform.startswith('darwin'):
self.update_rpath("{pyside_package_dir}/PySide2".format(**vars), executables)
@@ -1519,12 +1558,10 @@ class pyside_build(_build):
vars=vars)
if not OPTION_NOEXAMPLES:
- # <sources>/pyside2-examples/examples/* -> <setup>/PySide2/examples
- folder = get_extension_folder('pyside2-examples')
- copydir(
- "{sources_dir}/%s/examples" % folder,
- "{pyside_package_dir}/PySide2/examples",
- force=False, vars=vars)
+ # examples/* -> <setup>/PySide2/examples
+ copydir(os.path.join(self.script_dir, "examples"),
+ "{pyside_package_dir}/PySide2/examples",
+ force=False, vars=vars)
# Re-generate examples Qt resource files for Python 3 compatibility
if sys.version_info[0] == 3:
examples_path = "{pyside_package_dir}/PySide2/examples".format(**vars)
@@ -1649,6 +1686,8 @@ class pyside_build(_build):
filter=[filter],
recursive=False, vars=vars)
+ self.prepare_standalone_clang(is_win=True)
+
# pdb files for libshiboken and libpyside
copydir(
"{build_dir}/shiboken2/libshiboken",
@@ -1661,6 +1700,56 @@ class pyside_build(_build):
filter=pdbs,
recursive=False, vars=vars)
+ def prepare_standalone_clang(self, is_win = False):
+ """ Copies the libclang library to the pyside package so that shiboken exceutable works. """
+ log.info('Finding path to the libclang shared library.')
+ cmake_cmd = [
+ OPTION_CMAKE,
+ "-L", # Lists variables
+ "-N", # Just inspects the cache (faster)
+ "--build", # Specifies the build dir
+ self.shiboken_build_dir
+ ]
+ out = run_process_output(cmake_cmd)
+ lines = [s.strip() for s in out]
+ pattern = re.compile(r"CLANG_LIBRARY:FILEPATH=(.+)$")
+
+ clang_lib_path = None
+ for line in lines:
+ match = pattern.search(line)
+ if match:
+ clang_lib_path = match.group(1)
+ break
+
+ if not clang_lib_path:
+ raise RuntimeError("Could not finding location of libclang library from CMake cache.")
+
+ if is_win:
+ # clang_lib_path points to the static import library (lib/libclang.lib), whereas we want
+ # to copy the shared library (bin/libclang.dll).
+ clang_lib_path = re.sub(r'lib/libclang.lib$', 'bin/libclang.dll', clang_lib_path)
+
+ # Path to directory containing clang.
+ clang_lib_dir = os.path.dirname(clang_lib_path)
+
+ # The name of the clang file found by CMake.
+ basename = os.path.basename(clang_lib_path)
+
+ # We want to copy the library and all the symlinks for now, thus the wildcard.
+ clang_filter = basename + "*"
+
+ # Destination is the package folder near the other extension modules.
+ destination_dir = "{}/PySide2".format(os.path.join(self.script_dir, 'pyside_package'))
+ if os.path.exists(clang_lib_path):
+ log.info('Copying libclang shared library to the pyside package.')
+
+ copydir(clang_lib_dir, destination_dir,
+ filter=[clang_filter],
+ recursive=False)
+ else:
+ raise RuntimeError("Error copying libclang library "
+ "from {} to {}. ".format(clang_lib_path, destination_dir))
+
def update_rpath(self, package_path, executables):
if sys.platform.startswith('linux'):
pyside_libs = [lib for lib in os.listdir(package_path) if filter_match(
diff --git a/sources/pyside2-examples b/sources/pyside2-examples
deleted file mode 160000
-Subproject 8df6dccecc5165f7c3ec5896c9be8baceda7161
diff --git a/sources/pyside2-tools b/sources/pyside2-tools
-Subproject 7fe32567c75b6b9985b9efbecf74477c9e829fb
+Subproject 413ecc73fbe6d6717ae2132e86648ac8b6da9d3
diff --git a/sources/pyside2/CMakeLists.txt b/sources/pyside2/CMakeLists.txt
index 56eadb844..4db611f0d 100644
--- a/sources/pyside2/CMakeLists.txt
+++ b/sources/pyside2/CMakeLists.txt
@@ -1,7 +1,7 @@
include(cmake/Macros/icecc.cmake) # this must be the first line!
-cmake_minimum_required(VERSION 3.0)
-cmake_policy(VERSION 3.0)
+cmake_minimum_required(VERSION 3.1)
+cmake_policy(VERSION 3.1)
# Don't ignore targets that do not exist, inside add_dependencies calls.
cmake_policy(SET CMP0046 NEW)
@@ -125,6 +125,11 @@ if(CMAKE_HOST_APPLE)
endif()
endif()
+# Force usage of the C++11 standard, without a silent fallback
+# to C++98 if the compiler does not support C++11.
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
# Qt5: QT_INCLUDE_DIR does no longer exist.
# On Windows, macOS, and Linux it can be computed from Qt5Core_INCLUDE_DIRS, which contains
# a list of include directories. We take the first one.
@@ -142,10 +147,6 @@ if (QtCore_is_framework)
# QT_INCLUDE_DIR points to the QtCore.framework directory, so we need to adjust this to point
# to the actual include directory, which has include files for non-framework parts of Qt.
get_filename_component(QT_INCLUDE_DIR "${QT_INCLUDE_DIR}/../../include" ABSOLUTE)
-
- # And then we append the framework dir, to mimic the way setup.py passed that in before to
- # the old shiboken parser.
- set(QT_INCLUDE_DIR "${QT_INCLUDE_DIR}:${QT_FRAMEWORK_INCLUDE_DIR}")
endif()
if(MSVC)
@@ -256,19 +257,51 @@ include(PySideModules)
macro(COLLECT_MODULE_IF_FOUND shortname)
set(name "Qt5${shortname}")
find_package(${name})
+ # If package is found, _name_found will be equal to 1
set(_name_found "${name}_FOUND")
- if(${_name_found})
- message(STATUS "module ${name} found (${ARGN})")
+ # _name_dir will keep the path to the directory where the CMake rules were found
+ # e.g: ~/qt5.9-install/qtbase/lib/cmake/Qt5Core or /usr/lib64/cmake/Qt5Core
+ set(_name_dir "${name}_DIR")
+ # Qt5Core will set the base path to check if all the modules are on the same
+ # directory, to avoid CMake looking in another path.
+ # This will be saved in a global variable at the beginning of the modules
+ # collection process.
+ string(FIND "${name}" "Qt5Core" qtcore_found)
+ if(("${qtcore_found}" GREATER "0") OR ("${qtcore_found}" EQUAL "0"))
+ get_filename_component(_core_abs_dir "${${_name_dir}}/../" ABSOLUTE)
+ # Setting the absolute path where the Qt5Core was found
+ # e.g: ~/qt5.9-install/qtbase/lib/cmake or /usr/lib64/cmake
+ message(STATUS "CORE_ABS_DIR:" ${_core_abs_dir})
+ endif()
+
+ # Getting the absolute path for each module where the CMake was found, to
+ # compare it with CORE_ABS_DIR and check if they are in the same source directory
+ # e.g: ~/qt5.9-install/qtbase/lib/cmake/Qt5Script or /usr/lib64/cmake/Qt5Script
+ get_filename_component(_module_dir "${${_name_dir}}" ABSOLUTE)
+ string(FIND "${_module_dir}" "${_core_abs_dir}" found_basepath)
+
+ # Determine essential/optional/missing
+ set(module_state "missing")
+ list(FIND ALL_ESSENTIAL_MODULES "${shortname}" essentialIndex)
+ if(${essentialIndex} EQUAL -1)
+ list(FIND ALL_OPTIONAL_MODULES "${shortname}" optionalIndex)
+ if(NOT ${optionalIndex} EQUAL -1)
+ set(module_state "optional")
+ endif()
+ else()
+ set(module_state "essential")
+ endif()
- # Put the module at the end of pyside2_global.h
- file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/PySide2/pyside2_global.h.add"
- "#include \"Qt${shortname}/Qt${shortname}\"\n")
+ # If the module was found, and also the module path is the same as the
+ # Qt5Core base path, we will generate the list with the modules to be install
+ if("${${_name_found}}" AND (("${found_basepath}" GREATER "0") OR ("${found_basepath}" EQUAL "0")))
+ message(STATUS "${module_state} module ${name} found (${ARGN})")
# record the shortnames for the tests
list(APPEND all_module_shortnames ${shortname})
else()
- if("${ARGN}" STREQUAL "opt")
+ if("${module_state}" STREQUAL "optional")
message(STATUS "optional module ${name} skipped")
- elseif("${ARGN}" STREQUAL "essential")
+ elseif("${module_state}" STREQUAL "essential")
message(STATUS "skipped module ${name} is essential!\n"
" We do not guarantee that all tests are working.")
else()
@@ -277,56 +310,49 @@ macro(COLLECT_MODULE_IF_FOUND shortname)
endif()
endmacro()
+# Set default values for pyside2_global.h
+set (Qt5X11Extras_FOUND "0")
+set (Qt5Test_FOUND "0")
+set (Qt5Widgets_FOUND "0")
+
+# Collect all essential modules.
# note: the order of this list is relevant for dependencies.
# For instance: Qt5Printsupport must come before Qt5WebKitWidgets.
-COLLECT_MODULE_IF_FOUND(Core)
-COLLECT_MODULE_IF_FOUND(Gui essential)
-COLLECT_MODULE_IF_FOUND(Widgets essential)
-COLLECT_MODULE_IF_FOUND(PrintSupport essential)
-COLLECT_MODULE_IF_FOUND(Sql essential)
-COLLECT_MODULE_IF_FOUND(Network essential)
-COLLECT_MODULE_IF_FOUND(Test essential)
-COLLECT_MODULE_IF_FOUND(Concurrent essential)
+set(ALL_ESSENTIAL_MODULES Core Gui Widgets PrintSupport Sql Network Test Concurrent)
if(UNIX AND NOT APPLE)
- COLLECT_MODULE_IF_FOUND(X11Extras essential)
+ list(APPEND ALL_ESSENTIAL_MODULES X11Extras)
endif()
if(WIN32)
- COLLECT_MODULE_IF_FOUND(WinExtras essential)
+ list(APPEND ALL_ESSENTIAL_MODULES WinExtras)
endif()
if(APPLE)
- COLLECT_MODULE_IF_FOUND(MacExtras essential)
+ list(APPEND ALL_ESSENTIAL_MODULES MacExtras)
endif()
-COLLECT_MODULE_IF_FOUND(Xml)
-COLLECT_MODULE_IF_FOUND(XmlPatterns opt)
-COLLECT_MODULE_IF_FOUND(Help opt)
-COLLECT_MODULE_IF_FOUND(Multimedia opt)
-COLLECT_MODULE_IF_FOUND(MultimediaWidgets opt)
-COLLECT_MODULE_IF_FOUND(OpenGL opt)
-COLLECT_MODULE_IF_FOUND(Qml opt)
-COLLECT_MODULE_IF_FOUND(Quick opt)
-COLLECT_MODULE_IF_FOUND(QuickWidgets opt)
-COLLECT_MODULE_IF_FOUND(Script opt)
-COLLECT_MODULE_IF_FOUND(ScriptTools opt)
-COLLECT_MODULE_IF_FOUND(Svg opt)
+
+# Collect all optional modules.
+set(ALL_OPTIONAL_MODULES Xml XmlPatterns Help Multimedia MultimediaWidgets OpenGL Qml Quick QuickWidgets Script ScriptTools TextToSpeech Charts Svg DataVisualization)
find_package(Qt5UiTools)
if(Qt5UiTools_FOUND)
- COLLECT_MODULE_IF_FOUND(UiTools opt)
+ list(APPEND ALL_OPTIONAL_MODULES UiTools)
else()
set(DISABLE_QtUiTools 1)
endif()
-COLLECT_MODULE_IF_FOUND(WebChannel opt)
-# still forgotten:
-#COLLECT_MODULE_IF_FOUND(WebEngineCore opt)
-#COLLECT_MODULE_IF_FOUND(WebEngine opt)
-COLLECT_MODULE_IF_FOUND(WebEngineWidgets opt)
-COLLECT_MODULE_IF_FOUND(WebKit opt)
-if(NOT MSVC)
- # right now this does not build on windows
- COLLECT_MODULE_IF_FOUND(WebKitWidgets opt)
-else()
- set(DISABLE_QtWebKitWidgets 1)
-ENDIF()
-COLLECT_MODULE_IF_FOUND(WebSockets opt)
+if(WIN32)
+ list(APPEND ALL_OPTIONAL_MODULES AxContainer)
+endif()
+list(APPEND ALL_OPTIONAL_MODULES WebChannel WebEngineWidgets WebKit WebKitWidgets WebSockets)
+if (Qt5Core_VERSION VERSION_GREATER 5.9.3) # Depending on fixes in Qt3D
+ list(APPEND ALL_OPTIONAL_MODULES 3DCore 3DRender 3DInput 3DLogic 3DAnimation 3DExtras)
+endif()
+
+# Modules to be built unless specified by -DMODULES on command line
+if (NOT MODULES)
+ set(MODULES "${ALL_ESSENTIAL_MODULES};${ALL_OPTIONAL_MODULES}")
+endif()
+
+foreach(m ${MODULES})
+ COLLECT_MODULE_IF_FOUND(${m})
+endforeach()
string(REGEX MATCHALL "[0-9]+" qt_version_helper "${Qt5Core_VERSION}")
diff --git a/sources/pyside2/PySide2/CMakeLists.txt b/sources/pyside2/PySide2/CMakeLists.txt
index 02b4a7c16..971d0a9ef 100644
--- a/sources/pyside2/PySide2/CMakeLists.txt
+++ b/sources/pyside2/PySide2/CMakeLists.txt
@@ -35,15 +35,36 @@ else()
"${CMAKE_CURRENT_BINARY_DIR}/support/signature/typing.py" COPYONLY)
endif()
-# Add the collected includes to the global include
-file(READ "${CMAKE_CURRENT_BINARY_DIR}/pyside2_global.h.add" GLOBAL_APPEND)
-file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/pyside2_global.h" "${GLOBAL_APPEND}")
-file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/pyside2_global.h.add")
-
# now compile all modules.
+file(READ "${CMAKE_CURRENT_BINARY_DIR}/pyside2_global.h" pyside2_global_contents)
+
foreach(shortname IN LISTS all_module_shortnames)
set(name "Qt5${shortname}")
HAS_QT_MODULE(${name}_FOUND Qt${shortname})
+
+ # Create a module header consisting of pyside2_global.h and the module
+ # include. Note: The contents of pyside2_global.h must be copied instead of
+ # just #including it since shiboken will otherwise generate an
+ # #include <pyside2_global.h> for the the type entries originating from it
+ # (cf AbstractMetaBuilderPrivate::setInclude()).
+ set(module_header "${CMAKE_CURRENT_BINARY_DIR}/Qt${shortname}_global.h")
+ set(module_header_content "")
+ set(pre_header "${CMAKE_CURRENT_BINARY_DIR}/Qt${shortname}/Qt${shortname}_global.pre.h")
+ if(EXISTS "${pre_header}")
+ file(READ "${pre_header}" pre_header_content)
+ set(module_header_content "${pre_header_content}")
+ endif()
+ set(module_header_content "${module_header_content}\n${pyside2_global_contents}")
+ # AxContainer/AxServer from Active Qt do not have module headers
+ if(NOT "${shortname}" STREQUAL "AxContainer")
+ set(module_header_content "${module_header_content}\n#include <Qt${shortname}/Qt${shortname}>")
+ endif()
+ set(post_header "${CMAKE_CURRENT_BINARY_DIR}/Qt${shortname}/Qt${shortname}_global.post.h")
+ if(EXISTS "${post_header}")
+ file(READ "${post_header}" post_header_content)
+ set(module_header_content "${module_header_content}\n${post_header_content}")
+ endif()
+ file(WRITE ${module_header} "${module_header_content}")
endforeach()
# install
diff --git a/sources/pyside2/PySide2/Qt3DAnimation/CMakeLists.txt b/sources/pyside2/PySide2/Qt3DAnimation/CMakeLists.txt
new file mode 100644
index 000000000..9bdf36add
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DAnimation/CMakeLists.txt
@@ -0,0 +1,55 @@
+project(Qt3DAnimation)
+
+set(Qt3DAnimation_SRC
+${Qt3DAnimation_GEN_DIR}/qt3danimation_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qabstractanimation_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qabstractanimationclip_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qabstractclipanimator_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qabstractclipblendnode_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qadditiveclipblend_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qanimationaspect_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qanimationcontroller_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qanimationgroup_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qblendedclipanimator_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qclipanimator_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qkeyframeanimation_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qlerpclipblend_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qmorphinganimation_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qmorphtarget_wrapper.cpp
+${Qt3DAnimation_GEN_DIR}/qt3danimation_qvertexblendanimation_wrapper.cpp
+# module is always needed
+${Qt3DAnimation_GEN_DIR}/qt3danimation_module_wrapper.cpp)
+
+set(Qt3DAnimation_include_dirs
+ ${Qt3DAnimation_SOURCE_DIR}
+ ${Qt3DAnimation_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIR}
+ ${Qt53DCore_INCLUDE_DIRS}
+ ${Qt53DRender_INCLUDE_DIRS}
+ ${Qt53DAnimation_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${Qt3DCore_GEN_DIR}
+ ${Qt3DRender_GEN_DIR}
+ ${Qt3DAnimation_GEN_DIR})
+
+set(Qt3DAnimation_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt53DAnimation_LIBRARIES})
+
+set(Qt3DAnimation_deps Qt3DRender)
+
+create_pyside_module(Qt3DAnimation
+ Qt3DAnimation_include_dirs
+ Qt3DAnimation_libraries
+ Qt3DAnimation_deps
+ Qt3DAnimation_SOURCE_DIR
+ Qt3DAnimation_SRC
+ ""
+ ${Qt3DAnimation_BINARY_DIR}/typesystem_3danimation.xml)
diff --git a/sources/pyside2/PySide2/Qt3DAnimation/typesystem_3danimation.xml b/sources/pyside2/PySide2/Qt3DAnimation/typesystem_3danimation.xml
new file mode 100644
index 000000000..99c24c241
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DAnimation/typesystem_3danimation.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+
+<typesystem package="PySide2.Qt3DAnimation">
+ <load-typesystem name="Qt3DRender/typesystem_3drender.xml" generate="no"/>
+ <namespace-type name="Qt3DAnimation">
+ <object-type name="QAbstractAnimation">
+ <enum-type name="AnimationType"/>
+ </object-type>
+ <object-type name="QAbstractAnimationClip"/>
+ <object-type name="QAbstractClipAnimator">
+ <enum-type name="Loops"/>
+ </object-type>
+ <object-type name="QAbstractClipBlendNode"/>
+ <object-type name="QAdditiveClipBlend"/>
+ <object-type name="QAnimationAspect"/>
+ <object-type name="QAnimationController"/>
+ <object-type name="QAnimationGroup"/>
+ <object-type name="QBlendedClipAnimator"/>
+ <object-type name="QClipAnimator"/>
+ <object-type name="QKeyframeAnimation">
+ <enum-type name="RepeatMode"/>
+ </object-type>
+ <object-type name="QLerpClipBlend"/>
+ <object-type name="QMorphingAnimation">
+ <enum-type name="Method"/>
+ </object-type>
+ <object-type name="QMorphTarget"/>
+ <object-type name="QVertexBlendAnimation"/>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/Qt3DCore/CMakeLists.txt b/sources/pyside2/PySide2/Qt3DCore/CMakeLists.txt
new file mode 100644
index 000000000..53d3cc634
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DCore/CMakeLists.txt
@@ -0,0 +1,74 @@
+project(Qt3DCore)
+
+set(Qt3DCore_SRC
+${Qt3DCore_GEN_DIR}/qt3dcore_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qabstractaspect_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qaspectengine_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qaspectjob_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qbackendnode_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qcomponent_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qcomponentaddedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qcomponentremovedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qdynamicpropertyupdatedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qentity_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qnode_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qnodecreatedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qnodedestroyedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qnodeid_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qnodeidtypepair_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertynodeaddedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertynoderemovedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertyupdatedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertyupdatedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertyvalueaddedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertyvalueaddedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertyvalueremovedchange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qpropertyvalueremovedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qscenechange_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qstaticpropertyupdatedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qstaticpropertyvalueaddedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qstaticpropertyvalueremovedchangebase_wrapper.cpp
+${Qt3DCore_GEN_DIR}/qt3dcore_qtransform_wrapper.cpp
+# module is always needed
+${Qt3DCore_GEN_DIR}/qt3dcore_module_wrapper.cpp)
+
+if (Qt53DCore_VERSION VERSION_EQUAL 5.10.0 OR Qt53DCore_VERSION VERSION_GREATER 5.10.0)
+ list(APPEND Qt3DCore_SRC
+ ${Qt3DCore_GEN_DIR}/qt3dcore_qarmature_wrapper.cpp
+ ${Qt3DCore_GEN_DIR}/qt3dcore_qjoint_wrapper.cpp
+ ${Qt3DCore_GEN_DIR}/qt3dcore_qabstractskeleton_wrapper.cpp
+ ${Qt3DCore_GEN_DIR}/qt3dcore_qnodecommand_wrapper.cpp
+ ${Qt3DCore_GEN_DIR}/qt3dcore_qskeleton_wrapper.cpp
+ ${Qt3DCore_GEN_DIR}/qt3dcore_qskeletonloader_wrapper.cpp)
+endif()
+
+set(Qt3DCore_include_dirs
+ ${Qt3DCore_SOURCE_DIR}
+ ${Qt3DCore_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${Qt5Network_INCLUDE_DIRS}
+ ${Qt53DCore_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${QtNetwork_GEN_DIR})
+
+set(Qt3DCore_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt53DCore_LIBRARIES})
+
+set(Qt3DCore_deps QtGui QtNetwork)
+
+create_pyside_module(Qt3DCore
+ Qt3DCore_include_dirs
+ Qt3DCore_libraries
+ Qt3DCore_deps
+ Qt3DCore_SOURCE_DIR
+ Qt3DCore_SRC
+ ""
+ ${Qt3DCore_BINARY_DIR}/typesystem_3dcore.xml)
diff --git a/sources/pyside2/PySide2/Qt3DCore/typesystem_3dcore.xml b/sources/pyside2/PySide2/Qt3DCore/typesystem_3dcore.xml
new file mode 100644
index 000000000..62245d6e3
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DCore/typesystem_3dcore.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+
+<typesystem package="PySide2.Qt3DCore">
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <namespace-type name="Qt3DCore">
+ <enum-type name="ChangeFlag" flags="ChangeFlags"/>
+ <object-type name="QAbstractAspect"/>
+ <object-type name="QAbstractSkeleton" since="5.10"/>
+ <object-type name="QArmature" since="5.10"/>
+ <object-type name="QAspectEngine"/>
+ <object-type name="QAspectJob"/>
+ <object-type name="QBackendNode">
+ <enum-type name="Mode"/>
+ </object-type>
+ <object-type name="QComponent"/>
+ <object-type name="QComponentAddedChange"/>
+ <object-type name="QComponentRemovedChange"/>
+ <object-type name="QDynamicPropertyUpdatedChange"/>
+ <object-type name="QEntity"/>
+ <object-type name="QJoint" since="5.10"/>
+ <object-type name="QNode">
+ <enum-type name="PropertyTrackingMode"/>
+ </object-type>
+ <object-type name="QNodeCommand" since="5.10"/>
+ <object-type name="QNodeCreatedChangeBase"/>
+ <object-type name="QNodeDestroyedChange"/>
+ <value-type name="QNodeId"/>
+ <value-type name="QNodeIdTypePair"/>
+ <object-type name="QPropertyNodeAddedChange"/>
+ <object-type name="QPropertyNodeRemovedChange"/>
+ <object-type name="QPropertyUpdatedChange"/>
+ <object-type name="QPropertyUpdatedChangeBase"/>
+ <object-type name="QPropertyValueAddedChange"/>
+ <object-type name="QPropertyValueAddedChangeBase"/>
+ <object-type name="QPropertyValueRemovedChange"/>
+ <object-type name="QPropertyValueRemovedChangeBase"/>
+ <object-type name="QSceneChange">
+ <enum-type name="DeliveryFlag" flags="DeliveryFlags"/>
+ </object-type>
+ <object-type name="QSkeleton" since="5.10"/>
+ <object-type name="QSkeletonLoader" since="5.10"/>
+ <object-type name="QStaticPropertyUpdatedChangeBase"/>
+ <object-type name="QStaticPropertyValueAddedChangeBase"/>
+ <object-type name="QStaticPropertyValueRemovedChangeBase"/>
+ <object-type name="QTransform">
+ <!-- Disambiguate from QtGui/qtransform.h -->
+ <include file-name="Qt3DCore/qtransform.h" location="global"/>
+ </object-type>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/Qt3DExtras/CMakeLists.txt b/sources/pyside2/PySide2/Qt3DExtras/CMakeLists.txt
new file mode 100644
index 000000000..4bc25d52d
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DExtras/CMakeLists.txt
@@ -0,0 +1,81 @@
+project(Qt3DExtras)
+
+set(Qt3DExtras_SRC
+${Qt3DExtras_GEN_DIR}/qt3dextras_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qconegeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qconemesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qcuboidgeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qcuboidmesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qcylindergeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qcylindermesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qdiffusemapmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qdiffusespecularmapmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qextrudedtextgeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qextrudedtextmesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qfirstpersoncameracontroller_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qforwardrenderer_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qgoochmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qmetalroughmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qmorphphongmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qnormaldiffusemapmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qnormaldiffusespecularmapmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qorbitcameracontroller_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qpervertexcolormaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qphongmaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qphongalphamaterial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qplanegeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qplanemesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qskyboxentity_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qspheregeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qspheremesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qtext2dentity_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qtexturematerial_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qtorusgeometry_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qtorusmesh_wrapper.cpp
+${Qt3DExtras_GEN_DIR}/qt3dextras_qt3dwindow_wrapper.cpp
+# module is always needed
+${Qt3DExtras_GEN_DIR}/qt3dextras_module_wrapper.cpp)
+
+if (Qt53DExtras_VERSION VERSION_EQUAL 5.10.0 OR Qt53DExtras_VERSION VERSION_GREATER 5.10.0)
+ list(APPEND Qt3DExtras_SRC
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qabstractcameracontroller_wrapper.cpp
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qabstractcameracontroller_inputstate_wrapper.cpp
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qabstractspritesheet_wrapper.cpp
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qdiffusespecularmaterial_wrapper.cpp
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qspritegrid_wrapper.cpp
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qspritesheet_wrapper.cpp
+ ${Qt3DExtras_GEN_DIR}/qt3dextras_qspritesheetitem_wrapper.cpp)
+endif()
+
+set(Qt3DExtras_include_dirs
+ ${Qt3DExtras_SOURCE_DIR}
+ ${Qt3DExtras_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${Qt53DCore_INCLUDE_DIRS}
+ ${Qt53DRender_INCLUDE_DIRS}
+ ${Qt53DExtras_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${Qt3DCore_GEN_DIR}
+ ${Qt3DRender_GEN_DIR})
+
+set(Qt3DExtras_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt53DExtras_LIBRARIES})
+
+set(Qt3DExtras_deps Qt3DRender)
+
+create_pyside_module(Qt3DExtras
+ Qt3DExtras_include_dirs
+ Qt3DExtras_libraries
+ Qt3DExtras_deps
+ Qt3DExtras_SOURCE_DIR
+ Qt3DExtras_SRC
+ ""
+ ${Qt3DExtras_BINARY_DIR}/typesystem_3dextras.xml)
diff --git a/sources/pyside2/PySide2/Qt3DExtras/typesystem_3dextras.xml b/sources/pyside2/PySide2/Qt3DExtras/typesystem_3dextras.xml
new file mode 100644
index 000000000..9bcaa6705
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DExtras/typesystem_3dextras.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+
+<typesystem package="PySide2.Qt3DExtras">
+ <load-typesystem name="Qt3DRender/typesystem_3drender.xml" generate="no"/>
+ <namespace-type name="Qt3DExtras">
+ <object-type name="QAbstractCameraController" since="5.10">
+ <value-type name="InputState"/>
+ </object-type>
+ <object-type name="QAbstractSpriteSheet" since="5.10"/>
+ <object-type name="QConeGeometry"/>
+ <object-type name="QConeMesh"/>
+ <object-type name="QCuboidGeometry"/>
+ <object-type name="QCuboidMesh"/>
+ <object-type name="QCylinderGeometry"/>
+ <object-type name="QCylinderMesh"/>
+ <object-type name="QDiffuseMapMaterial"/>
+ <object-type name="QDiffuseSpecularMaterial" since="5.10"/>
+ <object-type name="QDiffuseSpecularMapMaterial"/>
+ <object-type name="QExtrudedTextGeometry"/>
+ <object-type name="QExtrudedTextMesh"/>
+ <object-type name="QFirstPersonCameraController"/>
+ <object-type name="QForwardRenderer"/>
+ <object-type name="QGoochMaterial"/>
+ <object-type name="QMetalRoughMaterial"/>
+ <object-type name="QMorphPhongMaterial"/>
+ <object-type name="QNormalDiffuseMapMaterial"/>
+ <object-type name="QNormalDiffuseSpecularMapMaterial"/>
+ <object-type name="QOrbitCameraController"/>
+ <object-type name="QPerVertexColorMaterial"/>
+ <object-type name="QPhongMaterial"/>
+ <object-type name="QPhongAlphaMaterial"/>
+ <object-type name="QPlaneGeometry"/>
+ <object-type name="QPlaneMesh"/>
+ <object-type name="QSkyboxEntity"/>
+ <object-type name="QSphereGeometry"/>
+ <object-type name="QSphereMesh"/>
+ <object-type name="QSpriteGrid" since="5.10"/>
+ <object-type name="QSpriteSheet" since="5.10"/>
+ <object-type name="QSpriteSheetItem" since="5.10"/>
+ <object-type name="QText2DEntity"/>
+ <object-type name="QTextureMaterial"/>
+ <object-type name="QTorusGeometry"/>
+ <object-type name="QTorusMesh"/>
+ <object-type name="Qt3DWindow"/>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/Qt3DInput/CMakeLists.txt b/sources/pyside2/PySide2/Qt3DInput/CMakeLists.txt
new file mode 100644
index 000000000..694f373f8
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DInput/CMakeLists.txt
@@ -0,0 +1,56 @@
+project(Qt3DInput)
+
+set(Qt3DInput_SRC
+${Qt3DInput_GEN_DIR}/qt3dinput_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qabstractactioninput_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qabstractaxisinput_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qabstractphysicaldevice_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qaction_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qactioninput_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qanalogaxisinput_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qaxis_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qaxisaccumulator_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qaxissetting_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qbuttonaxisinput_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qinputaspect_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qinputchord_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qinputsequence_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qinputsettings_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qkeyboardhandler_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qkeyevent_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qlogicaldevice_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qkeyboarddevice_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qmousedevice_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qmouseevent_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qwheelevent_wrapper.cpp
+${Qt3DInput_GEN_DIR}/qt3dinput_qmousehandler_wrapper.cpp
+# module is always needed
+${Qt3DInput_GEN_DIR}/qt3dinput_module_wrapper.cpp)
+
+set(Qt3DInput_include_dirs
+ ${Qt3DInput_SOURCE_DIR}
+ ${Qt3DInput_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${Qt3DCore_GEN_DIR})
+
+set(Qt3DInput_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt53DInput_LIBRARIES})
+
+set(Qt3DInput_deps Qt3DCore)
+
+create_pyside_module(Qt3DInput
+ Qt3DInput_include_dirs
+ Qt3DInput_libraries
+ Qt3DInput_deps
+ Qt3DInput_SOURCE_DIR
+ Qt3DInput_SRC
+ ""
+ ${Qt3DInput_BINARY_DIR}/typesystem_3dinput.xml)
diff --git a/sources/pyside2/PySide2/Qt3DInput/typesystem_3dinput.xml b/sources/pyside2/PySide2/Qt3DInput/typesystem_3dinput.xml
new file mode 100644
index 000000000..b26e5d7fe
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DInput/typesystem_3dinput.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+
+<typesystem package="PySide2.Qt3DInput">
+ <load-typesystem name="Qt3DCore/typesystem_3dcore.xml" generate="no"/>
+ <namespace-type name="Qt3DInput">
+ <object-type name="QAbstractActionInput"/>
+ <object-type name="QAbstractAxisInput"/>
+ <object-type name="QAbstractPhysicalDevice"/>
+ <object-type name="QAction"/>
+ <object-type name="QActionInput"/>
+ <object-type name="QAnalogAxisInput"/>
+ <object-type name="QAxis"/>
+ <object-type name="QAxisAccumulator">
+ <enum-type name="SourceAxisType"/>
+ </object-type>
+ <object-type name="QAxisSetting"/>
+ <object-type name="QButtonAxisInput"/>
+ <object-type name="QInputAspect"/>
+ <object-type name="QInputChord"/>
+ <object-type name="QInputSequence"/>
+ <object-type name="QInputSettings"/>
+ <object-type name="QKeyboardHandler"/>
+ <object-type name="QKeyEvent">
+ <modify-function signature="QKeyEvent(const Qt3DInput::QKeyEvent&amp;)" remove="all"/>
+ </object-type>
+ <object-type name="QLogicalDevice"/>
+ <object-type name="QKeyboardDevice"/>
+ <object-type name="QMouseDevice">
+ <enum-type name="Axis"/>
+ </object-type>
+ <!-- Fixme: shiboken2 mistakenly thinks that Qt3DInput::QMouseEvent(::QMouseEvent)
+ is a copy constructor of Qt3DInput::QMouseEvent. Work around by suppressing them -->
+ <object-type name="QMouseEvent">
+ <enum-type name="Buttons"/>
+ <enum-type name="Modifiers"/>
+ <modify-function signature="QMouseEvent(const Qt3DInput::QMouseEvent&amp;)" remove="all"/>
+ </object-type>
+ <object-type name="QWheelEvent">
+ <enum-type name="Buttons"/>
+ <enum-type name="Modifiers"/>
+ <modify-function signature="QWheelEvent(const Qt3DInput::QWheelEvent&amp;)" remove="all"/>
+ </object-type>
+ <object-type name="QMouseHandler"/>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/Qt3DLogic/CMakeLists.txt b/sources/pyside2/PySide2/Qt3DLogic/CMakeLists.txt
new file mode 100644
index 000000000..23cde8804
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DLogic/CMakeLists.txt
@@ -0,0 +1,37 @@
+project(Qt3DLogic)
+
+set(Qt3DLogic_SRC
+${Qt3DLogic_GEN_DIR}/qt3dlogic_wrapper.cpp
+${Qt3DLogic_GEN_DIR}/qt3dlogic_qframeaction_wrapper.cpp
+${Qt3DLogic_GEN_DIR}/qt3dlogic_qlogicaspect_wrapper.cpp
+# module is always needed
+${Qt3DLogic_GEN_DIR}/qt3dlogic_module_wrapper.cpp)
+
+set(Qt3DLogic_include_dirs
+ ${Qt3DLogic_SOURCE_DIR}
+ ${Qt3DLogic_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${Qt3DCore_GEN_DIR})
+
+set(Qt3DLogic_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt53DLogic_LIBRARIES})
+
+set(Qt3DLogic_deps Qt3DCore)
+
+create_pyside_module(Qt3DLogic
+ Qt3DLogic_include_dirs
+ Qt3DLogic_libraries
+ Qt3DLogic_deps
+ Qt3DLogic_SOURCE_DIR
+ Qt3DLogic_SRC
+ ""
+ ${Qt3DLogic_BINARY_DIR}/typesystem_3dlogic.xml)
diff --git a/header.LGPL b/sources/pyside2/PySide2/Qt3DLogic/typesystem_3dlogic.xml
index 3c0d12810..d448fd29a 100644
--- a/header.LGPL
+++ b/sources/pyside2/PySide2/Qt3DLogic/typesystem_3dlogic.xml
@@ -1,9 +1,11 @@
+<?xml version="1.0"?>
+<!--
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
-** This file is part of the FOO module of the Qt Toolkit.
+** This file is part of PySide2.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
@@ -36,4 +38,12 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+-->
+<typesystem package="PySide2.Qt3DLogic">
+ <load-typesystem name="Qt3DCore/typesystem_3dcore.xml" generate="no"/>
+ <namespace-type name="Qt3DLogic">
+ <object-type name="QFrameAction"/>
+ <object-type name="QLogicAspect"/>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/Qt3DRender/CMakeLists.txt b/sources/pyside2/PySide2/Qt3DRender/CMakeLists.txt
new file mode 100644
index 000000000..07bd3d89f
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DRender/CMakeLists.txt
@@ -0,0 +1,147 @@
+project(Qt3DRender)
+
+set(Qt3DRender_SRC
+${Qt3DRender_GEN_DIR}/qt3drender_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_propertyreaderinterface_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qabstractfunctor_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qabstractlight_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qabstracttexture_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qabstracttextureimage_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qalphacoverage_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qalphatest_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qattribute_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qblendequation_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qblendequationarguments_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qbuffer_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qbuffercapture_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qbufferdatagenerator_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qcamera_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qcameralens_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qcameraselector_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qclearbuffers_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qclipplane_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qcolormask_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qcomputecommand_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qcullface_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qdepthtest_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qdirectionallight_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qdispatchcompute_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qdithering_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qeffect_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qenvironmentlight_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qfilterkey_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qframegraphnode_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qframegraphnodecreatedchangebase_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qfrontface_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qfrustumculling_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qgeometry_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qgeometryfactory_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qgeometryrenderer_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qgraphicsapifilter_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qlayer_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qlayerfilter_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qlevelofdetail_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qlevelofdetailboundingsphere_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qlevelofdetailswitch_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qmaterial_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qmemorybarrier_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qmesh_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qmultisampleantialiasing_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qnodepthmask_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qnodraw_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qobjectpicker_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpaintedtextureimage_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qparameter_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpickevent_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpicktriangleevent_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpickingsettings_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpointlight_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpointsize_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qpolygonoffset_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrenderaspect_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendercapture_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendercapturereply_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrenderpass_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrenderpassfilter_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendersettings_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrenderstate_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrenderstateset_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendersurfaceselector_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendertarget_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendertargetoutput_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qrendertargetselector_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qsceneloader_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qscissortest_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qseamlesscubemap_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qshaderdata_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qshaderprogram_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qsortpolicy_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qspotlight_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qstencilmask_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qstenciloperation_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qstenciloperationarguments_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qstenciltest_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qstenciltestarguments_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtechnique_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtechniquefilter_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture1d_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture1darray_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture2d_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture2darray_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture2dmultisample_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture2dmultisamplearray_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexture3d_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturebuffer_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturecubemap_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturecubemaparray_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturedata_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturegenerator_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtextureimage_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtextureimagedata_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtextureimagedatagenerator_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtextureloader_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturerectangle_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qtexturewrapmode_wrapper.cpp
+${Qt3DRender_GEN_DIR}/qt3drender_qviewport_wrapper.cpp
+# module is always needed
+${Qt3DRender_GEN_DIR}/qt3drender_module_wrapper.cpp)
+
+if (Qt53DRender_VERSION VERSION_EQUAL 5.10.0 OR Qt53DRender_VERSION VERSION_GREATER 5.10.0)
+ list(APPEND Qt3DRender_SRC
+ ${Qt3DRender_GEN_DIR}/qt3drender_qblitframebuffer_wrapper.cpp
+ ${Qt3DRender_GEN_DIR}/qt3drender_qlinewidth_wrapper.cpp
+ ${Qt3DRender_GEN_DIR}/qt3drender_qpicklineevent_wrapper.cpp
+ ${Qt3DRender_GEN_DIR}/qt3drender_qpickpointevent_wrapper.cpp
+ ${Qt3DRender_GEN_DIR}/qt3drender_qproximityfilter_wrapper.cpp
+ ${Qt3DRender_GEN_DIR}/qt3drender_qshaderprogrambuilder_wrapper.cpp
+)
+endif()
+
+set(Qt3DRender_include_dirs
+ ${Qt3DRender_SOURCE_DIR}
+ ${Qt3DRender_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${Qt3DCore_GEN_DIR})
+
+set(Qt3DRender_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt53DRender_LIBRARIES})
+
+set(Qt3DRender_deps Qt3DCore)
+
+create_pyside_module(Qt3DRender
+ Qt3DRender_include_dirs
+ Qt3DRender_libraries
+ Qt3DRender_deps
+ Qt3DRender_SOURCE_DIR
+ Qt3DRender_SRC
+ ""
+ ${Qt3DRender_BINARY_DIR}/typesystem_3drender.xml)
diff --git a/sources/pyside2/PySide2/Qt3DRender/typesystem_3drender.xml b/sources/pyside2/PySide2/Qt3DRender/typesystem_3drender.xml
new file mode 100644
index 000000000..cfa332742
--- /dev/null
+++ b/sources/pyside2/PySide2/Qt3DRender/typesystem_3drender.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+
+<typesystem package="PySide2.Qt3DRender">
+ <load-typesystem name="Qt3DCore/typesystem_3dcore.xml" generate="no"/>
+ <namespace-type name="Qt3DRender">
+ <object-type name="PropertyReaderInterface"/>
+ <object-type name="QAbstractFunctor"/>
+ <object-type name="QAbstractLight">
+ <enum-type name="Type"/>
+ </object-type>
+ <object-type name="QAbstractTexture">
+ <enum-type name="CubeMapFace"/>
+ <enum-type name="ComparisonFunction"/>
+ <enum-type name="ComparisonMode"/>
+ <enum-type name="Filter"/>
+ <enum-type name="Status"/>
+ <enum-type name="Target"/>
+ <enum-type name="TextureFormat"/>
+ </object-type>
+ <object-type name="QAbstractTextureImage">
+ <modify-function signature="QAbstractTextureImage(Qt3DCore::QNode*)" remove="all"/>
+ </object-type>
+ <object-type name="QAlphaCoverage"/>
+ <object-type name="QAlphaTest">
+ <enum-type name="AlphaFunction"/>
+ </object-type>
+ <object-type name="QAttribute">
+ <enum-type name="AttributeType"/>
+ <enum-type name="VertexBaseType"/>
+ </object-type>
+ <object-type name="QBlendEquation">
+ <enum-type name="BlendFunction"/>
+ </object-type>
+ <object-type name="QBlendEquationArguments">
+ <enum-type name="Blending"/>
+ </object-type>
+ <object-type name="QBlitFramebuffer" since="5.10"/>
+ <object-type name="QBuffer">
+ <enum-type name="AccessType"/>
+ <enum-type name="BufferType"/>
+ <enum-type name="UsageType"/>
+ </object-type>
+ <object-type name="QBufferCapture"/>
+ <object-type name="QBufferDataGenerator">
+ <modify-function signature="operator()()" remove="all"/>
+ </object-type>
+ <object-type name="QCamera">
+ <enum-type name="CameraTranslationOption"/>
+ </object-type>
+ <object-type name="QCameraLens">
+ <enum-type name="ProjectionType"/>
+ </object-type>
+ <object-type name="QCameraSelector"/>
+ <object-type name="QClearBuffers">
+ <enum-type name="BufferType"/>
+ </object-type>
+ <object-type name="QClipPlane"/>
+ <object-type name="QColorMask"/>
+ <object-type name="QComputeCommand"/>
+ <object-type name="QCullFace">
+ <enum-type name="CullingMode"/>
+ </object-type>
+ <object-type name="QDepthTest">
+ <enum-type name="DepthFunction"/>
+ </object-type>
+ <object-type name="QDirectionalLight"/>
+ <object-type name="QDispatchCompute"/>
+ <object-type name="QDithering"/>
+ <object-type name="QEffect"/>
+ <object-type name="QEnvironmentLight"/>
+ <object-type name="QFilterKey"/>
+ <object-type name="QFrameGraphNode"/>
+ <object-type name="QFrameGraphNodeCreatedChangeBase"/>
+ <object-type name="QFrontFace">
+ <enum-type name="WindingDirection"/>
+ </object-type>
+ <object-type name="QFrustumCulling"/>
+ <object-type name="QGeometry"/>
+ <object-type name="QGeometryFactory">
+ <modify-function signature="operator()()" remove="all"/>
+ </object-type>
+ <object-type name="QGeometryRenderer">
+ <enum-type name="PrimitiveType"/>
+ </object-type>
+ <object-type name="QGraphicsApiFilter">
+ <enum-type name="Api"/>
+ <enum-type name="OpenGLProfile"/>
+ </object-type>
+ <object-type name="QLayer"/>
+ <object-type name="QLayerFilter"/>
+ <object-type name="QLevelOfDetail">
+ <enum-type name="ThresholdType"/>
+ </object-type>
+ <object-type name="QLevelOfDetailBoundingSphere"/>
+ <object-type name="QLevelOfDetailSwitch"/>
+ <object-type name="QLineWidth" since="5.10"/>
+ <object-type name="QMaterial"/>
+ <object-type name="QMemoryBarrier">
+ <enum-type name="Operation"/>
+ </object-type>
+ <object-type name="QMesh"/>
+ <object-type name="QMultiSampleAntiAliasing"/>
+ <object-type name="QNoDepthMask"/>
+ <object-type name="QNoDraw"/>
+ <object-type name="QObjectPicker"/>
+ <object-type name="QPaintedTextureImage"/>
+ <object-type name="QParameter"/>
+ <object-type name="QPickEvent">
+ <enum-type name="Buttons"/>
+ <enum-type name="Modifiers"/>
+ </object-type>
+ <object-type name="QPickLineEvent" since="5.10"/>
+ <object-type name="QPickPointEvent" since="5.10"/>
+ <object-type name="QPickTriangleEvent"/>
+ <object-type name="QPickingSettings">
+ <enum-type name="FaceOrientationPickingMode"/>
+ <enum-type name="PickMethod"/>
+ <enum-type name="PickResultMode"/>
+ </object-type>
+ <object-type name="QPointLight"/>
+ <object-type name="QPointSize">
+ <enum-type name="SizeMode"/>
+ </object-type>
+ <object-type name="QPolygonOffset"/>
+ <object-type name="QProximityFilter" since="5.10"/>
+ <object-type name="QRenderAspect">
+ <enum-type name="RenderType"/>
+ </object-type>
+ <object-type name="QRenderCapture"/>
+ <object-type name="QRenderCaptureReply"/>
+ <object-type name="QRenderPass"/>
+ <object-type name="QRenderPassFilter"/>
+ <object-type name="QRenderSettings">
+ <enum-type name="RenderPolicy"/>
+ </object-type>
+ <object-type name="QRenderState"/>
+ <object-type name="QRenderStateSet"/>
+ <object-type name="QRenderSurfaceSelector"/>
+ <object-type name="QRenderTarget"/>
+ <object-type name="QRenderTargetOutput">
+ <enum-type name="AttachmentPoint"/>
+ </object-type>
+ <object-type name="QRenderTargetSelector"/>
+ <object-type name="QSceneLoader">
+ <enum-type name="Status"/>
+ <enum-type name="ComponentType"/>
+ </object-type>
+ <object-type name="QScissorTest"/>
+ <object-type name="QSeamlessCubemap"/>
+ <object-type name="QShaderData"/>
+ <object-type name="QShaderProgram">
+ <enum-type name="ShaderType"/>
+ <enum-type name="Status"/>
+ </object-type>
+ <object-type name="QShaderProgramBuilder" since="5.10"/>
+ <object-type name="QSortPolicy">
+ <enum-type name="SortType"/>
+ </object-type>
+ <object-type name="QSpotLight">
+ <modify-function signature="attenuation() const" remove="all"/>
+ </object-type>
+ <object-type name="QStencilMask"/>
+ <object-type name="QStencilOperation"/>
+ <object-type name="QStencilOperationArguments">
+ <enum-type name="FaceMode"/>
+ <enum-type name="Operation"/>
+ </object-type>
+ <object-type name="QStencilTest"/>
+ <object-type name="QStencilTestArguments">
+ <enum-type name="StencilFaceMode"/>
+ <enum-type name="StencilFunction"/>
+ </object-type>
+ <object-type name="QTechnique"/>
+ <object-type name="QTechniqueFilter"/>
+ <object-type name="QTexture1D"/>
+ <object-type name="QTexture1DArray"/>
+ <object-type name="QTexture2D"/>
+ <object-type name="QTexture2DArray"/>
+ <object-type name="QTexture2DMultisample"/>
+ <object-type name="QTexture2DMultisampleArray"/>
+ <object-type name="QTexture3D"/>
+ <object-type name="QTextureBuffer"/>
+ <object-type name="QTextureCubeMap"/>
+ <object-type name="QTextureCubeMapArray"/>
+ <object-type name="QTextureData"/>
+ <object-type name="QTextureGenerator">
+ <modify-function signature="QTextureGenerator()" remove="all"/>
+ </object-type>
+ <object-type name="QTextureImage">
+ <enum-type name="Status"/>
+ </object-type>
+ <object-type name="QTextureImageData"/>
+ <object-type name="QTextureImageDataGenerator">
+ <modify-function signature="QTextureImageDataGenerator()" remove="all"/>
+ </object-type>
+ <object-type name="QTextureLoader"/>
+ <object-type name="QTextureRectangle"/>
+ <object-type name="QTextureWrapMode">
+ <enum-type name="WrapMode"/>
+ </object-type>
+ <object-type name="QViewport"/>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtAxContainer/CMakeLists.txt b/sources/pyside2/PySide2/QtAxContainer/CMakeLists.txt
new file mode 100644
index 000000000..a3971786b
--- /dev/null
+++ b/sources/pyside2/PySide2/QtAxContainer/CMakeLists.txt
@@ -0,0 +1,46 @@
+project(QtAxContainer)
+
+set(QtAxContainer_SRC
+${QtAxContainer_GEN_DIR}/qaxbase_wrapper.cpp
+${QtAxContainer_GEN_DIR}/qaxobject_wrapper.cpp
+${QtAxContainer_GEN_DIR}/qaxscript_wrapper.cpp
+${QtAxContainer_GEN_DIR}/qaxscriptengine_wrapper.cpp
+${QtAxContainer_GEN_DIR}/qaxscriptmanager_wrapper.cpp
+${QtAxContainer_GEN_DIR}/qaxselect_wrapper.cpp
+${QtAxContainer_GEN_DIR}/qaxwidget_wrapper.cpp
+# module is always needed
+${QtAxContainer_GEN_DIR}/qtaxcontainer_module_wrapper.cpp)
+
+configure_file("${QtAxContainer_SOURCE_DIR}/QtAxContainer_global.post.h.in"
+ "${QtAxContainer_BINARY_DIR}/QtAxContainer_global.post.h" @ONLY)
+
+set(QtAxContainer_include_dirs
+ ${QtAxContainer_SOURCE_DIR}
+ ${QtAxContainer_BINARY_DIR}
+ ${pyside2_SOURCE_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${QtWidgets_GEN_DIR})
+
+set(QtAxContainer_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt5AxContainer_LIBRARIES}
+ ${Qt5AxBase_LIBRARIES})
+
+set(QtAxContainer_deps QtWidgets)
+
+create_pyside_module(QtAxContainer
+ QtAxContainer_include_dirs
+ QtAxContainer_libraries
+ QtAxContainer_deps
+ QtAxContainer_SOURCE_DIR
+ QtAxContainer_SRC
+ ""
+ ${QtAxContainer_BINARY_DIR}/typesystem_axcontainer.xml)
diff --git a/sources/pyside2/PySide2/QtAxContainer/QtAxContainer_global.post.h.in b/sources/pyside2/PySide2/QtAxContainer/QtAxContainer_global.post.h.in
new file mode 100644
index 000000000..22e1b0119
--- /dev/null
+++ b/sources/pyside2/PySide2/QtAxContainer/QtAxContainer_global.post.h.in
@@ -0,0 +1,5 @@
+#include <ActiveQt/QAxSelect>
+#include <ActiveQt/QAxScript>
+#include <ActiveQt/QAxScriptEngine>
+#include <ActiveQt/QAxScriptManager>
+#include <ActiveQt/QAxWidget>
diff --git a/sources/pyside2/PySide2/QtAxContainer/typesystem_axcontainer.xml b/sources/pyside2/PySide2/QtAxContainer/typesystem_axcontainer.xml
new file mode 100644
index 000000000..a6648f612
--- /dev/null
+++ b/sources/pyside2/PySide2/QtAxContainer/typesystem_axcontainer.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+
+<typesystem package="PySide2.QtAxContainer">
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
+ <rejection class="*" function-name="connectNotify"/>
+ <rejection class="*" function-name="queryInterface"/>
+ <rejection class="*" function-name="qt_metacall"/>
+ <rejection class="*" function-name="qt_static_metacall"/>
+ <rejection class="*" field-name="qt_meta_stringdata_QAxBase"/>
+ <rejection class="*" field-name="qt_meta_data_QAxBase"/>
+ <object-type name="QAxBase"/>
+ <object-type name="QAxObject"/>
+ <object-type name="QAxScript">
+ <enum-type name="FunctionFlags"/>
+ </object-type>
+ <object-type name="QAxScriptEngine"/>
+ <object-type name="QAxScriptManager">
+ <!-- Ax Servers only -->
+ <modify-function signature="addObject(QObject*)" remove="all"/>
+ </object-type>
+ <object-type name="QAxSelect"/>
+ <object-type name="QAxWidget"/>
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtCharts/CMakeLists.txt b/sources/pyside2/PySide2/QtCharts/CMakeLists.txt
new file mode 100644
index 000000000..fa177300d
--- /dev/null
+++ b/sources/pyside2/PySide2/QtCharts/CMakeLists.txt
@@ -0,0 +1,90 @@
+project(QtCharts)
+
+set(QtCharts_SRC
+${QtCharts_GEN_DIR}/qtcharts_qabstractaxis_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qabstractbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qabstractseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qarealegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qareaseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qbarcategoryaxis_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qbarlegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qbarmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qbarset_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qboxplotlegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qboxplotmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qboxplotseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qboxset_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qcandlesticklegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qcandlestickmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qcandlestickseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qcandlestickset_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qcategoryaxis_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qchart_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qchartview_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qdatetimeaxis_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhbarmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhboxplotmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhcandlestickmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhorizontalbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhorizontalpercentbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhorizontalstackedbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhpiemodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qhxymodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qlegend_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qlegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qlineseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qlogvalueaxis_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qpercentbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qpielegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qpiemodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qpieseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qpieslice_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qpolarchart_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qscatterseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qsplineseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qstackedbarseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qvalueaxis_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qvbarmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qvboxplotmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qvcandlestickmodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qvpiemodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qvxymodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qxylegendmarker_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qxymodelmapper_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_qxyseries_wrapper.cpp
+${QtCharts_GEN_DIR}/qtcharts_wrapper.cpp
+# module is always needed
+${QtCharts_GEN_DIR}/qtcharts_module_wrapper.cpp
+)
+
+set(QtCharts_include_dirs ${QtCharts_SOURCE_DIR}
+ ${QtCharts_BINARY_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${Qt5Widgets_INCLUDE_DIRS}
+ ${Qt5Charts_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${QtWidgets_GEN_DIR})
+
+set(QtCharts_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt5Charts_LIBRARIES}
+ ${Qt5Core_LIBRARIES}
+ ${Qt5Gui_LIBRARIES}
+ ${Qt5Widgets_LIBRARIES})
+
+set(QtCharts_deps QtCore QtGui QtWidgets)
+
+create_pyside_module(QtCharts
+ QtCharts_include_dirs
+ QtCharts_libraries
+ QtCharts_deps
+ QtCharts_SOURCE_DIR
+ QtCharts_SRC
+ "")
diff --git a/sources/pyside2/PySide2/QtCharts/typesystem_charts.xml b/sources/pyside2/PySide2/QtCharts/typesystem_charts.xml
new file mode 100644
index 000000000..ca7646421
--- /dev/null
+++ b/sources/pyside2/PySide2/QtCharts/typesystem_charts.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+<typesystem package="PySide2.QtCharts">
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
+ <namespace-type name="QtCharts">
+ <object-type name="QAbstractAxis" since="5.7">
+ <enum-type name="AxisType"/>
+ </object-type>
+ <object-type name="QAbstractBarSeries" since="5.7">
+ <enum-type name="LabelsPosition"/>
+ </object-type>
+ <object-type name="QAbstractSeries" since="5.7">
+ <enum-type name="SeriesType"/>
+ </object-type>
+ <object-type name="QAreaLegendMarker" since="5.7"/>
+ <object-type name="QAreaSeries" since="5.7"/>
+ <object-type name="QBarCategoryAxis" since="5.7"/>
+ <object-type name="QBarLegendMarker" since="5.7"/>
+ <object-type name="QBarModelMapper" since="5.7"/>
+ <object-type name="QBarSeries" since="5.7"/>
+ <object-type name="QBarSet" since="5.7"/>
+ <object-type name="QBoxPlotLegendMarker" since="5.7"/>
+ <object-type name="QBoxPlotModelMapper" since="5.7"/>
+ <object-type name="QBoxPlotSeries" since="5.7"/>
+ <object-type name="QBoxSet" since="5.7">
+ <enum-type name="ValuePositions"/>
+ </object-type>
+ <object-type name="QCandlestickLegendMarker" since="5.7"/>
+ <object-type name="QCandlestickModelMapper" since="5.7"/>
+ <object-type name="QCandlestickSeries" since="5.7"/>
+ <object-type name="QCandlestickSet" since="5.7"/>
+ <object-type name="QCategoryAxis" since="5.7"/>
+ <object-type name="QChart" since="5.7">
+ <enum-type name="ChartType"/>
+ <enum-type name="ChartTheme"/>
+ <enum-type name="AnimationOption"/>
+ <modify-function signature="addSeries(QAbstractSeries*)">
+ <modify-argument index="1">
+ <parent index="this" action="add"/>
+ </modify-argument>
+ </modify-function>
+ </object-type>
+ <object-type name="QChartView" since="5.7">
+ <enum-type name="RubberBand"/>
+ </object-type>
+ <object-type name="QDateTimeAxis" since="5.7"/>
+ <object-type name="QHBarModelMapper" since="5.7"/>
+ <object-type name="QHBoxPlotModelMapper" since="5.7"/>
+ <object-type name="QHCandlestickModelMapper" since="5.7"/>
+ <object-type name="QHorizontalBarSeries" since="5.7"/>
+ <object-type name="QHorizontalPercentBarSeries" since="5.7"/>
+ <object-type name="QHorizontalStackedBarSeries" since="5.7"/>
+ <object-type name="QHPieModelMapper" since="5.7"/>
+ <object-type name="QHXYModelMapper" since="5.7"/>
+ <object-type name="QLegend" since="5.7">
+ <enum-type name="MarkerShape"/>
+ </object-type>
+ <object-type name="QLegendMarker" since="5.7">
+ <enum-type name="LegendMarkerType"/>
+ </object-type>
+ <object-type name="QLineSeries" since="5.7"/>
+ <object-type name="QLogValueAxis" since="5.7"/>
+ <object-type name="QPercentBarSeries" since="5.7"/>
+ <object-type name="QPieLegendMarker" since="5.7"/>
+ <object-type name="QPieModelMapper" since="5.7"/>
+ <object-type name="QPieSeries" since="5.7"/>
+ <object-type name="QPieSlice" since="5.7">
+ <enum-type name="LabelPosition"/>
+ </object-type>
+ <object-type name="QPolarChart" since="5.7">
+ <enum-type name="PolarOrientation" flags="PolarOrientations"/>
+ <!-- Compile error assigning default flags value -->
+ <modify-function signature="axes(QFlags&lt;QtCharts::QPolarChart::PolarOrientation&gt;,QtCharts::QAbstractSeries*)const" remove="all"/>
+ </object-type>
+ <object-type name="QScatterSeries" since="5.7">
+ <enum-type name="MarkerShape"/>
+ </object-type>
+ <object-type name="QSplineSeries" since="5.7"/>
+ <object-type name="QStackedBarSeries" since="5.7"/>
+ <object-type name="QValueAxis" since="5.7"/>
+ <object-type name="QVBarModelMapper" since="5.7"/>
+ <object-type name="QVBoxPlotModelMapper" since="5.7"/>
+ <object-type name="QVCandlestickModelMapper" since="5.7"/>
+ <object-type name="QVPieModelMapper" since="5.7"/>
+ <object-type name="QVXYModelMapper" since="5.7"/>
+ <object-type name="QXYLegendMarker" since="5.7"/>
+ <object-type name="QXYModelMapper" since="5.7"/>
+ <object-type name="QXYSeries" since="5.7"/>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtConcurrent/CMakeLists.txt b/sources/pyside2/PySide2/QtConcurrent/CMakeLists.txt
index 4a7fd53ff..4fb62ee99 100644
--- a/sources/pyside2/PySide2/QtConcurrent/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtConcurrent/CMakeLists.txt
@@ -6,10 +6,6 @@ ${QtConcurrent_GEN_DIR}/qtconcurrent_wrapper.cpp
${QtConcurrent_GEN_DIR}/qtconcurrent_module_wrapper.cpp
)
-make_path(QtConcurrent_typesystem_path ${QtCore_SOURCE_DIR}
- ${QtCore_BINARY_DIR}
- ${QtConcurrent_SOURCE_DIR})
-
set(QtConcurrent_include_dirs ${QtConcurrent_SOURCE_DIR}
${QtConcurrent_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -30,6 +26,6 @@ create_pyside_module(QtConcurrent
QtConcurrent_include_dirs
QtConcurrent_libraries
QtConcurrent_deps
- QtConcurrent_typesystem_path
+ QtConcurrent_SOURCE_DIR
QtConcurrent_SRC
"")
diff --git a/sources/pyside2/PySide2/QtConcurrent/typesystem_concurrent.xml b/sources/pyside2/PySide2/QtConcurrent/typesystem_concurrent.xml
index 692e744a1..09f590914 100644
--- a/sources/pyside2/PySide2/QtConcurrent/typesystem_concurrent.xml
+++ b/sources/pyside2/PySide2/QtConcurrent/typesystem_concurrent.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtConcurrent">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
<!-- Qt5: this is currently the minimum possible QtConcurrent support, by just extracting
the name space from QtCore -->
diff --git a/sources/pyside2/PySide2/QtCore/CMakeLists.txt b/sources/pyside2/PySide2/QtCore/CMakeLists.txt
index 5e3c16a08..dd2e212b0 100644
--- a/sources/pyside2/PySide2/QtCore/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtCore/CMakeLists.txt
@@ -10,9 +10,6 @@ else()
set(SPECIFIC_OS_FILES "")
endif()
-# TODO: Fix cycling dependency when generating QDataStream operator<< for QUuid
-set (QtCore_SRC_FIXED_ME ${QtCore_GEN_DIR}/quuid_wrapper.cpp)
-
set(QtCore_SRC
${QtCore_GEN_DIR}/qabstractanimation_wrapper.cpp
${QtCore_GEN_DIR}/qabstracteventdispatcher_timerinfo_wrapper.cpp
@@ -100,6 +97,9 @@ ${QtCore_GEN_DIR}/qreadwritelock_wrapper.cpp
${QtCore_GEN_DIR}/qrect_wrapper.cpp
${QtCore_GEN_DIR}/qrectf_wrapper.cpp
${QtCore_GEN_DIR}/qregexp_wrapper.cpp
+${QtCore_GEN_DIR}/qregularexpression_wrapper.cpp
+${QtCore_GEN_DIR}/qregularexpressionmatch_wrapper.cpp
+${QtCore_GEN_DIR}/qregularexpressionmatchiterator_wrapper.cpp
${QtCore_GEN_DIR}/qresource_wrapper.cpp
${QtCore_GEN_DIR}/qrunnable_wrapper.cpp
${QtCore_GEN_DIR}/qsavefile_wrapper.cpp
@@ -140,7 +140,10 @@ ${QtCore_GEN_DIR}/qtimezone_wrapper.cpp
${QtCore_GEN_DIR}/qtimezone_offsetdata_wrapper.cpp
${QtCore_GEN_DIR}/qtranslator_wrapper.cpp
${QtCore_GEN_DIR}/qurl_wrapper.cpp
+${QtCore_GEN_DIR}/qurlquery_wrapper.cpp
+${QtCore_GEN_DIR}/quuid_wrapper.cpp
${QtCore_GEN_DIR}/qvariantanimation_wrapper.cpp
+${QtCore_GEN_DIR}/qversionnumber_wrapper.cpp
${QtCore_GEN_DIR}/qwaitcondition_wrapper.cpp
${QtCore_GEN_DIR}/qwritelocker_wrapper.cpp
${QtCore_GEN_DIR}/qxmlstreamattribute_wrapper.cpp
@@ -161,9 +164,6 @@ ${QtCore_GEN_DIR}/qtcore_module_wrapper.cpp
configure_file("${QtCore_SOURCE_DIR}/typesystem_core.xml.in"
"${QtCore_BINARY_DIR}/typesystem_core.xml" @ONLY)
-make_path(QtCore_typesystem_path ${QtCore_SOURCE_DIR})
-
-
set(QtCore_include_dirs ${QtCore_SOURCE_DIR}
${QtCore_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -180,7 +180,7 @@ create_pyside_module(QtCore
QtCore_include_dirs
QtCore_libraries
""
- QtCore_typesystem_path
+ QtCore_SOURCE_DIR
QtCore_SRC
QtCore_gluecode
${QtCore_BINARY_DIR}/typesystem_core.xml)
diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core.xml.in b/sources/pyside2/PySide2/QtCore/typesystem_core.xml.in
index 4ccf6423f..58caaee55 100644
--- a/sources/pyside2/PySide2/QtCore/typesystem_core.xml.in
+++ b/sources/pyside2/PySide2/QtCore/typesystem_core.xml.in
@@ -40,6 +40,6 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtCore">
- <load-typesystem name="typesystem_core_@AUTO_OS@.xml" generate="yes"/>
- <load-typesystem name="typesystem_core_common.xml" generate="yes"/>
+ <load-typesystem name="QtCore/typesystem_core_@AUTO_OS@.xml" generate="yes"/>
+ <load-typesystem name="QtCore/typesystem_core_common.xml" generate="yes"/>
</typesystem>
diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml
index 65f68882d..3b9986bab 100644
--- a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml
+++ b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml
@@ -141,6 +141,35 @@
<rejection class="*" function-name="qFreeAligned"/>
<rejection class="QMetaMethod" enum-name="Attributes" />
+ <rejection class="*" argument-type="QByteArrayDataPtr"/>
+ <rejection class="*" argument-type="^qfloat16&amp;?$"/>
+ <rejection class="*" argument-type="QHashData"/>
+ <rejection class="*" argument-type="QHashData::Node*"/>
+ <rejection class="*" argument-type="QLatin1String"/>
+ <rejection class="*" argument-type="QLinkedListData*"/>
+ <rejection class="*" argument-type="QListData::ArrayCompatibleLayout"/>
+ <rejection class="*" argument-type="QListData::Data*"/>
+ <rejection class="*" argument-type="QListData::NotArrayCompatibleLayout"/>
+ <rejection class="*" argument-type="QList::Node*"/>
+ <rejection class="*" argument-type="QTSMFI"/>
+ <rejection class="*" argument-type="QTSMFC"/>
+ <rejection class="*" argument-type="QMutexData*"/>
+ <rejection class="*" argument-type="QObjectUserData*"/>
+ <rejection class="*" argument-type="QtPrivate::QSlotObjectBase*"/>
+ <rejection class="*" argument-type="^Q\w+Private( const)?\&amp;$"/>
+ <!-- Note: "QHelpModel(QHelpEnginePrivate*)" is needed -->
+ <rejection class="*" argument-type="^Q[^H]\w+Private( const)?\*$"/>
+ <rejection class="*" argument-type="^.*::QPrivateSignal$"/>
+ <rejection class="*" argument-type="Qt::Initialization"/>
+
+ <rejection class="*" argument-type="FILE*"/>
+ <rejection class="*" argument-type="std::chrono::milliseconds"/>
+ <rejection class="*" argument-type="^std::nullptr_t&amp;?$"/>
+ <rejection class="*" argument-type="^std::initializer_list&lt;.*$"/>
+ <rejection class="*" argument-type="^std::list&lt;[^&gt;]&gt; const&amp;$"/>
+ <rejection class="*" argument-type="std::string const&amp;"/>
+ <rejection class="*" argument-type="^std::vector&lt;[^&gt;]&gt; const&amp;$"/>
+
<!-- From Qt4.6 ^^^ -->
@@ -186,6 +215,7 @@
<!-- FIXME APIExtractor or shiboken do not support multiple includes by primitive type -->
<include file-name="signalmanager.h" location="global"/>
</primitive-type>
+
<primitive-type name="bool" target-lang-api-name="PyBool">
<conversion-rule>
<native-to-target>
@@ -238,7 +268,7 @@
</primitive-type>
<inject-code class="native" position="beginning">
- bool py2kStrCheck(PyObject* obj)
+ bool py2kStrCheck(PyObject *obj)
{
#ifdef IS_PY3K
return false;
@@ -253,15 +283,15 @@
<conversion-rule>
<native-to-target>
const int N = %in.length();
- wchar_t* str = new wchar_t[N];
+ wchar_t *str = new wchar_t[N];
%in.toWCharArray(str);
- PyObject* %out = PyUnicode_FromWideChar(str, N);
+ PyObject *%out = PyUnicode_FromWideChar(str, N);
delete[] str;
return %out;
</native-to-target>
<target-to-native>
<add-conversion type="PyUnicode">
- Py_UNICODE* unicode = PyUnicode_AS_UNICODE(%in);
+ Py_UNICODE *unicode = PyUnicode_AS_UNICODE(%in);
#if defined(Py_UNICODE_WIDE)
// cast as Py_UNICODE can be a different type
%out = QString::fromUcs4((const uint*)unicode);
@@ -286,9 +316,9 @@
<conversion-rule>
<native-to-target>
const int N = %in.toString().length();
- wchar_t* str = new wchar_t[N];
+ wchar_t *str = new wchar_t[N];
%in.toString().toWCharArray(str);
- PyObject* %out = PyUnicode_FromWideChar(str, N);
+ PyObject *%out = PyUnicode_FromWideChar(str, N);
delete[] str;
return %out;
</native-to-target>
@@ -339,7 +369,7 @@
Shiboken::Conversions::SpecificConverter converter(cppInRef.typeName());
if (converter) {
- void* ptr = cppInRef.data();
+ void *ptr = cppInRef.data();
return converter.toPython(ptr);
}
PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s'.", %in.typeName());
@@ -379,7 +409,7 @@
<add-conversion type="SbkObject">
// a class supported by QVariant?
int typeCode;
- const char* typeName = QVariant_resolveMetaType(%in->ob_type, &amp;typeCode);
+ const char *typeName = QVariant_resolveMetaType(%in->ob_type, &amp;typeCode);
if (!typeCode || !typeName)
return;
QVariant var(typeCode, (void*)0);
@@ -402,11 +432,11 @@
</conversion-rule>
</primitive-type>
<inject-code class="native" position="beginning">
- static const char* QVariant_resolveMetaType(PyTypeObject* type, int* typeId)
+ static const char *QVariant_resolveMetaType(PyTypeObject *type, int *typeId)
{
if (PyObject_TypeCheck(type, &amp;SbkObjectType_Type)) {
- SbkObjectType* sbkType = (SbkObjectType*)type;
- const char* typeName = Shiboken::ObjectType::getOriginalName(sbkType);
+ SbkObjectType *sbkType = (SbkObjectType*)type;
+ const char *typeName = Shiboken::ObjectType::getOriginalName(sbkType);
if (!typeName)
return 0;
bool valueType = '*' != typeName[qstrlen(typeName) - 1];
@@ -426,8 +456,8 @@
// that has added any python fields or slots to its object layout.
// See https://mail.python.org/pipermail/python-list/2009-January/520733.html
if (type->tp_bases) {
- for(int i = 0; i &lt; PyTuple_GET_SIZE(type->tp_bases); ++i) {
- const char* derivedName = QVariant_resolveMetaType((PyTypeObject*)PyTuple_GET_ITEM(type->tp_bases, i), typeId);
+ for (int i = 0; i &lt; PyTuple_GET_SIZE(type->tp_bases); ++i) {
+ const char *derivedName = QVariant_resolveMetaType((PyTypeObject*)PyTuple_GET_ITEM(type->tp_bases, i), typeId);
if (derivedName)
return derivedName;
}
@@ -439,13 +469,13 @@
*typeId = 0;
return 0;
}
- static QVariant QVariant_convertToValueList(PyObject* list)
+ static QVariant QVariant_convertToValueList(PyObject *list)
{
if (PySequence_Size(list) &lt; 1)
return QVariant();
Shiboken::AutoDecRef element(PySequence_GetItem(list, 0));
int typeId;
- const char* typeName = QVariant_resolveMetaType(element.cast&lt;PyTypeObject*&gt;(), &amp;typeId);
+ const char *typeName = QVariant_resolveMetaType(element.cast&lt;PyTypeObject*&gt;(), &amp;typeId);
if (typeName) {
QByteArray listTypeName("QList&lt;");
listTypeName += typeName;
@@ -468,8 +498,8 @@
bool allString = true;
Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList"));
Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object());
- for(int i = 0; i &lt; size; ++i) {
- PyObject* item = PySequence_Fast_GET_ITEM(fast.object(), i);
+ for (int i = 0; i &lt; size; ++i) {
+ PyObject *item = PySequence_Fast_GET_ITEM(fast.object(), i);
if (!%CHECKTYPE[QString](item)) {
allString = false;
break;
@@ -477,14 +507,14 @@
}
return allString;
}
- static QVariant QVariant_convertToVariantMap(PyObject* map)
+ static QVariant QVariant_convertToVariantMap(PyObject *map)
{
Py_ssize_t pos = 0;
Shiboken::AutoDecRef keys(PyDict_Keys(map));
if (!QVariant_isStringList(keys))
return QVariant();
- PyObject* key;
- PyObject* value;
+ PyObject *key;
+ PyObject *value;
QMap&lt;QString,QVariant&gt; ret;
while (PyDict_Next(map, &amp;pos, &amp;key, &amp;value)) {
QString cppKey = %CONVERTTOCPP[QString](key);
@@ -493,7 +523,7 @@
}
return QVariant(ret);
}
- static QVariant QVariant_convertToVariantList(PyObject* list)
+ static QVariant QVariant_convertToVariantList(PyObject *list)
{
if (QVariant_isStringList(list)) {
QList&lt;QString &gt; lst = %CONVERTTOCPP[QList&lt;QString&gt;](list);
@@ -506,7 +536,7 @@
Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList"));
Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object());
for (int i = 0; i &lt; size; ++i) {
- PyObject* pyItem = PySequence_Fast_GET_ITEM(fast.object(), i);
+ PyObject *pyItem = PySequence_Fast_GET_ITEM(fast.object(), i);
QVariant item = %CONVERTTOCPP[QVariant](pyItem);
lst.append(item);
}
@@ -517,12 +547,12 @@
<primitive-type name="QVariant::Type" default-constructor="QVariant::Invalid">
<conversion-rule>
<native-to-target>
- const char* typeName = QVariant::typeToName(%in);
- PyObject* %out;
- PyTypeObject* pyType = 0;
+ const char *typeName = QVariant::typeToName(%in);
+ PyObject *%out;
+ PyTypeObject *pyType = nullptr;
if (typeName)
pyType = Shiboken::Conversions::getPythonTypeObject(typeName);
- %out = pyType ? ((PyObject*)pyType) : Py_None;
+ %out = pyType ? (reinterpret_cast&lt;PyObject*&gt;(pyType)) : Py_None;
Py_INCREF(%out);
return %out;
</native-to-target>
@@ -531,17 +561,17 @@
%out = QVariant::Invalid;
</add-conversion>
<add-conversion type="PyTypeObject">
- const char* typeName;
+ const char *typeName;
if (Shiboken::String::checkType((PyTypeObject*)%in))
typeName = "QString";
- else if (%in == (PyObject*)&amp;PyFloat_Type)
+ else if (%in == reinterpret_cast&lt;PyObject*&gt;(&amp;PyFloat_Type))
typeName = "double"; // float is a UserType in QVariant.
- else if (%in == (PyObject*)&amp;PyLong_Type)
+ else if (%in == reinterpret_cast&lt;PyObject*&gt;(&amp;PyLong_Type))
typeName = "int"; // long is a UserType in QVariant.
else if (%in->ob_type == &amp;SbkObjectType_Type)
typeName = Shiboken::ObjectType::getOriginalName((SbkObjectType*)%in);
else
- typeName = ((PyTypeObject*)%in)->tp_name;
+ typeName = (reinterpret_cast&lt;PyTypeObject*&gt;(%in))->tp_name;
%out = QVariant::nameToType(typeName);
</add-conversion>
<add-conversion type="PyString" check="Shiboken::String::check(%in)">
@@ -551,12 +581,7 @@
%out = QVariant::nameToType("QVariantMap");
</add-conversion>
<add-conversion type="PySequence">
- const char* typeName;
- if (QVariantType_isStringList(%in))
- typeName = "QStringList";
- else
- typeName = "QVariantList";
- %out = QVariant::nameToType(typeName);
+ %out = QVariantType_isStringList(%in) ? QVariant::StringList : QVariant::List;
</add-conversion>
</target-to-native>
</conversion-rule>
@@ -568,13 +593,13 @@
</inject-code>
<inject-code class="native" position="beginning">
- static bool QVariantType_isStringList(PyObject* list)
+ static bool QVariantType_isStringList(PyObject *list)
{
bool allString = true;
Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList"));
Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object());
- for(int i=0; i &lt; size; i++) {
- PyObject* item = PySequence_Fast_GET_ITEM(fast.object(), i);
+ for (int i=0; i &lt; size; i++) {
+ PyObject *item = PySequence_Fast_GET_ITEM(fast.object(), i);
if (!%CHECKTYPE[QString](item)) {
allString = false;
break;
@@ -582,7 +607,7 @@
}
return allString;
}
- static bool QVariantType_checkAllStringKeys(PyObject* dict)
+ static bool QVariantType_checkAllStringKeys(PyObject *dict)
{
Shiboken::AutoDecRef keys(PyDict_Keys(dict));
return QVariantType_isStringList(keys);
@@ -733,13 +758,12 @@
</container-type>
<template name="cppmap_to_pymap_conversion">
- PyObject* %out = PyDict_New();
- %INTYPE::const_iterator it = %in.begin();
- for (; it != %in.end(); ++it) {
+ PyObject *%out = PyDict_New();
+ for (%INTYPE::const_iterator it = %in.begin(), end = %in.end(); it != end; ++it) {
%INTYPE_0 key = it.key();
%INTYPE_1 value = it.value();
- PyObject* pyKey = %CONVERTTOPYTHON[%INTYPE_0](key);
- PyObject* pyValue = %CONVERTTOPYTHON[%INTYPE_1](value);
+ PyObject *pyKey = %CONVERTTOPYTHON[%INTYPE_0](key);
+ PyObject *pyValue = %CONVERTTOPYTHON[%INTYPE_1](value);
PyDict_SetItem(%out, pyKey, pyValue);
Py_DECREF(pyKey);
Py_DECREF(pyValue);
@@ -747,8 +771,8 @@
return %out;
</template>
<template name="pydict_to_cppmap_conversion">
- PyObject* key;
- PyObject* value;
+ PyObject *key;
+ PyObject *value;
Py_ssize_t pos = 0;
while (PyDict_Next(%in, &amp;pos, &amp;key, &amp;value)) {
%OUTTYPE_0 cppKey = %CONVERTTOCPP[%OUTTYPE_0](key);
@@ -803,7 +827,7 @@
<include file-name="QPair" location="global"/>
<conversion-rule>
<native-to-target>
- PyObject* %out = PyTuple_New(2);
+ PyObject *%out = PyTuple_New(2);
PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first));
PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second));
return %out;
@@ -864,6 +888,8 @@
<rejection class="QFile" function-name="setEncodingFunction"/>
<rejection class="QRegion" function-name="cleanUp"/>
<rejection class="QSettings" function-name="registerFormat"/>
+ <rejection class="Qt" function-name="qt_getEnumMetaObject"/>
+ <rejection class="Qt" function-name="qt_getEnumName"/>
<namespace-type name="Qt">
<enum-type name="AlignmentFlag" flags="Alignment" />
@@ -972,13 +998,13 @@
void globalPostRoutineCallback()
{
Shiboken::GilState state;
- foreach(PyObject* callback, globalPostRoutineFunctions) {
+ foreach(PyObject *callback, globalPostRoutineFunctions) {
Shiboken::AutoDecRef result(PyObject_CallObject(callback, NULL));
Py_DECREF(callback);
}
globalPostRoutineFunctions.clear();
}
- void addPostRoutine(PyObject* callback)
+ void addPostRoutine(PyObject *callback)
{
if (PyCallable_Check(callback)) {
globalPostRoutineFunctions &lt;&lt; callback;
@@ -1000,7 +1026,7 @@
<inject-code class="target" position="end">
QList&lt;QByteArray&gt; version = QByteArray(qVersion()).split('.');
- PyObject* pyQtVersion = PyTuple_New(3);
+ PyObject *pyQtVersion = PyTuple_New(3);
for (int i = 0; i &lt; 3; ++i)
PyTuple_SET_ITEM(pyQtVersion, i, PyInt_FromLong(version[i].toInt()));
PyModule_AddObject(module, "__version_info__", pyQtVersion);
@@ -1022,7 +1048,7 @@
}
}
if (!atexit.isNull() &amp;&amp; !regFunc.isNull()){
- PyObject* shutDownFunc = PyObject_GetAttrString(module, "__moduleShutdown");
+ PyObject *shutDownFunc = PyObject_GetAttrString(module, "__moduleShutdown");
Shiboken::AutoDecRef args(PyTuple_New(1));
PyTuple_SET_ITEM(args, 0, shutDownFunc);
Shiboken::AutoDecRef retval(PyObject_Call(regFunc, args, 0));
@@ -1050,9 +1076,9 @@
<inject-code class="native" position="beginning">
// Define a global variable to handle qInstallMessageHandler callback
- static PyObject* qtmsghandler = 0;
+ static PyObject *qtmsghandler = nullptr;
- static void msgHandlerCallback(QtMsgType type, const QMessageLogContext &amp; ctx, const QString &amp;msg)
+ static void msgHandlerCallback(QtMsgType type, const QMessageLogContext &amp;ctx, const QString &amp;msg)
{
Shiboken::GilState state;
Shiboken::AutoDecRef arglist(PyTuple_New(3));
@@ -1119,7 +1145,7 @@
</add-function>
<inject-code class="native" position="beginning">
namespace PySide {
- template&lt;&gt; inline uint hash(const QLine&amp; v) {
+ template&lt;&gt; inline uint hash(const QLine &amp;v) {
return qHash(qMakePair(qMakePair(v.x1(), v.y1()), qMakePair(v.x2(), v.y2())));
}
};
@@ -1187,7 +1213,7 @@
<replace-type modified-type="PyObject" />
</modify-argument>
<inject-code>
- const void* d = %CPPSELF.%FUNCTION_NAME();
+ const void *d = %CPPSELF.%FUNCTION_NAME();
if (d) {
%PYARG_0 = Shiboken::Buffer::newObject(d, %CPPSELF.size());
} else {
@@ -1197,8 +1223,8 @@
</inject-code>
</modify-function>
<template name="QResource_registerResource">
- uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1);
- %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*>(ptr), %2);
+ uchar *ptr = reinterpret_cast&lt;uchar*&gt;(Shiboken::Buffer::getPointer(%PYARG_1));
+ %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*&gt;(ptr), %2);
%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
</template>
@@ -1231,7 +1257,7 @@
(PyDateTimeAPI = (PyDateTime_CAPI*) PyCObject_Import((char*)"datetime", \
(char*)"datetime_CAPI"))
#endif
- static bool PyDateTime_ImportAndCheck(PyObject* pyIn) {
+ static bool PyDateTime_ImportAndCheck(PyObject *pyIn) {
if (!PyDateTimeAPI) PySideDateTime_IMPORT;
return $DATETIMETYPE_Check(pyIn);
}
@@ -1277,7 +1303,8 @@
</add-function>
<add-function signature="toPython()" return-type="PyObject">
<inject-code class="target" position="beginning">
- if (!PyDateTimeAPI) PySideDateTime_IMPORT;
+ if (!PyDateTimeAPI)
+ PySideDateTime_IMPORT;
%PYARG_0 = PyDate_FromDate(%CPPSELF.year(), %CPPSELF.month(), %CPPSELF.day());
</inject-code>
</add-function>
@@ -1425,7 +1452,7 @@
</add-function>
<inject-code class="native" position="beginning">
namespace PySide {
- template&lt;&gt; inline uint hash(const QPoint&amp; v) {
+ template&lt;&gt; inline uint hash(const QPoint &amp;v) {
return qHash(qMakePair(v.x(), v.y()));
}
};
@@ -1497,7 +1524,7 @@
</add-function>
<inject-code class="native" position="beginning">
namespace PySide {
- template&lt;&gt; inline uint hash(const QRect&amp; v) {
+ template&lt;&gt; inline uint hash(const QRect &amp;v) {
return qHash(qMakePair(qMakePair(v.x(), v.y()), qMakePair(v.width(), v.height())));
}
};
@@ -1635,7 +1662,7 @@
</add-function>
<inject-code class="native" position="beginning">
namespace PySide {
- template&lt;&gt; inline uint hash(const QSize&amp; v) {
+ template&lt;&gt; inline uint hash(const QSize &amp;v) {
return qHash(qMakePair(v.width(), v.height()));
}
};
@@ -1732,7 +1759,8 @@
</add-function>
<add-function signature="toPython()" return-type="PyObject">
<inject-code class="target" position="beginning">
- if (!PyDateTimeAPI) PySideDateTime_IMPORT;
+ if (!PyDateTimeAPI)
+ PySideDateTime_IMPORT;
%PYARG_0 = PyTime_FromTime(%CPPSELF.hour(), %CPPSELF.minute(), %CPPSELF.second(), %CPPSELF.msec()*1000);
</inject-code>
</add-function>
@@ -1756,9 +1784,7 @@
<value-type name="OffsetData"/>
</value-type>
- <!-- FIXME QT5: Remove QUuid because cyclic dependency found on overloaddata QUuid(),
- this lead to cyclic dependency in <<(QDataStream &, QUUid) and incorrect QDataStream code generation (Windows only)-->
- <!-- <value-type name="QUuid">
+ <value-type name="QUuid">
<enum-type name="Variant"/>
<enum-type name="Version"/>
<add-function signature="__repr__" return-type="PyObject*">
@@ -1777,7 +1803,7 @@
</insert-template>
</inject-code>
</add-function>
- </value-type> -->
+ </value-type>
<value-type name="QMimeType" since="5.0" />
<object-type name="QMimeDatabase" since="5.0">
@@ -1939,8 +1965,8 @@
</add-function>
<add-function signature="__setitem__">
<inject-code class="target" position="beginning">
- PyObject* args = Py_BuildValue("(iiO)", _i, 1, _value);
- PyObject* result = Sbk_QBitArrayFunc_setBit(self, args);
+ PyObject *args = Py_BuildValue("(iiO)", _i, 1, _value);
+ PyObject *result = Sbk_QBitArrayFunc_setBit(self, args);
Py_DECREF(args);
Py_XDECREF(result);
return !result ? -1 : 0;
@@ -2239,7 +2265,7 @@
<inject-code class="native" file="glue/qobject_findchild.cpp"/>
<add-function signature="findChild(PyTypeObject*, const QString&amp;)" return-type="PyObject*">
<inject-code class="target" position="beginning">
- QObject* child = _findChildHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1);
+ QObject *child = _findChildHelper(%CPPSELF, %2, (PyTypeObject*)%PYARG_1);
%PYARG_0 = %CONVERTTOPYTHON[QObject*](child);
</inject-code>
<modify-argument index="return">
@@ -2302,7 +2328,7 @@
// Avoid return +1 because SignalManager connect to "destroyed()" signal to control object timelife
int ret = %CPPSELF.%FUNCTION_NAME(%1);
if (ret > 0 &amp;&amp; ((strcmp(%1, SIGNAL(destroyed())) == 0) || (strcmp(%1, SIGNAL(destroyed(QObject*))) == 0)))
- ret -= PySide::SignalManager::instance().countConnectionsWith(%CPPSELF);
+ ret -= PySide::SignalManager::instance().countConnectionsWith(%CPPSELF);
%PYARG_0 = %CONVERTTOPYTHON[int](ret);
</inject-code>
@@ -2339,6 +2365,7 @@
<include file-name="QSize" location="global"/>
</extra-includes>
</object-type>
+ <value-type name="QUrlQuery" since="5.0" />
<value-type name="QUrl" hash-function="PySide::hash">
<!-- Qt5: lots of changes -->
<enum-type name="ComponentFormattingOption" flags="ComponentFormattingOptions,FormattingOptions"/>
@@ -2429,6 +2456,15 @@
</inject-code>
</add-function>
</value-type>
+
+ <value-type name="QRegularExpression">
+ <enum-type name="MatchOption" flags="MatchOptions"/>
+ <enum-type name="MatchType"/>
+ <enum-type name="PatternOption" flags="PatternOptions"/>
+ </value-type>
+ <value-type name="QRegularExpressionMatch"/>
+ <value-type name="QRegularExpressionMatchIterator"/>
+
<value-type name="QFileInfo">
<extra-includes>
<include file-name="QDateTime" location="global"/>
@@ -2548,10 +2584,10 @@
<add-function signature="__repr__" return-type="PyObject*">
<inject-code class="target" position="beginning">
- QByteArray b(((PyObject*)%PYSELF)->ob_type->tp_name);
- PyObject* aux = Shiboken::String::fromStringAndSize(%CPPSELF.constData(), %CPPSELF.size());
+ QByteArray b((reinterpret_cast&lt;PyObject*&gt;(%PYSELF))->ob_type->tp_name);
+ PyObject *aux = Shiboken::String::fromStringAndSize(%CPPSELF.constData(), %CPPSELF.size());
if (PyUnicode_CheckExact(aux)) {
- PyObject* tmp = PyUnicode_AsASCIIString(aux);
+ PyObject *tmp = PyUnicode_AsASCIIString(aux);
Py_DECREF(aux);
aux = tmp;
}
@@ -2762,8 +2798,8 @@
<add-function signature="__setitem__">
<inject-code class="target" position="beginning">
%CPPSELF.remove(_i, 1);
- PyObject* args = Py_BuildValue("(nO)", _i, _value);
- PyObject* result = Sbk_QByteArrayFunc_insert(self, args);
+ PyObject *args = Py_BuildValue("(nO)", _i, _value);
+ PyObject *result = Sbk_QByteArrayFunc_insert(self, args);
Py_DECREF(args);
Py_XDECREF(result);
return !result ? -1 : 0;
@@ -2810,7 +2846,7 @@
<replace-type modified-type="PyBuffer"/>
</modify-argument>
<inject-code>
- uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1);
+ uchar *ptr = reinterpret_cast&lt;uchar*&gt;(Shiboken::Buffer::getPointer(%PYARG_1));
%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(ptr);
%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
</inject-code>
@@ -2871,7 +2907,7 @@
QByteArray ba;
ba.resize(%2);
%CPPSELF.%FUNCTION_NAME(ba.data(), ba.size());
- %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba);
+ %PYARG_0 = Shiboken::String::fromCString(ba.constData());
</inject-code>
<modify-argument index="1">
<remove-argument />
@@ -2895,7 +2931,7 @@
QByteArray ba;
ba.resize(%2);
%CPPSELF.%FUNCTION_NAME(ba.data(), ba.size());
- %PYARG_0 = %CONVERTTOPYTHON[QByteArray](ba);
+ %PYARG_0 = Shiboken::String::fromCString(ba.constData());
</inject-code>
<modify-argument index="1">
<remove-argument />
@@ -2903,12 +2939,13 @@
<modify-argument index="return">
<replace-type modified-type="PyObject"/>
<conversion-rule class="native">
- %RETURN_TYPE %out;
- if (!PyBytes_Check(%PYARG_0)) {
- %out = -1;
- } else {
+ %RETURN_TYPE %out = 0;
+ if (PyBytes_Check(%PYARG_0)) {
%out = PyBytes_GET_SIZE((PyObject*)%PYARG_0);
memcpy(%1, PyBytes_AS_STRING((PyObject*)%PYARG_0), %out);
+ } else if (Shiboken::String::check(%PYARG_0)) {
+ %out = Shiboken::String::len((PyObject*)%PYARG_0);
+ memcpy(%1, Shiboken::String::toCString((PyObject*)%PYARG_0), %out);
}
</conversion-rule>
</modify-argument>
@@ -3050,7 +3087,7 @@
</modify-argument>
<inject-code>
Py_ssize_t size;
- uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1, &amp;size);
+ uchar *ptr = reinterpret_cast&lt;uchar*&gt;(Shiboken::Buffer::getPointer(%PYARG_1, &amp;size));
%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(const_cast&lt;const uchar*>(ptr), size);
%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
</inject-code>
@@ -3068,6 +3105,8 @@
<object-type name="QBuffer">
<!-- ### setData(QByteArray) do the job -->
<modify-function signature="setData(const char*,int)" remove="all"/>
+ <!-- Disambiguate from Qt3DRender/qbuffer.h -->
+ <include file-name="QtCore/qbuffer.h" location="global"/>
</object-type>
<object-type name="QTimer">
<modify-function signature="singleShot(int,const QObject*,const char*)">
@@ -3075,14 +3114,14 @@
// %FUNCTION_NAME() - disable generation of c++ function call
(void) %2; // remove warning about unused variable
Shiboken::AutoDecRef emptyTuple(PyTuple_New(0));
- PyObject* pyTimer = Shiboken::SbkType&lt;QTimer>()->tp_new(Shiboken::SbkType&lt;QTimer>(), emptyTuple, 0);
+ PyObject *pyTimer = Shiboken::SbkType&lt;QTimer>()->tp_new(Shiboken::SbkType&lt;QTimer>(), emptyTuple, 0);
Shiboken::SbkType&lt;QTimer>()->tp_init(pyTimer, emptyTuple, 0);
QTimer* timer = %CONVERTTOCPP[QTimer*](pyTimer);
Shiboken::AutoDecRef result(
PyObject_CallMethod(pyTimer,
- const_cast&lt;char*>("connect"),
- const_cast&lt;char*>("OsOs"),
+ const_cast&lt;char*&gt;("connect"),
+ const_cast&lt;char*&gt;("OsOs"),
pyTimer,
SIGNAL(timeout()),
%PYARG_2,
@@ -3105,12 +3144,12 @@
timer->setSingleShot(true);
if (PyObject_TypeCheck(%2, &amp;PySideSignalInstanceType)) {
- PySideSignalInstance* signalInstance = reinterpret_cast&lt;PySideSignalInstance*&gt;(%2);
+ PySideSignalInstance *signalInstance = reinterpret_cast&lt;PySideSignalInstance*&gt;(%2);
Shiboken::AutoDecRef signalSignature(Shiboken::String::fromFormat("2%s", PySide::Signal::getSignature(signalInstance)));
Shiboken::AutoDecRef result(
PyObject_CallMethod(pyTimer,
- const_cast&lt;char*>("connect"),
- const_cast&lt;char*>("OsOO"),
+ const_cast&lt;char*&gt;("connect"),
+ const_cast&lt;char*&gt;("OsOO"),
pyTimer,
SIGNAL(timeout()),
PySide::Signal::getObject(signalInstance),
@@ -3119,8 +3158,8 @@
} else {
Shiboken::AutoDecRef result(
PyObject_CallMethod(pyTimer,
- const_cast&lt;char*>("connect"),
- const_cast&lt;char*>("OsO"),
+ const_cast&lt;char*&gt;("connect"),
+ const_cast&lt;char*&gt;("OsO"),
pyTimer,
SIGNAL(timeout()),
%PYARG_2)
@@ -3170,7 +3209,7 @@
<inject-code>
long result;
#ifdef WIN32
- _PROCESS_INFORMATION* procInfo = %CPPSELF.%FUNCTION_NAME();
+ _PROCESS_INFORMATION *procInfo = %CPPSELF.%FUNCTION_NAME();
result = procInfo ? procInfo->dwProcessId : 0;
#else
result = %CPPSELF.%FUNCTION_NAME();
@@ -3249,7 +3288,7 @@
<modify-function signature="notify(QObject*,QEvent*)" allow-thread="yes">
<modify-argument index="2" invalidate-after-use="yes"/>
</modify-function>
- <modify-function signature="QCoreApplication(int &amp;, char **)" access="private"/>
+ <modify-function signature="QCoreApplication(int &amp;, char **, int)" access="private"/>
<inject-code class="native" file="glue/qcoreapplication_init.cpp" position="beginning" />
<modify-function signature="postEvent(QObject*,QEvent*, int)">
<modify-argument index="2">
@@ -3593,8 +3632,8 @@
<modify-function signature="operator&lt;&lt;(float)" remove="all"/>
<modify-function signature="operator&lt;&lt;(qlonglong)" remove="all"/>
<modify-function signature="operator&lt;&lt;(qulonglong)" remove="all"/>
- <modify-function signature="operator&lt;&lt;(signed short)" remove="all"/>
- <modify-function signature="operator&lt;&lt;(signed int)" remove="all"/>
+ <modify-function signature="operator&lt;&lt;(short)" remove="all"/>
+ <modify-function signature="operator&lt;&lt;(int)" remove="all"/>
<modify-function signature="operator&lt;&lt;(unsigned int)" remove="all"/>
<modify-function signature="operator&lt;&lt;(unsigned short)" remove="all"/>
<modify-function signature="operator&lt;&lt;(const char*)" remove="all"/>
@@ -3605,9 +3644,9 @@
<modify-function signature="operator&gt;&gt;(double&amp;)" remove="all"/>
<modify-function signature="operator&gt;&gt;(qlonglong&amp;)" remove="all"/>
<modify-function signature="operator&gt;&gt;(qulonglong&amp;)" remove="all"/>
- <modify-function signature="operator&gt;&gt;(signed long&amp;)" remove="all"/>
- <modify-function signature="operator&gt;&gt;(signed int&amp;)" remove="all"/>
- <modify-function signature="operator&gt;&gt;(signed short&amp;)" remove="all"/>
+ <modify-function signature="operator&gt;&gt;(long&amp;)" remove="all"/>
+ <modify-function signature="operator&gt;&gt;(int&amp;)" remove="all"/>
+ <modify-function signature="operator&gt;&gt;(short&amp;)" remove="all"/>
<modify-function signature="operator&gt;&gt;(unsigned long&amp;)" remove="all"/>
<modify-function signature="operator&gt;&gt;(unsigned int&amp;)" remove="all"/>
<modify-function signature="operator&gt;&gt;(unsigned short&amp;)" remove="all"/>
@@ -3620,7 +3659,7 @@
<modify-argument index="return">
<!--<replace-type modified-type="QString" />-->
<conversion-rule class="target">
- QString&amp; res = *%0;
+ QString &amp;res = *%0;
%PYARG_0 = %CONVERTTOPYTHON[QString](res);
</conversion-rule>
</modify-argument>
@@ -3854,9 +3893,9 @@
<modify-function signature="clear()" >
<inject-code class="target" position="beginning">
- for(int counter = 0; counter &lt; %CPPSELF.animationCount(); ++counter ) {
- QAbstractAnimation* animation = %CPPSELF.animationAt(counter);
- PyObject* obj = %CONVERTTOPYTHON[QAbstractAnimation*](animation);
+ for (int counter = 0; counter &lt; %CPPSELF.animationCount(); ++counter ) {
+ QAbstractAnimation *animation = %CPPSELF.animationAt(counter);
+ PyObject *obj = %CONVERTTOPYTHON[QAbstractAnimation*](animation);
Shiboken::Object::setParent(NULL, obj);
Py_DECREF(obj);
}
@@ -3980,11 +4019,11 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
</modify-argument>
<inject-code>
if (PyObject_TypeCheck(%1, &amp;PySideSignalInstanceType)) {
- PyObject* dataSource = PySide::Signal::getObject((PySideSignalInstance*) %PYARG_1);
+ PyObject *dataSource = PySide::Signal::getObject((PySideSignalInstance*)%PYARG_1);
Shiboken::AutoDecRef obType(PyObject_Type(dataSource));
QObject* sender = %CONVERTTOCPP[QObject*](dataSource);
if (sender) {
- const char* dataSignature = PySide::Signal::getSignature((PySideSignalInstance*) %PYARG_1);
+ const char *dataSignature = PySide::Signal::getSignature((PySideSignalInstance*)%PYARG_1);
QByteArray signature(dataSignature); // Append SIGNAL flag (2)
%0 = new QSignalTransitionWrapper(sender, "2" + signature, %2);
}
@@ -4009,7 +4048,7 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
<inject-code class="target" position="beginning">
QString signalName(%2);
if (PySide::SignalManager::registerMetaMethod(%1, signalName.mid(1).toLatin1().data(), QMetaMethod::Signal)) {
- QSignalTransition* %0 = %CPPSELF->addTransition(%1, %2, %3);
+ QSignalTransition *%0 = %CPPSELF->addTransition(%1, %2, %3);
%PYARG_0 = %CONVERTTOPYTHON[QSignalTransition*](%0);
} else {
Py_INCREF(Py_None);
@@ -4037,9 +4076,9 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
// http://bugs.openbossa.org/show_bug.cgi?id=362
if (!PyObject_TypeCheck(%1, &amp;PySideSignalInstanceType))
goto Sbk_%TYPEFunc_%FUNCTION_NAME_TypeError;
- PySideSignalInstance* signalInstance = reinterpret_cast&lt;PySideSignalInstance*&gt;(%1);
+ PySideSignalInstance *signalInstance = reinterpret_cast&lt;PySideSignalInstance*&gt;(%1);
QObject* sender = %CONVERTTOCPP[QObject*](PySide::Signal::getObject(signalInstance));
- QSignalTransition* %0 = %CPPSELF->%FUNCTION_NAME(sender, PySide::Signal::getSignature(signalInstance), %2);
+ QSignalTransition *%0 = %CPPSELF->%FUNCTION_NAME(sender, PySide::Signal::getSignature(signalInstance), %2);
%PYARG_0 = %CONVERTTOPYTHON[QSignalTransition*](%0);
</inject-code>
</add-function>
@@ -4072,7 +4111,7 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
<add-function signature="configuration()" return-type="list of QAbstractState" >
<inject-code class="target" position="beginning">
%PYARG_0 = PySet_New(0);
- foreach(QAbstractState* abs_state, %CPPSELF.configuration()) {
+ foreach(QAbstractState *abs_state, %CPPSELF.configuration()) {
Shiboken::AutoDecRef obj(%CONVERTTOPYTHON[QAbstractState*](abs_state));
Shiboken::Object::setParent(self, obj);
PySet_Add(%PYARG_0, obj);
@@ -4085,7 +4124,7 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
<add-function signature="defaultAnimations()" return-type="list of QAbstractAnimation" >
<inject-code class="target" position="beginning">
%PYARG_0 = PyList_New(0);
- foreach(QAbstractAnimation* abs_anim, %CPPSELF.defaultAnimations()) {
+ foreach(QAbstractAnimation *abs_anim, %CPPSELF.defaultAnimations()) {
Shiboken::AutoDecRef obj(%CONVERTTOPYTHON[QAbstractAnimation*](abs_anim));
Shiboken::Object::setParent(self, obj);
PyList_Append(%PYARG_0, obj);
@@ -4096,6 +4135,14 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
<object-type name="QVariantAnimation" since="4.6"/>
+ <value-type name="QVersionNumber" since="5.6">
+ <modify-function signature="fromString(const QString &amp;,int*)">
+ <modify-argument index="2">
+ <remove-argument/>
+ </modify-argument>
+ </modify-function>
+ </value-type>
+
<!-- From Qt4.6 ^^^ -->
<add-function signature="SIGNAL(const char*)" return-type="str">
@@ -4151,17 +4198,17 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
</inject-code>
<add-function signature="qRegisterResourceData(int, PyBytes, PyBytes, PyBytes)" return-type="bool">
<inject-code class="target" position="beginning">
- %RETURN_TYPE %0 = %FUNCTION_NAME(%1, (uchar*)PyBytes_AS_STRING(%PYARG_2),
- (uchar*)PyBytes_AS_STRING(%PYARG_3),
- (uchar*)PyBytes_AS_STRING(%PYARG_4));
+ %RETURN_TYPE %0 = %FUNCTION_NAME(%1, reinterpret_cast&lt;uchar*&gt;(PyBytes_AS_STRING(%PYARG_2)),
+ reinterpret_cast&lt;uchar*&gt;(PyBytes_AS_STRING(%PYARG_3)),
+ reinterpret_cast&lt;uchar*&gt;(PyBytes_AS_STRING(%PYARG_4)));
%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
</inject-code>
</add-function>
<add-function signature="qUnregisterResourceData(int, PyBytes, PyBytes, PyBytes)" return-type="bool">
<inject-code class="target" position="beginning">
- %RETURN_TYPE %0 = %FUNCTION_NAME(%1, (uchar*)PyBytes_AS_STRING(%PYARG_2),
- (uchar*)PyBytes_AS_STRING(%PYARG_3),
- (uchar*)PyBytes_AS_STRING(%PYARG_4));
+ %RETURN_TYPE %0 = %FUNCTION_NAME(%1, reinterpret_cast&lt;uchar*&gt;(PyBytes_AS_STRING(%PYARG_2)),
+ reinterpret_cast&lt;uchar*&gt;(PyBytes_AS_STRING(%PYARG_3)),
+ reinterpret_cast&lt;uchar*&gt;(PyBytes_AS_STRING(%PYARG_4)));
%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
</inject-code>
</add-function>
@@ -4213,7 +4260,7 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
<!-- TODO: this need be removed -->
<suppress-warning text="skipping function '*', unmatched return type '*'"/>
- <suppress-warning text="skipping function '*', unmatched parameter type '*'"/>
+ <suppress-warning text="skipping function '*', unmatched type '*"/>
<suppress-warning text="enum 'q_static_assert_result39' does not have a type entry or is not an enum"/>
<suppress-warning text="horribly broken type ''"/>
@@ -4231,4 +4278,16 @@ s1.addTransition(button.clicked, s1h)&lt;/code>
<suppress-warning text="enum 'RelationFlag' does not have a type entry or is not an enum" />
<suppress-warning text="enum 'Role' does not have a type entry or is not an enum" />
+ <!-- Anonymous enum in qtbase/src/corelib/global/qtypeinfo.h -->
+ <suppress-warning text="enum 'Q_RELOCATABLE_TYPE' does not have a type entry or is not an enum" />
+
+ <!-- Another anonymous enum / value pair in in qtbase/src/corelib/kernel/qcoreapplication.h -->
+ <suppress-warning text="no matching enum 'QT_VERSION'" />
+ <suppress-warning text="unhandled enum value: QT_VERSION in QCoreApplication::ApplicationFlags from header 'qcoreapplication.h'" />
+ <suppress-warning text="unmatched enum QT_VERSION from header 'qcoreapplication.h'" />
+
+ <suppress-warning text="skipping field 'QSysInfo::WindowsVersion' with unmatched type 'const QSysInfo::WinVersion'" />
+ <suppress-warning text="template baseclass 'QListSpecialMethods&lt;T&gt;' of 'QList' is not known" />
+
+
</typesystem>
diff --git a/sources/pyside2/PySide2/QtDataVisualization/CMakeLists.txt b/sources/pyside2/PySide2/QtDataVisualization/CMakeLists.txt
new file mode 100644
index 000000000..e61a70234
--- /dev/null
+++ b/sources/pyside2/PySide2/QtDataVisualization/CMakeLists.txt
@@ -0,0 +1,70 @@
+project(QtDataVisualization)
+
+set(QtDataVisualization_SRC
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qabstract3daxis_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qcategory3daxis_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qlogvalue3daxisformatter_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qvalue3daxis_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qvalue3daxisformatter_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qabstract3dseries_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qabstractdataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qbar3dseries_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qbardataitem_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qbardataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qcustom3ditem_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qcustom3dlabel_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qcustom3dvolume_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qheightmapsurfacedataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qitemmodelbardataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qitemmodelscatterdataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qitemmodelsurfacedataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qscatter3dseries_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qscatterdataitem_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qscatterdataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qsurface3dseries_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qsurfacedataitem_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qsurfacedataproxy_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dbars_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dcamera_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dlight_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dobject_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dscatter_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dscene_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dsurface_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qabstract3dgraph_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dinputhandler_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qabstract3dinputhandler_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_qtouch3dinputhandler_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_q3dtheme_wrapper.cpp
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_wrapper.cpp
+# module is always needed
+${QtDataVisualization_GEN_DIR}/qtdatavisualization_module_wrapper.cpp
+)
+
+set(QtDataVisualization_include_dirs ${QtDataVisualization_SOURCE_DIR}
+ ${QtDataVisualization_BINARY_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5Gui_INCLUDE_DIRS}
+ ${Qt5DataVisualization_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR})
+
+set(QtDataVisualization_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt5DataVisualization_LIBRARIES}
+ ${Qt5Core_LIBRARIES}
+ ${Qt5Gui_LIBRARIES})
+
+set(QtDataVisualization_deps QtCore QtGui)
+
+create_pyside_module(QtDataVisualization
+ QtDataVisualization_include_dirs
+ QtDataVisualization_libraries
+ QtDataVisualization_deps
+ QtDataVisualization_SOURCE_DIR
+ QtDataVisualization_SRC
+ "")
diff --git a/sources/pyside2/PySide2/QtDataVisualization/typesystem_datavisualization.xml b/sources/pyside2/PySide2/QtDataVisualization/typesystem_datavisualization.xml
new file mode 100644
index 000000000..6b628c9bf
--- /dev/null
+++ b/sources/pyside2/PySide2/QtDataVisualization/typesystem_datavisualization.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+-->
+<typesystem package="PySide2.QtDataVisualization">
+ <rejection class="^.*Proxy.*$" argument-type="^Q.*(DataRow|DataArray)\*.*$"/>
+
+ <template name="cppqlistofptrtoqvectors_to_py_conversion">
+ const int rowCount = %in.size();
+ PyObject* %out = PyList_New(rowCount);
+ for (int r = 0; r &lt; rowCount; ++r) {
+ const QVector&lt;%INTYPE_0&gt; *row = %in.at(r);
+ const int columnCount = row->size();
+ PyObject *pyRow = PyList_New(columnCount);
+ for (int c = 0; c &lt; columnCount; ++c) {
+ const %INTYPE_0 &amp;cppItem = row->at(c);
+ PyList_SET_ITEM(pyRow, c, %CONVERTTOPYTHON[%INTYPE_0](cppItem));
+ }
+ PyList_SET_ITEM(%out, r, pyRow);
+ }
+ return %out;
+ </template>
+ <template name="py_to_cppqlistofptrtoqvectors_conversion">
+ const int rowCount = int(PySequence_Size(%in));
+ %OUTTYPE &amp;result = %out;
+ result.reserve(rowCount);
+ for (int r = 0; r &lt; rowCount; ++r) {
+ Shiboken::AutoDecRef rowItem(PySequence_GetItem(%in, r));
+ const int columnCount = int(PySequence_Size(rowItem));
+ QVector&lt;%OUTTYPE_0&gt; *row = new QVector&lt;%OUTTYPE_0&gt;;
+ row->reserve(columnCount);
+ for (int c = 0; c &lt; columnCount; ++c) {
+ Shiboken::AutoDecRef pyItem(PySequence_GetItem(rowItem, c));
+ %OUTTYPE_0 v = %CONVERTTOCPP[%OUTTYPE_0](pyItem);
+ row->append(v);
+ }
+ result.append(row);
+ }
+ </template>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no" />
+ <namespace-type name="QtDataVisualization">
+ <primitive-type name="QBarDataArray">
+ <include file-name="qbardataproxy.h" location="global"/>
+ <conversion-rule>
+ <native-to-target>
+ <insert-template name="cppqlistofptrtoqvectors_to_py_conversion">
+ <replace from="%INTYPE_0" to="QtDataVisualization::QBarDataItem"/>
+ </insert-template>
+ </native-to-target>
+ <target-to-native>
+ <add-conversion type="PySequence">
+ <insert-template name="py_to_cppqlistofptrtoqvectors_conversion">
+ <replace from="%OUTTYPE_0" to="QtDataVisualization::QBarDataItem"/>
+ </insert-template>
+ </add-conversion>
+ </target-to-native>
+ </conversion-rule>
+ </primitive-type>
+ <primitive-type name="QSurfaceDataArray">
+ <include file-name="qsurfacedataproxy.h" location="global"/>
+ <conversion-rule>
+ <native-to-target>
+ <insert-template name="cppqlistofptrtoqvectors_to_py_conversion">
+ <replace from="%INTYPE_0" to="QtDataVisualization::QSurfaceDataItem"/>
+ </insert-template>
+ </native-to-target>
+ <target-to-native>
+ <add-conversion type="PySequence">
+ <insert-template name="py_to_cppqlistofptrtoqvectors_conversion">
+ <replace from="%OUTTYPE_0" to="QtDataVisualization::QSurfaceDataItem"/>
+ </insert-template>
+ </add-conversion>
+ </target-to-native>
+ </conversion-rule>
+ </primitive-type>
+
+ <object-type name="QAbstract3DAxis">
+ <enum-type name="AxisOrientation"/>
+ <enum-type name="AxisType"/>
+ </object-type>
+ <object-type name="QCategory3DAxis"/>
+ <object-type name="QLogValue3DAxisFormatter"/>
+ <object-type name="QValue3DAxis"/>
+ <object-type name="QValue3DAxisFormatter"/>
+ <object-type name="QAbstract3DSeries">
+ <enum-type name="Mesh"/>
+ <enum-type name="SeriesType"/>
+ </object-type>
+ <object-type name="QAbstractDataProxy">
+ <enum-type name="DataType"/>
+ </object-type>
+ <object-type name="QBar3DSeries"/>
+ <value-type name="QBarDataItem"/>
+ <object-type name="QBarDataProxy"/>
+ <object-type name="QCustom3DItem"/>
+ <object-type name="QCustom3DLabel"/>
+ <object-type name="QCustom3DVolume"/>
+ <object-type name="QHeightMapSurfaceDataProxy"/>
+ <object-type name="QItemModelBarDataProxy">
+ <enum-type name="MultiMatchBehavior"/>
+ </object-type>
+ <object-type name="QItemModelScatterDataProxy"/>
+ <object-type name="QItemModelSurfaceDataProxy">
+ <enum-type name="MultiMatchBehavior"/>
+ </object-type>
+ <object-type name="QScatter3DSeries"/>
+ <value-type name="QScatterDataItem"/>
+ <object-type name="QScatterDataProxy"/>
+ <object-type name="QSurface3DSeries">
+ <enum-type name="DrawFlag" flags="DrawFlags"/>
+ </object-type>
+ <value-type name="QSurfaceDataItem"/>
+ <object-type name="QSurfaceDataProxy"/>
+ <object-type name="Q3DBars"/>
+ <object-type name="Q3DCamera">
+ <enum-type name="CameraPreset"/>
+ </object-type>
+ <object-type name="Q3DLight"/>
+ <object-type name="Q3DObject"/>
+ <object-type name="Q3DScatter"/>
+ <object-type name="Q3DScene"/>
+ <object-type name="Q3DSurface"/>
+ <object-type name="QAbstract3DGraph">
+ <enum-type name="ElementType"/>
+ <enum-type name="OptimizationHint" flags="OptimizationHints"/>
+ <enum-type name="SelectionFlag" flags="SelectionFlags"/>
+ <enum-type name="ShadowQuality"/>
+ </object-type>
+ <object-type name="Q3DInputHandler"/>
+ <object-type name="QAbstract3DInputHandler">
+ <enum-type name="InputView"/>
+ </object-type>
+ <object-type name="QTouch3DInputHandler"/>
+ <object-type name="Q3DTheme">
+ <enum-type name="ColorStyle"/>
+ <enum-type name="Theme"/>
+ </object-type>
+ <extra-includes>
+ <include file-name="qutils.h" location="global"/>
+ </extra-includes>
+ </namespace-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtGui/CMakeLists.txt b/sources/pyside2/PySide2/QtGui/CMakeLists.txt
index a6a8c1049..784280ca6 100644
--- a/sources/pyside2/PySide2/QtGui/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtGui/CMakeLists.txt
@@ -3,6 +3,7 @@ project(QtGui)
qt5_wrap_cpp(QPYTEXTOBJECT_MOC "${pyside2_SOURCE_DIR}/qpytextobject.h")
set(QtGui_SRC
+${QtGui_GEN_DIR}/qabstractopenglfunctions_wrapper.cpp
${QtGui_GEN_DIR}/qabstracttextdocumentlayout_paintcontext_wrapper.cpp
${QtGui_GEN_DIR}/qabstracttextdocumentlayout_selection_wrapper.cpp
${QtGui_GEN_DIR}/qabstracttextdocumentlayout_wrapper.cpp
@@ -66,6 +67,23 @@ ${QtGui_GEN_DIR}/qmatrix4x4_wrapper.cpp
${QtGui_GEN_DIR}/qmouseevent_wrapper.cpp
${QtGui_GEN_DIR}/qmoveevent_wrapper.cpp
${QtGui_GEN_DIR}/qmovie_wrapper.cpp
+${QtGui_GEN_DIR}/qoffscreensurface_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglcontextgroup_wrapper.cpp
+${QtGui_GEN_DIR}/qopengldebuglogger_wrapper.cpp
+${QtGui_GEN_DIR}/qopengldebugmessage_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglextrafunctions_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglframebufferobjectformat_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglfunctions_wrapper.cpp
+# Compile error on Windows: ${QtGui_GEN_DIR}/qopenglpaintdevice_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglpixeltransferoptions_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglshaderprogram_wrapper.cpp
+${QtGui_GEN_DIR}/qopengltexture_wrapper.cpp
+${QtGui_GEN_DIR}/qopengltimemonitor_wrapper.cpp
+${QtGui_GEN_DIR}/qopengltimerquery_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglversionprofile_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglvertexarrayobject_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglvertexarrayobject_binder_wrapper.cpp
+${QtGui_GEN_DIR}/qopenglwindow_wrapper.cpp
${QtGui_GEN_DIR}/qpagedpaintdevice_margins_wrapper.cpp
${QtGui_GEN_DIR}/qpagedpaintdevice_wrapper.cpp
${QtGui_GEN_DIR}/qpagelayout_wrapper.cpp
@@ -174,8 +192,8 @@ ${QtGui_GEN_DIR}/qtgui_module_wrapper.cpp
configure_file("${QtGui_SOURCE_DIR}/typesystem_gui.xml.in"
"${QtGui_BINARY_DIR}/typesystem_gui.xml" @ONLY)
-make_path(QtGui_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR}
- ${QtGui_SOURCE_DIR})
+configure_file("${QtGui_SOURCE_DIR}/QtGui_global.post.h.in"
+ "${QtGui_BINARY_DIR}/QtGui_global.post.h" @ONLY)
set(QtGui_include_dirs ${QtGui_SOURCE_DIR}
${QtGui_BINARY_DIR}
@@ -197,7 +215,7 @@ create_pyside_module(QtGui
QtGui_include_dirs
QtGui_libraries
QtGui_deps
- QtGui_typesystem_path
+ QtGui_SOURCE_DIR
QtGui_SRC
QPYTEXTOBJECT_MOC
${QtGui_BINARY_DIR}/typesystem_gui.xml)
diff --git a/sources/pyside2/PySide2/QtGui/QtGui_global.post.h.in b/sources/pyside2/PySide2/QtGui/QtGui_global.post.h.in
new file mode 100644
index 000000000..6d3a3eeac
--- /dev/null
+++ b/sources/pyside2/PySide2/QtGui/QtGui_global.post.h.in
@@ -0,0 +1 @@
+#include "qpytextobject.h" // PySide class
diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui.xml.in b/sources/pyside2/PySide2/QtGui/typesystem_gui.xml.in
index 0de65876a..ee909875e 100644
--- a/sources/pyside2/PySide2/QtGui/typesystem_gui.xml.in
+++ b/sources/pyside2/PySide2/QtGui/typesystem_gui.xml.in
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtGui">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui_@AUTO_OS@.xml" generate="yes"/>
- <load-typesystem name="typesystem_gui_common.xml" generate="yes"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui_@AUTO_OS@.xml" generate="yes"/>
+ <load-typesystem name="QtGui/typesystem_gui_common.xml" generate="yes"/>
</typesystem>
diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml
index 2578a1aa9..0f6d48968 100644
--- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml
+++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtGui">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
<template name="QFontCharFix">
int size = Shiboken::String::len(%PYARG_1);
@@ -54,6 +54,7 @@
}
</template>
+ <rejection class="^Q.*$" argument-type="^QPlatform.*$"/>
<function signature="qAlpha(uint)" />
<function signature="qBlue(uint)" />
<function signature="qGray(int,int,int)" />
@@ -96,6 +97,21 @@
<rejection class="*" function-name="d_func"/>
<rejection class="*" field-name="d_ptr"/>
<rejection class="*" field-name="d"/>
+ <rejection class="^QOpenGL.*$" argument-type="^GLboolean( const)?\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="^GLchar\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="GLchar *const const*"/>
+ <rejection class="^QOpenGL.*$" argument-type="^char\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="^char( const)?\*\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="GLintptr"/>
+ <rejection class="^QOpenGL.*$" argument-type="GLsizeiptr"/>
+ <rejection class="^QOpenGL.*$" argument-type="GLsync"/>
+ <rejection class="^QOpenGL.*$" argument-type="^GLubyte( const)?\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="^QMatrix.x.( const)?\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="qopengl_GLintptr"/>
+ <rejection class="^QOpenGL.*$" argument-type="qopengl_GLsizeiptr"/>
+ <rejection class="^QOpenGL.*$" argument-type="QOpenGLTextureHelper*"/>
+ <rejection class="^QOpenGL.*$" argument-type="^QVector.D( const)?\*$"/>
+ <rejection class="^QOpenGL.*$" argument-type="^void( const)?\*\*$"/>
<!--
Event classes have a lot of non-documented protected fields, those fields
@@ -293,6 +309,8 @@
}
</inject-code>
</add-function>
+ <!-- Disambiguate from Qt3DCore/qtransform.h -->
+ <include file-name="QtGui/qtransform.h" location="global"/>
</value-type>
<value-type name="QStaticText">
@@ -305,7 +323,7 @@
<replace-type modified-type="PyBuffer"/>
</modify-argument>
<inject-code>
- uchar* buffer = (uchar*) Shiboken::Buffer::getPointer(%PYARG_2);
+ uchar *buffer = reinterpret_cast&lt;uchar*&gt;(Shiboken::Buffer::getPointer(%PYARG_2));
QBitmap %0 = QBitmap::fromData(%1, buffer, %3);
%PYARG_0 = %CONVERTTOPYTHON[QBitmap](%0);
</inject-code>
@@ -422,11 +440,11 @@
<modify-argument index="1">
<replace-type modified-type="PyBuffer"/>
<conversion-rule class="target">
- PyObject* %out = Shiboken::Buffer::newObject(%in, size);
+ PyObject *%out = Shiboken::Buffer::newObject(%in, size);
</conversion-rule>
<conversion-rule class="native">
Py_ssize_t bufferLen;
- char* %out = (char*) Shiboken::Buffer::getPointer(%PYARG_1, &amp;bufferLen);
+ char *%out = reinterpret_cast&lt;char*&gt;(Shiboken::Buffer::getPointer(%PYARG_1, &amp;bufferLen));
</conversion-rule>
</modify-argument>
<modify-argument index="2">
@@ -475,7 +493,7 @@
</add-function>
<modify-function signature="setUserData(QTextBlockUserData*)">
<inject-code class="target" position="end">
- const QTextDocument* doc = %CPPSELF.document();
+ const QTextDocument *doc = %CPPSELF.document();
if (doc) {
Shiboken::AutoDecRef pyDocument(%CONVERTTOPYTHON[QTextDocument*](doc));
Shiboken::Object::setParent(pyDocument, %PYARG_1);
@@ -487,7 +505,7 @@
<define-ownership class="target" owner="default"/>
</modify-argument>
<inject-code class="target" position="end">
- const QTextDocument* doc = %CPPSELF.document();
+ const QTextDocument *doc = %CPPSELF.document();
if (doc) {
Shiboken::AutoDecRef pyDocument(%CONVERTTOPYTHON[QTextDocument*](doc));
Shiboken::Object::setParent(pyDocument, %PYARG_0);
@@ -522,7 +540,7 @@
</extra-includes>
<add-function signature="__reduce__" return-type="PyObject*">
<inject-code class="target" position="beginning">
- PyObject* points = PyList_New(%CPPSELF.count());
+ PyObject *points = PyList_New(%CPPSELF.count());
for (int i = 0, max = %CPPSELF.count(); i &lt; max; ++i){
int x, y;
%CPPSELF.point(i, &amp;x, &amp;y);
@@ -590,7 +608,7 @@
}
}
- const char** xpm = (const char**) malloc (lineCount * sizeof(const char**));
+ const char **xpm = reinterpret_cast&lt;const char**&gt;(malloc(lineCount * sizeof(const char**)));
for (int line = 0; line &lt; lineCount; ++line)
xpm[line] = Shiboken::String::toCString(PySequence_Fast_GET_ITEM(strList.object(), line));
@@ -617,7 +635,7 @@
%0 = new %TYPE(QPixmap::fromImage(%1));
</inject-code>
</add-function>
- <modify-function signature="QPixmap(const char **)">
+ <modify-function signature="QPixmap(const char*[])">
<modify-argument index="1">
<replace-type modified-type="PySequence" />
</modify-argument>
@@ -633,7 +651,7 @@
<modify-argument index="1">
<replace-type modified-type="PyBytes"/>
<conversion-rule class="native">
- const uchar* %out = reinterpret_cast&lt;const uchar*>(PyBytes_AS_STRING(%PYARG_1));
+ const uchar *%out = reinterpret_cast&lt;const uchar*>(PyBytes_AS_STRING(%PYARG_1));
</conversion-rule>
</modify-argument>
<modify-argument index="2">
@@ -802,7 +820,7 @@
</extra-includes>
<template name="qimage_buffer_constructor">
- uchar* ptr = (uchar*) Shiboken::Buffer::getPointer(%PYARG_1);
+ uchar *ptr = reinterpret_cast&lt;uchar*&gt;(Shiboken::Buffer::getPointer(%PYARG_1));
%0 = new %TYPE(ptr, %ARGS);
</template>
<modify-function signature="QImage(uchar *,int,int,int,QImage::Format,QImageCleanupFunction, void *)">
@@ -846,7 +864,7 @@
<modify-function signature="QImage(const uchar*,int,int,QImage::Format,QImageCleanupFunction, void *)" remove="all" />
<!-- ### -->
- <modify-function signature="QImage(const char**)">
+ <modify-function signature="QImage(const char*[])">
<modify-argument index="1">
<replace-type modified-type="PySequence" />
</modify-argument>
@@ -985,7 +1003,7 @@
<add-function signature="__setstate__(PyObject*)" return-type="PyObject">
<inject-code>
Shiboken::AutoDecRef func(PyObject_GetAttr(%PYSELF, PyTuple_GET_ITEM(%1, 0)));
- PyObject* args = PyTuple_GET_ITEM(%1, 1);
+ PyObject *args = PyTuple_GET_ITEM(%1, 1);
%PYARG_0 = PyObject_Call(func, args, NULL);
</inject-code>
</add-function>
@@ -1300,7 +1318,7 @@
<replace-type modified-type="PyObject"/>
</modify-argument>
<inject-code class="target" position="beginning">
- int* array = NULL;
+ int *array = nullptr;
bool errorOccurred = false;
if (numArgs == 5) {
@@ -1328,7 +1346,7 @@
<replace-type modified-type="PyObject"/>
</modify-argument>
<inject-code class="target" position="beginning">
- int* array = NULL;
+ int *array = nullptr;
bool errorOccurred = false;
if (numArgs == 4) {
@@ -1376,7 +1394,7 @@
<replace-type modified-type="PyObject"/>
</modify-argument>
<inject-code class="target" position="beginning">
- int* array = NULL;
+ int *array = nullptr;
bool errorOccurred = false;
if (numArgs == 8) {
@@ -1404,7 +1422,7 @@
<replace-type modified-type="PyObject"/>
</modify-argument>
<inject-code class="target" position="beginning">
- int* array = NULL;
+ int *array = nullptr;
bool errorOccurred = false;
if (numArgs == 5) {
@@ -1432,7 +1450,7 @@
<replace-type modified-type="PyObject"/>
</modify-argument>
<inject-code class="target" position="beginning">
- int* array = NULL;
+ int *array = nullptr;
bool errorOccurred = false;
if (numArgs == 4) {
@@ -1597,9 +1615,9 @@
<modify-function signature="setChild(int, int, QStandardItem *)">
<inject-code class="target" position="beginning">
// Clear parent from the old child
- QStandardItem* _i = %CPPSELF->child(%1, %2);
+ QStandardItem *_i = %CPPSELF->child(%1, %2);
if (_i) {
- PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
+ PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
Shiboken::Object::setParent(0, _pyI);
}
</inject-code>
@@ -1610,9 +1628,9 @@
<modify-function signature="setChild(int, QStandardItem *)">
<inject-code class="target" position="beginning">
// Clear parent from the old child
- QStandardItem* _i = %CPPSELF->child(%1);
+ QStandardItem *_i = %CPPSELF->child(%1);
if (_i) {
- PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
+ PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
Shiboken::Object::setParent(0, _pyI);
}
</inject-code>
@@ -1990,9 +2008,9 @@
<modify-function signature="setItem(int, int, QStandardItem*)">
<inject-code class="target" position="beginning">
// Clear parent from the old child
- QStandardItem* _i = %CPPSELF->item(%1, %2);
+ QStandardItem *_i = %CPPSELF->item(%1, %2);
if (_i) {
- PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
+ PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
Shiboken::Object::setParent(0, _pyI);
}
</inject-code>
@@ -2003,9 +2021,9 @@
<modify-function signature="setItem(int, QStandardItem*)">
<inject-code class="target" position="beginning">
// Clear parent from the old child
- QStandardItem* _i = %CPPSELF->item(%1);
+ QStandardItem *_i = %CPPSELF->item(%1);
if (_i) {
- PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
+ PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
Shiboken::Object::setParent(0, _pyI);
}
</inject-code>
@@ -2022,9 +2040,9 @@
<modify-function signature="setVerticalHeaderItem(int, QStandardItem*)">
<inject-code class="target" position="beginning">
// Clear parent from the old child
- QStandardItem* _i = %CPPSELF->verticalHeaderItem(%1);
+ QStandardItem *_i = %CPPSELF->verticalHeaderItem(%1);
if (_i) {
- PyObject* _pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
+ PyObject *_pyI = %CONVERTTOPYTHON[QStandardItem*](_i);
Shiboken::Object::setParent(0, _pyI);
}
</inject-code>
@@ -2071,13 +2089,13 @@
<modify-function signature="clear()">
<inject-code class="target" position="beginning">
- Shiboken::BindingManager&amp; bm = Shiboken::BindingManager::instance();
- SbkObject* pyRoot = bm.retrieveWrapper(%CPPSELF.invisibleRootItem());
+ Shiboken::BindingManager &amp;bm = Shiboken::BindingManager::instance();
+ SbkObject *pyRoot = bm.retrieveWrapper(%CPPSELF.invisibleRootItem());
if (pyRoot) {
Shiboken::Object::destroy(pyRoot, %CPPSELF.invisibleRootItem());
}
- for(int r=0, r_max = %CPPSELF.rowCount(); r &lt; r_max; r++) {
+ for (int r=0, r_max = %CPPSELF.rowCount(); r &lt; r_max; r++) {
QList&lt;QStandardItem *&gt; ri = %CPPSELF.takeRow(0);
PyObject *pyResult = %CONVERTTOPYTHON[QList&lt;QStandardItem * &gt;](ri);
@@ -2968,7 +2986,7 @@
<inject-code class="target" position="beginning">
if (PySequence_Size(%PYARG_1) == 16) {
float values[16];
- for(int i=0; i &lt; 16; i++) {
+ for (int i=0; i &lt; 16; i++) {
PyObject *pv = PySequence_Fast_GET_ITEM(%PYARG_1, i);
values[i] = PyFloat_AsDouble(pv);
}
@@ -2998,7 +3016,7 @@
float values[16];
%CPPSELF.%FUNCTION_NAME(values);
%PYARG_0 = PyTuple_New(16);
- for(int i=0; i &lt; 16; i++) {
+ for (int i = 0; i &lt; 16; i++) {
PyObject *v = PyFloat_FromDouble(values[i]);
PyTuple_SET_ITEM(%PYARG_0, i, v);
}
@@ -3028,8 +3046,8 @@
if (PySequence_Check(_key)) {
Shiboken::AutoDecRef key(PySequence_Fast(_key, "Invalid matrix index."));
if (PySequence_Fast_GET_SIZE(key.object()) == 2) {
- PyObject* posx = PySequence_Fast_GET_ITEM(key.object(), 0);
- PyObject* posy = PySequence_Fast_GET_ITEM(key.object(), 1);
+ PyObject *posx = PySequence_Fast_GET_ITEM(key.object(), 0);
+ PyObject *posy = PySequence_Fast_GET_ITEM(key.object(), 1);
Py_ssize_t x = PyInt_AsSsize_t(posx);
Py_ssize_t y = PyInt_AsSsize_t(posy);
float ret = (*%CPPSELF)(x,y);
@@ -3210,6 +3228,7 @@
<enum-type name="RenderableType"/>
<enum-type name="SwapBehavior"/>
</value-type>
+ <object-type name="QOffscreenSurface" since="5.1"/>
<primitive-type name="QPlatformSurface">
<extra-includes>
<include file-name="QtGui/qpa/qplatformsurface.h" location="global"/>
@@ -3263,19 +3282,400 @@
<object-type name="QOpenGLContext">
<enum-type name="OpenGLModuleType" />
</object-type>
- <object-type name="QOpenGLFramebufferObject">
+ <object-type name="QOpenGLContextGroup" since="5.0"/>
+ <object-type name="QOpenGLDebugLogger" since="5.1">
+ <enum-type name="LoggingMode"/>
+ </object-type>
+ <value-type name="QOpenGLDebugMessage" since="5.1">
+ <enum-type name="Source" flags="Sources"/>
+ <enum-type name="Type" flags="Types"/>
+ <enum-type name="Severity" flags="Severities"/>
+ </value-type>
+ <object-type name="QOpenGLFramebufferObject" since="5.0">
<enum-type name="Attachment" />
<enum-type name="FramebufferRestorePolicy" since="5.7"/>
</object-type>
- <object-type name="QOpenGLShader" >
- <enum-type name="ShaderTypeBit" flags="ShaderType" />
+ <value-type name="QOpenGLFramebufferObjectFormat"/>
+ <!-- Compile error on Windows: QOpenGLPaintDevice::QOpenGLPaintDevice(const QOpenGLPaintDevice &)': attempting to reference a deleted function
+ <object-type name="QOpenGLPaintDevice" since="5.0"/>
+ -->
+ <object-type name="QOpenGLExtraFunctions" since="5.6">
+ <!-- Exlusions due to compile errors -->
+ <modify-function signature="glEndTransformFeedback()" remove="all"/>
+ <modify-function signature="glPauseTransformFeedback()" remove="all"/>
+ <modify-function signature="glResumeTransformFeedback()" remove="all"/>
+ <modify-function signature="^glClearBuffer.*\(.*$">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glDeleteProgramPipelines(int,const unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glDeleteQueries(int,const unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glDeleteSamplers(int,const unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glDeleteTransformFeedbacks(int,const unsigned int *)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glDeleteVertexArrays(int,const unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glDrawBuffers(int,const unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGenProgramPipelines(int,unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGenQueries(int,unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGenSamplers(int,unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGenTransformFeedbacks(int,unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGenVertexArrays(int,unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetActiveUniformBlockiv(unsigned int,unsigned int,unsigned int,int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetActiveUniformsiv(unsigned int,int,const unsigned int*,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetFramebufferParameteriv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetIntegeri_v(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetInternalformativ(unsigned int,unsigned int,unsigned int,int,int*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetMultisamplefv(unsigned int,unsigned int,float*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetProgramInterfaceiv(unsigned int,unsigned int,unsigned int,int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetProgramPipelineiv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetProgramResourceiv(unsigned int,unsigned int,unsigned int,int,const unsigned int*,int,int*,int*)">
+ <modify-argument index="5"><array/></modify-argument>
+ <modify-argument index="7"><array/></modify-argument>
+ <modify-argument index="8"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetQueryObjectuiv(unsigned int,unsigned int,unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetQueryiv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetSamplerParameterfv(unsigned int,unsigned int,float*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetSamplerParameteriv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetTexLevelParameteriv(unsigned int,int,unsigned int,int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetTexLevelParameterfv(unsigned int,int,unsigned int,float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetUniformuiv(unsigned int,int,unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetVertexAttribIiv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetVertexAttribIuiv(unsigned int,unsigned int,unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glInvalidateFramebuffer(unsigned int,int,const unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glInvalidateSubFramebuffer(unsigned int,int,const unsigned int*,int,int,int,int)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform1fv(unsigned int,int,int,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform1iv(unsigned int,int,int,const int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform1uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform2fv(unsigned int,int,int,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform2iv(unsigned int,int,int,const int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform2uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform3fv(unsigned int,int,int,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform3iv(unsigned int,int,int,const int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform3uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform4fv(unsigned int,int,int,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform4iv(unsigned int,int,int,const int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniform4uiv(unsigned int,int,int,const unsigned int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix2fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix2x3fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix2x4fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix3fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix3x2fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix3x4fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix4fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix4x2fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glProgramUniformMatrix4x3fv(unsigned int,int,int,unsigned char,const float*)">
+ <modify-argument index="5"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glSamplerParameterfv(unsigned int,unsigned int,const float*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glSamplerParameteriv(unsigned int,unsigned int,const int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniform1uiv(int,int,const unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniform2uiv(int,int,const unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniform3uiv(int,int,const unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniform4uiv(int,int,const unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniformMatrix2x3fv(int,int,unsigned char,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniformMatrix2x4fv(int,int,unsigned char,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniformMatrix3x2fv(int,int,unsigned char,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniformMatrix3x4fv(int,int,unsigned char,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniformMatrix4x2fv(int,int,unsigned char,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glUniformMatrix4x3fv(int,int,unsigned char,const float*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glVertexAttribI4iv(unsigned int,const int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glVertexAttribI4uiv(unsigned int,const unsigned int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetStringi(unsigned int,unsigned int)">
+ <modify-argument index="return">
+ <replace-type modified-type="QString" />
+ </modify-argument>
+ <inject-code class="target" position="beginning">
+ <insert-template name="glGetString_return_QString"/>
+ </inject-code>
+ </modify-function>
+ </object-type>
+ <object-type name="QOpenGLFunctions" since="5.0">
+ <enum-type name="OpenGLFeature" flags="OpenGLFeatures"/>
+ <modify-function signature="glGetAttachedShaders(unsigned int,int,int*,unsigned int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetBufferParameteriv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetFloatv(unsigned int,float*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetFramebufferAttachmentParameteriv(unsigned int,unsigned int,unsigned int,int*)">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetIntegerv(unsigned int,int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetProgramiv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetRenderbufferParameteriv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetShaderiv(unsigned int,unsigned int,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetShaderPrecisionFormat(unsigned int,unsigned int,int*,int*)">
+ <modify-argument index="3"><array/></modify-argument>
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^glDelete.*s\(.*$">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^glGen[A-Z].*s\(.*$">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^gl(Get)?TexParameter[fi]v\(.*$">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^glUniformMatrix\dfv\(.*$">
+ <modify-argument index="4"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^gl(Get)?Uniform\d?.v\(.*$">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^glVertexAttrib\dfv\(.*$">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="^glGetVertexAttrib[fi]v\(.*$">
+ <modify-argument index="3"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="glGetString(unsigned int)">
+ <modify-argument index="return">
+ <replace-type modified-type="QString" />
+ </modify-argument>
+ <inject-code class="target" position="beginning">
+ <insert-template name="glGetString_return_QString"/>
+ </inject-code>
+ </modify-function>
</object-type>
- <!-- Temporarily disable type, because it causes segfault on Linux due to incorrect parsing
- of the void setUniformValue(const char *name, const GLfloat value[2][2]); method.
- The float[][] ends up with an "Array" cpp signature, which obviously can't be found in the
- typesystem.
- <object-type name="QOpenGLShaderProgram" />
+ <object-type name="QAbstractOpenGLFunctions" since="5.1"/>
+ <!-- Classes are result of a macro expansion in src/gui/opengl/qopenglversionfunctions.h
+ <object-type name="QOpenGLFunctions_1_0" since="5.1"/>
+ <object-type name="QOpenGLFunctions_1_1" since="5.1"/>
+ <object-type name="QOpenGLFunctions_1_2" since="5.1"/>
+ <object-type name="QOpenGLFunctions_1_3" since="5.1"/>
+ <object-type name="QOpenGLFunctions_1_4" since="5.1"/>
+ <object-type name="QOpenGLFunctions_1_5" since="5.1"/>
+ <object-type name="QOpenGLFunctions_2_0" since="5.1">
+ <object-type name="QOpenGLFunctions_2_1" since="5.1"/>
+ <object-type name="QOpenGLFunctions_3_0" since="5.1"/>
+ <object-type name="QOpenGLFunctions_3_1" since="5.1"/>
+ <object-type name="QOpenGLFunctions_3_2_Compatibility" since="5.1"/>
+ <object-type name="QOpenGLFunctions_3_2_Core" since="5.1"/>
+ <object-type name="QOpenGLFunctions_3_3_Compatibility" since="5.1"/>
+ <object-type name="QOpenGLFunctions_3_3_Core" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_0_Compatibility" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_0_Core" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_1_Compatibility" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_1_Core" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_2_Compatibility" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_2_Core" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_3_Compatibility" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_3_Core" since="5.1"/>
+ <object-type name="QOpenGLFunctions_4_4_Compatibility" since="5.5/>
+ <object-type name="QOpenGLFunctions_4_4_Core" since="5.5"/>
+ <object-type name="QOpenGLFunctions_4_5_Compatibility since="5.5""/>
+ <object-type name="QOpenGLFunctions_4_5_Core" since="5.5"/>
+ <object-type name="QOpenGLFunctions_ES2" since="5.1"/>
-->
+ <value-type name="QOpenGLPixelTransferOptions"/>
+ <object-type name="QOpenGLShader" since="5.0">
+ <enum-type name="ShaderTypeBit" flags="ShaderType" />
+ </object-type>
+ <object-type name="QOpenGLShaderProgram" since="5.0">
+ <modify-function signature="setAttributeArray(int,const float*,int,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setAttributeArray(const char*,const float*,int,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setAttributeValue(int,const float*,int,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setAttributeValue(const char*,const float*,int,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setUniformValueArray(int,const float*,int,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setUniformValueArray(int,const int*,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setUniformValueArray(int,const unsigned int*,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setUniformValueArray(const char*,const float *,int,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setUniformValueArray(const char*,const int*,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ <modify-function signature="setUniformValueArray(const char *,const unsigned int*,int)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ </object-type>
+ <object-type name="QOpenGLTexture" since="5.2">
+ <enum-type name="BindingTarget"/>
+ <enum-type name="CoordinateDirection"/>
+ <enum-type name="ComparisonFunction"/>
+ <enum-type name="ComparisonMode"/>
+ <enum-type name="CubeMapFace"/>
+ <enum-type name="DepthStencilMode"/>
+ <enum-type name="Feature" flags="Features"/>
+ <enum-type name="Filter"/>
+ <enum-type name="MipMapGeneration"/>
+ <enum-type name="PixelFormat"/>
+ <enum-type name="PixelType"/>
+ <enum-type name="SwizzleComponent"/>
+ <enum-type name="SwizzleValue"/>
+ <enum-type name="Target"/>
+ <enum-type name="TextureFormat"/>
+ <enum-type name="TextureFormatClass"/>
+ <enum-type name="TextureUnitReset"/>
+ <enum-type name="WrapMode"/>
+ <modify-function signature="borderColor(unsigned int*)const" remove="all"/>
+ <modify-function signature="borderColor(int*)const" remove="all"/>
+ <modify-function signature="borderColor(float*)const" remove="all"/>
+ </object-type>
+ <object-type name="QOpenGLTimeMonitor" since="5.1"/>
+ <object-type name="QOpenGLTimerQuery" since="5.1"/>
+ <object-type name="QOpenGLWindow" since="5.4">
+ <enum-type name="UpdateBehavior"/>
+ </object-type>
+ <value-type name="QOpenGLVersionProfile" since="5.1"/>
+ <object-type name="QOpenGLVertexArrayObject">
+ <object-type name="Binder"/>
+ </object-type>
<value-type name="QPageLayout">
<enum-type name="Mode"/>
<enum-type name="Orientation"/>
diff --git a/sources/pyside2/PySide2/QtHelp/CMakeLists.txt b/sources/pyside2/PySide2/QtHelp/CMakeLists.txt
index ba8b419f3..342863a4f 100644
--- a/sources/pyside2/PySide2/QtHelp/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtHelp/CMakeLists.txt
@@ -11,15 +11,12 @@ ${QtHelp_GEN_DIR}/qhelpindexwidget_wrapper.cpp
${QtHelp_GEN_DIR}/qhelpsearchengine_wrapper.cpp
${QtHelp_GEN_DIR}/qhelpsearchquerywidget_wrapper.cpp
${QtHelp_GEN_DIR}/qhelpsearchquery_wrapper.cpp
+${QtHelp_GEN_DIR}/qhelpsearchresult_wrapper.cpp
${QtHelp_GEN_DIR}/qhelpsearchresultwidget_wrapper.cpp
# module is always needed
${QtHelp_GEN_DIR}/qthelp_module_wrapper.cpp
)
-make_path(QtHelp_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtHelp_SOURCE_DIR})
-
set(QtHelp_include_dirs ${QtHelp_SOURCE_DIR}
${QtHelp_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -46,6 +43,6 @@ create_pyside_module(QtHelp
QtHelp_include_dirs
QtHelp_libraries
QtHelp_deps
- QtHelp_typesystem_path
+ QtHelp_SOURCE_DIR
QtHelp_SRC
"")
diff --git a/sources/pyside2/PySide2/QtHelp/typesystem_help.xml b/sources/pyside2/PySide2/QtHelp/typesystem_help.xml
index 4d42e7fb9..6bd5dd364 100644
--- a/sources/pyside2/PySide2/QtHelp/typesystem_help.xml
+++ b/sources/pyside2/PySide2/QtHelp/typesystem_help.xml
@@ -41,7 +41,7 @@
-->
<typesystem package="PySide2.QtHelp">
- <load-typesystem name="typesystem_widgets.xml" generate="no" />
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
<value-type name="QHelpContentItem">
<modify-function signature="parent() const">
@@ -61,5 +61,6 @@
<enum-type name="FieldName"/>
</value-type>
<object-type name="QHelpSearchQueryWidget"/>
+ <object-type name="QHelpSearchResult"/>
<object-type name="QHelpSearchResultWidget"/>
</typesystem>
diff --git a/sources/pyside2/PySide2/QtMacExtras/CMakeLists.txt b/sources/pyside2/PySide2/QtMacExtras/CMakeLists.txt
index b23b20c5f..6c69a784c 100644
--- a/sources/pyside2/PySide2/QtMacExtras/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtMacExtras/CMakeLists.txt
@@ -9,12 +9,6 @@ ${QtMacExtras_GEN_DIR}/qmactoolbaritem_wrapper.cpp
${QtMacExtras_GEN_DIR}/qtmacextras_module_wrapper.cpp
)
-make_path(QtMacExtras_typesystem_path ${QtMacExtras_SOURCE_DIR}
- ${QtCore_SOURCE_DIR}
- ${QtCore_BINARY_DIR}
- ${QtGui_SOURCE_DIR}
- ${QtGui_BINARY_DIR})
-
set(QtMacExtras_include_dirs ${QtMacExtras_SOURCE_DIR}
${QtMacExtras_BINARY_DIR}
${Qt5MacExtras_INCLUDE_DIRS}
@@ -38,6 +32,6 @@ create_pyside_module(QtMacExtras
QtMacExtras_include_dirs
QtMacExtras_libraries
QtMacExtras_deps
- QtMacExtras_typesystem_path
+ QtMacExtras_SOURCE_DIR
QtMacExtras_SRC
"")
diff --git a/sources/pyside2/PySide2/QtMacExtras/typesystem_macextras.xml b/sources/pyside2/PySide2/QtMacExtras/typesystem_macextras.xml
index 55c7d0160..69c9bc963 100644
--- a/sources/pyside2/PySide2/QtMacExtras/typesystem_macextras.xml
+++ b/sources/pyside2/PySide2/QtMacExtras/typesystem_macextras.xml
@@ -40,8 +40,8 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtMacExtras">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
<function signature="qRegisterDraggedTypes(QStringList)" since="5.2"/>
diff --git a/sources/pyside2/PySide2/QtMultimedia/CMakeLists.txt b/sources/pyside2/PySide2/QtMultimedia/CMakeLists.txt
index a17455eec..cfca07862 100644
--- a/sources/pyside2/PySide2/QtMultimedia/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtMultimedia/CMakeLists.txt
@@ -82,10 +82,6 @@ ${QtMultimedia_GEN_DIR}/qvideowindowcontrol_wrapper.cpp
${QtMultimedia_GEN_DIR}/qtmultimedia_module_wrapper.cpp
)
-make_path(QtMultimedia_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtNetwork_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtNetwork_BINARY_DIR}
- ${QtMultimedia_SOURCE_DIR})
-
set(QtMultimedia_include_dirs ${QtMultimedia_SOURCE_DIR}
${QtMultimedia_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -113,6 +109,6 @@ create_pyside_module(QtMultimedia
QtMultimedia_include_dirs
QtMultimedia_libraries
QtMultimedia_deps
- QtMultimedia_typesystem_path
+ QtMultimedia_SOURCE_DIR
QtMultimedia_SRC
"")
diff --git a/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia.xml b/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia.xml
index 275719f59..e89104284 100644
--- a/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia.xml
+++ b/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia.xml
@@ -40,6 +40,6 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtMultimedia">
- <load-typesystem name="typesystem_multimedia_common.xml" generate="yes"/>
- <load-typesystem name="typesystem_multimedia_forward_declarations.xml" generate="yes"/>
+ <load-typesystem name="QtMultimedia/typesystem_multimedia_common.xml" generate="yes"/>
+ <load-typesystem name="QtMultimedia/typesystem_multimedia_forward_declarations.xml" generate="yes"/>
</typesystem>
diff --git a/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia_common.xml b/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia_common.xml
index 9565b4334..8058954a1 100644
--- a/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia_common.xml
+++ b/sources/pyside2/PySide2/QtMultimedia/typesystem_multimedia_common.xml
@@ -40,9 +40,9 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtMultimedia">
- <load-typesystem name="typesystem_core.xml" generate="no" />
- <load-typesystem name="typesystem_gui.xml" generate="no" />
- <load-typesystem name="typesystem_network.xml" generate="no" />
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no" />
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no" />
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no" />
<namespace-type name="QAudio">
<enum-type name="Error"/>
@@ -77,7 +77,7 @@
</modify-function>
-->
<!-- TODO: PYSIDE-354, arrays are not supported -->
- <modify-function signature="mapPlanes(QAbstractVideoBuffer::MapMode,int*,Array,Array)" remove="all"/>
+ <modify-function signature="mapPlanes(QAbstractVideoBuffer::MapMode,int*,int[4],uchar*[4])" remove="all"/>
</object-type>
<object-type name="QAbstractVideoSurface">
<enum-type name="Error"/>
diff --git a/sources/pyside2/PySide2/QtMultimediaWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtMultimediaWidgets/CMakeLists.txt
index 1368fc3aa..abae2ceb7 100644
--- a/sources/pyside2/PySide2/QtMultimediaWidgets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtMultimediaWidgets/CMakeLists.txt
@@ -9,11 +9,6 @@ ${QtMultimediaWidgets_GEN_DIR}/qvideowidgetcontrol_wrapper.cpp
${QtMultimediaWidgets_GEN_DIR}/qtmultimediawidgets_module_wrapper.cpp
)
-make_path(QtMultimediaWidgets_typesystem_path
- ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtNetwork_SOURCE_DIR} ${QtWidgets_SOURCE_DIR} ${QtMultimedia_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtNetwork_BINARY_DIR} ${QtWidgets_BINARY_DIR} ${QtMultimedia_BINARY_DIR}
- ${QtMultimediaWidgets_SOURCE_DIR})
-
set(QtMultimediaWidgets_include_dirs ${QtMultimediaWidgets_SOURCE_DIR}
${QtMultimediaWidgets_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -47,6 +42,6 @@ create_pyside_module(QtMultimediaWidgets
QtMultimediaWidgets_include_dirs
QtMultimediaWidgets_libraries
QtMultimediaWidgets_deps
- QtMultimediaWidgets_typesystem_path
+ QtMultimediaWidgets_SOURCE_DIR
QtMultimediaWidgets_SRC
"")
diff --git a/sources/pyside2/PySide2/QtMultimediaWidgets/typesystem_multimediawidgets.xml b/sources/pyside2/PySide2/QtMultimediaWidgets/typesystem_multimediawidgets.xml
index 76214baef..07f6f99c3 100644
--- a/sources/pyside2/PySide2/QtMultimediaWidgets/typesystem_multimediawidgets.xml
+++ b/sources/pyside2/PySide2/QtMultimediaWidgets/typesystem_multimediawidgets.xml
@@ -40,10 +40,10 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtMultimediaWidgets">
- <load-typesystem name="typesystem_core.xml" generate="no" />
- <load-typesystem name="typesystem_gui.xml" generate="no" />
- <load-typesystem name="typesystem_multimedia_common.xml" generate="no" />
- <load-typesystem name="typesystem_widgets.xml" generate="no" />
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no" />
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no" />
+ <load-typesystem name="QtMultimedia/typesystem_multimedia_common.xml" generate="no" />
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
<object-type name="QCameraViewfinder"/>
<object-type name="QGraphicsVideoItem"/>
diff --git a/sources/pyside2/PySide2/QtNetwork/CMakeLists.txt b/sources/pyside2/PySide2/QtNetwork/CMakeLists.txt
index f01aaf77a..68037017d 100644
--- a/sources/pyside2/PySide2/QtNetwork/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtNetwork/CMakeLists.txt
@@ -43,10 +43,6 @@ ${QtNetwork_OPTIONAL_SRC}
${QtNetwork_GEN_DIR}/qtnetwork_module_wrapper.cpp
)
-make_path(QtNetwork_typesystem_path ${QtCore_SOURCE_DIR}
- ${QtCore_BINARY_DIR}
- ${QtNetwork_SOURCE_DIR})
-
set(QtNetwork_include_dirs ${QtNetwork_SOURCE_DIR}
${QtNetwork_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -67,7 +63,7 @@ create_pyside_module(QtNetwork
QtNetwork_include_dirs
QtNetwork_libraries
QtNetwork_deps
- QtNetwork_typesystem_path
+ QtNetwork_SOURCE_DIR
QtNetwork_SRC
""
""
diff --git a/sources/pyside2/PySide2/QtNetwork/typesystem_network.xml b/sources/pyside2/PySide2/QtNetwork/typesystem_network.xml
index 2643f1ca9..06a402e3c 100644
--- a/sources/pyside2/PySide2/QtNetwork/typesystem_network.xml
+++ b/sources/pyside2/PySide2/QtNetwork/typesystem_network.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtNetwork">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
<namespace-type name="QSsl">
<enum-type name="AlternativeNameEntryType"/>
@@ -181,8 +181,10 @@
<enum-type name="SpecialAddress"/>
<!-- ### QHostAddress(QIPv6Address) does this -->
<modify-function signature="QHostAddress(quint8*)" remove="all" />
- <!-- ### -->
+ <modify-function signature="QHostAddress(const quint8*)" remove="all" />
+ <!-- ### -->
<modify-function signature="setAddress(quint8*)" remove="all" />
+ <modify-function signature="setAddress(const quint8*)" remove="all" />
</value-type>
<value-type name="QHostInfo">
diff --git a/sources/pyside2/PySide2/QtOpenGL/CMakeLists.txt b/sources/pyside2/PySide2/QtOpenGL/CMakeLists.txt
index ebc08946c..9a8b64050 100644
--- a/sources/pyside2/PySide2/QtOpenGL/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtOpenGL/CMakeLists.txt
@@ -16,10 +16,6 @@ ${QtOpenGL_GEN_DIR}/qglwidget_wrapper.cpp
${QtOpenGL_GEN_DIR}/qtopengl_module_wrapper.cpp
)
-make_path(QtOpenGL_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtOpenGL_SOURCE_DIR})
-
set(QtOpenGL_include_dirs ${QtOpenGL_SOURCE_DIR}
${Qt5Core_INCLUDE_DIRS}
${Qt5Gui_INCLUDE_DIRS}
@@ -45,6 +41,6 @@ create_pyside_module(QtOpenGL
QtOpenGL_include_dirs
QtOpenGL_libraries
QtOpenGL_deps
- QtOpenGL_typesystem_path
+ QtOpenGL_SOURCE_DIR
QtOpenGL_SRC
"")
diff --git a/sources/pyside2/PySide2/QtOpenGL/typesystem_opengl.xml b/sources/pyside2/PySide2/QtOpenGL/typesystem_opengl.xml
index d5c701b6f..38cec3188 100644
--- a/sources/pyside2/PySide2/QtOpenGL/typesystem_opengl.xml
+++ b/sources/pyside2/PySide2/QtOpenGL/typesystem_opengl.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtOpenGL">
- <load-typesystem name="typesystem_widgets.xml" generate="no" />
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
<primitive-type name="GLbitfield"/>
<primitive-type name="GLboolean"/>
@@ -59,6 +59,16 @@
<rejection class="QGLColormap::QGLColormapData"/>
<rejection class="QGLContext" field-name="currentCtx"/>
+ <rejection class="^QGL.*$" argument-type="^GLboolean( const)?\*$"/>
+ <rejection class="^QGL.*$" argument-type="^GLchar( const)?\*$"/>
+ <rejection class="^QGL.*$" argument-type="GLchar *const const*"/>
+ <rejection class="^QGL.*$" argument-type="^GLenum( const)?\*$"/>
+ <rejection class="^QGL.*$" argument-type="^GLfloat( const)?\*$"/>
+ <rejection class="^QGL.*$" argument-type="^GLfloat( const)?\[.*$"/>
+ <rejection class="^QGL.*$" argument-type="^GLdouble( const)?\*$"/>
+ <rejection class="^QGL.*$" argument-type="GLintptr"/>
+ <rejection class="^QGL.*$" argument-type="^GLint64( const)?\*$"/>
+ <rejection class="^QGL.*$" argument-type="^GLsizei( const)?\*$"/>
<namespace-type name="QGL">
<enum-type name="FormatOption" flags="FormatOptions" force-integer="yes"/>
@@ -681,8 +691,6 @@
<!-- ### -->
<!-- ### Use QMatrixZxY overloads -->
- <modify-function signature="setUniformValue(int,Array)" remove="all" />
- <modify-function signature="setUniformValue(const char*,Array)" remove="all" />
<modify-function signature="setAttributeValue(int,const GLfloat*,int,int)" remove="all" />
<modify-function signature="setAttributeValue(const char*,const GLfloat*,int,int)" remove="all" />
<modify-function signature="setAttributeArray(int, GLenum, const void*, int, int)" remove="all" since="4.7" />
diff --git a/sources/pyside2/PySide2/QtPrintSupport/CMakeLists.txt b/sources/pyside2/PySide2/QtPrintSupport/CMakeLists.txt
index 023a5ac74..201dd6d69 100644
--- a/sources/pyside2/PySide2/QtPrintSupport/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtPrintSupport/CMakeLists.txt
@@ -13,10 +13,6 @@ ${QtPrintSupport_GEN_DIR}/qprintpreviewwidget_wrapper.cpp
${QtPrintSupport_GEN_DIR}/qtprintsupport_module_wrapper.cpp
)
-make_path(QtPrintSupport_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtPrintSupport_SOURCE_DIR})
-
set(QtPrintSupport_include_dirs ${QtPrintSupport_SOURCE_DIR}
${QtPrintSupport_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -43,6 +39,6 @@ create_pyside_module(QtPrintSupport
QtPrintSupport_include_dirs
QtPrintSupport_libraries
QtPrintSupport_deps
- QtPrintSupport_typesystem_path
+ QtPrintSupport_SOURCE_DIR
QtPrintSupport_SRC
"")
diff --git a/sources/pyside2/PySide2/QtPrintSupport/typesystem_printsupport.xml b/sources/pyside2/PySide2/QtPrintSupport/typesystem_printsupport.xml
index 09f151af5..24f0de1d8 100644
--- a/sources/pyside2/PySide2/QtPrintSupport/typesystem_printsupport.xml
+++ b/sources/pyside2/PySide2/QtPrintSupport/typesystem_printsupport.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtPrintSupport">
- <load-typesystem name="typesystem_widgets.xml" generate="no" />
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
<object-type name="QPageSetupDialog">
<modify-function signature="exec()" rename="exec_" allow-thread="yes"/>
diff --git a/sources/pyside2/PySide2/QtQml/CMakeLists.txt b/sources/pyside2/PySide2/QtQml/CMakeLists.txt
index 0607e905f..fb09443c1 100644
--- a/sources/pyside2/PySide2/QtQml/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtQml/CMakeLists.txt
@@ -34,10 +34,6 @@ ${QtQml_GEN_DIR}/qqmlnetworkaccessmanagerfactory_wrapper.cpp
${QtQml_GEN_DIR}/qtqml_module_wrapper.cpp
)
-make_path(QtQml_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtNetwork_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtNetwork_BINARY_DIR}
- ${QtQml_SOURCE_DIR})
-
set(QtQml_include_dirs ${QtQml_SOURCE_DIR}
${Qt5Core_INCLUDE_DIRS}
${Qt5Gui_INCLUDE_DIRS}
@@ -64,6 +60,6 @@ create_pyside_module(QtQml
QtQml_include_dirs
QtQml_libraries
QtQml_deps
- QtQml_typesystem_path
+ QtQml_SOURCE_DIR
QtQml_SRC
QtQml_registerType)
diff --git a/sources/pyside2/PySide2/QtQml/typesystem_qml.xml b/sources/pyside2/PySide2/QtQml/typesystem_qml.xml
index 427b82d90..54431a3af 100644
--- a/sources/pyside2/PySide2/QtQml/typesystem_qml.xml
+++ b/sources/pyside2/PySide2/QtQml/typesystem_qml.xml
@@ -40,9 +40,9 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtQml">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_network.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
<!-- This is to inform the generator that the VolatileBool python type exists -->
<custom-type name="VolatileBool" />
diff --git a/sources/pyside2/PySide2/QtQuick/CMakeLists.txt b/sources/pyside2/PySide2/QtQuick/CMakeLists.txt
index 491fc9d9e..01e369e7a 100644
--- a/sources/pyside2/PySide2/QtQuick/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtQuick/CMakeLists.txt
@@ -58,13 +58,6 @@ if (Qt5Quick_VERSION VERSION_GREATER 5.5.1)
)
endif()
-
-make_path(QtQuick_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR}
- ${QtGui_SOURCE_DIR} ${QtGui_BINARY_DIR}
- ${QtNetwork_SOURCE_DIR} ${QtNetwork_BINARY_DIR}
- ${QtQml_SOURCE_DIR} ${QtQml_BINARY_DIR}
- ${QtQuick_SOURCE_DIR})
-
set(QtQuick_include_dirs ${QtQuick_SOURCE_DIR}
${QtQml_SOURCE_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -95,6 +88,6 @@ create_pyside_module(QtQuick
QtQuick_include_dirs
QtQuick_libraries
QtQuick_deps
- QtQuick_typesystem_path
+ QtQuick_SOURCE_DIR
QtQuick_SRC
QtQuick_registerType)
diff --git a/sources/pyside2/PySide2/QtQuick/typesystem_quick.xml b/sources/pyside2/PySide2/QtQuick/typesystem_quick.xml
index 4cee02eec..5183ec798 100644
--- a/sources/pyside2/PySide2/QtQuick/typesystem_quick.xml
+++ b/sources/pyside2/PySide2/QtQuick/typesystem_quick.xml
@@ -40,12 +40,11 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtQuick">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_network.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_qml.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtQml/typesystem_qml.xml" generate="no"/>
- <primitive-type name="GLuint"/>
<smart-pointer-type name="QSharedPointer" type="shared" getter="data" />
<extra-includes>
diff --git a/sources/pyside2/PySide2/QtQuickWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtQuickWidgets/CMakeLists.txt
index 1519d1cfd..86991208a 100644
--- a/sources/pyside2/PySide2/QtQuickWidgets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtQuickWidgets/CMakeLists.txt
@@ -6,12 +6,6 @@ ${QtQuickWidgets_GEN_DIR}/qquickwidget_wrapper.cpp
${QtQuickWidgets_GEN_DIR}/qtquickwidgets_module_wrapper.cpp
)
-make_path(QtQuickWidgets_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtNetwork_SOURCE_DIR} ${QtNetwork_BINARY_DIR} ${QtQuick_SOURCE_DIR}
- ${QtQuick_BINARY_DIR} ${QtQml_SOURCE_DIR} ${QtQml_BINARY_DIR}
- ${QtQuickWidgets_SOURCE_DIR})
-
set(QtQuickWidgets_include_dirs ${QtQuickWidgets_SOURCE_DIR}
${QtQml_SOURCE_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -48,6 +42,6 @@ create_pyside_module(QtQuickWidgets
QtQuickWidgets_include_dirs
QtQuickWidgets_libraries
QtQuickWidgets_deps
- QtQuickWidgets_typesystem_path
+ QtQuickWidgets_SOURCE_DIR
QtQuickWidgets_SRC
"")
diff --git a/sources/pyside2/PySide2/QtQuickWidgets/typesystem_quickwidgets.xml b/sources/pyside2/PySide2/QtQuickWidgets/typesystem_quickwidgets.xml
index 10a269067..782ca0360 100644
--- a/sources/pyside2/PySide2/QtQuickWidgets/typesystem_quickwidgets.xml
+++ b/sources/pyside2/PySide2/QtQuickWidgets/typesystem_quickwidgets.xml
@@ -40,15 +40,15 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtQuickWidgets">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_quick.xml" generate="no"/>
- <load-typesystem name="typesystem_qml.xml" generate="no"/>
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtQuick/typesystem_quick.xml" generate="no"/>
+ <load-typesystem name="QtQml/typesystem_qml.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
<object-type name="QQuickWidget">
<enum-type name="ResizeMode" />
<enum-type name="Status" />
</object-type>
-</typesystem> \ No newline at end of file
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtScript/CMakeLists.txt b/sources/pyside2/PySide2/QtScript/CMakeLists.txt
index 5b5d08070..1e06c4644 100644
--- a/sources/pyside2/PySide2/QtScript/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtScript/CMakeLists.txt
@@ -18,8 +18,6 @@ ${QtScript_GEN_DIR}/qscriptvalueiterator_wrapper.cpp
${QtScript_GEN_DIR}/qtscript_module_wrapper.cpp
)
-make_path(QtScript_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR})
-
set(QtScript_include_dirs ${QtScript_SOURCE_DIR}
${QtScript_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -39,6 +37,6 @@ create_pyside_module(QtScript
QtScript_include_dirs
QtScript_libraries
QtScript_deps
- QtScript_typesystem_path
+ QtScript_SOURCE_DIR
QtScript_SRC
"")
diff --git a/sources/pyside2/PySide2/QtScript/typesystem_script.xml b/sources/pyside2/PySide2/QtScript/typesystem_script.xml
index 46ee824c1..4467f1de9 100644
--- a/sources/pyside2/PySide2/QtScript/typesystem_script.xml
+++ b/sources/pyside2/PySide2/QtScript/typesystem_script.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtScript">
- <load-typesystem name="typesystem_core.xml" generate="no" />
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no" />
<object-type name="QScriptable"/>
<object-type name="QScriptClass">
diff --git a/sources/pyside2/PySide2/QtScriptTools/CMakeLists.txt b/sources/pyside2/PySide2/QtScriptTools/CMakeLists.txt
index 436522070..92bf1a545 100644
--- a/sources/pyside2/PySide2/QtScriptTools/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtScriptTools/CMakeLists.txt
@@ -6,11 +6,6 @@ ${QtScriptTools_GEN_DIR}/qscriptenginedebugger_wrapper.cpp
${QtScriptTools_GEN_DIR}/qtscripttools_module_wrapper.cpp
)
-make_path(QtScriptTools_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtScript_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtScript_BINARY_DIR}
- ${QtWidgets_SOURCE_DIR} ${QtWidgets_BINARY_DIR}
- ${QtScriptTools_SOURCE_DIR})
-
set(QtScriptTools_include_dirs ${QtScriptTools_SOURCE_DIR}
${QtScriptTools_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -41,6 +36,6 @@ create_pyside_module(QtScriptTools
QtScriptTools_include_dirs
QtScriptTools_libraries
QtScriptTools_deps
- QtScriptTools_typesystem_path
+ QtScriptTools_SOURCE_DIR
QtScriptTools_SRC
"")
diff --git a/sources/pyside2/PySide2/QtScriptTools/typesystem_scripttools.xml b/sources/pyside2/PySide2/QtScriptTools/typesystem_scripttools.xml
index 15bda4059..023e03ba1 100644
--- a/sources/pyside2/PySide2/QtScriptTools/typesystem_scripttools.xml
+++ b/sources/pyside2/PySide2/QtScriptTools/typesystem_scripttools.xml
@@ -40,9 +40,9 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtScriptTools">
- <load-typesystem name="typesystem_script.xml" generate="no" />
- <load-typesystem name="typesystem_gui.xml" generate="no" />
- <load-typesystem name="typesystem_widgets.xml" generate="no" />
+ <load-typesystem name="QtScript/typesystem_script.xml" generate="no" />
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no" />
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
<object-type name="QScriptEngineDebugger">
<enum-type name="DebuggerAction"/>
diff --git a/sources/pyside2/PySide2/QtSql/CMakeLists.txt b/sources/pyside2/PySide2/QtSql/CMakeLists.txt
index fe05d4679..0573ab5cd 100644
--- a/sources/pyside2/PySide2/QtSql/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtSql/CMakeLists.txt
@@ -20,9 +20,8 @@ ${QtSql_GEN_DIR}/qsqltablemodel_wrapper.cpp
${QtSql_GEN_DIR}/qtsql_module_wrapper.cpp
)
-make_path(QtSql_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtSql_SOURCE_DIR})
+configure_file("${QtSql_SOURCE_DIR}/QtSql_global.pre.h.in"
+ "${QtSql_BINARY_DIR}/QtSql_global.pre.h" @ONLY)
set(QtSql_include_dirs ${QtSql_SOURCE_DIR}
${QtSql_BINARY_DIR}
@@ -50,6 +49,6 @@ create_pyside_module(QtSql
QtSql_include_dirs
QtSql_libraries
QtSql_deps
- QtSql_typesystem_path
+ QtSql_SOURCE_DIR
QtSql_SRC
"")
diff --git a/sources/pyside2/PySide2/QtSql/QtSql_global.pre.h.in b/sources/pyside2/PySide2/QtSql/QtSql_global.pre.h.in
new file mode 100644
index 000000000..0c20c1888
--- /dev/null
+++ b/sources/pyside2/PySide2/QtSql/QtSql_global.pre.h.in
@@ -0,0 +1,5 @@
+// QT_WIDGETS_LIB must be defined for QSqlRelationalDelegate to become visible.
+
+#if @Qt5Widgets_FOUND@
+# define QT_WIDGETS_LIB
+#endif
diff --git a/sources/pyside2/PySide2/QtSql/typesystem_sql.xml b/sources/pyside2/PySide2/QtSql/typesystem_sql.xml
index b3d4f2837..46836ef96 100644
--- a/sources/pyside2/PySide2/QtSql/typesystem_sql.xml
+++ b/sources/pyside2/PySide2/QtSql/typesystem_sql.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtSql">
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
<rejection class="QSqlDriverCreator"/>
<rejection class="QSqlDriverPlugin"/>
diff --git a/sources/pyside2/PySide2/QtSvg/CMakeLists.txt b/sources/pyside2/PySide2/QtSvg/CMakeLists.txt
index 62db9e4ce..72914b188 100644
--- a/sources/pyside2/PySide2/QtSvg/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtSvg/CMakeLists.txt
@@ -9,10 +9,6 @@ ${QtSvg_GEN_DIR}/qsvgwidget_wrapper.cpp
${QtSvg_GEN_DIR}/qtsvg_module_wrapper.cpp
)
-make_path(QtSvg_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtSvg_SOURCE_DIR})
-
set(QtSvg_include_dirs ${QtSvg_SOURCE_DIR}
${QtSvg_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -40,6 +36,6 @@ create_pyside_module(QtSvg
QtSvg_include_dirs
QtSvg_libraries
QtSvg_deps
- QtSvg_typesystem_path
+ QtSvg_SOURCE_DIR
QtSvg_SRC
"")
diff --git a/sources/pyside2/PySide2/QtSvg/typesystem_svg.xml b/sources/pyside2/PySide2/QtSvg/typesystem_svg.xml
index 603fe7897..059abb891 100644
--- a/sources/pyside2/PySide2/QtSvg/typesystem_svg.xml
+++ b/sources/pyside2/PySide2/QtSvg/typesystem_svg.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtSvg">
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
<object-type name="QSvgRenderer" />
<object-type name="QSvgWidget" />
diff --git a/sources/pyside2/PySide2/QtTest/CMakeLists.txt b/sources/pyside2/PySide2/QtTest/CMakeLists.txt
index 118f803ea..6d2630f10 100644
--- a/sources/pyside2/PySide2/QtTest/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtTest/CMakeLists.txt
@@ -7,9 +7,11 @@ ${QtTest_GEN_DIR}/qtest_wrapper.cpp
${QtTest_GEN_DIR}/qttest_module_wrapper.cpp
)
-make_path(QtTest_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtTest_SOURCE_DIR})
+configure_file("${QtTest_SOURCE_DIR}/QtTest_global.pre.h.in"
+ "${QtTest_BINARY_DIR}/QtTest_global.pre.h" @ONLY)
+
+configure_file("${QtTest_SOURCE_DIR}/QtTest_global.post.h.in"
+ "${QtTest_BINARY_DIR}/QtTest_global.post.h" @ONLY)
set(QtTest_include_dirs ${QtTest_SOURCE_DIR}
${QtTest_BINARY_DIR}
@@ -38,6 +40,6 @@ create_pyside_module(QtTest
QtTest_include_dirs
QtTest_libraries
QtTest_deps
- QtTest_typesystem_path
+ QtTest_SOURCE_DIR
QtTest_SRC
"")
diff --git a/sources/pyside2/PySide2/QtTest/QtTest_global.post.h.in b/sources/pyside2/PySide2/QtTest/QtTest_global.post.h.in
new file mode 100644
index 000000000..ccd18153c
--- /dev/null
+++ b/sources/pyside2/PySide2/QtTest/QtTest_global.post.h.in
@@ -0,0 +1 @@
+#include "pysideqtesttouch.h"
diff --git a/sources/pyside2/PySide2/QtTest/QtTest_global.pre.h.in b/sources/pyside2/PySide2/QtTest/QtTest_global.pre.h.in
new file mode 100644
index 000000000..65daf1b84
--- /dev/null
+++ b/sources/pyside2/PySide2/QtTest/QtTest_global.pre.h.in
@@ -0,0 +1,5 @@
+// QT_WIDGETS_LIB changes code generation in pysideqtesttouch.h
+
+#if @Qt5Widgets_FOUND@
+# define QT_WIDGETS_LIB
+#endif
diff --git a/sources/pyside2/PySide2/QtTest/typesystem_test.xml b/sources/pyside2/PySide2/QtTest/typesystem_test.xml
index 61a3ee850..c976704b8 100644
--- a/sources/pyside2/PySide2/QtTest/typesystem_test.xml
+++ b/sources/pyside2/PySide2/QtTest/typesystem_test.xml
@@ -40,9 +40,9 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtTest">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
<rejection class="QTest" function-name="qCompare&lt;char&gt;"/>
<rejection class="QTest" function-name="qCompare&lt;char*&gt;"/>
@@ -51,6 +51,7 @@
<rejection class="QTest" function-name="qCompare&lt;double,qreal&gt;"/>
<rejection class="QTest" function-name="qCompare&lt;qreal,double&gt;"/>
<rejection class="QTest" function-name="qCompare"/>
+ <rejection class="QTest" function-name="qInit"/>
<rejection class="QTest" function-name="qVerify"/>
<rejection class="QTest" function-name="qSleep"/>
<rejection class="QTest" function-name="toHexRepresentation"/>
diff --git a/sources/pyside2/PySide2/QtTextToSpeech/CMakeLists.txt b/sources/pyside2/PySide2/QtTextToSpeech/CMakeLists.txt
new file mode 100644
index 000000000..63b5a3669
--- /dev/null
+++ b/sources/pyside2/PySide2/QtTextToSpeech/CMakeLists.txt
@@ -0,0 +1,35 @@
+project(QtTextToSpeech)
+
+set(QtTextToSpeech_SRC
+${QtTextToSpeech_GEN_DIR}/qtexttospeech_wrapper.cpp
+${QtTextToSpeech_GEN_DIR}/qtexttospeechengine_wrapper.cpp
+${QtTextToSpeech_GEN_DIR}/qvoice_wrapper.cpp
+# module is always needed
+${QtTextToSpeech_GEN_DIR}/qttexttospeech_module_wrapper.cpp
+)
+
+set(QtTextToSpeech_include_dirs ${QtTextToSpeech_SOURCE_DIR}
+ ${QtTextToSpeech_BINARY_DIR}
+ ${Qt5Core_INCLUDE_DIRS}
+ ${Qt5TextToSpeech_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR})
+
+set(QtTextToSpeech_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt5Multimedia_LIBRARIES}
+ ${Qt5TextToSpeech_LIBRARIES}
+ ${Qt5Core_LIBRARIES})
+
+set(QtTextToSpeech_deps QtCore QtMultimedia)
+
+create_pyside_module(QtTextToSpeech
+ QtTextToSpeech_include_dirs
+ QtTextToSpeech_libraries
+ QtTextToSpeech_deps
+ QtTextToSpeech_SOURCE_DIR
+ QtTextToSpeech_SRC
+ "")
diff --git a/sources/pyside2/header.LGPL-NOGPL2 b/sources/pyside2/PySide2/QtTextToSpeech/typesystem_texttospeech.xml
index 80b4449cb..d5006de6f 100644
--- a/sources/pyside2/header.LGPL-NOGPL2
+++ b/sources/pyside2/PySide2/QtTextToSpeech/typesystem_texttospeech.xml
@@ -1,11 +1,13 @@
+<?xml version="1.0"?>
+<!--
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
-** This file is part of the FOO module of the Qt Toolkit.
+** This file is part of PySide2.
**
-** $QT_BEGIN_LICENSE:LGPL-NOGPL2$
+** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
@@ -24,14 +26,28 @@
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
+-->
+<typesystem package="PySide2.QtTextToSpeech">
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no" />
+ <object-type name="QTextToSpeech">
+ <enum-type name="State"/>
+ </object-type>
+ <object-type name="QTextToSpeechEngine"/>
+ <value-type name="QVoice">
+ <enum-type name="Gender"/>
+ <enum-type name="Age"/>
+ </value-type>
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtUiTools/CMakeLists.txt b/sources/pyside2/PySide2/QtUiTools/CMakeLists.txt
index b7ae6974d..e4de03f49 100644
--- a/sources/pyside2/PySide2/QtUiTools/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtUiTools/CMakeLists.txt
@@ -6,11 +6,6 @@ ${QtUiTools_GEN_DIR}/quiloader_wrapper.cpp
${QtUiTools_GEN_DIR}/qtuitools_module_wrapper.cpp
)
-make_path(QtUiTools_typesystem_path
- ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR} ${QtXml_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR} ${QtXml_BINARY_DIR}
- ${QtUiTools_SOURCE_DIR})
-
set(QtUiTools_include_dirs ${QtUiTools_SOURCE_DIR}
${QtUiTools_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -41,6 +36,6 @@ create_pyside_module(QtUiTools
QtUiTools_include_dirs
QtUiTools_libraries
QtUiTools_deps
- QtUiTools_typesystem_path
+ QtUiTools_SOURCE_DIR
QtUiTools_SRC
"")
diff --git a/sources/pyside2/PySide2/QtUiTools/typesystem_uitools.xml b/sources/pyside2/PySide2/QtUiTools/typesystem_uitools.xml
index a74af0076..f6dd0333b 100644
--- a/sources/pyside2/PySide2/QtUiTools/typesystem_uitools.xml
+++ b/sources/pyside2/PySide2/QtUiTools/typesystem_uitools.xml
@@ -41,8 +41,8 @@
-->
<typesystem package="PySide2.QtUiTools">
- <load-typesystem name="typesystem_widgets.xml" generate="no" />
- <load-typesystem name="typesystem_xml.xml" generate="no" />
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no" />
+ <load-typesystem name="QtXml/typesystem_xml.xml" generate="no" />
<object-type name="QUiLoader">
<extra-includes>
diff --git a/sources/pyside2/PySide2/QtWebChannel/CMakeLists.txt b/sources/pyside2/PySide2/QtWebChannel/CMakeLists.txt
index ae292844f..b7fee0d17 100644
--- a/sources/pyside2/PySide2/QtWebChannel/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWebChannel/CMakeLists.txt
@@ -7,8 +7,6 @@ ${QtWebChannel_GEN_DIR}/qwebchannelabstracttransport_wrapper.cpp
${QtWebChannel_GEN_DIR}/qtwebchannel_module_wrapper.cpp
)
-make_path(QtWebChannel_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR} ${QtWebChannel_SOURCE_DIR})
-
set(QtWebChannel_include_dirs ${QtWebChannel_SOURCE_DIR}
${QtWebChannel_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -30,6 +28,6 @@ create_pyside_module(QtWebChannel
QtWebChannel_include_dirs
QtWebChannel_libraries
QtWebChannel_deps
- QtWebChannel_typesystem_path
+ QtWebChannel_SOURCE_DIR
QtWebChannel_SRC
"")
diff --git a/sources/pyside2/PySide2/QtWebChannel/typesystem_webchannel.xml b/sources/pyside2/PySide2/QtWebChannel/typesystem_webchannel.xml
index c25d3f30a..153a4da83 100644
--- a/sources/pyside2/PySide2/QtWebChannel/typesystem_webchannel.xml
+++ b/sources/pyside2/PySide2/QtWebChannel/typesystem_webchannel.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWebChannel">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
<object-type name="QWebChannel" />
<object-type name="QWebChannelAbstractTransport">
diff --git a/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt
index 1e82819f7..32d0643c8 100644
--- a/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt
@@ -15,13 +15,6 @@ ${QtWebEngineWidgets_GEN_DIR}/qwebengineview_wrapper.cpp
${QtWebEngineWidgets_GEN_DIR}/qtwebenginewidgets_module_wrapper.cpp
)
-make_path(QtWebEngineWidgets_typesystem_path
- ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtNetwork_SOURCE_DIR} ${QtNetwork_BINARY_DIR}
- ${QtWebChannel_SOURCE_DIR} ${QtWebChannel_BINARY_DIR}
- ${QtWebEngineWidgets_SOURCE_DIR})
-
set(QtWebEngineWidgets_include_dirs
${QtWebEngineWidgets_SOURCE_DIR}
${QtWebEngineWidgets_BINARY_DIR}
@@ -56,7 +49,7 @@ create_pyside_module(QtWebEngineWidgets
QtWebEngineWidgets_include_dirs
QtWebEngineWidgets_libraries
QtWebEngineWidgets_deps
- QtWebEngineWidgets_typesystem_path
+ QtWebEngineWidgets_SOURCE_DIR
QtWebEngineWidgets_SRC
"")
diff --git a/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml b/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml
index f8255db07..9462c3e41 100644
--- a/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml
+++ b/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml
@@ -40,11 +40,11 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWebEngineWidgets">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
- <load-typesystem name="typesystem_network.xml" generate="no"/>
- <load-typesystem name="typesystem_webchannel.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
+ <load-typesystem name="QtWebChannel/typesystem_webchannel.xml" generate="no"/>
<object-type name="QWebEngineCertificateError">
@@ -54,11 +54,11 @@
<object-type name="QWebEngineDownloadItem">
<enum-type name="DownloadState" />
</object-type>
-
+
<!-- TODO: Deal with private constructor
<value-type name="QWebEngineHistory" /> -->
- <value-type name="QWebEngineHistoryItem" />
+ <object-type name="QWebEngineHistoryItem" />
<object-type name="QWebEnginePage">
<enum-type name="WebAction" />
diff --git a/sources/pyside2/PySide2/QtWebKit/CMakeLists.txt b/sources/pyside2/PySide2/QtWebKit/CMakeLists.txt
index 6bbcbfd43..78f865cac 100644
--- a/sources/pyside2/PySide2/QtWebKit/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWebKit/CMakeLists.txt
@@ -6,10 +6,6 @@ ${QtWebKit_GEN_DIR}/webcore_wrapper.cpp
${QtWebKit_GEN_DIR}/qtwebkit_module_wrapper.cpp
)
-make_path(QtWebKit_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtNetwork_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtNetwork_BINARY_DIR}
- ${QtWebKit_SOURCE_DIR})
-
set(QtWebKit_include_dirs ${QtWebKit_SOURCE_DIR}
${QtWebKit_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -37,7 +33,7 @@ create_pyside_module(QtWebKit
QtWebKit_include_dirs
QtWebKit_libraries
QtWebKit_deps
- QtWebKit_typesystem_path
+ QtWebKit_SOURCE_DIR
QtWebKit_SRC
"")
diff --git a/sources/pyside2/PySide2/QtWebKit/typesystem_webkit.xml b/sources/pyside2/PySide2/QtWebKit/typesystem_webkit.xml
index c559c7c02..09b3917e3 100644
--- a/sources/pyside2/PySide2/QtWebKit/typesystem_webkit.xml
+++ b/sources/pyside2/PySide2/QtWebKit/typesystem_webkit.xml
@@ -40,9 +40,9 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWebKit">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_network.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
<namespace-type name="WebCore"/>
diff --git a/sources/pyside2/PySide2/QtWebKitWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtWebKitWidgets/CMakeLists.txt
index fa57c8694..cd7aa32dd 100644
--- a/sources/pyside2/PySide2/QtWebKitWidgets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWebKitWidgets/CMakeLists.txt
@@ -29,13 +29,6 @@ ${QtWebKitWidgets_GEN_DIR}/qwebview_wrapper.cpp
${QtWebKitWidgets_GEN_DIR}/qtwebkitwidgets_module_wrapper.cpp
)
-make_path(QtWebKitWidgets_typesystem_path
- ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- ${QtWebKit_SOURCE_DIR} ${QtPrintSupport_SOURCE_DIR} ${QtNetwork_SOURCE_DIR}
- ${QtWebKit_BINARY_DIR} ${QtPrintSupport_BINARY_DIR} ${QtNetwork_BINARY_DIR}
- ${QtWebKitWidgets_SOURCE_DIR})
-
set(QtWebKitWidgets_include_dirs
${QtWebKitWidgets_SOURCE_DIR}
${QtWebKitWidgets_BINARY_DIR}
@@ -71,7 +64,7 @@ create_pyside_module(QtWebKitWidgets
QtWebKitWidgets_include_dirs
QtWebKitWidgets_libraries
QtWebKitWidgets_deps
- QtWebKitWidgets_typesystem_path
+ QtWebKitWidgets_SOURCE_DIR
QtWebKitWidgets_SRC
"")
diff --git a/sources/pyside2/PySide2/QtWebKitWidgets/typesystem_webkitwidgets.xml b/sources/pyside2/PySide2/QtWebKitWidgets/typesystem_webkitwidgets.xml
index 05061fa6c..0f8d8da4e 100644
--- a/sources/pyside2/PySide2/QtWebKitWidgets/typesystem_webkitwidgets.xml
+++ b/sources/pyside2/PySide2/QtWebKitWidgets/typesystem_webkitwidgets.xml
@@ -40,12 +40,12 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWebKitWidgets">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
- <load-typesystem name="typesystem_webkit.xml" generate="no"/>
- <load-typesystem name="typesystem_network.xml" generate="no"/>
- <load-typesystem name="typesystem_printsupport.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtWebKit/typesystem_webkit.xml" generate="no"/>
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
+ <load-typesystem name="QtPrintSupport/typesystem_printsupport.xml" generate="no"/>
<value-type name="QWebDatabase"/>
diff --git a/sources/pyside2/PySide2/QtWebSockets/CMakeLists.txt b/sources/pyside2/PySide2/QtWebSockets/CMakeLists.txt
index 9eb402644..495fd4e7b 100644
--- a/sources/pyside2/PySide2/QtWebSockets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWebSockets/CMakeLists.txt
@@ -10,9 +10,6 @@ ${QtWebSockets_GEN_DIR}/qwebsocketserver_wrapper.cpp
${QtWebSockets_GEN_DIR}/qtwebsockets_module_wrapper.cpp
)
-make_path(QtWebSockets_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR} ${QtNetwork_SOURCE_DIR}
- ${QtNetwork_BINARY_DIR} ${QtWebSockets_SOURCE_DIR})
-
set(QtWebSockets_include_dirs ${QtWebSockets_SOURCE_DIR}
${QtWebSockets_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -39,6 +36,6 @@ create_pyside_module(QtWebSockets
QtWebSockets_include_dirs
QtWebSockets_libraries
QtWebSockets_deps
- QtWebSockets_typesystem_path
+ QtWebSockets_SOURCE_DIR
QtWebSockets_SRC
"")
diff --git a/sources/pyside2/PySide2/QtWebSockets/typesystem_websockets.xml b/sources/pyside2/PySide2/QtWebSockets/typesystem_websockets.xml
index 8671795c0..f528850e2 100644
--- a/sources/pyside2/PySide2/QtWebSockets/typesystem_websockets.xml
+++ b/sources/pyside2/PySide2/QtWebSockets/typesystem_websockets.xml
@@ -40,8 +40,8 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWebSockets">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_network.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtNetwork/typesystem_network.xml" generate="no"/>
<object-type name="QMaskGenerator" />
diff --git a/sources/pyside2/PySide2/QtWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtWidgets/CMakeLists.txt
index e401db47c..27dff2912 100644
--- a/sources/pyside2/PySide2/QtWidgets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWidgets/CMakeLists.txt
@@ -23,6 +23,7 @@ ${QtWidgets_GEN_DIR}/qbuttongroup_wrapper.cpp
${QtWidgets_GEN_DIR}/qcalendarwidget_wrapper.cpp
${QtWidgets_GEN_DIR}/qcheckbox_wrapper.cpp
${QtWidgets_GEN_DIR}/qcolordialog_wrapper.cpp
+${QtWidgets_GEN_DIR}/qcolormap_wrapper.cpp
${QtWidgets_GEN_DIR}/qcolumnview_wrapper.cpp
${QtWidgets_GEN_DIR}/qcombobox_wrapper.cpp
${QtWidgets_GEN_DIR}/qcommandlinkbutton_wrapper.cpp
@@ -212,10 +213,6 @@ ${QtWidgets_GEN_DIR}/qtwidgets_module_wrapper.cpp
configure_file("${QtWidgets_SOURCE_DIR}/typesystem_widgets.xml.in"
"${QtWidgets_BINARY_DIR}/typesystem_widgets.xml" @ONLY)
-make_path(QtWidgets_typesystem_path ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR}
- ${QtWidgets_SOURCE_DIR})
-
set(QtWidgets_include_dirs ${QtWidgets_SOURCE_DIR}
${QtWidgets_BINARY_DIR}
${pyside2_SOURCE_DIR}
@@ -241,7 +238,7 @@ create_pyside_module(QtWidgets
QtWidgets_include_dirs
QtWidgets_libraries
QtWidgets_deps
- QtWidgets_typesystem_path
+ QtWidgets_SOURCE_DIR
QtWidgets_SRC
""
${QtWidgets_BINARY_DIR}/typesystem_widgets.xml)
diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets.xml.in b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets.xml.in
index e6952c2fe..bad39516c 100644
--- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets.xml.in
+++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets.xml.in
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWidgets">
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
- <load-typesystem name="typesystem_widgets_@AUTO_OS@.xml" generate="yes"/>
- <load-typesystem name="typesystem_widgets_common.xml" generate="yes"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets_@AUTO_OS@.xml" generate="yes"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets_common.xml" generate="yes"/>
</typesystem>
diff --git a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml
index 1663e4f4e..0555d9a53 100644
--- a/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml
+++ b/sources/pyside2/PySide2/QtWidgets/typesystem_widgets_common.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWidgets">
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
@@ -190,6 +190,9 @@
<enum-type name="ViewItemPosition"/>
</value-type>
+ <value-type name="QColormap">
+ <enum-type name="Mode"/>
+ </value-type>
<value-type name="QSizePolicy">
<enum-type name="ControlType" flags="ControlTypes"/>
<enum-type name="Policy"/>
@@ -212,7 +215,7 @@
<add-function signature="__next__()" return-type="PyObject*">
<inject-code class="target" position="beginning">
if (**%CPPSELF) {
- QTreeWidgetItemIterator* %0 = new QTreeWidgetItemIterator((*%CPPSELF)++);
+ QTreeWidgetItemIterator *%0 = new QTreeWidgetItemIterator((*%CPPSELF)++);
%PYARG_0 = %CONVERTTOPYTHON[QTreeWidgetItemIterator*](%0);
}
</inject-code>
@@ -220,7 +223,7 @@
<add-function signature="value()" return-type="QTreeWidgetItem*">
<inject-code>
- QTreeWidgetItem* %0 = %CPPSELF.operator*();
+ QTreeWidgetItem *%0 = %CPPSELF.operator*();
%PYARG_0 = %CONVERTTOPYTHON[QTreeWidgetItem*](%0);
Shiboken::Object::releaseOwnership(%PYARG_0);
</inject-code>
@@ -264,7 +267,7 @@
<enum-type name="GraphicsItemFlag" flags="GraphicsItemFlags"/>
<enum-type name="PanelModality" since="4.6"/>
<inject-code class="target" position="end">
- PyObject* userTypeConstant = PyInt_FromLong(QGraphicsItem::UserType);
+ PyObject *userTypeConstant = PyInt_FromLong(QGraphicsItem::UserType);
PyDict_SetItemString(Sbk_QGraphicsItem_Type.super.ht_type.tp_dict, "UserType", userTypeConstant);
</inject-code>
<modify-function signature="setParentItem(QGraphicsItem *)">
@@ -274,7 +277,7 @@
</modify-function>
<template name="scene_return_parenting">
if (%0) {
- QObject* parent = %0->parent();
+ QObject *parent = %0->parent();
Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QObject*](parent));
Shiboken::Object::setParent(pyParent, %PYARG_0);
}
@@ -432,6 +435,16 @@
<reference-count action="set"/>
</modify-argument>
</modify-function>
+ <modify-function signature="setItemDelegateForColumn(int, QAbstractItemDelegate*)">
+ <modify-argument index="2">
+ <reference-count action="set"/>
+ </modify-argument>
+ </modify-function>
+ <modify-function signature="setItemDelegateForRow(int, QAbstractItemDelegate*)">
+ <modify-argument index="2">
+ <reference-count action="set"/>
+ </modify-argument>
+ </modify-function>
<modify-function signature="viewOptions()const">
<modify-argument index="return">
<replace-default-expression with="QStyleOptionViewItem()" />
@@ -1576,7 +1589,7 @@
</modify-function>
<!-- TODO: Support conversions on virtual function -->
- <modify-function signature="drawItems(QPainter*, int, QGraphicsItem**, const QStyleOptionGraphicsItem*)">
+ <modify-function signature="drawItems(QPainter*, int, QGraphicsItem*[], const QStyleOptionGraphicsItem[])">
<modify-argument index="2">
<remove-argument/>
<conversion-rule class="native">
@@ -1688,7 +1701,7 @@
<enum-type name="SceneLayer" flags="SceneLayers"/>
<!-- Qt5: note: this was called 'obsolete'. Is that true? -->
- <modify-function signature="drawItems(QPainter*,int,QGraphicsItem**,const QStyleOptionGraphicsItem*,QWidget*)" remove="all" />
+ <modify-function signature="drawItems(QPainter*,int,QGraphicsItem*[],const QStyleOptionGraphicsItem[],QWidget*)" remove="all" />
<modify-function signature="createItemGroup(const QList&lt;QGraphicsItem*&gt;&amp;)">
<modify-argument index="1">
@@ -2146,6 +2159,22 @@
<parent index="this" action="remove"/>
</modify-argument>
</modify-function>
+ <modify-function signature="clear()">
+ <inject-code class="target" position="beginning">
+ Shiboken::BindingManager &amp;bm = Shiboken::BindingManager::instance();
+ PyObject *pyObj;
+ for (int i = 0; i &lt; %CPPSELF.count(); i++) {
+ QListWidgetItem *item = %CPPSELF.item(i);
+ if ((pyObj = reinterpret_cast&lt;PyObject*&gt;(bm.retrieveWrapper(item))) != 0) {
+ Py_INCREF(pyObj);
+ Shiboken::Object::setParent(NULL, pyObj);
+ Shiboken::Object::invalidate(pyObj);
+ Py_DECREF(pyObj);
+ }
+ }
+ %CPPSELF.%FUNCTION_NAME();
+ </inject-code>
+ </modify-function>
</object-type>
<object-type name="QWidget">
@@ -2402,7 +2431,7 @@
</modify-argument>
</modify-function>
</object-type>
-
+
<object-type name="QMessageBox">
<enum-type name="ButtonRole"/>
<enum-type name="Icon"/>
@@ -2608,7 +2637,7 @@
<insert-template name="return_for_QFileDialog"/>
</inject-code>
</modify-function>
-
+
<modify-function signature="getOpenFileUrl(QWidget*, const QString&amp;, const QUrl&amp;, const QString&amp;, QString*, QFlags&lt;QFileDialog::Option&gt;, const QStringList&amp;)" allow-thread="yes">
<modify-argument index="return">
<replace-type modified-type="(fileName, selectedFilter)"/>
@@ -2973,7 +3002,7 @@
</modify-argument>
<inject-code>
- QAction* action = %CPPSELF.addAction(%1, %2);
+ QAction *action = %CPPSELF.addAction(%1, %2);
%PYARG_0 = %CONVERTTOPYTHON[QAction*](action);
Shiboken::AutoDecRef result(PyObject_CallMethod(%PYARG_0, "connect", "OsO", %PYARG_0, SIGNAL(triggered()), %PYARG_3));
</inject-code>
@@ -2989,7 +3018,7 @@
<parent index="this" action="add"/>
</modify-argument>
<inject-code>
- QAction* action = %CPPSELF.addAction(%1);
+ QAction *action = %CPPSELF.addAction(%1);
%PYARG_0 = %CONVERTTOPYTHON[QAction*](action);
Shiboken::AutoDecRef result(PyObject_CallMethod(%PYARG_0, "connect", "OsO", %PYARG_0, SIGNAL(triggered()), %PYARG_2));
</inject-code>
diff --git a/sources/pyside2/PySide2/QtWinExtras/CMakeLists.txt b/sources/pyside2/PySide2/QtWinExtras/CMakeLists.txt
index 4de437012..5932792e9 100644
--- a/sources/pyside2/PySide2/QtWinExtras/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWinExtras/CMakeLists.txt
@@ -17,12 +17,6 @@ ${QtWinExtras_GEN_DIR}/qwinthumbnailtoolbutton_wrapper.cpp
${QtWinExtras_GEN_DIR}/qtwinextras_module_wrapper.cpp
)
-make_path(QtWinExtras_typesystem_path ${QtWinExtras_SOURCE_DIR}
- ${QtCore_SOURCE_DIR}
- ${QtCore_BINARY_DIR}
- ${QtGui_SOURCE_DIR}
- ${QtGui_BINARY_DIR})
-
set(QtWinExtras_include_dirs ${QtWinExtras_SOURCE_DIR}
${QtWinExtras_BINARY_DIR}
${Qt5WinExtras_INCLUDE_DIRS}
@@ -46,6 +40,6 @@ create_pyside_module(QtWinExtras
QtWinExtras_include_dirs
QtWinExtras_libraries
QtWinExtras_deps
- QtWinExtras_typesystem_path
+ QtWinExtras_SOURCE_DIR
QtWinExtras_SRC
"")
diff --git a/sources/pyside2/PySide2/QtWinExtras/typesystem_winextras.xml b/sources/pyside2/PySide2/QtWinExtras/typesystem_winextras.xml
index d7d400be9..3aa375ea9 100644
--- a/sources/pyside2/PySide2/QtWinExtras/typesystem_winextras.xml
+++ b/sources/pyside2/PySide2/QtWinExtras/typesystem_winextras.xml
@@ -40,8 +40,8 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtWinExtras">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
- <load-typesystem name="typesystem_gui.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtGui/typesystem_gui.xml" generate="no"/>
<object-type name="QWinEvent" since="5.2"/>
<object-type name="QWinColorizationChangeEvent" since="5.2"/>
diff --git a/sources/pyside2/PySide2/QtX11Extras/CMakeLists.txt b/sources/pyside2/PySide2/QtX11Extras/CMakeLists.txt
index 0af059ffe..4f0111905 100644
--- a/sources/pyside2/PySide2/QtX11Extras/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtX11Extras/CMakeLists.txt
@@ -6,11 +6,8 @@ ${QtX11Extras_GEN_DIR}/qx11info_wrapper.cpp
${QtX11Extras_GEN_DIR}/qtx11extras_module_wrapper.cpp
)
-make_path(QtX11Extras_typesystem_path ${QtX11Extras_SOURCE_DIR}
- ${QtCore_SOURCE_DIR}
- ${QtCore_BINARY_DIR}
- ${QtGui_SOURCE_DIR}
- ${QtGui_BINARY_DIR})
+configure_file("${QtX11Extras_SOURCE_DIR}/QtX11Extras_global.post.h.in"
+ "${QtX11Extras_BINARY_DIR}/QtX11Extras_global.post.h" @ONLY)
set(QtX11Extras_include_dirs ${QtX11Extras_SOURCE_DIR}
${QtX11Extras_BINARY_DIR}
@@ -35,6 +32,6 @@ create_pyside_module(QtX11Extras
QtX11Extras_include_dirs
QtX11Extras_libraries
QtX11Extras_deps
- QtX11Extras_typesystem_path
+ QtX11Extras_SOURCE_DIR
QtX11Extras_SRC
"")
diff --git a/sources/pyside2/PySide2/QtX11Extras/QtX11Extras_global.post.h.in b/sources/pyside2/PySide2/QtX11Extras/QtX11Extras_global.post.h.in
new file mode 100644
index 000000000..abdaf3d5f
--- /dev/null
+++ b/sources/pyside2/PySide2/QtX11Extras/QtX11Extras_global.post.h.in
@@ -0,0 +1 @@
+#include <QtX11Extras/QX11Info>
diff --git a/sources/pyside2/PySide2/QtX11Extras/typesystem_x11extras.xml b/sources/pyside2/PySide2/QtX11Extras/typesystem_x11extras.xml
index 9aa527951..23d578ca6 100644
--- a/sources/pyside2/PySide2/QtX11Extras/typesystem_x11extras.xml
+++ b/sources/pyside2/PySide2/QtX11Extras/typesystem_x11extras.xml
@@ -41,7 +41,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtX11Extras">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
<object-type name="QX11Info" />
</typesystem>
diff --git a/sources/pyside2/PySide2/QtXml/CMakeLists.txt b/sources/pyside2/PySide2/QtXml/CMakeLists.txt
index 8dd06cc46..9c724cffb 100644
--- a/sources/pyside2/PySide2/QtXml/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtXml/CMakeLists.txt
@@ -36,9 +36,6 @@ ${QtXml_GEN_DIR}/qxmlsimplereader_wrapper.cpp
${QtXml_GEN_DIR}/qtxml_module_wrapper.cpp
)
-make_path(QtXml_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR}
- ${QtXml_SOURCE_DIR})
-
set(QtXml_include_dirs ${QtXml_SOURCE_DIR}
${QtXml_BINARY_DIR}
${CMAKE_SOURCE_DIR}
@@ -59,6 +56,6 @@ create_pyside_module(QtXml
QtXml_include_dirs
QtXml_libraries
QtXml_deps
- QtXml_typesystem_path
+ QtXml_SOURCE_DIR
QtXml_SRC
"")
diff --git a/sources/pyside2/PySide2/QtXml/typesystem_xml.xml b/sources/pyside2/PySide2/QtXml/typesystem_xml.xml
index ba0248342..d78a1d77c 100644
--- a/sources/pyside2/PySide2/QtXml/typesystem_xml.xml
+++ b/sources/pyside2/PySide2/QtXml/typesystem_xml.xml
@@ -41,7 +41,7 @@
-->
<typesystem package="PySide2.QtXml">
<load-typesystem name="typesystem_templates.xml" generate="no" />
- <load-typesystem name="typesystem_core.xml" generate="no" />
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no" />
<rejection class="QXmlAttributes::Attribute"/>
<rejection class="QDomNode" field-name="impl"/>
diff --git a/sources/pyside2/PySide2/QtXmlPatterns/CMakeLists.txt b/sources/pyside2/PySide2/QtXmlPatterns/CMakeLists.txt
index a10d40bf0..d279f43ae 100644
--- a/sources/pyside2/PySide2/QtXmlPatterns/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtXmlPatterns/CMakeLists.txt
@@ -20,9 +20,6 @@ ${QtXmlPatterns_GEN_DIR}/qxmlserializer_wrapper.cpp
${QtXmlPatterns_GEN_DIR}/qtxmlpatterns_module_wrapper.cpp
)
-make_path(QtXmlPatterns_typesystem_path ${QtCore_SOURCE_DIR} ${QtCore_BINARY_DIR}
- ${QtXmlPatterns_SOURCE_DIR})
-
set(QtXmlPatterns_include_dirs ${QtXmlPatterns_SOURCE_DIR}
${QtXmlPatterns_BINARY_DIR}
${Qt5Core_INCLUDE_DIRS}
@@ -42,7 +39,7 @@ create_pyside_module(QtXmlPatterns
QtXmlPatterns_include_dirs
QtXmlPatterns_libraries
QtXmlPatterns_deps
- QtXmlPatterns_typesystem_path
+ QtXmlPatterns_SOURCE_DIR
QtXmlPatterns_SRC
"")
diff --git a/sources/pyside2/PySide2/QtXmlPatterns/typesystem_xmlpatterns.xml b/sources/pyside2/PySide2/QtXmlPatterns/typesystem_xmlpatterns.xml
index 96970366f..888595ccc 100644
--- a/sources/pyside2/PySide2/QtXmlPatterns/typesystem_xmlpatterns.xml
+++ b/sources/pyside2/PySide2/QtXmlPatterns/typesystem_xmlpatterns.xml
@@ -40,7 +40,7 @@
****************************************************************************/
-->
<typesystem package="PySide2.QtXmlPatterns">
- <load-typesystem name="typesystem_core.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
<object-type name="QXmlSchema" since="4.6" /> <!-- Qt scoped pointer does not allow declare this as value type -->
<object-type name="QXmlSchemaValidator" since="4.6">
diff --git a/sources/pyside2/PySide2/global.h.in b/sources/pyside2/PySide2/global.h.in
index 6bddcfcce..60afc1744 100644
--- a/sources/pyside2/PySide2/global.h.in
+++ b/sources/pyside2/PySide2/global.h.in
@@ -37,345 +37,13 @@
**
****************************************************************************/
-#undef QT_NO_STL
-
-#undef QT_NO_STL_WCHAR
-#define Q_BYTE_ORDER // used to enable QSysInfo.Endian detection on MacOSX
-
-#if defined(__OBJC__) && !defined(__cplusplus)
-# warning "File built in Objective-C mode (.m), but using Qt requires Objective-C++ (.mm)"
-#endif
-
#include <QtCore/qnamespace.h>
-QT_BEGIN_NAMESPACE
-
-
-class QByteArray;
-struct QArrayData;
-typedef QArrayData QByteArrayData;
-
-class QString;
-
-#ifndef Q_MOC_OUTPUT_REVISION
-#define Q_MOC_OUTPUT_REVISION 67
-#endif
-
-// The following macros are our "extensions" to C++
-// They are used, strictly speaking, only by the moc.
-
-
-#ifndef QT_NO_META_MACROS
-// macro for onaming members
-#ifdef METHOD
-#undef METHOD
-#endif
-#ifdef SLOT
-#undef SLOT
-#endif
-#ifdef SIGNAL
-#undef SIGNAL
-#endif
-#endif // QT_NO_META_MACROS
-
-Q_CORE_EXPORT const char *qFlagLocation(const char *method);
-
-#ifndef QT_NO_META_MACROS
-#ifndef QT_NO_DEBUG
-# define QLOCATION "\0" __FILE__ ":" QT_STRINGIFY(__LINE__)
-# ifndef QT_NO_KEYWORDS
-# define METHOD(a) qFlagLocation("0"#a QLOCATION)
-# endif
-# define SLOT(a) qFlagLocation("1"#a QLOCATION)
-# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)
-#else
-# ifndef QT_NO_KEYWORDS
-# define METHOD(a) "0"#a
-# endif
-# define SLOT(a) "1"#a
-# define SIGNAL(a) "2"#a
-#endif
-
-#define QMETHOD_CODE 0 // member type codes
-#define QSLOT_CODE 1
-#define QSIGNAL_CODE 2
-#endif // QT_NO_META_MACROS
-
-#define Q_ARG(type, data) QArgument<type >(#type, data)
-#define Q_RETURN_ARG(type, data) QReturnArgument<type >(#type, data)
-
-class QObject;
-class QMetaMethod;
-class QMetaEnum;
-class QMetaProperty;
-class QMetaClassInfo;
-
-
-class Q_CORE_EXPORT QGenericArgument
-{
-public:
- inline QGenericArgument(const char *aName = 0, const void *aData = 0)
- : _data(aData), _name(aName) {}
- inline void *data() const { return const_cast<void *>(_data); }
- inline const char *name() const { return _name; }
-
-private:
- const void *_data;
- const char *_name;
-};
-
-class Q_CORE_EXPORT QGenericReturnArgument: public QGenericArgument
-{
-public:
- inline QGenericReturnArgument(const char *aName = 0, void *aData = 0)
- : QGenericArgument(aName, aData)
- {}
-};
-
-template <class T>
-class QArgument: public QGenericArgument
-{
-public:
- inline QArgument(const char *aName, const T &aData)
- : QGenericArgument(aName, static_cast<const void *>(&aData))
- {}
-};
-template <class T>
-class QArgument<T &>: public QGenericArgument
-{
-public:
- inline QArgument(const char *aName, T &aData)
- : QGenericArgument(aName, static_cast<const void *>(&aData))
- {}
-};
-
-
-template <typename T>
-class QReturnArgument: public QGenericReturnArgument
-{
-public:
- inline QReturnArgument(const char *aName, T &aData)
- : QGenericReturnArgument(aName, static_cast<void *>(&aData))
- {}
-};
-
-struct Q_CORE_EXPORT QMetaObject
-{
- class Connection;
- const char *className() const;
- const QMetaObject *superClass() const;
-
- QObject *cast(QObject *obj) const;
- const QObject *cast(const QObject *obj) const;
-
-#ifndef QT_NO_TRANSLATION
- QString tr(const char *s, const char *c, int n = -1) const;
-#endif // QT_NO_TRANSLATION
-
- int methodOffset() const;
- int enumeratorOffset() const;
- int propertyOffset() const;
- int classInfoOffset() const;
-
- int constructorCount() const;
- int methodCount() const;
- int enumeratorCount() const;
- int propertyCount() const;
- int classInfoCount() const;
-
- int indexOfConstructor(const char *constructor) const;
- int indexOfMethod(const char *method) const;
- int indexOfSignal(const char *signal) const;
- int indexOfSlot(const char *slot) const;
- int indexOfEnumerator(const char *name) const;
- int indexOfProperty(const char *name) const;
- int indexOfClassInfo(const char *name) const;
-
- QMetaMethod constructor(int index) const;
- QMetaMethod method(int index) const;
- QMetaEnum enumerator(int index) const;
- QMetaProperty property(int index) const;
- QMetaClassInfo classInfo(int index) const;
- QMetaProperty userProperty() const;
-
- static bool checkConnectArgs(const char *signal, const char *method);
- static bool checkConnectArgs(const QMetaMethod &signal,
- const QMetaMethod &method);
- static QByteArray normalizedSignature(const char *method);
- static QByteArray normalizedType(const char *type);
-
- // internal index-based connect
- static Connection connect(const QObject *sender, int signal_index,
- const QObject *receiver, int method_index,
- int type = 0, int *types = 0);
- // internal index-based disconnect
- static bool disconnect(const QObject *sender, int signal_index,
- const QObject *receiver, int method_index);
- static bool disconnectOne(const QObject *sender, int signal_index,
- const QObject *receiver, int method_index);
- // internal slot-name based connect
- static void connectSlotsByName(QObject *o);
-
- // internal index-based signal activation
- static void activate(QObject *sender, int signal_index, void **argv);
- static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);
- static void activate(QObject *sender, int signal_offset, int local_signal_index, void **argv);
-
- static bool invokeMethod(QObject *obj, const char *member,
- Qt::ConnectionType,
- QGenericReturnArgument ret,
- QGenericArgument val0 = QGenericArgument(0),
- QGenericArgument val1 = QGenericArgument(),
- QGenericArgument val2 = QGenericArgument(),
- QGenericArgument val3 = QGenericArgument(),
- QGenericArgument val4 = QGenericArgument(),
- QGenericArgument val5 = QGenericArgument(),
- QGenericArgument val6 = QGenericArgument(),
- QGenericArgument val7 = QGenericArgument(),
- QGenericArgument val8 = QGenericArgument(),
- QGenericArgument val9 = QGenericArgument());
-
- static inline bool invokeMethod(QObject *obj, const char *member,
- QGenericReturnArgument ret,
- QGenericArgument val0 = QGenericArgument(0),
- QGenericArgument val1 = QGenericArgument(),
- QGenericArgument val2 = QGenericArgument(),
- QGenericArgument val3 = QGenericArgument(),
- QGenericArgument val4 = QGenericArgument(),
- QGenericArgument val5 = QGenericArgument(),
- QGenericArgument val6 = QGenericArgument(),
- QGenericArgument val7 = QGenericArgument(),
- QGenericArgument val8 = QGenericArgument(),
- QGenericArgument val9 = QGenericArgument())
- {
- return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3,
- val4, val5, val6, val7, val8, val9);
- }
-
- static inline bool invokeMethod(QObject *obj, const char *member,
- Qt::ConnectionType type,
- QGenericArgument val0 = QGenericArgument(0),
- QGenericArgument val1 = QGenericArgument(),
- QGenericArgument val2 = QGenericArgument(),
- QGenericArgument val3 = QGenericArgument(),
- QGenericArgument val4 = QGenericArgument(),
- QGenericArgument val5 = QGenericArgument(),
- QGenericArgument val6 = QGenericArgument(),
- QGenericArgument val7 = QGenericArgument(),
- QGenericArgument val8 = QGenericArgument(),
- QGenericArgument val9 = QGenericArgument())
- {
- return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2,
- val3, val4, val5, val6, val7, val8, val9);
- }
-
- static inline bool invokeMethod(QObject *obj, const char *member,
- QGenericArgument val0 = QGenericArgument(0),
- QGenericArgument val1 = QGenericArgument(),
- QGenericArgument val2 = QGenericArgument(),
- QGenericArgument val3 = QGenericArgument(),
- QGenericArgument val4 = QGenericArgument(),
- QGenericArgument val5 = QGenericArgument(),
- QGenericArgument val6 = QGenericArgument(),
- QGenericArgument val7 = QGenericArgument(),
- QGenericArgument val8 = QGenericArgument(),
- QGenericArgument val9 = QGenericArgument())
- {
- return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,
- val1, val2, val3, val4, val5, val6, val7, val8, val9);
- }
-
- QObject *newInstance(QGenericArgument val0 = QGenericArgument(0),
- QGenericArgument val1 = QGenericArgument(),
- QGenericArgument val2 = QGenericArgument(),
- QGenericArgument val3 = QGenericArgument(),
- QGenericArgument val4 = QGenericArgument(),
- QGenericArgument val5 = QGenericArgument(),
- QGenericArgument val6 = QGenericArgument(),
- QGenericArgument val7 = QGenericArgument(),
- QGenericArgument val8 = QGenericArgument(),
- QGenericArgument val9 = QGenericArgument()) const;
-
- enum Call {
- InvokeMetaMethod,
- ReadProperty,
- WriteProperty,
- ResetProperty,
- QueryPropertyDesignable,
- QueryPropertyScriptable,
- QueryPropertyStored,
- QueryPropertyEditable,
- QueryPropertyUser,
- CreateInstance,
- IndexOfMethod,
- RegisterPropertyMetaType,
- RegisterMethodArgumentMetaType
- };
-
- int static_metacall(Call, int, void **) const;
- static int metacall(QObject *, Call, int, void **);
-
- struct { // private data
- const QMetaObject *superdata;
- const QByteArrayData *stringdata;
- const uint *data;
- typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **);
- StaticMetacallFunction static_metacall;
- const QMetaObject * const *relatedMetaObjects;
- void *extradata; //reserved for future use
- } d;
-};
-
-class Q_CORE_EXPORT QMetaObject::Connection {
- void *d_ptr; //QObjectPrivate::Connection*
- explicit Connection(void *data) : d_ptr(data) { }
- friend class QObject;
- friend class QObjectPrivate;
- friend struct QMetaObject;
-public:
- ~Connection();
- Connection();
- Connection(const Connection &other);
- Connection &operator=(const Connection &other);
-#ifdef Q_QDOC
- operator bool() const;
-#else
- typedef void *Connection::*RestrictedBool;
- operator RestrictedBool() const { return d_ptr ? &Connection::d_ptr : 0; }
-#endif
-
-#ifdef Q_COMPILER_RVALUE_REFS
- inline Connection(Connection &&o) : d_ptr(o.d_ptr) { o.d_ptr = 0; }
- inline Connection &operator=(Connection &&other)
- { qSwap(d_ptr, other.d_ptr); return *this; }
-#endif
-};
-
-inline const QMetaObject *QMetaObject::superClass() const
-{ return d.superdata; }
-
-namespace QtPrivate {
- /* Trait that tells is a the Object has a Q_OBJECT macro */
- template <typename Object> struct HasQ_OBJECT_Macro {
- template <typename T>
- static char test(int (T::*)(QMetaObject::Call, int, void **));
- static int test(int (Object::*)(QMetaObject::Call, int, void **));
- enum { Value = sizeof(test(&Object::qt_metacall)) == sizeof(int) };
- };
-}
-
-QT_END_NAMESPACE
-
-// This Q_QDOC definition is only a convenience, since the shiboken parser is
-// happier with the simplified constructions. XXX remove this for Qt 5.7.
-#define Q_QDOC
-
#if @ENABLE_X11@
#define Q_OS_X11
#elif @ENABLE_MAC@
#define Q_OS_MAC
#elif @ENABLE_WIN@
- #include "pysidewtypes.h"
#define Q_OS_WIN
#endif
@@ -383,46 +51,7 @@ QT_END_NAMESPACE
// not in release
#define QT_NO_DEBUG
-#include <QtCore/QtCore>
-#if @ENABLE_MAC@ || @ENABLE_WIN@ || @ENABLE_X11@
- // Workaround to parse the QApplication header
- #define Q_INTERNAL_QAPP_SRC
- #undef Q_QDOC
-#endif
-#if @Qt5Gui_FOUND@
-# include <QtGui/QtGui>
-#endif
-#if @Qt5Widgets_FOUND@
-# include <QtWidgets/QtWidgets>
-#endif
-#ifndef Q_QDOC
-// Make sure that Q_QDOC is defined for as much modules as possible.
-// This creates more wrappers without extra work.
-// Will disappear when we have a really good parser!
-# define Q_QDOC
-#endif
-
-#include "qpytextobject.h" // PySide class
-
-#if @ENABLE_X11@
-# if @Qt5X11Extras_FOUND@
-# include <QtX11Extras/QX11Info>
-# endif
-#elif @ENABLE_MAC@
-# include <QtGui/qmacstyle_mac.h>
-#endif
-
-// QT_WIDGETS_LIB must be defined to QSqlRelationalDelegate become visible.
-// It also changes code generation in pysideqtesttouch.h
-#define QT_WIDGETS_LIB
-#undef Q_DECLARE_INTERFACE
-
-#if @Qt5Test_FOUND@
-# include "pysideqtesttouch.h"
-#endif
-
-#ifndef QT_NO_OPENGL
-# include <@GL_H@>
-#endif // QT_NO_OPENGL
+// Make "signals:", "slots:" visible as access specifiers
+#define QT_ANNOTATE_ACCESS_SPECIFIER(a) __attribute__((annotate(#a)))
// Here are now all configured modules appended:
diff --git a/sources/pyside2/PySide2/support/signature/mapping.py b/sources/pyside2/PySide2/support/signature/mapping.py
index a04a9e921..2bedbb1bf 100644
--- a/sources/pyside2/PySide2/support/signature/mapping.py
+++ b/sources/pyside2/PySide2/support/signature/mapping.py
@@ -283,6 +283,8 @@ def init_QtCore():
"zero(PySide2.QtCore.QPoint)": Default("PySide2.QtCore.QPoint"),
"zero(unsigned char)": 0,
"zero(PySide2.QtCore.QEvent.Type)": None,
+ "CheckIndexOption.NoOption": Instance(
+ "PySide2.QtCore.QAbstractItemModel.CheckIndexOptions.NoOption"), # 5.11
})
try:
type_map.update({
diff --git a/sources/pyside2/PySide2/typesystem_templates.xml b/sources/pyside2/PySide2/typesystem_templates.xml
index e0b47b6e3..11a384263 100644
--- a/sources/pyside2/PySide2/typesystem_templates.xml
+++ b/sources/pyside2/PySide2/typesystem_templates.xml
@@ -167,6 +167,14 @@
%PYARG_0 = %CONVERTTOPYTHON[QRectF](rect_);
</template>
+ <template name="glGetString_return_QString">
+ %BEGIN_ALLOW_THREADS
+ const GLubyte *us = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES);
+ const QString s = QString::fromLocal8Bit(reinterpret_cast&lt;const char *&gt;(us));
+ %END_ALLOW_THREADS
+ %PYARG_0 = %CONVERTTOPYTHON[QString](s);
+ </template>
+
<template name="fix_args,QRect*">
QRect rect_;
%BEGIN_ALLOW_THREADS
diff --git a/sources/pyside2/cmake/Macros/PySideModules.cmake b/sources/pyside2/cmake/Macros/PySideModules.cmake
index 0bef89b0c..36488912d 100644
--- a/sources/pyside2/cmake/Macros/PySideModules.cmake
+++ b/sources/pyside2/cmake/Macros/PySideModules.cmake
@@ -54,34 +54,38 @@ macro(create_pyside_module
# First add the main file.
set(total_type_system_files ${typesystem_path})
- # Transform the path separator list back into a cmake list (so from a:b:c to a;b;c)
- unmake_path(list_of_paths ${${module_typesystem_path}})
+ get_filename_component(typesystem_root "${CMAKE_CURRENT_SOURCE_DIR}" DIRECTORY)
- # Collect all XML files, in each given path, and append them to the final total list.
- foreach(type_system_files_path ${list_of_paths})
- set(glob_expression "${type_system_files_path}/*.xml")
+ set(deps ${module_name} ${${module_deps}})
+ foreach(dep ${deps})
+ set(glob_expression "${typesystem_root}/${dep}/*.xml")
file(GLOB type_system_files ${glob_expression})
set(total_type_system_files ${total_type_system_files} ${type_system_files})
- endforeach(type_system_files_path)
+ endforeach(dep)
# Remove any possible duplicates.
list(REMOVE_DUPLICATES total_type_system_files)
# Contains include directories to pass to shiboken's preprocessor.
set(shiboken_include_dirs ${pyside2_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR})
+ set(shiboken_framework_include_dirs_option "")
if(CMAKE_HOST_APPLE)
- # On macOS, provide the framework paths for OpenGL headers.
- set(shiboken_include_dirs ${shiboken_include_dirs} ${CMAKE_SYSTEM_FRAMEWORK_PATH})
+ set(shiboken_framework_include_dirs "${QT_FRAMEWORK_INCLUDE_DIR}")
+ make_path(shiboken_framework_include_dirs ${shiboken_framework_include_dirs})
+ set(shiboken_framework_include_dirs_option "--framework-include-paths=${shiboken_framework_include_dirs}")
endif()
# Transform the path separators into something shiboken understands.
make_path(shiboken_include_dirs ${shiboken_include_dirs})
+ get_filename_component(pyside_binary_dir ${CMAKE_CURRENT_BINARY_DIR} DIRECTORY)
+
add_custom_command(OUTPUT ${${module_sources}}
COMMAND "${SHIBOKEN_BINARY}" ${GENERATOR_EXTRA_FLAGS}
- ${pyside2_BINARY_DIR}/pyside2_global.h
+ "${pyside2_BINARY_DIR}/${module_name}_global.h"
--include-paths=${shiboken_include_dirs}
- --typesystem-paths=${pyside2_SOURCE_DIR}${PATH_SEP}${${module_typesystem_path}}
+ ${shiboken_framework_include_dirs_option}
+ --typesystem-paths=${pyside_binary_dir}${PATH_SEP}${pyside2_SOURCE_DIR}${PATH_SEP}${${module_typesystem_path}}
--output-directory=${CMAKE_CURRENT_BINARY_DIR}
--license-file=${CMAKE_CURRENT_SOURCE_DIR}/../licensecomment.txt
${typesystem_path}
@@ -100,6 +104,8 @@ macro(create_pyside_module
LIBRARY_OUTPUT_DIRECTORY ${pyside2_BINARY_DIR})
if(WIN32)
set_target_properties(${module_name} PROPERTIES SUFFIX ".pyd")
+ # Sanitize windows.h as pulled by gl.h to prevent clashes with QAbstract3dAxis::min(), etc.
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX")
endif()
target_link_libraries(${module_name} ${${module_libraries}})
@@ -113,7 +119,19 @@ macro(create_pyside_module
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/PySide2/${module_name}/pyside2_${lower_module_name}_python.h
DESTINATION include/PySide2${pyside2_SUFFIX}/${module_name}/)
file(GLOB typesystem_files ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_*.xml ${typesystem_path})
- install(FILES ${typesystem_files} DESTINATION share/PySide2${pyside2_SUFFIX}/typesystems)
+
+# Copy typesystem files and remove module names from the <load-typesystem> element
+# so that it works in a flat directory:
+# <load-typesystem name="QtWidgets/typesystem_widgets.xml" ... ->
+# <load-typesystem name="typesystem_widgets.xml"
+ foreach(typesystem_file ${typesystem_files})
+ get_filename_component(typesystem_file_name "${typesystem_file}" NAME)
+ file(READ "${typesystem_file}" typesystemXml)
+ string(REGEX REPLACE "<load-typesystem name=\"[^/\"]+/" "<load-typesystem name=\"" typesystemXml "${typesystemXml}")
+ set (typesystem_target_file "${CMAKE_CURRENT_BINARY_DIR}/PySide2/typesystems/${typesystem_file_name}")
+ file(WRITE "${typesystem_target_file}" "${typesystemXml}")
+ install(FILES "${typesystem_target_file}" DESTINATION share/PySide2${pyside2_SUFFIX}/typesystems)
+ endforeach()
endmacro()
#macro(check_qt_class_with_namespace module namespace class optional_source_files dropped_entries [namespace] [module])
@@ -161,7 +179,11 @@ macro(check_qt_class module class optional_source_files dropped_entries)
# Don't add version tagging, because for some reason linker fails with:
# (.qtversion[qt_version_tag]+0x0): undefined reference to `qt_version_tag'
- set(ADDITIONAL_FLAGS "${ADDITIONAL_FLAGS} -DQT_NO_VERSION_TAGGING")
+ # Force usage of the C++11 standard. CMAKE_CXX_STANDARD does not work with try_compile
+ # but the issue has a fix in CMake 3.9. Thus we use a terrible workaround, we pass the C++
+ # standard flag the way CheckCXXSourceCompiles.cmake does it.
+
+ set(ADDITIONAL_FLAGS "${ADDITIONAL_FLAGS} -DQT_NO_VERSION_TAGGING ${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}")
try_compile(Q_WORKS ${CMAKE_BINARY_DIR}
${SRC_FILE}
diff --git a/sources/pyside2/doc/CMakeLists.txt b/sources/pyside2/doc/CMakeLists.txt
index 14af9735b..326e5ae7d 100644
--- a/sources/pyside2/doc/CMakeLists.txt
+++ b/sources/pyside2/doc/CMakeLists.txt
@@ -1,11 +1,79 @@
+cmake_minimum_required(VERSION 3.1)
+cmake_policy(VERSION 3.1)
+
project(doc)
-set(DOC_DATA_DIR "${CMAKE_CURRENT_BINARY_DIR}/qdoc3-output")
+if (WIN32)
+ set(PATH_SEP "\;")
+else()
+ set(PATH_SEP ":")
+endif()
+
+set(DOC_DATA_DIR "${CMAKE_CURRENT_BINARY_DIR}/qdoc-output")
+configure_file("pyside-config.qdocconf.in" "${CMAKE_CURRENT_LIST_DIR}/pyside-config.qdocconf" @ONLY)
+
+get_filename_component(ROOT ${CMAKE_CURRENT_BINARY_DIR} DIRECTORY)
+set(TS_ROOT "${ROOT}/PySide2")
+
+file(REMOVE ${CMAKE_CURRENT_LIST_DIR}/pyside.qdocconf ${CMAKE_CURRENT_LIST_DIR}/pyside.qdocconf.in)
+
+# For Qt modules that are part of the documentation build:
+# - Configure the module docconf file
+# - Write shiboken header consisting of pyside2_global.h and module includes
+# - Build include path for qdoc for shiboken
+
+# The last element of the include list is the mkspec directory containing qplatformdefs.h
+list(GET Qt5Core_INCLUDE_DIRS -1 mkspecInclude)
+set(QDOC_INCPATH -I "${QT_INCLUDE_DIR}" -I "${mkspecInclude}")
+
+file(READ "${pyside2_BINARY_DIR}/pyside2_global.h" docHeaderContents)
+file(READ "typesystem_doc.xml.in" typeSystemDocXmlContents)
+
+foreach(moduleIn ${all_module_shortnames})
+ string(TOLOWER "${moduleIn}" lowerModuleIn)
+ set(docConf "${CMAKE_CURRENT_LIST_DIR}/qtmodules/pyside-qt${lowerModuleIn}.qdocconf.in")
+ if(EXISTS "${docConf}")
+ string(REGEX REPLACE "(^.*)\.in" "\\1" OUTFILE ${docConf})
+ get_filename_component(BASENAME ${OUTFILE} NAME)
+ configure_file(${docConf} "${CMAKE_CURRENT_LIST_DIR}/qtmodules/${BASENAME}" @ONLY)
+ file(APPEND "pyside.qdocconf.in" "\@CMAKE_CURRENT_LIST_DIR\@/qtmodules/${BASENAME}\n")
+ # Handle docconf files in Qt that contain multiple modules
+ if ("${moduleIn}" STREQUAL "3DExtras")
+ set(modules 3DCore 3DRender 3DInput 3DLogic 3DAnimation "${moduleIn}")
+ elseif ("${moduleIn}" STREQUAL "QuickWidgets")
+ set(modules Qml Quick "${moduleIn}")
+ else()
+ set(modules "${moduleIn}")
+ endif()
+ foreach(module ${modules})
+ string(TOLOWER "${module}" lowerModule)
+ # -- @TODO fix this for macOS frameworks.
+ list(APPEND QDOC_INCPATH
+ -I "${QT_INCLUDE_DIR}Qt${module}"
+ -I "${QT_INCLUDE_DIR}Qt${module}/${Qt5Core_VERSION}"
+ -I "${QT_INCLUDE_DIR}Qt${module}/${Qt5Core_VERSION}/Qt${module}")
+
+ set(docHeaderContents "${docHeaderContents}\n#include <Qt${module}/Qt${module}>")
+ set(typeSystemDocXmlContents "${typeSystemDocXmlContents}\n<load-typesystem name=\"Qt${module}/typesystem_${lowerModule}.xml\" generate=\"yes\"/>")
+ endforeach()
+ endif()
+endforeach()
+
+set(typeSystemDocXmlContents "${typeSystemDocXmlContents}\n</typesystem>\n")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/typesystem_doc.xml" "${typeSystemDocXmlContents}")
+
+set(docHeader "${pyside2_BINARY_DIR}/qdoc.h")
+file(WRITE ${docHeader} "${docHeaderContents}")
+
configure_file("pyside.qdocconf.in" "pyside.qdocconf" @ONLY)
-add_custom_target(qdoc3
- COMMAND qdoc3 pyside.qdocconf
- COMMENT "Running qdoc3 against Qt source code..."
+set(QDOC_TYPESYSTEM_PATH "${pyside2_SOURCE_DIR}${PATH_SEP}${pyside2_BINARY_DIR}")
+
+add_custom_target(qdoc
+ # Use dummy Qt version information, QDoc needs it but has no effect on WebXML output
+ COMMAND ${CMAKE_COMMAND} -E env BUILDDIR=${CMAKE_CURRENT_LIST_DIR}/src QT_INSTALL_DOCS=${QT_SRC_DIR}/doc QT_VERSION=1.0.0 QT_VER=1.0 QT_VERSION_TAG=100
+ qdoc pyside.qdocconf ${QDOC_INCPATH} -single-exec -installdir ${DOC_DATA_DIR} -outputdir ${DOC_DATA_DIR}
+ COMMENT "Running qdoc against Qt source code..."
SOURCE "pyside.qdocconf")
add_custom_target(apidoc
@@ -15,25 +83,23 @@ add_custom_target(apidoc
# create conf.py based on conf.py.in
configure_file("conf.py.in" "rst/conf.py" @ONLY)
-configure_file(typesystem_doc.xml.in typesystem_doc.xml @ONLY)
add_custom_target("docrsts"
- COMMAND ${SHIBOKEN_BINARY} --generator-set=qtdoc
- ${pyside2_BINARY_DIR}/pyside_global.h
- --include-paths="${QT_INCLUDE_DIR}${PATH_SEP}${pyside2_SOURCE_DIR}"
+ COMMAND ${SHIBOKEN_BINARY} --generator-set=qtdoc ${docHeader}
+ --include-paths="${QT_INCLUDE_DIR}${PATH_SEP}${pyside2_SOURCE_DIR}${PATH_SEP}${TS_ROOT}"
--api-version=${SUPPORTED_QT_VERSION}
- --typesystem-paths="${pyside2_SOURCE_DIR}${PATH_SEP}${QtCore_SOURCE_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR}${PATH_SEP}${QtHelp_SOURCE_DIR}${PATH_SEP}${QtMultimedia_SOURCE_DIR}${PATH_SEP}${QtNetwork_SOURCE_DIR}${PATH_SEP}${QtOpenGL_SOURCE_DIR}${PATH_SEP}${QtScript_SOURCE_DIR}${PATH_SEP}${QtScriptTools_SOURCE_DIR}${PATH_SEP}${QtSql_SOURCE_DIR}${PATH_SEP}${QtSvg_SOURCE_DIR}${PATH_SEP}${QtTest_SOURCE_DIR}${PATH_SEP}${QtUiTools_SOURCE_DIR}${PATH_SEP}${QtWebKit_SOURCE_DIR}${PATH_SEP}${QtXml_SOURCE_DIR}${PATH_SEP}${QtXmlPatterns_SOURCE_DIR}"
+ --typesystem-paths="${QDOC_TYPESYSTEM_PATH}"
--library-source-dir=${QT_SRC_DIR}
- --documentation-data-dir=${DOC_DATA_DIR}
+ --documentation-data-dir=${DOC_DATA_DIR}/webxml
--output-directory=${CMAKE_CURRENT_BINARY_DIR}/rst
- --documentation-code-snippets-dir=${CMAKE_CURRENT_SOURCE_DIR}/codesnippets${PATH_SEP}${CMAKE_CURRENT_SOURCE_DIR}/codesnippets/examples
+ --documentation-code-snippets-dir=${CMAKE_CURRENT_SOURCE_DIR}/codesnippets/doc/src/snippets${PATH_SEP}${CMAKE_CURRENT_SOURCE_DIR}/codesnippets/examples
--documentation-extra-sections-dir=${CMAKE_CURRENT_SOURCE_DIR}/extras
${CMAKE_CURRENT_BINARY_DIR}/typesystem_doc.xml
WORKING_DIRECTORY ${${module}_SOURCE_DIR}
COMMENT "Running generator to generate documentation..."
)
add_dependencies(apidoc docrsts)
-add_dependencies(docrsts qdoc3)
+add_dependencies(docrsts qdoc)
# #create devhelp file
# add_custom_target(apidevhelp
diff --git a/sources/pyside2/doc/_templates/index.html b/sources/pyside2/doc/_templates/index.html
index 8da417682..901ddc496 100644
--- a/sources/pyside2/doc/_templates/index.html
+++ b/sources/pyside2/doc/_templates/index.html
@@ -4,18 +4,19 @@
<div class="section">
<h1>PySide {{ version }} Reference</h1>
- <p><a href="http://www.qtsoftware.com/">Qt</a> is a cross-platform application framework from Qt Software (owned by Nokia).
- It features a large number of libraries providing services like network abstraction and XML handling, along with a very rich
- GUI package, allowing C++ developers to write their applications once and run them unmodified in different systems.
+ <p><a href="http://www.qt.io/">Qt</a> is a complete cross-platform software framework.
PySide aims to provide Python developers access to the Qt libraries in the most natural way.</p>
- <p>PySide is built using the <a href="http://www.pyside.org/docs/shiboken">Shiboken</a> binding generator.</p>
+ <p>PySide is built using the Shiboken binding generator.</p>
<h2>Notes</h2>
<h3>About 0 vs None</h3>
- <p>The PySide class reference documentation is automatically generated from the original Qt documentation for C++, some parts were tuned to fit the Python world. However, it's not possible to rewrite all Qt docs as it would require a really huge effort, so if the documentation says you can use 0 on an QObject argument, interpret it as None.</p>
+ <p>The PySide class reference documentation is automatically generated from the original
+ Qt documentation for C++, some parts were tuned to fit the Python world. However, it's not
+ possible to rewrite all Qt docs as it would require a really huge effort, so if the
+ documentation says you can use 0 on an QObject argument, interpret it as None.</p>
<h3>About keyword arguments</h3>
@@ -25,34 +26,83 @@
<table class="contentstable" align="center" ><tr>
<td width="50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtCore/index") }}">QtCore</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/Qt3DAnimation/index") }}">Qt3DAnimation</a><br/>
+ <span class="linkdescr">provides a set of prebuilt elements to help you get started with Qt 3D</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/Qt3DCore/index") }}">Qt3DCore</a><br/>
+ <span class="linkdescr">contains functionality to support near-realtime simulation systems</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/Qt3DExtras/index") }}">Qt3DExtras</a><br/>
+ <span class="linkdescr"> provides a set of prebuilt elements to help you get started with Qt 3D</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/Qt3DInput/index") }}">Qt3DInput</a><br/>
+ <span class="linkdescr"></span>provides classes for handling user input in applications using Qt3D</p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/Qt3DLogic/index") }}">Qt3DLogic</a><br/>
+ <span class="linkdescr">enables synchronizing frames with the Qt 3D backend</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/Qt3DRender/index") }}">Qt3DRender</a><br/>
+ <span class="linkdescr"></span>contains functionality to support 2D and 3D rendering using Qt 3D</p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtAxContainer/index") }}">QtAxContainer</a><br/>
+ <span class="linkdescr">provides QAxObject and QAxWidget which act as
+ containers for COM objects and ActiveX controls</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtCharts/index") }}">QtCharts</a><br/>
+ <span class="linkdescr">provides a set of easy to use chart components</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtConcurrent/index") }}">QtConcurrent</a><br/>
+ <span class="linkdescr">provides high-level APIs that make it possible
+ to write multi-threaded programs without using low-level threading
+ primitives such as mutexes, read-write locks, wait conditions, or semaphores</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtCore/index") }}">QtCore</a><br/>
<span class="linkdescr">core non-GUI functionality</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtGui/index") }}">QtGui</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtDataVisualization/index") }}">QtDataVisualization</a><br/>
+ <span class="linkdescr">provides a way to visualize data in 3D as bar, scatter, and surface graphs</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtGui/index") }}">QtGui</a><br/>
<span class="linkdescr">extends QtCore with GUI functionality.</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtHelp/index") }}">QtHelp</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtMacExtras/index") }}">QtMacExtras</a><br/>
+ <span class="linkdescr">provides classes and functions specific to
+ macOS and iOS operating systems</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtHelp/index") }}">QtHelp</a><br/>
<span class="linkdescr">provides classes for integrating online documentation in applications</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtMultimedia/index") }}">QtMultimedia</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtMultimedia/index") }}">QtMultimedia</a><br/>
<span class="linkdescr">provides low-level multimedia functionality</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtNetwork/index") }}">QtNetwork</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtMultimediaWidgets/index") }}">QtMultimediaWidgets</a><br/>
+ <span class="linkdescr">provides the widget-based multimedia API</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtNetwork/index") }}">QtNetwork</a><br/>
<span class="linkdescr">offers classes that allow you to write TCP/IP clients and servers</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtOpenGL/index") }}">QtOpenGL</a><br/>
- <span class="linkdescr">offers classes that make it easy to use OpenGL in Qt applications</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtScript/index") }}">QtScript</a><br/>
- <span class="linkdescr">provides classes for making Qt applications scriptable</span></p>
</td>
<td width="50%">
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtScriptTools/index") }}">QtScriptTools</a><br/>
- <span class="linkdescr">provides additional components for applications that use Qt Script</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtSql/index") }}">QtSql</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtOpenGL/index") }}">QtOpenGL</a><br/>
+ <span class="linkdescr">offers classes that make it easy to use OpenGL in Qt applications</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtPrintSupport/index") }}">QtPrintSupport</a><br/>
+ <span class="linkdescr">provides cross-platform support for printing</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtQml/index") }}">QtQml</a><br/>
+ <span class="linkdescr">Python API for Qt QML</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtQuick/index") }}">QtQuick</a><br/>
+ <span class="linkdescr">provides classes for embedding Qt Quick in Qt applications</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtQuickWidgets/index") }}">QtQuickWidgets</a><br/>
+ <span class="linkdescr">provides the QQuickWidget class for embedding Qt Quick in widget-based applications</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtTextToSpeech/index") }}">QtTextToSpeech</a><br/>
+ <span class="linkdescr">provides C++ API to access text-to-speech engines</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtSql/index") }}">QtSql</a><br/>
<span class="linkdescr">helps you provide seamless database integration to your Qt applications</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtSvg/index") }}">QtSvg</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtSvg/index") }}">QtSvg</a><br/>
<span class="linkdescr">provides classes for displaying the contents of SVG files</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtUiTools/index") }}">QtUiTools</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtTest/index") }}">QtTest</a><br/>
+ <span class="linkdescr">provides classes for unit testing Qt applications and libraries</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtUiTools/index") }}">QtUiTools</a><br/>
<span class="linkdescr">provides classes to handle forms created with Qt Designer</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtXml/index") }}">QtXml</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtWebChannel/index") }}">QtWebChannel</a><br/>
+ <span class="linkdescr">enables peer-to-peer communication between a server and a client
+ (HTML/JavaScript or QML application)</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtWebSockets/index") }}">QtWebSockets</a><br/>
+ <span class="linkdescr"></span>provides interfaces that enable Qt applications
+ to act as a server that can process WebSocket requests, or a client that
+ can consume data received from the server, or both</p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtWidgets/index") }}">QtWidgets</a><br/>
+ <span class="linkdescr">extends Qt GUI with C++ widget functionality.</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtWinExtras/index") }}">QtWinExtras</a><br/>
+ <span class="linkdescr">provides classes and functions for using some Windows APIs in a Qt way</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtX11Extras/index") }}">QtX11Extras</a><br/>
+ <span class="linkdescr">provides information about the X display configuration</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtXml/index") }}">QtXml</a><br/>
<span class="linkdescr">provides a stream reader and writer for XML documents</span></p>
- <p class="biglink"><a class="biglink" href="{{ pathto("PySide/QtWebKit/index") }}">QtWebkit</a><br/>
- <span class="linkdescr">provides a Web browser engine</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("PySide2/QtXmlPatterns/index") }}">QtXmlPatterns</a><br/>
+ <span class="linkdescr">provides support for XPath, XQuery, XSLT and XML Schema validation</span></p>
</td></tr>
</table>
diff --git a/sources/pyside2/doc/_templates/layout.html b/sources/pyside2/doc/_templates/layout.html
index 9dc53722d..d2eb1d08d 100644
--- a/sources/pyside2/doc/_templates/layout.html
+++ b/sources/pyside2/doc/_templates/layout.html
@@ -26,9 +26,7 @@
{%- block footer %}
<div class="footer">
- <a href="http://www.indt.org.br"><img src="{{ pathto('_static/logo_indt.jpg', 1) }}" alt="Indt" border="0" /></a>
- <a href="http://www.openbossa.org"><img src="{{ pathto('_static/logo_openbossa.png', 1) }}" alt="Openbossa" border="0" /></a>
- <a href="http://qt.nokia.com/"><img src="{{ pathto('_static/logo_qt.png', 1) }}" alt="Qt" border="0" /></a>
+ <a href="http://www.qt.io/"><img src="{{ pathto('_static/logo_qt.png', 1) }}" alt="Qt" border="0" /></a>
<a href="http://www.python.org"><img src="{{ pathto('_static/logo_python.jpg', 1) }}" alt="Python" border="0" /></a>
</div>
</div>
diff --git a/sources/pyside2/doc/_themes/pysidedocs/static/logo_indt.jpg b/sources/pyside2/doc/_themes/pysidedocs/static/logo_indt.jpg
deleted file mode 100644
index 2a1fbe7a1..000000000
--- a/sources/pyside2/doc/_themes/pysidedocs/static/logo_indt.jpg
+++ /dev/null
Binary files differ
diff --git a/sources/pyside2/doc/_themes/pysidedocs/static/logo_openbossa.png b/sources/pyside2/doc/_themes/pysidedocs/static/logo_openbossa.png
deleted file mode 100644
index 51e868d6e..000000000
--- a/sources/pyside2/doc/_themes/pysidedocs/static/logo_openbossa.png
+++ /dev/null
Binary files differ
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/alphachannel.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/alphachannel.cpp
index 4606ce7b5..df5430bb0 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/alphachannel.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/alphachannel.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/clipboard/clipwindow.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/clipboard/clipwindow.cpp
index 42ff004ac..2e4c967e2 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/clipboard/clipwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/clipboard/clipwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_io_qsettings.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_io_qsettings.cpp
index 2297e6894..9ddf2d602 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_io_qsettings.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_io_qsettings.cpp
@@ -92,11 +92,8 @@ settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default") # re
//! [7]
-#ifdef Q_WS_MAC
- settings = QSettings("grenoullelogique.fr", "Squash")
-#else
- settings = QSettings("Grenoulle Logique", "Squash")
-#endif
+ organizationName = "grenoullelogique.fr" if sys.platform.startswith('darwin') else "Grenoulle Logique"
+ settings = QSettings(organizationName, "Squash")
//! [7]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp
index 5910bc67b..7328a41c0 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qbytearray.cpp
@@ -253,7 +253,7 @@ ba.lastIndexOf("X") # returns -1
//! [25]
-url = QByteArray("ftp://ftp.trolltech.com/")
+url = QByteArray("ftp://ftp.qt-project.org/")
if url.startsWith("ftp:"):
...
//! [25]
@@ -288,16 +288,16 @@ z = x.mid(5) # z == "pineapples"
//! [30]
-x = QByteArray("TROlltECH")
+x = QByteArray("Qt by THE QT COMPANY")
y = x.toLower()
-# y == "trolltech"
+# y == "qt by the qt company"
//! [30]
//! [31]
-x = QByteArray("TROlltECH")
+x = QByteArray("Qt by THE QT COMPANY")
y = x.toUpper()
-# y == "TROLLTECH"
+# y == "QT BY THE QT COMPANY"
//! [31]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qregexp.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qregexp.cpp
index 338582651..7afefee7c 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qregexp.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_corelib_tools_qregexp.cpp
@@ -136,7 +136,7 @@ while pos >= 0:
//! [10]
-txt = "Nokia Corporation and/or its subsidiary(-ies)\tqtsoftware.com\tNorway"
+txt = "The Qt Company Ltd\tqt.io\tFinland"
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if rx.indexIn(txt) != -1:
company = rx.cap(1)
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication.cpp
index d3e371b1e..3ea9bb495 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qapplication.cpp
@@ -50,19 +50,9 @@
//! [0]
def main():
- if Qt.Q_WS_X11
- useGUI = getenv("DISPLAY") != 0
- else:
- useGUI = True
-
- app = QApplication(sys.argv, useGUI)
-
- if useGUI:
- # start GUI version
- ...
- else:
- # start non-GUI version
- ...
+ useGUI = not '-no-gui' in sys.argv
+ app = QApplication(sys.argv) if useGUI else QCoreApplication(sys.argv)
+ ...
return app.exec_()
//! [0]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qclipboard.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qclipboard.cpp
index e69152401..47369ee8b 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qclipboard.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_kernel_qclipboard.cpp
@@ -49,7 +49,7 @@
****************************************************************************/
//! [0]
-clipboard = QApplication.clipboard()
+clipboard = QGuiApplication.clipboard()
originalText = clipboard.text()
...
clipboard.setText(newText)
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainter.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainter.cpp
index e702214f7..0d0807971 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainter.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_painting_qpainter.cpp
@@ -216,7 +216,7 @@ painter.drawPixmap(target, image, source)
//! [17]
painter = QPainter(self)
-painter.drawText(rect, Qt.AlignCenter, tr("Qt by\nTrolltech"))
+painter.drawText(rect, Qt.AlignCenter, tr("Qt\nProject"))
//! [17]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyle.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyle.cpp
index ba8719dc3..bdbdbad73 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyle.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_styles_qstyle.cpp
@@ -49,7 +49,7 @@
****************************************************************************/
//! [0]
-python myapplication.py -style motif
+python myapplication.py -style windows
//! [0]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qvalidator.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_util_qvalidator.cpp
index b366dc2ab..b366dc2ab 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_widgets_qvalidator.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_gui_util_qvalidator.cpp
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qftp.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qftp.cpp
index b227b5797..26177869a 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qftp.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qftp.cpp
@@ -50,13 +50,13 @@
//! [0]
ftp = QFtp(parent)
-ftp.connectToHost("ftp.trolltech.com")
+ftp.connectToHost("ftp.qt-project.org")
ftp.login()
//! [0]
//! [1]
-ftp.connectToHost("ftp.trolltech.com") # id == 1
+ftp.connectToHost("ftp.qt-project.org") # id == 1
ftp.login() # id == 2
ftp.cd("qt") # id == 3
ftp.get("INSTALL") # id == 4
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp
index 0c7afec10..962733aa6 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkaccessmanager.cpp
@@ -52,13 +52,13 @@
manager = QNetworkAccessManager(self)
manager.finished[QNetworkReply].connect(self.replyFinished)
-manager.get(QNetworkRequest(QUrl("http://qt.nokia.com")))
+manager.get(QNetworkRequest(QUrl("http://qt-project.org")))
//! [0]
//! [1]
request = QNetworkRequest()
-request.setUrl(QUrl("http://qt.nokia.com"))
+request.setUrl(QUrl("http://qt-project.org"))
request.setRawHeader("User-Agent", "MyOwnBrowser 1.0")
reply = manager.get(request)
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp
index 7e2aea326..53d0de06e 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_access_qnetworkdiskcache.cpp
@@ -57,11 +57,11 @@ manager.setCache(diskCache)
//! [1]
# do a normal request (preferred from network, as this is the default)
-request = QNetworkRequest(QUrl("http://qt.nokia.com"))
+request = QNetworkRequest(QUrl("http://qt-project.org"))
manager.get(request)
# do a request preferred from cache
-request2 = QNetworkRequest(QUrl("http://qt.nokia.com"))
+request2 = QNetworkRequest(QUrl("http://qt-project.org"))
request2.setAttribute(QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferCache)
manager.get(request2)
//! [1]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostinfo.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostinfo.cpp
index c1971b0ba..87e773863 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostinfo.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_network_kernel_qhostinfo.cpp
@@ -49,8 +49,8 @@
****************************************************************************/
//! [0]
-# To find the IP address of qtsoftware.com
-QHostInfo.lookupHost("qtsoftware.com", self, SLOT("printResults(QHostInfo)"))
+# To find the IP address of qt-project.org
+QHostInfo.lookupHost("qt-project.org", self, SLOT("printResults(QHostInfo)"))
# To find the host name for 4.2.2.1
QHostInfo.lookupHost("4.2.2.1", self, SLOT("printResults(QHostInfo)"))
@@ -58,7 +58,7 @@ QHostInfo.lookupHost("4.2.2.1", self, SLOT("printResults(QHostInfo)"))
//! [1]
-info = QHostInfo.fromName("qtsoftware.com")
+info = QHostInfo.fromName("qt-project.org")
//! [1]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_xml_dom_qdom.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_xml_dom_qdom.cpp
index 741a75245..33f639c84 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_xml_dom_qdom.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_xml_dom_qdom.cpp
@@ -116,7 +116,7 @@ QDomElement element4 = document.createElement("MyElement")
//! [7]
-<link href="http://qtsoftware.com" color="red" />
+<link href="http://qt-project.org" color="red" />
//! [7]
@@ -124,10 +124,10 @@ QDomElement element4 = document.createElement("MyElement")
e = # some QDomElement...
#...
a = e.attributeNode("href")
-print a.value() # prints "http://qtsoftware.com"
-a.setValue("http://doc.trolltech.com") # change the node's attribute
+print a.value() # prints "http://qt-project.org.com"
+a.setValue("http://qt-project.org/doc") # change the node's attribute
a2 = e.attributeNode("href")
-print a2.value() # prints "http://doc.trolltech.com"
+print a2.value() # prints "http://qt-project.org/doc"
//! [8]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/customstyle/customstyle.h b/sources/pyside2/doc/codesnippets/doc/src/snippets/customstyle/customstyle.h
index a89c621a1..89e324cb3 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/customstyle/customstyle.h
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/customstyle/customstyle.h
@@ -51,10 +51,10 @@
#ifndef CUSTOMSTYLE_H
#define CUSTOMSTYLE_H
-#include <QWindowsStyle>
+#include <QProxyStyle>
//! [0]
-class CustomStyle(QWindowsStyle):
+class CustomStyle(QProxyStyle):
...
def drawPrimitive(PrimitiveElement element, const QStyleOption *option,
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/customviewstyle.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/customviewstyle.cpp
index 240f9ab88..f21ec7c89 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/customviewstyle.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/customviewstyle.cpp
@@ -73,7 +73,7 @@ void CustomViewStyle::drawPrimitive(PrimitiveElement element, const QStyleOption
break;
}
default:
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
+ QProxyStyle::drawPrimitive(element, option, painter, widget);
}
//![0]
}
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/dialogs/dialogs.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/dialogs/dialogs.cpp
index f926bbc03..58fb5653b 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/dialogs/dialogs.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/dialogs/dialogs.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/dragging/mainwindow.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/dragging/mainwindow.cpp
index 739e70799..45b08af63 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/dragging/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/dragging/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/droparea.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/droparea.cpp
index ce25fd693..954feb402 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/droparea.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/droparea.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
@@ -98,7 +98,7 @@ void DropArea.dropEvent(QDropEvent *event)
//![0]
def paste(self):
- clipboard = QApplication.clipboard()
+ clipboard = QGuiApplication.clipboard()
mimeData = clipboard.mimeData()
if mimeData.hasImage():
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/layouts/layouts.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/layouts/layouts.cpp
index 1211ccbc5..d98d91f39 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/layouts/layouts.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/layouts/layouts.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/mainwindowsnippet.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/mainwindowsnippet.cpp
index fb2440426..615d26aee 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/mainwindowsnippet.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/mainwindowsnippet.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/matrix/matrix.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/matrix/matrix.cpp
index 0f5b5f441..c0512f538 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/matrix/matrix.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/matrix/matrix.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/mdiareasnippets.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/mdiareasnippets.cpp
index a20f70fc2..e7dd80fe9 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/mdiareasnippets.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/mdiareasnippets.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/picture/picture.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/picture/picture.cpp
index 1dba7c686..a46954197 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/picture/picture.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/picture/picture.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/polygon/polygon.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/polygon/polygon.cpp
index 5641dbdbe..393ab5a70 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/polygon/polygon.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/polygon/polygon.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qfontdatabase/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qfontdatabase/main.cpp
index a7abf4584..02bd2441a 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qfontdatabase/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qfontdatabase/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp
index 03ce62bea..8236ec6c5 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qprocess/qprocess-simpleexecution.cpp
@@ -65,7 +65,7 @@ int main(int argc, char *argv[])
program = "./../../../../examples/widgets/analogclock/analogclock";
//! [2]
- arguments = ["-style", "motif"]
+ arguments = ["-style", "fusion"]
myProcess = QProcess(parent)
myProcess.start(program, arguments)
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qsortfilterproxymodel-details/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qsortfilterproxymodel-details/main.cpp
index bea97889f..d951c9465 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qsortfilterproxymodel-details/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qsortfilterproxymodel-details/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qsplashscreen/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qsplashscreen/main.cpp
index d24d11e11..cb1888da8 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qsplashscreen/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qsplashscreen/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qstackedwidget/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qstackedwidget/main.cpp
index b391bcc90..f43744ed7 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qstackedwidget/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qstackedwidget/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.cpp
index 1c85cf7cf..64b4f0a16 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidget-using/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.cpp
index a3579b789..97e6ce164 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qtreewidgetitemiterator-using/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/qxmlstreamwriter/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/qxmlstreamwriter/main.cpp
index 9838dab1d..e3a24968e 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/qxmlstreamwriter/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/qxmlstreamwriter/main.cpp
@@ -71,7 +71,7 @@ int main(int argc, char *argv[])
stream.writeAttribute("folded", "no");
//! [write element]
stream.writeStartElement("bookmark");
- stream.writeAttribute("href", "http://www.qtsoftware.com/");
+ stream.writeAttribute("href", "http://qt-project.org/");
stream.writeTextElement("title", "Qt Home");
stream.writeEndElement(); // bookmark
//! [write element]
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/shareddirmodel/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/shareddirmodel/main.cpp
index 187acde31..531660469 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/shareddirmodel/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/shareddirmodel/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/handler.cpp
index 6f18c7786..6f18c7786 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/handler.cpp
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.h b/sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/handler.h
index 1d3ec1144..1d3ec1144 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/handler.h
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/handler.h
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/main.cpp
index f16891533..f16891533 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/xml/simpleparse/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/simpleparse/main.cpp
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/splitter/splitter.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/splitter/splitter.cpp
index 269ca02da..3ca90077e 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/splitter/splitter.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/splitter/splitter.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/splitterhandle/splitter.h b/sources/pyside2/doc/codesnippets/doc/src/snippets/splitterhandle/splitter.h
index f067f2249..1022e56b3 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/splitterhandle/splitter.h
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/splitterhandle/splitter.h
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/sqldatabase/sqldatabase.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/sqldatabase/sqldatabase.cpp
index aa026d755..d92a03335 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/sqldatabase/sqldatabase.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/sqldatabase/sqldatabase.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-css/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-css/main.cpp
index e7d355115..ddac007c6 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-css/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-css/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.cpp
index c15d43646..dedc06e86 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-tables/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-texttable/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-texttable/main.cpp
index 7874764db..640575050 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-texttable/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/textdocument-texttable/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/transform/main.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/transform/main.cpp
index 6d84261e9..784f4df1a 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/transform/main.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/transform/main.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/whatsthis/whatsthis.cpp b/sources/pyside2/doc/codesnippets/doc/src/snippets/whatsthis/whatsthis.cpp
index d25ce3637..be575f53f 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/whatsthis/whatsthis.cpp
+++ b/sources/pyside2/doc/codesnippets/doc/src/snippets/whatsthis/whatsthis.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/dialogs/extension/finddialog.cpp b/sources/pyside2/doc/codesnippets/examples/dialogs/extension/finddialog.cpp
index de99bb3ec..18612e4ba 100644
--- a/sources/pyside2/doc/codesnippets/examples/dialogs/extension/finddialog.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/dialogs/extension/finddialog.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider-example.qml b/sources/pyside2/doc/codesnippets/examples/imageprovider/imageprovider-example.qml
index ad51f2e7a..fc6063e40 100644
--- a/sources/pyside2/doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider-example.qml
+++ b/sources/pyside2/doc/codesnippets/examples/imageprovider/imageprovider-example.qml
@@ -48,7 +48,7 @@
**
****************************************************************************/
-import QtQuick 1.0
+import QtQuick 2.0
import "ImageProviderCore" // import the plugin that registers the color image provider
//![0]
diff --git a/sources/pyside2/doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider.cpp b/sources/pyside2/doc/codesnippets/examples/imageprovider/imageprovider.cpp
index ffbe8f564..4d1aeb74f 100644
--- a/sources/pyside2/doc/codesnippets/examples/declarative/cppextensions/imageprovider/imageprovider.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/imageprovider/imageprovider.cpp
@@ -49,9 +49,9 @@
****************************************************************************/
//![0]
-class ColorImageProvider (QDeclarativeImageProvider):
+class ColorImageProvider (QQuickImageProvider):
def __init__(self):
- QDeclarativeImageProvider.__init__(self, QDeclarativeImageProvider.Pixmap)
+ QQuickImageProvider.__init__(self, QDeclarativeImageProvider.Pixmap)
def requestPixmap(id, size, requestedSize):
width = 100
diff --git a/sources/pyside2/doc/codesnippets/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp b/sources/pyside2/doc/codesnippets/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp
index 0ec3b071f..4732b7773 100644
--- a/sources/pyside2/doc/codesnippets/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/itemviews/customsortfiltermodel/mysortfilterproxymodel.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/mainwindows/application/mainwindow.cpp b/sources/pyside2/doc/codesnippets/examples/mainwindows/application/mainwindow.cpp
index 82c5f891b..d22a39151 100644
--- a/sources/pyside2/doc/codesnippets/examples/mainwindows/application/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/mainwindows/application/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/mainwindows/dockwidgets/mainwindow.cpp b/sources/pyside2/doc/codesnippets/examples/mainwindows/dockwidgets/mainwindow.cpp
index fa125e01f..c6fd2894b 100644
--- a/sources/pyside2/doc/codesnippets/examples/mainwindows/dockwidgets/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/mainwindows/dockwidgets/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/mainwindows/mainwindow.cpp b/sources/pyside2/doc/codesnippets/examples/mainwindows/mainwindow.cpp
index 8dc283ebf..33cb540b4 100644
--- a/sources/pyside2/doc/codesnippets/examples/mainwindows/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/mainwindows/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/mainwindows/mdi/mainwindow.cpp b/sources/pyside2/doc/codesnippets/examples/mainwindows/mdi/mainwindow.cpp
index 7032ba7da..ed23e83eb 100644
--- a/sources/pyside2/doc/codesnippets/examples/mainwindows/mdi/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/mainwindows/mdi/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/mainwindows/menus/mainwindow.cpp b/sources/pyside2/doc/codesnippets/examples/mainwindows/menus/mainwindow.cpp
index 8dc283ebf..33cb540b4 100644
--- a/sources/pyside2/doc/codesnippets/examples/mainwindows/menus/mainwindow.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/mainwindows/menus/mainwindow.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_svg_qgraphicssvgitem.cpp b/sources/pyside2/doc/codesnippets/examples/quick/plugins/plugins.qml
index df2dcbd94..df2dcbd94 100644
--- a/sources/pyside2/doc/codesnippets/doc/src/snippets/code/src_svg_qgraphicssvgitem.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/quick/plugins/plugins.qml
diff --git a/sources/pyside2/doc/codesnippets/examples/sql/relationaltablemodel/relationaltablemodel.cpp b/sources/pyside2/doc/codesnippets/examples/relationaltablemodel/relationaltablemodel.cpp
index b34c652d0..8df1d73b2 100644
--- a/sources/pyside2/doc/codesnippets/examples/sql/relationaltablemodel/relationaltablemodel.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/relationaltablemodel/relationaltablemodel.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/painting/svggenerator/window.cpp b/sources/pyside2/doc/codesnippets/examples/svggenerator/window.cpp
index 60c415949..60c415949 100644
--- a/sources/pyside2/doc/codesnippets/examples/painting/svggenerator/window.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/svggenerator/window.cpp
diff --git a/sources/pyside2/doc/codesnippets/examples/widgets/icons/iconsizespinbox.cpp b/sources/pyside2/doc/codesnippets/examples/widgets/icons/iconsizespinbox.cpp
index 22e5fbc37..f0d1f2ac6 100644
--- a/sources/pyside2/doc/codesnippets/examples/widgets/icons/iconsizespinbox.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/widgets/icons/iconsizespinbox.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/examples/widgets/spinboxes/window.cpp b/sources/pyside2/doc/codesnippets/examples/widgets/spinboxes/window.cpp
index 54a9523ee..bf07fb73c 100644
--- a/sources/pyside2/doc/codesnippets/examples/widgets/spinboxes/window.cpp
+++ b/sources/pyside2/doc/codesnippets/examples/widgets/spinboxes/window.cpp
@@ -21,13 +21,13 @@
## "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
+## * 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
+## * 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
+## * 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.
##
diff --git a/sources/pyside2/doc/codesnippets/webkitsnippets/simple/main.cpp b/sources/pyside2/doc/codesnippets/webkitsnippets/simple/main.cpp
index 231636773..ee6b2c213 100644
--- a/sources/pyside2/doc/codesnippets/webkitsnippets/simple/main.cpp
+++ b/sources/pyside2/doc/codesnippets/webkitsnippets/simple/main.cpp
@@ -57,7 +57,7 @@ app = QApplication(sys.argv)
parent = None
//! [Using QWebView]
view = QWebView(parent)
-view.load(QUrl("http://qt.nokia.com/"))
+view.load(QUrl("http://qt-project.org/"))
view.show()
//! [Using QWebView]
sys.exit(app.exec_())
diff --git a/sources/pyside2/doc/codesnippets/webkitsnippets/webpage/main.cpp b/sources/pyside2/doc/codesnippets/webkitsnippets/webpage/main.cpp
index 8166a8a49..92df5730b 100644
--- a/sources/pyside2/doc/codesnippets/webkitsnippets/webpage/main.cpp
+++ b/sources/pyside2/doc/codesnippets/webkitsnippets/webpage/main.cpp
@@ -78,6 +78,6 @@ class Thumbnailer (QObject):
app = QApplication(sys.argv)
-thumbnail = Thumbnailer(QUrl("http://qt.nokia.com"))
+thumbnail = Thumbnailer(QUrl("http://qt-project.org"))
thumbnail.finished.connect(app.quit)
sys.exit(app.exec_())
diff --git a/sources/pyside2/doc/conf.py.in b/sources/pyside2/doc/conf.py.in
index 3fd1781b5..c0ae45fd3 100644
--- a/sources/pyside2/doc/conf.py.in
+++ b/sources/pyside2/doc/conf.py.in
@@ -132,10 +132,6 @@ html_theme_path = ['@CMAKE_CURRENT_SOURCE_DIR@/_themes']
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-html_use_smartypants = True
-
# Custom sidebar templates, maps document names to template names.
#html_sidebars = { '' : ''}
@@ -155,8 +151,6 @@ html_split_index = False
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = False
-html_add_permalinks = True
-
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
diff --git a/sources/pyside2/doc/inheritance_diagram.py b/sources/pyside2/doc/inheritance_diagram.py
index a7f376ccd..038c22f29 100644
--- a/sources/pyside2/doc/inheritance_diagram.py
+++ b/sources/pyside2/doc/inheritance_diagram.py
@@ -52,15 +52,38 @@ from docutils.parsers.rst import directives
from sphinx.ext.graphviz import render_dot_html, render_dot_latex
from sphinx.util.compat import Directive
-
-class_sig_re = re.compile(r'''^([\w.]*\.)? # module names
- (\w+) \s* $ # class/final module name
- ''', re.VERBOSE)
-
-
class InheritanceException(Exception):
pass
+# When passed something like:
+# PySide2.QtCore.QStateMachine.SignalEvent
+# try to import the underlying module and return a
+# handle to the object. In a loop, import
+# PySide2.QtCore.QStateMachine.SignalEvent
+# PySide2.QtCore.QStateMachine
+# PySide2.QtCore
+# until the import succeeds and walk up the attributes
+# to obtain the object
+
+def importClassOrModule(name):
+ components = name.split('.')
+ for i in range(len(components), 0, -1):
+ importPath = '.'.join(components[: i])
+ try:
+ __import__(importPath)
+ except ImportError:
+ continue
+ if i == len(components):
+ return sys.modules[importPath]
+ remaining = components[i :]
+ cls = sys.modules[importPath]
+ for component in remaining:
+ try:
+ cls = getattr(cls, component)
+ except Exception: # No such attribute
+ return None
+ return cls
+ return None
class InheritanceGraph(object):
"""
@@ -86,38 +109,13 @@ class InheritanceGraph(object):
"""
Import a class using its fully-qualified *name*.
"""
- try:
- path, base = class_sig_re.match(name).groups()
- except (AttributeError, ValueError):
- raise InheritanceException('Invalid class or module %r specified '
- 'for inheritance diagram' % name)
-
- fullname = (path or '') + base
- path = (path and path.rstrip('.') or '')
-
- # two possibilities: either it is a module, then import it
- try:
- __import__(fullname)
- todoc = sys.modules[fullname]
- except ImportError:
- # else it is a class, then import the module
- if not path:
- if currmodule:
- # try the current module
- path = currmodule
- else:
- raise InheritanceException(
- 'Could not import class %r specified for '
- 'inheritance diagram' % base)
- try:
- __import__(path)
- todoc = getattr(sys.modules[path], base)
- except (ImportError, AttributeError):
- raise InheritanceException(
- 'Could not import class or module %r specified for '
- 'inheritance diagram' % (path + '.' + base))
-
- # If a class, just return it
+ todoc = importClassOrModule(name)
+ if not todoc and currmodule is not None:
+ todoc = importClassOrModule(currmodule + '.' + name)
+ if not todoc:
+ moduleStr = '(module {})'.format(currmodule) if currmodule else ''
+ raise InheritanceException('Could not import class {} specified for '
+ 'inheritance diagram {}.'.format(name, moduleStr))
if inspect.isclass(todoc):
return [todoc]
elif inspect.ismodule(todoc):
@@ -167,7 +165,7 @@ class InheritanceGraph(object):
for cls in classes:
recurse(cls)
- return all_classes.values()
+ return list(all_classes.values())
def class_name(self, cls, parts=0):
"""Given a class object, return a fully-qualified name.
@@ -200,8 +198,8 @@ class InheritanceGraph(object):
'shape': 'box',
'fontsize': 10,
'height': 0.25,
- 'fontname': 'Vera Sans, DejaVu Sans, Liberation Sans, '
- 'Arial, Helvetica, sans',
+ 'fontname': '"Vera Sans, DejaVu Sans, Liberation Sans, '
+ 'Arial, Helvetica, sans"',
'style': '"setlinewidth(0.5)"',
}
default_edge_attrs = {
@@ -314,7 +312,8 @@ class InheritanceDiagram(Directive):
def get_graph_hash(node):
- return md5(node['content'] + str(node['parts'])).hexdigest()[-10:]
+ hashString = node['content'] + str(node['parts'])
+ return md5(hashString.encode('utf-8')).hexdigest()[-10:]
def html_visit_inheritance_diagram(self, node):
@@ -336,7 +335,7 @@ def html_visit_inheritance_diagram(self, node):
urls[child['reftitle']] = '#' + child.get('refid')
dotcode = graph.generate_dot(name, urls, env=self.builder.env)
- render_dot_html(self, node, dotcode, [], 'inheritance', 'inheritance',
+ render_dot_html(self, node, dotcode, {}, 'inheritance', 'inheritance',
alt='Inheritance diagram of ' + node['content'])
raise nodes.SkipNode
@@ -352,7 +351,7 @@ def latex_visit_inheritance_diagram(self, node):
dotcode = graph.generate_dot(name, env=self.builder.env,
graph_attrs={'size': '"6.0,6.0"'})
- render_dot_latex(self, node, dotcode, [], 'inheritance')
+ render_dot_latex(self, node, dotcode, {}, 'inheritance')
raise nodes.SkipNode
diff --git a/sources/pyside2/doc/modules.rst b/sources/pyside2/doc/modules.rst
index 0faa629ad..3bf0f2abb 100644
--- a/sources/pyside2/doc/modules.rst
+++ b/sources/pyside2/doc/modules.rst
@@ -6,16 +6,16 @@ Qt is splitted in several modules.
.. toctree::
:maxdepth: 1
- PySide/QtCore/index.rst
- PySide/QtGui/index.rst
- PySide/QtHelp/index.rst
- PySide/QtMultimedia/index.rst
- PySide/QtNetwork/index.rst
- PySide/QtOpenGL/index.rst
- PySide/QtScript/index.rst
- PySide/QtScriptTools/index.rst
- PySide/QtSql/index.rst
- PySide/QtSvg/index.rst
- PySide/QtUiTools/index.rst
- PySide/QtXml/index.rst
- PySide/QtWebKit/index.rst
+ PySide2/QtCore/index.rst
+ PySide2/QtGui/index.rst
+ PySide2/QtHelp/index.rst
+ PySide2/QtMultimedia/index.rst
+ PySide2/QtNetwork/index.rst
+ PySide2/QtOpenGL/index.rst
+ PySide2/QtScript/index.rst
+ PySide2/QtScriptTools/index.rst
+ PySide2/QtSql/index.rst
+ PySide2/QtSvg/index.rst
+ PySide2/QtUiTools/index.rst
+ PySide2/QtXml/index.rst
+ PySide2/QtWebKit/index.rst
diff --git a/sources/pyside2/doc/pyside-config.qdocconf.in b/sources/pyside2/doc/pyside-config.qdocconf.in
new file mode 100644
index 000000000..4a9af5994
--- /dev/null
+++ b/sources/pyside2/doc/pyside-config.qdocconf.in
@@ -0,0 +1,10 @@
+buildversion = @PYSIDE_QT_VERSION@
+navigation.homepage = PySide
+
+outputdir = @DOC_DATA_DIR@
+outputformats = WebXML
+WebXML.quotinginformation = true
+WebXML.nosubdirs = true
+WebXML.outputsubdir = webxml
+
+spurious += "Hostile character .*"
diff --git a/sources/pyside2/doc/pyside.qdocconf.in b/sources/pyside2/doc/pyside.qdocconf.in
deleted file mode 100644
index 9672d6103..000000000
--- a/sources/pyside2/doc/pyside.qdocconf.in
+++ /dev/null
@@ -1,269 +0,0 @@
-######################## compat.qdocconf
-alias.i = e
-alias.include = input
-
-macro.0 = "\\\\0"
-macro.b = "\\\\b"
-macro.n = "\\\\n"
-macro.r = "\\\\r"
-macro.i = "\\o"
-macro.i11 = "\\o{1,1}"
-macro.i12 = "\\o{1,2}"
-macro.i13 = "\\o{1,3}"
-macro.i14 = "\\o{1,4}"
-macro.i15 = "\\o{1,5}"
-macro.i16 = "\\o{1,6}"
-macro.i17 = "\\o{1,7}"
-macro.i18 = "\\o{1,8}"
-macro.i19 = "\\o{1,9}"
-macro.i21 = "\\o{2,1}"
-macro.i31 = "\\o{3,1}"
-macro.i41 = "\\o{4,1}"
-macro.i51 = "\\o{5,1}"
-macro.i61 = "\\o{6,1}"
-macro.i71 = "\\o{7,1}"
-macro.i81 = "\\o{8,1}"
-macro.i91 = "\\o{9,1}"
-macro.img = "\\image"
-macro.endquote = "\\endquotation"
-macro.relatesto = "\\relates"
-
-spurious = "Missing comma in .*" \
- "Missing pattern .*"
-
-######################## macros.qdocconf
-macro.aacute.HTML = "&aacute;"
-macro.Aring.HTML = "&Aring;"
-macro.aring.HTML = "&aring;"
-macro.Auml.HTML = "&Auml;"
-macro.author = "\\bold{Author:}"
-macro.br.HTML = "<br />"
-macro.BR.HTML = "<br />"
-macro.copyright.HTML = "&copy;"
-macro.eacute.HTML = "&eacute;"
-macro.gui = "\\bold"
-macro.hr.HTML = "<hr />"
-macro.iacute.HTML = "&iacute;"
-macro.key = "\\bold"
-macro.menu = "\\bold"
-macro.note = "\\bold{Note:}"
-macro.oslash.HTML = "&oslash;"
-macro.ouml.HTML = "&ouml;"
-macro.QA = "\\e{Qt Assistant}"
-macro.QD = "\\e{Qt Designer}"
-macro.QL = "\\e{Qt Linguist}"
-macro.QQV = "\\e{Qt QML Viewer}"
-macro.qmlbasictype = "\\e"
-macro.param = "\\e"
-macro.raisedaster.HTML = "<sup>*</sup>"
-macro.rarrow.HTML = "&rarr;"
-macro.reg.HTML = "<sup>&reg;</sup>"
-macro.return = "Returns"
-macro.starslash = "\\c{*/}"
-macro.begincomment = "\\c{/*}"
-macro.endcomment = "\\c{*/}"
-macro.uuml.HTML = "&uuml;"
-macro.mdash.HTML = "&mdash;"
-
-macro.beginfloatleft.HTML = "<div style=\"float: left; margin-right: 2em\">"
-macro.beginfloatright.HTML = "<div style=\"float: right; margin-left: 2em\">"
-macro.endfloat.HTML = "</div>"
-macro.clearfloat.HTML = "<br style=\"clear: both\" />"
-
-######################## qt-cpp-ignore.qdocconf
-Cpp.ignoretokens = QAXFACTORY_EXPORT \
- QDESIGNER_COMPONENTS_LIBRARY \
- QDESIGNER_EXTENSION_LIBRARY \
- QDESIGNER_SDK_LIBRARY \
- QDESIGNER_SHARED_LIBRARY \
- QDESIGNER_UILIB_LIBRARY \
- QM_EXPORT_CANVAS \
- QM_EXPORT_DNS \
- QM_EXPORT_DOM \
- QM_EXPORT_FTP \
- QM_EXPORT_HTTP \
- QM_EXPORT_ICONVIEW \
- QM_EXPORT_NETWORK \
- QM_EXPORT_OPENGL \
- QM_EXPORT_OPENVG \
- QM_EXPORT_SQL \
- QM_EXPORT_TABLE \
- QM_EXPORT_WORKSPACE \
- QM_EXPORT_XML \
- QT_ASCII_CAST_WARN \
- QT_ASCII_CAST_WARN_CONSTRUCTOR \
- QT_BEGIN_HEADER \
- QT_DESIGNER_STATIC \
- QT_END_HEADER \
- QT_FASTCALL \
- QT_WIDGET_PLUGIN_EXPORT \
- Q_COMPAT_EXPORT \
- Q_CORE_EXPORT \
- Q_CORE_EXPORT_INLINE \
- Q_EXPLICIT \
- Q_EXPORT \
- Q_EXPORT_CODECS_CN \
- Q_EXPORT_CODECS_JP \
- Q_EXPORT_CODECS_KR \
- Q_EXPORT_PLUGIN \
- Q_GFX_INLINE \
- Q_AUTOTEST_EXPORT \
- Q_GUI_EXPORT \
- Q_GUI_EXPORT_INLINE \
- Q_GUI_EXPORT_STYLE_CDE \
- Q_GUI_EXPORT_STYLE_COMPACT \
- Q_GUI_EXPORT_STYLE_MAC \
- Q_GUI_EXPORT_STYLE_MOTIF \
- Q_GUI_EXPORT_STYLE_MOTIFPLUS \
- Q_GUI_EXPORT_STYLE_PLATINUM \
- Q_GUI_EXPORT_STYLE_POCKETPC \
- Q_GUI_EXPORT_STYLE_SGI \
- Q_GUI_EXPORT_STYLE_WINDOWS \
- Q_GUI_EXPORT_STYLE_WINDOWSXP \
- QHELP_EXPORT \
- Q_INLINE_TEMPLATE \
- Q_INTERNAL_WIN_NO_THROW \
- Q_NETWORK_EXPORT \
- Q_OPENGL_EXPORT \
- Q_OPENVG_EXPORT \
- Q_OUTOFLINE_TEMPLATE \
- Q_SQL_EXPORT \
- Q_SVG_EXPORT \
- Q_SCRIPT_EXPORT \
- Q_SCRIPTTOOLS_EXPORT \
- Q_TESTLIB_EXPORT \
- Q_TYPENAME \
- Q_XML_EXPORT \
- Q_XMLSTREAM_EXPORT \
- Q_XMLPATTERNS_EXPORT \
- QDBUS_EXPORT \
- QT_BEGIN_NAMESPACE \
- QT_BEGIN_INCLUDE_NAMESPACE \
- QT_END_NAMESPACE \
- QT_END_INCLUDE_NAMESPACE \
- Q_DECLARATIVE_EXPORT \
- Q_GADGET \
- QWEBKIT_EXPORT
-Cpp.ignoredirectives = Q_DECLARE_HANDLE \
- Q_DECLARE_INTERFACE \
- Q_DECLARE_METATYPE \
- Q_DECLARE_OPERATORS_FOR_FLAGS \
- Q_DECLARE_PRIVATE \
- Q_DECLARE_PUBLIC \
- Q_DECLARE_SHARED \
- Q_DECLARE_TR_FUNCTIONS \
- Q_DECLARE_TYPEINFO \
- Q_DISABLE_COPY \
- QT_FORWARD_DECLARE_CLASS \
- Q_DUMMY_COMPARISON_OPERATOR \
- Q_ENUMS \
- Q_FLAGS \
- Q_INTERFACES \
- __attribute__ \
- K_DECLARE_PRIVATE \
- Q_PRIVATE_PROPERTY \
- Q_DECLARE_PRIVATE_D \
- Q_CLASSINFO
-
-######################## qt-defines.qdocconf
-defines = Q_QDOC \
- QT_.*_SUPPORT \
- QT_.*_LIB \
- QT_COMPAT \
- QT_KEYPAD_NAVIGATION \
- QT3_SUPPORT \
- Q_WS_.* \
- Q_OS_.* \
- Q_BYTE_ORDER \
- QT_DEPRECATED \
- Q_NO_USING_KEYWORD \
- __cplusplus
-
-versionsym = QT_VERSION_STR
-
-codeindent = 1
-
-######################## qt.qdocconf
-
-project = Qt
-versionsym =
-version = @PYSIDE_QT_VERSION@
-description = Qt Reference Documentation
-url = http://www.pyside.org/docs/pyside-@PYSIDE_QT_VERSION@
-
-language = Cpp
-
-headerdirs = @QT_SRC_DIR@/src \
- @QT_SRC_DIR@/extensions/activeqt \
- @QT_SRC_DIR@/tools/assistant/lib \
- @QT_SRC_DIR@/tools/assistant/compat/lib \
- @QT_SRC_DIR@/tools/designer/src/uitools \
- @QT_SRC_DIR@/tools/designer/src/lib/extension \
- @QT_SRC_DIR@/tools/designer/src/lib/sdk \
- @QT_SRC_DIR@/tools/designer/src/lib/uilib \
- @QT_SRC_DIR@/tools/qtestlib/src \
- @QT_SRC_DIR@/tools/qdbus/src \
- @pyside_SOURCE_DIR@
-sourcedirs = @QT_SRC_DIR@/src \
- @QT_SRC_DIR@/doc/src \
- @QT_SRC_DIR@/extensions/activeqt \
- @QT_SRC_DIR@/tools/assistant/lib \
- @QT_SRC_DIR@/tools/assistant/compat/lib \
- @QT_SRC_DIR@/tools/designer/src/uitools \
- @QT_SRC_DIR@/tools/designer/src/lib/extension \
- @QT_SRC_DIR@/tools/designer/src/lib/sdk \
- @QT_SRC_DIR@/tools/designer/src/lib/uilib \
- @QT_SRC_DIR@/tools/qtestlib/src \
- @QT_SRC_DIR@/tools/qdbus \
- @pyside_SOURCE_DIR@
-
-excludedirs = @QT_SRC_DIR@/src/3rdparty/clucene \
- @QT_SRC_DIR@/src/3rdparty/des \
- @QT_SRC_DIR@/src/3rdparty/freetype \
- @QT_SRC_DIR@/src/3rdparty/harfbuzz \
- @QT_SRC_DIR@/src/3rdparty/kdebase \
- @QT_SRC_DIR@/src/3rdparty/libjpeg \
- @QT_SRC_DIR@/src/3rdparty/libmng \
- @QT_SRC_DIR@/src/3rdparty/libpng \
- @QT_SRC_DIR@/src/3rdparty/libtiff \
- @QT_SRC_DIR@/src/3rdparty/md4 \
- @QT_SRC_DIR@/src/3rdparty/md5 \
- @QT_SRC_DIR@/src/3rdparty/patches \
- @QT_SRC_DIR@/src/3rdparty/sha1 \
- @QT_SRC_DIR@/src/3rdparty/sqlite \
- @QT_SRC_DIR@/src/3rdparty/webkit/JavaScriptCore \
- @QT_SRC_DIR@/src/3rdparty/webkit/WebCore \
- @QT_SRC_DIR@/src/3rdparty/wintab \
- @QT_SRC_DIR@/src/3rdparty/zlib \
- @QT_SRC_DIR@/doc/src/snippets \
- @QT_SRC_DIR@/doc/src/ja_JP \
- @QT_SRC_DIR@/doc/src/zh_CN
-
-sources.fileextensions = "*.cpp *.qdoc *.mm"
-examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp"
-examples.imageextensions = "*.png"
-
-tagfile = @QT_SRC_DIR@/doc/html/qt.tags
-base = file:@QT_SRC_DIR@/doc/html
-
-HTML.generatemacrefs = "true"
-
-######################## pyside.qdocconf
-quotinginformation = true
-exampledirs = @QT_SRC_DIR@/doc/src \
- @QT_SRC_DIR@/examples \
- @QT_SRC_DIR@/examples/tutorials \
- @QT_SRC_DIR@ \
- @QT_SRC_DIR@/qmake/examples \
- @QT_SRC_DIR@/src/3rdparty/webkit/WebKit/qt/docs
-
-imagedirs = @QT_SRC_DIR@/doc/src/images \
- @QT_SRC_DIR@/examples \
- @QT_SRC_DIR@/doc/src/declarative/pics \
- @QT_SRC_DIR@/doc/src/template/image
-
-outputdir = @DOC_DATA_DIR@
-outputformats = WebXML
-
-generateindex = false
-url = .
diff --git a/sources/pyside2/doc/pysideinclude.py b/sources/pyside2/doc/pysideinclude.py
index 89024f0c0..91fffe115 100644
--- a/sources/pyside2/doc/pysideinclude.py
+++ b/sources/pyside2/doc/pysideinclude.py
@@ -67,7 +67,7 @@ class PySideInclude(Directive):
encoding = self.options.get('encoding', env.config.source_encoding)
codec_info = codecs.lookup(encoding)
try:
- f = codecs.StreamReaderWriter(open(fn, 'U'),
+ f = codecs.StreamReaderWriter(open(fn, 'Ub'),
codec_info[2], codec_info[3], 'strict')
lines = f.readlines()
f.close()
@@ -97,7 +97,7 @@ class PySideInclude(Directive):
if linespec is not None:
try:
linelist = parselinenos(linespec, len(lines))
- except ValueError, err:
+ except ValueError as err:
return [document.reporter.warning(str(err), line=self.lineno)]
lines = [lines[i] for i in linelist]
diff --git a/sources/pyside2/doc/pysideversion.rst b/sources/pyside2/doc/pysideversion.rst
index 3bcebe0da..5ad308c1e 100644
--- a/sources/pyside2/doc/pysideversion.rst
+++ b/sources/pyside2/doc/pysideversion.rst
@@ -1,31 +1,31 @@
Getting PySide and Qt version
*****************************
-PySide exports their version numbers among the version of Qt used to compile PySide in a pythonnic way, you can check it using the variables:
+PySide exports their version numbers among the version of Qt used to compile PySide in a pythonic way, you can check it using the variables:
::
- import PySide
+ import PySide2.QtCore
# Prints PySide version
# e.g. 1.0.2
- print PySide.__version__
+ print(PySide2.__version__)
# Gets a tuple with each version component
# e.g. (1, 0, 2, 'final', 1)
- print PySide.__version_info__
+ print(PySide2.__version_info__)
# Prints the Qt version used to compile PySide
- # e.g. "4.7.2"
- print PySide2.QtCore.__version__
+ # e.g. "5.11.0"
+ print(PySide2.QtCore.__version__)
# Gets a tuple with each version components of Qt used to compile PySide
- # e.g. (4, 7, 2)
- print PySide2.QtCore.__version_info__
+ # e.g. (5, 11, 0)
+ print(PySide2.QtCore.__version_info__)
Note that the Qt version used to compile PySide may differ from the version used to run PySide, to get the current running Qt version you can do:
::
- print PySide2.QtCore.qVersion()
+ print(PySide2.QtCore.qVersion())
diff --git a/sources/pyside2/doc/qtmodules/pyside-qt3dextras.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qt3dextras.qdocconf.in
new file mode 100644
index 000000000..5bc4e8c9c
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qt3dextras.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qt3d/src/doc/qt3d.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtcharts.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtcharts.qdocconf.in
new file mode 100644
index 000000000..1a58c2dc4
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtcharts.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtcharts/src/charts/doc/qtcharts.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtconcurrent.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtconcurrent.qdocconf.in
new file mode 100644
index 000000000..a6976c24b
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtconcurrent.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/concurrent/doc/qtconcurrent.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtcore.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtcore.qdocconf.in
new file mode 100644
index 000000000..5fb7248c9
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtcore.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/corelib/doc/qtcore.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtdatavisualization.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtdatavisualization.qdocconf.in
new file mode 100644
index 000000000..c9fcb317c
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtdatavisualization.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtdatavis3d/src/datavisualization/doc/qtdatavis3d.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtgui.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtgui.qdocconf.in
new file mode 100644
index 000000000..77e7e6e18
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtgui.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/gui/doc/qtgui.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qthelp.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qthelp.qdocconf.in
new file mode 100644
index 000000000..9336909c1
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qthelp.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qttools/src/assistant/help/doc/qthelp.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtmacextras.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtmacextras.qdocconf.in
new file mode 100644
index 000000000..3e0e40019
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtmacextras.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtmacextras/src/macextras/doc/qtmacextras.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtmultimedia.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtmultimedia.qdocconf.in
new file mode 100644
index 000000000..35bf1bc6a
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtmultimedia.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtmultimedia/src/multimedia/doc/qtmultimedia.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtnetwork.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtnetwork.qdocconf.in
new file mode 100644
index 000000000..addec9aee
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtnetwork.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/network/doc/qtnetwork.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtopengl.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtopengl.qdocconf.in
new file mode 100644
index 000000000..34895f0c6
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtopengl.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/opengl/doc/qtopengl.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtprintsupport.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtprintsupport.qdocconf.in
new file mode 100644
index 000000000..04c554434
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtprintsupport.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/printsupport/doc/qtprintsupport.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtquickwidgets.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtquickwidgets.qdocconf.in
new file mode 100644
index 000000000..242dc3c02
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtquickwidgets.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtdeclarative/src/quick/doc/qtquick.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtsql.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtsql.qdocconf.in
new file mode 100644
index 000000000..8f41c552c
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtsql.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/sql/doc/qtsql.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtsvg.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtsvg.qdocconf.in
new file mode 100644
index 000000000..e3c39a645
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtsvg.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtsvg/src/svg/doc/qtsvg.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qttest.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qttest.qdocconf.in
new file mode 100644
index 000000000..b092d9294
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qttest.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/testlib/doc/qttestlib.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qttexttospeech.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qttexttospeech.qdocconf.in
new file mode 100644
index 000000000..2bf722f23
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qttexttospeech.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtspeech/src/doc/qtspeech.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtuitools.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtuitools.qdocconf.in
new file mode 100644
index 000000000..7bd3941f7
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtuitools.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qttools/src/designer/src/uitools/doc/qtuitools.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtwebchannel.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtwebchannel.qdocconf.in
new file mode 100644
index 000000000..f3f2f5cf4
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtwebchannel.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtwebchannel/src/webchannel/doc/qtwebchannel.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtwebsockets.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtwebsockets.qdocconf.in
new file mode 100644
index 000000000..082b94883
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtwebsockets.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtwebsockets/src/websockets/doc/qtwebsockets.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtwidgets.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtwidgets.qdocconf.in
new file mode 100644
index 000000000..90e887f38
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtwidgets.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/widgets/doc/qtwidgets.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtwinextras.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtwinextras.qdocconf.in
new file mode 100644
index 000000000..d2c1d5be7
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtwinextras.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtwinextras/src/winextras/doc/qtwinextras.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtx11extras.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtx11extras.qdocconf.in
new file mode 100644
index 000000000..9315fa58c
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtx11extras.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtx11extras/src/x11extras/doc/qtx11extras.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtxml.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtxml.qdocconf.in
new file mode 100644
index 000000000..f9ccce7d7
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtxml.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/src/xml/doc/qtxml.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/qtmodules/pyside-qtxmlpatterns.qdocconf.in b/sources/pyside2/doc/qtmodules/pyside-qtxmlpatterns.qdocconf.in
new file mode 100644
index 000000000..9e132ff24
--- /dev/null
+++ b/sources/pyside2/doc/qtmodules/pyside-qtxmlpatterns.qdocconf.in
@@ -0,0 +1,2 @@
+include(@QT_SRC_DIR@/../qtxmlpatterns/src/xmlpatterns/doc/qtxmlpatterns.qdocconf)
+include(../pyside-config.qdocconf)
diff --git a/sources/pyside2/doc/src/README.md b/sources/pyside2/doc/src/README.md
new file mode 100644
index 000000000..df37cf691
--- /dev/null
+++ b/sources/pyside2/doc/src/README.md
@@ -0,0 +1 @@
+Any qdoc source files in this directory will be parsed when generating docs.
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/Cell.qml b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/Cell.qml
index a561e34db..a2b346724 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/Cell.qml
+++ b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/Cell.qml
@@ -49,7 +49,7 @@
****************************************************************************/
//![0]
-import QtQuick 1.0
+import QtQuick 2.0
//![1]
Item {
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial1.qml b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial1.qml
index ef26bb1aa..2cef1500f 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial1.qml
+++ b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial1.qml
@@ -50,7 +50,7 @@
//![0]
//![3]
-import QtQuick 1.0
+import QtQuick 2.0
//![3]
//![1]
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial2.qml b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial2.qml
index f86da25b7..2d2000bc6 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial2.qml
+++ b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial2.qml
@@ -49,7 +49,7 @@
****************************************************************************/
//![0]
-import QtQuick 1.0
+import QtQuick 2.0
Rectangle {
id: page
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial3.qml b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial3.qml
index 7324c4df9..f1b972cc4 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial3.qml
+++ b/sources/pyside2/doc/tutorials/qmltutorial/helloworld/tutorial3.qml
@@ -49,7 +49,7 @@
****************************************************************************/
//![0]
-import QtQuick 1.0
+import QtQuick 2.0
Rectangle {
id: page
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/index.rst b/sources/pyside2/doc/tutorials/qmltutorial/index.rst
index 35cda3170..45a6842bc 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/index.rst
+++ b/sources/pyside2/doc/tutorials/qmltutorial/index.rst
@@ -7,8 +7,8 @@ QML Tutorial
This tutorial gives an introduction to QML, the mark up language for Qt Quick. It doesn't cover everything;
the emphasis is on teaching the key principles, and features are introduced as needed.
-Through the different steps of this tutorial we will learn about QML basic types, we will create our own QML component
-with properties and signals, and we will create a simple animation with the help of states and transitions.
+Through the different steps of this tutorial you will learn about QML basic types, create our own QML component
+with properties and signals, and create a simple animation with the help of states and transitions.
Chapter one starts with a minimal "Hello world" program and the following chapters introduce new concepts.
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/step1.rst b/sources/pyside2/doc/tutorials/qmltutorial/step1.rst
index 02a1095bc..bca69d9f4 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/step1.rst
+++ b/sources/pyside2/doc/tutorials/qmltutorial/step1.rst
@@ -4,7 +4,7 @@ QML Tutorial 1 - Basic Types
****************************
This first program is a very simple "Hello world" example that introduces some basic QML concepts.
-The picture below is a screenshot of this program.
+The following image is a screenshot of this program.
.. figure:: declarative-tutorial1.png
:align: center
@@ -20,8 +20,8 @@ Walkthrough
Import
------
-First, we need to import the types that we need for this example. Most QML files will import the built-in QML
-types (like Rectangle, Image, ...) that come with Qt, using:
+First, you need to import the types that are required for this example. Most QML files import the built-in QML
+types (like Rectangle, Image, ...) that come with Qt, using the following statement:
.. pysideinclude:: helloworld/tutorial1.qml
:snippet: 3
@@ -32,10 +32,9 @@ Rectangle element
.. pysideinclude:: helloworld/tutorial1.qml
:snippet: 1
-We declare a root element of type Rectangle. It is one of the basic building blocks you can use to create an application in QML.
-We give it an ``id`` to be able to refer to it later. In this case, we call it "page".
-We also set the ``width``, ``height`` and ``color`` properties.
-The Rectangle element contains many other properties (such as ``x`` and ``y``), but these are left at their default values.
+Declare a root element using the Rectangle type, which is one of the basic building blocks to create an application in QML.
+Give it an ``id`` so that you can refer to it later. For example, call it "page", and also set its ``width``,
+``height``, and ``color`` properties.
Text element
------------
@@ -43,12 +42,12 @@ Text element
.. pysideinclude code/tutorial1.qml
:snippet: 2
-We add a Text element as a child of the root Rectangle element that displays the text 'Hello world!'.
+Add a Text element as the child of the Rectangle element to display the text, 'Hello world!'.
-The ``y`` property is used to position the text vertically at 30 pixels from the top of its parent.
+Use its ``y`` property to position it at 30 pixels from the top of its parent.
The ``anchors.horizontalCenter`` property refers to the horizontal center of an element.
-In this case, we specify that our text element should be horizontally centered in the *page* element.
+In this case, specify that the text element must be horizontally centered in the *page* element.
The ``font.pointSize`` and ``font.bold properties`` are related to fonts and use the dot notation.
@@ -56,11 +55,12 @@ The ``font.pointSize`` and ``font.bold properties`` are related to fonts and use
Viewing the example
-------------------
-To view what you have created, run the QML Viewer tool (located in the ``bin directory`` of your Qt installation) with your filename as the first argument.
-For example, to run the provided completed Tutorial 1 example from the install location, you would type:
+To view what you have created, run the ``qmlscene`` tool (located in the ``bin directory`` of your Qt installation) with your
+QML filename as the first argument. For example, to run the Tutorial 1 example from the install
+location, you would type:
::
- bin/qmlviewer tutorial1.qml
+ > [QT_INSTALL_DIR]\bin\qmlscene tutorial1.qml
[Previous :ref:`qmltutorial`][Next :ref:`qmlcomponents`]
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/step2.rst b/sources/pyside2/doc/tutorials/qmltutorial/step2.rst
index 4dacd00a9..5b48ca63f 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/step2.rst
+++ b/sources/pyside2/doc/tutorials/qmltutorial/step2.rst
@@ -3,19 +3,19 @@
QML Tutorial 2 - QML Components
*******************************
-This chapter adds a color picker to change the color of the text.
+In this chapter, you are going to add a color picker to change the color of the text.
.. figure:: declarative-tutorial2.png
:align: center
-Our color picker is made of six cells with different colors.
-To avoid writing the same code multiple times for each cell, we create a new ``Cell`` component.
-A component provides a way of defining a new type that we can re-use in other QML files.
-A QML component is like a black-box and interacts with the outside world through properties, signals and functions and is generally
-defined in its own QML file.
+The color picker is made of six cells with different colors.
+To avoid writing the same code multiple times for each cell, create a new ``Cell`` component.
+A component provides a way of defining a new type that you can re-use in other QML files.
+A QML component is like a black-box that interacts with the outside world through its properties, signals,
+and functions, and is generally defined in its own QML file.
The component's filename must always start with a capital letter.
-Here is the QML code for ``Cell.qml``:
+Here is the QML code for ``Cell``:
.. pysideinclude:: helloworld/Cell.qml
:snippet: 0
@@ -29,53 +29,53 @@ The Cell Component
.. pysideinclude:: helloworld/Cell.qml
:snippet: 1
-The root element of our component is an Item with the ``id`` *container*.
+The root element of the component is an Item with the ``id``, *container*.
An Item is the most basic visual element in QML and is often used as a container for other elements.
.. pysideinclude:: helloworld/Cell.qml
:snippet: 4
-We declare a ``cellColor`` property. This property is accessible from *outside* our component, this allows us
-to instantiate the cells with different colors.
-This property is just an alias to an existing property - the color of the rectangle that compose the cell.
+Its ``cellColor`` property is accessible from *outside* the component, allowing you
+to instantiate cells with different colors. It is an alias to the existing color property of the rectangle
+that composes the cell.
.. pysideinclude:: helloworld/Cell.qml
:snippet: 5
-We want our component to also have a signal that we call *clicked* with a *cellColor* parameter of type *color*.
-We will use this signal to change the color of the text in the main QML file later.
+The Cell has a signal called *clicked* with the *cellColor* parameter of type *color*.
+You need this signal to change the color of the text in the main QML file later.
.. pysideinclude:: helloworld/Cell.qml
:snippet: 2
-Our cell component is basically a colored rectangle with the ``id`` *rectangle*.
+The cell component is basically a colored rectangle with the ``id``, *rectangle*.
-The ``anchors.fill`` property is a convenient way to set the size of an element.
+Its ``anchors.fill`` property is a convenient way to set the size of an element.
In this case the rectangle will have the same size as its parent.
.. pysideinclude:: helloworld/Cell.qml
:snippet: 3
-In order to change the color of the text when clicking on a cell, we create a MouseArea element with
-the same size as its parent.
+In order to change the color of the text when the cell is clicked, a MouseArea element with
+the same size as its parent is used.
-A MouseArea defines a signal called *clicked*.
-When this signal is triggered we want to emit our own *clicked* signal with the color as parameter.
+A MouseArea enables you to react to mouse events such as clicked, hover, and so on. In this case, when the MouseArea *clicked*
+signal is reported, the Cell's *clicked* signal is emitted.
The main QML file
-----------------
-In our main QML file, we use our ``Cell`` component to create the color picker:
+In the main QML file, use the ``Cell`` component to create the color picker:
.. pysideinclude:: helloworld/tutorial2.qml
:snippet: 0
-We create the color picker by putting 6 cells with different colors in a grid.
+Create the color picker by putting 6 cells with different colors in a grid.
.. pysideinclude:: helloworld/tutorial2.qml
:snippet: 1
-When the *clicked* signal of our cell is triggered, we want to set the color of the text to the *cellColor* passed as a parameter.
-We can react to any signal of our component through a property of the name *'onSignalName'*.
+When the *clicked* signal of a cell is triggered, set the color of the text to the *cellColor* passed as a parameter.
+You can react to a signal of a component through a handler of the name, *'onSignalName'*.
[Previous :ref:`qmlbasictypes`][Next :ref:`qmlstatesandtransitions`]
diff --git a/sources/pyside2/doc/tutorials/qmltutorial/step3.rst b/sources/pyside2/doc/tutorials/qmltutorial/step3.rst
index a72d1eac0..6d5a72f13 100644
--- a/sources/pyside2/doc/tutorials/qmltutorial/step3.rst
+++ b/sources/pyside2/doc/tutorials/qmltutorial/step3.rst
@@ -3,14 +3,14 @@
QML Tutorial 3 - States and Transitions
***************************************
-In this chapter, we make this example a little bit more dynamic by introducing states and transitions.
-
-We want our text to move to the bottom of the screen, rotate and become red when clicked.
+In this chapter, you are guided through the steps to make the example a little more dynamic by
+introducing states and transitions. For example, moving the text to the bottom of the screen,
+rotate, and change its color when clicked.
.. figure:: declarative-tutorial3_animation.gif
:align: center
-Here is the QML code:
+Here is the QML code for such a behavior:
.. pysideinclude:: helloworld/tutorial3.qml
:snippet: 0
@@ -21,27 +21,26 @@ Walkthrough
.. pysideinclude:: helloworld/tutorial3.qml
:snippet: 2
-First, we create a new *down* state for our text element.
-This state will be activated when the MouseArea is pressed, and deactivated when it is released.
+First, create a new *down* state for the text element.
+Pressing the MouseArea activates this new state and releasing it deactivates the state.
-The *down* state includes a set of property changes from our implicit *default state*
+The *down* state includes a set of property changes from the implicit *default state*
(the items as they were initially defined in the QML).
-Specifically, we set the ``y`` property of the text to ``160``, the rotation to ``180`` and the ``color`` to red.
+Specifically, set the ``y`` property of the text to ``160``, rotation to ``180``, and ``color`` to red.
.. pysideinclude:: helloworld/tutorial3.qml
:snippet: 3
-Because we don't want the text to appear at the bottom instantly but rather move smoothly,
-we add a transition between our two states.
+To make the application even better, add a transiton between the two states so that switching between these
+two states look smooth and nice.
-``from`` and ``to`` define the states between which the transition will run.
-In this case, we want a transition from the default state to our *down* state.
+The ``from`` and ``to`` properties of the Transition element define the states between which the transition will run.
+In this case, you want a transition from the default state to the *down* state.
-Because we want the same transition to be run in reverse when changing back from the *down* state to the default state,
-we set ``reversible`` to ``true``.
-This is equivalent to writing the two transitions separately.
+To have a similar transition effect when changing back from the *down* state to the default state,
+set the ``reversible`` property to ``true``. This is equivalent to writing two transitions.
The ParallelAnimation element makes sure that the two types of animations (number and color) start at the same time.
-We could also run them one after the other by using SequentialAnimation instead.
+You could also run them one after the other by using SequentialAnimation instead.
[Previous :ref:`qmlcomponents`]
diff --git a/sources/pyside2/doc/typesystem_doc.xml.in b/sources/pyside2/doc/typesystem_doc.xml.in
index 50cb2a710..78ccb5bc9 100644
--- a/sources/pyside2/doc/typesystem_doc.xml.in
+++ b/sources/pyside2/doc/typesystem_doc.xml.in
@@ -52,67 +52,6 @@
<typesystem package="PySide">
<suppress-warning text="File containing conversion code for *" />
<suppress-warning text="File for inject code not exist: *" />
-
- <load-typesystem name="typesystem_core.xml" generate="yes"/>
-
- @if_QtNetwork@
- <load-typesystem name="typesystem_network.xml" generate="yes" />
- @end_QtNetwork@
-
- @if_QtXml@
- <load-typesystem name="typesystem_xml.xml" generate="yes" />
- @end_QtXml@
-
- @if_QtScript@
- <load-typesystem name="typesystem_script.xml" generate="yes" />
- @end_QtScript@
-
- @if_QtGui@
- <load-typesystem name="typesystem_gui.xml" generate="yes"/>
- @end_QtGui@
-
- @if_QtHelp@
- <load-typesystem name="typesystem_help.xml" generate="yes" />
- @end_QtHelp@
-
- @if_QtMultimedia@
- <load-typesystem name="typesystem_multimedia.xml" generate="yes" />
- @end_QtMultimedia@
-
- @if_QtOpenGL@
- <load-typesystem name="typesystem_opengl.xml" generate="yes" />
- @end_QtOpenGL@
-
- @if_QtScriptTools@
- <load-typesystem name="typesystem_scripttools.xml" generate="yes" />
- @end_QtScriptTools@
-
- @if_QtSql@
- <load-typesystem name="typesystem_sql.xml" generate="yes" />
- @end_QtSql@
-
- @if_QtSvg@
- <load-typesystem name="typesystem_svg.xml" generate="yes" />
- @end_QtSvg@
-
- @if_QtTest@
- <load-typesystem name="typesystem_test.xml" generate="yes" />
- @end_QtTest@
-
- @if_QtUiTools@
- <load-typesystem name="typesystem_uitools.xml" generate="yes" />
- @end_QtUiTools@
-
- @if_QtWebKit@
- <load-typesystem name="typesystem_webkit.xml" generate="yes" />
- @end_QtWebKit@
-
-
- @if_QtXmlPatterns@
- <load-typesystem name="typesystem_xmlpatterns.xml" generate="yes" />
- @end_QtXmlPatterns@
-
-
<suppress-warning text="Can't find qdoc3 file for class QMatrix4x3, tried: /home/hugo/src/pyside/build/doc/qdoc3-output/qmatrix4x3.xml" />
<suppress-warning text="Can't find qdoc3 file for class QMatrix3x4, tried: /home/hugo/src/pyside/build/doc/qdoc3-output/qmatrix3x4.xml" />
<suppress-warning text="Can't find qdoc3 file for class QMatrix2x3, tried: /home/hugo/src/pyside/build/doc/qdoc3-output/qmatrix2x3.xml" />
@@ -121,5 +60,4 @@
<suppress-warning text="Can't find qdoc3 file for class QMatrix2x2, tried: /home/hugo/src/pyside/build/doc/qdoc3-output/qmatrix2x2.xml" />
<suppress-warning text="Can't find qdoc3 file for class QMatrix3x2, tried: /home/hugo/src/pyside/build/doc/qdoc3-output/qmatrix3x2.xml" />
<suppress-warning text="Can't find qdoc3 file for class QMatrix2x4, tried: /home/hugo/src/pyside/build/doc/qdoc3-output/qmatrix2x4.xml" />
-
- </typesystem>
+<!-- Modules to be appended -->
diff --git a/sources/pyside2/header.COMM b/sources/pyside2/header.COMM
deleted file mode 100644
index 1c8cb00e7..000000000
--- a/sources/pyside2/header.COMM
+++ /dev/null
@@ -1,20 +0,0 @@
-/******************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the <Fill> module.
-**
-** $QT_BEGIN_LICENSE:COMM$
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** $QT_END_LICENSE$
-**
-******************************************************************************/
diff --git a/sources/pyside2/header.FDL b/sources/pyside2/header.FDL
deleted file mode 100644
index 90195db13..000000000
--- a/sources/pyside2/header.FDL
+++ /dev/null
@@ -1,27 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/header.FDL-OLD b/sources/pyside2/header.FDL-OLD
deleted file mode 100644
index 58436c482..000000000
--- a/sources/pyside2/header.FDL-OLD
+++ /dev/null
@@ -1,27 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL-OLD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/header.GPL b/sources/pyside2/header.GPL
deleted file mode 100644
index af4a1636b..000000000
--- a/sources/pyside2/header.GPL
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/header.GPL-EXCEPT b/sources/pyside2/header.GPL-EXCEPT
deleted file mode 100644
index 26ed5a245..000000000
--- a/sources/pyside2/header.GPL-EXCEPT
+++ /dev/null
@@ -1,28 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/header.LGPL-ONLY b/sources/pyside2/header.LGPL-ONLY
deleted file mode 100644
index 9a676032e..000000000
--- a/sources/pyside2/header.LGPL-ONLY
+++ /dev/null
@@ -1,22 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL-ONLY$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** If you have questions regarding the use of this file, please contact
-** us via http://www.qt.io/contact-us/.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
diff --git a/sources/pyside2/header.LGPL21 b/sources/pyside2/header.LGPL21
deleted file mode 100644
index 533390b07..000000000
--- a/sources/pyside2/header.LGPL21
+++ /dev/null
@@ -1,33 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/header.LGPL3 b/sources/pyside2/header.LGPL3
deleted file mode 100644
index d9a65c2e4..000000000
--- a/sources/pyside2/header.LGPL3
+++ /dev/null
@@ -1,36 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later as published by the Free
-** Software Foundation and appearing in the file LICENSE.GPL included in
-** the packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/header.LGPL3-COMM b/sources/pyside2/header.LGPL3-COMM
deleted file mode 100644
index b5dc15d38..000000000
--- a/sources/pyside2/header.LGPL3-COMM
+++ /dev/null
@@ -1,28 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3-COMM$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/pyside2/libpyside/CMakeLists.txt b/sources/pyside2/libpyside/CMakeLists.txt
index 15879a201..3069b1ca2 100644
--- a/sources/pyside2/libpyside/CMakeLists.txt
+++ b/sources/pyside2/libpyside/CMakeLists.txt
@@ -76,13 +76,10 @@ endmacro()
# Test files.
file(GLOB_RECURSE pyside_folder_py_files "../*.py")
-# Example files.
-file(GLOB_RECURSE example_folder_py_files "../../pyside2-examples/*.py")
-
# Mostly for setup.py.
file(GLOB setup_folder_py_files "../../../*.py")
-set(other_files ${pyside_folder_py_files} ${example_folder_py_files} ${setup_folder_py_files})
+set(other_files ${pyside_folder_py_files} ${setup_folder_py_files})
add_other_files(${other_files})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
diff --git a/sources/pyside2/libpyside/pysidesignal.cpp b/sources/pyside2/libpyside/pysidesignal.cpp
index e213ff069..a901d10af 100644
--- a/sources/pyside2/libpyside/pysidesignal.cpp
+++ b/sources/pyside2/libpyside/pysidesignal.cpp
@@ -413,11 +413,64 @@ PyObject* signalInstanceConnect(PyObject* self, PyObject* args, PyObject* kwds)
sourceWalk = reinterpret_cast<PySideSignalInstance*>(sourceWalk->d->next);
}
} else {
- //try the first signature
+ // Check signature of the slot (method or function) to match signal
+ int slotArgs = -1;
+ bool useSelf = false;
+ bool isMethod = PyMethod_Check(slot);
+ bool isFunction = PyFunction_Check(slot);
+ bool matchedSlot = false;
+
+ QByteArray functionName;
+ PySideSignalInstance *it = source;
+
+ if (isMethod || isFunction) {
+ PyObject *function = isMethod ? PyMethod_GET_FUNCTION(slot) : slot;
+ PyCodeObject *objCode = reinterpret_cast<PyCodeObject *>(PyFunction_GET_CODE(function));
+ PyFunctionObject *function_obj = reinterpret_cast<PyFunctionObject *>(function);
+ functionName = Shiboken::String::toCString(function_obj->func_name);
+ useSelf = isMethod;
+ slotArgs = objCode->co_flags & CO_VARARGS ? -1 : objCode->co_argcount;
+ if (useSelf)
+ slotArgs -= 1;
+
+ // Get signature args
+ bool isShortCircuit = false;
+ int signatureArgs = 0;
+ QStringList argsSignature;
+
+ argsSignature = PySide::Signal::getArgsFromSignature(it->d->signature,
+ &isShortCircuit);
+ signatureArgs = argsSignature.length();
+
+ // Iterate the possible types of connection for this signal and compare
+ // it with slot arguments
+ if (signatureArgs != slotArgs) {
+ while (it->d->next != nullptr) {
+ it = it->d->next;
+ argsSignature = PySide::Signal::getArgsFromSignature(it->d->signature,
+ &isShortCircuit);
+ signatureArgs = argsSignature.length();
+ if (signatureArgs == slotArgs) {
+ matchedSlot = true;
+ break;
+ }
+ }
+ }
+ }
+
+ // Adding references to pyArgs
PyList_Append(pyArgs, source->d->source);
- Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature));
- PyList_Append(pyArgs, signature);
+ if (matchedSlot) {
+ // If a slot matching the same number of arguments was found,
+ // include signature to the pyArgs
+ Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(it->d->signature));
+ PyList_Append(pyArgs, signature);
+ } else {
+ // Try the first by default if the slot was not found
+ Shiboken::AutoDecRef signature(PySide::Signal::buildQtCompatible(source->d->signature));
+ PyList_Append(pyArgs, signature);
+ }
PyList_Append(pyArgs, slot);
match = true;
}
@@ -433,7 +486,7 @@ PyObject* signalInstanceConnect(PyObject* self, PyObject* args, PyObject* kwds)
return 0;
}
PyObject* result = PyObject_CallObject(pyMethod, tupleArgs);
- if (result == Py_True)
+ if (result == Py_True || result == Py_False)
return result;
else
Py_XDECREF(result);
@@ -564,17 +617,26 @@ PyObject* signalCall(PyObject* self, PyObject* args, PyObject* kw)
{
PySideSignal* signal = reinterpret_cast<PySideSignal*>(self);
+ // Native C++ signals can't be called like functions, thus we throw an exception.
+ // The only way calling a signal can succeed (the Python equivalent of C++'s operator() )
+ // is when a method with the same name as the signal is attached to an object.
+ // An example is QProcess::error() (don't check the docs, but the source code of qprocess.h).
if (!signal->homonymousMethod) {
PyErr_SetString(PyExc_TypeError, "native Qt signal is not callable");
return 0;
}
descrgetfunc getDescriptor = signal->homonymousMethod->ob_type->tp_descr_get;
- Shiboken::AutoDecRef homonymousMethod(getDescriptor(signal->homonymousMethod, 0, 0));
- if (PyCFunction_GET_FLAGS(homonymousMethod.object()) & METH_STATIC)
+ // Check if there exists a method with the same name as the signal, which is also a static
+ // method in C++ land.
+ Shiboken::AutoDecRef homonymousMethod(getDescriptor(signal->homonymousMethod, 0, 0));
+ if (PyCFunction_Check(homonymousMethod)
+ && (PyCFunction_GET_FLAGS(homonymousMethod.object()) & METH_STATIC)) {
return PyCFunction_Call(homonymousMethod, args, kw);
+ }
+ // Assumes homonymousMethod is not a static method.
ternaryfunc callFunc = signal->homonymousMethod->ob_type->tp_call;
return callFunc(homonymousMethod, args, kw);
}
diff --git a/sources/pyside2/pyside_version.py b/sources/pyside2/pyside_version.py
index b207d6b9c..aacb7e0d9 100644
--- a/sources/pyside2/pyside_version.py
+++ b/sources/pyside2/pyside_version.py
@@ -1,5 +1,44 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
major_version = "5"
-minor_version = "6"
+minor_version = "9"
patch_version = "0"
pre_release_version_type = "a" # e.g. "a", "b", "rc".
pre_release_version = "1" # e.g "1", "2", (which means "beta1", "beta2", if type is "b")
diff --git a/sources/pyside2/tests/Qt3DAnimation/CMakeLists.txt b/sources/pyside2/tests/Qt3DAnimation/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DAnimation/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/Qt3DCore/CMakeLists.txt b/sources/pyside2/tests/Qt3DCore/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DCore/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/Qt3DExtras/CMakeLists.txt b/sources/pyside2/tests/Qt3DExtras/CMakeLists.txt
new file mode 100644
index 000000000..5f8d2e77b
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DExtras/CMakeLists.txt
@@ -0,0 +1 @@
+PYSIDE_TEST(qt3dextras_test.py)
diff --git a/sources/pyside2/tests/Qt3DExtras/qt3dextras_test.py b/sources/pyside2/tests/Qt3DExtras/qt3dextras_test.py
new file mode 100644
index 000000000..967886a14
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DExtras/qt3dextras_test.py
@@ -0,0 +1,154 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test cases for Q3DExtras'''
+
+from helper import UsesQGuiApplication
+import unittest
+
+from PySide2.QtCore import(Property, QObject, QPropertyAnimation, QTimer, Signal, Slot)
+from PySide2.QtGui import (QGuiApplication, QMatrix4x4, QQuaternion, QVector3D, QWindow)
+from PySide2.Qt3DCore import (Qt3DCore)
+from PySide2.Qt3DRender import (Qt3DRender)
+from PySide2.Qt3DExtras import (Qt3DExtras)
+
+class OrbitTransformController(QObject):
+ def __init__(self, parent):
+ super(OrbitTransformController, self).__init__(parent)
+ self._target = None
+ self._matrix = QMatrix4x4()
+ self._radius = 1
+ self._angle = 0
+
+ def setTarget(self, t):
+ self._target = t
+
+ def getTarget(self):
+ return self._target
+
+ def setRadius(self, radius):
+ if self._radius != radius:
+ self._radius = radius
+ self.updateMatrix()
+ self.radiusChanged.emit()
+
+ def getRadius(self):
+ return self._radius
+
+ def setAngle(self, angle):
+ if self._angle != angle:
+ self._angle = angle
+ self.updateMatrix()
+ self.angleChanged.emit()
+
+ def getAngle(self):
+ return self._angle
+
+ def updateMatrix(self):
+ self._matrix.setToIdentity();
+ self._matrix.rotate(self._angle, QVector3D(0, 1, 0))
+ self._matrix.translate(self._radius, 0, 0)
+ if self._target is not None:
+ self._target.setMatrix(self._matrix)
+
+ angleChanged = Signal()
+ radiusChanged = Signal()
+ angle = Property(float, getAngle, setAngle, notify=angleChanged)
+ radius = Property(float, getRadius, setRadius, notify=radiusChanged)
+
+class Window(Qt3DExtras.Qt3DWindow):
+ def __init__(self):
+ super(Window, self).__init__()
+
+ # Camera
+ self.camera().lens().setPerspectiveProjection(45, 16 / 9, 0.1, 1000)
+ self.camera().setPosition(QVector3D(0, 0, 40))
+ self.camera().setViewCenter(QVector3D(0, 0, 0))
+
+ # For camera controls
+ self.createScene()
+ self.camController = Qt3DExtras.QOrbitCameraController(self.rootEntity)
+ self.camController.setLinearSpeed(50)
+ self.camController.setLookSpeed(180)
+ self.camController.setCamera(self.camera())
+
+ self.setRootEntity(self.rootEntity)
+
+ def createScene(self):
+ # Root entity
+ self.rootEntity = Qt3DCore.QEntity()
+
+ # Material
+ self.material = Qt3DExtras.QPhongMaterial(self.rootEntity)
+
+ # Torus
+ self.torusEntity = Qt3DCore.QEntity(self.rootEntity)
+ self.torusMesh = Qt3DExtras.QTorusMesh()
+ self.torusMesh.setRadius(5)
+ self.torusMesh.setMinorRadius(1)
+ self.torusMesh.setRings(100)
+ self.torusMesh.setSlices(20)
+
+ self.torusTransform = Qt3DCore.QTransform()
+ self.torusTransform.setScale3D(QVector3D(1.5, 1, 0.5))
+ self.torusTransform.setRotation(QQuaternion.fromAxisAndAngle(QVector3D(1, 0, 0), 45))
+
+ self.torusEntity.addComponent(self.torusMesh)
+ self.torusEntity.addComponent(self.torusTransform)
+ self.torusEntity.addComponent(self.material)
+
+ # Sphere
+ self.sphereEntity = Qt3DCore.QEntity(self.rootEntity)
+ self.sphereMesh = Qt3DExtras.QSphereMesh()
+ self.sphereMesh.setRadius(3)
+
+ self.sphereTransform = Qt3DCore.QTransform()
+ self.controller = OrbitTransformController(self.sphereTransform)
+ self.controller.setTarget(self.sphereTransform)
+ self.controller.setRadius(20)
+
+ self.sphereEntity.addComponent(self.sphereMesh)
+ self.sphereEntity.addComponent(self.sphereTransform)
+ self.sphereEntity.addComponent(self.material)
+
+class Qt3DExtrasTestCase(UsesQGuiApplication):
+ '''Tests related to Q3DExtras'''
+
+ def test3DExtras(self):
+
+ window = Window()
+ window.show()
+ while not window.isExposed():
+ self.app.processEvents()
+ QTimer.singleShot(2000, self.app.quit)
+ self.app.exec_()
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/Qt3DInput/CMakeLists.txt b/sources/pyside2/tests/Qt3DInput/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DInput/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/Qt3DLogic/CMakeLists.txt b/sources/pyside2/tests/Qt3DLogic/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DLogic/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/Qt3DQuick/CMakeLists.txt b/sources/pyside2/tests/Qt3DQuick/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DQuick/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/Qt3DRender/CMakeLists.txt b/sources/pyside2/tests/Qt3DRender/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/Qt3DRender/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/QtAxContainer/CMakeLists.txt b/sources/pyside2/tests/QtAxContainer/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/QtAxContainer/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/pyside2/tests/QtCharts/CMakeLists.txt b/sources/pyside2/tests/QtCharts/CMakeLists.txt
new file mode 100644
index 000000000..16e8b4bc9
--- /dev/null
+++ b/sources/pyside2/tests/QtCharts/CMakeLists.txt
@@ -0,0 +1 @@
+PYSIDE_TEST(qcharts_test.py)
diff --git a/sources/pyside2/tests/QtCharts/qcharts_test.py b/sources/pyside2/tests/QtCharts/qcharts_test.py
new file mode 100644
index 000000000..1503b2e54
--- /dev/null
+++ b/sources/pyside2/tests/QtCharts/qcharts_test.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test cases for QCharts'''
+
+from helper import UsesQApplication
+import unittest
+
+from PySide2.QtCore import QRect, QSize, QTimer
+from PySide2.QtGui import QGuiApplication, QScreen
+from PySide2.QtCharts import QtCharts
+
+class QChartsTestCase(UsesQApplication):
+ '''Tests related to QCharts'''
+
+ def testCharts(self):
+ self.series = QtCharts.QPieSeries()
+ self.series.append("Jane", 1);
+ self.series.append("Joe", 2);
+ self.series.append("Andy", 3);
+ self.series.append("Barbara", 4);
+ self.series.append("Axel", 5);
+ slice = self.series.slices()[1]
+ slice.setExploded();
+ slice.setLabelVisible();
+ self.chart = QtCharts.QChart()
+ self.chart.addSeries(self.series);
+ chartView = QtCharts.QChartView(self.chart)
+ screenSize = QGuiApplication.primaryScreen().geometry().size()
+ chartView.resize(screenSize / 2)
+ chartView.show()
+ QTimer.singleShot(500, self.app.quit)
+ self.app.exec_()
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtCore/CMakeLists.txt b/sources/pyside2/tests/QtCore/CMakeLists.txt
index 9e66ebc0a..3a08cb45b 100644
--- a/sources/pyside2/tests/QtCore/CMakeLists.txt
+++ b/sources/pyside2/tests/QtCore/CMakeLists.txt
@@ -61,6 +61,7 @@ PYSIDE_TEST(qenum_test.py)
PYSIDE_TEST(qevent_test.py)
PYSIDE_TEST(qfileinfo_test.py)
PYSIDE_TEST(qfile_test.py)
+PYSIDE_TEST(qfileread_test.py)
PYSIDE_TEST(qflags_test.py)
PYSIDE_TEST(qinstallmsghandler_test.py)
PYSIDE_TEST(qlinef_test.py)
@@ -85,6 +86,7 @@ PYSIDE_TEST(qprocess_test.py)
PYSIDE_TEST(qproperty_decorator.py)
PYSIDE_TEST(qrect_test.py)
PYSIDE_TEST(qregexp_test.py)
+PYSIDE_TEST(qregularexpression_test.py)
PYSIDE_TEST(qresource_test.py)
PYSIDE_TEST(qsize_test.py)
PYSIDE_TEST(qslot_object_test.py)
@@ -105,6 +107,9 @@ PYSIDE_TEST(qtimer_timeout_test.py)
PYSIDE_TEST(qtimezone_test.py)
PYSIDE_TEST(qtnamespace_test.py)
PYSIDE_TEST(qurl_test.py)
+PYSIDE_TEST(qurlquery_test.py)
+PYSIDE_TEST(quuid_test.py)
+PYSIDE_TEST(qversionnumber_test.py)
PYSIDE_TEST(repr_test.py)
PYSIDE_TEST(setprop_on_ctor_test.py)
PYSIDE_TEST(staticMetaObject_test.py)
diff --git a/sources/pyside2/tests/QtCore/qfileread_test.py b/sources/pyside2/tests/QtCore/qfileread_test.py
new file mode 100644
index 000000000..3912fe7e6
--- /dev/null
+++ b/sources/pyside2/tests/QtCore/qfileread_test.py
@@ -0,0 +1,82 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import unittest
+
+import os
+
+from PySide2.QtCore import QIODevice, QTemporaryFile
+
+class FileChild1(QTemporaryFile):
+ pass
+
+class FileChild2(QTemporaryFile):
+ def readData(self, maxlen):
+ return super(FileChild2, self).readData(maxlen)
+ def readLineData(self, maxlen):
+ return super(FileChild2, self).readLineData(maxlen)
+
+class readDataTest(unittest.TestCase):
+ '''Test case for readData and readLineData'''
+
+ def setUp(self):
+ '''Acquire resources'''
+ self.filename1 = FileChild1()
+ self.assertTrue(self.filename1.open())
+ self.filename1.write('Test text for testing')
+
+ self.filename2 = FileChild2()
+ self.assertTrue(self.filename2.open())
+ self.filename2.write('Test text for testing')
+
+ def tearDown(self):
+ '''release resources'''
+ pass
+
+ def testBasic(self):
+ '''QTemporaryFile.read'''
+ self.filename1.seek(0)
+ s1 = self.filename1.read(50)
+ self.assertEqual(s1, 'Test text for testing')
+
+
+ def testBug40(self):
+ self.filename2.seek(0)
+ s2 = self.filename2.read(50)
+ self.assertEqual(s2, 'Test text for testing')
+
+ self.filename2.seek(0)
+ s2 = self.filename2.readLine(22)
+ self.assertEqual(s2, 'Test text for testing')
+
+ self.filename1.seek(0)
+ s1 = self.filename1.read(50)
+ self.assertEqual(s1, s2)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtCore/qmimedatabase_test.py b/sources/pyside2/tests/QtCore/qmimedatabase_test.py
index 7bd9a4586..4c3ae220d 100644
--- a/sources/pyside2/tests/QtCore/qmimedatabase_test.py
+++ b/sources/pyside2/tests/QtCore/qmimedatabase_test.py
@@ -34,7 +34,7 @@ import unittest
import ctypes
import sys
-from PySide2.QtCore import QMimeDatabase
+from PySide2.QtCore import QMimeDatabase, QLocale
class QMimeDatabaseTest(unittest.TestCase):
def testMimeTypeForName(self):
@@ -43,7 +43,8 @@ class QMimeDatabaseTest(unittest.TestCase):
s0 = db.mimeTypeForName("application/x-zerosize")
self.assertTrue(s0.isValid())
self.assertEqual(s0.name(), "application/x-zerosize")
- self.assertEqual(s0.comment(), "empty document")
+ if "en" in QLocale().name():
+ self.assertEqual(s0.comment(), "empty document")
s0Again = db.mimeTypeForName("application/x-zerosize")
self.assertEqual(s0Again.name(), s0.name())
diff --git a/sources/pyside2/tests/QtCore/qobject_test.py b/sources/pyside2/tests/QtCore/qobject_test.py
index 482ae78be..bafa8a643 100644
--- a/sources/pyside2/tests/QtCore/qobject_test.py
+++ b/sources/pyside2/tests/QtCore/qobject_test.py
@@ -34,7 +34,12 @@
import unittest
import py3kcompat as py3k
-from PySide2.QtCore import QObject
+from PySide2.QtCore import QObject, Signal, Qt
+
+class Obj(QObject):
+ signal = Signal()
+ def empty(self):
+ pass
class ObjectNameCase(unittest.TestCase):
'''Tests related to QObject object name'''
@@ -67,6 +72,12 @@ class ObjectNameCase(unittest.TestCase):
obj.setObjectName(name)
self.assertEqual(obj.objectName(), name)
+ def testUniqueConnection(self):
+ obj = Obj()
+ # On first connect, UniqueConnection returns True, and on the second
+ # it must return False, and not a RuntimeError (PYSIDE-34)
+ self.assertTrue(obj.signal.connect(obj.empty, Qt.UniqueConnection))
+ self.assertFalse(obj.signal.connect(obj.empty, Qt.UniqueConnection))
if __name__ == '__main__':
unittest.main()
diff --git a/sources/pyside2/tests/QtCore/qregularexpression_test.py b/sources/pyside2/tests/QtCore/qregularexpression_test.py
new file mode 100644
index 000000000..e11b9b61c
--- /dev/null
+++ b/sources/pyside2/tests/QtCore/qregularexpression_test.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Unit tests for QRegularExpression'''
+
+import unittest
+from PySide2.QtCore import QRegularExpression, QRegularExpressionMatch, QRegularExpressionMatchIterator
+
+class QRegularExpressionTest(unittest.TestCase):
+
+ def testMatch(self):
+ re = QRegularExpression('^.*(word2).*$')
+ self.assertTrue(re.isValid())
+ match = re.match('word1 word2 word3')
+ self.assertTrue(match.isValid())
+ self.assertEqual(match.captured(1), 'word2')
+
+ def testMatchIterator(self):
+ re = QRegularExpression('(\w+)')
+ self.assertTrue(re.isValid())
+ count = 0
+ it = re.globalMatch('word1 word2 word3');
+ while it.hasNext():
+ it.next()
+ count = count + 1
+ self.assertEqual(count, 3)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtCore/qurl_test.py b/sources/pyside2/tests/QtCore/qurl_test.py
index 595e5931f..d5eb37d6e 100644
--- a/sources/pyside2/tests/QtCore/qurl_test.py
+++ b/sources/pyside2/tests/QtCore/qurl_test.py
@@ -33,6 +33,7 @@
import unittest
from PySide2.QtCore import QUrl
+from PySide2.QtCore import QUrlQuery
class QUrlBasicConstructor(unittest.TestCase):
'''Tests the basic constructors'''
@@ -67,59 +68,96 @@ class QUrlBasicConstructor(unittest.TestCase):
self.assertEqual(url.toString(),
'ftp://john:abc123@www.google.com:8080/mail/view')
+class QueryItemsTest(unittest.TestCase):
+ '''Test query item management'''
+
+ def testQueryItems(self):
+ url = QUrl('http://www.google.com/search?q=python&hl=en')
+ valid_data = [(('q'), ('python')), (('hl'), ('en'))]
+
+ self.assertEqual(sorted(QUrlQuery(url.query()).queryItems()), sorted(valid_data))
+
+ def testEncodedQueryItems(self):
+ url = QUrl('http://www.google.com/search?q=python&hl=en')
+ valid_data = [(('q'), ('python')), (('hl'), ('en'))]
+
+ self.assertEqual(sorted(QUrlQuery(url.query()).queryItems()), sorted(valid_data))
+
+ def testSetQueryItems(self):
+ urla = QUrl('http://www.google.com/search?q=python&hl=en')
+ urlb = QUrl('http://www.google.com/search')
+
+ urlb.setQuery(urla.query())
+
+ self.assertEqual(urla, urlb)
+
+ def testAddQueryItem(self):
+ url = QUrlQuery()
+ valid_data = [('hl', 'en'), ('user', 'konqui')]
+
+ url.addQueryItem(*valid_data[0])
+ self.assertEqual(url.queryItems()[0], valid_data[0])
+
+ url.addQueryItem(*valid_data[1])
+ self.assertEqual(sorted(url.queryItems()), sorted(valid_data))
+
+ def testAllQueryItemsValues(self):
+ url = QUrlQuery()
+ key = 'key'
+ valid_data = ['data', 'valid', 'test']
+
+ for i, data in enumerate(valid_data):
+ url.addQueryItem(key, data)
+ self.assertEqual(url.allQueryItemValues(key),
+ list(valid_data[:i+1]))
+
def testPath(self):
url = QUrl("http://qt-project.org/images/ban/pgs_front.jpg")
self.assertEqual(url.path(), "/images/ban/pgs_front.jpg")
# PYSIDE-345: No bindings for QUrlQuery
-# class QueryItemsTest(unittest.TestCase):
-# '''Test query item management'''
-#
-# def testQueryItems(self):
-# #QUrl.queryItems
-# url = QUrl('http://www.google.com/search?q=python&hl=en')
-# valid_data = [(('q'), ('python')), (('hl'), ('en'))]
-#
-# self.assertEqual(sorted(url.queryItems()), sorted(valid_data))
-#
-# def testEncodedQueryItems(self):
-# #QUrl.encodedQueryItems
-# url = QUrl('http://www.google.com/search?q=python&hl=en')
-# valid_data = [(('q'), ('python')), (('hl'), ('en'))]
-#
-# self.assertEqual(sorted(url.encodedQueryItems()), sorted(valid_data))
-#
-# def testSetQueryItems(self):
-# #QUrl.setQueryItems
-# urla = QUrl('http://www.google.com/search?q=python&hl=en')
-# urlb = QUrl('http://www.google.com/search')
-#
-# urlb.setQueryItems(urla.queryItems())
-#
-# self.assertEqual(urla, urlb)
-#
-# def testAddQueryItem(self):
-# #QUrl.addQueryItem
-# url = QUrl()
-# valid_data = [('hl', 'en'), ('user', 'konqui')]
-#
-# url.addQueryItem(*valid_data[0])
-# self.assertEqual(url.queryItems()[0], valid_data[0])
-#
-# url.addQueryItem(*valid_data[1])
-# self.assertEqual(sorted(url.queryItems()), sorted(valid_data))
-#
-# def testAllEncodedQueryItemsValues(self):
-# #QUrl.allEncodedQueryItemValues
-# url = QUrl()
-# key = 'key'
-# valid_data = ['data', 'valid', 'test']
-#
-# for i, data in enumerate(valid_data):
-# url.addQueryItem(key, data)
-# self.assertEqual(url.allEncodedQueryItemValues(key),
-# list(valid_data[:i+1]))
+class QueryItemsTest(unittest.TestCase):
+ '''Test query item management'''
+
+ def testQueryItems(self):
+ url = QUrl('http://www.google.com/search?q=python&hl=en')
+ valid_data = [(('q'), ('python')), (('hl'), ('en'))]
+
+ self.assertEqual(sorted(QUrlQuery(url.query()).queryItems()), sorted(valid_data))
+
+ def testEncodedQueryItems(self):
+ url = QUrl('http://www.google.com/search?q=python&hl=en')
+ valid_data = [(('q'), ('python')), (('hl'), ('en'))]
+
+ self.assertEqual(sorted(QUrlQuery(url.query()).queryItems()), sorted(valid_data))
+
+ def testSetQueryItems(self):
+ urla = QUrl('http://www.google.com/search?q=python&hl=en')
+ urlb = QUrl('http://www.google.com/search')
+
+ urlb.setQuery(urla.query())
+
+ self.assertEqual(urla, urlb)
+
+ def testAddQueryItem(self):
+ url = QUrlQuery()
+ valid_data = [('hl', 'en'), ('user', 'konqui')]
+
+ url.addQueryItem(*valid_data[0])
+ self.assertEqual(url.queryItems()[0], valid_data[0])
+
+ url.addQueryItem(*valid_data[1])
+ self.assertEqual(sorted(url.queryItems()), sorted(valid_data))
+
+ def testAllQueryItemsValues(self):
+ url = QUrlQuery()
+ key = 'key'
+ valid_data = ['data', 'valid', 'test']
+ for i, data in enumerate(valid_data):
+ url.addQueryItem(key, data)
+ self.assertEqual(url.allQueryItemValues(key),
+ list(valid_data[:i+1]))
if __name__ == '__main__':
unittest.main()
diff --git a/sources/pyside2/tests/QtCore/qurlquery_test.py b/sources/pyside2/tests/QtCore/qurlquery_test.py
new file mode 100644
index 000000000..e42856e6d
--- /dev/null
+++ b/sources/pyside2/tests/QtCore/qurlquery_test.py
@@ -0,0 +1,59 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Unit tests for QUrlQuery'''
+
+import unittest
+import ctypes
+import sys
+
+from PySide2.QtCore import QUrlQuery
+
+class QUrlQueryTest(unittest.TestCase):
+ def testConstructing(self):
+ empty = QUrlQuery()
+ self.assertTrue(empty.isEmpty())
+ self.assertEqual(empty.queryPairDelimiter(), QUrlQuery.defaultQueryPairDelimiter())
+ self.assertEqual(empty.queryValueDelimiter(), QUrlQuery.defaultQueryValueDelimiter())
+
+ empty.clear();
+ self.assertTrue(empty.isEmpty())
+
+ def testAddRemove(self):
+ query = QUrlQuery()
+
+ query.addQueryItem("a", "b");
+ self.assertTrue(not query.isEmpty())
+ self.assertTrue(query.hasQueryItem("a"))
+ self.assertEqual(query.queryItemValue("a"), "b")
+ self.assertEqual(query.allQueryItemValues("a"), ["b"])
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtCore/quuid_test.py b/sources/pyside2/tests/QtCore/quuid_test.py
new file mode 100644
index 000000000..64183884a
--- /dev/null
+++ b/sources/pyside2/tests/QtCore/quuid_test.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Unit tests for QUuid'''
+
+import unittest
+
+from PySide2.QtCore import QUuid
+
+class QUuidTest(unittest.TestCase):
+ def testFromString(self):
+ uuidString = '{fc69b59e-cc34-4436-a43c-ee95d128b8c5}'
+ uuid = QUuid(uuidString)
+ self.assertTrue(not uuid.isNull())
+ self.assertEqual(uuid.toString(), uuidString)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtCore/qversionnumber_test.py b/sources/pyside2/tests/QtCore/qversionnumber_test.py
new file mode 100644
index 000000000..929772fa6
--- /dev/null
+++ b/sources/pyside2/tests/QtCore/qversionnumber_test.py
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Unit tests for QVersionNumber'''
+
+import unittest
+
+from PySide2.QtCore import QVersionNumber
+
+class QVersionNumberTest(unittest.TestCase):
+ def testFromString(self):
+ versionString = '5.9.2'
+ version = QVersionNumber.fromString(versionString)
+ self.assertTrue(not version.isNull())
+ self.assertEqual(version.majorVersion(), 5)
+ self.assertEqual(version.minorVersion(), 9)
+ self.assertEqual(version.microVersion(), 2)
+ self.assertEqual(version.toString(), versionString)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtDataVisualization/CMakeLists.txt b/sources/pyside2/tests/QtDataVisualization/CMakeLists.txt
new file mode 100644
index 000000000..61b347263
--- /dev/null
+++ b/sources/pyside2/tests/QtDataVisualization/CMakeLists.txt
@@ -0,0 +1 @@
+PYSIDE_TEST(datavisualization_test.py)
diff --git a/sources/pyside2/tests/QtDataVisualization/datavisualization_test.py b/sources/pyside2/tests/QtDataVisualization/datavisualization_test.py
new file mode 100644
index 000000000..7efd6122d
--- /dev/null
+++ b/sources/pyside2/tests/QtDataVisualization/datavisualization_test.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test cases for QtDataVisualization'''
+
+from helper import UsesQGuiApplication
+from PySide2.QtCore import QTimer
+from PySide2.QtDataVisualization import QtDataVisualization
+import unittest
+
+def dataToBarDataRow(data):
+ result = []
+ for d in data:
+ result.append(QtDataVisualization.QBarDataItem(d))
+ return result
+
+def dataToBarDataArray(data):
+ result = []
+ for row in data:
+ result.append(dataToBarDataRow(row))
+ return result
+
+class QtDataVisualizationTestCase(UsesQGuiApplication):
+ '''Tests related to QtDataVisualization'''
+
+ def testBars(self):
+ self.bars = QtDataVisualization.Q3DBars()
+ self.columnAxis = QtDataVisualization.QCategory3DAxis()
+ self.columnAxis.setTitle('Columns')
+ self.columnAxis.setTitleVisible(True)
+ self.columnAxis.setLabels(['Column1', 'Column2'])
+
+ self.rowAxis = QtDataVisualization.QCategory3DAxis()
+ self.rowAxis.setTitle('Rows')
+ self.rowAxis.setTitleVisible(True)
+ self.rowAxis.setLabels(['Row1', 'Row2'])
+
+ self.valueAxis = QtDataVisualization.QValue3DAxis()
+ self.valueAxis.setTitle('Values')
+ self.valueAxis.setTitleVisible(True)
+ self.valueAxis.setRange(0, 5);
+
+ self.bars.setRowAxis(self.rowAxis)
+ self.bars.setColumnAxis(self.columnAxis)
+ self.bars.setValueAxis(self.valueAxis)
+
+ self.series = QtDataVisualization.QBar3DSeries()
+ self.arrayData = [[1, 2], [3, 4]]
+ self.series.dataProxy().addRows(dataToBarDataArray(self.arrayData))
+
+ self.bars.setPrimarySeries(self.series)
+
+ self.bars.show()
+ QTimer.singleShot(500, self.app.quit)
+ self.app.exec_()
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtGui/CMakeLists.txt b/sources/pyside2/tests/QtGui/CMakeLists.txt
index 63cf3c35f..eeb7c7e36 100644
--- a/sources/pyside2/tests/QtGui/CMakeLists.txt
+++ b/sources/pyside2/tests/QtGui/CMakeLists.txt
@@ -37,6 +37,7 @@ PYSIDE_TEST(qpolygonf_test.py)
PYSIDE_TEST(qkeysequence_test.py)
PYSIDE_TEST(qradialgradient_test.py)
PYSIDE_TEST(qrasterwindow_test.py)
+PYSIDE_TEST(qopenglwindow_test.py)
PYSIDE_TEST(qregion_test.py)
PYSIDE_TEST(qstylehints_test.py)
PYSIDE_TEST(qtextdocument_undoredo_test.py)
diff --git a/sources/pyside2/tests/QtGui/qopenglwindow_test.py b/sources/pyside2/tests/QtGui/qopenglwindow_test.py
new file mode 100644
index 000000000..2d11a0238
--- /dev/null
+++ b/sources/pyside2/tests/QtGui/qopenglwindow_test.py
@@ -0,0 +1,104 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Unit test for QOpenGLContext, QOpenGLTexture, QOpenGLWindow and related classes'''
+
+import sys
+import unittest
+
+from helper import UsesQApplication
+
+from PySide2.QtCore import QSize, QTimer, Qt
+from PySide2.QtGui import (QColor, QGuiApplication, QImage, QOpenGLContext,
+ QOpenGLTexture, QSurfaceFormat, QOpenGLWindow)
+
+try:
+ from OpenGL import GL
+except ImportError:
+ print("Skipping test due to missing OpenGL module")
+ sys.exit(0)
+
+class OpenGLWindow(QOpenGLWindow):
+ def __init__(self):
+ super(OpenGLWindow, self).__init__()
+
+ self.m_functions = None
+ self.m_texture = None
+ self.visibleChanged.connect(self.slotVisibleChanged)
+
+ def slotVisibleChanged(self, visible):
+ if not visible and self.m_texture is not None and self.context().makeCurrent(self):
+ self.m_texture = None
+ self.context().doneCurrent()
+
+ def initializeGL(self):
+ self.m_functions = self.context().functions()
+ self.m_functions.initializeOpenGLFunctions()
+ image = QImage(QSize(200, 200), QImage.Format_RGBA8888)
+ image.fill(QColor(Qt.red))
+ self.m_texture = QOpenGLTexture(image)
+
+ def paintGL(self):
+ GL.glMatrixMode(GL.GL_MODELVIEW);
+ GL.glLoadIdentity();
+
+ GL.glMatrixMode(GL.GL_PROJECTION);
+ GL.glLoadIdentity();
+ GL.glOrtho(0, 1, 1, 0, -1, 1);
+
+ self.m_functions.glClear(GL.GL_COLOR_BUFFER_BIT)
+ self.m_functions.glEnable(GL.GL_TEXTURE_2D);
+ self.m_texture.bind()
+
+ d = 0.5
+ GL.glBegin(GL.GL_QUADS)
+ GL.glTexCoord2f(0, 0)
+ GL.glVertex2f(0, 0)
+ GL.glTexCoord2f(d, 0)
+ GL.glVertex2f(d, 0)
+ GL.glTexCoord2f(d, d)
+ GL.glVertex2f(d, d)
+ GL.glTexCoord2f(0, d)
+ GL.glVertex2f(0, d)
+ GL.glEnd()
+ self.m_texture.release()
+
+ def resizeGL(self, w, h):
+ self.m_functions.glViewport(0, 0, self.width(), self.height())
+
+class QOpenGLWindowTest(UsesQApplication):
+ # On macOS, glClear(), glViewport() are rejected due to GLbitfield/GLint not being resolved properly
+ def test(self):
+ openGlWindow = OpenGLWindow()
+ openGlWindow.resize(640, 480)
+ openGlWindow.show()
+ QTimer.singleShot(100, openGlWindow.close)
+ self.app.exec_()
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtHelp/CMakeLists.txt b/sources/pyside2/tests/QtHelp/CMakeLists.txt
index d0ba2d80c..422dc51c7 100644
--- a/sources/pyside2/tests/QtHelp/CMakeLists.txt
+++ b/sources/pyside2/tests/QtHelp/CMakeLists.txt
@@ -1 +1,2 @@
PYSIDE_TEST(help_test.py)
+PYSIDE_TEST(helpsearchengine_test.py)
diff --git a/sources/pyside2/tests/QtHelp/helpsearchengine_test.py b/sources/pyside2/tests/QtHelp/helpsearchengine_test.py
new file mode 100644
index 000000000..6bc4b684a
--- /dev/null
+++ b/sources/pyside2/tests/QtHelp/helpsearchengine_test.py
@@ -0,0 +1,44 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import unittest
+
+from PySide2.QtHelp import QHelpEngineCore, QHelpSearchEngine, QHelpSearchResult
+
+from helper import UsesQApplication
+
+class QHelpSearchEngineTest(UsesQApplication):
+
+ def testQHelpSearchEngine(self):
+ helpEngineCore = QHelpEngineCore('')
+ helpSearchEngine = QHelpSearchEngine(helpEngineCore)
+ helpSearchResult = helpSearchEngine.searchResults(0, 0)
+ self.assertEqual(len(helpSearchResult), 0)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtTextToSpeech/CMakeLists.txt b/sources/pyside2/tests/QtTextToSpeech/CMakeLists.txt
new file mode 100644
index 000000000..6f5851587
--- /dev/null
+++ b/sources/pyside2/tests/QtTextToSpeech/CMakeLists.txt
@@ -0,0 +1 @@
+PYSIDE_TEST(qtexttospeech_test.py)
diff --git a/sources/pyside2/tests/QtTextToSpeech/qtexttospeech_test.py b/sources/pyside2/tests/QtTextToSpeech/qtexttospeech_test.py
new file mode 100644
index 000000000..6f26f3691
--- /dev/null
+++ b/sources/pyside2/tests/QtTextToSpeech/qtexttospeech_test.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test cases for QTextToSpeech methods'''
+
+from helper import UsesQApplication
+import sys
+import unittest
+
+from PySide2.QtCore import QTimer
+
+try:
+ from PySide2.QtTextToSpeech import QTextToSpeech, QVoice
+except ImportError:
+ print("Skipping test due to missing QtTextToSpeech module")
+ sys.exit(0)
+
+class QTextToSpeechTestCase(UsesQApplication):
+ '''Tests related to QTextToSpeech'''
+ def testSay(self):
+ engines = QTextToSpeech.availableEngines()
+ if not engines:
+ print('No QTextToSpeech engines available')
+ else:
+ speech = QTextToSpeech(engines[0])
+ speech.stateChanged.connect(self._slotStateChanged)
+ speech.say("Hello, PySide2")
+ QTimer.singleShot(5000, self.app.quit)
+ self.app.exec_()
+
+ def _slotStateChanged(self, state):
+ if (state == QTextToSpeech.State.Ready):
+ self.app.quit()
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtWidgets/CMakeLists.txt b/sources/pyside2/tests/QtWidgets/CMakeLists.txt
index 46a07c9a3..4efd9d803 100644
--- a/sources/pyside2/tests/QtWidgets/CMakeLists.txt
+++ b/sources/pyside2/tests/QtWidgets/CMakeLists.txt
@@ -120,12 +120,14 @@ PYSIDE_TEST(qtabwidget_test.py)
PYSIDE_TEST(qtabwidgetclear_test.py)
PYSIDE_TEST(qtextedit_test.py)
PYSIDE_TEST(qtextedit_signal_test.py)
+PYSIDE_TEST(qtreeview_test.py)
PYSIDE_TEST(qtoolbar_test.py)
PYSIDE_TEST(qtoolbox_test.py)
PYSIDE_TEST(qvalidator_test.py)
PYSIDE_TEST(qvariant_test.py)
PYSIDE_TEST(qwidget_setlayout_test.py)
PYSIDE_TEST(qwidget_test.py)
+PYSIDE_TEST(qcolormap_test.py)
PYSIDE_TEST(reference_count_test.py)
PYSIDE_TEST(returnquadruplesofnumbers_test.py)
PYSIDE_TEST(standardpixmap_test.py)
diff --git a/sources/pyside2/tests/QtWidgets/qcolormap_test.py b/sources/pyside2/tests/QtWidgets/qcolormap_test.py
new file mode 100644
index 000000000..c71216592
--- /dev/null
+++ b/sources/pyside2/tests/QtWidgets/qcolormap_test.py
@@ -0,0 +1,43 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import unittest
+
+from PySide2.QtWidgets import QColormap
+from helper import UsesQApplication
+
+
+class QColormapTest(UsesQApplication):
+
+ def testQColormap(self):
+ qc = QColormap.instance()
+ self.assertEqual(qc.size(), -1)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/QtWidgets/qlistwidget_test.py b/sources/pyside2/tests/QtWidgets/qlistwidget_test.py
index b89d2f77c..063623b61 100644
--- a/sources/pyside2/tests/QtWidgets/qlistwidget_test.py
+++ b/sources/pyside2/tests/QtWidgets/qlistwidget_test.py
@@ -78,5 +78,12 @@ class QListWidgetTest(UsesQApplication):
self.app.exec_()
self.assertEqual(lst.count(), 1)
+ def testClear(self):
+ lst = QtWidgets.QListWidget()
+ lst.addItem("foo")
+ item = lst.item(0)
+ self.assertIsNone(lst.clear())
+ self.assertRaises(RuntimeError, lambda: item.text())
+
if __name__ == '__main__':
unittest.main()
diff --git a/sources/pyside2/tests/QtWidgets/qtreeview_test.py b/sources/pyside2/tests/QtWidgets/qtreeview_test.py
new file mode 100644
index 000000000..a731ddafa
--- /dev/null
+++ b/sources/pyside2/tests/QtWidgets/qtreeview_test.py
@@ -0,0 +1,89 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import unittest
+
+from PySide2.QtGui import QStandardItemModel
+from PySide2.QtWidgets import QWidget, QTreeView, QVBoxLayout, QStyledItemDelegate
+from helper import UsesQApplication
+
+class Widget(QWidget):
+ def __init__(self, parent=None):
+ QWidget.__init__(self, parent)
+ self.treeView = QTreeView(self)
+ layout = QVBoxLayout()
+ layout.addWidget(self.treeView)
+ self.setLayout(layout)
+ self.treeView.setModel(QStandardItemModel())
+
+ self.treeView.model().setHorizontalHeaderLabels(('3', '1', '5'))
+
+class QWidgetTest(UsesQApplication):
+
+ def testDelegates(self):
+ widget = Widget()
+ t = widget.treeView
+
+ # When calling setItemDelegateForColumn using a separate variable
+ # for the second argument (QAbstractItemDelegate), there was no problem
+ # on keeping the reference to this object, since the variable was kept
+ # alive (case A)
+ # Contrary, when instantiating this argument on the function call
+ # Using QStyledItemDelegate inside the call the reference of the
+ # object was lost, causing a segfault. (case B)
+
+ # Case A
+ d = QStyledItemDelegate()
+ # Using QStyledItemDelegate from a variable so we keep the reference alive
+ # and we encounter no segfault.
+ t.setItemDelegateForColumn(0, d)
+ # This raised the Segmentation Fault too, because manually destroying
+ # the object caused a missing refrence.
+ del d
+
+ # Getting the delegates
+ a = t.itemDelegateForColumn(0)
+ self.assertIsInstance(a, QStyledItemDelegate)
+
+ # Case B
+ t.setItemDelegateForColumn(1, QStyledItemDelegate())
+
+ # Getting the delegates
+ b = t.itemDelegateForColumn(1)
+ self.assertIsInstance(b, QStyledItemDelegate)
+
+ # Test for Rows
+ t.setItemDelegateForRow(0, QStyledItemDelegate())
+ self.assertIsInstance(t.itemDelegateForRow(0), QStyledItemDelegate)
+
+ # Test for general delegate
+ t.setItemDelegate(QStyledItemDelegate())
+ self.assertIsInstance(t.itemDelegate(), QStyledItemDelegate)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/pyside2/tests/pysidetest/CMakeLists.txt b/sources/pyside2/tests/pysidetest/CMakeLists.txt
index 8c86a0ab4..c6d3bb13b 100644
--- a/sources/pyside2/tests/pysidetest/CMakeLists.txt
+++ b/sources/pyside2/tests/pysidetest/CMakeLists.txt
@@ -1,7 +1,7 @@
project(pysidetest)
project(testbinding)
-cmake_minimum_required(VERSION 2.6)
+cmake_minimum_required(VERSION 3.1)
# On Windows, don't link to qtmain.lib for executables automatically.
cmake_policy(SET CMP0020 OLD)
@@ -38,26 +38,42 @@ ${CMAKE_CURRENT_BINARY_DIR}/testbinding/testview_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/testbinding/testbinding_module_wrapper.cpp
)
+# Get per module include dirs.
+# There are usually 3 paths there:
+# ./qt/include/; ./qt/include/QtCore ; ./qt/mkspecs/linux-g++
+# on framework build they are:
+# ./qt/lib/QtCore.framework; ./qt/lib/QtCore.framework/Headers ; ./qt/mkspecs/macx-clang
+# Thus we use the second direct path, which contains the actual header files.
+
+list(GET Qt5Core_INCLUDE_DIRS 1 Qt5Core_DIRECT_INCLUDE_DIR)
+list(GET Qt5Gui_INCLUDE_DIRS 1 Qt5Gui_DIRECT_INCLUDE_DIR)
+list(GET Qt5Widgets_INCLUDE_DIRS 1 Qt5Widgets_DIRECT_INCLUDE_DIR)
+
+# Adjust include headers paths for frameworks.
+set(shiboken_framework_include_dirs_option "")
+if(CMAKE_HOST_APPLE AND QtCore_is_framework)
+ set(shiboken_framework_include_dirs "${QT_FRAMEWORK_INCLUDE_DIR}")
+ set(shiboken_framework_include_dirs_option "--framework-include-paths=${shiboken_framework_include_dirs}")
+endif()
+
make_path(testbinding_include_dirs ${pyside2_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../../PySide2
${CMAKE_CURRENT_SOURCE_DIR}/../../libpyside
${QT_INCLUDE_DIR}
- ${QT_INCLUDE_DIR}/QtCore
- ${QT_INCLUDE_DIR}/QtGui
- ${QT_INCLUDE_DIR}/QtWidgets
+ ${Qt5Core_DIRECT_INCLUDE_DIR}
+ ${Qt5Gui_DIRECT_INCLUDE_DIR}
+ ${Qt5Widgets_DIRECT_INCLUDE_DIR}
)
-make_path(testbinding_typesystem_path ${CMAKE_CURRENT_SOURCE_DIR}
- ${pyside2_SOURCE_DIR}
- ${QtCore_SOURCE_DIR} ${QtGui_SOURCE_DIR} ${QtWidgets_SOURCE_DIR}
- ${QtCore_BINARY_DIR} ${QtGui_BINARY_DIR} ${QtWidgets_BINARY_DIR}
- )
+make_path(testbinding_typesystem_path ${pyside2_SOURCE_DIR}
+ ${pyside2_BINARY_DIR})
add_custom_command(OUTPUT ${testbinding_SRC}
COMMAND ${SHIBOKEN_BINARY} ${GENERATOR_EXTRA_FLAGS}
${CMAKE_CURRENT_SOURCE_DIR}/pysidetest_global.h
--include-paths=${testbinding_include_dirs}
+ ${shiboken_framework_include_dirs_option}
--typesystem-paths=${testbinding_typesystem_path}
--output-directory=${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/typesystem_pysidetest.xml
diff --git a/sources/pyside2/tests/pysidetest/typesystem_pysidetest.xml b/sources/pyside2/tests/pysidetest/typesystem_pysidetest.xml
index 7895e7147..bf9c29386 100644
--- a/sources/pyside2/tests/pysidetest/typesystem_pysidetest.xml
+++ b/sources/pyside2/tests/pysidetest/typesystem_pysidetest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<typesystem package="testbinding">
- <load-typesystem name="typesystem_widgets.xml" generate="no"/>
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
<value-type name="IntValue"/>
<primitive-type name="TypedefValue">
<!--
diff --git a/sources/pyside2/tests/registry/exists_darwin_5_9_3_ci.py b/sources/pyside2/tests/registry/exists_darwin_5_9_4_ci.py
index 8f07c2746..bad44da92 100644
--- a/sources/pyside2/tests/registry/exists_darwin_5_9_3_ci.py
+++ b/sources/pyside2/tests/registry/exists_darwin_5_9_4_ci.py
@@ -1,6 +1,6 @@
#############################################################################
##
-## Copyright (C) 2017 The Qt Company Ltd.
+## Copyright (C) 2018 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of PySide2.
@@ -37,6 +37,14 @@
##
#############################################################################
+"""
+This file contains the simplified signatures for all functions in PySide
+for module 'exists_darwin_5_9_4_ci'. There are no default values, no variable
+names and no self parameter. Only types are present after simplification.
+The functions 'next' resp. '__next__' are removed
+to make the output identical for Python 2 and 3.
+"""
+
import sys
dict = {}
@@ -106,13 +114,13 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractItemModel.canDropMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtCore.Qt.DropAction', 'int', 'int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.canFetchMore": ('PySide2.QtCore.QModelIndex',),
"QAbstractItemModel.changePersistentIndex": ('PySide2.QtCore.QModelIndex', 'PySide2.QtCore.QModelIndex'),
- "QAbstractItemModel.changePersistentIndexList": ('PySide2.support.signature.typing.List', 'PySide2.support.signature.typing.List'),
+ "QAbstractItemModel.changePersistentIndexList": ('List[int]', 'List[int]'),
"QAbstractItemModel.columnCount": ('PySide2.QtCore.QModelIndex',),
"QAbstractItemModel.createIndex": [('int', 'int', 'int'), ('int', 'int', 'object')],
"QAbstractItemModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QAbstractItemModel.decodeData": ('int', 'int', 'PySide2.QtCore.QModelIndex', 'PySide2.QtCore.QDataStream'),
"QAbstractItemModel.dropMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtCore.Qt.DropAction', 'int', 'int', 'PySide2.QtCore.QModelIndex'),
- "QAbstractItemModel.encodeData": ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QDataStream'),
+ "QAbstractItemModel.encodeData": ('List[int]', 'PySide2.QtCore.QDataStream'),
"QAbstractItemModel.endInsertColumns": (),
"QAbstractItemModel.endInsertRows": (),
"QAbstractItemModel.endMoveColumns": (),
@@ -131,8 +139,8 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractItemModel.insertRow": ('int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.insertRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.itemData": ('PySide2.QtCore.QModelIndex',),
- "QAbstractItemModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'PySide2.support.signature.typing.Any', 'int', 'MatchFlags'),
- "QAbstractItemModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QAbstractItemModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'Any', 'int', 'MatchFlags'),
+ "QAbstractItemModel.mimeData": ('List[int]',),
"QAbstractItemModel.mimeTypes": (),
"QAbstractItemModel.moveColumn": ('PySide2.QtCore.QModelIndex', 'int', 'PySide2.QtCore.QModelIndex', 'int'),
"QAbstractItemModel.moveColumns": ('PySide2.QtCore.QModelIndex', 'int', 'int', 'PySide2.QtCore.QModelIndex', 'int'),
@@ -148,8 +156,8 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractItemModel.revert": (),
"QAbstractItemModel.roleNames": (),
"QAbstractItemModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QAbstractItemModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QAbstractItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QAbstractItemModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QAbstractItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QAbstractItemModel.setItemData": ('PySide2.QtCore.QModelIndex', 'dict'),
"QAbstractItemModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.sort": ('int', 'PySide2.QtCore.Qt.SortOrder'),
@@ -184,12 +192,12 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractProxyModel.mapSelectionFromSource": ('PySide2.QtCore.QItemSelection',),
"QAbstractProxyModel.mapSelectionToSource": ('PySide2.QtCore.QItemSelection',),
"QAbstractProxyModel.mapToSource": ('PySide2.QtCore.QModelIndex',),
- "QAbstractProxyModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QAbstractProxyModel.mimeData": ('List[int]',),
"QAbstractProxyModel.mimeTypes": (),
"QAbstractProxyModel.resetInternalData": (),
"QAbstractProxyModel.revert": (),
- "QAbstractProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QAbstractProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QAbstractProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QAbstractProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QAbstractProxyModel.setItemData": ('PySide2.QtCore.QModelIndex', 'dict'),
"QAbstractProxyModel.setSourceModel": ('PySide2.QtCore.QAbstractItemModel',),
"QAbstractProxyModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
@@ -249,7 +257,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QBasicMutex:
"QBasicMutex.__init__": (),
- "QBasicMutex.isRecursive": [],
+ "QBasicMutex.isRecursive": (),
"QBasicMutex.lock": (),
"QBasicMutex.tryLock": (),
"QBasicMutex.try_lock": (),
@@ -284,7 +292,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QBuffer:
"QBuffer.__init__": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QBuffer.atEnd": (),
- "QBuffer.buffer": [],
+ "QBuffer.buffer": (),
"QBuffer.canReadLine": (),
"QBuffer.close": (),
"QBuffer.connectNotify": ('PySide2.QtCore.QMetaMethod',),
@@ -300,68 +308,68 @@ if "PySide2.QtCore" in sys.modules:
"QBuffer.writeData": ('str', 'int'),
# class PySide2.QtCore.QByteArray:
- "QByteArray.__init__": [(), ('PySide2.QtCore.QByteArray',), ('int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.__init__": [(), ('PySide2.QtCore.QByteArray',), ('int', 'Union[str, int]')],
"QByteArray.__copy__": (),
"QByteArray.__reduce__": (),
- "QByteArray.append": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',), ('int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.append": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',), ('int', 'Union[str, int]')],
"QByteArray.at": ('int',),
"QByteArray.capacity": (),
"QByteArray.cbegin": (),
"QByteArray.cend": (),
"QByteArray.chop": ('int',),
"QByteArray.clear": (),
- "QByteArray.contains": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
- "QByteArray.count": [(), ('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
- "QByteArray.data": [],
- "QByteArray.endsWith": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
- "QByteArray.fill": ('PySide2.support.signature.typing.Union[str, int]', 'int'),
+ "QByteArray.contains": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
+ "QByteArray.count": [(), ('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
+ "QByteArray.data": (),
+ "QByteArray.endsWith": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
+ "QByteArray.fill": ('Union[str, int]', 'int'),
"QByteArray.fromBase64": [('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QByteArray', 'Base64Options')],
"QByteArray.fromHex": ('PySide2.QtCore.QByteArray',),
- "QByteArray.fromPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QByteArray.fromPercentEncoding": ('PySide2.QtCore.QByteArray', 'Union[str, int]'),
"QByteArray.fromRawData": ('str', 'int'),
"QByteArray.indexOf": ('PySide2.QtCore.QByteArray', 'int'),
- "QByteArray.insert": [('int', 'PySide2.QtCore.QByteArray'), ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.insert": [('int', 'PySide2.QtCore.QByteArray'), ('int', 'int', 'Union[str, int]')],
"QByteArray.isEmpty": (),
"QByteArray.isNull": (),
"QByteArray.isSharedWith": ('PySide2.QtCore.QByteArray',),
"QByteArray.lastIndexOf": ('PySide2.QtCore.QByteArray', 'int'),
"QByteArray.left": ('int',),
- "QByteArray.leftJustified": ('int', 'PySide2.support.signature.typing.Union[str, int]', 'bool'),
+ "QByteArray.leftJustified": ('int', 'Union[str, int]', 'bool'),
"QByteArray.length": (),
"QByteArray.mid": ('int', 'int'),
- "QByteArray.number": [('float', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('int', 'int')],
- "QByteArray.prepend": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',), ('int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.number": [('float', 'Union[str, int]', 'int'), ('int', 'int')],
+ "QByteArray.prepend": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',), ('int', 'Union[str, int]')],
"QByteArray.remove": ('int', 'int'),
"QByteArray.repeated": ('int',),
- "QByteArray.replace": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray'), ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.QtCore.QByteArray'), ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'), ('int', 'int', 'PySide2.QtCore.QByteArray'), ('str', 'PySide2.QtCore.QByteArray')],
+ "QByteArray.replace": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray'), ('Union[str, int]', 'PySide2.QtCore.QByteArray'), ('Union[str, int]', 'Union[str, int]'), ('int', 'int', 'PySide2.QtCore.QByteArray'), ('str', 'PySide2.QtCore.QByteArray')],
"QByteArray.reserve": ('int',),
"QByteArray.resize": ('int',),
"QByteArray.right": ('int',),
- "QByteArray.rightJustified": ('int', 'PySide2.support.signature.typing.Union[str, int]', 'bool'),
- "QByteArray.setNum": [('float', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('int', 'int')],
+ "QByteArray.rightJustified": ('int', 'Union[str, int]', 'bool'),
+ "QByteArray.setNum": [('float', 'Union[str, int]', 'int'), ('int', 'int')],
"QByteArray.setRawData": ('str', 'int'),
- "QByteArray.simplified": [],
+ "QByteArray.simplified": (),
"QByteArray.size": (),
- "QByteArray.split": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QByteArray.split": ('Union[str, int]',),
"QByteArray.squeeze": (),
- "QByteArray.startsWith": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
+ "QByteArray.startsWith": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
"QByteArray.swap": ('PySide2.QtCore.QByteArray',),
"QByteArray.toBase64": [(), ('Base64Options',)],
"QByteArray.toDouble": ('bool',),
"QByteArray.toFloat": ('bool',),
- "QByteArray.toHex": [(), ('PySide2.support.signature.typing.Union[str, int]',)],
+ "QByteArray.toHex": [(), ('Union[str, int]',)],
"QByteArray.toInt": ('bool', 'int'),
"QByteArray.toLong": ('bool', 'int'),
"QByteArray.toLongLong": ('bool', 'int'),
- "QByteArray.toLower": [],
- "QByteArray.toPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QByteArray.toLower": (),
+ "QByteArray.toPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray', 'Union[str, int]'),
"QByteArray.toShort": ('bool', 'int'),
"QByteArray.toUInt": ('bool', 'int'),
"QByteArray.toULong": ('bool', 'int'),
"QByteArray.toULongLong": ('bool', 'int'),
"QByteArray.toUShort": ('bool', 'int'),
- "QByteArray.toUpper": [],
- "QByteArray.trimmed": [],
+ "QByteArray.toUpper": (),
+ "QByteArray.trimmed": (),
"QByteArray.truncate": ('int',),
# class PySide2.QtCore.QByteArrayMatcher:
@@ -381,7 +389,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QCollator:
"QCollator.__init__": [('PySide2.QtCore.QCollator',), ('PySide2.QtCore.QLocale',)],
"QCollator.caseSensitivity": (),
- "QCollator.compare": [('PySide2.support.signature.typing.Union[str, int]', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('str', 'str')],
+ "QCollator.compare": [('Union[str, int]', 'int', 'Union[str, int]', 'int'), ('str', 'str')],
"QCollator.ignorePunctuation": (),
"QCollator.locale": (),
"QCollator.numericMode": (),
@@ -398,14 +406,14 @@ if "PySide2.QtCore" in sys.modules:
"QCollatorSortKey.swap": ('PySide2.QtCore.QCollatorSortKey',),
# class PySide2.QtCore.QCommandLineOption:
- "QCommandLineOption.__init__": [('PySide2.QtCore.QCommandLineOption',), ('PySide2.support.signature.typing.List',), ('PySide2.support.signature.typing.List', 'str', 'str', 'str'), ('str',), ('str', 'str', 'str', 'str')],
+ "QCommandLineOption.__init__": [('List[str]',), ('List[str]', 'str', 'str', 'str'), ('PySide2.QtCore.QCommandLineOption',), ('str',), ('str', 'str', 'str', 'str')],
"QCommandLineOption.defaultValues": (),
"QCommandLineOption.description": (),
"QCommandLineOption.flags": (),
"QCommandLineOption.isHidden": (),
"QCommandLineOption.names": (),
"QCommandLineOption.setDefaultValue": ('str',),
- "QCommandLineOption.setDefaultValues": ('PySide2.support.signature.typing.List',),
+ "QCommandLineOption.setDefaultValues": ('List[str]',),
"QCommandLineOption.setDescription": ('str',),
"QCommandLineOption.setFlags": ('Flags',),
"QCommandLineOption.setHidden": ('bool',),
@@ -426,9 +434,9 @@ if "PySide2.QtCore" in sys.modules:
"QCommandLineParser.helpText": (),
"QCommandLineParser.isSet": [('PySide2.QtCore.QCommandLineOption',), ('str',)],
"QCommandLineParser.optionNames": (),
- "QCommandLineParser.parse": ('PySide2.support.signature.typing.List',),
+ "QCommandLineParser.parse": ('List[str]',),
"QCommandLineParser.positionalArguments": (),
- "QCommandLineParser.process": [('PySide2.QtCore.QCoreApplication',), ('PySide2.support.signature.typing.List',)],
+ "QCommandLineParser.process": [('List[str]',), ('PySide2.QtCore.QCoreApplication',)],
"QCommandLineParser.setApplicationDescription": ('str',),
"QCommandLineParser.setOptionsAfterPositionalArgumentsMode": ('PySide2.QtCore.QCommandLineParser.OptionsAfterPositionalArgumentsMode',),
"QCommandLineParser.setSingleDashWordOptionMode": ('PySide2.QtCore.QCommandLineParser.SingleDashWordOptionMode',),
@@ -439,7 +447,7 @@ if "PySide2.QtCore" in sys.modules:
"QCommandLineParser.values": [('PySide2.QtCore.QCommandLineOption',), ('str',)],
# class PySide2.QtCore.QCoreApplication:
- "QCoreApplication.__init__": ('PySide2.support.signature.typing.List',),
+ "QCoreApplication.__init__": ('List[str]',),
"QCoreApplication.addLibraryPath": ('str',),
"QCoreApplication.applicationDirPath": (),
"QCoreApplication.applicationFilePath": (),
@@ -474,7 +482,7 @@ if "PySide2.QtCore" in sys.modules:
"QCoreApplication.setApplicationVersion": ('str',),
"QCoreApplication.setAttribute": ('PySide2.QtCore.Qt.ApplicationAttribute', 'bool'),
"QCoreApplication.setEventDispatcher": ('PySide2.QtCore.QAbstractEventDispatcher',),
- "QCoreApplication.setLibraryPaths": ('PySide2.support.signature.typing.List',),
+ "QCoreApplication.setLibraryPaths": ('List[str]',),
"QCoreApplication.setOrganizationDomain": ('str',),
"QCoreApplication.setOrganizationName": ('str',),
"QCoreApplication.setQuitLockEnabled": ('bool',),
@@ -533,17 +541,17 @@ if "PySide2.QtCore" in sys.modules:
"QDataStream.writeInt16": ('int',),
"QDataStream.writeInt32": ('int',),
"QDataStream.writeInt64": ('int',),
- "QDataStream.writeInt8": ('PySide2.support.signature.typing.Union[str, int]',),
- "QDataStream.writeQChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QDataStream.writeInt8": ('Union[str, int]',),
+ "QDataStream.writeQChar": ('Union[str, int]',),
"QDataStream.writeQString": ('str',),
- "QDataStream.writeQStringList": ('PySide2.support.signature.typing.List',),
- "QDataStream.writeQVariant": ('PySide2.support.signature.typing.Any',),
+ "QDataStream.writeQStringList": ('List[str]',),
+ "QDataStream.writeQVariant": ('Any',),
"QDataStream.writeRawData": ('str', 'int'),
"QDataStream.writeString": ('str',),
"QDataStream.writeUInt16": ('int',),
"QDataStream.writeUInt32": ('int',),
"QDataStream.writeUInt64": ('int',),
- "QDataStream.writeUInt8": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QDataStream.writeUInt8": ('Union[str, int]',),
# class PySide2.QtCore.QDate:
"QDate.__init__": [(), ('PySide2.QtCore.QDate',), ('int', 'int', 'int')],
@@ -561,7 +569,7 @@ if "PySide2.QtCore" in sys.modules:
"QDate.daysTo": ('PySide2.QtCore.QDate',),
"QDate.fromJulianDay": ('int',),
"QDate.fromString": [('str', 'PySide2.QtCore.Qt.DateFormat'), ('str', 'str')],
- "QDate.getDate": ['int', 'int', 'int'],
+ "QDate.getDate": ('int', 'int', 'int'),
"QDate.isLeapYear": ('int',),
"QDate.isNull": (),
"QDate.isValid": [(), ('int', 'int', 'int')],
@@ -645,8 +653,8 @@ if "PySide2.QtCore" in sys.modules:
"QDir.currentPath": (),
"QDir.dirName": (),
"QDir.drives": (),
- "QDir.entryInfoList": [('Filters', 'SortFlags'), ('PySide2.support.signature.typing.List', 'Filters', 'SortFlags')],
- "QDir.entryList": [('Filters', 'SortFlags'), ('PySide2.support.signature.typing.List', 'Filters', 'SortFlags')],
+ "QDir.entryInfoList": [('Filters', 'SortFlags'), ('List[str]', 'Filters', 'SortFlags')],
+ "QDir.entryList": [('Filters', 'SortFlags'), ('List[str]', 'Filters', 'SortFlags')],
"QDir.exists": [(), ('str',)],
"QDir.filePath": ('str',),
"QDir.filter": (),
@@ -662,7 +670,7 @@ if "PySide2.QtCore" in sys.modules:
"QDir.isRoot": (),
"QDir.listSeparator": (),
"QDir.makeAbsolute": (),
- "QDir.match": [('PySide2.support.signature.typing.List', 'str'), ('str', 'str')],
+ "QDir.match": [('List[str]', 'str'), ('str', 'str')],
"QDir.mkdir": ('str',),
"QDir.mkpath": ('str',),
"QDir.nameFilters": (),
@@ -681,9 +689,9 @@ if "PySide2.QtCore" in sys.modules:
"QDir.separator": (),
"QDir.setCurrent": ('str',),
"QDir.setFilter": ('Filters',),
- "QDir.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QDir.setNameFilters": ('List[str]',),
"QDir.setPath": ('str',),
- "QDir.setSearchPaths": ('str', 'PySide2.support.signature.typing.List'),
+ "QDir.setSearchPaths": ('str', 'List[str]'),
"QDir.setSorting": ('SortFlags',),
"QDir.sorting": (),
"QDir.swap": ('PySide2.QtCore.QDir',),
@@ -692,12 +700,11 @@ if "PySide2.QtCore" in sys.modules:
"QDir.toNativeSeparators": ('str',),
# class PySide2.QtCore.QDirIterator:
- "QDirIterator.__init__": [('PySide2.QtCore.QDir', 'IteratorFlags'), ('str', 'Filters', 'IteratorFlags'), ('str', 'IteratorFlags'), ('str', 'PySide2.support.signature.typing.List', 'Filters', 'IteratorFlags')],
+ "QDirIterator.__init__": [('PySide2.QtCore.QDir', 'IteratorFlags'), ('str', 'Filters', 'IteratorFlags'), ('str', 'IteratorFlags'), ('str', 'List[str]', 'Filters', 'IteratorFlags')],
"QDirIterator.fileInfo": (),
"QDirIterator.fileName": (),
"QDirIterator.filePath": (),
"QDirIterator.hasNext": (),
- "QDirIterator.next": (),
"QDirIterator.path": (),
# class PySide2.QtCore.QDynamicPropertyChangeEvent:
@@ -810,7 +817,7 @@ if "PySide2.QtCore" in sys.modules:
"QFileDevice.seek": ('int',),
"QFileDevice.setPermissions": ('Permissions',),
"QFileDevice.size": (),
- "QFileDevice.unmap": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFileDevice.unmap": ('Union[str, int]',),
"QFileDevice.unsetError": (),
"QFileDevice.writeData": ('str', 'int'),
@@ -867,16 +874,16 @@ if "PySide2.QtCore" in sys.modules:
"QFileSelector.allSelectors": (),
"QFileSelector.extraSelectors": (),
"QFileSelector.select": [('PySide2.QtCore.QUrl',), ('str',)],
- "QFileSelector.setExtraSelectors": ('PySide2.support.signature.typing.List',),
+ "QFileSelector.setExtraSelectors": ('List[str]',),
# class PySide2.QtCore.QFileSystemWatcher:
- "QFileSystemWatcher.__init__": [('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QObject')],
+ "QFileSystemWatcher.__init__": [('List[str]', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QFileSystemWatcher.addPath": ('str',),
- "QFileSystemWatcher.addPaths": ('PySide2.support.signature.typing.List',),
+ "QFileSystemWatcher.addPaths": ('List[str]',),
"QFileSystemWatcher.directories": (),
"QFileSystemWatcher.files": (),
"QFileSystemWatcher.removePath": ('str',),
- "QFileSystemWatcher.removePaths": ('PySide2.support.signature.typing.List',),
+ "QFileSystemWatcher.removePaths": ('List[str]',),
# class PySide2.QtCore.QFinalState:
"QFinalState.__init__": ('PySide2.QtCore.QState',),
@@ -928,7 +935,7 @@ if "PySide2.QtCore" in sys.modules:
"QIODevice.openMode": (),
"QIODevice.peek": ('int',),
"QIODevice.pos": (),
- "QIODevice.putChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QIODevice.putChar": ('Union[str, int]',),
"QIODevice.read": ('int',),
"QIODevice.readAll": (),
"QIODevice.readChannelCount": (),
@@ -945,7 +952,7 @@ if "PySide2.QtCore" in sys.modules:
"QIODevice.setTextModeEnabled": ('bool',),
"QIODevice.size": (),
"QIODevice.startTransaction": (),
- "QIODevice.ungetChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QIODevice.ungetChar": ('Union[str, int]',),
"QIODevice.waitForBytesWritten": ('int',),
"QIODevice.waitForReadyRead": ('int',),
"QIODevice.write": ('PySide2.QtCore.QByteArray',),
@@ -957,7 +964,7 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelection.__copy__": (),
"QItemSelection.append": [('PySide2.QtCore.QItemSelectionRange',), ('list',)],
"QItemSelection.at": ('int',),
- "QItemSelection.back": [],
+ "QItemSelection.back": (),
"QItemSelection.clear": (),
"QItemSelection.constFirst": (),
"QItemSelection.constLast": (),
@@ -966,16 +973,16 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelection.detachShared": (),
"QItemSelection.empty": (),
"QItemSelection.endsWith": ('PySide2.QtCore.QItemSelectionRange',),
- "QItemSelection.first": [],
+ "QItemSelection.first": (),
"QItemSelection.fromSet": ('set',),
"QItemSelection.fromVector": ('list',),
- "QItemSelection.front": [],
+ "QItemSelection.front": (),
"QItemSelection.indexOf": ('PySide2.QtCore.QItemSelectionRange', 'int'),
"QItemSelection.indexes": (),
"QItemSelection.insert": ('int', 'PySide2.QtCore.QItemSelectionRange'),
"QItemSelection.isEmpty": (),
"QItemSelection.isSharedWith": ('list',),
- "QItemSelection.last": [],
+ "QItemSelection.last": (),
"QItemSelection.lastIndexOf": ('PySide2.QtCore.QItemSelectionRange', 'int'),
"QItemSelection.length": (),
"QItemSelection.merge": ('PySide2.QtCore.QItemSelection', 'SelectionFlags'),
@@ -1018,7 +1025,7 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelectionModel.isColumnSelected": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.isRowSelected": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.isSelected": ('PySide2.QtCore.QModelIndex',),
- "QItemSelectionModel.model": [],
+ "QItemSelectionModel.model": (),
"QItemSelectionModel.reset": (),
"QItemSelectionModel.rowIntersectsSelection": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.select": [('PySide2.QtCore.QItemSelection', 'SelectionFlags'), ('PySide2.QtCore.QModelIndex', 'SelectionFlags')],
@@ -1059,7 +1066,7 @@ if "PySide2.QtCore" in sys.modules:
"QJsonArray.count": (),
"QJsonArray.empty": (),
"QJsonArray.first": (),
- "QJsonArray.fromStringList": ('PySide2.support.signature.typing.List',),
+ "QJsonArray.fromStringList": ('List[str]',),
"QJsonArray.fromVariantList": ('list',),
"QJsonArray.insert": ('int', 'PySide2.QtCore.QJsonValue'),
"QJsonArray.isEmpty": (),
@@ -1084,7 +1091,7 @@ if "PySide2.QtCore" in sys.modules:
"QJsonDocument.fromBinaryData": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QJsonDocument.DataValidation'),
"QJsonDocument.fromJson": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QJsonParseError'),
"QJsonDocument.fromRawData": ('str', 'int', 'PySide2.QtCore.QJsonDocument.DataValidation'),
- "QJsonDocument.fromVariant": ('PySide2.support.signature.typing.Any',),
+ "QJsonDocument.fromVariant": ('Any',),
"QJsonDocument.isArray": (),
"QJsonDocument.isEmpty": (),
"QJsonDocument.isNull": (),
@@ -1105,7 +1112,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QJsonValue:
"QJsonValue.__init__": [('PySide2.QtCore.QJsonArray',), ('PySide2.QtCore.QJsonValue',), ('PySide2.QtCore.QJsonValue.Type',), ('bool',), ('dict',), ('float',), ('int',), ('str',)],
"QJsonValue.__copy__": (),
- "QJsonValue.fromVariant": ('PySide2.support.signature.typing.Any',),
+ "QJsonValue.fromVariant": ('Any',),
"QJsonValue.isArray": (),
"QJsonValue.isBool": (),
"QJsonValue.isDouble": (),
@@ -1123,8 +1130,8 @@ if "PySide2.QtCore" in sys.modules:
"QJsonValue.type": (),
# class PySide2.QtCore.QLibraryInfo:
- "QLibraryInfo.buildDate": (),
"QLibraryInfo.build": (),
+ "QLibraryInfo.buildDate": (),
"QLibraryInfo.isDebugBuild": (),
"QLibraryInfo.licensedProducts": (),
"QLibraryInfo.licensee": (),
@@ -1196,7 +1203,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.countriesForLanguage": ('PySide2.QtCore.QLocale.Language',),
"QLocale.country": (),
"QLocale.countryToString": ('PySide2.QtCore.QLocale.Country',),
- "QLocale.createSeparatedList": ('PySide2.support.signature.typing.List',),
+ "QLocale.createSeparatedList": ('List[str]',),
"QLocale.currencySymbol": ('PySide2.QtCore.QLocale.CurrencySymbolFormat',),
"QLocale.dateFormat": ('PySide2.QtCore.QLocale.FormatType',),
"QLocale.dateTimeFormat": ('PySide2.QtCore.QLocale.FormatType',),
@@ -1218,7 +1225,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.percent": (),
"QLocale.pmText": (),
"QLocale.positiveSign": (),
- "QLocale.quoteString": ['PySide2.QtCore.QLocale.QuotationStyle', 'str'],
+ "QLocale.quoteString": ('str', 'PySide2.QtCore.QLocale.QuotationStyle'),
"QLocale.script": (),
"QLocale.scriptToString": ('PySide2.QtCore.QLocale.Script',),
"QLocale.setDefault": ('PySide2.QtCore.QLocale',),
@@ -1238,7 +1245,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.toLongLong": ('str', 'bool'),
"QLocale.toLower": ('str',),
"QLocale.toShort": ('str', 'bool'),
- "QLocale.toString": [('PySide2.QtCore.QDate', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDate', 'str'), ('PySide2.QtCore.QDateTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDateTime', 'str'), ('PySide2.QtCore.QTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QTime', 'str'), ('float', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('int',)],
+ "QLocale.toString": [('PySide2.QtCore.QDate', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDate', 'str'), ('PySide2.QtCore.QDateTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDateTime', 'str'), ('PySide2.QtCore.QTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QTime', 'str'), ('float', 'Union[str, int]', 'int'), ('int',)],
"QLocale.toTime": [('str', 'PySide2.QtCore.QLocale.FormatType'), ('str', 'str')],
"QLocale.toUInt": ('str', 'bool'),
"QLocale.toULongLong": ('str', 'bool'),
@@ -1323,7 +1330,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QMetaObject:
"QMetaObject.__init__": (),
- "QMetaObject.cast": ['PySide2.QtCore.QObject'],
+ "QMetaObject.cast": ('PySide2.QtCore.QObject',),
"QMetaObject.checkConnectArgs": [('PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QMetaMethod'), ('str', 'str')],
"QMetaObject.classInfo": ('int',),
"QMetaObject.classInfoCount": (),
@@ -1389,8 +1396,8 @@ if "PySide2.QtCore" in sys.modules:
"QMetaProperty.type": (),
"QMetaProperty.typeName": (),
"QMetaProperty.userType": (),
- "QMetaProperty.write": ('PySide2.QtCore.QObject', 'PySide2.support.signature.typing.Any'),
- "QMetaProperty.writeOnGadget": ('int', 'PySide2.support.signature.typing.Any'),
+ "QMetaProperty.write": ('PySide2.QtCore.QObject', 'Any'),
+ "QMetaProperty.writeOnGadget": ('int', 'Any'),
# class PySide2.QtCore.QMimeData:
"QMimeData.__init__": (),
@@ -1408,10 +1415,10 @@ if "PySide2.QtCore" in sys.modules:
"QMimeData.imageData": (),
"QMimeData.removeFormat": ('str',),
"QMimeData.retrieveData": ('str', 'type'),
- "QMimeData.setColorData": ('PySide2.support.signature.typing.Any',),
+ "QMimeData.setColorData": ('Any',),
"QMimeData.setData": ('str', 'PySide2.QtCore.QByteArray'),
"QMimeData.setHtml": ('str',),
- "QMimeData.setImageData": ('PySide2.support.signature.typing.Any',),
+ "QMimeData.setImageData": ('Any',),
"QMimeData.setText": ('str',),
"QMimeData.setUrls": ('list',),
"QMimeData.text": (),
@@ -1464,7 +1471,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QMutex:
"QMutex.__init__": ('PySide2.QtCore.QMutex.RecursionMode',),
- "QMutex.isRecursive": [],
+ "QMutex.isRecursive": (),
"QMutex.lock": (),
"QMutex.tryLock": [(), ('int',)],
"QMutex.try_lock": (),
@@ -1483,14 +1490,14 @@ if "PySide2.QtCore" in sys.modules:
"QObject.blockSignals": ('bool',),
"QObject.childEvent": ('PySide2.QtCore.QChildEvent',),
"QObject.children": (),
- "QObject.connect": [('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Callable', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'PySide2.support.signature.typing.Callable', 'PySide2.QtCore.Qt.ConnectionType')],
+ "QObject.connect": [('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'Callable', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'Callable', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType')],
"QObject.connectNotify": ('PySide2.QtCore.QMetaMethod',),
"QObject.customEvent": ('PySide2.QtCore.QEvent',),
"QObject.deleteLater": (),
- "QObject.disconnect": [('PySide2.QtCore.QMetaObject.Connection',), ('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod'), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Callable'), ('str', 'PySide2.QtCore.QObject', 'str'), ('str', 'PySide2.support.signature.typing.Callable')],
+ "QObject.disconnect": [('PySide2.QtCore.QMetaObject.Connection',), ('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod'), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'Callable'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str'), ('str', 'Callable'), ('str', 'PySide2.QtCore.QObject', 'str')],
"QObject.disconnectNotify": ('PySide2.QtCore.QMetaMethod',),
- "QObject.dumpObjectInfo": [],
- "QObject.dumpObjectTree": [],
+ "QObject.dumpObjectInfo": (),
+ "QObject.dumpObjectTree": (),
"QObject.dynamicPropertyNames": (),
"QObject.emit": ('str', '...'),
"QObject.event": ('PySide2.QtCore.QEvent',),
@@ -1515,7 +1522,7 @@ if "PySide2.QtCore" in sys.modules:
"QObject.senderSignalIndex": (),
"QObject.setObjectName": ('str',),
"QObject.setParent": ('PySide2.QtCore.QObject',),
- "QObject.setProperty": ('str', 'PySide2.support.signature.typing.Any'),
+ "QObject.setProperty": ('str', 'Any'),
"QObject.signalsBlocked": (),
"QObject.startTimer": ('int', 'PySide2.QtCore.Qt.TimerType'),
"QObject.thread": (),
@@ -1603,7 +1610,7 @@ if "PySide2.QtCore" in sys.modules:
"QProcess.closeReadChannel": ('PySide2.QtCore.QProcess.ProcessChannel',),
"QProcess.closeWriteChannel": (),
"QProcess.environment": (),
- "QProcess.execute": [('str',), ('str', 'PySide2.support.signature.typing.List')],
+ "QProcess.execute": [('str',), ('str', 'List[str]')],
"QProcess.exitCode": (),
"QProcess.exitStatus": (),
"QProcess.inputChannelMode": (),
@@ -1620,8 +1627,8 @@ if "PySide2.QtCore" in sys.modules:
"QProcess.readAllStandardOutput": (),
"QProcess.readChannel": (),
"QProcess.readData": ('str', 'int'),
- "QProcess.setArguments": ('PySide2.support.signature.typing.List',),
- "QProcess.setEnvironment": ('PySide2.support.signature.typing.List',),
+ "QProcess.setArguments": ('List[str]',),
+ "QProcess.setEnvironment": ('List[str]',),
"QProcess.setInputChannelMode": ('PySide2.QtCore.QProcess.InputChannelMode',),
"QProcess.setProcessChannelMode": ('PySide2.QtCore.QProcess.ProcessChannelMode',),
"QProcess.setProcessEnvironment": ('PySide2.QtCore.QProcessEnvironment',),
@@ -1634,8 +1641,8 @@ if "PySide2.QtCore" in sys.modules:
"QProcess.setStandardOutputProcess": ('PySide2.QtCore.QProcess',),
"QProcess.setWorkingDirectory": ('str',),
"QProcess.setupChildProcess": (),
- "QProcess.start": [('OpenMode',), ('str', 'OpenMode'), ('str', 'PySide2.support.signature.typing.List', 'OpenMode')],
- "QProcess.startDetached": [('str',), ('str', 'PySide2.support.signature.typing.List'), ('str', 'PySide2.support.signature.typing.List', 'str', 'int')],
+ "QProcess.start": [('OpenMode',), ('str', 'List[str]', 'OpenMode'), ('str', 'OpenMode')],
+ "QProcess.startDetached": [('str',), ('str', 'List[str]'), ('str', 'List[str]', 'str', 'int')],
"QProcess.state": (),
"QProcess.systemEnvironment": (),
"QProcess.terminate": (),
@@ -1667,7 +1674,7 @@ if "PySide2.QtCore" in sys.modules:
"QPropertyAnimation.setPropertyName": ('PySide2.QtCore.QByteArray',),
"QPropertyAnimation.setTargetObject": ('PySide2.QtCore.QObject',),
"QPropertyAnimation.targetObject": (),
- "QPropertyAnimation.updateCurrentValue": ('PySide2.support.signature.typing.Any',),
+ "QPropertyAnimation.updateCurrentValue": ('Any',),
"QPropertyAnimation.updateState": ('PySide2.QtCore.QAbstractAnimation.State', 'PySide2.QtCore.QAbstractAnimation.State'),
# class PySide2.QtCore.QReadLocker:
@@ -1814,11 +1821,11 @@ if "PySide2.QtCore" in sys.modules:
"QRegExp.__init__": [(), ('PySide2.QtCore.QRegExp',), ('str', 'PySide2.QtCore.Qt.CaseSensitivity', 'PySide2.QtCore.QRegExp.PatternSyntax')],
"QRegExp.__copy__": (),
"QRegExp.__reduce__": (),
- "QRegExp.cap": ['int'],
+ "QRegExp.cap": ('int',),
"QRegExp.captureCount": (),
- "QRegExp.capturedTexts": [],
+ "QRegExp.capturedTexts": (),
"QRegExp.caseSensitivity": (),
- "QRegExp.errorString": [],
+ "QRegExp.errorString": (),
"QRegExp.escape": ('str',),
"QRegExp.exactMatch": ('str',),
"QRegExp.indexIn": ('str', 'int', 'PySide2.QtCore.QRegExp.CaretMode'),
@@ -1829,7 +1836,7 @@ if "PySide2.QtCore" in sys.modules:
"QRegExp.matchedLength": (),
"QRegExp.pattern": (),
"QRegExp.patternSyntax": (),
- "QRegExp.pos": ['int'],
+ "QRegExp.pos": ('int',),
"QRegExp.replace": ('str', 'str'),
"QRegExp.setCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QRegExp.setMinimal": ('bool',),
@@ -1843,9 +1850,9 @@ if "PySide2.QtCore" in sys.modules:
"QRegularExpression.captureCount": (),
"QRegularExpression.errorString": (),
"QRegularExpression.escape": ('str',),
- "QRegularExpression.globalMatch": ['MatchOptions', 'PySide2.QtCore.QRegularExpression.MatchType', 'int', 'str'],
+ "QRegularExpression.globalMatch": ('str', 'int', 'PySide2.QtCore.QRegularExpression.MatchType', 'MatchOptions'),
"QRegularExpression.isValid": (),
- "QRegularExpression.match": ['MatchOptions', 'PySide2.QtCore.QRegularExpression.MatchType', 'int', 'str'],
+ "QRegularExpression.match": ('str', 'int', 'PySide2.QtCore.QRegularExpression.MatchType', 'MatchOptions'),
"QRegularExpression.namedCaptureGroups": (),
"QRegularExpression.optimize": (),
"QRegularExpression.pattern": (),
@@ -1880,7 +1887,6 @@ if "PySide2.QtCore" in sys.modules:
"QRegularExpressionMatchIterator.isValid": (),
"QRegularExpressionMatchIterator.matchOptions": (),
"QRegularExpressionMatchIterator.matchType": (),
- "QRegularExpressionMatchIterator.next": (),
"QRegularExpressionMatchIterator.peekNext": (),
"QRegularExpressionMatchIterator.regularExpression": (),
"QRegularExpressionMatchIterator.swap": ('PySide2.QtCore.QRegularExpressionMatchIterator',),
@@ -1899,13 +1905,13 @@ if "PySide2.QtCore" in sys.modules:
"QResource.lastModified": (),
"QResource.locale": (),
"QResource.registerResource": ('str', 'str'),
- "QResource.registerResourceData": ('PySide2.support.signature.typing.Union[str, int]', 'str'),
+ "QResource.registerResourceData": ('Union[str, int]', 'str'),
"QResource.searchPaths": (),
"QResource.setFileName": ('str',),
"QResource.setLocale": ('PySide2.QtCore.QLocale',),
"QResource.size": (),
"QResource.unregisterResource": ('str', 'str'),
- "QResource.unregisterResourceData": ('PySide2.support.signature.typing.Union[str, int]', 'str'),
+ "QResource.unregisterResourceData": ('Union[str, int]', 'str'),
# class PySide2.QtCore.QRunnable:
"QRunnable.__init__": (),
@@ -1972,10 +1978,10 @@ if "PySide2.QtCore" in sys.modules:
"QSettings.setFallbacksEnabled": ('bool',),
"QSettings.setIniCodec": [('PySide2.QtCore.QTextCodec',), ('str',)],
"QSettings.setPath": ('PySide2.QtCore.QSettings.Format', 'PySide2.QtCore.QSettings.Scope', 'str'),
- "QSettings.setValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QSettings.setValue": ('str', 'Any'),
"QSettings.status": (),
"QSettings.sync": (),
- "QSettings.value": ('str', 'PySide2.support.signature.typing.Any'),
+ "QSettings.value": ('str', 'Any'),
# class PySide2.QtCore.QSignalMapper:
"QSignalMapper.__init__": ('PySide2.QtCore.QObject',),
@@ -2070,14 +2076,14 @@ if "PySide2.QtCore" in sys.modules:
"QSortFilterProxyModel.mapSelectionFromSource": ('PySide2.QtCore.QItemSelection',),
"QSortFilterProxyModel.mapSelectionToSource": ('PySide2.QtCore.QItemSelection',),
"QSortFilterProxyModel.mapToSource": ('PySide2.QtCore.QModelIndex',),
- "QSortFilterProxyModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'PySide2.support.signature.typing.Any', 'int', 'MatchFlags'),
- "QSortFilterProxyModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QSortFilterProxyModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'Any', 'int', 'MatchFlags'),
+ "QSortFilterProxyModel.mimeData": ('List[int]',),
"QSortFilterProxyModel.mimeTypes": (),
"QSortFilterProxyModel.parent": [(), ('PySide2.QtCore.QModelIndex',)],
"QSortFilterProxyModel.removeColumns": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QSortFilterProxyModel.removeRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QSortFilterProxyModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QSortFilterProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSortFilterProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QSortFilterProxyModel.setDynamicSortFilter": ('bool',),
"QSortFilterProxyModel.setFilterCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QSortFilterProxyModel.setFilterFixedString": ('str',),
@@ -2085,7 +2091,7 @@ if "PySide2.QtCore" in sys.modules:
"QSortFilterProxyModel.setFilterRegExp": [('PySide2.QtCore.QRegExp',), ('str',)],
"QSortFilterProxyModel.setFilterRole": ('int',),
"QSortFilterProxyModel.setFilterWildcard": ('str',),
- "QSortFilterProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSortFilterProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QSortFilterProxyModel.setSortCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QSortFilterProxyModel.setSortLocaleAware": ('bool',),
"QSortFilterProxyModel.setSortRole": ('int',),
@@ -2100,20 +2106,20 @@ if "PySide2.QtCore" in sys.modules:
"QSortFilterProxyModel.supportedDropActions": (),
# class PySide2.QtCore.QStandardPaths:
- "QStandardPaths.writableLocation": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
"QStandardPaths.displayName": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
"QStandardPaths.enableTestMode": ('bool',),
- "QStandardPaths.findExecutable": ('str', 'PySide2.support.signature.typing.List'),
+ "QStandardPaths.findExecutable": ('str', 'List[str]'),
"QStandardPaths.isTestModeEnabled": (),
"QStandardPaths.locate": ('PySide2.QtCore.QStandardPaths.StandardLocation', 'str', 'LocateOptions'),
"QStandardPaths.locateAll": ('PySide2.QtCore.QStandardPaths.StandardLocation', 'str', 'LocateOptions'),
"QStandardPaths.setTestModeEnabled": ('bool',),
"QStandardPaths.standardLocations": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
+ "QStandardPaths.writableLocation": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
# class PySide2.QtCore.QState:
"QState.__init__": [('PySide2.QtCore.QState',), ('PySide2.QtCore.QState.ChildMode', 'PySide2.QtCore.QState')],
"QState.addTransition": [('PySide2.QtCore.QAbstractState',), ('PySide2.QtCore.QAbstractTransition',), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QAbstractState'), ('object', 'PySide2.QtCore.QAbstractState')],
- "QState.assignProperty": ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any'),
+ "QState.assignProperty": ('PySide2.QtCore.QObject', 'str', 'Any'),
"QState.childMode": (),
"QState.errorState": (),
"QState.event": ('PySide2.QtCore.QEvent',),
@@ -2134,7 +2140,7 @@ if "PySide2.QtCore" in sys.modules:
"QStateMachine.beginSelectTransitions": ('PySide2.QtCore.QEvent',),
"QStateMachine.cancelDelayedEvent": ('int',),
"QStateMachine.clearError": (),
- "QStateMachine.configuration": [],
+ "QStateMachine.configuration": (),
"QStateMachine.defaultAnimations": (),
"QStateMachine.endMicrostep": ('PySide2.QtCore.QEvent',),
"QStateMachine.endSelectTransitions": ('PySide2.QtCore.QEvent',),
@@ -2243,7 +2249,7 @@ if "PySide2.QtCore" in sys.modules:
"QTextCodec.aliases": (),
"QTextCodec.availableCodecs": (),
"QTextCodec.availableMibs": (),
- "QTextCodec.canEncode": [('PySide2.support.signature.typing.Union[str, int]',), ('str',)],
+ "QTextCodec.canEncode": [('Union[str, int]',), ('str',)],
"QTextCodec.codecForHtml": [('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QTextCodec')],
"QTextCodec.codecForLocale": (),
"QTextCodec.codecForMib": ('int',),
@@ -2300,7 +2306,7 @@ if "PySide2.QtCore" in sys.modules:
"QTextStream.setIntegerBase": ('int',),
"QTextStream.setLocale": ('PySide2.QtCore.QLocale',),
"QTextStream.setNumberFlags": ('NumberFlags',),
- "QTextStream.setPadChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QTextStream.setPadChar": ('Union[str, int]',),
"QTextStream.setRealNumberNotation": ('PySide2.QtCore.QTextStream.RealNumberNotation',),
"QTextStream.setRealNumberPrecision": ('int',),
"QTextStream.setStatus": ('PySide2.QtCore.QTextStream.Status',),
@@ -2309,8 +2315,8 @@ if "PySide2.QtCore" in sys.modules:
"QTextStream.string": (),
# class PySide2.QtCore.QTextStreamManipulator:
- "QTextStreamManipulator.exec_": ('PySide2.QtCore.QTextStream',),
"QTextStreamManipulator.__copy__": (),
+ "QTextStreamManipulator.exec_": ('PySide2.QtCore.QTextStream',),
# class PySide2.QtCore.QThread:
"QThread.__init__": ('PySide2.QtCore.QObject',),
@@ -2456,7 +2462,7 @@ if "PySide2.QtCore" in sys.modules:
"QTimer.setInterval": ('int',),
"QTimer.setSingleShot": ('bool',),
"QTimer.setTimerType": ('PySide2.QtCore.Qt.TimerType',),
- "QTimer.singleShot": [('int', 'PySide2.QtCore.QObject', 'str'), ('int', 'PySide2.QtCore.Qt.TimerType', 'PySide2.QtCore.QObject', 'str'), ('int', 'PySide2.support.signature.typing.Callable')],
+ "QTimer.singleShot": [('int', 'Callable'), ('int', 'PySide2.QtCore.QObject', 'str'), ('int', 'PySide2.QtCore.Qt.TimerType', 'PySide2.QtCore.QObject', 'str')],
"QTimer.start": [(), ('int',)],
"QTimer.stop": (),
"QTimer.timerEvent": ('PySide2.QtCore.QTimerEvent',),
@@ -2470,7 +2476,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QTranslator:
"QTranslator.__init__": ('PySide2.QtCore.QObject',),
"QTranslator.isEmpty": (),
- "QTranslator.load": [('PySide2.QtCore.QLocale', 'str', 'str', 'str', 'str'), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'str'), ('str', 'str', 'str', 'str')],
+ "QTranslator.load": [('PySide2.QtCore.QLocale', 'str', 'str', 'str', 'str'), ('Union[str, int]', 'int', 'str'), ('str', 'str', 'str', 'str')],
"QTranslator.translate": ('str', 'str', 'str', 'int'),
# class PySide2.QtCore.QUrl:
@@ -2487,7 +2493,7 @@ if "PySide2.QtCore" in sys.modules:
"QUrl.fromEncoded": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.fromLocalFile": ('str',),
"QUrl.fromPercentEncoding": ('PySide2.QtCore.QByteArray',),
- "QUrl.fromStringList": ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QUrl.ParsingMode'),
+ "QUrl.fromStringList": ('List[str]', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.fromUserInput": [('str',), ('str', 'str', 'UserInputResolutionOptions')],
"QUrl.hasFragment": (),
"QUrl.hasQuery": (),
@@ -2508,7 +2514,7 @@ if "PySide2.QtCore" in sys.modules:
"QUrl.setAuthority": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setFragment": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setHost": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
- "QUrl.setIdnWhitelist": ('PySide2.support.signature.typing.List',),
+ "QUrl.setIdnWhitelist": ('List[str]',),
"QUrl.setPassword": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setPath": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setPort": ('int',),
@@ -2548,13 +2554,13 @@ if "PySide2.QtCore" in sys.modules:
"QUrlQuery.removeAllQueryItems": ('str',),
"QUrlQuery.removeQueryItem": ('str',),
"QUrlQuery.setQuery": ('str',),
- "QUrlQuery.setQueryDelimiters": ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QUrlQuery.setQueryDelimiters": ('Union[str, int]', 'Union[str, int]'),
"QUrlQuery.setQueryItems": ('list',),
"QUrlQuery.swap": ('PySide2.QtCore.QUrlQuery',),
"QUrlQuery.toString": ('PySide2.QtCore.QUrl.ComponentFormattingOption',),
# class PySide2.QtCore.QUuid:
- "QUuid.__init__": [(), ('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QUuid',), ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'), ('str',)],
+ "QUuid.__init__": [(), ('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QUuid',), ('int', 'int', 'int', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]'), ('str',)],
"QUuid.__copy__": (),
"QUuid.__reduce__": (),
"QUuid.createUuid": (),
@@ -2575,16 +2581,16 @@ if "PySide2.QtCore" in sys.modules:
"QVariantAnimation.easingCurve": (),
"QVariantAnimation.endValue": (),
"QVariantAnimation.event": ('PySide2.QtCore.QEvent',),
- "QVariantAnimation.interpolated": ('PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'float'),
+ "QVariantAnimation.interpolated": ('Any', 'Any', 'float'),
"QVariantAnimation.keyValueAt": ('float',),
"QVariantAnimation.setDuration": ('int',),
"QVariantAnimation.setEasingCurve": ('PySide2.QtCore.QEasingCurve',),
- "QVariantAnimation.setEndValue": ('PySide2.support.signature.typing.Any',),
- "QVariantAnimation.setKeyValueAt": ('float', 'PySide2.support.signature.typing.Any'),
- "QVariantAnimation.setStartValue": ('PySide2.support.signature.typing.Any',),
+ "QVariantAnimation.setEndValue": ('Any',),
+ "QVariantAnimation.setKeyValueAt": ('float', 'Any'),
+ "QVariantAnimation.setStartValue": ('Any',),
"QVariantAnimation.startValue": (),
"QVariantAnimation.updateCurrentTime": ('int',),
- "QVariantAnimation.updateCurrentValue": ('PySide2.support.signature.typing.Any',),
+ "QVariantAnimation.updateCurrentValue": ('Any',),
"QVariantAnimation.updateState": ('PySide2.QtCore.QAbstractAnimation.State', 'PySide2.QtCore.QAbstractAnimation.State'),
# class PySide2.QtCore.QVersionNumber:
@@ -2643,18 +2649,18 @@ if "PySide2.QtCore" in sys.modules:
"QXmlStreamAttributes.constLast": (),
"QXmlStreamAttributes.contains": ('PySide2.QtCore.QXmlStreamAttribute',),
"QXmlStreamAttributes.count": [(), ('PySide2.QtCore.QXmlStreamAttribute',)],
- "QXmlStreamAttributes.data": [],
+ "QXmlStreamAttributes.data": (),
"QXmlStreamAttributes.empty": (),
"QXmlStreamAttributes.endsWith": ('PySide2.QtCore.QXmlStreamAttribute',),
"QXmlStreamAttributes.fill": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
- "QXmlStreamAttributes.first": [],
+ "QXmlStreamAttributes.first": (),
"QXmlStreamAttributes.front": (),
"QXmlStreamAttributes.hasAttribute": [('str',), ('str', 'str')],
"QXmlStreamAttributes.indexOf": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
"QXmlStreamAttributes.insert": [('int', 'PySide2.QtCore.QXmlStreamAttribute'), ('int', 'int', 'PySide2.QtCore.QXmlStreamAttribute')],
"QXmlStreamAttributes.isEmpty": (),
"QXmlStreamAttributes.isSharedWith": ('list',),
- "QXmlStreamAttributes.last": [],
+ "QXmlStreamAttributes.last": (),
"QXmlStreamAttributes.lastIndexOf": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
"QXmlStreamAttributes.length": (),
"QXmlStreamAttributes.mid": ('int', 'int'),
@@ -2790,10 +2796,6 @@ if "PySide2.QtCore" in sys.modules:
"QXmlStreamWriter.writeStartElement": [('str',), ('str', 'str')],
"QXmlStreamWriter.writeTextElement": [('str', 'str'), ('str', 'str', 'str')],
- # class PySide2.QtCore.Qt:
- "Qt.qt_getEnumName": [('Alignment',), ('DockWidgetAreas',), ('DropActions',), ('Edges',), ('ImageConversionFlags',), ('InputMethodHints',), ('InputMethodQueries',), ('ItemFlags',), ('KeyboardModifiers',), ('MatchFlags',), ('MouseButtons',), ('Orientations',), ('PySide2.QtCore.Qt.ApplicationAttribute',), ('PySide2.QtCore.Qt.ApplicationState',), ('PySide2.QtCore.Qt.ArrowType',), ('PySide2.QtCore.Qt.AspectRatioMode',), ('PySide2.QtCore.Qt.Axis',), ('PySide2.QtCore.Qt.BGMode',), ('PySide2.QtCore.Qt.BrushStyle',), ('PySide2.QtCore.Qt.CaseSensitivity',), ('PySide2.QtCore.Qt.CheckState',), ('PySide2.QtCore.Qt.ChecksumType',), ('PySide2.QtCore.Qt.ClipOperation',), ('PySide2.QtCore.Qt.ConnectionType',), ('PySide2.QtCore.Qt.ContextMenuPolicy',), ('PySide2.QtCore.Qt.Corner',), ('PySide2.QtCore.Qt.CursorMoveStyle',), ('PySide2.QtCore.Qt.CursorShape',), ('PySide2.QtCore.Qt.DateFormat',), ('PySide2.QtCore.Qt.DayOfWeek',), ('PySide2.QtCore.Qt.DockWidgetArea',), ('PySide2.QtCore.Qt.DropAction',), ('PySide2.QtCore.Qt.Edge',), ('PySide2.QtCore.Qt.EnterKeyType',), ('PySide2.QtCore.Qt.FillRule',), ('PySide2.QtCore.Qt.FocusPolicy',), ('PySide2.QtCore.Qt.FocusReason',), ('PySide2.QtCore.Qt.GestureState',), ('PySide2.QtCore.Qt.GestureType',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtCore.Qt.InputMethodHint',), ('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.ItemDataRole',), ('PySide2.QtCore.Qt.ItemSelectionMode',), ('PySide2.QtCore.Qt.ItemSelectionOperation',), ('PySide2.QtCore.Qt.Key',), ('PySide2.QtCore.Qt.LayoutDirection',), ('PySide2.QtCore.Qt.MaskMode',), ('PySide2.QtCore.Qt.MouseEventFlag',), ('PySide2.QtCore.Qt.MouseEventSource',), ('PySide2.QtCore.Qt.NativeGestureType',), ('PySide2.QtCore.Qt.Orientation',), ('PySide2.QtCore.Qt.PenCapStyle',), ('PySide2.QtCore.Qt.PenJoinStyle',), ('PySide2.QtCore.Qt.PenStyle',), ('PySide2.QtCore.Qt.ScreenOrientation',), ('PySide2.QtCore.Qt.ScrollBarPolicy',), ('PySide2.QtCore.Qt.ScrollPhase',), ('PySide2.QtCore.Qt.ShortcutContext',), ('PySide2.QtCore.Qt.SizeHint',), ('PySide2.QtCore.Qt.SizeMode',), ('PySide2.QtCore.Qt.SortOrder',), ('PySide2.QtCore.Qt.TabFocusBehavior',), ('PySide2.QtCore.Qt.TextElideMode',), ('PySide2.QtCore.Qt.TextFlag',), ('PySide2.QtCore.Qt.TextFormat',), ('PySide2.QtCore.Qt.TextInteractionFlag',), ('PySide2.QtCore.Qt.TimeSpec',), ('PySide2.QtCore.Qt.TimerType',), ('PySide2.QtCore.Qt.ToolBarArea',), ('PySide2.QtCore.Qt.ToolButtonStyle',), ('PySide2.QtCore.Qt.TransformationMode',), ('PySide2.QtCore.Qt.WidgetAttribute',), ('PySide2.QtCore.Qt.WindowModality',), ('PySide2.QtCore.Qt.WindowState',), ('PySide2.QtCore.Qt.WindowType',), ('ScreenOrientations',), ('TextInteractionFlags',), ('ToolBarAreas',), ('TouchPointStates',), ('WindowFlags',), ('WindowStates',)],
- "Qt.qt_getEnumMetaObject": [('Alignment',), ('DockWidgetAreas',), ('DropActions',), ('Edges',), ('ImageConversionFlags',), ('InputMethodHints',), ('InputMethodQueries',), ('ItemFlags',), ('KeyboardModifiers',), ('MatchFlags',), ('MouseButtons',), ('Orientations',), ('PySide2.QtCore.Qt.ApplicationAttribute',), ('PySide2.QtCore.Qt.ApplicationState',), ('PySide2.QtCore.Qt.ArrowType',), ('PySide2.QtCore.Qt.AspectRatioMode',), ('PySide2.QtCore.Qt.Axis',), ('PySide2.QtCore.Qt.BGMode',), ('PySide2.QtCore.Qt.BrushStyle',), ('PySide2.QtCore.Qt.CaseSensitivity',), ('PySide2.QtCore.Qt.CheckState',), ('PySide2.QtCore.Qt.ChecksumType',), ('PySide2.QtCore.Qt.ClipOperation',), ('PySide2.QtCore.Qt.ConnectionType',), ('PySide2.QtCore.Qt.ContextMenuPolicy',), ('PySide2.QtCore.Qt.Corner',), ('PySide2.QtCore.Qt.CursorMoveStyle',), ('PySide2.QtCore.Qt.CursorShape',), ('PySide2.QtCore.Qt.DateFormat',), ('PySide2.QtCore.Qt.DayOfWeek',), ('PySide2.QtCore.Qt.DockWidgetArea',), ('PySide2.QtCore.Qt.DropAction',), ('PySide2.QtCore.Qt.Edge',), ('PySide2.QtCore.Qt.EnterKeyType',), ('PySide2.QtCore.Qt.FillRule',), ('PySide2.QtCore.Qt.FocusPolicy',), ('PySide2.QtCore.Qt.FocusReason',), ('PySide2.QtCore.Qt.GestureState',), ('PySide2.QtCore.Qt.GestureType',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtCore.Qt.InputMethodHint',), ('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.ItemDataRole',), ('PySide2.QtCore.Qt.ItemSelectionMode',), ('PySide2.QtCore.Qt.ItemSelectionOperation',), ('PySide2.QtCore.Qt.Key',), ('PySide2.QtCore.Qt.LayoutDirection',), ('PySide2.QtCore.Qt.MaskMode',), ('PySide2.QtCore.Qt.MouseEventFlag',), ('PySide2.QtCore.Qt.MouseEventSource',), ('PySide2.QtCore.Qt.NativeGestureType',), ('PySide2.QtCore.Qt.Orientation',), ('PySide2.QtCore.Qt.PenCapStyle',), ('PySide2.QtCore.Qt.PenJoinStyle',), ('PySide2.QtCore.Qt.PenStyle',), ('PySide2.QtCore.Qt.ScreenOrientation',), ('PySide2.QtCore.Qt.ScrollBarPolicy',), ('PySide2.QtCore.Qt.ScrollPhase',), ('PySide2.QtCore.Qt.ShortcutContext',), ('PySide2.QtCore.Qt.SizeHint',), ('PySide2.QtCore.Qt.SizeMode',), ('PySide2.QtCore.Qt.SortOrder',), ('PySide2.QtCore.Qt.TabFocusBehavior',), ('PySide2.QtCore.Qt.TextElideMode',), ('PySide2.QtCore.Qt.TextFlag',), ('PySide2.QtCore.Qt.TextFormat',), ('PySide2.QtCore.Qt.TextInteractionFlag',), ('PySide2.QtCore.Qt.TimeSpec',), ('PySide2.QtCore.Qt.TimerType',), ('PySide2.QtCore.Qt.ToolBarArea',), ('PySide2.QtCore.Qt.ToolButtonStyle',), ('PySide2.QtCore.Qt.TransformationMode',), ('PySide2.QtCore.Qt.WidgetAttribute',), ('PySide2.QtCore.Qt.WindowModality',), ('PySide2.QtCore.Qt.WindowState',), ('PySide2.QtCore.Qt.WindowType',), ('ScreenOrientations',), ('TextInteractionFlags',), ('ToolBarAreas',), ('TouchPointStates',), ('WindowFlags',), ('WindowStates',)],
-
# class PySide2.QtCore.QtMsgType:
# class PySide2.QtCore.Signal:
@@ -2837,13 +2839,13 @@ if "PySide2.QtGui" in sys.modules:
"QAbstractTextDocumentLayout.unregisterHandler": ('int', 'PySide2.QtCore.QObject'),
# class PySide2.QtGui.QAccessible:
- "QAccessible.queryAccessibleInterface": ('PySide2.QtCore.QObject',),
"QAccessible.__copy__": (),
"QAccessible.accessibleInterface": ('int',),
"QAccessible.cleanup": (),
"QAccessible.deleteAccessibleInterface": ('int',),
"QAccessible.isActive": (),
"QAccessible.qAccessibleTextBoundaryHelper": ('PySide2.QtGui.QTextCursor', 'PySide2.QtGui.QAccessible.TextBoundaryType'),
+ "QAccessible.queryAccessibleInterface": ('PySide2.QtCore.QObject',),
"QAccessible.registerAccessibleInterface": ('PySide2.QtGui.QAccessibleInterface',),
"QAccessible.setActive": ('bool',),
"QAccessible.setRootObject": ('PySide2.QtCore.QObject',),
@@ -2900,8 +2902,8 @@ if "PySide2.QtGui" in sys.modules:
"QBitmap.__init__": [(), ('PySide2.QtCore.QSize',), ('PySide2.QtGui.QBitmap',), ('PySide2.QtGui.QPixmap',), ('int', 'int'), ('str', 'str')],
"QBitmap.__copy__": (),
"QBitmap.clear": (),
- "QBitmap.fromData": ('PySide2.QtCore.QSize', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.QtGui.QImage.Format'),
- "QBitmap.fromImage": ['ImageConversionFlags', 'PySide2.QtGui.QImage'],
+ "QBitmap.fromData": ('PySide2.QtCore.QSize', 'Union[str, int]', 'PySide2.QtGui.QImage.Format'),
+ "QBitmap.fromImage": ('PySide2.QtGui.QImage', 'ImageConversionFlags'),
"QBitmap.swap": [('PySide2.QtGui.QBitmap',), ('PySide2.QtGui.QPixmap',)],
"QBitmap.transformed": [('PySide2.QtGui.QMatrix',), ('PySide2.QtGui.QMatrix', 'PySide2.QtCore.Qt.TransformationMode'), ('PySide2.QtGui.QTransform',)],
@@ -2925,7 +2927,6 @@ if "PySide2.QtGui" in sys.modules:
"QBrush.transform": (),
# class PySide2.QtGui.QClipboard:
- "QClipboard.setMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.clear": ('PySide2.QtGui.QClipboard.Mode',),
"QClipboard.image": ('PySide2.QtGui.QClipboard.Mode',),
"QClipboard.mimeData": ('PySide2.QtGui.QClipboard.Mode',),
@@ -2934,6 +2935,7 @@ if "PySide2.QtGui" in sys.modules:
"QClipboard.ownsSelection": (),
"QClipboard.pixmap": ('PySide2.QtGui.QClipboard.Mode',),
"QClipboard.setImage": ('PySide2.QtGui.QImage', 'PySide2.QtGui.QClipboard.Mode'),
+ "QClipboard.setMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.setPixmap": ('PySide2.QtGui.QPixmap', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.setText": ('str', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.supportsFindBuffer": (),
@@ -2944,7 +2946,7 @@ if "PySide2.QtGui" in sys.modules:
"QCloseEvent.__init__": (),
# class PySide2.QtGui.QColor:
- "QColor.__init__": [(), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtGui.QColor',), ('PySide2.support.signature.typing.Any',), ('int',), ('int', 'int', 'int', 'int'), ('str',)],
+ "QColor.__init__": [(), ('Any',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtGui.QColor',), ('int',), ('int', 'int', 'int', 'int'), ('str',)],
"QColor.__copy__": (),
"QColor.__reduce__": (),
"QColor.__setstate__": ('object',),
@@ -3044,9 +3046,9 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QContextMenuEvent:
"QContextMenuEvent.__init__": [('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint'), ('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'), ('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint', 'KeyboardModifiers')],
- "QContextMenuEvent.global"+"Y": (),
"QContextMenuEvent.globalPos": (),
"QContextMenuEvent.globalX": (),
+ "QContextMenuEvent.global""Y": (),
"QContextMenuEvent.pos": (),
"QContextMenuEvent.reason": (),
"QContextMenuEvent.x": (),
@@ -3130,9 +3132,9 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QEnterEvent:
"QEnterEvent.__init__": ('PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF'),
- "QEnterEvent.global"+"Y": (),
"QEnterEvent.globalPos": (),
"QEnterEvent.globalX": (),
+ "QEnterEvent.global""Y": (),
"QEnterEvent.localPos": (),
"QEnterEvent.pos": (),
"QEnterEvent.screenPos": (),
@@ -3171,7 +3173,7 @@ if "PySide2.QtGui" in sys.modules:
"QFont.hintingPreference": (),
"QFont.initialize": (),
"QFont.insertSubstitution": ('str', 'str'),
- "QFont.insertSubstitutions": ('str', 'PySide2.support.signature.typing.List'),
+ "QFont.insertSubstitutions": ('str', 'List[str]'),
"QFont.isCopyOf": ('PySide2.QtGui.QFont',),
"QFont.italic": (),
"QFont.kerning": (),
@@ -3283,30 +3285,30 @@ if "PySide2.QtGui" in sys.modules:
"QFontMetrics.ascent": (),
"QFontMetrics.averageCharWidth": (),
"QFontMetrics.boundingRect": [('PySide2.QtCore.QRect', 'int', 'str', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'str', 'int', 'int'), ('str',)],
- "QFontMetrics.boundingRectChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.boundingRectChar": ('Union[str, int]',),
"QFontMetrics.capHeight": (),
"QFontMetrics.charWidth": ('str', 'int'),
"QFontMetrics.descent": (),
"QFontMetrics.elidedText": ('str', 'PySide2.QtCore.Qt.TextElideMode', 'int', 'int'),
"QFontMetrics.height": (),
- "QFontMetrics.inFont": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.inFont": ('Union[str, int]',),
"QFontMetrics.inFontUcs4": ('int',),
"QFontMetrics.leading": (),
- "QFontMetrics.leftBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.leftBearing": ('Union[str, int]',),
"QFontMetrics.lineSpacing": (),
"QFontMetrics.lineWidth": (),
"QFontMetrics.maxWidth": (),
"QFontMetrics.minLeftBearing": (),
"QFontMetrics.minRightBearing": (),
"QFontMetrics.overlinePos": (),
- "QFontMetrics.rightBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.rightBearing": ('Union[str, int]',),
"QFontMetrics.size": ('int', 'str', 'int', 'int'),
"QFontMetrics.strikeOutPos": (),
"QFontMetrics.swap": ('PySide2.QtGui.QFontMetrics',),
"QFontMetrics.tightBoundingRect": ('str',),
"QFontMetrics.underlinePos": (),
"QFontMetrics.width": [('str', 'int'), ('str', 'int', 'int')],
- "QFontMetrics.widthChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.widthChar": ('Union[str, int]',),
"QFontMetrics.xHeight": (),
# class PySide2.QtGui.QFontMetricsF:
@@ -3315,29 +3317,29 @@ if "PySide2.QtGui" in sys.modules:
"QFontMetricsF.ascent": (),
"QFontMetricsF.averageCharWidth": (),
"QFontMetricsF.boundingRect": [('PySide2.QtCore.QRectF', 'int', 'str', 'int', 'int'), ('str',)],
- "QFontMetricsF.boundingRectChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.boundingRectChar": ('Union[str, int]',),
"QFontMetricsF.capHeight": (),
"QFontMetricsF.descent": (),
"QFontMetricsF.elidedText": ('str', 'PySide2.QtCore.Qt.TextElideMode', 'float', 'int'),
"QFontMetricsF.height": (),
- "QFontMetricsF.inFont": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.inFont": ('Union[str, int]',),
"QFontMetricsF.inFontUcs4": ('int',),
"QFontMetricsF.leading": (),
- "QFontMetricsF.leftBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.leftBearing": ('Union[str, int]',),
"QFontMetricsF.lineSpacing": (),
"QFontMetricsF.lineWidth": (),
"QFontMetricsF.maxWidth": (),
"QFontMetricsF.minLeftBearing": (),
"QFontMetricsF.minRightBearing": (),
"QFontMetricsF.overlinePos": (),
- "QFontMetricsF.rightBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.rightBearing": ('Union[str, int]',),
"QFontMetricsF.size": ('int', 'str', 'int', 'int'),
"QFontMetricsF.strikeOutPos": (),
"QFontMetricsF.swap": ('PySide2.QtGui.QFontMetricsF',),
"QFontMetricsF.tightBoundingRect": ('str',),
"QFontMetricsF.underlinePos": (),
"QFontMetricsF.width": ('str',),
- "QFontMetricsF.widthChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.widthChar": ('Union[str, int]',),
"QFontMetricsF.xHeight": (),
# class PySide2.QtGui.QGradient:
@@ -3355,7 +3357,7 @@ if "PySide2.QtGui" in sys.modules:
"QGradient.type": (),
# class PySide2.QtGui.QGuiApplication:
- "QGuiApplication.__init__": ('PySide2.support.signature.typing.List',),
+ "QGuiApplication.__init__": ('List[str]',),
"QGuiApplication.allWindows": (),
"QGuiApplication.applicationDisplayName": (),
"QGuiApplication.applicationState": (),
@@ -3407,9 +3409,9 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QHelpEvent:
"QHelpEvent.__init__": ('PySide2.QtCore.QEvent.Type', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'),
- "QHelpEvent.global"+"Y": (),
"QHelpEvent.globalPos": (),
"QHelpEvent.globalX": (),
+ "QHelpEvent.global""Y": (),
"QHelpEvent.pos": (),
"QHelpEvent.x": (),
"QHelpEvent.y": (),
@@ -3441,7 +3443,7 @@ if "PySide2.QtGui" in sys.modules:
"QIcon.pixmap": [('PySide2.QtCore.QSize', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State'), ('PySide2.QtGui.QWindow', 'PySide2.QtCore.QSize', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State'), ('int', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State'), ('int', 'int', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State')],
"QIcon.setIsMask": ('bool',),
"QIcon.setThemeName": ('str',),
- "QIcon.setThemeSearchPaths": ('PySide2.support.signature.typing.List',),
+ "QIcon.setThemeSearchPaths": ('List[str]',),
"QIcon.swap": ('PySide2.QtGui.QIcon',),
"QIcon.themeName": (),
"QIcon.themeSearchPaths": (),
@@ -3466,7 +3468,7 @@ if "PySide2.QtGui" in sys.modules:
"QIconEngine.write": ('PySide2.QtCore.QDataStream',),
# class PySide2.QtGui.QImage:
- "QImage.__init__": [(), ('PySide2.QtCore.QSize', 'PySide2.QtGui.QImage.Format'), ('PySide2.QtGui.QImage',), ('PySide2.support.signature.typing.List',), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'PySide2.support.signature.typing.Callable', 'int'), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'PySide2.support.signature.typing.Callable', 'int'), ('int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'str')],
+ "QImage.__init__": [(), ('List[str]',), ('PySide2.QtCore.QSize', 'PySide2.QtGui.QImage.Format'), ('PySide2.QtGui.QImage',), ('Union[str, int]', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable', 'int'), ('Union[str, int]', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable', 'int'), ('int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'str')],
"QImage.__copy__": (),
"QImage.allGray": (),
"QImage.alphaChannel": (),
@@ -3561,8 +3563,8 @@ if "PySide2.QtGui" in sys.modules:
"QImageIOHandler.option": ('PySide2.QtGui.QImageIOHandler.ImageOption',),
"QImageIOHandler.read": ('PySide2.QtGui.QImage',),
"QImageIOHandler.setDevice": ('PySide2.QtCore.QIODevice',),
- "QImageIOHandler.setFormat": ['PySide2.QtCore.QByteArray'],
- "QImageIOHandler.setOption": ('PySide2.QtGui.QImageIOHandler.ImageOption', 'PySide2.support.signature.typing.Any'),
+ "QImageIOHandler.setFormat": ('PySide2.QtCore.QByteArray',),
+ "QImageIOHandler.setOption": ('PySide2.QtGui.QImageIOHandler.ImageOption', 'Any'),
"QImageIOHandler.supportsOption": ('PySide2.QtGui.QImageIOHandler.ImageOption',),
"QImageIOHandler.write": ('PySide2.QtGui.QImage',),
@@ -3735,7 +3737,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix.translate": ('float', 'float'),
# class PySide2.QtGui.QMatrix2x2:
- "QMatrix2x2.__init__": [('PySide2.QtGui.QMatrix2x2',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix2x2.__init__": [('PySide2.QtGui.QMatrix2x2',), ('Sequence',)],
"QMatrix2x2.__copy__": (),
"QMatrix2x2.__reduce__": (),
"QMatrix2x2.data": (),
@@ -3743,7 +3745,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix2x2.transposed": (),
# class PySide2.QtGui.QMatrix2x3:
- "QMatrix2x3.__init__": [('PySide2.QtGui.QMatrix2x3',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix2x3.__init__": [('PySide2.QtGui.QMatrix2x3',), ('Sequence',)],
"QMatrix2x3.__copy__": (),
"QMatrix2x3.__reduce__": (),
"QMatrix2x3.data": (),
@@ -3751,7 +3753,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix2x3.transposed": (),
# class PySide2.QtGui.QMatrix2x4:
- "QMatrix2x4.__init__": [('PySide2.QtGui.QMatrix2x4',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix2x4.__init__": [('PySide2.QtGui.QMatrix2x4',), ('Sequence',)],
"QMatrix2x4.__copy__": (),
"QMatrix2x4.__reduce__": (),
"QMatrix2x4.data": (),
@@ -3759,7 +3761,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix2x4.transposed": (),
# class PySide2.QtGui.QMatrix3x2:
- "QMatrix3x2.__init__": [('PySide2.QtGui.QMatrix3x2',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix3x2.__init__": [('PySide2.QtGui.QMatrix3x2',), ('Sequence',)],
"QMatrix3x2.__copy__": (),
"QMatrix3x2.__reduce__": (),
"QMatrix3x2.data": (),
@@ -3767,7 +3769,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix3x2.transposed": (),
# class PySide2.QtGui.QMatrix3x3:
- "QMatrix3x3.__init__": [('PySide2.QtGui.QMatrix3x3',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix3x3.__init__": [('PySide2.QtGui.QMatrix3x3',), ('Sequence',)],
"QMatrix3x3.__copy__": (),
"QMatrix3x3.__reduce__": (),
"QMatrix3x3.data": (),
@@ -3775,7 +3777,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix3x3.transposed": (),
# class PySide2.QtGui.QMatrix3x4:
- "QMatrix3x4.__init__": [('PySide2.QtGui.QMatrix3x4',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix3x4.__init__": [('PySide2.QtGui.QMatrix3x4',), ('Sequence',)],
"QMatrix3x4.__copy__": (),
"QMatrix3x4.__reduce__": (),
"QMatrix3x4.data": (),
@@ -3783,7 +3785,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix3x4.transposed": (),
# class PySide2.QtGui.QMatrix4x2:
- "QMatrix4x2.__init__": [('PySide2.QtGui.QMatrix4x2',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix4x2.__init__": [('PySide2.QtGui.QMatrix4x2',), ('Sequence',)],
"QMatrix4x2.__copy__": (),
"QMatrix4x2.__reduce__": (),
"QMatrix4x2.data": (),
@@ -3791,7 +3793,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix4x2.transposed": (),
# class PySide2.QtGui.QMatrix4x3:
- "QMatrix4x3.__init__": [('PySide2.QtGui.QMatrix4x3',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix4x3.__init__": [('PySide2.QtGui.QMatrix4x3',), ('Sequence',)],
"QMatrix4x3.__copy__": (),
"QMatrix4x3.__reduce__": (),
"QMatrix4x3.data": (),
@@ -3837,9 +3839,9 @@ if "PySide2.QtGui" in sys.modules:
"QMouseEvent.button": (),
"QMouseEvent.buttons": (),
"QMouseEvent.flags": (),
- "QMouseEvent.global"+"Y": (),
"QMouseEvent.globalPos": (),
"QMouseEvent.globalX": (),
+ "QMouseEvent.global""Y": (),
"QMouseEvent.localPos": (),
"QMouseEvent.pos": (),
"QMouseEvent.screenPos": (),
@@ -3942,7 +3944,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLContext.openGLModuleType": (),
"QOpenGLContext.screen": (),
"QOpenGLContext.setFormat": ('PySide2.QtGui.QSurfaceFormat',),
- "QOpenGLContext.setNativeHandle": ('PySide2.support.signature.typing.Any',),
+ "QOpenGLContext.setNativeHandle": ('Any',),
"QOpenGLContext.setScreen": ('PySide2.QtGui.QScreen',),
"QOpenGLContext.setShareContext": ('PySide2.QtGui.QOpenGLContext',),
"QOpenGLContext.shareContext": (),
@@ -3953,8 +3955,8 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLContext.versionFunctions": ('PySide2.QtGui.QOpenGLVersionProfile',),
# class PySide2.QtGui.QOpenGLContextGroup:
- "QOpenGLContextGroup.shares": (),
"QOpenGLContextGroup.currentContextGroup": (),
+ "QOpenGLContextGroup.shares": (),
# class PySide2.QtGui.QOpenGLDebugLogger:
"QOpenGLDebugLogger.__init__": ('PySide2.QtCore.QObject',),
@@ -3989,7 +3991,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glBeginQuery": ('int', 'int'),
"QOpenGLExtraFunctions.glBeginTransformFeedback": ('int',),
"QOpenGLExtraFunctions.glBindBufferBase": ('int', 'int', 'int'),
- "QOpenGLExtraFunctions.glBindImageTexture": ('int', 'int', 'int', 'int', 'int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glBindImageTexture": ('int', 'int', 'int', 'Union[str, int]', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glBindProgramPipeline": ('int',),
"QOpenGLExtraFunctions.glBindSampler": ('int', 'int'),
"QOpenGLExtraFunctions.glBindTransformFeedback": ('int', 'int'),
@@ -4042,6 +4044,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glGetQueryiv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glGetSamplerParameterfv": ('int', 'int', 'float'),
"QOpenGLExtraFunctions.glGetSamplerParameteriv": ('int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glGetStringi": ('int', 'int'),
"QOpenGLExtraFunctions.glGetTexLevelParameterfv": ('int', 'int', 'int', 'float'),
"QOpenGLExtraFunctions.glGetTexLevelParameteriv": ('int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glGetUniformBlockIndex": ('int', 'str'),
@@ -4083,15 +4086,15 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glProgramUniform4iv": ('int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glProgramUniform4ui": ('int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glProgramUniform4uiv": ('int', 'int', 'int', 'int'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix2fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix2x3fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix2x4fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix3fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix3x2fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix3x4fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix4fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix4x2fv": ('int', 'int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix4x3fv": ('int', 'int', 'int', 'int', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix2fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix2x3fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix2x4fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix3fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix3x2fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix3x4fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix4fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix4x2fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix4x3fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
"QOpenGLExtraFunctions.glReadBuffer": ('int',),
"QOpenGLExtraFunctions.glRenderbufferStorageMultisample": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glSampleMaski": ('int', 'int'),
@@ -4101,7 +4104,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glSamplerParameteriv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glTexImage3D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glTexStorage2D": ('int', 'int', 'int', 'int', 'int'),
- "QOpenGLExtraFunctions.glTexStorage2DMultisample": ('int', 'int', 'int', 'int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glTexStorage2DMultisample": ('int', 'int', 'int', 'int', 'int', 'Union[str, int]'),
"QOpenGLExtraFunctions.glTexStorage3D": ('int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glTexSubImage3D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glUniform1ui": ('int', 'int'),
@@ -4113,18 +4116,18 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glUniform4ui": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glUniform4uiv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glUniformBlockBinding": ('int', 'int', 'int'),
- "QOpenGLExtraFunctions.glUniformMatrix2x3fv": ('int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix2x4fv": ('int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix3x2fv": ('int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix3x4fv": ('int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix4x2fv": ('int', 'int', 'int', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix4x3fv": ('int', 'int', 'int', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix2x3fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix2x4fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix3x2fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix3x4fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix4x2fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix4x3fv": ('int', 'int', 'Union[str, int]', 'float'),
"QOpenGLExtraFunctions.glUnmapBuffer": ('int',),
"QOpenGLExtraFunctions.glUseProgramStages": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glValidateProgramPipeline": ('int',),
"QOpenGLExtraFunctions.glVertexAttribBinding": ('int', 'int'),
"QOpenGLExtraFunctions.glVertexAttribDivisor": ('int', 'int'),
- "QOpenGLExtraFunctions.glVertexAttribFormat": ('int', 'int', 'int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glVertexAttribFormat": ('int', 'int', 'int', 'Union[str, int]', 'int'),
"QOpenGLExtraFunctions.glVertexAttribI4i": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glVertexAttribI4iv": ('int', 'int'),
"QOpenGLExtraFunctions.glVertexAttribI4ui": ('int', 'int', 'int', 'int', 'int'),
@@ -4190,7 +4193,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glClearColor": ('float', 'float', 'float', 'float'),
"QOpenGLFunctions.glClearDepthf": ('float',),
"QOpenGLFunctions.glClearStencil": ('int',),
- "QOpenGLFunctions.glColorMask": ('int', 'int', 'int', 'int'),
+ "QOpenGLFunctions.glColorMask": ('Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]'),
"QOpenGLFunctions.glCompileShader": ('int',),
"QOpenGLFunctions.glCompressedTexImage2D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glCompressedTexSubImage2D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
@@ -4206,7 +4209,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glDeleteShader": ('int',),
"QOpenGLFunctions.glDeleteTextures": ('int', 'int'),
"QOpenGLFunctions.glDepthFunc": ('int',),
- "QOpenGLFunctions.glDepthMask": ('int',),
+ "QOpenGLFunctions.glDepthMask": ('Union[str, int]',),
"QOpenGLFunctions.glDepthRangef": ('float', 'float'),
"QOpenGLFunctions.glDetachShader": ('int', 'int'),
"QOpenGLFunctions.glDisable": ('int',),
@@ -4236,6 +4239,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glGetRenderbufferParameteriv": ('int', 'int', 'int'),
"QOpenGLFunctions.glGetShaderPrecisionFormat": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.glGetShaderiv": ('int', 'int', 'int'),
+ "QOpenGLFunctions.glGetString": ('int',),
"QOpenGLFunctions.glGetTexParameterfv": ('int', 'int', 'float'),
"QOpenGLFunctions.glGetTexParameteriv": ('int', 'int', 'int'),
"QOpenGLFunctions.glGetUniformLocation": ('int', 'str'),
@@ -4258,7 +4262,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glReadPixels": ('int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glReleaseShaderCompiler": (),
"QOpenGLFunctions.glRenderbufferStorage": ('int', 'int', 'int', 'int'),
- "QOpenGLFunctions.glSampleCoverage": ('float', 'int'),
+ "QOpenGLFunctions.glSampleCoverage": ('float', 'Union[str, int]'),
"QOpenGLFunctions.glScissor": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.glShaderBinary": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glStencilFunc": ('int', 'int', 'int'),
@@ -4289,9 +4293,9 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glUniform4fv": ('int', 'int', 'float'),
"QOpenGLFunctions.glUniform4i": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glUniform4iv": ('int', 'int', 'int'),
- "QOpenGLFunctions.glUniformMatrix2fv": ('int', 'int', 'int', 'float'),
- "QOpenGLFunctions.glUniformMatrix3fv": ('int', 'int', 'int', 'float'),
- "QOpenGLFunctions.glUniformMatrix4fv": ('int', 'int', 'int', 'float'),
+ "QOpenGLFunctions.glUniformMatrix2fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLFunctions.glUniformMatrix3fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLFunctions.glUniformMatrix4fv": ('int', 'int', 'Union[str, int]', 'float'),
"QOpenGLFunctions.glUseProgram": ('int',),
"QOpenGLFunctions.glValidateProgram": ('int',),
"QOpenGLFunctions.glVertexAttrib1f": ('int', 'float'),
@@ -4302,7 +4306,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glVertexAttrib3fv": ('int', 'float'),
"QOpenGLFunctions.glVertexAttrib4f": ('int', 'float', 'float', 'float', 'float'),
"QOpenGLFunctions.glVertexAttrib4fv": ('int', 'float'),
- "QOpenGLFunctions.glVertexAttribPointer": ('int', 'int', 'int', 'int', 'int', 'int'),
+ "QOpenGLFunctions.glVertexAttribPointer": ('int', 'int', 'int', 'Union[str, int]', 'int', 'int'),
"QOpenGLFunctions.glViewport": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.hasOpenGLFeature": ('PySide2.QtGui.QOpenGLFunctions.OpenGLFeature',),
"QOpenGLFunctions.initializeOpenGLFunctions": (),
@@ -4371,7 +4375,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLShaderProgram.setDefaultInnerTessellationLevels": ('list',),
"QOpenGLShaderProgram.setDefaultOuterTessellationLevels": ('list',),
"QOpenGLShaderProgram.setPatchVertexCount": ('int',),
- "QOpenGLShaderProgram.setUniformValue": [('int', 'PySide2.QtCore.QPoint'), ('int', 'PySide2.QtCore.QPointF'), ('int', 'PySide2.QtCore.QSize'), ('int', 'PySide2.QtCore.QSizeF'), ('int', 'PySide2.QtGui.QColor'), ('int', 'PySide2.QtGui.QMatrix2x2'), ('int', 'PySide2.QtGui.QMatrix2x3'), ('int', 'PySide2.QtGui.QMatrix2x4'), ('int', 'PySide2.QtGui.QMatrix3x2'), ('int', 'PySide2.QtGui.QMatrix3x3'), ('int', 'PySide2.QtGui.QMatrix3x4'), ('int', 'PySide2.QtGui.QMatrix4x2'), ('int', 'PySide2.QtGui.QMatrix4x3'), ('int', 'PySide2.QtGui.QMatrix4x4'), ('int', 'PySide2.QtGui.QTransform'), ('int', 'PySide2.QtGui.QVector2D'), ('int', 'PySide2.QtGui.QVector3D'), ('int', 'PySide2.QtGui.QVector4D'), ('int', 'PySide2.support.signature.typing.List'), ('int', 'float'), ('int', 'float', 'float'), ('int', 'float', 'float', 'float'), ('int', 'float', 'float', 'float', 'float'), ('int', 'int'), ('str', 'PySide2.QtCore.QPoint'), ('str', 'PySide2.QtCore.QPointF'), ('str', 'PySide2.QtCore.QSize'), ('str', 'PySide2.QtCore.QSizeF'), ('str', 'PySide2.QtGui.QColor'), ('str', 'PySide2.QtGui.QMatrix2x2'), ('str', 'PySide2.QtGui.QMatrix2x3'), ('str', 'PySide2.QtGui.QMatrix2x4'), ('str', 'PySide2.QtGui.QMatrix3x2'), ('str', 'PySide2.QtGui.QMatrix3x3'), ('str', 'PySide2.QtGui.QMatrix3x4'), ('str', 'PySide2.QtGui.QMatrix4x2'), ('str', 'PySide2.QtGui.QMatrix4x3'), ('str', 'PySide2.QtGui.QMatrix4x4'), ('str', 'PySide2.QtGui.QTransform'), ('str', 'PySide2.QtGui.QVector2D'), ('str', 'PySide2.QtGui.QVector3D'), ('str', 'PySide2.QtGui.QVector4D'), ('str', 'PySide2.support.signature.typing.List'), ('str', 'float'), ('str', 'float', 'float'), ('str', 'float', 'float', 'float'), ('str', 'float', 'float', 'float', 'float'), ('str', 'int')],
+ "QOpenGLShaderProgram.setUniformValue": [('int', 'List[List[float]]'), ('int', 'PySide2.QtCore.QPoint'), ('int', 'PySide2.QtCore.QPointF'), ('int', 'PySide2.QtCore.QSize'), ('int', 'PySide2.QtCore.QSizeF'), ('int', 'PySide2.QtGui.QColor'), ('int', 'PySide2.QtGui.QMatrix2x2'), ('int', 'PySide2.QtGui.QMatrix2x3'), ('int', 'PySide2.QtGui.QMatrix2x4'), ('int', 'PySide2.QtGui.QMatrix3x2'), ('int', 'PySide2.QtGui.QMatrix3x3'), ('int', 'PySide2.QtGui.QMatrix3x4'), ('int', 'PySide2.QtGui.QMatrix4x2'), ('int', 'PySide2.QtGui.QMatrix4x3'), ('int', 'PySide2.QtGui.QMatrix4x4'), ('int', 'PySide2.QtGui.QTransform'), ('int', 'PySide2.QtGui.QVector2D'), ('int', 'PySide2.QtGui.QVector3D'), ('int', 'PySide2.QtGui.QVector4D'), ('int', 'float'), ('int', 'float', 'float'), ('int', 'float', 'float', 'float'), ('int', 'float', 'float', 'float', 'float'), ('int', 'int'), ('str', 'List[List[float]]'), ('str', 'PySide2.QtCore.QPoint'), ('str', 'PySide2.QtCore.QPointF'), ('str', 'PySide2.QtCore.QSize'), ('str', 'PySide2.QtCore.QSizeF'), ('str', 'PySide2.QtGui.QColor'), ('str', 'PySide2.QtGui.QMatrix2x2'), ('str', 'PySide2.QtGui.QMatrix2x3'), ('str', 'PySide2.QtGui.QMatrix2x4'), ('str', 'PySide2.QtGui.QMatrix3x2'), ('str', 'PySide2.QtGui.QMatrix3x3'), ('str', 'PySide2.QtGui.QMatrix3x4'), ('str', 'PySide2.QtGui.QMatrix4x2'), ('str', 'PySide2.QtGui.QMatrix4x3'), ('str', 'PySide2.QtGui.QMatrix4x4'), ('str', 'PySide2.QtGui.QTransform'), ('str', 'PySide2.QtGui.QVector2D'), ('str', 'PySide2.QtGui.QVector3D'), ('str', 'PySide2.QtGui.QVector4D'), ('str', 'float'), ('str', 'float', 'float'), ('str', 'float', 'float', 'float'), ('str', 'float', 'float', 'float', 'float'), ('str', 'int')],
"QOpenGLShaderProgram.setUniformValueArray": [('int', 'float', 'int', 'int'), ('int', 'int', 'int'), ('str', 'float', 'int', 'int'), ('str', 'int', 'int')],
"QOpenGLShaderProgram.shaders": (),
"QOpenGLShaderProgram.uniformLocation": [('PySide2.QtCore.QByteArray',), ('str',)],
@@ -4568,7 +4572,7 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QPagedPaintDevice:
"QPagedPaintDevice.__init__": (),
- "QPagedPaintDevice.devicePageLayout": [],
+ "QPagedPaintDevice.devicePageLayout": (),
"QPagedPaintDevice.margins": (),
"QPagedPaintDevice.newPage": (),
"QPagedPaintDevice.pageLayout": (),
@@ -4605,9 +4609,9 @@ if "PySide2.QtGui" in sys.modules:
"QPaintDevice.widthMM": (),
# class PySide2.QtGui.QPaintDeviceWindow:
- "QPaintDeviceWindow.metric": ('PySide2.QtGui.QPaintDevice.PaintDeviceMetric',),
"QPaintDeviceWindow.event": ('PySide2.QtCore.QEvent',),
"QPaintDeviceWindow.exposeEvent": ('PySide2.QtGui.QExposeEvent',),
+ "QPaintDeviceWindow.metric": ('PySide2.QtGui.QPaintDevice.PaintDeviceMetric',),
"QPaintDeviceWindow.paintEngine": (),
"QPaintDeviceWindow.paintEvent": ('PySide2.QtGui.QPaintEvent',),
"QPaintDeviceWindow.update": [(), ('PySide2.QtCore.QRect',), ('PySide2.QtGui.QRegion',)],
@@ -4695,7 +4699,7 @@ if "PySide2.QtGui" in sys.modules:
"QPainter.drawEllipse": [('PySide2.QtCore.QPoint', 'int', 'int'), ('PySide2.QtCore.QPointF', 'float', 'float'), ('PySide2.QtCore.QRect',), ('PySide2.QtCore.QRectF',), ('int', 'int', 'int', 'int')],
"QPainter.drawImage": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QPoint', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRect', 'ImageConversionFlags'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRectF', 'ImageConversionFlags'), ('PySide2.QtCore.QRect', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QRect', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRect', 'ImageConversionFlags'), ('PySide2.QtCore.QRectF', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QRectF', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRectF', 'ImageConversionFlags'), ('int', 'int', 'PySide2.QtGui.QImage', 'int', 'int', 'int', 'int', 'ImageConversionFlags')],
"QPainter.drawLine": [('PySide2.QtCore.QLine',), ('PySide2.QtCore.QLineF',), ('PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'), ('PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF'), ('int', 'int', 'int', 'int')],
- "QPainter.drawLines": ['list'],
+ "QPainter.drawLines": ('list',),
"QPainter.drawPath": ('PySide2.QtGui.QPainterPath',),
"QPainter.drawPicture": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QPicture'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QPicture'), ('int', 'int', 'PySide2.QtGui.QPicture')],
"QPainter.drawPie": [('PySide2.QtCore.QRect', 'int', 'int'), ('PySide2.QtCore.QRectF', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'int')],
@@ -4706,7 +4710,7 @@ if "PySide2.QtGui" in sys.modules:
"QPainter.drawPolygon": [('PySide2.QtGui.QPolygon', 'PySide2.QtCore.Qt.FillRule'), ('PySide2.QtGui.QPolygonF', 'PySide2.QtCore.Qt.FillRule'), ('list', 'PySide2.QtCore.Qt.FillRule')],
"QPainter.drawPolyline": [('PySide2.QtGui.QPolygon',), ('PySide2.QtGui.QPolygonF',), ('list',)],
"QPainter.drawRect": [('PySide2.QtCore.QRect',), ('PySide2.QtCore.QRectF',), ('int', 'int', 'int', 'int')],
- "QPainter.drawRects": ['list'],
+ "QPainter.drawRects": ('list',),
"QPainter.drawRoundRect": [('PySide2.QtCore.QRect', 'int', 'int'), ('PySide2.QtCore.QRectF', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'int')],
"QPainter.drawRoundedRect": [('PySide2.QtCore.QRect', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode'), ('PySide2.QtCore.QRectF', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode'), ('int', 'int', 'int', 'int', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode')],
"QPainter.drawStaticText": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QStaticText'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QStaticText'), ('int', 'int', 'PySide2.QtGui.QStaticText')],
@@ -4972,7 +4976,7 @@ if "PySide2.QtGui" in sys.modules:
"QPictureIO.write": (),
# class PySide2.QtGui.QPixelFormat:
- "QPixelFormat.__init__": [(), ('PySide2.QtGui.QPixelFormat',), ('PySide2.QtGui.QPixelFormat.ColorModel', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.QtGui.QPixelFormat.AlphaUsage', 'PySide2.QtGui.QPixelFormat.AlphaPosition', 'PySide2.QtGui.QPixelFormat.AlphaPremultiplied', 'PySide2.QtGui.QPixelFormat.TypeInterpretation', 'PySide2.QtGui.QPixelFormat.ByteOrder', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QPixelFormat.__init__": [(), ('PySide2.QtGui.QPixelFormat',), ('PySide2.QtGui.QPixelFormat.ColorModel', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'PySide2.QtGui.QPixelFormat.AlphaUsage', 'PySide2.QtGui.QPixelFormat.AlphaPosition', 'PySide2.QtGui.QPixelFormat.AlphaPremultiplied', 'PySide2.QtGui.QPixelFormat.TypeInterpretation', 'PySide2.QtGui.QPixelFormat.ByteOrder', 'Union[str, int]')],
"QPixelFormat.__copy__": (),
"QPixelFormat.alphaPosition": (),
"QPixelFormat.alphaSize": (),
@@ -4998,7 +5002,7 @@ if "PySide2.QtGui" in sys.modules:
"QPixelFormat.yuvLayout": (),
# class PySide2.QtGui.QPixmap:
- "QPixmap.__init__": [(), ('PySide2.QtCore.QSize',), ('PySide2.QtGui.QImage',), ('PySide2.QtGui.QPixmap',), ('PySide2.support.signature.typing.List',), ('int', 'int'), ('str', 'str', 'ImageConversionFlags')],
+ "QPixmap.__init__": [(), ('List[str]',), ('PySide2.QtCore.QSize',), ('PySide2.QtGui.QImage',), ('PySide2.QtGui.QPixmap',), ('int', 'int'), ('str', 'str', 'ImageConversionFlags')],
"QPixmap.__copy__": (),
"QPixmap.cacheKey": (),
"QPixmap.convertFromImage": ('PySide2.QtGui.QImage', 'ImageConversionFlags'),
@@ -5021,7 +5025,7 @@ if "PySide2.QtGui" in sys.modules:
"QPixmap.isNull": (),
"QPixmap.isQBitmap": (),
"QPixmap.load": ('str', 'str', 'ImageConversionFlags'),
- "QPixmap.loadFromData": [('PySide2.QtCore.QByteArray', 'str', 'ImageConversionFlags'), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'str', 'ImageConversionFlags')],
+ "QPixmap.loadFromData": [('PySide2.QtCore.QByteArray', 'str', 'ImageConversionFlags'), ('Union[str, int]', 'int', 'str', 'ImageConversionFlags')],
"QPixmap.mask": (),
"QPixmap.metric": ('PySide2.QtGui.QPaintDevice.PaintDeviceMetric',),
"QPixmap.paintEngine": (),
@@ -5065,11 +5069,11 @@ if "PySide2.QtGui" in sys.modules:
"QPolygon.contains": ('PySide2.QtCore.QPoint',),
"QPolygon.containsPoint": ('PySide2.QtCore.QPoint', 'PySide2.QtCore.Qt.FillRule'),
"QPolygon.count": [(), ('PySide2.QtCore.QPoint',)],
- "QPolygon.data": [],
+ "QPolygon.data": (),
"QPolygon.empty": (),
"QPolygon.endsWith": ('PySide2.QtCore.QPoint',),
"QPolygon.fill": ('PySide2.QtCore.QPoint', 'int'),
- "QPolygon.first": [],
+ "QPolygon.first": (),
"QPolygon.fromList": ('list',),
"QPolygon.front": (),
"QPolygon.indexOf": ('PySide2.QtCore.QPoint', 'int'),
@@ -5077,7 +5081,7 @@ if "PySide2.QtGui" in sys.modules:
"QPolygon.intersected": ('PySide2.QtGui.QPolygon',),
"QPolygon.isEmpty": (),
"QPolygon.isSharedWith": ('list',),
- "QPolygon.last": [],
+ "QPolygon.last": (),
"QPolygon.lastIndexOf": ('PySide2.QtCore.QPoint', 'int'),
"QPolygon.length": (),
"QPolygon.mid": ('int', 'int'),
@@ -5125,11 +5129,11 @@ if "PySide2.QtGui" in sys.modules:
"QPolygonF.contains": ('PySide2.QtCore.QPointF',),
"QPolygonF.containsPoint": ('PySide2.QtCore.QPointF', 'PySide2.QtCore.Qt.FillRule'),
"QPolygonF.count": [(), ('PySide2.QtCore.QPointF',)],
- "QPolygonF.data": [],
+ "QPolygonF.data": (),
"QPolygonF.empty": (),
"QPolygonF.endsWith": ('PySide2.QtCore.QPointF',),
"QPolygonF.fill": ('PySide2.QtCore.QPointF', 'int'),
- "QPolygonF.first": [],
+ "QPolygonF.first": (),
"QPolygonF.fromList": ('list',),
"QPolygonF.front": (),
"QPolygonF.indexOf": ('PySide2.QtCore.QPointF', 'int'),
@@ -5138,7 +5142,7 @@ if "PySide2.QtGui" in sys.modules:
"QPolygonF.isClosed": (),
"QPolygonF.isEmpty": (),
"QPolygonF.isSharedWith": ('list',),
- "QPolygonF.last": [],
+ "QPolygonF.last": (),
"QPolygonF.lastIndexOf": ('PySide2.QtCore.QPointF', 'int'),
"QPolygonF.length": (),
"QPolygonF.mid": ('int', 'int'),
@@ -5262,7 +5266,7 @@ if "PySide2.QtGui" in sys.modules:
"QRawFont.style": (),
"QRawFont.styleName": (),
"QRawFont.supportedWritingSystems": (),
- "QRawFont.supportsCharacter": [('PySide2.support.signature.typing.Union[str, int]',), ('int',)],
+ "QRawFont.supportsCharacter": [('Union[str, int]',), ('int',)],
"QRawFont.swap": ('PySide2.QtGui.QRawFont',),
"QRawFont.underlinePosition": (),
"QRawFont.unitsPerEm": (),
@@ -5304,7 +5308,6 @@ if "PySide2.QtGui" in sys.modules:
"QResizeEvent.size": (),
# class PySide2.QtGui.QScreen:
- "QScreen.physicalDotsPerInchX": (),
"QScreen.angleBetween": ('PySide2.QtCore.Qt.ScreenOrientation', 'PySide2.QtCore.Qt.ScreenOrientation'),
"QScreen.availableGeometry": (),
"QScreen.availableSize": (),
@@ -5327,6 +5330,7 @@ if "PySide2.QtGui" in sys.modules:
"QScreen.orientation": (),
"QScreen.orientationUpdateMask": (),
"QScreen.physicalDotsPerInch": (),
+ "QScreen.physicalDotsPerInchX": (),
"QScreen.physicalDotsPerInchY": (),
"QScreen.physicalSize": (),
"QScreen.primaryOrientation": (),
@@ -5340,9 +5344,9 @@ if "PySide2.QtGui" in sys.modules:
"QScreen.virtualSize": (),
# class PySide2.QtGui.QSessionManager:
- "QSessionManager.cancel": (),
"QSessionManager.allowsErrorInteraction": (),
"QSessionManager.allowsInteraction": (),
+ "QSessionManager.cancel": (),
"QSessionManager.discardCommand": (),
"QSessionManager.isPhase2": (),
"QSessionManager.release": (),
@@ -5351,9 +5355,9 @@ if "PySide2.QtGui" in sys.modules:
"QSessionManager.restartHint": (),
"QSessionManager.sessionId": (),
"QSessionManager.sessionKey": (),
- "QSessionManager.setDiscardCommand": ('PySide2.support.signature.typing.List',),
- "QSessionManager.setManagerProperty": [('str', 'PySide2.support.signature.typing.List'), ('str', 'str')],
- "QSessionManager.setRestartCommand": ('PySide2.support.signature.typing.List',),
+ "QSessionManager.setDiscardCommand": ('List[str]',),
+ "QSessionManager.setManagerProperty": [('str', 'List[str]'), ('str', 'str')],
+ "QSessionManager.setRestartCommand": ('List[str]',),
"QSessionManager.setRestartHint": ('PySide2.QtGui.QSessionManager.RestartHint',),
# class PySide2.QtGui.QShortcutEvent:
@@ -5413,7 +5417,7 @@ if "PySide2.QtGui" in sys.modules:
"QStandardItem.setCheckable": ('bool',),
"QStandardItem.setChild": [('int', 'PySide2.QtGui.QStandardItem'), ('int', 'int', 'PySide2.QtGui.QStandardItem')],
"QStandardItem.setColumnCount": ('int',),
- "QStandardItem.setData": ('PySide2.support.signature.typing.Any', 'int'),
+ "QStandardItem.setData": ('Any', 'int'),
"QStandardItem.setDragEnabled": ('bool',),
"QStandardItem.setDropEnabled": ('bool',),
"QStandardItem.setEditable": ('bool',),
@@ -5469,17 +5473,17 @@ if "PySide2.QtGui" in sys.modules:
"QStandardItemModel.itemData": ('PySide2.QtCore.QModelIndex',),
"QStandardItemModel.itemFromIndex": ('PySide2.QtCore.QModelIndex',),
"QStandardItemModel.itemPrototype": (),
- "QStandardItemModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QStandardItemModel.mimeData": ('List[int]',),
"QStandardItemModel.mimeTypes": (),
"QStandardItemModel.parent": [(), ('PySide2.QtCore.QModelIndex',)],
"QStandardItemModel.removeColumns": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStandardItemModel.removeRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStandardItemModel.rowCount": ('PySide2.QtCore.QModelIndex',),
"QStandardItemModel.setColumnCount": ('int',),
- "QStandardItemModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QStandardItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QStandardItemModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QStandardItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QStandardItemModel.setHorizontalHeaderItem": ('int', 'PySide2.QtGui.QStandardItem'),
- "QStandardItemModel.setHorizontalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QStandardItemModel.setHorizontalHeaderLabels": ('List[str]',),
"QStandardItemModel.setItem": [('int', 'PySide2.QtGui.QStandardItem'), ('int', 'int', 'PySide2.QtGui.QStandardItem')],
"QStandardItemModel.setItemData": ('PySide2.QtCore.QModelIndex', 'dict'),
"QStandardItemModel.setItemPrototype": ('PySide2.QtGui.QStandardItem',),
@@ -5487,7 +5491,7 @@ if "PySide2.QtGui" in sys.modules:
"QStandardItemModel.setRowCount": ('int',),
"QStandardItemModel.setSortRole": ('int',),
"QStandardItemModel.setVerticalHeaderItem": ('int', 'PySide2.QtGui.QStandardItem'),
- "QStandardItemModel.setVerticalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QStandardItemModel.setVerticalHeaderLabels": ('List[str]',),
"QStandardItemModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStandardItemModel.sort": ('int', 'PySide2.QtCore.Qt.SortOrder'),
"QStandardItemModel.sortRole": (),
@@ -5521,21 +5525,20 @@ if "PySide2.QtGui" in sys.modules:
"QStatusTipEvent.tip": (),
# class PySide2.QtGui.QStringListModel:
- "QStringListModel.__init__": [('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QObject')],
+ "QStringListModel.__init__": [('List[str]', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QStringListModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QStringListModel.flags": ('PySide2.QtCore.QModelIndex',),
"QStringListModel.insertRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStringListModel.removeRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStringListModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QStringListModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QStringListModel.setStringList": ('PySide2.support.signature.typing.List',),
+ "QStringListModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QStringListModel.setStringList": ('List[str]',),
"QStringListModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStringListModel.sort": ('int', 'PySide2.QtCore.Qt.SortOrder'),
"QStringListModel.stringList": (),
"QStringListModel.supportedDropActions": (),
# class PySide2.QtGui.QStyleHints:
- "QStyleHints.setFocusOnTouchRelease": (),
"QStyleHints.cursorFlashTime": (),
"QStyleHints.fontSmoothingGamma": (),
"QStyleHints.keyboardAutoRepeatRate": (),
@@ -5545,6 +5548,7 @@ if "PySide2.QtGui" in sys.modules:
"QStyleHints.passwordMaskCharacter": (),
"QStyleHints.passwordMaskDelay": (),
"QStyleHints.setCursorFlashTime": ('int',),
+ "QStyleHints.setFocusOnTouchRelease": (),
"QStyleHints.setKeyboardInputInterval": ('int',),
"QStyleHints.setMouseDoubleClickInterval": ('int',),
"QStyleHints.setMousePressAndHoldInterval": ('int',),
@@ -5635,12 +5639,12 @@ if "PySide2.QtGui" in sys.modules:
"QTabletEvent.button": (),
"QTabletEvent.buttons": (),
"QTabletEvent.device": (),
- "QTabletEvent.global"+"Y": (),
"QTabletEvent.globalPos": (),
"QTabletEvent.globalPosF": (),
"QTabletEvent.globalX": (),
- "QTabletEvent.hiResGlobal"+"Y": (),
+ "QTabletEvent.global""Y": (),
"QTabletEvent.hiResGlobalX": (),
+ "QTabletEvent.hiResGlobal""Y": (),
"QTabletEvent.pointerType": (),
"QTabletEvent.pos": (),
"QTabletEvent.posF": (),
@@ -5674,7 +5678,6 @@ if "PySide2.QtGui" in sys.modules:
"QTextBlock.layout": (),
"QTextBlock.length": (),
"QTextBlock.lineCount": (),
- "QTextBlock.next": (),
"QTextBlock.position": (),
"QTextBlock.previous": (),
"QTextBlock.revision": (),
@@ -5757,7 +5760,7 @@ if "PySide2.QtGui" in sys.modules:
"QTextCharFormat.setAnchor": ('bool',),
"QTextCharFormat.setAnchorHref": ('str',),
"QTextCharFormat.setAnchorName": ('str',),
- "QTextCharFormat.setAnchorNames": ('PySide2.support.signature.typing.List',),
+ "QTextCharFormat.setAnchorNames": ('List[str]',),
"QTextCharFormat.setFont": [('PySide2.QtGui.QFont',), ('PySide2.QtGui.QFont', 'PySide2.QtGui.QTextCharFormat.FontPropertiesInheritanceBehavior')],
"QTextCharFormat.setFontCapitalization": ('PySide2.QtGui.QFont.Capitalization',),
"QTextCharFormat.setFontFamily": ('str',),
@@ -5855,7 +5858,7 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QTextDocument:
"QTextDocument.__init__": [('PySide2.QtCore.QObject',), ('str', 'PySide2.QtCore.QObject')],
- "QTextDocument.addResource": ('int', 'PySide2.QtCore.QUrl', 'PySide2.support.signature.typing.Any'),
+ "QTextDocument.addResource": ('int', 'PySide2.QtCore.QUrl', 'Any'),
"QTextDocument.adjustSize": (),
"QTextDocument.allFormats": (),
"QTextDocument.availableRedoSteps": (),
@@ -5990,7 +5993,7 @@ if "PySide2.QtGui" in sys.modules:
"QTextFormat.setLayoutDirection": ('PySide2.QtCore.Qt.LayoutDirection',),
"QTextFormat.setObjectIndex": ('int',),
"QTextFormat.setObjectType": ('int',),
- "QTextFormat.setProperty": [('int', 'PySide2.support.signature.typing.Any'), ('int', 'list')],
+ "QTextFormat.setProperty": [('int', 'Any'), ('int', 'list')],
"QTextFormat.stringProperty": ('int',),
"QTextFormat.swap": ('PySide2.QtGui.QTextFormat',),
"QTextFormat.toBlockFormat": (),
@@ -6465,10 +6468,10 @@ if "PySide2.QtGui" in sys.modules:
"QWheelEvent.angleDelta": (),
"QWheelEvent.buttons": (),
"QWheelEvent.delta": (),
- "QWheelEvent.global"+"Y": (),
"QWheelEvent.globalPos": (),
"QWheelEvent.globalPosF": (),
"QWheelEvent.globalX": (),
+ "QWheelEvent.global""Y": (),
"QWheelEvent.inverted": (),
"QWheelEvent.orientation": (),
"QWheelEvent.phase": (),
@@ -6967,7 +6970,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QAction.setAutoRepeat": ('bool',),
"QAction.setCheckable": ('bool',),
"QAction.setChecked": ('bool',),
- "QAction.setData": ('PySide2.support.signature.typing.Any',),
+ "QAction.setData": ('Any',),
"QAction.setDisabled": ('bool',),
"QAction.setEnabled": ('bool',),
"QAction.setFont": ('PySide2.QtGui.QFont',),
@@ -7012,7 +7015,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QActionGroup.setVisible": ('bool',),
# class PySide2.QtWidgets.QApplication:
- "QApplication.__init__": ('PySide2.support.signature.typing.List',),
+ "QApplication.__init__": ('List[str]',),
"QApplication.aboutQt": (),
"QApplication.activeModalWidget": (),
"QApplication.activePopupWidget": (),
@@ -7197,6 +7200,19 @@ if "PySide2.QtWidgets" in sys.modules:
"QColorDialog.standardColor": ('int',),
"QColorDialog.testOption": ('PySide2.QtWidgets.QColorDialog.ColorDialogOption',),
+ # class PySide2.QtWidgets.QColormap:
+ "QColormap.__init__": ('PySide2.QtWidgets.QColormap',),
+ "QColormap.__copy__": (),
+ "QColormap.cleanup": (),
+ "QColormap.colorAt": ('int',),
+ "QColormap.colormap": (),
+ "QColormap.depth": (),
+ "QColormap.initialize": (),
+ "QColormap.instance": ('int',),
+ "QColormap.mode": (),
+ "QColormap.pixel": ('PySide2.QtGui.QColor',),
+ "QColormap.size": (),
+
# class PySide2.QtWidgets.QColumnView:
"QColumnView.__init__": ('PySide2.QtWidgets.QWidget',),
"QColumnView.columnWidths": (),
@@ -7228,8 +7244,8 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QComboBox:
"QComboBox.__init__": ('PySide2.QtWidgets.QWidget',),
- "QComboBox.addItem": [('PySide2.QtGui.QIcon', 'str', 'PySide2.support.signature.typing.Any'), ('str', 'PySide2.support.signature.typing.Any')],
- "QComboBox.addItems": ('PySide2.support.signature.typing.List',),
+ "QComboBox.addItem": [('PySide2.QtGui.QIcon', 'str', 'Any'), ('str', 'Any')],
+ "QComboBox.addItems": ('List[str]',),
"QComboBox.autoCompletion": (),
"QComboBox.autoCompletionCaseSensitivity": (),
"QComboBox.changeEvent": ('PySide2.QtCore.QEvent',),
@@ -7243,7 +7259,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QComboBox.currentText": (),
"QComboBox.duplicatesEnabled": (),
"QComboBox.event": ('PySide2.QtCore.QEvent',),
- "QComboBox.findData": ('PySide2.support.signature.typing.Any', 'int', 'MatchFlags'),
+ "QComboBox.findData": ('Any', 'int', 'MatchFlags'),
"QComboBox.findText": ('str', 'MatchFlags'),
"QComboBox.focusInEvent": ('PySide2.QtGui.QFocusEvent',),
"QComboBox.focusOutEvent": ('PySide2.QtGui.QFocusEvent',),
@@ -7253,9 +7269,9 @@ if "PySide2.QtWidgets" in sys.modules:
"QComboBox.iconSize": (),
"QComboBox.initStyleOption": ('PySide2.QtWidgets.QStyleOptionComboBox',),
"QComboBox.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QComboBox.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
- "QComboBox.insertItem": [('int', 'PySide2.QtGui.QIcon', 'str', 'PySide2.support.signature.typing.Any'), ('int', 'str', 'PySide2.support.signature.typing.Any')],
- "QComboBox.insertItems": ('int', 'PySide2.support.signature.typing.List'),
+ "QComboBox.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
+ "QComboBox.insertItem": [('int', 'PySide2.QtGui.QIcon', 'str', 'Any'), ('int', 'str', 'Any')],
+ "QComboBox.insertItems": ('int', 'List[str]'),
"QComboBox.insertPolicy": (),
"QComboBox.insertSeparator": ('int',),
"QComboBox.isEditable": (),
@@ -7289,7 +7305,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QComboBox.setFrame": ('bool',),
"QComboBox.setIconSize": ('PySide2.QtCore.QSize',),
"QComboBox.setInsertPolicy": ('PySide2.QtWidgets.QComboBox.InsertPolicy',),
- "QComboBox.setItemData": ('int', 'PySide2.support.signature.typing.Any', 'int'),
+ "QComboBox.setItemData": ('int', 'Any', 'int'),
"QComboBox.setItemDelegate": ('PySide2.QtWidgets.QAbstractItemDelegate',),
"QComboBox.setItemIcon": ('int', 'PySide2.QtGui.QIcon'),
"QComboBox.setItemText": ('int', 'str'),
@@ -7340,7 +7356,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QCommonStyle.unpolish": [('PySide2.QtWidgets.QApplication',), ('PySide2.QtWidgets.QWidget',)],
# class PySide2.QtWidgets.QCompleter:
- "QCompleter.__init__": [('PySide2.QtCore.QAbstractItemModel', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QObject')],
+ "QCompleter.__init__": [('List[str]', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QAbstractItemModel', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QCompleter.caseSensitivity": (),
"QCompleter.complete": ('PySide2.QtCore.QRect',),
"QCompleter.completionColumn": (),
@@ -7409,7 +7425,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QDateEdit.__init__": [('PySide2.QtCore.QDate', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtWidgets.QWidget',)],
# class PySide2.QtWidgets.QDateTimeEdit:
- "QDateTimeEdit.__init__": [('PySide2.QtCore.QDate', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QDateTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtWidgets.QWidget',), ('PySide2.support.signature.typing.Any', 'type', 'PySide2.QtWidgets.QWidget')],
+ "QDateTimeEdit.__init__": [('Any', 'type', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QDate', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QDateTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtWidgets.QWidget',)],
"QDateTimeEdit.calendarPopup": (),
"QDateTimeEdit.calendarWidget": (),
"QDateTimeEdit.clear": (),
@@ -7550,7 +7566,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QDialogButtonBox.standardButtons": (),
# class PySide2.QtWidgets.QDirModel:
- "QDirModel.__init__": [('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'Filters', 'SortFlags', 'PySide2.QtCore.QObject')],
+ "QDirModel.__init__": [('List[str]', 'Filters', 'SortFlags', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QDirModel.columnCount": ('PySide2.QtCore.QModelIndex',),
"QDirModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QDirModel.dropMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtCore.Qt.DropAction', 'int', 'int', 'PySide2.QtCore.QModelIndex'),
@@ -7567,7 +7583,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QDirModel.isDir": ('PySide2.QtCore.QModelIndex',),
"QDirModel.isReadOnly": (),
"QDirModel.lazyChildCount": (),
- "QDirModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QDirModel.mimeData": ('List[int]',),
"QDirModel.mimeTypes": (),
"QDirModel.mkdir": ('PySide2.QtCore.QModelIndex', 'str'),
"QDirModel.nameFilters": (),
@@ -7577,11 +7593,11 @@ if "PySide2.QtWidgets" in sys.modules:
"QDirModel.resolveSymlinks": (),
"QDirModel.rmdir": ('PySide2.QtCore.QModelIndex',),
"QDirModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QDirModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QDirModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QDirModel.setFilter": ('Filters',),
"QDirModel.setIconProvider": ('PySide2.QtWidgets.QFileIconProvider',),
"QDirModel.setLazyChildCount": ('bool',),
- "QDirModel.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QDirModel.setNameFilters": ('List[str]',),
"QDirModel.setReadOnly": ('bool',),
"QDirModel.setResolveSymlinks": ('bool',),
"QDirModel.setSorting": ('SortFlags',),
@@ -7652,13 +7668,13 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileDialog.fileMode": (),
"QFileDialog.filter": (),
"QFileDialog.getExistingDirectory": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'Options'),
- "QFileDialog.getExistingDirectoryUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'Options', 'PySide2.support.signature.typing.List'),
+ "QFileDialog.getExistingDirectoryUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'Options', 'List[str]'),
"QFileDialog.getOpenFileName": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'str', 'Options'),
"QFileDialog.getOpenFileNames": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'str', 'Options'),
- "QFileDialog.getOpenFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'PySide2.support.signature.typing.List'),
- "QFileDialog.getOpenFileUrls": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'PySide2.support.signature.typing.List'),
+ "QFileDialog.getOpenFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'List[str]'),
+ "QFileDialog.getOpenFileUrls": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'List[str]'),
"QFileDialog.getSaveFileName": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'str', 'Options'),
- "QFileDialog.getSaveFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'PySide2.support.signature.typing.List'),
+ "QFileDialog.getSaveFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'List[str]'),
"QFileDialog.history": (),
"QFileDialog.iconProvider": (),
"QFileDialog.isNameFilterDetailsVisible": (),
@@ -7688,21 +7704,21 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileDialog.setDirectoryUrl": ('PySide2.QtCore.QUrl',),
"QFileDialog.setFileMode": ('PySide2.QtWidgets.QFileDialog.FileMode',),
"QFileDialog.setFilter": ('Filters',),
- "QFileDialog.setHistory": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setHistory": ('List[str]',),
"QFileDialog.setIconProvider": ('PySide2.QtWidgets.QFileIconProvider',),
"QFileDialog.setItemDelegate": ('PySide2.QtWidgets.QAbstractItemDelegate',),
"QFileDialog.setLabelText": ('PySide2.QtWidgets.QFileDialog.DialogLabel', 'str'),
- "QFileDialog.setMimeTypeFilters": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setMimeTypeFilters": ('List[str]',),
"QFileDialog.setNameFilter": ('str',),
"QFileDialog.setNameFilterDetailsVisible": ('bool',),
- "QFileDialog.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setNameFilters": ('List[str]',),
"QFileDialog.setOption": ('PySide2.QtWidgets.QFileDialog.Option', 'bool'),
"QFileDialog.setOptions": ('Options',),
"QFileDialog.setProxyModel": ('PySide2.QtCore.QAbstractProxyModel',),
"QFileDialog.setReadOnly": ('bool',),
"QFileDialog.setResolveSymlinks": ('bool',),
"QFileDialog.setSidebarUrls": ('list',),
- "QFileDialog.setSupportedSchemes": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setSupportedSchemes": ('List[str]',),
"QFileDialog.setViewMode": ('PySide2.QtWidgets.QFileDialog.ViewMode',),
"QFileDialog.setVisible": ('bool',),
"QFileDialog.sidebarUrls": (),
@@ -7738,7 +7754,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileSystemModel.isDir": ('PySide2.QtCore.QModelIndex',),
"QFileSystemModel.isReadOnly": (),
"QFileSystemModel.lastModified": ('PySide2.QtCore.QModelIndex',),
- "QFileSystemModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QFileSystemModel.mimeData": ('List[int]',),
"QFileSystemModel.mimeTypes": (),
"QFileSystemModel.mkdir": ('PySide2.QtCore.QModelIndex', 'str'),
"QFileSystemModel.myComputer": ('int',),
@@ -7751,11 +7767,11 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileSystemModel.rootDirectory": (),
"QFileSystemModel.rootPath": (),
"QFileSystemModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QFileSystemModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QFileSystemModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QFileSystemModel.setFilter": ('Filters',),
"QFileSystemModel.setIconProvider": ('PySide2.QtWidgets.QFileIconProvider',),
"QFileSystemModel.setNameFilterDisables": ('bool',),
- "QFileSystemModel.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QFileSystemModel.setNameFilters": ('List[str]',),
"QFileSystemModel.setReadOnly": ('bool',),
"QFileSystemModel.setResolveSymlinks": ('bool',),
"QFileSystemModel.setRootPath": ('str',),
@@ -7897,8 +7913,8 @@ if "PySide2.QtWidgets" in sys.modules:
"QGestureRecognizer.unregisterRecognizer": ('PySide2.QtCore.Qt.GestureType',),
# class PySide2.QtWidgets.QGraphicsAnchor:
- "QGraphicsAnchor.setSpacing": ('float',),
"QGraphicsAnchor.setSizePolicy": ('PySide2.QtWidgets.QSizePolicy.Policy',),
+ "QGraphicsAnchor.setSpacing": ('float',),
"QGraphicsAnchor.sizePolicy": (),
"QGraphicsAnchor.spacing": (),
"QGraphicsAnchor.unsetSpacing": (),
@@ -7972,7 +7988,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsEllipseItem.__init__": [('PySide2.QtCore.QRectF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',), ('float', 'float', 'float', 'float', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsEllipseItem.boundingRect": (),
"QGraphicsEllipseItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsEllipseItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsEllipseItem.extension": ('Any',),
"QGraphicsEllipseItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsEllipseItem.opaqueArea": (),
"QGraphicsEllipseItem.paint": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
@@ -8062,7 +8078,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.dropEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
"QGraphicsItem.effectiveOpacity": (),
"QGraphicsItem.ensureVisible": [('PySide2.QtCore.QRectF', 'int', 'int'), ('float', 'float', 'float', 'float', 'int', 'int')],
- "QGraphicsItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsItem.extension": ('Any',),
"QGraphicsItem.filtersChildEvents": (),
"QGraphicsItem.flags": (),
"QGraphicsItem.focusInEvent": ('PySide2.QtGui.QFocusEvent',),
@@ -8099,7 +8115,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.isVisibleTo": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsItem.isWidget": (),
"QGraphicsItem.isWindow": (),
- "QGraphicsItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsItem.itemTransform": ('PySide2.QtWidgets.QGraphicsItem', 'bool'),
"QGraphicsItem.keyPressEvent": ('PySide2.QtGui.QKeyEvent',),
"QGraphicsItem.keyReleaseEvent": ('PySide2.QtGui.QKeyEvent',),
@@ -8153,7 +8169,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.setBoundingRegionGranularity": ('float',),
"QGraphicsItem.setCacheMode": ('PySide2.QtWidgets.QGraphicsItem.CacheMode', 'PySide2.QtCore.QSize'),
"QGraphicsItem.setCursor": ('PySide2.QtGui.QCursor',),
- "QGraphicsItem.setData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsItem.setData": ('int', 'Any'),
"QGraphicsItem.setEnabled": ('bool',),
"QGraphicsItem.setFiltersChildEvents": ('bool',),
"QGraphicsItem.setFlag": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemFlag', 'bool'),
@@ -8183,7 +8199,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.shape": (),
"QGraphicsItem.show": (),
"QGraphicsItem.stackBefore": ('PySide2.QtWidgets.QGraphicsItem',),
- "QGraphicsItem.toGraphicsObject": [],
+ "QGraphicsItem.toGraphicsObject": (),
"QGraphicsItem.toolTip": (),
"QGraphicsItem.topLevelItem": (),
"QGraphicsItem.topLevelWidget": (),
@@ -8300,7 +8316,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsLineItem.__init__": [('PySide2.QtCore.QLineF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',), ('float', 'float', 'float', 'float', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsLineItem.boundingRect": (),
"QGraphicsLineItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsLineItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsLineItem.extension": ('Any',),
"QGraphicsLineItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsLineItem.line": (),
"QGraphicsLineItem.opaqueArea": (),
@@ -8355,7 +8371,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsPathItem.__init__": [('PySide2.QtGui.QPainterPath', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',)],
"QGraphicsPathItem.boundingRect": (),
"QGraphicsPathItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsPathItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsPathItem.extension": ('Any',),
"QGraphicsPathItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsPathItem.opaqueArea": (),
"QGraphicsPathItem.paint": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
@@ -8368,7 +8384,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsPixmapItem.__init__": [('PySide2.QtGui.QPixmap', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',)],
"QGraphicsPixmapItem.boundingRect": (),
"QGraphicsPixmapItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsPixmapItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsPixmapItem.extension": ('Any',),
"QGraphicsPixmapItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsPixmapItem.offset": (),
"QGraphicsPixmapItem.opaqueArea": (),
@@ -8387,7 +8403,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsPolygonItem.__init__": [('PySide2.QtGui.QPolygonF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',)],
"QGraphicsPolygonItem.boundingRect": (),
"QGraphicsPolygonItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsPolygonItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsPolygonItem.extension": ('Any',),
"QGraphicsPolygonItem.fillRule": (),
"QGraphicsPolygonItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsPolygonItem.opaqueArea": (),
@@ -8418,7 +8434,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsProxyWidget.hoverMoveEvent": ('PySide2.QtWidgets.QGraphicsSceneHoverEvent',),
"QGraphicsProxyWidget.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
"QGraphicsProxyWidget.inputMethodQuery": ('PySide2.QtCore.Qt.InputMethodQuery',),
- "QGraphicsProxyWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsProxyWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsProxyWidget.keyPressEvent": ('PySide2.QtGui.QKeyEvent',),
"QGraphicsProxyWidget.keyReleaseEvent": ('PySide2.QtGui.QKeyEvent',),
"QGraphicsProxyWidget.mouseDoubleClickEvent": ('PySide2.QtWidgets.QGraphicsSceneMouseEvent',),
@@ -8442,7 +8458,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsRectItem.__init__": [('PySide2.QtCore.QRectF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',), ('float', 'float', 'float', 'float', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsRectItem.boundingRect": (),
"QGraphicsRectItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsRectItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsRectItem.extension": ('Any',),
"QGraphicsRectItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsRectItem.opaqueArea": (),
"QGraphicsRectItem.paint": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
@@ -8690,7 +8706,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsSimpleTextItem.__init__": [('PySide2.QtWidgets.QGraphicsItem',), ('str', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsSimpleTextItem.boundingRect": (),
"QGraphicsSimpleTextItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsSimpleTextItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsSimpleTextItem.extension": ('Any',),
"QGraphicsSimpleTextItem.font": (),
"QGraphicsSimpleTextItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsSimpleTextItem.opaqueArea": (),
@@ -8713,7 +8729,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsTextItem.dragLeaveEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
"QGraphicsTextItem.dragMoveEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
"QGraphicsTextItem.dropEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
- "QGraphicsTextItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsTextItem.extension": ('Any',),
"QGraphicsTextItem.focusInEvent": ('PySide2.QtGui.QFocusEvent',),
"QGraphicsTextItem.focusOutEvent": ('PySide2.QtGui.QFocusEvent',),
"QGraphicsTextItem.font": (),
@@ -8770,7 +8786,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsView.dragMoveEvent": ('PySide2.QtGui.QDragMoveEvent',),
"QGraphicsView.drawBackground": ('PySide2.QtGui.QPainter', 'PySide2.QtCore.QRectF'),
"QGraphicsView.drawForeground": ('PySide2.QtGui.QPainter', 'PySide2.QtCore.QRectF'),
- "QGraphicsView.drawItems": ('PySide2.QtGui.QPainter', 'int', 'PySide2.support.signature.typing.List', 'PySide2.support.signature.typing.List'),
+ "QGraphicsView.drawItems": ('PySide2.QtGui.QPainter', 'int', 'List[PySide2.QtWidgets.QGraphicsItem]', 'List[PySide2.QtWidgets.QStyleOptionGraphicsItem]'),
"QGraphicsView.dropEvent": ('PySide2.QtGui.QDropEvent',),
"QGraphicsView.ensureVisible": [('PySide2.QtCore.QRectF', 'int', 'int'), ('PySide2.QtWidgets.QGraphicsItem', 'int', 'int'), ('float', 'float', 'float', 'float', 'int', 'int')],
"QGraphicsView.event": ('PySide2.QtCore.QEvent',),
@@ -8873,7 +8889,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsWidget.insertAction": ('PySide2.QtWidgets.QAction', 'PySide2.QtWidgets.QAction'),
"QGraphicsWidget.insertActions": ('PySide2.QtWidgets.QAction', 'list'),
"QGraphicsWidget.isActiveWindow": (),
- "QGraphicsWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsWidget.layout": (),
"QGraphicsWidget.layoutDirection": (),
"QGraphicsWidget.moveEvent": ('PySide2.QtWidgets.QGraphicsSceneMoveEvent',),
@@ -8881,7 +8897,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsWidget.paintWindowFrame": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
"QGraphicsWidget.palette": (),
"QGraphicsWidget.polishEvent": (),
- "QGraphicsWidget.propertyChange": ('str', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsWidget.propertyChange": ('str', 'Any'),
"QGraphicsWidget.rect": (),
"QGraphicsWidget.releaseShortcut": ('int',),
"QGraphicsWidget.removeAction": ('PySide2.QtWidgets.QAction',),
@@ -9097,7 +9113,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QInputDialog.doubleValue": (),
"QInputDialog.getDouble": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'float', 'float', 'float', 'int', 'bool', 'WindowFlags'),
"QInputDialog.getInt": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'int', 'int', 'int', 'int', 'bool', 'WindowFlags'),
- "QInputDialog.getItem": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.support.signature.typing.List', 'int', 'bool', 'bool', 'WindowFlags', 'InputMethodHints'),
+ "QInputDialog.getItem": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'List[str]', 'int', 'bool', 'bool', 'WindowFlags', 'InputMethodHints'),
"QInputDialog.getMultiLineText": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'bool', 'WindowFlags', 'InputMethodHints'),
"QInputDialog.getText": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.QtWidgets.QLineEdit.EchoMode', 'str', 'bool', 'WindowFlags', 'InputMethodHints'),
"QInputDialog.inputMode": (),
@@ -9112,7 +9128,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QInputDialog.open": [(), ('PySide2.QtCore.QObject', 'str')],
"QInputDialog.setCancelButtonText": ('str',),
"QInputDialog.setComboBoxEditable": ('bool',),
- "QInputDialog.setComboBoxItems": ('PySide2.support.signature.typing.List',),
+ "QInputDialog.setComboBoxItems": ('List[str]',),
"QInputDialog.setDoubleDecimals": ('int',),
"QInputDialog.setDoubleMaximum": ('float',),
"QInputDialog.setDoubleMinimum": ('float',),
@@ -9138,8 +9154,8 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QItemDelegate:
"QItemDelegate.__init__": ('PySide2.QtCore.QObject',),
"QItemDelegate.createEditor": ('PySide2.QtWidgets.QWidget', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
- "QItemDelegate.decoration": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.support.signature.typing.Any'),
- "QItemDelegate.doCheck": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'PySide2.support.signature.typing.Any'),
+ "QItemDelegate.decoration": ('PySide2.QtWidgets.QStyleOptionViewItem', 'Any'),
+ "QItemDelegate.doCheck": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'Any'),
"QItemDelegate.drawBackground": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
"QItemDelegate.drawCheck": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'PySide2.QtCore.Qt.CheckState'),
"QItemDelegate.drawDecoration": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'PySide2.QtGui.QPixmap'),
@@ -9374,7 +9390,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QLineEdit.initStyleOption": ('PySide2.QtWidgets.QStyleOptionFrame',),
"QLineEdit.inputMask": (),
"QLineEdit.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QLineEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
+ "QLineEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
"QLineEdit.insert": ('str',),
"QLineEdit.isClearButtonEnabled": (),
"QLineEdit.isModified": (),
@@ -9490,7 +9506,7 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QListWidget:
"QListWidget.__init__": ('PySide2.QtWidgets.QWidget',),
"QListWidget.addItem": [('PySide2.QtWidgets.QListWidgetItem',), ('str',)],
- "QListWidget.addItems": ('PySide2.support.signature.typing.List',),
+ "QListWidget.addItems": ('List[str]',),
"QListWidget.clear": (),
"QListWidget.closePersistentEditor": [('PySide2.QtCore.QModelIndex',), ('PySide2.QtWidgets.QListWidgetItem',)],
"QListWidget.count": (),
@@ -9503,7 +9519,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QListWidget.findItems": ('str', 'MatchFlags'),
"QListWidget.indexFromItem": ('PySide2.QtWidgets.QListWidgetItem',),
"QListWidget.insertItem": [('int', 'PySide2.QtWidgets.QListWidgetItem'), ('int', 'str')],
- "QListWidget.insertItems": ('int', 'PySide2.support.signature.typing.List'),
+ "QListWidget.insertItems": ('int', 'List[str]'),
"QListWidget.isItemHidden": ('PySide2.QtWidgets.QListWidgetItem',),
"QListWidget.isItemSelected": ('PySide2.QtWidgets.QListWidgetItem',),
"QListWidget.isSortingEnabled": (),
@@ -9550,7 +9566,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QListWidgetItem.setBackground": ('PySide2.QtGui.QBrush',),
"QListWidgetItem.setBackgroundColor": ('PySide2.QtGui.QColor',),
"QListWidgetItem.setCheckState": ('PySide2.QtCore.Qt.CheckState',),
- "QListWidgetItem.setData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QListWidgetItem.setData": ('int', 'Any'),
"QListWidgetItem.setFlags": ('ItemFlags',),
"QListWidgetItem.setFont": ('PySide2.QtGui.QFont',),
"QListWidgetItem.setForeground": ('PySide2.QtGui.QBrush',),
@@ -9978,7 +9994,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QPlainTextEdit.focusOutEvent": ('PySide2.QtGui.QFocusEvent',),
"QPlainTextEdit.getPaintContext": (),
"QPlainTextEdit.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QPlainTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
+ "QPlainTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
"QPlainTextEdit.insertFromMimeData": ('PySide2.QtCore.QMimeData',),
"QPlainTextEdit.insertPlainText": ('str',),
"QPlainTextEdit.isReadOnly": (),
@@ -10176,7 +10192,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QScrollBar.wheelEvent": ('PySide2.QtGui.QWheelEvent',),
# class PySide2.QtWidgets.QShortcut:
- "QShortcut.__init__": [('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Callable', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtWidgets.QWidget',)],
+ "QShortcut.__init__": [('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'Callable', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtWidgets.QWidget',)],
"QShortcut.autoRepeat": (),
"QShortcut.context": (),
"QShortcut.event": ('PySide2.QtCore.QEvent',),
@@ -10533,7 +10549,7 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QStyledItemDelegate:
"QStyledItemDelegate.__init__": ('PySide2.QtCore.QObject',),
"QStyledItemDelegate.createEditor": ('PySide2.QtWidgets.QWidget', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
- "QStyledItemDelegate.displayText": ('PySide2.support.signature.typing.Any', 'PySide2.QtCore.QLocale'),
+ "QStyledItemDelegate.displayText": ('Any', 'PySide2.QtCore.QLocale'),
"QStyledItemDelegate.editorEvent": ('PySide2.QtCore.QEvent', 'PySide2.QtCore.QAbstractItemModel', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
"QStyledItemDelegate.eventFilter": ('PySide2.QtCore.QObject', 'PySide2.QtCore.QEvent'),
"QStyledItemDelegate.initStyleOption": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
@@ -10614,7 +10630,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTabBar.setSelectionBehaviorOnRemove": ('PySide2.QtWidgets.QTabBar.SelectionBehavior',),
"QTabBar.setShape": ('PySide2.QtWidgets.QTabBar.Shape',),
"QTabBar.setTabButton": ('int', 'PySide2.QtWidgets.QTabBar.ButtonPosition', 'PySide2.QtWidgets.QWidget'),
- "QTabBar.setTabData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QTabBar.setTabData": ('int', 'Any'),
"QTabBar.setTabEnabled": ('int', 'bool'),
"QTabBar.setTabIcon": ('int', 'PySide2.QtGui.QIcon'),
"QTabBar.setTabText": ('int', 'str'),
@@ -10822,7 +10838,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTableWidget.setCurrentCell": [('int', 'int'), ('int', 'int', 'SelectionFlags')],
"QTableWidget.setCurrentItem": [('PySide2.QtWidgets.QTableWidgetItem',), ('PySide2.QtWidgets.QTableWidgetItem', 'SelectionFlags')],
"QTableWidget.setHorizontalHeaderItem": ('int', 'PySide2.QtWidgets.QTableWidgetItem'),
- "QTableWidget.setHorizontalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QTableWidget.setHorizontalHeaderLabels": ('List[str]',),
"QTableWidget.setItem": ('int', 'int', 'PySide2.QtWidgets.QTableWidgetItem'),
"QTableWidget.setItemPrototype": ('PySide2.QtWidgets.QTableWidgetItem',),
"QTableWidget.setItemSelected": ('PySide2.QtWidgets.QTableWidgetItem', 'bool'),
@@ -10831,7 +10847,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTableWidget.setRowCount": ('int',),
"QTableWidget.setSortingEnabled": ('bool',),
"QTableWidget.setVerticalHeaderItem": ('int', 'PySide2.QtWidgets.QTableWidgetItem'),
- "QTableWidget.setVerticalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QTableWidget.setVerticalHeaderLabels": ('List[str]',),
"QTableWidget.sortItems": ('int', 'PySide2.QtCore.Qt.SortOrder'),
"QTableWidget.supportedDropActions": (),
"QTableWidget.takeHorizontalHeaderItem": ('int',),
@@ -10860,7 +10876,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTableWidgetItem.setBackground": ('PySide2.QtGui.QBrush',),
"QTableWidgetItem.setBackgroundColor": ('PySide2.QtGui.QColor',),
"QTableWidgetItem.setCheckState": ('PySide2.QtCore.Qt.CheckState',),
- "QTableWidgetItem.setData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QTableWidgetItem.setData": ('int', 'Any'),
"QTableWidgetItem.setFlags": ('ItemFlags',),
"QTableWidgetItem.setFont": ('PySide2.QtGui.QFont',),
"QTableWidgetItem.setForeground": ('PySide2.QtGui.QBrush',),
@@ -10933,7 +10949,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTextBrowser.searchPaths": (),
"QTextBrowser.setOpenExternalLinks": ('bool',),
"QTextBrowser.setOpenLinks": ('bool',),
- "QTextBrowser.setSearchPaths": ('PySide2.support.signature.typing.List',),
+ "QTextBrowser.setSearchPaths": ('List[str]',),
"QTextBrowser.setSource": ('PySide2.QtCore.QUrl',),
"QTextBrowser.source": (),
@@ -10978,7 +10994,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTextEdit.fontUnderline": (),
"QTextEdit.fontWeight": (),
"QTextEdit.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
+ "QTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
"QTextEdit.insertFromMimeData": ('PySide2.QtCore.QMimeData',),
"QTextEdit.insertHtml": ('str',),
"QTextEdit.insertPlainText": ('str',),
@@ -11148,10 +11164,10 @@ if "PySide2.QtWidgets" in sys.modules:
"QToolButton.toolButtonStyle": (),
# class PySide2.QtWidgets.QToolTip:
- "QToolTip.palette": (),
"QToolTip.font": (),
"QToolTip.hideText": (),
"QToolTip.isVisible": (),
+ "QToolTip.palette": (),
"QToolTip.setFont": ('PySide2.QtGui.QFont',),
"QToolTip.setPalette": ('PySide2.QtGui.QPalette',),
"QToolTip.showText": [('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.QRect'), ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.QRect', 'int')],
@@ -11273,7 +11289,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.expandItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.findItems": ('str', 'MatchFlags', 'int'),
"QTreeWidget.headerItem": (),
- "QTreeWidget.indexFromItem": ['PySide2.QtWidgets.QTreeWidgetItem', 'int'],
+ "QTreeWidget.indexFromItem": ('PySide2.QtWidgets.QTreeWidgetItem', 'int'),
"QTreeWidget.indexOfTopLevelItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.insertTopLevelItem": ('int', 'PySide2.QtWidgets.QTreeWidgetItem'),
"QTreeWidget.insertTopLevelItems": ('int', 'list'),
@@ -11299,7 +11315,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.setFirstItemColumnSpanned": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
"QTreeWidget.setHeaderItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.setHeaderLabel": ('str',),
- "QTreeWidget.setHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QTreeWidget.setHeaderLabels": ('List[str]',),
"QTreeWidget.setItemExpanded": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
"QTreeWidget.setItemHidden": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
"QTreeWidget.setItemSelected": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
@@ -11315,7 +11331,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.visualItemRect": ('PySide2.QtWidgets.QTreeWidgetItem',),
# class PySide2.QtWidgets.QTreeWidgetItem:
- "QTreeWidgetItem.__init__": [('PySide2.QtWidgets.QTreeWidget', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'PySide2.support.signature.typing.List', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem',), ('PySide2.QtWidgets.QTreeWidgetItem', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'PySide2.support.signature.typing.List', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.support.signature.typing.List', 'int'), ('int',)],
+ "QTreeWidgetItem.__init__": [('List[str]', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'List[str]', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem',), ('PySide2.QtWidgets.QTreeWidgetItem', 'List[str]', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('int',)],
"QTreeWidgetItem.addChild": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidgetItem.addChildren": ('list',),
"QTreeWidgetItem.background": ('int',),
@@ -11347,7 +11363,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidgetItem.setBackgroundColor": ('int', 'PySide2.QtGui.QColor'),
"QTreeWidgetItem.setCheckState": ('int', 'PySide2.QtCore.Qt.CheckState'),
"QTreeWidgetItem.setChildIndicatorPolicy": ('PySide2.QtWidgets.QTreeWidgetItem.ChildIndicatorPolicy',),
- "QTreeWidgetItem.setData": ('int', 'int', 'PySide2.support.signature.typing.Any'),
+ "QTreeWidgetItem.setData": ('int', 'int', 'Any'),
"QTreeWidgetItem.setDisabled": ('bool',),
"QTreeWidgetItem.setExpanded": ('bool',),
"QTreeWidgetItem.setFirstColumnSpanned": ('bool',),
@@ -11457,8 +11473,8 @@ if "PySide2.QtWidgets" in sys.modules:
"QVBoxLayout.__init__": [(), ('PySide2.QtWidgets.QWidget',)],
# class PySide2.QtWidgets.QWhatsThis:
- "QWhatsThis.enterWhatsThisMode": (),
"QWhatsThis.createAction": ('PySide2.QtCore.QObject',),
+ "QWhatsThis.enterWhatsThisMode": (),
"QWhatsThis.hideText": (),
"QWhatsThis.inWhatsThisMode": (),
"QWhatsThis.leaveWhatsThisMode": (),
@@ -11767,7 +11783,6 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizard.field": ('str',),
"QWizard.hasVisitedPage": ('int',),
"QWizard.initializePage": ('int',),
- "QWizard.next": (),
"QWizard.nextId": (),
"QWizard.options": (),
"QWizard.page": ('int',),
@@ -11781,7 +11796,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizard.setButtonLayout": ('list',),
"QWizard.setButtonText": ('PySide2.QtWidgets.QWizard.WizardButton', 'str'),
"QWizard.setDefaultProperty": ('str', 'str', 'str'),
- "QWizard.setField": ('str', 'PySide2.support.signature.typing.Any'),
+ "QWizard.setField": ('str', 'Any'),
"QWizard.setOption": ('PySide2.QtWidgets.QWizard.WizardOption', 'bool'),
"QWizard.setOptions": ('WizardOptions',),
"QWizard.setPage": ('int', 'PySide2.QtWidgets.QWizardPage'),
@@ -11816,7 +11831,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizardPage.registerField": ('str', 'PySide2.QtWidgets.QWidget', 'str', 'str'),
"QWizardPage.setButtonText": ('PySide2.QtWidgets.QWizard.WizardButton', 'str'),
"QWizardPage.setCommitPage": ('bool',),
- "QWizardPage.setField": ('str', 'PySide2.support.signature.typing.Any'),
+ "QWizardPage.setField": ('str', 'Any'),
"QWizardPage.setFinalPage": ('bool',),
"QWizardPage.setPixmap": ('PySide2.QtWidgets.QWizard.WizardPixmap', 'PySide2.QtGui.QPixmap'),
"QWizardPage.setSubTitle": ('str',),
@@ -11875,7 +11890,7 @@ if "PySide2.QtPrintSupport" in sys.modules:
"QPrintEngine.newPage": (),
"QPrintEngine.printerState": (),
"QPrintEngine.property": ('PySide2.QtPrintSupport.QPrintEngine.PrintEnginePropertyKey',),
- "QPrintEngine.setProperty": ('PySide2.QtPrintSupport.QPrintEngine.PrintEnginePropertyKey', 'PySide2.support.signature.typing.Any'),
+ "QPrintEngine.setProperty": ('PySide2.QtPrintSupport.QPrintEngine.PrintEnginePropertyKey', 'Any'),
# class PySide2.QtPrintSupport.QPrintPreviewDialog:
"QPrintPreviewDialog.__init__": [('PySide2.QtPrintSupport.QPrinter', 'PySide2.QtWidgets.QWidget', 'WindowFlags'), ('PySide2.QtWidgets.QWidget', 'WindowFlags')],
@@ -12122,7 +12137,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlField.precision": (),
"QSqlField.requiredStatus": (),
"QSqlField.setAutoValue": ('bool',),
- "QSqlField.setDefaultValue": ('PySide2.support.signature.typing.Any',),
+ "QSqlField.setDefaultValue": ('Any',),
"QSqlField.setGenerated": ('bool',),
"QSqlField.setLength": ('int',),
"QSqlField.setName": ('str',),
@@ -12132,7 +12147,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlField.setRequiredStatus": ('PySide2.QtSql.QSqlField.RequiredStatus',),
"QSqlField.setSqlType": ('int',),
"QSqlField.setType": ('type',),
- "QSqlField.setValue": ('PySide2.support.signature.typing.Any',),
+ "QSqlField.setValue": ('Any',),
"QSqlField.type": (),
"QSqlField.typeID": (),
"QSqlField.value": (),
@@ -12151,9 +12166,9 @@ if "PySide2.QtSql" in sys.modules:
# class PySide2.QtSql.QSqlQuery:
"QSqlQuery.__init__": [('PySide2.QtSql.QSqlDatabase',), ('PySide2.QtSql.QSqlQuery',), ('PySide2.QtSql.QSqlResult',), ('str', 'PySide2.QtSql.QSqlDatabase')],
"QSqlQuery.__copy__": (),
- "QSqlQuery.addBindValue": ('PySide2.support.signature.typing.Any', 'ParamType'),
+ "QSqlQuery.addBindValue": ('Any', 'ParamType'),
"QSqlQuery.at": (),
- "QSqlQuery.bindValue": [('int', 'PySide2.support.signature.typing.Any', 'ParamType'), ('str', 'PySide2.support.signature.typing.Any', 'ParamType')],
+ "QSqlQuery.bindValue": [('int', 'Any', 'ParamType'), ('str', 'Any', 'ParamType')],
"QSqlQuery.boundValue": [('int',), ('str',)],
"QSqlQuery.boundValues": (),
"QSqlQuery.clear": (),
@@ -12172,7 +12187,6 @@ if "PySide2.QtSql" in sys.modules:
"QSqlQuery.lastError": (),
"QSqlQuery.lastInsertId": (),
"QSqlQuery.lastQuery": (),
- "QSqlQuery.next": (),
"QSqlQuery.nextResult": (),
"QSqlQuery.numRowsAffected": (),
"QSqlQuery.numericalPrecisionPolicy": (),
@@ -12212,7 +12226,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlQueryModel.record": [(), ('int',)],
"QSqlQueryModel.removeColumns": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QSqlQueryModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QSqlQueryModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSqlQueryModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QSqlQueryModel.setLastError": ('PySide2.QtSql.QSqlError',),
"QSqlQueryModel.setQuery": [('PySide2.QtSql.QSqlQuery',), ('str', 'PySide2.QtSql.QSqlDatabase')],
@@ -12236,7 +12250,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlRecord.replace": ('int', 'PySide2.QtSql.QSqlField'),
"QSqlRecord.setGenerated": [('int', 'bool'), ('str', 'bool')],
"QSqlRecord.setNull": [('int',), ('str',)],
- "QSqlRecord.setValue": [('int', 'PySide2.support.signature.typing.Any'), ('str', 'PySide2.support.signature.typing.Any')],
+ "QSqlRecord.setValue": [('int', 'Any'), ('str', 'Any')],
"QSqlRecord.value": [('int',), ('str',)],
# class PySide2.QtSql.QSqlRelation:
@@ -12265,7 +12279,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlRelationalTableModel.revertRow": ('int',),
"QSqlRelationalTableModel.select": (),
"QSqlRelationalTableModel.selectStatement": (),
- "QSqlRelationalTableModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSqlRelationalTableModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QSqlRelationalTableModel.setJoinMode": ('PySide2.QtSql.QSqlRelationalTableModel.JoinMode',),
"QSqlRelationalTableModel.setRelation": ('int', 'PySide2.QtSql.QSqlRelation'),
"QSqlRelationalTableModel.setTable": ('str',),
@@ -12273,9 +12287,9 @@ if "PySide2.QtSql" in sys.modules:
# class PySide2.QtSql.QSqlResult:
"QSqlResult.__init__": ('PySide2.QtSql.QSqlDriver',),
- "QSqlResult.addBindValue": ('PySide2.support.signature.typing.Any', 'ParamType'),
+ "QSqlResult.addBindValue": ('Any', 'ParamType'),
"QSqlResult.at": (),
- "QSqlResult.bindValue": [('int', 'PySide2.support.signature.typing.Any', 'ParamType'), ('str', 'PySide2.support.signature.typing.Any', 'ParamType')],
+ "QSqlResult.bindValue": [('int', 'Any', 'ParamType'), ('str', 'Any', 'ParamType')],
"QSqlResult.bindValueType": [('int',), ('str',)],
"QSqlResult.bindingSyntax": (),
"QSqlResult.boundValue": [('int',), ('str',)],
@@ -12350,7 +12364,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlTableModel.select": (),
"QSqlTableModel.selectRow": ('int',),
"QSqlTableModel.selectStatement": (),
- "QSqlTableModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSqlTableModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QSqlTableModel.setEditStrategy": ('PySide2.QtSql.QSqlTableModel.EditStrategy',),
"QSqlTableModel.setFilter": ('str',),
"QSqlTableModel.setPrimaryKey": ('PySide2.QtSql.QSqlIndex',),
@@ -12415,7 +12429,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QAbstractSocket.setReadBufferSize": ('int',),
"QAbstractSocket.setSocketDescriptor": ('int', 'PySide2.QtNetwork.QAbstractSocket.SocketState', 'OpenMode'),
"QAbstractSocket.setSocketError": ('PySide2.QtNetwork.QAbstractSocket.SocketError',),
- "QAbstractSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'PySide2.support.signature.typing.Any'),
+ "QAbstractSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'Any'),
"QAbstractSocket.setSocketState": ('PySide2.QtNetwork.QAbstractSocket.SocketState',),
"QAbstractSocket.socketDescriptor": (),
"QAbstractSocket.socketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption',),
@@ -12435,7 +12449,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QAuthenticator.options": (),
"QAuthenticator.password": (),
"QAuthenticator.realm": (),
- "QAuthenticator.setOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QAuthenticator.setOption": ('str', 'Any'),
"QAuthenticator.setPassword": ('str',),
"QAuthenticator.setRealm": ('str',),
"QAuthenticator.setUser": ('str',),
@@ -12446,7 +12460,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QHostAddress.__copy__": (),
"QHostAddress.clear": (),
"QHostAddress.isEqual": ('PySide2.QtNetwork.QHostAddress', 'ConversionMode'),
- "QHostAddress.isInSubnet": [('PySide2.QtNetwork.QHostAddress', 'int'), ('PySide2.support.signature.typing.Tuple',)],
+ "QHostAddress.isInSubnet": [('PySide2.QtNetwork.QHostAddress', 'int'), ('Tuple[Any, Any]',)],
"QHostAddress.isLoopback": (),
"QHostAddress.isMulticast": (),
"QHostAddress.isNull": (),
@@ -12704,7 +12718,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkProxy.rawHeaderList": (),
"QNetworkProxy.setApplicationProxy": ('PySide2.QtNetwork.QNetworkProxy',),
"QNetworkProxy.setCapabilities": ('Capabilities',),
- "QNetworkProxy.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'PySide2.support.signature.typing.Any'),
+ "QNetworkProxy.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'Any'),
"QNetworkProxy.setHostName": ('str',),
"QNetworkProxy.setPassword": ('str',),
"QNetworkProxy.setPort": ('int',),
@@ -12761,10 +12775,10 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkReply.rawHeaderList": (),
"QNetworkReply.readBufferSize": (),
"QNetworkReply.request": (),
- "QNetworkReply.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'PySide2.support.signature.typing.Any'),
+ "QNetworkReply.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'Any'),
"QNetworkReply.setError": ('PySide2.QtNetwork.QNetworkReply.NetworkError', 'str'),
"QNetworkReply.setFinished": ('bool',),
- "QNetworkReply.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'PySide2.support.signature.typing.Any'),
+ "QNetworkReply.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'Any'),
"QNetworkReply.setOperation": ('PySide2.QtNetwork.QNetworkAccessManager.Operation',),
"QNetworkReply.setRawHeader": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray'),
"QNetworkReply.setReadBufferSize": ('int',),
@@ -12780,7 +12794,7 @@ if "PySide2.QtNetwork" in sys.modules:
# class PySide2.QtNetwork.QNetworkRequest:
"QNetworkRequest.__init__": [('PySide2.QtCore.QUrl',), ('PySide2.QtNetwork.QNetworkRequest',)],
"QNetworkRequest.__copy__": (),
- "QNetworkRequest.attribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'PySide2.support.signature.typing.Any'),
+ "QNetworkRequest.attribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'Any'),
"QNetworkRequest.hasRawHeader": ('PySide2.QtCore.QByteArray',),
"QNetworkRequest.header": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders',),
"QNetworkRequest.maximumRedirectsAllowed": (),
@@ -12788,8 +12802,8 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkRequest.priority": (),
"QNetworkRequest.rawHeader": ('PySide2.QtCore.QByteArray',),
"QNetworkRequest.rawHeaderList": (),
- "QNetworkRequest.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'PySide2.support.signature.typing.Any'),
- "QNetworkRequest.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'PySide2.support.signature.typing.Any'),
+ "QNetworkRequest.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'Any'),
+ "QNetworkRequest.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'Any'),
"QNetworkRequest.setMaximumRedirectsAllowed": ('int',),
"QNetworkRequest.setOriginatingObject": ('PySide2.QtCore.QObject',),
"QNetworkRequest.setPriority": ('PySide2.QtNetwork.QNetworkRequest.Priority',),
@@ -12818,7 +12832,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkSession.open": (),
"QNetworkSession.reject": (),
"QNetworkSession.sessionProperty": ('str',),
- "QNetworkSession.setSessionProperty": ('str', 'PySide2.support.signature.typing.Any'),
+ "QNetworkSession.setSessionProperty": ('str', 'Any'),
"QNetworkSession.state": (),
"QNetworkSession.stop": (),
"QNetworkSession.usagePolicies": (),
@@ -12983,7 +12997,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QSslSocket.setProtocol": ('PySide2.QtNetwork.QSsl.SslProtocol',),
"QSslSocket.setReadBufferSize": ('int',),
"QSslSocket.setSocketDescriptor": ('int', 'PySide2.QtNetwork.QAbstractSocket.SocketState', 'OpenMode'),
- "QSslSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'PySide2.support.signature.typing.Any'),
+ "QSslSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'Any'),
"QSslSocket.setSslConfiguration": ('PySide2.QtNetwork.QSslConfiguration',),
"QSslSocket.socketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption',),
"QSslSocket.sslConfiguration": (),
@@ -13046,9 +13060,8 @@ if "PySide2.QtTest" in sys.modules:
dict.update({
# class PySide2.QtTest.QTest:
- "QTest.waitForEvents": (),
"QTest.addColumnInternal": ('int', 'str'),
- "QTest.asciiToKey": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QTest.asciiToKey": ('Union[str, int]',),
"QTest.compare_string_helper": ('str', 'str', 'str', 'str', 'str', 'int'),
"QTest.createTouchDevice": ('PySide2.QtGui.QTouchDevice.DeviceType',),
"QTest.currentAppName": (),
@@ -13056,11 +13069,11 @@ if "PySide2.QtTest" in sys.modules:
"QTest.currentTestFailed": (),
"QTest.currentTestFunction": (),
"QTest.ignoreMessage": [('PySide2.QtCore.QtMsgType', 'PySide2.QtCore.QRegularExpression'), ('PySide2.QtCore.QtMsgType', 'str')],
- "QTest.keyClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
"QTest.keyClicks": ('PySide2.QtWidgets.QWidget', 'str', 'KeyboardModifiers', 'int'),
- "QTest.keyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
- "QTest.keyPress": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
- "QTest.keyRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyPress": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
"QTest.keyToAscii": ('PySide2.QtCore.Qt.Key',),
"QTest.mouseClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
"QTest.mouseDClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
@@ -13070,18 +13083,19 @@ if "PySide2.QtTest" in sys.modules:
"QTest.mouseRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
"QTest.qElementData": ('str', 'int'),
"QTest.qExpectFail": ('str', 'str', 'PySide2.QtTest.QTest.TestFailMode', 'str', 'int'),
- "QTest.qFindTestData": ['int', 'str', 'str', 'str'],
+ "QTest.qFindTestData": ('str', 'str', 'int', 'str'),
"QTest.qGlobalData": ('str', 'int'),
"QTest.qSkip": ('str', 'str', 'int'),
"QTest.qWaitForWindowActive": ('PySide2.QtWidgets.QWidget', 'int'),
"QTest.qWaitForWindowExposed": ('PySide2.QtWidgets.QWidget', 'int'),
- "QTest.sendKeyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int')],
+ "QTest.sendKeyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int')],
"QTest.setBenchmarkResult": ('float', 'PySide2.QtTest.QTest.QBenchmarkMetric'),
"QTest.setMainSourcePath": ('str', 'str'),
"QTest.simulateEvent": [('PySide2.QtGui.QWindow', 'bool', 'int', 'KeyboardModifiers', 'str', 'bool', 'int'), ('PySide2.QtWidgets.QWidget', 'bool', 'int', 'KeyboardModifiers', 'str', 'bool', 'int')],
"QTest.testObject": (),
"QTest.toPrettyCString": ('str', 'int'),
"QTest.touchEvent": [('PySide2.QtGui.QWindow', 'PySide2.QtGui.QTouchDevice', 'bool'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtGui.QTouchDevice', 'bool')],
+ "QTest.waitForEvents": (),
})
# Module PySide2.QtConcurrent
@@ -13096,9 +13110,9 @@ if "PySide2.QtMacExtras" in sys.modules:
dict.update({
# class PySide2.QtMacExtras.QMacPasteboardMime:
- "QMacPasteboardMime.__init__": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QMacPasteboardMime.__init__": ('Union[str, int]',),
"QMacPasteboardMime.canConvert": ('str', 'str'),
- "QMacPasteboardMime.convertFromMime": ('str', 'PySide2.support.signature.typing.Any', 'str'),
+ "QMacPasteboardMime.convertFromMime": ('str', 'Any', 'str'),
"QMacPasteboardMime.convertToMime": ('str', 'list', 'str'),
"QMacPasteboardMime.convertorName": (),
"QMacPasteboardMime.count": ('PySide2.QtCore.QMimeData',),
@@ -13460,7 +13474,6 @@ if "PySide2.QtXml" in sys.modules:
"QXmlInputSource.data": (),
"QXmlInputSource.fetchData": (),
"QXmlInputSource.fromRawData": ('PySide2.QtCore.QByteArray', 'bool'),
- "QXmlInputSource.next": (),
"QXmlInputSource.reset": (),
"QXmlInputSource.setData": [('PySide2.QtCore.QByteArray',), ('str',)],
@@ -13511,7 +13524,7 @@ if "PySide2.QtXml" in sys.modules:
"QXmlReader.hasFeature": ('str',),
"QXmlReader.hasProperty": ('str',),
"QXmlReader.lexicalHandler": (),
- "QXmlReader.parse": ['PySide2.QtXml.QXmlInputSource'],
+ "QXmlReader.parse": ('PySide2.QtXml.QXmlInputSource',),
"QXmlReader.property": ('str', 'bool'),
"QXmlReader.setContentHandler": ('PySide2.QtXml.QXmlContentHandler',),
"QXmlReader.setDTDHandler": ('PySide2.QtXml.QXmlDTDHandler',),
@@ -13582,7 +13595,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
# class PySide2.QtXmlPatterns.QAbstractXmlReceiver:
"QAbstractXmlReceiver.__init__": (),
- "QAbstractXmlReceiver.atomicValue": ('PySide2.support.signature.typing.Any',),
+ "QAbstractXmlReceiver.atomicValue": ('Any',),
"QAbstractXmlReceiver.attribute": ('PySide2.QtXmlPatterns.QXmlName', 'str'),
"QAbstractXmlReceiver.characters": ('str',),
"QAbstractXmlReceiver.comment": ('str',),
@@ -13609,7 +13622,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
# class PySide2.QtXmlPatterns.QXmlFormatter:
"QXmlFormatter.__init__": ('PySide2.QtXmlPatterns.QXmlQuery', 'PySide2.QtCore.QIODevice'),
- "QXmlFormatter.atomicValue": ('PySide2.support.signature.typing.Any',),
+ "QXmlFormatter.atomicValue": ('Any',),
"QXmlFormatter.attribute": ('PySide2.QtXmlPatterns.QXmlName', 'str'),
"QXmlFormatter.characters": ('str',),
"QXmlFormatter.comment": ('str',),
@@ -13624,7 +13637,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
"QXmlFormatter.startOfSequence": (),
# class PySide2.QtXmlPatterns.QXmlItem:
- "QXmlItem.__init__": [(), ('PySide2.QtXmlPatterns.QXmlItem',), ('PySide2.QtXmlPatterns.QXmlNodeModelIndex',), ('PySide2.support.signature.typing.Any',)],
+ "QXmlItem.__init__": [(), ('Any',), ('PySide2.QtXmlPatterns.QXmlItem',), ('PySide2.QtXmlPatterns.QXmlNodeModelIndex',)],
"QXmlItem.__copy__": (),
"QXmlItem.isAtomicValue": (),
"QXmlItem.isNode": (),
@@ -13677,7 +13690,6 @@ if "PySide2.QtXmlPatterns" in sys.modules:
"QXmlResultItems.__init__": (),
"QXmlResultItems.current": (),
"QXmlResultItems.hasError": (),
- "QXmlResultItems.next": (),
# class PySide2.QtXmlPatterns.QXmlSchema:
"QXmlSchema.__init__": [(), ('PySide2.QtXmlPatterns.QXmlSchema',)],
@@ -13703,7 +13715,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
# class PySide2.QtXmlPatterns.QXmlSerializer:
"QXmlSerializer.__init__": ('PySide2.QtXmlPatterns.QXmlQuery', 'PySide2.QtCore.QIODevice'),
- "QXmlSerializer.atomicValue": ('PySide2.support.signature.typing.Any',),
+ "QXmlSerializer.atomicValue": ('Any',),
"QXmlSerializer.attribute": ('PySide2.QtXmlPatterns.QXmlName', 'str'),
"QXmlSerializer.characters": ('str',),
"QXmlSerializer.codec": (),
@@ -13725,11 +13737,11 @@ if "PySide2.QtHelp" in sys.modules:
dict.update({
# class PySide2.QtHelp.QHelpContentItem:
- "QHelpContentItem.parent": (),
"QHelpContentItem.__copy__": (),
"QHelpContentItem.child": ('int',),
"QHelpContentItem.childCount": (),
"QHelpContentItem.childPosition": ('PySide2.QtHelp.QHelpContentItem',),
+ "QHelpContentItem.parent": (),
"QHelpContentItem.row": (),
"QHelpContentItem.title": (),
"QHelpContentItem.url": (),
@@ -13757,17 +13769,17 @@ if "PySide2.QtHelp" in sys.modules:
# class PySide2.QtHelp.QHelpEngineCore:
"QHelpEngineCore.__init__": ('str', 'PySide2.QtCore.QObject'),
- "QHelpEngineCore.addCustomFilter": ('str', 'PySide2.support.signature.typing.List'),
+ "QHelpEngineCore.addCustomFilter": ('str', 'List[str]'),
"QHelpEngineCore.autoSaveFilter": (),
"QHelpEngineCore.collectionFile": (),
"QHelpEngineCore.copyCollectionFile": ('str',),
"QHelpEngineCore.currentFilter": (),
"QHelpEngineCore.customFilters": (),
- "QHelpEngineCore.customValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QHelpEngineCore.customValue": ('str', 'Any'),
"QHelpEngineCore.documentationFileName": ('str',),
"QHelpEngineCore.error": (),
"QHelpEngineCore.fileData": ('PySide2.QtCore.QUrl',),
- "QHelpEngineCore.files": ('str', 'PySide2.support.signature.typing.List', 'str'),
+ "QHelpEngineCore.files": ('str', 'List[str]', 'str'),
"QHelpEngineCore.filterAttributeSets": ('str',),
"QHelpEngineCore.filterAttributes": [(), ('str',)],
"QHelpEngineCore.findFile": ('PySide2.QtCore.QUrl',),
@@ -13782,15 +13794,15 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpEngineCore.setAutoSaveFilter": ('bool',),
"QHelpEngineCore.setCollectionFile": ('str',),
"QHelpEngineCore.setCurrentFilter": ('str',),
- "QHelpEngineCore.setCustomValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QHelpEngineCore.setCustomValue": ('str', 'Any'),
"QHelpEngineCore.setupData": (),
"QHelpEngineCore.unregisterDocumentation": ('str',),
# class PySide2.QtHelp.QHelpIndexModel:
- "QHelpIndexModel.linksForKeyword": ('str',),
"QHelpIndexModel.createIndex": [('int', 'int', 'int'), ('int', 'int', 'object'), ('str',)],
"QHelpIndexModel.filter": ('str', 'str'),
"QHelpIndexModel.isCreatingIndex": (),
+ "QHelpIndexModel.linksForKeyword": ('str',),
# class PySide2.QtHelp.QHelpIndexWidget:
"QHelpIndexWidget.activateCurrentItem": (),
@@ -13810,9 +13822,10 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpSearchEngine.search": [('list',), ('str',)],
"QHelpSearchEngine.searchInput": (),
"QHelpSearchEngine.searchResultCount": (),
+ "QHelpSearchEngine.searchResults": ('int', 'int'),
# class PySide2.QtHelp.QHelpSearchQuery:
- "QHelpSearchQuery.__init__": [(), ('PySide2.QtHelp.QHelpSearchQuery',), ('PySide2.QtHelp.QHelpSearchQuery.FieldName', 'PySide2.support.signature.typing.List')],
+ "QHelpSearchQuery.__init__": [(), ('PySide2.QtHelp.QHelpSearchQuery',), ('PySide2.QtHelp.QHelpSearchQuery.FieldName', 'List[str]')],
"QHelpSearchQuery.__copy__": (),
# class PySide2.QtHelp.QHelpSearchQueryWidget:
@@ -13828,9 +13841,15 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpSearchQueryWidget.setQuery": ('list',),
"QHelpSearchQueryWidget.setSearchInput": ('str',),
+ # class PySide2.QtHelp.QHelpSearchResult:
+ "QHelpSearchResult.__init__": [(), ('PySide2.QtCore.QUrl', 'str', 'str'), ('PySide2.QtHelp.QHelpSearchResult',)],
+ "QHelpSearchResult.snippet": (),
+ "QHelpSearchResult.title": (),
+ "QHelpSearchResult.url": (),
+
# class PySide2.QtHelp.QHelpSearchResultWidget:
- "QHelpSearchResultWidget.linkAt": ('PySide2.QtCore.QPoint',),
"QHelpSearchResultWidget.changeEvent": ('PySide2.QtCore.QEvent',),
+ "QHelpSearchResultWidget.linkAt": ('PySide2.QtCore.QPoint',),
})
# Module PySide2.QtMultimedia
@@ -13932,7 +13951,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioBuffer.__copy__": (),
"QAudioBuffer.byteCount": (),
"QAudioBuffer.constData": (),
- "QAudioBuffer.data": [],
+ "QAudioBuffer.data": (),
"QAudioBuffer.duration": (),
"QAudioBuffer.format": (),
"QAudioBuffer.frameCount": (),
@@ -13947,7 +13966,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioDecoder.bufferAvailable": (),
"QAudioDecoder.duration": (),
"QAudioDecoder.errorString": (),
- "QAudioDecoder.hasSupport": ('str', 'PySide2.support.signature.typing.List'),
+ "QAudioDecoder.hasSupport": ('str', 'List[str]'),
"QAudioDecoder.position": (),
"QAudioDecoder.read": (),
"QAudioDecoder.setAudioFormat": ('PySide2.QtMultimedia.QAudioFormat',),
@@ -14010,7 +14029,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioEncoderSettings.setChannelCount": ('int',),
"QAudioEncoderSettings.setCodec": ('str',),
"QAudioEncoderSettings.setEncodingMode": ('PySide2.QtMultimedia.QMultimedia.EncodingMode',),
- "QAudioEncoderSettings.setEncodingOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QAudioEncoderSettings.setEncodingOption": ('str', 'Any'),
"QAudioEncoderSettings.setEncodingOptions": ('dict',),
"QAudioEncoderSettings.setQuality": ('PySide2.QtMultimedia.QMultimedia.EncodingQuality',),
"QAudioEncoderSettings.setSampleRate": ('int',),
@@ -14180,7 +14199,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QCameraExposureControl.actualValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter',),
"QCameraExposureControl.isParameterSupported": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter',),
"QCameraExposureControl.requestedValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter',),
- "QCameraExposureControl.setValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraExposureControl.setValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter', 'Any'),
# class PySide2.QtMultimedia.QCameraFocusZone:
"QCameraFocusZone.__init__": [(), ('PySide2.QtCore.QRectF', 'PySide2.QtMultimedia.QCameraFocusZone.FocusZoneStatus'), ('PySide2.QtMultimedia.QCameraFocusZone',)],
@@ -14222,9 +14241,9 @@ if "PySide2.QtMultimedia" in sys.modules:
# class PySide2.QtMultimedia.QCameraImageProcessingControl:
"QCameraImageProcessingControl.__init__": ('PySide2.QtCore.QObject',),
"QCameraImageProcessingControl.isParameterSupported": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter',),
- "QCameraImageProcessingControl.isParameterValueSupported": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraImageProcessingControl.isParameterValueSupported": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'Any'),
"QCameraImageProcessingControl.parameter": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter',),
- "QCameraImageProcessingControl.setParameter": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraImageProcessingControl.setParameter": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'Any'),
# class PySide2.QtMultimedia.QCameraInfo:
"QCameraInfo.__init__": [('PySide2.QtCore.QByteArray',), ('PySide2.QtMultimedia.QCamera',), ('PySide2.QtMultimedia.QCameraInfo',)],
@@ -14268,7 +14287,7 @@ if "PySide2.QtMultimedia" in sys.modules:
# class PySide2.QtMultimedia.QCameraViewfinderSettingsControl:
"QCameraViewfinderSettingsControl.__init__": ('PySide2.QtCore.QObject',),
"QCameraViewfinderSettingsControl.isViewfinderParameterSupported": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter',),
- "QCameraViewfinderSettingsControl.setViewfinderParameter": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraViewfinderSettingsControl.setViewfinderParameter": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter', 'Any'),
"QCameraViewfinderSettingsControl.viewfinderParameter": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter',),
# class PySide2.QtMultimedia.QCameraViewfinderSettingsControl2:
@@ -14304,7 +14323,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QImageEncoderSettings.quality": (),
"QImageEncoderSettings.resolution": (),
"QImageEncoderSettings.setCodec": ('str',),
- "QImageEncoderSettings.setEncodingOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QImageEncoderSettings.setEncodingOption": ('str', 'Any'),
"QImageEncoderSettings.setEncodingOptions": ('dict',),
"QImageEncoderSettings.setQuality": ('PySide2.QtMultimedia.QMultimedia.EncodingQuality',),
"QImageEncoderSettings.setResolution": [('PySide2.QtCore.QSize',), ('int', 'int')],
@@ -14355,7 +14374,6 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaNetworkAccessControl.setConfigurations": ('list',),
# class PySide2.QtMultimedia.QMediaObject:
- "QMediaObject.notifyInterval": (),
"QMediaObject.addPropertyWatch": ('PySide2.QtCore.QByteArray',),
"QMediaObject.availability": (),
"QMediaObject.availableMetaData": (),
@@ -14363,6 +14381,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaObject.isAvailable": (),
"QMediaObject.isMetaDataAvailable": (),
"QMediaObject.metaData": ('str',),
+ "QMediaObject.notifyInterval": (),
"QMediaObject.removePropertyWatch": ('PySide2.QtCore.QByteArray',),
"QMediaObject.setNotifyInterval": ('int',),
"QMediaObject.unbind": ('PySide2.QtCore.QObject',),
@@ -14377,7 +14396,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaPlayer.currentNetworkConfiguration": (),
"QMediaPlayer.duration": (),
"QMediaPlayer.errorString": (),
- "QMediaPlayer.hasSupport": ('str', 'PySide2.support.signature.typing.List', 'Flags'),
+ "QMediaPlayer.hasSupport": ('str', 'List[str]', 'Flags'),
"QMediaPlayer.isAudioAvailable": (),
"QMediaPlayer.isMuted": (),
"QMediaPlayer.isSeekable": (),
@@ -14447,7 +14466,6 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaPlaylist.mediaCount": (),
"QMediaPlaylist.mediaObject": (),
"QMediaPlaylist.moveMedia": ('int', 'int'),
- "QMediaPlaylist.next": (),
"QMediaPlaylist.nextIndex": ('int',),
"QMediaPlaylist.playbackMode": (),
"QMediaPlaylist.previous": (),
@@ -14483,7 +14501,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaRecorder.setContainerFormat": ('str',),
"QMediaRecorder.setEncodingSettings": ('PySide2.QtMultimedia.QAudioEncoderSettings', 'PySide2.QtMultimedia.QVideoEncoderSettings', 'str'),
"QMediaRecorder.setMediaObject": ('PySide2.QtMultimedia.QMediaObject',),
- "QMediaRecorder.setMetaData": ('str', 'PySide2.support.signature.typing.Any'),
+ "QMediaRecorder.setMetaData": ('str', 'Any'),
"QMediaRecorder.setMuted": ('bool',),
"QMediaRecorder.setOutputLocation": ('PySide2.QtCore.QUrl',),
"QMediaRecorder.setVideoSettings": ('PySide2.QtMultimedia.QVideoEncoderSettings',),
@@ -14691,7 +14709,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoEncoderSettings.setBitRate": ('int',),
"QVideoEncoderSettings.setCodec": ('str',),
"QVideoEncoderSettings.setEncodingMode": ('PySide2.QtMultimedia.QMultimedia.EncodingMode',),
- "QVideoEncoderSettings.setEncodingOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QVideoEncoderSettings.setEncodingOption": ('str', 'Any'),
"QVideoEncoderSettings.setEncodingOptions": ('dict',),
"QVideoEncoderSettings.setFrameRate": ('float',),
"QVideoEncoderSettings.setQuality": ('PySide2.QtMultimedia.QMultimedia.EncodingQuality',),
@@ -14712,7 +14730,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoFrame.__init__": [(), ('PySide2.QtGui.QImage',), ('PySide2.QtMultimedia.QAbstractVideoBuffer', 'PySide2.QtCore.QSize', 'PySide2.QtMultimedia.QVideoFrame.PixelFormat'), ('PySide2.QtMultimedia.QVideoFrame',), ('int', 'PySide2.QtCore.QSize', 'int', 'PySide2.QtMultimedia.QVideoFrame.PixelFormat')],
"QVideoFrame.__copy__": (),
"QVideoFrame.availableMetaData": (),
- "QVideoFrame.bits": [],
+ "QVideoFrame.bits": (),
"QVideoFrame.bytesPerLine": [(), ('int',)],
"QVideoFrame.endTime": (),
"QVideoFrame.fieldType": (),
@@ -14733,7 +14751,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoFrame.planeCount": (),
"QVideoFrame.setEndTime": ('int',),
"QVideoFrame.setFieldType": ('PySide2.QtMultimedia.QVideoFrame.FieldType',),
- "QVideoFrame.setMetaData": ('str', 'PySide2.support.signature.typing.Any'),
+ "QVideoFrame.setMetaData": ('str', 'Any'),
"QVideoFrame.setStartTime": ('int',),
"QVideoFrame.size": (),
"QVideoFrame.startTime": (),
@@ -14767,7 +14785,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoSurfaceFormat.setFrameRate": ('float',),
"QVideoSurfaceFormat.setFrameSize": [('PySide2.QtCore.QSize',), ('int', 'int')],
"QVideoSurfaceFormat.setPixelAspectRatio": [('PySide2.QtCore.QSize',), ('int', 'int')],
- "QVideoSurfaceFormat.setProperty": ('str', 'PySide2.support.signature.typing.Any'),
+ "QVideoSurfaceFormat.setProperty": ('str', 'Any'),
"QVideoSurfaceFormat.setScanLineDirection": ('PySide2.QtMultimedia.QVideoSurfaceFormat.Direction',),
"QVideoSurfaceFormat.setViewport": ('PySide2.QtCore.QRect',),
"QVideoSurfaceFormat.setYCbCrColorSpace": ('PySide2.QtMultimedia.QVideoSurfaceFormat.YCbCrColorSpace',),
@@ -14810,7 +14828,7 @@ if "PySide2.QtMultimediaWidgets" in sys.modules:
"QGraphicsVideoItem.__init__": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsVideoItem.aspectRatioMode": (),
"QGraphicsVideoItem.boundingRect": (),
- "QGraphicsVideoItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsVideoItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsVideoItem.mediaObject": (),
"QGraphicsVideoItem.nativeSize": (),
"QGraphicsVideoItem.offset": (),
@@ -15167,7 +15185,7 @@ if "PySide2.QtQml" in sys.modules:
"QJSEngine.newObject": (),
"QJSEngine.newQMetaObject": ('PySide2.QtCore.QMetaObject',),
"QJSEngine.newQObject": ('PySide2.QtCore.QObject',),
- "QJSEngine.toScriptValue": ('PySide2.support.signature.typing.Any',),
+ "QJSEngine.toScriptValue": ('Any',),
# class PySide2.QtQml.QJSValue:
"QJSValue.__init__": [('PySide2.QtQml.QJSValue',), ('PySide2.QtQml.QJSValue.SpecialValue',), ('bool',), ('float',), ('int',), ('str',)],
@@ -15213,7 +15231,6 @@ if "PySide2.QtQml" in sys.modules:
"QJSValueIterator.__init__": ('PySide2.QtQml.QJSValue',),
"QJSValueIterator.hasNext": (),
"QJSValueIterator.name": (),
- "QJSValueIterator.next": (),
"QJSValueIterator.value": (),
# class PySide2.QtQml.QQmlAbstractUrlInterceptor:
@@ -15224,7 +15241,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlApplicationEngine.__init__": [('PySide2.QtCore.QObject',), ('PySide2.QtCore.QUrl', 'PySide2.QtCore.QObject'), ('str', 'PySide2.QtCore.QObject')],
"QQmlApplicationEngine.load": [('PySide2.QtCore.QUrl',), ('str',)],
"QQmlApplicationEngine.loadData": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QUrl'),
- "QQmlApplicationEngine.rootObjects": [],
+ "QQmlApplicationEngine.rootObjects": (),
# class PySide2.QtQml.QQmlComponent:
"QQmlComponent.__init__": [('PySide2.QtCore.QObject',), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QUrl', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QUrl', 'PySide2.QtQml.QQmlComponent.CompilationMode', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'str', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'str', 'PySide2.QtQml.QQmlComponent.CompilationMode', 'PySide2.QtCore.QObject')],
@@ -15256,7 +15273,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlContext.resolvedUrl": ('PySide2.QtCore.QUrl',),
"QQmlContext.setBaseUrl": ('PySide2.QtCore.QUrl',),
"QQmlContext.setContextObject": ('PySide2.QtCore.QObject',),
- "QQmlContext.setContextProperty": [('str', 'PySide2.QtCore.QObject'), ('str', 'PySide2.support.signature.typing.Any')],
+ "QQmlContext.setContextProperty": [('str', 'Any'), ('str', 'PySide2.QtCore.QObject')],
# class PySide2.QtQml.QQmlDebuggingEnabler:
"QQmlDebuggingEnabler.__init__": ('bool',),
@@ -15265,7 +15282,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlDebuggingEnabler.inspectorServices": (),
"QQmlDebuggingEnabler.nativeDebuggerServices": (),
"QQmlDebuggingEnabler.profilerServices": (),
- "QQmlDebuggingEnabler.setServices": ('PySide2.support.signature.typing.List',),
+ "QQmlDebuggingEnabler.setServices": ('List[str]',),
"QQmlDebuggingEnabler.startDebugConnector": ('str', 'dict'),
"QQmlDebuggingEnabler.startTcpDebugServer": ('int', 'PySide2.QtQml.QQmlDebuggingEnabler.StartMode', 'str'),
@@ -15294,13 +15311,13 @@ if "PySide2.QtQml" in sys.modules:
"QQmlEngine.rootContext": (),
"QQmlEngine.setBaseUrl": ('PySide2.QtCore.QUrl',),
"QQmlEngine.setContextForObject": ('PySide2.QtCore.QObject', 'PySide2.QtQml.QQmlContext'),
- "QQmlEngine.setImportPathList": ('PySide2.support.signature.typing.List',),
+ "QQmlEngine.setImportPathList": ('List[str]',),
"QQmlEngine.setIncubationController": ('PySide2.QtQml.QQmlIncubationController',),
"QQmlEngine.setNetworkAccessManagerFactory": ('PySide2.QtQml.QQmlNetworkAccessManagerFactory',),
"QQmlEngine.setObjectOwnership": ('PySide2.QtCore.QObject', 'PySide2.QtQml.QQmlEngine.ObjectOwnership'),
"QQmlEngine.setOfflineStoragePath": ('str',),
"QQmlEngine.setOutputWarningsToStandardError": ('bool',),
- "QQmlEngine.setPluginPathList": ('PySide2.support.signature.typing.List',),
+ "QQmlEngine.setPluginPathList": ('List[str]',),
"QQmlEngine.setUrlInterceptor": ('PySide2.QtQml.QQmlAbstractUrlInterceptor',),
"QQmlEngine.trimComponentCache": (),
"QQmlEngine.urlInterceptor": (),
@@ -15375,7 +15392,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlFileSelector.__init__": ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QObject'),
"QQmlFileSelector.get": ('PySide2.QtQml.QQmlEngine',),
"QQmlFileSelector.selector": (),
- "QQmlFileSelector.setExtraSelectors": ['PySide2.support.signature.typing.List'],
+ "QQmlFileSelector.setExtraSelectors": ('List[str]',),
"QQmlFileSelector.setSelector": ('PySide2.QtCore.QFileSelector',),
# class PySide2.QtQml.QQmlImageProviderBase:
@@ -15454,18 +15471,18 @@ if "PySide2.QtQml" in sys.modules:
"QQmlProperty.read": [(), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtQml.QQmlContext'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtQml.QQmlEngine')],
"QQmlProperty.reset": (),
"QQmlProperty.type": (),
- "QQmlProperty.write": [('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any', 'PySide2.QtQml.QQmlContext'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any', 'PySide2.QtQml.QQmlEngine'), ('PySide2.support.signature.typing.Any',)],
+ "QQmlProperty.write": [('Any',), ('PySide2.QtCore.QObject', 'str', 'Any'), ('PySide2.QtCore.QObject', 'str', 'Any', 'PySide2.QtQml.QQmlContext'), ('PySide2.QtCore.QObject', 'str', 'Any', 'PySide2.QtQml.QQmlEngine')],
# class PySide2.QtQml.QQmlPropertyMap:
"QQmlPropertyMap.__init__": ('PySide2.QtCore.QObject',),
"QQmlPropertyMap.clear": ('str',),
"QQmlPropertyMap.contains": ('str',),
"QQmlPropertyMap.count": (),
- "QQmlPropertyMap.insert": ('str', 'PySide2.support.signature.typing.Any'),
+ "QQmlPropertyMap.insert": ('str', 'Any'),
"QQmlPropertyMap.isEmpty": (),
"QQmlPropertyMap.keys": (),
"QQmlPropertyMap.size": (),
- "QQmlPropertyMap.updateValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QQmlPropertyMap.updateValue": ('str', 'Any'),
"QQmlPropertyMap.value": ('str',),
# class PySide2.QtQml.QQmlPropertyValueSource:
@@ -15665,9 +15682,9 @@ if "PySide2.QtQuick" in sys.modules:
"QQuickItem.z": (),
# class PySide2.QtQuick.QQuickItemGrabResult:
- "QQuickItemGrabResult.saveToFile": ['str'],
"QQuickItemGrabResult.event": ('PySide2.QtCore.QEvent',),
"QQuickItemGrabResult.image": (),
+ "QQuickItemGrabResult.saveToFile": ('str',),
"QQuickItemGrabResult.url": (),
# class PySide2.QtQuick.QQuickPaintedItem:
@@ -15822,7 +15839,7 @@ if "PySide2.QtQuick" in sys.modules:
# class PySide2.QtQuick.QSGBasicGeometryNode:
"QSGBasicGeometryNode.__init__": ('PySide2.QtQuick.QSGNode.NodeType',),
"QSGBasicGeometryNode.clipList": (),
- "QSGBasicGeometryNode.geometry": [],
+ "QSGBasicGeometryNode.geometry": (),
"QSGBasicGeometryNode.matrix": (),
"QSGBasicGeometryNode.setGeometry": ('PySide2.QtQuick.QSGGeometry',),
"QSGBasicGeometryNode.setRendererClipList": ('PySide2.QtQuick.QSGClipNode',),
@@ -15857,9 +15874,9 @@ if "PySide2.QtQuick" in sys.modules:
"QSGGeometry.defaultAttributes_TexturedPoint2D": (),
"QSGGeometry.drawingMode": (),
"QSGGeometry.indexCount": (),
- "QSGGeometry.indexData": [],
- "QSGGeometry.indexDataAsUInt": [],
- "QSGGeometry.indexDataAsUShort": [],
+ "QSGGeometry.indexData": (),
+ "QSGGeometry.indexDataAsUInt": (),
+ "QSGGeometry.indexDataAsUShort": (),
"QSGGeometry.indexDataPattern": (),
"QSGGeometry.indexType": (),
"QSGGeometry.lineWidth": (),
@@ -15875,10 +15892,10 @@ if "PySide2.QtQuick" in sys.modules:
"QSGGeometry.updateRectGeometry": ('PySide2.QtQuick.QSGGeometry', 'PySide2.QtCore.QRectF'),
"QSGGeometry.updateTexturedRectGeometry": ('PySide2.QtQuick.QSGGeometry', 'PySide2.QtCore.QRectF', 'PySide2.QtCore.QRectF'),
"QSGGeometry.vertexCount": (),
- "QSGGeometry.vertexData": [],
- "QSGGeometry.vertexDataAsColoredPoint2D": [],
- "QSGGeometry.vertexDataAsPoint2D": [],
- "QSGGeometry.vertexDataAsTexturedPoint2D": [],
+ "QSGGeometry.vertexData": (),
+ "QSGGeometry.vertexDataAsColoredPoint2D": (),
+ "QSGGeometry.vertexDataAsPoint2D": (),
+ "QSGGeometry.vertexDataAsTexturedPoint2D": (),
"QSGGeometry.vertexDataPattern": (),
# class PySide2.QtQuick.QSGGeometryNode:
@@ -16059,7 +16076,7 @@ if "PySide2.QtTextToSpeech" in sys.modules:
"QTextToSpeechEngine.__init__": ('PySide2.QtCore.QObject',),
"QTextToSpeechEngine.availableLocales": (),
"QTextToSpeechEngine.availableVoices": (),
- "QTextToSpeechEngine.createVoice": ('str', 'PySide2.QtTextToSpeech.QVoice.Gender', 'PySide2.QtTextToSpeech.QVoice.Age', 'PySide2.support.signature.typing.Any'),
+ "QTextToSpeechEngine.createVoice": ('str', 'PySide2.QtTextToSpeech.QVoice.Gender', 'PySide2.QtTextToSpeech.QVoice.Age', 'Any'),
"QTextToSpeechEngine.locale": (),
"QTextToSpeechEngine.pause": (),
"QTextToSpeechEngine.pitch": (),
@@ -16164,7 +16181,7 @@ if "PySide2.QtDataVisualization" in sys.modules:
dict.update({
# class PySide2.QtDataVisualization.QtDataVisualization:
- "QtDataVisualization.qDefaultSurfaceFormat": ['bool'],
+ "QtDataVisualization.qDefaultSurfaceFormat": ('bool',),
})
# Module PySide2.QtUiTools
@@ -16225,12 +16242,12 @@ if "PySide2.QtWebEngineWidgets" in sys.modules:
"QWebEngineCertificateError.url": (),
# class PySide2.QtWebEngineWidgets.QWebEngineDownloadItem:
- "QWebEngineDownloadItem.mimeType": (),
"QWebEngineDownloadItem.accept": (),
"QWebEngineDownloadItem.cancel": (),
"QWebEngineDownloadItem.id": (),
"QWebEngineDownloadItem.interruptReasonString": (),
"QWebEngineDownloadItem.isFinished": (),
+ "QWebEngineDownloadItem.mimeType": (),
"QWebEngineDownloadItem.path": (),
"QWebEngineDownloadItem.receivedBytes": (),
"QWebEngineDownloadItem.setPath": ('str',),
@@ -16254,7 +16271,7 @@ if "PySide2.QtWebEngineWidgets" in sys.modules:
"QWebEnginePage.action": ('PySide2.QtWebEngineWidgets.QWebEnginePage.WebAction',),
"QWebEnginePage.backgroundColor": (),
"QWebEnginePage.certificateError": ('PySide2.QtWebEngineWidgets.QWebEngineCertificateError',),
- "QWebEnginePage.chooseFiles": ('PySide2.QtWebEngineWidgets.QWebEnginePage.FileSelectionMode', 'PySide2.support.signature.typing.List', 'PySide2.support.signature.typing.List'),
+ "QWebEnginePage.chooseFiles": ('PySide2.QtWebEngineWidgets.QWebEnginePage.FileSelectionMode', 'List[str]', 'List[str]'),
"QWebEnginePage.contentsSize": (),
"QWebEnginePage.createStandardContextMenu": (),
"QWebEnginePage.createWindow": ('PySide2.QtWebEngineWidgets.QWebEnginePage.WebWindowType',),
@@ -16317,7 +16334,7 @@ if "PySide2.QtWebEngineWidgets" in sys.modules:
"QWebEngineProfile.setPersistentCookiesPolicy": ('PySide2.QtWebEngineWidgets.QWebEngineProfile.PersistentCookiesPolicy',),
"QWebEngineProfile.setPersistentStoragePath": ('str',),
"QWebEngineProfile.setSpellCheckEnabled": ('bool',),
- "QWebEngineProfile.setSpellCheckLanguages": ('PySide2.support.signature.typing.List',),
+ "QWebEngineProfile.setSpellCheckLanguages": ('List[str]',),
"QWebEngineProfile.spellCheckLanguages": (),
"QWebEngineProfile.storageName": (),
"QWebEngineProfile.visitedLinksContainsUrl": ('PySide2.QtCore.QUrl',),
diff --git a/sources/pyside2/tests/registry/exists_linux_5_9_3_ci.py b/sources/pyside2/tests/registry/exists_linux_5_9_4_ci.py
index 9e7503e6c..59d696884 100644
--- a/sources/pyside2/tests/registry/exists_linux_5_9_3_ci.py
+++ b/sources/pyside2/tests/registry/exists_linux_5_9_4_ci.py
@@ -1,6 +1,6 @@
#############################################################################
##
-## Copyright (C) 2017 The Qt Company Ltd.
+## Copyright (C) 2018 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of PySide2.
@@ -37,6 +37,14 @@
##
#############################################################################
+"""
+This file contains the simplified signatures for all functions in PySide
+for module 'exists_linux_5_9_4_ci'. There are no default values, no variable
+names and no self parameter. Only types are present after simplification.
+The functions 'next' resp. '__next__' are removed
+to make the output identical for Python 2 and 3.
+"""
+
import sys
dict = {}
@@ -249,7 +257,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QBasicMutex:
"QBasicMutex.__init__": (),
- "QBasicMutex.isRecursive": [],
+ "QBasicMutex.isRecursive": (),
"QBasicMutex.lock": (),
"QBasicMutex.tryLock": (),
"QBasicMutex.try_lock": (),
@@ -284,7 +292,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QBuffer:
"QBuffer.__init__": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QBuffer.atEnd": (),
- "QBuffer.buffer": [],
+ "QBuffer.buffer": (),
"QBuffer.canReadLine": (),
"QBuffer.close": (),
"QBuffer.connectNotify": ('PySide2.QtCore.QMetaMethod',),
@@ -312,7 +320,7 @@ if "PySide2.QtCore" in sys.modules:
"QByteArray.clear": (),
"QByteArray.contains": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
"QByteArray.count": [(), ('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
- "QByteArray.data": [],
+ "QByteArray.data": (),
"QByteArray.endsWith": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
"QByteArray.fill": ('Union[str, int]', 'int'),
"QByteArray.fromBase64": [('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QByteArray', 'Base64Options')],
@@ -340,7 +348,7 @@ if "PySide2.QtCore" in sys.modules:
"QByteArray.rightJustified": ('int', 'Union[str, int]', 'bool'),
"QByteArray.setNum": [('float', 'Union[str, int]', 'int'), ('int', 'int')],
"QByteArray.setRawData": ('str', 'int'),
- "QByteArray.simplified": [],
+ "QByteArray.simplified": (),
"QByteArray.size": (),
"QByteArray.split": ('Union[str, int]',),
"QByteArray.squeeze": (),
@@ -353,15 +361,15 @@ if "PySide2.QtCore" in sys.modules:
"QByteArray.toInt": ('bool', 'int'),
"QByteArray.toLong": ('bool', 'int'),
"QByteArray.toLongLong": ('bool', 'int'),
- "QByteArray.toLower": [],
+ "QByteArray.toLower": (),
"QByteArray.toPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray', 'Union[str, int]'),
"QByteArray.toShort": ('bool', 'int'),
"QByteArray.toUInt": ('bool', 'int'),
"QByteArray.toULong": ('bool', 'int'),
"QByteArray.toULongLong": ('bool', 'int'),
"QByteArray.toUShort": ('bool', 'int'),
- "QByteArray.toUpper": [],
- "QByteArray.trimmed": [],
+ "QByteArray.toUpper": (),
+ "QByteArray.trimmed": (),
"QByteArray.truncate": ('int',),
# class PySide2.QtCore.QByteArrayMatcher:
@@ -561,7 +569,7 @@ if "PySide2.QtCore" in sys.modules:
"QDate.daysTo": ('PySide2.QtCore.QDate',),
"QDate.fromJulianDay": ('int',),
"QDate.fromString": [('str', 'PySide2.QtCore.Qt.DateFormat'), ('str', 'str')],
- "QDate.getDate": ['int', 'int', 'int'],
+ "QDate.getDate": ('int', 'int', 'int'),
"QDate.isLeapYear": ('int',),
"QDate.isNull": (),
"QDate.isValid": [(), ('int', 'int', 'int')],
@@ -697,7 +705,6 @@ if "PySide2.QtCore" in sys.modules:
"QDirIterator.fileName": (),
"QDirIterator.filePath": (),
"QDirIterator.hasNext": (),
- "QDirIterator.next": (),
"QDirIterator.path": (),
# class PySide2.QtCore.QDynamicPropertyChangeEvent:
@@ -957,7 +964,7 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelection.__copy__": (),
"QItemSelection.append": [('PySide2.QtCore.QItemSelectionRange',), ('list',)],
"QItemSelection.at": ('int',),
- "QItemSelection.back": [],
+ "QItemSelection.back": (),
"QItemSelection.clear": (),
"QItemSelection.constFirst": (),
"QItemSelection.constLast": (),
@@ -966,16 +973,16 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelection.detachShared": (),
"QItemSelection.empty": (),
"QItemSelection.endsWith": ('PySide2.QtCore.QItemSelectionRange',),
- "QItemSelection.first": [],
+ "QItemSelection.first": (),
"QItemSelection.fromSet": ('set',),
"QItemSelection.fromVector": ('list',),
- "QItemSelection.front": [],
+ "QItemSelection.front": (),
"QItemSelection.indexOf": ('PySide2.QtCore.QItemSelectionRange', 'int'),
"QItemSelection.indexes": (),
"QItemSelection.insert": ('int', 'PySide2.QtCore.QItemSelectionRange'),
"QItemSelection.isEmpty": (),
"QItemSelection.isSharedWith": ('list',),
- "QItemSelection.last": [],
+ "QItemSelection.last": (),
"QItemSelection.lastIndexOf": ('PySide2.QtCore.QItemSelectionRange', 'int'),
"QItemSelection.length": (),
"QItemSelection.merge": ('PySide2.QtCore.QItemSelection', 'SelectionFlags'),
@@ -1018,7 +1025,7 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelectionModel.isColumnSelected": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.isRowSelected": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.isSelected": ('PySide2.QtCore.QModelIndex',),
- "QItemSelectionModel.model": [],
+ "QItemSelectionModel.model": (),
"QItemSelectionModel.reset": (),
"QItemSelectionModel.rowIntersectsSelection": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.select": [('PySide2.QtCore.QItemSelection', 'SelectionFlags'), ('PySide2.QtCore.QModelIndex', 'SelectionFlags')],
@@ -1123,13 +1130,13 @@ if "PySide2.QtCore" in sys.modules:
"QJsonValue.type": (),
# class PySide2.QtCore.QLibraryInfo:
- "QLibraryInfo.platformPluginArguments": ('str',),
"QLibraryInfo.build": (),
"QLibraryInfo.buildDate": (),
"QLibraryInfo.isDebugBuild": (),
"QLibraryInfo.licensedProducts": (),
"QLibraryInfo.licensee": (),
"QLibraryInfo.location": ('PySide2.QtCore.QLibraryInfo.LibraryLocation',),
+ "QLibraryInfo.platformPluginArguments": ('str',),
"QLibraryInfo.version": (),
# class PySide2.QtCore.QLine:
@@ -1218,7 +1225,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.percent": (),
"QLocale.pmText": (),
"QLocale.positiveSign": (),
- "QLocale.quoteString": ['PySide2.QtCore.QLocale.QuotationStyle', 'str'],
+ "QLocale.quoteString": ('str', 'PySide2.QtCore.QLocale.QuotationStyle'),
"QLocale.script": (),
"QLocale.scriptToString": ('PySide2.QtCore.QLocale.Script',),
"QLocale.setDefault": ('PySide2.QtCore.QLocale',),
@@ -1323,7 +1330,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QMetaObject:
"QMetaObject.__init__": (),
- "QMetaObject.cast": ['PySide2.QtCore.QObject'],
+ "QMetaObject.cast": ('PySide2.QtCore.QObject',),
"QMetaObject.checkConnectArgs": [('PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QMetaMethod'), ('str', 'str')],
"QMetaObject.classInfo": ('int',),
"QMetaObject.classInfoCount": (),
@@ -1464,7 +1471,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QMutex:
"QMutex.__init__": ('PySide2.QtCore.QMutex.RecursionMode',),
- "QMutex.isRecursive": [],
+ "QMutex.isRecursive": (),
"QMutex.lock": (),
"QMutex.tryLock": [(), ('int',)],
"QMutex.try_lock": (),
@@ -1489,8 +1496,8 @@ if "PySide2.QtCore" in sys.modules:
"QObject.deleteLater": (),
"QObject.disconnect": [('PySide2.QtCore.QMetaObject.Connection',), ('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod'), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'Callable'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str'), ('str', 'Callable'), ('str', 'PySide2.QtCore.QObject', 'str')],
"QObject.disconnectNotify": ('PySide2.QtCore.QMetaMethod',),
- "QObject.dumpObjectInfo": [],
- "QObject.dumpObjectTree": [],
+ "QObject.dumpObjectInfo": (),
+ "QObject.dumpObjectTree": (),
"QObject.dynamicPropertyNames": (),
"QObject.emit": ('str', '...'),
"QObject.event": ('PySide2.QtCore.QEvent',),
@@ -1814,11 +1821,11 @@ if "PySide2.QtCore" in sys.modules:
"QRegExp.__init__": [(), ('PySide2.QtCore.QRegExp',), ('str', 'PySide2.QtCore.Qt.CaseSensitivity', 'PySide2.QtCore.QRegExp.PatternSyntax')],
"QRegExp.__copy__": (),
"QRegExp.__reduce__": (),
- "QRegExp.cap": ['int'],
+ "QRegExp.cap": ('int',),
"QRegExp.captureCount": (),
- "QRegExp.capturedTexts": [],
+ "QRegExp.capturedTexts": (),
"QRegExp.caseSensitivity": (),
- "QRegExp.errorString": [],
+ "QRegExp.errorString": (),
"QRegExp.escape": ('str',),
"QRegExp.exactMatch": ('str',),
"QRegExp.indexIn": ('str', 'int', 'PySide2.QtCore.QRegExp.CaretMode'),
@@ -1829,7 +1836,7 @@ if "PySide2.QtCore" in sys.modules:
"QRegExp.matchedLength": (),
"QRegExp.pattern": (),
"QRegExp.patternSyntax": (),
- "QRegExp.pos": ['int'],
+ "QRegExp.pos": ('int',),
"QRegExp.replace": ('str', 'str'),
"QRegExp.setCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QRegExp.setMinimal": ('bool',),
@@ -1843,9 +1850,9 @@ if "PySide2.QtCore" in sys.modules:
"QRegularExpression.captureCount": (),
"QRegularExpression.errorString": (),
"QRegularExpression.escape": ('str',),
- "QRegularExpression.globalMatch": ['MatchOptions', 'PySide2.QtCore.QRegularExpression.MatchType', 'int', 'str'],
+ "QRegularExpression.globalMatch": ('str', 'int', 'PySide2.QtCore.QRegularExpression.MatchType', 'MatchOptions'),
"QRegularExpression.isValid": (),
- "QRegularExpression.match": ['MatchOptions', 'PySide2.QtCore.QRegularExpression.MatchType', 'int', 'str'],
+ "QRegularExpression.match": ('str', 'int', 'PySide2.QtCore.QRegularExpression.MatchType', 'MatchOptions'),
"QRegularExpression.namedCaptureGroups": (),
"QRegularExpression.optimize": (),
"QRegularExpression.pattern": (),
@@ -1880,7 +1887,6 @@ if "PySide2.QtCore" in sys.modules:
"QRegularExpressionMatchIterator.isValid": (),
"QRegularExpressionMatchIterator.matchOptions": (),
"QRegularExpressionMatchIterator.matchType": (),
- "QRegularExpressionMatchIterator.next": (),
"QRegularExpressionMatchIterator.peekNext": (),
"QRegularExpressionMatchIterator.regularExpression": (),
"QRegularExpressionMatchIterator.swap": ('PySide2.QtCore.QRegularExpressionMatchIterator',),
@@ -2100,7 +2106,6 @@ if "PySide2.QtCore" in sys.modules:
"QSortFilterProxyModel.supportedDropActions": (),
# class PySide2.QtCore.QStandardPaths:
- "QStandardPaths.writableLocation": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
"QStandardPaths.displayName": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
"QStandardPaths.enableTestMode": ('bool',),
"QStandardPaths.findExecutable": ('str', 'List[str]'),
@@ -2109,6 +2114,7 @@ if "PySide2.QtCore" in sys.modules:
"QStandardPaths.locateAll": ('PySide2.QtCore.QStandardPaths.StandardLocation', 'str', 'LocateOptions'),
"QStandardPaths.setTestModeEnabled": ('bool',),
"QStandardPaths.standardLocations": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
+ "QStandardPaths.writableLocation": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
# class PySide2.QtCore.QState:
"QState.__init__": [('PySide2.QtCore.QState',), ('PySide2.QtCore.QState.ChildMode', 'PySide2.QtCore.QState')],
@@ -2134,7 +2140,7 @@ if "PySide2.QtCore" in sys.modules:
"QStateMachine.beginSelectTransitions": ('PySide2.QtCore.QEvent',),
"QStateMachine.cancelDelayedEvent": ('int',),
"QStateMachine.clearError": (),
- "QStateMachine.configuration": [],
+ "QStateMachine.configuration": (),
"QStateMachine.defaultAnimations": (),
"QStateMachine.endMicrostep": ('PySide2.QtCore.QEvent',),
"QStateMachine.endSelectTransitions": ('PySide2.QtCore.QEvent',),
@@ -2642,18 +2648,18 @@ if "PySide2.QtCore" in sys.modules:
"QXmlStreamAttributes.constLast": (),
"QXmlStreamAttributes.contains": ('PySide2.QtCore.QXmlStreamAttribute',),
"QXmlStreamAttributes.count": [(), ('PySide2.QtCore.QXmlStreamAttribute',)],
- "QXmlStreamAttributes.data": [],
+ "QXmlStreamAttributes.data": (),
"QXmlStreamAttributes.empty": (),
"QXmlStreamAttributes.endsWith": ('PySide2.QtCore.QXmlStreamAttribute',),
"QXmlStreamAttributes.fill": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
- "QXmlStreamAttributes.first": [],
+ "QXmlStreamAttributes.first": (),
"QXmlStreamAttributes.front": (),
"QXmlStreamAttributes.hasAttribute": [('str',), ('str', 'str')],
"QXmlStreamAttributes.indexOf": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
"QXmlStreamAttributes.insert": [('int', 'PySide2.QtCore.QXmlStreamAttribute'), ('int', 'int', 'PySide2.QtCore.QXmlStreamAttribute')],
"QXmlStreamAttributes.isEmpty": (),
"QXmlStreamAttributes.isSharedWith": ('list',),
- "QXmlStreamAttributes.last": [],
+ "QXmlStreamAttributes.last": (),
"QXmlStreamAttributes.lastIndexOf": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
"QXmlStreamAttributes.length": (),
"QXmlStreamAttributes.mid": ('int', 'int'),
@@ -2789,10 +2795,6 @@ if "PySide2.QtCore" in sys.modules:
"QXmlStreamWriter.writeStartElement": [('str',), ('str', 'str')],
"QXmlStreamWriter.writeTextElement": [('str', 'str'), ('str', 'str', 'str')],
- # class PySide2.QtCore.Qt:
- "Qt.qt_getEnumName": [('Alignment',), ('DockWidgetAreas',), ('DropActions',), ('Edges',), ('ImageConversionFlags',), ('InputMethodHints',), ('InputMethodQueries',), ('ItemFlags',), ('KeyboardModifiers',), ('MatchFlags',), ('MouseButtons',), ('Orientations',), ('PySide2.QtCore.Qt.ApplicationAttribute',), ('PySide2.QtCore.Qt.ApplicationState',), ('PySide2.QtCore.Qt.ArrowType',), ('PySide2.QtCore.Qt.AspectRatioMode',), ('PySide2.QtCore.Qt.Axis',), ('PySide2.QtCore.Qt.BGMode',), ('PySide2.QtCore.Qt.BrushStyle',), ('PySide2.QtCore.Qt.CaseSensitivity',), ('PySide2.QtCore.Qt.CheckState',), ('PySide2.QtCore.Qt.ChecksumType',), ('PySide2.QtCore.Qt.ClipOperation',), ('PySide2.QtCore.Qt.ConnectionType',), ('PySide2.QtCore.Qt.ContextMenuPolicy',), ('PySide2.QtCore.Qt.Corner',), ('PySide2.QtCore.Qt.CursorMoveStyle',), ('PySide2.QtCore.Qt.CursorShape',), ('PySide2.QtCore.Qt.DateFormat',), ('PySide2.QtCore.Qt.DayOfWeek',), ('PySide2.QtCore.Qt.DockWidgetArea',), ('PySide2.QtCore.Qt.DropAction',), ('PySide2.QtCore.Qt.Edge',), ('PySide2.QtCore.Qt.EnterKeyType',), ('PySide2.QtCore.Qt.FillRule',), ('PySide2.QtCore.Qt.FocusPolicy',), ('PySide2.QtCore.Qt.FocusReason',), ('PySide2.QtCore.Qt.GestureState',), ('PySide2.QtCore.Qt.GestureType',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtCore.Qt.InputMethodHint',), ('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.ItemDataRole',), ('PySide2.QtCore.Qt.ItemSelectionMode',), ('PySide2.QtCore.Qt.ItemSelectionOperation',), ('PySide2.QtCore.Qt.Key',), ('PySide2.QtCore.Qt.LayoutDirection',), ('PySide2.QtCore.Qt.MaskMode',), ('PySide2.QtCore.Qt.MouseEventFlag',), ('PySide2.QtCore.Qt.MouseEventSource',), ('PySide2.QtCore.Qt.NativeGestureType',), ('PySide2.QtCore.Qt.Orientation',), ('PySide2.QtCore.Qt.PenCapStyle',), ('PySide2.QtCore.Qt.PenJoinStyle',), ('PySide2.QtCore.Qt.PenStyle',), ('PySide2.QtCore.Qt.ScreenOrientation',), ('PySide2.QtCore.Qt.ScrollBarPolicy',), ('PySide2.QtCore.Qt.ScrollPhase',), ('PySide2.QtCore.Qt.ShortcutContext',), ('PySide2.QtCore.Qt.SizeHint',), ('PySide2.QtCore.Qt.SizeMode',), ('PySide2.QtCore.Qt.SortOrder',), ('PySide2.QtCore.Qt.TabFocusBehavior',), ('PySide2.QtCore.Qt.TextElideMode',), ('PySide2.QtCore.Qt.TextFlag',), ('PySide2.QtCore.Qt.TextFormat',), ('PySide2.QtCore.Qt.TextInteractionFlag',), ('PySide2.QtCore.Qt.TimeSpec',), ('PySide2.QtCore.Qt.TimerType',), ('PySide2.QtCore.Qt.ToolBarArea',), ('PySide2.QtCore.Qt.ToolButtonStyle',), ('PySide2.QtCore.Qt.TransformationMode',), ('PySide2.QtCore.Qt.WidgetAttribute',), ('PySide2.QtCore.Qt.WindowModality',), ('PySide2.QtCore.Qt.WindowState',), ('PySide2.QtCore.Qt.WindowType',), ('ScreenOrientations',), ('TextInteractionFlags',), ('ToolBarAreas',), ('TouchPointStates',), ('WindowFlags',), ('WindowStates',)],
- "Qt.qt_getEnumMetaObject": [('Alignment',), ('DockWidgetAreas',), ('DropActions',), ('Edges',), ('ImageConversionFlags',), ('InputMethodHints',), ('InputMethodQueries',), ('ItemFlags',), ('KeyboardModifiers',), ('MatchFlags',), ('MouseButtons',), ('Orientations',), ('PySide2.QtCore.Qt.ApplicationAttribute',), ('PySide2.QtCore.Qt.ApplicationState',), ('PySide2.QtCore.Qt.ArrowType',), ('PySide2.QtCore.Qt.AspectRatioMode',), ('PySide2.QtCore.Qt.Axis',), ('PySide2.QtCore.Qt.BGMode',), ('PySide2.QtCore.Qt.BrushStyle',), ('PySide2.QtCore.Qt.CaseSensitivity',), ('PySide2.QtCore.Qt.CheckState',), ('PySide2.QtCore.Qt.ChecksumType',), ('PySide2.QtCore.Qt.ClipOperation',), ('PySide2.QtCore.Qt.ConnectionType',), ('PySide2.QtCore.Qt.ContextMenuPolicy',), ('PySide2.QtCore.Qt.Corner',), ('PySide2.QtCore.Qt.CursorMoveStyle',), ('PySide2.QtCore.Qt.CursorShape',), ('PySide2.QtCore.Qt.DateFormat',), ('PySide2.QtCore.Qt.DayOfWeek',), ('PySide2.QtCore.Qt.DockWidgetArea',), ('PySide2.QtCore.Qt.DropAction',), ('PySide2.QtCore.Qt.Edge',), ('PySide2.QtCore.Qt.EnterKeyType',), ('PySide2.QtCore.Qt.FillRule',), ('PySide2.QtCore.Qt.FocusPolicy',), ('PySide2.QtCore.Qt.FocusReason',), ('PySide2.QtCore.Qt.GestureState',), ('PySide2.QtCore.Qt.GestureType',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtCore.Qt.InputMethodHint',), ('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.ItemDataRole',), ('PySide2.QtCore.Qt.ItemSelectionMode',), ('PySide2.QtCore.Qt.ItemSelectionOperation',), ('PySide2.QtCore.Qt.Key',), ('PySide2.QtCore.Qt.LayoutDirection',), ('PySide2.QtCore.Qt.MaskMode',), ('PySide2.QtCore.Qt.MouseEventFlag',), ('PySide2.QtCore.Qt.MouseEventSource',), ('PySide2.QtCore.Qt.NativeGestureType',), ('PySide2.QtCore.Qt.Orientation',), ('PySide2.QtCore.Qt.PenCapStyle',), ('PySide2.QtCore.Qt.PenJoinStyle',), ('PySide2.QtCore.Qt.PenStyle',), ('PySide2.QtCore.Qt.ScreenOrientation',), ('PySide2.QtCore.Qt.ScrollBarPolicy',), ('PySide2.QtCore.Qt.ScrollPhase',), ('PySide2.QtCore.Qt.ShortcutContext',), ('PySide2.QtCore.Qt.SizeHint',), ('PySide2.QtCore.Qt.SizeMode',), ('PySide2.QtCore.Qt.SortOrder',), ('PySide2.QtCore.Qt.TabFocusBehavior',), ('PySide2.QtCore.Qt.TextElideMode',), ('PySide2.QtCore.Qt.TextFlag',), ('PySide2.QtCore.Qt.TextFormat',), ('PySide2.QtCore.Qt.TextInteractionFlag',), ('PySide2.QtCore.Qt.TimeSpec',), ('PySide2.QtCore.Qt.TimerType',), ('PySide2.QtCore.Qt.ToolBarArea',), ('PySide2.QtCore.Qt.ToolButtonStyle',), ('PySide2.QtCore.Qt.TransformationMode',), ('PySide2.QtCore.Qt.WidgetAttribute',), ('PySide2.QtCore.Qt.WindowModality',), ('PySide2.QtCore.Qt.WindowState',), ('PySide2.QtCore.Qt.WindowType',), ('ScreenOrientations',), ('TextInteractionFlags',), ('ToolBarAreas',), ('TouchPointStates',), ('WindowFlags',), ('WindowStates',)],
-
# class PySide2.QtCore.QtMsgType:
# class PySide2.QtCore.Signal:
@@ -2836,11 +2838,11 @@ if "PySide2.QtGui" in sys.modules:
"QAbstractTextDocumentLayout.unregisterHandler": ('int', 'PySide2.QtCore.QObject'),
# class PySide2.QtGui.QAccessible:
- "QAccessible.isActive": (),
"QAccessible.__copy__": (),
"QAccessible.accessibleInterface": ('int',),
"QAccessible.cleanup": (),
"QAccessible.deleteAccessibleInterface": ('int',),
+ "QAccessible.isActive": (),
"QAccessible.qAccessibleTextBoundaryHelper": ('PySide2.QtGui.QTextCursor', 'PySide2.QtGui.QAccessible.TextBoundaryType'),
"QAccessible.queryAccessibleInterface": ('PySide2.QtCore.QObject',),
"QAccessible.registerAccessibleInterface": ('PySide2.QtGui.QAccessibleInterface',),
@@ -2900,7 +2902,7 @@ if "PySide2.QtGui" in sys.modules:
"QBitmap.__copy__": (),
"QBitmap.clear": (),
"QBitmap.fromData": ('PySide2.QtCore.QSize', 'Union[str, int]', 'PySide2.QtGui.QImage.Format'),
- "QBitmap.fromImage": ['ImageConversionFlags', 'PySide2.QtGui.QImage'],
+ "QBitmap.fromImage": ('PySide2.QtGui.QImage', 'ImageConversionFlags'),
"QBitmap.swap": [('PySide2.QtGui.QBitmap',), ('PySide2.QtGui.QPixmap',)],
"QBitmap.transformed": [('PySide2.QtGui.QMatrix',), ('PySide2.QtGui.QMatrix', 'PySide2.QtCore.Qt.TransformationMode'), ('PySide2.QtGui.QTransform',)],
@@ -2924,7 +2926,6 @@ if "PySide2.QtGui" in sys.modules:
"QBrush.transform": (),
# class PySide2.QtGui.QClipboard:
- "QClipboard.setText": ('str', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.clear": ('PySide2.QtGui.QClipboard.Mode',),
"QClipboard.image": ('PySide2.QtGui.QClipboard.Mode',),
"QClipboard.mimeData": ('PySide2.QtGui.QClipboard.Mode',),
@@ -2935,6 +2936,7 @@ if "PySide2.QtGui" in sys.modules:
"QClipboard.setImage": ('PySide2.QtGui.QImage', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.setMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.setPixmap": ('PySide2.QtGui.QPixmap', 'PySide2.QtGui.QClipboard.Mode'),
+ "QClipboard.setText": ('str', 'PySide2.QtGui.QClipboard.Mode'),
"QClipboard.supportsFindBuffer": (),
"QClipboard.supportsSelection": (),
"QClipboard.text": [('PySide2.QtGui.QClipboard.Mode',), ('str', 'PySide2.QtGui.QClipboard.Mode')],
@@ -3043,9 +3045,9 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QContextMenuEvent:
"QContextMenuEvent.__init__": [('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint'), ('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'), ('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint', 'KeyboardModifiers')],
- "QContextMenuEvent.global"+"Y": (),
"QContextMenuEvent.globalPos": (),
"QContextMenuEvent.globalX": (),
+ "QContextMenuEvent.global""Y": (),
"QContextMenuEvent.pos": (),
"QContextMenuEvent.reason": (),
"QContextMenuEvent.x": (),
@@ -3129,9 +3131,9 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QEnterEvent:
"QEnterEvent.__init__": ('PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF'),
- "QEnterEvent.global"+"Y": (),
"QEnterEvent.globalPos": (),
"QEnterEvent.globalX": (),
+ "QEnterEvent.global""Y": (),
"QEnterEvent.localPos": (),
"QEnterEvent.pos": (),
"QEnterEvent.screenPos": (),
@@ -3406,9 +3408,9 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QHelpEvent:
"QHelpEvent.__init__": ('PySide2.QtCore.QEvent.Type', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'),
- "QHelpEvent.global"+"Y": (),
"QHelpEvent.globalPos": (),
"QHelpEvent.globalX": (),
+ "QHelpEvent.global""Y": (),
"QHelpEvent.pos": (),
"QHelpEvent.x": (),
"QHelpEvent.y": (),
@@ -3465,7 +3467,7 @@ if "PySide2.QtGui" in sys.modules:
"QIconEngine.write": ('PySide2.QtCore.QDataStream',),
# class PySide2.QtGui.QImage:
- "QImage.__init__": [(), ('List[str]',), ('PySide2.QtCore.QSize', 'PySide2.QtGui.QImage.Format'), ('PySide2.QtGui.QImage',), ('Union[str, int]', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable[[bytes], NoneType]', 'int'), ('Union[str, int]', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable[[bytes], NoneType]', 'int'), ('int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'str')],
+ "QImage.__init__": [(), ('List[str]',), ('PySide2.QtCore.QSize', 'PySide2.QtGui.QImage.Format'), ('PySide2.QtGui.QImage',), ('Union[str, int]', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable', 'int'), ('Union[str, int]', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable', 'int'), ('int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'str')],
"QImage.__copy__": (),
"QImage.allGray": (),
"QImage.alphaChannel": (),
@@ -3560,7 +3562,7 @@ if "PySide2.QtGui" in sys.modules:
"QImageIOHandler.option": ('PySide2.QtGui.QImageIOHandler.ImageOption',),
"QImageIOHandler.read": ('PySide2.QtGui.QImage',),
"QImageIOHandler.setDevice": ('PySide2.QtCore.QIODevice',),
- "QImageIOHandler.setFormat": ['PySide2.QtCore.QByteArray'],
+ "QImageIOHandler.setFormat": ('PySide2.QtCore.QByteArray',),
"QImageIOHandler.setOption": ('PySide2.QtGui.QImageIOHandler.ImageOption', 'Any'),
"QImageIOHandler.supportsOption": ('PySide2.QtGui.QImageIOHandler.ImageOption',),
"QImageIOHandler.write": ('PySide2.QtGui.QImage',),
@@ -3836,9 +3838,9 @@ if "PySide2.QtGui" in sys.modules:
"QMouseEvent.button": (),
"QMouseEvent.buttons": (),
"QMouseEvent.flags": (),
- "QMouseEvent.global"+"Y": (),
"QMouseEvent.globalPos": (),
"QMouseEvent.globalX": (),
+ "QMouseEvent.global""Y": (),
"QMouseEvent.localPos": (),
"QMouseEvent.pos": (),
"QMouseEvent.screenPos": (),
@@ -3952,8 +3954,8 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLContext.versionFunctions": ('PySide2.QtGui.QOpenGLVersionProfile',),
# class PySide2.QtGui.QOpenGLContextGroup:
- "QOpenGLContextGroup.shares": (),
"QOpenGLContextGroup.currentContextGroup": (),
+ "QOpenGLContextGroup.shares": (),
# class PySide2.QtGui.QOpenGLDebugLogger:
"QOpenGLDebugLogger.__init__": ('PySide2.QtCore.QObject',),
@@ -4041,6 +4043,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glGetQueryiv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glGetSamplerParameterfv": ('int', 'int', 'float'),
"QOpenGLExtraFunctions.glGetSamplerParameteriv": ('int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glGetStringi": ('int', 'int'),
"QOpenGLExtraFunctions.glGetTexLevelParameterfv": ('int', 'int', 'int', 'float'),
"QOpenGLExtraFunctions.glGetTexLevelParameteriv": ('int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glGetUniformBlockIndex": ('int', 'str'),
@@ -4235,6 +4238,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glGetRenderbufferParameteriv": ('int', 'int', 'int'),
"QOpenGLFunctions.glGetShaderPrecisionFormat": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.glGetShaderiv": ('int', 'int', 'int'),
+ "QOpenGLFunctions.glGetString": ('int',),
"QOpenGLFunctions.glGetTexParameterfv": ('int', 'int', 'float'),
"QOpenGLFunctions.glGetTexParameteriv": ('int', 'int', 'int'),
"QOpenGLFunctions.glGetUniformLocation": ('int', 'str'),
@@ -4567,7 +4571,7 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QPagedPaintDevice:
"QPagedPaintDevice.__init__": (),
- "QPagedPaintDevice.devicePageLayout": [],
+ "QPagedPaintDevice.devicePageLayout": (),
"QPagedPaintDevice.margins": (),
"QPagedPaintDevice.newPage": (),
"QPagedPaintDevice.pageLayout": (),
@@ -4604,10 +4608,10 @@ if "PySide2.QtGui" in sys.modules:
"QPaintDevice.widthMM": (),
# class PySide2.QtGui.QPaintDeviceWindow:
- "QPaintDeviceWindow.paintEngine": (),
"QPaintDeviceWindow.event": ('PySide2.QtCore.QEvent',),
"QPaintDeviceWindow.exposeEvent": ('PySide2.QtGui.QExposeEvent',),
"QPaintDeviceWindow.metric": ('PySide2.QtGui.QPaintDevice.PaintDeviceMetric',),
+ "QPaintDeviceWindow.paintEngine": (),
"QPaintDeviceWindow.paintEvent": ('PySide2.QtGui.QPaintEvent',),
"QPaintDeviceWindow.update": [(), ('PySide2.QtCore.QRect',), ('PySide2.QtGui.QRegion',)],
@@ -4694,7 +4698,7 @@ if "PySide2.QtGui" in sys.modules:
"QPainter.drawEllipse": [('PySide2.QtCore.QPoint', 'int', 'int'), ('PySide2.QtCore.QPointF', 'float', 'float'), ('PySide2.QtCore.QRect',), ('PySide2.QtCore.QRectF',), ('int', 'int', 'int', 'int')],
"QPainter.drawImage": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QPoint', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRect', 'ImageConversionFlags'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRectF', 'ImageConversionFlags'), ('PySide2.QtCore.QRect', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QRect', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRect', 'ImageConversionFlags'), ('PySide2.QtCore.QRectF', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QRectF', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRectF', 'ImageConversionFlags'), ('int', 'int', 'PySide2.QtGui.QImage', 'int', 'int', 'int', 'int', 'ImageConversionFlags')],
"QPainter.drawLine": [('PySide2.QtCore.QLine',), ('PySide2.QtCore.QLineF',), ('PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'), ('PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF'), ('int', 'int', 'int', 'int')],
- "QPainter.drawLines": ['list'],
+ "QPainter.drawLines": ('list',),
"QPainter.drawPath": ('PySide2.QtGui.QPainterPath',),
"QPainter.drawPicture": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QPicture'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QPicture'), ('int', 'int', 'PySide2.QtGui.QPicture')],
"QPainter.drawPie": [('PySide2.QtCore.QRect', 'int', 'int'), ('PySide2.QtCore.QRectF', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'int')],
@@ -4705,7 +4709,7 @@ if "PySide2.QtGui" in sys.modules:
"QPainter.drawPolygon": [('PySide2.QtGui.QPolygon', 'PySide2.QtCore.Qt.FillRule'), ('PySide2.QtGui.QPolygonF', 'PySide2.QtCore.Qt.FillRule'), ('list', 'PySide2.QtCore.Qt.FillRule')],
"QPainter.drawPolyline": [('PySide2.QtGui.QPolygon',), ('PySide2.QtGui.QPolygonF',), ('list',)],
"QPainter.drawRect": [('PySide2.QtCore.QRect',), ('PySide2.QtCore.QRectF',), ('int', 'int', 'int', 'int')],
- "QPainter.drawRects": ['list'],
+ "QPainter.drawRects": ('list',),
"QPainter.drawRoundRect": [('PySide2.QtCore.QRect', 'int', 'int'), ('PySide2.QtCore.QRectF', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'int')],
"QPainter.drawRoundedRect": [('PySide2.QtCore.QRect', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode'), ('PySide2.QtCore.QRectF', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode'), ('int', 'int', 'int', 'int', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode')],
"QPainter.drawStaticText": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QStaticText'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QStaticText'), ('int', 'int', 'PySide2.QtGui.QStaticText')],
@@ -5064,11 +5068,11 @@ if "PySide2.QtGui" in sys.modules:
"QPolygon.contains": ('PySide2.QtCore.QPoint',),
"QPolygon.containsPoint": ('PySide2.QtCore.QPoint', 'PySide2.QtCore.Qt.FillRule'),
"QPolygon.count": [(), ('PySide2.QtCore.QPoint',)],
- "QPolygon.data": [],
+ "QPolygon.data": (),
"QPolygon.empty": (),
"QPolygon.endsWith": ('PySide2.QtCore.QPoint',),
"QPolygon.fill": ('PySide2.QtCore.QPoint', 'int'),
- "QPolygon.first": [],
+ "QPolygon.first": (),
"QPolygon.fromList": ('list',),
"QPolygon.front": (),
"QPolygon.indexOf": ('PySide2.QtCore.QPoint', 'int'),
@@ -5076,7 +5080,7 @@ if "PySide2.QtGui" in sys.modules:
"QPolygon.intersected": ('PySide2.QtGui.QPolygon',),
"QPolygon.isEmpty": (),
"QPolygon.isSharedWith": ('list',),
- "QPolygon.last": [],
+ "QPolygon.last": (),
"QPolygon.lastIndexOf": ('PySide2.QtCore.QPoint', 'int'),
"QPolygon.length": (),
"QPolygon.mid": ('int', 'int'),
@@ -5124,11 +5128,11 @@ if "PySide2.QtGui" in sys.modules:
"QPolygonF.contains": ('PySide2.QtCore.QPointF',),
"QPolygonF.containsPoint": ('PySide2.QtCore.QPointF', 'PySide2.QtCore.Qt.FillRule'),
"QPolygonF.count": [(), ('PySide2.QtCore.QPointF',)],
- "QPolygonF.data": [],
+ "QPolygonF.data": (),
"QPolygonF.empty": (),
"QPolygonF.endsWith": ('PySide2.QtCore.QPointF',),
"QPolygonF.fill": ('PySide2.QtCore.QPointF', 'int'),
- "QPolygonF.first": [],
+ "QPolygonF.first": (),
"QPolygonF.fromList": ('list',),
"QPolygonF.front": (),
"QPolygonF.indexOf": ('PySide2.QtCore.QPointF', 'int'),
@@ -5137,7 +5141,7 @@ if "PySide2.QtGui" in sys.modules:
"QPolygonF.isClosed": (),
"QPolygonF.isEmpty": (),
"QPolygonF.isSharedWith": ('list',),
- "QPolygonF.last": [],
+ "QPolygonF.last": (),
"QPolygonF.lastIndexOf": ('PySide2.QtCore.QPointF', 'int'),
"QPolygonF.length": (),
"QPolygonF.mid": ('int', 'int'),
@@ -5303,7 +5307,6 @@ if "PySide2.QtGui" in sys.modules:
"QResizeEvent.size": (),
# class PySide2.QtGui.QScreen:
- "QScreen.virtualGeometry": (),
"QScreen.angleBetween": ('PySide2.QtCore.Qt.ScreenOrientation', 'PySide2.QtCore.Qt.ScreenOrientation'),
"QScreen.availableGeometry": (),
"QScreen.availableSize": (),
@@ -5335,11 +5338,11 @@ if "PySide2.QtGui" in sys.modules:
"QScreen.setOrientationUpdateMask": ('ScreenOrientations',),
"QScreen.size": (),
"QScreen.transformBetween": ('PySide2.QtCore.Qt.ScreenOrientation', 'PySide2.QtCore.Qt.ScreenOrientation', 'PySide2.QtCore.QRect'),
+ "QScreen.virtualGeometry": (),
"QScreen.virtualSiblings": (),
"QScreen.virtualSize": (),
# class PySide2.QtGui.QSessionManager:
- "QSessionManager.restartCommand": (),
"QSessionManager.allowsErrorInteraction": (),
"QSessionManager.allowsInteraction": (),
"QSessionManager.cancel": (),
@@ -5347,6 +5350,7 @@ if "PySide2.QtGui" in sys.modules:
"QSessionManager.isPhase2": (),
"QSessionManager.release": (),
"QSessionManager.requestPhase2": (),
+ "QSessionManager.restartCommand": (),
"QSessionManager.restartHint": (),
"QSessionManager.sessionId": (),
"QSessionManager.sessionKey": (),
@@ -5534,7 +5538,6 @@ if "PySide2.QtGui" in sys.modules:
"QStringListModel.supportedDropActions": (),
# class PySide2.QtGui.QStyleHints:
- "QStyleHints.useRtlExtensions": (),
"QStyleHints.cursorFlashTime": (),
"QStyleHints.fontSmoothingGamma": (),
"QStyleHints.keyboardAutoRepeatRate": (),
@@ -5561,6 +5564,7 @@ if "PySide2.QtGui" in sys.modules:
"QStyleHints.startDragVelocity": (),
"QStyleHints.tabFocusBehavior": (),
"QStyleHints.useHoverEffects": (),
+ "QStyleHints.useRtlExtensions": (),
"QStyleHints.wheelScrollLines": (),
# class PySide2.QtGui.QSurface:
@@ -5634,12 +5638,12 @@ if "PySide2.QtGui" in sys.modules:
"QTabletEvent.button": (),
"QTabletEvent.buttons": (),
"QTabletEvent.device": (),
- "QTabletEvent.global"+"Y": (),
"QTabletEvent.globalPos": (),
"QTabletEvent.globalPosF": (),
"QTabletEvent.globalX": (),
- "QTabletEvent.hiResGlobal"+"Y": (),
+ "QTabletEvent.global""Y": (),
"QTabletEvent.hiResGlobalX": (),
+ "QTabletEvent.hiResGlobal""Y": (),
"QTabletEvent.pointerType": (),
"QTabletEvent.pos": (),
"QTabletEvent.posF": (),
@@ -5673,7 +5677,6 @@ if "PySide2.QtGui" in sys.modules:
"QTextBlock.layout": (),
"QTextBlock.length": (),
"QTextBlock.lineCount": (),
- "QTextBlock.next": (),
"QTextBlock.position": (),
"QTextBlock.previous": (),
"QTextBlock.revision": (),
@@ -6464,10 +6467,10 @@ if "PySide2.QtGui" in sys.modules:
"QWheelEvent.angleDelta": (),
"QWheelEvent.buttons": (),
"QWheelEvent.delta": (),
- "QWheelEvent.global"+"Y": (),
"QWheelEvent.globalPos": (),
"QWheelEvent.globalPosF": (),
"QWheelEvent.globalX": (),
+ "QWheelEvent.global""Y": (),
"QWheelEvent.inverted": (),
"QWheelEvent.orientation": (),
"QWheelEvent.phase": (),
@@ -7196,6 +7199,19 @@ if "PySide2.QtWidgets" in sys.modules:
"QColorDialog.standardColor": ('int',),
"QColorDialog.testOption": ('PySide2.QtWidgets.QColorDialog.ColorDialogOption',),
+ # class PySide2.QtWidgets.QColormap:
+ "QColormap.__init__": ('PySide2.QtWidgets.QColormap',),
+ "QColormap.__copy__": (),
+ "QColormap.cleanup": (),
+ "QColormap.colorAt": ('int',),
+ "QColormap.colormap": (),
+ "QColormap.depth": (),
+ "QColormap.initialize": (),
+ "QColormap.instance": ('int',),
+ "QColormap.mode": (),
+ "QColormap.pixel": ('PySide2.QtGui.QColor',),
+ "QColormap.size": (),
+
# class PySide2.QtWidgets.QColumnView:
"QColumnView.__init__": ('PySide2.QtWidgets.QWidget',),
"QColumnView.columnWidths": (),
@@ -7896,10 +7912,10 @@ if "PySide2.QtWidgets" in sys.modules:
"QGestureRecognizer.unregisterRecognizer": ('PySide2.QtCore.Qt.GestureType',),
# class PySide2.QtWidgets.QGraphicsAnchor:
- "QGraphicsAnchor.spacing": (),
"QGraphicsAnchor.setSizePolicy": ('PySide2.QtWidgets.QSizePolicy.Policy',),
"QGraphicsAnchor.setSpacing": ('float',),
"QGraphicsAnchor.sizePolicy": (),
+ "QGraphicsAnchor.spacing": (),
"QGraphicsAnchor.unsetSpacing": (),
# class PySide2.QtWidgets.QGraphicsAnchorLayout:
@@ -8182,7 +8198,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.shape": (),
"QGraphicsItem.show": (),
"QGraphicsItem.stackBefore": ('PySide2.QtWidgets.QGraphicsItem',),
- "QGraphicsItem.toGraphicsObject": [],
+ "QGraphicsItem.toGraphicsObject": (),
"QGraphicsItem.toolTip": (),
"QGraphicsItem.topLevelItem": (),
"QGraphicsItem.topLevelWidget": (),
@@ -11146,13 +11162,13 @@ if "PySide2.QtWidgets" in sys.modules:
"QToolButton.toolButtonStyle": (),
# class PySide2.QtWidgets.QToolTip:
- "QToolTip.showText": [('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.QRect'), ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.QRect', 'int')],
"QToolTip.font": (),
"QToolTip.hideText": (),
"QToolTip.isVisible": (),
"QToolTip.palette": (),
"QToolTip.setFont": ('PySide2.QtGui.QFont',),
"QToolTip.setPalette": ('PySide2.QtGui.QPalette',),
+ "QToolTip.showText": [('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.QRect'), ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.QRect', 'int')],
"QToolTip.text": (),
# class PySide2.QtWidgets.QTreeView:
@@ -11271,7 +11287,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.expandItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.findItems": ('str', 'MatchFlags', 'int'),
"QTreeWidget.headerItem": (),
- "QTreeWidget.indexFromItem": ['PySide2.QtWidgets.QTreeWidgetItem', 'int'],
+ "QTreeWidget.indexFromItem": ('PySide2.QtWidgets.QTreeWidgetItem', 'int'),
"QTreeWidget.indexOfTopLevelItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.insertTopLevelItem": ('int', 'PySide2.QtWidgets.QTreeWidgetItem'),
"QTreeWidget.insertTopLevelItems": ('int', 'list'),
@@ -11455,12 +11471,12 @@ if "PySide2.QtWidgets" in sys.modules:
"QVBoxLayout.__init__": [(), ('PySide2.QtWidgets.QWidget',)],
# class PySide2.QtWidgets.QWhatsThis:
- "QWhatsThis.showText": ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget'),
"QWhatsThis.createAction": ('PySide2.QtCore.QObject',),
"QWhatsThis.enterWhatsThisMode": (),
"QWhatsThis.hideText": (),
"QWhatsThis.inWhatsThisMode": (),
"QWhatsThis.leaveWhatsThisMode": (),
+ "QWhatsThis.showText": ('PySide2.QtCore.QPoint', 'str', 'PySide2.QtWidgets.QWidget'),
# class PySide2.QtWidgets.QWidget:
"QWidget.__init__": ('PySide2.QtWidgets.QWidget', 'WindowFlags'),
@@ -11765,7 +11781,6 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizard.field": ('str',),
"QWizard.hasVisitedPage": ('int',),
"QWizard.initializePage": ('int',),
- "QWizard.next": (),
"QWizard.nextId": (),
"QWizard.options": (),
"QWizard.page": ('int',),
@@ -12170,7 +12185,6 @@ if "PySide2.QtSql" in sys.modules:
"QSqlQuery.lastError": (),
"QSqlQuery.lastInsertId": (),
"QSqlQuery.lastQuery": (),
- "QSqlQuery.next": (),
"QSqlQuery.nextResult": (),
"QSqlQuery.numRowsAffected": (),
"QSqlQuery.numericalPrecisionPolicy": (),
@@ -12859,12 +12873,12 @@ if "PySide2.QtTest" in sys.modules:
dict.update({
# class PySide2.QtTest.QTest:
- "QTest.currentDataTag": (),
"QTest.addColumnInternal": ('int', 'str'),
"QTest.asciiToKey": ('Union[str, int]',),
"QTest.compare_string_helper": ('str', 'str', 'str', 'str', 'str', 'int'),
"QTest.createTouchDevice": ('PySide2.QtGui.QTouchDevice.DeviceType',),
"QTest.currentAppName": (),
+ "QTest.currentDataTag": (),
"QTest.currentTestFailed": (),
"QTest.currentTestFunction": (),
"QTest.ignoreMessage": [('PySide2.QtCore.QtMsgType', 'PySide2.QtCore.QRegularExpression'), ('PySide2.QtCore.QtMsgType', 'str')],
@@ -12882,7 +12896,7 @@ if "PySide2.QtTest" in sys.modules:
"QTest.mouseRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
"QTest.qElementData": ('str', 'int'),
"QTest.qExpectFail": ('str', 'str', 'PySide2.QtTest.QTest.TestFailMode', 'str', 'int'),
- "QTest.qFindTestData": ['int', 'str', 'str', 'str'],
+ "QTest.qFindTestData": ('str', 'str', 'int', 'str'),
"QTest.qGlobalData": ('str', 'int'),
"QTest.qSkip": ('str', 'str', 'int'),
"QTest.qWaitForWindowActive": ('PySide2.QtWidgets.QWidget', 'int'),
@@ -12909,9 +12923,9 @@ if "PySide2.QtX11Extras" in sys.modules:
dict.update({
# class PySide2.QtX11Extras.QX11Info:
- "QX11Info.appRootWindow": ('int',),
"QX11Info.appDpiX": ('int',),
"QX11Info.appDpiY": ('int',),
+ "QX11Info.appRootWindow": ('int',),
"QX11Info.appScreen": (),
"QX11Info.appTime": (),
"QX11Info.appUserTime": (),
@@ -13253,7 +13267,6 @@ if "PySide2.QtXml" in sys.modules:
"QXmlInputSource.data": (),
"QXmlInputSource.fetchData": (),
"QXmlInputSource.fromRawData": ('PySide2.QtCore.QByteArray', 'bool'),
- "QXmlInputSource.next": (),
"QXmlInputSource.reset": (),
"QXmlInputSource.setData": [('PySide2.QtCore.QByteArray',), ('str',)],
@@ -13304,7 +13317,7 @@ if "PySide2.QtXml" in sys.modules:
"QXmlReader.hasFeature": ('str',),
"QXmlReader.hasProperty": ('str',),
"QXmlReader.lexicalHandler": (),
- "QXmlReader.parse": ['PySide2.QtXml.QXmlInputSource'],
+ "QXmlReader.parse": ('PySide2.QtXml.QXmlInputSource',),
"QXmlReader.property": ('str', 'bool'),
"QXmlReader.setContentHandler": ('PySide2.QtXml.QXmlContentHandler',),
"QXmlReader.setDTDHandler": ('PySide2.QtXml.QXmlDTDHandler',),
@@ -13470,7 +13483,6 @@ if "PySide2.QtXmlPatterns" in sys.modules:
"QXmlResultItems.__init__": (),
"QXmlResultItems.current": (),
"QXmlResultItems.hasError": (),
- "QXmlResultItems.next": (),
# class PySide2.QtXmlPatterns.QXmlSchema:
"QXmlSchema.__init__": [(), ('PySide2.QtXmlPatterns.QXmlSchema',)],
@@ -13528,12 +13540,12 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpContentItem.url": (),
# class PySide2.QtHelp.QHelpContentModel:
- "QHelpContentModel.isCreatingContents": (),
"QHelpContentModel.columnCount": ('PySide2.QtCore.QModelIndex',),
"QHelpContentModel.contentItemAt": ('PySide2.QtCore.QModelIndex',),
"QHelpContentModel.createContents": ('str',),
"QHelpContentModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QHelpContentModel.index": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
+ "QHelpContentModel.isCreatingContents": (),
"QHelpContentModel.parent": [(), ('PySide2.QtCore.QModelIndex',)],
"QHelpContentModel.rowCount": ('PySide2.QtCore.QModelIndex',),
@@ -13580,9 +13592,9 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpEngineCore.unregisterDocumentation": ('str',),
# class PySide2.QtHelp.QHelpIndexModel:
- "QHelpIndexModel.isCreatingIndex": (),
"QHelpIndexModel.createIndex": [('int', 'int', 'int'), ('int', 'int', 'object'), ('str',)],
"QHelpIndexModel.filter": ('str', 'str'),
+ "QHelpIndexModel.isCreatingIndex": (),
"QHelpIndexModel.linksForKeyword": ('str',),
# class PySide2.QtHelp.QHelpIndexWidget:
@@ -13603,6 +13615,7 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpSearchEngine.search": [('list',), ('str',)],
"QHelpSearchEngine.searchInput": (),
"QHelpSearchEngine.searchResultCount": (),
+ "QHelpSearchEngine.searchResults": ('int', 'int'),
# class PySide2.QtHelp.QHelpSearchQuery:
"QHelpSearchQuery.__init__": [(), ('PySide2.QtHelp.QHelpSearchQuery',), ('PySide2.QtHelp.QHelpSearchQuery.FieldName', 'List[str]')],
@@ -13621,6 +13634,12 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpSearchQueryWidget.setQuery": ('list',),
"QHelpSearchQueryWidget.setSearchInput": ('str',),
+ # class PySide2.QtHelp.QHelpSearchResult:
+ "QHelpSearchResult.__init__": [(), ('PySide2.QtCore.QUrl', 'str', 'str'), ('PySide2.QtHelp.QHelpSearchResult',)],
+ "QHelpSearchResult.snippet": (),
+ "QHelpSearchResult.title": (),
+ "QHelpSearchResult.url": (),
+
# class PySide2.QtHelp.QHelpSearchResultWidget:
"QHelpSearchResultWidget.changeEvent": ('PySide2.QtCore.QEvent',),
"QHelpSearchResultWidget.linkAt": ('PySide2.QtCore.QPoint',),
@@ -13725,7 +13744,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioBuffer.__copy__": (),
"QAudioBuffer.byteCount": (),
"QAudioBuffer.constData": (),
- "QAudioBuffer.data": [],
+ "QAudioBuffer.data": (),
"QAudioBuffer.duration": (),
"QAudioBuffer.format": (),
"QAudioBuffer.frameCount": (),
@@ -14148,9 +14167,9 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaNetworkAccessControl.setConfigurations": ('list',),
# class PySide2.QtMultimedia.QMediaObject:
- "QMediaObject.availableMetaData": (),
"QMediaObject.addPropertyWatch": ('PySide2.QtCore.QByteArray',),
"QMediaObject.availability": (),
+ "QMediaObject.availableMetaData": (),
"QMediaObject.bind": ('PySide2.QtCore.QObject',),
"QMediaObject.isAvailable": (),
"QMediaObject.isMetaDataAvailable": (),
@@ -14240,7 +14259,6 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaPlaylist.mediaCount": (),
"QMediaPlaylist.mediaObject": (),
"QMediaPlaylist.moveMedia": ('int', 'int'),
- "QMediaPlaylist.next": (),
"QMediaPlaylist.nextIndex": ('int',),
"QMediaPlaylist.playbackMode": (),
"QMediaPlaylist.previous": (),
@@ -14505,7 +14523,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoFrame.__init__": [(), ('PySide2.QtGui.QImage',), ('PySide2.QtMultimedia.QAbstractVideoBuffer', 'PySide2.QtCore.QSize', 'PySide2.QtMultimedia.QVideoFrame.PixelFormat'), ('PySide2.QtMultimedia.QVideoFrame',), ('int', 'PySide2.QtCore.QSize', 'int', 'PySide2.QtMultimedia.QVideoFrame.PixelFormat')],
"QVideoFrame.__copy__": (),
"QVideoFrame.availableMetaData": (),
- "QVideoFrame.bits": [],
+ "QVideoFrame.bits": (),
"QVideoFrame.bytesPerLine": [(), ('int',)],
"QVideoFrame.endTime": (),
"QVideoFrame.fieldType": (),
@@ -15006,7 +15024,6 @@ if "PySide2.QtQml" in sys.modules:
"QJSValueIterator.__init__": ('PySide2.QtQml.QJSValue',),
"QJSValueIterator.hasNext": (),
"QJSValueIterator.name": (),
- "QJSValueIterator.next": (),
"QJSValueIterator.value": (),
# class PySide2.QtQml.QQmlAbstractUrlInterceptor:
@@ -15017,7 +15034,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlApplicationEngine.__init__": [('PySide2.QtCore.QObject',), ('PySide2.QtCore.QUrl', 'PySide2.QtCore.QObject'), ('str', 'PySide2.QtCore.QObject')],
"QQmlApplicationEngine.load": [('PySide2.QtCore.QUrl',), ('str',)],
"QQmlApplicationEngine.loadData": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QUrl'),
- "QQmlApplicationEngine.rootObjects": [],
+ "QQmlApplicationEngine.rootObjects": (),
# class PySide2.QtQml.QQmlComponent:
"QQmlComponent.__init__": [('PySide2.QtCore.QObject',), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QUrl', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QUrl', 'PySide2.QtQml.QQmlComponent.CompilationMode', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'str', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'str', 'PySide2.QtQml.QQmlComponent.CompilationMode', 'PySide2.QtCore.QObject')],
@@ -15168,7 +15185,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlFileSelector.__init__": ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QObject'),
"QQmlFileSelector.get": ('PySide2.QtQml.QQmlEngine',),
"QQmlFileSelector.selector": (),
- "QQmlFileSelector.setExtraSelectors": ['List[str]'],
+ "QQmlFileSelector.setExtraSelectors": ('List[str]',),
"QQmlFileSelector.setSelector": ('PySide2.QtCore.QFileSelector',),
# class PySide2.QtQml.QQmlImageProviderBase:
@@ -15458,9 +15475,9 @@ if "PySide2.QtQuick" in sys.modules:
"QQuickItem.z": (),
# class PySide2.QtQuick.QQuickItemGrabResult:
- "QQuickItemGrabResult.saveToFile": ['str'],
"QQuickItemGrabResult.event": ('PySide2.QtCore.QEvent',),
"QQuickItemGrabResult.image": (),
+ "QQuickItemGrabResult.saveToFile": ('str',),
"QQuickItemGrabResult.url": (),
# class PySide2.QtQuick.QQuickPaintedItem:
@@ -15615,7 +15632,7 @@ if "PySide2.QtQuick" in sys.modules:
# class PySide2.QtQuick.QSGBasicGeometryNode:
"QSGBasicGeometryNode.__init__": ('PySide2.QtQuick.QSGNode.NodeType',),
"QSGBasicGeometryNode.clipList": (),
- "QSGBasicGeometryNode.geometry": [],
+ "QSGBasicGeometryNode.geometry": (),
"QSGBasicGeometryNode.matrix": (),
"QSGBasicGeometryNode.setGeometry": ('PySide2.QtQuick.QSGGeometry',),
"QSGBasicGeometryNode.setRendererClipList": ('PySide2.QtQuick.QSGClipNode',),
@@ -15650,9 +15667,9 @@ if "PySide2.QtQuick" in sys.modules:
"QSGGeometry.defaultAttributes_TexturedPoint2D": (),
"QSGGeometry.drawingMode": (),
"QSGGeometry.indexCount": (),
- "QSGGeometry.indexData": [],
- "QSGGeometry.indexDataAsUInt": [],
- "QSGGeometry.indexDataAsUShort": [],
+ "QSGGeometry.indexData": (),
+ "QSGGeometry.indexDataAsUInt": (),
+ "QSGGeometry.indexDataAsUShort": (),
"QSGGeometry.indexDataPattern": (),
"QSGGeometry.indexType": (),
"QSGGeometry.lineWidth": (),
@@ -15668,10 +15685,10 @@ if "PySide2.QtQuick" in sys.modules:
"QSGGeometry.updateRectGeometry": ('PySide2.QtQuick.QSGGeometry', 'PySide2.QtCore.QRectF'),
"QSGGeometry.updateTexturedRectGeometry": ('PySide2.QtQuick.QSGGeometry', 'PySide2.QtCore.QRectF', 'PySide2.QtCore.QRectF'),
"QSGGeometry.vertexCount": (),
- "QSGGeometry.vertexData": [],
- "QSGGeometry.vertexDataAsColoredPoint2D": [],
- "QSGGeometry.vertexDataAsPoint2D": [],
- "QSGGeometry.vertexDataAsTexturedPoint2D": [],
+ "QSGGeometry.vertexData": (),
+ "QSGGeometry.vertexDataAsColoredPoint2D": (),
+ "QSGGeometry.vertexDataAsPoint2D": (),
+ "QSGGeometry.vertexDataAsTexturedPoint2D": (),
"QSGGeometry.vertexDataPattern": (),
# class PySide2.QtQuick.QSGGeometryNode:
@@ -15957,7 +15974,7 @@ if "PySide2.QtDataVisualization" in sys.modules:
dict.update({
# class PySide2.QtDataVisualization.QtDataVisualization:
- "QtDataVisualization.qDefaultSurfaceFormat": ['bool'],
+ "QtDataVisualization.qDefaultSurfaceFormat": ('bool',),
})
# Module PySide2.QtUiTools
@@ -16018,13 +16035,13 @@ if "PySide2.QtWebEngineWidgets" in sys.modules:
"QWebEngineCertificateError.url": (),
# class PySide2.QtWebEngineWidgets.QWebEngineDownloadItem:
- "QWebEngineDownloadItem.path": (),
"QWebEngineDownloadItem.accept": (),
"QWebEngineDownloadItem.cancel": (),
"QWebEngineDownloadItem.id": (),
"QWebEngineDownloadItem.interruptReasonString": (),
"QWebEngineDownloadItem.isFinished": (),
"QWebEngineDownloadItem.mimeType": (),
+ "QWebEngineDownloadItem.path": (),
"QWebEngineDownloadItem.receivedBytes": (),
"QWebEngineDownloadItem.setPath": ('str',),
"QWebEngineDownloadItem.state": (),
diff --git a/sources/pyside2/tests/registry/exists_win32_5_9_3_ci.py b/sources/pyside2/tests/registry/exists_win32_5_9_4_ci.py
index 4a6862a98..8d7c8a7e0 100644
--- a/sources/pyside2/tests/registry/exists_win32_5_9_3_ci.py
+++ b/sources/pyside2/tests/registry/exists_win32_5_9_4_ci.py
@@ -1,6 +1,6 @@
#############################################################################
##
-## Copyright (C) 2017 The Qt Company Ltd.
+## Copyright (C) 2018 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of PySide2.
@@ -37,6 +37,14 @@
##
#############################################################################
+"""
+This file contains the simplified signatures for all functions in PySide
+for module 'exists_win32_5_9_4_ci'. There are no default values, no variable
+names and no self parameter. Only types are present after simplification.
+The functions 'next' resp. '__next__' are removed
+to make the output identical for Python 2 and 3.
+"""
+
import sys
dict = {}
@@ -108,13 +116,13 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractItemModel.canDropMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtCore.Qt.DropAction', 'int', 'int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.canFetchMore": ('PySide2.QtCore.QModelIndex',),
"QAbstractItemModel.changePersistentIndex": ('PySide2.QtCore.QModelIndex', 'PySide2.QtCore.QModelIndex'),
- "QAbstractItemModel.changePersistentIndexList": ('PySide2.support.signature.typing.List', 'PySide2.support.signature.typing.List'),
+ "QAbstractItemModel.changePersistentIndexList": ('List[int]', 'List[int]'),
"QAbstractItemModel.columnCount": ('PySide2.QtCore.QModelIndex',),
"QAbstractItemModel.createIndex": [('int', 'int', 'int'), ('int', 'int', 'object')],
"QAbstractItemModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QAbstractItemModel.decodeData": ('int', 'int', 'PySide2.QtCore.QModelIndex', 'PySide2.QtCore.QDataStream'),
"QAbstractItemModel.dropMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtCore.Qt.DropAction', 'int', 'int', 'PySide2.QtCore.QModelIndex'),
- "QAbstractItemModel.encodeData": ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QDataStream'),
+ "QAbstractItemModel.encodeData": ('List[int]', 'PySide2.QtCore.QDataStream'),
"QAbstractItemModel.endInsertColumns": (),
"QAbstractItemModel.endInsertRows": (),
"QAbstractItemModel.endMoveColumns": (),
@@ -133,8 +141,8 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractItemModel.insertRow": ('int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.insertRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.itemData": ('PySide2.QtCore.QModelIndex',),
- "QAbstractItemModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'PySide2.support.signature.typing.Any', 'int', 'MatchFlags'),
- "QAbstractItemModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QAbstractItemModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'Any', 'int', 'MatchFlags'),
+ "QAbstractItemModel.mimeData": ('List[int]',),
"QAbstractItemModel.mimeTypes": (),
"QAbstractItemModel.moveColumn": ('PySide2.QtCore.QModelIndex', 'int', 'PySide2.QtCore.QModelIndex', 'int'),
"QAbstractItemModel.moveColumns": ('PySide2.QtCore.QModelIndex', 'int', 'int', 'PySide2.QtCore.QModelIndex', 'int'),
@@ -150,8 +158,8 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractItemModel.revert": (),
"QAbstractItemModel.roleNames": (),
"QAbstractItemModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QAbstractItemModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QAbstractItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QAbstractItemModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QAbstractItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QAbstractItemModel.setItemData": ('PySide2.QtCore.QModelIndex', 'dict'),
"QAbstractItemModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QAbstractItemModel.sort": ('int', 'PySide2.QtCore.Qt.SortOrder'),
@@ -186,12 +194,12 @@ if "PySide2.QtCore" in sys.modules:
"QAbstractProxyModel.mapSelectionFromSource": ('PySide2.QtCore.QItemSelection',),
"QAbstractProxyModel.mapSelectionToSource": ('PySide2.QtCore.QItemSelection',),
"QAbstractProxyModel.mapToSource": ('PySide2.QtCore.QModelIndex',),
- "QAbstractProxyModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QAbstractProxyModel.mimeData": ('List[int]',),
"QAbstractProxyModel.mimeTypes": (),
"QAbstractProxyModel.resetInternalData": (),
"QAbstractProxyModel.revert": (),
- "QAbstractProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QAbstractProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QAbstractProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QAbstractProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QAbstractProxyModel.setItemData": ('PySide2.QtCore.QModelIndex', 'dict'),
"QAbstractProxyModel.setSourceModel": ('PySide2.QtCore.QAbstractItemModel',),
"QAbstractProxyModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
@@ -251,7 +259,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QBasicMutex:
"QBasicMutex.__init__": (),
- "QBasicMutex.isRecursive": [],
+ "QBasicMutex.isRecursive": (),
"QBasicMutex.lock": (),
"QBasicMutex.tryLock": (),
"QBasicMutex.try_lock": (),
@@ -286,7 +294,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QBuffer:
"QBuffer.__init__": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QBuffer.atEnd": (),
- "QBuffer.buffer": [],
+ "QBuffer.buffer": (),
"QBuffer.canReadLine": (),
"QBuffer.close": (),
"QBuffer.connectNotify": ('PySide2.QtCore.QMetaMethod',),
@@ -302,68 +310,68 @@ if "PySide2.QtCore" in sys.modules:
"QBuffer.writeData": ('str', 'int'),
# class PySide2.QtCore.QByteArray:
- "QByteArray.__init__": [(), ('PySide2.QtCore.QByteArray',), ('int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.__init__": [(), ('PySide2.QtCore.QByteArray',), ('int', 'Union[str, int]')],
"QByteArray.__copy__": (),
"QByteArray.__reduce__": (),
- "QByteArray.append": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',), ('int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.append": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',), ('int', 'Union[str, int]')],
"QByteArray.at": ('int',),
"QByteArray.capacity": (),
"QByteArray.cbegin": (),
"QByteArray.cend": (),
"QByteArray.chop": ('int',),
"QByteArray.clear": (),
- "QByteArray.contains": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
- "QByteArray.count": [(), ('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
- "QByteArray.data": [],
- "QByteArray.endsWith": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
- "QByteArray.fill": ('PySide2.support.signature.typing.Union[str, int]', 'int'),
+ "QByteArray.contains": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
+ "QByteArray.count": [(), ('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
+ "QByteArray.data": (),
+ "QByteArray.endsWith": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
+ "QByteArray.fill": ('Union[str, int]', 'int'),
"QByteArray.fromBase64": [('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QByteArray', 'Base64Options')],
"QByteArray.fromHex": ('PySide2.QtCore.QByteArray',),
- "QByteArray.fromPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QByteArray.fromPercentEncoding": ('PySide2.QtCore.QByteArray', 'Union[str, int]'),
"QByteArray.fromRawData": ('str', 'int'),
"QByteArray.indexOf": ('PySide2.QtCore.QByteArray', 'int'),
- "QByteArray.insert": [('int', 'PySide2.QtCore.QByteArray'), ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.insert": [('int', 'PySide2.QtCore.QByteArray'), ('int', 'int', 'Union[str, int]')],
"QByteArray.isEmpty": (),
"QByteArray.isNull": (),
"QByteArray.isSharedWith": ('PySide2.QtCore.QByteArray',),
"QByteArray.lastIndexOf": ('PySide2.QtCore.QByteArray', 'int'),
"QByteArray.left": ('int',),
- "QByteArray.leftJustified": ('int', 'PySide2.support.signature.typing.Union[str, int]', 'bool'),
+ "QByteArray.leftJustified": ('int', 'Union[str, int]', 'bool'),
"QByteArray.length": (),
"QByteArray.mid": ('int', 'int'),
- "QByteArray.number": [('float', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('int', 'int')],
- "QByteArray.prepend": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',), ('int', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QByteArray.number": [('float', 'Union[str, int]', 'int'), ('int', 'int')],
+ "QByteArray.prepend": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',), ('int', 'Union[str, int]')],
"QByteArray.remove": ('int', 'int'),
"QByteArray.repeated": ('int',),
- "QByteArray.replace": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray'), ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.QtCore.QByteArray'), ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'), ('int', 'int', 'PySide2.QtCore.QByteArray'), ('str', 'PySide2.QtCore.QByteArray')],
+ "QByteArray.replace": [('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray'), ('Union[str, int]', 'PySide2.QtCore.QByteArray'), ('Union[str, int]', 'Union[str, int]'), ('int', 'int', 'PySide2.QtCore.QByteArray'), ('str', 'PySide2.QtCore.QByteArray')],
"QByteArray.reserve": ('int',),
"QByteArray.resize": ('int',),
"QByteArray.right": ('int',),
- "QByteArray.rightJustified": ('int', 'PySide2.support.signature.typing.Union[str, int]', 'bool'),
- "QByteArray.setNum": [('float', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('int', 'int')],
+ "QByteArray.rightJustified": ('int', 'Union[str, int]', 'bool'),
+ "QByteArray.setNum": [('float', 'Union[str, int]', 'int'), ('int', 'int')],
"QByteArray.setRawData": ('str', 'int'),
- "QByteArray.simplified": [],
+ "QByteArray.simplified": (),
"QByteArray.size": (),
- "QByteArray.split": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QByteArray.split": ('Union[str, int]',),
"QByteArray.squeeze": (),
- "QByteArray.startsWith": [('PySide2.QtCore.QByteArray',), ('PySide2.support.signature.typing.Union[str, int]',)],
+ "QByteArray.startsWith": [('PySide2.QtCore.QByteArray',), ('Union[str, int]',)],
"QByteArray.swap": ('PySide2.QtCore.QByteArray',),
"QByteArray.toBase64": [(), ('Base64Options',)],
"QByteArray.toDouble": ('bool',),
"QByteArray.toFloat": ('bool',),
- "QByteArray.toHex": [(), ('PySide2.support.signature.typing.Union[str, int]',)],
+ "QByteArray.toHex": [(), ('Union[str, int]',)],
"QByteArray.toInt": ('bool', 'int'),
"QByteArray.toLong": ('bool', 'int'),
"QByteArray.toLongLong": ('bool', 'int'),
- "QByteArray.toLower": [],
- "QByteArray.toPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QByteArray.toLower": (),
+ "QByteArray.toPercentEncoding": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray', 'Union[str, int]'),
"QByteArray.toShort": ('bool', 'int'),
"QByteArray.toUInt": ('bool', 'int'),
"QByteArray.toULong": ('bool', 'int'),
"QByteArray.toULongLong": ('bool', 'int'),
"QByteArray.toUShort": ('bool', 'int'),
- "QByteArray.toUpper": [],
- "QByteArray.trimmed": [],
+ "QByteArray.toUpper": (),
+ "QByteArray.trimmed": (),
"QByteArray.truncate": ('int',),
# class PySide2.QtCore.QByteArrayMatcher:
@@ -383,7 +391,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QCollator:
"QCollator.__init__": [('PySide2.QtCore.QCollator',), ('PySide2.QtCore.QLocale',)],
"QCollator.caseSensitivity": (),
- "QCollator.compare": [('PySide2.support.signature.typing.Union[str, int]', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('str', 'str')],
+ "QCollator.compare": [('Union[str, int]', 'int', 'Union[str, int]', 'int'), ('str', 'str')],
"QCollator.ignorePunctuation": (),
"QCollator.locale": (),
"QCollator.numericMode": (),
@@ -400,14 +408,14 @@ if "PySide2.QtCore" in sys.modules:
"QCollatorSortKey.swap": ('PySide2.QtCore.QCollatorSortKey',),
# class PySide2.QtCore.QCommandLineOption:
- "QCommandLineOption.__init__": [('PySide2.QtCore.QCommandLineOption',), ('PySide2.support.signature.typing.List',), ('PySide2.support.signature.typing.List', 'str', 'str', 'str'), ('str',), ('str', 'str', 'str', 'str')],
+ "QCommandLineOption.__init__": [('List[str]',), ('List[str]', 'str', 'str', 'str'), ('PySide2.QtCore.QCommandLineOption',), ('str',), ('str', 'str', 'str', 'str')],
"QCommandLineOption.defaultValues": (),
"QCommandLineOption.description": (),
"QCommandLineOption.flags": (),
"QCommandLineOption.isHidden": (),
"QCommandLineOption.names": (),
"QCommandLineOption.setDefaultValue": ('str',),
- "QCommandLineOption.setDefaultValues": ('PySide2.support.signature.typing.List',),
+ "QCommandLineOption.setDefaultValues": ('List[str]',),
"QCommandLineOption.setDescription": ('str',),
"QCommandLineOption.setFlags": ('Flags',),
"QCommandLineOption.setHidden": ('bool',),
@@ -428,9 +436,9 @@ if "PySide2.QtCore" in sys.modules:
"QCommandLineParser.helpText": (),
"QCommandLineParser.isSet": [('PySide2.QtCore.QCommandLineOption',), ('str',)],
"QCommandLineParser.optionNames": (),
- "QCommandLineParser.parse": ('PySide2.support.signature.typing.List',),
+ "QCommandLineParser.parse": ('List[str]',),
"QCommandLineParser.positionalArguments": (),
- "QCommandLineParser.process": [('PySide2.QtCore.QCoreApplication',), ('PySide2.support.signature.typing.List',)],
+ "QCommandLineParser.process": [('List[str]',), ('PySide2.QtCore.QCoreApplication',)],
"QCommandLineParser.setApplicationDescription": ('str',),
"QCommandLineParser.setOptionsAfterPositionalArgumentsMode": ('PySide2.QtCore.QCommandLineParser.OptionsAfterPositionalArgumentsMode',),
"QCommandLineParser.setSingleDashWordOptionMode": ('PySide2.QtCore.QCommandLineParser.SingleDashWordOptionMode',),
@@ -441,7 +449,7 @@ if "PySide2.QtCore" in sys.modules:
"QCommandLineParser.values": [('PySide2.QtCore.QCommandLineOption',), ('str',)],
# class PySide2.QtCore.QCoreApplication:
- "QCoreApplication.__init__": ('PySide2.support.signature.typing.List',),
+ "QCoreApplication.__init__": ('List[str]',),
"QCoreApplication.addLibraryPath": ('str',),
"QCoreApplication.applicationDirPath": (),
"QCoreApplication.applicationFilePath": (),
@@ -476,7 +484,7 @@ if "PySide2.QtCore" in sys.modules:
"QCoreApplication.setApplicationVersion": ('str',),
"QCoreApplication.setAttribute": ('PySide2.QtCore.Qt.ApplicationAttribute', 'bool'),
"QCoreApplication.setEventDispatcher": ('PySide2.QtCore.QAbstractEventDispatcher',),
- "QCoreApplication.setLibraryPaths": ('PySide2.support.signature.typing.List',),
+ "QCoreApplication.setLibraryPaths": ('List[str]',),
"QCoreApplication.setOrganizationDomain": ('str',),
"QCoreApplication.setOrganizationName": ('str',),
"QCoreApplication.setQuitLockEnabled": ('bool',),
@@ -535,17 +543,17 @@ if "PySide2.QtCore" in sys.modules:
"QDataStream.writeInt16": ('int',),
"QDataStream.writeInt32": ('int',),
"QDataStream.writeInt64": ('int',),
- "QDataStream.writeInt8": ('PySide2.support.signature.typing.Union[str, int]',),
- "QDataStream.writeQChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QDataStream.writeInt8": ('Union[str, int]',),
+ "QDataStream.writeQChar": ('Union[str, int]',),
"QDataStream.writeQString": ('str',),
- "QDataStream.writeQStringList": ('PySide2.support.signature.typing.List',),
- "QDataStream.writeQVariant": ('PySide2.support.signature.typing.Any',),
+ "QDataStream.writeQStringList": ('List[str]',),
+ "QDataStream.writeQVariant": ('Any',),
"QDataStream.writeRawData": ('str', 'int'),
"QDataStream.writeString": ('str',),
"QDataStream.writeUInt16": ('int',),
"QDataStream.writeUInt32": ('int',),
"QDataStream.writeUInt64": ('int',),
- "QDataStream.writeUInt8": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QDataStream.writeUInt8": ('Union[str, int]',),
# class PySide2.QtCore.QDate:
"QDate.__init__": [(), ('PySide2.QtCore.QDate',), ('int', 'int', 'int')],
@@ -563,7 +571,7 @@ if "PySide2.QtCore" in sys.modules:
"QDate.daysTo": ('PySide2.QtCore.QDate',),
"QDate.fromJulianDay": ('int',),
"QDate.fromString": [('str', 'PySide2.QtCore.Qt.DateFormat'), ('str', 'str')],
- "QDate.getDate": ['int', 'int', 'int'],
+ "QDate.getDate": ('int', 'int', 'int'),
"QDate.isLeapYear": ('int',),
"QDate.isNull": (),
"QDate.isValid": [(), ('int', 'int', 'int')],
@@ -647,8 +655,8 @@ if "PySide2.QtCore" in sys.modules:
"QDir.currentPath": (),
"QDir.dirName": (),
"QDir.drives": (),
- "QDir.entryInfoList": [('Filters', 'SortFlags'), ('PySide2.support.signature.typing.List', 'Filters', 'SortFlags')],
- "QDir.entryList": [('Filters', 'SortFlags'), ('PySide2.support.signature.typing.List', 'Filters', 'SortFlags')],
+ "QDir.entryInfoList": [('Filters', 'SortFlags'), ('List[str]', 'Filters', 'SortFlags')],
+ "QDir.entryList": [('Filters', 'SortFlags'), ('List[str]', 'Filters', 'SortFlags')],
"QDir.exists": [(), ('str',)],
"QDir.filePath": ('str',),
"QDir.filter": (),
@@ -664,7 +672,7 @@ if "PySide2.QtCore" in sys.modules:
"QDir.isRoot": (),
"QDir.listSeparator": (),
"QDir.makeAbsolute": (),
- "QDir.match": [('PySide2.support.signature.typing.List', 'str'), ('str', 'str')],
+ "QDir.match": [('List[str]', 'str'), ('str', 'str')],
"QDir.mkdir": ('str',),
"QDir.mkpath": ('str',),
"QDir.nameFilters": (),
@@ -683,9 +691,9 @@ if "PySide2.QtCore" in sys.modules:
"QDir.separator": (),
"QDir.setCurrent": ('str',),
"QDir.setFilter": ('Filters',),
- "QDir.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QDir.setNameFilters": ('List[str]',),
"QDir.setPath": ('str',),
- "QDir.setSearchPaths": ('str', 'PySide2.support.signature.typing.List'),
+ "QDir.setSearchPaths": ('str', 'List[str]'),
"QDir.setSorting": ('SortFlags',),
"QDir.sorting": (),
"QDir.swap": ('PySide2.QtCore.QDir',),
@@ -694,12 +702,11 @@ if "PySide2.QtCore" in sys.modules:
"QDir.toNativeSeparators": ('str',),
# class PySide2.QtCore.QDirIterator:
- "QDirIterator.__init__": [('PySide2.QtCore.QDir', 'IteratorFlags'), ('str', 'Filters', 'IteratorFlags'), ('str', 'IteratorFlags'), ('str', 'PySide2.support.signature.typing.List', 'Filters', 'IteratorFlags')],
+ "QDirIterator.__init__": [('PySide2.QtCore.QDir', 'IteratorFlags'), ('str', 'Filters', 'IteratorFlags'), ('str', 'IteratorFlags'), ('str', 'List[str]', 'Filters', 'IteratorFlags')],
"QDirIterator.fileInfo": (),
"QDirIterator.fileName": (),
"QDirIterator.filePath": (),
"QDirIterator.hasNext": (),
- "QDirIterator.next": (),
"QDirIterator.path": (),
# class PySide2.QtCore.QDynamicPropertyChangeEvent:
@@ -812,7 +819,7 @@ if "PySide2.QtCore" in sys.modules:
"QFileDevice.seek": ('int',),
"QFileDevice.setPermissions": ('Permissions',),
"QFileDevice.size": (),
- "QFileDevice.unmap": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFileDevice.unmap": ('Union[str, int]',),
"QFileDevice.unsetError": (),
"QFileDevice.writeData": ('str', 'int'),
@@ -869,16 +876,16 @@ if "PySide2.QtCore" in sys.modules:
"QFileSelector.allSelectors": (),
"QFileSelector.extraSelectors": (),
"QFileSelector.select": [('PySide2.QtCore.QUrl',), ('str',)],
- "QFileSelector.setExtraSelectors": ('PySide2.support.signature.typing.List',),
+ "QFileSelector.setExtraSelectors": ('List[str]',),
# class PySide2.QtCore.QFileSystemWatcher:
- "QFileSystemWatcher.__init__": [('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QObject')],
+ "QFileSystemWatcher.__init__": [('List[str]', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QFileSystemWatcher.addPath": ('str',),
- "QFileSystemWatcher.addPaths": ('PySide2.support.signature.typing.List',),
+ "QFileSystemWatcher.addPaths": ('List[str]',),
"QFileSystemWatcher.directories": (),
"QFileSystemWatcher.files": (),
"QFileSystemWatcher.removePath": ('str',),
- "QFileSystemWatcher.removePaths": ('PySide2.support.signature.typing.List',),
+ "QFileSystemWatcher.removePaths": ('List[str]',),
# class PySide2.QtCore.QFinalState:
"QFinalState.__init__": ('PySide2.QtCore.QState',),
@@ -930,7 +937,7 @@ if "PySide2.QtCore" in sys.modules:
"QIODevice.openMode": (),
"QIODevice.peek": ('int',),
"QIODevice.pos": (),
- "QIODevice.putChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QIODevice.putChar": ('Union[str, int]',),
"QIODevice.read": ('int',),
"QIODevice.readAll": (),
"QIODevice.readChannelCount": (),
@@ -947,7 +954,7 @@ if "PySide2.QtCore" in sys.modules:
"QIODevice.setTextModeEnabled": ('bool',),
"QIODevice.size": (),
"QIODevice.startTransaction": (),
- "QIODevice.ungetChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QIODevice.ungetChar": ('Union[str, int]',),
"QIODevice.waitForBytesWritten": ('int',),
"QIODevice.waitForReadyRead": ('int',),
"QIODevice.write": ('PySide2.QtCore.QByteArray',),
@@ -959,7 +966,7 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelection.__copy__": (),
"QItemSelection.append": [('PySide2.QtCore.QItemSelectionRange',), ('list',)],
"QItemSelection.at": ('int',),
- "QItemSelection.back": [],
+ "QItemSelection.back": (),
"QItemSelection.clear": (),
"QItemSelection.constFirst": (),
"QItemSelection.constLast": (),
@@ -968,16 +975,16 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelection.detachShared": (),
"QItemSelection.empty": (),
"QItemSelection.endsWith": ('PySide2.QtCore.QItemSelectionRange',),
- "QItemSelection.first": [],
+ "QItemSelection.first": (),
"QItemSelection.fromSet": ('set',),
"QItemSelection.fromVector": ('list',),
- "QItemSelection.front": [],
+ "QItemSelection.front": (),
"QItemSelection.indexOf": ('PySide2.QtCore.QItemSelectionRange', 'int'),
"QItemSelection.indexes": (),
"QItemSelection.insert": ('int', 'PySide2.QtCore.QItemSelectionRange'),
"QItemSelection.isEmpty": (),
"QItemSelection.isSharedWith": ('list',),
- "QItemSelection.last": [],
+ "QItemSelection.last": (),
"QItemSelection.lastIndexOf": ('PySide2.QtCore.QItemSelectionRange', 'int'),
"QItemSelection.length": (),
"QItemSelection.merge": ('PySide2.QtCore.QItemSelection', 'SelectionFlags'),
@@ -1020,7 +1027,7 @@ if "PySide2.QtCore" in sys.modules:
"QItemSelectionModel.isColumnSelected": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.isRowSelected": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.isSelected": ('PySide2.QtCore.QModelIndex',),
- "QItemSelectionModel.model": [],
+ "QItemSelectionModel.model": (),
"QItemSelectionModel.reset": (),
"QItemSelectionModel.rowIntersectsSelection": ('int', 'PySide2.QtCore.QModelIndex'),
"QItemSelectionModel.select": [('PySide2.QtCore.QItemSelection', 'SelectionFlags'), ('PySide2.QtCore.QModelIndex', 'SelectionFlags')],
@@ -1061,7 +1068,7 @@ if "PySide2.QtCore" in sys.modules:
"QJsonArray.count": (),
"QJsonArray.empty": (),
"QJsonArray.first": (),
- "QJsonArray.fromStringList": ('PySide2.support.signature.typing.List',),
+ "QJsonArray.fromStringList": ('List[str]',),
"QJsonArray.fromVariantList": ('list',),
"QJsonArray.insert": ('int', 'PySide2.QtCore.QJsonValue'),
"QJsonArray.isEmpty": (),
@@ -1086,7 +1093,7 @@ if "PySide2.QtCore" in sys.modules:
"QJsonDocument.fromBinaryData": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QJsonDocument.DataValidation'),
"QJsonDocument.fromJson": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QJsonParseError'),
"QJsonDocument.fromRawData": ('str', 'int', 'PySide2.QtCore.QJsonDocument.DataValidation'),
- "QJsonDocument.fromVariant": ('PySide2.support.signature.typing.Any',),
+ "QJsonDocument.fromVariant": ('Any',),
"QJsonDocument.isArray": (),
"QJsonDocument.isEmpty": (),
"QJsonDocument.isNull": (),
@@ -1107,7 +1114,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QJsonValue:
"QJsonValue.__init__": [('PySide2.QtCore.QJsonArray',), ('PySide2.QtCore.QJsonValue',), ('PySide2.QtCore.QJsonValue.Type',), ('bool',), ('dict',), ('float',), ('int',), ('str',)],
"QJsonValue.__copy__": (),
- "QJsonValue.fromVariant": ('PySide2.support.signature.typing.Any',),
+ "QJsonValue.fromVariant": ('Any',),
"QJsonValue.isArray": (),
"QJsonValue.isBool": (),
"QJsonValue.isDouble": (),
@@ -1198,7 +1205,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.countriesForLanguage": ('PySide2.QtCore.QLocale.Language',),
"QLocale.country": (),
"QLocale.countryToString": ('PySide2.QtCore.QLocale.Country',),
- "QLocale.createSeparatedList": ('PySide2.support.signature.typing.List',),
+ "QLocale.createSeparatedList": ('List[str]',),
"QLocale.currencySymbol": ('PySide2.QtCore.QLocale.CurrencySymbolFormat',),
"QLocale.dateFormat": ('PySide2.QtCore.QLocale.FormatType',),
"QLocale.dateTimeFormat": ('PySide2.QtCore.QLocale.FormatType',),
@@ -1220,7 +1227,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.percent": (),
"QLocale.pmText": (),
"QLocale.positiveSign": (),
- "QLocale.quoteString": ['PySide2.QtCore.QLocale.QuotationStyle', 'str'],
+ "QLocale.quoteString": ('str', 'PySide2.QtCore.QLocale.QuotationStyle'),
"QLocale.script": (),
"QLocale.scriptToString": ('PySide2.QtCore.QLocale.Script',),
"QLocale.setDefault": ('PySide2.QtCore.QLocale',),
@@ -1240,7 +1247,7 @@ if "PySide2.QtCore" in sys.modules:
"QLocale.toLongLong": ('str', 'bool'),
"QLocale.toLower": ('str',),
"QLocale.toShort": ('str', 'bool'),
- "QLocale.toString": [('PySide2.QtCore.QDate', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDate', 'str'), ('PySide2.QtCore.QDateTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDateTime', 'str'), ('PySide2.QtCore.QTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QTime', 'str'), ('float', 'PySide2.support.signature.typing.Union[str, int]', 'int'), ('int',)],
+ "QLocale.toString": [('PySide2.QtCore.QDate', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDate', 'str'), ('PySide2.QtCore.QDateTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QDateTime', 'str'), ('PySide2.QtCore.QTime', 'PySide2.QtCore.QLocale.FormatType'), ('PySide2.QtCore.QTime', 'str'), ('float', 'Union[str, int]', 'int'), ('int',)],
"QLocale.toTime": [('str', 'PySide2.QtCore.QLocale.FormatType'), ('str', 'str')],
"QLocale.toUInt": ('str', 'bool'),
"QLocale.toULongLong": ('str', 'bool'),
@@ -1325,7 +1332,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QMetaObject:
"QMetaObject.__init__": (),
- "QMetaObject.cast": ['PySide2.QtCore.QObject'],
+ "QMetaObject.cast": ('PySide2.QtCore.QObject',),
"QMetaObject.checkConnectArgs": [('PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QMetaMethod'), ('str', 'str')],
"QMetaObject.classInfo": ('int',),
"QMetaObject.classInfoCount": (),
@@ -1391,8 +1398,8 @@ if "PySide2.QtCore" in sys.modules:
"QMetaProperty.type": (),
"QMetaProperty.typeName": (),
"QMetaProperty.userType": (),
- "QMetaProperty.write": ('PySide2.QtCore.QObject', 'PySide2.support.signature.typing.Any'),
- "QMetaProperty.writeOnGadget": ('int', 'PySide2.support.signature.typing.Any'),
+ "QMetaProperty.write": ('PySide2.QtCore.QObject', 'Any'),
+ "QMetaProperty.writeOnGadget": ('int', 'Any'),
# class PySide2.QtCore.QMimeData:
"QMimeData.__init__": (),
@@ -1410,10 +1417,10 @@ if "PySide2.QtCore" in sys.modules:
"QMimeData.imageData": (),
"QMimeData.removeFormat": ('str',),
"QMimeData.retrieveData": ('str', 'type'),
- "QMimeData.setColorData": ('PySide2.support.signature.typing.Any',),
+ "QMimeData.setColorData": ('Any',),
"QMimeData.setData": ('str', 'PySide2.QtCore.QByteArray'),
"QMimeData.setHtml": ('str',),
- "QMimeData.setImageData": ('PySide2.support.signature.typing.Any',),
+ "QMimeData.setImageData": ('Any',),
"QMimeData.setText": ('str',),
"QMimeData.setUrls": ('list',),
"QMimeData.text": (),
@@ -1466,7 +1473,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QMutex:
"QMutex.__init__": ('PySide2.QtCore.QMutex.RecursionMode',),
- "QMutex.isRecursive": [],
+ "QMutex.isRecursive": (),
"QMutex.lock": (),
"QMutex.tryLock": [(), ('int',)],
"QMutex.try_lock": (),
@@ -1485,14 +1492,14 @@ if "PySide2.QtCore" in sys.modules:
"QObject.blockSignals": ('bool',),
"QObject.childEvent": ('PySide2.QtCore.QChildEvent',),
"QObject.children": (),
- "QObject.connect": [('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Callable', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'PySide2.support.signature.typing.Callable', 'PySide2.QtCore.Qt.ConnectionType')],
+ "QObject.connect": [('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'Callable', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('PySide2.QtCore.QObject', 'str', 'str', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'Callable', 'PySide2.QtCore.Qt.ConnectionType'), ('str', 'PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.Qt.ConnectionType')],
"QObject.connectNotify": ('PySide2.QtCore.QMetaMethod',),
"QObject.customEvent": ('PySide2.QtCore.QEvent',),
"QObject.deleteLater": (),
- "QObject.disconnect": [('PySide2.QtCore.QMetaObject.Connection',), ('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod'), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Callable'), ('str', 'PySide2.QtCore.QObject', 'str'), ('str', 'PySide2.support.signature.typing.Callable')],
+ "QObject.disconnect": [('PySide2.QtCore.QMetaObject.Connection',), ('PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod', 'PySide2.QtCore.QObject', 'PySide2.QtCore.QMetaMethod'), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'Callable'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QObject', 'str'), ('str', 'Callable'), ('str', 'PySide2.QtCore.QObject', 'str')],
"QObject.disconnectNotify": ('PySide2.QtCore.QMetaMethod',),
- "QObject.dumpObjectInfo": [],
- "QObject.dumpObjectTree": [],
+ "QObject.dumpObjectInfo": (),
+ "QObject.dumpObjectTree": (),
"QObject.dynamicPropertyNames": (),
"QObject.emit": ('str', '...'),
"QObject.event": ('PySide2.QtCore.QEvent',),
@@ -1517,7 +1524,7 @@ if "PySide2.QtCore" in sys.modules:
"QObject.senderSignalIndex": (),
"QObject.setObjectName": ('str',),
"QObject.setParent": ('PySide2.QtCore.QObject',),
- "QObject.setProperty": ('str', 'PySide2.support.signature.typing.Any'),
+ "QObject.setProperty": ('str', 'Any'),
"QObject.signalsBlocked": (),
"QObject.startTimer": ('int', 'PySide2.QtCore.Qt.TimerType'),
"QObject.thread": (),
@@ -1605,7 +1612,7 @@ if "PySide2.QtCore" in sys.modules:
"QProcess.closeReadChannel": ('PySide2.QtCore.QProcess.ProcessChannel',),
"QProcess.closeWriteChannel": (),
"QProcess.environment": (),
- "QProcess.execute": [('str',), ('str', 'PySide2.support.signature.typing.List')],
+ "QProcess.execute": [('str',), ('str', 'List[str]')],
"QProcess.exitCode": (),
"QProcess.exitStatus": (),
"QProcess.inputChannelMode": (),
@@ -1623,8 +1630,8 @@ if "PySide2.QtCore" in sys.modules:
"QProcess.readAllStandardOutput": (),
"QProcess.readChannel": (),
"QProcess.readData": ('str', 'int'),
- "QProcess.setArguments": ('PySide2.support.signature.typing.List',),
- "QProcess.setEnvironment": ('PySide2.support.signature.typing.List',),
+ "QProcess.setArguments": ('List[str]',),
+ "QProcess.setEnvironment": ('List[str]',),
"QProcess.setInputChannelMode": ('PySide2.QtCore.QProcess.InputChannelMode',),
"QProcess.setNativeArguments": ('str',),
"QProcess.setProcessChannelMode": ('PySide2.QtCore.QProcess.ProcessChannelMode',),
@@ -1638,8 +1645,8 @@ if "PySide2.QtCore" in sys.modules:
"QProcess.setStandardOutputProcess": ('PySide2.QtCore.QProcess',),
"QProcess.setWorkingDirectory": ('str',),
"QProcess.setupChildProcess": (),
- "QProcess.start": [('OpenMode',), ('str', 'OpenMode'), ('str', 'PySide2.support.signature.typing.List', 'OpenMode')],
- "QProcess.startDetached": [('str',), ('str', 'PySide2.support.signature.typing.List'), ('str', 'PySide2.support.signature.typing.List', 'str', 'int')],
+ "QProcess.start": [('OpenMode',), ('str', 'List[str]', 'OpenMode'), ('str', 'OpenMode')],
+ "QProcess.startDetached": [('str',), ('str', 'List[str]'), ('str', 'List[str]', 'str', 'int')],
"QProcess.state": (),
"QProcess.systemEnvironment": (),
"QProcess.terminate": (),
@@ -1671,7 +1678,7 @@ if "PySide2.QtCore" in sys.modules:
"QPropertyAnimation.setPropertyName": ('PySide2.QtCore.QByteArray',),
"QPropertyAnimation.setTargetObject": ('PySide2.QtCore.QObject',),
"QPropertyAnimation.targetObject": (),
- "QPropertyAnimation.updateCurrentValue": ('PySide2.support.signature.typing.Any',),
+ "QPropertyAnimation.updateCurrentValue": ('Any',),
"QPropertyAnimation.updateState": ('PySide2.QtCore.QAbstractAnimation.State', 'PySide2.QtCore.QAbstractAnimation.State'),
# class PySide2.QtCore.QReadLocker:
@@ -1818,11 +1825,11 @@ if "PySide2.QtCore" in sys.modules:
"QRegExp.__init__": [(), ('PySide2.QtCore.QRegExp',), ('str', 'PySide2.QtCore.Qt.CaseSensitivity', 'PySide2.QtCore.QRegExp.PatternSyntax')],
"QRegExp.__copy__": (),
"QRegExp.__reduce__": (),
- "QRegExp.cap": ['int'],
+ "QRegExp.cap": ('int',),
"QRegExp.captureCount": (),
- "QRegExp.capturedTexts": [],
+ "QRegExp.capturedTexts": (),
"QRegExp.caseSensitivity": (),
- "QRegExp.errorString": [],
+ "QRegExp.errorString": (),
"QRegExp.escape": ('str',),
"QRegExp.exactMatch": ('str',),
"QRegExp.indexIn": ('str', 'int', 'PySide2.QtCore.QRegExp.CaretMode'),
@@ -1833,7 +1840,7 @@ if "PySide2.QtCore" in sys.modules:
"QRegExp.matchedLength": (),
"QRegExp.pattern": (),
"QRegExp.patternSyntax": (),
- "QRegExp.pos": ['int'],
+ "QRegExp.pos": ('int',),
"QRegExp.replace": ('str', 'str'),
"QRegExp.setCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QRegExp.setMinimal": ('bool',),
@@ -1847,9 +1854,9 @@ if "PySide2.QtCore" in sys.modules:
"QRegularExpression.captureCount": (),
"QRegularExpression.errorString": (),
"QRegularExpression.escape": ('str',),
- "QRegularExpression.globalMatch": ['MatchOptions', 'PySide2.QtCore.QRegularExpression.MatchType', 'int', 'str'],
+ "QRegularExpression.globalMatch": ('str', 'int', 'PySide2.QtCore.QRegularExpression.MatchType', 'MatchOptions'),
"QRegularExpression.isValid": (),
- "QRegularExpression.match": ['MatchOptions', 'PySide2.QtCore.QRegularExpression.MatchType', 'int', 'str'],
+ "QRegularExpression.match": ('str', 'int', 'PySide2.QtCore.QRegularExpression.MatchType', 'MatchOptions'),
"QRegularExpression.namedCaptureGroups": (),
"QRegularExpression.optimize": (),
"QRegularExpression.pattern": (),
@@ -1884,7 +1891,6 @@ if "PySide2.QtCore" in sys.modules:
"QRegularExpressionMatchIterator.isValid": (),
"QRegularExpressionMatchIterator.matchOptions": (),
"QRegularExpressionMatchIterator.matchType": (),
- "QRegularExpressionMatchIterator.next": (),
"QRegularExpressionMatchIterator.peekNext": (),
"QRegularExpressionMatchIterator.regularExpression": (),
"QRegularExpressionMatchIterator.swap": ('PySide2.QtCore.QRegularExpressionMatchIterator',),
@@ -1903,13 +1909,13 @@ if "PySide2.QtCore" in sys.modules:
"QResource.lastModified": (),
"QResource.locale": (),
"QResource.registerResource": ('str', 'str'),
- "QResource.registerResourceData": ('PySide2.support.signature.typing.Union[str, int]', 'str'),
+ "QResource.registerResourceData": ('Union[str, int]', 'str'),
"QResource.searchPaths": (),
"QResource.setFileName": ('str',),
"QResource.setLocale": ('PySide2.QtCore.QLocale',),
"QResource.size": (),
"QResource.unregisterResource": ('str', 'str'),
- "QResource.unregisterResourceData": ('PySide2.support.signature.typing.Union[str, int]', 'str'),
+ "QResource.unregisterResourceData": ('Union[str, int]', 'str'),
# class PySide2.QtCore.QRunnable:
"QRunnable.__init__": (),
@@ -1976,10 +1982,10 @@ if "PySide2.QtCore" in sys.modules:
"QSettings.setFallbacksEnabled": ('bool',),
"QSettings.setIniCodec": [('PySide2.QtCore.QTextCodec',), ('str',)],
"QSettings.setPath": ('PySide2.QtCore.QSettings.Format', 'PySide2.QtCore.QSettings.Scope', 'str'),
- "QSettings.setValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QSettings.setValue": ('str', 'Any'),
"QSettings.status": (),
"QSettings.sync": (),
- "QSettings.value": ('str', 'PySide2.support.signature.typing.Any'),
+ "QSettings.value": ('str', 'Any'),
# class PySide2.QtCore.QSignalMapper:
"QSignalMapper.__init__": ('PySide2.QtCore.QObject',),
@@ -2074,14 +2080,14 @@ if "PySide2.QtCore" in sys.modules:
"QSortFilterProxyModel.mapSelectionFromSource": ('PySide2.QtCore.QItemSelection',),
"QSortFilterProxyModel.mapSelectionToSource": ('PySide2.QtCore.QItemSelection',),
"QSortFilterProxyModel.mapToSource": ('PySide2.QtCore.QModelIndex',),
- "QSortFilterProxyModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'PySide2.support.signature.typing.Any', 'int', 'MatchFlags'),
- "QSortFilterProxyModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QSortFilterProxyModel.match": ('PySide2.QtCore.QModelIndex', 'int', 'Any', 'int', 'MatchFlags'),
+ "QSortFilterProxyModel.mimeData": ('List[int]',),
"QSortFilterProxyModel.mimeTypes": (),
"QSortFilterProxyModel.parent": [(), ('PySide2.QtCore.QModelIndex',)],
"QSortFilterProxyModel.removeColumns": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QSortFilterProxyModel.removeRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QSortFilterProxyModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QSortFilterProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSortFilterProxyModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QSortFilterProxyModel.setDynamicSortFilter": ('bool',),
"QSortFilterProxyModel.setFilterCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QSortFilterProxyModel.setFilterFixedString": ('str',),
@@ -2089,7 +2095,7 @@ if "PySide2.QtCore" in sys.modules:
"QSortFilterProxyModel.setFilterRegExp": [('PySide2.QtCore.QRegExp',), ('str',)],
"QSortFilterProxyModel.setFilterRole": ('int',),
"QSortFilterProxyModel.setFilterWildcard": ('str',),
- "QSortFilterProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSortFilterProxyModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QSortFilterProxyModel.setSortCaseSensitivity": ('PySide2.QtCore.Qt.CaseSensitivity',),
"QSortFilterProxyModel.setSortLocaleAware": ('bool',),
"QSortFilterProxyModel.setSortRole": ('int',),
@@ -2106,7 +2112,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QStandardPaths:
"QStandardPaths.displayName": ('PySide2.QtCore.QStandardPaths.StandardLocation',),
"QStandardPaths.enableTestMode": ('bool',),
- "QStandardPaths.findExecutable": ('str', 'PySide2.support.signature.typing.List'),
+ "QStandardPaths.findExecutable": ('str', 'List[str]'),
"QStandardPaths.isTestModeEnabled": (),
"QStandardPaths.locate": ('PySide2.QtCore.QStandardPaths.StandardLocation', 'str', 'LocateOptions'),
"QStandardPaths.locateAll": ('PySide2.QtCore.QStandardPaths.StandardLocation', 'str', 'LocateOptions'),
@@ -2117,7 +2123,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QState:
"QState.__init__": [('PySide2.QtCore.QState',), ('PySide2.QtCore.QState.ChildMode', 'PySide2.QtCore.QState')],
"QState.addTransition": [('PySide2.QtCore.QAbstractState',), ('PySide2.QtCore.QAbstractTransition',), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtCore.QAbstractState'), ('object', 'PySide2.QtCore.QAbstractState')],
- "QState.assignProperty": ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any'),
+ "QState.assignProperty": ('PySide2.QtCore.QObject', 'str', 'Any'),
"QState.childMode": (),
"QState.errorState": (),
"QState.event": ('PySide2.QtCore.QEvent',),
@@ -2138,7 +2144,7 @@ if "PySide2.QtCore" in sys.modules:
"QStateMachine.beginSelectTransitions": ('PySide2.QtCore.QEvent',),
"QStateMachine.cancelDelayedEvent": ('int',),
"QStateMachine.clearError": (),
- "QStateMachine.configuration": [],
+ "QStateMachine.configuration": (),
"QStateMachine.defaultAnimations": (),
"QStateMachine.endMicrostep": ('PySide2.QtCore.QEvent',),
"QStateMachine.endSelectTransitions": ('PySide2.QtCore.QEvent',),
@@ -2247,7 +2253,7 @@ if "PySide2.QtCore" in sys.modules:
"QTextCodec.aliases": (),
"QTextCodec.availableCodecs": (),
"QTextCodec.availableMibs": (),
- "QTextCodec.canEncode": [('PySide2.support.signature.typing.Union[str, int]',), ('str',)],
+ "QTextCodec.canEncode": [('Union[str, int]',), ('str',)],
"QTextCodec.codecForHtml": [('PySide2.QtCore.QByteArray',), ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QTextCodec')],
"QTextCodec.codecForLocale": (),
"QTextCodec.codecForMib": ('int',),
@@ -2304,7 +2310,7 @@ if "PySide2.QtCore" in sys.modules:
"QTextStream.setIntegerBase": ('int',),
"QTextStream.setLocale": ('PySide2.QtCore.QLocale',),
"QTextStream.setNumberFlags": ('NumberFlags',),
- "QTextStream.setPadChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QTextStream.setPadChar": ('Union[str, int]',),
"QTextStream.setRealNumberNotation": ('PySide2.QtCore.QTextStream.RealNumberNotation',),
"QTextStream.setRealNumberPrecision": ('int',),
"QTextStream.setStatus": ('PySide2.QtCore.QTextStream.Status',),
@@ -2460,7 +2466,7 @@ if "PySide2.QtCore" in sys.modules:
"QTimer.setInterval": ('int',),
"QTimer.setSingleShot": ('bool',),
"QTimer.setTimerType": ('PySide2.QtCore.Qt.TimerType',),
- "QTimer.singleShot": [('int', 'PySide2.QtCore.QObject', 'str'), ('int', 'PySide2.QtCore.Qt.TimerType', 'PySide2.QtCore.QObject', 'str'), ('int', 'PySide2.support.signature.typing.Callable')],
+ "QTimer.singleShot": [('int', 'Callable'), ('int', 'PySide2.QtCore.QObject', 'str'), ('int', 'PySide2.QtCore.Qt.TimerType', 'PySide2.QtCore.QObject', 'str')],
"QTimer.start": [(), ('int',)],
"QTimer.stop": (),
"QTimer.timerEvent": ('PySide2.QtCore.QTimerEvent',),
@@ -2474,7 +2480,7 @@ if "PySide2.QtCore" in sys.modules:
# class PySide2.QtCore.QTranslator:
"QTranslator.__init__": ('PySide2.QtCore.QObject',),
"QTranslator.isEmpty": (),
- "QTranslator.load": [('PySide2.QtCore.QLocale', 'str', 'str', 'str', 'str'), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'str'), ('str', 'str', 'str', 'str')],
+ "QTranslator.load": [('PySide2.QtCore.QLocale', 'str', 'str', 'str', 'str'), ('Union[str, int]', 'int', 'str'), ('str', 'str', 'str', 'str')],
"QTranslator.translate": ('str', 'str', 'str', 'int'),
# class PySide2.QtCore.QUrl:
@@ -2491,7 +2497,7 @@ if "PySide2.QtCore" in sys.modules:
"QUrl.fromEncoded": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.fromLocalFile": ('str',),
"QUrl.fromPercentEncoding": ('PySide2.QtCore.QByteArray',),
- "QUrl.fromStringList": ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QUrl.ParsingMode'),
+ "QUrl.fromStringList": ('List[str]', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.fromUserInput": [('str',), ('str', 'str', 'UserInputResolutionOptions')],
"QUrl.hasFragment": (),
"QUrl.hasQuery": (),
@@ -2512,7 +2518,7 @@ if "PySide2.QtCore" in sys.modules:
"QUrl.setAuthority": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setFragment": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setHost": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
- "QUrl.setIdnWhitelist": ('PySide2.support.signature.typing.List',),
+ "QUrl.setIdnWhitelist": ('List[str]',),
"QUrl.setPassword": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setPath": ('str', 'PySide2.QtCore.QUrl.ParsingMode'),
"QUrl.setPort": ('int',),
@@ -2552,13 +2558,13 @@ if "PySide2.QtCore" in sys.modules:
"QUrlQuery.removeAllQueryItems": ('str',),
"QUrlQuery.removeQueryItem": ('str',),
"QUrlQuery.setQuery": ('str',),
- "QUrlQuery.setQueryDelimiters": ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QUrlQuery.setQueryDelimiters": ('Union[str, int]', 'Union[str, int]'),
"QUrlQuery.setQueryItems": ('list',),
"QUrlQuery.swap": ('PySide2.QtCore.QUrlQuery',),
"QUrlQuery.toString": ('PySide2.QtCore.QUrl.ComponentFormattingOption',),
# class PySide2.QtCore.QUuid:
- "QUuid.__init__": [(), ('PySide2.QtCore.QByteArray',), ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'), ('str',)],
+ "QUuid.__init__": [(), ('PySide2.QtCore.QByteArray',), ('int', 'int', 'int', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]'), ('str',)],
"QUuid.__copy__": (),
"QUuid.__reduce__": (),
"QUuid.createUuid": (),
@@ -2579,16 +2585,16 @@ if "PySide2.QtCore" in sys.modules:
"QVariantAnimation.easingCurve": (),
"QVariantAnimation.endValue": (),
"QVariantAnimation.event": ('PySide2.QtCore.QEvent',),
- "QVariantAnimation.interpolated": ('PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'float'),
+ "QVariantAnimation.interpolated": ('Any', 'Any', 'float'),
"QVariantAnimation.keyValueAt": ('float',),
"QVariantAnimation.setDuration": ('int',),
"QVariantAnimation.setEasingCurve": ('PySide2.QtCore.QEasingCurve',),
- "QVariantAnimation.setEndValue": ('PySide2.support.signature.typing.Any',),
- "QVariantAnimation.setKeyValueAt": ('float', 'PySide2.support.signature.typing.Any'),
- "QVariantAnimation.setStartValue": ('PySide2.support.signature.typing.Any',),
+ "QVariantAnimation.setEndValue": ('Any',),
+ "QVariantAnimation.setKeyValueAt": ('float', 'Any'),
+ "QVariantAnimation.setStartValue": ('Any',),
"QVariantAnimation.startValue": (),
"QVariantAnimation.updateCurrentTime": ('int',),
- "QVariantAnimation.updateCurrentValue": ('PySide2.support.signature.typing.Any',),
+ "QVariantAnimation.updateCurrentValue": ('Any',),
"QVariantAnimation.updateState": ('PySide2.QtCore.QAbstractAnimation.State', 'PySide2.QtCore.QAbstractAnimation.State'),
# class PySide2.QtCore.QVersionNumber:
@@ -2655,18 +2661,18 @@ if "PySide2.QtCore" in sys.modules:
"QXmlStreamAttributes.constLast": (),
"QXmlStreamAttributes.contains": ('PySide2.QtCore.QXmlStreamAttribute',),
"QXmlStreamAttributes.count": [(), ('PySide2.QtCore.QXmlStreamAttribute',)],
- "QXmlStreamAttributes.data": [],
+ "QXmlStreamAttributes.data": (),
"QXmlStreamAttributes.empty": (),
"QXmlStreamAttributes.endsWith": ('PySide2.QtCore.QXmlStreamAttribute',),
"QXmlStreamAttributes.fill": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
- "QXmlStreamAttributes.first": [],
+ "QXmlStreamAttributes.first": (),
"QXmlStreamAttributes.front": (),
"QXmlStreamAttributes.hasAttribute": [('str',), ('str', 'str')],
"QXmlStreamAttributes.indexOf": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
"QXmlStreamAttributes.insert": [('int', 'PySide2.QtCore.QXmlStreamAttribute'), ('int', 'int', 'PySide2.QtCore.QXmlStreamAttribute')],
"QXmlStreamAttributes.isEmpty": (),
"QXmlStreamAttributes.isSharedWith": ('list',),
- "QXmlStreamAttributes.last": [],
+ "QXmlStreamAttributes.last": (),
"QXmlStreamAttributes.lastIndexOf": ('PySide2.QtCore.QXmlStreamAttribute', 'int'),
"QXmlStreamAttributes.length": (),
"QXmlStreamAttributes.mid": ('int', 'int'),
@@ -2802,10 +2808,6 @@ if "PySide2.QtCore" in sys.modules:
"QXmlStreamWriter.writeStartElement": [('str',), ('str', 'str')],
"QXmlStreamWriter.writeTextElement": [('str', 'str'), ('str', 'str', 'str')],
- # class PySide2.QtCore.Qt:
- "Qt.qt_getEnumMetaObject": [('Alignment',), ('DockWidgetAreas',), ('DropActions',), ('Edges',), ('ImageConversionFlags',), ('InputMethodHints',), ('InputMethodQueries',), ('ItemFlags',), ('KeyboardModifiers',), ('MatchFlags',), ('MouseButtons',), ('Orientations',), ('PySide2.QtCore.Qt.ApplicationAttribute',), ('PySide2.QtCore.Qt.ApplicationState',), ('PySide2.QtCore.Qt.ArrowType',), ('PySide2.QtCore.Qt.AspectRatioMode',), ('PySide2.QtCore.Qt.Axis',), ('PySide2.QtCore.Qt.BGMode',), ('PySide2.QtCore.Qt.BrushStyle',), ('PySide2.QtCore.Qt.CaseSensitivity',), ('PySide2.QtCore.Qt.CheckState',), ('PySide2.QtCore.Qt.ChecksumType',), ('PySide2.QtCore.Qt.ClipOperation',), ('PySide2.QtCore.Qt.ConnectionType',), ('PySide2.QtCore.Qt.ContextMenuPolicy',), ('PySide2.QtCore.Qt.Corner',), ('PySide2.QtCore.Qt.CursorMoveStyle',), ('PySide2.QtCore.Qt.CursorShape',), ('PySide2.QtCore.Qt.DateFormat',), ('PySide2.QtCore.Qt.DayOfWeek',), ('PySide2.QtCore.Qt.DockWidgetArea',), ('PySide2.QtCore.Qt.DropAction',), ('PySide2.QtCore.Qt.Edge',), ('PySide2.QtCore.Qt.EnterKeyType',), ('PySide2.QtCore.Qt.FillRule',), ('PySide2.QtCore.Qt.FocusPolicy',), ('PySide2.QtCore.Qt.FocusReason',), ('PySide2.QtCore.Qt.GestureState',), ('PySide2.QtCore.Qt.GestureType',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtCore.Qt.InputMethodHint',), ('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.ItemDataRole',), ('PySide2.QtCore.Qt.ItemSelectionMode',), ('PySide2.QtCore.Qt.ItemSelectionOperation',), ('PySide2.QtCore.Qt.Key',), ('PySide2.QtCore.Qt.LayoutDirection',), ('PySide2.QtCore.Qt.MaskMode',), ('PySide2.QtCore.Qt.MouseEventFlag',), ('PySide2.QtCore.Qt.MouseEventSource',), ('PySide2.QtCore.Qt.NativeGestureType',), ('PySide2.QtCore.Qt.Orientation',), ('PySide2.QtCore.Qt.PenCapStyle',), ('PySide2.QtCore.Qt.PenJoinStyle',), ('PySide2.QtCore.Qt.PenStyle',), ('PySide2.QtCore.Qt.ScreenOrientation',), ('PySide2.QtCore.Qt.ScrollBarPolicy',), ('PySide2.QtCore.Qt.ScrollPhase',), ('PySide2.QtCore.Qt.ShortcutContext',), ('PySide2.QtCore.Qt.SizeHint',), ('PySide2.QtCore.Qt.SizeMode',), ('PySide2.QtCore.Qt.SortOrder',), ('PySide2.QtCore.Qt.TabFocusBehavior',), ('PySide2.QtCore.Qt.TextElideMode',), ('PySide2.QtCore.Qt.TextFlag',), ('PySide2.QtCore.Qt.TextFormat',), ('PySide2.QtCore.Qt.TextInteractionFlag',), ('PySide2.QtCore.Qt.TimeSpec',), ('PySide2.QtCore.Qt.TimerType',), ('PySide2.QtCore.Qt.ToolBarArea',), ('PySide2.QtCore.Qt.ToolButtonStyle',), ('PySide2.QtCore.Qt.TransformationMode',), ('PySide2.QtCore.Qt.WidgetAttribute',), ('PySide2.QtCore.Qt.WindowModality',), ('PySide2.QtCore.Qt.WindowState',), ('PySide2.QtCore.Qt.WindowType',), ('ScreenOrientations',), ('TextInteractionFlags',), ('ToolBarAreas',), ('TouchPointStates',), ('WindowFlags',), ('WindowStates',)],
- "Qt.qt_getEnumName": [('Alignment',), ('DockWidgetAreas',), ('DropActions',), ('Edges',), ('ImageConversionFlags',), ('InputMethodHints',), ('InputMethodQueries',), ('ItemFlags',), ('KeyboardModifiers',), ('MatchFlags',), ('MouseButtons',), ('Orientations',), ('PySide2.QtCore.Qt.ApplicationAttribute',), ('PySide2.QtCore.Qt.ApplicationState',), ('PySide2.QtCore.Qt.ArrowType',), ('PySide2.QtCore.Qt.AspectRatioMode',), ('PySide2.QtCore.Qt.Axis',), ('PySide2.QtCore.Qt.BGMode',), ('PySide2.QtCore.Qt.BrushStyle',), ('PySide2.QtCore.Qt.CaseSensitivity',), ('PySide2.QtCore.Qt.CheckState',), ('PySide2.QtCore.Qt.ChecksumType',), ('PySide2.QtCore.Qt.ClipOperation',), ('PySide2.QtCore.Qt.ConnectionType',), ('PySide2.QtCore.Qt.ContextMenuPolicy',), ('PySide2.QtCore.Qt.Corner',), ('PySide2.QtCore.Qt.CursorMoveStyle',), ('PySide2.QtCore.Qt.CursorShape',), ('PySide2.QtCore.Qt.DateFormat',), ('PySide2.QtCore.Qt.DayOfWeek',), ('PySide2.QtCore.Qt.DockWidgetArea',), ('PySide2.QtCore.Qt.DropAction',), ('PySide2.QtCore.Qt.Edge',), ('PySide2.QtCore.Qt.EnterKeyType',), ('PySide2.QtCore.Qt.FillRule',), ('PySide2.QtCore.Qt.FocusPolicy',), ('PySide2.QtCore.Qt.FocusReason',), ('PySide2.QtCore.Qt.GestureState',), ('PySide2.QtCore.Qt.GestureType',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtCore.Qt.InputMethodHint',), ('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.ItemDataRole',), ('PySide2.QtCore.Qt.ItemSelectionMode',), ('PySide2.QtCore.Qt.ItemSelectionOperation',), ('PySide2.QtCore.Qt.Key',), ('PySide2.QtCore.Qt.LayoutDirection',), ('PySide2.QtCore.Qt.MaskMode',), ('PySide2.QtCore.Qt.MouseEventFlag',), ('PySide2.QtCore.Qt.MouseEventSource',), ('PySide2.QtCore.Qt.NativeGestureType',), ('PySide2.QtCore.Qt.Orientation',), ('PySide2.QtCore.Qt.PenCapStyle',), ('PySide2.QtCore.Qt.PenJoinStyle',), ('PySide2.QtCore.Qt.PenStyle',), ('PySide2.QtCore.Qt.ScreenOrientation',), ('PySide2.QtCore.Qt.ScrollBarPolicy',), ('PySide2.QtCore.Qt.ScrollPhase',), ('PySide2.QtCore.Qt.ShortcutContext',), ('PySide2.QtCore.Qt.SizeHint',), ('PySide2.QtCore.Qt.SizeMode',), ('PySide2.QtCore.Qt.SortOrder',), ('PySide2.QtCore.Qt.TabFocusBehavior',), ('PySide2.QtCore.Qt.TextElideMode',), ('PySide2.QtCore.Qt.TextFlag',), ('PySide2.QtCore.Qt.TextFormat',), ('PySide2.QtCore.Qt.TextInteractionFlag',), ('PySide2.QtCore.Qt.TimeSpec',), ('PySide2.QtCore.Qt.TimerType',), ('PySide2.QtCore.Qt.ToolBarArea',), ('PySide2.QtCore.Qt.ToolButtonStyle',), ('PySide2.QtCore.Qt.TransformationMode',), ('PySide2.QtCore.Qt.WidgetAttribute',), ('PySide2.QtCore.Qt.WindowModality',), ('PySide2.QtCore.Qt.WindowState',), ('PySide2.QtCore.Qt.WindowType',), ('ScreenOrientations',), ('TextInteractionFlags',), ('ToolBarAreas',), ('TouchPointStates',), ('WindowFlags',), ('WindowStates',)],
-
# class PySide2.QtCore.QtMsgType:
# class PySide2.QtCore.Signal:
@@ -2912,8 +2914,8 @@ if "PySide2.QtGui" in sys.modules:
"QBitmap.__init__": [(), ('PySide2.QtCore.QSize',), ('PySide2.QtGui.QBitmap',), ('PySide2.QtGui.QPixmap',), ('int', 'int'), ('str', 'str')],
"QBitmap.__copy__": (),
"QBitmap.clear": (),
- "QBitmap.fromData": ('PySide2.QtCore.QSize', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.QtGui.QImage.Format'),
- "QBitmap.fromImage": ['ImageConversionFlags', 'PySide2.QtGui.QImage'],
+ "QBitmap.fromData": ('PySide2.QtCore.QSize', 'Union[str, int]', 'PySide2.QtGui.QImage.Format'),
+ "QBitmap.fromImage": ('PySide2.QtGui.QImage', 'ImageConversionFlags'),
"QBitmap.swap": [('PySide2.QtGui.QBitmap',), ('PySide2.QtGui.QPixmap',)],
"QBitmap.transformed": [('PySide2.QtGui.QMatrix',), ('PySide2.QtGui.QMatrix', 'PySide2.QtCore.Qt.TransformationMode'), ('PySide2.QtGui.QTransform',)],
@@ -2956,7 +2958,7 @@ if "PySide2.QtGui" in sys.modules:
"QCloseEvent.__init__": (),
# class PySide2.QtGui.QColor:
- "QColor.__init__": [(), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtGui.QColor',), ('PySide2.support.signature.typing.Any',), ('int',), ('int', 'int', 'int', 'int'), ('str',)],
+ "QColor.__init__": [(), ('Any',), ('PySide2.QtCore.Qt.GlobalColor',), ('PySide2.QtGui.QColor',), ('int',), ('int', 'int', 'int', 'int'), ('str',)],
"QColor.__copy__": (),
"QColor.__reduce__": (),
"QColor.__setstate__": ('object',),
@@ -3058,7 +3060,7 @@ if "PySide2.QtGui" in sys.modules:
"QContextMenuEvent.__init__": [('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint'), ('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'), ('PySide2.QtGui.QContextMenuEvent.Reason', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint', 'KeyboardModifiers')],
"QContextMenuEvent.globalPos": (),
"QContextMenuEvent.globalX": (),
- "QContextMenuEvent.global"+"Y": (),
+ "QContextMenuEvent.global""Y": (),
"QContextMenuEvent.pos": (),
"QContextMenuEvent.reason": (),
"QContextMenuEvent.x": (),
@@ -3144,7 +3146,7 @@ if "PySide2.QtGui" in sys.modules:
"QEnterEvent.__init__": ('PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF'),
"QEnterEvent.globalPos": (),
"QEnterEvent.globalX": (),
- "QEnterEvent.global"+"Y": (),
+ "QEnterEvent.global""Y": (),
"QEnterEvent.localPos": (),
"QEnterEvent.pos": (),
"QEnterEvent.screenPos": (),
@@ -3183,7 +3185,7 @@ if "PySide2.QtGui" in sys.modules:
"QFont.hintingPreference": (),
"QFont.initialize": (),
"QFont.insertSubstitution": ('str', 'str'),
- "QFont.insertSubstitutions": ('str', 'PySide2.support.signature.typing.List'),
+ "QFont.insertSubstitutions": ('str', 'List[str]'),
"QFont.isCopyOf": ('PySide2.QtGui.QFont',),
"QFont.italic": (),
"QFont.kerning": (),
@@ -3295,30 +3297,30 @@ if "PySide2.QtGui" in sys.modules:
"QFontMetrics.ascent": (),
"QFontMetrics.averageCharWidth": (),
"QFontMetrics.boundingRect": [('PySide2.QtCore.QRect', 'int', 'str', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'str', 'int', 'int'), ('str',)],
- "QFontMetrics.boundingRectChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.boundingRectChar": ('Union[str, int]',),
"QFontMetrics.capHeight": (),
"QFontMetrics.charWidth": ('str', 'int'),
"QFontMetrics.descent": (),
"QFontMetrics.elidedText": ('str', 'PySide2.QtCore.Qt.TextElideMode', 'int', 'int'),
"QFontMetrics.height": (),
- "QFontMetrics.inFont": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.inFont": ('Union[str, int]',),
"QFontMetrics.inFontUcs4": ('int',),
"QFontMetrics.leading": (),
- "QFontMetrics.leftBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.leftBearing": ('Union[str, int]',),
"QFontMetrics.lineSpacing": (),
"QFontMetrics.lineWidth": (),
"QFontMetrics.maxWidth": (),
"QFontMetrics.minLeftBearing": (),
"QFontMetrics.minRightBearing": (),
"QFontMetrics.overlinePos": (),
- "QFontMetrics.rightBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.rightBearing": ('Union[str, int]',),
"QFontMetrics.size": ('int', 'str', 'int', 'int'),
"QFontMetrics.strikeOutPos": (),
"QFontMetrics.swap": ('PySide2.QtGui.QFontMetrics',),
"QFontMetrics.tightBoundingRect": ('str',),
"QFontMetrics.underlinePos": (),
"QFontMetrics.width": [('str', 'int'), ('str', 'int', 'int')],
- "QFontMetrics.widthChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetrics.widthChar": ('Union[str, int]',),
"QFontMetrics.xHeight": (),
# class PySide2.QtGui.QFontMetricsF:
@@ -3327,29 +3329,29 @@ if "PySide2.QtGui" in sys.modules:
"QFontMetricsF.ascent": (),
"QFontMetricsF.averageCharWidth": (),
"QFontMetricsF.boundingRect": [('PySide2.QtCore.QRectF', 'int', 'str', 'int', 'int'), ('str',)],
- "QFontMetricsF.boundingRectChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.boundingRectChar": ('Union[str, int]',),
"QFontMetricsF.capHeight": (),
"QFontMetricsF.descent": (),
"QFontMetricsF.elidedText": ('str', 'PySide2.QtCore.Qt.TextElideMode', 'float', 'int'),
"QFontMetricsF.height": (),
- "QFontMetricsF.inFont": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.inFont": ('Union[str, int]',),
"QFontMetricsF.inFontUcs4": ('int',),
"QFontMetricsF.leading": (),
- "QFontMetricsF.leftBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.leftBearing": ('Union[str, int]',),
"QFontMetricsF.lineSpacing": (),
"QFontMetricsF.lineWidth": (),
"QFontMetricsF.maxWidth": (),
"QFontMetricsF.minLeftBearing": (),
"QFontMetricsF.minRightBearing": (),
"QFontMetricsF.overlinePos": (),
- "QFontMetricsF.rightBearing": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.rightBearing": ('Union[str, int]',),
"QFontMetricsF.size": ('int', 'str', 'int', 'int'),
"QFontMetricsF.strikeOutPos": (),
"QFontMetricsF.swap": ('PySide2.QtGui.QFontMetricsF',),
"QFontMetricsF.tightBoundingRect": ('str',),
"QFontMetricsF.underlinePos": (),
"QFontMetricsF.width": ('str',),
- "QFontMetricsF.widthChar": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QFontMetricsF.widthChar": ('Union[str, int]',),
"QFontMetricsF.xHeight": (),
# class PySide2.QtGui.QGradient:
@@ -3367,7 +3369,7 @@ if "PySide2.QtGui" in sys.modules:
"QGradient.type": (),
# class PySide2.QtGui.QGuiApplication:
- "QGuiApplication.__init__": ('PySide2.support.signature.typing.List',),
+ "QGuiApplication.__init__": ('List[str]',),
"QGuiApplication.allWindows": (),
"QGuiApplication.applicationDisplayName": (),
"QGuiApplication.applicationState": (),
@@ -3421,7 +3423,7 @@ if "PySide2.QtGui" in sys.modules:
"QHelpEvent.__init__": ('PySide2.QtCore.QEvent.Type', 'PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'),
"QHelpEvent.globalPos": (),
"QHelpEvent.globalX": (),
- "QHelpEvent.global"+"Y": (),
+ "QHelpEvent.global""Y": (),
"QHelpEvent.pos": (),
"QHelpEvent.x": (),
"QHelpEvent.y": (),
@@ -3453,7 +3455,7 @@ if "PySide2.QtGui" in sys.modules:
"QIcon.pixmap": [('PySide2.QtCore.QSize', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State'), ('PySide2.QtGui.QWindow', 'PySide2.QtCore.QSize', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State'), ('int', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State'), ('int', 'int', 'PySide2.QtGui.QIcon.Mode', 'PySide2.QtGui.QIcon.State')],
"QIcon.setIsMask": ('bool',),
"QIcon.setThemeName": ('str',),
- "QIcon.setThemeSearchPaths": ('PySide2.support.signature.typing.List',),
+ "QIcon.setThemeSearchPaths": ('List[str]',),
"QIcon.swap": ('PySide2.QtGui.QIcon',),
"QIcon.themeName": (),
"QIcon.themeSearchPaths": (),
@@ -3478,7 +3480,7 @@ if "PySide2.QtGui" in sys.modules:
"QIconEngine.write": ('PySide2.QtCore.QDataStream',),
# class PySide2.QtGui.QImage:
- "QImage.__init__": [(), ('PySide2.QtCore.QSize', 'PySide2.QtGui.QImage.Format'), ('PySide2.QtGui.QImage',), ('PySide2.support.signature.typing.List',), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'PySide2.support.signature.typing.Callable', 'int'), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'PySide2.support.signature.typing.Callable', 'int'), ('int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'str')],
+ "QImage.__init__": [(), ('List[str]',), ('PySide2.QtCore.QSize', 'PySide2.QtGui.QImage.Format'), ('PySide2.QtGui.QImage',), ('Union[str, int]', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable', 'int'), ('Union[str, int]', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format', 'Callable', 'int'), ('int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'int', 'int', 'int', 'PySide2.QtGui.QImage.Format'), ('str', 'str')],
"QImage.__copy__": (),
"QImage.allGray": (),
"QImage.alphaChannel": (),
@@ -3573,8 +3575,8 @@ if "PySide2.QtGui" in sys.modules:
"QImageIOHandler.option": ('PySide2.QtGui.QImageIOHandler.ImageOption',),
"QImageIOHandler.read": ('PySide2.QtGui.QImage',),
"QImageIOHandler.setDevice": ('PySide2.QtCore.QIODevice',),
- "QImageIOHandler.setFormat": ['PySide2.QtCore.QByteArray'],
- "QImageIOHandler.setOption": ('PySide2.QtGui.QImageIOHandler.ImageOption', 'PySide2.support.signature.typing.Any'),
+ "QImageIOHandler.setFormat": ('PySide2.QtCore.QByteArray',),
+ "QImageIOHandler.setOption": ('PySide2.QtGui.QImageIOHandler.ImageOption', 'Any'),
"QImageIOHandler.supportsOption": ('PySide2.QtGui.QImageIOHandler.ImageOption',),
"QImageIOHandler.write": ('PySide2.QtGui.QImage',),
@@ -3747,7 +3749,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix.translate": ('float', 'float'),
# class PySide2.QtGui.QMatrix2x2:
- "QMatrix2x2.__init__": [('PySide2.QtGui.QMatrix2x2',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix2x2.__init__": [('PySide2.QtGui.QMatrix2x2',), ('Sequence',)],
"QMatrix2x2.__copy__": (),
"QMatrix2x2.__reduce__": (),
"QMatrix2x2.data": (),
@@ -3755,7 +3757,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix2x2.transposed": (),
# class PySide2.QtGui.QMatrix2x3:
- "QMatrix2x3.__init__": [('PySide2.QtGui.QMatrix2x3',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix2x3.__init__": [('PySide2.QtGui.QMatrix2x3',), ('Sequence',)],
"QMatrix2x3.__copy__": (),
"QMatrix2x3.__reduce__": (),
"QMatrix2x3.data": (),
@@ -3763,7 +3765,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix2x3.transposed": (),
# class PySide2.QtGui.QMatrix2x4:
- "QMatrix2x4.__init__": [('PySide2.QtGui.QMatrix2x4',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix2x4.__init__": [('PySide2.QtGui.QMatrix2x4',), ('Sequence',)],
"QMatrix2x4.__copy__": (),
"QMatrix2x4.__reduce__": (),
"QMatrix2x4.data": (),
@@ -3771,7 +3773,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix2x4.transposed": (),
# class PySide2.QtGui.QMatrix3x2:
- "QMatrix3x2.__init__": [('PySide2.QtGui.QMatrix3x2',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix3x2.__init__": [('PySide2.QtGui.QMatrix3x2',), ('Sequence',)],
"QMatrix3x2.__copy__": (),
"QMatrix3x2.__reduce__": (),
"QMatrix3x2.data": (),
@@ -3779,7 +3781,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix3x2.transposed": (),
# class PySide2.QtGui.QMatrix3x3:
- "QMatrix3x3.__init__": [('PySide2.QtGui.QMatrix3x3',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix3x3.__init__": [('PySide2.QtGui.QMatrix3x3',), ('Sequence',)],
"QMatrix3x3.__copy__": (),
"QMatrix3x3.__reduce__": (),
"QMatrix3x3.data": (),
@@ -3787,7 +3789,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix3x3.transposed": (),
# class PySide2.QtGui.QMatrix3x4:
- "QMatrix3x4.__init__": [('PySide2.QtGui.QMatrix3x4',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix3x4.__init__": [('PySide2.QtGui.QMatrix3x4',), ('Sequence',)],
"QMatrix3x4.__copy__": (),
"QMatrix3x4.__reduce__": (),
"QMatrix3x4.data": (),
@@ -3795,7 +3797,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix3x4.transposed": (),
# class PySide2.QtGui.QMatrix4x2:
- "QMatrix4x2.__init__": [('PySide2.QtGui.QMatrix4x2',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix4x2.__init__": [('PySide2.QtGui.QMatrix4x2',), ('Sequence',)],
"QMatrix4x2.__copy__": (),
"QMatrix4x2.__reduce__": (),
"QMatrix4x2.data": (),
@@ -3803,7 +3805,7 @@ if "PySide2.QtGui" in sys.modules:
"QMatrix4x2.transposed": (),
# class PySide2.QtGui.QMatrix4x3:
- "QMatrix4x3.__init__": [('PySide2.QtGui.QMatrix4x3',), ('PySide2.support.signature.typing.Sequence',)],
+ "QMatrix4x3.__init__": [('PySide2.QtGui.QMatrix4x3',), ('Sequence',)],
"QMatrix4x3.__copy__": (),
"QMatrix4x3.__reduce__": (),
"QMatrix4x3.data": (),
@@ -3851,7 +3853,7 @@ if "PySide2.QtGui" in sys.modules:
"QMouseEvent.flags": (),
"QMouseEvent.globalPos": (),
"QMouseEvent.globalX": (),
- "QMouseEvent.global"+"Y": (),
+ "QMouseEvent.global""Y": (),
"QMouseEvent.localPos": (),
"QMouseEvent.pos": (),
"QMouseEvent.screenPos": (),
@@ -3954,7 +3956,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLContext.openGLModuleType": (),
"QOpenGLContext.screen": (),
"QOpenGLContext.setFormat": ('PySide2.QtGui.QSurfaceFormat',),
- "QOpenGLContext.setNativeHandle": ('PySide2.support.signature.typing.Any',),
+ "QOpenGLContext.setNativeHandle": ('Any',),
"QOpenGLContext.setScreen": ('PySide2.QtGui.QScreen',),
"QOpenGLContext.setShareContext": ('PySide2.QtGui.QOpenGLContext',),
"QOpenGLContext.shareContext": (),
@@ -4001,7 +4003,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glBeginQuery": ('int', 'int'),
"QOpenGLExtraFunctions.glBeginTransformFeedback": ('int',),
"QOpenGLExtraFunctions.glBindBufferBase": ('int', 'int', 'int'),
- "QOpenGLExtraFunctions.glBindImageTexture": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glBindImageTexture": ('int', 'int', 'int', 'Union[str, int]', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glBindProgramPipeline": ('int',),
"QOpenGLExtraFunctions.glBindSampler": ('int', 'int'),
"QOpenGLExtraFunctions.glBindTransformFeedback": ('int', 'int'),
@@ -4054,6 +4056,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glGetQueryiv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glGetSamplerParameterfv": ('int', 'int', 'float'),
"QOpenGLExtraFunctions.glGetSamplerParameteriv": ('int', 'int', 'int'),
+ "QOpenGLExtraFunctions.glGetStringi": ('int', 'int'),
"QOpenGLExtraFunctions.glGetTexLevelParameterfv": ('int', 'int', 'int', 'float'),
"QOpenGLExtraFunctions.glGetTexLevelParameteriv": ('int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glGetUniformBlockIndex": ('int', 'str'),
@@ -4095,15 +4098,15 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glProgramUniform4iv": ('int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glProgramUniform4ui": ('int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glProgramUniform4uiv": ('int', 'int', 'int', 'int'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix2fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix2x3fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix2x4fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix3fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix3x2fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix3x4fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix4fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix4x2fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glProgramUniformMatrix4x3fv": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix2fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix2x3fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix2x4fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix3fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix3x2fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix3x4fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix4fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix4x2fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glProgramUniformMatrix4x3fv": ('int', 'int', 'int', 'Union[str, int]', 'float'),
"QOpenGLExtraFunctions.glReadBuffer": ('int',),
"QOpenGLExtraFunctions.glRenderbufferStorageMultisample": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glSampleMaski": ('int', 'int'),
@@ -4113,7 +4116,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glSamplerParameteriv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glTexImage3D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glTexStorage2D": ('int', 'int', 'int', 'int', 'int'),
- "QOpenGLExtraFunctions.glTexStorage2DMultisample": ('int', 'int', 'int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QOpenGLExtraFunctions.glTexStorage2DMultisample": ('int', 'int', 'int', 'int', 'int', 'Union[str, int]'),
"QOpenGLExtraFunctions.glTexStorage3D": ('int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glTexSubImage3D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glUniform1ui": ('int', 'int'),
@@ -4125,18 +4128,18 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLExtraFunctions.glUniform4ui": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glUniform4uiv": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glUniformBlockBinding": ('int', 'int', 'int'),
- "QOpenGLExtraFunctions.glUniformMatrix2x3fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix2x4fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix3x2fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix3x4fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix4x2fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLExtraFunctions.glUniformMatrix4x3fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix2x3fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix2x4fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix3x2fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix3x4fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix4x2fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLExtraFunctions.glUniformMatrix4x3fv": ('int', 'int', 'Union[str, int]', 'float'),
"QOpenGLExtraFunctions.glUnmapBuffer": ('int',),
"QOpenGLExtraFunctions.glUseProgramStages": ('int', 'int', 'int'),
"QOpenGLExtraFunctions.glValidateProgramPipeline": ('int',),
"QOpenGLExtraFunctions.glVertexAttribBinding": ('int', 'int'),
"QOpenGLExtraFunctions.glVertexAttribDivisor": ('int', 'int'),
- "QOpenGLExtraFunctions.glVertexAttribFormat": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'int'),
+ "QOpenGLExtraFunctions.glVertexAttribFormat": ('int', 'int', 'int', 'Union[str, int]', 'int'),
"QOpenGLExtraFunctions.glVertexAttribI4i": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLExtraFunctions.glVertexAttribI4iv": ('int', 'int'),
"QOpenGLExtraFunctions.glVertexAttribI4ui": ('int', 'int', 'int', 'int', 'int'),
@@ -4202,7 +4205,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glClearColor": ('float', 'float', 'float', 'float'),
"QOpenGLFunctions.glClearDepthf": ('float',),
"QOpenGLFunctions.glClearStencil": ('int',),
- "QOpenGLFunctions.glColorMask": ('PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QOpenGLFunctions.glColorMask": ('Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]'),
"QOpenGLFunctions.glCompileShader": ('int',),
"QOpenGLFunctions.glCompressedTexImage2D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glCompressedTexSubImage2D": ('int', 'int', 'int', 'int', 'int', 'int', 'int', 'int', 'int'),
@@ -4218,7 +4221,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glDeleteShader": ('int',),
"QOpenGLFunctions.glDeleteTextures": ('int', 'int'),
"QOpenGLFunctions.glDepthFunc": ('int',),
- "QOpenGLFunctions.glDepthMask": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QOpenGLFunctions.glDepthMask": ('Union[str, int]',),
"QOpenGLFunctions.glDepthRangef": ('float', 'float'),
"QOpenGLFunctions.glDetachShader": ('int', 'int'),
"QOpenGLFunctions.glDisable": ('int',),
@@ -4248,6 +4251,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glGetRenderbufferParameteriv": ('int', 'int', 'int'),
"QOpenGLFunctions.glGetShaderPrecisionFormat": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.glGetShaderiv": ('int', 'int', 'int'),
+ "QOpenGLFunctions.glGetString": ('int',),
"QOpenGLFunctions.glGetTexParameterfv": ('int', 'int', 'float'),
"QOpenGLFunctions.glGetTexParameteriv": ('int', 'int', 'int'),
"QOpenGLFunctions.glGetUniformLocation": ('int', 'str'),
@@ -4270,7 +4274,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glReadPixels": ('int', 'int', 'int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glReleaseShaderCompiler": (),
"QOpenGLFunctions.glRenderbufferStorage": ('int', 'int', 'int', 'int'),
- "QOpenGLFunctions.glSampleCoverage": ('float', 'PySide2.support.signature.typing.Union[str, int]'),
+ "QOpenGLFunctions.glSampleCoverage": ('float', 'Union[str, int]'),
"QOpenGLFunctions.glScissor": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.glShaderBinary": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glStencilFunc": ('int', 'int', 'int'),
@@ -4301,9 +4305,9 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glUniform4fv": ('int', 'int', 'float'),
"QOpenGLFunctions.glUniform4i": ('int', 'int', 'int', 'int', 'int'),
"QOpenGLFunctions.glUniform4iv": ('int', 'int', 'int'),
- "QOpenGLFunctions.glUniformMatrix2fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLFunctions.glUniformMatrix3fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
- "QOpenGLFunctions.glUniformMatrix4fv": ('int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'float'),
+ "QOpenGLFunctions.glUniformMatrix2fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLFunctions.glUniformMatrix3fv": ('int', 'int', 'Union[str, int]', 'float'),
+ "QOpenGLFunctions.glUniformMatrix4fv": ('int', 'int', 'Union[str, int]', 'float'),
"QOpenGLFunctions.glUseProgram": ('int',),
"QOpenGLFunctions.glValidateProgram": ('int',),
"QOpenGLFunctions.glVertexAttrib1f": ('int', 'float'),
@@ -4314,7 +4318,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLFunctions.glVertexAttrib3fv": ('int', 'float'),
"QOpenGLFunctions.glVertexAttrib4f": ('int', 'float', 'float', 'float', 'float'),
"QOpenGLFunctions.glVertexAttrib4fv": ('int', 'float'),
- "QOpenGLFunctions.glVertexAttribPointer": ('int', 'int', 'int', 'PySide2.support.signature.typing.Union[str, int]', 'int', 'int'),
+ "QOpenGLFunctions.glVertexAttribPointer": ('int', 'int', 'int', 'Union[str, int]', 'int', 'int'),
"QOpenGLFunctions.glViewport": ('int', 'int', 'int', 'int'),
"QOpenGLFunctions.hasOpenGLFeature": ('PySide2.QtGui.QOpenGLFunctions.OpenGLFeature',),
"QOpenGLFunctions.initializeOpenGLFunctions": (),
@@ -4383,7 +4387,7 @@ if "PySide2.QtGui" in sys.modules:
"QOpenGLShaderProgram.setDefaultInnerTessellationLevels": ('list',),
"QOpenGLShaderProgram.setDefaultOuterTessellationLevels": ('list',),
"QOpenGLShaderProgram.setPatchVertexCount": ('int',),
- "QOpenGLShaderProgram.setUniformValue": [('int', 'PySide2.QtCore.QPoint'), ('int', 'PySide2.QtCore.QPointF'), ('int', 'PySide2.QtCore.QSize'), ('int', 'PySide2.QtCore.QSizeF'), ('int', 'PySide2.QtGui.QColor'), ('int', 'PySide2.QtGui.QMatrix2x2'), ('int', 'PySide2.QtGui.QMatrix2x3'), ('int', 'PySide2.QtGui.QMatrix2x4'), ('int', 'PySide2.QtGui.QMatrix3x2'), ('int', 'PySide2.QtGui.QMatrix3x3'), ('int', 'PySide2.QtGui.QMatrix3x4'), ('int', 'PySide2.QtGui.QMatrix4x2'), ('int', 'PySide2.QtGui.QMatrix4x3'), ('int', 'PySide2.QtGui.QMatrix4x4'), ('int', 'PySide2.QtGui.QTransform'), ('int', 'PySide2.QtGui.QVector2D'), ('int', 'PySide2.QtGui.QVector3D'), ('int', 'PySide2.QtGui.QVector4D'), ('int', 'PySide2.support.signature.typing.List'), ('int', 'float'), ('int', 'float', 'float'), ('int', 'float', 'float', 'float'), ('int', 'float', 'float', 'float', 'float'), ('int', 'int'), ('str', 'PySide2.QtCore.QPoint'), ('str', 'PySide2.QtCore.QPointF'), ('str', 'PySide2.QtCore.QSize'), ('str', 'PySide2.QtCore.QSizeF'), ('str', 'PySide2.QtGui.QColor'), ('str', 'PySide2.QtGui.QMatrix2x2'), ('str', 'PySide2.QtGui.QMatrix2x3'), ('str', 'PySide2.QtGui.QMatrix2x4'), ('str', 'PySide2.QtGui.QMatrix3x2'), ('str', 'PySide2.QtGui.QMatrix3x3'), ('str', 'PySide2.QtGui.QMatrix3x4'), ('str', 'PySide2.QtGui.QMatrix4x2'), ('str', 'PySide2.QtGui.QMatrix4x3'), ('str', 'PySide2.QtGui.QMatrix4x4'), ('str', 'PySide2.QtGui.QTransform'), ('str', 'PySide2.QtGui.QVector2D'), ('str', 'PySide2.QtGui.QVector3D'), ('str', 'PySide2.QtGui.QVector4D'), ('str', 'PySide2.support.signature.typing.List'), ('str', 'float'), ('str', 'float', 'float'), ('str', 'float', 'float', 'float'), ('str', 'float', 'float', 'float', 'float'), ('str', 'int')],
+ "QOpenGLShaderProgram.setUniformValue": [('int', 'List[List[float]]'), ('int', 'PySide2.QtCore.QPoint'), ('int', 'PySide2.QtCore.QPointF'), ('int', 'PySide2.QtCore.QSize'), ('int', 'PySide2.QtCore.QSizeF'), ('int', 'PySide2.QtGui.QColor'), ('int', 'PySide2.QtGui.QMatrix2x2'), ('int', 'PySide2.QtGui.QMatrix2x3'), ('int', 'PySide2.QtGui.QMatrix2x4'), ('int', 'PySide2.QtGui.QMatrix3x2'), ('int', 'PySide2.QtGui.QMatrix3x3'), ('int', 'PySide2.QtGui.QMatrix3x4'), ('int', 'PySide2.QtGui.QMatrix4x2'), ('int', 'PySide2.QtGui.QMatrix4x3'), ('int', 'PySide2.QtGui.QMatrix4x4'), ('int', 'PySide2.QtGui.QTransform'), ('int', 'PySide2.QtGui.QVector2D'), ('int', 'PySide2.QtGui.QVector3D'), ('int', 'PySide2.QtGui.QVector4D'), ('int', 'float'), ('int', 'float', 'float'), ('int', 'float', 'float', 'float'), ('int', 'float', 'float', 'float', 'float'), ('int', 'int'), ('str', 'List[List[float]]'), ('str', 'PySide2.QtCore.QPoint'), ('str', 'PySide2.QtCore.QPointF'), ('str', 'PySide2.QtCore.QSize'), ('str', 'PySide2.QtCore.QSizeF'), ('str', 'PySide2.QtGui.QColor'), ('str', 'PySide2.QtGui.QMatrix2x2'), ('str', 'PySide2.QtGui.QMatrix2x3'), ('str', 'PySide2.QtGui.QMatrix2x4'), ('str', 'PySide2.QtGui.QMatrix3x2'), ('str', 'PySide2.QtGui.QMatrix3x3'), ('str', 'PySide2.QtGui.QMatrix3x4'), ('str', 'PySide2.QtGui.QMatrix4x2'), ('str', 'PySide2.QtGui.QMatrix4x3'), ('str', 'PySide2.QtGui.QMatrix4x4'), ('str', 'PySide2.QtGui.QTransform'), ('str', 'PySide2.QtGui.QVector2D'), ('str', 'PySide2.QtGui.QVector3D'), ('str', 'PySide2.QtGui.QVector4D'), ('str', 'float'), ('str', 'float', 'float'), ('str', 'float', 'float', 'float'), ('str', 'float', 'float', 'float', 'float'), ('str', 'int')],
"QOpenGLShaderProgram.setUniformValueArray": [('int', 'float', 'int', 'int'), ('int', 'int', 'int'), ('str', 'float', 'int', 'int'), ('str', 'int', 'int')],
"QOpenGLShaderProgram.shaders": (),
"QOpenGLShaderProgram.uniformLocation": [('PySide2.QtCore.QByteArray',), ('str',)],
@@ -4580,7 +4584,7 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QPagedPaintDevice:
"QPagedPaintDevice.__init__": (),
- "QPagedPaintDevice.devicePageLayout": [],
+ "QPagedPaintDevice.devicePageLayout": (),
"QPagedPaintDevice.margins": (),
"QPagedPaintDevice.newPage": (),
"QPagedPaintDevice.pageLayout": (),
@@ -4707,7 +4711,7 @@ if "PySide2.QtGui" in sys.modules:
"QPainter.drawEllipse": [('PySide2.QtCore.QPoint', 'int', 'int'), ('PySide2.QtCore.QPointF', 'float', 'float'), ('PySide2.QtCore.QRect',), ('PySide2.QtCore.QRectF',), ('int', 'int', 'int', 'int')],
"QPainter.drawImage": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QPoint', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRect', 'ImageConversionFlags'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRectF', 'ImageConversionFlags'), ('PySide2.QtCore.QRect', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QRect', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRect', 'ImageConversionFlags'), ('PySide2.QtCore.QRectF', 'PySide2.QtGui.QImage'), ('PySide2.QtCore.QRectF', 'PySide2.QtGui.QImage', 'PySide2.QtCore.QRectF', 'ImageConversionFlags'), ('int', 'int', 'PySide2.QtGui.QImage', 'int', 'int', 'int', 'int', 'ImageConversionFlags')],
"QPainter.drawLine": [('PySide2.QtCore.QLine',), ('PySide2.QtCore.QLineF',), ('PySide2.QtCore.QPoint', 'PySide2.QtCore.QPoint'), ('PySide2.QtCore.QPointF', 'PySide2.QtCore.QPointF'), ('int', 'int', 'int', 'int')],
- "QPainter.drawLines": ['list'],
+ "QPainter.drawLines": ('list',),
"QPainter.drawPath": ('PySide2.QtGui.QPainterPath',),
"QPainter.drawPicture": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QPicture'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QPicture'), ('int', 'int', 'PySide2.QtGui.QPicture')],
"QPainter.drawPie": [('PySide2.QtCore.QRect', 'int', 'int'), ('PySide2.QtCore.QRectF', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'int')],
@@ -4718,7 +4722,7 @@ if "PySide2.QtGui" in sys.modules:
"QPainter.drawPolygon": [('PySide2.QtGui.QPolygon', 'PySide2.QtCore.Qt.FillRule'), ('PySide2.QtGui.QPolygonF', 'PySide2.QtCore.Qt.FillRule'), ('list', 'PySide2.QtCore.Qt.FillRule')],
"QPainter.drawPolyline": [('PySide2.QtGui.QPolygon',), ('PySide2.QtGui.QPolygonF',), ('list',)],
"QPainter.drawRect": [('PySide2.QtCore.QRect',), ('PySide2.QtCore.QRectF',), ('int', 'int', 'int', 'int')],
- "QPainter.drawRects": ['list'],
+ "QPainter.drawRects": ('list',),
"QPainter.drawRoundRect": [('PySide2.QtCore.QRect', 'int', 'int'), ('PySide2.QtCore.QRectF', 'int', 'int'), ('int', 'int', 'int', 'int', 'int', 'int')],
"QPainter.drawRoundedRect": [('PySide2.QtCore.QRect', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode'), ('PySide2.QtCore.QRectF', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode'), ('int', 'int', 'int', 'int', 'float', 'float', 'PySide2.QtCore.Qt.SizeMode')],
"QPainter.drawStaticText": [('PySide2.QtCore.QPoint', 'PySide2.QtGui.QStaticText'), ('PySide2.QtCore.QPointF', 'PySide2.QtGui.QStaticText'), ('int', 'int', 'PySide2.QtGui.QStaticText')],
@@ -4984,7 +4988,7 @@ if "PySide2.QtGui" in sys.modules:
"QPictureIO.write": (),
# class PySide2.QtGui.QPixelFormat:
- "QPixelFormat.__init__": [(), ('PySide2.QtGui.QPixelFormat',), ('PySide2.QtGui.QPixelFormat.ColorModel', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.support.signature.typing.Union[str, int]', 'PySide2.QtGui.QPixelFormat.AlphaUsage', 'PySide2.QtGui.QPixelFormat.AlphaPosition', 'PySide2.QtGui.QPixelFormat.AlphaPremultiplied', 'PySide2.QtGui.QPixelFormat.TypeInterpretation', 'PySide2.QtGui.QPixelFormat.ByteOrder', 'PySide2.support.signature.typing.Union[str, int]')],
+ "QPixelFormat.__init__": [(), ('PySide2.QtGui.QPixelFormat',), ('PySide2.QtGui.QPixelFormat.ColorModel', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'Union[str, int]', 'PySide2.QtGui.QPixelFormat.AlphaUsage', 'PySide2.QtGui.QPixelFormat.AlphaPosition', 'PySide2.QtGui.QPixelFormat.AlphaPremultiplied', 'PySide2.QtGui.QPixelFormat.TypeInterpretation', 'PySide2.QtGui.QPixelFormat.ByteOrder', 'Union[str, int]')],
"QPixelFormat.__copy__": (),
"QPixelFormat.alphaPosition": (),
"QPixelFormat.alphaSize": (),
@@ -5010,7 +5014,7 @@ if "PySide2.QtGui" in sys.modules:
"QPixelFormat.yuvLayout": (),
# class PySide2.QtGui.QPixmap:
- "QPixmap.__init__": [(), ('PySide2.QtCore.QSize',), ('PySide2.QtGui.QImage',), ('PySide2.QtGui.QPixmap',), ('PySide2.support.signature.typing.List',), ('int', 'int'), ('str', 'str', 'ImageConversionFlags')],
+ "QPixmap.__init__": [(), ('List[str]',), ('PySide2.QtCore.QSize',), ('PySide2.QtGui.QImage',), ('PySide2.QtGui.QPixmap',), ('int', 'int'), ('str', 'str', 'ImageConversionFlags')],
"QPixmap.__copy__": (),
"QPixmap.cacheKey": (),
"QPixmap.convertFromImage": ('PySide2.QtGui.QImage', 'ImageConversionFlags'),
@@ -5033,7 +5037,7 @@ if "PySide2.QtGui" in sys.modules:
"QPixmap.isNull": (),
"QPixmap.isQBitmap": (),
"QPixmap.load": ('str', 'str', 'ImageConversionFlags'),
- "QPixmap.loadFromData": [('PySide2.QtCore.QByteArray', 'str', 'ImageConversionFlags'), ('PySide2.support.signature.typing.Union[str, int]', 'int', 'str', 'ImageConversionFlags')],
+ "QPixmap.loadFromData": [('PySide2.QtCore.QByteArray', 'str', 'ImageConversionFlags'), ('Union[str, int]', 'int', 'str', 'ImageConversionFlags')],
"QPixmap.mask": (),
"QPixmap.metric": ('PySide2.QtGui.QPaintDevice.PaintDeviceMetric',),
"QPixmap.paintEngine": (),
@@ -5077,11 +5081,11 @@ if "PySide2.QtGui" in sys.modules:
"QPolygon.contains": ('PySide2.QtCore.QPoint',),
"QPolygon.containsPoint": ('PySide2.QtCore.QPoint', 'PySide2.QtCore.Qt.FillRule'),
"QPolygon.count": [(), ('PySide2.QtCore.QPoint',)],
- "QPolygon.data": [],
+ "QPolygon.data": (),
"QPolygon.empty": (),
"QPolygon.endsWith": ('PySide2.QtCore.QPoint',),
"QPolygon.fill": ('PySide2.QtCore.QPoint', 'int'),
- "QPolygon.first": [],
+ "QPolygon.first": (),
"QPolygon.fromList": ('list',),
"QPolygon.front": (),
"QPolygon.indexOf": ('PySide2.QtCore.QPoint', 'int'),
@@ -5089,7 +5093,7 @@ if "PySide2.QtGui" in sys.modules:
"QPolygon.intersected": ('PySide2.QtGui.QPolygon',),
"QPolygon.isEmpty": (),
"QPolygon.isSharedWith": ('list',),
- "QPolygon.last": [],
+ "QPolygon.last": (),
"QPolygon.lastIndexOf": ('PySide2.QtCore.QPoint', 'int'),
"QPolygon.length": (),
"QPolygon.mid": ('int', 'int'),
@@ -5137,11 +5141,11 @@ if "PySide2.QtGui" in sys.modules:
"QPolygonF.contains": ('PySide2.QtCore.QPointF',),
"QPolygonF.containsPoint": ('PySide2.QtCore.QPointF', 'PySide2.QtCore.Qt.FillRule'),
"QPolygonF.count": [(), ('PySide2.QtCore.QPointF',)],
- "QPolygonF.data": [],
+ "QPolygonF.data": (),
"QPolygonF.empty": (),
"QPolygonF.endsWith": ('PySide2.QtCore.QPointF',),
"QPolygonF.fill": ('PySide2.QtCore.QPointF', 'int'),
- "QPolygonF.first": [],
+ "QPolygonF.first": (),
"QPolygonF.fromList": ('list',),
"QPolygonF.front": (),
"QPolygonF.indexOf": ('PySide2.QtCore.QPointF', 'int'),
@@ -5150,7 +5154,7 @@ if "PySide2.QtGui" in sys.modules:
"QPolygonF.isClosed": (),
"QPolygonF.isEmpty": (),
"QPolygonF.isSharedWith": ('list',),
- "QPolygonF.last": [],
+ "QPolygonF.last": (),
"QPolygonF.lastIndexOf": ('PySide2.QtCore.QPointF', 'int'),
"QPolygonF.length": (),
"QPolygonF.mid": ('int', 'int'),
@@ -5274,7 +5278,7 @@ if "PySide2.QtGui" in sys.modules:
"QRawFont.style": (),
"QRawFont.styleName": (),
"QRawFont.supportedWritingSystems": (),
- "QRawFont.supportsCharacter": [('PySide2.support.signature.typing.Union[str, int]',), ('int',)],
+ "QRawFont.supportsCharacter": [('Union[str, int]',), ('int',)],
"QRawFont.swap": ('PySide2.QtGui.QRawFont',),
"QRawFont.underlinePosition": (),
"QRawFont.unitsPerEm": (),
@@ -5363,9 +5367,9 @@ if "PySide2.QtGui" in sys.modules:
"QSessionManager.restartHint": (),
"QSessionManager.sessionId": (),
"QSessionManager.sessionKey": (),
- "QSessionManager.setDiscardCommand": ('PySide2.support.signature.typing.List',),
- "QSessionManager.setManagerProperty": [('str', 'PySide2.support.signature.typing.List'), ('str', 'str')],
- "QSessionManager.setRestartCommand": ('PySide2.support.signature.typing.List',),
+ "QSessionManager.setDiscardCommand": ('List[str]',),
+ "QSessionManager.setManagerProperty": [('str', 'List[str]'), ('str', 'str')],
+ "QSessionManager.setRestartCommand": ('List[str]',),
"QSessionManager.setRestartHint": ('PySide2.QtGui.QSessionManager.RestartHint',),
# class PySide2.QtGui.QShortcutEvent:
@@ -5425,7 +5429,7 @@ if "PySide2.QtGui" in sys.modules:
"QStandardItem.setCheckable": ('bool',),
"QStandardItem.setChild": [('int', 'PySide2.QtGui.QStandardItem'), ('int', 'int', 'PySide2.QtGui.QStandardItem')],
"QStandardItem.setColumnCount": ('int',),
- "QStandardItem.setData": ('PySide2.support.signature.typing.Any', 'int'),
+ "QStandardItem.setData": ('Any', 'int'),
"QStandardItem.setDragEnabled": ('bool',),
"QStandardItem.setDropEnabled": ('bool',),
"QStandardItem.setEditable": ('bool',),
@@ -5481,17 +5485,17 @@ if "PySide2.QtGui" in sys.modules:
"QStandardItemModel.itemData": ('PySide2.QtCore.QModelIndex',),
"QStandardItemModel.itemFromIndex": ('PySide2.QtCore.QModelIndex',),
"QStandardItemModel.itemPrototype": (),
- "QStandardItemModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QStandardItemModel.mimeData": ('List[int]',),
"QStandardItemModel.mimeTypes": (),
"QStandardItemModel.parent": [(), ('PySide2.QtCore.QModelIndex',)],
"QStandardItemModel.removeColumns": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStandardItemModel.removeRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStandardItemModel.rowCount": ('PySide2.QtCore.QModelIndex',),
"QStandardItemModel.setColumnCount": ('int',),
- "QStandardItemModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QStandardItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QStandardItemModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QStandardItemModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QStandardItemModel.setHorizontalHeaderItem": ('int', 'PySide2.QtGui.QStandardItem'),
- "QStandardItemModel.setHorizontalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QStandardItemModel.setHorizontalHeaderLabels": ('List[str]',),
"QStandardItemModel.setItem": [('int', 'PySide2.QtGui.QStandardItem'), ('int', 'int', 'PySide2.QtGui.QStandardItem')],
"QStandardItemModel.setItemData": ('PySide2.QtCore.QModelIndex', 'dict'),
"QStandardItemModel.setItemPrototype": ('PySide2.QtGui.QStandardItem',),
@@ -5499,7 +5503,7 @@ if "PySide2.QtGui" in sys.modules:
"QStandardItemModel.setRowCount": ('int',),
"QStandardItemModel.setSortRole": ('int',),
"QStandardItemModel.setVerticalHeaderItem": ('int', 'PySide2.QtGui.QStandardItem'),
- "QStandardItemModel.setVerticalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QStandardItemModel.setVerticalHeaderLabels": ('List[str]',),
"QStandardItemModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStandardItemModel.sort": ('int', 'PySide2.QtCore.Qt.SortOrder'),
"QStandardItemModel.sortRole": (),
@@ -5533,14 +5537,14 @@ if "PySide2.QtGui" in sys.modules:
"QStatusTipEvent.tip": (),
# class PySide2.QtGui.QStringListModel:
- "QStringListModel.__init__": [('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QObject')],
+ "QStringListModel.__init__": [('List[str]', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QStringListModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QStringListModel.flags": ('PySide2.QtCore.QModelIndex',),
"QStringListModel.insertRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStringListModel.removeRows": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStringListModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QStringListModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
- "QStringListModel.setStringList": ('PySide2.support.signature.typing.List',),
+ "QStringListModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
+ "QStringListModel.setStringList": ('List[str]',),
"QStringListModel.sibling": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QStringListModel.sort": ('int', 'PySide2.QtCore.Qt.SortOrder'),
"QStringListModel.stringList": (),
@@ -5650,9 +5654,9 @@ if "PySide2.QtGui" in sys.modules:
"QTabletEvent.globalPos": (),
"QTabletEvent.globalPosF": (),
"QTabletEvent.globalX": (),
- "QTabletEvent.global"+"Y": (),
+ "QTabletEvent.global""Y": (),
"QTabletEvent.hiResGlobalX": (),
- "QTabletEvent.hiResGlobal"+"Y": (),
+ "QTabletEvent.hiResGlobal""Y": (),
"QTabletEvent.pointerType": (),
"QTabletEvent.pos": (),
"QTabletEvent.posF": (),
@@ -5686,7 +5690,6 @@ if "PySide2.QtGui" in sys.modules:
"QTextBlock.layout": (),
"QTextBlock.length": (),
"QTextBlock.lineCount": (),
- "QTextBlock.next": (),
"QTextBlock.position": (),
"QTextBlock.previous": (),
"QTextBlock.revision": (),
@@ -5769,7 +5772,7 @@ if "PySide2.QtGui" in sys.modules:
"QTextCharFormat.setAnchor": ('bool',),
"QTextCharFormat.setAnchorHref": ('str',),
"QTextCharFormat.setAnchorName": ('str',),
- "QTextCharFormat.setAnchorNames": ('PySide2.support.signature.typing.List',),
+ "QTextCharFormat.setAnchorNames": ('List[str]',),
"QTextCharFormat.setFont": [('PySide2.QtGui.QFont',), ('PySide2.QtGui.QFont', 'PySide2.QtGui.QTextCharFormat.FontPropertiesInheritanceBehavior')],
"QTextCharFormat.setFontCapitalization": ('PySide2.QtGui.QFont.Capitalization',),
"QTextCharFormat.setFontFamily": ('str',),
@@ -5867,7 +5870,7 @@ if "PySide2.QtGui" in sys.modules:
# class PySide2.QtGui.QTextDocument:
"QTextDocument.__init__": [('PySide2.QtCore.QObject',), ('str', 'PySide2.QtCore.QObject')],
- "QTextDocument.addResource": ('int', 'PySide2.QtCore.QUrl', 'PySide2.support.signature.typing.Any'),
+ "QTextDocument.addResource": ('int', 'PySide2.QtCore.QUrl', 'Any'),
"QTextDocument.adjustSize": (),
"QTextDocument.allFormats": (),
"QTextDocument.availableRedoSteps": (),
@@ -6002,7 +6005,7 @@ if "PySide2.QtGui" in sys.modules:
"QTextFormat.setLayoutDirection": ('PySide2.QtCore.Qt.LayoutDirection',),
"QTextFormat.setObjectIndex": ('int',),
"QTextFormat.setObjectType": ('int',),
- "QTextFormat.setProperty": [('int', 'PySide2.support.signature.typing.Any'), ('int', 'list')],
+ "QTextFormat.setProperty": [('int', 'Any'), ('int', 'list')],
"QTextFormat.stringProperty": ('int',),
"QTextFormat.swap": ('PySide2.QtGui.QTextFormat',),
"QTextFormat.toBlockFormat": (),
@@ -6480,7 +6483,7 @@ if "PySide2.QtGui" in sys.modules:
"QWheelEvent.globalPos": (),
"QWheelEvent.globalPosF": (),
"QWheelEvent.globalX": (),
- "QWheelEvent.global"+"Y": (),
+ "QWheelEvent.global""Y": (),
"QWheelEvent.inverted": (),
"QWheelEvent.orientation": (),
"QWheelEvent.phase": (),
@@ -6979,7 +6982,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QAction.setAutoRepeat": ('bool',),
"QAction.setCheckable": ('bool',),
"QAction.setChecked": ('bool',),
- "QAction.setData": ('PySide2.support.signature.typing.Any',),
+ "QAction.setData": ('Any',),
"QAction.setDisabled": ('bool',),
"QAction.setEnabled": ('bool',),
"QAction.setFont": ('PySide2.QtGui.QFont',),
@@ -7024,7 +7027,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QActionGroup.setVisible": ('bool',),
# class PySide2.QtWidgets.QApplication:
- "QApplication.__init__": ('PySide2.support.signature.typing.List',),
+ "QApplication.__init__": ('List[str]',),
"QApplication.aboutQt": (),
"QApplication.activeModalWidget": (),
"QApplication.activePopupWidget": (),
@@ -7209,6 +7212,19 @@ if "PySide2.QtWidgets" in sys.modules:
"QColorDialog.standardColor": ('int',),
"QColorDialog.testOption": ('PySide2.QtWidgets.QColorDialog.ColorDialogOption',),
+ # class PySide2.QtWidgets.QColormap:
+ "QColormap.__init__": ('PySide2.QtWidgets.QColormap',),
+ "QColormap.__copy__": (),
+ "QColormap.cleanup": (),
+ "QColormap.colorAt": ('int',),
+ "QColormap.colormap": (),
+ "QColormap.depth": (),
+ "QColormap.initialize": (),
+ "QColormap.instance": ('int',),
+ "QColormap.mode": (),
+ "QColormap.pixel": ('PySide2.QtGui.QColor',),
+ "QColormap.size": (),
+
# class PySide2.QtWidgets.QColumnView:
"QColumnView.__init__": ('PySide2.QtWidgets.QWidget',),
"QColumnView.columnWidths": (),
@@ -7240,8 +7256,8 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QComboBox:
"QComboBox.__init__": ('PySide2.QtWidgets.QWidget',),
- "QComboBox.addItem": [('PySide2.QtGui.QIcon', 'str', 'PySide2.support.signature.typing.Any'), ('str', 'PySide2.support.signature.typing.Any')],
- "QComboBox.addItems": ('PySide2.support.signature.typing.List',),
+ "QComboBox.addItem": [('PySide2.QtGui.QIcon', 'str', 'Any'), ('str', 'Any')],
+ "QComboBox.addItems": ('List[str]',),
"QComboBox.autoCompletion": (),
"QComboBox.autoCompletionCaseSensitivity": (),
"QComboBox.changeEvent": ('PySide2.QtCore.QEvent',),
@@ -7255,7 +7271,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QComboBox.currentText": (),
"QComboBox.duplicatesEnabled": (),
"QComboBox.event": ('PySide2.QtCore.QEvent',),
- "QComboBox.findData": ('PySide2.support.signature.typing.Any', 'int', 'MatchFlags'),
+ "QComboBox.findData": ('Any', 'int', 'MatchFlags'),
"QComboBox.findText": ('str', 'MatchFlags'),
"QComboBox.focusInEvent": ('PySide2.QtGui.QFocusEvent',),
"QComboBox.focusOutEvent": ('PySide2.QtGui.QFocusEvent',),
@@ -7265,9 +7281,9 @@ if "PySide2.QtWidgets" in sys.modules:
"QComboBox.iconSize": (),
"QComboBox.initStyleOption": ('PySide2.QtWidgets.QStyleOptionComboBox',),
"QComboBox.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QComboBox.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
- "QComboBox.insertItem": [('int', 'PySide2.QtGui.QIcon', 'str', 'PySide2.support.signature.typing.Any'), ('int', 'str', 'PySide2.support.signature.typing.Any')],
- "QComboBox.insertItems": ('int', 'PySide2.support.signature.typing.List'),
+ "QComboBox.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
+ "QComboBox.insertItem": [('int', 'PySide2.QtGui.QIcon', 'str', 'Any'), ('int', 'str', 'Any')],
+ "QComboBox.insertItems": ('int', 'List[str]'),
"QComboBox.insertPolicy": (),
"QComboBox.insertSeparator": ('int',),
"QComboBox.isEditable": (),
@@ -7301,7 +7317,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QComboBox.setFrame": ('bool',),
"QComboBox.setIconSize": ('PySide2.QtCore.QSize',),
"QComboBox.setInsertPolicy": ('PySide2.QtWidgets.QComboBox.InsertPolicy',),
- "QComboBox.setItemData": ('int', 'PySide2.support.signature.typing.Any', 'int'),
+ "QComboBox.setItemData": ('int', 'Any', 'int'),
"QComboBox.setItemDelegate": ('PySide2.QtWidgets.QAbstractItemDelegate',),
"QComboBox.setItemIcon": ('int', 'PySide2.QtGui.QIcon'),
"QComboBox.setItemText": ('int', 'str'),
@@ -7352,7 +7368,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QCommonStyle.unpolish": [('PySide2.QtWidgets.QApplication',), ('PySide2.QtWidgets.QWidget',)],
# class PySide2.QtWidgets.QCompleter:
- "QCompleter.__init__": [('PySide2.QtCore.QAbstractItemModel', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'PySide2.QtCore.QObject')],
+ "QCompleter.__init__": [('List[str]', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QAbstractItemModel', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QCompleter.caseSensitivity": (),
"QCompleter.complete": ('PySide2.QtCore.QRect',),
"QCompleter.completionColumn": (),
@@ -7421,7 +7437,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QDateEdit.__init__": [('PySide2.QtCore.QDate', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtWidgets.QWidget',)],
# class PySide2.QtWidgets.QDateTimeEdit:
- "QDateTimeEdit.__init__": [('PySide2.QtCore.QDate', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QDateTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtWidgets.QWidget',), ('PySide2.support.signature.typing.Any', 'type', 'PySide2.QtWidgets.QWidget')],
+ "QDateTimeEdit.__init__": [('Any', 'type', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QDate', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QDateTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtCore.QTime', 'PySide2.QtWidgets.QWidget'), ('PySide2.QtWidgets.QWidget',)],
"QDateTimeEdit.calendarPopup": (),
"QDateTimeEdit.calendarWidget": (),
"QDateTimeEdit.clear": (),
@@ -7562,7 +7578,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QDialogButtonBox.standardButtons": (),
# class PySide2.QtWidgets.QDirModel:
- "QDirModel.__init__": [('PySide2.QtCore.QObject',), ('PySide2.support.signature.typing.List', 'Filters', 'SortFlags', 'PySide2.QtCore.QObject')],
+ "QDirModel.__init__": [('List[str]', 'Filters', 'SortFlags', 'PySide2.QtCore.QObject'), ('PySide2.QtCore.QObject',)],
"QDirModel.columnCount": ('PySide2.QtCore.QModelIndex',),
"QDirModel.data": ('PySide2.QtCore.QModelIndex', 'int'),
"QDirModel.dropMimeData": ('PySide2.QtCore.QMimeData', 'PySide2.QtCore.Qt.DropAction', 'int', 'int', 'PySide2.QtCore.QModelIndex'),
@@ -7579,7 +7595,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QDirModel.isDir": ('PySide2.QtCore.QModelIndex',),
"QDirModel.isReadOnly": (),
"QDirModel.lazyChildCount": (),
- "QDirModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QDirModel.mimeData": ('List[int]',),
"QDirModel.mimeTypes": (),
"QDirModel.mkdir": ('PySide2.QtCore.QModelIndex', 'str'),
"QDirModel.nameFilters": (),
@@ -7589,11 +7605,11 @@ if "PySide2.QtWidgets" in sys.modules:
"QDirModel.resolveSymlinks": (),
"QDirModel.rmdir": ('PySide2.QtCore.QModelIndex',),
"QDirModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QDirModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QDirModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QDirModel.setFilter": ('Filters',),
"QDirModel.setIconProvider": ('PySide2.QtWidgets.QFileIconProvider',),
"QDirModel.setLazyChildCount": ('bool',),
- "QDirModel.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QDirModel.setNameFilters": ('List[str]',),
"QDirModel.setReadOnly": ('bool',),
"QDirModel.setResolveSymlinks": ('bool',),
"QDirModel.setSorting": ('SortFlags',),
@@ -7664,13 +7680,13 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileDialog.fileMode": (),
"QFileDialog.filter": (),
"QFileDialog.getExistingDirectory": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'Options'),
- "QFileDialog.getExistingDirectoryUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'Options', 'PySide2.support.signature.typing.List'),
+ "QFileDialog.getExistingDirectoryUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'Options', 'List[str]'),
"QFileDialog.getOpenFileName": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'str', 'Options'),
"QFileDialog.getOpenFileNames": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'str', 'Options'),
- "QFileDialog.getOpenFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'PySide2.support.signature.typing.List'),
- "QFileDialog.getOpenFileUrls": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'PySide2.support.signature.typing.List'),
+ "QFileDialog.getOpenFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'List[str]'),
+ "QFileDialog.getOpenFileUrls": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'List[str]'),
"QFileDialog.getSaveFileName": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'str', 'Options'),
- "QFileDialog.getSaveFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'PySide2.support.signature.typing.List'),
+ "QFileDialog.getSaveFileUrl": ('PySide2.QtWidgets.QWidget', 'str', 'PySide2.QtCore.QUrl', 'str', 'str', 'Options', 'List[str]'),
"QFileDialog.history": (),
"QFileDialog.iconProvider": (),
"QFileDialog.isNameFilterDetailsVisible": (),
@@ -7700,21 +7716,21 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileDialog.setDirectoryUrl": ('PySide2.QtCore.QUrl',),
"QFileDialog.setFileMode": ('PySide2.QtWidgets.QFileDialog.FileMode',),
"QFileDialog.setFilter": ('Filters',),
- "QFileDialog.setHistory": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setHistory": ('List[str]',),
"QFileDialog.setIconProvider": ('PySide2.QtWidgets.QFileIconProvider',),
"QFileDialog.setItemDelegate": ('PySide2.QtWidgets.QAbstractItemDelegate',),
"QFileDialog.setLabelText": ('PySide2.QtWidgets.QFileDialog.DialogLabel', 'str'),
- "QFileDialog.setMimeTypeFilters": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setMimeTypeFilters": ('List[str]',),
"QFileDialog.setNameFilter": ('str',),
"QFileDialog.setNameFilterDetailsVisible": ('bool',),
- "QFileDialog.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setNameFilters": ('List[str]',),
"QFileDialog.setOption": ('PySide2.QtWidgets.QFileDialog.Option', 'bool'),
"QFileDialog.setOptions": ('Options',),
"QFileDialog.setProxyModel": ('PySide2.QtCore.QAbstractProxyModel',),
"QFileDialog.setReadOnly": ('bool',),
"QFileDialog.setResolveSymlinks": ('bool',),
"QFileDialog.setSidebarUrls": ('list',),
- "QFileDialog.setSupportedSchemes": ('PySide2.support.signature.typing.List',),
+ "QFileDialog.setSupportedSchemes": ('List[str]',),
"QFileDialog.setViewMode": ('PySide2.QtWidgets.QFileDialog.ViewMode',),
"QFileDialog.setVisible": ('bool',),
"QFileDialog.sidebarUrls": (),
@@ -7750,7 +7766,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileSystemModel.isDir": ('PySide2.QtCore.QModelIndex',),
"QFileSystemModel.isReadOnly": (),
"QFileSystemModel.lastModified": ('PySide2.QtCore.QModelIndex',),
- "QFileSystemModel.mimeData": ('PySide2.support.signature.typing.List',),
+ "QFileSystemModel.mimeData": ('List[int]',),
"QFileSystemModel.mimeTypes": (),
"QFileSystemModel.mkdir": ('PySide2.QtCore.QModelIndex', 'str'),
"QFileSystemModel.myComputer": ('int',),
@@ -7763,11 +7779,11 @@ if "PySide2.QtWidgets" in sys.modules:
"QFileSystemModel.rootDirectory": (),
"QFileSystemModel.rootPath": (),
"QFileSystemModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QFileSystemModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QFileSystemModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QFileSystemModel.setFilter": ('Filters',),
"QFileSystemModel.setIconProvider": ('PySide2.QtWidgets.QFileIconProvider',),
"QFileSystemModel.setNameFilterDisables": ('bool',),
- "QFileSystemModel.setNameFilters": ('PySide2.support.signature.typing.List',),
+ "QFileSystemModel.setNameFilters": ('List[str]',),
"QFileSystemModel.setReadOnly": ('bool',),
"QFileSystemModel.setResolveSymlinks": ('bool',),
"QFileSystemModel.setRootPath": ('str',),
@@ -7984,7 +8000,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsEllipseItem.__init__": [('PySide2.QtCore.QRectF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',), ('float', 'float', 'float', 'float', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsEllipseItem.boundingRect": (),
"QGraphicsEllipseItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsEllipseItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsEllipseItem.extension": ('Any',),
"QGraphicsEllipseItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsEllipseItem.opaqueArea": (),
"QGraphicsEllipseItem.paint": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
@@ -8074,7 +8090,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.dropEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
"QGraphicsItem.effectiveOpacity": (),
"QGraphicsItem.ensureVisible": [('PySide2.QtCore.QRectF', 'int', 'int'), ('float', 'float', 'float', 'float', 'int', 'int')],
- "QGraphicsItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsItem.extension": ('Any',),
"QGraphicsItem.filtersChildEvents": (),
"QGraphicsItem.flags": (),
"QGraphicsItem.focusInEvent": ('PySide2.QtGui.QFocusEvent',),
@@ -8111,7 +8127,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.isVisibleTo": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsItem.isWidget": (),
"QGraphicsItem.isWindow": (),
- "QGraphicsItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsItem.itemTransform": ('PySide2.QtWidgets.QGraphicsItem', 'bool'),
"QGraphicsItem.keyPressEvent": ('PySide2.QtGui.QKeyEvent',),
"QGraphicsItem.keyReleaseEvent": ('PySide2.QtGui.QKeyEvent',),
@@ -8165,7 +8181,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.setBoundingRegionGranularity": ('float',),
"QGraphicsItem.setCacheMode": ('PySide2.QtWidgets.QGraphicsItem.CacheMode', 'PySide2.QtCore.QSize'),
"QGraphicsItem.setCursor": ('PySide2.QtGui.QCursor',),
- "QGraphicsItem.setData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsItem.setData": ('int', 'Any'),
"QGraphicsItem.setEnabled": ('bool',),
"QGraphicsItem.setFiltersChildEvents": ('bool',),
"QGraphicsItem.setFlag": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemFlag', 'bool'),
@@ -8195,7 +8211,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsItem.shape": (),
"QGraphicsItem.show": (),
"QGraphicsItem.stackBefore": ('PySide2.QtWidgets.QGraphicsItem',),
- "QGraphicsItem.toGraphicsObject": [],
+ "QGraphicsItem.toGraphicsObject": (),
"QGraphicsItem.toolTip": (),
"QGraphicsItem.topLevelItem": (),
"QGraphicsItem.topLevelWidget": (),
@@ -8312,7 +8328,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsLineItem.__init__": [('PySide2.QtCore.QLineF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',), ('float', 'float', 'float', 'float', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsLineItem.boundingRect": (),
"QGraphicsLineItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsLineItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsLineItem.extension": ('Any',),
"QGraphicsLineItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsLineItem.line": (),
"QGraphicsLineItem.opaqueArea": (),
@@ -8367,7 +8383,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsPathItem.__init__": [('PySide2.QtGui.QPainterPath', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',)],
"QGraphicsPathItem.boundingRect": (),
"QGraphicsPathItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsPathItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsPathItem.extension": ('Any',),
"QGraphicsPathItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsPathItem.opaqueArea": (),
"QGraphicsPathItem.paint": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
@@ -8380,7 +8396,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsPixmapItem.__init__": [('PySide2.QtGui.QPixmap', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',)],
"QGraphicsPixmapItem.boundingRect": (),
"QGraphicsPixmapItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsPixmapItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsPixmapItem.extension": ('Any',),
"QGraphicsPixmapItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsPixmapItem.offset": (),
"QGraphicsPixmapItem.opaqueArea": (),
@@ -8399,7 +8415,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsPolygonItem.__init__": [('PySide2.QtGui.QPolygonF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',)],
"QGraphicsPolygonItem.boundingRect": (),
"QGraphicsPolygonItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsPolygonItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsPolygonItem.extension": ('Any',),
"QGraphicsPolygonItem.fillRule": (),
"QGraphicsPolygonItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsPolygonItem.opaqueArea": (),
@@ -8430,7 +8446,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsProxyWidget.hoverMoveEvent": ('PySide2.QtWidgets.QGraphicsSceneHoverEvent',),
"QGraphicsProxyWidget.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
"QGraphicsProxyWidget.inputMethodQuery": ('PySide2.QtCore.Qt.InputMethodQuery',),
- "QGraphicsProxyWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsProxyWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsProxyWidget.keyPressEvent": ('PySide2.QtGui.QKeyEvent',),
"QGraphicsProxyWidget.keyReleaseEvent": ('PySide2.QtGui.QKeyEvent',),
"QGraphicsProxyWidget.mouseDoubleClickEvent": ('PySide2.QtWidgets.QGraphicsSceneMouseEvent',),
@@ -8454,7 +8470,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsRectItem.__init__": [('PySide2.QtCore.QRectF', 'PySide2.QtWidgets.QGraphicsItem'), ('PySide2.QtWidgets.QGraphicsItem',), ('float', 'float', 'float', 'float', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsRectItem.boundingRect": (),
"QGraphicsRectItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsRectItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsRectItem.extension": ('Any',),
"QGraphicsRectItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsRectItem.opaqueArea": (),
"QGraphicsRectItem.paint": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
@@ -8702,7 +8718,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsSimpleTextItem.__init__": [('PySide2.QtWidgets.QGraphicsItem',), ('str', 'PySide2.QtWidgets.QGraphicsItem')],
"QGraphicsSimpleTextItem.boundingRect": (),
"QGraphicsSimpleTextItem.contains": ('PySide2.QtCore.QPointF',),
- "QGraphicsSimpleTextItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsSimpleTextItem.extension": ('Any',),
"QGraphicsSimpleTextItem.font": (),
"QGraphicsSimpleTextItem.isObscuredBy": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsSimpleTextItem.opaqueArea": (),
@@ -8725,7 +8741,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsTextItem.dragLeaveEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
"QGraphicsTextItem.dragMoveEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
"QGraphicsTextItem.dropEvent": ('PySide2.QtWidgets.QGraphicsSceneDragDropEvent',),
- "QGraphicsTextItem.extension": ('PySide2.support.signature.typing.Any',),
+ "QGraphicsTextItem.extension": ('Any',),
"QGraphicsTextItem.focusInEvent": ('PySide2.QtGui.QFocusEvent',),
"QGraphicsTextItem.focusOutEvent": ('PySide2.QtGui.QFocusEvent',),
"QGraphicsTextItem.font": (),
@@ -8782,7 +8798,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsView.dragMoveEvent": ('PySide2.QtGui.QDragMoveEvent',),
"QGraphicsView.drawBackground": ('PySide2.QtGui.QPainter', 'PySide2.QtCore.QRectF'),
"QGraphicsView.drawForeground": ('PySide2.QtGui.QPainter', 'PySide2.QtCore.QRectF'),
- "QGraphicsView.drawItems": ('PySide2.QtGui.QPainter', 'int', 'PySide2.support.signature.typing.List', 'PySide2.support.signature.typing.List'),
+ "QGraphicsView.drawItems": ('PySide2.QtGui.QPainter', 'int', 'List[PySide2.QtWidgets.QGraphicsItem]', 'List[PySide2.QtWidgets.QStyleOptionGraphicsItem]'),
"QGraphicsView.dropEvent": ('PySide2.QtGui.QDropEvent',),
"QGraphicsView.ensureVisible": [('PySide2.QtCore.QRectF', 'int', 'int'), ('PySide2.QtWidgets.QGraphicsItem', 'int', 'int'), ('float', 'float', 'float', 'float', 'int', 'int')],
"QGraphicsView.event": ('PySide2.QtCore.QEvent',),
@@ -8885,7 +8901,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsWidget.insertAction": ('PySide2.QtWidgets.QAction', 'PySide2.QtWidgets.QAction'),
"QGraphicsWidget.insertActions": ('PySide2.QtWidgets.QAction', 'list'),
"QGraphicsWidget.isActiveWindow": (),
- "QGraphicsWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsWidget.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsWidget.layout": (),
"QGraphicsWidget.layoutDirection": (),
"QGraphicsWidget.moveEvent": ('PySide2.QtWidgets.QGraphicsSceneMoveEvent',),
@@ -8893,7 +8909,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QGraphicsWidget.paintWindowFrame": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionGraphicsItem', 'PySide2.QtWidgets.QWidget'),
"QGraphicsWidget.palette": (),
"QGraphicsWidget.polishEvent": (),
- "QGraphicsWidget.propertyChange": ('str', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsWidget.propertyChange": ('str', 'Any'),
"QGraphicsWidget.rect": (),
"QGraphicsWidget.releaseShortcut": ('int',),
"QGraphicsWidget.removeAction": ('PySide2.QtWidgets.QAction',),
@@ -9109,7 +9125,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QInputDialog.doubleValue": (),
"QInputDialog.getDouble": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'float', 'float', 'float', 'int', 'bool', 'WindowFlags'),
"QInputDialog.getInt": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'int', 'int', 'int', 'int', 'bool', 'WindowFlags'),
- "QInputDialog.getItem": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.support.signature.typing.List', 'int', 'bool', 'bool', 'WindowFlags', 'InputMethodHints'),
+ "QInputDialog.getItem": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'List[str]', 'int', 'bool', 'bool', 'WindowFlags', 'InputMethodHints'),
"QInputDialog.getMultiLineText": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'str', 'bool', 'WindowFlags', 'InputMethodHints'),
"QInputDialog.getText": ('PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.QtWidgets.QLineEdit.EchoMode', 'str', 'bool', 'WindowFlags', 'InputMethodHints'),
"QInputDialog.inputMode": (),
@@ -9124,7 +9140,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QInputDialog.open": [(), ('PySide2.QtCore.QObject', 'str')],
"QInputDialog.setCancelButtonText": ('str',),
"QInputDialog.setComboBoxEditable": ('bool',),
- "QInputDialog.setComboBoxItems": ('PySide2.support.signature.typing.List',),
+ "QInputDialog.setComboBoxItems": ('List[str]',),
"QInputDialog.setDoubleDecimals": ('int',),
"QInputDialog.setDoubleMaximum": ('float',),
"QInputDialog.setDoubleMinimum": ('float',),
@@ -9150,8 +9166,8 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QItemDelegate:
"QItemDelegate.__init__": ('PySide2.QtCore.QObject',),
"QItemDelegate.createEditor": ('PySide2.QtWidgets.QWidget', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
- "QItemDelegate.decoration": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.support.signature.typing.Any'),
- "QItemDelegate.doCheck": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'PySide2.support.signature.typing.Any'),
+ "QItemDelegate.decoration": ('PySide2.QtWidgets.QStyleOptionViewItem', 'Any'),
+ "QItemDelegate.doCheck": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'Any'),
"QItemDelegate.drawBackground": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
"QItemDelegate.drawCheck": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'PySide2.QtCore.Qt.CheckState'),
"QItemDelegate.drawDecoration": ('PySide2.QtGui.QPainter', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QRect', 'PySide2.QtGui.QPixmap'),
@@ -9386,7 +9402,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QLineEdit.initStyleOption": ('PySide2.QtWidgets.QStyleOptionFrame',),
"QLineEdit.inputMask": (),
"QLineEdit.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QLineEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
+ "QLineEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
"QLineEdit.insert": ('str',),
"QLineEdit.isClearButtonEnabled": (),
"QLineEdit.isModified": (),
@@ -9502,7 +9518,7 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QListWidget:
"QListWidget.__init__": ('PySide2.QtWidgets.QWidget',),
"QListWidget.addItem": [('PySide2.QtWidgets.QListWidgetItem',), ('str',)],
- "QListWidget.addItems": ('PySide2.support.signature.typing.List',),
+ "QListWidget.addItems": ('List[str]',),
"QListWidget.clear": (),
"QListWidget.closePersistentEditor": [('PySide2.QtCore.QModelIndex',), ('PySide2.QtWidgets.QListWidgetItem',)],
"QListWidget.count": (),
@@ -9515,7 +9531,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QListWidget.findItems": ('str', 'MatchFlags'),
"QListWidget.indexFromItem": ('PySide2.QtWidgets.QListWidgetItem',),
"QListWidget.insertItem": [('int', 'PySide2.QtWidgets.QListWidgetItem'), ('int', 'str')],
- "QListWidget.insertItems": ('int', 'PySide2.support.signature.typing.List'),
+ "QListWidget.insertItems": ('int', 'List[str]'),
"QListWidget.isItemHidden": ('PySide2.QtWidgets.QListWidgetItem',),
"QListWidget.isItemSelected": ('PySide2.QtWidgets.QListWidgetItem',),
"QListWidget.isSortingEnabled": (),
@@ -9562,7 +9578,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QListWidgetItem.setBackground": ('PySide2.QtGui.QBrush',),
"QListWidgetItem.setBackgroundColor": ('PySide2.QtGui.QColor',),
"QListWidgetItem.setCheckState": ('PySide2.QtCore.Qt.CheckState',),
- "QListWidgetItem.setData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QListWidgetItem.setData": ('int', 'Any'),
"QListWidgetItem.setFlags": ('ItemFlags',),
"QListWidgetItem.setFont": ('PySide2.QtGui.QFont',),
"QListWidgetItem.setForeground": ('PySide2.QtGui.QBrush',),
@@ -9989,7 +10005,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QPlainTextEdit.focusOutEvent": ('PySide2.QtGui.QFocusEvent',),
"QPlainTextEdit.getPaintContext": (),
"QPlainTextEdit.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QPlainTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
+ "QPlainTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
"QPlainTextEdit.insertFromMimeData": ('PySide2.QtCore.QMimeData',),
"QPlainTextEdit.insertPlainText": ('str',),
"QPlainTextEdit.isReadOnly": (),
@@ -10187,7 +10203,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QScrollBar.wheelEvent": ('PySide2.QtGui.QWheelEvent',),
# class PySide2.QtWidgets.QShortcut:
- "QShortcut.__init__": [('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Callable', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtWidgets.QWidget',)],
+ "QShortcut.__init__": [('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'Callable', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtGui.QKeySequence', 'PySide2.QtWidgets.QWidget', 'str', 'str', 'PySide2.QtCore.Qt.ShortcutContext'), ('PySide2.QtWidgets.QWidget',)],
"QShortcut.autoRepeat": (),
"QShortcut.context": (),
"QShortcut.event": ('PySide2.QtCore.QEvent',),
@@ -10544,7 +10560,7 @@ if "PySide2.QtWidgets" in sys.modules:
# class PySide2.QtWidgets.QStyledItemDelegate:
"QStyledItemDelegate.__init__": ('PySide2.QtCore.QObject',),
"QStyledItemDelegate.createEditor": ('PySide2.QtWidgets.QWidget', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
- "QStyledItemDelegate.displayText": ('PySide2.support.signature.typing.Any', 'PySide2.QtCore.QLocale'),
+ "QStyledItemDelegate.displayText": ('Any', 'PySide2.QtCore.QLocale'),
"QStyledItemDelegate.editorEvent": ('PySide2.QtCore.QEvent', 'PySide2.QtCore.QAbstractItemModel', 'PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
"QStyledItemDelegate.eventFilter": ('PySide2.QtCore.QObject', 'PySide2.QtCore.QEvent'),
"QStyledItemDelegate.initStyleOption": ('PySide2.QtWidgets.QStyleOptionViewItem', 'PySide2.QtCore.QModelIndex'),
@@ -10625,7 +10641,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTabBar.setSelectionBehaviorOnRemove": ('PySide2.QtWidgets.QTabBar.SelectionBehavior',),
"QTabBar.setShape": ('PySide2.QtWidgets.QTabBar.Shape',),
"QTabBar.setTabButton": ('int', 'PySide2.QtWidgets.QTabBar.ButtonPosition', 'PySide2.QtWidgets.QWidget'),
- "QTabBar.setTabData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QTabBar.setTabData": ('int', 'Any'),
"QTabBar.setTabEnabled": ('int', 'bool'),
"QTabBar.setTabIcon": ('int', 'PySide2.QtGui.QIcon'),
"QTabBar.setTabText": ('int', 'str'),
@@ -10833,7 +10849,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTableWidget.setCurrentCell": [('int', 'int'), ('int', 'int', 'SelectionFlags')],
"QTableWidget.setCurrentItem": [('PySide2.QtWidgets.QTableWidgetItem',), ('PySide2.QtWidgets.QTableWidgetItem', 'SelectionFlags')],
"QTableWidget.setHorizontalHeaderItem": ('int', 'PySide2.QtWidgets.QTableWidgetItem'),
- "QTableWidget.setHorizontalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QTableWidget.setHorizontalHeaderLabels": ('List[str]',),
"QTableWidget.setItem": ('int', 'int', 'PySide2.QtWidgets.QTableWidgetItem'),
"QTableWidget.setItemPrototype": ('PySide2.QtWidgets.QTableWidgetItem',),
"QTableWidget.setItemSelected": ('PySide2.QtWidgets.QTableWidgetItem', 'bool'),
@@ -10842,7 +10858,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTableWidget.setRowCount": ('int',),
"QTableWidget.setSortingEnabled": ('bool',),
"QTableWidget.setVerticalHeaderItem": ('int', 'PySide2.QtWidgets.QTableWidgetItem'),
- "QTableWidget.setVerticalHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QTableWidget.setVerticalHeaderLabels": ('List[str]',),
"QTableWidget.sortItems": ('int', 'PySide2.QtCore.Qt.SortOrder'),
"QTableWidget.supportedDropActions": (),
"QTableWidget.takeHorizontalHeaderItem": ('int',),
@@ -10871,7 +10887,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTableWidgetItem.setBackground": ('PySide2.QtGui.QBrush',),
"QTableWidgetItem.setBackgroundColor": ('PySide2.QtGui.QColor',),
"QTableWidgetItem.setCheckState": ('PySide2.QtCore.Qt.CheckState',),
- "QTableWidgetItem.setData": ('int', 'PySide2.support.signature.typing.Any'),
+ "QTableWidgetItem.setData": ('int', 'Any'),
"QTableWidgetItem.setFlags": ('ItemFlags',),
"QTableWidgetItem.setFont": ('PySide2.QtGui.QFont',),
"QTableWidgetItem.setForeground": ('PySide2.QtGui.QBrush',),
@@ -10944,7 +10960,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTextBrowser.searchPaths": (),
"QTextBrowser.setOpenExternalLinks": ('bool',),
"QTextBrowser.setOpenLinks": ('bool',),
- "QTextBrowser.setSearchPaths": ('PySide2.support.signature.typing.List',),
+ "QTextBrowser.setSearchPaths": ('List[str]',),
"QTextBrowser.setSource": ('PySide2.QtCore.QUrl',),
"QTextBrowser.source": (),
@@ -10989,7 +11005,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTextEdit.fontUnderline": (),
"QTextEdit.fontWeight": (),
"QTextEdit.inputMethodEvent": ('PySide2.QtGui.QInputMethodEvent',),
- "QTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'PySide2.support.signature.typing.Any')],
+ "QTextEdit.inputMethodQuery": [('PySide2.QtCore.Qt.InputMethodQuery',), ('PySide2.QtCore.Qt.InputMethodQuery', 'Any')],
"QTextEdit.insertFromMimeData": ('PySide2.QtCore.QMimeData',),
"QTextEdit.insertHtml": ('str',),
"QTextEdit.insertPlainText": ('str',),
@@ -11284,7 +11300,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.expandItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.findItems": ('str', 'MatchFlags', 'int'),
"QTreeWidget.headerItem": (),
- "QTreeWidget.indexFromItem": ['PySide2.QtWidgets.QTreeWidgetItem', 'int'],
+ "QTreeWidget.indexFromItem": ('PySide2.QtWidgets.QTreeWidgetItem', 'int'),
"QTreeWidget.indexOfTopLevelItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.insertTopLevelItem": ('int', 'PySide2.QtWidgets.QTreeWidgetItem'),
"QTreeWidget.insertTopLevelItems": ('int', 'list'),
@@ -11310,7 +11326,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.setFirstItemColumnSpanned": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
"QTreeWidget.setHeaderItem": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidget.setHeaderLabel": ('str',),
- "QTreeWidget.setHeaderLabels": ('PySide2.support.signature.typing.List',),
+ "QTreeWidget.setHeaderLabels": ('List[str]',),
"QTreeWidget.setItemExpanded": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
"QTreeWidget.setItemHidden": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
"QTreeWidget.setItemSelected": ('PySide2.QtWidgets.QTreeWidgetItem', 'bool'),
@@ -11326,7 +11342,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidget.visualItemRect": ('PySide2.QtWidgets.QTreeWidgetItem',),
# class PySide2.QtWidgets.QTreeWidgetItem:
- "QTreeWidgetItem.__init__": [('PySide2.QtWidgets.QTreeWidget', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'PySide2.support.signature.typing.List', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem',), ('PySide2.QtWidgets.QTreeWidgetItem', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'PySide2.support.signature.typing.List', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.support.signature.typing.List', 'int'), ('int',)],
+ "QTreeWidgetItem.__init__": [('List[str]', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'List[str]', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidget', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem',), ('PySide2.QtWidgets.QTreeWidgetItem', 'List[str]', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('PySide2.QtWidgets.QTreeWidgetItem', 'int'), ('int',)],
"QTreeWidgetItem.addChild": ('PySide2.QtWidgets.QTreeWidgetItem',),
"QTreeWidgetItem.addChildren": ('list',),
"QTreeWidgetItem.background": ('int',),
@@ -11358,7 +11374,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QTreeWidgetItem.setBackgroundColor": ('int', 'PySide2.QtGui.QColor'),
"QTreeWidgetItem.setCheckState": ('int', 'PySide2.QtCore.Qt.CheckState'),
"QTreeWidgetItem.setChildIndicatorPolicy": ('PySide2.QtWidgets.QTreeWidgetItem.ChildIndicatorPolicy',),
- "QTreeWidgetItem.setData": ('int', 'int', 'PySide2.support.signature.typing.Any'),
+ "QTreeWidgetItem.setData": ('int', 'int', 'Any'),
"QTreeWidgetItem.setDisabled": ('bool',),
"QTreeWidgetItem.setExpanded": ('bool',),
"QTreeWidgetItem.setFirstColumnSpanned": ('bool',),
@@ -11778,7 +11794,6 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizard.field": ('str',),
"QWizard.hasVisitedPage": ('int',),
"QWizard.initializePage": ('int',),
- "QWizard.next": (),
"QWizard.nextId": (),
"QWizard.options": (),
"QWizard.page": ('int',),
@@ -11792,7 +11807,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizard.setButtonLayout": ('list',),
"QWizard.setButtonText": ('PySide2.QtWidgets.QWizard.WizardButton', 'str'),
"QWizard.setDefaultProperty": ('str', 'str', 'str'),
- "QWizard.setField": ('str', 'PySide2.support.signature.typing.Any'),
+ "QWizard.setField": ('str', 'Any'),
"QWizard.setOption": ('PySide2.QtWidgets.QWizard.WizardOption', 'bool'),
"QWizard.setOptions": ('WizardOptions',),
"QWizard.setPage": ('int', 'PySide2.QtWidgets.QWizardPage'),
@@ -11827,7 +11842,7 @@ if "PySide2.QtWidgets" in sys.modules:
"QWizardPage.registerField": ('str', 'PySide2.QtWidgets.QWidget', 'str', 'str'),
"QWizardPage.setButtonText": ('PySide2.QtWidgets.QWizard.WizardButton', 'str'),
"QWizardPage.setCommitPage": ('bool',),
- "QWizardPage.setField": ('str', 'PySide2.support.signature.typing.Any'),
+ "QWizardPage.setField": ('str', 'Any'),
"QWizardPage.setFinalPage": ('bool',),
"QWizardPage.setPixmap": ('PySide2.QtWidgets.QWizard.WizardPixmap', 'PySide2.QtGui.QPixmap'),
"QWizardPage.setSubTitle": ('str',),
@@ -11886,7 +11901,7 @@ if "PySide2.QtPrintSupport" in sys.modules:
"QPrintEngine.newPage": (),
"QPrintEngine.printerState": (),
"QPrintEngine.property": ('PySide2.QtPrintSupport.QPrintEngine.PrintEnginePropertyKey',),
- "QPrintEngine.setProperty": ('PySide2.QtPrintSupport.QPrintEngine.PrintEnginePropertyKey', 'PySide2.support.signature.typing.Any'),
+ "QPrintEngine.setProperty": ('PySide2.QtPrintSupport.QPrintEngine.PrintEnginePropertyKey', 'Any'),
# class PySide2.QtPrintSupport.QPrintPreviewDialog:
"QPrintPreviewDialog.__init__": [('PySide2.QtPrintSupport.QPrinter', 'PySide2.QtWidgets.QWidget', 'WindowFlags'), ('PySide2.QtWidgets.QWidget', 'WindowFlags')],
@@ -12134,7 +12149,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlField.precision": (),
"QSqlField.requiredStatus": (),
"QSqlField.setAutoValue": ('bool',),
- "QSqlField.setDefaultValue": ('PySide2.support.signature.typing.Any',),
+ "QSqlField.setDefaultValue": ('Any',),
"QSqlField.setGenerated": ('bool',),
"QSqlField.setLength": ('int',),
"QSqlField.setName": ('str',),
@@ -12144,7 +12159,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlField.setRequiredStatus": ('PySide2.QtSql.QSqlField.RequiredStatus',),
"QSqlField.setSqlType": ('int',),
"QSqlField.setType": ('type',),
- "QSqlField.setValue": ('PySide2.support.signature.typing.Any',),
+ "QSqlField.setValue": ('Any',),
"QSqlField.type": (),
"QSqlField.typeID": (),
"QSqlField.value": (),
@@ -12163,9 +12178,9 @@ if "PySide2.QtSql" in sys.modules:
# class PySide2.QtSql.QSqlQuery:
"QSqlQuery.__init__": [('PySide2.QtSql.QSqlDatabase',), ('PySide2.QtSql.QSqlQuery',), ('PySide2.QtSql.QSqlResult',), ('str', 'PySide2.QtSql.QSqlDatabase')],
"QSqlQuery.__copy__": (),
- "QSqlQuery.addBindValue": ('PySide2.support.signature.typing.Any', 'ParamType'),
+ "QSqlQuery.addBindValue": ('Any', 'ParamType'),
"QSqlQuery.at": (),
- "QSqlQuery.bindValue": [('int', 'PySide2.support.signature.typing.Any', 'ParamType'), ('str', 'PySide2.support.signature.typing.Any', 'ParamType')],
+ "QSqlQuery.bindValue": [('int', 'Any', 'ParamType'), ('str', 'Any', 'ParamType')],
"QSqlQuery.boundValue": [('int',), ('str',)],
"QSqlQuery.boundValues": (),
"QSqlQuery.clear": (),
@@ -12184,7 +12199,6 @@ if "PySide2.QtSql" in sys.modules:
"QSqlQuery.lastError": (),
"QSqlQuery.lastInsertId": (),
"QSqlQuery.lastQuery": (),
- "QSqlQuery.next": (),
"QSqlQuery.nextResult": (),
"QSqlQuery.numRowsAffected": (),
"QSqlQuery.numericalPrecisionPolicy": (),
@@ -12224,7 +12238,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlQueryModel.record": [(), ('int',)],
"QSqlQueryModel.removeColumns": ('int', 'int', 'PySide2.QtCore.QModelIndex'),
"QSqlQueryModel.rowCount": ('PySide2.QtCore.QModelIndex',),
- "QSqlQueryModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSqlQueryModel.setHeaderData": ('int', 'PySide2.QtCore.Qt.Orientation', 'Any', 'int'),
"QSqlQueryModel.setLastError": ('PySide2.QtSql.QSqlError',),
"QSqlQueryModel.setQuery": [('PySide2.QtSql.QSqlQuery',), ('str', 'PySide2.QtSql.QSqlDatabase')],
@@ -12248,7 +12262,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlRecord.replace": ('int', 'PySide2.QtSql.QSqlField'),
"QSqlRecord.setGenerated": [('int', 'bool'), ('str', 'bool')],
"QSqlRecord.setNull": [('int',), ('str',)],
- "QSqlRecord.setValue": [('int', 'PySide2.support.signature.typing.Any'), ('str', 'PySide2.support.signature.typing.Any')],
+ "QSqlRecord.setValue": [('int', 'Any'), ('str', 'Any')],
"QSqlRecord.value": [('int',), ('str',)],
# class PySide2.QtSql.QSqlRelation:
@@ -12277,7 +12291,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlRelationalTableModel.revertRow": ('int',),
"QSqlRelationalTableModel.select": (),
"QSqlRelationalTableModel.selectStatement": (),
- "QSqlRelationalTableModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSqlRelationalTableModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QSqlRelationalTableModel.setJoinMode": ('PySide2.QtSql.QSqlRelationalTableModel.JoinMode',),
"QSqlRelationalTableModel.setRelation": ('int', 'PySide2.QtSql.QSqlRelation'),
"QSqlRelationalTableModel.setTable": ('str',),
@@ -12285,9 +12299,9 @@ if "PySide2.QtSql" in sys.modules:
# class PySide2.QtSql.QSqlResult:
"QSqlResult.__init__": ('PySide2.QtSql.QSqlDriver',),
- "QSqlResult.addBindValue": ('PySide2.support.signature.typing.Any', 'ParamType'),
+ "QSqlResult.addBindValue": ('Any', 'ParamType'),
"QSqlResult.at": (),
- "QSqlResult.bindValue": [('int', 'PySide2.support.signature.typing.Any', 'ParamType'), ('str', 'PySide2.support.signature.typing.Any', 'ParamType')],
+ "QSqlResult.bindValue": [('int', 'Any', 'ParamType'), ('str', 'Any', 'ParamType')],
"QSqlResult.bindValueType": [('int',), ('str',)],
"QSqlResult.bindingSyntax": (),
"QSqlResult.boundValue": [('int',), ('str',)],
@@ -12362,7 +12376,7 @@ if "PySide2.QtSql" in sys.modules:
"QSqlTableModel.select": (),
"QSqlTableModel.selectRow": ('int',),
"QSqlTableModel.selectStatement": (),
- "QSqlTableModel.setData": ('PySide2.QtCore.QModelIndex', 'PySide2.support.signature.typing.Any', 'int'),
+ "QSqlTableModel.setData": ('PySide2.QtCore.QModelIndex', 'Any', 'int'),
"QSqlTableModel.setEditStrategy": ('PySide2.QtSql.QSqlTableModel.EditStrategy',),
"QSqlTableModel.setFilter": ('str',),
"QSqlTableModel.setPrimaryKey": ('PySide2.QtSql.QSqlIndex',),
@@ -12427,7 +12441,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QAbstractSocket.setReadBufferSize": ('int',),
"QAbstractSocket.setSocketDescriptor": ('int', 'PySide2.QtNetwork.QAbstractSocket.SocketState', 'OpenMode'),
"QAbstractSocket.setSocketError": ('PySide2.QtNetwork.QAbstractSocket.SocketError',),
- "QAbstractSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'PySide2.support.signature.typing.Any'),
+ "QAbstractSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'Any'),
"QAbstractSocket.setSocketState": ('PySide2.QtNetwork.QAbstractSocket.SocketState',),
"QAbstractSocket.socketDescriptor": (),
"QAbstractSocket.socketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption',),
@@ -12447,7 +12461,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QAuthenticator.options": (),
"QAuthenticator.password": (),
"QAuthenticator.realm": (),
- "QAuthenticator.setOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QAuthenticator.setOption": ('str', 'Any'),
"QAuthenticator.setPassword": ('str',),
"QAuthenticator.setRealm": ('str',),
"QAuthenticator.setUser": ('str',),
@@ -12458,7 +12472,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QHostAddress.__copy__": (),
"QHostAddress.clear": (),
"QHostAddress.isEqual": ('PySide2.QtNetwork.QHostAddress', 'ConversionMode'),
- "QHostAddress.isInSubnet": [('PySide2.QtNetwork.QHostAddress', 'int'), ('PySide2.support.signature.typing.Tuple',)],
+ "QHostAddress.isInSubnet": [('PySide2.QtNetwork.QHostAddress', 'int'), ('Tuple[Any, Any]',)],
"QHostAddress.isLoopback": (),
"QHostAddress.isMulticast": (),
"QHostAddress.isNull": (),
@@ -12716,7 +12730,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkProxy.rawHeaderList": (),
"QNetworkProxy.setApplicationProxy": ('PySide2.QtNetwork.QNetworkProxy',),
"QNetworkProxy.setCapabilities": ('Capabilities',),
- "QNetworkProxy.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'PySide2.support.signature.typing.Any'),
+ "QNetworkProxy.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'Any'),
"QNetworkProxy.setHostName": ('str',),
"QNetworkProxy.setPassword": ('str',),
"QNetworkProxy.setPort": ('int',),
@@ -12773,10 +12787,10 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkReply.rawHeaderList": (),
"QNetworkReply.readBufferSize": (),
"QNetworkReply.request": (),
- "QNetworkReply.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'PySide2.support.signature.typing.Any'),
+ "QNetworkReply.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'Any'),
"QNetworkReply.setError": ('PySide2.QtNetwork.QNetworkReply.NetworkError', 'str'),
"QNetworkReply.setFinished": ('bool',),
- "QNetworkReply.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'PySide2.support.signature.typing.Any'),
+ "QNetworkReply.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'Any'),
"QNetworkReply.setOperation": ('PySide2.QtNetwork.QNetworkAccessManager.Operation',),
"QNetworkReply.setRawHeader": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QByteArray'),
"QNetworkReply.setReadBufferSize": ('int',),
@@ -12792,7 +12806,7 @@ if "PySide2.QtNetwork" in sys.modules:
# class PySide2.QtNetwork.QNetworkRequest:
"QNetworkRequest.__init__": [('PySide2.QtCore.QUrl',), ('PySide2.QtNetwork.QNetworkRequest',)],
"QNetworkRequest.__copy__": (),
- "QNetworkRequest.attribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'PySide2.support.signature.typing.Any'),
+ "QNetworkRequest.attribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'Any'),
"QNetworkRequest.hasRawHeader": ('PySide2.QtCore.QByteArray',),
"QNetworkRequest.header": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders',),
"QNetworkRequest.maximumRedirectsAllowed": (),
@@ -12800,8 +12814,8 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkRequest.priority": (),
"QNetworkRequest.rawHeader": ('PySide2.QtCore.QByteArray',),
"QNetworkRequest.rawHeaderList": (),
- "QNetworkRequest.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'PySide2.support.signature.typing.Any'),
- "QNetworkRequest.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'PySide2.support.signature.typing.Any'),
+ "QNetworkRequest.setAttribute": ('PySide2.QtNetwork.QNetworkRequest.Attribute', 'Any'),
+ "QNetworkRequest.setHeader": ('PySide2.QtNetwork.QNetworkRequest.KnownHeaders', 'Any'),
"QNetworkRequest.setMaximumRedirectsAllowed": ('int',),
"QNetworkRequest.setOriginatingObject": ('PySide2.QtCore.QObject',),
"QNetworkRequest.setPriority": ('PySide2.QtNetwork.QNetworkRequest.Priority',),
@@ -12830,7 +12844,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QNetworkSession.open": (),
"QNetworkSession.reject": (),
"QNetworkSession.sessionProperty": ('str',),
- "QNetworkSession.setSessionProperty": ('str', 'PySide2.support.signature.typing.Any'),
+ "QNetworkSession.setSessionProperty": ('str', 'Any'),
"QNetworkSession.state": (),
"QNetworkSession.stop": (),
"QNetworkSession.usagePolicies": (),
@@ -12995,7 +13009,7 @@ if "PySide2.QtNetwork" in sys.modules:
"QSslSocket.setProtocol": ('PySide2.QtNetwork.QSsl.SslProtocol',),
"QSslSocket.setReadBufferSize": ('int',),
"QSslSocket.setSocketDescriptor": ('int', 'PySide2.QtNetwork.QAbstractSocket.SocketState', 'OpenMode'),
- "QSslSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'PySide2.support.signature.typing.Any'),
+ "QSslSocket.setSocketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption', 'Any'),
"QSslSocket.setSslConfiguration": ('PySide2.QtNetwork.QSslConfiguration',),
"QSslSocket.socketOption": ('PySide2.QtNetwork.QAbstractSocket.SocketOption',),
"QSslSocket.sslConfiguration": (),
@@ -13059,7 +13073,7 @@ if "PySide2.QtTest" in sys.modules:
# class PySide2.QtTest.QTest:
"QTest.addColumnInternal": ('int', 'str'),
- "QTest.asciiToKey": ('PySide2.support.signature.typing.Union[str, int]',),
+ "QTest.asciiToKey": ('Union[str, int]',),
"QTest.compare_string_helper": ('str', 'str', 'str', 'str', 'str', 'int'),
"QTest.createTouchDevice": ('PySide2.QtGui.QTouchDevice.DeviceType',),
"QTest.currentAppName": (),
@@ -13067,11 +13081,11 @@ if "PySide2.QtTest" in sys.modules:
"QTest.currentTestFailed": (),
"QTest.currentTestFunction": (),
"QTest.ignoreMessage": [('PySide2.QtCore.QtMsgType', 'PySide2.QtCore.QRegularExpression'), ('PySide2.QtCore.QtMsgType', 'str')],
- "QTest.keyClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
"QTest.keyClicks": ('PySide2.QtWidgets.QWidget', 'str', 'KeyboardModifiers', 'int'),
- "QTest.keyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
- "QTest.keyPress": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
- "QTest.keyRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyPress": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
+ "QTest.keyRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtGui.QWindow', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'KeyboardModifiers', 'int'), ('PySide2.QtWidgets.QWidget', 'Union[str, int]', 'KeyboardModifiers', 'int')],
"QTest.keyToAscii": ('PySide2.QtCore.Qt.Key',),
"QTest.mouseClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
"QTest.mouseDClick": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
@@ -13081,12 +13095,12 @@ if "PySide2.QtTest" in sys.modules:
"QTest.mouseRelease": [('PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int'), ('PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.MouseButton', 'KeyboardModifiers', 'PySide2.QtCore.QPoint', 'int')],
"QTest.qElementData": ('str', 'int'),
"QTest.qExpectFail": ('str', 'str', 'PySide2.QtTest.QTest.TestFailMode', 'str', 'int'),
- "QTest.qFindTestData": ['int', 'str', 'str', 'str'],
+ "QTest.qFindTestData": ('str', 'str', 'int', 'str'),
"QTest.qGlobalData": ('str', 'int'),
"QTest.qSkip": ('str', 'str', 'int'),
"QTest.qWaitForWindowActive": ('PySide2.QtWidgets.QWidget', 'int'),
"QTest.qWaitForWindowExposed": ('PySide2.QtWidgets.QWidget', 'int'),
- "QTest.sendKeyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'PySide2.support.signature.typing.Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int')],
+ "QTest.sendKeyEvent": [('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtGui.QWindow', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'Union[str, int]', 'KeyboardModifiers', 'int'), ('PySide2.QtTest.QTest.KeyAction', 'PySide2.QtWidgets.QWidget', 'PySide2.QtCore.Qt.Key', 'str', 'KeyboardModifiers', 'int')],
"QTest.setBenchmarkResult": ('float', 'PySide2.QtTest.QTest.QBenchmarkMetric'),
"QTest.setMainSourcePath": ('str', 'str'),
"QTest.simulateEvent": [('PySide2.QtGui.QWindow', 'bool', 'int', 'KeyboardModifiers', 'str', 'bool', 'int'), ('PySide2.QtWidgets.QWidget', 'bool', 'int', 'KeyboardModifiers', 'str', 'bool', 'int')],
@@ -13134,7 +13148,7 @@ if "PySide2.QtWinExtras" in sys.modules:
"QWinJumpListCategory.__init__": ('str',),
"QWinJumpListCategory.addDestination": ('str',),
"QWinJumpListCategory.addItem": ('PySide2.QtWinExtras.QWinJumpListItem',),
- "QWinJumpListCategory.addLink": [('PySide2.QtGui.QIcon', 'str', 'str', 'PySide2.support.signature.typing.List'), ('str', 'str', 'PySide2.support.signature.typing.List')],
+ "QWinJumpListCategory.addLink": [('PySide2.QtGui.QIcon', 'str', 'str', 'List[str]'), ('str', 'str', 'List[str]')],
"QWinJumpListCategory.addSeparator": (),
"QWinJumpListCategory.clear": (),
"QWinJumpListCategory.count": (),
@@ -13152,7 +13166,7 @@ if "PySide2.QtWinExtras" in sys.modules:
"QWinJumpListItem.description": (),
"QWinJumpListItem.filePath": (),
"QWinJumpListItem.icon": (),
- "QWinJumpListItem.setArguments": ('PySide2.support.signature.typing.List',),
+ "QWinJumpListItem.setArguments": ('List[str]',),
"QWinJumpListItem.setDescription": ('str',),
"QWinJumpListItem.setFilePath": ('str',),
"QWinJumpListItem.setIcon": ('PySide2.QtGui.QIcon',),
@@ -13561,7 +13575,6 @@ if "PySide2.QtXml" in sys.modules:
"QXmlInputSource.data": (),
"QXmlInputSource.fetchData": (),
"QXmlInputSource.fromRawData": ('PySide2.QtCore.QByteArray', 'bool'),
- "QXmlInputSource.next": (),
"QXmlInputSource.reset": (),
"QXmlInputSource.setData": [('PySide2.QtCore.QByteArray',), ('str',)],
@@ -13612,7 +13625,7 @@ if "PySide2.QtXml" in sys.modules:
"QXmlReader.hasFeature": ('str',),
"QXmlReader.hasProperty": ('str',),
"QXmlReader.lexicalHandler": (),
- "QXmlReader.parse": ['PySide2.QtXml.QXmlInputSource'],
+ "QXmlReader.parse": ('PySide2.QtXml.QXmlInputSource',),
"QXmlReader.property": ('str', 'bool'),
"QXmlReader.setContentHandler": ('PySide2.QtXml.QXmlContentHandler',),
"QXmlReader.setDTDHandler": ('PySide2.QtXml.QXmlDTDHandler',),
@@ -13683,7 +13696,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
# class PySide2.QtXmlPatterns.QAbstractXmlReceiver:
"QAbstractXmlReceiver.__init__": (),
- "QAbstractXmlReceiver.atomicValue": ('PySide2.support.signature.typing.Any',),
+ "QAbstractXmlReceiver.atomicValue": ('Any',),
"QAbstractXmlReceiver.attribute": ('PySide2.QtXmlPatterns.QXmlName', 'str'),
"QAbstractXmlReceiver.characters": ('str',),
"QAbstractXmlReceiver.comment": ('str',),
@@ -13710,7 +13723,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
# class PySide2.QtXmlPatterns.QXmlFormatter:
"QXmlFormatter.__init__": ('PySide2.QtXmlPatterns.QXmlQuery', 'PySide2.QtCore.QIODevice'),
- "QXmlFormatter.atomicValue": ('PySide2.support.signature.typing.Any',),
+ "QXmlFormatter.atomicValue": ('Any',),
"QXmlFormatter.attribute": ('PySide2.QtXmlPatterns.QXmlName', 'str'),
"QXmlFormatter.characters": ('str',),
"QXmlFormatter.comment": ('str',),
@@ -13725,7 +13738,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
"QXmlFormatter.startOfSequence": (),
# class PySide2.QtXmlPatterns.QXmlItem:
- "QXmlItem.__init__": [(), ('PySide2.QtXmlPatterns.QXmlItem',), ('PySide2.QtXmlPatterns.QXmlNodeModelIndex',), ('PySide2.support.signature.typing.Any',)],
+ "QXmlItem.__init__": [(), ('Any',), ('PySide2.QtXmlPatterns.QXmlItem',), ('PySide2.QtXmlPatterns.QXmlNodeModelIndex',)],
"QXmlItem.__copy__": (),
"QXmlItem.isAtomicValue": (),
"QXmlItem.isNode": (),
@@ -13778,7 +13791,6 @@ if "PySide2.QtXmlPatterns" in sys.modules:
"QXmlResultItems.__init__": (),
"QXmlResultItems.current": (),
"QXmlResultItems.hasError": (),
- "QXmlResultItems.next": (),
# class PySide2.QtXmlPatterns.QXmlSchema:
"QXmlSchema.__init__": [(), ('PySide2.QtXmlPatterns.QXmlSchema',)],
@@ -13804,7 +13816,7 @@ if "PySide2.QtXmlPatterns" in sys.modules:
# class PySide2.QtXmlPatterns.QXmlSerializer:
"QXmlSerializer.__init__": ('PySide2.QtXmlPatterns.QXmlQuery', 'PySide2.QtCore.QIODevice'),
- "QXmlSerializer.atomicValue": ('PySide2.support.signature.typing.Any',),
+ "QXmlSerializer.atomicValue": ('Any',),
"QXmlSerializer.attribute": ('PySide2.QtXmlPatterns.QXmlName', 'str'),
"QXmlSerializer.characters": ('str',),
"QXmlSerializer.codec": (),
@@ -13858,17 +13870,17 @@ if "PySide2.QtHelp" in sys.modules:
# class PySide2.QtHelp.QHelpEngineCore:
"QHelpEngineCore.__init__": ('str', 'PySide2.QtCore.QObject'),
- "QHelpEngineCore.addCustomFilter": ('str', 'PySide2.support.signature.typing.List'),
+ "QHelpEngineCore.addCustomFilter": ('str', 'List[str]'),
"QHelpEngineCore.autoSaveFilter": (),
"QHelpEngineCore.collectionFile": (),
"QHelpEngineCore.copyCollectionFile": ('str',),
"QHelpEngineCore.currentFilter": (),
"QHelpEngineCore.customFilters": (),
- "QHelpEngineCore.customValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QHelpEngineCore.customValue": ('str', 'Any'),
"QHelpEngineCore.documentationFileName": ('str',),
"QHelpEngineCore.error": (),
"QHelpEngineCore.fileData": ('PySide2.QtCore.QUrl',),
- "QHelpEngineCore.files": ('str', 'PySide2.support.signature.typing.List', 'str'),
+ "QHelpEngineCore.files": ('str', 'List[str]', 'str'),
"QHelpEngineCore.filterAttributeSets": ('str',),
"QHelpEngineCore.filterAttributes": [(), ('str',)],
"QHelpEngineCore.findFile": ('PySide2.QtCore.QUrl',),
@@ -13883,7 +13895,7 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpEngineCore.setAutoSaveFilter": ('bool',),
"QHelpEngineCore.setCollectionFile": ('str',),
"QHelpEngineCore.setCurrentFilter": ('str',),
- "QHelpEngineCore.setCustomValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QHelpEngineCore.setCustomValue": ('str', 'Any'),
"QHelpEngineCore.setupData": (),
"QHelpEngineCore.unregisterDocumentation": ('str',),
@@ -13911,9 +13923,10 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpSearchEngine.search": [('list',), ('str',)],
"QHelpSearchEngine.searchInput": (),
"QHelpSearchEngine.searchResultCount": (),
+ "QHelpSearchEngine.searchResults": ('int', 'int'),
# class PySide2.QtHelp.QHelpSearchQuery:
- "QHelpSearchQuery.__init__": [(), ('PySide2.QtHelp.QHelpSearchQuery',), ('PySide2.QtHelp.QHelpSearchQuery.FieldName', 'PySide2.support.signature.typing.List')],
+ "QHelpSearchQuery.__init__": [(), ('PySide2.QtHelp.QHelpSearchQuery',), ('PySide2.QtHelp.QHelpSearchQuery.FieldName', 'List[str]')],
"QHelpSearchQuery.__copy__": (),
# class PySide2.QtHelp.QHelpSearchQueryWidget:
@@ -13929,6 +13942,12 @@ if "PySide2.QtHelp" in sys.modules:
"QHelpSearchQueryWidget.setQuery": ('list',),
"QHelpSearchQueryWidget.setSearchInput": ('str',),
+ # class PySide2.QtHelp.QHelpSearchResult:
+ "QHelpSearchResult.__init__": [(), ('PySide2.QtCore.QUrl', 'str', 'str'), ('PySide2.QtHelp.QHelpSearchResult',)],
+ "QHelpSearchResult.snippet": (),
+ "QHelpSearchResult.title": (),
+ "QHelpSearchResult.url": (),
+
# class PySide2.QtHelp.QHelpSearchResultWidget:
"QHelpSearchResultWidget.changeEvent": ('PySide2.QtCore.QEvent',),
"QHelpSearchResultWidget.linkAt": ('PySide2.QtCore.QPoint',),
@@ -14033,7 +14052,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioBuffer.__copy__": (),
"QAudioBuffer.byteCount": (),
"QAudioBuffer.constData": (),
- "QAudioBuffer.data": [],
+ "QAudioBuffer.data": (),
"QAudioBuffer.duration": (),
"QAudioBuffer.format": (),
"QAudioBuffer.frameCount": (),
@@ -14048,7 +14067,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioDecoder.bufferAvailable": (),
"QAudioDecoder.duration": (),
"QAudioDecoder.errorString": (),
- "QAudioDecoder.hasSupport": ('str', 'PySide2.support.signature.typing.List'),
+ "QAudioDecoder.hasSupport": ('str', 'List[str]'),
"QAudioDecoder.position": (),
"QAudioDecoder.read": (),
"QAudioDecoder.setAudioFormat": ('PySide2.QtMultimedia.QAudioFormat',),
@@ -14111,7 +14130,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QAudioEncoderSettings.setChannelCount": ('int',),
"QAudioEncoderSettings.setCodec": ('str',),
"QAudioEncoderSettings.setEncodingMode": ('PySide2.QtMultimedia.QMultimedia.EncodingMode',),
- "QAudioEncoderSettings.setEncodingOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QAudioEncoderSettings.setEncodingOption": ('str', 'Any'),
"QAudioEncoderSettings.setEncodingOptions": ('dict',),
"QAudioEncoderSettings.setQuality": ('PySide2.QtMultimedia.QMultimedia.EncodingQuality',),
"QAudioEncoderSettings.setSampleRate": ('int',),
@@ -14281,7 +14300,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QCameraExposureControl.actualValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter',),
"QCameraExposureControl.isParameterSupported": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter',),
"QCameraExposureControl.requestedValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter',),
- "QCameraExposureControl.setValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraExposureControl.setValue": ('PySide2.QtMultimedia.QCameraExposureControl.ExposureParameter', 'Any'),
# class PySide2.QtMultimedia.QCameraFocusZone:
"QCameraFocusZone.__init__": [(), ('PySide2.QtCore.QRectF', 'PySide2.QtMultimedia.QCameraFocusZone.FocusZoneStatus'), ('PySide2.QtMultimedia.QCameraFocusZone',)],
@@ -14323,9 +14342,9 @@ if "PySide2.QtMultimedia" in sys.modules:
# class PySide2.QtMultimedia.QCameraImageProcessingControl:
"QCameraImageProcessingControl.__init__": ('PySide2.QtCore.QObject',),
"QCameraImageProcessingControl.isParameterSupported": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter',),
- "QCameraImageProcessingControl.isParameterValueSupported": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraImageProcessingControl.isParameterValueSupported": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'Any'),
"QCameraImageProcessingControl.parameter": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter',),
- "QCameraImageProcessingControl.setParameter": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraImageProcessingControl.setParameter": ('PySide2.QtMultimedia.QCameraImageProcessingControl.ProcessingParameter', 'Any'),
# class PySide2.QtMultimedia.QCameraInfo:
"QCameraInfo.__init__": [('PySide2.QtCore.QByteArray',), ('PySide2.QtMultimedia.QCamera',), ('PySide2.QtMultimedia.QCameraInfo',)],
@@ -14369,7 +14388,7 @@ if "PySide2.QtMultimedia" in sys.modules:
# class PySide2.QtMultimedia.QCameraViewfinderSettingsControl:
"QCameraViewfinderSettingsControl.__init__": ('PySide2.QtCore.QObject',),
"QCameraViewfinderSettingsControl.isViewfinderParameterSupported": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter',),
- "QCameraViewfinderSettingsControl.setViewfinderParameter": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter', 'PySide2.support.signature.typing.Any'),
+ "QCameraViewfinderSettingsControl.setViewfinderParameter": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter', 'Any'),
"QCameraViewfinderSettingsControl.viewfinderParameter": ('PySide2.QtMultimedia.QCameraViewfinderSettingsControl.ViewfinderParameter',),
# class PySide2.QtMultimedia.QCameraViewfinderSettingsControl2:
@@ -14405,7 +14424,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QImageEncoderSettings.quality": (),
"QImageEncoderSettings.resolution": (),
"QImageEncoderSettings.setCodec": ('str',),
- "QImageEncoderSettings.setEncodingOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QImageEncoderSettings.setEncodingOption": ('str', 'Any'),
"QImageEncoderSettings.setEncodingOptions": ('dict',),
"QImageEncoderSettings.setQuality": ('PySide2.QtMultimedia.QMultimedia.EncodingQuality',),
"QImageEncoderSettings.setResolution": [('PySide2.QtCore.QSize',), ('int', 'int')],
@@ -14478,7 +14497,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaPlayer.currentNetworkConfiguration": (),
"QMediaPlayer.duration": (),
"QMediaPlayer.errorString": (),
- "QMediaPlayer.hasSupport": ('str', 'PySide2.support.signature.typing.List', 'Flags'),
+ "QMediaPlayer.hasSupport": ('str', 'List[str]', 'Flags'),
"QMediaPlayer.isAudioAvailable": (),
"QMediaPlayer.isMuted": (),
"QMediaPlayer.isSeekable": (),
@@ -14548,7 +14567,6 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaPlaylist.mediaCount": (),
"QMediaPlaylist.mediaObject": (),
"QMediaPlaylist.moveMedia": ('int', 'int'),
- "QMediaPlaylist.next": (),
"QMediaPlaylist.nextIndex": ('int',),
"QMediaPlaylist.playbackMode": (),
"QMediaPlaylist.previous": (),
@@ -14584,7 +14602,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QMediaRecorder.setContainerFormat": ('str',),
"QMediaRecorder.setEncodingSettings": ('PySide2.QtMultimedia.QAudioEncoderSettings', 'PySide2.QtMultimedia.QVideoEncoderSettings', 'str'),
"QMediaRecorder.setMediaObject": ('PySide2.QtMultimedia.QMediaObject',),
- "QMediaRecorder.setMetaData": ('str', 'PySide2.support.signature.typing.Any'),
+ "QMediaRecorder.setMetaData": ('str', 'Any'),
"QMediaRecorder.setMuted": ('bool',),
"QMediaRecorder.setOutputLocation": ('PySide2.QtCore.QUrl',),
"QMediaRecorder.setVideoSettings": ('PySide2.QtMultimedia.QVideoEncoderSettings',),
@@ -14792,7 +14810,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoEncoderSettings.setBitRate": ('int',),
"QVideoEncoderSettings.setCodec": ('str',),
"QVideoEncoderSettings.setEncodingMode": ('PySide2.QtMultimedia.QMultimedia.EncodingMode',),
- "QVideoEncoderSettings.setEncodingOption": ('str', 'PySide2.support.signature.typing.Any'),
+ "QVideoEncoderSettings.setEncodingOption": ('str', 'Any'),
"QVideoEncoderSettings.setEncodingOptions": ('dict',),
"QVideoEncoderSettings.setFrameRate": ('float',),
"QVideoEncoderSettings.setQuality": ('PySide2.QtMultimedia.QMultimedia.EncodingQuality',),
@@ -14813,7 +14831,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoFrame.__init__": [(), ('PySide2.QtGui.QImage',), ('PySide2.QtMultimedia.QAbstractVideoBuffer', 'PySide2.QtCore.QSize', 'PySide2.QtMultimedia.QVideoFrame.PixelFormat'), ('PySide2.QtMultimedia.QVideoFrame',), ('int', 'PySide2.QtCore.QSize', 'int', 'PySide2.QtMultimedia.QVideoFrame.PixelFormat')],
"QVideoFrame.__copy__": (),
"QVideoFrame.availableMetaData": (),
- "QVideoFrame.bits": [],
+ "QVideoFrame.bits": (),
"QVideoFrame.bytesPerLine": [(), ('int',)],
"QVideoFrame.endTime": (),
"QVideoFrame.fieldType": (),
@@ -14834,7 +14852,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoFrame.planeCount": (),
"QVideoFrame.setEndTime": ('int',),
"QVideoFrame.setFieldType": ('PySide2.QtMultimedia.QVideoFrame.FieldType',),
- "QVideoFrame.setMetaData": ('str', 'PySide2.support.signature.typing.Any'),
+ "QVideoFrame.setMetaData": ('str', 'Any'),
"QVideoFrame.setStartTime": ('int',),
"QVideoFrame.size": (),
"QVideoFrame.startTime": (),
@@ -14868,7 +14886,7 @@ if "PySide2.QtMultimedia" in sys.modules:
"QVideoSurfaceFormat.setFrameRate": ('float',),
"QVideoSurfaceFormat.setFrameSize": [('PySide2.QtCore.QSize',), ('int', 'int')],
"QVideoSurfaceFormat.setPixelAspectRatio": [('PySide2.QtCore.QSize',), ('int', 'int')],
- "QVideoSurfaceFormat.setProperty": ('str', 'PySide2.support.signature.typing.Any'),
+ "QVideoSurfaceFormat.setProperty": ('str', 'Any'),
"QVideoSurfaceFormat.setScanLineDirection": ('PySide2.QtMultimedia.QVideoSurfaceFormat.Direction',),
"QVideoSurfaceFormat.setViewport": ('PySide2.QtCore.QRect',),
"QVideoSurfaceFormat.setYCbCrColorSpace": ('PySide2.QtMultimedia.QVideoSurfaceFormat.YCbCrColorSpace',),
@@ -14911,7 +14929,7 @@ if "PySide2.QtMultimediaWidgets" in sys.modules:
"QGraphicsVideoItem.__init__": ('PySide2.QtWidgets.QGraphicsItem',),
"QGraphicsVideoItem.aspectRatioMode": (),
"QGraphicsVideoItem.boundingRect": (),
- "QGraphicsVideoItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'PySide2.support.signature.typing.Any'),
+ "QGraphicsVideoItem.itemChange": ('PySide2.QtWidgets.QGraphicsItem.GraphicsItemChange', 'Any'),
"QGraphicsVideoItem.mediaObject": (),
"QGraphicsVideoItem.nativeSize": (),
"QGraphicsVideoItem.offset": (),
@@ -15268,7 +15286,7 @@ if "PySide2.QtQml" in sys.modules:
"QJSEngine.newObject": (),
"QJSEngine.newQMetaObject": ('PySide2.QtCore.QMetaObject',),
"QJSEngine.newQObject": ('PySide2.QtCore.QObject',),
- "QJSEngine.toScriptValue": ('PySide2.support.signature.typing.Any',),
+ "QJSEngine.toScriptValue": ('Any',),
# class PySide2.QtQml.QJSValue:
"QJSValue.__init__": [('PySide2.QtQml.QJSValue',), ('PySide2.QtQml.QJSValue.SpecialValue',), ('bool',), ('float',), ('int',), ('str',)],
@@ -15314,7 +15332,6 @@ if "PySide2.QtQml" in sys.modules:
"QJSValueIterator.__init__": ('PySide2.QtQml.QJSValue',),
"QJSValueIterator.hasNext": (),
"QJSValueIterator.name": (),
- "QJSValueIterator.next": (),
"QJSValueIterator.value": (),
# class PySide2.QtQml.QQmlAbstractUrlInterceptor:
@@ -15325,7 +15342,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlApplicationEngine.__init__": [('PySide2.QtCore.QObject',), ('PySide2.QtCore.QUrl', 'PySide2.QtCore.QObject'), ('str', 'PySide2.QtCore.QObject')],
"QQmlApplicationEngine.load": [('PySide2.QtCore.QUrl',), ('str',)],
"QQmlApplicationEngine.loadData": ('PySide2.QtCore.QByteArray', 'PySide2.QtCore.QUrl'),
- "QQmlApplicationEngine.rootObjects": [],
+ "QQmlApplicationEngine.rootObjects": (),
# class PySide2.QtQml.QQmlComponent:
"QQmlComponent.__init__": [('PySide2.QtCore.QObject',), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QUrl', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QUrl', 'PySide2.QtQml.QQmlComponent.CompilationMode', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'str', 'PySide2.QtCore.QObject'), ('PySide2.QtQml.QQmlEngine', 'str', 'PySide2.QtQml.QQmlComponent.CompilationMode', 'PySide2.QtCore.QObject')],
@@ -15357,7 +15374,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlContext.resolvedUrl": ('PySide2.QtCore.QUrl',),
"QQmlContext.setBaseUrl": ('PySide2.QtCore.QUrl',),
"QQmlContext.setContextObject": ('PySide2.QtCore.QObject',),
- "QQmlContext.setContextProperty": [('str', 'PySide2.QtCore.QObject'), ('str', 'PySide2.support.signature.typing.Any')],
+ "QQmlContext.setContextProperty": [('str', 'Any'), ('str', 'PySide2.QtCore.QObject')],
# class PySide2.QtQml.QQmlDebuggingEnabler:
"QQmlDebuggingEnabler.__init__": ('bool',),
@@ -15366,7 +15383,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlDebuggingEnabler.inspectorServices": (),
"QQmlDebuggingEnabler.nativeDebuggerServices": (),
"QQmlDebuggingEnabler.profilerServices": (),
- "QQmlDebuggingEnabler.setServices": ('PySide2.support.signature.typing.List',),
+ "QQmlDebuggingEnabler.setServices": ('List[str]',),
"QQmlDebuggingEnabler.startDebugConnector": ('str', 'dict'),
"QQmlDebuggingEnabler.startTcpDebugServer": ('int', 'PySide2.QtQml.QQmlDebuggingEnabler.StartMode', 'str'),
@@ -15395,13 +15412,13 @@ if "PySide2.QtQml" in sys.modules:
"QQmlEngine.rootContext": (),
"QQmlEngine.setBaseUrl": ('PySide2.QtCore.QUrl',),
"QQmlEngine.setContextForObject": ('PySide2.QtCore.QObject', 'PySide2.QtQml.QQmlContext'),
- "QQmlEngine.setImportPathList": ('PySide2.support.signature.typing.List',),
+ "QQmlEngine.setImportPathList": ('List[str]',),
"QQmlEngine.setIncubationController": ('PySide2.QtQml.QQmlIncubationController',),
"QQmlEngine.setNetworkAccessManagerFactory": ('PySide2.QtQml.QQmlNetworkAccessManagerFactory',),
"QQmlEngine.setObjectOwnership": ('PySide2.QtCore.QObject', 'PySide2.QtQml.QQmlEngine.ObjectOwnership'),
"QQmlEngine.setOfflineStoragePath": ('str',),
"QQmlEngine.setOutputWarningsToStandardError": ('bool',),
- "QQmlEngine.setPluginPathList": ('PySide2.support.signature.typing.List',),
+ "QQmlEngine.setPluginPathList": ('List[str]',),
"QQmlEngine.setUrlInterceptor": ('PySide2.QtQml.QQmlAbstractUrlInterceptor',),
"QQmlEngine.trimComponentCache": (),
"QQmlEngine.urlInterceptor": (),
@@ -15476,7 +15493,7 @@ if "PySide2.QtQml" in sys.modules:
"QQmlFileSelector.__init__": ('PySide2.QtQml.QQmlEngine', 'PySide2.QtCore.QObject'),
"QQmlFileSelector.get": ('PySide2.QtQml.QQmlEngine',),
"QQmlFileSelector.selector": (),
- "QQmlFileSelector.setExtraSelectors": ['PySide2.support.signature.typing.List'],
+ "QQmlFileSelector.setExtraSelectors": ('List[str]',),
"QQmlFileSelector.setSelector": ('PySide2.QtCore.QFileSelector',),
# class PySide2.QtQml.QQmlImageProviderBase:
@@ -15555,18 +15572,18 @@ if "PySide2.QtQml" in sys.modules:
"QQmlProperty.read": [(), ('PySide2.QtCore.QObject', 'str'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtQml.QQmlContext'), ('PySide2.QtCore.QObject', 'str', 'PySide2.QtQml.QQmlEngine')],
"QQmlProperty.reset": (),
"QQmlProperty.type": (),
- "QQmlProperty.write": [('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any', 'PySide2.QtQml.QQmlContext'), ('PySide2.QtCore.QObject', 'str', 'PySide2.support.signature.typing.Any', 'PySide2.QtQml.QQmlEngine'), ('PySide2.support.signature.typing.Any',)],
+ "QQmlProperty.write": [('Any',), ('PySide2.QtCore.QObject', 'str', 'Any'), ('PySide2.QtCore.QObject', 'str', 'Any', 'PySide2.QtQml.QQmlContext'), ('PySide2.QtCore.QObject', 'str', 'Any', 'PySide2.QtQml.QQmlEngine')],
# class PySide2.QtQml.QQmlPropertyMap:
"QQmlPropertyMap.__init__": ('PySide2.QtCore.QObject',),
"QQmlPropertyMap.clear": ('str',),
"QQmlPropertyMap.contains": ('str',),
"QQmlPropertyMap.count": (),
- "QQmlPropertyMap.insert": ('str', 'PySide2.support.signature.typing.Any'),
+ "QQmlPropertyMap.insert": ('str', 'Any'),
"QQmlPropertyMap.isEmpty": (),
"QQmlPropertyMap.keys": (),
"QQmlPropertyMap.size": (),
- "QQmlPropertyMap.updateValue": ('str', 'PySide2.support.signature.typing.Any'),
+ "QQmlPropertyMap.updateValue": ('str', 'Any'),
"QQmlPropertyMap.value": ('str',),
# class PySide2.QtQml.QQmlPropertyValueSource:
@@ -15768,7 +15785,7 @@ if "PySide2.QtQuick" in sys.modules:
# class PySide2.QtQuick.QQuickItemGrabResult:
"QQuickItemGrabResult.event": ('PySide2.QtCore.QEvent',),
"QQuickItemGrabResult.image": (),
- "QQuickItemGrabResult.saveToFile": ['str'],
+ "QQuickItemGrabResult.saveToFile": ('str',),
"QQuickItemGrabResult.url": (),
# class PySide2.QtQuick.QQuickPaintedItem:
@@ -15923,7 +15940,7 @@ if "PySide2.QtQuick" in sys.modules:
# class PySide2.QtQuick.QSGBasicGeometryNode:
"QSGBasicGeometryNode.__init__": ('PySide2.QtQuick.QSGNode.NodeType',),
"QSGBasicGeometryNode.clipList": (),
- "QSGBasicGeometryNode.geometry": [],
+ "QSGBasicGeometryNode.geometry": (),
"QSGBasicGeometryNode.matrix": (),
"QSGBasicGeometryNode.setGeometry": ('PySide2.QtQuick.QSGGeometry',),
"QSGBasicGeometryNode.setRendererClipList": ('PySide2.QtQuick.QSGClipNode',),
@@ -15958,9 +15975,9 @@ if "PySide2.QtQuick" in sys.modules:
"QSGGeometry.defaultAttributes_TexturedPoint2D": (),
"QSGGeometry.drawingMode": (),
"QSGGeometry.indexCount": (),
- "QSGGeometry.indexData": [],
- "QSGGeometry.indexDataAsUInt": [],
- "QSGGeometry.indexDataAsUShort": [],
+ "QSGGeometry.indexData": (),
+ "QSGGeometry.indexDataAsUInt": (),
+ "QSGGeometry.indexDataAsUShort": (),
"QSGGeometry.indexDataPattern": (),
"QSGGeometry.indexType": (),
"QSGGeometry.lineWidth": (),
@@ -15976,10 +15993,10 @@ if "PySide2.QtQuick" in sys.modules:
"QSGGeometry.updateRectGeometry": ('PySide2.QtQuick.QSGGeometry', 'PySide2.QtCore.QRectF'),
"QSGGeometry.updateTexturedRectGeometry": ('PySide2.QtQuick.QSGGeometry', 'PySide2.QtCore.QRectF', 'PySide2.QtCore.QRectF'),
"QSGGeometry.vertexCount": (),
- "QSGGeometry.vertexData": [],
- "QSGGeometry.vertexDataAsColoredPoint2D": [],
- "QSGGeometry.vertexDataAsPoint2D": [],
- "QSGGeometry.vertexDataAsTexturedPoint2D": [],
+ "QSGGeometry.vertexData": (),
+ "QSGGeometry.vertexDataAsColoredPoint2D": (),
+ "QSGGeometry.vertexDataAsPoint2D": (),
+ "QSGGeometry.vertexDataAsTexturedPoint2D": (),
"QSGGeometry.vertexDataPattern": (),
# class PySide2.QtQuick.QSGGeometryNode:
@@ -16160,7 +16177,7 @@ if "PySide2.QtTextToSpeech" in sys.modules:
"QTextToSpeechEngine.__init__": ('PySide2.QtCore.QObject',),
"QTextToSpeechEngine.availableLocales": (),
"QTextToSpeechEngine.availableVoices": (),
- "QTextToSpeechEngine.createVoice": ('str', 'PySide2.QtTextToSpeech.QVoice.Gender', 'PySide2.QtTextToSpeech.QVoice.Age', 'PySide2.support.signature.typing.Any'),
+ "QTextToSpeechEngine.createVoice": ('str', 'PySide2.QtTextToSpeech.QVoice.Gender', 'PySide2.QtTextToSpeech.QVoice.Age', 'Any'),
"QTextToSpeechEngine.locale": (),
"QTextToSpeechEngine.pause": (),
"QTextToSpeechEngine.pitch": (),
@@ -16265,7 +16282,7 @@ if "PySide2.QtDataVisualization" in sys.modules:
dict.update({
# class PySide2.QtDataVisualization.QtDataVisualization:
- "QtDataVisualization.qDefaultSurfaceFormat": ['bool'],
+ "QtDataVisualization.qDefaultSurfaceFormat": ('bool',),
})
# Module PySide2.QtUiTools
@@ -16299,7 +16316,7 @@ if "PySide2.QtAxContainer" in sys.modules:
dict.update({
# class PySide2.QtAxContainer.QAxBase:
- "QAxBase.argumentsToList": ('PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any'),
+ "QAxBase.argumentsToList": ('Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any'),
"QAxBase.asVariant": (),
"QAxBase.className": (),
"QAxBase.clear": (),
@@ -16307,7 +16324,7 @@ if "PySide2.QtAxContainer" in sys.modules:
"QAxBase.disableClassInfo": (),
"QAxBase.disableEventSink": (),
"QAxBase.disableMetaObject": (),
- "QAxBase.dynamicCall": [('str', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any'), ('str', 'list'), ('str', 'list', 'int')],
+ "QAxBase.dynamicCall": [('str', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any'), ('str', 'list'), ('str', 'list', 'int')],
"QAxBase.fallbackMetaObject": (),
"QAxBase.generateDocumentation": (),
"QAxBase.indexOfVerb": ('str',),
@@ -16317,7 +16334,7 @@ if "PySide2.QtAxContainer" in sys.modules:
"QAxBase.propertyBag": (),
"QAxBase.propertyWritable": ('str',),
"QAxBase.qObject": (),
- "QAxBase.querySubObject": [('str', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any'), ('str', 'list')],
+ "QAxBase.querySubObject": [('str', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any'), ('str', 'list')],
"QAxBase.setControl": ('str',),
"QAxBase.setPropertyBag": ('dict',),
"QAxBase.setPropertyWritable": ('str', 'bool'),
@@ -16332,7 +16349,7 @@ if "PySide2.QtAxContainer" in sys.modules:
# class PySide2.QtAxContainer.QAxScript:
"QAxScript.__init__": ('str', 'PySide2.QtAxContainer.QAxScriptManager'),
- "QAxScript.call": [('str', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any'), ('str', 'list')],
+ "QAxScript.call": [('str', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any'), ('str', 'list')],
"QAxScript.functions": ('PySide2.QtAxContainer.QAxScript.FunctionFlags',),
"QAxScript.load": ('str', 'str'),
"QAxScript.scriptCode": (),
@@ -16349,7 +16366,7 @@ if "PySide2.QtAxContainer" in sys.modules:
# class PySide2.QtAxContainer.QAxScriptManager:
"QAxScriptManager.__init__": ('PySide2.QtCore.QObject',),
"QAxScriptManager.addObject": ('PySide2.QtAxContainer.QAxBase',),
- "QAxScriptManager.call": [('str', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any', 'PySide2.support.signature.typing.Any'), ('str', 'list')],
+ "QAxScriptManager.call": [('str', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any', 'Any'), ('str', 'list')],
"QAxScriptManager.functions": ('PySide2.QtAxContainer.QAxScript.FunctionFlags',),
"QAxScriptManager.load": [('str', 'str'), ('str', 'str', 'str')],
"QAxScriptManager.registerEngine": ('str', 'str', 'str'),
@@ -16437,7 +16454,7 @@ if "PySide2.QtWebEngineWidgets" in sys.modules:
"QWebEnginePage.action": ('PySide2.QtWebEngineWidgets.QWebEnginePage.WebAction',),
"QWebEnginePage.backgroundColor": (),
"QWebEnginePage.certificateError": ('PySide2.QtWebEngineWidgets.QWebEngineCertificateError',),
- "QWebEnginePage.chooseFiles": ('PySide2.QtWebEngineWidgets.QWebEnginePage.FileSelectionMode', 'PySide2.support.signature.typing.List', 'PySide2.support.signature.typing.List'),
+ "QWebEnginePage.chooseFiles": ('PySide2.QtWebEngineWidgets.QWebEnginePage.FileSelectionMode', 'List[str]', 'List[str]'),
"QWebEnginePage.contentsSize": (),
"QWebEnginePage.createStandardContextMenu": (),
"QWebEnginePage.createWindow": ('PySide2.QtWebEngineWidgets.QWebEnginePage.WebWindowType',),
@@ -16500,7 +16517,7 @@ if "PySide2.QtWebEngineWidgets" in sys.modules:
"QWebEngineProfile.setPersistentCookiesPolicy": ('PySide2.QtWebEngineWidgets.QWebEngineProfile.PersistentCookiesPolicy',),
"QWebEngineProfile.setPersistentStoragePath": ('str',),
"QWebEngineProfile.setSpellCheckEnabled": ('bool',),
- "QWebEngineProfile.setSpellCheckLanguages": ('PySide2.support.signature.typing.List',),
+ "QWebEngineProfile.setSpellCheckLanguages": ('List[str]',),
"QWebEngineProfile.spellCheckLanguages": (),
"QWebEngineProfile.storageName": (),
"QWebEngineProfile.visitedLinksContainsUrl": ('PySide2.QtCore.QUrl',),
diff --git a/sources/pyside2/tests/registry/init_platform.py b/sources/pyside2/tests/registry/init_platform.py
index a8e692d98..1ff83f47e 100644
--- a/sources/pyside2/tests/registry/init_platform.py
+++ b/sources/pyside2/tests/registry/init_platform.py
@@ -1,6 +1,6 @@
#############################################################################
##
-## Copyright (C) 2017 The Qt Company Ltd.
+## Copyright (C) 2018 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of PySide2.
diff --git a/sources/pyside2/tests/signals/signal_signature_test.py b/sources/pyside2/tests/signals/signal_signature_test.py
index 349619aac..e94c1722d 100644
--- a/sources/pyside2/tests/signals/signal_signature_test.py
+++ b/sources/pyside2/tests/signals/signal_signature_test.py
@@ -34,7 +34,11 @@ import unittest
from PySide2.QtCore import *
from helper import UsesQCoreApplication
+called = False
+name = "Old"
class Obj(QObject):
+ dummySignalArgs = Signal(str)
+ numberSignal = Signal(int)
def __init__(self):
QObject.__init__(self)
self.signal = ''
@@ -42,8 +46,20 @@ class Obj(QObject):
def connectNotify(self, signal):
self.signal = signal
+ @staticmethod
+ def static_method():
+ global called
+ called = True
+
+ @staticmethod
+ def static_method_args(arg="default"):
+ global name
+ name = arg
+
def callback(arg=None):
pass
+def callback_empty():
+ pass
class TestConnectNotifyWithNewStyleSignals(UsesQCoreApplication):
'''Test case for signal signature received by QObject::connectNotify().'''
@@ -65,12 +81,34 @@ class TestConnectNotifyWithNewStyleSignals(UsesQCoreApplication):
def testNewStyle(self):
sender = Obj()
- sender.destroyed.connect(callback)
+ sender.destroyed.connect(callback_empty)
self.assertEqual(sender.signal.methodSignature(), 'destroyed()')
sender.destroyed[QObject].connect(callback)
self.assertEqual(sender.signal.methodSignature(), 'destroyed(QObject*)')
+ def testStaticSlot(self):
+ global called
+ sender = Obj()
+ sender.connect(sender, SIGNAL("dummySignal()"), Obj.static_method)
+ sender.emit(SIGNAL("dummySignal()"))
+ self.assertTrue(called)
+
+
+ def testStaticSlotArgs(self):
+ global name
+ sender = Obj()
+ sender.dummySignalArgs.connect(Obj.static_method_args)
+ sender.dummySignalArgs[str].emit("New")
+ self.assertEqual(name, "New")
+
+ def testLambdaSlot(self):
+ sender = Obj()
+ sender.numberSignal[int].connect(lambda x: 42)
+ with self.assertRaises(IndexError):
+ sender.numberSignal[str].emit("test")
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/sources/shiboken2/ApiExtractor/CMakeLists.txt b/sources/shiboken2/ApiExtractor/CMakeLists.txt
index 26ae03173..f2af51c02 100644
--- a/sources/shiboken2/ApiExtractor/CMakeLists.txt
+++ b/sources/shiboken2/ApiExtractor/CMakeLists.txt
@@ -27,11 +27,17 @@ add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_SHARED)
add_definitions(-DRXX_ALLOCATOR_INIT_0)
+# Pass the path to the clang includes dir, so it headers like stdarg.h.
+if(UNIX AND NOT APPLE)
+ add_definitions(-DCLANG_BUILTIN_INCLUDES_DIR="${CLANG_BUILTIN_INCLUDES_DIR}")
+else()
+ add_definitions(-DCLANG_BUILTIN_INCLUDES_DIR="")
+endif()
+
set(apiextractor_SRC
apiextractor.cpp
abstractmetabuilder.cpp
abstractmetalang.cpp
-asttoxml.cpp
fileout.cpp
graph.cpp
reporthandler.cpp
@@ -39,28 +45,19 @@ typeparser.cpp
typesystem.cpp
include.cpp
typedatabase.cpp
-parser/ast.cpp
-parser/binder.cpp
-parser/class_compiler.cpp
+# Clang
+clangparser/compilersupport.cpp
+clangparser/clangparser.cpp
+clangparser/clangbuilder.cpp
+clangparser/clangdebugutils.cpp
+clangparser/clangutils.cpp
+# Old parser
parser/codemodel.cpp
-parser/codemodel_finder.cpp
-parser/compiler_utils.cpp
-parser/control.cpp
-parser/declarator_compiler.cpp
-parser/default_visitor.cpp
-parser/dumptree.cpp
-parser/lexer.cpp
-parser/list.cpp
-parser/name_compiler.cpp
-parser/parser.cpp
-parser/smallobject.cpp
-parser/tokens.cpp
-parser/type_compiler.cpp
-parser/visitor.cpp
-parser/rpp/builtin-macros.cpp
-parser/rpp/preprocessor.cpp
)
+set(APIEXTRACTOR_EXTRA_INCLUDES ${CLANG_EXTRA_INCLUDES})
+set(APIEXTRACTOR_EXTRA_LIBRARIES ${CLANG_EXTRA_LIBRARIES})
+
if (NOT DISABLE_DOCSTRINGS)
set(apiextractor_SRC
${apiextractor_SRC}
@@ -68,16 +65,12 @@ if (NOT DISABLE_DOCSTRINGS)
doxygenparser.cpp
qtdocparser.cpp
)
- set(APIEXTRACTOR_EXTRA_INCLUDES ${LIBXSLT_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
- set(APIEXTRACTOR_EXTRA_LIBRARIES ${LIBXSLT_LIBRARIES} ${LIBXML2_LIBRARIES})
-else()
- set(APIEXTRACTOR_EXTRA_INCLUDES "")
- set(APIEXTRACTOR_EXTRA_LIBRARIES "")
+ set(APIEXTRACTOR_EXTRA_INCLUDES ${APIEXTRACTOR_EXTRA_INCLUDES} ${LIBXSLT_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
+ set(APIEXTRACTOR_EXTRA_LIBRARIES ${APIEXTRACTOR_EXTRA_LIBRARIES} ${LIBXSLT_LIBRARIES} ${LIBXML2_LIBRARIES})
endif()
set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE)
-qt5_add_resources(apiextractor_RCCS_SRC generator.qrc)
set(CMAKE_AUTOMOC ON)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
index e71841ec3..37b82e99f 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
@@ -30,18 +30,16 @@
#include "reporthandler.h"
#include "typedatabase.h"
-#include "parser/ast.h"
-#include "parser/binder.h"
-#include "parser/control.h"
-#include "parser/default_visitor.h"
-#include "parser/dumptree.h"
-#include "parser/lexer.h"
-#include "parser/parser.h"
-#include "parser/tokens.h"
+#include <clangparser/clangbuilder.h>
+#include <clangparser/clangutils.h>
+
+#include "parser/codemodel.h"
#include <QDebug>
+#include <QDir>
#include <QFile>
#include <QFileInfo>
+#include <QRegularExpression>
#include <QTextCodec>
#include <QTextStream>
#include <QVariant>
@@ -165,23 +163,48 @@ QSet<QString> AbstractMetaBuilder::qtMetaTypeDeclaredTypeNames() const
return d->m_qmetatypeDeclaredTypenames;
}
+static QString msgNoFunctionForModification(const QString &signature, const QString &className,
+ const QStringList &possibleSignatures,
+ const AbstractMetaFunctionList &allFunctions)
+{
+ QString result;
+ QTextStream str(&result);
+ str << "signature '" << signature << "' for function modification in '"
+ << className << "' not found.";
+ if (possibleSignatures.isEmpty()) {
+ str << " No candidates were found. Member functions: ";
+ for (int f = 0, size = allFunctions.size(); f < size; ++f) {
+ if (f)
+ str << ", ";
+ str << allFunctions.at(f)->minimalSignature();
+ }
+ } else {
+ str << " Possible candidates: " << possibleSignatures.join(QLatin1String(", "));
+ }
+ return result;
+}
+
void AbstractMetaBuilderPrivate::checkFunctionModifications()
{
TypeDatabase *types = TypeDatabase::instance();
- SingleTypeEntryHash entryHash = types->entries();
- QList<TypeEntry*> entries = entryHash.values();
+ const SingleTypeEntryHash entryHash = types->entries();
- foreach (TypeEntry* entry, entries) {
+ for (SingleTypeEntryHash::const_iterator it = entryHash.cbegin(), end = entryHash.cend(); it != end; ++it) {
+ const TypeEntry *entry = it.value();
if (!entry)
continue;
if (!entry->isComplex() || entry->codeGeneration() == TypeEntry::GenerateNothing)
continue;
- ComplexTypeEntry* centry = static_cast<ComplexTypeEntry*>(entry);
+ const ComplexTypeEntry* centry = static_cast<const ComplexTypeEntry*>(entry);
+
+ if (!(centry->codeGeneration() & TypeEntry::GenerateTargetLang))
+ continue;
+
FunctionModificationList modifications = centry->functionModifications();
- foreach (const FunctionModification &modification, modifications) {
- QString signature = modification.signature;
+ for (const FunctionModification &modification : qAsConst(modifications)) {
+ QString signature = modification.signature();
QString name = signature.trimmed();
name.truncate(name.indexOf(QLatin1Char('(')));
@@ -190,11 +213,12 @@ void AbstractMetaBuilderPrivate::checkFunctionModifications()
if (!clazz)
continue;
- AbstractMetaFunctionList functions = clazz->functions();
+ const AbstractMetaFunctionList functions = clazz->functions();
bool found = false;
QStringList possibleSignatures;
- foreach (AbstractMetaFunction *function, functions) {
- if (function->minimalSignature() == signature && function->implementingClass() == clazz) {
+ for (AbstractMetaFunction *function : functions) {
+ if (function->implementingClass() == clazz
+ && modification.matches(function->minimalSignature())) {
found = true;
break;
}
@@ -207,8 +231,8 @@ void AbstractMetaBuilderPrivate::checkFunctionModifications()
if (!found) {
qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("signature '%1' for function modification in '%2' not found. Possible candidates: %3")
- .arg(signature, clazz->qualifiedCppName(), possibleSignatures.join(QLatin1String(", ")));
+ << msgNoFunctionForModification(signature, clazz->qualifiedCppName(),
+ possibleSignatures, functions);
}
}
}
@@ -227,41 +251,6 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::argumentToClass(ArgumentModelItem
return returned;
}
-AbstractMetaClass *AbstractMetaBuilder::createMetaClass()
-{
- return new AbstractMetaClass();
-}
-
-AbstractMetaEnum *AbstractMetaBuilder::createMetaEnum()
-{
- return new AbstractMetaEnum();
-}
-
-AbstractMetaEnumValue *AbstractMetaBuilder::createMetaEnumValue()
-{
- return new AbstractMetaEnumValue();
-}
-
-AbstractMetaField *AbstractMetaBuilder::createMetaField()
-{
- return new AbstractMetaField();
-}
-
-AbstractMetaFunction *AbstractMetaBuilder::createMetaFunction()
-{
- return new AbstractMetaFunction();
-}
-
-AbstractMetaArgument *AbstractMetaBuilder::createMetaArgument()
-{
- return new AbstractMetaArgument();
-}
-
-AbstractMetaType *AbstractMetaBuilder::createMetaType()
-{
- return new AbstractMetaType();
-}
-
/**
* Checks the argument of a hash function and flags the type if it is a complex type
*/
@@ -329,7 +318,7 @@ void AbstractMetaBuilderPrivate::traverseOperatorFunction(FunctionModelItem item
AbstractMetaClass* oldCurrentClass = m_currentClass;
m_currentClass = baseoperandClass;
AbstractMetaFunction *metaFunction = traverseFunction(item);
- if (metaFunction && !metaFunction->isInvalid()) {
+ if (metaFunction) {
// Strip away first argument, since that is the containing object
AbstractMetaArgumentList arguments = metaFunction->arguments();
if (firstArgumentIsSelf || unaryOperator) {
@@ -378,8 +367,7 @@ void AbstractMetaBuilderPrivate::traverseStreamOperator(FunctionModelItem item)
m_currentClass = streamedClass;
AbstractMetaFunction *streamFunction = traverseFunction(item);
- if (streamFunction && !streamFunction->isInvalid()) {
- QString name = item->name();
+ if (streamFunction) {
streamFunction->setFunctionType(AbstractMetaFunction::GlobalScopeFunction);
// Strip first argument, since that is the containing object
AbstractMetaArgumentList arguments = streamFunction->arguments();
@@ -390,7 +378,7 @@ void AbstractMetaBuilderPrivate::traverseStreamOperator(FunctionModelItem item)
streamFunction->setArguments(arguments);
- *streamFunction += AbstractMetaAttributes::Final;
+ *streamFunction += AbstractMetaAttributes::FinalInTargetLang;
*streamFunction += AbstractMetaAttributes::Public;
streamFunction->setOriginalAttributes(streamFunction->attributes());
@@ -427,7 +415,8 @@ void AbstractMetaBuilderPrivate::fixQObjectForScope(const FileModelItem &dom,
const TypeDatabase *types,
const NamespaceModelItem &scope)
{
- foreach (const ClassModelItem &item, scope->classes()) {
+ const ClassList &scopeClasses = scope->classes();
+ for (const ClassModelItem &item : scopeClasses) {
QString qualifiedName = item->qualifiedName().join(colonColon());
TypeEntry* entry = types->findType(qualifiedName);
if (entry) {
@@ -437,7 +426,7 @@ void AbstractMetaBuilderPrivate::fixQObjectForScope(const FileModelItem &dom,
}
const NamespaceList &namespaces = scope->namespaces();
- foreach (const NamespaceModelItem &n, namespaces) {
+ for (const NamespaceModelItem &n : namespaces) {
if (scope != n)
fixQObjectForScope(dom, types, n);
}
@@ -445,29 +434,26 @@ void AbstractMetaBuilderPrivate::fixQObjectForScope(const FileModelItem &dom,
void AbstractMetaBuilderPrivate::sortLists()
{
- foreach (AbstractMetaClass *cls, m_metaClasses)
+ for (AbstractMetaClass *cls : qAsConst(m_metaClasses))
cls->sortFunctions();
}
-FileModelItem AbstractMetaBuilderPrivate::buildDom(QIODevice *input)
+FileModelItem AbstractMetaBuilderPrivate::buildDom(const QByteArrayList &arguments,
+ unsigned clangFlags)
{
- Q_ASSERT(input);
-
- if (!input->isOpen() && !input->open(QIODevice::ReadOnly))
- return FileModelItem();
-
- QByteArray contents = input->readAll();
- input->close();
-
- Control control;
- Parser p(&control);
- pool __pool;
-
- TranslationUnitAST* ast = p.parse(contents, contents.size(), &__pool);
-
- CodeModel model;
- Binder binder(&model, p.location());
- return binder.run(ast);
+ clang::Builder builder;
+ FileModelItem result = clang::parse(arguments, clangFlags, builder)
+ ? builder.dom() : FileModelItem();
+ const clang::BaseVisitor::Diagnostics &diagnostics = builder.diagnostics();
+ if (const int diagnosticsCount = diagnostics.size()) {
+ QDebug d = qWarning();
+ d.nospace();
+ d.noquote();
+ d << "Clang: " << diagnosticsCount << " diagnostic messages:\n";
+ for (int i = 0; i < diagnosticsCount; ++i)
+ d << " " << diagnostics.at(i) << '\n';
+ }
+ return result;
}
void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
@@ -482,7 +468,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
// Start the generation...
const ClassList &typeValues = dom->classes();
ReportHandler::setProgressReference(typeValues);
- foreach (const ClassModelItem &item, typeValues) {
+ for (const ClassModelItem &item : typeValues) {
ReportHandler::progress(QLatin1String("Generating class model..."));
AbstractMetaClass *cls = traverseClass(dom, item);
if (!cls)
@@ -492,8 +478,9 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
}
// We need to know all global enums
- ReportHandler::setProgressReference(dom->enums());
- foreach (const EnumModelItem &item, dom->enums()) {
+ const EnumList &enums = dom->enums();
+ ReportHandler::setProgressReference(enums);
+ for (const EnumModelItem &item : enums) {
ReportHandler::progress(QLatin1String("Generating enum model..."));
AbstractMetaEnum *metaEnum = traverseEnum(item, 0, QSet<QString>());
if (metaEnum) {
@@ -504,7 +491,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
const QSet<NamespaceModelItem> &namespaceTypeValues = dom->uniqueNamespaces();
ReportHandler::setProgressReference(namespaceTypeValues);
- foreach (NamespaceModelItem item, namespaceTypeValues) {
+ for (const NamespaceModelItem &item : namespaceTypeValues) {
ReportHandler::progress(QLatin1String("Generating namespace model..."));
AbstractMetaClass *metaClass = traverseNamespace(dom, item);
if (metaClass)
@@ -513,9 +500,9 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
// Go through all typedefs to see if we have defined any
// specific typedefs to be used as classes.
- TypeDefList typeDefs = dom->typeDefs();
+ const TypeDefList typeDefs = dom->typeDefs();
ReportHandler::setProgressReference(typeDefs);
- foreach (const TypeDefModelItem &typeDef, typeDefs) {
+ for (const TypeDefModelItem &typeDef : typeDefs) {
ReportHandler::progress(QLatin1String("Resolving typedefs..."));
AbstractMetaClass* cls = traverseTypeDef(dom, typeDef);
addAbstractMetaClass(cls);
@@ -523,14 +510,15 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
figureOutEnumValues();
- foreach (const ClassModelItem &item, typeValues)
+ for (const ClassModelItem &item : typeValues)
traverseClassMembers(item);
- foreach (const NamespaceModelItem &item, namespaceTypeValues)
+ for (const NamespaceModelItem &item : namespaceTypeValues)
traverseNamespaceMembers(item);
// Global functions
- foreach (const FunctionModelItem &func, dom->functions()) {
+ const FunctionList &functions = dom->functions();
+ for (const FunctionModelItem &func : functions) {
if (func->accessPolicy() != CodeModel::Public || func->name().startsWith(QLatin1String("operator")))
continue;
@@ -558,14 +546,14 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
}
ReportHandler::setProgressReference(m_metaClasses);
- foreach (AbstractMetaClass* cls, m_metaClasses) {
+ for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) {
ReportHandler::progress(QLatin1String("Fixing class inheritance..."));
if (!cls->isInterface() && !cls->isNamespace())
setupInheritance(cls);
}
ReportHandler::setProgressReference(m_metaClasses);
- foreach (AbstractMetaClass* cls, m_metaClasses) {
+ for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) {
ReportHandler::progress(QLatin1String("Detecting inconsistencies in class model..."));
cls->fixFunctions();
@@ -574,7 +562,9 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
<< QStringLiteral("class '%1' does not have an entry in the type system")
.arg(cls->name());
} else {
- bool couldAddDefaultCtors = !cls->isFinalInCpp() && !cls->isInterface() && !cls->isNamespace();
+ const bool couldAddDefaultCtors = cls->isConstructible()
+ && !cls->isInterface() && !cls->isNamespace()
+ && (cls->attributes() & AbstractMetaAttributes::HasRejectedConstructor) == 0;
if (couldAddDefaultCtors) {
if (!cls->hasConstructors())
cls->addDefaultConstructor();
@@ -586,11 +576,10 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
if (cls->isAbstract() && !cls->isInterface())
cls->typeEntry()->setLookupName(cls->typeEntry()->targetLangName() + QLatin1String("$ConcreteWrapper"));
}
- TypeEntryHash allEntries = types->allEntries();
+ const TypeEntryHash allEntries = types->allEntries();
ReportHandler::progress(QLatin1String("Detecting inconsistencies in typesystem..."));
- foreach (QList<TypeEntry*> entries, allEntries) {
- foreach (TypeEntry* entry, entries) {
-
+ for (TypeEntryHash::const_iterator it = allEntries.cbegin(), end = allEntries.cend(); it != end; ++it) {
+ for (TypeEntry *entry : it.value()) {
if (entry->isPrimitive())
continue;
@@ -600,15 +589,17 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
&& !entry->isContainer()
&& !entry->isCustom()
&& !entry->isVariant()
+ && (entry->generateCode() & TypeEntry::GenerateTargetLang)
&& !AbstractMetaClass::findClass(m_metaClasses, entry->qualifiedCppName())) {
qCWarning(lcShiboken).noquote().nospace()
<< QStringLiteral("type '%1' is specified in typesystem, but not defined. This could potentially lead to compilation errors.")
.arg(entry->qualifiedCppName());
} else if (entry->generateCode() && entry->type() == TypeEntry::FunctionType) {
const FunctionTypeEntry* fte = static_cast<const FunctionTypeEntry*>(entry);
- foreach (const QString &signature, fte->signatures()) {
+ const QStringList &signatures = fte->signatures();
+ for (const QString &signature : signatures) {
bool ok = false;
- foreach (AbstractMetaFunction* func, m_globalFunctions) {
+ for (AbstractMetaFunction* func : qAsConst(m_globalFunctions)) {
if (signature == func->minimalSignature()) {
ok = true;
break;
@@ -620,7 +611,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
.arg(signature);
}
}
- } else if (entry->isEnum()) {
+ } else if (entry->isEnum() && (entry->generateCode() & TypeEntry::GenerateTargetLang)) {
const QString name = ((EnumTypeEntry*) entry)->targetLangQualifier();
AbstractMetaClass *cls = AbstractMetaClass::findClass(m_metaClasses, name);
@@ -628,7 +619,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
if (cls) {
enumFound = cls->findEnum(entry->targetLangName());
} else { // Global enum
- foreach (AbstractMetaEnum* metaEnum, m_enums) {
+ for (AbstractMetaEnum *metaEnum : qAsConst(m_enums)) {
if (metaEnum->typeEntry() == entry) {
enumFound = true;
break;
@@ -647,14 +638,14 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
}
{
- FunctionList hashFunctions = dom->findFunctions(QLatin1String("qHash"));
- foreach (const FunctionModelItem &item, hashFunctions)
+ const FunctionList &hashFunctions = dom->findFunctions(QLatin1String("qHash"));
+ for (const FunctionModelItem &item : hashFunctions)
registerHashFunction(item);
}
{
- FunctionList hashFunctions = dom->findFunctions(QLatin1String("operator<<"));
- foreach (const FunctionModelItem &item, hashFunctions)
+ const FunctionList &streamOps = dom->findFunctions(QLatin1String("operator<<"));
+ for (const FunctionModelItem &item : streamOps)
registerToStringCapability(item);
}
@@ -671,7 +662,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
const FunctionList potentiallyBinaryOperators =
dom->findFunctions(QStringLiteral("operator*"))
+ dom->findFunctions(QStringLiteral("operator&"));
- foreach (const FunctionModelItem &item, potentiallyBinaryOperators) {
+ for (const FunctionModelItem &item : potentiallyBinaryOperators) {
if (!item->arguments().isEmpty())
binaryOperators.append(item);
}
@@ -682,14 +673,14 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
binaryOperators.append(dom->findFunctions(QStringLiteral("operator~")));
binaryOperators.append(dom->findFunctions(QStringLiteral("operator>")));
- foreach (const FunctionModelItem &item, binaryOperators)
+ for (const FunctionModelItem &item : qAsConst(binaryOperators))
traverseOperatorFunction(item);
}
{
- FunctionList streamOperators = dom->findFunctions(QLatin1String("operator<<"))
- + dom->findFunctions(QLatin1String("operator>>"));
- foreach (const FunctionModelItem &item, streamOperators)
+ const FunctionList streamOperators = dom->findFunctions(QLatin1String("operator<<"))
+ + dom->findFunctions(QLatin1String("operator>>"));
+ for (const FunctionModelItem &item : streamOperators)
traverseStreamOperator(item);
}
@@ -699,7 +690,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
// sort all classes topologically
m_metaClasses = classesTopologicalSorted();
- foreach (AbstractMetaClass* cls, m_metaClasses) {
+ for (AbstractMetaClass* cls : qAsConst(m_metaClasses)) {
// setupEquals(cls);
// setupComparable(cls);
setupClonable(cls);
@@ -719,7 +710,8 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
m_currentClass = 0;
// Functions added to the module on the type system.
- foreach (const AddedFunction &addedFunc, types->globalUserFunctions()) {
+ const AddedFunctionList &globalUserFunctions = types->globalUserFunctions();
+ for (const AddedFunction &addedFunc : globalUserFunctions) {
AbstractMetaFunction* metaFunc = traverseFunction(addedFunc);
metaFunc->setFunctionType(AbstractMetaFunction::NormalFunction);
m_globalFunctions << metaFunc;
@@ -728,13 +720,15 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
std::puts("");
}
-bool AbstractMetaBuilder::build(QIODevice *input)
+bool AbstractMetaBuilder::build(const QByteArrayList &arguments, unsigned clangFlags)
{
- FileModelItem dom = d->buildDom(input);
- const bool result = dom.data() != Q_NULLPTR;
- if (result)
- d->traverseDom(dom);
- return result;
+ const FileModelItem dom = d->buildDom(arguments, clangFlags);
+ if (dom.isNull())
+ return false;
+ if (ReportHandler::isDebug(ReportHandler::MediumDebug))
+ qCDebug(lcShiboken) << dom.data();
+ d->traverseDom(dom);
+ return true;
}
void AbstractMetaBuilder::setLogDirectory(const QString& logDir)
@@ -784,7 +778,7 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseNamespace(const FileModel
return 0;
}
- AbstractMetaClass* metaClass = q->createMetaClass();
+ AbstractMetaClass* metaClass = new AbstractMetaClass;
metaClass->setTypeEntry(type);
*metaClass += AbstractMetaAttributes::Public;
@@ -801,8 +795,8 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseNamespace(const FileModel
pushScope(namespaceItem);
m_namespacePrefix = currentScope()->qualifiedName().join(colonColon());
- ClassList classes = namespaceItem->classes();
- foreach (const ClassModelItem &cls, classes) {
+ const ClassList &classes = namespaceItem->classes();
+ for (const ClassModelItem &cls : classes) {
AbstractMetaClass* mjc = traverseClass(dom, cls);
if (mjc) {
metaClass->addInnerClass(mjc);
@@ -814,7 +808,7 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseNamespace(const FileModel
// Go through all typedefs to see if we have defined any
// specific typedefs to be used as classes.
const TypeDefList typeDefs = namespaceItem->typeDefs();
- foreach (const TypeDefModelItem &typeDef, typeDefs) {
+ for (const TypeDefModelItem &typeDef : typeDefs) {
AbstractMetaClass *cls = traverseTypeDef(dom, typeDef);
if (cls) {
metaClass->addInnerClass(cls);
@@ -825,7 +819,7 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseNamespace(const FileModel
// Traverse namespaces recursively
const QSet<NamespaceModelItem> &innerNamespaces = namespaceItem->uniqueNamespaces();
- foreach (const NamespaceModelItem &ni, innerNamespaces) {
+ for (const NamespaceModelItem &ni : innerNamespaces) {
AbstractMetaClass* mjc = traverseNamespace(dom, ni);
if (mjc) {
metaClass->addInnerClass(mjc);
@@ -985,8 +979,8 @@ void AbstractMetaBuilderPrivate::figureOutEnumValuesForClass(AbstractMetaClass *
if (classes->contains(metaClass))
return;
- AbstractMetaEnumList enums = metaClass->enums();
- foreach (AbstractMetaEnum* e, enums) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (AbstractMetaEnum* e : enums) {
if (!e) {
qCWarning(lcShiboken).noquote().nospace() << "bad enum in class " << metaClass->name();
continue;
@@ -1009,10 +1003,10 @@ void AbstractMetaBuilderPrivate::figureOutEnumValues()
// Keep a set of classes that we already traversed. We use this to
// enforce that we traverse base classes prior to subclasses.
QSet<AbstractMetaClass*> classes;
- foreach (AbstractMetaClass *c, m_metaClasses)
+ for (AbstractMetaClass *c : qAsConst(m_metaClasses))
figureOutEnumValuesForClass(c, &classes);
- foreach (AbstractMetaEnum* metaEnum, m_globalEnums) {
+ for (AbstractMetaEnum* metaEnum : qAsConst(m_globalEnums)) {
AbstractMetaEnumValueList enumValues = metaEnum->values();
int value = 0;
for (int i = 0; i < enumValues.size(); ++i) {
@@ -1025,9 +1019,11 @@ void AbstractMetaBuilderPrivate::figureOutEnumValues()
void AbstractMetaBuilderPrivate::figureOutDefaultEnumArguments()
{
- foreach (AbstractMetaClass* metaClass, m_metaClasses) {
- foreach (AbstractMetaFunction* metaFunction, metaClass->functions()) {
- foreach (AbstractMetaArgument *arg, metaFunction->arguments()) {
+ for (AbstractMetaClass* metaClass : qAsConst(m_metaClasses)) {
+ const AbstractMetaFunctionList &functions = metaClass->functions();
+ for (AbstractMetaFunction* metaFunction : functions) {
+ const AbstractMetaArgumentList &arguments = metaFunction->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
QString expr = arg->defaultValueExpression();
if (expr.isEmpty())
continue;
@@ -1053,7 +1049,7 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte
TypeEntry* typeEntry = 0;
if (enumItem->accessPolicy() == CodeModel::Private) {
QStringList names = enumItem->qualifiedName();
- QString enumName = names.last();
+ QString enumName = names.constLast();
QString nspace;
if (names.size() > 1)
nspace = QStringList(names.mid(0, names.size() - 1)).join(colonColon());
@@ -1063,7 +1059,8 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte
typeEntry = TypeDatabase::instance()->findType(qualifiedName);
} else {
QStringList tmpQualifiedName = enumItem->qualifiedName();
- foreach (const EnumeratorModelItem& enumValue, enumItem->enumerators()) {
+ const EnumeratorList &enums = enumItem->enumerators();
+ for (const EnumeratorModelItem& enumValue : enums) {
tmpQualifiedName.removeLast();
tmpQualifiedName << enumValue->name();
qualifiedName = tmpQualifiedName.join(colonColon());
@@ -1079,22 +1076,26 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte
if (m_currentClass)
className = m_currentClass->typeEntry()->qualifiedCppName();
- if (TypeDatabase::instance()->isEnumRejected(className, enumName)) {
+ QString rejectReason;
+ if (TypeDatabase::instance()->isEnumRejected(className, enumName, &rejectReason)) {
if (typeEntry)
typeEntry->setCodeGeneration(TypeEntry::GenerateNothing);
- m_rejectedEnums.insert(qualifiedName, AbstractMetaBuilder::GenerationDisabled);
+ m_rejectedEnums.insert(qualifiedName + rejectReason, AbstractMetaBuilder::GenerationDisabled);
return 0;
}
- if (!typeEntry || !typeEntry->isEnum()) {
- qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("enum '%1' does not have a type entry or is not an enum")
+ if ((!typeEntry || !typeEntry->isEnum())) {
+ if (!m_currentClass ||
+ (m_currentClass->typeEntry()->codeGeneration() & TypeEntry::GenerateTargetLang)) {
+ qCWarning(lcShiboken).noquote().nospace()
+ << QStringLiteral("enum '%1' does not have a type entry or is not an enum")
.arg(qualifiedName);
+ }
m_rejectedEnums.insert(qualifiedName, AbstractMetaBuilder::NotInTypeSystem);
return 0;
}
- AbstractMetaEnum *metaEnum = q->createMetaEnum();
+ AbstractMetaEnum *metaEnum = new AbstractMetaEnum;
if (enumsDeclarations.contains(qualifiedName)
|| enumsDeclarations.contains(enumName)) {
metaEnum->setHasQEnumsDeclaration(true);
@@ -1119,9 +1120,10 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte
if (ReportHandler::isDebug(ReportHandler::MediumDebug))
qCDebug(lcShiboken) << " - traversing enum " << metaEnum->fullName();
- foreach (const EnumeratorModelItem &value, enumItem->enumerators()) {
+ const EnumeratorList &enums = enumItem->enumerators();
+ for (const EnumeratorModelItem &value : enums) {
- AbstractMetaEnumValue *metaEnumValue = q->createMetaEnumValue();
+ AbstractMetaEnumValue *metaEnumValue = new AbstractMetaEnumValue;
metaEnumValue->setName(value->name());
// Deciding the enum value...
@@ -1148,7 +1150,8 @@ AbstractMetaEnum *AbstractMetaBuilderPrivate::traverseEnum(EnumModelItem enumIte
metaEnum->setOriginalAttributes(metaEnum->attributes());
// Register all enum values on Type database
- foreach(EnumeratorModelItem e, enumItem->enumerators()) {
+ const EnumeratorList &enumerators = enumItem->enumerators();
+ for (const EnumeratorModelItem &e : enumerators) {
QString name;
if (enclosing) {
name += enclosing->name();
@@ -1194,7 +1197,7 @@ AbstractMetaClass* AbstractMetaBuilderPrivate::traverseTypeDef(const FileModelIt
if (type->isObject())
static_cast<ObjectTypeEntry *>(type)->setQObject(isQObject(dom, stripTemplateArgs(typeDef->type().qualifiedName().join(colonColon()))));
- AbstractMetaClass *metaClass = q->createMetaClass();
+ AbstractMetaClass *metaClass = new AbstractMetaClass;
metaClass->setTypeDef(true);
metaClass->setTypeEntry(type);
metaClass->setBaseClassNames(QStringList() << typeDef->type().qualifiedName().join(colonColon()));
@@ -1253,9 +1256,20 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseClass(const FileModelItem
if (type->isObject())
((ObjectTypeEntry*)type)->setQObject(isQObject(dom, fullClassName));
- AbstractMetaClass *metaClass = q->createMetaClass();
+ AbstractMetaClass *metaClass = new AbstractMetaClass;
metaClass->setTypeEntry(type);
- metaClass->setBaseClassNames(classItem->baseClasses());
+
+ if (classItem->isFinal())
+ *metaClass += AbstractMetaAttributes::FinalCppClass;
+
+ QStringList baseClassNames;
+ const QVector<_ClassModelItem::BaseClass> &baseClasses = classItem->baseClasses();
+ for (const _ClassModelItem::BaseClass &baseClass : baseClasses) {
+ if (baseClass.accessPolicy == CodeModel::Public)
+ baseClassNames.append(baseClass.name);
+ }
+
+ metaClass->setBaseClassNames(baseClassNames);
*metaClass += AbstractMetaAttributes::Public;
if (type->stream())
metaClass->setStream(true);
@@ -1271,7 +1285,7 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseClass(const FileModelItem
}
TemplateParameterList template_parameters = classItem->templateParameters();
- QList<TypeEntry *> template_args;
+ QVector<TypeEntry *> template_args;
template_args.clear();
for (int i = 0; i < template_parameters.size(); ++i) {
const TemplateParameterModelItem &param = template_parameters.at(i);
@@ -1288,7 +1302,7 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseClass(const FileModelItem
// Inner classes
{
const ClassList &innerClasses = classItem->classes();
- foreach (const ClassModelItem &ci, innerClasses) {
+ for (const ClassModelItem &ci : innerClasses) {
AbstractMetaClass *cl = traverseClass(dom, ci);
if (cl) {
cl->setEnclosingClass(metaClass);
@@ -1302,7 +1316,7 @@ AbstractMetaClass *AbstractMetaBuilderPrivate::traverseClass(const FileModelItem
// Go through all typedefs to see if we have defined any
// specific typedefs to be used as classes.
const TypeDefList typeDefs = classItem->typeDefs();
- foreach (const TypeDefModelItem &typeDef, typeDefs) {
+ for (const TypeDefModelItem &typeDef : typeDefs) {
AbstractMetaClass *cls = traverseTypeDef(dom, typeDef);
if (cls) {
cls->setEnclosingClass(metaClass);
@@ -1329,7 +1343,7 @@ void AbstractMetaBuilderPrivate::traverseScopeMembers(ScopeModelItem item,
// Inner classes
const ClassList &innerClasses = item->classes();
- foreach (const ClassModelItem& ci, innerClasses)
+ for (const ClassModelItem& ci : innerClasses)
traverseClassMembers(ci);
}
@@ -1380,7 +1394,7 @@ void AbstractMetaBuilderPrivate::traverseNamespaceMembers(NamespaceModelItem ite
// Inner namespaces
const QSet<NamespaceModelItem> &innerNamespaces = item->uniqueNamespaces();
- foreach (const NamespaceModelItem &ni, innerNamespaces)
+ for (const NamespaceModelItem &ni : innerNamespaces)
traverseNamespaceMembers(ni);
m_currentClass = oldCurrentClass;
@@ -1410,14 +1424,15 @@ AbstractMetaField *AbstractMetaBuilderPrivate::traverseField(VariableModelItem f
if (field->accessPolicy() == CodeModel::Private)
return 0;
- if (TypeDatabase::instance()->isFieldRejected(className, fieldName)) {
- m_rejectedFields.insert(qualifiedFieldSignatureWithType(className, field),
+ QString rejectReason;
+ if (TypeDatabase::instance()->isFieldRejected(className, fieldName, &rejectReason)) {
+ m_rejectedFields.insert(qualifiedFieldSignatureWithType(className, field) + rejectReason,
AbstractMetaBuilder::GenerationDisabled);
return 0;
}
- AbstractMetaField *metaField = q->createMetaField();
+ AbstractMetaField *metaField = new AbstractMetaField;
metaField->setName(fieldName);
metaField->setEnclosingClass(cls);
@@ -1427,9 +1442,11 @@ AbstractMetaField *AbstractMetaBuilderPrivate::traverseField(VariableModelItem f
if (!metaType || !ok) {
const QString type = TypeInfo::resolveType(fieldType, currentScope()).qualifiedName().join(colonColon());
- qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("skipping field '%1::%2' with unmatched type '%3'")
- .arg(m_currentClass->name(), fieldName, type);
+ if (m_currentClass->typeEntry()->codeGeneration() & TypeEntry::GenerateTargetLang) {
+ qCWarning(lcShiboken).noquote().nospace()
+ << QStringLiteral("skipping field '%1::%2' with unmatched type '%3'")
+ .arg(m_currentClass->name(), fieldName, type);
+ }
delete metaField;
return 0;
}
@@ -1455,7 +1472,8 @@ AbstractMetaField *AbstractMetaBuilderPrivate::traverseField(VariableModelItem f
void AbstractMetaBuilderPrivate::traverseFields(ScopeModelItem scope_item,
AbstractMetaClass *metaClass)
{
- foreach (const VariableModelItem &field, scope_item->variables()) {
+ const VariableList &variables = scope_item->variables();
+ for (const VariableModelItem &field : variables) {
AbstractMetaField* metaField = traverseField(field, metaClass);
if (metaField && !metaField->isModifiedRemoved()) {
@@ -1478,11 +1496,6 @@ void AbstractMetaBuilderPrivate::setupFunctionDefaults(AbstractMetaFunction *met
if (metaFunction->name() == QLatin1String("operator_equal"))
metaClass->setHasEqualsOperator(true);
-
- if (!metaFunction->isFinalInTargetLang()
- && metaFunction->isRemovedFrom(metaClass, TypeSystem::TargetLangCode)) {
- *metaFunction += AbstractMetaAttributes::FinalInCpp;
- }
}
void AbstractMetaBuilderPrivate::fixReturnTypeOfConversionOperator(AbstractMetaFunction *metaFunction)
@@ -1491,7 +1504,9 @@ void AbstractMetaBuilderPrivate::fixReturnTypeOfConversionOperator(AbstractMetaF
return;
TypeDatabase* types = TypeDatabase::instance();
- QString castTo = metaFunction->name().remove(QRegExp(QLatin1String("^operator "))).trimmed();
+ static const QRegularExpression operatorRegExp(QStringLiteral("^operator "));
+ Q_ASSERT(operatorRegExp.isValid());
+ QString castTo = metaFunction->name().remove(operatorRegExp).trimmed();
if (castTo.endsWith(QLatin1Char('&')))
castTo.chop(1);
@@ -1502,7 +1517,7 @@ void AbstractMetaBuilderPrivate::fixReturnTypeOfConversionOperator(AbstractMetaF
if (!retType)
return;
- AbstractMetaType* metaType = q->createMetaType();
+ AbstractMetaType* metaType = new AbstractMetaType;
metaType->setTypeEntry(retType);
metaFunction->replaceType(metaType);
}
@@ -1542,7 +1557,7 @@ static bool _compareAbstractMetaFunctions(const AbstractMetaFunction* func, cons
// "QList(const QList &)" to "QList(const QList<T> &)".
static bool _fixFunctionModelItemTypes(FunctionModelItem& function, const AbstractMetaClass* metaClass)
{
- const QList<TypeEntry *> &templateTypes = metaClass->templateArguments();
+ const QVector<TypeEntry *> &templateTypes = metaClass->templateArguments();
if (templateTypes.isEmpty())
return false;
@@ -1577,14 +1592,18 @@ static bool _fixFunctionModelItemTypes(FunctionModelItem& function, const Abstra
return templateTypeFixed;
}
-AbstractMetaFunctionList AbstractMetaBuilderPrivate::classFunctionList(const ScopeModelItem &scopeItem)
+AbstractMetaFunctionList AbstractMetaBuilderPrivate::classFunctionList(const ScopeModelItem &scopeItem,
+ bool *constructorRejected)
{
+ *constructorRejected = false;
AbstractMetaFunctionList result;
const FunctionList &scopeFunctionList = scopeItem->functions();
result.reserve(scopeFunctionList.size());
- foreach (const FunctionModelItem &function, scopeItem->functions()) {
+ for (const FunctionModelItem &function : scopeFunctionList) {
if (AbstractMetaFunction *metaFunction = traverseFunction(function))
result.append(metaFunction);
+ else if (function->functionType() == CodeModel::Constructor)
+ *constructorRejected = true;
}
return result;
}
@@ -1613,15 +1632,17 @@ private:
};
AbstractMetaFunctionList AbstractMetaBuilderPrivate::templateClassFunctionList(const ScopeModelItem &scopeItem,
- AbstractMetaClass *metaClass)
+ AbstractMetaClass *metaClass,
+ bool *constructorRejected)
{
AbstractMetaFunctionList result;
AbstractMetaFunctionList unchangedFunctions;
+ *constructorRejected = false;
const FunctionList &scopeFunctionList = scopeItem->functions();
result.reserve(scopeFunctionList.size());
unchangedFunctions.reserve(scopeFunctionList.size());
- foreach (FunctionModelItem function, scopeItem->functions()) {
+ for (FunctionModelItem function : scopeFunctionList) {
// This fixes method's arguments and return types that are templates
// but the template variable wasn't declared in the C++ header.
const bool templateTypeFixed =_fixFunctionModelItemTypes(function, metaClass);
@@ -1629,11 +1650,13 @@ AbstractMetaFunctionList AbstractMetaBuilderPrivate::templateClassFunctionList(c
result.append(metaFunction);
if (!templateTypeFixed)
unchangedFunctions.append(metaFunction);
+ } else if (function->functionType() == CodeModel::Constructor) {
+ *constructorRejected = true;
}
}
- const AbstractMetaFunctionList::ConstIterator unchangedBegin = unchangedFunctions.begin();
- const AbstractMetaFunctionList::ConstIterator unchangedEnd = unchangedFunctions.end();
+ const AbstractMetaFunctionList::ConstIterator unchangedBegin = unchangedFunctions.cbegin();
+ const AbstractMetaFunctionList::ConstIterator unchangedEnd = unchangedFunctions.cend();
for (int i = result.size() - 1; i >= 0; --i) {
AbstractMetaFunction *function = result.at(i);
if (!unchangedFunctions.contains(function)
@@ -1647,12 +1670,15 @@ AbstractMetaFunctionList AbstractMetaBuilderPrivate::templateClassFunctionList(c
void AbstractMetaBuilderPrivate::traverseFunctions(ScopeModelItem scopeItem,
AbstractMetaClass *metaClass)
{
-
+ bool constructorRejected = false;
const AbstractMetaFunctionList functions = metaClass->templateArguments().isEmpty()
- ? classFunctionList(scopeItem)
- : templateClassFunctionList(scopeItem, metaClass);
+ ? classFunctionList(scopeItem, &constructorRejected)
+ : templateClassFunctionList(scopeItem, metaClass, &constructorRejected);
+
+ if (constructorRejected)
+ *metaClass += AbstractMetaAttributes::HasRejectedConstructor;
- foreach (AbstractMetaFunction *metaFunction, functions) {
+ for (AbstractMetaFunction *metaFunction : functions){
metaFunction->setOriginalAttributes(metaFunction->attributes());
if (metaClass->isNamespace())
*metaFunction += AbstractMetaAttributes::Static;
@@ -1680,24 +1706,26 @@ void AbstractMetaBuilderPrivate::traverseFunctions(ScopeModelItem scopeItem,
}
const bool isInvalidDestructor = metaFunction->isDestructor() && metaFunction->isPrivate();
- const bool isInvalidConstructor = metaFunction->isConstructor()
- && ((metaFunction->isPrivate() && metaFunction->functionType() == AbstractMetaFunction::ConstructorFunction)
- || metaFunction->isInvalid());
+ const bool isInvalidConstructor = metaFunction->functionType() == AbstractMetaFunction::ConstructorFunction
+ && metaFunction->isPrivate();
+ if (isInvalidConstructor)
+ metaClass->setHasPrivateConstructor(true);
if ((isInvalidDestructor || isInvalidConstructor)
&& !metaClass->hasNonPrivateConstructor()) {
- *metaClass += AbstractMetaAttributes::Final;
+ *metaClass += AbstractMetaAttributes::FinalInTargetLang;
} else if (metaFunction->isConstructor() && !metaFunction->isPrivate()) {
- *metaClass -= AbstractMetaAttributes::Final;
+ *metaClass -= AbstractMetaAttributes::FinalInTargetLang;
metaClass->setHasNonPrivateConstructor(true);
}
// Classes with virtual destructors should always have a shell class
// (since we aren't registering the destructors, we need this extra check)
- if (metaFunction->isDestructor() && !metaFunction->isFinal())
+ if (metaFunction->isDestructor() && metaFunction->isVirtual()
+ && metaFunction->visibility() != AbstractMetaAttributes::Private) {
metaClass->setForceShellClass(true);
+ }
if (!metaFunction->isDestructor()
- && !metaFunction->isInvalid()
&& !(metaFunction->isPrivate() && metaFunction->functionType() == AbstractMetaFunction::ConstructorFunction)) {
setupFunctionDefaults(metaFunction, metaClass);
@@ -1736,15 +1764,16 @@ void AbstractMetaBuilderPrivate::traverseFunctions(ScopeModelItem scopeItem,
void AbstractMetaBuilderPrivate::fillAddedFunctions(AbstractMetaClass *metaClass)
{
// Add the functions added by the typesystem
- foreach (const AddedFunction &addedFunc, metaClass->typeEntry()->addedFunctions())
+ const AddedFunctionList &addedFunctions = metaClass->typeEntry()->addedFunctions();
+ for (const AddedFunction &addedFunc : addedFunctions)
traverseFunction(addedFunc, metaClass);
}
void AbstractMetaBuilderPrivate::applyFunctionModifications(AbstractMetaFunction *func)
{
- FunctionModificationList mods = func->modifications(func->implementingClass());
+ const FunctionModificationList &mods = func->modifications(func->implementingClass());
AbstractMetaFunction& funcRef = *func;
- foreach (const FunctionModification &mod, mods) {
+ for (const FunctionModification &mod : mods) {
if (mod.isRenameModifier()) {
func->setOriginalName(func->name());
func->setName(mod.renamedTo());
@@ -1783,10 +1812,10 @@ bool AbstractMetaBuilderPrivate::setupInheritance(AbstractMetaClass *metaClass)
QStringList baseClasses = metaClass->baseClassNames();
// we only support our own containers and ONLY if there is only one baseclass
- if (baseClasses.size() == 1 && baseClasses.first().contains(QLatin1Char('<'))) {
+ if (baseClasses.size() == 1 && baseClasses.constFirst().contains(QLatin1Char('<'))) {
TypeParser::Info info;
ComplexTypeEntry* baseContainerType;
- AbstractMetaClass* templ = findTemplateClass(baseClasses.first(), metaClass, &info, &baseContainerType);
+ AbstractMetaClass* templ = findTemplateClass(baseClasses.constFirst(), metaClass, &info, &baseContainerType);
if (templ) {
setupInheritance(templ);
inheritTemplate(metaClass, templ, info);
@@ -1808,7 +1837,7 @@ bool AbstractMetaBuilderPrivate::setupInheritance(AbstractMetaClass *metaClass)
qCWarning(lcShiboken).noquote().nospace()
<< QStringLiteral("template baseclass '%1' of '%2' is not known")
- .arg(baseClasses.first(), metaClass->name());
+ .arg(baseClasses.constFirst(), metaClass->name());
return false;
}
@@ -1866,8 +1895,8 @@ bool AbstractMetaBuilderPrivate::setupInheritance(AbstractMetaClass *metaClass)
}
metaClass->addInterface(iface);
- AbstractMetaClassList interfaces = iface->interfaces();
- foreach (AbstractMetaClass* iface, interfaces)
+ const AbstractMetaClassList &interfaces = iface->interfaces();
+ for (AbstractMetaClass* iface : interfaces)
metaClass->addInterface(iface);
}
}
@@ -1879,8 +1908,8 @@ void AbstractMetaBuilderPrivate::traverseEnums(ScopeModelItem scopeItem,
AbstractMetaClass *metaClass,
const QStringList &enumsDeclarations)
{
- EnumList enums = scopeItem->enums();
- foreach (const EnumModelItem &enumItem, enums) {
+ const EnumList &enums = scopeItem->enums();
+ for (const EnumModelItem &enumItem : enums) {
AbstractMetaEnum* metaEnum = traverseEnum(enumItem, metaClass, QSet<QString>::fromList(enumsDeclarations));
if (metaEnum) {
metaClass->addEnum(metaEnum);
@@ -1897,7 +1926,7 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu
AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFunction& addedFunc,
AbstractMetaClass *metaClass)
{
- AbstractMetaFunction *metaFunction = q->createMetaFunction();
+ AbstractMetaFunction *metaFunction = new AbstractMetaFunction;
metaFunction->setConstant(addedFunc.isConstant());
metaFunction->setName(addedFunc.name());
metaFunction->setOriginalName(addedFunc.name());
@@ -1907,16 +1936,16 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu
metaFunction->setVisibility(visibility);
metaFunction->setUserAdded(true);
AbstractMetaAttributes::Attribute isStatic = addedFunc.isStatic() ? AbstractMetaFunction::Static : AbstractMetaFunction::None;
- metaFunction->setAttributes(metaFunction->attributes() | AbstractMetaAttributes::Final | isStatic);
+ metaFunction->setAttributes(metaFunction->attributes() | AbstractMetaAttributes::FinalInTargetLang | isStatic);
metaFunction->setType(translateType(addedFunc.version(), addedFunc.returnType()));
- QList<AddedFunction::TypeInfo> args = addedFunc.arguments();
+ QVector<AddedFunction::TypeInfo> args = addedFunc.arguments();
AbstractMetaArgumentList metaArguments;
for (int i = 0; i < args.count(); ++i) {
AddedFunction::TypeInfo& typeInfo = args[i];
- AbstractMetaArgument *metaArg = q->createMetaArgument();
+ AbstractMetaArgument *metaArg = new AbstractMetaArgument;
AbstractMetaType* type = translateType(addedFunc.version(), typeInfo);
decideUsagePattern(type);
metaArg->setType(type);
@@ -1969,7 +1998,8 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu
}
metaFunction->setOriginalAttributes(metaFunction->attributes());
- fixArgumentNames(metaFunction);
+ if (!metaArguments.isEmpty())
+ fixArgumentNames(metaFunction, metaFunction->modifications(m_currentClass));
if (metaClass) {
const AbstractMetaArgumentList fargs = metaFunction->arguments();
@@ -1978,7 +2008,7 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu
if (metaFunction->name() == metaClass->name()) {
metaFunction->setFunctionType(AbstractMetaFunction::ConstructorFunction);
if (fargs.size() == 1) {
- const TypeEntry *te = fargs.first()->type()->typeEntry();
+ const TypeEntry *te = fargs.constFirst()->type()->typeEntry();
if (te->isCustom())
metaFunction->setExplicit(true);
if (te->name() == metaFunction->name())
@@ -1997,12 +2027,10 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu
return metaFunction;
}
-void AbstractMetaBuilderPrivate::fixArgumentNames(AbstractMetaFunction *func)
+void AbstractMetaBuilderPrivate::fixArgumentNames(AbstractMetaFunction *func, const FunctionModificationList &mods)
{
- if (func->arguments().isEmpty())
- return;
- foreach (const FunctionModification &mod, func->modifications(m_currentClass)) {
- foreach (const ArgumentModification &argMod, mod.argument_mods) {
+ for (const FunctionModification &mod : mods) {
+ for (const ArgumentModification &argMod : mod.argument_mods) {
if (!argMod.renamed_to.isEmpty()) {
AbstractMetaArgument* arg = func->arguments().at(argMod.index - 1);
arg->setOriginalName(arg->name());
@@ -2011,62 +2039,158 @@ void AbstractMetaBuilderPrivate::fixArgumentNames(AbstractMetaFunction *func)
}
}
- int i = 1;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
- if (arg->name().isEmpty())
- arg->setName(QLatin1String("arg__") + QString::number(i), false);
- ++i;
+ AbstractMetaArgumentList arguments = func->arguments();
+ for (int i = 0, size = arguments.size(); i < size; ++i) {
+ if (arguments.at(i)->name().isEmpty())
+ arguments[i]->setName(QLatin1String("arg__") + QString::number(i + 1), false);
}
}
static QString functionSignature(FunctionModelItem functionItem)
{
QStringList args;
- foreach (const ArgumentModelItem &arg, functionItem->arguments())
+ const ArgumentList &arguments = functionItem->arguments();
+ for (const ArgumentModelItem &arg : arguments)
args << arg->type().toString();
return functionItem->name() + QLatin1Char('(') + args.join(QLatin1Char(',')) + QLatin1Char(')');
}
-static inline QString functionSignatureWithReturnType(FunctionModelItem functionItem)
+static inline QString qualifiedFunctionSignatureWithType(const FunctionModelItem &functionItem,
+ const QString &className = QString())
+{
+ QString result = functionItem->type().toString() + QLatin1Char(' ');
+ if (!className.isEmpty())
+ result += className + colonColon();
+ result += functionSignature(functionItem);
+ return result;
+}
+
+static inline QString msgUnmatchedParameterType(const ArgumentModelItem &arg, int n)
{
- return functionSignature(functionItem)
- + QStringLiteral(" -> ") + functionItem->type().toString();
+ QString result;
+ QTextStream str(&result);
+ str << "unmatched type '" << arg->type().toString() << "' in parameter #"
+ << (n + 1);
+ if (!arg->name().isEmpty())
+ str << " \"" << arg->name() << '"';
+ return result;
}
-static inline QString qualifiedFunctionSignatureWithType(const QString &className,
- FunctionModelItem functionItem)
+static inline QString msgVoidParameterType(const ArgumentModelItem &arg, int n)
{
- return className + colonColon() + functionSignatureWithReturnType(functionItem);
+ QString result;
+ QTextStream str(&result);
+ str << "'void' encountered at parameter #" << (n + 1);
+ if (!arg->name().isEmpty())
+ str << " \"" << arg->name() << '"';
+ return result;
+}
+
+static inline AbstractMetaFunction::FunctionType functionTypeFromCodeModel(CodeModel::FunctionType ft)
+{
+ AbstractMetaFunction::FunctionType result = AbstractMetaFunction::NormalFunction;
+ switch (ft) {
+ case CodeModel::Constructor:
+ result = AbstractMetaFunction::ConstructorFunction;
+ break;
+ case CodeModel::CopyConstructor:
+ result = AbstractMetaFunction::CopyConstructorFunction;
+ break;
+ case CodeModel::MoveConstructor:
+ result = AbstractMetaFunction::MoveConstructorFunction;
+ break;
+ case CodeModel::Destructor:
+ result = AbstractMetaFunction::DestructorFunction;
+ break;
+ case CodeModel::Normal:
+ break;
+ case CodeModel::Signal:
+ result = AbstractMetaFunction::SignalFunction;
+ break;
+ case CodeModel::Slot:
+ result = AbstractMetaFunction::SlotFunction;
+ break;
+ }
+ return result;
+}
+
+static inline QString msgCannotSetArrayUsage(const QString &function, int i, const QString &reason)
+{
+ return function + QLatin1String(": Cannot use parameter ") + QString::number(i + 1)
+ + QLatin1String(" as an array: ") + reason;
+}
+
+bool AbstractMetaBuilderPrivate::setArrayArgumentType(AbstractMetaFunction *func,
+ const FunctionModelItem &functionItem,
+ int i)
+{
+ if (i < 0 || i >= func->arguments().size()) {
+ qCWarning(lcShiboken).noquote()
+ << msgCannotSetArrayUsage(func->minimalSignature(), i,
+ QLatin1String("Index out of range."));
+ return false;
+ }
+ AbstractMetaType *metaType = func->arguments().at(i)->type();
+ if (metaType->indirections() == 0) {
+ qCWarning(lcShiboken).noquote()
+ << msgCannotSetArrayUsage(func->minimalSignature(), i,
+ QLatin1String("Type does not have indirections."));
+ return false;
+ }
+ TypeInfo elementType = functionItem->arguments().at(i)->type();
+ elementType.setIndirections(elementType.indirections() - 1);
+ bool ok;
+ AbstractMetaType *element = translateType(elementType, &ok);
+ if (element == nullptr || !ok) {
+ qCWarning(lcShiboken).noquote()
+ << msgCannotSetArrayUsage(func->minimalSignature(), i,
+ QLatin1String("Cannot translate element type ") + elementType.toString());
+ return false;
+ }
+ metaType->setArrayElementType(element);
+ metaType->setTypeUsagePattern(AbstractMetaType::NativePointerAsArrayPattern);
+ return true;
}
AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModelItem functionItem)
{
+ if (!functionItem->templateParameters().isEmpty())
+ return nullptr;
QString functionName = functionItem->name();
QString className;
- QString rejectedFunctionSignature;
- if (m_currentClass)
+ if (m_currentClass) {
+ // Clang: Skip qt_metacast(), qt_metacall(), expanded from Q_OBJECT
+ // and overridden metaObject(), QGADGET helpers
+ if (functionName == QLatin1String("qt_check_for_QGADGET_macro")
+ || functionName.startsWith(QLatin1String("qt_meta"))) {
+ return nullptr;
+ }
className = m_currentClass->typeEntry()->qualifiedCppName();
+ if (functionName == QLatin1String("metaObject") && className != QLatin1String("QObject"))
+ return nullptr;
+ }
+
+ // Store original signature with unresolved typedefs for message/log purposes
+ const QString originalQualifiedSignatureWithReturn =
+ qualifiedFunctionSignatureWithType(functionItem, className);
- if (TypeDatabase::instance()->isFunctionRejected(className, functionName)) {
- rejectedFunctionSignature = qualifiedFunctionSignatureWithType(className, functionItem);
- m_rejectedFunctions.insert(rejectedFunctionSignature, AbstractMetaBuilder::GenerationDisabled);
+ QString rejectReason;
+ if (TypeDatabase::instance()->isFunctionRejected(className, functionName, &rejectReason)) {
+ m_rejectedFunctions.insert(originalQualifiedSignatureWithReturn + rejectReason, AbstractMetaBuilder::GenerationDisabled);
return 0;
}
else if (TypeDatabase::instance()->isFunctionRejected(className,
- functionSignature(functionItem))) {
- rejectedFunctionSignature = qualifiedFunctionSignatureWithType(className, functionItem);
- m_rejectedFunctions.insert(rejectedFunctionSignature, AbstractMetaBuilder::GenerationDisabled);
+ functionSignature(functionItem), &rejectReason)) {
+ m_rejectedFunctions.insert(originalQualifiedSignatureWithReturn + rejectReason, AbstractMetaBuilder::GenerationDisabled);
return 0;
}
- Q_ASSERT(functionItem->functionType() == CodeModel::Normal
- || functionItem->functionType() == CodeModel::Signal
- || functionItem->functionType() == CodeModel::Slot);
-
if (functionItem->isFriend())
return 0;
- AbstractMetaFunction *metaFunction = q->createMetaFunction();
+ AbstractMetaFunction *metaFunction = new AbstractMetaFunction;
+ // Additional check for assignment/move assignment down below
+ metaFunction->setFunctionType(functionTypeFromCodeModel(functionItem->functionType()));
metaFunction->setConstant(functionItem->isConstant());
if (ReportHandler::isDebug(ReportHandler::MediumDebug))
@@ -2078,18 +2202,22 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel
if (functionItem->isAbstract())
*metaFunction += AbstractMetaAttributes::Abstract;
- if (!metaFunction->isAbstract())
- *metaFunction += AbstractMetaAttributes::Native;
-
- if (!functionItem->isVirtual())
- *metaFunction += AbstractMetaAttributes::Final;
+ if (functionItem->isVirtual()) {
+ *metaFunction += AbstractMetaAttributes::VirtualCppMethod;
+ if (functionItem->isOverride())
+ *metaFunction += AbstractMetaAttributes::OverriddenCppMethod;
+ if (functionItem->isFinal())
+ *metaFunction += AbstractMetaAttributes::FinalCppMethod;
+ } else {
+ *metaFunction += AbstractMetaAttributes::FinalInTargetLang;
+ }
if (functionItem->isInvokable())
*metaFunction += AbstractMetaAttributes::Invokable;
if (functionItem->isStatic()) {
*metaFunction += AbstractMetaAttributes::Static;
- *metaFunction += AbstractMetaAttributes::Final;
+ *metaFunction += AbstractMetaAttributes::FinalInTargetLang;
}
// Access rights
@@ -2100,43 +2228,39 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel
else
*metaFunction += AbstractMetaAttributes::Protected;
-
- QString strippedClassName = className;
- int cc_pos = strippedClassName.lastIndexOf(colonColon());
- if (cc_pos > 0)
- strippedClassName = strippedClassName.mid(cc_pos + 2);
-
- TypeInfo functionType = functionItem->type();
- if (functionName.startsWith(QLatin1Char('~'))) {
- metaFunction->setFunctionType(AbstractMetaFunction::DestructorFunction);
- metaFunction->setInvalid(true);
- } else if (stripTemplateArgs(functionName) == strippedClassName) {
- metaFunction->setFunctionType(AbstractMetaFunction::ConstructorFunction);
- // Check for Copy/Move down below
+ switch (metaFunction->functionType()) {
+ case AbstractMetaFunction::DestructorFunction:
+ break;
+ case AbstractMetaFunction::ConstructorFunction:
metaFunction->setExplicit(functionItem->isExplicit());
metaFunction->setName(m_currentClass->name());
- } else {
+ break;
+ default: {
+ TypeInfo returnType = functionItem->type();
+
+ if (TypeDatabase::instance()->isReturnTypeRejected(className, returnType.toString(), &rejectReason)) {
+ m_rejectedFunctions.insert(originalQualifiedSignatureWithReturn + rejectReason, AbstractMetaBuilder::GenerationDisabled);
+ delete metaFunction;
+ return nullptr;
+ }
+
bool ok;
- AbstractMetaType* type = translateType(functionType, &ok);
+ AbstractMetaType *type = translateType(returnType, &ok);
if (!ok) {
Q_ASSERT(type == 0);
qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("skipping function '%1::%2', unmatched return type '%3'")
- .arg(className, functionItem->name(),
+ << QStringLiteral("skipping function '%1', unmatched return type '%2'")
+ .arg(originalQualifiedSignatureWithReturn,
functionItem->type().toString());
- rejectedFunctionSignature = qualifiedFunctionSignatureWithType(className, functionItem);
- m_rejectedFunctions.insert(rejectedFunctionSignature, AbstractMetaBuilder::UnmatchedReturnType);
- metaFunction->setInvalid(true);
- return metaFunction;
+ m_rejectedFunctions.insert(originalQualifiedSignatureWithReturn, AbstractMetaBuilder::UnmatchedReturnType);
+ delete metaFunction;
+ return nullptr;
}
metaFunction->setType(type);
-
- if (functionItem->functionType() == CodeModel::Signal)
- metaFunction->setFunctionType(AbstractMetaFunction::SignalFunction);
- else if (functionItem->functionType() == CodeModel::Slot)
- metaFunction->setFunctionType(AbstractMetaFunction::SlotFunction);
+ }
+ break;
}
ArgumentList arguments = functionItem->arguments();
@@ -2144,7 +2268,7 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel
if (arguments.size() == 1) {
ArgumentModelItem arg = arguments.at(0);
TypeInfo type = arg->type();
- if (type.qualifiedName().first() == QLatin1String("void") && type.indirections() == 0)
+ if (type.qualifiedName().constFirst() == QLatin1String("void") && type.indirections() == 0)
arguments.pop_front();
}
@@ -2153,32 +2277,40 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel
for (int i = 0; i < arguments.size(); ++i) {
ArgumentModelItem arg = arguments.at(i);
+ if (TypeDatabase::instance()->isArgumentTypeRejected(className, arg->type().toString(), &rejectReason)) {
+ m_rejectedFunctions.insert(originalQualifiedSignatureWithReturn + rejectReason, AbstractMetaBuilder::GenerationDisabled);
+ delete metaFunction;
+ return nullptr;
+ }
+
bool ok;
AbstractMetaType* metaType = translateType(arg->type(), &ok);
if (!ok) {
Q_ASSERT(metaType == 0);
+ const QString reason = msgUnmatchedParameterType(arg, i);
qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("skipping function '%1::%2', unmatched parameter type '%3'")
- .arg(className, functionItem->name(), arg->type().toString());
- rejectedFunctionSignature = qualifiedFunctionSignatureWithType(className, functionItem);
+ << QStringLiteral("skipping function '%1', %2")
+ .arg(originalQualifiedSignatureWithReturn, reason);
+ const QString rejectedFunctionSignature = originalQualifiedSignatureWithReturn
+ + QLatin1String(": ") + reason;
m_rejectedFunctions.insert(rejectedFunctionSignature, AbstractMetaBuilder::UnmatchedArgumentType);
- metaFunction->setInvalid(true);
- return metaFunction;
+ delete metaFunction;
+ return nullptr;
}
if (metaType == Q_NULLPTR) {
+ const QString reason = msgVoidParameterType(arg, i);
qCWarning(lcShiboken).noquote().nospace()
- << QString::fromLatin1("skipping function '%1::%2', 'void' encountered at parameter "
- "position %3, but it can only be the the first and only "
- "parameter")
- .arg(className, functionItem->name()).arg(i);
- rejectedFunctionSignature = qualifiedFunctionSignatureWithType(className, functionItem);
+ << QString::fromLatin1("skipping function '%1': %2")
+ .arg(originalQualifiedSignatureWithReturn, reason);
+ const QString rejectedFunctionSignature = originalQualifiedSignatureWithReturn
+ + QLatin1String(": ") + reason;
m_rejectedFunctions.insert(rejectedFunctionSignature, AbstractMetaBuilder::UnmatchedArgumentType);
- metaFunction->setInvalid(true);
- return metaFunction;
+ delete metaFunction;
+ return nullptr;
}
- AbstractMetaArgument *metaArgument = q->createMetaArgument();
+ AbstractMetaArgument *metaArgument = new AbstractMetaArgument;
metaArgument->setType(metaType);
metaArgument->setName(arg->name());
@@ -2200,9 +2332,9 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel
} else {
FunctionModificationList mods = TypeDatabase::instance()->functionModifications(metaFunction->minimalSignature());
if (!mods.isEmpty()) {
- QList<ArgumentModification> argMods = mods.first().argument_mods;
+ QVector<ArgumentModification> argMods = mods.constFirst().argument_mods;
if (!argMods.isEmpty())
- replacedExpression = argMods.first().replacedDefaultExpression;
+ replacedExpression = argMods.constFirst().replacedDefaultExpression;
}
}
@@ -2238,26 +2370,22 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(FunctionModel
}
- fixArgumentNames(metaFunction);
+ if (!metaArguments.isEmpty()) {
+ const FunctionModificationList &mods = metaFunction->modifications(m_currentClass);
+ fixArgumentNames(metaFunction, mods);
+ for (const FunctionModification &mod : mods) {
+ for (const ArgumentModification &argMod : mod.argument_mods) {
+ if (argMod.array)
+ setArrayArgumentType(metaFunction, functionItem, argMod.index - 1);
+ }
+ }
+ }
// Determine class special functions
if (m_currentClass && metaFunction->arguments().size() == 1) {
- const AbstractMetaType *argType = metaFunction->arguments().first()->type();
+ const AbstractMetaType *argType = metaFunction->arguments().constFirst()->type();
if (argType->typeEntry() == m_currentClass->typeEntry() && argType->indirections() == 0) {
- if (metaFunction->isConstructor()) {
- switch (argType->referenceType()) {
- case NoReference:
- metaFunction->setFunctionType(AbstractMetaFunction::CopyConstructorFunction);
- break;
- case LValueReference:
- if (argType->isConstant())
- metaFunction->setFunctionType(AbstractMetaFunction::CopyConstructorFunction);
- break;
- case RValueReference:
- metaFunction->setFunctionType(AbstractMetaFunction::MoveConstructorFunction);
- break;
- }
- } else if (metaFunction->name() == QLatin1String("operator=")) {
+ if (metaFunction->name() == QLatin1String("operator=")) {
switch (argType->referenceType()) {
case NoReference:
metaFunction->setFunctionType(AbstractMetaFunction::AssignmentOperatorFunction);
@@ -2320,20 +2448,20 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(double vr,
msg += QLatin1String("Remember to inform the full qualified name for the type you want to use.\nCandidates are:\n");
candidates.sort();
- foreach (const QString& candidate, candidates) {
+ for (const QString& candidate : qAsConst(candidates)) {
msg += QLatin1String(" ") + candidate + QLatin1Char('\n');
}
qFatal(qPrintable(msg), NULL);
}
- AbstractMetaType *metaType = q->createMetaType();
+ AbstractMetaType *metaType = new AbstractMetaType;
metaType->setTypeEntry(type);
metaType->setIndirections(typeInfo.indirections);
if (typeInfo.isReference)
metaType->setReferenceType(LValueReference);
metaType->setConstant(typeInfo.isConstant);
if (isTemplate) {
- foreach (const QString& templateArg, templateArgs) {
+ for (const QString& templateArg : qAsConst(templateArgs)) {
AbstractMetaType* metaArgType = translateType(vr, AddedFunction::TypeInfo::fromSignature(templateArg));
metaType->addInstantiation(metaArgType);
}
@@ -2403,45 +2531,57 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typ
return 0;
}
- // 2. Handle pointers specified as arrays with unspecified size
- bool arrayOfUnspecifiedSize = false;
- if (typeInfo.arrays.size() > 0) {
- arrayOfUnspecifiedSize = true;
- for (int i = 0; i < typeInfo.arrays.size(); ++i)
- arrayOfUnspecifiedSize = arrayOfUnspecifiedSize && typeInfo.arrays.at(i).isEmpty();
-
- if (!arrayOfUnspecifiedSize) {
- TypeInfo newInfo;
- //newInfo.setArguments(typei.arguments());
- newInfo.setIndirections(typei.indirections());
- newInfo.setConstant(typei.isConstant());
- newInfo.setFunctionPointer(typei.isFunctionPointer());
- newInfo.setQualifiedName(typei.qualifiedName());
- newInfo.setReferenceType(typei.referenceType());
- newInfo.setVolatile(typei.isVolatile());
-
- AbstractMetaType* elementType = translateType(newInfo, ok);
- if (!(*ok))
- return 0;
+ // 2. Handle arrays.
+ // 2.1 Handle char arrays with unspecified size (aka "const char[]") as "const char*" with
+ // NativePointerPattern usage.
+ bool oneDimensionalArrayOfUnspecifiedSize =
+ typeInfo.arrays.size() == 1
+ && typeInfo.arrays[0].isEmpty();
+
+ bool isConstCharStarCase =
+ oneDimensionalArrayOfUnspecifiedSize
+ && typeInfo.qualified_name.size() == 1
+ && typeInfo.qualified_name[0] == QStringLiteral("char")
+ && typeInfo.indirections == 0
+ && typeInfo.is_constant == 1
+ && typeInfo.is_busted == 0
+ && typeInfo.referenceType == NoReference
+ && typeInfo.template_instantiations.size() == 0;
+
+ if (isConstCharStarCase)
+ typeInfo.indirections += typeInfo.arrays.size();
+
+ // 2.2 Handle regular arrays.
+ if (typeInfo.arrays.size() > 0 && !isConstCharStarCase) {
+ TypeInfo newInfo;
+ //newInfo.setArguments(typei.arguments());
+ newInfo.setIndirections(typei.indirections());
+ newInfo.setConstant(typei.isConstant());
+ newInfo.setFunctionPointer(typei.isFunctionPointer());
+ newInfo.setQualifiedName(typei.qualifiedName());
+ newInfo.setReferenceType(typei.referenceType());
+ newInfo.setVolatile(typei.isVolatile());
+
+ AbstractMetaType* elementType = translateType(newInfo, ok);
+ if (!(*ok))
+ return 0;
- for (int i = typeInfo.arrays.size() - 1; i >= 0; --i) {
- QString s = typeInfo.arrays.at(i);
+ for (int i = typeInfo.arrays.size() - 1; i >= 0; --i) {
+ AbstractMetaType *arrayType = new AbstractMetaType;
+ arrayType->setArrayElementType(elementType);
+ if (!typeInfo.arrays.at(i).isEmpty()) {
bool _ok;
- int elems = findOutValueFromString(s, _ok);
-
- AbstractMetaType *arrayType = q->createMetaType();
- arrayType->setArrayElementCount(elems);
- arrayType->setArrayElementType(elementType);
- arrayType->setTypeEntry(new ArrayTypeEntry(elementType->typeEntry() , elementType->typeEntry()->version()));
- decideUsagePattern(arrayType);
-
- elementType = arrayType;
+ const int elems = findOutValueFromString(typeInfo.arrays.at(i), _ok);
+ if (_ok)
+ arrayType->setArrayElementCount(elems);
}
+ arrayType->setTypeEntry(new ArrayTypeEntry(elementType->typeEntry() , elementType->typeEntry()->version()));
+ decideUsagePattern(arrayType);
- return elementType;
- } else {
- typeInfo.indirections += typeInfo.arrays.size();
+ elementType = arrayType;
}
+
+ return elementType;
}
QStringList qualifierList = typeInfo.qualified_name;
@@ -2472,7 +2612,8 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typ
// 5.1.1 - Try using the class parents' scopes
if (!type && !m_currentClass->baseClassNames().isEmpty()) {
- foreach (const AbstractMetaClass* cls, getBaseClasses(m_currentClass)) {
+ const AbstractMetaClassList &baseClasses = getBaseClasses(m_currentClass);
+ for (const AbstractMetaClass *cls : baseClasses) {
type = findTypeEntryUsingContext(cls, qualifiedName);
if (type)
break;
@@ -2495,8 +2636,8 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typ
// 8. No? Check if the current class is a template and this type is one
// of the parameters.
if (!type && m_currentClass) {
- QList<TypeEntry *> template_args = m_currentClass->templateArguments();
- foreach (TypeEntry *te, template_args) {
+ const QVector<TypeEntry *> &template_args = m_currentClass->templateArguments();
+ for (TypeEntry *te : template_args) {
if (te->name() == qualifiedName)
type = te;
}
@@ -2537,14 +2678,14 @@ AbstractMetaType *AbstractMetaBuilderPrivate::translateType(const TypeInfo &_typ
// These are only implicit and should not appear in code...
Q_ASSERT(!type->isInterface());
- AbstractMetaType *metaType = q->createMetaType();
+ AbstractMetaType *metaType = new AbstractMetaType;
metaType->setTypeEntry(type);
metaType->setIndirections(typeInfo.indirections);
metaType->setReferenceType(typeInfo.referenceType);
metaType->setConstant(typeInfo.is_constant);
metaType->setOriginalTypeDescription(_typei.toString());
- foreach (const TypeParser::Info &ta, typeInfo.template_instantiations) {
+ for (const TypeParser::Info &ta : qAsConst(typeInfo.template_instantiations)) {
TypeInfo info;
info.setConstant(ta.is_constant);
info.setReferenceType(ta.referenceType);
@@ -2585,8 +2726,9 @@ int AbstractMetaBuilderPrivate::findOutValueFromString(const QString &stringValu
// This is a very lame way to handle expression evaluation,
// but it is not critical and will do for the time being.
- static QRegExp variableNameRegExp(QLatin1String("^[a-zA-Z_][a-zA-Z0-9_]*$"));
- if (!variableNameRegExp.exactMatch(stringValue)) {
+ static const QRegularExpression variableNameRegExp(QStringLiteral("^[a-zA-Z_][a-zA-Z0-9_]*$"));
+ Q_ASSERT(variableNameRegExp.isValid());
+ if (!variableNameRegExp.match(stringValue).hasMatch()) {
ok = true;
return 0;
}
@@ -2597,12 +2739,10 @@ int AbstractMetaBuilderPrivate::findOutValueFromString(const QString &stringValu
return enumValue->value();
}
- foreach (AbstractMetaEnum* metaEnum, m_globalEnums) {
- foreach (AbstractMetaEnumValue* ev, metaEnum->values()) {
- if (ev->name() == stringValue) {
- ok = true;
- return ev->value();
- }
+ for (AbstractMetaEnum *metaEnum : qAsConst(m_globalEnums)) {
+ if (const AbstractMetaEnumValue *ev = metaEnum->findEnumValue(stringValue)) {
+ ok = true;
+ return ev->value();
}
}
@@ -2647,23 +2787,28 @@ QString AbstractMetaBuilderPrivate::fixDefaultValue(ArgumentModelItem item,
if (!isNumber && expr.indexOf(colonColon()) < 0) {
// Add the enum/flag scope to default value, making it usable
// from other contexts beside its owner class hierarchy
- QRegExp typeRegEx(QLatin1String("[^<]*[<]([^:]*::).*"));
- typeRegEx.indexIn(type->minimalSignature());
- expr = typeRegEx.cap(1) + expr;
+ static const QRegularExpression typeRegEx(QStringLiteral("[^<]*[<]([^:]*::).*"));
+ Q_ASSERT(typeRegEx.isValid());
+ const QRegularExpressionMatch match = typeRegEx.match(type->minimalSignature());
+ if (match.hasMatch())
+ expr.prepend(match.captured(1));
}
} else if (type->isContainer() && expr.contains(QLatin1Char('<'))) {
- QRegExp typeRegEx(QLatin1String("[^<]*<(.*)>"));
- typeRegEx.indexIn(type->minimalSignature());
- QRegExp defaultRegEx(QLatin1String("([^<]*<).*(>[^>]*)"));
- defaultRegEx.indexIn(expr);
- expr = defaultRegEx.cap(1) + typeRegEx.cap(1) + defaultRegEx.cap(2);
+ static const QRegularExpression typeRegEx(QStringLiteral("[^<]*<(.*)>"));
+ Q_ASSERT(typeRegEx.isValid());
+ const QRegularExpressionMatch typeMatch = typeRegEx.match(type->minimalSignature());
+ static const QRegularExpression defaultRegEx(QLatin1String("([^<]*<).*(>[^>]*)"));
+ Q_ASSERT(defaultRegEx.isValid());
+ const QRegularExpressionMatch defaultMatch = defaultRegEx.match(expr);
+ if (typeMatch.hasMatch() && defaultMatch.hasMatch())
+ expr = defaultMatch.captured(1) + typeMatch.captured(1) + defaultMatch.captured(2);
} else {
// Here the default value is supposed to be a constructor,
// a class field, or a constructor receiving a class field
- QRegExp defaultRegEx(QLatin1String("([^\\(]*\\(|)([^\\)]*)(\\)|)"));
- defaultRegEx.indexIn(expr);
-
- QString defaultValueCtorName = defaultRegEx.cap(1);
+ static const QRegularExpression defaultRegEx(QStringLiteral("([^\\(]*\\(|)([^\\)]*)(\\)|)"));
+ Q_ASSERT(defaultRegEx.isValid());
+ const QRegularExpressionMatch defaultMatch = defaultRegEx.match(expr);
+ QString defaultValueCtorName = defaultMatch.hasMatch() ? defaultMatch.captured(1) : QString();
if (defaultValueCtorName.endsWith(QLatin1Char('(')))
defaultValueCtorName.chop(1);
@@ -2671,20 +2816,22 @@ QString AbstractMetaBuilderPrivate::fixDefaultValue(ArgumentModelItem item,
// resolved argument type as a reference.
// The following regular expression extracts any
// use of namespaces/scopes from the type string.
- QRegExp typeRegEx(QLatin1String("^(?:const[\\s]+|)([\\w:]*::|)([A-Za-z_]\\w*)\\s*[&\\*]?$"));
- typeRegEx.indexIn(type->minimalSignature());
+ static const QRegularExpression typeRegEx(QLatin1String("^(?:const[\\s]+|)([\\w:]*::|)([A-Za-z_]\\w*)\\s*[&\\*]?$"));
+ Q_ASSERT(typeRegEx.isValid());
+ const QRegularExpressionMatch typeMatch = typeRegEx.match(type->minimalSignature());
- QString typeNamespace = typeRegEx.cap(1);
- QString typeCtorName = typeRegEx.cap(2);
+ QString typeNamespace = typeMatch.hasMatch() ? typeMatch.captured(1) : QString();
+ QString typeCtorName = typeMatch.hasMatch() ? typeMatch.captured(2) : QString();
if (!typeNamespace.isEmpty() && defaultValueCtorName == typeCtorName)
expr.prepend(typeNamespace);
// Fix scope if the parameter is a field of the current class
if (implementingClass) {
- foreach (const AbstractMetaField* field, implementingClass->fields()) {
- if (defaultRegEx.cap(2) == field->name()) {
- expr = defaultRegEx.cap(1) + implementingClass->name()
- + colonColon() + defaultRegEx.cap(2) + defaultRegEx.cap(3);
+ const AbstractMetaFieldList &fields = implementingClass->fields();
+ for (const AbstractMetaField *field : fields) {
+ if (defaultMatch.hasMatch() && defaultMatch.captured(2) == field->name()) {
+ expr = defaultMatch.captured(1) + implementingClass->name()
+ + colonColon() + defaultMatch.captured(2) + defaultMatch.captured(3);
break;
}
}
@@ -2717,19 +2864,19 @@ bool AbstractMetaBuilderPrivate::isQObject(const FileModelItem &dom, const QStri
classItem = ns->findClass(names.at(names.size() - 1));
}
- bool isqobject = classItem && classItem->extendsClass(QLatin1String("QObject"));
+ if (classItem == nullptr)
+ return false;
- if (classItem && !isqobject) {
- QStringList baseClasses = classItem->baseClasses();
- for (int i = 0; i < baseClasses.count(); ++i) {
+ if (classItem->extendsClass(QLatin1String("QObject")))
+ return true;
- isqobject = isQObject(dom, baseClasses.at(i));
- if (isqobject)
- break;
- }
+ const QVector<_ClassModelItem::BaseClass> &baseClasses = classItem->baseClasses();
+ for (const _ClassModelItem::BaseClass &baseClass : baseClasses) {
+ if (isQObject(dom, baseClass.name))
+ return true;
}
- return isqobject;
+ return false;
}
@@ -2766,7 +2913,7 @@ AbstractMetaClass* AbstractMetaBuilderPrivate::findTemplateClass(const QString &
QString qualifiedName = info->qualified_name.join(colonColon());
AbstractMetaClass* templ = 0;
- foreach (AbstractMetaClass *c, m_templates) {
+ for (AbstractMetaClass *c : qAsConst(m_templates)) {
if (c->typeEntry()->name() == qualifiedName) {
templ = c;
break;
@@ -2789,7 +2936,8 @@ AbstractMetaClass* AbstractMetaBuilderPrivate::findTemplateClass(const QString &
AbstractMetaClassList AbstractMetaBuilderPrivate::getBaseClasses(const AbstractMetaClass *metaClass) const
{
AbstractMetaClassList baseClasses;
- foreach (const QString& parent, metaClass->baseClassNames()) {
+ const QStringList &baseClassNames = metaClass->baseClassNames();
+ for (const QString& parent : baseClassNames) {
AbstractMetaClass* cls = 0;
if (parent.contains(QLatin1Char('<')))
cls = findTemplateClass(parent, metaClass);
@@ -2806,14 +2954,15 @@ bool AbstractMetaBuilderPrivate::ancestorHasPrivateCopyConstructor(const Abstrac
{
if (metaClass->hasPrivateCopyConstructor())
return true;
- foreach (const AbstractMetaClass* cls, getBaseClasses(metaClass)) {
+ const AbstractMetaClassList &baseClasses = getBaseClasses(metaClass);
+ for (const AbstractMetaClass *cls : baseClasses) {
if (ancestorHasPrivateCopyConstructor(cls))
return true;
}
return false;
}
-AbstractMetaType* AbstractMetaBuilderPrivate::inheritTemplateType(const QList<AbstractMetaType *> &templateTypes,
+AbstractMetaType* AbstractMetaBuilderPrivate::inheritTemplateType(const QVector<AbstractMetaType *> &templateTypes,
const AbstractMetaType *metaType,
bool *ok)
{
@@ -2865,8 +3014,8 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
const AbstractMetaClass *templateClass,
const TypeParser::Info &info)
{
- QList<TypeParser::Info> targs = info.template_instantiations;
- QList<AbstractMetaType*> templateTypes;
+ QVector<TypeParser::Info> targs = info.template_instantiations;
+ QVector<AbstractMetaType *> templateTypes;
if (subclass->isTypeDef()) {
subclass->setHasCloneOperator(templateClass->hasCloneOperator());
@@ -2878,7 +3027,7 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
subclass->setHasVirtualDestructor(templateClass->hasVirtualDestructor());
}
- foreach (const TypeParser::Info &i, targs) {
+ for (const TypeParser::Info &i : qAsConst(targs)) {
QString typeName = i.qualified_name.join(colonColon());
QStringList possibleNames;
possibleNames << subclass->qualifiedCppName() + colonColon() + typeName;
@@ -2890,16 +3039,14 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
TypeDatabase* typeDb = TypeDatabase::instance();
TypeEntry* t = 0;
QString templateParamName;
- foreach (const QString &possibleName, possibleNames) {
+ for (const QString &possibleName : qAsConst(possibleNames)) {
t = typeDb->findType(possibleName);
- if (t) {
- QString templateParamName = possibleName;
+ if (t)
break;
- }
}
if (t) {
- AbstractMetaType *temporaryType = q->createMetaType();
+ AbstractMetaType *temporaryType = new AbstractMetaType;
temporaryType->setTypeEntry(t);
temporaryType->setConstant(i.is_constant);
temporaryType->setReferenceType(i.referenceType);
@@ -2914,7 +3061,8 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
}
AbstractMetaFunctionList funcs = subclass->functions();
- foreach (const AbstractMetaFunction* function, templateClass->functions()) {
+ const AbstractMetaFunctionList &templateClassFunctions = templateClass->functions();
+ for (const AbstractMetaFunction *function : templateClassFunctions) {
if (function->isModifiedRemoved(TypeSystem::All))
continue;
@@ -2929,7 +3077,8 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
continue;
}
- foreach (AbstractMetaArgument* argument, function->arguments()) {
+ const AbstractMetaArgumentList &arguments = function->arguments();
+ for (AbstractMetaArgument *argument : arguments) {
AbstractMetaType* atype = argument->type();
AbstractMetaArgument *arg = argument->copy();
@@ -2980,7 +3129,7 @@ bool AbstractMetaBuilderPrivate::inheritTemplate(AbstractMetaClass *subclass,
FunctionModificationList mods = function->modifications(templateClass);
for (int i = 0; i < mods.size(); ++i) {
FunctionModification mod = mods.at(i);
- mod.signature = f->minimalSignature();
+ mod.setSignature(f->minimalSignature());
// If we ever need it... Below is the code to do
// substitution of the template instantation type inside
@@ -3041,8 +3190,6 @@ void AbstractMetaBuilderPrivate::parseQ_Property(AbstractMetaClass *metaClass,
continue;
}
- QString typeName = scope + l.at(0);
-
QPropertySpec* spec = new QPropertySpec(type->typeEntry());
spec->setName(l.at(1));
spec->setIndex(i);
@@ -3068,7 +3215,7 @@ static AbstractMetaFunction* findCopyCtor(AbstractMetaClass* cls)
AbstractMetaFunctionList functions = cls->queryFunctions(AbstractMetaClass::Invisible);
functions << cls->queryFunctions(AbstractMetaClass::Visible);
- foreach (AbstractMetaFunction* f, functions) {
+ for (AbstractMetaFunction *f : qAsConst(functions)) {
const AbstractMetaFunction::FunctionType t = f->functionType();
if (t == AbstractMetaFunction::CopyConstructorFunction || t == AbstractMetaFunction::AssignmentOperatorFunction)
return f;
@@ -3088,11 +3235,11 @@ void AbstractMetaBuilderPrivate::setupClonable(AbstractMetaClass *cls)
QQueue<AbstractMetaClass*> baseClasses;
if (cls->baseClass())
baseClasses.enqueue(cls->baseClass());
- baseClasses << cls->interfaces();
+ baseClasses << cls->interfaces().toList();
while (!baseClasses.isEmpty()) {
AbstractMetaClass* currentClass = baseClasses.dequeue();
- baseClasses << currentClass->interfaces();
+ baseClasses << currentClass->interfaces().toList();
if (currentClass->baseClass())
baseClasses.enqueue(currentClass->baseClass());
@@ -3108,8 +3255,8 @@ void AbstractMetaBuilderPrivate::setupClonable(AbstractMetaClass *cls)
void AbstractMetaBuilderPrivate::setupExternalConversion(AbstractMetaClass *cls)
{
- AbstractMetaFunctionList convOps = cls->operatorOverloads(AbstractMetaClass::ConversionOp);
- foreach (AbstractMetaFunction* func, convOps) {
+ const AbstractMetaFunctionList &convOps = cls->operatorOverloads(AbstractMetaClass::ConversionOp);
+ for (AbstractMetaFunction *func : convOps) {
if (func->isModifiedRemoved())
continue;
AbstractMetaClass *metaClass = AbstractMetaClass::findClass(m_metaClasses, func->type()->typeEntry());
@@ -3117,7 +3264,8 @@ void AbstractMetaBuilderPrivate::setupExternalConversion(AbstractMetaClass *cls)
continue;
metaClass->addExternalConversionOperator(func);
}
- foreach (AbstractMetaClass* innerClass, cls->innerClasses())
+ const AbstractMetaClassList &innerClasses = cls->innerClasses();
+ for (AbstractMetaClass *innerClass : innerClasses)
setupExternalConversion(innerClass);
}
@@ -3197,7 +3345,7 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
const AbstractMetaClassList& classList = cppClass ? cppClass->innerClasses() : m_metaClasses;
int i = 0;
- foreach (AbstractMetaClass* clazz, classList) {
+ for (AbstractMetaClass *clazz : classList) {
if (map.contains(clazz->qualifiedCppName()))
continue;
map[clazz->qualifiedCppName()] = i;
@@ -3207,7 +3355,7 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
Graph graph(map.count());
- foreach (const Dependency &dep, additionalDependencies) {
+ for (const Dependency &dep : additionalDependencies) {
const int parentIndex = map.value(dep.parent, -1);
const int childIndex = map.value(dep.child, -1);
if (parentIndex >= 0 && childIndex >= 0) {
@@ -3220,14 +3368,16 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
}
// TODO choose a better name to these regexs
- QRegExp regex1(QLatin1String("\\(.*\\)"));
- QRegExp regex2(QLatin1String("::.*"));
- foreach (AbstractMetaClass* clazz, classList) {
+ static const QRegularExpression regex1(QStringLiteral("\\(.*\\)"));
+ Q_ASSERT(regex1.isValid());
+ static const QRegularExpression regex2(QStringLiteral("::.*"));
+ Q_ASSERT(regex2.isValid());
+ for (AbstractMetaClass *clazz : classList) {
if (clazz->enclosingClass() && map.contains(clazz->enclosingClass()->qualifiedCppName()))
graph.addEdge(map[clazz->enclosingClass()->qualifiedCppName()], map[clazz->qualifiedCppName()]);
- AbstractMetaClassList bases = getBaseClasses(clazz);
- foreach(AbstractMetaClass* baseClass, bases) {
+ const AbstractMetaClassList &bases = getBaseClasses(clazz);
+ for (AbstractMetaClass *baseClass : bases) {
// Fix polymorphic expression
if (clazz->baseClass() == baseClass)
clazz->setBaseClass(baseClass);
@@ -3236,8 +3386,10 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
graph.addEdge(map[baseClass->qualifiedCppName()], map[clazz->qualifiedCppName()]);
}
- foreach (AbstractMetaFunction* func, clazz->functions()) {
- foreach (AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaFunctionList &functions = clazz->functions();
+ for (AbstractMetaFunction *func : functions) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
// check methods with default args
QString defaultExpression = arg->originalDefaultValueExpression();
if (!defaultExpression.isEmpty()) {
@@ -3251,7 +3403,7 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
QString exprClassName = clazz->qualifiedCppName() + colonColon() + defaultExpression;
if (!map.contains(exprClassName)) {
bool found = false;
- foreach(AbstractMetaClass* baseClass, bases) {
+ for (AbstractMetaClass *baseClass : bases) {
exprClassName = baseClass->qualifiedCppName() + colonColon() + defaultExpression;
if (map.contains(exprClassName)) {
found = true;
@@ -3287,7 +3439,7 @@ AbstractMetaClassList AbstractMetaBuilderPrivate::classesTopologicalSorted(const
<< "Cyclic dependency found! Graph can be found at "
<< QDir::toNativeSeparators(tempFile.fileName());
} else {
- foreach (int i, unmappedResult) {
+ for (int i : qAsConst(unmappedResult)) {
Q_ASSERT(reverseMap.contains(i));
if (!reverseMap[i]->isInterface())
result << reverseMap[i];
@@ -3308,7 +3460,7 @@ AbstractMetaArgumentList AbstractMetaBuilderPrivate::reverseList(const AbstractM
AbstractMetaArgumentList ret;
int index = list.size();
- foreach (AbstractMetaArgument* arg, list) {
+ for (AbstractMetaArgument *arg : list) {
arg->setArgumentIndex(index);
ret.prepend(arg);
index--;
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder.h
index b4a36a1b6..33631d00f 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.h
@@ -71,7 +71,7 @@ public:
AbstractMetaClassList classesTopologicalSorted(const AbstractMetaClass *cppClass = Q_NULLPTR,
const Dependencies &additionalDependencies = Dependencies()) const;
- bool build(QIODevice* input);
+ bool build(const QByteArrayList &arguments, unsigned clangFlags = 0);
void setLogDirectory(const QString& logDir);
/**
@@ -85,15 +85,6 @@ public:
void formatDebug(QDebug &d) const;
#endif
-protected:
- virtual AbstractMetaClass *createMetaClass();
- virtual AbstractMetaEnum *createMetaEnum();
- virtual AbstractMetaEnumValue *createMetaEnumValue();
- virtual AbstractMetaField *createMetaField();
- virtual AbstractMetaFunction *createMetaFunction();
- virtual AbstractMetaArgument *createMetaArgument();
- virtual AbstractMetaType *createMetaType();
-
private:
friend class AbstractMetaBuilderPrivate;
AbstractMetaBuilderPrivate *d;
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
index f9eb4bb46..9e15541f6 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
@@ -46,7 +46,7 @@ public:
AbstractMetaBuilderPrivate();
~AbstractMetaBuilderPrivate();
- static FileModelItem buildDom(QIODevice *input);
+ static FileModelItem buildDom(const QByteArrayList &arguments, unsigned clangFlags);
void traverseDom(const FileModelItem &dom);
void dumpLog() const;
@@ -56,7 +56,7 @@ public:
void pushScope(ScopeModelItem item) { m_scopes << item; }
- ScopeModelItem currentScope() const { return m_scopes.last(); }
+ ScopeModelItem currentScope() const { return m_scopes.constLast(); }
AbstractMetaClass *argumentToClass(ArgumentModelItem);
@@ -81,9 +81,11 @@ public:
const QSet<QString> &enumsDeclarations);
void traverseEnums(ScopeModelItem item, AbstractMetaClass *parent,
const QStringList &enumsDeclarations);
- AbstractMetaFunctionList classFunctionList(const ScopeModelItem &scopeItem);
+ AbstractMetaFunctionList classFunctionList(const ScopeModelItem &scopeItem,
+ bool *constructorRejected);
AbstractMetaFunctionList templateClassFunctionList(const ScopeModelItem &scopeItem,
- AbstractMetaClass *metaClass);
+ AbstractMetaClass *metaClass,
+ bool *constructorRejected);
void traverseFunctions(ScopeModelItem item, AbstractMetaClass *parent);
void applyFunctionModifications(AbstractMetaFunction* func);
void traverseFields(ScopeModelItem item, AbstractMetaClass *parent);
@@ -140,7 +142,7 @@ public:
bool inheritTemplate(AbstractMetaClass *subclass,
const AbstractMetaClass *templateClass,
const TypeParser::Info &info);
- AbstractMetaType *inheritTemplateType(const QList<AbstractMetaType *> &templateTypes,
+ AbstractMetaType *inheritTemplateType(const QVector<AbstractMetaType *> &templateTypes,
const AbstractMetaType *metaType,
bool *ok = Q_NULLPTR);
@@ -153,7 +155,10 @@ public:
void sortLists();
AbstractMetaArgumentList reverseList(const AbstractMetaArgumentList &list);
void setInclude(TypeEntry *te, const QString &fileName) const;
- void fixArgumentNames(AbstractMetaFunction *func);
+ void fixArgumentNames(AbstractMetaFunction *func, const FunctionModificationList &mods);
+ bool setArrayArgumentType(AbstractMetaFunction *func,
+ const FunctionModelItem &functionItem, int i);
+
void fillAddedFunctions(AbstractMetaClass *metaClass);
AbstractMetaBuilder *q;
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
index b861f1b2f..4e507cd38 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
@@ -26,8 +26,6 @@
**
****************************************************************************/
-#include <QStack>
-
#include "abstractmetalang.h"
#include "reporthandler.h"
#include "typedatabase.h"
@@ -38,6 +36,9 @@
# include <QtCore/QMetaObject>
#endif
+#include <QtCore/QRegularExpression>
+#include <QtCore/QStack>
+
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug d, const AbstractMetaAttributes *aa)
{
@@ -58,7 +59,14 @@ QDebug operator<<(QDebug d, const AbstractMetaAttributes *aa)
* AbstractMetaVariable
*/
-AbstractMetaVariable::AbstractMetaVariable(const AbstractMetaVariable &other)
+AbstractMetaVariable::AbstractMetaVariable() = default;
+
+AbstractMetaVariable::~AbstractMetaVariable()
+{
+ delete m_type;
+}
+
+void AbstractMetaVariable::assignMetaVariable(const AbstractMetaVariable &other)
{
m_originalName = other.m_originalName;
m_name = other.m_name;
@@ -85,20 +93,28 @@ QDebug operator<<(QDebug d, const AbstractMetaVariable *av)
#endif // !QT_NO_DEBUG_STREAM
/*******************************************************************************
+ * AbstractMetaAttributes
+ */
+
+AbstractMetaAttributes::AbstractMetaAttributes() = default;
+AbstractMetaAttributes::~AbstractMetaAttributes() = default;
+
+void AbstractMetaAttributes::assignMetaAttributes(const AbstractMetaAttributes &other)
+{
+ m_attributes = other.m_attributes;
+ m_originalAttributes = other.m_originalAttributes;
+ m_doc = other.m_doc;
+}
+
+/*******************************************************************************
* AbstractMetaType
*/
-AbstractMetaType::AbstractMetaType()
- :m_typeEntry(0),
- m_arrayElementCount(0),
- m_arrayElementType(0),
- m_originalTemplateType(0),
- m_pattern(InvalidPattern),
+AbstractMetaType::AbstractMetaType() :
m_constant(false),
m_cppInstantiation(true),
m_indirections(0),
- m_reserved(0),
- m_referenceType(NoReference)
+ m_reserved(0)
{
}
@@ -113,11 +129,18 @@ QString AbstractMetaType::package() const
return m_typeEntry->targetLangPackage();
}
+static QString lastNameSegment(QString name)
+{
+ const int index = name.lastIndexOf(QStringLiteral("::"));
+ if (index >= 0)
+ name.remove(0, index + 2);
+ return name;
+}
+
QString AbstractMetaType::name() const
{
if (m_name.isNull())
- // avoid constLast to stay Qt 5.5 compatible
- m_name = m_typeEntry->targetLangName().split(QLatin1String("::")).last();
+ m_name = lastNameSegment(m_typeEntry->targetLangName());
return m_name;
}
@@ -146,41 +169,30 @@ AbstractMetaType *AbstractMetaType::copy() const
return cpy;
}
-QString AbstractMetaType::cppSignature() const
+AbstractMetaTypeCList AbstractMetaType::nestedArrayTypes() const
{
- if (m_cachedCppSignature.isEmpty()) {
- if (isConstant())
- m_cachedCppSignature += QLatin1String("const ");
-
- m_cachedCppSignature += typeEntry()->qualifiedCppName();
-
- if (hasInstantiationInCpp()) {
- AbstractMetaTypeList types = instantiations();
- m_cachedCppSignature += QLatin1Char('<');
- for (int i = 0; i < types.count(); ++i) {
- if (i > 0)
- m_cachedCppSignature += QLatin1String(", ");
- m_cachedCppSignature += types[i]->cppSignature();
- }
- m_cachedCppSignature += QLatin1String(" >");
- }
-
- if (indirections() || m_referenceType != NoReference) {
- m_cachedCppSignature += QLatin1Char(' ');
- if (indirections())
- m_cachedCppSignature += QString(indirections(), QLatin1Char('*'));
- switch (referenceType()) {
- case NoReference:
- break;
- case LValueReference:
- m_cachedCppSignature += QLatin1Char('&');
- break;
- case RValueReference:
- m_cachedCppSignature += QLatin1String("&&");
- break;
- }
+ AbstractMetaTypeCList result;
+ switch (m_pattern) {
+ case ArrayPattern:
+ for (const AbstractMetaType *t = this; t->typeUsagePattern() == ArrayPattern; ) {
+ const AbstractMetaType *elt = t->arrayElementType();
+ result.append(elt);
+ t = elt;
}
+ break;
+ case NativePointerAsArrayPattern:
+ result.append(m_arrayElementType);
+ break;
+ default:
+ break;
}
+ return result;
+}
+
+QString AbstractMetaType::cppSignature() const
+{
+ if (m_cachedCppSignature.isEmpty())
+ m_cachedCppSignature = formatSignature(false);
return m_cachedCppSignature;
}
@@ -200,30 +212,6 @@ AbstractMetaType::TypeUsagePattern AbstractMetaType::determineUsagePattern() con
if (m_typeEntry->isVarargs())
return VarargsPattern;
- if (m_typeEntry->isString() && indirections() == 0
- && (isConstant() == (m_referenceType == LValueReference)
- || isConstant())) {
- return StringPattern;
- }
-
- if (m_typeEntry->isChar()
- && indirections() == 0
- && isConstant() == (m_referenceType == LValueReference)) {
- return CharPattern;
- }
-
- if (m_typeEntry->isJObjectWrapper()
- && indirections() == 0
- && isConstant() == (m_referenceType == LValueReference)) {
- return JObjectWrapperPattern;
- }
-
- if (m_typeEntry->isVariant()
- && indirections() == 0
- && isConstant() == (m_referenceType == LValueReference)) {
- return VariantPattern;
- }
-
if (m_typeEntry->isEnum() && actualIndirections() == 0)
return EnumPattern;
@@ -247,11 +235,6 @@ AbstractMetaType::TypeUsagePattern AbstractMetaType::determineUsagePattern() con
if (m_typeEntry->isArray())
return ArrayPattern;
- if (m_typeEntry->isThread()) {
- Q_ASSERT(indirections() == 1);
- return ThreadPattern;
- }
-
if (m_typeEntry->isValue())
return indirections() == 1 ? ValuePointerPattern : ValuePattern;
@@ -279,7 +262,7 @@ void AbstractMetaType::decideUsagePattern()
bool AbstractMetaType::hasTemplateChildren() const
{
QStack<AbstractMetaType *> children;
- children << m_children.toVector();
+ children << m_children;
// Recursively iterate over the children / descendants of the type, to check if any of them
// corresponds to a template argument type.
@@ -287,7 +270,7 @@ bool AbstractMetaType::hasTemplateChildren() const
AbstractMetaType *child = children.pop();
if (child->typeEntry()->isTemplateArgument())
return true;
- children << child->m_children.toVector();
+ children << child->m_children;
}
return false;
@@ -300,10 +283,26 @@ QDebug operator<<(QDebug d, const AbstractMetaType *at)
d.noquote();
d.nospace();
d << "AbstractMetaType(";
- if (at)
+ if (at) {
d << at->name();
- else
+ if (d.verbosity() > 2) {
+ d << ", typeEntry=" << at->typeEntry() << ", signature=\""
+ << at->cppSignature() << "\", pattern="
+ << at->typeUsagePattern();
+ if (at->indirections())
+ d << ", indirections=" << at->indirections();
+ if (at->referenceType())
+ d << ", reftype=" << at->referenceType();
+ if (at->isConstant())
+ d << ", [const]";
+ if (at->isArray()) {
+ d << ", array of \"" << at->arrayElementType()->cppSignature()
+ << "\", arrayElementCount=" << at->arrayElementCount();
+ }
+ }
+ } else {
d << '0';
+ }
d << ')';
return d;
}
@@ -312,9 +311,22 @@ QDebug operator<<(QDebug d, const AbstractMetaType *at)
/*******************************************************************************
* AbstractMetaArgument
*/
+
+AbstractMetaArgument::AbstractMetaArgument() = default;
+
+void AbstractMetaArgument::assignMetaArgument(const AbstractMetaArgument &other)
+{
+ assignMetaVariable(other);
+ m_expression = other.m_expression;
+ m_originalExpression = other.m_originalExpression;
+ m_argumentIndex = other.m_argumentIndex;
+}
+
AbstractMetaArgument *AbstractMetaArgument::copy() const
{
- return new AbstractMetaArgument(*this);
+ AbstractMetaArgument *copy = new AbstractMetaArgument;
+ copy->assignMetaArgument(*this);
+ return copy;
}
#ifndef QT_NO_DEBUG_STREAM
@@ -336,6 +348,17 @@ QDebug operator<<(QDebug d, const AbstractMetaArgument *aa)
/*******************************************************************************
* AbstractMetaFunction
*/
+
+AbstractMetaFunction::AbstractMetaFunction()
+ : m_constant(false),
+ m_reverse(false),
+ m_userAdded(false),
+ m_explicit(false),
+ m_pointerOperator(false),
+ m_isCallOperator(false)
+{
+}
+
AbstractMetaFunction::~AbstractMetaFunction()
{
qDeleteAll(m_arguments);
@@ -347,8 +370,8 @@ AbstractMetaFunction::~AbstractMetaFunction()
*/
bool AbstractMetaFunction::isModifiedRemoved(int types) const
{
- FunctionModificationList mods = modifications(implementingClass());
- foreach (const FunctionModification &mod, mods) {
+ const FunctionModificationList &mods = modifications(implementingClass());
+ for (const FunctionModification &mod : mods) {
if (!mod.isRemoveModifier())
continue;
@@ -359,64 +382,6 @@ bool AbstractMetaFunction::isModifiedRemoved(int types) const
return false;
}
-bool AbstractMetaFunction::needsCallThrough() const
-{
- if (ownerClass()->isInterface())
- return false;
- if (referenceCounts(implementingClass()).size() > 0)
- return true;
- if (argumentsHaveNativeId() || !isStatic())
- return true;
-
- foreach (const AbstractMetaArgument *arg, arguments()) {
- if (arg->type()->isArray() || arg->type()->isTargetLangEnum() || arg->type()->isTargetLangFlags())
- return true;
- }
-
- if (type() && (type()->isArray() || type()->isTargetLangEnum() || type()->isTargetLangFlags()))
- return true;
-
- for (int i = -1; i <= arguments().size(); ++i) {
- TypeSystem::Ownership owner = this->ownership(implementingClass(), TypeSystem::TargetLangCode, i);
- if (owner != TypeSystem::InvalidOwnership)
- return true;
- }
-
- return false;
-}
-
-bool AbstractMetaFunction::needsSuppressUncheckedWarning() const
-{
- for (int i = -1; i <= arguments().size(); ++i) {
- QList<ReferenceCount> referenceCounts = this->referenceCounts(implementingClass(), i);
- foreach (const ReferenceCount &referenceCount, referenceCounts) {
- if (referenceCount.action != ReferenceCount::Set)
- return true;
- }
- }
- return false;
-}
-
-QString AbstractMetaFunction::marshalledName() const
-{
- QString returned = QLatin1String("__qt_") + name();
- AbstractMetaArgumentList arguments = this->arguments();
- foreach (const AbstractMetaArgument *arg, arguments) {
- returned += QLatin1Char('_');
- if (arg->type()->isNativePointer()) {
- returned += QLatin1String("nativepointer");
- } else if (arg->type()->isIntegerEnum() || arg->type()->isIntegerFlags()) {
- returned += QLatin1String("int");
- } else {
- QString a = arg->type()->name();
- a.replace(QLatin1String("[]"), QLatin1String("_3"));
- a.replace(QLatin1Char('.'), QLatin1Char('_'));
- returned += a;
- }
- }
- return returned;
-}
-
bool AbstractMetaFunction::operator<(const AbstractMetaFunction &other) const
{
return compareTo(&other) & NameLessThan;
@@ -498,19 +463,18 @@ AbstractMetaFunction::CompareResult AbstractMetaFunction::compareTo(const Abstra
AbstractMetaFunction *AbstractMetaFunction::copy() const
{
AbstractMetaFunction *cpy = new AbstractMetaFunction;
+ cpy->assignMetaAttributes(*this);
cpy->setName(name());
cpy->setOriginalName(originalName());
cpy->setOwnerClass(ownerClass());
cpy->setImplementingClass(implementingClass());
cpy->setFunctionType(functionType());
- cpy->setAttributes(attributes());
cpy->setDeclaringClass(declaringClass());
if (type())
cpy->setType(type()->copy());
cpy->setConstant(isConstant());
- cpy->setOriginalAttributes(originalAttributes());
- foreach (AbstractMetaArgument *arg, arguments())
+ for (AbstractMetaArgument *arg : m_arguments)
cpy->addArgument(arg->copy());
Q_ASSERT((!type() && !cpy->type())
@@ -525,7 +489,7 @@ bool AbstractMetaFunction::usesRValueReferences() const
return true;
if (m_type && m_type->referenceType() == RValueReference)
return true;
- foreach (const AbstractMetaArgument *a, m_arguments) {
+ for (const AbstractMetaArgument *a : m_arguments) {
if (a->type()->referenceType() == RValueReference)
return true;
}
@@ -600,13 +564,13 @@ int AbstractMetaFunction::actualMinimumArgumentCount() const
}
// Returns reference counts for argument at idx, or all arguments if idx == -2
-QList<ReferenceCount> AbstractMetaFunction::referenceCounts(const AbstractMetaClass *cls, int idx) const
+QVector<ReferenceCount> AbstractMetaFunction::referenceCounts(const AbstractMetaClass *cls, int idx) const
{
- QList<ReferenceCount> returned;
+ QVector<ReferenceCount> returned;
- FunctionModificationList mods = this->modifications(cls);
- foreach (const FunctionModification &mod, mods) {
- foreach (const ArgumentModification &argumentMod, mod.argument_mods) {
+ const FunctionModificationList &mods = this->modifications(cls);
+ for (const FunctionModification &mod : mods) {
+ for (const ArgumentModification &argumentMod : mod.argument_mods) {
if (argumentMod.index != idx && idx != -2)
continue;
returned += argumentMod.referenceCounts;
@@ -619,9 +583,9 @@ QList<ReferenceCount> AbstractMetaFunction::referenceCounts(const AbstractMetaCl
ArgumentOwner AbstractMetaFunction::argumentOwner(const AbstractMetaClass *cls, int idx) const
{
- FunctionModificationList mods = this->modifications(cls);
- foreach (const FunctionModification &mod, mods) {
- foreach (const ArgumentModification &argumentMod, mod.argument_mods) {
+ const FunctionModificationList &mods = this->modifications(cls);
+ for (const FunctionModification &mod : mods) {
+ for (const ArgumentModification &argumentMod : mod.argument_mods) {
if (argumentMod.index != idx)
continue;
return argumentMod.owner;
@@ -633,9 +597,9 @@ ArgumentOwner AbstractMetaFunction::argumentOwner(const AbstractMetaClass *cls,
QString AbstractMetaFunction::replacedDefaultExpression(const AbstractMetaClass *cls, int key) const
{
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(cls);
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index == key
&& !argumentModification.replacedDefaultExpression.isEmpty()) {
return argumentModification.replacedDefaultExpression;
@@ -648,9 +612,9 @@ QString AbstractMetaFunction::replacedDefaultExpression(const AbstractMetaClass
bool AbstractMetaFunction::removedDefaultExpression(const AbstractMetaClass *cls, int key) const
{
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(cls);
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index == key
&& argumentModification.removedDefaultExpression) {
return true;
@@ -661,77 +625,15 @@ bool AbstractMetaFunction::removedDefaultExpression(const AbstractMetaClass *cls
return false;
}
-bool AbstractMetaFunction::resetObjectAfterUse(int argumentIdx) const
-{
- const AbstractMetaClass *cls = declaringClass();
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
- if (argumentModification.index == argumentIdx && argumentModification.resetAfterUse)
- return true;
- }
- }
-
- return false;
-}
-
-QString AbstractMetaFunction::nullPointerDefaultValue(const AbstractMetaClass *mainClass, int argumentIdx) const
-{
- Q_ASSERT(nullPointersDisabled(mainClass, argumentIdx));
-
- const AbstractMetaClass *cls = mainClass;
- if (!cls)
- cls = implementingClass();
-
- do {
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
- if (argumentModification.index == argumentIdx
- && argumentModification.noNullPointers) {
- return argumentModification.nullPointerDefaultValue;
- }
- }
- }
- cls = cls->baseClass();
- } while (cls && !mainClass); // Once when mainClass, or once for all base classes of implementing class
-
- return QString();
-
-}
-
-bool AbstractMetaFunction::nullPointersDisabled(const AbstractMetaClass *mainClass, int argumentIdx) const
-{
- const AbstractMetaClass *cls = mainClass;
- if (!cls)
- cls = implementingClass();
-
- do {
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
- if (argumentModification.index == argumentIdx
- && argumentModification.noNullPointers) {
- return true;
- }
- }
- }
-
- cls = cls->baseClass();
- } while (cls && !mainClass); // Once when mainClass, or once for all base classes of implementing class
-
- return false;
-}
-
QString AbstractMetaFunction::conversionRule(TypeSystem::Language language, int key) const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index != key)
continue;
- foreach (const CodeSnip &snip, argumentModification.conversion_rules) {
+ for (const CodeSnip &snip : argumentModification.conversion_rules) {
if (snip.language == language && !snip.code().isEmpty())
return snip.code();
}
@@ -743,9 +645,9 @@ QString AbstractMetaFunction::conversionRule(TypeSystem::Language language, int
QString AbstractMetaFunction::argumentReplaced(int key) const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index == key && !argumentModification.replace_value.isEmpty())
return argumentModification.replace_value;
}
@@ -757,9 +659,9 @@ QString AbstractMetaFunction::argumentReplaced(int key) const
// FIXME If we remove a arg. in the method at the base class, it will not reflect here.
bool AbstractMetaFunction::argumentRemoved(int key) const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index == key) {
if (argumentModification.removed)
return true;
@@ -772,8 +674,8 @@ bool AbstractMetaFunction::argumentRemoved(int key) const
bool AbstractMetaFunction::isVirtualSlot() const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
if (modification.isVirtualSlot())
return true;
}
@@ -781,51 +683,20 @@ bool AbstractMetaFunction::isVirtualSlot() const
return false;
}
-bool AbstractMetaFunction::disabledGarbageCollection(const AbstractMetaClass *cls, int key) const
-{
- typedef QHash<TypeSystem::Language, TypeSystem::Ownership>::const_iterator OwnershipMapIt;
-
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
- if (argumentModification.index != key)
- continue;
-
- for (OwnershipMapIt it = argumentModification.ownerships.cbegin(), end = argumentModification.ownerships.cend(); it != end; ++it) {
- if (it.value() == TypeSystem::CppOwnership)
- return true;
- }
-
- }
- }
-
- return false;
-}
-
bool AbstractMetaFunction::isDeprecated() const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
if (modification.isDeprecated())
return true;
}
return false;
}
-bool AbstractMetaFunction::isThread() const
-{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
- if (modification.isThread())
- return true;
- }
- return false;
-}
-
bool AbstractMetaFunction::allowThread() const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
if (modification.allowThread())
return true;
}
@@ -835,9 +706,9 @@ bool AbstractMetaFunction::allowThread() const
TypeSystem::Ownership AbstractMetaFunction::ownership(const AbstractMetaClass *cls, TypeSystem::Language language, int key) const
{
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(cls);
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index == key)
return argumentModification.ownerships.value(language, TypeSystem::InvalidOwnership);
}
@@ -853,8 +724,8 @@ bool AbstractMetaFunction::isRemovedFromAllLanguages(const AbstractMetaClass *cl
bool AbstractMetaFunction::isRemovedFrom(const AbstractMetaClass *cls, TypeSystem::Language language) const
{
- FunctionModificationList modifications = this->modifications(cls);
- foreach (const FunctionModification &modification, modifications) {
+ const FunctionModificationList &modifications = this->modifications(cls);
+ for (const FunctionModification &modification : modifications) {
if ((modification.removal & language) == language)
return true;
}
@@ -865,9 +736,9 @@ bool AbstractMetaFunction::isRemovedFrom(const AbstractMetaClass *cls, TypeSyste
QString AbstractMetaFunction::typeReplaced(int key) const
{
- FunctionModificationList modifications = this->modifications(declaringClass());
- foreach (const FunctionModification &modification, modifications) {
- foreach (const ArgumentModification &argumentModification, modification.argument_mods) {
+ const FunctionModificationList &modifications = this->modifications(declaringClass());
+ for (const FunctionModification &modification : modifications) {
+ for (const ArgumentModification &argumentModification : modification.argument_mods) {
if (argumentModification.index == key
&& !argumentModification.modified_type.isEmpty()) {
return argumentModification.modified_type;
@@ -909,6 +780,21 @@ QString AbstractMetaFunction::minimalSignature() const
return minimalSignature;
}
+QString AbstractMetaFunction::debugSignature() const
+{
+ QString result;
+ const bool isOverride = attributes() & AbstractMetaFunction::OverriddenCppMethod;
+ const bool isFinal = attributes() & AbstractMetaFunction::FinalCppMethod;
+ if (!isOverride && !isFinal && (attributes() & AbstractMetaFunction::VirtualCppMethod))
+ result += QLatin1String("virtual ");
+ result += minimalSignature();
+ if (isOverride)
+ result += QLatin1String(" override");
+ if (isFinal)
+ result += QLatin1String(" final");
+ return result;
+}
+
FunctionModificationList AbstractMetaFunction::modifications(const AbstractMetaClass* implementor) const
{
if (!implementor)
@@ -923,19 +809,14 @@ FunctionModificationList AbstractMetaFunction::modifications(const AbstractMetaC
if ((implementor == implementor->baseClass()) ||
(implementor == implementingClass() && (mods.size() > 0)))
break;
- foreach (const AbstractMetaClass* interface, implementor->interfaces()) {
+ const AbstractMetaClassList &interfaces = implementor->interfaces();
+ for (const AbstractMetaClass *interface : interfaces)
mods += this->modifications(interface);
- }
implementor = implementor->baseClass();
}
return mods;
}
-bool AbstractMetaFunction::hasModifications(const AbstractMetaClass *implementor) const
-{
- return !modifications(implementor).isEmpty();
-}
-
QString AbstractMetaFunction::argumentName(int index,
bool /* create */,
const AbstractMetaClass * /* implementor */) const
@@ -950,7 +831,8 @@ bool AbstractMetaFunction::isCallOperator() const
bool AbstractMetaFunction::hasInjectedCode() const
{
- foreach (const FunctionModification &mod, modifications(ownerClass())) {
+ const FunctionModificationList &mods = modifications(ownerClass());
+ for (const FunctionModification &mod : mods) {
if (mod.isCodeInjection())
return true;
}
@@ -960,12 +842,12 @@ bool AbstractMetaFunction::hasInjectedCode() const
CodeSnipList AbstractMetaFunction::injectedCodeSnips(TypeSystem::CodeSnipPosition position, TypeSystem::Language language) const
{
CodeSnipList result;
- foreach (const FunctionModification &mod, modifications(ownerClass())) {
+ const FunctionModificationList &mods = modifications(ownerClass());
+ for (const FunctionModification &mod : mods) {
if (mod.isCodeInjection()) {
- QList<CodeSnip>::const_iterator it = mod.snips.constBegin();
- for (;it != mod.snips.constEnd(); ++it) {
- if ((it->language & language) && (it->position == position || position == TypeSystem::CodeSnipPositionAny))
- result << *it;
+ for (const CodeSnip &snip : mod.snips) {
+ if ((snip.language & language) && (snip.position == position || position == TypeSystem::CodeSnipPositionAny))
+ result << snip;
}
}
}
@@ -974,10 +856,11 @@ CodeSnipList AbstractMetaFunction::injectedCodeSnips(TypeSystem::CodeSnipPositio
bool AbstractMetaFunction::hasSignatureModifications() const
{
- foreach (const FunctionModification &mod, modifications()) {
+ const FunctionModificationList &mods = modifications();
+ for (const FunctionModification &mod : mods) {
if (mod.isRenameModifier())
return true;
- foreach (const ArgumentModification &argmod, mod.argument_mods) {
+ for (const ArgumentModification &argmod : mod.argument_mods) {
// since zero represents the return type and we're
// interested only in checking the function arguments,
// it will be ignored.
@@ -990,8 +873,9 @@ bool AbstractMetaFunction::hasSignatureModifications() const
bool AbstractMetaFunction::isConversionOperator(QString funcName)
{
- static QRegExp opRegEx(QLatin1String("^operator(?:\\s+(?:const|volatile))?\\s+(\\w+\\s*)&?$"));
- return opRegEx.indexIn(funcName) > -1;
+ static const QRegularExpression opRegEx(QStringLiteral("^operator(?:\\s+(?:const|volatile))?\\s+(\\w+\\s*)&?$"));
+ Q_ASSERT(opRegEx.isValid());
+ return opRegEx.match(funcName).hasMatch();
}
bool AbstractMetaFunction::isOperatorOverload(QString funcName)
@@ -999,12 +883,13 @@ bool AbstractMetaFunction::isOperatorOverload(QString funcName)
if (isConversionOperator(funcName))
return true;
- static QRegExp opRegEx(QLatin1String("^operator([+\\-\\*/%=&\\|\\^\\<>!][=]?"
+ static const QRegularExpression opRegEx(QLatin1String("^operator([+\\-\\*/%=&\\|\\^\\<>!][=]?"
"|\\+\\+|\\-\\-|&&|\\|\\||<<[=]?|>>[=]?|~"
"|\\[\\]|\\s+delete\\[?\\]?"
"|\\(\\)"
"|\\s+new\\[?\\]?)$"));
- return opRegEx.indexIn(funcName) > -1;
+ Q_ASSERT(opRegEx.isValid());
+ return opRegEx.match(funcName).hasMatch();
}
bool AbstractMetaFunction::isCastOperator() const
@@ -1127,14 +1012,14 @@ bool AbstractMetaFunction::isInplaceOperator() const
bool AbstractMetaFunction::isVirtual() const
{
- return !isFinal() && !isSignal() && !isStatic() && !isFinalInCpp() && !isConstructor();
+ return attributes() & AbstractMetaAttributes::VirtualCppMethod;
}
QString AbstractMetaFunction::modifiedName() const
{
if (m_cachedModifiedName.isEmpty()) {
- FunctionModificationList mods = modifications(implementingClass());
- foreach (const FunctionModification &mod, mods) {
+ const FunctionModificationList &mods = modifications(implementingClass());
+ for (const FunctionModification &mod : mods) {
if (mod.isRenameModifier()) {
m_cachedModifiedName = mod.renamedToName;
break;
@@ -1146,46 +1031,6 @@ QString AbstractMetaFunction::modifiedName() const
return m_cachedModifiedName;
}
-QString AbstractMetaFunction::targetLangSignature(bool minimal) const
-{
- QString s;
-
- // Attributes...
- if (!minimal) {
- // Return type
- if (type())
- s += type()->name() + QLatin1Char(' ');
- else
- s += QLatin1String("void ");
- }
-
- s += modifiedName();
- s += QLatin1Char('(');
-
- int j = 0;
- for (int i = 0; i < m_arguments.size(); ++i) {
- if (argumentRemoved(i + 1))
- continue;
- if (j) {
- s += QLatin1Char(',');
- if (!minimal)
- s += QLatin1Char(' ');
- }
- s += m_arguments.at(i)->type()->name();
-
- if (!minimal) {
- s += QLatin1Char(' ');
- s += m_arguments.at(i)->name();
- }
- ++j;
- }
-
- s += QLatin1Char(')');
-
- return s;
-}
-
-
bool function_sorter(AbstractMetaFunction *a, AbstractMetaFunction *b)
{
return a->signature() < b->signature();
@@ -1194,7 +1039,7 @@ bool function_sorter(AbstractMetaFunction *a, AbstractMetaFunction *b)
#ifndef QT_NO_DEBUG_STREAM
static inline void formatMetaFunctionBrief(QDebug &d, const AbstractMetaFunction *af)
{
- d << '"' << af->minimalSignature() << '"';
+ d << '"' << af->debugSignature() << '"';
}
void AbstractMetaFunction::formatDebugVerbose(QDebug &d) const
@@ -1208,8 +1053,6 @@ void AbstractMetaFunction::formatDebugVerbose(QDebug &d) const
d << "), signature=\"" << minimalSignature() << '"';
if (m_constant)
d << " [const]";
- if (m_invalid)
- d << " [invalid]";
if (m_reverse)
d << " [reverse]";
if (m_userAdded)
@@ -1256,15 +1099,34 @@ QDebug operator<<(QDebug d, const AbstractMetaFunction *af)
/*******************************************************************************
* AbstractMetaClass
*/
+
+AbstractMetaClass::AbstractMetaClass()
+ : m_hasVirtuals(false),
+ m_isPolymorphic(false),
+ m_hasNonpublic(false),
+ m_hasVirtualSlots(false),
+ m_hasNonPrivateConstructor(false),
+ m_hasPrivateConstructor(false),
+ m_functionsFixed(false),
+ m_hasPrivateDestructor(false),
+ m_hasProtectedDestructor(false),
+ m_hasVirtualDestructor(false),
+ m_forceShellClass(false),
+ m_hasHashFunction(false),
+ m_hasEqualsOperator(false),
+ m_hasCloneOperator(false),
+ m_isTypeDef(false),
+ m_hasToStringCapability(false)
+{
+}
+
AbstractMetaClass::~AbstractMetaClass()
{
qDeleteAll(m_functions);
qDeleteAll(m_fields);
qDeleteAll(m_enums);
- if (hasTemplateBaseClassInstantiations()) {
- foreach (AbstractMetaType* inst, templateBaseClassInstantiations())
- delete inst;
- }
+ if (hasTemplateBaseClassInstantiations())
+ qDeleteAll(templateBaseClassInstantiations());
}
/*******************************************************************************
@@ -1300,7 +1162,7 @@ AbstractMetaClass *AbstractMetaClass::extractInterface()
iface->setTypeEntry(typeEntry()->designatedInterface());
- foreach (AbstractMetaFunction *function, functions()) {
+ for (AbstractMetaFunction *function : qAsConst(m_functions)) {
if (!function->isConstructor())
iface->addFunction(function->copy());
}
@@ -1308,7 +1170,7 @@ AbstractMetaClass *AbstractMetaClass::extractInterface()
// iface->setEnums(enums());
// setEnums(AbstractMetaEnumList());
- foreach (const AbstractMetaField *field, fields()) {
+ for (const AbstractMetaField *field : qAsConst(m_fields)) {
if (field->isPublic()) {
AbstractMetaField *new_field = field->copy();
new_field->setEnclosingClass(iface);
@@ -1329,8 +1191,7 @@ AbstractMetaClass *AbstractMetaClass::extractInterface()
AbstractMetaFunctionList AbstractMetaClass::queryFunctionsByName(const QString &name) const
{
AbstractMetaFunctionList returned;
- AbstractMetaFunctionList functions = this->functions();
- foreach (AbstractMetaFunction *function, functions) {
+ for (AbstractMetaFunction *function : m_functions) {
if (function->name() == name)
returned.append(function);
}
@@ -1353,7 +1214,7 @@ AbstractMetaFunctionList AbstractMetaClass::functionsInTargetLang() const
// Only public functions in final classes
// default_flags |= isFinal() ? WasPublic : 0;
FunctionQueryOptions public_flags;
- if (isFinal())
+ if (isFinalInTargetLang())
public_flags |= WasPublic;
// Constructors
@@ -1374,33 +1235,18 @@ AbstractMetaFunctionList AbstractMetaClass::functionsInTargetLang() const
return returned;
}
-AbstractMetaFunctionList AbstractMetaClass::virtualFunctions() const
-{
- AbstractMetaFunctionList list = functionsInShellClass();
-
- AbstractMetaFunctionList returned;
- foreach (AbstractMetaFunction *f, list) {
- if (!f->isFinalInCpp() || f->isVirtualSlot())
- returned += f;
- }
-
- return returned;
-}
-
AbstractMetaFunctionList AbstractMetaClass::implicitConversions() const
{
if (!hasCloneOperator() && !hasExternalConversionOperators())
return AbstractMetaFunctionList();
AbstractMetaFunctionList returned;
- AbstractMetaFunctionList list = queryFunctions(Constructors);
-
- list.append(externalConversionOperators());
+ const AbstractMetaFunctionList list = queryFunctions(Constructors) + externalConversionOperators();
// Exclude anything that uses rvalue references, be it a move
// constructor "QPolygon(QPolygon &&)" or something else like
// "QPolygon(QVector<QPoint> &&)".
- foreach (AbstractMetaFunction *f, list) {
+ for (AbstractMetaFunction *f : list) {
if ((f->actualMinimumArgumentCount() == 1 || f->arguments().size() == 1 || f->isConversionOperator())
&& !f->isExplicit()
&& f->functionType() != AbstractMetaFunction::CopyConstructorFunction
@@ -1415,9 +1261,9 @@ AbstractMetaFunctionList AbstractMetaClass::implicitConversions() const
AbstractMetaFunctionList AbstractMetaClass::operatorOverloads(OperatorQueryOptions query) const
{
- AbstractMetaFunctionList list = queryFunctions(OperatorOverloads | Visible);
+ const AbstractMetaFunctionList &list = queryFunctions(OperatorOverloads | Visible);
AbstractMetaFunctionList returned;
- foreach (AbstractMetaFunction *f, list) {
+ for (AbstractMetaFunction *f : list) {
if (((query & ArithmeticOp) && f->isArithmeticOperator())
|| ((query & BitwiseOp) && f->isBitwiseOperator())
|| ((query & ComparisonOp) && f->isComparisonOperator())
@@ -1432,18 +1278,9 @@ AbstractMetaFunctionList AbstractMetaClass::operatorOverloads(OperatorQueryOptio
return returned;
}
-bool AbstractMetaClass::hasOperatorOverload() const
-{
- foreach (const AbstractMetaFunction *f, m_functions) {
- if (f->ownerClass() == f->implementingClass() && f->isOperatorOverload() && !f->isPrivate())
- return true;
- }
- return false;
-}
-
bool AbstractMetaClass::hasArithmeticOperatorOverload() const
{
- foreach (const AbstractMetaFunction *f, m_functions) {
+ for (const AbstractMetaFunction *f : m_functions) {
if (f->ownerClass() == f->implementingClass() && f->isArithmeticOperator() && !f->isPrivate())
return true;
}
@@ -1452,7 +1289,7 @@ bool AbstractMetaClass::hasArithmeticOperatorOverload() const
bool AbstractMetaClass::hasBitwiseOperatorOverload() const
{
- foreach (const AbstractMetaFunction *f, m_functions) {
+ for (const AbstractMetaFunction *f : m_functions) {
if (f->ownerClass() == f->implementingClass() && f->isBitwiseOperator() && !f->isPrivate())
return true;
}
@@ -1461,7 +1298,7 @@ bool AbstractMetaClass::hasBitwiseOperatorOverload() const
bool AbstractMetaClass::hasComparisonOperatorOverload() const
{
- foreach (const AbstractMetaFunction *f, m_functions) {
+ for (const AbstractMetaFunction *f : m_functions) {
if (f->ownerClass() == f->implementingClass() && f->isComparisonOperator() && !f->isPrivate())
return true;
}
@@ -1470,79 +1307,13 @@ bool AbstractMetaClass::hasComparisonOperatorOverload() const
bool AbstractMetaClass::hasLogicalOperatorOverload() const
{
- foreach (const AbstractMetaFunction *f, m_functions) {
+ for (const AbstractMetaFunction *f : m_functions) {
if (f->ownerClass() == f->implementingClass() && f->isLogicalOperator() && !f->isPrivate())
return true;
}
return false;
}
-bool AbstractMetaClass::hasSubscriptOperatorOverload() const
-{
- foreach (const AbstractMetaFunction *f, m_functions) {
- if (f->ownerClass() == f->implementingClass() && f->isSubscriptOperator() && !f->isPrivate())
- return true;
- }
- return false;
-}
-
-bool AbstractMetaClass::hasAssignmentOperatorOverload() const
-{
- foreach (const AbstractMetaFunction *f, m_functions) {
- if (f->ownerClass() == f->implementingClass() && f->isAssignmentOperator() && !f->isPrivate())
- return true;
- }
- return false;
-}
-
-bool AbstractMetaClass::hasConversionOperatorOverload() const
-{
- foreach (const AbstractMetaFunction *f, m_functions) {
- if (f->ownerClass() == f->implementingClass() && f->isConversionOperator() && !f->isPrivate())
- return true;
- }
- return false;
-}
-
-/*******************************************************************************
- * Returns a list of all functions that should be declared and implemented in
- * the shell class which is generated as a wrapper on top of the actual C++ class
- */
-AbstractMetaFunctionList AbstractMetaClass::functionsInShellClass() const
-{
- // Only functions and only protected and public functions
- FunctionQueryOptions default_flags = NormalFunctions | Visible | WasVisible | NotRemovedFromShell;
-
- // All virtual functions
- AbstractMetaFunctionList returned = queryFunctions(VirtualFunctions | default_flags);
-
- // All functions explicitly set to be implemented by the shell class
- // (mainly superclass functions that are hidden by other declarations)
- returned += queryFunctions(ForcedShellFunctions | default_flags);
-
- // All functions explicitly set to be virtual slots
- returned += queryFunctions(VirtualSlots | default_flags);
-
- return returned;
-}
-
-/*******************************************************************************
- * Returns a list of all functions that require a public override function to
- * be generated in the shell class. This includes all functions that were originally
- * protected in the superclass.
- */
-AbstractMetaFunctionList AbstractMetaClass::publicOverrideFunctions() const
-{
- return queryFunctions(NormalFunctions | WasProtected | FinalInCppFunctions | NotRemovedFromTargetLang)
- + queryFunctions(Signals | WasProtected | FinalInCppFunctions | NotRemovedFromTargetLang);
-}
-
-AbstractMetaFunctionList AbstractMetaClass::virtualOverrideFunctions() const
-{
- return queryFunctions(NormalFunctions | NonEmptyFunctions | Visible | VirtualInCppFunctions | NotRemovedFromShell) +
- queryFunctions(Signals | NonEmptyFunctions | Visible | VirtualInCppFunctions | NotRemovedFromShell);
-}
-
void AbstractMetaClass::sortFunctions()
{
qSort(m_functions.begin(), m_functions.end(), function_sorter);
@@ -1555,46 +1326,19 @@ void AbstractMetaClass::setFunctions(const AbstractMetaFunctionList &functions)
// Functions must be sorted by name before next loop
sortFunctions();
- QString currentName;
- bool hasVirtuals = false;
- AbstractMetaFunctionList finalFunctions;
- foreach (AbstractMetaFunction *f, m_functions) {
+ for (AbstractMetaFunction *f : qAsConst(m_functions)) {
f->setOwnerClass(this);
m_hasVirtualSlots = m_hasVirtualSlots || f->isVirtualSlot();
m_hasVirtuals = m_hasVirtuals || f->isVirtualSlot() || hasVirtualDestructor();
m_isPolymorphic = m_isPolymorphic || m_hasVirtuals;
m_hasNonpublic = m_hasNonpublic || !f->isPublic();
-
- // If we have non-virtual overloads of a virtual function, we have to implement
- // all the overloads in the shell class to override the hiding rule
- if (currentName == f->name()) {
- hasVirtuals = hasVirtuals || !f->isFinal();
- if (f->isFinal())
- finalFunctions += f;
- } else {
- if (hasVirtuals && finalFunctions.size() > 0) {
- foreach (AbstractMetaFunction *final_function, finalFunctions) {
- *final_function += AbstractMetaAttributes::ForceShellImplementation;
-
- qCWarning(lcShiboken).noquote().nospace()
- << QStringLiteral("hiding of function '%1' in class '%2'")
- .arg(final_function->name(), name());
- }
- }
-
- hasVirtuals = !f->isFinal();
- finalFunctions.clear();
- if (f->isFinal())
- finalFunctions += f;
- currentName = f->name();
- }
}
}
bool AbstractMetaClass::hasFieldAccessors() const
{
- foreach (const AbstractMetaField *field, fields()) {
+ for (const AbstractMetaField *field : m_fields) {
if (field->getter() || field->setter())
return true;
}
@@ -1604,7 +1348,8 @@ bool AbstractMetaClass::hasFieldAccessors() const
bool AbstractMetaClass::hasDefaultToStringFunction() const
{
- foreach (AbstractMetaFunction *f, queryFunctionsByName(QLatin1String("toString"))) {
+ const AbstractMetaFunctionList &funcs = queryFunctionsByName(QLatin1String("toString"));
+ for (const AbstractMetaFunction *f : funcs) {
if (!f->actualMinimumArgumentCount())
return true;
}
@@ -1622,7 +1367,7 @@ void AbstractMetaClass::addFunction(AbstractMetaFunction *function)
Q_ASSERT(false); //memory leak
m_hasVirtualSlots |= function->isVirtualSlot();
- m_hasVirtuals |= !function->isFinal() || function->isVirtualSlot() || hasVirtualDestructor();
+ m_hasVirtuals |= function->isVirtual() || function->isVirtualSlot() || hasVirtualDestructor();
m_isPolymorphic |= m_hasVirtuals;
m_hasNonpublic |= !function->isPublic();
}
@@ -1632,7 +1377,7 @@ bool AbstractMetaClass::hasSignal(const AbstractMetaFunction *other) const
if (!other->isSignal())
return false;
- foreach (const AbstractMetaFunction *f, functions()) {
+ for (const AbstractMetaFunction *f : m_functions) {
if (f->isSignal() && f->compareTo(other) & AbstractMetaFunction::EqualName)
return other->modifiedName() == f->modifiedName();
}
@@ -1643,7 +1388,7 @@ bool AbstractMetaClass::hasSignal(const AbstractMetaFunction *other) const
QString AbstractMetaClass::name() const
{
- return QString(m_typeEntry->targetLangName()).split(QLatin1String("::")).last();
+ return lastNameSegment(m_typeEntry->targetLangName());
}
void AbstractMetaClass::setBaseClass(AbstractMetaClass *baseClass)
@@ -1685,7 +1430,7 @@ bool AbstractMetaClass::hasFunction(const QString &str) const
const AbstractMetaFunction* AbstractMetaClass::findFunction(const QString& functionName) const
{
- foreach (const AbstractMetaFunction *f, functions()) {
+ for (const AbstractMetaFunction *f : m_functions) {
if (f->name() == functionName)
return f;
}
@@ -1694,7 +1439,7 @@ const AbstractMetaFunction* AbstractMetaClass::findFunction(const QString& funct
bool AbstractMetaClass::hasProtectedFunctions() const
{
- foreach (AbstractMetaFunction *func, m_functions) {
+ for (AbstractMetaFunction *func : m_functions) {
if (func->isProtected())
return true;
}
@@ -1703,7 +1448,7 @@ bool AbstractMetaClass::hasProtectedFunctions() const
bool AbstractMetaClass::hasProtectedFields() const
{
- foreach (const AbstractMetaField *field, fields()) {
+ for (const AbstractMetaField *field : m_fields) {
if (field->isProtected())
return true;
}
@@ -1715,15 +1460,6 @@ bool AbstractMetaClass::hasProtectedMembers() const
return hasProtectedFields() || hasProtectedFunctions();
}
-bool AbstractMetaClass::generateShellClass() const
-{
- return m_forceShellClass ||
- (!isFinal()
- && (hasVirtualFunctions()
- || hasProtectedFunctions()
- || hasFieldAccessors()));
-}
-
QPropertySpec *AbstractMetaClass::propertySpecForRead(const QString &name) const
{
for (int i = 0; i < m_propertySpecs.size(); ++i)
@@ -1775,16 +1511,14 @@ void AbstractMetaClass::setTemplateBaseClassInstantiations(AbstractMetaTypeList&
static bool functions_contains(const AbstractMetaFunctionList &l, const AbstractMetaFunction *func)
{
- foreach (const AbstractMetaFunction *f, l) {
+ for (const AbstractMetaFunction *f : l) {
if ((f->compareTo(func) & AbstractMetaFunction::PrettySimilar) == AbstractMetaFunction::PrettySimilar)
return true;
}
return false;
}
-AbstractMetaField::AbstractMetaField() : m_getter(0), m_setter(0), m_class(0)
-{
-}
+AbstractMetaField::AbstractMetaField() = default;
AbstractMetaField::~AbstractMetaField()
{
@@ -1795,12 +1529,9 @@ AbstractMetaField::~AbstractMetaField()
AbstractMetaField *AbstractMetaField::copy() const
{
AbstractMetaField *returned = new AbstractMetaField;
- returned->setEnclosingClass(0);
- returned->setAttributes(attributes());
- returned->setName(name());
- returned->setType(type()->copy());
- returned->setOriginalAttributes(originalAttributes());
-
+ returned->assignMetaVariable(*this);
+ returned->assignMetaAttributes(*this);
+ returned->setEnclosingClass(nullptr);
return returned;
}
@@ -1809,8 +1540,8 @@ AbstractMetaField *AbstractMetaField::copy() const
*/
bool AbstractMetaField::isModifiedRemoved(int types) const
{
- FieldModificationList mods = modifications();
- foreach (const FieldModification &mod, mods) {
+ const FieldModificationList &mods = modifications();
+ for (const FieldModification &mod : mods) {
if (!mod.isRemoveModifier())
continue;
@@ -1840,9 +1571,7 @@ static AbstractMetaFunction *createXetter(const AbstractMetaField *g, const QStr
f->setImplementingClass(g->enclosingClass());
f->setDeclaringClass(g->enclosingClass());
- AbstractMetaAttributes::Attributes attr = AbstractMetaAttributes::Native
- | AbstractMetaAttributes::Final
- | type;
+ AbstractMetaAttributes::Attributes attr = AbstractMetaAttributes::FinalInTargetLang | type;
if (g->isStatic())
attr |= AbstractMetaAttributes::Static;
if (g->isPublic())
@@ -1854,8 +1583,8 @@ static AbstractMetaFunction *createXetter(const AbstractMetaField *g, const QStr
f->setAttributes(attr);
f->setOriginalAttributes(attr);
- FieldModificationList mods = g->modifications();
- foreach (const FieldModification &mod, mods) {
+ const FieldModificationList &mods = g->modifications();
+ for (const FieldModification &mod : mods) {
if (mod.isRenameModifier())
f->setName(mod.renamedTo());
if (mod.isAccessModifier()) {
@@ -1874,10 +1603,10 @@ static AbstractMetaFunction *createXetter(const AbstractMetaField *g, const QStr
FieldModificationList AbstractMetaField::modifications() const
{
- FieldModificationList mods = enclosingClass()->typeEntry()->fieldModifications();
+ const FieldModificationList &mods = enclosingClass()->typeEntry()->fieldModifications();
FieldModificationList returned;
- foreach (const FieldModification &mod, mods) {
+ for (const FieldModification &mod : mods) {
if (mod.name == name())
returned += mod;
}
@@ -1994,7 +1723,8 @@ bool AbstractMetaClass::hasConstructors() const
bool AbstractMetaClass::hasCopyConstructor() const
{
- foreach (const AbstractMetaFunction* ctor, queryFunctions(Constructors)) {
+ const AbstractMetaFunctionList &ctors = queryFunctions(Constructors);
+ for (const AbstractMetaFunction* ctor : ctors) {
if (ctor->functionType() == AbstractMetaFunction::CopyConstructorFunction)
return true;
}
@@ -2003,7 +1733,8 @@ bool AbstractMetaClass::hasCopyConstructor() const
bool AbstractMetaClass::hasPrivateCopyConstructor() const
{
- foreach (const AbstractMetaFunction* ctor, queryFunctions(Constructors)) {
+ const AbstractMetaFunctionList &ctors = queryFunctions(Constructors);
+ for (const AbstractMetaFunction *ctor : ctors) {
if (ctor->functionType() == AbstractMetaFunction::CopyConstructorFunction && ctor->isPrivate())
return true;
}
@@ -2020,10 +1751,7 @@ void AbstractMetaClass::addDefaultConstructor()
f->setArguments(AbstractMetaArgumentList());
f->setDeclaringClass(this);
- AbstractMetaAttributes::Attributes attr = AbstractMetaAttributes::Native;
- attr |= AbstractMetaAttributes::Public;
- attr |= AbstractMetaAttributes::Final;
- f->setAttributes(attr);
+ f->setAttributes(AbstractMetaAttributes::Public | AbstractMetaAttributes::FinalInTargetLang);
f->setImplementingClass(this);
f->setOriginalAttributes(f->attributes());
@@ -2051,8 +1779,7 @@ void AbstractMetaClass::addDefaultCopyConstructor(bool isPrivate)
arg->setName(name());
f->addArgument(arg);
- AbstractMetaAttributes::Attributes attr = AbstractMetaAttributes::Native;
- attr |= AbstractMetaAttributes::Final;
+ AbstractMetaAttributes::Attributes attr = AbstractMetaAttributes::FinalInTargetLang;
if (isPrivate)
attr |= AbstractMetaAttributes::Private;
else
@@ -2077,21 +1804,11 @@ AbstractMetaFunctionList AbstractMetaClass::queryFunctions(FunctionQueryOptions
{
AbstractMetaFunctionList functions;
- foreach (AbstractMetaFunction *f, m_functions) {
-
- if ((query & VirtualSlots) && !f->isVirtualSlot())
- continue;
-
+ for (AbstractMetaFunction *f : m_functions) {
if ((query & NotRemovedFromTargetLang) && f->isRemovedFrom(f->implementingClass(), TypeSystem::TargetLangCode))
continue;
- if ((query & NotRemovedFromTargetLang) && !f->isFinal() && f->isRemovedFrom(f->declaringClass(), TypeSystem::TargetLangCode))
- continue;
-
- if ((query & NotRemovedFromShell) && f->isRemovedFrom(f->implementingClass(), TypeSystem::ShellCode))
- continue;
-
- if ((query & NotRemovedFromShell) && !f->isFinal() && f->isRemovedFrom(f->declaringClass(), TypeSystem::ShellCode))
+ if ((query & NotRemovedFromTargetLang) && f->isVirtual() && f->isRemovedFrom(f->declaringClass(), TypeSystem::TargetLangCode))
continue;
if ((query & Visible) && f->isPrivate())
@@ -2109,35 +1826,18 @@ AbstractMetaFunctionList AbstractMetaClass::queryFunctions(FunctionQueryOptions
if ((query & WasPublic) && !f->wasPublic())
continue;
- if ((query & WasVisible) && f->wasPrivate())
- continue;
-
- if ((query & WasProtected) && !f->wasProtected())
- continue;
-
if ((query & ClassImplements) && f->ownerClass() != f->implementingClass())
continue;
- if ((query & Inconsistent) && (f->isFinalInTargetLang() || !f->isFinalInCpp() || f->isStatic()))
- continue;
-
if ((query & FinalInTargetLangFunctions) && !f->isFinalInTargetLang())
continue;
- if ((query & FinalInCppFunctions) && !f->isFinalInCpp())
- continue;
-
- if ((query & VirtualInCppFunctions) && f->isFinalInCpp())
+ if ((query & VirtualInCppFunctions) && !f->isVirtual())
continue;
if ((query & Signals) && (!f->isSignal()))
continue;
- if ((query & ForcedShellFunctions) &&
- (!f->isForcedShellImplementation() || !f->isFinal())) {
- continue;
- }
-
if ((query & Constructors) && (!f->isConstructor() || f->ownerClass() != f->implementingClass()))
continue;
@@ -2152,24 +1852,15 @@ AbstractMetaFunctionList AbstractMetaClass::queryFunctions(FunctionQueryOptions
continue;
}*/
- if ((query & VirtualFunctions) && (f->isFinal() || f->isSignal() || f->isStatic()))
- continue;
-
if ((query & StaticFunctions) && (!f->isStatic() || f->isSignal()))
continue;
if ((query & NonStaticFunctions) && (f->isStatic()))
continue;
- if ((query & NonEmptyFunctions) && (f->isEmptyFunction()))
- continue;
-
if ((query & NormalFunctions) && (f->isSignal()))
continue;
- if ((query & AbstractFunctions) && !f->isAbstract())
- continue;
-
if ((query & OperatorOverloads) && !f->isOperatorOverload())
continue;
@@ -2199,8 +1890,10 @@ void AbstractMetaClass::addInterface(AbstractMetaClass *interface)
if (m_extractedInterface && m_extractedInterface != interface)
m_extractedInterface->addInterface(interface);
+
#if 0
- foreach (AbstractMetaFunction *function, interface->functions())
+ const AbstractMetaFunctionList &funcs = interface->functions();
+ for (AbstractMetaFunction *function : funcs)
if (!hasFunction(function) && !function->isConstructor()) {
AbstractMetaFunction *cpy = function->copy();
cpy->setImplementingClass(this);
@@ -2210,8 +1903,8 @@ void AbstractMetaClass::addInterface(AbstractMetaClass *interface)
*cpy += AbstractMetaAttributes::InterfaceFunction;
// Copy the modifications in interface into the implementing classes.
- FunctionModificationList mods = function->modifications(interface);
- foreach (const FunctionModification &mod, mods)
+ const FunctionModificationList &mods = function->modifications(interface);
+ for (const FunctionModification &mod : mods)
m_typeEntry->addFunctionModification(mod);
// It should be mostly safe to assume that when we implement an interface
@@ -2228,7 +1921,7 @@ void AbstractMetaClass::addInterface(AbstractMetaClass *interface)
void AbstractMetaClass::setInterfaces(const AbstractMetaClassList &interfaces)
{
m_interfaces = interfaces;
- foreach (const AbstractMetaClass* interface, interfaces) {
+ for (const AbstractMetaClass *interface : interfaces) {
if (interface)
m_isPolymorphic |= interface->isPolymorphic();
}
@@ -2237,7 +1930,7 @@ void AbstractMetaClass::setInterfaces(const AbstractMetaClassList &interfaces)
AbstractMetaEnum *AbstractMetaClass::findEnum(const QString &enumName)
{
- foreach (AbstractMetaEnum *e, m_enums) {
+ for (AbstractMetaEnum *e : qAsConst(m_enums)) {
if (e->name() == enumName)
return e;
}
@@ -2245,59 +1938,26 @@ AbstractMetaEnum *AbstractMetaClass::findEnum(const QString &enumName)
if (typeEntry()->designatedInterface())
return extractInterface()->findEnum(enumName);
- return 0;
+ return nullptr;
}
-
-
-
-/*! Recursivly searches for the enum value named \a enumValueName in
- this class and its superclasses and interfaces. Values belonging to
- \a meta_enum are excluded from the search.
+/*! Recursively searches for the enum value named \a enumValueName in
+ this class and its superclasses and interfaces.
*/
-AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const QString &enumValueName, AbstractMetaEnum *meta_enum)
-{
- foreach (AbstractMetaEnum *e, m_enums) {
- if (e != meta_enum)
- continue;
- foreach (AbstractMetaEnumValue *v, e->values()) {
- if (v->name() == enumValueName)
- return v;
- }
- }
-
- if (typeEntry()->designatedInterface())
- return extractInterface()->findEnumValue(enumValueName, meta_enum);
-
- if (baseClass())
- return baseClass()->findEnumValue(enumValueName, meta_enum);
-
- return 0;
-}
-
-
-/*!
- * Searches through all of this class' enums for a value matching the
- * name \a enumValueName. The name is excluding the class/namespace
- * prefix. The function recursivly searches interfaces and baseclasses
- * of this class.
- */
-AbstractMetaEnum *AbstractMetaClass::findEnumForValue(const QString &enumValueName)
+AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const QString &enumValueName)
{
- foreach (AbstractMetaEnum *e, m_enums) {
- foreach (AbstractMetaEnumValue *v, e->values()) {
- if (v->name() == enumValueName)
- return e;
- }
+ for (AbstractMetaEnum *e : qAsConst(m_enums)) {
+ if (AbstractMetaEnumValue *v = e->findEnumValue(enumValueName))
+ return v;
}
if (typeEntry()->designatedInterface())
- return extractInterface()->findEnumForValue(enumValueName);
+ return extractInterface()->findEnumValue(enumValueName);
if (baseClass())
- return baseClass()->findEnumForValue(enumValueName);
+ return baseClass()->findEnumValue(enumValueName);
- return 0;
+ return nullptr;
}
@@ -2316,8 +1976,8 @@ static void addExtraIncludeForType(AbstractMetaClass *metaClass, const AbstractM
}
if (type->hasInstantiations()) {
- AbstractMetaTypeList instantiations = type->instantiations();
- foreach (const AbstractMetaType *instantiation, instantiations)
+ const AbstractMetaTypeList &instantiations = type->instantiations();
+ for (const AbstractMetaType *instantiation : instantiations)
addExtraIncludeForType(metaClass, instantiation);
}
}
@@ -2328,9 +1988,9 @@ static void addExtraIncludesForFunction(AbstractMetaClass *metaClass, const Abst
Q_ASSERT(meta_function);
addExtraIncludeForType(metaClass, meta_function->type());
- AbstractMetaArgumentList arguments = meta_function->arguments();
- foreach (AbstractMetaArgument *argument, arguments)
- addExtraIncludeForType(metaClass, argument->type());
+ const AbstractMetaArgumentList &arguments = meta_function->arguments();
+ for (AbstractMetaArgument *argument : arguments)
+ addExtraIncludeForType(metaClass, argument->type());
}
void AbstractMetaClass::fixFunctions()
@@ -2395,9 +2055,6 @@ void AbstractMetaClass::fixFunctions()
// Same function, propegate virtual...
if (!(cmp & AbstractMetaFunction::EqualAttributes)) {
if (!f->isEmptyFunction()) {
- if (!sf->isFinalInCpp() && f->isFinalInCpp()) {
- *f -= AbstractMetaAttributes::FinalInCpp;
- }
if (!sf->isFinalInTargetLang() && f->isFinalInTargetLang()) {
*f -= AbstractMetaAttributes::FinalInTargetLang;
}
@@ -2432,7 +2089,6 @@ void AbstractMetaClass::fixFunctions()
if (f->isPrivate()) {
f->setFunctionType(AbstractMetaFunction::EmptyFunction);
*f += AbstractMetaAttributes::FinalInTargetLang;
- *f += AbstractMetaAttributes::FinalInCpp;
}
}
@@ -2448,8 +2104,8 @@ void AbstractMetaClass::fixFunctions()
bool hasNonFinalModifier = false;
bool isBaseImplPrivate = false;
- FunctionModificationList mods = sf->modifications(sf->implementingClass());
- foreach (const FunctionModification &mod, mods) {
+ const FunctionModificationList &mods = sf->modifications(sf->implementingClass());
+ for (const FunctionModification &mod : mods) {
if (mod.isNonFinal()) {
hasNonFinalModifier = true;
break;
@@ -2495,7 +2151,7 @@ void AbstractMetaClass::fixFunctions()
funcsToAdd << sf;
}
- foreach (AbstractMetaFunction *f, funcsToAdd)
+ for (AbstractMetaFunction *f : qAsConst(funcsToAdd))
funcs << f->copy();
if (superClass)
@@ -2506,9 +2162,9 @@ void AbstractMetaClass::fixFunctions()
bool hasPrivateConstructors = false;
bool hasPublicConstructors = false;
- foreach (AbstractMetaFunction *func, funcs) {
- FunctionModificationList mods = func->modifications(this);
- foreach (const FunctionModification &mod, mods) {
+ for (AbstractMetaFunction *func : qAsConst(funcs)) {
+ const FunctionModificationList &mods = func->modifications(this);
+ for (const FunctionModification &mod : mods) {
if (mod.isRenameModifier()) {
func->setName(mod.renamedTo());
}
@@ -2517,7 +2173,7 @@ void AbstractMetaClass::fixFunctions()
// Make sure class is abstract if one of the functions is
if (func->isAbstract()) {
(*this) += AbstractMetaAttributes::Abstract;
- (*this) -= AbstractMetaAttributes::Final;
+ (*this) -= AbstractMetaAttributes::FinalInTargetLang;
}
if (func->isConstructor()) {
@@ -2537,75 +2193,72 @@ void AbstractMetaClass::fixFunctions()
if (hasPrivateConstructors && !hasPublicConstructors) {
(*this) += AbstractMetaAttributes::Abstract;
- (*this) -= AbstractMetaAttributes::Final;
- }
-
- foreach (AbstractMetaFunction *f1, funcs) {
- foreach (AbstractMetaFunction *f2, funcs) {
- if (f1 != f2) {
- const AbstractMetaFunction::CompareResult cmp = f1->compareTo(f2);
- if ((cmp & AbstractMetaFunction::EqualName)
- && !f1->isFinalInCpp()
- && f2->isFinalInCpp()) {
- *f2 += AbstractMetaAttributes::FinalOverload;
- }
- }
- }
+ (*this) -= AbstractMetaAttributes::FinalInTargetLang;
}
setFunctions(funcs);
}
+static inline QString formatArraySize(int e)
+{
+ QString result;
+ result += QLatin1Char('[');
+ if (e >= 0)
+ result += QString::number(e);
+ result += QLatin1Char(']');
+ return result;
+}
-QString AbstractMetaType::minimalSignature() const
+QString AbstractMetaType::formatSignature(bool minimal) const
{
- QString minimalSignature;
+ QString result;
if (isConstant())
- minimalSignature += QLatin1String("const ");
- minimalSignature += typeEntry()->qualifiedCppName();
- if (hasInstantiations()) {
- AbstractMetaTypeList instantiations = this->instantiations();
- minimalSignature += QLatin1String("< ");
- for (int i = 0; i < instantiations.size(); ++i) {
+ result += QLatin1String("const ");
+ if (isArray()) {
+ // Build nested array dimensions a[2][3] in correct order
+ result += m_arrayElementType->minimalSignature();
+ const int arrayPos = result.indexOf(QLatin1Char('['));
+ if (arrayPos != -1)
+ result.insert(arrayPos, formatArraySize(m_arrayElementCount));
+ else
+ result.append(formatArraySize(m_arrayElementCount));
+ } else {
+ result += typeEntry()->qualifiedCppName();
+ }
+ if (!m_instantiations.isEmpty()) {
+ result += QLatin1Char('<');
+ if (minimal)
+ result += QLatin1Char(' ');
+ for (int i = 0, size = m_instantiations.size(); i < size; ++i) {
if (i > 0)
- minimalSignature += QLatin1Char(',');
- minimalSignature += instantiations[i]->minimalSignature();
+ result += QLatin1Char(',');
+ result += m_instantiations.at(i)->minimalSignature();
}
- minimalSignature += QLatin1String(" >");
+ result += QLatin1String(" >");
}
- for (int j = 0; j < indirections(); ++j)
- minimalSignature += QLatin1Char('*');
+ if (!minimal && (m_indirections != 0 || m_referenceType != NoReference))
+ result += QLatin1Char(' ');
+ if (m_indirections)
+ result += QString(m_indirections, QLatin1Char('*'));
switch (referenceType()) {
case NoReference:
break;
case LValueReference:
- minimalSignature += QLatin1Char('&');
+ result += QLatin1Char('&');
break;
case RValueReference:
- minimalSignature += QLatin1String("&&");
+ result += QLatin1String("&&");
break;
}
-
- return minimalSignature;
-}
-
-bool AbstractMetaType::hasNativeId() const
-{
- return (isQObject() || isValue() || isObject()) && typeEntry()->isNativeIdBased();
-}
-
-bool AbstractMetaType::isTargetLangEnum() const
-{
- return isEnum() && !static_cast<const EnumTypeEntry *>(typeEntry())->forceInteger();
+ return result;
}
-bool AbstractMetaType::isTargetLangFlags() const
+bool AbstractMetaType::isCppPrimitive() const
{
- return isFlags() && !static_cast<const FlagsTypeEntry *>(typeEntry())->forceInteger();
+ return m_pattern == PrimitivePattern && m_typeEntry->isCppPrimitive();
}
-
/*******************************************************************************
* Other stuff...
*/
@@ -2641,40 +2294,26 @@ AbstractMetaEnum *AbstractMetaClass::findEnum(const AbstractMetaClassList &class
return metaClass->findEnum(enumName);
}
-AbstractMetaEnumValue *AbstractMetaEnumValueList::find(const QString &name) const
-{
- for (int i = 0; i < size(); ++i) {
- if (name == at(i)->name())
- return at(i);
- }
- return 0;
-}
-
AbstractMetaEnumValue *AbstractMetaClass::findEnumValue(const AbstractMetaClassList &classes,
const QString &name)
{
- QStringList lst = name.split(QLatin1String("::"));
+ const QVector<QStringRef> lst = name.splitRef(QLatin1String("::"));
if (lst.size() > 1) {
- QString prefixName = lst.at(0);
- QString enumName = lst.at(1);
-
- AbstractMetaClass* cl = findClass(classes, prefixName);
- if (cl)
- return cl->findEnumValue(enumName, 0);
+ const QStringRef prefixName = lst.at(0);
+ const QStringRef enumName = lst.at(1);
+ if (AbstractMetaClass *cl = findClass(classes, prefixName.toString()))
+ return cl->findEnumValue(enumName.toString());
}
- foreach (AbstractMetaClass* metaClass, classes) {
- foreach(AbstractMetaEnum* metaEnum, metaClass->enums()) {
- AbstractMetaEnumValue* enumValue = metaClass->findEnumValue(name, metaEnum);
- if (enumValue)
- return enumValue;
- }
+ for (AbstractMetaClass *metaClass : classes) {
+ if (AbstractMetaEnumValue *enumValue = metaClass->findEnumValue(name))
+ return enumValue;
}
qCWarning(lcShiboken).noquote().nospace()
<< QStringLiteral("no matching enum '%1'").arg(name);
- return 0;
+ return nullptr;
}
/*!
@@ -2688,17 +2327,17 @@ AbstractMetaClass *AbstractMetaClass::findClass(const AbstractMetaClassList &cla
if (name.isEmpty())
return 0;
- foreach (AbstractMetaClass *c, classes) {
+ for (AbstractMetaClass *c : classes) {
if (c->qualifiedCppName() == name)
return c;
}
- foreach (AbstractMetaClass *c, classes) {
+ for (AbstractMetaClass *c : classes) {
if (c->fullName() == name)
return c;
}
- foreach (AbstractMetaClass *c, classes) {
+ for (AbstractMetaClass *c : classes) {
if (c->name() == name)
return c;
}
@@ -2709,7 +2348,7 @@ AbstractMetaClass *AbstractMetaClass::findClass(const AbstractMetaClassList &cla
AbstractMetaClass *AbstractMetaClass::findClass(const AbstractMetaClassList &classes,
const TypeEntry* typeEntry)
{
- foreach (AbstractMetaClass* c, classes) {
+ for (AbstractMetaClass* c : classes) {
if (c->typeEntry() == typeEntry)
return c;
}
@@ -2725,6 +2364,8 @@ QDebug operator<<(QDebug d, const AbstractMetaClass *ac)
d << "AbstractMetaClass(";
if (ac) {
d << '"' << ac->fullName() << '"';
+ if (ac->attributes() & AbstractMetaAttributes::FinalCppClass)
+ d << " [final]";
if (ac->m_baseClass)
d << ", inherits \"" << ac->m_baseClass->name() << '"';
const AbstractMetaEnumList &enums = ac->enums();
@@ -2765,6 +2406,43 @@ QDebug operator<<(QDebug d, const AbstractMetaClass *ac)
}
#endif // !QT_NO_DEBUG_STREAM
+/*******************************************************************************
+* AbstractMetaEnum
+*/
+
+AbstractMetaEnum::AbstractMetaEnum() :
+ m_hasQenumsDeclaration(false)
+{
+}
+
+AbstractMetaEnum::~AbstractMetaEnum()
+{
+ qDeleteAll(m_enumValues);
+}
+
+template <class String>
+AbstractMetaEnumValue *findMatchingEnumValue(const AbstractMetaEnumValueList &list, const String &value)
+{
+ for (AbstractMetaEnumValue *enumValue : list) {
+ if (enumValue->name() == value)
+ return enumValue;
+ }
+ return nullptr;
+}
+
+// Find enum values for "enum Enum { e1 }" either for "e1" or "Enum::e1"
+AbstractMetaEnumValue *AbstractMetaEnum::findEnumValue(const QString &value) const
+{
+ if (isAnonymous())
+ return findMatchingEnumValue(m_enumValues, value);
+ const int sepPos = value.indexOf(QLatin1String("::"));
+ if (sepPos == -1)
+ return findMatchingEnumValue(m_enumValues, value);
+ return name() == value.leftRef(sepPos)
+ ? findMatchingEnumValue(m_enumValues, value.rightRef(value.size() - sepPos - 2))
+ : nullptr;
+}
+
QString AbstractMetaEnum::name() const
{
return m_typeEntry->targetLangName();
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h
index 26702d3a2..45a55e570 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h
@@ -71,11 +71,12 @@ public:
Target
};
- Documentation()
- : m_format(Documentation::Native) {}
+ Documentation() {}
Documentation(const QString& value, Format fmt = Documentation::Native)
- : m_data(value), m_format(fmt) {}
+ : m_data(value.trimmed()), m_format(fmt) {}
+
+ bool isEmpty() const { return m_data.isEmpty(); }
QString value() const
{
@@ -84,7 +85,8 @@ public:
void setValue(const QString& value, Format fmt = Documentation::Native)
{
- m_data = value; m_format = fmt;
+ m_data = value.trimmed();
+ m_format = fmt;
}
Documentation::Format format() const
@@ -94,15 +96,17 @@ public:
private:
QString m_data;
- Format m_format;
+ Format m_format = Documentation::Native;
};
class AbstractMetaAttributes
{
+ Q_DISABLE_COPY(AbstractMetaAttributes)
Q_GADGET
public:
- AbstractMetaAttributes() : m_attributes(0), m_originalAttributes(0) {};
+ AbstractMetaAttributes();
+ virtual ~AbstractMetaAttributes();
enum Attribute {
None = 0x00000000,
@@ -113,29 +117,26 @@ public:
Friendly = 0x00000008,
Visibility = 0x0000000f,
- Native = 0x00000010,
Abstract = 0x00000020,
Static = 0x00000040,
FinalInTargetLang = 0x00000080,
- FinalInCpp = 0x00000100,
- ForceShellImplementation = 0x00000200,
GetterFunction = 0x00000400,
SetterFunction = 0x00000800,
- FinalOverload = 0x00001000,
- InterfaceFunction = 0x00002000,
-
PropertyReader = 0x00004000,
PropertyWriter = 0x00008000,
PropertyResetter = 0x00010000,
- Fake = 0x00020000,
-
Invokable = 0x00040000,
- Final = FinalInTargetLang | FinalInCpp
+ HasRejectedConstructor = 0x00080000,
+
+ FinalCppClass = 0x00100000,
+ VirtualCppMethod = 0x00200000,
+ OverriddenCppMethod = 0x00400000,
+ FinalCppMethod = 0x00800000
};
Q_DECLARE_FLAGS(Attributes, Attribute)
Q_FLAG(Attribute)
@@ -180,26 +181,11 @@ public:
m_attributes &= ~attribute;
}
- bool isNative() const
- {
- return m_attributes & Native;
- }
-
- bool isFinal() const
- {
- return (m_attributes & Final) == Final;
- }
-
bool isFinalInTargetLang() const
{
return m_attributes & FinalInTargetLang;
}
- bool isFinalInCpp() const
- {
- return m_attributes & FinalInCpp;
- }
-
bool isAbstract() const
{
return m_attributes & Abstract;
@@ -210,21 +196,6 @@ public:
return m_attributes & Static;
}
- bool isForcedShellImplementation() const
- {
- return m_attributes & ForceShellImplementation;
- }
-
- bool isInterfaceFunction() const
- {
- return m_attributes & InterfaceFunction;
- }
-
- bool isFinalOverload() const
- {
- return m_attributes & FinalOverload;
- }
-
bool isInvokable() const
{
return m_attributes & Invokable;
@@ -295,6 +266,9 @@ public:
return m_doc;
}
+protected:
+ void assignMetaAttributes(const AbstractMetaAttributes &other);
+
private:
Attributes m_attributes;
Attributes m_originalAttributes;
@@ -318,19 +292,15 @@ public:
FlagsPattern,
EnumPattern,
ValuePattern,
- StringPattern,
- CharPattern,
ObjectPattern,
QObjectPattern,
ValuePointerPattern,
NativePointerPattern,
+ NativePointerAsArrayPattern, // "int*" as "int[]"
ContainerPattern,
SmartPointerPattern,
- VariantPattern,
VarargsPattern,
- JObjectWrapperPattern,
- ArrayPattern,
- ThreadPattern
+ ArrayPattern
};
Q_ENUM(TypeUsagePattern)
@@ -381,15 +351,8 @@ public:
{
m_cppInstantiation = incpp;
}
- bool hasInstantiationInCpp() const
- {
- return hasInstantiations() && m_cppInstantiation;
- }
-
- QString minimalSignature() const;
- // true when the type is a QtJambiObject subclass
- bool hasNativeId() const;
+ QString minimalSignature() const { return formatSignature(true); }
// returns true if the typs is used as a non complex primitive, no & or *'s
bool isPrimitive() const
@@ -397,6 +360,8 @@ public:
return m_pattern == PrimitivePattern;
}
+ bool isCppPrimitive() const;
+
// returns true if the type is used as an enum
bool isEnum() const
{
@@ -438,36 +403,12 @@ public:
return m_pattern == NativePointerPattern;
}
- // returns true if the type was originally a QString or const QString & or equivalent for QLatin1String
- bool isTargetLangString() const
- {
- return m_pattern == StringPattern;
- }
-
- // returns true if the type was originally a QChar or const QChar &
- bool isTargetLangChar() const
- {
- return m_pattern == CharPattern;
- }
-
- // return true if the type was originally a QVariant or const QVariant &
- bool isVariant() const
- {
- return m_pattern == VariantPattern;
- }
-
// return true if the type was originally a varargs
bool isVarargs() const
{
return m_pattern == VarargsPattern;
}
- // return true if the type was originally a JObjectWrapper or const JObjectWrapper &
- bool isJObjectWrapper() const
- {
- return m_pattern == JObjectWrapperPattern;
- }
-
// returns true if the type was used as a container
bool isContainer() const
{
@@ -483,12 +424,6 @@ public:
return m_pattern == FlagsPattern;
}
- // returns true if the type was used as a thread
- bool isThread() const
- {
- return m_pattern == ThreadPattern;
- }
-
bool isConstant() const
{
return m_constant;
@@ -501,30 +436,6 @@ public:
ReferenceType referenceType() const { return m_referenceType; }
void setReferenceType(ReferenceType ref) { m_referenceType = ref; }
- /**
- * Says if the type is to be implemented using target language
- * equivalent of C++ enums, i.e. not plain ints.
- * /return true if the type is to be implemented using target
- * language enums
- */
- bool isTargetLangEnum() const;
- bool isIntegerEnum() const
- {
- return isEnum() && !isTargetLangEnum();
- }
-
- /**
- * Says if the type is to be implemented using target language
- * equivalent of Qt's QFlags, i.e. not plain ints.
- * /return true if the type is to be implemented using target
- * language QFlags
- */
- bool isTargetLangFlags() const;
- bool isIntegerFlags() const
- {
- return isFlags() && !isTargetLangFlags();
- }
-
int actualIndirections() const
{
return m_indirections + (m_referenceType == LValueReference ? 1 : 0);
@@ -556,6 +467,8 @@ public:
m_arrayElementType = t;
}
+ AbstractMetaTypeCList nestedArrayTypes() const;
+
QString cppSignature() const;
AbstractMetaType *copy() const;
@@ -611,27 +524,28 @@ public:
private:
TypeUsagePattern determineUsagePattern() const;
+ QString formatSignature(bool minimal) const;
- const TypeEntry *m_typeEntry;
+ const TypeEntry *m_typeEntry = nullptr;
AbstractMetaTypeList m_instantiations;
QString m_package;
mutable QString m_name;
mutable QString m_cachedCppSignature;
QString m_originalTypeDescription;
- int m_arrayElementCount;
- const AbstractMetaType *m_arrayElementType;
- const AbstractMetaType *m_originalTemplateType;
+ int m_arrayElementCount = -1;
+ const AbstractMetaType *m_arrayElementType = nullptr;
+ const AbstractMetaType *m_originalTemplateType = nullptr;
- TypeUsagePattern m_pattern;
+ TypeUsagePattern m_pattern = InvalidPattern;
uint m_constant : 1;
uint m_cppInstantiation : 1;
int m_indirections : 4;
uint m_reserved : 26; // unused
- ReferenceType m_referenceType;
+ ReferenceType m_referenceType = NoReference;
AbstractMetaTypeList m_children;
- Q_DISABLE_COPY(AbstractMetaType);
+ Q_DISABLE_COPY(AbstractMetaType)
};
#ifndef QT_NO_DEBUG_STREAM
@@ -640,14 +554,11 @@ QDebug operator<<(QDebug d, const AbstractMetaType *at);
class AbstractMetaVariable
{
+ Q_DISABLE_COPY(AbstractMetaVariable)
public:
- AbstractMetaVariable() : m_type(0), m_hasName(false) {}
- AbstractMetaVariable(const AbstractMetaVariable &other);
+ AbstractMetaVariable();
- virtual ~AbstractMetaVariable()
- {
- delete m_type;
- }
+ virtual ~AbstractMetaVariable();
AbstractMetaType *type() const
{
@@ -695,11 +606,14 @@ public:
return m_doc;
}
+protected:
+ void assignMetaVariable(const AbstractMetaVariable &other);
+
private:
QString m_originalName;
QString m_name;
- AbstractMetaType *m_type;
- bool m_hasName;
+ AbstractMetaType *m_type = nullptr;
+ bool m_hasName = false;
Documentation m_doc;
};
@@ -711,7 +625,7 @@ QDebug operator<<(QDebug d, const AbstractMetaVariable *av);
class AbstractMetaArgument : public AbstractMetaVariable
{
public:
- AbstractMetaArgument() : m_argumentIndex(0) {};
+ AbstractMetaArgument();
QString defaultValueExpression() const
{
@@ -747,10 +661,14 @@ public:
}
AbstractMetaArgument *copy() const;
+
+protected:
+ void assignMetaArgument(const AbstractMetaArgument &other);
+
private:
QString m_expression;
QString m_originalExpression;
- int m_argumentIndex;
+ int m_argumentIndex = 0;
friend class AbstractMetaClass;
};
@@ -787,9 +705,9 @@ public:
AbstractMetaField *copy() const;
private:
- mutable AbstractMetaFunction *m_getter;
- mutable AbstractMetaFunction *m_setter;
- const AbstractMetaClass *m_class;
+ mutable AbstractMetaFunction *m_getter = nullptr;
+ mutable AbstractMetaFunction *m_setter = nullptr;
+ const AbstractMetaClass *m_class = nullptr;
};
#ifndef QT_NO_DEBUG_STREAM
@@ -833,24 +751,7 @@ public:
Q_DECLARE_FLAGS(CompareResult, CompareResultFlag)
Q_FLAG(CompareResultFlag)
- AbstractMetaFunction()
- : m_typeEntry(0),
- m_functionType(NormalFunction),
- m_type(0),
- m_class(0),
- m_implementingClass(0),
- m_declaringClass(0),
- m_propertySpec(0),
- m_constant(false),
- m_invalid(false),
- m_reverse(false),
- m_userAdded(false),
- m_explicit(false),
- m_pointerOperator(false),
- m_isCallOperator(false)
- {
- }
-
+ AbstractMetaFunction();
~AbstractMetaFunction();
QString name() const
@@ -941,29 +842,14 @@ public:
bool isBinaryOperator() const { return arityOfOperator() == 2; }
bool isInplaceOperator() const;
- // TODO: ths function *should* know if it is virtual
- // instead of asking to your implementing class.
bool isVirtual() const;
- bool isThread() const;
bool allowThread() const;
QString modifiedName() const;
QString minimalSignature() const;
+ QString debugSignature() const; // including virtual/override/final, etc., for debugging only.
QStringList possibleIntrospectionCompatibleSignatures() const;
- QString marshalledName() const;
-
- // true if one or more of the arguments are of QtJambiObject subclasses
- bool argumentsHaveNativeId() const
- {
- foreach (const AbstractMetaArgument *arg, m_arguments) {
- if (arg->type()->hasNativeId())
- return true;
- }
-
- return false;
- }
-
bool isModifiedRemoved(int types = TypeSystem::All) const;
AbstractMetaType *type() const
@@ -1013,8 +899,6 @@ public:
m_implementingClass = cls;
}
- bool needsCallThrough() const;
-
AbstractMetaArgumentList arguments() const
{
return m_arguments;
@@ -1029,14 +913,6 @@ public:
}
int actualMinimumArgumentCount() const;
- void setInvalid(bool on)
- {
- m_invalid = on;
- }
- bool isInvalid() const
- {
- return m_invalid;
- }
bool isDeprecated() const;
bool isDestructor() const
{
@@ -1079,15 +955,6 @@ public:
bool usesRValueReferences() const;
QStringList introspectionCompatibleSignatures(const QStringList &resolvedArguments = QStringList()) const;
QString signature() const;
- QString targetLangSignature(bool minimal = false) const;
- bool shouldReturnThisObject() const
- {
- return QLatin1String("this") == argumentReplaced(0);
- }
- bool shouldIgnoreReturnValue() const
- {
- return QLatin1String("void") == argumentReplaced(0);
- }
bool isConstant() const
{
@@ -1122,17 +989,9 @@ public:
QString replacedDefaultExpression(const AbstractMetaClass *cls, int idx) const;
bool removedDefaultExpression(const AbstractMetaClass *cls, int idx) const;
QString conversionRule(TypeSystem::Language language, int idx) const;
- QList<ReferenceCount> referenceCounts(const AbstractMetaClass *cls, int idx = -2) const;
+ QVector<ReferenceCount> referenceCounts(const AbstractMetaClass *cls, int idx = -2) const;
ArgumentOwner argumentOwner(const AbstractMetaClass *cls, int idx) const;
- bool nullPointersDisabled(const AbstractMetaClass *cls = 0, int argument_idx = 0) const;
- QString nullPointerDefaultValue(const AbstractMetaClass *cls = 0, int argument_idx = 0) const;
-
- bool resetObjectAfterUse(int argument_idx) const;
-
- // Returns whether garbage collection is disabled for the argument in any context
- bool disabledGarbageCollection(const AbstractMetaClass *cls, int key) const;
-
// Returns the ownership rules for the given argument in the given context
TypeSystem::Ownership ownership(const AbstractMetaClass *cls, TypeSystem::Language language, int idx) const;
@@ -1144,9 +1003,7 @@ public:
bool argumentRemoved(int) const;
QString argumentReplaced(int key) const;
- bool needsSuppressUncheckedWarning() const;
- bool hasModifications(const AbstractMetaClass *implementor) const;
/**
* Verifies if any modification to the function is an inject code.
* \return true if there is inject code modifications to the function.
@@ -1206,16 +1063,15 @@ private:
mutable QString m_cachedSignature;
mutable QString m_cachedModifiedName;
- FunctionTypeEntry* m_typeEntry;
- FunctionType m_functionType;
- AbstractMetaType *m_type;
- const AbstractMetaClass *m_class;
- const AbstractMetaClass *m_implementingClass;
- const AbstractMetaClass *m_declaringClass;
- QPropertySpec *m_propertySpec;
+ FunctionTypeEntry* m_typeEntry = nullptr;
+ FunctionType m_functionType = NormalFunction;
+ AbstractMetaType *m_type = nullptr;
+ const AbstractMetaClass *m_class = nullptr;
+ const AbstractMetaClass *m_implementingClass = nullptr;
+ const AbstractMetaClass *m_declaringClass = nullptr;
+ QPropertySpec *m_propertySpec = nullptr;
AbstractMetaArgumentList m_arguments;
uint m_constant : 1;
- uint m_invalid : 1;
uint m_reverse : 1;
uint m_userAdded : 1;
uint m_explicit : 1;
@@ -1232,10 +1088,7 @@ QDebug operator<<(QDebug d, const AbstractMetaFunction *af);
class AbstractMetaEnumValue
{
public:
- AbstractMetaEnumValue()
- : m_valueSet(false), m_value(0)
- {
- }
+ AbstractMetaEnumValue() {}
int value() const
{
@@ -1244,7 +1097,6 @@ public:
void setValue(int value)
{
- m_valueSet = true;
m_value = value;
}
@@ -1268,11 +1120,6 @@ public:
m_name = name;
}
- bool isValueSet() const
- {
- return m_valueSet;
- }
-
void setDocumentation(const Documentation& doc)
{
m_doc = doc;
@@ -1287,27 +1134,16 @@ private:
QString m_name;
QString m_stringValue;
- bool m_valueSet;
- int m_value;
+ int m_value = 0;
Documentation m_doc;
};
-
-class AbstractMetaEnumValueList : public QList<AbstractMetaEnumValue *>
-{
-public:
- AbstractMetaEnumValue *find(const QString &name) const;
-};
-
class AbstractMetaEnum : public AbstractMetaAttributes
{
public:
- AbstractMetaEnum() : m_typeEntry(0), m_class(0), m_hasQenumsDeclaration(false) {}
- ~AbstractMetaEnum()
- {
- qDeleteAll(m_enumValues);
- }
+ AbstractMetaEnum();
+ ~AbstractMetaEnum();
AbstractMetaEnumValueList values() const
{
@@ -1319,6 +1155,8 @@ public:
m_enumValues << enumValue;
}
+ AbstractMetaEnumValue *findEnumValue(const QString &value) const;
+
QString name() const;
QString qualifier() const;
@@ -1365,8 +1203,8 @@ public:
private:
AbstractMetaEnumValueList m_enumValues;
- EnumTypeEntry *m_typeEntry;
- AbstractMetaClass *m_class;
+ EnumTypeEntry *m_typeEntry = nullptr;
+ AbstractMetaClass *m_class = nullptr;
uint m_hasQenumsDeclaration : 1;
};
@@ -1382,29 +1220,19 @@ public:
enum FunctionQueryOption {
Constructors = 0x0000001, // Only constructors
//Destructors = 0x0000002, // Only destructors. Not included in class.
- VirtualFunctions = 0x0000004, // Only virtual functions (virtual in both TargetLang and C++)
FinalInTargetLangFunctions = 0x0000008, // Only functions that are non-virtual in TargetLang
- FinalInCppFunctions = 0x0000010, // Only functions that are non-virtual in C++
ClassImplements = 0x0000020, // Only functions implemented by the current class
- Inconsistent = 0x0000040, // Only inconsistent functions (inconsistent virtualness in TargetLang/C++)
StaticFunctions = 0x0000080, // Only static functions
Signals = 0x0000100, // Only signals
NormalFunctions = 0x0000200, // Only functions that aren't signals
Visible = 0x0000400, // Only public and protected functions
- ForcedShellFunctions = 0x0000800, // Only functions that are overridden to be implemented in the shell class
WasPublic = 0x0001000, // Only functions that were originally public
- WasProtected = 0x0002000, // Only functions that were originally protected
NonStaticFunctions = 0x0004000, // No static functions
Empty = 0x0008000, // Empty overrides of abstract functions
Invisible = 0x0010000, // Only private functions
VirtualInCppFunctions = 0x0020000, // Only functions that are virtual in C++
- NonEmptyFunctions = 0x0040000, // Only functions with target language API implementations
VirtualInTargetLangFunctions = 0x0080000, // Only functions which are virtual in TargetLang
- AbstractFunctions = 0x0100000, // Only abstract functions
- WasVisible = 0x0200000, // Only functions that were public or protected in the original code
NotRemovedFromTargetLang = 0x0400000, // Only functions that have not been removed from TargetLang
- NotRemovedFromShell = 0x0800000, // Only functions that have not been removed from the shell class
- VirtualSlots = 0x1000000, // Only functions that are set as virtual slots in the type system
OperatorOverloads = 0x2000000 // Only functions that are operator overloads
};
Q_DECLARE_FLAGS(FunctionQueryOptions, FunctionQueryOption)
@@ -1426,32 +1254,8 @@ public:
Q_DECLARE_FLAGS(OperatorQueryOptions, OperatorQueryOption)
Q_FLAG(OperatorQueryOption)
- AbstractMetaClass()
- : m_hasVirtuals(false),
- m_isPolymorphic(false),
- m_hasNonpublic(false),
- m_hasVirtualSlots(false),
- m_hasNonPrivateConstructor(false),
- m_functionsFixed(false),
- m_hasPrivateDestructor(false),
- m_hasProtectedDestructor(false),
- m_hasVirtualDestructor(false),
- m_forceShellClass(false),
- m_hasHashFunction(false),
- m_hasEqualsOperator(false),
- m_hasCloneOperator(false),
- m_isTypeDef(false),
- m_hasToStringCapability(false),
- m_enclosingClass(0),
- m_baseClass(0),
- m_templateBaseClass(0),
- m_extractedInterface(0),
- m_typeEntry(0),
- m_stream(false)
- {
- }
-
- virtual ~AbstractMetaClass();
+ AbstractMetaClass();
+ ~AbstractMetaClass();
AbstractMetaClass *extractInterface();
void fixFunctions();
@@ -1485,6 +1289,16 @@ public:
m_hasNonPrivateConstructor = value;
}
+ bool hasPrivateConstructor() const
+ {
+ return m_hasPrivateConstructor;
+ }
+
+ void setHasPrivateConstructor(bool value)
+ {
+ m_hasPrivateConstructor = value;
+ }
+
bool hasPrivateDestructor() const
{
return m_hasPrivateDestructor;
@@ -1515,14 +1329,15 @@ public:
m_hasVirtualDestructor = value;
}
+ bool isConstructible() const
+ {
+ return (hasNonPrivateConstructor() || !hasPrivateConstructor()) && !hasPrivateDestructor();
+ }
+
AbstractMetaFunctionList queryFunctionsByName(const QString &name) const;
AbstractMetaFunctionList queryFunctions(FunctionQueryOptions query) const;
AbstractMetaFunctionList functionsInTargetLang() const;
- AbstractMetaFunctionList functionsInShellClass() const;
inline AbstractMetaFunctionList cppSignalFunctions() const;
- AbstractMetaFunctionList publicOverrideFunctions() const;
- AbstractMetaFunctionList virtualOverrideFunctions() const;
- AbstractMetaFunctionList virtualFunctions() const;
AbstractMetaFunctionList implicitConversions() const;
/**
@@ -1535,14 +1350,10 @@ public:
*/
AbstractMetaFunctionList operatorOverloads(OperatorQueryOptions query = AllOperators) const;
- bool hasOperatorOverload() const;
bool hasArithmeticOperatorOverload() const;
bool hasBitwiseOperatorOverload() const;
bool hasComparisonOperatorOverload() const;
bool hasLogicalOperatorOverload() const;
- bool hasSubscriptOperatorOverload() const;
- bool hasAssignmentOperatorOverload() const;
- bool hasConversionOperatorOverload() const;
AbstractMetaFieldList fields() const
{
@@ -1574,8 +1385,7 @@ public:
}
AbstractMetaEnum *findEnum(const QString &enumName);
- AbstractMetaEnum *findEnumForValue(const QString &enumName);
- AbstractMetaEnumValue *findEnumValue(const QString &enumName, AbstractMetaEnum *meta_enum);
+ AbstractMetaEnumValue *findEnumValue(const QString &enumName);
AbstractMetaClassList interfaces() const
{
@@ -1655,22 +1465,12 @@ public:
m_forceShellClass = on;
}
- bool generateShellClass() const;
-
bool hasVirtualSlots() const
{
return m_hasVirtualSlots;
}
/**
- * Says if a class has any virtual functions of its own.
- * \return true if the class implements any virtual methods
- */
- bool hasVirtualFunctions() const
- {
- return !isFinal() && m_hasVirtuals;
- }
- /**
* Says if the class that declares or inherits a virtual function.
* \return true if the class implements or inherits any virtual methods
*/
@@ -1698,12 +1498,12 @@ public:
bool hasProtectedMembers() const;
- QList<TypeEntry *> templateArguments() const
+ QVector<TypeEntry *> templateArguments() const
{
return m_templateArgs;
}
- void setTemplateArguments(const QList<TypeEntry *> &args)
+ void setTemplateArguments(const QVector<TypeEntry *> &args)
{
m_templateArgs = args;
}
@@ -1772,7 +1572,7 @@ public:
m_propertySpecs << spec;
}
- QList<QPropertySpec *> propertySpecs() const
+ QVector<QPropertySpec *> propertySpecs() const
{
return m_propertySpecs;
}
@@ -1855,6 +1655,7 @@ private:
uint m_hasNonpublic : 1;
uint m_hasVirtualSlots : 1;
uint m_hasNonPrivateConstructor : 1;
+ uint m_hasPrivateConstructor : 1;
uint m_functionsFixed : 1;
uint m_hasPrivateDestructor : 1;
uint m_hasProtectedDestructor : 1;
@@ -1866,25 +1667,25 @@ private:
uint m_isTypeDef : 1;
uint m_hasToStringCapability : 1;
- const AbstractMetaClass *m_enclosingClass;
- AbstractMetaClass *m_baseClass;
- const AbstractMetaClass *m_templateBaseClass;
+ const AbstractMetaClass *m_enclosingClass = nullptr;
+ AbstractMetaClass *m_baseClass = nullptr;
+ const AbstractMetaClass *m_templateBaseClass = nullptr;
AbstractMetaFunctionList m_functions;
AbstractMetaFieldList m_fields;
AbstractMetaEnumList m_enums;
AbstractMetaClassList m_interfaces;
- AbstractMetaClass *m_extractedInterface;
- QList<QPropertySpec *> m_propertySpecs;
+ AbstractMetaClass *m_extractedInterface = nullptr;
+ QVector<QPropertySpec *> m_propertySpecs;
AbstractMetaClassList m_innerClasses;
AbstractMetaFunctionList m_externalConversionOperators;
QStringList m_baseClassNames;
- QList<TypeEntry *> m_templateArgs;
- ComplexTypeEntry *m_typeEntry;
+ QVector<TypeEntry *> m_templateArgs;
+ ComplexTypeEntry *m_typeEntry = nullptr;
// FunctionModelItem m_qDebugStreamFunction;
- bool m_stream;
+ bool m_stream = false;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMetaClass::FunctionQueryOptions)
@@ -1893,10 +1694,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractMetaClass::OperatorQueryOptions)
class QPropertySpec
{
public:
- QPropertySpec(const TypeEntry *type)
- : m_type(type),
- m_index(-1)
- {}
+ explicit QPropertySpec(const TypeEntry *type) : m_type(type) {}
const TypeEntry *type() const
{
@@ -1970,7 +1768,7 @@ private:
QString m_designable;
QString m_reset;
const TypeEntry *m_type;
- int m_index;
+ int m_index = -1;
};
inline AbstractMetaFunctionList AbstractMetaClass::cppSignalFunctions() const
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h b/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h
index dd6573b78..6522ba2dd 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang_typedefs.h
@@ -29,21 +29,23 @@
#ifndef ABSTRACTMETALANG_TYPEDEFS_H
#define ABSTRACTMETALANG_TYPEDEFS_H
-#include <QtCore/QList>
+#include <QtCore/QVector>
class AbstractMetaClass;
class AbstractMetaField;
class AbstractMetaArgument;
class AbstractMetaEnum;
-class AbstractMetaEnumValueList;
+class AbstractMetaEnumValue;
class AbstractMetaFunction;
class AbstractMetaType;
-typedef QList<AbstractMetaArgument *> AbstractMetaArgumentList;
-typedef QList<AbstractMetaClass *> AbstractMetaClassList;
-typedef QList<AbstractMetaEnum *> AbstractMetaEnumList;
-typedef QList<AbstractMetaField *> AbstractMetaFieldList;
-typedef QList<AbstractMetaFunction *> AbstractMetaFunctionList;
-typedef QList<AbstractMetaType *> AbstractMetaTypeList;
+typedef QVector<AbstractMetaArgument *> AbstractMetaArgumentList;
+typedef QVector<AbstractMetaClass *> AbstractMetaClassList;
+typedef QVector<AbstractMetaEnum *> AbstractMetaEnumList;
+typedef QVector<AbstractMetaEnumValue *> AbstractMetaEnumValueList;
+typedef QVector<AbstractMetaField *> AbstractMetaFieldList;
+typedef QVector<AbstractMetaFunction *> AbstractMetaFunctionList;
+typedef QVector<AbstractMetaType *> AbstractMetaTypeList;
+typedef QVector<const AbstractMetaType *> AbstractMetaTypeCList;
#endif // ABSTRACTMETALANG_TYPEDEFS_H
diff --git a/sources/shiboken2/ApiExtractor/apiextractor.cpp b/sources/shiboken2/ApiExtractor/apiextractor.cpp
index 371ccf559..6508d378a 100644
--- a/sources/shiboken2/ApiExtractor/apiextractor.cpp
+++ b/sources/shiboken2/ApiExtractor/apiextractor.cpp
@@ -32,27 +32,21 @@
#include <QDir>
#include <QDebug>
#include <QTemporaryFile>
+#include <algorithm>
#include <iostream>
+#include <iterator>
#include "reporthandler.h"
#include "typesystem.h"
#include "fileout.h"
-#include "parser/rpp/pp.h"
#include "abstractmetabuilder.h"
#include "typedatabase.h"
#include "typesystem.h"
-static bool preprocess(const QString& sourceFile,
- QFile& targetFile,
- const QStringList& includes);
-
ApiExtractor::ApiExtractor() : m_builder(0)
{
- static bool qrcInitialized = false;
- if (!qrcInitialized)
- Q_INIT_RESOURCE(generator);
// Environment TYPESYSTEMPATH
- QString envTypesystemPaths = QFile::decodeName(getenv("TYPESYSTEMPATH"));
+ QString envTypesystemPaths = QFile::decodeName(qgetenv("TYPESYSTEMPATH"));
if (!envTypesystemPaths.isEmpty())
TypeDatabase::instance()->addTypesystemPath(envTypesystemPaths);
}
@@ -69,16 +63,16 @@ void ApiExtractor::addTypesystemSearchPath (const QString& path)
void ApiExtractor::addTypesystemSearchPath(const QStringList& paths)
{
- foreach (const QString &path, paths)
+ for (const QString &path : paths)
addTypesystemSearchPath(path);
}
-void ApiExtractor::addIncludePath(const QString& path)
+void ApiExtractor::addIncludePath(const HeaderPath& path)
{
m_includePaths << path;
}
-void ApiExtractor::addIncludePath(const QStringList& paths)
+void ApiExtractor::addIncludePath(const HeaderPaths& paths)
{
m_includePaths << paths;
}
@@ -174,8 +168,9 @@ QSet<QString> ApiExtractor::qtMetaTypeDeclaredTypeNames() const
static const AbstractMetaEnum* findEnumOnClasses(AbstractMetaClassList metaClasses, const EnumTypeEntry* typeEntry)
{
const AbstractMetaEnum* result = 0;
- foreach (const AbstractMetaClass* metaClass, metaClasses) {
- foreach (const AbstractMetaEnum* metaEnum, metaClass->enums()) {
+ for (const AbstractMetaClass* metaClass : qAsConst(metaClasses)) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (const AbstractMetaEnum *metaEnum : enums) {
if (metaEnum->typeEntry() == typeEntry) {
result = metaEnum;
break;
@@ -192,7 +187,8 @@ const AbstractMetaEnum* ApiExtractor::findAbstractMetaEnum(const EnumTypeEntry*
{
if (!typeEntry)
return 0;
- foreach (AbstractMetaEnum* metaEnum, m_builder->globalEnums()) {
+ const AbstractMetaEnumList &globalEnums = m_builder->globalEnums();
+ for (AbstractMetaEnum* metaEnum : globalEnums) {
if (metaEnum->typeEntry() == typeEntry)
return metaEnum;
}
@@ -235,93 +231,43 @@ bool ApiExtractor::run()
if (m_builder)
return false;
- if (m_typeSystemFileName.isEmpty()) {
- std::cerr << "You must specify a Type System file." << std::endl;
- return false;
- } else if (!TypeDatabase::instance()->parseFile(m_typeSystemFileName)) {
+ if (!TypeDatabase::instance()->parseFile(m_typeSystemFileName)) {
std::cerr << "Cannot parse file: " << qPrintable(m_typeSystemFileName);
return false;
}
- QTemporaryFile ppFile;
-#ifndef NDEBUG
- ppFile.setAutoRemove(false);
-#endif
+ const QString pattern = QDir::tempPath() + QLatin1Char('/') +
+ QFileInfo(m_cppFileName).baseName() + QStringLiteral("_XXXXXX.hpp");
+ QTemporaryFile ppFile(pattern);
+ bool autoRemove = !qEnvironmentVariableIsSet("KEEP_TEMP_FILES");
// make sure that a tempfile can be written
if (!ppFile.open()) {
- std::cerr << "could not create tempfile in " << qPrintable(QDir::tempPath());
- return false;
- }
-
- // run rpp pre-processor
- if (!preprocess(m_cppFileName, ppFile, m_includePaths)) {
- std::cerr << "Preprocessor failed on file: " << qPrintable(m_cppFileName);
+ std::cerr << "could not create tempfile " << qPrintable(pattern)
+ << ": " << qPrintable(ppFile.errorString()) << '\n';
return false;
}
- ppFile.seek(0);
+ ppFile.write("#include \"");
+ ppFile.write(m_cppFileName.toLocal8Bit());
+ ppFile.write("\"\n");
+ const QString preprocessedCppFileName = ppFile.fileName();
+ ppFile.close();
m_builder = new AbstractMetaBuilder;
m_builder->setLogDirectory(m_logDirectory);
m_builder->setGlobalHeader(m_cppFileName);
- m_builder->build(&ppFile);
-
- return true;
-}
-
-static bool preprocess(const QString& sourceFile,
- QFile& targetFile,
- const QStringList& includes)
-{
- rpp::pp_environment env;
- rpp::pp preprocess(env);
-
- rpp::pp_null_output_iterator null_out;
-
- const char *ppconfig = ":/trolltech/generator/pp-qt-configuration";
-
- const QString fileName = QLatin1String(ppconfig);
- QFile file(fileName);
- if (!file.open(QFile::ReadOnly)) {
- std::cerr << "Preprocessor configuration file not found " << ppconfig << std::endl;
- return false;
- }
-
- QByteArray ba = file.readAll();
- file.close();
- preprocess.operator()(ba.constData(), ba.constData() + ba.size(), null_out);
-
- preprocess.push_include_path(".");
- foreach (const QString &include, includes)
- preprocess.push_include_path(QDir::toNativeSeparators(include).toStdString());
- preprocess.push_include_path("/usr/include");
-
- QString currentDir = QDir::current().absolutePath();
- QFileInfo sourceInfo(sourceFile);
- if (!sourceInfo.exists()) {
- std::cerr << "File not found " << qPrintable(sourceFile) << std::endl;
- return false;
+ QByteArrayList arguments;
+ arguments.reserve(m_includePaths.size() + 1);
+ for (const HeaderPath &headerPath : qAsConst(m_includePaths))
+ arguments.append(HeaderPath::includeOption(headerPath));
+ arguments.append(QFile::encodeName(preprocessedCppFileName));
+ qCDebug(lcShiboken) << __FUNCTION__ << arguments;
+ const bool result = m_builder->build(arguments);
+ if (!result)
+ autoRemove = false;
+ if (!autoRemove) {
+ ppFile.setAutoRemove(false);
+ std::cerr << "Keeping temporary file: " << qPrintable(QDir::toNativeSeparators(preprocessedCppFileName)) << '\n';
}
- QDir::setCurrent(sourceInfo.absolutePath());
-
- std::string result;
- result.reserve(20 * 1024); // 20K
-
- result += "# 1 \"builtins\"\n";
- result += "# 1 \"";
- result += sourceFile.toStdString();
- result += "\"\n";
-
- preprocess.file(sourceInfo.fileName().toStdString(),
- rpp::pp_output_iterator<std::string> (result));
-
- QDir::setCurrent(currentDir);
-
- if (!targetFile.open(QIODevice::ReadWrite | QIODevice::Text)) {
- std::cerr << "Failed to write preprocessed file: " << qPrintable(targetFile.fileName()) << std::endl;
- return false;
- }
-
- targetFile.write(result.c_str(), result.length());
- return true;
+ return result;
}
#ifndef QT_NO_DEBUG_STREAM
diff --git a/sources/shiboken2/ApiExtractor/apiextractor.h b/sources/shiboken2/ApiExtractor/apiextractor.h
index 1080ff507..ac90f5b2f 100644
--- a/sources/shiboken2/ApiExtractor/apiextractor.h
+++ b/sources/shiboken2/ApiExtractor/apiextractor.h
@@ -33,6 +33,8 @@
#include "dependency.h"
#include "abstractmetalang_typedefs.h"
#include "apiextractormacros.h"
+#include "header_paths.h"
+#include "typedatabase_typedefs.h"
#include "typesystem_typedefs.h"
#include <QStringList>
@@ -67,9 +69,9 @@ public:
void setSilent(bool value);
void addTypesystemSearchPath(const QString& path);
void addTypesystemSearchPath(const QStringList& paths);
- void addIncludePath(const QString& path);
- void addIncludePath(const QStringList& paths);
- QStringList includePaths() const { return m_includePaths; }
+ void addIncludePath(const HeaderPath& path);
+ void addIncludePath(const HeaderPaths& paths);
+ HeaderPaths includePaths() const { return m_includePaths; }
void setLogDirectory(const QString& logDir);
bool setApiVersion(const QString& package, const QString& version);
void setDropTypeEntries(QString dropEntries);
@@ -94,7 +96,7 @@ public:
private:
QString m_typeSystemFileName;
QString m_cppFileName;
- QStringList m_includePaths;
+ HeaderPaths m_includePaths;
AbstractMetaBuilder* m_builder;
QString m_logDirectory;
diff --git a/sources/shiboken2/ApiExtractor/asttoxml.cpp b/sources/shiboken2/ApiExtractor/asttoxml.cpp
deleted file mode 100644
index 7a2f1261e..000000000
--- a/sources/shiboken2/ApiExtractor/asttoxml.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "asttoxml.h"
-#include "parser/control.h"
-#include "parser/parser.h"
-#include "parser/binder.h"
-
-
-#include <QtCore/QXmlStreamWriter>
-#include <QtCore/QTextStream>
-#include <QtCore/QTextCodec>
-#include <QtCore/QFile>
-
-typedef QHash<QString, EnumModelItem> EnumMap;
-typedef QHash<QString, FunctionModelItem> FunctionModelItemMap;
-typedef QHash<QString, ClassModelItem> ClassModelItemMap;
-typedef QHash<QString, NamespaceModelItem> NamespaceModelItemMap;
-
-void astToXML(QString name)
-{
- QFile file(name);
-
- if (!file.open(QFile::ReadOnly))
- return;
-
- QTextStream stream(&file);
- stream.setCodec(QTextCodec::codecForName("UTF-8"));
- QByteArray contents = stream.readAll().toUtf8();
- file.close();
-
- Control control;
- Parser p(&control);
- pool __pool;
-
- TranslationUnitAST *ast = p.parse(contents, contents.size(), &__pool);
-
- CodeModel model;
- Binder binder(&model, p.location());
- FileModelItem dom = binder.run(ast);
-
- QFile outputFile;
- if (!outputFile.open(stdout, QIODevice::WriteOnly))
- return;
-
- QXmlStreamWriter s(&outputFile);
- s.setAutoFormatting(true);
-
- s.writeStartElement(QLatin1String("code"));
-
- const NamespaceList &namespaces = dom->namespaces();
- foreach (const NamespaceModelItem &n, namespaces)
- writeOutNamespace(s, n);
-
- const ClassList &classList = dom->classes();
- foreach (const ClassModelItem &c, classList)
- writeOutClass(s, c);
-
- s.writeEndElement();
-}
-
-void writeOutNamespace(QXmlStreamWriter &s, const NamespaceModelItem &item)
-{
- s.writeStartElement(QLatin1String("namespace"));
- s.writeAttribute(QLatin1String("name"), item->name());
-
- const NamespaceList &namespaces = item->namespaces();
- foreach (const NamespaceModelItem &n, namespaces)
- writeOutNamespace(s, n);
-
- const ClassList &classList = item->classes();
- foreach (const ClassModelItem &c, classList)
- writeOutClass(s, c);
-
- const EnumList &enums = item->enums();
- foreach (const EnumModelItem &e, enums)
- writeOutEnum(s, e);
-
- s.writeEndElement();
-}
-
-void writeOutEnum(QXmlStreamWriter &s, const EnumModelItem &item)
-{
- QString qualifiedName = item->qualifiedName().join(QLatin1String("::"));
- s.writeStartElement(QLatin1String("enum"));
- s.writeAttribute(QLatin1String("name"), qualifiedName);
-
- EnumeratorList enumList = item->enumerators();
- for (int i = 0; i < enumList.size() ; i++) {
- s.writeStartElement(QLatin1String("enumerator"));
- if (!enumList[i]->value().isEmpty())
- s.writeAttribute(QLatin1String("value"), enumList[i]->value());
- s.writeCharacters(enumList[i]->name());
-
- s.writeEndElement();
- }
- s.writeEndElement();
-}
-
-void writeOutFunction(QXmlStreamWriter &s, const FunctionModelItem &item)
-{
- QString qualifiedName = item->qualifiedName().join(QLatin1String("::"));
- s.writeStartElement(QLatin1String("function"));
- s.writeAttribute(QLatin1String("name"), qualifiedName);
-
- ArgumentList arguments = item->arguments();
- for (int i = 0; i < arguments.size() ; i++) {
- s.writeStartElement(QLatin1String("argument"));
- s.writeAttribute(QLatin1String("type"), arguments[i]->type().qualifiedName().join(QLatin1String("::")));
- s.writeEndElement();
- }
- s.writeEndElement();
-}
-
-void writeOutClass(QXmlStreamWriter &s, const ClassModelItem &item)
-{
- QString qualifiedName = item->qualifiedName().join(QLatin1String("::"));
- s.writeStartElement(QLatin1String("class"));
- s.writeAttribute(QLatin1String("name"), qualifiedName);
-
- const EnumList &enums = item->enums();
- foreach (const EnumModelItem &e, enums)
- writeOutEnum(s, e);
-
- const FunctionList &functionList = item->functions();
- foreach (const FunctionModelItem &func, functionList)
- writeOutFunction(s, func);
-
- const ClassList &classList = item->classes();
- foreach (const ClassModelItem &c, classList)
- writeOutClass(s, c);
-
- s.writeEndElement();
-}
-
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
new file mode 100644
index 000000000..1ed054d91
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
@@ -0,0 +1,858 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "clangbuilder.h"
+#include "compilersupport.h"
+#include "clangutils.h"
+
+#include <codemodel.h>
+
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QHash>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStack>
+#include <QtCore/QVector>
+
+#include <string.h>
+
+#if QT_VERSION < 0x050800
+# define Q_FALLTHROUGH() (void)0
+#endif
+
+namespace clang {
+
+static inline QString colonColon() { return QStringLiteral("::"); }
+static inline QString templateBrackets() { return QStringLiteral("<>"); }
+
+static inline bool isClassCursor(const CXCursor &c)
+{
+ return c.kind == CXCursor_ClassDecl || c.kind == CXCursor_StructDecl
+ || c.kind == CXCursor_ClassTemplate
+ || c.kind == CXCursor_ClassTemplatePartialSpecialization;
+}
+
+static inline bool withinClassDeclaration(const CXCursor &cursor)
+{
+ return isClassCursor(clang_getCursorLexicalParent(cursor));
+}
+
+static QString fixTypeName(QString t)
+{
+ // Fix "Foo &" -> "Foo&", similarly "Bar **" -> "Bar**"
+ int pos = t.size() - 1;
+ for (; pos >= 0 && (t.at(pos) == QLatin1Char('&') || t.at(pos) == QLatin1Char('*')); --pos) {}
+ if (pos > 0 && t.at(pos) == QLatin1Char(' '))
+ t.remove(pos, 1);
+ return t;
+}
+
+// Insert template parameter to class name: "Foo<>" -> "Foo<T1>" -> "Foo<T1,T2>"
+// This needs to be done immediately when template parameters are encountered since
+// the class name "Foo<T1,T2>" is the scope for nested items.
+static bool insertTemplateParameterIntoClassName(const QString &parmName, QString *name)
+{
+ if (Q_UNLIKELY(!name->endsWith(QLatin1Char('>'))))
+ return false;
+ const bool needsComma = name->at(name->size() - 2) != QLatin1Char('<');
+ const int insertionPos = name->size() - 1;
+ name->insert(insertionPos, parmName);
+ if (needsComma)
+ name->insert(insertionPos, QLatin1Char(','));
+ return true;
+}
+
+static inline bool insertTemplateParameterIntoClassName(const QString &parmName,
+ const ClassModelItem &item)
+{
+ QString name = item->name();
+ const bool result = insertTemplateParameterIntoClassName(parmName, &name);
+ item->setName(name);
+ return result;
+}
+
+static inline CodeModel::AccessPolicy accessPolicy(CX_CXXAccessSpecifier access)
+{
+ CodeModel::AccessPolicy result = CodeModel::Public;
+ switch (access) {
+ case CX_CXXProtected:
+ result = CodeModel::Protected;
+ break;
+ case CX_CXXPrivate:
+ result = CodeModel::Private;
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+static void setFileName(const CXCursor &cursor, _CodeModelItem *item)
+{
+ const SourceRange range = getCursorRange(cursor);
+ if (!range.first.file.isEmpty()) { // Has been observed to be 0 for invalid locations
+ item->setFileName(QDir::cleanPath(range.first.file));
+ item->setStartPosition(int(range.first.line), int(range.first.column));
+ item->setEndPosition(int(range.second.line), int(range.second.column));
+ }
+}
+
+class BuilderPrivate {
+public:
+ typedef QHash<CXCursor, ClassModelItem> CursorClassHash;
+ typedef QHash<CXCursor, TypeDefModelItem> CursorTypedefHash;
+
+ explicit BuilderPrivate(BaseVisitor *bv) : m_baseVisitor(bv), m_model(new CodeModel)
+ {
+ m_scopeStack.push(NamespaceModelItem(new _FileModelItem(m_model)));
+ }
+
+ // Determine scope from top item. Note that the scope list does not necessarily
+ // match the scope stack in case of forward-declared inner classes whose definition
+ // appears in the translation unit while the scope is the outer class.
+ void updateScope()
+ {
+ if (m_scopeStack.size() <= 1)
+ m_scope.clear();
+ else
+ m_scope = m_scopeStack.back()->scope() << m_scopeStack.back()->name();
+ }
+
+ void pushScope(const ScopeModelItem &i)
+ {
+ m_scopeStack.push(i);
+ updateScope();
+ }
+
+ void popScope()
+ {
+ m_scopeStack.pop();
+ updateScope();
+ }
+
+ bool addClass(const CXCursor &cursor, CodeModel::ClassType t);
+ FunctionModelItem createFunction(const CXCursor &cursor,
+ CodeModel::FunctionType t = CodeModel::Normal) const;
+ FunctionModelItem createMemberFunction(const CXCursor &cursor) const;
+ void qualifyConstructor(const CXCursor &cursor);
+ TypeInfo createTypeInfo(const CXType &type) const;
+ TypeInfo createTypeInfo(const CXCursor &cursor) const
+ { return createTypeInfo(clang_getCursorType(cursor)); }
+
+ TemplateParameterModelItem createTemplateParameter(const CXCursor &cursor) const;
+ TemplateParameterModelItem createNonTypeTemplateParameter(const CXCursor &cursor) const;
+ void addField(const CXCursor &cursor);
+
+ QString cursorValueExpression(BaseVisitor *bv, const CXCursor &cursor) const;
+ void addBaseClass(const CXCursor &cursor);
+
+ template <class Item>
+ void qualifyTypeDef(const CXCursor &typeRefCursor, const QSharedPointer<Item> &item) const;
+
+ BaseVisitor *m_baseVisitor;
+ CodeModel *m_model;
+
+ QStack<ScopeModelItem> m_scopeStack;
+ QStringList m_scope;
+ // Store all classes by cursor so that base classes can be found and inner
+ // classes can be correctly parented in case of forward-declared inner classes
+ // (QMetaObject::Connection)
+ CursorClassHash m_cursorClassHash;
+ CursorTypedefHash m_cursorTypedefHash;
+
+ ClassModelItem m_currentClass;
+ EnumModelItem m_currentEnum;
+ FunctionModelItem m_currentFunction;
+ ArgumentModelItem m_currentArgument;
+ VariableModelItem m_currentField;
+
+ int m_anonymousEnumCount = 0;
+ CodeModel::FunctionType m_currentFunctionType = CodeModel::Normal;
+};
+
+bool BuilderPrivate::addClass(const CXCursor &cursor, CodeModel::ClassType t)
+{
+ QString className = getCursorSpelling(cursor);
+ m_currentClass.reset(new _ClassModelItem(m_model, className));
+ setFileName(cursor, m_currentClass.data());
+ m_currentClass->setClassType(t);
+ // Some inner class? Note that it does not need to be (lexically) contained in a
+ // class since it is possible to forward declare an inner class:
+ // class QMetaObject { class Connection; }
+ // class QMetaObject::Connection {}
+ const CXCursor semPar = clang_getCursorSemanticParent(cursor);
+ if (isClassCursor(semPar)) {
+ const CursorClassHash::const_iterator it = m_cursorClassHash.constFind(semPar);
+ if (it == m_cursorClassHash.constEnd()) {
+ const QString message = QStringLiteral("Unable to find parent of inner class ") + className;
+ const Diagnostic d(message, cursor, CXDiagnostic_Error);
+ qWarning() << d;
+ m_baseVisitor->appendDiagnostic(d);
+ return false;
+ }
+ const ClassModelItem &containingClass = it.value();
+ containingClass->addClass(m_currentClass);
+ m_currentClass->setScope(containingClass->scope() << containingClass->name());
+ } else {
+ m_currentClass->setScope(m_scope);
+ m_scopeStack.back()->addClass(m_currentClass);
+ }
+ pushScope(m_currentClass);
+ m_cursorClassHash.insert(cursor, m_currentClass);
+ return true;
+}
+
+FunctionModelItem BuilderPrivate::createFunction(const CXCursor &cursor,
+ CodeModel::FunctionType t) const
+{
+ QString name = getCursorSpelling(cursor);
+ // Apply type fixes to "operator X &" -> "operator X&"
+ if (name.startsWith(QLatin1String("operator ")))
+ name = fixTypeName(name);
+ FunctionModelItem result(new _FunctionModelItem(m_model, name));
+ setFileName(cursor, result.data());
+ result->setType(createTypeInfo(clang_getCursorResultType(cursor)));
+ result->setFunctionType(t);
+ result->setScope(m_scope);
+ result->setStatic(clang_Cursor_getStorageClass(cursor) == CX_SC_Static);
+ return result;
+}
+
+static inline CodeModel::FunctionType functionTypeFromCursor(const CXCursor &cursor)
+{
+ CodeModel::FunctionType result = CodeModel::Normal;
+ switch (cursor.kind) {
+ case CXCursor_Constructor:
+ if (clang_CXXConstructor_isCopyConstructor(cursor) != 0)
+ result = CodeModel::CopyConstructor;
+ else if (clang_CXXConstructor_isMoveConstructor(cursor) != 0)
+ result = CodeModel::MoveConstructor;
+ else
+ result = CodeModel::Constructor;
+ break;
+ case CXCursor_Destructor:
+ result = CodeModel::Destructor;
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+FunctionModelItem BuilderPrivate::createMemberFunction(const CXCursor &cursor) const
+{
+ const CodeModel::FunctionType functionType =
+ m_currentFunctionType == CodeModel::Signal || m_currentFunctionType == CodeModel::Slot
+ ? m_currentFunctionType // by annotation
+ : functionTypeFromCursor(cursor);
+ FunctionModelItem result = createFunction(cursor, functionType);
+ result->setAccessPolicy(accessPolicy(clang_getCXXAccessSpecifier(cursor)));
+ result->setConstant(clang_CXXMethod_isConst(cursor) != 0);
+ result->setStatic(clang_CXXMethod_isStatic(cursor) != 0);
+ result->setVirtual(clang_CXXMethod_isVirtual(cursor) != 0);
+ result->setAbstract(clang_CXXMethod_isPureVirtual(cursor) != 0);
+ return result;
+}
+
+// For CXCursor_Constructor, on endToken().
+void BuilderPrivate::qualifyConstructor(const CXCursor &cursor)
+{
+ // Clang does not tell us whether a constructor is explicit, preventing it
+ // from being used for implicit conversions. Try to guess whether a
+ // constructor is explicit in the C++99 sense (1 parameter) by checking for
+ // isConvertingConstructor() == 0. Fixme: The notion of "isConvertingConstructor"
+ // should be used in the code model instead of "explicit"
+ if (clang_CXXConstructor_isDefaultConstructor(cursor) == 0
+ && m_currentFunction->arguments().size() == 1
+ && clang_CXXConstructor_isCopyConstructor(cursor) == 0
+ && clang_CXXConstructor_isMoveConstructor(cursor) == 0) {
+ m_currentFunction->setExplicit(clang_CXXConstructor_isConvertingConstructor(cursor) == 0);
+ }
+}
+
+TemplateParameterModelItem BuilderPrivate::createTemplateParameter(const CXCursor &cursor) const
+{
+ return TemplateParameterModelItem(new _TemplateParameterModelItem(m_model, getCursorSpelling(cursor)));
+}
+
+TemplateParameterModelItem BuilderPrivate::createNonTypeTemplateParameter(const CXCursor &cursor) const
+{
+ TemplateParameterModelItem result = createTemplateParameter(cursor);
+ result->setType(createTypeInfo(cursor));
+ return result;
+}
+
+// CXCursor_VarDecl, CXCursor_FieldDecl cursors
+void BuilderPrivate::addField(const CXCursor &cursor)
+{
+ VariableModelItem field(new _VariableModelItem(m_model, getCursorSpelling(cursor)));
+ field->setAccessPolicy(accessPolicy(clang_getCXXAccessSpecifier(cursor)));
+ field->setScope(m_scope);
+ field->setType(createTypeInfo(cursor));
+ field->setMutable(clang_CXXField_isMutable(cursor) != 0);
+ m_currentField = field;
+ m_scopeStack.back()->addVariable(field);
+}
+
+// Array helpers: Parse "a[2][4]" into a list of dimensions
+
+struct ArrayDimensionResult
+{
+ QVector<QStringRef> dimensions;
+ int position;
+};
+
+static ArrayDimensionResult arrayDimensions(const QString &typeName)
+{
+ ArrayDimensionResult result;
+ result.position = typeName.indexOf(QLatin1Char('['));
+ for (int openingPos = result.position; openingPos != -1; ) {
+ const int closingPos = typeName.indexOf(QLatin1Char(']'), openingPos + 1);
+ if (closingPos == -1)
+ break;
+ result.dimensions.append(typeName.midRef(openingPos + 1, closingPos - openingPos - 1));
+ openingPos = typeName.indexOf(QLatin1Char('['), closingPos + 1);
+ }
+ return result;
+}
+
+// Array helpers: Parse "a[2][4]" into a list of dimensions or "" for none
+static QStringList parseArrayArgs(const CXType &type, QString *typeName)
+{
+ const ArrayDimensionResult dimensions = arrayDimensions(*typeName);
+ Q_ASSERT(!dimensions.dimensions.isEmpty());
+
+ QStringList result;
+ // get first dimension from clang, preferably.
+ // "a[]" is seen as pointer by Clang, set special indicator ""
+ const long long size = clang_getArraySize(type);
+ result.append(size >= 0 ? QString::number(size) : QString());
+ // Parse out remaining dimensions
+ for (int i = 1, count = dimensions.dimensions.size(); i < count; ++i)
+ result.append(dimensions.dimensions.at(i).toString());
+ typeName->truncate(dimensions.position);
+ return result;
+}
+
+TypeInfo BuilderPrivate::createTypeInfo(const CXType &type) const
+{
+ if (type.kind == CXType_Pointer) { // Check for function pointers, first.
+ const CXType pointeeType = clang_getPointeeType(type);
+ const int argCount = clang_getNumArgTypes(pointeeType);
+ if (argCount >= 0) {
+ TypeInfo result = createTypeInfo(clang_getResultType(pointeeType));
+ result.setFunctionPointer(true);
+ for (int a = 0; a < argCount; ++a)
+ result.addArgument(createTypeInfo(clang_getArgType(pointeeType, unsigned(a))));
+ return result;
+ }
+ }
+
+ TypeInfo typeInfo;
+ QString typeName = fixTypeName(getTypeName(type));
+
+ int indirections = 0;
+ // "int **"
+ for ( ; typeName.endsWith(QLatin1Char('*')) ; ++indirections)
+ typeName.chop(1);
+ typeInfo.setIndirections(indirections);
+ // "int &&"
+ if (typeName.endsWith(QLatin1String("&&"))) {
+ typeName.chop(2);
+ typeInfo.setReferenceType(RValueReference);
+ } else if (typeName.endsWith(QLatin1Char('&'))) { // "int &"
+ typeName.chop(1);
+ typeInfo.setReferenceType(LValueReference);
+ }
+
+ // "int [3], int[]"
+ if (type.kind == CXType_ConstantArray || type.kind == CXType_IncompleteArray
+ || type.kind == CXType_VariableArray || type.kind == CXType_DependentSizedArray) {
+ typeInfo.setArrayElements(parseArrayArgs(type, &typeName));
+ }
+
+ bool isConstant = clang_isConstQualifiedType(type) != 0;
+ // A "char *const" parameter, is considered to be const-qualified by Clang, but
+ // not in the TypeInfo sense (corresponds to "char *" and not "const char *").
+ if (type.kind == CXType_Pointer && isConstant && typeName.endsWith(QLatin1String("const"))) {
+ typeName.chop(5);
+ typeName = typeName.trimmed();
+ isConstant = false;
+ }
+ // Clang has been observed to return false for "const int .."
+ if (!isConstant && typeName.startsWith(QLatin1String("const "))) {
+ typeName.remove(0, 6);
+ isConstant = true;
+ }
+ typeInfo.setConstant(isConstant);
+
+ // clang_isVolatileQualifiedType() returns true for "volatile int", but not for "volatile int *"
+ if (typeName.startsWith(QLatin1String("volatile "))) {
+ typeName.remove(0, 9);
+ typeInfo.setVolatile(true);
+ }
+
+ typeName = typeName.trimmed();
+
+ typeInfo.setQualifiedName(typeName.split(colonColon()));
+ // 3320:CINDEX_LINKAGE int clang_getNumArgTypes(CXType T); function ptr types?
+ return typeInfo;
+}
+
+// extract an expression from the cursor via source
+// CXCursor_EnumConstantDecl, ParmDecl (a = Flag1 | Flag2)
+QString BuilderPrivate::cursorValueExpression(BaseVisitor *bv, const CXCursor &cursor) const
+{
+ BaseVisitor::CodeSnippet snippet = bv->getCodeSnippet(cursor);
+ const char *equalSign = std::find(snippet.first, snippet.second, '=');
+ if (equalSign == snippet.second)
+ return QString();
+ ++equalSign;
+ return QString::fromLocal8Bit(equalSign, int(snippet.second - equalSign)).trimmed();
+}
+
+// Add a base class to the current class from CXCursor_CXXBaseSpecifier
+void BuilderPrivate::addBaseClass(const CXCursor &cursor)
+{
+ const CXType inheritedType = clang_getCursorType(cursor); // Note spelling has "struct baseClass",
+ QString baseClassName = getTypeName(inheritedType); // use type.
+ const CXCursor declCursor = clang_getTypeDeclaration(inheritedType);
+ const CursorClassHash::const_iterator it = m_cursorClassHash.constFind(declCursor);
+ const CodeModel::AccessPolicy access = accessPolicy(clang_getCXXAccessSpecifier(cursor));
+ if (it == m_cursorClassHash.constEnd()) {
+ // Set unqualified name. This happens in cases like "class X : public std::list<...>"
+ // "template<class T> class Foo : public T" and standard types like true_type, false_type.
+ m_currentClass->addBaseClass(baseClassName, access);
+ return;
+ }
+ // Completely qualify the class name by looking it up and taking its scope
+ // plus the actual baseClass stripped off any scopes. Consider:
+ // namespace std {
+ // template <class T> class vector {};
+ // namespace n {
+ // class Foo : public vector<int> {};
+ // }
+ // }
+ // should have "std::vector<int>" as base class (whereas the type of the base class is
+ // "std::vector<T>").
+ const QStringList &baseScope = it.value()->scope();
+ if (!baseScope.isEmpty()) {
+ const int lastSep = baseClassName.lastIndexOf(colonColon());
+ if (lastSep >= 0)
+ baseClassName.remove(0, lastSep + colonColon().size());
+ baseClassName.prepend(colonColon());
+ baseClassName.prepend(baseScope.join(colonColon()));
+ }
+ m_currentClass->addBaseClass(baseClassName, access);
+}
+
+static inline CXCursor definitionFromTypeRef(const CXCursor &typeRefCursor)
+{
+ Q_ASSERT(typeRefCursor.kind == CXCursor_TypeRef);
+ return clang_getTypeDeclaration(clang_getCursorType(typeRefCursor));
+}
+
+// Qualify function arguments or fields that are typedef'ed from another scope:
+// enum ConversionFlag {};
+// typedef QFlags<ConversionFlag> ConversionFlags;
+// class QTextCodec {
+// enum ConversionFlag {};
+// typedef QFlags<ConversionFlag> ConversionFlags;
+// struct ConverterState {
+// explicit ConverterState(ConversionFlags);
+// ^^ qualify to QTextCodec::ConversionFlags
+// ConversionFlags m_flags;
+// ^^ ditto
+
+template <class Item> // ArgumentModelItem, VariableModelItem
+void BuilderPrivate::qualifyTypeDef(const CXCursor &typeRefCursor, const QSharedPointer<Item> &item) const
+{
+ typedef typename CursorTypedefHash::const_iterator ConstIt;
+
+ TypeInfo type = item->type();
+ if (type.qualifiedName().size() == 1) { // item's type is unqualified.
+ const ConstIt it = m_cursorTypedefHash.constFind(definitionFromTypeRef(typeRefCursor));
+ if (it != m_cursorTypedefHash.constEnd() && !it.value()->scope().isEmpty()) {
+ type.setQualifiedName(it.value()->scope() + type.qualifiedName());
+ item->setType(type);
+ }
+ }
+}
+
+Builder::Builder()
+{
+ d = new BuilderPrivate(this);
+}
+
+Builder::~Builder()
+{
+ delete d;
+}
+
+static inline bool compareHeaderName(const char *haystack, const char *needle)
+{
+ const char *lastSlash = strrchr(haystack, '/');
+#ifdef Q_OS_WIN
+ if (lastSlash == nullptr)
+ lastSlash = strrchr(haystack, '\\');
+#endif
+ if (lastSlash == nullptr)
+ lastSlash = haystack;
+ else
+ ++lastSlash;
+#ifdef Q_OS_WIN
+ return _stricmp(lastSlash, needle) == 0;
+#else
+ return strcmp(lastSlash, needle) == 0;
+#endif
+}
+
+#ifdef Q_OS_UNIX
+static bool cStringStartsWith(const char *prefix, const char *str)
+{
+ return strncmp(prefix, str, strlen(prefix)) == 0;
+}
+#endif
+
+bool Builder::visitLocation(const CXSourceLocation &location) const
+{
+ if (clang_Location_isInSystemHeader(location) == 0)
+ return true;
+ CXFile file; // void *
+ unsigned line;
+ unsigned column;
+ unsigned offset;
+ clang_getExpansionLocation(location, &file, &line, &column, &offset);
+ const CXString cxFileName = clang_getFileName(file);
+ // Has been observed to be 0 for invalid locations
+ if (const char *cFileName = clang_getCString(cxFileName)) {
+ // Resolve OpenGL typedefs although the header is considered a system header.
+ const bool visitHeader = compareHeaderName(cFileName, "gl.h")
+#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
+ || cStringStartsWith("/usr/include/stdint.h", cFileName)
+#endif
+#if defined(Q_OS_LINUX)
+ || cStringStartsWith("/usr/include/stdlib.h", cFileName)
+ || cStringStartsWith("/usr/include/sys/types.h", cFileName)
+#elif defined(Q_OS_MACOS)
+ // Parse the following system headers to get the correct typdefs for types like
+ // int32_t, which are used in the macOS implementation of OpenGL framework.
+ || compareHeaderName(cFileName, "gltypes.h")
+ || cStringStartsWith("/usr/include/_types", cFileName)
+ || cStringStartsWith("/usr/include/sys/_types", cFileName)
+#endif
+ ;
+ clang_disposeString(cxFileName);
+ if (visitHeader)
+ return true;
+ }
+ return false;
+}
+
+FileModelItem Builder::dom() const
+{
+ Q_ASSERT(!d->m_scopeStack.isEmpty());
+ return qSharedPointerDynamicCast<_FileModelItem>(d->m_scopeStack.constFirst());
+}
+
+static QString msgOutOfOrder(const CXCursor &cursor, const char *expectedScope)
+{
+ return getCursorKindName(cursor.kind) + QLatin1Char(' ')
+ + getCursorSpelling(cursor) + QLatin1String(" encountered outside ")
+ + QLatin1String(expectedScope) + QLatin1Char('.');
+}
+
+static CodeModel::ClassType codeModelClassTypeFromCursor(CXCursorKind kind)
+{
+ CodeModel::ClassType result = CodeModel::Class;
+ if (kind == CXCursor_UnionDecl)
+ result = CodeModel::Union;
+ else if (kind == CXCursor_StructDecl)
+ result = CodeModel::Struct;
+ return result;
+}
+
+BaseVisitor::StartTokenResult Builder::startToken(const CXCursor &cursor)
+{
+ switch (cursor.kind) {
+ case CXCursor_CXXAccessSpecifier:
+ d->m_currentFunctionType = CodeModel::Normal;
+ break;
+ case CXCursor_AnnotateAttr: {
+ const QString annotation = getCursorSpelling(cursor);
+ if (annotation == QLatin1String("qt_slot"))
+ d->m_currentFunctionType = CodeModel::Slot;
+ else if (annotation == QLatin1String("qt_signal"))
+ d->m_currentFunctionType = CodeModel::Signal;
+ else
+ d->m_currentFunctionType = CodeModel::Normal;
+ }
+ break;
+ case CXCursor_CXXBaseSpecifier:
+ if (d->m_currentClass.isNull()) {
+ const Diagnostic d(msgOutOfOrder(cursor, "class"), cursor, CXDiagnostic_Error);
+ qWarning() << d;
+ appendDiagnostic(d);
+ return Error;
+ }
+ d->addBaseClass(cursor);
+ break;
+ case CXCursor_ClassDecl:
+ case CXCursor_UnionDecl:
+ case CXCursor_StructDecl:
+ if (clang_isCursorDefinition(cursor) == 0)
+ return Skip;
+ if (!d->addClass(cursor, codeModelClassTypeFromCursor(cursor.kind)))
+ return Error;
+ break;
+ case CXCursor_ClassTemplate:
+ case CXCursor_ClassTemplatePartialSpecialization:
+ if (clang_isCursorDefinition(cursor) == 0)
+ return Skip;
+ d->addClass(cursor, CodeModel::Class);
+ d->m_currentClass->setName(d->m_currentClass->name() + templateBrackets());
+ d->m_scope.back() += templateBrackets();
+ break;
+ case CXCursor_EnumDecl: {
+ QString name = getCursorSpelling(cursor);
+ const bool anonymous = name.isEmpty();
+ if (anonymous)
+ name = QStringLiteral("enum_") + QString::number(++d->m_anonymousEnumCount);
+ d->m_currentEnum.reset(new _EnumModelItem(d->m_model, name));
+ setFileName(cursor, d->m_currentEnum.data());
+ d->m_currentEnum->setScope(d->m_scope);
+ d->m_currentEnum->setAnonymous(anonymous);
+ if (!qSharedPointerDynamicCast<_ClassModelItem>(d->m_scopeStack.back()).isNull())
+ d->m_currentEnum->setAccessPolicy(accessPolicy(clang_getCXXAccessSpecifier(cursor)));
+ d->m_scopeStack.back()->addEnum(d->m_currentEnum);
+ }
+ break;
+ case CXCursor_EnumConstantDecl: {
+ const QString name = getCursorSpelling(cursor);
+ if (d->m_currentEnum.isNull()) {
+ const Diagnostic d(msgOutOfOrder(cursor, "enum"), cursor, CXDiagnostic_Error);
+ qWarning() << d;
+ appendDiagnostic(d);
+ return Error;
+ }
+ EnumeratorModelItem enumConstant(new _EnumeratorModelItem(d->m_model, name));
+ enumConstant->setValue(d->cursorValueExpression(this, cursor));
+ d->m_currentEnum->addEnumerator(enumConstant);
+ }
+ break;
+ case CXCursor_VarDecl:
+ // static class members are seen as CXCursor_VarDecl
+ if (!d->m_currentClass.isNull() && isClassCursor(clang_getCursorSemanticParent(cursor))) {
+ d->addField(cursor);
+ d->m_currentField->setStatic(true);
+ }
+ break;
+ case CXCursor_FieldDecl:
+ d->addField(cursor);
+ break;
+#if CINDEX_VERSION_MAJOR > 0 || CINDEX_VERSION_MINOR >= 37 // Clang 4.0
+ case CXCursor_FriendDecl:
+ return Skip;
+#endif
+ case CXCursor_Constructor:
+ case CXCursor_Destructor: // Note: Also use clang_CXXConstructor_is..Constructor?
+ case CXCursor_CXXMethod:
+ case CXCursor_ConversionFunction:
+ // Skip inline member functions outside class, only go by declarations inside class
+ if (!withinClassDeclaration(cursor))
+ return Skip;
+ d->m_currentFunction = d->createMemberFunction(cursor);
+ d->m_scopeStack.back()->addFunction(d->m_currentFunction);
+ break;
+ // Not fully supported, currently, seen as normal function
+ // Note: May appear inside class (member template) or outside (free template).
+ case CXCursor_FunctionTemplate: {
+ const CXCursor semParent = clang_getCursorSemanticParent(cursor);
+ if (isClassCursor(semParent)) {
+ if (semParent == clang_getCursorLexicalParent(cursor)) {
+ d->m_currentFunction = d->createMemberFunction(cursor);
+ d->m_scopeStack.back()->addFunction(d->m_currentFunction);
+ break;
+ } else {
+ return Skip; // inline member functions outside class
+ }
+ }
+ }
+ Q_FALLTHROUGH(); // fall through to free template function.
+ case CXCursor_FunctionDecl:
+ d->m_currentFunction = d->createFunction(cursor);
+ d->m_scopeStack.back()->addFunction(d->m_currentFunction);
+ break;
+ case CXCursor_Namespace: {
+ const QString name = getCursorSpelling(cursor);
+ const NamespaceModelItem parentNamespaceItem = qSharedPointerDynamicCast<_NamespaceModelItem>(d->m_scopeStack.back());
+ if (parentNamespaceItem.isNull()) {
+ const QString message = msgOutOfOrder(cursor, "namespace")
+ + QLatin1String(" (current scope: ") + d->m_scopeStack.back()->name() + QLatin1Char(')');
+ const Diagnostic d(message, cursor, CXDiagnostic_Error);
+ qWarning() << d;
+ appendDiagnostic(d);
+ return Error;
+ }
+ // If possible, continue existing namespace (as otherwise, all headers
+ // where a namespace is continued show up in the type database).
+ NamespaceModelItem namespaceItem = parentNamespaceItem->findNamespace(name);
+ if (namespaceItem.isNull()) {
+ namespaceItem.reset(new _NamespaceModelItem(d->m_model, name));
+ setFileName(cursor, namespaceItem.data());
+ namespaceItem->setScope(d->m_scope);
+ parentNamespaceItem->addNamespace(namespaceItem);
+ }
+ d->pushScope(namespaceItem);
+ }
+ break;
+ case CXCursor_ParmDecl:
+ // Skip in case of nested CXCursor_ParmDecls in case one parameter is a function pointer
+ // and function pointer typedefs.
+ if (d->m_currentArgument.isNull() && !d->m_currentFunction.isNull()) {
+ const QString name = getCursorSpelling(cursor);
+ d->m_currentArgument.reset(new _ArgumentModelItem(d->m_model, name));
+ d->m_currentArgument->setType(d->createTypeInfo(cursor));
+ d->m_currentFunction->addArgument(d->m_currentArgument);
+ QString defaultValueExpression = d->cursorValueExpression(this, cursor);
+ if (!defaultValueExpression.isEmpty()) {
+ d->m_currentArgument->setDefaultValueExpression(defaultValueExpression);
+ d->m_currentArgument->setDefaultValue(true);
+ }
+ } else {
+ return Skip;
+ }
+ break;
+ case CXCursor_TemplateTypeParameter:
+ case CXCursor_NonTypeTemplateParameter: {
+ const TemplateParameterModelItem tItem = cursor.kind == CXCursor_TemplateTemplateParameter
+ ? d->createTemplateParameter(cursor) : d->createNonTypeTemplateParameter(cursor);
+ // Apply to function/member template?
+ if (!d->m_currentFunction.isNull()) {
+ d->m_currentFunction->setTemplateParameters(d->m_currentFunction->templateParameters() << tItem);
+ } else if (!d->m_currentClass.isNull()) { // Apply to class
+ const QString &tplParmName = tItem->name();
+ if (Q_UNLIKELY(!insertTemplateParameterIntoClassName(tplParmName, d->m_currentClass)
+ || !insertTemplateParameterIntoClassName(tplParmName, &d->m_scope.back()))) {
+ const QString message = QStringLiteral("Error inserting template parameter \"") + tplParmName
+ + QStringLiteral("\" into ") + d->m_currentClass->name();
+ const Diagnostic d(message, cursor, CXDiagnostic_Error);
+ qWarning() << d;
+ appendDiagnostic(d);
+ return Error;
+ }
+ d->m_currentClass->setTemplateParameters(d->m_currentClass->templateParameters() << tItem);
+ }
+ }
+ break;
+ case CXCursor_TypeAliasDecl:
+ case CXCursor_TypeAliasTemplateDecl: // May contain nested CXCursor_TemplateTypeParameter
+ return Skip;
+ case CXCursor_TypedefDecl: {
+ const QString name = getCursorSpelling(cursor);
+ TypeDefModelItem item(new _TypeDefModelItem(d->m_model, name));
+ setFileName(cursor, item.data());
+ item->setType(d->createTypeInfo(clang_getTypedefDeclUnderlyingType(cursor)));
+ item->setScope(d->m_scope);
+ d->m_scopeStack.back()->addTypeDef(item);
+ d->m_cursorTypedefHash.insert(cursor, item);
+ }
+ break;
+ case CXCursor_TypeRef:
+ if (!d->m_currentFunction.isNull()) {
+ if (d->m_currentArgument.isNull())
+ d->qualifyTypeDef(cursor, d->m_currentFunction); // return type
+ else
+ d->qualifyTypeDef(cursor, d->m_currentArgument);
+ } else if (!d->m_currentField.isNull()) {
+ d->qualifyTypeDef(cursor, d->m_currentField);
+ }
+ break;
+ case CXCursor_CXXFinalAttr:
+ if (!d->m_currentFunction.isNull())
+ d->m_currentFunction->setFinal(true);
+ else if (!d->m_currentClass.isNull())
+ d->m_currentClass->setFinal(true);
+ break;
+ case CXCursor_CXXOverrideAttr:
+ if (!d->m_currentFunction.isNull())
+ d->m_currentFunction->setOverride(true);
+ break;
+ default:
+ break;
+ }
+ return BaseVisitor::Recurse;
+}
+
+bool Builder::endToken(const CXCursor &cursor)
+{
+ switch (cursor.kind) {
+ case CXCursor_UnionDecl:
+ case CXCursor_ClassDecl:
+ case CXCursor_StructDecl:
+ case CXCursor_ClassTemplate:
+ case CXCursor_ClassTemplatePartialSpecialization:
+ d->popScope();
+ // Continue in outer class after leaving inner class?
+ if (ClassModelItem lastClass = qSharedPointerDynamicCast<_ClassModelItem>(d->m_scopeStack.back()))
+ d->m_currentClass = lastClass;
+ else
+ d->m_currentClass.clear();
+ d->m_currentFunctionType = CodeModel::Normal;
+ break;
+ case CXCursor_EnumDecl:
+ d->m_currentEnum.clear();
+ break;
+ case CXCursor_VarDecl:
+ case CXCursor_FieldDecl:
+ d->m_currentField.clear();
+ break;
+ case CXCursor_Constructor:
+ d->qualifyConstructor(cursor);
+ d->m_currentFunction.clear();
+ break;
+ case CXCursor_Destructor:
+ case CXCursor_CXXMethod:
+ case CXCursor_FunctionDecl:
+ case CXCursor_FunctionTemplate:
+ d->m_currentFunction.clear();
+ break;
+ case CXCursor_Namespace:
+ d->popScope();
+ break;
+ case CXCursor_ParmDecl:
+ d->m_currentArgument.clear();
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+} // namespace clang
diff --git a/sources/shiboken2/ApiExtractor/parser/dumptree.h b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.h
index 5d91c6ef1..c97b7d2b7 100644
--- a/sources/shiboken2/ApiExtractor/parser/dumptree.h
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.h
@@ -1,7 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of PySide2.
@@ -27,25 +26,33 @@
**
****************************************************************************/
+#ifndef CLANGBUILDER_H
+#define CLANGBUILDER_H
-#ifndef DUMPTREE_H
-#define DUMPTREE_H
+#include "clangparser.h"
-#include "default_visitor.h"
+#include <codemodel_fwd.h>
-class DumpTree: protected DefaultVisitor
-{
+namespace clang {
+
+class BuilderPrivate;
+
+class Builder : public BaseVisitor {
public:
- DumpTree();
+ Builder();
+ ~Builder();
+
+ bool visitLocation(const CXSourceLocation &location) const override;
+
+ StartTokenResult startToken(const CXCursor &cursor) override;
+ bool endToken(const CXCursor &cursor) override;
- void dump(AST *node) {
- visit(node);
- }
+ FileModelItem dom() const;
-protected:
- virtual void visit(AST *node);
+private:
+ BuilderPrivate *d;
};
-#endif // DUMPTREE_H
+} // namespace clang
-// kate: space-indent on; indent-width 2; replace-tabs on;
+#endif // CLANGBUILDER_H
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.cpp
new file mode 100644
index 000000000..8d0fd098a
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "clangdebugutils.h"
+#include "clangutils.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QString>
+
+#include <string.h>
+
+#ifndef QT_NO_DEBUG_STREAM
+
+#ifdef Q_OS_WIN
+const char pathSep = '\\';
+#else
+const char pathSep = '/';
+#endif
+
+static const char *baseName(const char *fileName)
+{
+ const char *b = strrchr(fileName, pathSep);
+ return b ? b + 1 : fileName;
+}
+
+QDebug operator<<(QDebug s, const CXString &cs)
+{
+ s << clang_getCString(cs);
+ return s;
+}
+
+QDebug operator<<(QDebug s, CXCursorKind cursorKind) // Enum
+{
+ const CXString kindName = clang_getCursorKindSpelling(cursorKind);
+ s << kindName;
+ clang_disposeString(kindName);
+ return s;
+}
+
+static const char *accessSpecsStrings[]
+{
+ // CX_CXXInvalidAccessSpecifier, CX_CXXPublic, CX_CXXProtected, CX_CXXPrivate
+ "invalid", "public", "protected", "private"
+};
+
+QDebug operator<<(QDebug s, CX_CXXAccessSpecifier ac)
+{
+ s << accessSpecsStrings[ac];
+ return s;
+}
+
+QDebug operator<<(QDebug s, const CXType &t)
+{
+ CXString typeSpelling = clang_getTypeSpelling(t);
+ s << typeSpelling;
+ clang_disposeString(typeSpelling);
+ return s;
+}
+
+QDebug operator<<(QDebug s, const CXCursor &cursor)
+{
+ QDebugStateSaver saver(s);
+ s.nospace();
+ s.noquote();
+ const CXCursorKind kind = clang_getCursorKind(cursor);
+ s << kind;
+ if (kind >= CXCursor_FirstInvalid && kind <= CXCursor_LastInvalid)
+ return s;
+ const CXType type = clang_getCursorType(cursor);
+ switch (kind) {
+ case CXCursor_CXXAccessSpecifier:
+ s << ' ' << clang_getCXXAccessSpecifier(cursor);
+ break;
+ case CXCursor_CXXBaseSpecifier:
+ s << ", inherits=\"" << clang::getCursorSpelling(clang_getTypeDeclaration(type)) << '"';
+ break;
+ case CXCursor_CXXMethod:
+ case CXCursor_FunctionDecl:
+ case CXCursor_ConversionFunction:
+ s << ", result type=\"" << clang_getCursorResultType(cursor) << '"';
+ break;
+ case CXCursor_TypedefDecl:
+ s << ", underlyingType=\"" << clang_getTypedefDeclUnderlyingType(cursor) << '"';
+ break;
+ default:
+ break;
+ }
+
+ if (type.kind != CXType_Invalid)
+ s << ", type=\"" << type << '"';
+ if (clang_Cursor_hasAttrs(cursor))
+ s << ", [attrs]";
+
+ const QString cursorSpelling = clang::getCursorSpelling(cursor);
+ if (!cursorSpelling.isEmpty())
+ s << ", spelling=\"" << cursorSpelling << '"';
+ CXString cursorDisplay = clang_getCursorDisplayName(cursor);
+ if (const char *dpy = clang_getCString(cursorDisplay)) {
+ const QString display = QString::fromUtf8(dpy);
+ if (display != cursorSpelling)
+ s << ", display=\"" << dpy << '"';
+ }
+ clang_disposeString(cursorDisplay);
+ return s;
+}
+
+QDebug operator<<(QDebug s, const CXSourceLocation &location)
+{
+ QDebugStateSaver saver(s);
+ s.nospace();
+ CXFile file; // void *
+ unsigned line;
+ unsigned column;
+ unsigned offset;
+ clang_getExpansionLocation(location, &file, &line, &column, &offset);
+ const CXString cxFileName = clang_getFileName(file);
+ // Has been observed to be 0 for invalid locations
+ if (const char *cFileName = clang_getCString(cxFileName))
+ s << baseName(cFileName) << ':';
+ s << line << ':' << column;
+ clang_disposeString(cxFileName);
+ return s;
+}
+
+#endif // !QT_NO_DEBUG_STREAM
diff --git a/sources/shiboken2/ApiExtractor/parser/compiler_utils.h b/sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.h
index 849baf5aa..323efdd2a 100644
--- a/sources/shiboken2/ApiExtractor/parser/compiler_utils.h
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangdebugutils.h
@@ -1,7 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of PySide2.
@@ -27,24 +26,23 @@
**
****************************************************************************/
+#ifndef CLANGDEBUGUTILS_H
+#define CLANGDEBUGUTILS_H
-#ifndef COMPILER_UTILS_H
-#define COMPILER_UTILS_H
+#include <QtCore/QtGlobal>
-#include <utility>
+#include <clang-c/Index.h>
-#include "codemodel.h"
+QT_FORWARD_DECLARE_CLASS(QDebug)
+QT_FORWARD_DECLARE_CLASS(QString)
-struct TypeSpecifierAST;
-struct DeclaratorAST;
-class TokenStream;
-class Binder;
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug s, const CXString &cs);
+QDebug operator<<(QDebug s, CXCursorKind cursorKind);
+QDebug operator<<(QDebug s, CX_CXXAccessSpecifier ac);
+QDebug operator<<(QDebug s, const CXType &t);
+QDebug operator<<(QDebug s, const CXCursor &cursor);
+QDebug operator<<(QDebug s, const CXSourceLocation &location);
+#endif // !QT_NO_DEBUG_STREAM
-namespace CompilerUtils
-{
-
-TypeInfo typeDescription(TypeSpecifierAST *type_specifier, DeclaratorAST *declarator, Binder *binder);
-
-} // namespace CompilerUtils
-
-#endif // COMPILER_UTILS_H
+#endif // CLANGDEBUGUTILS_H
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp
new file mode 100644
index 000000000..16a7a3147
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangparser.cpp
@@ -0,0 +1,272 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "clangparser.h"
+#include "clangutils.h"
+#include "clangdebugutils.h"
+#include "compilersupport.h"
+
+#include <QtCore/QByteArrayList>
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QFile>
+#include <QtCore/QScopedArrayPointer>
+#include <QtCore/QString>
+
+namespace clang {
+
+SourceFileCache::Snippet SourceFileCache::getCodeSnippet(const CXCursor &cursor)
+{
+ Snippet result(nullptr, nullptr);
+ const SourceRange range = getCursorRange(cursor);
+ if (range.first.file.isEmpty() || range.second.file != range.first.file)
+ return result;
+ FileBufferCache::Iterator it = m_fileBufferCache.find(range.first.file);
+ if (it == m_fileBufferCache.end()) {
+ QFile file(range.first.file);
+ if (!file.open(QIODevice::ReadOnly)) {
+ qWarning().noquote().nospace()
+ << "Can't open " << QDir::toNativeSeparators(range.first.file)
+ << ": " << file.errorString();
+ return result;
+ }
+ it = m_fileBufferCache.insert(range.first.file, file.readAll());
+ }
+
+ const unsigned pos = range.first.offset;
+ const unsigned end = range.second.offset;
+ const QByteArray &contents = it.value();
+ if (end >= unsigned(contents.size())) {
+ qWarning().noquote().nospace() << "Range end " << end << " is above size of "
+ << range.first.file << " (" << contents.size() << ')';
+ return result;
+ }
+ result.first = contents.constData() + pos;
+ result.second = contents.constData() + end;
+ return result;
+}
+
+BaseVisitor::BaseVisitor() = default;
+BaseVisitor::~BaseVisitor() = default;
+
+bool BaseVisitor::visitLocation(const CXSourceLocation &location) const
+{
+ return clang_Location_isFromMainFile(location) != 0;
+}
+
+BaseVisitor::StartTokenResult BaseVisitor::cbHandleStartToken(const CXCursor &cursor)
+{
+ switch (cursor.kind) {
+ default:
+ break;
+ }
+
+ return startToken(cursor);
+}
+
+bool BaseVisitor::cbHandleEndToken(const CXCursor &cursor, StartTokenResult startResult)
+{
+ const bool result = startResult != Recurse || endToken(cursor);
+ switch (cursor.kind) {
+ default:
+ break;
+ }
+
+ return result;
+}
+
+BaseVisitor::CodeSnippet BaseVisitor::getCodeSnippet(const CXCursor &cursor)
+{
+ CodeSnippet result = m_fileCache.getCodeSnippet(cursor);
+ if (result.first == nullptr)
+ appendDiagnostic(Diagnostic(QStringLiteral("Unable to retrieve code snippet."), cursor, CXDiagnostic_Error));
+ return result;
+}
+
+QString BaseVisitor::getCodeSnippetString(const CXCursor &cursor)
+{
+ CodeSnippet result = m_fileCache.getCodeSnippet(cursor);
+ return result.first != nullptr
+ ? QString::fromUtf8(result.first, int(result.second - result.first))
+ : QString();
+}
+
+static CXChildVisitResult
+ visitorCallback(CXCursor cursor, CXCursor /* parent */, CXClientData clientData)
+{
+ BaseVisitor *bv = reinterpret_cast<BaseVisitor *>(clientData);
+
+ const CXSourceLocation location = clang_getCursorLocation(cursor);
+ if (!bv->visitLocation(location))
+ return CXChildVisit_Continue;
+
+ const BaseVisitor::StartTokenResult startResult = bv->cbHandleStartToken(cursor);
+ switch (startResult) {
+ case clang::BaseVisitor::Error:
+ return CXChildVisit_Break;
+ case clang::BaseVisitor::Skip:
+ break;
+ case clang::BaseVisitor::Recurse:
+ clang_visitChildren(cursor, visitorCallback, clientData);
+ break;
+ }
+
+ if (!bv->cbHandleEndToken(cursor, startResult))
+ return CXChildVisit_Break;
+
+ return CXChildVisit_Continue;
+}
+
+BaseVisitor::Diagnostics BaseVisitor::diagnostics() const
+{
+ return m_diagnostics;
+}
+
+void BaseVisitor::setDiagnostics(const Diagnostics &d)
+{
+ m_diagnostics = d;
+}
+
+void BaseVisitor::appendDiagnostic(const Diagnostic &d)
+{
+ m_diagnostics.append(d);
+}
+
+static inline const char **byteArrayListToFlatArgV(const QByteArrayList &bl)
+{
+ const char **result = new const char *[bl.size() + 1];
+ result[bl.size()] = nullptr;
+ std::transform(bl.cbegin(), bl.cend(), result,
+ [] (const QByteArray &a) { return a.constData(); });
+ return result;
+}
+
+static QByteArray msgCreateTranslationUnit(const QByteArrayList clangArgs, unsigned flags)
+{
+ QByteArray result = "clang_parseTranslationUnit2(0x";
+ result += QByteArray::number(flags, 16);
+ const int count = clangArgs.size();
+ result += ", cmd[" + QByteArray::number(count) + "]=";
+ for (int i = 0; i < count; ++i) {
+ const QByteArray &arg = clangArgs.at(i);
+ if (i)
+ result += ' ';
+ const bool quote = arg.contains(' ') || arg.contains('(');
+ if (quote)
+ result += '"';
+ result += arg;
+ if (quote)
+ result += '"';
+ }
+ result += ')';
+ return result;
+}
+
+static CXTranslationUnit createTranslationUnit(CXIndex index,
+ const QByteArrayList &args,
+ unsigned flags = 0)
+{
+ // courtesy qdoc
+ const unsigned defaultFlags = CXTranslationUnit_SkipFunctionBodies
+ | CXTranslationUnit_Incomplete;
+
+ static const QByteArrayList defaultArgs = {
+#if defined(Q_CC_MSVC) && _MSC_VER > 1900
+ "-std=c++1z", // Fixes constexpr errors in MSVC2017 library headers with Clang 4.1
+#else
+ "-std=c++14", // ! otherwise, t.h is parsed as "C"
+#endif
+#ifndef Q_OS_WIN
+ "-fPIC",
+#endif
+ "-fno-exceptions", // Workaround for clang bug http://reviews.llvm.org/D17988
+#ifdef Q_OS_MACOS
+ "-Wno-expansion-to-defined", // Workaround for warnings in Darwin stdlib, see
+ // https://github.com/darlinghq/darling/issues/204
+#endif
+ "-Wno-constant-logical-operand"
+ };
+
+ const QByteArrayList clangArgs = emulatedCompilerOptions() + defaultArgs + args;
+ QScopedArrayPointer<const char *> argv(byteArrayListToFlatArgV(clangArgs));
+ qDebug().noquote().nospace() << msgCreateTranslationUnit(clangArgs, flags);
+
+ CXTranslationUnit tu;
+ CXErrorCode err = clang_parseTranslationUnit2(index, nullptr, argv.data(),
+ clangArgs.size(), nullptr, 0,
+ defaultFlags | flags, &tu);
+ if (err || !tu) {
+ qWarning().noquote().nospace() << "Could not parse "
+ << clangArgs.constLast().constData() << ", error code: " << err;
+ return nullptr;
+ }
+ return tu;
+}
+
+/* clangFlags are flags to clang_parseTranslationUnit2() such as
+ * CXTranslationUnit_KeepGoing (from CINDEX_VERSION_MAJOR/CINDEX_VERSION_MINOR 0.35)
+ */
+
+bool parse(const QByteArrayList &clangArgs, unsigned clangFlags, BaseVisitor &bv)
+{
+ CXIndex index = clang_createIndex(0 /* excludeDeclarationsFromPCH */,
+ 1 /* displayDiagnostics */);
+ if (!index) {
+ qWarning() << "clang_createIndex() failed!";
+ return false;
+ }
+
+ CXTranslationUnit translationUnit = createTranslationUnit(index, clangArgs, clangFlags);
+ if (!translationUnit)
+ return false;
+
+ CXCursor rootCursor = clang_getTranslationUnitCursor(translationUnit);
+
+ clang_visitChildren(rootCursor, visitorCallback, reinterpret_cast<CXClientData>(&bv));
+
+ QVector<Diagnostic> diagnostics = getDiagnostics(translationUnit);
+ diagnostics.append(bv.diagnostics());
+ bv.setDiagnostics(diagnostics);
+
+ const bool ok = maxSeverity(diagnostics) < CXDiagnostic_Error;
+ if (!ok) {
+ QDebug debug = qWarning();
+ debug.noquote();
+ debug.nospace();
+ debug << "Errors in "
+ << QDir::toNativeSeparators(QFile::decodeName(clangArgs.constLast())) << ":\n";
+ for (const Diagnostic &diagnostic : qAsConst(diagnostics))
+ debug << diagnostic << '\n';
+ }
+
+ clang_disposeTranslationUnit(translationUnit);
+ clang_disposeIndex(index);
+ return ok;
+}
+
+} // namespace clang
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangparser.h b/sources/shiboken2/ApiExtractor/clangparser/clangparser.h
new file mode 100644
index 000000000..ef1424f17
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangparser.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CLANGPARSER_H
+#define CLANGPARSER_H
+
+#include <clang-c/Index.h>
+
+#include <QtCore/QByteArrayList>
+#include <QtCore/QHash>
+#include <QtCore/QPair>
+#include <QtCore/QString>
+#include <QtCore/QVector>
+
+namespace clang {
+
+struct Diagnostic;
+
+class SourceFileCache {
+public:
+ typedef QPair<const char *, const char *> Snippet;
+
+ Snippet getCodeSnippet(const CXCursor &cursor);
+
+private:
+ typedef QHash<QString, QByteArray> FileBufferCache;
+
+ FileBufferCache m_fileBufferCache;
+};
+
+class BaseVisitor {
+ Q_DISABLE_COPY(BaseVisitor)
+public:
+ typedef QVector<Diagnostic> Diagnostics;
+ typedef SourceFileCache::Snippet CodeSnippet;
+
+ enum StartTokenResult { Error, Skip, Recurse };
+
+ BaseVisitor();
+ virtual ~BaseVisitor();
+
+ // Whether location should be visited.
+ // defaults to clang_Location_isFromMainFile()
+ virtual bool visitLocation(const CXSourceLocation &location) const;
+
+ virtual StartTokenResult startToken(const CXCursor &cursor) = 0;
+ virtual bool endToken(const CXCursor &cursor) = 0;
+
+ StartTokenResult cbHandleStartToken(const CXCursor &cursor);
+ bool cbHandleEndToken(const CXCursor &cursor, StartTokenResult startResult);
+
+ CodeSnippet getCodeSnippet(const CXCursor &cursor);
+ QString getCodeSnippetString(const CXCursor &cursor);
+
+ Diagnostics diagnostics() const;
+ void setDiagnostics(const Diagnostics &d);
+ void appendDiagnostic(const Diagnostic &d);
+
+private:
+ SourceFileCache m_fileCache;
+ Diagnostics m_diagnostics;
+};
+
+bool parse(const QByteArrayList &clangArgs, unsigned clangFlags, BaseVisitor &ctx);
+
+} // namespace clang
+
+#endif // !CLANGPARSER_H
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp
new file mode 100644
index 000000000..f30a585bc
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangutils.cpp
@@ -0,0 +1,227 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "clangutils.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QHashFunctions>
+#include <QtCore/QProcess>
+
+bool operator==(const CXCursor &c1, const CXCursor &c2)
+{
+ return c1.kind == c2.kind
+ && c1.xdata == c2.xdata
+ && std::equal(c1.data, c1.data + sizeof(c1.data) / sizeof(c1.data[0]), c2.data);
+}
+
+uint qHash(const CXCursor &c, uint seed)
+{
+ return qHash(c.kind) ^ qHash(c.xdata) ^ qHash(c.data[0])
+ ^ qHash(c.data[1]) ^ qHash(c.data[2]) ^ seed;
+}
+
+namespace clang {
+
+SourceLocation getExpansionLocation(const CXSourceLocation &location)
+{
+ SourceLocation result;
+ CXFile file; // void *
+ clang_getExpansionLocation(location, &file, &result.line, &result.column, &result.offset);
+ const CXString cxFileName = clang_getFileName(file);
+ // Has been observed to be 0 for invalid locations
+ if (const char *cFileName = clang_getCString(cxFileName))
+ result.file = QString::fromUtf8(cFileName);
+ clang_disposeString(cxFileName);
+ return result;
+}
+
+SourceLocation getCursorLocation(const CXCursor &cursor)
+{
+ const CXSourceRange extent = clang_getCursorExtent(cursor);
+ return getExpansionLocation(clang_getRangeStart(extent));
+}
+
+CXString getFileNameFromLocation(const CXSourceLocation &location)
+{
+ CXFile file;
+ unsigned line;
+ unsigned column;
+ unsigned offset;
+ clang_getExpansionLocation(location, &file, &line, &column, &offset);
+ return clang_getFileName(file);
+}
+
+SourceRange getCursorRange(const CXCursor &cursor)
+{
+ const CXSourceRange extent = clang_getCursorExtent(cursor);
+ return qMakePair(getExpansionLocation(clang_getRangeStart(extent)),
+ getExpansionLocation(clang_getRangeEnd(extent)));
+}
+
+QString getCursorKindName(CXCursorKind cursorKind)
+{
+ CXString kindName = clang_getCursorKindSpelling(cursorKind);
+ const QString result = QString::fromUtf8(clang_getCString(kindName));
+ clang_disposeString(kindName);
+ return result;
+}
+
+QString getCursorSpelling(const CXCursor &cursor)
+{
+ CXString cursorSpelling = clang_getCursorSpelling(cursor);
+ const QString result = QString::fromUtf8(clang_getCString(cursorSpelling));
+ clang_disposeString(cursorSpelling);
+ return result;
+}
+
+QString getCursorDisplayName(const CXCursor &cursor)
+{
+ CXString displayName = clang_getCursorDisplayName(cursor);
+ const QString result = QString::fromUtf8(clang_getCString(displayName));
+ clang_disposeString(displayName);
+ return result;
+}
+
+QString getTypeName(const CXType &type)
+{
+ CXString typeSpelling = clang_getTypeSpelling(type);
+ const QString result = QString::fromUtf8(clang_getCString(typeSpelling));
+ clang_disposeString(typeSpelling);
+ return result;
+}
+
+Diagnostic::Diagnostic(const QString &m, const CXCursor &c, CXDiagnosticSeverity s)
+ : message(m), location(getCursorLocation(c)), source(Other), severity(s)
+{
+}
+
+Diagnostic Diagnostic::fromCXDiagnostic(CXDiagnostic cd)
+{
+ Diagnostic result;
+ result.source = Clang;
+ CXString spelling = clang_getDiagnosticSpelling(cd);
+ result.message = QString::fromUtf8(clang_getCString(spelling));
+ clang_disposeString(spelling);
+ result.severity = clang_getDiagnosticSeverity(cd);
+ result.location = getExpansionLocation(clang_getDiagnosticLocation(cd));
+
+ CXDiagnosticSet childDiagnostics = clang_getChildDiagnostics(cd);
+ if (const unsigned childCount = clang_getNumDiagnosticsInSet(childDiagnostics)) {
+ result.childMessages.reserve(int(childCount));
+ const unsigned format = clang_defaultDiagnosticDisplayOptions();
+ for (unsigned i = 0; i < childCount; ++i) {
+ CXDiagnostic childDiagnostic = clang_getDiagnosticInSet(childDiagnostics, i);
+ CXString cdm = clang_formatDiagnostic(childDiagnostic, format);
+ result.childMessages.append(QString::fromUtf8(clang_getCString(cdm)));
+ clang_disposeString(cdm);
+ clang_disposeDiagnostic(childDiagnostic);
+ }
+ }
+
+ return result;
+}
+
+QVector<Diagnostic> getDiagnostics(CXTranslationUnit tu)
+{
+ QVector<Diagnostic> result;
+ const unsigned count = clang_getNumDiagnostics(tu);
+ result.reserve(int(count));
+ for (unsigned i = 0; i < count; ++i) {
+ const CXDiagnostic d = clang_getDiagnostic(tu, i);
+ result.append(Diagnostic::fromCXDiagnostic(d));
+ clang_disposeDiagnostic(d);
+ }
+ return result;
+}
+
+CXDiagnosticSeverity maxSeverity(const QVector<Diagnostic> &ds)
+{
+ CXDiagnosticSeverity result = CXDiagnostic_Ignored;
+ for (const Diagnostic& d : ds) {
+ if (d.severity > result)
+ result = d.severity;
+ }
+ return result;
+}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+QDebug operator<<(QDebug s, const SourceLocation &l)
+{
+ QDebugStateSaver saver(s);
+ s.nospace();
+ s.noquote();
+ s << QDir::toNativeSeparators(l.file) << ':' << l.line;
+ if (l.column)
+ s << ':' << l.column;
+ return s;
+}
+
+// Roughly follow g++ format:
+// file.cpp:214:37: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
+QDebug operator<<(QDebug s, const Diagnostic &d)
+{
+ QDebugStateSaver saver(s);
+ s.nospace();
+ s.noquote();
+ s << d.location << ": ";
+ switch (d.severity) {
+ case CXDiagnostic_Ignored:
+ s << "ignored";
+ break;
+ case CXDiagnostic_Note:
+ s << "note";
+ break;
+ case CXDiagnostic_Warning:
+ s << "warning";
+ break;
+ case CXDiagnostic_Error:
+ s << "error";
+ break;
+ case CXDiagnostic_Fatal:
+ s << "fatal";
+ break;
+ }
+ s << ": " << d.message;
+
+ if (d.source != Diagnostic::Clang)
+ s << " [other]";
+
+ if (const int childMessagesCount = d.childMessages.size()) {
+ s << '\n';
+ for (int i = 0; i < childMessagesCount; ++i)
+ s << " " << d.childMessages.at(i) << '\n';
+ }
+
+ return s;
+}
+
+#endif // QT_NO_DEBUG_STREAM
+
+} // namespace clang
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangutils.h b/sources/shiboken2/ApiExtractor/clangparser/clangutils.h
new file mode 100644
index 000000000..3437f51eb
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangutils.h
@@ -0,0 +1,101 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef CLANGUTILS_H
+#define CLANGUTILS_H
+
+#include <clang-c/Index.h>
+#include <QtCore/QPair>
+#include <QtCore/QString>
+#include <QtCore/QVector>
+
+QT_FORWARD_DECLARE_CLASS(QDebug)
+
+bool operator==(const CXCursor &c1, const CXCursor &c2);
+uint qHash(const CXCursor &c, uint seed = 0);
+
+namespace clang {
+
+QString getCursorKindName(CXCursorKind cursorKind);
+QString getCursorSpelling(const CXCursor &cursor);
+QString getCursorDisplayName(const CXCursor &cursor);
+QString getTypeName(const CXType &type);
+inline QString getCursorTypeName(const CXCursor &cursor)
+ { return getTypeName(clang_getCursorType(cursor)); }
+inline QString getCursorResultTypeName(const CXCursor &cursor)
+ { return getTypeName(clang_getCursorResultType(cursor)); }
+
+inline bool isCursorValid(const CXCursor &c)
+{
+ return c.kind < CXCursor_FirstInvalid || c.kind > CXCursor_LastInvalid;
+}
+
+struct SourceLocation
+{
+ int compare(const SourceLocation &rhs) const;
+
+ QString file;
+ unsigned line = 0;
+ unsigned column = 0;
+ unsigned offset = 0;
+};
+
+SourceLocation getExpansionLocation(const CXSourceLocation &location);
+
+typedef QPair<SourceLocation, SourceLocation> SourceRange;
+
+SourceLocation getCursorLocation(const CXCursor &cursor);
+CXString getFileNameFromLocation(const CXSourceLocation &location);
+SourceRange getCursorRange(const CXCursor &cursor);
+
+struct Diagnostic {
+ enum Source { Clang, Other };
+
+ Diagnostic() : source(Clang) {}
+ // Clang
+ static Diagnostic fromCXDiagnostic(CXDiagnostic cd);
+ // Other
+ explicit Diagnostic(const QString &m, const CXCursor &c, CXDiagnosticSeverity s = CXDiagnostic_Warning);
+
+ QString message;
+ QStringList childMessages;
+ SourceLocation location;
+ Source source;
+ CXDiagnosticSeverity severity;
+};
+
+QVector<Diagnostic> getDiagnostics(CXTranslationUnit tu);
+CXDiagnosticSeverity maxSeverity(const QVector<Diagnostic> &ds);
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug, const SourceLocation &);
+QDebug operator<<(QDebug, const Diagnostic &);
+#endif // QT_NO_DEBUG_STREAM
+} // namespace clang
+
+#endif // CLANGUTILS_H
diff --git a/sources/shiboken2/ApiExtractor/clangparser/compilersupport.cpp b/sources/shiboken2/ApiExtractor/clangparser/compilersupport.cpp
new file mode 100644
index 000000000..e9af23bc5
--- /dev/null
+++ b/sources/shiboken2/ApiExtractor/clangparser/compilersupport.cpp
@@ -0,0 +1,202 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "compilersupport.h"
+#include "header_paths.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/QProcess>
+#include <QtCore/QStringList>
+#include <QtCore/QVersionNumber>
+
+#include <string.h>
+#include <algorithm>
+#include <iterator>
+
+namespace clang {
+
+static bool runProcess(const QString &program, const QStringList &arguments,
+ QByteArray *stdOutIn = nullptr, QByteArray *stdErrIn = nullptr)
+{
+ QProcess process;
+ process.start(program, arguments, QProcess::ReadWrite);
+ if (!process.waitForStarted()) {
+ qWarning().noquote().nospace() << "Unable to start "
+ << process.program() << ": " << process.errorString();
+ return false;
+ }
+ process.closeWriteChannel();
+ const bool finished = process.waitForFinished();
+ const QByteArray stdErr = process.readAllStandardError();
+ if (stdErrIn)
+ *stdErrIn = stdErr;
+ if (stdOutIn)
+ *stdOutIn = process.readAllStandardOutput();
+
+ if (!finished) {
+ qWarning().noquote().nospace() << process.program() << " timed out: " << stdErr;
+ process.kill();
+ return false;
+ }
+
+ if (process.exitStatus() != QProcess::NormalExit) {
+ qWarning().noquote().nospace() << process.program() << " crashed: " << stdErr;
+ return false;
+ }
+
+ if (process.exitCode() != 0) {
+ qWarning().noquote().nospace() << process.program() << " exited "
+ << process.exitCode() << ": " << stdErr;
+ return false;
+ }
+
+ return true;
+}
+
+#if defined(Q_CC_GNU)
+
+static QByteArray frameworkPath() { return QByteArrayLiteral(" (framework directory)"); }
+
+// Determine g++'s internal include paths from the output of
+// g++ -E -x c++ - -v </dev/null
+// Output looks like:
+// #include <...> search starts here:
+// /usr/local/include
+// /System/Library/Frameworks (framework directory)
+// End of search list.
+static HeaderPaths gppInternalIncludePaths(const QString &compiler)
+{
+ HeaderPaths result;
+ QStringList arguments;
+ arguments << QStringLiteral("-E") << QStringLiteral("-x") << QStringLiteral("c++")
+ << QStringLiteral("-") << QStringLiteral("-v");
+ QByteArray stdOut;
+ QByteArray stdErr;
+ if (!runProcess(compiler, arguments, &stdOut, &stdErr))
+ return result;
+ const QByteArrayList stdErrLines = stdErr.split('\n');
+ bool isIncludeDir = false;
+ for (const QByteArray &line : stdErrLines) {
+ if (isIncludeDir) {
+ if (line.startsWith(QByteArrayLiteral("End of search list"))) {
+ isIncludeDir = false;
+ } else {
+ HeaderPath headerPath(line.trimmed());
+ if (headerPath.path.endsWith(frameworkPath())) {
+ headerPath.m_isFramework = true;
+ headerPath.path.truncate(headerPath.path.size() - frameworkPath().size());
+ }
+ result.append(headerPath);
+ }
+ } else if (line.startsWith(QByteArrayLiteral("#include <...> search starts here"))) {
+ isIncludeDir = true;
+ }
+ }
+ return result;
+}
+#endif // Q_CC_MSVC
+
+// Detect Vulkan as supported from Qt 5.10 by checking the environment variables.
+static void detectVulkan(HeaderPaths *headerPaths)
+{
+ static const char *vulkanVariables[] = {"VULKAN_SDK", "VK_SDK_PATH"};
+ for (const char *vulkanVariable : vulkanVariables) {
+ if (qEnvironmentVariableIsSet(vulkanVariable)) {
+ headerPaths->append(HeaderPath(qgetenv(vulkanVariable) + QByteArrayLiteral("/include")));
+ break;
+ }
+ }
+}
+
+#if defined(Q_CC_GNU)
+static inline bool isRedHat74()
+{
+ if (QSysInfo::productType() != QLatin1String("rhel"))
+ return false;
+ const QVersionNumber osVersion = QVersionNumber::fromString(QSysInfo::productVersion());
+ return osVersion.isNull() || osVersion >= QVersionNumber(7, 4);
+}
+#endif // Q_CC_GNU
+
+// For MSVC, we set the MS compatibility version and let Clang figure out its own
+// options and include paths.
+// For the others, we pass "-nostdinc" since libclang tries to add it's own system
+// include paths, which together with the clang compiler paths causes some clash
+// which causes std types not being found and construct -I/-F options from the
+// include paths of the host compiler.
+
+#ifdef Q_CC_CLANG
+static QByteArray noStandardIncludeOption() { return QByteArrayLiteral("-nostdinc"); }
+#endif
+
+// Returns clang options needed for emulating the host compiler
+QByteArrayList emulatedCompilerOptions()
+{
+ QByteArrayList result;
+#if defined(Q_CC_MSVC)
+ HeaderPaths headerPaths;
+ result.append(QByteArrayLiteral("-fms-compatibility-version=19"));
+ result.append(QByteArrayLiteral("-Wno-microsoft-enum-value"));
+#elif defined(Q_CC_CLANG)
+ HeaderPaths headerPaths = gppInternalIncludePaths(QStringLiteral("clang++"));
+ result.append(noStandardIncludeOption());
+#elif defined(Q_CC_GNU)
+ HeaderPaths headerPaths;
+
+ // The clang builtin includes directory is used to find the definitions for intrinsic functions
+ // and builtin types. It is necessary to use the clang includes to prevent redefinition errors.
+ // The default toolchain includes should be picked up automatically by clang without specifying
+ // them implicitly.
+ QByteArray clangBuiltinIncludesDir(CLANG_BUILTIN_INCLUDES_DIR);
+
+ if (!clangBuiltinIncludesDir.isEmpty()) {
+ result.append(QByteArrayLiteral("-isystem"));
+ result.append(clangBuiltinIncludesDir);
+ }
+ // Append the c++ include paths since Clang is unable to find <list> etc
+ // on RHEL 7.4 with g++ 6.3. A fix for this has been added to Clang 5.0,
+ // so, the code can be removed once Clang 5.0 is the minimum version.
+ if (isRedHat74()) {
+ const HeaderPaths gppPaths = gppInternalIncludePaths(QStringLiteral("g++"));
+ for (const HeaderPath &h : gppPaths) {
+ if (h.path.contains("c++"))
+ headerPaths.append(h);
+ }
+ }
+#else
+ HeaderPaths headerPaths;
+#endif
+ detectVulkan(&headerPaths);
+ std::transform(headerPaths.cbegin(), headerPaths.cend(),
+ std::back_inserter(result), [](const HeaderPath &p) {
+ return HeaderPath::includeOption(p, true);
+ });
+ return result;
+}
+
+} // namespace clang
diff --git a/sources/shiboken2/ApiExtractor/parser/list.cpp b/sources/shiboken2/ApiExtractor/clangparser/compilersupport.h
index 2d2a78700..f556da551 100644
--- a/sources/shiboken2/ApiExtractor/parser/list.cpp
+++ b/sources/shiboken2/ApiExtractor/clangparser/compilersupport.h
@@ -1,7 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of PySide2.
@@ -27,7 +26,15 @@
**
****************************************************************************/
+#ifndef COMPILERSUPPORT_H
+#define COMPILERSUPPORT_H
-#include "list.h"
+#include <QtCore/QByteArrayList>
-// kate: space-indent on; indent-width 2; replace-tabs on;
+namespace clang {
+
+QByteArrayList emulatedCompilerOptions();
+
+} // namespace clang
+
+#endif // COMPILERSUPPORT_H
diff --git a/sources/shiboken2/ApiExtractor/doc/conf.py.in b/sources/shiboken2/ApiExtractor/doc/conf.py.in
index 70750c899..3a42707ad 100644
--- a/sources/shiboken2/ApiExtractor/doc/conf.py.in
+++ b/sources/shiboken2/ApiExtractor/doc/conf.py.in
@@ -151,8 +151,6 @@ html_split_index = False
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = False
-html_add_permalinks = True;
-
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
diff --git a/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst b/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst
index 0d24a6d52..646e76043 100644
--- a/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst
+++ b/sources/shiboken2/ApiExtractor/doc/typesystem_specifying_types.rst
@@ -150,6 +150,7 @@ enum-type
<typesystem>
<enum-type name="..."
identified-by-value="..."
+ class="yes | no"
since="..."
flags="yes | no"
flags-revision="..."
@@ -179,6 +180,10 @@ enum-type
Notice that the **enum-type** tag can either have **name** or **identified-by-value**
but not both.
+ The *optional* boolean attribute **class** specifies whether the underlying
+ enumeration is a C++ 11 enumeration class. In that case, the enumeration values
+ need to be qualified by the enumeration name to match the C++ Syntax.
+
The **revision** attribute can be used to specify a revision for each type, easing the
production of ABI compatible bindings.
diff --git a/sources/shiboken2/ApiExtractor/docparser.cpp b/sources/shiboken2/ApiExtractor/docparser.cpp
index 4ec1da299..1d1783f05 100644
--- a/sources/shiboken2/ApiExtractor/docparser.cpp
+++ b/sources/shiboken2/ApiExtractor/docparser.cpp
@@ -29,6 +29,8 @@
#include "abstractmetalang.h"
#include "typesystem.h"
#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QTextStream>
#include <QtXmlPatterns/QXmlQuery>
#include <QBuffer>
@@ -49,7 +51,7 @@ QString DocParser::getDocumentation(QXmlQuery& xquery, const QString& query,
const DocModificationList& mods) const
{
QString doc = execXQuery(xquery, query);
- return applyDocModifications(mods, doc);
+ return applyDocModifications(mods, doc.trimmed());
}
QString DocParser::execXQuery(QXmlQuery& xquery, const QString& query) const
@@ -69,6 +71,77 @@ QString DocParser::execXQuery(QXmlQuery& xquery, const QString& query) const
return result;
}
+bool DocParser::skipForQuery(const AbstractMetaFunction *func)
+{
+ // Skip private functions and copies created by AbstractMetaClass::fixFunctions()
+ if (!func || func->isPrivate()
+ || func->isModifiedRemoved()
+ || func->declaringClass() != func->ownerClass()
+ || func->isCastOperator()) {
+ return true;
+ }
+ switch (func->functionType()) {
+ case AbstractMetaFunction::MoveConstructorFunction:
+ case AbstractMetaFunction::AssignmentOperatorFunction:
+ case AbstractMetaFunction::MoveAssignmentOperatorFunction:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+AbstractMetaFunctionList DocParser::documentableFunctions(const AbstractMetaClass *metaClass)
+{
+ AbstractMetaFunctionList result = metaClass->functionsInTargetLang();
+ for (int i = result.size() - 1; i >= 0; --i) {
+ if (DocParser::skipForQuery(result.at(i)) || result.at(i)->isUserAdded())
+ result.removeAt(i);
+ }
+ return result;
+}
+
+QString DocParser::msgCannotFindDocumentation(const QString &fileName,
+ const char *what, const QString &name,
+ const QString &query)
+{
+ QString result;
+ QTextStream(&result) << "Cannot find documentation for " << what
+ << ' ' << name << " in:\n " << QDir::toNativeSeparators(fileName)
+ << "\n using query:\n " << query;
+ return result;
+}
+
+QString DocParser::msgCannotFindDocumentation(const QString &fileName,
+ const AbstractMetaClass *metaClass,
+ const AbstractMetaFunction *function,
+ const QString &query)
+{
+ return msgCannotFindDocumentation(fileName, "function",
+ metaClass->name() + QLatin1String("::") + function->name() + QLatin1String("()"),
+ query);
+}
+
+QString DocParser::msgCannotFindDocumentation(const QString &fileName,
+ const AbstractMetaClass *metaClass,
+ const AbstractMetaEnum *e,
+ const QString &query)
+{
+ return msgCannotFindDocumentation(fileName, "enum",
+ metaClass->name() + QLatin1String("::") + e->name(),
+ query);
+}
+
+QString DocParser::msgCannotFindDocumentation(const QString &fileName,
+ const AbstractMetaClass *metaClass,
+ const AbstractMetaField *f,
+ const QString &query)
+{
+ return msgCannotFindDocumentation(fileName, "field",
+ metaClass->name() + QLatin1String("::") + f->name(),
+ query);
+}
+
namespace
{
@@ -100,11 +173,11 @@ struct XslResources
QString DocParser::applyDocModifications(const DocModificationList& mods, const QString& xml) const
{
- if (mods.isEmpty())
+ if (mods.isEmpty() || xml.isEmpty())
return xml;
bool hasXPathBasedModification = false;
- foreach (DocModification mod, mods) {
+ for (const DocModification &mod : mods) {
if (mod.mode() == TypeSystem::DocModificationXPathReplace) {
hasXPathBasedModification = true;
break;
@@ -126,7 +199,7 @@ QString DocParser::applyDocModifications(const DocModificationList& mods, const
"</xsl:copy>\n"
"</xsl:template>\n"
);
- foreach (DocModification mod, mods) {
+ for (const DocModification &mod : mods) {
if (mod.mode() == TypeSystem::DocModificationXPathReplace) {
QString xpath = mod.xpath();
xpath.replace(QLatin1Char('"'), QLatin1String("&quot;"));
@@ -169,6 +242,6 @@ QString DocParser::applyDocModifications(const DocModificationList& mods, const
}
Q_ASSERT(result != xml);
- return result;
+ return result.trimmed();
}
diff --git a/sources/shiboken2/ApiExtractor/docparser.h b/sources/shiboken2/ApiExtractor/docparser.h
index 5573f6851..1770815b0 100644
--- a/sources/shiboken2/ApiExtractor/docparser.h
+++ b/sources/shiboken2/ApiExtractor/docparser.h
@@ -29,6 +29,7 @@
#define DOCPARSER_H
#include "typesystem_typedefs.h"
+#include "abstractmetalang_typedefs.h"
#include <QtCore/QString>
@@ -110,10 +111,31 @@ public:
*/
virtual Documentation retrieveModuleDocumentation(const QString& name) = 0;
+ static bool skipForQuery(const AbstractMetaFunction *func);
+
protected:
QString getDocumentation(QXmlQuery& xquery, const QString& query,
const DocModificationList& mods) const;
+
+ static AbstractMetaFunctionList documentableFunctions(const AbstractMetaClass *metaClass);
+
+ static QString msgCannotFindDocumentation(const QString &fileName,
+ const char *what, const QString &name,
+ const QString &query);
+ static QString msgCannotFindDocumentation(const QString &fileName,
+ const AbstractMetaClass *metaClass,
+ const AbstractMetaFunction *function,
+ const QString &query);
+ static QString msgCannotFindDocumentation(const QString &fileName,
+ const AbstractMetaClass *metaClass,
+ const AbstractMetaEnum *e,
+ const QString &query);
+ static QString msgCannotFindDocumentation(const QString &fileName,
+ const AbstractMetaClass *metaClass,
+ const AbstractMetaField *f,
+ const QString &query);
+
private:
QString m_packageName;
QString m_docDataDir;
diff --git a/sources/shiboken2/ApiExtractor/doxygenparser.cpp b/sources/shiboken2/ApiExtractor/doxygenparser.cpp
index f7d868f8d..1cffa3b67 100644
--- a/sources/shiboken2/ApiExtractor/doxygenparser.cpp
+++ b/sources/shiboken2/ApiExtractor/doxygenparser.cpp
@@ -96,20 +96,16 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass)
xquery.setFocus(QUrl(doxyFilePath));
// Get class documentation
- QString classDoc = getDocumentation(xquery, QLatin1String("/doxygen/compounddef/detaileddescription"),
+ const QString classQuery = QLatin1String("/doxygen/compounddef/detaileddescription");
+ QString classDoc = getDocumentation(xquery, classQuery,
metaClass->typeEntry()->docModifications());
- if (classDoc.isEmpty()) {
- qCWarning(lcShiboken).noquote().nospace()
- << "Can't find documentation for class \"" << metaClass->name() << "\".";
- }
+ if (classDoc.isEmpty())
+ qCWarning(lcShiboken(), "%s", qPrintable(msgCannotFindDocumentation(doxyFilePath, "class", metaClass->name(), classQuery)));
metaClass->setDocumentation(classDoc);
//Functions Documentation
- AbstractMetaFunctionList funcs = metaClass->functionsInTargetLang();
- foreach (AbstractMetaFunction *func, funcs) {
- if (!func || func->isPrivate())
- continue;
-
+ const AbstractMetaFunctionList &funcs = DocParser::documentableFunctions(metaClass);
+ for (AbstractMetaFunction *func : funcs) {
QString query = QLatin1String("/doxygen/compounddef/sectiondef");
// properties
if (func->isPropertyReader() || func->isPropertyWriter()
@@ -128,8 +124,8 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass)
query += QLatin1String("/../argsstring[text()=\"") + args + QLatin1String("\"]");
} else {
int i = 1;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
- QString type;
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
if (!arg->type()->isPrimitive()) {
query += QLatin1String("/../param[") + QString::number(i)
+ QLatin1String("]/type/ref[text()=\"")
@@ -150,28 +146,40 @@ void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass)
query += QLatin1String("/../detaileddescription)[1]");
}
QString doc = getDocumentation(xquery, query, DocModificationList());
+ if (doc.isEmpty()) {
+ qCWarning(lcShiboken(), "%s",
+ qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, func, query)));
+ }
func->setDocumentation(doc);
isProperty = false;
}
//Fields
- AbstractMetaFieldList fields = metaClass->fields();
- foreach (AbstractMetaField *field, fields) {
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (AbstractMetaField *field : fields) {
if (field->isPrivate())
return;
QString query = QLatin1String("/doxygen/compounddef/sectiondef/memberdef/name[text()=\"")
+ field->name() + QLatin1String("\"]/../detaileddescription");
QString doc = getDocumentation(xquery, query, DocModificationList());
+ if (doc.isEmpty()) {
+ qCWarning(lcShiboken(), "%s",
+ qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, field, query)));
+ }
field->setDocumentation(doc);
}
//Enums
- AbstractMetaEnumList enums = metaClass->enums();
- foreach (AbstractMetaEnum *meta_enum, enums) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (AbstractMetaEnum *meta_enum : enums) {
QString query = QLatin1String("/doxygen/compounddef/sectiondef/memberdef[@kind=\"enum\"]/name[text()=\"")
+ meta_enum->name() + QLatin1String("\"]/..");
QString doc = getDocumentation(xquery, query, DocModificationList());
+ if (doc.isEmpty()) {
+ qCWarning(lcShiboken(), "%s",
+ qPrintable(msgCannotFindDocumentation(doxyFilePath, metaClass, meta_enum, query)));
+ }
meta_enum->setDocumentation(doc);
}
diff --git a/sources/shiboken2/ApiExtractor/doxygenparser.h b/sources/shiboken2/ApiExtractor/doxygenparser.h
index 7314cfe3b..3f9ca5142 100644
--- a/sources/shiboken2/ApiExtractor/doxygenparser.h
+++ b/sources/shiboken2/ApiExtractor/doxygenparser.h
@@ -35,9 +35,9 @@ class DoxygenParser : public DocParser
{
public:
DoxygenParser() {}
- virtual void fillDocumentation(AbstractMetaClass *metaClass);
- virtual Documentation retrieveModuleDocumentation();
- virtual Documentation retrieveModuleDocumentation(const QString& name);
+ void fillDocumentation(AbstractMetaClass *metaClass) override;
+ Documentation retrieveModuleDocumentation() override;
+ Documentation retrieveModuleDocumentation(const QString& name) override;
};
#endif // DOXYGENPARSER_H
diff --git a/sources/shiboken2/ApiExtractor/fileout.cpp b/sources/shiboken2/ApiExtractor/fileout.cpp
index c97347fe1..be0023c3c 100644
--- a/sources/shiboken2/ApiExtractor/fileout.cpp
+++ b/sources/shiboken2/ApiExtractor/fileout.cpp
@@ -39,15 +39,15 @@ bool FileOut::dummy = false;
bool FileOut::diff = false;
#ifdef Q_OS_LINUX
-const char* colorDelete = "\033[31m";
-const char* colorAdd = "\033[32m";
-const char* colorInfo = "\033[36m";
-const char* colorReset = "\033[0m";
+static const char colorDelete[] = "\033[31m";
+static const char colorAdd[] = "\033[32m";
+static const char colorInfo[] = "\033[36m";
+static const char colorReset[] = "\033[0m";
#else
-const char* colorDelete = "";
-const char* colorAdd = "";
-const char* colorInfo = "";
-const char* colorReset = "";
+static const char colorDelete[] = "";
+static const char colorAdd[] = "";
+static const char colorInfo[] = "";
+static const char colorReset[] = "";
#endif
FileOut::FileOut(QString n):
diff --git a/sources/shiboken2/ApiExtractor/generator.qrc b/sources/shiboken2/ApiExtractor/generator.qrc
deleted file mode 100644
index 2d82b37cb..000000000
--- a/sources/shiboken2/ApiExtractor/generator.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource prefix="/trolltech/generator/">
-<file alias="pp-qt-configuration">parser/rpp/pp-qt-configuration</file>
-</qresource>
-</RCC>
diff --git a/sources/shiboken2/ApiExtractor/graph.cpp b/sources/shiboken2/ApiExtractor/graph.cpp
index e6ee660dc..6ba4d994a 100644
--- a/sources/shiboken2/ApiExtractor/graph.cpp
+++ b/sources/shiboken2/ApiExtractor/graph.cpp
@@ -127,8 +127,7 @@ void Graph::dumpDot(const QHash< int, QString >& nodeNames, const QString& fileN
QTextStream s(&output);
s << "digraph D {\n";
for (int i = 0; i < m_d->edges.size(); ++i) {
- GraphPrivate::EdgeIterator it = m_d->edges[i].begin();
- for (;it != m_d->edges[i].end(); ++it)
+ for (auto it = m_d->edges[i].cbegin(), end = m_d->edges[i].cend(); it != end; ++it)
s << '"' << nodeNames[i] << "\" -> \"" << nodeNames[*it] << "\"\n";
}
s << "}\n";
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel_finder.h b/sources/shiboken2/ApiExtractor/header_paths.h
index 0217cbac6..f70709b7c 100644
--- a/sources/shiboken2/ApiExtractor/parser/codemodel_finder.h
+++ b/sources/shiboken2/ApiExtractor/header_paths.h
@@ -1,7 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of PySide2.
@@ -27,49 +26,41 @@
**
****************************************************************************/
+#ifndef HEADER_PATHS_H
+#define HEADER_PATHS_H
-#ifndef CODEMODEL_FINDER_H
-#define CODEMODEL_FINDER_H
-
-#include <default_visitor.h>
-#include <codemodel_fwd.h>
-#include <name_compiler.h>
-
-class TokenStream;
-class Binder;
-
-class CodeModelFinder: protected DefaultVisitor
-{
- enum ResolvePolicy {
- ResolveScope,
- ResolveItem
- };
+#include <QByteArray>
+#include <QList>
+#include <QString>
+class HeaderPath {
public:
- CodeModelFinder(CodeModel *model, Binder *binder);
- virtual ~CodeModelFinder();
+ explicit HeaderPath(const QByteArray &p = QByteArray()) : path(p), m_isFramework(false) {}
+ explicit HeaderPath(const QString &s = QString(), bool isFramework = false) :
+ path(s.toLatin1()), m_isFramework(isFramework) {}
- ScopeModelItem resolveScope(NameAST *name, ScopeModelItem scope);
+ QByteArray path;
+ bool m_isFramework; // macOS framework path
- inline CodeModel *model() const
+ static QByteArray includeOption(const HeaderPath &p, bool systemInclude = false)
{
- return _M_model;
- }
+ QByteArray option;
-protected:
- virtual void visitName(NameAST *node);
- virtual void visitUnqualifiedName(UnqualifiedNameAST *node);
+ if (p.m_isFramework) {
+ if (systemInclude)
+ option = QByteArrayLiteral("-iframework");
+ else
+ option = QByteArrayLiteral("-F");
+ } else if (systemInclude) {
+ option = QByteArrayLiteral("-isystem");
+ } else {
+ option = QByteArrayLiteral("-I");
+ }
- ScopeModelItem changeCurrentScope(ScopeModelItem scope);
-
-private:
- CodeModel *_M_model;
- Binder *_M_binder;
- TokenStream *_M_token_stream;
- NameCompiler name_cc;
-
- ScopeModelItem _M_current_scope;
- ResolvePolicy _M_resolve_policy;
+ return option + p.path;
+ }
};
-#endif // CODEMODEL_FINDER_H
+typedef QList<HeaderPath> HeaderPaths;
+
+#endif // HEADER_PATHS_H
diff --git a/sources/shiboken2/ApiExtractor/include.h b/sources/shiboken2/ApiExtractor/include.h
index e4ff5b309..dc4965e1a 100644
--- a/sources/shiboken2/ApiExtractor/include.h
+++ b/sources/shiboken2/ApiExtractor/include.h
@@ -30,7 +30,7 @@
#define INCLUDE_H
#include <QString>
-#include <QList>
+#include <QVector>
QT_BEGIN_NAMESPACE
class QTextStream;
@@ -87,6 +87,6 @@ QTextStream& operator<<(QTextStream& out, const Include& include);
QDebug operator<<(QDebug d, const Include &i);
#endif
-typedef QList<Include> IncludeList;
+typedef QVector<Include> IncludeList;
#endif
diff --git a/sources/shiboken2/ApiExtractor/parser/ast.cpp b/sources/shiboken2/ApiExtractor/parser/ast.cpp
deleted file mode 100644
index a744704fe..000000000
--- a/sources/shiboken2/ApiExtractor/parser/ast.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "ast.h"
-#include "lexer.h"
-
-QString AST::toString(TokenStream *stream) const
-{
- const Token &tk = stream->token((int) start_token);
- const Token &end_tk = stream->token((int) end_token);
- return QString::fromLatin1(tk.text + tk.position, end_tk.position - tk.position);
-}
diff --git a/sources/shiboken2/ApiExtractor/parser/ast.h b/sources/shiboken2/ApiExtractor/parser/ast.h
deleted file mode 100644
index 7640b7c38..000000000
--- a/sources/shiboken2/ApiExtractor/parser/ast.h
+++ /dev/null
@@ -1,884 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef AST_H
-#define AST_H
-
-#include "smallobject.h"
-#include "list.h"
-
-#include <QString>
-
-#define DECLARE_AST_NODE(k) \
- enum { __node_kind = Kind_##k };
-
-class TokenStream;
-
-struct AccessSpecifierAST;
-struct AsmDefinitionAST;
-struct BaseClauseAST;
-struct BaseSpecifierAST;
-struct BinaryExpressionAST;
-struct CastExpressionAST;
-struct ClassMemberAccessAST;
-struct ClassSpecifierAST;
-struct CompoundStatementAST;
-struct ConditionAST;
-struct ConditionalExpressionAST;
-struct CppCastExpressionAST;
-struct CtorInitializerAST;
-struct DeclarationAST;
-struct DeclarationStatementAST;
-struct DeclaratorAST;
-struct DeleteExpressionAST;
-struct DoStatementAST;
-struct ElaboratedTypeSpecifierAST;
-struct EnumSpecifierAST;
-struct EnumeratorAST;
-struct ExceptionSpecificationAST;
-struct ExpressionAST;
-struct ExpressionOrDeclarationStatementAST;
-struct ExpressionStatementAST;
-struct ForStatementAST;
-struct FunctionCallAST;
-struct FunctionDefinitionAST;
-struct IfStatementAST;
-struct IncrDecrExpressionAST;
-struct InitDeclaratorAST;
-struct InitializerAST;
-struct InitializerClauseAST;
-struct LabeledStatementAST;
-struct LinkageBodyAST;
-struct LinkageSpecificationAST;
-struct MemInitializerAST;
-struct NameAST;
-struct NamespaceAST;
-struct NamespaceAliasDefinitionAST;
-struct NewDeclaratorAST;
-struct NewExpressionAST;
-struct NewInitializerAST;
-struct NewTypeIdAST;
-struct OperatorAST;
-struct OperatorFunctionIdAST;
-struct ParameterDeclarationAST;
-struct ParameterDeclarationClauseAST;
-struct PostfixExpressionAST;
-struct PrimaryExpressionAST;
-struct PtrOperatorAST;
-struct PtrToMemberAST;
-struct ReturnStatementAST;
-struct SimpleDeclarationAST;
-struct SimpleTypeSpecifierAST;
-struct SizeofExpressionAST;
-struct StatementAST;
-struct StringLiteralAST;
-struct SubscriptExpressionAST;
-struct SwitchStatementAST;
-struct TemplateArgumentAST;
-struct TemplateDeclarationAST;
-struct TemplateParameterAST;
-struct ThrowExpressionAST;
-struct TranslationUnitAST;
-struct TryBlockStatementAST;
-struct TypeIdAST;
-struct TypeIdentificationAST;
-struct TypeParameterAST;
-struct TypeSpecifierAST;
-struct TypedefAST;
-struct UnaryExpressionAST;
-struct UnqualifiedNameAST;
-struct UsingAST;
-struct UsingDirectiveAST;
-struct WhileStatementAST;
-struct WinDeclSpecAST;
-struct QPropertyAST;
-struct QEnumsAST;
-
-struct AST
-{
- enum NODE_KIND {
- Kind_UNKNOWN = 0,
-
- Kind_AccessSpecifier,
- Kind_AsmDefinition,
- Kind_BaseClause,
- Kind_BaseSpecifier,
- Kind_BinaryExpression,
- Kind_CastExpression,
- Kind_ClassMemberAccess,
- Kind_ClassSpecifier,
- Kind_CompoundStatement,
- Kind_Condition,
- Kind_ConditionalExpression,
- Kind_CppCastExpression,
- Kind_CtorInitializer,
- Kind_DeclarationStatement,
- Kind_Declarator,
- Kind_DeleteExpression,
- Kind_DoStatement,
- Kind_ElaboratedTypeSpecifier,
- Kind_EnumSpecifier,
- Kind_Enumerator,
- Kind_ExceptionSpecification,
- Kind_ExpressionOrDeclarationStatement,
- Kind_ExpressionStatement,
- Kind_ForStatement,
- Kind_FunctionCall,
- Kind_FunctionDefinition,
- Kind_IfStatement,
- Kind_IncrDecrExpression,
- Kind_InitDeclarator,
- Kind_Initializer,
- Kind_InitializerClause,
- Kind_LabeledStatement,
- Kind_LinkageBody,
- Kind_LinkageSpecification,
- Kind_MemInitializer,
- Kind_Name,
- Kind_Namespace,
- Kind_NamespaceAliasDefinition,
- Kind_NewDeclarator,
- Kind_NewExpression,
- Kind_NewInitializer,
- Kind_NewTypeId,
- Kind_Operator,
- Kind_OperatorFunctionId,
- Kind_ParameterDeclaration,
- Kind_ParameterDeclarationClause,
- Kind_PostfixExpression,
- Kind_PrimaryExpression,
- Kind_PtrOperator,
- Kind_PtrToMember,
- Kind_ReturnStatement,
- Kind_SimpleDeclaration,
- Kind_SimpleTypeSpecifier,
- Kind_SizeofExpression,
- Kind_StringLiteral,
- Kind_SubscriptExpression,
- Kind_SwitchStatement,
- Kind_TemplateArgument,
- Kind_TemplateDeclaration,
- Kind_TemplateParameter,
- Kind_ThrowExpression,
- Kind_TranslationUnit,
- Kind_TryBlockStatement,
- Kind_TypeId,
- Kind_TypeIdentification,
- Kind_TypeParameter,
- Kind_Typedef,
- Kind_UnaryExpression,
- Kind_UnqualifiedName,
- Kind_Using,
- Kind_UsingDirective,
- Kind_WhileStatement,
- Kind_WinDeclSpec,
- Kind_QPropertyAST,
- Kind_ForwardDeclarationSpecifier,
- Kind_QEnumsAST,
-
- NODE_KIND_COUNT
- };
-
- QString toString(TokenStream *stream) const;
-
- int kind;
-
- std::size_t start_token;
- std::size_t end_token;
-};
-
-struct TypeSpecifierAST: public AST
-{
- const ListNode<std::size_t> *cv;
-};
-
-struct StatementAST: public AST
-{
-};
-
-struct ExpressionAST: public AST
-{
-};
-
-struct DeclarationAST: public AST
-{
-};
-
-struct AccessSpecifierAST: public DeclarationAST
-{
- DECLARE_AST_NODE(AccessSpecifier)
-
- const ListNode<std::size_t> *specs;
-};
-
-struct AsmDefinitionAST: public DeclarationAST
-{
- DECLARE_AST_NODE(AsmDefinition)
-
- const ListNode<std::size_t> *cv;
-};
-
-struct BaseClauseAST: public AST
-{ // ### kill me
- DECLARE_AST_NODE(BaseClause)
-
- const ListNode<BaseSpecifierAST*> *base_specifiers;
-};
-
-struct BaseSpecifierAST: public AST
-{
- DECLARE_AST_NODE(BaseSpecifier)
-
- std::size_t virt;
- std::size_t access_specifier;
- NameAST *name;
-};
-
-struct BinaryExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(BinaryExpression)
-
- std::size_t op;
- ExpressionAST *left_expression;
- ExpressionAST *right_expression;
-};
-
-struct CastExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(CastExpression)
-
- TypeIdAST *type_id;
- ExpressionAST *expression;
-};
-
-struct ClassMemberAccessAST: public ExpressionAST
-{
- DECLARE_AST_NODE(ClassMemberAccess)
-
- std::size_t op;
- NameAST *name;
-};
-
-struct ClassSpecifierAST: public TypeSpecifierAST
-{
- DECLARE_AST_NODE(ClassSpecifier)
-
- WinDeclSpecAST *win_decl_specifiers;
- std::size_t class_key;
- NameAST *name;
- BaseClauseAST *base_clause;
- const ListNode<DeclarationAST*> *member_specs;
-};
-
-struct ForwardDeclarationSpecifierAST: public TypeSpecifierAST
-{
- DECLARE_AST_NODE(ForwardDeclarationSpecifier)
-
- std::size_t class_key;
- NameAST *name;
- BaseClauseAST *base_clause;
-};
-
-struct CompoundStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(CompoundStatement)
-
- const ListNode<StatementAST*> *statements;
-};
-
-struct ConditionAST: public AST
-{
- DECLARE_AST_NODE(Condition)
-
- TypeSpecifierAST *type_specifier;
- DeclaratorAST *declarator;
- ExpressionAST *expression;
-};
-
-struct ConditionalExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(ConditionalExpression)
-
- ExpressionAST *condition;
- ExpressionAST *left_expression;
- ExpressionAST *right_expression;
-};
-
-struct CppCastExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(CppCastExpression)
-
- std::size_t op;
- TypeIdAST *type_id;
- ExpressionAST *expression;
- const ListNode<ExpressionAST*> *sub_expressions;
-};
-
-struct CtorInitializerAST: public AST
-{
- DECLARE_AST_NODE(CtorInitializer)
-
- std::size_t colon;
- const ListNode<MemInitializerAST*> *member_initializers;
-};
-
-struct DeclarationStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(DeclarationStatement)
-
- DeclarationAST *declaration;
-};
-
-struct DeclaratorAST: public AST
-{
- DECLARE_AST_NODE(Declarator)
-
- const ListNode<PtrOperatorAST*> *ptr_ops;
- DeclaratorAST *sub_declarator;
- NameAST *id;
- ExpressionAST *bit_expression;
- const ListNode<ExpressionAST*> *array_dimensions;
- ParameterDeclarationClauseAST *parameter_declaration_clause;
- const ListNode<std::size_t> *fun_cv;
- ExceptionSpecificationAST *exception_spec;
-};
-
-struct DeleteExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(DeleteExpression)
-
- std::size_t scope_token;
- std::size_t delete_token;
- std::size_t lbracket_token;
- std::size_t rbracket_token;
- ExpressionAST *expression;
-};
-
-struct DoStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(DoStatement)
-
- StatementAST *statement;
- ExpressionAST *expression;
-};
-
-struct ElaboratedTypeSpecifierAST: public TypeSpecifierAST
-{
- DECLARE_AST_NODE(ElaboratedTypeSpecifier)
-
- std::size_t type;
- NameAST *name;
-};
-
-struct EnumSpecifierAST: public TypeSpecifierAST
-{
- DECLARE_AST_NODE(EnumSpecifier)
-
- NameAST *name;
- const ListNode<EnumeratorAST*> *enumerators;
-};
-
-struct EnumeratorAST: public AST
-{
- DECLARE_AST_NODE(Enumerator)
-
- std::size_t id;
- ExpressionAST *expression;
-};
-
-struct ExceptionSpecificationAST: public AST
-{
- DECLARE_AST_NODE(ExceptionSpecification)
-
- std::size_t ellipsis;
- const ListNode<TypeIdAST*> *type_ids;
-};
-
-struct ExpressionOrDeclarationStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(ExpressionOrDeclarationStatement)
-
- StatementAST *expression;
- StatementAST *declaration;
-};
-
-struct ExpressionStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(ExpressionStatement)
-
- ExpressionAST *expression;
-};
-
-struct FunctionCallAST: public ExpressionAST
-{
- DECLARE_AST_NODE(FunctionCall)
-
- ExpressionAST *arguments;
-};
-
-struct FunctionDefinitionAST: public DeclarationAST
-{
- DECLARE_AST_NODE(FunctionDefinition)
-
- const ListNode<std::size_t> *storage_specifiers;
- const ListNode<std::size_t> *function_specifiers;
- TypeSpecifierAST *type_specifier;
- InitDeclaratorAST *init_declarator;
- StatementAST *function_body;
- WinDeclSpecAST *win_decl_specifiers;
-};
-
-struct ForStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(ForStatement)
-
- StatementAST *init_statement;
- ConditionAST *condition;
- ExpressionAST *expression;
- StatementAST *statement;
-};
-
-struct IfStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(IfStatement)
-
- ConditionAST *condition;
- StatementAST *statement;
- StatementAST *else_statement;
-};
-
-struct IncrDecrExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(IncrDecrExpression)
-
- std::size_t op;
-};
-
-struct InitDeclaratorAST: public AST
-{
- DECLARE_AST_NODE(InitDeclarator)
-
- DeclaratorAST *declarator;
- InitializerAST *initializer;
-};
-
-struct InitializerAST: public AST
-{
- DECLARE_AST_NODE(Initializer)
-
- InitializerClauseAST *initializer_clause;
- ExpressionAST *expression;
-};
-
-struct InitializerClauseAST: public AST
-{
- DECLARE_AST_NODE(InitializerClause)
-
- ExpressionAST *expression;
-};
-
-struct LabeledStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(LabeledStatement)
-};
-
-struct LinkageBodyAST: public AST
-{
- DECLARE_AST_NODE(LinkageBody)
-
- const ListNode<DeclarationAST*> *declarations;
-};
-
-struct LinkageSpecificationAST: public DeclarationAST
-{
- DECLARE_AST_NODE(LinkageSpecification)
-
- std::size_t extern_type;
- LinkageBodyAST *linkage_body;
- DeclarationAST *declaration;
-};
-
-struct MemInitializerAST: public AST
-{
- DECLARE_AST_NODE(MemInitializer)
-
- NameAST *initializer_id;
- ExpressionAST *expression;
-};
-
-struct NameAST: public AST
-{
- DECLARE_AST_NODE(Name)
-
- bool global;
- const ListNode<UnqualifiedNameAST*> *qualified_names;
- UnqualifiedNameAST *unqualified_name;
-};
-
-struct NamespaceAST: public DeclarationAST
-{
- DECLARE_AST_NODE(Namespace)
-
- std::size_t namespace_name;
- LinkageBodyAST *linkage_body;
-};
-
-struct NamespaceAliasDefinitionAST: public DeclarationAST
-{
- DECLARE_AST_NODE(NamespaceAliasDefinition)
-
- std::size_t namespace_name;
- NameAST *alias_name;
-};
-
-struct NewDeclaratorAST: public AST
-{
- DECLARE_AST_NODE(NewDeclarator)
-
- PtrOperatorAST *ptr_op;
- NewDeclaratorAST *sub_declarator;
- const ListNode<ExpressionAST*> *expressions;
-};
-
-struct NewExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(NewExpression)
-
- std::size_t scope_token;
- std::size_t new_token;
- ExpressionAST *expression;
- TypeIdAST *type_id;
- NewTypeIdAST *new_type_id;
- NewInitializerAST *new_initializer;
-};
-
-struct NewInitializerAST: public AST
-{
- DECLARE_AST_NODE(NewInitializer)
-
- ExpressionAST *expression;
-};
-
-struct NewTypeIdAST: public AST
-{
- DECLARE_AST_NODE(NewTypeId)
-
- TypeSpecifierAST *type_specifier;
- NewInitializerAST *new_initializer;
- NewDeclaratorAST *new_declarator;
-};
-
-struct OperatorAST: public AST
-{
- DECLARE_AST_NODE(Operator)
-
- std::size_t op;
- std::size_t open;
- std::size_t close;
-};
-
-struct OperatorFunctionIdAST: public AST
-{
- DECLARE_AST_NODE(OperatorFunctionId)
-
- OperatorAST *op;
- TypeSpecifierAST *type_specifier;
- const ListNode<PtrOperatorAST*> *ptr_ops;
-};
-
-struct ParameterDeclarationAST: public AST
-{
- DECLARE_AST_NODE(ParameterDeclaration)
-
- TypeSpecifierAST *type_specifier;
- DeclaratorAST *declarator;
- ExpressionAST *expression;
-};
-
-struct ParameterDeclarationClauseAST: public AST
-{
- DECLARE_AST_NODE(ParameterDeclarationClause)
-
- const ListNode<ParameterDeclarationAST*> *parameter_declarations;
- std::size_t ellipsis;
-};
-
-struct PostfixExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(PostfixExpression)
-
- TypeSpecifierAST *type_specifier;
- ExpressionAST *expression;
- const ListNode<ExpressionAST*> *sub_expressions;
-};
-
-struct PrimaryExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(PrimaryExpression)
-
- StringLiteralAST *literal;
- std::size_t token;
- StatementAST *expression_statement;
- ExpressionAST *sub_expression;
- NameAST *name;
-};
-
-struct PtrOperatorAST: public AST
-{
- DECLARE_AST_NODE(PtrOperator)
-
- const ListNode<std::size_t> *cv;
- std::size_t op;
- PtrToMemberAST *mem_ptr;
-};
-
-struct PtrToMemberAST: public AST
-{
- DECLARE_AST_NODE(PtrToMember)
-};
-
-struct ReturnStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(ReturnStatement)
-
- ExpressionAST *expression;
-};
-
-struct SimpleDeclarationAST: public DeclarationAST
-{
- DECLARE_AST_NODE(SimpleDeclaration)
-
- const ListNode<std::size_t> *storage_specifiers;
- const ListNode<std::size_t> *function_specifiers;
- TypeSpecifierAST *type_specifier;
- const ListNode<InitDeclaratorAST*> *init_declarators;
- WinDeclSpecAST *win_decl_specifiers;
-};
-
-struct SimpleTypeSpecifierAST: public TypeSpecifierAST
-{
- DECLARE_AST_NODE(SimpleTypeSpecifier)
-
- const ListNode<std::size_t> *integrals;
- std::size_t type_of;
- TypeIdAST *type_id;
- ExpressionAST *expression;
- NameAST *name;
-};
-
-struct SizeofExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(SizeofExpression)
-
- std::size_t sizeof_token;
- TypeIdAST *type_id;
- ExpressionAST *expression;
-};
-
-struct StringLiteralAST: public AST
-{
- DECLARE_AST_NODE(StringLiteral)
-
- const ListNode<std::size_t> *literals;
-};
-
-struct SubscriptExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(SubscriptExpression)
-
- ExpressionAST *subscript;
-};
-
-struct SwitchStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(SwitchStatement)
-
- ConditionAST *condition;
- StatementAST *statement;
-};
-
-struct TemplateArgumentAST: public AST
-{
- DECLARE_AST_NODE(TemplateArgument)
-
- TypeIdAST *type_id;
- ExpressionAST *expression;
-};
-
-struct TemplateDeclarationAST: public DeclarationAST
-{
- DECLARE_AST_NODE(TemplateDeclaration)
-
- std::size_t exported;
- const ListNode<TemplateParameterAST*> *template_parameters;
- DeclarationAST* declaration;
-};
-
-struct TemplateParameterAST: public AST
-{
- DECLARE_AST_NODE(TemplateParameter)
-
- TypeParameterAST *type_parameter;
- ParameterDeclarationAST *parameter_declaration;
-};
-
-struct ThrowExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(ThrowExpression)
-
- std::size_t throw_token;
- ExpressionAST *expression;
-};
-
-struct TranslationUnitAST: public AST
-{
- DECLARE_AST_NODE(TranslationUnit)
-
- const ListNode<DeclarationAST*> *declarations;
-};
-
-struct TryBlockStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(TryBlockStatement)
-};
-
-struct TypeIdAST: public AST
-{
- DECLARE_AST_NODE(TypeId)
-
- TypeSpecifierAST *type_specifier;
- DeclaratorAST *declarator;
-};
-
-struct TypeIdentificationAST: public ExpressionAST
-{
- DECLARE_AST_NODE(TypeIdentification)
-
- std::size_t typename_token;
- NameAST *name;
- ExpressionAST *expression;
-};
-
-struct TypeParameterAST: public AST
-{
- DECLARE_AST_NODE(TypeParameter)
-
- std::size_t type;
- NameAST *name;
- TypeIdAST *type_id;
- const ListNode<TemplateParameterAST*> *template_parameters;
- NameAST *template_name;
-};
-
-struct TypedefAST: public DeclarationAST
-{
- DECLARE_AST_NODE(Typedef)
-
- TypeSpecifierAST *type_specifier;
- const ListNode<InitDeclaratorAST*> *init_declarators;
-};
-
-struct UnaryExpressionAST: public ExpressionAST
-{
- DECLARE_AST_NODE(UnaryExpression)
-
- std::size_t op;
- ExpressionAST *expression;
-};
-
-struct UnqualifiedNameAST: public AST
-{
- DECLARE_AST_NODE(UnqualifiedName)
-
- std::size_t tilde;
- std::size_t id;
- OperatorFunctionIdAST *operator_id;
- const ListNode<TemplateArgumentAST*> *template_arguments;
-};
-
-struct UsingAST: public DeclarationAST
-{
- DECLARE_AST_NODE(Using)
-
- std::size_t type_name;
- NameAST *name;
-};
-
-struct UsingDirectiveAST: public DeclarationAST
-{
- DECLARE_AST_NODE(UsingDirective)
-
- NameAST *name;
-};
-
-struct WhileStatementAST: public StatementAST
-{
- DECLARE_AST_NODE(WhileStatement)
-
- ConditionAST *condition;
- StatementAST *statement;
-};
-
-struct WinDeclSpecAST: public AST
-{
- DECLARE_AST_NODE(WinDeclSpec)
-
- std::size_t specifier;
- std::size_t modifier;
-};
-
-struct QPropertyAST : public DeclarationAST
-{
- DECLARE_AST_NODE(QPropertyAST)
-};
-
-struct QEnumsAST : public DeclarationAST
-{
- DECLARE_AST_NODE(QEnumsAST)
-};
-
-template <class _Tp>
-_Tp *CreateNode(pool *memory_pool)
-{
- _Tp *node = reinterpret_cast<_Tp*>(memory_pool->allocate(sizeof(_Tp), strideof(_Tp)));
- node->kind = _Tp::__node_kind;
- return node;
-}
-
-template <class _Tp>
-_Tp ast_cast(AST *item)
-{
- if (item && static_cast<_Tp>(0)->__node_kind == item->kind)
- return static_cast<_Tp>(item);
-
- return 0;
-}
-
-#endif // AST_H
diff --git a/sources/shiboken2/ApiExtractor/parser/binder.cpp b/sources/shiboken2/ApiExtractor/parser/binder.cpp
deleted file mode 100644
index 709f86c56..000000000
--- a/sources/shiboken2/ApiExtractor/parser/binder.cpp
+++ /dev/null
@@ -1,866 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "binder.h"
-#include "lexer.h"
-#include "control.h"
-#include "symbol.h"
-#include "codemodel_finder.h"
-#include "class_compiler.h"
-#include "compiler_utils.h"
-#include "tokens.h"
-#include "dumptree.h"
-
-#include <iostream>
-#include <QDebug>
-
-Binder::Binder(CodeModel *__model, LocationManager &__location, Control *__control)
- : _M_model(__model),
- _M_location(__location),
- _M_token_stream(&_M_location.token_stream),
- _M_control(__control),
- _M_current_function_type(CodeModel::Normal),
- type_cc(this),
- name_cc(this),
- decl_cc(this)
-{
- _M_qualified_types.insert(QLatin1String("char"), QString());
- _M_qualified_types.insert(QLatin1String("double"), QString());
- _M_qualified_types.insert(QLatin1String("float"), QString());
- _M_qualified_types.insert(QLatin1String("int"), QString());
- _M_qualified_types.insert(QLatin1String("long"), QString());
- _M_qualified_types.insert(QLatin1String("short"), QString());
- _M_qualified_types.insert(QLatin1String("void"), QString());
-}
-
-Binder::~Binder()
-{
-}
-
-FileModelItem Binder::run(AST *node)
-{
- FileModelItem old = _M_current_file;
- _M_current_access = CodeModel::Public;
-
- _M_current_file.reset(new _FileModelItem(model()));
- updateItemPosition(_M_current_file, node);
- visit(node);
- FileModelItem result = _M_current_file;
-
- _M_current_file = old; // restore
-
- return result;
-}
-
-ScopeModelItem Binder::currentScope()
-{
- if (_M_current_class)
- return _M_current_class;
- else if (_M_current_namespace)
- return _M_current_namespace;
-
- return _M_current_file;
-}
-
-TemplateParameterList Binder::changeTemplateParameters(TemplateParameterList templateParameters)
-{
- TemplateParameterList old = _M_current_template_parameters;
- _M_current_template_parameters = templateParameters;
- return old;
-}
-
-CodeModel::FunctionType Binder::changeCurrentFunctionType(CodeModel::FunctionType functionType)
-{
- CodeModel::FunctionType old = _M_current_function_type;
- _M_current_function_type = functionType;
- return old;
-}
-
-CodeModel::AccessPolicy Binder::changeCurrentAccess(CodeModel::AccessPolicy accessPolicy)
-{
- CodeModel::AccessPolicy old = _M_current_access;
- _M_current_access = accessPolicy;
- return old;
-}
-
-NamespaceModelItem Binder::changeCurrentNamespace(NamespaceModelItem item)
-{
- NamespaceModelItem old = _M_current_namespace;
- _M_current_namespace = item;
- return old;
-}
-
-ClassModelItem Binder::changeCurrentClass(ClassModelItem item)
-{
- ClassModelItem old = _M_current_class;
- _M_current_class = item;
- return old;
-}
-
-FunctionModelItem Binder::changeCurrentFunction(FunctionModelItem item)
-{
- FunctionModelItem old = _M_current_function;
- _M_current_function = item;
- return old;
-}
-
-int Binder::decode_token(std::size_t index) const
-{
- return _M_token_stream->kind(index);
-}
-
-CodeModel::AccessPolicy Binder::decode_access_policy(std::size_t index) const
-{
- switch (decode_token(index)) {
- case Token_class:
- return CodeModel::Private;
-
- case Token_struct:
- case Token_union:
- return CodeModel::Public;
-
- default:
- return CodeModel::Public;
- }
-}
-
-CodeModel::ClassType Binder::decode_class_type(std::size_t index) const
-{
- switch (decode_token(index)) {
- case Token_class:
- return CodeModel::Class;
- case Token_struct:
- return CodeModel::Struct;
- case Token_union:
- return CodeModel::Union;
- default:
- std::cerr << "** WARNING unrecognized class type" << std::endl;
- }
- return CodeModel::Class;
-}
-
-const NameSymbol *Binder::decode_symbol(std::size_t index) const
-{
- return _M_token_stream->symbol(index);
-}
-
-void Binder::visitAccessSpecifier(AccessSpecifierAST *node)
-{
- const ListNode<std::size_t> *it = node->specs;
- if (!it)
- return;
-
- it = it->toFront();
- const ListNode<std::size_t> *end = it;
-
- do {
- switch (decode_token(it->element)) {
- default:
- break;
-
- case Token_public:
- changeCurrentAccess(CodeModel::Public);
- changeCurrentFunctionType(CodeModel::Normal);
- break;
- case Token_protected:
- changeCurrentAccess(CodeModel::Protected);
- changeCurrentFunctionType(CodeModel::Normal);
- break;
- case Token_private:
- changeCurrentAccess(CodeModel::Private);
- changeCurrentFunctionType(CodeModel::Normal);
- break;
- case Token_signals:
- changeCurrentAccess(CodeModel::Protected);
- changeCurrentFunctionType(CodeModel::Signal);
- break;
- case Token_slots:
- changeCurrentFunctionType(CodeModel::Slot);
- break;
- }
- it = it->next;
- } while (it != end);
-}
-
-void Binder::visitSimpleDeclaration(SimpleDeclarationAST *node)
-{
- visit(node->type_specifier);
-
- if (const ListNode<InitDeclaratorAST*> *it = node->init_declarators) {
- it = it->toFront();
- const ListNode<InitDeclaratorAST*> *end = it;
- do {
- InitDeclaratorAST *init_declarator = it->element;
- declare_symbol(node, init_declarator);
- it = it->next;
- } while (it != end);
- }
-}
-
-void Binder::declare_symbol(SimpleDeclarationAST *node, InitDeclaratorAST *init_declarator)
-{
- DeclaratorAST *declarator = init_declarator->declarator;
-
- while (declarator && declarator->sub_declarator)
- declarator = declarator->sub_declarator;
-
- NameAST *id = declarator->id;
- if (!declarator->id) {
- std::cerr << "** WARNING expected a declarator id" << std::endl;
- return;
- }
-
- CodeModelFinder finder(model(), this);
- ScopeModelItem symbolScope = finder.resolveScope(id, currentScope());
- if (!symbolScope) {
- name_cc.run(id);
- std::cerr << "** WARNING scope not found for symbol:"
- << qPrintable(name_cc.name()) << std::endl;
- return;
- }
-
- decl_cc.run(declarator);
-
- if (decl_cc.isFunction()) {
- name_cc.run(id->unqualified_name);
-
- FunctionModelItem fun(new _FunctionModelItem(model(), name_cc.name()));
- updateItemPosition(fun, node);
- fun->setAccessPolicy(_M_current_access);
- fun->setFunctionType(_M_current_function_type);
- fun->setAbstract(init_declarator->initializer != 0);
- fun->setConstant(declarator->fun_cv != 0);
- fun->setTemplateParameters(_M_current_template_parameters);
- applyStorageSpecifiers(node->storage_specifiers, fun);
- applyFunctionSpecifiers(node->function_specifiers, fun);
-
- // build the type
- TypeInfo typeInfo = CompilerUtils::typeDescription(node->type_specifier,
- declarator,
- this);
-
- fun->setType(qualifyType(typeInfo, symbolScope->qualifiedName()));
-
-
- fun->setVariadics(decl_cc.isVariadics());
-
- // ... and the signature
- foreach (const DeclaratorCompiler::Parameter &p, decl_cc.parameters()) {
- ArgumentModelItem arg(new _ArgumentModelItem(model(), p.name));
- arg->setType(qualifyType(p.type, _M_context));
- arg->setDefaultValue(p.defaultValue);
- if (p.defaultValue)
- arg->setDefaultValueExpression(p.defaultValueExpression);
- fun->addArgument(arg);
- }
-
- fun->setScope(symbolScope->qualifiedName());
- symbolScope->addFunction(fun);
- } else {
- VariableModelItem var(new _VariableModelItem(model()));
- updateItemPosition(var, node);
- var->setTemplateParameters(_M_current_template_parameters);
- var->setAccessPolicy(_M_current_access);
- name_cc.run(id->unqualified_name);
- var->setName(name_cc.name());
- // Possible bug, because second parameter uses declarator instead of
- // init_declarator->declarator like in DeclaratorCompiler::visitParameterDeclaration,
- // but it doesn't seem to affect anything because the generator doesn't currently use
- // variable declarations, only function declarations (because it cares about the API only,
- // variable declarations are not exposed to the target language).
- // See PYSIDE-455.
- TypeInfo typeInfo = CompilerUtils::typeDescription(node->type_specifier,
- declarator,
- this);
- if (declarator != init_declarator->declarator
- && init_declarator->declarator->parameter_declaration_clause) {
- typeInfo.setFunctionPointer(true);
- decl_cc.run(init_declarator->declarator);
- foreach (const DeclaratorCompiler::Parameter &p, decl_cc.parameters())
- typeInfo.addArgument(p.type);
- }
-
- var->setType(qualifyType(typeInfo, _M_context));
- applyStorageSpecifiers(node->storage_specifiers, var);
-
- var->setScope(symbolScope->qualifiedName());
- symbolScope->addVariable(var);
- }
-}
-
-void Binder::visitFunctionDefinition(FunctionDefinitionAST *node)
-{
- Q_ASSERT(node->init_declarator);
-
- ScopeModelItem scope = currentScope();
-
- InitDeclaratorAST *init_declarator = node->init_declarator;
- DeclaratorAST *declarator = init_declarator->declarator;
-
- // in the case of "void (func)()" or "void ((func))()" we need to
- // skip to the inner most. This is in line with how the declarator
- // node is generated in 'parser.cpp'
- while (declarator && declarator->sub_declarator)
- declarator = declarator->sub_declarator;
- if (!declarator->id) {
- std::cerr << "** WARNING temp hack for Qt 5.6.0: "
- << "skipped a class that inherits from a private class"
- << std::endl;
- return;
- }
- Q_ASSERT(declarator->id);
-
- CodeModelFinder finder(model(), this);
-
- ScopeModelItem functionScope = finder.resolveScope(declarator->id, scope);
- if (!functionScope) {
- name_cc.run(declarator->id);
- std::cerr << "** WARNING scope not found for function definition:"
- << qPrintable(name_cc.name()) << std::endl
- << "\tdefinition *ignored*"
- << std::endl;
- return;
- }
-
- decl_cc.run(declarator);
-
- Q_ASSERT(!decl_cc.id().isEmpty());
-
- FunctionModelItem
- old = changeCurrentFunction(FunctionModelItem(new _FunctionModelItem(_M_model)));
- _M_current_function->setScope(functionScope->qualifiedName());
- updateItemPosition(_M_current_function, node);
-
- Q_ASSERT(declarator->id->unqualified_name);
- name_cc.run(declarator->id->unqualified_name);
- QString unqualified_name = name_cc.name();
-
- _M_current_function->setName(unqualified_name);
- TypeInfo tmp_type = CompilerUtils::typeDescription(node->type_specifier,
- declarator, this);
-
- _M_current_function->setType(qualifyType(tmp_type, _M_context));
- _M_current_function->setAccessPolicy(_M_current_access);
- _M_current_function->setFunctionType(_M_current_function_type);
- _M_current_function->setConstant(declarator->fun_cv);
- _M_current_function->setTemplateParameters(_M_current_template_parameters);
-
- applyStorageSpecifiers(node->storage_specifiers,
- _M_current_function);
- applyFunctionSpecifiers(node->function_specifiers,
- _M_current_function);
-
- _M_current_function->setVariadics(decl_cc.isVariadics());
-
- foreach (const DeclaratorCompiler::Parameter &p, decl_cc.parameters()) {
- ArgumentModelItem arg(new _ArgumentModelItem(model(), p.name));
- arg->setType(qualifyType(p.type, functionScope->qualifiedName()));
- arg->setDefaultValue(p.defaultValue);
- if (p.defaultValue)
- arg->setDefaultValueExpression(p.defaultValueExpression);
- _M_current_function->addArgument(arg);
- }
-
- FunctionModelItem prototype = _M_current_function;
- FunctionModelItem declared = functionScope->declaredFunction(prototype);
-
- // try to find a function declaration for this definition..
- if (!declared) {
- functionScope->addFunction(prototype);
- } else {
- applyFunctionSpecifiers(node->function_specifiers, declared);
-
- // fix the function type and the access policy
- _M_current_function->setAccessPolicy(declared->accessPolicy());
- _M_current_function->setFunctionType(declared->functionType());
- }
-
- changeCurrentFunction(old);
-}
-
-void Binder::visitTemplateDeclaration(TemplateDeclarationAST *node)
-{
- const ListNode<TemplateParameterAST*> *it = node->template_parameters;
- if (!it) {
- // QtScript: we want to visit the declaration still, so that
- // e.g. QMetaTypeId<Foo> is added to the code model
- visit(node->declaration);
- return;
- }
-
- TemplateParameterList savedTemplateParameters = changeTemplateParameters(TemplateParameterList());
-
- it = it->toFront();
- const ListNode<TemplateParameterAST*> *end = it;
-
- TemplateParameterList templateParameters;
- do {
- TemplateParameterAST *parameter = it->element;
- TypeParameterAST *type_parameter = parameter->type_parameter;
-
- NameAST *name;
- if (!type_parameter) {
- // A hacky hack to work around missing support for parameter declarations in
- // templates. We just need the to get the name of the variable, since we
- // aren't actually compiling these anyway. We are still not supporting much
- // more, but we are refusing to fail for a few more declarations
- if (!parameter->parameter_declaration ||
- !parameter->parameter_declaration->declarator ||
- !parameter->parameter_declaration->declarator->id) {
-
- /*std::cerr << "** WARNING template declaration not supported ``";
- Token const &tk = _M_token_stream->token ((int) node->start_token);
- Token const &end_tk = _M_token_stream->token ((int) node->declaration->start_token);
-
- std::cerr << std::string (&tk.text[tk.position], (end_tk.position) - tk.position) << "''"
- << std::endl << std::endl;*/
-
- changeTemplateParameters(savedTemplateParameters);
- return;
-
- }
-
- name = parameter->parameter_declaration->declarator->id;
- } else {
- int tk = decode_token(type_parameter->type);
- if (tk != Token_typename && tk != Token_class) {
- /*std::cerr << "** WARNING template declaration not supported ``";
- Token const &tk = _M_token_stream->token ((int) node->start_token);
- Token const &end_tk = _M_token_stream->token ((int) node->declaration->start_token);
-
- std::cerr << std::string (&tk.text[tk.position], (end_tk.position) - tk.position) << "''"
- << std::endl << std::endl;*/
-
- changeTemplateParameters(savedTemplateParameters);
- return;
- }
- assert(tk == Token_typename || tk == Token_class);
-
- name = type_parameter->name;
- }
-
-
- name_cc.run(name);
- const TemplateParameterModelItem p(new _TemplateParameterModelItem(model(), name_cc.name()));
- _M_current_template_parameters.append(p);
- it = it->next;
- } while (it != end);
-
- visit(node->declaration);
-
- changeTemplateParameters(savedTemplateParameters);
-}
-
-void Binder::visitTypedef(TypedefAST *node)
-{
- const ListNode<InitDeclaratorAST*> *it = node->init_declarators;
- if (!it)
- return;
-
- it = it->toFront();
- const ListNode<InitDeclaratorAST*> *end = it;
-
- do {
- InitDeclaratorAST *init_declarator = it->element;
- it = it->next;
-
- Q_ASSERT(init_declarator->declarator);
-
- // the name
- decl_cc.run(init_declarator->declarator);
- QString alias_name = decl_cc.id();
-
- if (alias_name.isEmpty()) {
- std::cerr << "** WARNING anonymous typedef not supported! ``";
- Token const &tk = _M_token_stream->token((int) node->start_token);
- Token const &end_tk = _M_token_stream->token((int) node->end_token);
-
- std::cerr << std::string(&tk.text[tk.position], end_tk.position - tk.position) << "''"
- << std::endl << std::endl;
- continue;
- }
-
- // build the type
- TypeInfo typeInfo = CompilerUtils::typeDescription(node->type_specifier,
- init_declarator->declarator,
- this);
- DeclaratorAST *decl = init_declarator->declarator;
- while (decl && decl->sub_declarator)
- decl = decl->sub_declarator;
-
- if (decl != init_declarator->declarator
- && init_declarator->declarator->parameter_declaration_clause) {
- typeInfo.setFunctionPointer(true);
- decl_cc.run(init_declarator->declarator);
- foreach (const DeclaratorCompiler::Parameter &p, decl_cc.parameters())
- typeInfo.addArgument(p.type);
- }
-
- ScopeModelItem scope = currentScope();
- DeclaratorAST *declarator = init_declarator->declarator;
- CodeModelFinder finder(model(), this);
- ScopeModelItem typedefScope = finder.resolveScope(declarator->id, scope);
-
- TypeDefModelItem typeDef(new _TypeDefModelItem(model()));
- updateItemPosition(typeDef, node);
- typeDef->setName(alias_name);
- typeDef->setType(qualifyType(typeInfo, currentScope()->qualifiedName()));
- typeDef->setScope(typedefScope->qualifiedName());
- _M_qualified_types[typeDef->qualifiedName().join(QLatin1Char('.'))] = QString();
- currentScope()->addTypeDef(typeDef);
- } while (it != end);
-}
-
-void Binder::visitNamespace(NamespaceAST *node)
-{
- bool anonymous = (node->namespace_name == 0);
-
- ScopeModelItem scope = currentScope();
-
- NamespaceModelItem old;
- if (!anonymous) {
- QString name = decode_symbol(node->namespace_name)->as_string();
-
- QStringList qualified_name = scope->qualifiedName();
- qualified_name += name;
- const CodeModelItem nsI = _M_model->findItem(qualified_name, _M_current_file);
- NamespaceModelItem ns = qSharedPointerDynamicCast<_NamespaceModelItem>(nsI);
- if (!ns) {
- ns.reset(new _NamespaceModelItem(_M_model));
- updateItemPosition(ns, node);
- ns->setName(name);
- ns->setScope(scope->qualifiedName());
- }
- old = changeCurrentNamespace(ns);
-
- _M_context.append(name);
- }
-
- DefaultVisitor::visitNamespace(node);
-
- if (!anonymous) {
- Q_ASSERT(scope->kind() == _CodeModelItem::Kind_Namespace
- || scope->kind() == _CodeModelItem::Kind_File);
-
- _M_context.removeLast();
-
- if (const NamespaceModelItem ns = qSharedPointerDynamicCast<_NamespaceModelItem>(scope))
- ns->addNamespace(_M_current_namespace);
-
- changeCurrentNamespace(old);
- }
-}
-
-void Binder::visitForwardDeclarationSpecifier(ForwardDeclarationSpecifierAST *node)
-{
- name_cc.run(node->name);
- if (name_cc.name().isEmpty())
- return;
-
- ScopeModelItem scope = currentScope();
- _M_qualified_types[(scope->qualifiedName() + name_cc.qualifiedName()).join(QLatin1Char('.'))] = QString();
-}
-
-void Binder::visitClassSpecifier(ClassSpecifierAST *node)
-{
- ClassCompiler class_cc(this);
- class_cc.run(node);
-
- if (class_cc.name().isEmpty()) {
- // anonymous not supported
- return;
- }
-
- Q_ASSERT(node->name && node->name->unqualified_name);
-
- ScopeModelItem scope = currentScope();
-
- ClassModelItem old = changeCurrentClass(ClassModelItem(new _ClassModelItem(_M_model)));
- updateItemPosition(_M_current_class, node);
- _M_current_class->setName(class_cc.name());
-
- QStringList baseClasses = class_cc.baseClasses();
- TypeInfo info;
- for (int i = 0; i < baseClasses.size(); ++i) {
- info.setQualifiedName(baseClasses.at(i).split(QLatin1String("::")));
- baseClasses[i] = qualifyType(info, scope->qualifiedName()).qualifiedName().join(QLatin1String("::"));
- }
-
- _M_current_class->setBaseClasses(baseClasses);
- _M_current_class->setClassType(decode_class_type(node->class_key));
- _M_current_class->setTemplateParameters(_M_current_template_parameters);
-
- if (!_M_current_template_parameters.isEmpty()) {
- QString name = _M_current_class->name();
- name += QLatin1Char('<');
- for (int i = 0; i < _M_current_template_parameters.size(); ++i) {
- if (i > 0)
- name += QLatin1Char(',');
-
- name += _M_current_template_parameters.at(i)->name();
- }
-
- name += QLatin1Char('>');
- _M_current_class->setName(name);
- }
-
- CodeModel::AccessPolicy oldAccessPolicy = changeCurrentAccess(decode_access_policy(node->class_key));
- CodeModel::FunctionType oldFunctionType = changeCurrentFunctionType(CodeModel::Normal);
-
- _M_current_class->setScope(scope->qualifiedName());
- _M_qualified_types[_M_current_class->qualifiedName().join(QLatin1Char('.'))] = QString();
-
- scope->addClass(_M_current_class);
-
- name_cc.run(node->name->unqualified_name);
- _M_context.append(name_cc.name());
- visitNodes(this, node->member_specs);
- _M_context.removeLast();
-
- changeCurrentClass(old);
- changeCurrentAccess(oldAccessPolicy);
- changeCurrentFunctionType(oldFunctionType);
-}
-
-void Binder::visitLinkageSpecification(LinkageSpecificationAST *node)
-{
- DefaultVisitor::visitLinkageSpecification(node);
-}
-
-void Binder::visitUsing(UsingAST *node)
-{
- DefaultVisitor::visitUsing(node);
-}
-
-void Binder::visitEnumSpecifier(EnumSpecifierAST *node)
-{
- CodeModelFinder finder(model(), this);
- ScopeModelItem scope = currentScope();
- ScopeModelItem enumScope = finder.resolveScope(node->name, scope);
-
- name_cc.run(node->name);
- QString name = name_cc.name();
-
- bool isAnonymous = name.isEmpty();
- if (isAnonymous) {
- // anonymous enum
- QString key = _M_context.join(QLatin1String("::"));
- int current = ++_M_anonymous_enums[key];
- name += QLatin1String("enum_");
- name += QString::number(current);
- }
-
- _M_current_enum.reset(new _EnumModelItem(model()));
- _M_current_enum->setAccessPolicy(_M_current_access);
- updateItemPosition(_M_current_enum, node);
- _M_current_enum->setName(name);
- _M_current_enum->setAnonymous(isAnonymous);
- _M_current_enum->setScope(enumScope->qualifiedName());
-
- _M_qualified_types[_M_current_enum->qualifiedName().join(QLatin1Char('.'))] = QString();
-
- enumScope->addEnum(_M_current_enum);
-
- DefaultVisitor::visitEnumSpecifier(node);
-
- _M_current_enum.clear();
-}
-
-static QString strip_preprocessor_lines(const QString &name)
-{
- QStringList lst = name.split(QLatin1Char('\n'));
- QString s;
- for (int i = 0; i < lst.size(); ++i) {
- if (!lst.at(i).startsWith(QLatin1Char('#')))
- s += lst.at(i);
- }
- return s.trimmed();
-}
-
-void Binder::visitEnumerator(EnumeratorAST *node)
-{
- Q_ASSERT(_M_current_enum);
- EnumeratorModelItem e(new _EnumeratorModelItem(model()));
- updateItemPosition(e, node);
- e->setName(decode_symbol(node->id)->as_string());
-
- if (ExpressionAST *expr = node->expression) {
- const Token &start_token = _M_token_stream->token((int) expr->start_token);
- const Token &end_token = _M_token_stream->token((int) expr->end_token);
- const QString token = QString::fromUtf8(&start_token.text[start_token.position],
- (int)(end_token.position - start_token.position));
- QString lines = strip_preprocessor_lines(token.trimmed());
- lines.remove(QLatin1Char(' '));
- e->setValue(lines);
- }
-
- _M_current_enum->addEnumerator(e);
-}
-
-void Binder::visitUsingDirective(UsingDirectiveAST *node)
-{
- DefaultVisitor::visitUsingDirective(node);
-}
-
-void Binder::visitQEnums(QEnumsAST *node)
-{
- const Token &start = _M_token_stream->token((int) node->start_token);
- const Token &end = _M_token_stream->token((int) node->end_token);
- QStringList enum_list = QString::fromLatin1(start.text + start.position,
- end.position - start.position).split(QLatin1Char(' '));
-
- ScopeModelItem scope = currentScope();
- for (int i = 0; i < enum_list.size(); ++i)
- scope->addEnumsDeclaration(enum_list.at(i));
-}
-
-void Binder::visitQProperty(QPropertyAST *node)
-{
- const Token &start = _M_token_stream->token((int) node->start_token);
- const Token &end = _M_token_stream->token((int) node->end_token);
- QString property = QString::fromLatin1(start.text + start.position,
- end.position - start.position);
- _M_current_class->addPropertyDeclaration(property);
-}
-
-void Binder::applyStorageSpecifiers(const ListNode<std::size_t> *it, MemberModelItem item)
-{
- if (!it)
- return;
-
- it = it->toFront();
- const ListNode<std::size_t> *end = it;
-
- do {
- switch (decode_token(it->element)) {
- default:
- break;
-
- case Token_friend:
- item->setFriend(true);
- break;
- case Token_auto:
- item->setAuto(true);
- break;
- case Token_register:
- item->setRegister(true);
- break;
- case Token_static:
- item->setStatic(true);
- break;
- case Token_extern:
- item->setExtern(true);
- break;
- case Token_mutable:
- item->setMutable(true);
- break;
- }
- it = it->next;
- } while (it != end);
-}
-
-void Binder::applyFunctionSpecifiers(const ListNode<std::size_t> *it, FunctionModelItem item)
-{
- if (!it)
- return;
-
- it = it->toFront();
- const ListNode<std::size_t> *end = it;
-
- do {
- switch (decode_token(it->element)) {
- default:
- break;
-
- case Token_inline:
- item->setInline(true);
- break;
-
- case Token_virtual:
- item->setVirtual(true);
- break;
-
- case Token_explicit:
- item->setExplicit(true);
- break;
-
- case Token_Q_INVOKABLE:
- item->setInvokable(true);
- break;
- }
- it = it->next;
- } while (it != end);
-}
-
-TypeInfo Binder::qualifyType(const TypeInfo &type, const QStringList &context) const
-{
- // ### Potentially improve to use string list in the name table to
- if (!context.size()) {
- // ### We can assume that this means global namespace for now...
- return type;
- } else if (_M_qualified_types.contains(type.qualifiedName().join(QLatin1Char('.')))) {
- return type;
- } else {
- QStringList expanded = context;
- expanded << type.qualifiedName();
- if (_M_qualified_types.contains(expanded.join(QLatin1Char('.')))) {
- TypeInfo modified_type = type;
- modified_type.setQualifiedName(expanded);
- return modified_type;
- } else {
- CodeModelItem scope = model()->findItem(context, _M_current_file);
-
- if (ClassModelItem klass = qSharedPointerDynamicCast<_ClassModelItem>(scope)) {
- foreach (const QString &base, klass->baseClasses()) {
- QStringList ctx = context;
- ctx.removeLast();
- ctx.append(base);
-
- TypeInfo qualified = qualifyType(type, ctx);
- if (qualified != type)
- return qualified;
- }
- }
-
- QStringList copy = context;
- copy.removeLast();
- return qualifyType(type, copy);
- }
- }
-}
-
-void Binder::updateItemPosition(CodeModelItem item, AST *node)
-{
- QString filename;
- int line, column;
-
- assert(node);
- _M_location.positionAt(_M_token_stream->position(node->start_token), &line, &column, &filename);
- item->setFileName(filename);
-}
diff --git a/sources/shiboken2/ApiExtractor/parser/binder.h b/sources/shiboken2/ApiExtractor/parser/binder.h
deleted file mode 100644
index cd8d93a95..000000000
--- a/sources/shiboken2/ApiExtractor/parser/binder.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef BINDER_H
-#define BINDER_H
-
-#include "default_visitor.h"
-#include "codemodel.h"
-#include "type_compiler.h"
-#include "name_compiler.h"
-#include "declarator_compiler.h"
-
-class TokenStream;
-class LocationManager;
-class Control;
-struct NameSymbol;
-
-class Binder: protected DefaultVisitor
-{
-public:
- Binder(CodeModel *__model, LocationManager &__location, Control *__control = 0);
- virtual ~Binder();
-
- inline TokenStream *tokenStream() const
- {
- return _M_token_stream;
- }
-
- inline CodeModel *model() const
- {
- return _M_model;
- }
-
- ScopeModelItem currentScope();
-
- FileModelItem run(AST *node);
-
-// utils
- TypeInfo qualifyType(const TypeInfo &type, const QStringList &context) const;
-
-protected:
- virtual void visitAccessSpecifier(AccessSpecifierAST *);
- virtual void visitClassSpecifier(ClassSpecifierAST *);
- virtual void visitEnumSpecifier(EnumSpecifierAST *);
- virtual void visitEnumerator(EnumeratorAST *);
- virtual void visitFunctionDefinition(FunctionDefinitionAST *);
- virtual void visitLinkageSpecification(LinkageSpecificationAST *);
- virtual void visitNamespace(NamespaceAST *);
- virtual void visitSimpleDeclaration(SimpleDeclarationAST *);
- virtual void visitTemplateDeclaration(TemplateDeclarationAST *);
- virtual void visitTypedef(TypedefAST *);
- virtual void visitUsing(UsingAST *);
- virtual void visitUsingDirective(UsingDirectiveAST *);
- virtual void visitQProperty(QPropertyAST *);
- virtual void visitForwardDeclarationSpecifier(ForwardDeclarationSpecifierAST *);
- virtual void visitQEnums(QEnumsAST *);
-
-private:
-
- int decode_token(std::size_t index) const;
- const NameSymbol *decode_symbol(std::size_t index) const;
- CodeModel::AccessPolicy decode_access_policy(std::size_t index) const;
- CodeModel::ClassType decode_class_type(std::size_t index) const;
-
- CodeModel::FunctionType changeCurrentFunctionType(CodeModel::FunctionType functionType);
- CodeModel::AccessPolicy changeCurrentAccess(CodeModel::AccessPolicy accessPolicy);
- NamespaceModelItem changeCurrentNamespace(NamespaceModelItem item);
- ClassModelItem changeCurrentClass(ClassModelItem item);
- FunctionModelItem changeCurrentFunction(FunctionModelItem item);
- TemplateParameterList changeTemplateParameters(TemplateParameterList templateParameters);
-
- void declare_symbol(SimpleDeclarationAST *node, InitDeclaratorAST *init_declarator);
-
- void applyStorageSpecifiers(const ListNode<std::size_t> *storage_specifiers, MemberModelItem item);
- void applyFunctionSpecifiers(const ListNode<std::size_t> *it, FunctionModelItem item);
-
- void updateItemPosition(CodeModelItem item, AST *node);
-
-private:
- CodeModel *_M_model;
- LocationManager &_M_location;
- TokenStream *_M_token_stream;
- Control *_M_control;
-
- CodeModel::FunctionType _M_current_function_type;
- CodeModel::AccessPolicy _M_current_access;
- FileModelItem _M_current_file;
- NamespaceModelItem _M_current_namespace;
- ClassModelItem _M_current_class;
- FunctionModelItem _M_current_function;
- EnumModelItem _M_current_enum;
- QStringList _M_context;
- TemplateParameterList _M_current_template_parameters; // ### check me
- QHash<QString, QString> _M_qualified_types;
- QHash<QString, int> _M_anonymous_enums;
- void dummy() {
- _M_control=0;
- }
-
-protected:
- TypeCompiler type_cc;
- NameCompiler name_cc;
- DeclaratorCompiler decl_cc;
-};
-
-#endif // BINDER_H
diff --git a/sources/shiboken2/ApiExtractor/parser/class_compiler.cpp b/sources/shiboken2/ApiExtractor/parser/class_compiler.cpp
deleted file mode 100644
index 3387412ff..000000000
--- a/sources/shiboken2/ApiExtractor/parser/class_compiler.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "class_compiler.h"
-#include "lexer.h"
-#include "binder.h"
-
-ClassCompiler::ClassCompiler(Binder *binder)
- : _M_binder(binder),
- _M_token_stream(binder->tokenStream()),
- name_cc(_M_binder),
- type_cc(_M_binder)
-{
-}
-
-ClassCompiler::~ClassCompiler()
-{
-}
-
-void ClassCompiler::run(ClassSpecifierAST *node)
-{
- name_cc.run(node->name);
- _M_name = name_cc.name();
- _M_base_classes.clear();
-
- visit(node);
-}
-
-void ClassCompiler::visitClassSpecifier(ClassSpecifierAST *node)
-{
- visit(node->base_clause);
-}
-
-void ClassCompiler::visitBaseSpecifier(BaseSpecifierAST *node)
-{
- name_cc.run(node->name);
- QString name = name_cc.name();
-
- if (!name.isEmpty())
- _M_base_classes.append(name);
-}
-
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/class_compiler.h b/sources/shiboken2/ApiExtractor/parser/class_compiler.h
deleted file mode 100644
index 09b727fe6..000000000
--- a/sources/shiboken2/ApiExtractor/parser/class_compiler.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef CLASS_COMPILER_H
-#define CLASS_COMPILER_H
-
-#include <QtCore/qglobal.h>
-#include <QtCore/QStringList>
-
-#include <default_visitor.h>
-#include <name_compiler.h>
-#include <type_compiler.h>
-
-class TokenStream;
-class Binder;
-
-class ClassCompiler: protected DefaultVisitor
-{
-public:
- ClassCompiler(Binder *binder);
- virtual ~ClassCompiler();
-
- inline QString name() const
- {
- return _M_name;
- }
-
- inline QStringList baseClasses() const
- {
- return _M_base_classes;
- }
-
- void run(ClassSpecifierAST *node);
-
-protected:
- virtual void visitClassSpecifier(ClassSpecifierAST *node);
- virtual void visitBaseSpecifier(BaseSpecifierAST *node);
-
-private:
- Binder *_M_binder;
- TokenStream *_M_token_stream;
- QString _M_name;
- QStringList _M_base_classes;
- NameCompiler name_cc;
- TypeCompiler type_cc;
-};
-
-#endif // CLASS_COMPILER_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp
index a5024c4a3..a35ca314b 100644
--- a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp
+++ b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp
@@ -47,9 +47,9 @@ private:
};
template <class T>
-static QSharedPointer<T> findModelItem(const QList<QSharedPointer<T> > &list, const QString &name)
+static QSharedPointer<T> findModelItem(const QVector<QSharedPointer<T> > &list, const QString &name)
{
- typedef typename QList<QSharedPointer<T> >::const_iterator It;
+ typedef typename QVector<QSharedPointer<T> >::const_iterator It;
const It it = std::find_if(list.begin(), list.end(), ModelItemNamePredicate<T>(name));
return it != list.end() ? *it : QSharedPointer<T>();
}
@@ -221,7 +221,7 @@ QString TypeInfo::toString() const
tmp += QLatin1Char(')');
}
- foreach(QString elt, arrayElements()) {
+ for (const QString &elt : m_arrayElements) {
tmp += QLatin1Char('[');
tmp += elt;
tmp += QLatin1Char(']');
@@ -230,7 +230,7 @@ QString TypeInfo::toString() const
return tmp;
}
-bool TypeInfo::operator==(const TypeInfo &other)
+bool TypeInfo::operator==(const TypeInfo &other) const
{
if (arrayElements().count() != other.arrayElements().count())
return false;
@@ -514,16 +514,6 @@ _ClassModelItem::~_ClassModelItem()
{
}
-QStringList _ClassModelItem::baseClasses() const
-{
- return m_baseClasses;
-}
-
-void _ClassModelItem::setBaseClasses(const QStringList &baseClasses)
-{
- m_baseClasses = baseClasses;
-}
-
TemplateParameterList _ClassModelItem::templateParameters() const
{
return m_templateParameters;
@@ -534,14 +524,21 @@ void _ClassModelItem::setTemplateParameters(const TemplateParameterList &templat
m_templateParameters = templateParameters;
}
-void _ClassModelItem::addBaseClass(const QString &baseClass)
+void _ClassModelItem::addBaseClass(const QString &name, CodeModel::AccessPolicy accessPolicy)
{
+ _ClassModelItem::BaseClass baseClass;
+ baseClass.name = name;
+ baseClass.accessPolicy = accessPolicy;
m_baseClasses.append(baseClass);
}
bool _ClassModelItem::extendsClass(const QString &name) const
{
- return m_baseClasses.contains(name);
+ for (const BaseClass &bc : m_baseClasses) {
+ if (bc.name == name)
+ return true;
+ }
+ return false;
}
void _ClassModelItem::setClassType(CodeModel::ClassType type)
@@ -578,8 +575,17 @@ static void formatModelItemList(QDebug &d, const char *prefix, const List &l,
void _ClassModelItem::formatDebug(QDebug &d) const
{
_CodeModelItem::formatDebug(d);
- if (!m_baseClasses.isEmpty())
- d << ", inherits=" << m_baseClasses;
+ if (!m_baseClasses.isEmpty()) {
+ if (m_final)
+ d << " [final]";
+ d << ", inherits=";
+ d << ", inherits=";
+ for (int i = 0, size = m_baseClasses.size(); i < size; ++i) {
+ if (i)
+ d << ", ";
+ d << m_baseClasses.at(i).name << " (" << m_baseClasses.at(i).accessPolicy << ')';
+ }
+ }
formatModelItemList(d, ", templateParameters=", m_templateParameters);
formatScopeItemsDebug(d);
}
@@ -588,7 +594,7 @@ void _ClassModelItem::formatDebug(QDebug &d) const
// ---------------------------------------------------------------------------
FunctionModelItem _ScopeModelItem::declaredFunction(FunctionModelItem item)
{
- foreach (const FunctionModelItem &fun, m_functions) {
+ for (const FunctionModelItem &fun : qAsConst(m_functions)) {
if (fun->name() == item->name() && fun->isSimilar(item))
return fun;
@@ -730,7 +736,7 @@ EnumModelItem _ScopeModelItem::findEnum(const QString &name) const
FunctionList _ScopeModelItem::findFunctions(const QString &name) const
{
FunctionList result;
- foreach (const FunctionModelItem &func, m_functions) {
+ for (const FunctionModelItem &func : m_functions) {
if (func->name() == name)
result.append(func);
}
@@ -742,6 +748,14 @@ _NamespaceModelItem::~_NamespaceModelItem()
{
}
+QSet<NamespaceModelItem> _NamespaceModelItem::uniqueNamespaces() const
+{
+ QSet<NamespaceModelItem> result;
+ for (const NamespaceModelItem &n : m_namespaces)
+ result.insert(n);
+ return result;
+}
+
void _NamespaceModelItem::addNamespace(NamespaceModelItem item)
{
m_namespaces.append(item);
@@ -875,6 +889,26 @@ bool _FunctionModelItem::isInline() const
return m_isInline;
}
+bool _FunctionModelItem::isOverride() const
+{
+ return m_isOverride;
+}
+
+void _FunctionModelItem::setOverride(bool o)
+{
+ m_isOverride = o;
+}
+
+bool _FunctionModelItem::isFinal() const
+{
+ return m_isFinal;
+}
+
+void _FunctionModelItem::setFinal(bool f)
+{
+ m_isFinal = f;
+}
+
void _FunctionModelItem::setInline(bool isInline)
{
m_isInline = isInline;
@@ -918,6 +952,12 @@ void _FunctionModelItem::formatDebug(QDebug &d) const
d << ", type=" << m_functionType;
if (m_isInline)
d << " [inline]";
+ if (m_isVirtual)
+ d << " [virtual]";
+ if (m_isOverride)
+ d << " [override]";
+ if (m_isFinal)
+ d << " [final]";
if (m_isAbstract)
d << " [abstract]";
if (m_isExplicit)
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.h b/sources/shiboken2/ApiExtractor/parser/codemodel.h
index 811cfec3e..2aaea1f78 100644
--- a/sources/shiboken2/ApiExtractor/parser/codemodel.h
+++ b/sources/shiboken2/ApiExtractor/parser/codemodel.h
@@ -35,7 +35,6 @@
#include "codemodel_enums.h"
#include <QtCore/QHash>
-#include <QtCore/QList>
#include <QtCore/QSet>
#include <QtCore/QString>
#include <QtCore/QStringList>
@@ -57,6 +56,10 @@ public:
enum FunctionType {
Normal,
+ Constructor,
+ CopyConstructor,
+ MoveConstructor,
+ Destructor,
Signal,
Slot
};
@@ -158,21 +161,18 @@ public:
m_arrayElements = arrayElements;
}
- QList<TypeInfo> arguments() const
- {
- return m_arguments;
- }
+ QVector<TypeInfo> arguments() const { return m_arguments; }
- void setArguments(const QList<TypeInfo> &arguments);
+ void setArguments(const QVector<TypeInfo> &arguments);
void addArgument(const TypeInfo &arg)
{
m_arguments.append(arg);
}
- bool operator==(const TypeInfo &other);
+ bool operator==(const TypeInfo &other) const;
- bool operator!=(const TypeInfo &other)
+ bool operator!=(const TypeInfo &other) const
{
return !(*this == other);
}
@@ -193,7 +193,7 @@ private:
QStringList m_qualifiedName;
QStringList m_arrayElements;
- QList<TypeInfo> m_arguments;
+ QVector<TypeInfo> m_arguments;
union {
uint flags;
@@ -320,7 +320,7 @@ public:
FunctionModelItem declaredFunction(FunctionModelItem item);
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
protected:
@@ -349,16 +349,21 @@ class _ClassModelItem: public _ScopeModelItem
public:
DECLARE_MODEL_NODE(Class)
+ struct BaseClass
+ {
+ QString name;
+ CodeModel::AccessPolicy accessPolicy = CodeModel::Public;
+ };
+
explicit _ClassModelItem(CodeModel *model, int kind = __node_kind)
: _ScopeModelItem(model, kind), m_classType(CodeModel::Class) {}
explicit _ClassModelItem(CodeModel *model, const QString &name, int kind = __node_kind)
: _ScopeModelItem(model, name, kind), m_classType(CodeModel::Class) {}
~_ClassModelItem();
- QStringList baseClasses() const;
+ QVector<BaseClass> baseClasses() const { return m_baseClasses; }
- void setBaseClasses(const QStringList &baseClasses);
- void addBaseClass(const QString &baseClass);
+ void addBaseClass(const QString &name, CodeModel::AccessPolicy accessPolicy);
TemplateParameterList templateParameters() const;
void setTemplateParameters(const TemplateParameterList &templateParameters);
@@ -371,16 +376,20 @@ public:
void addPropertyDeclaration(const QString &propertyDeclaration);
QStringList propertyDeclarations() const { return m_propertyDeclarations; }
+ bool isFinal() const { return m_final; }
+ void setFinal(bool f) { m_final = f; }
+
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
- QStringList m_baseClasses;
+ QVector<BaseClass> m_baseClasses;
TemplateParameterList m_templateParameters;
CodeModel::ClassType m_classType;
QStringList m_propertyDeclarations;
+ bool m_final = false;
};
class _NamespaceModelItem: public _ScopeModelItem
@@ -395,14 +404,14 @@ public:
~_NamespaceModelItem();
NamespaceList namespaces() const { return m_namespaces; }
- QSet<NamespaceModelItem> uniqueNamespaces() const { return m_namespaces.toSet(); }
+ QSet<NamespaceModelItem> uniqueNamespaces() const;
void addNamespace(NamespaceModelItem item);
NamespaceModelItem findNamespace(const QString &name) const;
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -442,7 +451,7 @@ public:
void setDefaultValueExpression(const QString &expr) { m_defaultValueExpression = expr; }
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -496,7 +505,7 @@ public:
void setType(const TypeInfo &type);
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -540,6 +549,12 @@ public:
bool isVirtual() const;
void setVirtual(bool isVirtual);
+ bool isOverride() const;
+ void setOverride(bool o);
+
+ bool isFinal() const;
+ void setFinal(bool f);
+
bool isInline() const;
void setInline(bool isInline);
@@ -558,7 +573,7 @@ public:
bool isSimilar(FunctionModelItem other) const;
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -567,6 +582,8 @@ private:
union {
struct {
uint m_isVirtual: 1;
+ uint m_isOverride: 1;
+ uint m_isFinal: 1;
uint m_isInline: 1;
uint m_isAbstract: 1;
uint m_isExplicit: 1;
@@ -602,7 +619,7 @@ public:
void setType(const TypeInfo &type);
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -629,7 +646,7 @@ public:
void setAnonymous(bool anonymous);
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -653,7 +670,7 @@ public:
void setValue(const QString &value);
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
@@ -678,7 +695,7 @@ public:
void setDefaultValue(bool defaultValue);
#ifndef QT_NO_DEBUG_STREAM
- void formatDebug(QDebug &d) const Q_DECL_OVERRIDE;
+ void formatDebug(QDebug &d) const override;
#endif
private:
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel_finder.cpp b/sources/shiboken2/ApiExtractor/parser/codemodel_finder.cpp
deleted file mode 100644
index 57f8ae0cf..000000000
--- a/sources/shiboken2/ApiExtractor/parser/codemodel_finder.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "codemodel_finder.h"
-#include "codemodel.h"
-#include "binder.h"
-
-CodeModelFinder::CodeModelFinder(CodeModel *model, Binder *binder)
- : _M_model(model),
- _M_binder(binder),
- _M_token_stream(binder->tokenStream()),
- name_cc(_M_binder),
- _M_resolve_policy(ResolveItem)
-{
-}
-
-CodeModelFinder::~CodeModelFinder()
-{
-}
-
-ScopeModelItem CodeModelFinder::resolveScope(NameAST *name, ScopeModelItem scope)
-{
- Q_ASSERT(scope);
-
- ResolvePolicy saved_resolve_policy = _M_resolve_policy;
- _M_resolve_policy = ResolveScope;
-
- ScopeModelItem old = changeCurrentScope(scope);
-
- visit(name);
- ScopeModelItem result = _M_current_scope;
-
- changeCurrentScope(old); // restore
-
- _M_resolve_policy = saved_resolve_policy;
-
- return result;
-}
-
-ScopeModelItem CodeModelFinder::changeCurrentScope(ScopeModelItem scope)
-{
- ScopeModelItem old = _M_current_scope;
- _M_current_scope = scope;
- return old;
-}
-
-void CodeModelFinder::visitName(NameAST *node)
-{
- visitNodes(this, node->qualified_names);
-
- if (_M_resolve_policy == ResolveItem)
- visit(node->unqualified_name);
-}
-
-void CodeModelFinder::visitUnqualifiedName(UnqualifiedNameAST *node)
-{
- if (!_M_current_scope) {
- // nothing to do
- return;
- }
-
- name_cc.run(node);
- QString id = name_cc.name();
-
- if (ClassModelItem klass = _M_current_scope->findClass(id)) {
- _M_current_scope = klass;
- } else if (NamespaceModelItem parentNamespace = qSharedPointerDynamicCast<_NamespaceModelItem>(_M_current_scope)) {
- NamespaceModelItem ns = parentNamespace->findNamespace(id);
- _M_current_scope = ns;
- } else if (FileModelItem file = qSharedPointerDynamicCast<_FileModelItem>(_M_current_scope)) {
- NamespaceModelItem ns = file->findNamespace(id);
- _M_current_scope = ns;
- }
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
-
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel_fwd.h b/sources/shiboken2/ApiExtractor/parser/codemodel_fwd.h
index 676bda872..d5a9f2850 100644
--- a/sources/shiboken2/ApiExtractor/parser/codemodel_fwd.h
+++ b/sources/shiboken2/ApiExtractor/parser/codemodel_fwd.h
@@ -31,7 +31,7 @@
#ifndef CODEMODEL_FWD_H
#define CODEMODEL_FWD_H
-#include <QtCore/QList>
+#include <QtCore/QVector>
#include <QtCore/QSharedPointer>
// forward declarations
@@ -65,18 +65,18 @@ typedef QSharedPointer<_TypeDefModelItem> TypeDefModelItem;
typedef QSharedPointer<_VariableModelItem> VariableModelItem;
typedef QSharedPointer<_MemberModelItem> MemberModelItem;
-typedef QList<ArgumentModelItem> ArgumentList;
-typedef QList<ClassModelItem> ClassList;
-typedef QList<CodeModelItem> ItemList;
-typedef QList<EnumModelItem> EnumList;
-typedef QList<EnumeratorModelItem> EnumeratorList;
-typedef QList<FileModelItem> FileList;
-typedef QList<FunctionModelItem> FunctionList;
-typedef QList<NamespaceModelItem> NamespaceList;
-typedef QList<ScopeModelItem> ScopeList;
-typedef QList<TemplateParameterModelItem> TemplateParameterList;
-typedef QList<TypeDefModelItem> TypeDefList;
-typedef QList<VariableModelItem> VariableList;
-typedef QList<MemberModelItem> MemberList;
+typedef QVector<ArgumentModelItem> ArgumentList;
+typedef QVector<ClassModelItem> ClassList;
+typedef QVector<CodeModelItem> ItemList;
+typedef QVector<EnumModelItem> EnumList;
+typedef QVector<EnumeratorModelItem> EnumeratorList;
+typedef QVector<FileModelItem> FileList;
+typedef QVector<FunctionModelItem> FunctionList;
+typedef QVector<NamespaceModelItem> NamespaceList;
+typedef QVector<ScopeModelItem> ScopeList;
+typedef QVector<TemplateParameterModelItem> TemplateParameterList;
+typedef QVector<TypeDefModelItem> TypeDefList;
+typedef QVector<VariableModelItem> VariableList;
+typedef QVector<MemberModelItem> MemberList;
#endif // CODEMODEL_FWD_H
diff --git a/sources/shiboken2/ApiExtractor/parser/compiler_utils.cpp b/sources/shiboken2/ApiExtractor/parser/compiler_utils.cpp
deleted file mode 100644
index 95a9db6c3..000000000
--- a/sources/shiboken2/ApiExtractor/parser/compiler_utils.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "compiler_utils.h"
-#include "type_compiler.h"
-#include "name_compiler.h"
-#include "declarator_compiler.h"
-#include "ast.h"
-#include "binder.h"
-
-TypeInfo CompilerUtils::typeDescription(TypeSpecifierAST *type_specifier, DeclaratorAST *declarator, Binder *binder)
-{
- TypeCompiler type_cc(binder);
- DeclaratorCompiler decl_cc(binder);
-
- type_cc.run(type_specifier);
- decl_cc.run(declarator);
-
- TypeInfo typeInfo;
- typeInfo.setQualifiedName(type_cc.qualifiedName());
- typeInfo.setConstant(type_cc.isConstant());
- typeInfo.setVolatile(type_cc.isVolatile());
- typeInfo.setReferenceType(decl_cc.isReference() ? LValueReference : NoReference);
- typeInfo.setIndirections(decl_cc.indirection());
- typeInfo.setArrayElements(decl_cc.arrayElements());
-
- return typeInfo;
-}
diff --git a/sources/shiboken2/ApiExtractor/parser/control.cpp b/sources/shiboken2/ApiExtractor/parser/control.cpp
deleted file mode 100644
index f86fa16bb..000000000
--- a/sources/shiboken2/ApiExtractor/parser/control.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "control.h"
-#include "lexer.h"
-
-Control::Control()
- : current_context(0),
- _M_skipFunctionBody(false),
- _M_lexer(0),
- _M_parser(0)
-{
- pushContext();
-
- declareTypedef(findOrInsertName("__builtin_va_list",
- strlen("__builtin_va_list")), 0);
-}
-
-Control::~Control()
-{
- popContext();
-
- Q_ASSERT(current_context == 0);
-}
-
-Lexer *Control::changeLexer(Lexer *lexer)
-{
- Lexer *old = _M_lexer;
- _M_lexer = lexer;
- return old;
-}
-
-Parser *Control::changeParser(Parser *parser)
-{
- Parser *old = _M_parser;
- _M_parser = parser;
- return old;
-}
-
-Type *Control::lookupType(const NameSymbol *name) const
-{
- Q_ASSERT(current_context != 0);
-
- return current_context->resolve(name);
-}
-
-void Control::declare(const NameSymbol *name, Type *type)
-{
- //printf("*** Declare:");
- //printSymbol(name);
- //putchar('\n');
- Q_ASSERT(current_context != 0);
-
- current_context->bind(name, type);
-}
-
-void Control::pushContext()
-{
- // printf("+Context\n");
- Context *new_context = new Context;
- new_context->parent = current_context;
- current_context = new_context;
-}
-
-void Control::popContext()
-{
- // printf("-Context\n");
- Q_ASSERT(current_context != 0);
-
- Context *old_context = current_context;
- current_context = current_context->parent;
-
- delete old_context;
-}
-
-void Control::declareTypedef(const NameSymbol *name, Declarator *d)
-{
- // printf("declared typedef:");
- // printSymbol(name);
- // printf("\n");
- stl_typedef_table.insert(name, d);
-}
-
-bool Control::isTypedef(const NameSymbol *name) const
-{
- // printf("is typedef:");
- // printSymbol(name);
- // printf("= %d\n", (stl_typedef_table.find(name) != stl_typedef_table.end()));
-
- return stl_typedef_table.contains(name);
-}
-
-QList<Control::ErrorMessage> Control::errorMessages() const
-{
- return _M_error_messages;
-}
-
-void Control::clearErrorMessages()
-{
- _M_error_messages.clear();
-}
-
-void Control::reportError(const ErrorMessage &errmsg)
-{
- _M_error_messages.append(errmsg);
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/control.h b/sources/shiboken2/ApiExtractor/parser/control.h
deleted file mode 100644
index 92635299e..000000000
--- a/sources/shiboken2/ApiExtractor/parser/control.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef CONTROL_H
-#define CONTROL_H
-
-#include "symbol.h"
-#include "smallobject.h"
-
-#include <QtCore/QHash>
-
-struct Declarator;
-struct Type;
-class Lexer;
-class Parser;
-
-struct Context {
- Context *parent;
-
- inline void bind(const NameSymbol *name, Type *type) {
- symbol_table.insert(name, type);
- }
-
- inline Type *resolve(const NameSymbol *name) const {
- if (Type *type = symbol_table.value(name))
- return type;
- else if (parent)
- return parent->resolve(name);
-
- return 0;
- }
-
- typedef QHash<const NameSymbol*, Type*> symbol_table_t;
-
- symbol_table_t symbol_table;
-};
-
-class Control
-{
-public:
- class ErrorMessage
- {
- public:
- ErrorMessage():
- _M_line(0),
- _M_column(0) {}
-
- inline int line() const {
- return _M_line;
- }
- inline void setLine(int line) {
- _M_line = line;
- }
-
- inline int column() const {
- return _M_column;
- }
- inline void setColumn(int column) {
- _M_column = column;
- }
-
- inline QString fileName() const {
- return _M_fileName;
- }
- inline void setFileName(const QString &fileName) {
- _M_fileName = fileName;
- }
-
- inline QString message() const {
- return _M_message;
- }
- inline void setMessage(const QString &message) {
- _M_message = message;
- }
-
- private:
- int _M_line;
- int _M_column;
- QString _M_fileName;
- QString _M_message;
- };
-
- Control();
- ~Control();
-
- inline bool skipFunctionBody() const {
- return _M_skipFunctionBody;
- }
- inline void setSkipFunctionBody(bool skip) {
- _M_skipFunctionBody = skip;
- }
-
- Lexer *changeLexer(Lexer *lexer);
- Parser *changeParser(Parser *parser);
-
- Lexer *currentLexer() const {
- return _M_lexer;
- }
- Parser *currentParser() const {
- return _M_parser;
- }
-
- Context *current_context;
-
- inline Context *currentContext() const {
- return current_context;
- }
-
- void pushContext();
- void popContext();
-
- Type *lookupType(const NameSymbol *name) const;
- void declare(const NameSymbol *name, Type *type);
-
- inline const NameSymbol *findOrInsertName(const char *data, size_t count) {
- return name_table.findOrInsert(data, count);
- }
-
- void declareTypedef(const NameSymbol *name, Declarator *d);
- bool isTypedef(const NameSymbol *name) const;
-
- void reportError(const ErrorMessage &errmsg);
- QList<ErrorMessage> errorMessages() const;
- void clearErrorMessages();
-
-private:
- NameTable name_table;
- QHash<const NameSymbol*, Declarator*> stl_typedef_table;
- bool _M_skipFunctionBody;
- Lexer *_M_lexer;
- Parser *_M_parser;
-
- QList<ErrorMessage> _M_error_messages;
-};
-
-#endif // CONTROL_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/declarator_compiler.cpp b/sources/shiboken2/ApiExtractor/parser/declarator_compiler.cpp
deleted file mode 100644
index e27ea5842..000000000
--- a/sources/shiboken2/ApiExtractor/parser/declarator_compiler.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "declarator_compiler.h"
-#include "name_compiler.h"
-#include "type_compiler.h"
-#include "compiler_utils.h"
-#include "lexer.h"
-#include "binder.h"
-#include "tokens.h"
-
-#include <qdebug.h>
-
-DeclaratorCompiler::DeclaratorCompiler(Binder *binder)
- : _M_binder(binder), _M_token_stream(binder->tokenStream())
-{
-}
-
-void DeclaratorCompiler::run(DeclaratorAST *node)
-{
- _M_id.clear();
- _M_parameters.clear();
- _M_array.clear();
- _M_function = false;
- _M_reference = false;
- _M_variadics = false;
- _M_indirection = 0;
-
- if (node) {
- NameCompiler name_cc(_M_binder);
-
- DeclaratorAST *decl = node;
- while (decl && decl->sub_declarator)
- decl = decl->sub_declarator;
-
- Q_ASSERT(decl != 0);
-
- name_cc.run(decl->id);
- _M_id = name_cc.name();
- _M_function = (node->parameter_declaration_clause != 0);
- if (node->parameter_declaration_clause && node->parameter_declaration_clause->ellipsis)
- _M_variadics = true;
-
- visitNodes(this, node->ptr_ops);
- visit(node->parameter_declaration_clause);
-
- if (const ListNode<ExpressionAST*> *it = node->array_dimensions) {
- it->toFront();
- const ListNode<ExpressionAST*> *end = it;
-
- do {
- QString elt;
- if (ExpressionAST *expr = it->element) {
- const Token &start_token = _M_token_stream->token((int) expr->start_token);
- const Token &end_token = _M_token_stream->token((int) expr->end_token);
-
- elt += QString::fromUtf8(&start_token.text[start_token.position],
- (int)(end_token.position - start_token.position)).trimmed();
- }
-
- _M_array.append(elt);
-
- it = it->next;
- } while (it != end);
- }
- }
-}
-
-void DeclaratorCompiler::visitPtrOperator(PtrOperatorAST *node)
-{
- std::size_t op = _M_token_stream->kind(node->op);
-
- switch (op) {
- case '&':
- _M_reference = true;
- break;
- case '*':
- ++_M_indirection;
- break;
-
- default:
- break;
- }
-
- if (node->mem_ptr) {
-#if defined(__GNUC__)
-#warning "ptr to mem -- not implemented"
-#endif
- }
-}
-
-void DeclaratorCompiler::visitParameterDeclaration(ParameterDeclarationAST *node)
-{
- Parameter p;
- DeclaratorCompiler decl_cc(_M_binder);
-
- // Find the innermost declarator, to extract the name / id of the declaration.
- DeclaratorAST *declarator = node->declarator;
- while (declarator && declarator->sub_declarator)
- declarator = declarator->sub_declarator;
- decl_cc.run(declarator);
- p.name = decl_cc.id();
-
- // Use the original declarator to extract the type.
- p.type = CompilerUtils::typeDescription(node->type_specifier, node->declarator, _M_binder);
-
- // In case if the declarator is a function pointer, extract the arguments of the declarator
- // parameter clause. This only works for top-declarator function pointers, it will fail to
- // determine nested function pointers.
- if (declarator != node->declarator
- && node->declarator->parameter_declaration_clause) {
- p.type.setFunctionPointer(true);
- decl_cc.run(node->declarator);
- foreach (const DeclaratorCompiler::Parameter &innerParam, decl_cc.parameters())
- p.type.addArgument(innerParam.type);
- }
-
- if (node->expression != 0) {
- const Token &start = _M_token_stream->token((int) node->expression->start_token);
- const Token &end = _M_token_stream->token((int) node->expression->end_token);
- int length = (int)(end.position - start.position);
-
- p.defaultValueExpression = QString();
- QString source = QString::fromUtf8(&start.text[start.position], length).trimmed();
- QStringList list = source.split(QLatin1Char('\n'));
-
-
- for (int i = 0; i < list.size(); ++i) {
- if (!list.at(i).startsWith(QLatin1Char('#')))
- p.defaultValueExpression += list.at(i).trimmed();
- }
-
- p.defaultValue = p.defaultValueExpression.size() > 0;
-
- }
-
- _M_parameters.append(p);
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/declarator_compiler.h b/sources/shiboken2/ApiExtractor/parser/declarator_compiler.h
deleted file mode 100644
index f67bd4672..000000000
--- a/sources/shiboken2/ApiExtractor/parser/declarator_compiler.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef DECLARATOR_COMPILER_H
-#define DECLARATOR_COMPILER_H
-
-#include "default_visitor.h"
-#include "codemodel.h"
-
-#include <QtCore/QString>
-#include <QtCore/QList>
-
-class TokenStream;
-class Binder;
-
-class DeclaratorCompiler: protected DefaultVisitor
-{
-public:
- struct Parameter {
- TypeInfo type;
- QString name;
- QString defaultValueExpression;
- bool defaultValue;
-
- Parameter(): defaultValue(false) {}
- };
-
-public:
- DeclaratorCompiler(Binder *binder);
-
- void run(DeclaratorAST *node);
-
- inline QString id() const {
- return _M_id;
- }
- inline QStringList arrayElements() const {
- return _M_array;
- }
- inline bool isFunction() const {
- return _M_function;
- }
- inline bool isVariadics() const {
- return _M_variadics;
- }
- inline bool isReference() const {
- return _M_reference;
- }
- inline int indirection() const {
- return _M_indirection;
- }
- inline QList<Parameter> parameters() const {
- return _M_parameters;
- }
-
-protected:
- virtual void visitPtrOperator(PtrOperatorAST *node);
- virtual void visitParameterDeclaration(ParameterDeclarationAST *node);
-
-private:
- Binder *_M_binder;
- TokenStream *_M_token_stream;
-
- bool _M_function;
- bool _M_reference;
- bool _M_variadics;
- int _M_indirection;
- QString _M_id;
- QStringList _M_array;
- QList<Parameter> _M_parameters;
-};
-
-#endif // DECLARATOR_COMPILER_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/default_visitor.cpp b/sources/shiboken2/ApiExtractor/parser/default_visitor.cpp
deleted file mode 100644
index e330abcbb..000000000
--- a/sources/shiboken2/ApiExtractor/parser/default_visitor.cpp
+++ /dev/null
@@ -1,464 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "default_visitor.h"
-
-void DefaultVisitor::visitAccessSpecifier(AccessSpecifierAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitAsmDefinition(AsmDefinitionAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitBaseClause(BaseClauseAST *node)
-{
- visitNodes(this, node->base_specifiers);
-}
-
-void DefaultVisitor::visitBaseSpecifier(BaseSpecifierAST *node)
-{
- visit(node->name);
-}
-
-void DefaultVisitor::visitBinaryExpression(BinaryExpressionAST *node)
-{
- visit(node->left_expression);
- visit(node->right_expression);
-}
-
-void DefaultVisitor::visitCastExpression(CastExpressionAST *node)
-{
- visit(node->type_id);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitClassMemberAccess(ClassMemberAccessAST *node)
-{
- visit(node->name);
-}
-
-void DefaultVisitor::visitClassSpecifier(ClassSpecifierAST *node)
-{
- visit(node->win_decl_specifiers);
- visit(node->name);
- visit(node->base_clause);
- visitNodes(this, node->member_specs);
-}
-
-void DefaultVisitor::visitCompoundStatement(CompoundStatementAST *node)
-{
- visitNodes(this, node->statements);
-}
-
-void DefaultVisitor::visitCondition(ConditionAST *node)
-{
- visit(node->type_specifier);
- visit(node->declarator);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitConditionalExpression(ConditionalExpressionAST *node)
-{
- visit(node->condition);
- visit(node->left_expression);
- visit(node->right_expression);
-}
-
-void DefaultVisitor::visitCppCastExpression(CppCastExpressionAST *node)
-{
- visit(node->type_id);
- visit(node->expression);
- visitNodes(this, node->sub_expressions);
-}
-
-void DefaultVisitor::visitCtorInitializer(CtorInitializerAST *node)
-{
- visitNodes(this, node->member_initializers);
-}
-
-void DefaultVisitor::visitDeclarationStatement(DeclarationStatementAST *node)
-{
- visit(node->declaration);
-}
-
-void DefaultVisitor::visitDeclarator(DeclaratorAST *node)
-{
- visit(node->sub_declarator);
- visitNodes(this, node->ptr_ops);
- visit(node->id);
- visit(node->bit_expression);
- visitNodes(this, node->array_dimensions);
- visit(node->parameter_declaration_clause);
- visit(node->exception_spec);
-}
-
-void DefaultVisitor::visitDeleteExpression(DeleteExpressionAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitDoStatement(DoStatementAST *node)
-{
- visit(node->statement);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitElaboratedTypeSpecifier(ElaboratedTypeSpecifierAST *node)
-{
- visit(node->name);
-}
-
-void DefaultVisitor::visitEnumSpecifier(EnumSpecifierAST *node)
-{
- visit(node->name);
- visitNodes(this, node->enumerators);
-}
-
-void DefaultVisitor::visitEnumerator(EnumeratorAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitExceptionSpecification(ExceptionSpecificationAST *node)
-{
- visitNodes(this, node->type_ids);
-}
-
-void DefaultVisitor::visitExpressionOrDeclarationStatement(ExpressionOrDeclarationStatementAST *node)
-{
- visit(node->expression);
- visit(node->declaration);
-}
-
-void DefaultVisitor::visitExpressionStatement(ExpressionStatementAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitForStatement(ForStatementAST *node)
-{
- visit(node->init_statement);
- visit(node->condition);
- visit(node->expression);
- visit(node->statement);
-}
-
-void DefaultVisitor::visitFunctionCall(FunctionCallAST *node)
-{
- visit(node->arguments);
-}
-
-void DefaultVisitor::visitFunctionDefinition(FunctionDefinitionAST *node)
-{
- visit(node->type_specifier);
- visit(node->init_declarator);
- visit(node->function_body);
- visit(node->win_decl_specifiers);
-}
-
-void DefaultVisitor::visitIfStatement(IfStatementAST *node)
-{
- visit(node->condition);
- visit(node->statement);
- visit(node->else_statement);
-}
-
-void DefaultVisitor::visitIncrDecrExpression(IncrDecrExpressionAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitInitDeclarator(InitDeclaratorAST *node)
-{
- visit(node->declarator);
- visit(node->initializer);
-}
-
-void DefaultVisitor::visitInitializer(InitializerAST *node)
-{
- visit(node->initializer_clause);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitInitializerClause(InitializerClauseAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitLabeledStatement(LabeledStatementAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitLinkageBody(LinkageBodyAST *node)
-{
- visitNodes(this, node->declarations);
-}
-
-void DefaultVisitor::visitLinkageSpecification(LinkageSpecificationAST *node)
-{
- visit(node->linkage_body);
- visit(node->declaration);
-}
-
-void DefaultVisitor::visitMemInitializer(MemInitializerAST *node)
-{
- visit(node->initializer_id);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitName(NameAST *node)
-{
- visitNodes(this, node->qualified_names);
- visit(node->unqualified_name);
-}
-
-void DefaultVisitor::visitNamespace(NamespaceAST *node)
-{
- visit(node->linkage_body);
-}
-
-void DefaultVisitor::visitNamespaceAliasDefinition(NamespaceAliasDefinitionAST *node)
-{
- visit(node->alias_name);
-}
-
-void DefaultVisitor::visitNewDeclarator(NewDeclaratorAST *node)
-{
- visit(node->ptr_op);
- visit(node->sub_declarator);
- visitNodes(this, node->expressions);
-}
-
-void DefaultVisitor::visitNewExpression(NewExpressionAST *node)
-{
- visit(node->expression);
- visit(node->type_id);
- visit(node->new_type_id);
- visit(node->new_initializer);
-}
-
-void DefaultVisitor::visitNewInitializer(NewInitializerAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitNewTypeId(NewTypeIdAST *node)
-{
- visit(node->type_specifier);
- visit(node->new_initializer);
- visit(node->new_declarator);
-}
-
-void DefaultVisitor::visitOperator(OperatorAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitOperatorFunctionId(OperatorFunctionIdAST *node)
-{
- visit(node->op);
- visit(node->type_specifier);
- visitNodes(this, node->ptr_ops);
-}
-
-void DefaultVisitor::visitParameterDeclaration(ParameterDeclarationAST *node)
-{
- visit(node->type_specifier);
- visit(node->declarator);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitParameterDeclarationClause(ParameterDeclarationClauseAST *node)
-{
- visitNodes(this, node->parameter_declarations);
-}
-
-void DefaultVisitor::visitPostfixExpression(PostfixExpressionAST *node)
-{
- visit(node->type_specifier);
- visit(node->expression);
- visitNodes(this, node->sub_expressions);
-}
-
-void DefaultVisitor::visitPrimaryExpression(PrimaryExpressionAST *node)
-{
- visit(node->literal);
- visit(node->expression_statement);
- visit(node->sub_expression);
- visit(node->name);
-}
-
-void DefaultVisitor::visitPtrOperator(PtrOperatorAST *node)
-{
- visit(node->mem_ptr);
-}
-
-void DefaultVisitor::visitPtrToMember(PtrToMemberAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitReturnStatement(ReturnStatementAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitSimpleDeclaration(SimpleDeclarationAST *node)
-{
- visit(node->type_specifier);
- visitNodes(this, node->init_declarators);
- visit(node->win_decl_specifiers);
-}
-
-void DefaultVisitor::visitSimpleTypeSpecifier(SimpleTypeSpecifierAST *node)
-{
- visit(node->name);
- visit(node->type_id);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitSizeofExpression(SizeofExpressionAST *node)
-{
- visit(node->type_id);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitStringLiteral(StringLiteralAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitSubscriptExpression(SubscriptExpressionAST *node)
-{
- visit(node->subscript);
-}
-
-void DefaultVisitor::visitSwitchStatement(SwitchStatementAST *node)
-{
- visit(node->condition);
- visit(node->statement);
-}
-
-void DefaultVisitor::visitTemplateArgument(TemplateArgumentAST *node)
-{
- visit(node->type_id);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitTemplateDeclaration(TemplateDeclarationAST *node)
-{
- visitNodes(this, node->template_parameters);
- visit(node->declaration);
-}
-
-void DefaultVisitor::visitTemplateParameter(TemplateParameterAST *node)
-{
- visit(node->type_parameter);
- visit(node->parameter_declaration);
-}
-
-void DefaultVisitor::visitThrowExpression(ThrowExpressionAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitTranslationUnit(TranslationUnitAST *node)
-{
- visitNodes(this, node->declarations);
-}
-
-void DefaultVisitor::visitTryBlockStatement(TryBlockStatementAST *)
-{
- // nothing to do
-}
-
-void DefaultVisitor::visitTypeId(TypeIdAST *node)
-{
- visit(node->type_specifier);
- visit(node->declarator);
-}
-
-void DefaultVisitor::visitTypeIdentification(TypeIdentificationAST *node)
-{
- visit(node->name);
- visit(node->expression);
-}
-
-void DefaultVisitor::visitTypeParameter(TypeParameterAST *node)
-{
- visit(node->name);
- visit(node->type_id);
- visitNodes(this, node->template_parameters);
- visit(node->template_name);
-}
-
-void DefaultVisitor::visitTypedef(TypedefAST *node)
-{
- visit(node->type_specifier);
- visitNodes(this, node->init_declarators);
-}
-
-void DefaultVisitor::visitUnaryExpression(UnaryExpressionAST *node)
-{
- visit(node->expression);
-}
-
-void DefaultVisitor::visitUnqualifiedName(UnqualifiedNameAST *node)
-{
- visit(node->operator_id);
- visitNodes(this, node->template_arguments);
-}
-
-void DefaultVisitor::visitUsing(UsingAST *node)
-{
- visit(node->name);
-}
-
-void DefaultVisitor::visitUsingDirective(UsingDirectiveAST *node)
-{
- visit(node->name);
-}
-
-void DefaultVisitor::visitWhileStatement(WhileStatementAST *node)
-{
- visit(node->condition);
- visit(node->statement);
-}
-
-void DefaultVisitor::visitWinDeclSpec(WinDeclSpecAST *)
-{
- // nothing to do
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/default_visitor.h b/sources/shiboken2/ApiExtractor/parser/default_visitor.h
deleted file mode 100644
index 1eef8cc85..000000000
--- a/sources/shiboken2/ApiExtractor/parser/default_visitor.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef DEFAULT_VISITOR_H
-#define DEFAULT_VISITOR_H
-
-#include "visitor.h"
-
-class DefaultVisitor: public Visitor
-{
-public:
- DefaultVisitor() {}
-
-protected:
- virtual void visitAccessSpecifier(AccessSpecifierAST *);
- virtual void visitAsmDefinition(AsmDefinitionAST *);
- virtual void visitBaseClause(BaseClauseAST *);
- virtual void visitBaseSpecifier(BaseSpecifierAST *);
- virtual void visitBinaryExpression(BinaryExpressionAST *);
- virtual void visitCastExpression(CastExpressionAST *);
- virtual void visitClassMemberAccess(ClassMemberAccessAST *);
- virtual void visitClassSpecifier(ClassSpecifierAST *);
- virtual void visitCompoundStatement(CompoundStatementAST *);
- virtual void visitCondition(ConditionAST *);
- virtual void visitConditionalExpression(ConditionalExpressionAST *);
- virtual void visitCppCastExpression(CppCastExpressionAST *);
- virtual void visitCtorInitializer(CtorInitializerAST *);
- virtual void visitDeclarationStatement(DeclarationStatementAST *);
- virtual void visitDeclarator(DeclaratorAST *);
- virtual void visitDeleteExpression(DeleteExpressionAST *);
- virtual void visitDoStatement(DoStatementAST *);
- virtual void visitElaboratedTypeSpecifier(ElaboratedTypeSpecifierAST *);
- virtual void visitEnumSpecifier(EnumSpecifierAST *);
- virtual void visitEnumerator(EnumeratorAST *);
- virtual void visitExceptionSpecification(ExceptionSpecificationAST *);
- virtual void visitExpressionOrDeclarationStatement(ExpressionOrDeclarationStatementAST *);
- virtual void visitExpressionStatement(ExpressionStatementAST *);
- virtual void visitForStatement(ForStatementAST *);
- virtual void visitFunctionCall(FunctionCallAST *);
- virtual void visitFunctionDefinition(FunctionDefinitionAST *);
- virtual void visitIfStatement(IfStatementAST *);
- virtual void visitIncrDecrExpression(IncrDecrExpressionAST *);
- virtual void visitInitDeclarator(InitDeclaratorAST *);
- virtual void visitInitializer(InitializerAST *);
- virtual void visitInitializerClause(InitializerClauseAST *);
- virtual void visitLabeledStatement(LabeledStatementAST *);
- virtual void visitLinkageBody(LinkageBodyAST *);
- virtual void visitLinkageSpecification(LinkageSpecificationAST *);
- virtual void visitMemInitializer(MemInitializerAST *);
- virtual void visitName(NameAST *);
- virtual void visitNamespace(NamespaceAST *);
- virtual void visitNamespaceAliasDefinition(NamespaceAliasDefinitionAST *);
- virtual void visitNewDeclarator(NewDeclaratorAST *);
- virtual void visitNewExpression(NewExpressionAST *);
- virtual void visitNewInitializer(NewInitializerAST *);
- virtual void visitNewTypeId(NewTypeIdAST *);
- virtual void visitOperator(OperatorAST *);
- virtual void visitOperatorFunctionId(OperatorFunctionIdAST *);
- virtual void visitParameterDeclaration(ParameterDeclarationAST *);
- virtual void visitParameterDeclarationClause(ParameterDeclarationClauseAST *);
- virtual void visitPostfixExpression(PostfixExpressionAST *);
- virtual void visitPrimaryExpression(PrimaryExpressionAST *);
- virtual void visitPtrOperator(PtrOperatorAST *);
- virtual void visitPtrToMember(PtrToMemberAST *);
- virtual void visitReturnStatement(ReturnStatementAST *);
- virtual void visitSimpleDeclaration(SimpleDeclarationAST *);
- virtual void visitSimpleTypeSpecifier(SimpleTypeSpecifierAST *);
- virtual void visitSizeofExpression(SizeofExpressionAST *);
- virtual void visitStringLiteral(StringLiteralAST *);
- virtual void visitSubscriptExpression(SubscriptExpressionAST *);
- virtual void visitSwitchStatement(SwitchStatementAST *);
- virtual void visitTemplateArgument(TemplateArgumentAST *);
- virtual void visitTemplateDeclaration(TemplateDeclarationAST *);
- virtual void visitTemplateParameter(TemplateParameterAST *);
- virtual void visitThrowExpression(ThrowExpressionAST *);
- virtual void visitTranslationUnit(TranslationUnitAST *);
- virtual void visitTryBlockStatement(TryBlockStatementAST *);
- virtual void visitTypeId(TypeIdAST *);
- virtual void visitTypeIdentification(TypeIdentificationAST *);
- virtual void visitTypeParameter(TypeParameterAST *);
- virtual void visitTypedef(TypedefAST *);
- virtual void visitUnaryExpression(UnaryExpressionAST *);
- virtual void visitUnqualifiedName(UnqualifiedNameAST *);
- virtual void visitUsing(UsingAST *);
- virtual void visitUsingDirective(UsingDirectiveAST *);
- virtual void visitWhileStatement(WhileStatementAST *);
- virtual void visitWinDeclSpec(WinDeclSpecAST *);
-
-private:
- typedef void (Visitor::*visitor_fun_ptr)(AST *);
- static visitor_fun_ptr _S_table[];
-};
-
-#endif // VISITOR_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/dumptree.cpp b/sources/shiboken2/ApiExtractor/parser/dumptree.cpp
deleted file mode 100644
index 0a7444c14..000000000
--- a/sources/shiboken2/ApiExtractor/parser/dumptree.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "dumptree.h"
-
-#include <QtCore/QString>
-#include <QtCore/qdebug.h>
-
-static char const * const names[] = {
- 0,
- "AccessSpecifier",
- "AsmDefinition",
- "BaseClause",
- "BaseSpecifier",
- "BinaryExpression",
- "CastExpression",
- "ClassMemberAccess",
- "ClassSpecifier",
- "CompoundStatement",
- "Condition",
- "ConditionalExpression",
- "CppCastExpression",
- "CtorInitializer",
- "DeclarationStatement",
- "Declarator",
- "DeleteExpression",
- "DoStatement",
- "ElaboratedTypeSpecifier",
- "EnumSpecifier",
- "Enumerator",
- "ExceptionSpecification",
- "ExpressionOrDeclarationStatement",
- "ExpressionStatement",
- "ForStatement",
- "FunctionCall",
- "FunctionDefinition",
- "IfStatement",
- "IncrDecrExpression",
- "InitDeclarator",
- "Initializer",
- "InitializerClause",
- "LabeledStatement",
- "LinkageBody",
- "LinkageSpecification",
- "MemInitializer",
- "Name",
- "Namespace",
- "NamespaceAliasDefinition",
- "NewDeclarator",
- "NewExpression",
- "NewInitializer",
- "NewTypeId",
- "Operator",
- "OperatorFunctionId",
- "ParameterDeclaration",
- "ParameterDeclarationClause",
- "PostfixExpression",
- "PrimaryExpression",
- "PtrOperator",
- "PtrToMember",
- "ReturnStatement",
- "SimpleDeclaration",
- "SimpleTypeSpecifier",
- "SizeofExpression",
- "StringLiteral",
- "SubscriptExpression",
- "SwitchStatement",
- "TemplateArgument",
- "TemplateDeclaration",
- "TemplateParameter",
- "ThrowExpression",
- "TranslationUnit",
- "TryBlockStatement",
- "TypeId",
- "TypeIdentification",
- "TypeParameter",
- "Typedef",
- "UnaryExpression",
- "UnqualifiedName",
- "Using",
- "UsingDirective",
- "WhileStatement",
- "WinDeclSpec"
-};
-
-DumpTree::DumpTree()
-{
-}
-
-void DumpTree::visit(AST *node)
-{
- static int indent = 0;
-
-
- if (node)
- qDebug() << QByteArray(indent * 2, ' ').constData() << names[node->kind]
- << '[' << node->start_token << ", " << node->end_token << ']';
-
- ++indent;
- DefaultVisitor::visit(node);
- --indent;
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/lexer.cpp b/sources/shiboken2/ApiExtractor/parser/lexer.cpp
deleted file mode 100644
index 3fcf3b561..000000000
--- a/sources/shiboken2/ApiExtractor/parser/lexer.cpp
+++ /dev/null
@@ -1,1726 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "lexer.h"
-#include "tokens.h"
-#include "control.h"
-
-#include <cctype>
-#include <iostream>
-
-scan_fun_ptr Lexer::s_scan_keyword_table[] = {
- &Lexer::scanKeyword0, &Lexer::scanKeyword0,
- &Lexer::scanKeyword2, &Lexer::scanKeyword3,
- &Lexer::scanKeyword4, &Lexer::scanKeyword5,
- &Lexer::scanKeyword6, &Lexer::scanKeyword7,
- &Lexer::scanKeyword8, &Lexer::scanKeyword9,
- &Lexer::scanKeyword10, &Lexer::scanKeyword11,
- &Lexer::scanKeyword12, &Lexer::scanKeyword13,
- &Lexer::scanKeyword14, &Lexer::scanKeyword0,
- &Lexer::scanKeyword16
-};
-
-void LocationManager::extract_line(int offset, int *line, QString *filename) const
-{
- *line = 0;
- if (token_stream.size() < 1)
- return;
-
- const unsigned char *begin_buffer = reinterpret_cast<const unsigned char *>(token_stream[0].text);
- const unsigned char *cursor = begin_buffer + offset;
-
- ++cursor; // skip '#'
- if (std::isspace(*cursor) && std::isdigit(*(cursor + 1))) {
- ++cursor;
- char buffer[1024], *cp = buffer;
- do {
- *cp++ = *cursor++;
- } while (std::isdigit(*cursor));
- *cp = '\0';
- int l = strtol(buffer, 0, 0);
-
- Q_ASSERT(std::isspace(*cursor));
- ++cursor;
-
- Q_ASSERT(*cursor == '"');
- ++cursor;
-
- cp = buffer;
- while (*cursor && *cursor != '"') {
- *cp++ = *cursor++;
- }
- *cp = '\0';
- Q_ASSERT(*cursor == '"');
- ++cursor;
-
- *filename = QLatin1String(buffer);
- *line = l;
- // printf("filename: %s line: %d\n", buffer, line);
- }
-}
-
-void LocationManager::positionAt(std::size_t offset, int *line, int *column,
- QString *filename) const
-{
- int ppline = 0;
- int ppcolumn = 0;
- line_table.positionAt(offset, &ppline, &ppcolumn);
-
- int base_line = 0;
- extract_line((int) line_table[ppline-1], &base_line, filename);
-
- int line2 = 0;
- int column2 = 0;
- location_table.positionAt((int) line_table[ppline-1], &line2, &column2);
-
- location_table.positionAt(offset, line, column);
- *line = base_line + *line - line2 - 1;
-}
-
-scan_fun_ptr Lexer::s_scan_table[256];
-bool Lexer::s_initialized = false;
-
-void Lexer::tokenize(const char *contents, std::size_t size)
-{
- if (!s_initialized)
- initialize_scan_table();
-
- token_stream.resize(1024);
- token_stream[0].kind = Token_EOF;
- token_stream[0].text = contents;
-
- index = 1;
-
- cursor = (const unsigned char *) contents;
- begin_buffer = (const unsigned char *) contents;
- end_buffer = cursor + size;
-
- location_table.resize(1024);
- location_table[0] = 0;
- location_table.current_line = 1;
-
- line_table.resize(1024);
- line_table[0] = 0;
- line_table.current_line = 1;
-
- do {
- if (index == token_stream.size())
- token_stream.resize(token_stream.size() * 2);
-
- Token *current_token = &token_stream[(int) index];
- current_token->text = reinterpret_cast<const char*>(begin_buffer);
- current_token->position = cursor - begin_buffer;
- (this->*s_scan_table[*cursor])();
- current_token->size = cursor - begin_buffer - current_token->position;
- } while (cursor < end_buffer);
-
- if (index == token_stream.size())
- token_stream.resize(token_stream.size() * 2);
-
- Q_ASSERT(index < token_stream.size());
- token_stream[(int) index].position = cursor - begin_buffer;
- token_stream[(int) index].kind = Token_EOF;
-}
-
-void Lexer::reportError(const QString& msg)
-{
- int line = 0;
- int column = 0;
- QString fileName;
-
- std::size_t tok = token_stream.cursor();
- _M_location.positionAt(token_stream.position(tok),
- &line, &column, &fileName);
-
- Control::ErrorMessage errmsg;
- errmsg.setLine(line + 1);
- errmsg.setColumn(column);
- errmsg.setFileName(fileName);
- errmsg.setMessage(QLatin1String("** LEXER ERROR ") + msg);
- control->reportError(errmsg);
-}
-
-void Lexer::initialize_scan_table()
-{
- s_initialized = true;
-
- for (int i = 0; i < 256; ++i) {
- if (isspace(i))
- s_scan_table[i] = &Lexer::scan_white_spaces;
- else if (isalpha(i) || i == '_')
- s_scan_table[i] = &Lexer::scan_identifier_or_keyword;
- else if (isdigit(i))
- s_scan_table[i] = &Lexer::scan_int_constant;
- else
- s_scan_table[i] = &Lexer::scan_invalid_input;
- }
-
- s_scan_table[int('L')] = &Lexer::scan_identifier_or_literal;
- s_scan_table[int('\n')] = &Lexer::scan_newline;
- s_scan_table[int('#')] = &Lexer::scan_preprocessor;
-
- s_scan_table[int('\'')] = &Lexer::scan_char_constant;
- s_scan_table[int('"')] = &Lexer::scan_string_constant;
-
- s_scan_table[int('.')] = &Lexer::scan_int_constant;
-
- s_scan_table[int('!')] = &Lexer::scan_not;
- s_scan_table[int('%')] = &Lexer::scan_remainder;
- s_scan_table[int('&')] = &Lexer::scan_and;
- s_scan_table[int('(')] = &Lexer::scan_left_paren;
- s_scan_table[int(')')] = &Lexer::scan_right_paren;
- s_scan_table[int('*')] = &Lexer::scan_star;
- s_scan_table[int('+')] = &Lexer::scan_plus;
- s_scan_table[int(',')] = &Lexer::scan_comma;
- s_scan_table[int('-')] = &Lexer::scan_minus;
- s_scan_table[int('/')] = &Lexer::scan_divide;
- s_scan_table[int(':')] = &Lexer::scan_colon;
- s_scan_table[int(';')] = &Lexer::scan_semicolon;
- s_scan_table[int('<')] = &Lexer::scan_less;
- s_scan_table[int('=')] = &Lexer::scan_equal;
- s_scan_table[int('>')] = &Lexer::scan_greater;
- s_scan_table[int('?')] = &Lexer::scan_question;
- s_scan_table[int('[')] = &Lexer::scan_left_bracket;
- s_scan_table[int(']')] = &Lexer::scan_right_bracket;
- s_scan_table[int('^')] = &Lexer::scan_xor;
- s_scan_table[int('{')] = &Lexer::scan_left_brace;
- s_scan_table[int('|')] = &Lexer::scan_or;
- s_scan_table[int('}')] = &Lexer::scan_right_brace;
- s_scan_table[int('~')] = &Lexer::scan_tilde;
-
- s_scan_table[0] = &Lexer::scan_EOF;
-}
-
-void Lexer::scan_preprocessor()
-{
- if (line_table.current_line == line_table.size())
- line_table.resize(line_table.current_line * 2);
-
- line_table[(int) line_table.current_line++] = (cursor - begin_buffer);
-
- while (*cursor && *cursor != '\n')
- ++cursor;
-
- if (*cursor != '\n')
- reportError(QLatin1String("expected newline"));
-}
-
-void Lexer::scan_char_constant()
-{
- const unsigned char *begin = cursor;
-
- ++cursor;
- while (*cursor && *cursor != '\'') {
- if (*cursor == '\n')
- reportError(QLatin1String("did not expect newline"));
-
- if (*cursor == '\\')
- ++cursor;
- ++cursor;
- }
-
- if (*cursor != '\'')
- reportError(QLatin1String("expected \'"));
-
- ++cursor;
-
- token_stream[(int) index].extra.symbol =
- control->findOrInsertName((const char*) begin, cursor - begin);
-
- token_stream[(int) index++].kind = Token_char_literal;
-}
-
-void Lexer::scan_string_constant()
-{
- const unsigned char *begin = cursor;
-
- ++cursor;
- while (*cursor && *cursor != '"') {
- if (*cursor == '\n')
- reportError(QLatin1String("did not expect newline"));
-
- if (*cursor == '\\')
- ++cursor;
- ++cursor;
- }
-
- if (*cursor != '"')
- reportError(QLatin1String("expected \""));
-
- ++cursor;
-
- token_stream[(int) index].extra.symbol =
- control->findOrInsertName((const char*) begin, cursor - begin);
-
- token_stream[(int) index++].kind = Token_string_literal;
-}
-
-void Lexer::scan_newline()
-{
- if (location_table.current_line == location_table.size())
- location_table.resize(location_table.current_line * 2);
-
- location_table[(int) location_table.current_line++] = (cursor - begin_buffer);
- ++cursor;
-}
-
-void Lexer::scan_white_spaces()
-{
- while (isspace(*cursor)) {
- if (*cursor == '\n')
- scan_newline();
- else
- ++cursor;
- }
-}
-
-void Lexer::scan_identifier_or_literal()
-{
- switch (*(cursor + 1)) {
- case '\'':
- ++cursor;
- scan_char_constant();
- break;
-
- case '\"':
- ++cursor;
- scan_string_constant();
- break;
-
- default:
- scan_identifier_or_keyword();
- break;
- }
-}
-
-void Lexer::scan_identifier_or_keyword()
-{
- const unsigned char *skip = cursor;
- while (isalnum(*skip) || *skip == '_')
- ++skip;
-
- int n = skip - cursor;
- Token *current_token = &token_stream[(int) index];
- (this->*s_scan_keyword_table[n < 17 ? n : 0])();
-
- if (current_token->kind == Token_identifier) {
- current_token->extra.symbol =
- control->findOrInsertName((const char*) cursor, n);
- }
-
- cursor = skip;
-}
-
-void Lexer::scan_int_constant()
-{
- if (*cursor == '.' && !std::isdigit(*(cursor + 1))) {
- scan_dot();
- return;
- }
-
- const unsigned char *begin = cursor;
-
- while (isalnum(*cursor) || *cursor == '.')
- ++cursor;
-
- token_stream[(int) index].extra.symbol =
- control->findOrInsertName((const char*) begin, cursor - begin);
-
- token_stream[(int) index++].kind = Token_number_literal;
-}
-
-void Lexer::scan_not()
-{
- /*
- '!' ::= not
- '!=' ::= not_equal
- */
-
- ++cursor;
-
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_not_eq;
- } else {
- token_stream[(int) index++].kind = '!';
- }
-}
-
-void Lexer::scan_remainder()
-{
- /*
- '%' ::= remainder
- '%=' ::= remainder_equal
- */
-
- ++cursor;
-
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else {
- token_stream[(int) index++].kind = '%';
- }
-}
-
-void Lexer::scan_and()
-{
- /*
- '&&' ::= and_and
- '&' ::= and
- '&=' ::= and_equal
- */
-
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else if (*cursor == '&') {
- ++cursor;
- token_stream[(int) index++].kind = Token_and;
- } else {
- token_stream[(int) index++].kind = '&';
- }
-}
-
-void Lexer::scan_left_paren()
-{
- ++cursor;
- token_stream[(int) index++].kind = '(';
-}
-
-void Lexer::scan_right_paren()
-{
- ++cursor;
- token_stream[(int) index++].kind = ')';
-}
-
-void Lexer::scan_star()
-{
- /*
- '*' ::= star
- '*=' ::= star_equal
- */
-
- ++cursor;
-
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else {
- token_stream[(int) index++].kind = '*';
- }
-}
-
-void Lexer::scan_plus()
-{
- /*
- '+' ::= plus
- '++' ::= incr
- '+=' ::= plus_equal
- */
-
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else if (*cursor == '+') {
- ++cursor;
- token_stream[(int) index++].kind = Token_incr;
- } else {
- token_stream[(int) index++].kind = '+';
- }
-}
-
-void Lexer::scan_comma()
-{
- ++cursor;
- token_stream[(int) index++].kind = ',';
-}
-
-void Lexer::scan_minus()
-{
- /*
- '-' ::= minus
- '--' ::= decr
- '-=' ::= minus_equal
- '->' ::= left_arrow
- */
-
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else if (*cursor == '-') {
- ++cursor;
- token_stream[(int) index++].kind = Token_decr;
- } else if (*cursor == '>') {
- ++cursor;
- token_stream[(int) index++].kind = Token_arrow;
- if (*cursor == '*') {
- ++cursor;
- token_stream[(int) index++].kind = Token_ptrmem;
- }
- } else {
- token_stream[(int) index++].kind = '-';
- }
-}
-
-void Lexer::scan_dot()
-{
- /*
- '.' ::= dot
- '...' ::= ellipsis
- */
-
- ++cursor;
- if (*cursor == '.' && *(cursor + 1) == '.') {
- cursor += 2;
- token_stream[(int) index++].kind = Token_ellipsis;
- } else if (*cursor == '.' && *(cursor + 1) == '*') {
- cursor += 2;
- token_stream[(int) index++].kind = Token_ptrmem;
- } else
- token_stream[(int) index++].kind = '.';
-}
-
-void Lexer::scan_divide()
-{
- /*
- '/' ::= divide
- '/=' ::= divide_equal
- */
-
- ++cursor;
-
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else {
- token_stream[(int) index++].kind = '/';
- }
-}
-
-void Lexer::scan_colon()
-{
- ++cursor;
- if (*cursor == ':') {
- ++cursor;
- token_stream[(int) index++].kind = Token_scope;
- } else {
- token_stream[(int) index++].kind = ':';
- }
-}
-
-void Lexer::scan_semicolon()
-{
- ++cursor;
- token_stream[(int) index++].kind = ';';
-}
-
-void Lexer::scan_less()
-{
- /*
- '<' ::= less
- '<<' ::= left_shift
- '<<=' ::= left_shift_equal
- '<=' ::= less_equal
- */
-
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_leq;
- } else if (*cursor == '<') {
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else {
- token_stream[(int) index++].kind = Token_shift;
- }
- } else {
- token_stream[(int) index++].kind = '<';
- }
-}
-
-void Lexer::scan_equal()
-{
- /*
- '=' ::= equal
- '==' ::= equal_equal
- */
- ++cursor;
-
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_eq;
- } else {
- token_stream[(int) index++].kind = '=';
- }
-}
-
-void Lexer::scan_greater()
-{
- /*
- '>' ::= greater
- '>=' ::= greater_equal
- '>>' ::= right_shift
- '>>=' ::= right_shift_equal
- */
-
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_geq;
- } else if (*cursor == '>') {
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else {
- token_stream[(int) index++].kind = Token_shift;
- }
- } else {
- token_stream[(int) index++].kind = '>';
- }
-}
-
-void Lexer::scan_question()
-{
- ++cursor;
- token_stream[(int) index++].kind = '?';
-}
-
-void Lexer::scan_left_bracket()
-{
- ++cursor;
- token_stream[(int) index++].kind = '[';
-}
-
-void Lexer::scan_right_bracket()
-{
- ++cursor;
- token_stream[(int) index++].kind = ']';
-}
-
-void Lexer::scan_xor()
-{
- /*
- '^' ::= xor
- '^=' ::= xor_equal
- */
- ++cursor;
-
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else {
- token_stream[(int) index++].kind = '^';
- }
-}
-
-void Lexer::scan_left_brace()
-{
- ++cursor;
- token_stream[(int) index++].kind = '{';
-}
-
-void Lexer::scan_or()
-{
- /*
- '|' ::= or
- '|=' ::= or_equal
- '||' ::= or_or
- */
- ++cursor;
- if (*cursor == '=') {
- ++cursor;
- token_stream[(int) index++].kind = Token_assign;
- } else if (*cursor == '|') {
- ++cursor;
- token_stream[(int) index++].kind = Token_or;
- } else {
- token_stream[(int) index++].kind = '|';
- }
-}
-
-void Lexer::scan_right_brace()
-{
- ++cursor;
- token_stream[(int) index++].kind = '}';
-}
-
-void Lexer::scan_tilde()
-{
- ++cursor;
- token_stream[(int) index++].kind = '~';
-}
-
-void Lexer::scan_EOF()
-{
- ++cursor;
- token_stream[(int) index++].kind = Token_EOF;
-}
-
-void Lexer::scan_invalid_input()
-{
- QString errmsg(QLatin1String("invalid input: %1"));
- reportError(errmsg);
- ++cursor;
-}
-
-void LocationTable::positionAt(std::size_t offset, int max_line,
- int *line, int *column) const
-{
- if (!(line && column && max_line != 0))
- return;
-
- int first = 0;
- int len = max_line;
- int half;
- int middle;
-
- while (len > 0) {
- half = len >> 1;
- middle = first;
-
- middle += half;
-
- if (lines[middle] < offset) {
- first = middle;
- ++first;
- len = len - half - 1;
- } else
- len = half;
- }
-
- *line = std::max(first, 1);
- *column = (int)(offset - lines[*line - 1] - 1);
-
- if (*column < 0) {
- *column = 0;
- }
-}
-
-void Lexer::scanKeyword0()
-{
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword2()
-{
- switch (*cursor) {
- case 'i':
- if (*(cursor + 1) == 'f') {
- token_stream[(int) index++].kind = Token_if;
- return;
- }
- break;
-
- case 'd':
- if (*(cursor + 1) == 'o') {
- token_stream[(int) index++].kind = Token_do;
- return;
- }
- break;
-
- case 'o':
- if (*(cursor + 1) == 'r') {
- token_stream[(int) index++].kind = Token_or;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword3()
-{
- switch (*cursor) {
- case 'a':
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 'd') {
- token_stream[(int) index++].kind = Token_and;
- return;
- }
- if (*(cursor + 1) == 's' &&
- *(cursor + 2) == 'm') {
- token_stream[(int) index++].kind = Token_asm;
- return;
- }
- break;
-
- case 'f':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'r') {
- token_stream[(int) index++].kind = Token_for;
- return;
- }
- break;
-
- case 'i':
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 't') {
- token_stream[(int) index++].kind = Token_int;
- return;
- }
- break;
-
- case 'n':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 'w') {
- token_stream[(int) index++].kind = Token_new;
- return;
- }
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 't') {
- token_stream[(int) index++].kind = Token_not;
- return;
- }
- break;
-
- case 't':
- if (*(cursor + 1) == 'r' &&
- *(cursor + 2) == 'y') {
- token_stream[(int) index++].kind = Token_try;
- return;
- }
- break;
-
- case 'x':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'r') {
- token_stream[(int) index++].kind = Token_xor;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword4()
-{
- switch (*cursor) {
- case 'a':
- if (*(cursor + 1) == 'u' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'o') {
- token_stream[(int) index++].kind = Token_auto;
- return;
- }
- break;
-
- case 'c':
- if (*(cursor + 1) == 'a' &&
- *(cursor + 2) == 's' &&
- *(cursor + 3) == 'e') {
- token_stream[(int) index++].kind = Token_case;
- return;
- }
- if (*(cursor + 1) == 'h' &&
- *(cursor + 2) == 'a' &&
- *(cursor + 3) == 'r') {
- token_stream[(int) index++].kind = Token_char;
- return;
- }
- break;
-
- case 'b':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'o' &&
- *(cursor + 3) == 'l') {
- token_stream[(int) index++].kind = Token_bool;
- return;
- }
- break;
-
- case 'e':
- if (*(cursor + 1) == 'l' &&
- *(cursor + 2) == 's' &&
- *(cursor + 3) == 'e') {
- token_stream[(int) index++].kind = Token_else;
- return;
- }
- if (*(cursor + 1) == 'm' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 't') {
- token_stream[(int) index++].kind = Token_emit;
- return;
- }
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 'u' &&
- *(cursor + 3) == 'm') {
- token_stream[(int) index++].kind = Token_enum;
- return;
- }
- break;
-
- case 'g':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'o') {
- token_stream[(int) index++].kind = Token_goto;
- return;
- }
- break;
-
- case 'l':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'n' &&
- *(cursor + 3) == 'g') {
- token_stream[(int) index++].kind = Token_long;
- return;
- }
- break;
-
- case 't':
- if (*(cursor + 1) == 'h' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 's') {
- token_stream[(int) index++].kind = Token_this;
- return;
- }
- break;
-
- case 'v':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'd') {
- token_stream[(int) index++].kind = Token_void;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword5()
-{
- switch (*cursor) {
- case 'c':
- if (*(cursor + 1) == 'a' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'c' &&
- *(cursor + 4) == 'h') {
- token_stream[(int) index++].kind = Token_catch;
- return;
- }
- if (*(cursor + 1) == 'l' &&
- *(cursor + 2) == 'a' &&
- *(cursor + 3) == 's' &&
- *(cursor + 4) == 's') {
- token_stream[(int) index++].kind = Token_class;
- return;
- }
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'm' &&
- *(cursor + 3) == 'p' &&
- *(cursor + 4) == 'l') {
- token_stream[(int) index++].kind = Token_compl;
- return;
- }
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'n' &&
- *(cursor + 3) == 's' &&
- *(cursor + 4) == 't') {
- token_stream[(int) index++].kind = Token_const;
- return;
- }
- break;
-
- case 'b':
- if (*(cursor + 1) == 'i' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'o' &&
- *(cursor + 4) == 'r') {
- token_stream[(int) index++].kind = Token_bitor;
- return;
- }
- if (*(cursor + 1) == 'r' &&
- *(cursor + 2) == 'e' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 'k') {
- token_stream[(int) index++].kind = Token_break;
- return;
- }
- break;
-
- case 'f':
- if (*(cursor + 1) == 'l' &&
- *(cursor + 2) == 'o' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 't') {
- token_stream[(int) index++].kind = Token_float;
- return;
- }
- break;
-
- case 'o':
- if (*(cursor + 1) == 'r' &&
- *(cursor + 2) == '_' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'q') {
- token_stream[(int) index++].kind = Token_or_eq;
- return;
- }
- break;
-
- case 's':
- if (*(cursor + 1) == 'h' &&
- *(cursor + 2) == 'o' &&
- *(cursor + 3) == 'r' &&
- *(cursor + 4) == 't') {
- token_stream[(int) index++].kind = Token_short;
- return;
- }
- if (*(cursor + 1) == 'l' &&
- *(cursor + 2) == 'o' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 's') {
- token_stream[(int) index++].kind = Token_slots;
- return;
- }
- break;
-
- case 'u':
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'o' &&
- *(cursor + 4) == 'n') {
- token_stream[(int) index++].kind = Token_union;
- return;
- }
- if (*(cursor + 1) == 's' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'n' &&
- *(cursor + 4) == 'g') {
- token_stream[(int) index++].kind = Token_using;
- return;
- }
- break;
-
- case 't':
- if (*(cursor + 1) == 'h' &&
- *(cursor + 2) == 'r' &&
- *(cursor + 3) == 'o' &&
- *(cursor + 4) == 'w') {
- token_stream[(int) index++].kind = Token_throw;
- return;
- }
- break;
-
- case 'w':
- if (*(cursor + 1) == 'h' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'l' &&
- *(cursor + 4) == 'e') {
- token_stream[(int) index++].kind = Token_while;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword6()
-{
- switch (*cursor) {
- case 'a':
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 'd' &&
- *(cursor + 3) == '_' &&
- *(cursor + 4) == 'e' &&
- *(cursor + 5) == 'q') {
- token_stream[(int) index++].kind = Token_and_eq;
- return;
- }
- break;
-
- case 'b':
- if (*(cursor + 1) == 'i' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 'n' &&
- *(cursor + 5) == 'd') {
- token_stream[(int) index++].kind = Token_bitand;
- return;
- }
- break;
-
- case 'e':
- if (*(cursor + 1) == 'x' &&
- *(cursor + 2) == 'p' &&
- *(cursor + 3) == 'o' &&
- *(cursor + 4) == 'r' &&
- *(cursor + 5) == 't') {
- token_stream[(int) index++].kind = Token_export;
- return;
- }
- if (*(cursor + 1) == 'x' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'r' &&
- *(cursor + 5) == 'n') {
- token_stream[(int) index++].kind = Token_extern;
- return;
- }
- break;
-
- case 'd':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 'l' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 't' &&
- *(cursor + 5) == 'e') {
- token_stream[(int) index++].kind = Token_delete;
- return;
- }
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'u' &&
- *(cursor + 3) == 'b' &&
- *(cursor + 4) == 'l' &&
- *(cursor + 5) == 'e') {
- token_stream[(int) index++].kind = Token_double;
- return;
- }
- break;
-
- case 'f':
- if (*(cursor + 1) == 'r' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'n' &&
- *(cursor + 5) == 'd') {
- token_stream[(int) index++].kind = Token_friend;
- return;
- }
- break;
-
- case 'i':
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 'l' &&
- *(cursor + 3) == 'i' &&
- *(cursor + 4) == 'n' &&
- *(cursor + 5) == 'e') {
- token_stream[(int) index++].kind = Token_inline;
- return;
- }
- break;
-
- case 'K':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'D' &&
- *(cursor + 3) == 'C' &&
- *(cursor + 4) == 'O' &&
- *(cursor + 5) == 'P') {
- token_stream[(int) index++].kind = Token_K_DCOP;
- return;
- }
- break;
-
- case 'n':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == '_' &&
- *(cursor + 4) == 'e' &&
- *(cursor + 5) == 'q') {
- token_stream[(int) index++].kind = Token_not_eq;
- return;
- }
- break;
-
- case 'p':
- if (*(cursor + 1) == 'u' &&
- *(cursor + 2) == 'b' &&
- *(cursor + 3) == 'l' &&
- *(cursor + 4) == 'i' &&
- *(cursor + 5) == 'c') {
- token_stream[(int) index++].kind = Token_public;
- return;
- }
- break;
-
- case 's':
- if (*(cursor + 1) == 'i' &&
- *(cursor + 2) == 'g' &&
- *(cursor + 3) == 'n' &&
- *(cursor + 4) == 'e' &&
- *(cursor + 5) == 'd') {
- token_stream[(int) index++].kind = Token_signed;
- return;
- }
- if (*(cursor + 1) == 'i' &&
- *(cursor + 2) == 'z' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'o' &&
- *(cursor + 5) == 'f') {
- token_stream[(int) index++].kind = Token_sizeof;
- return;
- }
- if (*(cursor + 1) == 't' &&
- *(cursor + 2) == 'a' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 'i' &&
- *(cursor + 5) == 'c') {
- token_stream[(int) index++].kind = Token_static;
- return;
- }
- if (*(cursor + 1) == 't' &&
- *(cursor + 2) == 'r' &&
- *(cursor + 3) == 'u' &&
- *(cursor + 4) == 'c' &&
- *(cursor + 5) == 't') {
- token_stream[(int) index++].kind = Token_struct;
- return;
- }
- if (*(cursor + 1) == 'w' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 'c' &&
- *(cursor + 5) == 'h') {
- token_stream[(int) index++].kind = Token_switch;
- return;
- }
- break;
-
- case 'r':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'u' &&
- *(cursor + 4) == 'r' &&
- *(cursor + 5) == 'n') {
- token_stream[(int) index++].kind = Token_return;
- return;
- }
- break;
-
- case 't':
- if (*(cursor + 1) == 'y' &&
- *(cursor + 2) == 'p' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'i' &&
- *(cursor + 5) == 'd') {
- token_stream[(int) index++].kind = Token_typeid;
- return;
- }
- break;
-
- case 'x':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'r' &&
- *(cursor + 3) == '_' &&
- *(cursor + 4) == 'e' &&
- *(cursor + 5) == 'q') {
- token_stream[(int) index++].kind = Token_xor_eq;
- return;
- }
- break;
-
- case 'k':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'd' &&
- *(cursor + 3) == 'c' &&
- *(cursor + 4) == 'o' &&
- *(cursor + 5) == 'p') {
- token_stream[(int) index++].kind = Token_k_dcop;
- return;
- }
- break;
-
- case 'Q':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'E' &&
- *(cursor + 3) == 'N' &&
- *(cursor + 4) == 'U' &&
- *(cursor + 5) == 'M') { // Qt5.5
- token_stream[(int) index++].kind = Token_Q_ENUM;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword7()
-{
- switch (*cursor) {
- case 'd':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 'f' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 'u' &&
- *(cursor + 5) == 'l' &&
- *(cursor + 6) == 't') {
- token_stream[(int) index++].kind = Token_default;
- return;
- }
- break;
-
- case 'm':
- if (*(cursor + 1) == 'u' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 'b' &&
- *(cursor + 5) == 'l' &&
- *(cursor + 6) == 'e') {
- token_stream[(int) index++].kind = Token_mutable;
- return;
- }
- break;
-
- case 'p':
- if (*(cursor + 1) == 'r' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'v' &&
- *(cursor + 4) == 'a' &&
- *(cursor + 5) == 't' &&
- *(cursor + 6) == 'e') {
- token_stream[(int) index++].kind = Token_private;
- return;
- }
- break;
- case 's':
- if (*(cursor + 1) == 'i' &&
- *(cursor + 2) == 'g' &&
- *(cursor + 3) == 'n' &&
- *(cursor + 4) == 'a' &&
- *(cursor + 5) == 'l' &&
- *(cursor + 6) == 's') {
- token_stream[(int) index++].kind = Token_signals;
- return;
- }
- break;
- case 't':
- if (*(cursor + 1) == 'y' &&
- *(cursor + 2) == 'p' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'd' &&
- *(cursor + 5) == 'e' &&
- *(cursor + 6) == 'f') {
- token_stream[(int) index++].kind = Token_typedef;
- return;
- }
- break;
-
- case 'v':
- if (*(cursor + 1) == 'i' &&
- *(cursor + 2) == 'r' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 'u' &&
- *(cursor + 5) == 'a' &&
- *(cursor + 6) == 'l') {
- token_stream[(int) index++].kind = Token_virtual;
- return;
- }
- break;
-
- case 'Q':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'E' &&
- *(cursor + 3) == 'N' &&
- *(cursor + 4) == 'U' &&
- *(cursor + 5) == 'M' &&
- *(cursor + 6) == 'S') {
- token_stream[(int) index++].kind = Token_Q_ENUMS;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword8()
-{
- switch (*cursor) {
- case '_':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 't' &&
- *(cursor + 3) == 'y' &&
- *(cursor + 4) == 'p' &&
- *(cursor + 5) == 'e' &&
- *(cursor + 6) == 'o' &&
- *(cursor + 7) == 'f') {
- token_stream[(int) index++].kind = Token___typeof;
- return;
- }
- break;
-
- case 'c':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'n' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 'i' &&
- *(cursor + 5) == 'n' &&
- *(cursor + 6) == 'u' &&
- *(cursor + 7) == 'e') {
- token_stream[(int) index++].kind = Token_continue;
- return;
- }
- break;
-
- case 'e':
- if (*(cursor + 1) == 'x' &&
- *(cursor + 2) == 'p' &&
- *(cursor + 3) == 'l' &&
- *(cursor + 4) == 'i' &&
- *(cursor + 5) == 'c' &&
- *(cursor + 6) == 'i' &&
- *(cursor + 7) == 't') {
- token_stream[(int) index++].kind = Token_explicit;
- return;
- }
- break;
-
- case 'n':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'e' &&
- *(cursor + 3) == 'x' &&
- *(cursor + 4) == 'c' &&
- *(cursor + 5) == 'e' &&
- *(cursor + 6) == 'p' &&
- *(cursor + 7) == 't') {
- token_stream[(int) index++].kind = Token_noexcept;
- return;
- }
- break;
-
- case 'o':
- if (*(cursor + 1) == 'p' &&
- *(cursor + 2) == 'e' &&
- *(cursor + 3) == 'r' &&
- *(cursor + 4) == 'a' &&
- *(cursor + 5) == 't' &&
- *(cursor + 6) == 'o' &&
- *(cursor + 7) == 'r') {
- token_stream[(int) index++].kind = Token_operator;
- return;
- }
- break;
-
- case 'Q':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'O' &&
- *(cursor + 3) == 'B' &&
- *(cursor + 4) == 'J' &&
- *(cursor + 5) == 'E' &&
- *(cursor + 6) == 'C' &&
- *(cursor + 7) == 'T') {
- token_stream[(int) index++].kind = Token_Q_OBJECT;
- return;
- }
- break;
-
- case 'r':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 'g' &&
- *(cursor + 3) == 'i' &&
- *(cursor + 4) == 's' &&
- *(cursor + 5) == 't' &&
- *(cursor + 6) == 'e' &&
- *(cursor + 7) == 'r') {
- token_stream[(int) index++].kind = Token_register;
- return;
- }
- break;
-
- case 'u':
- if (*(cursor + 1) == 'n' &&
- *(cursor + 2) == 's' &&
- *(cursor + 3) == 'i' &&
- *(cursor + 4) == 'g' &&
- *(cursor + 5) == 'n' &&
- *(cursor + 6) == 'e' &&
- *(cursor + 7) == 'd') {
- token_stream[(int) index++].kind = Token_unsigned;
- return;
- }
- break;
-
- case 't':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 'm' &&
- *(cursor + 3) == 'p' &&
- *(cursor + 4) == 'l' &&
- *(cursor + 5) == 'a' &&
- *(cursor + 6) == 't' &&
- *(cursor + 7) == 'e') {
- token_stream[(int) index++].kind = Token_template;
- return;
- }
- if (*(cursor + 1) == 'y' &&
- *(cursor + 2) == 'p' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 'n' &&
- *(cursor + 5) == 'a' &&
- *(cursor + 6) == 'm' &&
- *(cursor + 7) == 'e') {
- token_stream[(int) index++].kind = Token_typename;
- return;
- }
- break;
-
- case 'v':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'l' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 't' &&
- *(cursor + 5) == 'i' &&
- *(cursor + 6) == 'l' &&
- *(cursor + 7) == 'e') {
- token_stream[(int) index++].kind = Token_volatile;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword9()
-{
- switch (*cursor) {
- case 'p':
- if (*(cursor + 1) == 'r' &&
- *(cursor + 2) == 'o' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 'e' &&
- *(cursor + 5) == 'c' &&
- *(cursor + 6) == 't' &&
- *(cursor + 7) == 'e' &&
- *(cursor + 8) == 'd') {
- token_stream[(int) index++].kind = Token_protected;
- return;
- }
- break;
-
- case 'n':
- if (*(cursor + 1) == 'a' &&
- *(cursor + 2) == 'm' &&
- *(cursor + 3) == 'e' &&
- *(cursor + 4) == 's' &&
- *(cursor + 5) == 'p' &&
- *(cursor + 6) == 'a' &&
- *(cursor + 7) == 'c' &&
- *(cursor + 8) == 'e') {
- token_stream[(int) index++].kind = Token_namespace;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword10()
-{
- switch (*cursor) {
- case 'c':
- if (*(cursor + 1) == 'o' &&
- *(cursor + 2) == 'n' &&
- *(cursor + 3) == 's' &&
- *(cursor + 4) == 't' &&
- *(cursor + 5) == '_' &&
- *(cursor + 6) == 'c' &&
- *(cursor + 7) == 'a' &&
- *(cursor + 8) == 's' &&
- *(cursor + 9) == 't') {
- token_stream[(int) index++].kind = Token_const_cast;
- return;
- }
- break;
-
- case 'Q':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'P' &&
- *(cursor + 3) == 'R' &&
- *(cursor + 4) == 'O' &&
- *(cursor + 5) == 'P' &&
- *(cursor + 6) == 'E' &&
- *(cursor + 7) == 'R' &&
- *(cursor + 8) == 'T' &&
- *(cursor + 9) == 'Y') {
- token_stream[(int) index++].kind = Token_Q_PROPERTY;
- return;
- }
-
- break;
- }
-
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword11()
-{
- switch (*cursor) {
- case 'Q':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'I' &&
- *(cursor + 3) == 'N' &&
- *(cursor + 4) == 'V' &&
- *(cursor + 5) == 'O' &&
- *(cursor + 6) == 'K' &&
- *(cursor + 7) == 'A' &&
- *(cursor + 8) == 'B' &&
- *(cursor + 9) == 'L' &&
- *(cursor + 10) == 'E') {
- token_stream[(int) index++].kind = Token_Q_INVOKABLE;
- return;
- }
- break;
-
- case 's':
- if (*(cursor + 1) == 't' &&
- *(cursor + 2) == 'a' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 'i' &&
- *(cursor + 5) == 'c' &&
- *(cursor + 6) == '_' &&
- *(cursor + 7) == 'c' &&
- *(cursor + 8) == 'a' &&
- *(cursor + 9) == 's' &&
- *(cursor + 10) == 't') {
- token_stream[(int) index++].kind = Token_static_cast;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword12()
-{
- switch (*cursor) {
- case 'd':
- if (*(cursor + 1) == 'y' &&
- *(cursor + 2) == 'n' &&
- *(cursor + 3) == 'a' &&
- *(cursor + 4) == 'm' &&
- *(cursor + 5) == 'i' &&
- *(cursor + 6) == 'c' &&
- *(cursor + 7) == '_' &&
- *(cursor + 8) == 'c' &&
- *(cursor + 9) == 'a' &&
- *(cursor + 10) == 's' &&
- *(cursor + 11) == 't') {
- token_stream[(int) index++].kind = Token_dynamic_cast;
- return;
- }
- break;
-
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword13()
-{
- switch (*cursor) {
- case '_':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'a' &&
- *(cursor + 3) == 't' &&
- *(cursor + 4) == 't' &&
- *(cursor + 5) == 'r' &&
- *(cursor + 6) == 'i' &&
- *(cursor + 7) == 'b' &&
- *(cursor + 8) == 'u' &&
- *(cursor + 9) == 't' &&
- *(cursor + 10) == 'e' &&
- *(cursor + 11) == '_' &&
- *(cursor + 12) == '_') {
- token_stream[(int) index++].kind = Token___attribute__;
- return;
- }
- break;
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword14()
-{
- switch (*cursor) {
- case 'k':
- if (*(cursor + 1) == '_' &&
- *(cursor + 2) == 'd' &&
- *(cursor + 3) == 'c' &&
- *(cursor + 4) == 'o' &&
- *(cursor + 5) == 'p' &&
- *(cursor + 6) == '_' &&
- *(cursor + 7) == 's' &&
- *(cursor + 8) == 'i' &&
- *(cursor + 9) == 'g' &&
- *(cursor + 10) == 'n' &&
- *(cursor + 11) == 'a' &&
- *(cursor + 12) == 'l' &&
- *(cursor + 13) == 's') {
- token_stream[(int) index++].kind = Token_k_dcop_signals;
- return;
- }
- break;
- }
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-void Lexer::scanKeyword16()
-{
- switch (*cursor) {
- case 'r':
- if (*(cursor + 1) == 'e' &&
- *(cursor + 2) == 'i' &&
- *(cursor + 3) == 'n' &&
- *(cursor + 4) == 't' &&
- *(cursor + 5) == 'e' &&
- *(cursor + 6) == 'r' &&
- *(cursor + 7) == 'p' &&
- *(cursor + 8) == 'r' &&
- *(cursor + 9) == 'e' &&
- *(cursor + 10) == 't' &&
- *(cursor + 11) == '_' &&
- *(cursor + 12) == 'c' &&
- *(cursor + 13) == 'a' &&
- *(cursor + 14) == 's' &&
- *(cursor + 15) == 't') {
- token_stream[(int) index++].kind = Token_reinterpret_cast;
- return;
- }
- break;
- }
-
- token_stream[(int) index++].kind = Token_identifier;
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/lexer.h b/sources/shiboken2/ApiExtractor/parser/lexer.h
deleted file mode 100644
index 7144355e4..000000000
--- a/sources/shiboken2/ApiExtractor/parser/lexer.h
+++ /dev/null
@@ -1,295 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef LEXER_H
-#define LEXER_H
-
-#include "symbol.h"
-
-#include <QtCore/QString>
-#include <cstdlib>
-#include <cassert>
-
-struct NameSymbol;
-class Lexer;
-class Control;
-
-typedef void (Lexer::*scan_fun_ptr)();
-
-class Token
-{
-public:
- int kind;
- std::size_t position;
- std::size_t size;
- char const *text;
-
- union {
- const NameSymbol *symbol;
- std::size_t right_brace;
- } extra;
-};
-
-class LocationTable
-{
-private:
- LocationTable(const LocationTable &source);
- void operator = (const LocationTable &source);
-
-public:
- inline LocationTable(std::size_t size = 1024)
- : lines(0),
- line_count(0),
- current_line(0) {
- resize(size);
- }
-
- inline ~LocationTable() {
- free(lines);
- }
-
- inline std::size_t size() const {
- return line_count;
- }
-
- void resize(std::size_t size) {
- Q_ASSERT(size > 0);
- lines = (std::size_t*) ::realloc(lines, sizeof(std::size_t) * size);
- line_count = size;
- }
-
- void positionAt(std::size_t offset, int *line, int *column) const {
- positionAt(offset, (int) current_line, line, column);
- }
-
- void positionAt(std::size_t offset, int max_line, int *line, int *column) const;
-
- inline std::size_t &operator[](int index) {
- return lines[index];
- }
-
-private:
- std::size_t *lines;
- std::size_t line_count;
- std::size_t current_line;
-
- friend class Lexer;
-};
-
-class TokenStream
-{
-private:
- TokenStream(const TokenStream &);
- void operator = (const TokenStream &);
-
-public:
- inline TokenStream(std::size_t size = 1024)
- : tokens(0),
- index(0),
- token_count(0) {
- resize(size);
- }
-
- inline ~TokenStream() {
- ::free(tokens);
- }
-
- inline std::size_t size() const {
- return token_count;
- }
-
- inline std::size_t cursor() const {
- return index;
- }
-
- inline void rewind(int i) {
- index = i;
- }
-
- void resize(std::size_t size) {
- Q_ASSERT(size > 0);
- tokens = (Token*) ::realloc(tokens, sizeof(Token) * size);
- token_count = size;
- }
-
- inline std::size_t nextToken() {
- return index++;
- }
-
- inline int lookAhead(std::size_t i = 0) const {
- return tokens[index + i].kind;
- }
-
- inline int kind(std::size_t i) const {
- return tokens[i].kind;
- }
-
- inline std::size_t position(std::size_t i) const {
- return tokens[i].position;
- }
-
- inline const NameSymbol *symbol(std::size_t i) const {
- return tokens[i].extra.symbol;
- }
-
- inline std::size_t matchingBrace(std::size_t i) const {
- return tokens[i].extra.right_brace;
- }
-
- inline Token &operator[](int index) {
- return tokens[index];
- }
-
- inline const Token &token(int index) const {
- return tokens[index];
- }
-
-private:
- Token *tokens;
- std::size_t index;
- std::size_t token_count;
-
-private:
- friend class Lexer;
-};
-
-class LocationManager
-{
- LocationManager(LocationManager const &__other);
- void operator = (LocationManager const &__other);
-
-public:
- LocationManager(TokenStream &__token_stream,
- LocationTable &__location_table,
- LocationTable &__line_table):
- token_stream(__token_stream),
- location_table(__location_table),
- line_table(__line_table) {}
-
- void positionAt(std::size_t offset, int *line, int *column,
- QString *filename) const;
-
- void extract_line(int offset, int *line, QString *filename) const;
-
- TokenStream &token_stream;
- LocationTable &location_table;
- LocationTable &line_table;
-};
-
-class Lexer
-{
-public:
- Lexer(LocationManager &__location, Control *__control):
- _M_location(__location),
- token_stream(_M_location.token_stream),
- location_table(_M_location.location_table),
- line_table(_M_location.line_table),
- control(__control) {}
-
- void tokenize(const char *contents, std::size_t size);
-
- LocationManager &_M_location;
- TokenStream &token_stream;
- LocationTable &location_table;
- LocationTable &line_table;
-
-private:
- void reportError(const QString& msg);
-
- void initialize_scan_table();
- void scan_newline();
- void scan_white_spaces();
- void scan_identifier_or_keyword();
- void scan_identifier_or_literal();
- void scan_int_constant();
- void scan_char_constant();
- void scan_string_constant();
- void scan_invalid_input();
- void scan_preprocessor();
-
- // keywords
- void scanKeyword0();
- void scanKeyword2();
- void scanKeyword3();
- void scanKeyword4();
- void scanKeyword5();
- void scanKeyword6();
- void scanKeyword7();
- void scanKeyword8();
- void scanKeyword9();
- void scanKeyword10();
- void scanKeyword11();
- void scanKeyword12();
- void scanKeyword13();
- void scanKeyword14();
- void scanKeyword16();
-
- // operators
- void scan_not();
- void scan_remainder();
- void scan_and();
- void scan_left_paren();
- void scan_right_paren();
- void scan_star();
- void scan_plus();
- void scan_comma();
- void scan_minus();
- void scan_dot();
- void scan_divide();
- void scan_colon();
- void scan_semicolon();
- void scan_less();
- void scan_equal();
- void scan_greater();
- void scan_question();
- void scan_left_bracket();
- void scan_right_bracket();
- void scan_xor();
- void scan_left_brace();
- void scan_or();
- void scan_right_brace();
- void scan_tilde();
- void scan_EOF();
-
-private:
- Control *control;
- const unsigned char *cursor;
- const unsigned char *begin_buffer;
- const unsigned char *end_buffer;
- std::size_t index;
-
- static scan_fun_ptr s_scan_table[];
- static scan_fun_ptr s_scan_keyword_table[];
- static bool s_initialized;
-};
-
-#endif // LEXER_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/list.h b/sources/shiboken2/ApiExtractor/parser/list.h
deleted file mode 100644
index 764fafffd..000000000
--- a/sources/shiboken2/ApiExtractor/parser/list.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef FASTLIST_H
-#define FASTLIST_H
-
-#include "smallobject.h"
-
-template <typename Tp>
-struct ListNode {
- Tp element;
- int index;
- mutable const ListNode<Tp> *next;
-
- static ListNode *create(const Tp &element, pool *p) {
- ListNode<Tp> *node = new(p->allocate(sizeof(ListNode), strideof(ListNode))) ListNode();
- node->element = element;
- node->index = 0;
- node->next = node;
-
- return node;
- }
-
- static ListNode *create(const ListNode *n1, const Tp &element, pool *p) {
- ListNode<Tp> *n2 = ListNode::create(element, p);
-
- n2->index = n1->index + 1;
- n2->next = n1->next;
- n1->next = n2;
-
- return n2;
- }
-
- inline ListNode<Tp>() { }
-
- inline const ListNode<Tp> *at(int index) const {
- const ListNode<Tp> *node = this;
- while (index != node->index)
- node = node->next;
-
- return node;
- }
-
- inline bool hasNext() const {
- return index < next->index;
- }
-
- inline int count() const {
- return 1 + toBack()->index;
- }
-
- inline const ListNode<Tp> *toFront() const {
- return toBack()->next;
- }
-
- inline const ListNode<Tp> *toBack() const {
- const ListNode<Tp> *node = this;
- while (node->hasNext())
- node = node->next;
-
- return node;
- }
-};
-
-template <class Tp>
-inline const ListNode<Tp> *snoc(const ListNode<Tp> *list,
- const Tp &element, pool *p)
-{
- if (!list)
- return ListNode<Tp>::create(element, p);
-
- return ListNode<Tp>::create(list->toBack(), element, p);
-}
-
-#endif // FASTLIST_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
-
diff --git a/sources/shiboken2/ApiExtractor/parser/name_compiler.cpp b/sources/shiboken2/ApiExtractor/parser/name_compiler.cpp
deleted file mode 100644
index 338d81c25..000000000
--- a/sources/shiboken2/ApiExtractor/parser/name_compiler.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "name_compiler.h"
-#include "type_compiler.h"
-#include "declarator_compiler.h"
-#include "lexer.h"
-#include "symbol.h"
-#include "binder.h"
-
-#include <QtCore/qdebug.h>
-
-NameCompiler::NameCompiler(Binder *binder)
- : _M_binder(binder), _M_token_stream(binder->tokenStream())
-{
-}
-
-QString NameCompiler::decode_operator(std::size_t index) const
-{
- const Token &tk = _M_token_stream->token((int) index);
- return QString::fromUtf8(&tk.text[tk.position], (int) tk.size);
-}
-
-QString NameCompiler::internal_run(AST *node)
-{
- _M_name.clear();
- visit(node);
- return name();
-}
-
-void NameCompiler::visitUnqualifiedName(UnqualifiedNameAST *node)
-{
- QString tmp_name;
-
- if (node->tilde)
- tmp_name += QLatin1String("~");
-
- if (node->id)
- tmp_name += _M_token_stream->symbol(node->id)->as_string();
-
- if (OperatorFunctionIdAST *op_id = node->operator_id) {
-#if defined(__GNUC__)
-#warning "NameCompiler::visitUnqualifiedName() -- implement me"
-#endif
-
- if (op_id->op && op_id->op->op) {
- tmp_name += QLatin1String("operator");
- tmp_name += decode_operator(op_id->op->op);
- if (op_id->op->close)
- tmp_name += decode_operator(op_id->op->close);
- } else if (op_id->type_specifier) {
-#if defined(__GNUC__)
-#warning "don't use an hardcoded string as cast' name"
-#endif
- Token const &tk = _M_token_stream->token((int) op_id->start_token);
- Token const &end_tk = _M_token_stream->token((int) op_id->end_token);
- tmp_name += QString::fromLatin1(&tk.text[tk.position],
- (int)(end_tk.position - tk.position)).trimmed();
- }
- }
-
- _M_name += tmp_name;
- if (node->template_arguments) {
- // ### cleanup
- _M_name.last() += QLatin1String("<");
- visitNodes(this, node->template_arguments);
- _M_name.last().truncate(_M_name.last().count() - 1); // remove the last ','
- _M_name.last() += QLatin1String(">");
- }
-
-}
-
-void NameCompiler::visitTemplateArgument(TemplateArgumentAST *node)
-{
- if (node->type_id && node->type_id->type_specifier) {
- TypeCompiler type_cc(_M_binder);
- type_cc.run(node->type_id->type_specifier);
-
- DeclaratorCompiler decl_cc(_M_binder);
- decl_cc.run(node->type_id->declarator);
-
- if (type_cc.isConstant())
- _M_name.last() += QLatin1String("const ");
-
- QStringList q = type_cc.qualifiedName();
-
- if (q.count() == 1) {
-#if defined (RXX_RESOLVE_TYPEDEF) // ### it'll break :(
- TypeInfo tp;
- tp.setQualifiedName(q);
- tp = TypeInfo::resolveType(tp, _M_binder->currentScope()->toItem());
- q = tp.qualifiedName();
-#endif
-
- if (CodeModelItem item = _M_binder->model()->findItem(q, _M_binder->currentScope())) {
- if (item->name() == q.last())
- q = item->qualifiedName();
- }
- }
-
- _M_name.last() += q.join(QLatin1String("::"));
-
- if (decl_cc.isReference())
- _M_name.last() += QLatin1Char('&');
- if (decl_cc.indirection())
- _M_name.last() += QString(decl_cc.indirection(), QLatin1Char('*'));
-
- _M_name.last() += QLatin1Char(',');
- }
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/parser.cpp b/sources/shiboken2/ApiExtractor/parser/parser.cpp
deleted file mode 100644
index 60d034e83..000000000
--- a/sources/shiboken2/ApiExtractor/parser/parser.cpp
+++ /dev/null
@@ -1,4075 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-
-// c++ support
-#include "parser.h"
-#include "tokens.h"
-#include "lexer.h"
-#include "control.h"
-
-#include <cstdlib>
-
-#define ADVANCE(tk, descr) \
- { \
- if (token_stream.lookAhead() != tk) { \
- tokenRequiredError(tk); \
- return false; \
- } \
- token_stream.nextToken(); \
- }
-
-#define ADVANCE_NR(tk, descr) \
- do { \
- if (token_stream.lookAhead() != tk) { \
- tokenRequiredError(tk); \
- } \
- else \
- token_stream.nextToken(); \
- } while (0)
-
-#define CHECK(tk) \
- do { \
- if (token_stream.lookAhead() != tk) { \
- return false; \
- } \
- token_stream.nextToken(); \
- } while (0)
-
-#define UPDATE_POS(_node, start, end) \
- do { \
- (_node)->start_token = start; \
- (_node)->end_token = end; \
- } while (0)
-
-Parser::Parser(Control *c)
- : _M_location(token_stream, location_table, line_table),
- control(c),
- lexer(_M_location, control)
-{
- _M_block_errors = false;
-}
-
-Parser::~Parser()
-{
-}
-
-void Parser::advance()
-{
- token_stream.nextToken();
-}
-
-TranslationUnitAST *Parser::parse(const char *contents,
- std::size_t size, pool *p)
-{
- _M_block_errors = false;
- _M_pool = p;
- lexer.tokenize(contents, size);
- token_stream.nextToken(); // skip the first token
-
- Lexer *oldLexer = control->changeLexer(&lexer);
- Parser *oldParser = control->changeParser(this);
-
- TranslationUnitAST *ast = 0;
- parseTranslationUnit(ast);
-
- control->changeLexer(oldLexer);
- control->changeParser(oldParser);
-
- return ast;
-}
-
-bool Parser::parseWinDeclSpec(WinDeclSpecAST *&node)
-{
- if (token_stream.lookAhead() != Token_identifier)
- return false;
-
- std::size_t start = token_stream.cursor();
-
- const NameSymbol *name_symbol = token_stream.symbol(token_stream.cursor());
- QString name = name_symbol->as_string();
- if (name != QLatin1String("__declspec"))
- return false;
- std::size_t specifier = token_stream.cursor();
-
- token_stream.nextToken();
- if (token_stream.lookAhead() != '(')
- return false;
-
- token_stream.nextToken();
- if (token_stream.lookAhead() != Token_identifier)
- return false;
- std::size_t modifier = token_stream.cursor();
-
- token_stream.nextToken();
- if (token_stream.lookAhead() != ')')
- return false;
-
- token_stream.nextToken();
-
- node = CreateNode<WinDeclSpecAST>(_M_pool);
- node->specifier = specifier;
- node->modifier = modifier;
-
- UPDATE_POS(node, start, token_stream.cursor());
-
- return true;
-}
-
-void Parser::tokenRequiredError(int token)
-{
- QString err;
-
- err += QLatin1String("expected token ");
- err += QLatin1String("``");
- err += QLatin1String(token_name(token));
- err += QLatin1String("'' found ``");
- err += QLatin1String(token_name(token_stream.lookAhead()));
- err += QLatin1String("''");
-
- reportError(err);
-}
-
-void Parser::syntaxError()
-{
- QString err;
-
- err += QLatin1String("unexpected token ");
- err += QLatin1String("``");
- err += QLatin1String(token_name(token_stream.lookAhead()));
- err += QLatin1String("''");
-
- reportError(err);
-}
-
-void Parser::reportError(const QString& msg)
-{
- if (!_M_block_errors) {
- int line, column;
- QString fileName;
-
- std::size_t tok = token_stream.cursor();
- location().positionAt(token_stream.position(tok),
- &line, &column, &fileName);
-
- Control::ErrorMessage errmsg;
- errmsg.setLine(line + 1);
- errmsg.setColumn(column);
- errmsg.setFileName(fileName);
- errmsg.setMessage(QLatin1String("** PARSER ERROR ") + msg);
- control->reportError(errmsg);
- }
-}
-
-bool Parser::skipUntil(int token)
-{
- while (token_stream.lookAhead()) {
- if (token_stream.lookAhead() == token)
- return true;
-
- token_stream.nextToken();
- }
-
- return false;
-}
-
-bool Parser::skipUntilDeclaration()
-{
- while (token_stream.lookAhead()) {
-
- switch (token_stream.lookAhead()) {
- case ';':
- case '~':
- case Token_scope:
- case Token_identifier:
- case Token_operator:
- case Token_char:
- case Token_wchar_t:
- case Token_bool:
- case Token_short:
- case Token_int:
- case Token_long:
- case Token_signed:
- case Token_unsigned:
- case Token_float:
- case Token_double:
- case Token_void:
- case Token_extern:
- case Token_namespace:
- case Token_using:
- case Token_typedef:
- case Token_asm:
- case Token_template:
- case Token_export:
-
- case Token_const: // cv
- case Token_volatile: // cv
-
- case Token_public:
- case Token_protected:
- case Token_private:
- case Token_signals: // Qt
- case Token_slots: // Qt
- return true;
-
- default:
- token_stream.nextToken();
- }
- }
-
- return false;
-}
-
-bool Parser::skipUntilStatement()
-{
- while (token_stream.lookAhead()) {
- switch (token_stream.lookAhead()) {
- case ';':
- case '{':
- case '}':
- case Token_const:
- case Token_volatile:
- case Token_identifier:
- case Token_case:
- case Token_default:
- case Token_if:
- case Token_switch:
- case Token_while:
- case Token_do:
- case Token_for:
- case Token_break:
- case Token_continue:
- case Token_return:
- case Token_goto:
- case Token_try:
- case Token_catch:
- case Token_throw:
- case Token_char:
- case Token_wchar_t:
- case Token_bool:
- case Token_short:
- case Token_int:
- case Token_long:
- case Token_signed:
- case Token_unsigned:
- case Token_float:
- case Token_double:
- case Token_void:
- case Token_class:
- case Token_struct:
- case Token_union:
- case Token_enum:
- case Token_scope:
- case Token_template:
- case Token_using:
- return true;
-
- default:
- token_stream.nextToken();
- }
- }
-
- return false;
-}
-
-bool Parser::skip(int l, int r)
-{
- int count = 0;
- while (token_stream.lookAhead()) {
- int tk = token_stream.lookAhead();
-
- if (tk == l)
- ++count;
- else if (tk == r)
- --count;
- else if (l != '{' && (tk == '{' || tk == '}' || tk == ';'))
- return false;
-
- if (!count)
- return true;
-
- token_stream.nextToken();
- }
-
- return false;
-}
-
-bool Parser::parseName(NameAST *&node, bool acceptTemplateId)
-{
- std::size_t start = token_stream.cursor();
-
- WinDeclSpecAST *winDeclSpec = 0;
- parseWinDeclSpec(winDeclSpec);
-
- NameAST *ast = CreateNode<NameAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_scope) {
- ast->global = true;
- token_stream.nextToken();
- }
-
- std::size_t idx = token_stream.cursor();
-
- while (true) {
- UnqualifiedNameAST *n = 0;
- if (!parseUnqualifiedName(n))
- return false;
-
- if (token_stream.lookAhead() == Token_scope) {
- token_stream.nextToken();
-
- ast->qualified_names
- = snoc(ast->qualified_names, n, _M_pool);
-
- if (token_stream.lookAhead() == Token_template) {
- /// skip optional template #### @todo CHECK
- token_stream.nextToken();
- }
- } else {
- Q_ASSERT(n);
- if (!acceptTemplateId) {
- token_stream.rewind((int) n->start_token);
- parseUnqualifiedName(n, false);
- }
-
- ast->unqualified_name = n;
- break;
- }
- }
-
- if (idx == token_stream.cursor())
- return false;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
-{
- std::size_t start = token_stream.cursor();
- TranslationUnitAST *ast = CreateNode<TranslationUnitAST>(_M_pool);
-
- while (token_stream.lookAhead()) {
- std::size_t startDecl = token_stream.cursor();
-
- DeclarationAST *declaration = 0;
- if (parseDeclaration(declaration)) {
- ast->declarations =
- snoc(ast->declarations, declaration, _M_pool);
- } else {
- // error recovery
- if (startDecl == token_stream.cursor()) {
- // skip at least one token
- token_stream.nextToken();
- }
-
- skipUntilDeclaration();
- }
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseDeclaration(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- switch (token_stream.lookAhead()) {
- case ';':
- token_stream.nextToken();
- return true;
-
- case Token_extern:
- return parseLinkageSpecification(node);
-
- case Token_namespace:
- return parseNamespace(node);
-
- case Token_using:
- return parseUsing(node);
-
- case Token_typedef:
- return parseTypedef(node);
-
- case Token_asm:
- return parseAsmDefinition(node);
-
- case Token_Q_ENUMS:
- case Token_Q_ENUM:
- // Qt5:
- // These two Q_ENUM tokens map to the same handler.
- // If that turns out to be wrong, then write a new one
- // named parseQ_ENUM
- return parseQ_ENUMS(node);
-
- case Token_template:
- case Token_export:
- return parseTemplateDeclaration(node);
-
- default: {
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
- const ListNode<std::size_t> *storageSpec = 0;
- parseStorageClassSpecifier(storageSpec);
-
- parseCvQualify(cv);
-
- TypeSpecifierAST *spec = 0;
- if (parseEnumSpecifier(spec)
- || parseClassSpecifier(spec)
- || parseForwardDeclarationSpecifier(spec)) {
- parseCvQualify(cv);
-
- spec->cv = cv;
-
- const ListNode<InitDeclaratorAST*> *declarators = 0;
- parseInitDeclaratorList(declarators);
- ADVANCE(';', ";");
-
- SimpleDeclarationAST *ast =
- CreateNode<SimpleDeclarationAST>(_M_pool);
-
- ast->storage_specifiers = storageSpec;
- ast->type_specifier = spec;
- ast->init_declarators = declarators;
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
- } // end switch
-
- token_stream.rewind((int) start);
- return parseDeclarationInternal(node);
-}
-
-bool Parser::parseLinkageSpecification(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_extern);
-
- LinkageSpecificationAST *ast = CreateNode<LinkageSpecificationAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_string_literal) {
- ast->extern_type = token_stream.cursor();
- token_stream.nextToken();
- }
-
- if (token_stream.lookAhead() == '{')
- parseLinkageBody(ast->linkage_body);
- else if (!parseDeclaration(ast->declaration))
- reportError(QLatin1String("Declaration syntax error"));
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseLinkageBody(LinkageBodyAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK('{');
-
- LinkageBodyAST *ast = CreateNode<LinkageBodyAST>(_M_pool);
-
- while (token_stream.lookAhead()) {
- int tk = token_stream.lookAhead();
-
- if (tk == '}')
- break;
-
- std::size_t startDecl = token_stream.cursor();
-
- DeclarationAST *declaration = 0;
- if (parseDeclaration(declaration)) {
- ast->declarations = snoc(ast->declarations, declaration, _M_pool);
- } else {
- // error recovery
- if (startDecl == token_stream.cursor()) {
- // skip at least one token
- token_stream.nextToken();
- }
-
- skipUntilDeclaration();
- }
- }
-
- if (token_stream.lookAhead() != '}')
- reportError(QLatin1String("} expected"));
- else
- token_stream.nextToken();
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseNamespace(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_namespace);
-
- std::size_t namespace_name = 0;
- if (token_stream.lookAhead() == Token_identifier) {
- namespace_name = token_stream.cursor();
- token_stream.nextToken();
- }
-
- if (token_stream.lookAhead() == '=') {
- // namespace alias
- token_stream.nextToken();
-
- NameAST *name = 0;
- if (parseName(name)) {
- ADVANCE(';', ";");
-
- NamespaceAliasDefinitionAST *ast
- = CreateNode<NamespaceAliasDefinitionAST>(_M_pool);
- ast->namespace_name = namespace_name;
- ast->alias_name = name;
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- return true;
- } else {
- reportError(QLatin1String("namespace expected"));
- return false;
- }
- } else if (token_stream.lookAhead() != '{') {
- reportError(QLatin1String("{ expected"));
- return false;
- }
-
- NamespaceAST *ast = CreateNode<NamespaceAST>(_M_pool);
- ast->namespace_name = namespace_name;
- parseLinkageBody(ast->linkage_body);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseUsing(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_using);
-
- if (token_stream.lookAhead() == Token_namespace)
- return parseUsingDirective(node);
-
- UsingAST *ast = CreateNode<UsingAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_typename) {
- ast->type_name = token_stream.cursor();
- token_stream.nextToken();
- }
-
- if (!parseName(ast->name))
- return false;
-
- ADVANCE(';', ";");
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseUsingDirective(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_namespace);
-
- NameAST *name = 0;
- if (!parseName(name)) {
- reportError(QLatin1String("Namespace name expected"));
- return false;
- }
-
- ADVANCE(';', ";");
-
- UsingDirectiveAST *ast = CreateNode<UsingDirectiveAST>(_M_pool);
- ast->name = name;
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-
-bool Parser::parseOperatorFunctionId(OperatorFunctionIdAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_operator);
-
- OperatorFunctionIdAST *ast = CreateNode<OperatorFunctionIdAST>(_M_pool);
-
- if (!parseOperator(ast->op)) {
- ast->op = 0;
-
- // parse cast operator
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
- if (!parseSimpleTypeSpecifier(ast->type_specifier)) {
- syntaxError();
- return false;
- }
-
- parseCvQualify(cv);
- ast->type_specifier->cv = cv;
-
- PtrOperatorAST *ptr_op = 0;
- while (parsePtrOperator(ptr_op))
- ast->ptr_ops = snoc(ast->ptr_ops, ptr_op, _M_pool);
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- return true;
-}
-
-bool Parser::parseTemplateArgumentList(const ListNode<TemplateArgumentAST*> *&node,
- bool reportError)
-{
- TemplateArgumentAST *templArg = 0;
- if (!parseTemplateArgument(templArg))
- return false;
-
- node = snoc(node, templArg, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (!parseTemplateArgument(templArg)) {
- if (reportError) {
- syntaxError();
- break;
- }
-
- node = 0;
- return false;
- }
-
- node = snoc(node, templArg, _M_pool);
- }
-
- return true;
-}
-
-bool Parser::parseTypedef(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_typedef);
-
- TypeSpecifierAST *spec = 0;
- if (!parseTypeSpecifierOrClassSpec(spec)) {
- reportError(QLatin1String("Need a type specifier to declare"));
- return false;
- }
-
- const ListNode<InitDeclaratorAST*> *declarators = 0;
- if (!parseInitDeclaratorList(declarators)) {
- //reportError(("Need an identifier to declare"));
- //return false;
- }
-
- ADVANCE(';', ";");
-
- TypedefAST *ast = CreateNode<TypedefAST>(_M_pool);
- ast->type_specifier = spec;
- ast->init_declarators = declarators;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseAsmDefinition(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ADVANCE(Token_asm, "asm");
-
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
-#if defined(__GNUC__)
-#warning "implement me"
-#endif
- skip('(', ')');
- token_stream.nextToken();
- ADVANCE(';', ";");
-
- AsmDefinitionAST *ast = CreateNode<AsmDefinitionAST>(_M_pool);
- ast->cv = cv;
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- std::size_t exported = 0;
- if (token_stream.lookAhead() == Token_export) {
- exported = token_stream.cursor();
- token_stream.nextToken();
- }
-
- CHECK(Token_template);
-
- const ListNode<TemplateParameterAST*> *params = 0;
- if (token_stream.lookAhead() == '<') {
- token_stream.nextToken();
- parseTemplateParameterList(params);
-
- ADVANCE('>', ">");
- }
-
- DeclarationAST *declaration = 0;
- if (!parseDeclaration(declaration))
- reportError(QLatin1String("expected a declaration"));
-
- TemplateDeclarationAST *ast = CreateNode<TemplateDeclarationAST>(_M_pool);
- ast->exported = exported;
- ast->template_parameters = params;
- ast->declaration = declaration;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseOperator(OperatorAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- OperatorAST *ast = CreateNode<OperatorAST>(_M_pool);
-
- switch (token_stream.lookAhead()) {
- case Token_new:
- case Token_delete: {
- ast->op = token_stream.cursor();
- token_stream.nextToken();
-
- if (token_stream.lookAhead() == '['
- && token_stream.lookAhead(1) == ']') {
- ast->open = token_stream.cursor();
- token_stream.nextToken();
-
- ast->close = token_stream.cursor();
- token_stream.nextToken();
- }
- }
- break;
-
- case '+':
- case '-':
- case '*':
- case '/':
- case '%':
- case '^':
- case '&':
- case '|':
- case '~':
- case '!':
- case '=':
- case '<':
- case '>':
- case ',':
- case Token_assign:
- case Token_shift:
- case Token_eq:
- case Token_not_eq:
- case Token_leq:
- case Token_geq:
- case Token_and:
- case Token_or:
- case Token_incr:
- case Token_decr:
- case Token_ptrmem:
- case Token_arrow:
- ast->op = token_stream.cursor();
- token_stream.nextToken();
- break;
-
- default:
- if (token_stream.lookAhead() == '('
- && token_stream.lookAhead(1) == ')') {
- ast->op = ast->open = token_stream.cursor();
- token_stream.nextToken();
- ast->close = token_stream.cursor();
- token_stream.nextToken();
- } else if (token_stream.lookAhead() == '['
- && token_stream.lookAhead(1) == ']') {
- ast->op = ast->open = token_stream.cursor();
- token_stream.nextToken();
- ast->close = token_stream.cursor();
- token_stream.nextToken();
- } else {
- return false;
- }
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseCvQualify(const ListNode<std::size_t> *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int tk;
- while (0 != (tk = token_stream.lookAhead())
- && (tk == Token_const || tk == Token_volatile)) {
- node = snoc(node, token_stream.cursor(), _M_pool);
- token_stream.nextToken();
- }
-
- return start != token_stream.cursor();
-}
-
-bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST *&node,
- bool onlyIntegral)
-{
- std::size_t start = token_stream.cursor();
- bool isIntegral = false;
- bool done = false;
-
- const ListNode<std::size_t> *integrals = 0;
-
- while (!done) {
- switch (token_stream.lookAhead()) {
- case Token_char:
- case Token_wchar_t:
- case Token_bool:
- case Token_short:
- case Token_int:
- case Token_long:
- case Token_signed:
- case Token_unsigned:
- case Token_float:
- case Token_double:
- case Token_void:
- integrals = snoc(integrals, token_stream.cursor(), _M_pool);
- isIntegral = true;
- token_stream.nextToken();
- break;
-
- default:
- done = true;
- }
- }
-
- SimpleTypeSpecifierAST *ast = CreateNode<SimpleTypeSpecifierAST>(_M_pool);
- if (isIntegral) {
- ast->integrals = integrals;
- } else if (token_stream.lookAhead() == Token___typeof) {
- ast->type_of = token_stream.cursor();
- token_stream.nextToken();
-
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
-
- std::size_t saved = token_stream.cursor();
- parseTypeId(ast->type_id);
- if (token_stream.lookAhead() != ')') {
- ast->type_id = 0;
- token_stream.rewind((int) saved);
- parseUnaryExpression(ast->expression);
- }
- ADVANCE(')', ")");
- } else {
- parseUnaryExpression(ast->expression);
- }
- } else if (onlyIntegral) {
- token_stream.rewind((int) start);
- return false;
- } else {
- if (!parseName(ast->name, true)) {
- ast->name = 0;
- token_stream.rewind((int) start);
- return false;
- }
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parsePtrOperator(PtrOperatorAST *&node)
-{
- int tk = token_stream.lookAhead();
-
- if (tk != '&' && tk != '*'
- && tk != Token_scope && tk != Token_identifier) {
- return false;
- }
-
- std::size_t start = token_stream.cursor();
-
- PtrOperatorAST *ast = CreateNode<PtrOperatorAST>(_M_pool);
-
- switch (token_stream.lookAhead()) {
- case '&':
- case '*':
- ast->op = token_stream.cursor();
- token_stream.nextToken();
- break;
-
- case Token_scope:
- case Token_identifier: {
- if (!parsePtrToMember(ast->mem_ptr)) {
- token_stream.rewind((int) start);
- return false;
- }
- }
- break;
-
- default:
- Q_ASSERT(0);
- break;
- }
-
- parseCvQualify(ast->cv);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTemplateArgument(TemplateArgumentAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- TypeIdAST *typeId = 0;
- ExpressionAST *expr = 0;
-
- if (!parseTypeId(typeId) || (token_stream.lookAhead() != ','
- && token_stream.lookAhead() != '>')) {
- token_stream.rewind((int) start);
-
- if (!parseLogicalOrExpression(expr, true))
- return false;
- }
-
- TemplateArgumentAST *ast = CreateNode<TemplateArgumentAST>(_M_pool);
- ast->type_id = typeId;
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTypeSpecifier(TypeSpecifierAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
- TypeSpecifierAST *ast = 0;
- if (!parseElaboratedTypeSpecifier(ast) && !parseSimpleTypeSpecifier(ast)) {
- token_stream.rewind((int) start);
- return false;
- }
-
- parseCvQualify(cv);
- ast->cv = cv;
-
- node = ast;
-
- return true;
-}
-
-bool Parser::parseDeclarator(DeclaratorAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- DeclaratorAST *ast = CreateNode<DeclaratorAST>(_M_pool);
-
- //fprintf(stderr, "[%s-%s] ast->ptr_ops: %p\n", __FILE__, __FUNCTION__, ast->ptr_ops);
-
- DeclaratorAST *decl = 0;
- NameAST *declId = 0;
-
- PtrOperatorAST *ptrOp = 0;
- while (parsePtrOperator(ptrOp))
- ast->ptr_ops = snoc(ast->ptr_ops, ptrOp, _M_pool);
-
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
-
- if (!parseDeclarator(decl))
- return false;
-
- ast->sub_declarator = decl;
-
- CHECK(')');
- } else {
- if (token_stream.lookAhead() == ':') {
- // unnamed bitfield
- } else if (parseName(declId, true)) {
- ast->id = declId;
- } else {
- token_stream.rewind((int) start);
- return false;
- }
-
- if (token_stream.lookAhead() == ':') {
- token_stream.nextToken();
-
- if (!parseConstantExpression(ast->bit_expression))
- reportError(QLatin1String("Constant expression expected"));
-
- goto update_pos;
- }
- }
-
- {
- bool isVector = true;
-
- while (token_stream.lookAhead() == '[') {
- token_stream.nextToken();
-
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
-
- ADVANCE(']', "]");
-
- ast->array_dimensions = snoc(ast->array_dimensions, expr, _M_pool);
- isVector = true;
- }
-
- bool skipParen = false;
- if (token_stream.lookAhead() == Token_identifier
- && token_stream.lookAhead(1) == '('
- && token_stream.lookAhead(2) == '(') {
- token_stream.nextToken();
- token_stream.nextToken();
- skipParen = true;
- }
-
- int tok = token_stream.lookAhead();
- if (ast->sub_declarator
- && !(isVector || tok == '(' || tok == ','
- || tok == ';' || tok == '=')) {
- token_stream.rewind((int) start);
- return false;
- }
-
- std::size_t index = token_stream.cursor();
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
-
- ParameterDeclarationClauseAST *params = 0;
- if (!parseParameterDeclarationClause(params)) {
- token_stream.rewind((int) index);
- goto update_pos;
- }
-
- ast->parameter_declaration_clause = params;
-
- if (token_stream.lookAhead() != ')') {
- token_stream.rewind((int) index);
- goto update_pos;
- }
-
- token_stream.nextToken(); // skip ')'
-
- parseCvQualify(ast->fun_cv);
- parseNoExcept();
- parseExceptionSpecification(ast->exception_spec);
-
- if (token_stream.lookAhead() == Token___attribute__)
- parse_Attribute__();
- }
-
- if (skipParen) {
- if (token_stream.lookAhead() != ')')
- reportError(QLatin1String("')' expected"));
- else
- token_stream.nextToken();
- }
- }
-
-update_pos:
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseAbstractDeclarator(DeclaratorAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- DeclaratorAST *ast = CreateNode<DeclaratorAST>(_M_pool);
- DeclaratorAST *decl = 0;
-
- PtrOperatorAST *ptrOp = 0;
- while (parsePtrOperator(ptrOp))
- ast->ptr_ops = snoc(ast->ptr_ops, ptrOp, _M_pool);
-
- int index = (int) token_stream.cursor();
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
-
- if (!parseAbstractDeclarator(decl)) {
- token_stream.rewind((int) index);
- goto label1;
- }
-
- ast->sub_declarator = decl;
-
- if (token_stream.lookAhead() != ')') {
- token_stream.rewind((int) start);
- return false;
- }
- token_stream.nextToken();
- } else if (token_stream.lookAhead() == ':') {
- token_stream.nextToken();
- if (!parseConstantExpression(ast->bit_expression)) {
- ast->bit_expression = 0;
- reportError(QLatin1String("Constant expression expected"));
- }
- goto update_pos;
- }
-
-label1: {
- bool isVector = true;
-
- while (token_stream.lookAhead() == '[') {
- token_stream.nextToken();
-
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
-
- ADVANCE(']', "]");
-
- ast->array_dimensions = snoc(ast->array_dimensions, expr, _M_pool);
- isVector = true;
- }
-
- int tok = token_stream.lookAhead();
- if (ast->sub_declarator
- && !(isVector || tok == '(' || tok == ','
- || tok == ';' || tok == '=')) {
- token_stream.rewind((int) start);
- return false;
- }
-
- int index = (int) token_stream.cursor();
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
-
- ParameterDeclarationClauseAST *params = 0;
- if (!parseParameterDeclarationClause(params)) {
- token_stream.rewind((int) index);
- goto update_pos;
- }
-
- ast->parameter_declaration_clause = params;
-
- if (token_stream.lookAhead() != ')') {
- token_stream.rewind((int) index);
- goto update_pos;
- }
-
- token_stream.nextToken(); // skip ')'
-
- parseCvQualify(ast->fun_cv);
- parseExceptionSpecification(ast->exception_spec);
- }
- }
-
-update_pos:
- if (token_stream.cursor() == start)
- return false;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseEnumSpecifier(TypeSpecifierAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_enum);
-
- NameAST *name = 0;
- parseName(name);
-
- if (token_stream.lookAhead() != '{') {
- token_stream.rewind((int) start);
- return false;
- }
- token_stream.nextToken();
-
- EnumSpecifierAST *ast = CreateNode<EnumSpecifierAST>(_M_pool);
- ast->name = name;
-
- EnumeratorAST *enumerator = 0;
- if (parseEnumerator(enumerator)) {
- ast->enumerators = snoc(ast->enumerators, enumerator, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (!parseEnumerator(enumerator)) {
- //reportError(("Enumerator expected"));
- break;
- }
-
- ast->enumerators = snoc(ast->enumerators, enumerator, _M_pool);
- }
- }
-
- ADVANCE_NR('}', "}");
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTemplateParameterList(const ListNode<TemplateParameterAST*> *&node)
-{
- TemplateParameterAST *param = 0;
- if (!parseTemplateParameter(param))
- return false;
-
- node = snoc(node, param, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (!parseTemplateParameter(param)) {
- syntaxError();
- break;
- } else {
- node = snoc(node, param, _M_pool);
- }
- }
-
- return true;
-}
-
-bool Parser::parseTemplateParameter(TemplateParameterAST *&node)
-{
- std::size_t start = token_stream.cursor();
- TemplateParameterAST *ast = CreateNode<TemplateParameterAST>(_M_pool);
-
- int tk = token_stream.lookAhead();
-
- if ((tk == Token_class || tk == Token_typename || tk == Token_template)
- && parseTypeParameter(ast->type_parameter)) {
- // nothing to do
- } else if (!parseParameterDeclaration(ast->parameter_declaration))
- return false;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTypeParameter(TypeParameterAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- TypeParameterAST *ast = CreateNode<TypeParameterAST>(_M_pool);
- ast->type = start;
-
- switch (token_stream.lookAhead()) {
- case Token_class:
- case Token_typename: {
- token_stream.nextToken(); // skip class
-
- // parse optional name
- if (parseName(ast->name, true)) {
- if (token_stream.lookAhead() == '=') {
- token_stream.nextToken();
-
- if (!parseTypeId(ast->type_id)) {
- //syntaxError();
- token_stream.rewind((int) start);
- return false;
- }
- } else if (token_stream.lookAhead() != ','
- && token_stream.lookAhead() != '>') {
- token_stream.rewind((int) start);
- return false;
- }
- }
- }
- break;
-
- case Token_template: {
- token_stream.nextToken(); // skip template
- ADVANCE('<', "<");
-
- if (!parseTemplateParameterList(ast->template_parameters))
- return false;
-
- ADVANCE('>', ">");
-
- if (token_stream.lookAhead() == Token_class)
- token_stream.nextToken();
-
- // parse optional name
- if (parseName(ast->name, true)) {
- if (token_stream.lookAhead() == '=') {
- token_stream.nextToken();
-
- if (!parseTypeId(ast->type_id)) {
- syntaxError();
- return false;
- }
- }
- }
-
- if (token_stream.lookAhead() == '=') {
- token_stream.nextToken();
-
- parseName(ast->template_name, true);
- }
- }
- break;
-
- default:
- return false;
-
- } // end switch
-
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- return true;
-}
-
-bool Parser::parseStorageClassSpecifier(const ListNode<std::size_t> *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int tk;
- while (0 != (tk = token_stream.lookAhead())
- && (tk == Token_friend || tk == Token_auto
- || tk == Token_register || tk == Token_static
- || tk == Token_extern || tk == Token_mutable)) {
- node = snoc(node, token_stream.cursor(), _M_pool);
- token_stream.nextToken();
- }
-
- return start != token_stream.cursor();
-}
-
-bool Parser::parseFunctionSpecifier(const ListNode<std::size_t> *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int tk;
- while (0 != (tk = token_stream.lookAhead())
- && (tk == Token_inline || tk == Token_virtual
- || tk == Token_explicit || tk == Token_Q_INVOKABLE)) {
- node = snoc(node, token_stream.cursor(), _M_pool);
- token_stream.nextToken();
- }
-
- return start != token_stream.cursor();
-}
-
-bool Parser::parseTypeId(TypeIdAST *&node)
-{
- /// @todo implement the AST for typeId
- std::size_t start = token_stream.cursor();
-
- TypeSpecifierAST *spec = 0;
- if (!parseTypeSpecifier(spec)) {
- token_stream.rewind((int) start);
- return false;
- }
-
- DeclaratorAST *decl = 0;
- parseAbstractDeclarator(decl);
-
- TypeIdAST *ast = CreateNode<TypeIdAST>(_M_pool);
- ast->type_specifier = spec;
- ast->declarator = decl;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseInitDeclaratorList(const ListNode<InitDeclaratorAST*> *&node)
-{
- InitDeclaratorAST *decl = 0;
- if (!parseInitDeclarator(decl))
- return false;
-
- node = snoc(node, decl, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (!parseInitDeclarator(decl)) {
- syntaxError();
- break;
- }
- node = snoc(node, decl, _M_pool);
- }
-
- return true;
-}
-
-bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ParameterDeclarationClauseAST *ast
- = CreateNode<ParameterDeclarationClauseAST>(_M_pool);
-
- if (!parseParameterDeclarationList(ast->parameter_declarations)) {
- if (token_stream.lookAhead() == ')')
- goto good;
-
- if (token_stream.lookAhead() == Token_ellipsis
- && token_stream.lookAhead(1) == ')') {
- ast->ellipsis = token_stream.cursor();
- goto good;
- }
-
- return false;
- }
-
-good:
-
- if (token_stream.lookAhead() == Token_ellipsis) {
- ast->ellipsis = token_stream.cursor();
- token_stream.nextToken();
- }
-
- /// @todo add ellipsis
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseParameterDeclarationList(const ListNode<ParameterDeclarationAST*> *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ParameterDeclarationAST *param = 0;
- if (!parseParameterDeclaration(param)) {
- token_stream.rewind((int) start);
- return false;
- }
-
- node = snoc(node, param, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (token_stream.lookAhead() == Token_ellipsis)
- break;
-
- if (!parseParameterDeclaration(param)) {
- token_stream.rewind((int) start);
- return false;
- }
- node = snoc(node, param, _M_pool);
- }
-
- return true;
-}
-
-bool Parser::parseParameterDeclaration(ParameterDeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- const ListNode<std::size_t> *storage = 0;
- parseStorageClassSpecifier(storage);
-
- // parse decl spec
- TypeSpecifierAST *spec = 0;
- if (!parseTypeSpecifier(spec)) {
- token_stream.rewind((int) start);
- return false;
- }
-
- int index = (int) token_stream.cursor();
-
- DeclaratorAST *decl = 0;
- if (!parseDeclarator(decl)) {
- token_stream.rewind((int) index);
-
- // try with abstract declarator
- parseAbstractDeclarator(decl);
- }
-
- ExpressionAST *expr = 0;
- if (token_stream.lookAhead() == '=') {
- token_stream.nextToken();
- if (!parseLogicalOrExpression(expr, true))
- reportError(QLatin1String("Expression expected"));
- }
-
- ParameterDeclarationAST *ast = CreateNode<ParameterDeclarationAST>(_M_pool);
- ast->type_specifier = spec;
- ast->declarator = decl;
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parse_Attribute__()
-{
- token_stream.nextToken();
-
- ADVANCE('(', "(");
-
- ExpressionAST *expr = 0;
- parseExpression(expr);
-
- if (token_stream.lookAhead() != ')') {
- reportError(QLatin1String("')' expected"));
- return false;
- } else {
- token_stream.nextToken();
- }
- return true;
-}
-
-QString Parser::tokenText(AST *ast) const
-{
- if (!ast)
- return QString();
-
- int start_token = ast->start_token;
- int end_token = ast->end_token;
-
- Token const &tk = token_stream.token(start_token);
- Token const &end_tk = token_stream.token(end_token);
-
- return QString::fromLatin1(&tk.text[tk.position],
- (int)(end_tk.position - tk.position)).trimmed();
-}
-
-bool Parser::parseForwardDeclarationSpecifier(TypeSpecifierAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int kind = token_stream.lookAhead();
- if (kind != Token_class && kind != Token_struct && kind != Token_union)
- return false;
-
- std::size_t class_key = token_stream.cursor();
- token_stream.nextToken();
-
- NameAST *name = 0;
- if (!parseName(name, false)) {
- token_stream.rewind((int) start);
- return false;
- }
-
- BaseClauseAST *bases = 0;
- if (token_stream.lookAhead() == ':') {
- if (!parseBaseClause(bases)) {
- token_stream.rewind((int) start);
- return false;
- }
- }
-
- if (token_stream.lookAhead() != ';') {
- token_stream.rewind((int) start);
- return false;
- }
-
- ForwardDeclarationSpecifierAST *ast = CreateNode<ForwardDeclarationSpecifierAST>(_M_pool);
- ast->class_key = class_key;
- ast->name = name;
- ast->base_clause = bases;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseClassSpecifier(TypeSpecifierAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int kind = token_stream.lookAhead();
- if (kind != Token_class && kind != Token_struct && kind != Token_union)
- return false;
-
- std::size_t class_key = token_stream.cursor();
- token_stream.nextToken();
-
- WinDeclSpecAST *winDeclSpec = 0;
- parseWinDeclSpec(winDeclSpec);
-
- if (token_stream.lookAhead() == Token___attribute__)
- parse_Attribute__();
-
- while (token_stream.lookAhead() == Token_identifier
- && token_stream.lookAhead(1) == Token_identifier)
- token_stream.nextToken();
-
- NameAST *name = 0;
- parseName(name, true);
-
- BaseClauseAST *bases = 0;
-
- if (token_stream.lookAhead() == ':') {
- if (!parseBaseClause(bases))
- skipUntil('{');
- }
-
- if (token_stream.lookAhead() != '{') {
-
- token_stream.rewind((int) start);
- return false;
- }
-
- ADVANCE('{', "{");
-
- ClassSpecifierAST *ast = CreateNode<ClassSpecifierAST>(_M_pool);
- ast->win_decl_specifiers = winDeclSpec;
- ast->class_key = class_key;
- ast->name = name;
- ast->base_clause = bases;
-
- while (token_stream.lookAhead()) {
- if (token_stream.lookAhead() == '}')
- break;
-
- std::size_t startDecl = token_stream.cursor();
-
- DeclarationAST *memSpec = 0;
- if (!parseMemberSpecification(memSpec)) {
- if (startDecl == token_stream.cursor())
- token_stream.nextToken(); // skip at least one token
- skipUntilDeclaration();
- } else
- ast->member_specs = snoc(ast->member_specs, memSpec, _M_pool);
- }
-
- ADVANCE_NR('}', "}");
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseAccessSpecifier(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- const ListNode<std::size_t> *specs = 0;
-
- bool done = false;
- while (!done) {
- switch (token_stream.lookAhead()) {
- case Token_signals:
- case Token_slots:
- case Token_k_dcop:
- case Token_k_dcop_signals:
- case Token_public:
- case Token_protected:
- case Token_private:
- specs = snoc(specs, token_stream.cursor(), _M_pool);
- token_stream.nextToken();
- break;
-
- default:
- done = true;
- break;
- }
- }
-
- if (!specs)
- return false;
-
- ADVANCE(':', ":");
-
- AccessSpecifierAST *ast = CreateNode<AccessSpecifierAST>(_M_pool);
- ast->specs = specs;
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseMemberSpecification(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (token_stream.lookAhead() == ';') {
- token_stream.nextToken();
- return true;
- } else if (token_stream.lookAhead() == Token_Q_OBJECT
- || token_stream.lookAhead() == Token_K_DCOP) {
- token_stream.nextToken();
- return true;
- } else if (parseTypedef(node)) {
- return true;
- } else if (parseUsing(node)) {
- return true;
- } else if (parseTemplateDeclaration(node)) {
- return true;
- } else if (parseAccessSpecifier(node)) {
- return true;
- } else if (parseQ_PROPERTY(node)) {
- return true;
- } else if (parseQ_ENUMS(node)) {
- return true;
- }
-
- token_stream.rewind((int) start);
-
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
- const ListNode<std::size_t> *storageSpec = 0;
- parseStorageClassSpecifier(storageSpec);
-
- parseCvQualify(cv);
-
- TypeSpecifierAST *spec = 0;
- if (parseEnumSpecifier(spec) || parseClassSpecifier(spec)) {
- parseCvQualify(cv);
- spec->cv = cv;
-
- const ListNode<InitDeclaratorAST*> *declarators = 0;
- parseInitDeclaratorList(declarators);
- ADVANCE(';', ";");
-
- SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(_M_pool);
- ast->type_specifier = spec;
- ast->init_declarators = declarators;
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
-
- token_stream.rewind((int) start);
- return parseDeclarationInternal(node);
-}
-
-bool Parser::parseCtorInitializer(CtorInitializerAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(':');
-
- CtorInitializerAST *ast = CreateNode<CtorInitializerAST>(_M_pool);
- ast->colon = start;
-
- if (!parseMemInitializerList(ast->member_initializers))
- reportError(QLatin1String("Member initializers expected"));
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int tk = token_stream.lookAhead();
- if (tk == Token_class
- || tk == Token_struct
- || tk == Token_union
- || tk == Token_enum
- || tk == Token_typename) {
- std::size_t type = token_stream.cursor();
- token_stream.nextToken();
-
- NameAST *name = 0;
- if (parseName(name, true)) {
- ElaboratedTypeSpecifierAST *ast
- = CreateNode<ElaboratedTypeSpecifierAST>(_M_pool);
-
- ast->type = type;
- ast->name = name;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
-
- token_stream.rewind((int) start);
- return false;
-}
-
-bool Parser::parseNoExcept()
-{
- // right now we only accept 'noexcept' with no conditional
- CHECK(Token_noexcept);
-
- return true;
-}
-
-bool Parser::parseExceptionSpecification(ExceptionSpecificationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_throw);
- ADVANCE('(', "(");
-
- ExceptionSpecificationAST *ast = CreateNode<ExceptionSpecificationAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_ellipsis) {
- ast->ellipsis = token_stream.cursor();
- token_stream.nextToken();
- } else {
- parseTypeIdList(ast->type_ids);
- }
-
- ADVANCE(')', ")");
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseEnumerator(EnumeratorAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_identifier);
- std::size_t id = token_stream.cursor() - 1;
-
- EnumeratorAST *ast = CreateNode<EnumeratorAST>(_M_pool);
- ast->id = id;
-
- if (token_stream.lookAhead() == '=') {
- token_stream.nextToken();
-
- if (!parseConstantExpression(ast->expression))
- reportError(QLatin1String("Constant expression expected"));
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseInitDeclarator(InitDeclaratorAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- DeclaratorAST *decl = 0;
- if (!parseDeclarator(decl))
- return false;
-
- if (token_stream.lookAhead(0) == Token_asm) {
- token_stream.nextToken();
- skip('(', ')');
- token_stream.nextToken();
- }
-
- InitializerAST *init = 0;
- parseInitializer(init);
-
- InitDeclaratorAST *ast = CreateNode<InitDeclaratorAST>(_M_pool);
- ast->declarator = decl;
- ast->initializer = init;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseBaseClause(BaseClauseAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(':');
-
- BaseSpecifierAST *baseSpec = 0;
- if (!parseBaseSpecifier(baseSpec))
- return false;
-
- BaseClauseAST *ast = CreateNode<BaseClauseAST>(_M_pool);
- ast->base_specifiers = snoc(ast->base_specifiers, baseSpec, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (!parseBaseSpecifier(baseSpec)) {
- reportError(QLatin1String("Base class specifier expected"));
- break;
- }
- ast->base_specifiers = snoc(ast->base_specifiers, baseSpec, _M_pool);
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseInitializer(InitializerAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- int tk = token_stream.lookAhead();
- if (tk != '=' && tk != '(')
- return false;
-
- InitializerAST *ast = CreateNode<InitializerAST>(_M_pool);
-
- if (tk == '=') {
- token_stream.nextToken();
-
- if (!parseInitializerClause(ast->initializer_clause))
- reportError(QLatin1String("Initializer clause expected"));
-
- } else if (tk == '(') {
- token_stream.nextToken();
- parseCommaExpression(ast->expression);
- CHECK(')');
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseMemInitializerList(const ListNode<MemInitializerAST*> *&node)
-{
- MemInitializerAST *init = 0;
-
- if (!parseMemInitializer(init))
- return false;
-
- node = snoc(node, init, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
-
- if (!parseMemInitializer(init))
- break;
-
- node = snoc(node, init, _M_pool);
- }
-
- return true;
-}
-
-bool Parser::parseMemInitializer(MemInitializerAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- NameAST *initId = 0;
- if (!parseName(initId, true)) {
- reportError(QLatin1String("Identifier expected"));
- return false;
- }
-
- ADVANCE('(', "(");
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
- ADVANCE(')', ")");
-
- MemInitializerAST *ast = CreateNode<MemInitializerAST>(_M_pool);
- ast->initializer_id = initId;
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseTypeIdList(const ListNode<TypeIdAST*> *&node)
-{
- TypeIdAST *typeId = 0;
- if (!parseTypeId(typeId))
- return false;
-
- node = snoc(node, typeId, _M_pool);
-
- while (token_stream.lookAhead() == ',') {
- token_stream.nextToken();
- if (parseTypeId(typeId)) {
- node = snoc(node, typeId, _M_pool);
- } else {
- reportError(QLatin1String("Type id expected"));
- break;
- }
- }
-
- return true;
-}
-
-bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- BaseSpecifierAST *ast = CreateNode<BaseSpecifierAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_virtual) {
- ast->virt = token_stream.cursor();
- token_stream.nextToken();
-
- int tk = token_stream.lookAhead();
- if (tk == Token_public || tk == Token_protected
- || tk == Token_private) {
- ast->access_specifier = token_stream.cursor();
- token_stream.nextToken();
- }
- } else {
- int tk = token_stream.lookAhead();
- if (tk == Token_public || tk == Token_protected
- || tk == Token_private) {
- ast->access_specifier = token_stream.cursor();
- token_stream.nextToken();
- }
-
- if (token_stream.lookAhead() == Token_virtual) {
- ast->virt = token_stream.cursor();
- token_stream.nextToken();
- }
- }
-
- if (!parseName(ast->name, true))
- reportError(QLatin1String("Class name expected"));
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseInitializerClause(InitializerClauseAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- InitializerClauseAST *ast = CreateNode<InitializerClauseAST>(_M_pool);
-
- if (token_stream.lookAhead() == '{') {
-#if defined(__GNUC__)
-#warning "implement me"
-#endif
- if (skip('{', '}'))
- token_stream.nextToken();
- else
- reportError(QLatin1String("} missing"));
- } else {
- if (!parseAssignmentExpression(ast->expression))
- reportError(QLatin1String("Expression expected"));
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parsePtrToMember(PtrToMemberAST *&node)
-{
-#if defined(__GNUC__)
-#warning "implemente me (AST)"
-#endif
-
- std::size_t start = token_stream.cursor();
-
- if (token_stream.lookAhead() == Token_scope) {
- token_stream.nextToken();
- }
-
- UnqualifiedNameAST *name = 0;
- while (token_stream.lookAhead() == Token_identifier) {
- if (!parseUnqualifiedName(name))
- break;
-
- if (token_stream.lookAhead() == Token_scope
- && token_stream.lookAhead(1) == '*') {
- token_stream.nextToken();
- token_stream.nextToken();
-
- PtrToMemberAST *ast = CreateNode<PtrToMemberAST>(_M_pool);
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
-
- if (token_stream.lookAhead() == Token_scope)
- token_stream.nextToken();
- }
-
- token_stream.rewind((int) start);
- return false;
-}
-
-bool Parser::parseUnqualifiedName(UnqualifiedNameAST *&node,
- bool parseTemplateId)
-{
- std::size_t start = token_stream.cursor();
-
- std::size_t tilde = 0;
- std::size_t id = 0;
- OperatorFunctionIdAST *operator_id = 0;
-
- if (token_stream.lookAhead() == Token_identifier) {
- id = token_stream.cursor();
- token_stream.nextToken();
- } else if (token_stream.lookAhead() == '~'
- && token_stream.lookAhead(1) == Token_identifier) {
- tilde = token_stream.cursor();
- token_stream.nextToken(); // skip ~
-
- id = token_stream.cursor();
- token_stream.nextToken(); // skip classname
- } else if (token_stream.lookAhead() == Token_operator) {
- if (!parseOperatorFunctionId(operator_id))
- return false;
- } else {
- return false;
- }
-
- UnqualifiedNameAST *ast = CreateNode<UnqualifiedNameAST>(_M_pool);
- ast->tilde = tilde;
- ast->id = id;
- ast->operator_id = operator_id;
-
- if (parseTemplateId && !tilde) {
- std::size_t index = token_stream.cursor();
-
- if (token_stream.lookAhead() == '<') {
- token_stream.nextToken();
-
- // optional template arguments
- parseTemplateArgumentList(ast->template_arguments);
-
- if (token_stream.lookAhead() == '>') {
- token_stream.nextToken();
- } else {
- ast->template_arguments = 0;
- token_stream.rewind((int) index);
- }
- }
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseStringLiteral(StringLiteralAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (token_stream.lookAhead() != Token_string_literal)
- return false;
-
- StringLiteralAST *ast = CreateNode<StringLiteralAST>(_M_pool);
-
- while (token_stream.lookAhead() == Token_string_literal) {
- ast->literals = snoc(ast->literals, token_stream.cursor(), _M_pool);
- token_stream.nextToken();
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseExpressionStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
-
- ADVANCE(';', ";");
-
- ExpressionStatementAST *ast = CreateNode<ExpressionStatementAST>(_M_pool);
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- switch (token_stream.lookAhead()) {
- case Token_while:
- return parseWhileStatement(node);
-
- case Token_do:
- return parseDoStatement(node);
-
- case Token_for:
- return parseForStatement(node);
-
- case Token_if:
- return parseIfStatement(node);
-
- case Token_switch:
- return parseSwitchStatement(node);
-
- case Token_try:
- return parseTryBlockStatement(node);
-
- case Token_case:
- case Token_default:
- return parseLabeledStatement(node);
-
- case Token_break:
- case Token_continue:
-#if defined(__GNUC__)
-#warning "implement me"
-#endif
- token_stream.nextToken();
- ADVANCE(';', ";");
- return true;
-
- case Token_goto:
-#if defined(__GNUC__)
-#warning "implement me"
-#endif
- token_stream.nextToken();
- ADVANCE(Token_identifier, "identifier");
- ADVANCE(';', ";");
- return true;
-
- case Token_return: {
- token_stream.nextToken();
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
-
- ADVANCE(';', ";");
-
- ReturnStatementAST *ast = CreateNode<ReturnStatementAST>(_M_pool);
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case '{':
- return parseCompoundStatement(node);
-
- case Token_identifier:
- if (parseLabeledStatement(node))
- return true;
- break;
- }
-
- return parseExpressionOrDeclarationStatement(node);
-}
-
-bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
-{
- bool blocked = block_errors(true);
-
- std::size_t start = token_stream.cursor();
-
- StatementAST *decl_ast = 0;
- bool maybe_amb = parseDeclarationStatement(decl_ast);
- maybe_amb &= token_stream.kind(token_stream.cursor() - 1) == ';';
-
- std::size_t end = token_stream.cursor();
-
- token_stream.rewind((int) start);
- StatementAST *expr_ast = 0;
- maybe_amb &= parseExpressionStatement(expr_ast);
- maybe_amb &= token_stream.kind(token_stream.cursor() - 1) == ';';
-
- if (maybe_amb) {
- Q_ASSERT(decl_ast && expr_ast);
- ExpressionOrDeclarationStatementAST *ast =
- CreateNode<ExpressionOrDeclarationStatementAST>(_M_pool);
- ast->declaration = decl_ast;
- ast->expression = expr_ast;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- } else {
- token_stream.rewind((int) std::max(end, token_stream.cursor()));
-
- node = decl_ast;
- if (!node)
- node = expr_ast;
- }
-
- block_errors(blocked);
-
- if (!node)
- syntaxError();
-
- return node != 0;
-}
-
-bool Parser::parseCondition(ConditionAST *&node, bool initRequired)
-{
- std::size_t start = token_stream.cursor();
-
- ConditionAST *ast = CreateNode<ConditionAST>(_M_pool);
- TypeSpecifierAST *spec = 0;
-
- if (parseTypeSpecifier(spec)) {
- ast->type_specifier = spec;
-
- std::size_t declarator_start = token_stream.cursor();
-
- DeclaratorAST *decl = 0;
- if (!parseDeclarator(decl)) {
- token_stream.rewind((int) declarator_start);
- if (!initRequired && !parseAbstractDeclarator(decl))
- decl = 0;
- }
-
- if (decl && (!initRequired || token_stream.lookAhead() == '=')) {
- ast->declarator = decl;
-
- if (token_stream.lookAhead() == '=') {
- token_stream.nextToken();
-
- parseExpression(ast->expression);
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
-
- token_stream.rewind((int) start);
-
- if (!parseCommaExpression(ast->expression))
- return false;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-
-bool Parser::parseWhileStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ADVANCE(Token_while, "while");
- ADVANCE('(' , "(");
-
- ConditionAST *cond = 0;
- if (!parseCondition(cond)) {
- reportError(QLatin1String("condition expected"));
- return false;
- }
- ADVANCE(')', ")");
-
- StatementAST *body = 0;
- if (!parseStatement(body)) {
- reportError(QLatin1String("statement expected"));
- return false;
- }
-
- WhileStatementAST *ast = CreateNode<WhileStatementAST>(_M_pool);
- ast->condition = cond;
- ast->statement = body;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseDoStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ADVANCE(Token_do, "do");
-
- StatementAST *body = 0;
- if (!parseStatement(body)) {
- reportError(QLatin1String("statement expected"));
- //return false;
- }
-
- ADVANCE_NR(Token_while, "while");
- ADVANCE_NR('(' , "(");
-
- ExpressionAST *expr = 0;
- if (!parseCommaExpression(expr)) {
- reportError(QLatin1String("expression expected"));
- //return false;
- }
-
- ADVANCE_NR(')', ")");
- ADVANCE_NR(';', ";");
-
- DoStatementAST *ast = CreateNode<DoStatementAST>(_M_pool);
- ast->statement = body;
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseForStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ADVANCE(Token_for, "for");
- ADVANCE('(', "(");
-
- StatementAST *init = 0;
- if (!parseForInitStatement(init)) {
- reportError(QLatin1String("for initialization expected"));
- return false;
- }
-
- ConditionAST *cond = 0;
- parseCondition(cond);
- ADVANCE(';', ";");
-
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
- ADVANCE(')', ")");
-
- StatementAST *body = 0;
- if (!parseStatement(body))
- return false;
-
- ForStatementAST *ast = CreateNode<ForStatementAST>(_M_pool);
- ast->init_statement = init;
- ast->condition = cond;
- ast->expression = expr;
- ast->statement = body;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseForInitStatement(StatementAST *&node)
-{
- if (parseDeclarationStatement(node))
- return true;
-
- return parseExpressionStatement(node);
-}
-
-bool Parser::parseCompoundStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK('{');
-
- CompoundStatementAST *ast = CreateNode<CompoundStatementAST>(_M_pool);
-
- while (token_stream.lookAhead()) {
- if (token_stream.lookAhead() == '}')
- break;
-
- std::size_t startStmt = token_stream.cursor();
-
- StatementAST *stmt = 0;
- if (!parseStatement(stmt)) {
- if (startStmt == token_stream.cursor())
- token_stream.nextToken();
-
- skipUntilStatement();
- } else {
- ast->statements = snoc(ast->statements, stmt, _M_pool);
- }
- }
-
- ADVANCE_NR('}', "}");
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseIfStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- ADVANCE(Token_if, "if");
-
- ADVANCE('(' , "(");
-
- IfStatementAST *ast = CreateNode<IfStatementAST>(_M_pool);
-
- ConditionAST *cond = 0;
- if (!parseCondition(cond)) {
- reportError(QLatin1String("condition expected"));
- return false;
- }
- ADVANCE(')', ")");
-
- StatementAST *stmt = 0;
- if (!parseStatement(stmt)) {
- reportError(QLatin1String("statement expected"));
- return false;
- }
-
- ast->condition = cond;
- ast->statement = stmt;
-
- if (token_stream.lookAhead() == Token_else) {
- token_stream.nextToken();
-
- if (!parseStatement(ast->else_statement)) {
- reportError(QLatin1String("statement expected"));
- return false;
- }
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseSwitchStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
- ADVANCE(Token_switch, "switch");
-
- ADVANCE('(' , "(");
-
- ConditionAST *cond = 0;
- if (!parseCondition(cond)) {
- reportError(QLatin1String("condition expected"));
- return false;
- }
- ADVANCE(')', ")");
-
- StatementAST *stmt = 0;
- if (!parseCompoundStatement(stmt)) {
- syntaxError();
- return false;
- }
-
- SwitchStatementAST *ast = CreateNode<SwitchStatementAST>(_M_pool);
- ast->condition = cond;
- ast->statement = stmt;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseLabeledStatement(StatementAST *&node)
-{
- switch (token_stream.lookAhead()) {
- case Token_identifier:
- case Token_default:
- if (token_stream.lookAhead(1) == ':') {
- token_stream.nextToken();
- token_stream.nextToken();
-
- StatementAST *stmt = 0;
- if (parseStatement(stmt)) {
- node = stmt;
- return true;
- }
- }
- break;
-
- case Token_case: {
- token_stream.nextToken();
- ExpressionAST *expr = 0;
- if (!parseConstantExpression(expr)) {
- reportError(QLatin1String("expression expected"));
- } else if (token_stream.lookAhead() == Token_ellipsis) {
- token_stream.nextToken();
-
- ExpressionAST *expr2 = 0;
- if (!parseConstantExpression(expr2))
- reportError(QLatin1String("expression expected"));
- }
- ADVANCE(':', ":");
-
- StatementAST *stmt = 0;
- if (parseStatement(stmt)) {
- node = stmt;
- return true;
- }
- }
- break;
-
- }
-
- return false;
-}
-
-bool Parser::parseBlockDeclaration(DeclarationAST *&node)
-{
- switch (token_stream.lookAhead()) {
- case Token_typedef:
- return parseTypedef(node);
- case Token_using:
- return parseUsing(node);
- case Token_asm:
- return parseAsmDefinition(node);
- case Token_namespace:
- return parseNamespaceAliasDefinition(node);
- }
-
- std::size_t start = token_stream.cursor();
-
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
- const ListNode<std::size_t> *storageSpec = 0;
- parseStorageClassSpecifier(storageSpec);
-
- parseCvQualify(cv);
-
- TypeSpecifierAST *spec = 0;
- if (!parseTypeSpecifierOrClassSpec(spec)) { // replace with simpleTypeSpecifier?!?!
- token_stream.rewind((int) start);
- return false;
- }
-
- parseCvQualify(cv);
- spec->cv = cv;
-
- const ListNode<InitDeclaratorAST*> *declarators = 0;
- parseInitDeclaratorList(declarators);
-
- if (token_stream.lookAhead() != ';') {
- token_stream.rewind((int) start);
- return false;
- }
- token_stream.nextToken();
-
- SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(_M_pool);
- ast->type_specifier = spec;
- ast->init_declarators = declarators;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseNamespaceAliasDefinition(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_namespace);
-
- NamespaceAliasDefinitionAST *ast
- = CreateNode<NamespaceAliasDefinitionAST>(_M_pool);
-
- ADVANCE(Token_identifier, "identifier");
- ast->namespace_name = token_stream.cursor() - 1;
-
- ADVANCE('=', "=");
-
- if (!parseName(ast->alias_name))
- reportError(QLatin1String("Namespace name expected"));
-
- ADVANCE(';', ";");
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseDeclarationStatement(StatementAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- DeclarationAST *decl = 0;
- if (!parseBlockDeclaration(decl))
- return false;
-
- DeclarationStatementAST *ast = CreateNode<DeclarationStatementAST>(_M_pool);
- ast->declaration = decl;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseDeclarationInternal(DeclarationAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- // that is for the case '__declspec(dllexport) int ...' or
- // '__declspec(dllexport) inline int ...', etc.
- WinDeclSpecAST *winDeclSpec = 0;
- parseWinDeclSpec(winDeclSpec);
-
- const ListNode<std::size_t> *funSpec = 0;
- bool hasFunSpec = parseFunctionSpecifier(funSpec);
-
- const ListNode<std::size_t> *cv = 0;
- parseCvQualify(cv);
-
- const ListNode<std::size_t> *storageSpec = 0;
- bool hasStorageSpec = parseStorageClassSpecifier(storageSpec);
-
- if (hasStorageSpec && !hasFunSpec)
- hasFunSpec = parseFunctionSpecifier(funSpec);
-
- // that is for the case 'friend __declspec(dllexport) ....'
- parseWinDeclSpec(winDeclSpec);
-
- if (!cv)
- parseCvQualify(cv);
-
- int index = (int) token_stream.cursor();
- NameAST *name = 0;
- if (parseName(name, true) && token_stream.lookAhead() == '(') {
- // no type specifier, maybe a constructor or a cast operator??
-
- token_stream.rewind((int) index);
-
- InitDeclaratorAST *declarator = 0;
- if (parseInitDeclarator(declarator)) {
- switch (token_stream.lookAhead()) {
- case ';': {
- token_stream.nextToken();
-
- SimpleDeclarationAST *ast
- = CreateNode<SimpleDeclarationAST>(_M_pool);
-
- ast->storage_specifiers = storageSpec;
- ast->function_specifiers = funSpec;
- ast->init_declarators = snoc(ast->init_declarators,
- declarator, _M_pool);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case ':': {
- CtorInitializerAST *ctorInit = 0;
- StatementAST *funBody = 0;
-
- if (parseCtorInitializer(ctorInit)
- && parseFunctionBody(funBody)) {
- FunctionDefinitionAST *ast
- = CreateNode<FunctionDefinitionAST>(_M_pool);
-
- ast->storage_specifiers = storageSpec;
- ast->function_specifiers = funSpec;
- ast->init_declarator = declarator;
- ast->function_body = funBody;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
- break;
-
- case '{': {
- StatementAST *funBody = 0;
- if (parseFunctionBody(funBody)) {
- FunctionDefinitionAST *ast
- = CreateNode<FunctionDefinitionAST>(_M_pool);
-
- ast->storage_specifiers = storageSpec;
- ast->function_specifiers = funSpec;
- ast->init_declarator = declarator;
- ast->function_body = funBody;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
- break;
-
- case '(':
- case '[':
- // ops!! it seems a declarator
- goto start_decl;
- break;
- }
-
- }
- }
-
-start_decl:
- token_stream.rewind((int) index);
-
- if (token_stream.lookAhead() == Token_const
- && token_stream.lookAhead(1) == Token_identifier
- && token_stream.lookAhead(2) == '=') {
- // constant definition
- token_stream.nextToken(); // skip const
-
- const ListNode<InitDeclaratorAST*> *declarators = 0;
- if (!parseInitDeclaratorList(declarators)) {
- syntaxError();
- return false;
- }
-
- ADVANCE(';', ";");
-
-#if defined(__GNUC__)
-#warning "mark the ast as constant"
-#endif
- SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(_M_pool);
- ast->init_declarators = declarators;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
-
- TypeSpecifierAST *spec = 0;
- if (parseTypeSpecifier(spec)) {
- Q_ASSERT(spec);
-
- if (!hasFunSpec)
- parseFunctionSpecifier(funSpec); // e.g. "void inline"
-
- spec->cv = cv;
-
- const ListNode<InitDeclaratorAST*> *declarators = 0;
- InitDeclaratorAST *decl = 0;
- int startDeclarator = (int) token_stream.cursor();
- bool maybeFunctionDefinition = false;
-
- if (token_stream.lookAhead() != ';') {
- if (parseInitDeclarator(decl) && token_stream.lookAhead() == '{') {
- // function definition
- maybeFunctionDefinition = true;
- } else {
- token_stream.rewind((int) startDeclarator);
- if (!parseInitDeclaratorList(declarators)) {
- syntaxError();
- return false;
- }
- }
- }
-
- switch (token_stream.lookAhead()) {
- case ';': {
- token_stream.nextToken();
- SimpleDeclarationAST *ast
- = CreateNode<SimpleDeclarationAST>(_M_pool);
-
- ast->storage_specifiers = storageSpec;
- ast->function_specifiers = funSpec;
- ast->type_specifier = spec;
- ast->win_decl_specifiers = winDeclSpec;
- ast->init_declarators = declarators;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case '{': {
- if (!maybeFunctionDefinition) {
- syntaxError();
- return false;
- }
-
- StatementAST *funBody = 0;
- if (parseFunctionBody(funBody)) {
- FunctionDefinitionAST *ast
- = CreateNode<FunctionDefinitionAST>(_M_pool);
-
- ast->win_decl_specifiers = winDeclSpec;
- ast->storage_specifiers = storageSpec;
- ast->function_specifiers = funSpec;
- ast->type_specifier = spec;
- ast->init_declarator = decl;
- ast->function_body = funBody;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
- break;
- } // end switch
- }
-
- syntaxError();
- return false;
-}
-
-bool Parser::skipFunctionBody(StatementAST *&)
-{
-#if defined(__GNUC__)
-#warning "Parser::skipFunctionBody() -- implement me"
-#endif
- Q_ASSERT(0); // ### not implemented
- return 0;
-}
-
-bool Parser::parseFunctionBody(StatementAST *&node)
-{
- if (control->skipFunctionBody())
- return skipFunctionBody(node);
-
- return parseCompoundStatement(node);
-}
-
-bool Parser::parseTypeSpecifierOrClassSpec(TypeSpecifierAST *&node)
-{
- if (parseClassSpecifier(node))
- return true;
- else if (parseEnumSpecifier(node))
- return true;
- else if (parseTypeSpecifier(node))
- return true;
-
- return false;
-}
-
-bool Parser::parseTryBlockStatement(StatementAST *&node)
-{
-#if defined(__GNUC__)
-#warning "implement me"
-#endif
- CHECK(Token_try);
-
- StatementAST *stmt = 0;
- if (!parseCompoundStatement(stmt)) {
- syntaxError();
- return false;
- }
-
- if (token_stream.lookAhead() != Token_catch) {
- reportError(QLatin1String("catch expected"));
- return false;
- }
-
- while (token_stream.lookAhead() == Token_catch) {
- token_stream.nextToken();
- ADVANCE('(', "(");
- ConditionAST *cond = 0;
- if (token_stream.lookAhead() == Token_ellipsis) {
- token_stream.nextToken();
- } else if (!parseCondition(cond, false)) {
- reportError(QLatin1String("condition expected"));
- return false;
- }
- ADVANCE(')', ")");
-
- StatementAST *body = 0;
- if (!parseCompoundStatement(body)) {
- syntaxError();
- return false;
- }
- }
-
- node = stmt;
- return true;
-}
-
-bool Parser::parsePrimaryExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- PrimaryExpressionAST *ast = CreateNode<PrimaryExpressionAST>(_M_pool);
-
- switch (token_stream.lookAhead()) {
- case Token_string_literal:
- parseStringLiteral(ast->literal);
- break;
-
- case Token_number_literal:
- case Token_char_literal:
- case Token_true:
- case Token_false:
- case Token_this:
- ast->token = token_stream.cursor();
- token_stream.nextToken();
- break;
-
- case '(':
- token_stream.nextToken();
-
- if (token_stream.lookAhead() == '{') {
- if (!parseCompoundStatement(ast->expression_statement))
- return false;
- } else {
- if (!parseExpression(ast->sub_expression))
- return false;
- }
-
- CHECK(')');
- break;
-
- default:
- if (!parseName(ast->name))
- return false;
-
- break;
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-
-/*
- postfix-expression-internal:
- [ expression ]
- ( expression-list [opt] )
- (.|->) template [opt] id-expression
- (.|->) pseudo-destructor-name
- ++
- --
-*/
-bool Parser::parsePostfixExpressionInternal(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- switch (token_stream.lookAhead()) {
- case '[': {
- token_stream.nextToken();
- ExpressionAST *expr = 0;
- parseExpression(expr);
- CHECK(']');
-
- SubscriptExpressionAST *ast
- = CreateNode<SubscriptExpressionAST>(_M_pool);
-
- ast->subscript = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case '(': {
- token_stream.nextToken();
- ExpressionAST *expr = 0;
- parseExpression(expr);
- CHECK(')');
-
- FunctionCallAST *ast = CreateNode<FunctionCallAST>(_M_pool);
- ast->arguments = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case '.':
- case Token_arrow: {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- std::size_t templ = 0;
- if (token_stream.lookAhead() == Token_template) {
- templ = token_stream.cursor();
- token_stream.nextToken();
- }
-
- int saved = int(token_stream.cursor());
- NameAST *name = 0;
-
- if (parseName(name, true) && name->unqualified_name
- && name->unqualified_name->template_arguments
- && token_stream.lookAhead() == '(') {
- // a template method call
- // ### reverse the logic
- } else {
- token_stream.rewind(saved);
- name = 0;
-
- if (!parseName(name, templ != 0))
- return false;
- }
-
- ClassMemberAccessAST *ast = CreateNode<ClassMemberAccessAST>(_M_pool);
- ast->op = op;
- ast->name = name;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case Token_incr:
- case Token_decr: {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- IncrDecrExpressionAST *ast = CreateNode<IncrDecrExpressionAST>(_M_pool);
- ast->op = op;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- default:
- return false;
- }
-}
-
-/*
- postfix-expression:
- simple-type-specifier ( expression-list [opt] )
- primary-expression postfix-expression-internal*
-*/
-bool Parser::parsePostfixExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- switch (token_stream.lookAhead()) {
- case Token_dynamic_cast:
- case Token_static_cast:
- case Token_reinterpret_cast:
- case Token_const_cast: {
- std::size_t castOp = token_stream.cursor();
- token_stream.nextToken();
-
- CHECK('<');
- TypeIdAST *typeId = 0;
- parseTypeId(typeId);
- CHECK('>');
-
- CHECK('(');
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
- CHECK(')');
-
- CppCastExpressionAST *ast = CreateNode<CppCastExpressionAST>(_M_pool);
- ast->op = castOp;
- ast->type_id = typeId;
- ast->expression = expr;
-
- ExpressionAST *e = 0;
- while (parsePostfixExpressionInternal(e))
- ast->sub_expressions = snoc(ast->sub_expressions, e, _M_pool);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case Token_typename: {
- std::size_t token = token_stream.cursor();
- token_stream.nextToken();
-
- NameAST* name = 0;
- if (!parseName(name, true))
- return false;
-
- CHECK('(');
- ExpressionAST *expr = 0;
- parseCommaExpression(expr);
- CHECK(')');
-
- TypeIdentificationAST *ast = CreateNode<TypeIdentificationAST>(_M_pool);
- ast->typename_token = token;
- ast->name = name;
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case Token_typeid: {
- token_stream.nextToken();
-
- CHECK('(');
- TypeIdAST *typeId = 0;
- parseTypeId(typeId);
- CHECK(')');
-
- TypeIdentificationAST *ast = CreateNode<TypeIdentificationAST>(_M_pool);
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- default:
- break;
- }
-
- std::size_t saved_pos = token_stream.cursor();
-
- TypeSpecifierAST *typeSpec = 0;
- ExpressionAST *expr = 0;
-
- // let's try to parse a type
- NameAST *name = 0;
- if (parseName(name, true)) {
- Q_ASSERT(name->unqualified_name);
-
- bool has_template_args = name->unqualified_name->template_arguments != 0;
-
- if (has_template_args && token_stream.lookAhead() == '(') {
- ExpressionAST *cast_expr = 0;
- if (parseCastExpression(cast_expr)
- && cast_expr->kind == AST::Kind_CastExpression) {
- token_stream.rewind((int) saved_pos);
- parsePrimaryExpression(expr);
- goto L_no_rewind;
- }
- }
- }
-
- token_stream.rewind((int) saved_pos);
-
-L_no_rewind:
- if (!expr && parseSimpleTypeSpecifier(typeSpec)
- && token_stream.lookAhead() == '(') {
- token_stream.nextToken(); // skip '('
- parseCommaExpression(expr);
- CHECK(')');
- } else if (expr) {
- typeSpec = 0;
- } else {
- typeSpec = 0;
- token_stream.rewind((int) start);
-
- if (!parsePrimaryExpression(expr))
- return false;
- }
-
- const ListNode<ExpressionAST*> *sub_expressions = 0;
- ExpressionAST *sub_expression = 0;
-
- while (parsePostfixExpressionInternal(sub_expression))
- sub_expressions = snoc(sub_expressions, sub_expression, _M_pool);
-
- if (sub_expressions || !expr || (typeSpec && expr)) {
- PostfixExpressionAST *ast = CreateNode<PostfixExpressionAST>(_M_pool);
- ast->type_specifier = typeSpec;
- ast->expression = expr;
- ast->sub_expressions = sub_expressions;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- } else
- node = expr;
-
- return true;
-}
-
-bool Parser::parseUnaryExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- switch (token_stream.lookAhead()) {
- case Token_incr:
- case Token_decr:
- case '*':
- case '&':
- case '+':
- case '-':
- case '!':
- case '~': {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *expr = 0;
- if (!parseCastExpression(expr))
- return false;
-
- UnaryExpressionAST *ast = CreateNode<UnaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->expression = expr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
- return true;
-
- case Token_sizeof: {
- std::size_t sizeof_token = token_stream.cursor();
- token_stream.nextToken();
-
- SizeofExpressionAST *ast = CreateNode<SizeofExpressionAST>(_M_pool);
- ast->sizeof_token = sizeof_token;
-
- std::size_t index = token_stream.cursor();
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
- if (parseTypeId(ast->type_id) && token_stream.lookAhead() == ')') {
- token_stream.nextToken(); // skip )
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- return true;
- }
-
- ast->type_id = 0;
- token_stream.rewind((int) index);
- }
-
- if (!parseUnaryExpression(ast->expression))
- return false;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- return true;
- }
-
- default:
- break;
- }
-
- int token = token_stream.lookAhead();
-
- if (token == Token_new
- || (token == Token_scope && token_stream.lookAhead(1) == Token_new))
- return parseNewExpression(node);
-
- if (token == Token_delete
- || (token == Token_scope && token_stream.lookAhead(1) == Token_delete))
- return parseDeleteExpression(node);
-
- return parsePostfixExpression(node);
-}
-
-bool Parser::parseNewExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- NewExpressionAST *ast = CreateNode<NewExpressionAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_scope
- && token_stream.lookAhead(1) == Token_new) {
- ast->scope_token = token_stream.cursor();
- token_stream.nextToken();
- }
-
- CHECK(Token_new);
- ast->new_token = token_stream.cursor() - 1;
-
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
- parseCommaExpression(ast->expression);
- CHECK(')');
- }
-
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
- parseTypeId(ast->type_id);
- CHECK(')');
- } else {
- parseNewTypeId(ast->new_type_id);
- }
-
- parseNewInitializer(ast->new_initializer);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseNewTypeId(NewTypeIdAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- TypeSpecifierAST *typeSpec = 0;
- if (!parseTypeSpecifier(typeSpec))
- return false;
-
- NewTypeIdAST *ast = CreateNode<NewTypeIdAST>(_M_pool);
- ast->type_specifier = typeSpec;
-
- parseNewDeclarator(ast->new_declarator);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseNewDeclarator(NewDeclaratorAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- NewDeclaratorAST *ast = CreateNode<NewDeclaratorAST>(_M_pool);
-
- PtrOperatorAST *ptrOp = 0;
- if (parsePtrOperator(ptrOp)) {
- ast->ptr_op = ptrOp;
- parseNewDeclarator(ast->sub_declarator);
- }
-
- while (token_stream.lookAhead() == '[') {
- token_stream.nextToken();
- ExpressionAST *expr = 0;
- parseExpression(expr);
- ast->expressions = snoc(ast->expressions, expr, _M_pool);
- ADVANCE(']', "]");
- }
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseNewInitializer(NewInitializerAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK('(');
-
- NewInitializerAST *ast = CreateNode<NewInitializerAST>(_M_pool);
-
- parseCommaExpression(ast->expression);
-
- CHECK(')');
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseDeleteExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- DeleteExpressionAST *ast = CreateNode<DeleteExpressionAST>(_M_pool);
-
- if (token_stream.lookAhead() == Token_scope
- && token_stream.lookAhead(1) == Token_delete) {
- ast->scope_token = token_stream.cursor();
- token_stream.nextToken();
- }
-
- CHECK(Token_delete);
- ast->delete_token = token_stream.cursor() - 1;
-
- if (token_stream.lookAhead() == '[') {
- ast->lbracket_token = token_stream.cursor();
- token_stream.nextToken();
- CHECK(']');
- ast->rbracket_token = token_stream.cursor() - 1;
- }
-
- if (!parseCastExpression(ast->expression))
- return false;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseCastExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (token_stream.lookAhead() == '(') {
- token_stream.nextToken();
-
- CastExpressionAST *ast = CreateNode<CastExpressionAST>(_M_pool);
-
- if (parseTypeId(ast->type_id)) {
- if (token_stream.lookAhead() == ')') {
- token_stream.nextToken();
-
- if (parseCastExpression(ast->expression)) {
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
- }
- }
- }
- }
-
- token_stream.rewind((int) start);
- return parseUnaryExpression(node);
-}
-
-bool Parser::parsePmExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseCastExpression(node) || !node) // ### fixme
- return false;
-
- while (token_stream.lookAhead() == Token_ptrmem) {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseCastExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseMultiplicativeExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parsePmExpression(node))
- return false;
-
- while (token_stream.lookAhead() == '*'
- || token_stream.lookAhead() == '/'
- || token_stream.lookAhead() == '%') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parsePmExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-
-bool Parser::parseAdditiveExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseMultiplicativeExpression(node))
- return false;
-
- while (token_stream.lookAhead() == '+' || token_stream.lookAhead() == '-') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseMultiplicativeExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseShiftExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseAdditiveExpression(node))
- return false;
-
- while (token_stream.lookAhead() == Token_shift) {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseAdditiveExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseRelationalExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseShiftExpression(node))
- return false;
-
- while (token_stream.lookAhead() == '<'
- || (token_stream.lookAhead() == '>' && !templArgs)
- || token_stream.lookAhead() == Token_leq
- || token_stream.lookAhead() == Token_geq) {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseShiftExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseEqualityExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseRelationalExpression(node, templArgs))
- return false;
-
- while (token_stream.lookAhead() == Token_eq
- || token_stream.lookAhead() == Token_not_eq) {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseRelationalExpression(rightExpr, templArgs))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseAndExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseEqualityExpression(node, templArgs))
- return false;
-
- while (token_stream.lookAhead() == '&') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseEqualityExpression(rightExpr, templArgs))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseExclusiveOrExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseAndExpression(node, templArgs))
- return false;
-
- while (token_stream.lookAhead() == '^') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseAndExpression(rightExpr, templArgs))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseInclusiveOrExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseExclusiveOrExpression(node, templArgs))
- return false;
-
- while (token_stream.lookAhead() == '|') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseExclusiveOrExpression(rightExpr, templArgs))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseLogicalAndExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseInclusiveOrExpression(node, templArgs))
- return false;
-
- while (token_stream.lookAhead() == Token_and) {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseInclusiveOrExpression(rightExpr, templArgs))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseLogicalOrExpression(ExpressionAST *&node, bool templArgs)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseLogicalAndExpression(node, templArgs))
- return false;
-
- while (token_stream.lookAhead() == Token_or) {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseLogicalAndExpression(rightExpr, templArgs))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseConditionalExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseLogicalOrExpression(node))
- return false;
-
- if (token_stream.lookAhead() == '?') {
- token_stream.nextToken();
-
- ExpressionAST *leftExpr = 0;
- if (!parseExpression(leftExpr))
- return false;
-
- CHECK(':');
-
- ExpressionAST *rightExpr = 0;
- if (!parseAssignmentExpression(rightExpr))
- return false;
-
- ConditionalExpressionAST *ast
- = CreateNode<ConditionalExpressionAST>(_M_pool);
-
- ast->condition = node;
- ast->left_expression = leftExpr;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseAssignmentExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (token_stream.lookAhead() == Token_throw && !parseThrowExpression(node))
- return false;
- else if (!parseConditionalExpression(node))
- return false;
-
- while (token_stream.lookAhead() == Token_assign
- || token_stream.lookAhead() == '=') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseConditionalExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseConstantExpression(ExpressionAST *&node)
-{
- return parseConditionalExpression(node);
-}
-
-bool Parser::parseExpression(ExpressionAST *&node)
-{
- return parseCommaExpression(node);
-}
-
-bool Parser::parseCommaExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- if (!parseAssignmentExpression(node))
- return false;
-
- while (token_stream.lookAhead() == ',') {
- std::size_t op = token_stream.cursor();
- token_stream.nextToken();
-
- ExpressionAST *rightExpr = 0;
- if (!parseAssignmentExpression(rightExpr))
- return false;
-
- BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(_M_pool);
- ast->op = op;
- ast->left_expression = node;
- ast->right_expression = rightExpr;
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
- }
-
- return true;
-}
-
-bool Parser::parseThrowExpression(ExpressionAST *&node)
-{
- std::size_t start = token_stream.cursor();
-
- CHECK(Token_throw);
-
- ThrowExpressionAST *ast = CreateNode<ThrowExpressionAST>(_M_pool);
- ast->throw_token = token_stream.cursor() - 1;
-
- parseAssignmentExpression(ast->expression);
-
- UPDATE_POS(ast, start, token_stream.cursor());
- node = ast;
-
- return true;
-}
-
-bool Parser::parseQ_ENUMS(DeclarationAST *&node)
-{
-
- if ((token_stream.lookAhead() != Token_Q_ENUMS) &&
- (token_stream.lookAhead() != Token_Q_ENUM))
- return false;
-
- if (token_stream.lookAhead(1) != '(')
- return false;
-
- token_stream.nextToken();
- token_stream.nextToken();
-
- int firstToken = token_stream.cursor();
- while (token_stream.lookAhead() != ')')
- token_stream.nextToken();
-
- QEnumsAST *ast = CreateNode<QEnumsAST>(_M_pool);
- UPDATE_POS(ast, firstToken, token_stream.cursor());
- node = ast;
-
- token_stream.nextToken();
-
- return true;
-}
-
-bool Parser::parseQ_PROPERTY(DeclarationAST *&node)
-{
- if (token_stream.lookAhead() != Token_Q_PROPERTY)
- return false;
-
- if (token_stream.lookAhead(1) != '(')
- return false;
-
- token_stream.nextToken();
- token_stream.nextToken();
-
- int firstToken = token_stream.cursor();
- while (token_stream.lookAhead() != ')')
- token_stream.nextToken();
-
- QPropertyAST *ast = CreateNode<QPropertyAST>(_M_pool);
- UPDATE_POS(ast, firstToken, token_stream.cursor());
- node = ast;
-
-// const Token &t1 = token_stream[firstToken];
-// const Token &t2 = token_stream[token_stream.cursor()];
-// printf("property: %s\n",
-// qPrintable(QString::fromLatin1(t1.text + t1.position, t2.position - t1.position)));
-
- token_stream.nextToken();
-
- return true;
-}
-
-bool Parser::block_errors(bool block)
-{
- bool current = _M_block_errors;
- _M_block_errors = block;
- return current;
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
-
diff --git a/sources/shiboken2/ApiExtractor/parser/parser.h b/sources/shiboken2/ApiExtractor/parser/parser.h
deleted file mode 100644
index 7aa5b9ad7..000000000
--- a/sources/shiboken2/ApiExtractor/parser/parser.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef PARSER_H
-#define PARSER_H
-
-#include "ast.h"
-#include "lexer.h"
-
-#include <QtCore/QString>
-
-class FileSymbol;
-class Control;
-
-class Parser
-{
-public:
- Parser(Control *control);
- ~Parser();
-
- LocationManager &location() { return _M_location; }
-
- TranslationUnitAST *parse(const char *contents, std::size_t size, pool *p);
-
-private:
- void reportError(const QString& msg);
- void syntaxError();
- void tokenRequiredError(int expected);
-
-public:
- bool skipFunctionBody(StatementAST *&node);
-
-public:
- bool parse_Attribute__();
- bool parseAbstractDeclarator(DeclaratorAST *&node);
- bool parseAccessSpecifier(DeclarationAST *&node);
- bool parseAdditiveExpression(ExpressionAST *&node);
- bool parseAndExpression(ExpressionAST *&node, bool templArgs = false);
- bool parseAsmDefinition(DeclarationAST *&node);
- bool parseAssignmentExpression(ExpressionAST *&node);
- bool parseBaseClause(BaseClauseAST *&node);
- bool parseBaseSpecifier(BaseSpecifierAST *&node);
- bool parseBlockDeclaration(DeclarationAST *&node);
- bool parseCastExpression(ExpressionAST *&node);
- bool parseClassSpecifier(TypeSpecifierAST *&node);
- bool parseForwardDeclarationSpecifier(TypeSpecifierAST *&node);
- bool parseCommaExpression(ExpressionAST *&node);
- bool parseCompoundStatement(StatementAST *&node);
- bool parseCondition(ConditionAST *&node, bool initRequired = true);
- bool parseConditionalExpression(ExpressionAST *&node);
- bool parseConstantExpression(ExpressionAST *&node);
- bool parseCtorInitializer(CtorInitializerAST *&node);
- bool parseCvQualify(const ListNode<std::size_t> *&node);
- bool parseDeclaration(DeclarationAST *&node);
- bool parseDeclarationInternal(DeclarationAST *&node);
- bool parseDeclarationStatement(StatementAST *&node);
- bool parseDeclarator(DeclaratorAST *&node);
- bool parseDeleteExpression(ExpressionAST *&node);
- bool parseDoStatement(StatementAST *&node);
- bool parseElaboratedTypeSpecifier(TypeSpecifierAST *&node);
- bool parseEnumSpecifier(TypeSpecifierAST *&node);
- bool parseEnumerator(EnumeratorAST *&node);
- bool parseEqualityExpression(ExpressionAST *&node,
- bool templArgs = false);
- bool parseExceptionSpecification(ExceptionSpecificationAST *&node);
- bool parseExclusiveOrExpression(ExpressionAST *&node,
- bool templArgs = false);
- bool parseExpression(ExpressionAST *&node);
- bool parseExpressionOrDeclarationStatement(StatementAST *&node);
- bool parseExpressionStatement(StatementAST *&node);
- bool parseForInitStatement(StatementAST *&node);
- bool parseForStatement(StatementAST *&node);
- bool parseFunctionBody(StatementAST *&node);
- bool parseFunctionSpecifier(const ListNode<std::size_t> *&node);
- bool parseIfStatement(StatementAST *&node);
- bool parseInclusiveOrExpression(ExpressionAST *&node,
- bool templArgs = false);
- bool parseInitDeclarator(InitDeclaratorAST *&node);
- bool parseInitDeclaratorList(const ListNode<InitDeclaratorAST*> *&node);
- bool parseInitializer(InitializerAST *&node);
- bool parseInitializerClause(InitializerClauseAST *&node);
- bool parseLabeledStatement(StatementAST *&node);
- bool parseLinkageBody(LinkageBodyAST *&node);
- bool parseLinkageSpecification(DeclarationAST *&node);
- bool parseLogicalAndExpression(ExpressionAST *&node,
- bool templArgs = false);
- bool parseLogicalOrExpression(ExpressionAST *&node,
- bool templArgs = false);
- bool parseMemInitializer(MemInitializerAST *&node);
- bool parseMemInitializerList(const ListNode<MemInitializerAST*> *&node);
- bool parseMemberSpecification(DeclarationAST *&node);
- bool parseMultiplicativeExpression(ExpressionAST *&node);
- bool parseName(NameAST *&node, bool acceptTemplateId = false);
- bool parseNamespace(DeclarationAST *&node);
- bool parseNamespaceAliasDefinition(DeclarationAST *&node);
- bool parseNewDeclarator(NewDeclaratorAST *&node);
- bool parseNewExpression(ExpressionAST *&node);
- bool parseNewInitializer(NewInitializerAST *&node);
- bool parseNewTypeId(NewTypeIdAST *&node);
- bool parseNoExcept();
- bool parseOperator(OperatorAST *&node);
- bool parseOperatorFunctionId(OperatorFunctionIdAST *&node);
- bool parseParameterDeclaration(ParameterDeclarationAST *&node);
- bool parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node);
- bool parseParameterDeclarationList(const ListNode<ParameterDeclarationAST*> *&node);
- bool parsePmExpression(ExpressionAST *&node);
- bool parsePostfixExpression(ExpressionAST *&node);
- bool parsePostfixExpressionInternal(ExpressionAST *&node);
- bool parsePrimaryExpression(ExpressionAST *&node);
- bool parsePtrOperator(PtrOperatorAST *&node);
- bool parsePtrToMember(PtrToMemberAST *&node);
- bool parseRelationalExpression(ExpressionAST *&node,
- bool templArgs = false);
- bool parseShiftExpression(ExpressionAST *&node);
- bool parseSimpleTypeSpecifier(TypeSpecifierAST *&node,
- bool onlyIntegral = false);
- bool parseStatement(StatementAST *&node);
- bool parseStorageClassSpecifier(const ListNode<std::size_t> *&node);
- bool parseStringLiteral(StringLiteralAST *&node);
- bool parseSwitchStatement(StatementAST *&node);
- bool parseTemplateArgument(TemplateArgumentAST *&node);
- bool parseTemplateArgumentList(const ListNode<TemplateArgumentAST*> *&node,
- bool reportError = true);
- bool parseTemplateDeclaration(DeclarationAST *&node);
- bool parseTemplateParameter(TemplateParameterAST *&node);
- bool parseTemplateParameterList(const ListNode<TemplateParameterAST*> *&node);
- bool parseThrowExpression(ExpressionAST *&node);
- bool parseTranslationUnit(TranslationUnitAST *&node);
- bool parseTryBlockStatement(StatementAST *&node);
- bool parseTypeId(TypeIdAST *&node);
- bool parseTypeIdList(const ListNode<TypeIdAST*> *&node);
- bool parseTypeParameter(TypeParameterAST *&node);
- bool parseTypeSpecifier(TypeSpecifierAST *&node);
- bool parseTypeSpecifierOrClassSpec(TypeSpecifierAST *&node);
- bool parseTypedef(DeclarationAST *&node);
- bool parseUnaryExpression(ExpressionAST *&node);
- bool parseUnqualifiedName(UnqualifiedNameAST *&node,
- bool parseTemplateId = true);
- bool parseUsing(DeclarationAST *&node);
- bool parseUsingDirective(DeclarationAST *&node);
- bool parseWhileStatement(StatementAST *&node);
- bool parseWinDeclSpec(WinDeclSpecAST *&node);
-
- bool parseQ_PROPERTY(DeclarationAST *&node);
- bool parseQ_ENUMS(DeclarationAST *&node);
-
- bool skipUntil(int token);
- bool skipUntilDeclaration();
- bool skipUntilStatement();
- bool skip(int l, int r);
-
- void advance();
-
- // private:
- TokenStream token_stream;
- LocationTable location_table;
- LocationTable line_table;
-
- bool block_errors(bool block);
-
-private:
- QString tokenText(AST *) const;
-
- LocationManager _M_location;
- Control *control;
- Lexer lexer;
- pool *_M_pool;
- bool _M_block_errors;
-
-private:
- Parser(const Parser& source);
- void operator = (const Parser& source);
-};
-
-#endif
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/r++.macros b/sources/shiboken2/ApiExtractor/parser/r++.macros
deleted file mode 100644
index 455276c84..000000000
--- a/sources/shiboken2/ApiExtractor/parser/r++.macros
+++ /dev/null
@@ -1,28 +0,0 @@
-
-#define __attribute__(a...)
-#define __typeof__ __typeof
-
-#define __extension
-#define __extension__
-
-#define __restrict
-#define __restrict__
-
-#define __volatile volatile
-#define __volatile__ volatile
-
-#define __inline inline
-#define __inline__ inline
-
-#define __const const
-#define __const__ const
-
-#define __asm asm
-#define __asm__ asm
-
-#define __GNUC__ 3
-//#define __GNUC_MINOR__ 4
-
-#define __ROBC__ 0
-#define __ROBC_MINOR__ 1
-
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp-allocator.h b/sources/shiboken2/ApiExtractor/parser/rpp-allocator.h
deleted file mode 100644
index 4331ef7d4..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp-allocator.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "parser/rxx_allocator.h"
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/builtin-macros.cpp b/sources/shiboken2/ApiExtractor/parser/rpp/builtin-macros.cpp
deleted file mode 100644
index ccc150339..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/builtin-macros.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-cctype.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-cctype.h
deleted file mode 100644
index d2e16b994..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-cctype.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_CCTYPE_H
-#define PP_CCTYPE_H
-
-#include <cctype>
-
-namespace rpp
-{
-
-inline bool pp_isalpha(int __ch)
-{
- return std::isalpha((unsigned char) __ch) != 0;
-}
-
-inline bool pp_isalnum(int __ch)
-{
- return std::isalnum((unsigned char) __ch) != 0;
-}
-
-inline bool pp_isdigit(int __ch)
-{
- return std::isdigit((unsigned char) __ch) != 0;
-}
-
-inline bool pp_isspace(int __ch)
-{
- return std::isspace((unsigned char) __ch) != 0;
-}
-
-} // namespace rpp
-
-#endif // PP_CCTYPE_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-configuration b/sources/shiboken2/ApiExtractor/parser/rpp/pp-configuration
deleted file mode 100644
index 15586dd88..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-configuration
+++ /dev/null
@@ -1,86 +0,0 @@
-#define __DBL_MIN_EXP__ (-1021)
-#define __FLT_MIN__ 1.17549435e-38F
-#define __CHAR_BIT__ 8
-#define __WCHAR_MAX__ 2147483647
-#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
-#define __FLT_EVAL_METHOD__ 2
-#define __DBL_MIN_10_EXP__ (-307)
-#define __FINITE_MATH_ONLY__ 0
-#define __GNUC_PATCHLEVEL__ 2
-#define __SHRT_MAX__ 32767
-#define __LDBL_MAX__ 1.18973149535723176502e+4932L
-#define __UINTMAX_TYPE__ long long unsigned int
-#define __linux 1
-#define __unix 1
-#define __LDBL_MAX_EXP__ 16384
-#define __linux__ 1
-#define __SCHAR_MAX__ 127
-#define __USER_LABEL_PREFIX__
-#define __STDC_HOSTED__ 1
-#define __LDBL_HAS_INFINITY__ 1
-#define __DBL_DIG__ 15
-#define __FLT_EPSILON__ 1.19209290e-7F
-#define __GXX_WEAK__ 1
-#define __LDBL_MIN__ 3.36210314311209350626e-4932L
-#define __unix__ 1
-#define __DECIMAL_DIG__ 21
-#define __gnu_linux__ 1
-#define __LDBL_HAS_QUIET_NAN__ 1
-#define __GNUC__ 4
-#define __DBL_MAX__ 1.7976931348623157e+308
-#define __DBL_HAS_INFINITY__ 1
-#define __cplusplus 1
-#define __DEPRECATED 1
-#define __DBL_MAX_EXP__ 1024
-#define __GNUG__ 4
-#define __LONG_LONG_MAX__ 9223372036854775807LL
-#define __GXX_ABI_VERSION 1002
-#define __FLT_MIN_EXP__ (-125)
-#define __DBL_MIN__ 2.2250738585072014e-308
-#define __FLT_MIN_10_EXP__ (-37)
-#define __DBL_HAS_QUIET_NAN__ 1
-#define __REGISTER_PREFIX__
-#define __NO_INLINE__ 1
-#define __i386 1
-#define __FLT_MANT_DIG__ 24
-#define __VERSION__ "4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)"
-#define i386 1
-#define __i486__ 1
-#define unix 1
-#define __i386__ 1
-#define __SIZE_TYPE__ unsigned int
-#define __ELF__ 1
-#define __FLT_RADIX__ 2
-#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
-#define __FLT_HAS_QUIET_NAN__ 1
-#define __FLT_MAX_10_EXP__ 38
-#define __LONG_MAX__ 2147483647L
-#define __FLT_HAS_INFINITY__ 1
-#define linux 1
-#define __EXCEPTIONS 1
-#define __LDBL_MANT_DIG__ 64
-#define __WCHAR_TYPE__ int
-#define __FLT_DIG__ 6
-#define __INT_MAX__ 2147483647
-#define __i486 1
-#define __FLT_MAX_EXP__ 128
-#define __DBL_MANT_DIG__ 53
-#define __WINT_TYPE__ unsigned int
-#define __LDBL_MIN_EXP__ (-16381)
-#define __LDBL_MAX_10_EXP__ 4932
-#define __DBL_EPSILON__ 2.2204460492503131e-16
-#define __tune_i486__ 1
-#define __INTMAX_MAX__ 9223372036854775807LL
-#define __FLT_DENORM_MIN__ 1.40129846e-45F
-#define __FLT_MAX__ 3.40282347e+38F
-#define __INTMAX_TYPE__ long long int
-#define __GNUC_MINOR__ 0
-#define __DBL_MAX_10_EXP__ 308
-#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
-#define __PTRDIFF_TYPE__ int
-#define __LDBL_MIN_10_EXP__ (-4931)
-#define __LDBL_DIG__ 18
-#define _GNU_SOURCE 1
-
-
-#define __STDC__
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-engine-bits.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-engine-bits.h
deleted file mode 100644
index 3d8aee029..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-engine-bits.h
+++ /dev/null
@@ -1,1300 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_ENGINE_BITS_H
-#define PP_ENGINE_BITS_H
-
-#include "pp.h"
-#include <sys/stat.h>
-#include <cstdio>
-#include <iostream>
-
-namespace rpp
-{
-
-inline std::string pp::fix_file_path(std::string const &filename) const
-{
-#if defined (PP_OS_WIN)
- std::string s = filename;
- for (std::string::iterator it = s.begin(); it != s.end(); ++it) {
- if (*it == '/')
- *it = '\\';
- }
- return s;
-#else
- return filename;
-#endif
-}
-
-inline bool pp::is_absolute(std::string const &filename) const
-{
-#if defined(PP_OS_WIN)
- return filename.length() >= 3
- && filename.at(1) == ':'
- && (filename.at(2) == '\\' || filename.at(2) == '/');
-#else
- return filename.length() >= 1
- && filename.at(0) == '/';
-#endif
-}
-
-template <typename _OutputIterator>
-void pp::file(std::string const &filename, _OutputIterator __result)
-{
- FILE *fp = std::fopen(filename.c_str(), "rb");
- if (fp != 0) {
- std::string was = env.current_file;
- env.current_file = filename;
- file(fp, __result);
- env.current_file = was;
- }
- //else
- //std::cerr << "** WARNING file ``" << filename << " not found!" << std::endl;
-}
-
-template <typename _OutputIterator>
-void pp::file(FILE *fp, _OutputIterator __result)
-{
- assert(fp != 0);
-
-#if defined (HAVE_MMAP)
- struct stat st;
- fstat(FILENO(fp), &st);
- std::size_t size = st.st_size;
- char *buffer = 0;
- buffer = (char *) ::mmap(0, size, PROT_READ, MAP_SHARED, FILENO(fp), 0);
- fclose(fp);
- if (!buffer || buffer == (char*) - 1)
- return;
- this->operator()(buffer, buffer + size, __result);
- ::munmap(buffer, size);
-#else
- std::string buffer;
- while (!feof(fp)) {
- char tmp[1024];
- int read = (int) fread(tmp, sizeof(char), 1023, fp);
- tmp[read] = '\0';
- buffer += tmp;
- }
- fclose(fp);
- this->operator()(buffer.c_str(), buffer.c_str() + buffer.size(), __result);
-#endif
-}
-
-template <typename _InputIterator>
-bool pp::find_header_protection(_InputIterator __first, _InputIterator __last, std::string *__prot)
-{
- int was = env.current_line;
-
- while (__first != __last) {
- if (pp_isspace(*__first)) {
- if (*__first == '\n')
- ++env.current_line;
-
- ++__first;
- } else if (_PP_internal::comment_p(__first, __last)) {
- __first = skip_comment_or_divop(__first, __last);
- env.current_line += skip_comment_or_divop.lines;
- } else if (*__first == '#') {
- __first = skip_blanks(++__first, __last);
- env.current_line += skip_blanks.lines;
-
- if (__first != __last && *__first == 'i') {
- _InputIterator __begin = __first;
- __first = skip_identifier(__begin, __last);
- env.current_line += skip_identifier.lines;
-
- std::string __directive(__begin, __first);
-
- if (__directive == "ifndef") {
- __first = skip_blanks(__first, __last);
- env.current_line += skip_blanks.lines;
-
- __begin = __first;
- __first = skip_identifier(__first, __last);
- env.current_line += skip_identifier.lines;
-
- if (__begin != __first && __first != __last) {
- __prot->assign(__begin, __first);
- return true;
- }
- }
- }
- break;
- } else
- break;
- }
-
- env.current_line = was;
- return false;
-}
-
-inline pp::PP_DIRECTIVE_TYPE pp::find_directive(char const *__directive, std::size_t __size) const
-{
- switch (__size) {
- case 0:
- return PP_UNNAMED_DIRECTIVE;
- case 2:
- if (__directive[0] == 'i'
- && __directive[1] == 'f')
- return PP_IF;
- break;
-
- case 4:
- if (__directive[0] == 'e' && !strcmp(__directive, "elif"))
- return PP_ELIF;
- else if (__directive[0] == 'e' && !strcmp(__directive, "else"))
- return PP_ELSE;
- break;
-
- case 5:
- if (__directive[0] == 'i' && !strcmp(__directive, "ifdef"))
- return PP_IFDEF;
- else if (__directive[0] == 'u' && !strcmp(__directive, "undef"))
- return PP_UNDEF;
- else if (__directive[0] == 'e') {
- if (!strcmp(__directive, "endif"))
- return PP_ENDIF;
- else if (!strcmp(__directive, "error"))
- return PP_ERROR;
- }
- break;
-
- case 6:
- if (__directive[0] == 'i' && !strcmp(__directive, "ifndef"))
- return PP_IFNDEF;
- else if (__directive[0] == 'd' && !strcmp(__directive, "define"))
- return PP_DEFINE;
- else if (__directive[0] == 'p' && !strcmp(__directive, "pragma"))
- return PP_PRAGMA;
- break;
-
- case 7:
- if (__directive[0] == 'i' && !strcmp(__directive, "include"))
- return PP_INCLUDE;
- else if (!strcmp(__directive, "warning"))
- return PP_WARNING;
- break;
-
- case 12:
- if (__directive[0] == 'i' && !strcmp(__directive, "include_next"))
- return PP_INCLUDE_NEXT;
- break;
-
- default:
- break;
- }
- std::cerr << "** WARNING unknown directive '#" << __directive << "' at " << env.current_file << ":" << env.current_line << std::endl;
- return PP_UNKNOWN_DIRECTIVE;
-}
-
-inline bool pp::file_isdir(std::string const &__filename) const
-{
- struct stat __st;
- if (stat(__filename.c_str(), &__st) == 0)
-#if defined(PP_OS_WIN)
- return (__st.st_mode & _S_IFDIR) == _S_IFDIR;
-#else
- return (__st.st_mode & S_IFDIR) == S_IFDIR;
-#endif
- else
- return false;
-}
-
-inline bool pp::file_exists(std::string const &__filename) const
-{
- struct stat __st;
- return stat(__filename.c_str(), &__st) == 0;
-}
-
-inline FILE *pp::find_include_file(std::string const &__input_filename, std::string *__filepath,
- INCLUDE_POLICY __include_policy, bool __skip_current_path) const
-{
- assert(__filepath != 0);
- assert(! __input_filename.empty());
-
- __filepath->assign(__input_filename);
-
- if (is_absolute(*__filepath) && !file_isdir(*__filepath))
- return std::fopen(__filepath->c_str(), "r");
-
- if (! env.current_file.empty())
- _PP_internal::extract_file_path(env.current_file, __filepath);
-
- if (__include_policy == INCLUDE_LOCAL && ! __skip_current_path) {
- std::string __tmp(*__filepath);
- __tmp += __input_filename;
-
- if (file_exists(__tmp) && !file_isdir(__tmp)) {
- __filepath->append(__input_filename);
- return std::fopen(__filepath->c_str(), "r");
- }
- }
-
- std::vector<std::string>::const_iterator it = include_paths.begin();
-
- if (__skip_current_path) {
- it = std::find(include_paths.begin(), include_paths.end(), *__filepath);
-
- if (it != include_paths.end())
- ++it;
-
- else
- it = include_paths.begin();
- }
-
- for (; it != include_paths.end(); ++it) {
- if (__skip_current_path && it == include_paths.begin())
- continue;
-
- __filepath->assign(*it);
- __filepath->append(__input_filename);
-
- if (file_exists(*__filepath) && !file_isdir(*__filepath))
- return std::fopen(__filepath->c_str(), "r");
-
-#ifdef Q_OS_MAC
- // try in Framework path on Mac, if there is a path in front
- // ### what about escaped slashes?
- size_t slashPos = __input_filename.find('/');
- if (slashPos != std::string::npos) {
- __filepath->assign(*it);
- __filepath->append(__input_filename.substr(0, slashPos));
- __filepath->append(".framework/Headers/");
- __filepath->append(__input_filename.substr(slashPos + 1, std::string::npos));
-
- if (file_exists(*__filepath) && !file_isdir(*__filepath)) {
- return fopen(__filepath->c_str(), "r");
- }
- }
-#endif // Q_OS_MAC
- }
-
- return 0;
-}
-
-template <typename _InputIterator, typename _OutputIterator>
-_InputIterator pp::handle_directive(char const *__directive, std::size_t __size,
- _InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
- __first = skip_blanks(__first, __last);
-
- PP_DIRECTIVE_TYPE d = find_directive(__directive, __size);
- switch (d) {
- case PP_UNNAMED_DIRECTIVE:
- /* There are many boost headers that include the character '#'
- * at the beginning of any line and just do nothing else with
- * that unnamed directive. Well, as that's not an error so
- * we'll just ignore this unnamed directive for now.
- */
- ++__last;
- return ++__first;
- case PP_DEFINE:
- if (! skipping())
- return handle_define(__first, __last);
- break;
-
- case PP_INCLUDE:
- case PP_INCLUDE_NEXT:
- if (! skipping())
- return handle_include(d == PP_INCLUDE_NEXT, __first, __last, __result);
- break;
-
- case PP_UNDEF:
- if (! skipping())
- return handle_undef(__first, __last);
- break;
-
- case PP_ELIF:
- return handle_elif(__first, __last);
-
- case PP_ELSE:
- return handle_else(__first, __last);
-
- case PP_ENDIF:
- return handle_endif(__first, __last);
-
- case PP_IF:
- return handle_if(__first, __last);
-
- case PP_IFDEF:
- return handle_ifdef(false, __first, __last);
-
- case PP_IFNDEF:
- return handle_ifdef(true, __first, __last);
-
- default:
- break;
- }
-
- return __first;
-}
-
-template <typename _InputIterator, typename _OutputIterator>
-_InputIterator pp::handle_include(bool __skip_current_path, _InputIterator __first, _InputIterator __last,
- _OutputIterator __result)
-{
- if (pp_isalpha(*__first) || *__first == '_') {
- pp_macro_expander expand_include(env);
- std::string name;
- name.reserve(255);
- expand_include(__first, __last, std::back_inserter(name));
- std::string::iterator it = skip_blanks(name.begin(), name.end());
- if (it != name.end() && !(*it == '<' || *it == '"')) {
- std::cerr << "** WARNING APIExtractor does not support the use "
- "of #include directives without passing either "
- "\"<path/to/header.h>\" or \"./path/to/header.h\", "
- "for example. Invalid use at " << env.current_file
- << ":" << env.current_line << "." << std::endl;
- return __last;
- }
-
- handle_include(__skip_current_path, it, name.end(), __result);
- return __first;
- }
-
- assert(*__first == '<' || *__first == '"');
- int quote = (*__first == '"') ? '"' : '>';
- ++__first;
-
- _InputIterator end_name = __first;
- for (; end_name != __last; ++end_name) {
- assert(*end_name != '\n');
-
- if (*end_name == quote)
- break;
- }
-
- std::string filename(__first, end_name);
-
-#ifdef PP_OS_WIN
- std::replace(filename.begin(), filename.end(), '/', '\\');
-#endif
-
- std::string filepath;
- FILE *fp = find_include_file(filename, &filepath, quote == '>' ? INCLUDE_GLOBAL : INCLUDE_LOCAL, __skip_current_path);
-
-#if defined (PP_HOOK_ON_FILE_INCLUDED)
- PP_HOOK_ON_FILE_INCLUDED(env.current_file, fp ? filepath : filename, fp);
-#endif
-
- if (fp != 0) {
- std::string old_file = env.current_file;
- env.current_file = filepath;
- int __saved_lines = env.current_line;
-
- env.current_line = 1;
- //output_line (env.current_file, 1, __result);
-
- file(fp, __result);
-
- // restore the file name and the line position
- env.current_file = old_file;
- env.current_line = __saved_lines;
-
- // sync the buffer
- _PP_internal::output_line(env.current_file, env.current_line, __result);
- }
-#ifndef RPP_JAMBI
-// else
-// std::cerr << "*** WARNING " << filename << ": No such file or directory" << std::endl;
-#endif
-
- return __first;
-}
-
-template <typename _InputIterator, typename _OutputIterator>
-void pp::operator()(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
-{
-#ifndef PP_NO_SMART_HEADER_PROTECTION
- std::string __prot;
- __prot.reserve(255);
- pp_fast_string __tmp(__prot.c_str(), __prot.size());
-
- if (find_header_protection(__first, __last, &__prot)
- && env.resolve(&__tmp) != 0) {
- // std::cerr << "** DEBUG found header protection:" << __prot << std::endl;
- return;
- }
-#endif
-
- env.current_line = 1;
- char __buffer[512];
-
- while (true) {
- __first = skip_blanks(__first, __last);
- env.current_line += skip_blanks.lines;
-
- if (__first == __last)
- break;
- else if (*__first == '#') {
- assert(*__first == '#');
- __first = skip_blanks(++__first, __last);
- env.current_line += skip_blanks.lines;
-
- _InputIterator end_id = skip_identifier(__first, __last);
- env.current_line += skip_identifier.lines;
- std::size_t __size = end_id - __first;
-
- assert(__size < 512);
- char *__cp = __buffer;
- std::copy(__first, end_id, __cp);
- __cp[__size] = '\0';
-
- end_id = skip_blanks(end_id, __last);
- __first = skip(end_id, __last);
-
- int was = env.current_line;
- (void) handle_directive(__buffer, __size, end_id, __first, __result);
-
- if (env.current_line != was) {
- env.current_line = was;
- _PP_internal::output_line(env.current_file, env.current_line, __result);
- }
- } else if (*__first == '\n') {
- // ### compress the line
- *__result++ = *__first++;
- ++env.current_line;
- } else if (skipping())
- __first = skip(__first, __last);
- else {
- _PP_internal::output_line(env.current_file, env.current_line, __result);
- __first = expand(__first, __last, __result);
- env.current_line += expand.lines;
-
- if (expand.generated_lines)
- _PP_internal::output_line(env.current_file, env.current_line, __result);
- }
- }
-}
-
-inline pp::pp(pp_environment &__env):
- env(__env), expand(env)
-{
- iflevel = 0;
- _M_skipping[iflevel] = 0;
- _M_true_test[iflevel] = 0;
-}
-
-inline std::back_insert_iterator<std::vector<std::string> > pp::include_paths_inserter()
-{
- return std::back_inserter(include_paths);
-}
-
-inline std::vector<std::string>::iterator pp::include_paths_begin()
-{
- return include_paths.begin();
-}
-
-inline std::vector<std::string>::iterator pp::include_paths_end()
-{
- return include_paths.end();
-}
-
-inline std::vector<std::string>::const_iterator pp::include_paths_begin() const
-{
- return include_paths.begin();
-}
-
-inline std::vector<std::string>::const_iterator pp::include_paths_end() const
-{
- return include_paths.end();
-}
-
-inline void pp::push_include_path(std::string const &__path)
-{
- if (__path.empty() || __path [__path.size() - 1] != PATH_SEPARATOR) {
- std::string __tmp(__path);
- __tmp += PATH_SEPARATOR;
- include_paths.push_back(__tmp);
- }
-
- else
- include_paths.push_back(__path);
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_define(_InputIterator __first, _InputIterator __last)
-{
- pp_macro macro;
-#if defined (PP_WITH_MACRO_POSITION)
- macro.file = pp_symbol::get(env.current_file);
-#endif
- std::string definition;
-
- __first = skip_blanks(__first, __last);
- _InputIterator end_macro_name = skip_identifier(__first, __last);
- pp_fast_string const *macro_name = pp_symbol::get(__first, end_macro_name);
- __first = end_macro_name;
-
- if (__first != __last && *__first == '(') {
- macro.function_like = true;
- macro.formals.reserve(5);
-
- __first = skip_blanks(++__first, __last); // skip '('
- _InputIterator arg_end = skip_identifier(__first, __last);
- if (__first != arg_end)
- macro.formals.push_back(pp_symbol::get(__first, arg_end));
-
- __first = skip_blanks(arg_end, __last);
-
- if (*__first == '.') {
- macro.variadics = true;
- while (*__first == '.')
- ++__first;
- }
-
- while (__first != __last && *__first == ',') {
- __first = skip_blanks(++__first, __last);
-
- arg_end = skip_identifier(__first, __last);
- if (__first != arg_end)
- macro.formals.push_back(pp_symbol::get(__first, arg_end));
-
- __first = skip_blanks(arg_end, __last);
-
- if (*__first == '.') {
- macro.variadics = true;
- while (*__first == '.')
- ++__first;
- }
- }
-
- assert(*__first == ')');
- ++__first;
- }
-
- __first = skip_blanks(__first, __last);
-
- /* Note: Sometimes one can include a path between brackets (for
- * e.g., when defining a macro or so) so that we cannot simply
- * ignore that. The in_path variable will handle this situation.
- */
- bool in_path = false;
- while (__first != __last && *__first != '\n') {
- if ((*__first == '<' || *__first == '"') &&
- (*(__first + 1) != '*' && *(__first + 1) != '/')) {
- in_path = true;
- goto skip_path;
- }
-
- if (in_path) {
- if (*__first == '>' || *__first == '"') {
- in_path = false;
- goto skip_path;
- } else if (*__first == ',' || *__first == ' ' || *__first == '\\') {
- in_path = false;
- continue;
- }
- }
-
- if (*__first == '/') {
- if (*(__first + 1) != '*' && *(__first + 1) != '/') {
- in_path = true;
- goto skip_path;
- } else {
- __first = skip_comment_or_divop(__first, __last);
- env.current_line += skip_comment_or_divop.lines;
- if (__first == __last)
- break;
- }
- }
-
- if (*__first == '\\') {
- _InputIterator __begin = __first;
- __begin = skip_blanks(++__begin, __last);
-
- if (__begin != __last && *__begin == '\n') {
- ++macro.lines;
- __first = skip_blanks(++__begin, __last);
- definition += ' ';
- continue;
- }
- }
-
-skip_path:
- definition += *__first++;
- }
-
- macro.definition = pp_symbol::get(definition);
- env.bind(macro_name, macro);
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::skip(_InputIterator __first, _InputIterator __last)
-{
- pp_skip_string_literal skip_string_literal;
- pp_skip_char_literal skip_char_literal;
-
- while (__first != __last && *__first != '\n') {
- if (*__first == '/') {
- __first = skip_comment_or_divop(__first, __last);
- env.current_line += skip_comment_or_divop.lines;
- } else if (*__first == '"') {
- __first = skip_string_literal(__first, __last);
- env.current_line += skip_string_literal.lines;
- } else if (*__first == '\'') {
- __first = skip_char_literal(__first, __last);
- env.current_line += skip_char_literal.lines;
- } else if (*__first == '\\') {
- __first = skip_blanks(++__first, __last);
- env.current_line += skip_blanks.lines;
-
- if (__first != __last && *__first == '\n') {
- ++__first;
- ++env.current_line;
- }
- } else
- ++__first;
- }
-
- return __first;
-}
-
-inline bool pp::test_if_level()
-{
- bool result = !_M_skipping[iflevel++];
- _M_skipping[iflevel] = _M_skipping[iflevel - 1];
- _M_true_test[iflevel] = false;
- return result;
-}
-
-inline int pp::skipping() const
-{
- return _M_skipping[iflevel];
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_primary(_InputIterator __first, _InputIterator __last, Value *result)
-{
- bool expect_paren = false;
- int token;
- __first = next_token(__first, __last, &token);
-
- switch (token) {
- case TOKEN_NUMBER:
- result->set_long(token_value);
- break;
-
- case TOKEN_UNUMBER:
- result->set_ulong(token_uvalue);
- break;
-
- case TOKEN_DEFINED:
- __first = next_token(__first, __last, &token);
-
- if (token == '(') {
- expect_paren = true;
- __first = next_token(__first, __last, &token);
- }
-
- if (token != TOKEN_IDENTIFIER) {
- std::cerr << "** WARNING expected ``identifier'' found:" << char(token) << std::endl;
- result->set_long(0);
- break;
- }
-
- result->set_long(env.resolve(token_text->c_str(), token_text->size()) != 0);
-
- next_token(__first, __last, &token); // skip '('
-
- if (expect_paren) {
- _InputIterator next = next_token(__first, __last, &token);
- if (token != ')')
- std::cerr << "** WARNING expected ``)''" << std::endl;
- else
- __first = next;
- }
- break;
-
- case TOKEN_IDENTIFIER:
- result->set_long(0);
- break;
-
- case '-':
- __first = eval_primary(__first, __last, result);
- result->set_long(- result->l);
- return __first;
-
- case '+':
- __first = eval_primary(__first, __last, result);
- return __first;
-
- case '!':
- __first = eval_primary(__first, __last, result);
- result->set_long(result->is_zero());
- return __first;
-
- case '(':
- __first = eval_constant_expression(__first, __last, result);
- next_token(__first, __last, &token);
-
- if (token != ')') {
- std::cerr << "** WARNING expected ``)'' = " << token << " (at "
- << env.current_file << ":" << env.current_line
- << ")." << std::endl;
- } else {
- __first = next_token(__first, __last, &token);
- }
- break;
-
- default:
- result->set_long(0);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_multiplicative(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_primary(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == '*' || token == '/' || token == '%') {
- Value value;
- __first = eval_primary(next, __last, &value);
-
- if (token == '*')
- result->op_mult(value);
- else if (token == '/') {
- if (value.is_zero()) {
- std::cerr << "** WARNING division by zero" << std::endl;
- result->set_long(0);
- } else
- result->op_div(value);
- } else {
- if (value.is_zero()) {
- std::cerr << "** WARNING division by zero" << std::endl;
- result->set_long(0);
- } else
- result->op_mod(value);
- }
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_additive(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_multiplicative(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == '+' || token == '-') {
- Value value;
- __first = eval_multiplicative(next, __last, &value);
-
- if (token == '+')
- result->op_add(value);
- else
- result->op_sub(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_shift(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_additive(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == TOKEN_LT_LT || token == TOKEN_GT_GT) {
- Value value;
- __first = eval_additive(next, __last, &value);
-
- if (token == TOKEN_LT_LT)
- result->op_lhs(value);
- else
- result->op_rhs(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_relational(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_shift(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == '<'
- || token == '>'
- || token == TOKEN_LT_EQ
- || token == TOKEN_GT_EQ) {
- Value value;
- __first = eval_shift(next, __last, &value);
-
- switch (token) {
- default:
- assert(0);
- break;
-
- case '<':
- result->op_lt(value);
- break;
-
- case '>':
- result->op_gt(value);
- break;
-
- case TOKEN_LT_EQ:
- result->op_le(value);
- break;
-
- case TOKEN_GT_EQ:
- result->op_ge(value);
- break;
- }
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_equality(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_relational(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == TOKEN_EQ_EQ || token == TOKEN_NOT_EQ) {
- Value value;
- __first = eval_relational(next, __last, &value);
-
- if (token == TOKEN_EQ_EQ)
- result->op_eq(value);
- else
- result->op_ne(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_and(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_equality(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == '&') {
- Value value;
- __first = eval_equality(next, __last, &value);
- result->op_bit_and(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_xor(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_and(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == '^') {
- Value value;
- __first = eval_and(next, __last, &value);
- result->op_bit_xor(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_or(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_xor(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == '|') {
- Value value;
- __first = eval_xor(next, __last, &value);
- result->op_bit_or(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_logical_and(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_or(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == TOKEN_AND_AND) {
- Value value;
- __first = eval_or(next, __last, &value);
- result->op_and(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_logical_or(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_logical_and(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- while (token == TOKEN_OR_OR) {
- Value value;
- __first = eval_logical_and(next, __last, &value);
- result->op_or(value);
- next = next_token(__first, __last, &token);
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_constant_expression(_InputIterator __first, _InputIterator __last, Value *result)
-{
- __first = eval_logical_or(__first, __last, result);
-
- int token;
- _InputIterator next = next_token(__first, __last, &token);
-
- if (token == '?') {
- Value left_value;
- __first = eval_constant_expression(next, __last, &left_value);
- __first = skip_blanks(__first, __last);
-
- __first = next_token(__first, __last, &token);
- if (token == ':') {
- Value right_value;
- __first = eval_constant_expression(__first, __last, &right_value);
-
- *result = !result->is_zero() ? left_value : right_value;
- } else {
- std::cerr << "** WARNING expected ``:'' = " << int (token) << std::endl;
- *result = left_value;
- }
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::eval_expression(_InputIterator __first, _InputIterator __last, Value *result)
-{
- return __first = eval_constant_expression(skip_blanks(__first, __last), __last, result);
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_if(_InputIterator __first, _InputIterator __last)
-{
- if (test_if_level()) {
- pp_macro_expander expand_condition(env);
- std::string condition;
- condition.reserve(255);
- expand_condition(skip_blanks(__first, __last), __last, std::back_inserter(condition));
-
- Value result;
- result.set_long(0);
- eval_expression(condition.c_str(), condition.c_str() + condition.size(), &result);
-
- _M_true_test[iflevel] = !result.is_zero();
- _M_skipping[iflevel] = result.is_zero();
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_else(_InputIterator __first, _InputIterator /*__last*/)
-{
- if (iflevel == 0 && !skipping()) {
- std::cerr << "** WARNING #else without #if" << std::endl;
- } else if (iflevel > 0 && _M_skipping[iflevel - 1]) {
- _M_skipping[iflevel] = true;
- } else {
- _M_skipping[iflevel] = _M_true_test[iflevel];
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_elif(_InputIterator __first, _InputIterator __last)
-{
- assert(iflevel > 0);
-
- if (iflevel == 0 && !skipping()) {
- std::cerr << "** WARNING #else without #if" << std::endl;
- } else if (!_M_true_test[iflevel] && !_M_skipping[iflevel - 1]) {
- Value result;
- __first = eval_expression(__first, __last, &result);
- _M_true_test[iflevel] = !result.is_zero();
- _M_skipping[iflevel] = result.is_zero();
- } else {
- _M_skipping[iflevel] = true;
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_endif(_InputIterator __first, _InputIterator /*__last*/)
-{
- if (iflevel == 0 && !skipping()) {
- std::cerr << "** WARNING #endif without #if" << std::endl;
- } else {
- _M_skipping[iflevel] = 0;
- _M_true_test[iflevel] = 0;
-
- --iflevel;
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_ifdef(bool check_undefined, _InputIterator __first, _InputIterator __last)
-{
- if (test_if_level()) {
- _InputIterator end_macro_name = skip_identifier(__first, __last);
-
- std::size_t __size;
-#if defined(__SUNPRO_CC)
- std::distance(__first, end_macro_name, __size);
-#else
- __size = std::distance(__first, end_macro_name);
-#endif
- assert(__size < 256);
-
- char __buffer [256];
- std::copy(__first, end_macro_name, __buffer);
-
- bool value = env.resolve(__buffer, __size) != 0;
-
- __first = end_macro_name;
-
- if (check_undefined)
- value = !value;
-
- _M_true_test[iflevel] = value;
- _M_skipping[iflevel] = !value;
- }
-
- return __first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::handle_undef(_InputIterator __first, _InputIterator __last)
-{
- __first = skip_blanks(__first, __last);
- _InputIterator end_macro_name = skip_identifier(__first, __last);
- assert(end_macro_name != __first);
-
- std::size_t __size;
-#if defined(__SUNPRO_CC)
- std::distance(__first, end_macro_name, __size);
-#else
- __size = std::distance(__first, end_macro_name);
-#endif
-
- assert(__size < 256);
-
- char __buffer [256];
- std::copy(__first, end_macro_name, __buffer);
-
- pp_fast_string const __tmp(__buffer, __size);
- env.unbind(&__tmp);
-
- __first = end_macro_name;
-
- return __first;
-}
-
-template <typename _InputIterator>
-char pp::peek_char(_InputIterator __first, _InputIterator __last)
-{
- if (__first == __last)
- return 0;
-
- return *++__first;
-}
-
-template <typename _InputIterator>
-_InputIterator pp::next_token(_InputIterator __first, _InputIterator __last, int *kind)
-{
- __first = skip_blanks(__first, __last);
-
- if (__first == __last) {
- *kind = 0;
- return __first;
- }
-
- char ch = *__first;
- char ch2 = peek_char(__first, __last);
-
- switch (ch) {
- case '/':
- if (ch2 == '/' || ch2 == '*') {
- __first = skip_comment_or_divop(__first, __last);
- return next_token(__first, __last, kind);
- }
- ++__first;
- *kind = '/';
- break;
-
- case '<':
- ++__first;
- if (ch2 == '<') {
- ++__first;
- *kind = TOKEN_LT_LT;
- } else if (ch2 == '=') {
- ++__first;
- *kind = TOKEN_LT_EQ;
- } else
- *kind = '<';
-
- return __first;
-
- case '>':
- ++__first;
- if (ch2 == '>') {
- ++__first;
- *kind = TOKEN_GT_GT;
- } else if (ch2 == '=') {
- ++__first;
- *kind = TOKEN_GT_EQ;
- } else
- *kind = '>';
-
- return __first;
-
- case '!':
- ++__first;
- if (ch2 == '=') {
- ++__first;
- *kind = TOKEN_NOT_EQ;
- } else
- *kind = '!';
-
- return __first;
-
- case '=':
- ++__first;
- if (ch2 == '=') {
- ++__first;
- *kind = TOKEN_EQ_EQ;
- } else
- *kind = '=';
-
- return __first;
-
- case '|':
- ++__first;
- if (ch2 == '|') {
- ++__first;
- *kind = TOKEN_OR_OR;
- } else
- *kind = '|';
-
- return __first;
-
- case '&':
- ++__first;
- if (ch2 == '&') {
- ++__first;
- *kind = TOKEN_AND_AND;
- } else
- *kind = '&';
-
- return __first;
-
- default:
- if (pp_isalpha(ch) || ch == '_') {
- _InputIterator end = skip_identifier(__first, __last);
- _M_current_text.assign(__first, end);
-
- token_text = &_M_current_text;
- __first = end;
-
- if (*token_text == "defined")
- *kind = TOKEN_DEFINED;
- else
- *kind = TOKEN_IDENTIFIER;
- } else if (pp_isdigit(ch)) {
- _InputIterator end = skip_number(__first, __last);
- std::string __str(__first, __last);
- char ch = __str [__str.size() - 1];
- if (ch == 'u' || ch == 'U') {
- token_uvalue = strtoul(__str.c_str(), 0, 0);
- *kind = TOKEN_UNUMBER;
- } else {
- token_value = strtol(__str.c_str(), 0, 0);
- *kind = TOKEN_NUMBER;
- }
- __first = end;
- } else
- *kind = *__first++;
- }
-
- return __first;
-}
-
-} // namespace rpp
-
-#endif // PP_ENGINE_BITS_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-engine.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-engine.h
deleted file mode 100644
index 689d7720e..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-engine.h
+++ /dev/null
@@ -1,288 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_ENGINE_H
-#define PP_ENGINE_H
-
-#include <string>
-#include <vector>
-#include "pp-scanner.h"
-#include "pp-macro-expander.h"
-#include "pp-environment.h"
-
-namespace rpp
-{
-
-struct Value {
- Value() : kind(Kind_Long), l(0) {}
-
- enum Kind {
- Kind_Long,
- Kind_ULong,
- };
-
- Kind kind;
-
- union {
- long l;
- unsigned long ul;
- };
-
- inline bool is_ulong() const {
- return kind == Kind_ULong;
- }
-
- inline void set_ulong(unsigned long v) {
- ul = v;
- kind = Kind_ULong;
- }
-
- inline void set_long(long v) {
- l = v;
- kind = Kind_Long;
- }
-
- inline bool is_zero() const {
- return l == 0;
- }
-
-#define PP_DEFINE_BIN_OP(name, op) \
- inline Value &name (const Value &other) \
- { \
- if (is_ulong () || other.is_ulong ()) \
- set_ulong (ul op other.ul); \
- else \
- set_long (l op other.l); \
- return *this; \
- }
-
- PP_DEFINE_BIN_OP(op_add, +)
- PP_DEFINE_BIN_OP(op_sub, -)
- PP_DEFINE_BIN_OP(op_mult, *)
- PP_DEFINE_BIN_OP(op_div, /)
- PP_DEFINE_BIN_OP(op_mod, %)
- PP_DEFINE_BIN_OP(op_lhs, <<)
- PP_DEFINE_BIN_OP(op_rhs, >>)
- PP_DEFINE_BIN_OP(op_lt, <)
- PP_DEFINE_BIN_OP(op_gt, >)
- PP_DEFINE_BIN_OP(op_le, <=)
- PP_DEFINE_BIN_OP(op_ge, >=)
- PP_DEFINE_BIN_OP(op_eq, ==)
- PP_DEFINE_BIN_OP(op_ne, !=)
- PP_DEFINE_BIN_OP(op_bit_and, &)
- PP_DEFINE_BIN_OP(op_bit_or, |)
- PP_DEFINE_BIN_OP(op_bit_xor, ^)
- PP_DEFINE_BIN_OP(op_and, &&)
- PP_DEFINE_BIN_OP(op_or, ||)
-
-#undef PP_DEFINE_BIN_OP
-};
-
-class pp
-{
- pp_environment &env;
- pp_macro_expander expand;
- pp_skip_identifier skip_identifier;
- pp_skip_comment_or_divop skip_comment_or_divop;
- pp_skip_blanks skip_blanks;
- pp_skip_number skip_number;
- std::vector<std::string> include_paths;
- std::string _M_current_text;
-
- enum { MAX_LEVEL = 512 };
- int _M_skipping[MAX_LEVEL];
- int _M_true_test[MAX_LEVEL];
- int iflevel;
-
- union {
- long token_value;
- unsigned long token_uvalue;
- std::string *token_text;
- };
-
- enum INCLUDE_POLICY {
- INCLUDE_GLOBAL,
- INCLUDE_LOCAL
- };
-
- enum TOKEN_TYPE {
- TOKEN_NUMBER = 1000,
- TOKEN_UNUMBER,
- TOKEN_IDENTIFIER,
- TOKEN_DEFINED,
- TOKEN_LT_LT,
- TOKEN_LT_EQ,
- TOKEN_GT_GT,
- TOKEN_GT_EQ,
- TOKEN_EQ_EQ,
- TOKEN_NOT_EQ,
- TOKEN_OR_OR,
- TOKEN_AND_AND,
- };
-
- enum PP_DIRECTIVE_TYPE {
- PP_UNKNOWN_DIRECTIVE,
- PP_UNNAMED_DIRECTIVE,
- PP_DEFINE,
- PP_INCLUDE,
- PP_INCLUDE_NEXT,
- PP_ELIF,
- PP_ELSE,
- PP_ENDIF,
- PP_IF,
- PP_IFDEF,
- PP_IFNDEF,
- PP_UNDEF,
- PP_PRAGMA,
- PP_ERROR,
- PP_WARNING
- };
-
-public:
- pp(pp_environment &__env);
-
- inline std::back_insert_iterator<std::vector<std::string> > include_paths_inserter();
-
- inline void push_include_path(std::string const &__path);
-
- inline std::vector<std::string>::iterator include_paths_begin();
- inline std::vector<std::string>::iterator include_paths_end();
-
- inline std::vector<std::string>::const_iterator include_paths_begin() const;
- inline std::vector<std::string>::const_iterator include_paths_end() const;
-
- template <typename _InputIterator>
- inline _InputIterator eval_expression(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _OutputIterator>
- void file(std::string const &filename, _OutputIterator __result);
-
- template <typename _OutputIterator>
- void file(FILE *fp, _OutputIterator __result);
-
- template <typename _InputIterator, typename _OutputIterator>
- void operator()(_InputIterator __first, _InputIterator __last, _OutputIterator __result);
-
-private:
- inline bool file_isdir(std::string const &__filename) const;
- inline bool file_exists(std::string const &__filename) const;
- FILE *find_include_file(std::string const &__filename, std::string *__filepath,
- INCLUDE_POLICY __include_policy, bool __skip_current_path = false) const;
-
- inline int skipping() const;
- bool test_if_level();
-
- inline std::string fix_file_path(std::string const &filename) const;
- inline bool is_absolute(std::string const &filename) const;
-
- PP_DIRECTIVE_TYPE find_directive(char const *__directive, std::size_t __size) const;
-
- template <typename _InputIterator>
- bool find_header_protection(_InputIterator __first, _InputIterator __last, std::string *__prot);
-
- template <typename _InputIterator>
- _InputIterator skip(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator eval_primary(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_multiplicative(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_additive(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_shift(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_relational(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_equality(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_and(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_xor(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_or(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_logical_and(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_logical_or(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator>
- _InputIterator eval_constant_expression(_InputIterator __first, _InputIterator __last, Value *result);
-
- template <typename _InputIterator, typename _OutputIterator>
- _InputIterator handle_directive(char const *__directive, std::size_t __size,
- _InputIterator __first, _InputIterator __last, _OutputIterator __result);
-
- template <typename _InputIterator, typename _OutputIterator>
- _InputIterator handle_include(bool skip_current_path, _InputIterator __first, _InputIterator __last,
- _OutputIterator __result);
-
- template <typename _InputIterator>
- _InputIterator handle_define(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator handle_if(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator handle_else(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator handle_elif(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator handle_endif(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator handle_ifdef(bool check_undefined, _InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator handle_undef(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- inline char peek_char(_InputIterator __first, _InputIterator __last);
-
- template <typename _InputIterator>
- _InputIterator next_token(_InputIterator __first, _InputIterator __last, int *kind);
-};
-
-} // namespace rpp
-
-#endif // PP_ENGINE_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-environment.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-environment.h
deleted file mode 100644
index 23f22e483..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-environment.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_ENVIRONMENT_H
-#define PP_ENVIRONMENT_H
-
-#include <vector>
-#include <string>
-#include <cstring>
-#include "pp-macro.h"
-
-namespace rpp
-{
-
-class pp_environment
-{
-public:
- typedef std::vector<pp_macro*>::const_iterator const_iterator;
-
-public:
- pp_environment():
- current_line(0),
- _M_hash_size(4093) {
- _M_base = (pp_macro **) memset(new pp_macro* [_M_hash_size], 0, _M_hash_size * sizeof(pp_macro*));
- }
-
- ~pp_environment() {
- for (std::size_t i = 0; i < _M_macros.size(); ++i)
- delete _M_macros [i];
-
- delete [] _M_base;
- }
-
- const_iterator first_macro() const {
- return _M_macros.begin();
- }
- const_iterator last_macro() const {
- return _M_macros.end();
- }
-
- inline void bind(pp_fast_string const *__name, pp_macro const &__macro) {
- std::size_t h = hash_code(*__name) % _M_hash_size;
- pp_macro *m = new pp_macro(__macro);
- m->name = __name;
- m->next = _M_base [h];
- m->hash_code = h;
- _M_base [h] = m;
-
- _M_macros.push_back(m);
-
- if (_M_macros.size() == _M_hash_size)
- rehash();
- }
-
- inline void unbind(pp_fast_string const *__name) {
- if (pp_macro *m = resolve(__name))
- m->hidden = true;
- }
-
- inline void unbind(char const *__s, std::size_t __size) {
- pp_fast_string __tmp(__s, __size);
- unbind(&__tmp);
- }
-
- inline pp_macro *resolve(pp_fast_string const *__name) const {
- std::size_t h = hash_code(*__name) % _M_hash_size;
- pp_macro *it = _M_base [h];
-
- while (it && it->name && it->hash_code == h && (*it->name != *__name || it->hidden))
- it = it->next;
-
- return it;
- }
-
- inline pp_macro *resolve(char const *__data, std::size_t __size) const {
- pp_fast_string const __tmp(__data, __size);
- return resolve(&__tmp);
- }
-
- std::string current_file;
- int current_line;
-
-private:
- inline std::size_t hash_code(pp_fast_string const &s) const {
- std::size_t hash_value = 0;
-
- for (std::size_t i = 0; i < s.size(); ++i)
- hash_value = (hash_value << 5) - hash_value + s.at(i);
-
- return hash_value;
- }
-
- void rehash() {
- delete[] _M_base;
-
- _M_hash_size <<= 1;
-
- _M_base = (pp_macro **) memset(new pp_macro* [_M_hash_size], 0, _M_hash_size * sizeof(pp_macro*));
- for (std::size_t index = 0; index < _M_macros.size(); ++index) {
- pp_macro *elt = _M_macros [index];
- std::size_t h = hash_code(*elt->name) % _M_hash_size;
- elt->next = _M_base [h];
- elt->hash_code = h;
- _M_base [h] = elt;
- }
- }
-
-private:
- std::vector<pp_macro*> _M_macros;
- pp_macro **_M_base;
- std::size_t _M_hash_size;
-};
-
-} // namespace rpp
-
-#endif // PP_ENVIRONMENT_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-fwd.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-fwd.h
deleted file mode 100644
index 2814b6d44..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-fwd.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_FWD_H
-#define PP_FWD_H
-
-namespace rpp
-{
-
-template <typename _CharT> class pp_string;
-
-typedef pp_string<char> pp_fast_string;
-
-} // namespace rpp
-
-#endif // PP_FWD_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-internal.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-internal.h
deleted file mode 100644
index 33efa0c27..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-internal.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_INTERNAL_H
-#define PP_INTERNAL_H
-
-#include <algorithm>
-#include <string>
-#include "pp.h"
-
-namespace rpp
-{
-
-namespace _PP_internal
-{
-
-inline void extract_file_path(const std::string &__filename, std::string *__filepath)
-{
- std::size_t __index = __filename.rfind(PATH_SEPARATOR);
-
- if (__index == std::string::npos)
- *__filepath = "/";
-
- else
- __filepath->assign(__filename, 0, __index + 1);
-}
-
-template <typename _OutputIterator>
-void output_line(const std::string &__filename, int __line, _OutputIterator __result)
-{
- std::string __msg;
-
- __msg += "# ";
-
- char __line_descr[16];
- pp_snprintf(__line_descr, 16, "%d", __line);
- __msg += __line_descr;
-
- __msg += " \"";
-
- if (__filename.empty())
- __msg += "<internal>";
- else
- __msg += __filename;
-
- __msg += "\"\n";
- std::copy(__msg.begin(), __msg.end(), __result);
-}
-
-template <typename _InputIterator>
-inline bool comment_p(_InputIterator __first, _InputIterator __last) /*const*/
-{
- if (__first == __last)
- return false;
-
- if (*__first != '/')
- return false;
-
- if (++__first == __last)
- return false;
-
- return (*__first == '/' || *__first == '*');
-}
-
-struct _Compare_string: public std::binary_function<bool, pp_fast_string const *, pp_fast_string const *> {
- inline bool operator()(pp_fast_string const *__lhs, pp_fast_string const *__rhs) const {
- return *__lhs < *__rhs;
- }
-};
-
-struct _Equal_to_string: public std::binary_function<bool, pp_fast_string const *, pp_fast_string const *> {
- inline bool operator()(pp_fast_string const *__lhs, pp_fast_string const *__rhs) const {
- return *__lhs == *__rhs;
- }
-};
-
-struct _Hash_string: public std::unary_function<std::size_t, pp_fast_string const *> {
- inline std::size_t operator()(pp_fast_string const *__s) const {
- char const *__ptr = __s->begin();
- std::size_t __size = __s->size();
- std::size_t __h = 0;
-
- for (std::size_t i = 0; i < __size; ++i)
- __h = (__h << 5) - __h + __ptr [i];
-
- return __h;
- }
-};
-
-} // _PP_internal
-
-} // namespace rpp
-
-#endif // PP_INTERNAL_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-iterator.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-iterator.h
deleted file mode 100644
index 35964fea4..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-iterator.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_ITERATOR_H
-#define PP_ITERATOR_H
-
-#include <iterator>
-
-namespace rpp
-{
-
-class pp_null_output_iterator
- : public std::iterator<std::output_iterator_tag, void, void, void, void>
-{
-public:
- pp_null_output_iterator() {}
-
- template <typename _Tp>
- pp_null_output_iterator &operator=(_Tp const &) {
- return *this;
- }
-
- inline pp_null_output_iterator &operator *() {
- return *this;
- }
- inline pp_null_output_iterator &operator ++ () {
- return *this;
- }
- inline pp_null_output_iterator operator ++ (int) {
- return *this;
- }
-};
-
-template <typename _Container>
-class pp_output_iterator
- : public std::iterator<std::output_iterator_tag, void, void, void, void>
-{
- std::string &_M_result;
-
-public:
- explicit pp_output_iterator(std::string &__result):
- _M_result(__result) {}
-
- inline pp_output_iterator<_Container>& operator=(const pp_output_iterator<_Container>& other)
- {
- _M_result = other._M_result;
- return *this;
- }
-
- inline pp_output_iterator &operator=(typename _Container::const_reference __v) {
- if (_M_result.capacity() == _M_result.size())
- _M_result.reserve(_M_result.capacity() << 2);
-
- _M_result.push_back(__v);
- return *this;
- }
-
- inline pp_output_iterator &operator *() {
- return *this;
- }
- inline pp_output_iterator &operator ++ () {
- return *this;
- }
- inline pp_output_iterator operator ++ (int) {
- return *this;
- }
-};
-
-} // namespace rpp
-
-#endif // PP_ITERATOR_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-macro-expander.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-macro-expander.h
deleted file mode 100644
index db93c3214..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-macro-expander.h
+++ /dev/null
@@ -1,356 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_MACRO_EXPANDER_H
-#define PP_MACRO_EXPANDER_H
-
-namespace rpp
-{
-
-struct pp_frame {
- pp_macro *expanding_macro;
- std::vector<std::string> *actuals;
-
- pp_frame(pp_macro *__expanding_macro, std::vector<std::string> *__actuals):
- expanding_macro(__expanding_macro), actuals(__actuals) {}
-};
-
-class pp_macro_expander
-{
- pp_environment &env;
- pp_frame *frame;
-
- pp_skip_number skip_number;
- pp_skip_identifier skip_identifier;
- pp_skip_string_literal skip_string_literal;
- pp_skip_char_literal skip_char_literal;
- pp_skip_argument skip_argument;
- pp_skip_comment_or_divop skip_comment_or_divop;
- pp_skip_blanks skip_blanks;
- pp_skip_whitespaces skip_whitespaces;
-
- std::string const *resolve_formal(pp_fast_string const *__name) {
- assert(__name != 0);
-
- if (! frame)
- return 0;
-
- assert(frame->expanding_macro != 0);
-
- std::vector<pp_fast_string const *> const formals = frame->expanding_macro->formals;
- for (std::size_t index = 0; index < formals.size(); ++index) {
- pp_fast_string const *formal = formals[index];
-
- if (*formal != *__name)
- continue;
-
- else if (frame->actuals && index < frame->actuals->size())
- return &(*frame->actuals)[index];
-
- else
- assert(0); // internal error?
- }
-
- return 0;
- }
-
-public: // attributes
- int lines;
- int generated_lines;
-
-public:
- pp_macro_expander(pp_environment &__env, pp_frame *__frame = 0):
- env(__env), frame(__frame), lines(0), generated_lines(0) {}
-
- template <typename _InputIterator, typename _OutputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last, _OutputIterator __result) {
- generated_lines = 0;
- __first = skip_blanks(__first, __last);
- lines = skip_blanks.lines;
-
- while (__first != __last) {
- if (*__first == '\n') {
- *__result++ = *__first;
- ++lines;
-
- __first = skip_blanks(++__first, __last);
- lines += skip_blanks.lines;
-
- if (__first != __last && *__first == '#')
- break;
- } else if (*__first == '#') {
- __first = skip_blanks(++__first, __last);
- lines += skip_blanks.lines;
-
- _InputIterator end_id = skip_identifier(__first, __last);
-
- // ### rewrite: not safe
- char name_buffer[512], *cp = name_buffer;
- std::copy(__first, end_id, cp);
- std::size_t name_size = end_id - __first;
- name_buffer[name_size] = '\0';
-
- pp_fast_string fast_name(name_buffer, name_size);
-
- if (std::string const *actual = resolve_formal(&fast_name)) {
- *__result++ = '\"';
-
- for (std::string::const_iterator it = skip_whitespaces(actual->begin(), actual->end());
- it != actual->end(); ++it) {
- if (*it == '"') {
- *__result++ = '\\';
- *__result++ = *it;
- }
-
- else if (*it == '\n') {
- *__result++ = '"';
- *__result++ = '\n';
- *__result++ = '"';
- }
-
- else
- *__result++ = *it;
- }
-
- *__result++ = '\"';
- __first = end_id;
- } else
- *__result++ = '#'; // ### warning message?
- } else if (*__first == '\"') {
- _InputIterator next_pos = skip_string_literal(__first, __last);
- lines += skip_string_literal.lines;
- std::copy(__first, next_pos, __result);
- __first = next_pos;
- } else if (*__first == '\'') {
- _InputIterator next_pos = skip_char_literal(__first, __last);
- lines += skip_char_literal.lines;
- std::copy(__first, next_pos, __result);
- __first = next_pos;
- } else if (_PP_internal::comment_p(__first, __last)) {
- __first = skip_comment_or_divop(__first, __last);
- int n = skip_comment_or_divop.lines;
- lines += n;
-
- while (n-- > 0)
- *__result++ = '\n';
- } else if (pp_isspace(*__first)) {
- for (; __first != __last; ++__first) {
- if (*__first == '\n' || !pp_isspace(*__first))
- break;
- }
-
- *__result = ' ';
- } else if (pp_isdigit(*__first)) {
- _InputIterator next_pos = skip_number(__first, __last);
- lines += skip_number.lines;
- std::copy(__first, next_pos, __result);
- __first = next_pos;
- } else if (pp_isalpha(*__first) || *__first == '_') {
- _InputIterator name_begin = __first;
- _InputIterator name_end = skip_identifier(__first, __last);
- __first = name_end; // advance
-
- // search for the paste token
- _InputIterator next = skip_blanks(__first, __last);
- if (next != __last && *next == '#') {
- ++next;
- if (next != __last && *next == '#')
- __first = skip_blanks(++next, __last);
- }
-
- // ### rewrite: not safe
-
- std::ptrdiff_t name_size;
-#if defined(__SUNPRO_CC)
- std::distance(name_begin, name_end, name_size);
-#else
- name_size = std::distance(name_begin, name_end);
-#endif
- assert(name_size >= 0 && name_size < 512);
-
- char name_buffer[512], *cp = name_buffer;
- std::size_t __size = name_end - name_begin;
- std::copy(name_begin, name_end, cp);
- name_buffer[__size] = '\0';
-
- pp_fast_string fast_name(name_buffer, name_size);
-
- if (std::string const *actual = resolve_formal(&fast_name)) {
- std::copy(actual->begin(), actual->end(), __result);
- continue;
- }
-
- static bool hide_next = false; // ### remove me
-
- pp_macro *macro = env.resolve(name_buffer, name_size);
- if (! macro || macro->hidden || hide_next) {
- hide_next = ! strcmp(name_buffer, "defined");
-
- if (__size == 8 && name_buffer [0] == '_' && name_buffer [1] == '_') {
- if (! strcmp(name_buffer, "__LINE__")) {
- char buf [16];
- char *end = buf + pp_snprintf(buf, 16, "%d", env.current_line + lines);
-
- std::copy(&buf [0], end, __result);
- continue;
- }
-
- else if (! strcmp(name_buffer, "__FILE__")) {
- __result++ = '"';
- std::copy(env.current_file.begin(), env.current_file.end(), __result); // ### quote
- __result++ = '"';
- continue;
- }
- }
-
- std::copy(name_begin, name_end, __result);
- continue;
- }
-
- if (! macro->function_like) {
- pp_macro *m = 0;
-
- if (macro->definition) {
- macro->hidden = true;
-
- std::string __tmp;
- __tmp.reserve(256);
-
- pp_macro_expander expand_macro(env);
- expand_macro(macro->definition->begin(), macro->definition->end(), std::back_inserter(__tmp));
- generated_lines += expand_macro.lines;
-
- if (! __tmp.empty()) {
- std::string::iterator __begin_id = skip_whitespaces(__tmp.begin(), __tmp.end());
- std::string::iterator __end_id = skip_identifier(__begin_id, __tmp.end());
-
- if (__end_id == __tmp.end()) {
- std::string __id;
- __id.assign(__begin_id, __end_id);
-
- std::size_t x;
-#if defined(__SUNPRO_CC)
- std::distance(__begin_id, __end_id, x);
-#else
- x = std::distance(__begin_id, __end_id);
-#endif
- m = env.resolve(__id.c_str(), x);
- }
-
- if (! m)
- std::copy(__tmp.begin(), __tmp.end(), __result);
- }
-
- macro->hidden = false;
- }
-
- if (! m)
- continue;
-
- macro = m;
- }
-
- // function like macro
- _InputIterator arg_it = skip_whitespaces(__first, __last);
-
- if (arg_it == __last || *arg_it != '(') {
- std::copy(name_begin, name_end, __result);
- lines += skip_whitespaces.lines;
- __first = arg_it;
- continue;
- }
-
- std::vector<std::string> actuals;
- actuals.reserve(5);
- ++arg_it; // skip '('
-
- pp_macro_expander expand_actual(env, frame);
-
- _InputIterator arg_end = skip_argument_variadics(actuals, macro, arg_it, __last);
- if (arg_it != arg_end) {
- std::string actual(arg_it, arg_end);
- actuals.resize(actuals.size() + 1);
- actuals.back().reserve(255);
- expand_actual(actual.begin(), actual.end(), std::back_inserter(actuals.back()));
- arg_it = arg_end;
- }
-
- while (arg_it != __last && *arg_end == ',') {
- ++arg_it; // skip ','
-
- arg_end = skip_argument_variadics(actuals, macro, arg_it, __last);
- std::string actual(arg_it, arg_end);
- actuals.resize(actuals.size() + 1);
- actuals.back().reserve(255);
- expand_actual(actual.begin(), actual.end(), std::back_inserter(actuals.back()));
- arg_it = arg_end;
- }
-
- assert(arg_it != __last && *arg_it == ')');
-
- ++arg_it; // skip ')'
- __first = arg_it;
-
-#if 0 // ### enable me
- assert((macro->variadics && macro->formals.size() >= actuals.size())
- || macro->formals.size() == actuals.size());
-#endif
-
- pp_frame frame(macro, &actuals);
- pp_macro_expander expand_macro(env, &frame);
- macro->hidden = true;
- expand_macro(macro->definition->begin(), macro->definition->end(), __result);
- macro->hidden = false;
- generated_lines += expand_macro.lines;
- } else
- *__result++ = *__first++;
- }
-
- return __first;
- }
-
- template <typename _InputIterator>
- _InputIterator skip_argument_variadics(std::vector<std::string> const &__actuals, pp_macro *__macro,
- _InputIterator __first, _InputIterator __last) {
- _InputIterator arg_end = skip_argument(__first, __last);
-
- while (__macro->variadics && __first != arg_end && arg_end != __last && *arg_end == ','
- && (__actuals.size() + 1) == __macro->formals.size()) {
- arg_end = skip_argument(++arg_end, __last);
- }
-
- return arg_end;
- }
-};
-
-} // namespace rpp
-
-#endif // PP_MACRO_EXPANDER_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-macro.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-macro.h
deleted file mode 100644
index 9e95840a1..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-macro.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_MACRO_H
-#define PP_MACRO_H
-
-#include <vector>
-#include "pp-fwd.h"
-
-namespace rpp
-{
-
-struct pp_macro {
-#if defined (PP_WITH_MACRO_POSITION)
- pp_fast_string const *file;
-#endif
- pp_fast_string const *name;
- pp_fast_string const *definition;
- std::vector<pp_fast_string const *> formals;
-
- union {
- int unsigned state;
-
- struct {
- int unsigned hidden: 1;
- int unsigned function_like: 1;
- int unsigned variadics: 1;
- };
- };
-
- int lines;
- pp_macro *next;
- std::size_t hash_code;
-
- inline pp_macro():
-#if defined (PP_WITH_MACRO_POSITION)
- file(0),
-#endif
- name(0),
- definition(0),
- state(0),
- lines(0),
- next(0),
- hash_code(0) {}
-};
-
-} // namespace rpp
-
-#endif // PP_MACRO_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-qt-configuration b/sources/shiboken2/ApiExtractor/parser/rpp/pp-qt-configuration
deleted file mode 100644
index ba356c323..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-qt-configuration
+++ /dev/null
@@ -1,24 +0,0 @@
-#define __cplusplus 1
-
-#define __STDC__ 1
-
-// Qt
-#define QOBJECTDEFS_H
-
-// not yet supported
-#define Q_SLOTS slots
-#define Q_SIGNALS signals
-#define Q_FLAGS(a)
-#define Q_PRIVATE_SLOT(a, b)
-#define Q_DECLARE_INTERFACE(a,b)
-#define Q_INTERFACES(a)
-#define Q_GADGET
-#define Q_OVERRIDE(a)
-#define Q_OS_OS2
-#define Q_NO_USING_KEYWORD
-#define QT_NO_QOBJECT_CHECK
-#define QT_NO_MEMBER_TEMPLATES
-// There are symbols in Qt that exist in Debug but
-// not in release
-#define QT_NO_DEBUG
-
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-scanner.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-scanner.h
deleted file mode 100644
index 0c5007e0f..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-scanner.h
+++ /dev/null
@@ -1,318 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_SCANNER_H
-#define PP_SCANNER_H
-
-#include "pp-cctype.h"
-#include <cassert>
-
-namespace rpp
-{
-
-struct pp_skip_blanks {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- lines = 0;
-
- for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- if (*__first == '\\') {
- _InputIterator __begin = __first;
- ++__begin;
-
- if (__begin != __last && *__begin == '\n')
- ++__first;
- else
- break;
- } else if (*__first == '\n' || !pp_isspace(*__first))
- break;
- }
-
- return __first;
- }
-};
-
-struct pp_skip_whitespaces {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- lines = 0;
-
- for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- if (! pp_isspace(*__first))
- break;
- }
-
- return __first;
- }
-};
-
-struct pp_skip_comment_or_divop {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- enum {
- MAYBE_BEGIN,
- BEGIN,
- MAYBE_END,
- END,
- IN_COMMENT,
- IN_CXX_COMMENT
- } state(MAYBE_BEGIN);
-
- lines = 0;
-
- for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- switch (state) {
- default:
- assert(0);
- break;
-
- case MAYBE_BEGIN:
- if (*__first != '/')
- return __first;
-
- state = BEGIN;
- break;
-
- case BEGIN:
- if (*__first == '*')
- state = IN_COMMENT;
- else if (*__first == '/')
- state = IN_CXX_COMMENT;
- else
- return __first;
- break;
-
- case IN_COMMENT:
- if (*__first == '*')
- state = MAYBE_END;
- break;
-
- case IN_CXX_COMMENT:
- if (*__first == '\n')
- return __first;
- break;
-
- case MAYBE_END:
- if (*__first == '/')
- state = END;
- else if (*__first != '*')
- state = IN_COMMENT;
- break;
-
- case END:
- return __first;
- }
- }
-
- return __first;
- }
-};
-
-struct pp_skip_identifier {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- lines = 0;
-
- for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- if (! pp_isalnum(*__first) && *__first != '_')
- break;
- }
-
- return __first;
- }
-};
-
-struct pp_skip_number {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- lines = 0;
-
- for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- if (! pp_isalnum(*__first) && *__first != '.')
- break;
- }
-
- return __first;
- }
-};
-
-struct pp_skip_string_literal {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- enum {
- BEGIN,
- IN_STRING,
- QUOTE,
- END
- } state(BEGIN);
-
- lines = 0;
-
- for (; __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- switch (state) {
- default:
- assert(0);
- break;
-
- case BEGIN:
- if (*__first != '\"')
- return __first;
- state = IN_STRING;
- break;
-
- case IN_STRING:
- assert(*__first != '\n');
-
- if (*__first == '\"')
- state = END;
- else if (*__first == '\\')
- state = QUOTE;
- break;
-
- case QUOTE:
- state = IN_STRING;
- break;
-
- case END:
- return __first;
- }
- }
-
- return __first;
- }
-};
-
-struct pp_skip_char_literal {
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- enum {
- BEGIN,
- IN_STRING,
- QUOTE,
- END
- } state(BEGIN);
-
- lines = 0;
-
- for (; state != END && __first != __last; lines += (*__first != '\n' ? 0 : 1), ++__first) {
- switch (state) {
- default:
- assert(0);
- break;
-
- case BEGIN:
- if (*__first != '\'')
- return __first;
- state = IN_STRING;
- break;
-
- case IN_STRING:
- assert(*__first != '\n');
-
- if (*__first == '\'')
- state = END;
- else if (*__first == '\\')
- state = QUOTE;
- break;
-
- case QUOTE:
- state = IN_STRING;
- break;
- }
- }
-
- return __first;
- }
-};
-
-struct pp_skip_argument {
- pp_skip_identifier skip_number;
- pp_skip_identifier skip_identifier;
- pp_skip_string_literal skip_string_literal;
- pp_skip_char_literal skip_char_literal;
- pp_skip_comment_or_divop skip_comment_or_divop;
- int lines;
-
- template <typename _InputIterator>
- _InputIterator operator()(_InputIterator __first, _InputIterator __last) {
- int depth = 0;
- lines = 0;
-
- while (__first != __last) {
- if (!depth && (*__first == ')' || *__first == ','))
- break;
- else if (*__first == '(')
- ++depth, ++__first;
- else if (*__first == ')')
- --depth, ++__first;
- else if (*__first == '\"') {
- __first = skip_string_literal(__first, __last);
- lines += skip_string_literal.lines;
- } else if (*__first == '\'') {
- __first = skip_char_literal(__first, __last);
- lines += skip_char_literal.lines;
- } else if (*__first == '/') {
- __first = skip_comment_or_divop(__first, __last);
- lines += skip_comment_or_divop.lines;
- } else if (pp_isalpha(*__first) || *__first == '_') {
- __first = skip_identifier(__first, __last);
- lines += skip_identifier.lines;
- } else if (pp_isdigit(*__first)) {
- __first = skip_number(__first, __last);
- lines += skip_number.lines;
- } else if (*__first == '\n') {
- ++__first;
- ++lines;
- } else
- ++__first;
- }
-
- return __first;
- }
-};
-
-} // namespace rpp
-
-#endif // PP_SCANNER_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-string.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-string.h
deleted file mode 100644
index 25db0389a..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-string.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_STRING_H
-#define PP_STRING_H
-
-namespace rpp
-{
-
-template <typename _CharT>
-class pp_string
-{
- typedef std::char_traits<_CharT> traits_type;
- typedef std::size_t size_type;
-
- _CharT const *_M_begin;
- std::size_t _M_size;
-
-public:
- inline pp_string():
- _M_begin(0), _M_size(0) {}
-
- explicit pp_string(std::string const &__s):
- _M_begin(__s.c_str()), _M_size(__s.size()) {}
-
- inline pp_string(_CharT const *__begin, std::size_t __size):
- _M_begin(__begin), _M_size(__size) {}
-
- inline _CharT const *begin() const {
- return _M_begin;
- }
- inline _CharT const *end() const {
- return _M_begin + _M_size;
- }
-
- inline _CharT at(std::size_t index) const {
- return _M_begin [index];
- }
-
- inline std::size_t size() const {
- return _M_size;
- }
-
- inline int compare(pp_string const &__other) const {
- size_type const __size = this->size();
- size_type const __osize = __other.size();
- size_type const __len = std::min(__size, __osize);
-
- int __r = traits_type::compare(_M_begin, __other._M_begin, __len);
- if (!__r)
- __r = (int)(__size - __osize);
-
- return __r;
- }
-
- inline bool operator == (pp_string const &__other) const {
- return compare(__other) == 0;
- }
-
- inline bool operator != (pp_string const &__other) const {
- return compare(__other) != 0;
- }
-
- inline bool operator < (pp_string const &__other) const {
- return compare(__other) < 0;
- }
-
- inline bool operator == (char const *s) const {
- std::size_t n = strlen(s);
-
- if (n != _M_size)
- return false;
-
- return ! strncmp(_M_begin, s, n);
- }
-
- inline bool operator != (char const *s) const {
- return ! operator == (s);
- }
-};
-
-} // namespace rpp
-
-#endif // PP_STRING_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp-symbol.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp-symbol.h
deleted file mode 100644
index 9b06d2643..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp-symbol.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_SYMBOL_H
-#define PP_SYMBOL_H
-
-#include <cassert>
-#include <iterator>
-#include "pp-fwd.h"
-#include "parser/rxx_allocator.h"
-
-namespace rpp
-{
-
-class pp_symbol
-{
- static rxx_allocator<char> &allocator_instance() {
- static rxx_allocator<char>__allocator;
- return __allocator;
- }
- static rxx_allocator<pp_fast_string> &ppfs_allocator_instance ()
- {
- static rxx_allocator<pp_fast_string>__ppfs_allocator;
- return __ppfs_allocator;
- }
-
-public:
- static int &N() {
- static int __N;
- return __N;
- }
-
- static pp_fast_string const *get(char const *__data, std::size_t __size) {
- ++N();
- char *data = allocator_instance().allocate(__size + 1);
- memcpy(data, __data, __size);
- data[__size] = '\0';
-
- pp_fast_string *where = ppfs_allocator_instance ().allocate (sizeof (pp_fast_string));
- return new(where) pp_fast_string(data, __size);
- }
-
- template <typename _InputIterator>
- static pp_fast_string const *get(_InputIterator __first, _InputIterator __last) {
- ++N();
- std::ptrdiff_t __size;
-#if defined(__SUNPRO_CC)
- std::distance(__first, __last, __size);
-#else
- __size = std::distance(__first, __last);
-#endif
- assert(__size >= 0 && __size < 512);
-
- char *data = allocator_instance().allocate(__size + 1);
- std::copy(__first, __last, data);
- data[__size] = '\0';
-
- pp_fast_string *where = ppfs_allocator_instance ().allocate (sizeof (pp_fast_string));
- return new(where) pp_fast_string(data, __size);
- }
-
- static pp_fast_string const *get(std::string const &__s) {
- return get(__s.c_str(), __s.size());
- }
-};
-
-} // namespace rpp
-
-#endif // PP_SYMBOL_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/pp.h b/sources/shiboken2/ApiExtractor/parser/rpp/pp.h
deleted file mode 100644
index dfeeac432..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/pp.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PP_H
-#define PP_H
-
-#if defined(_WIN64) || defined(WIN64) || defined(__WIN64__) \
- || defined(_WIN32) || defined(WIN32) || defined(__WIN32__)
-# define PP_OS_WIN
-#endif
-
-#include <set>
-#include <map>
-#include <vector>
-#include <string>
-#include <iterator>
-#include <iostream>
-#include <cassert>
-#include <cctype>
-#include <cstdio>
-
-#include <fcntl.h>
-
-#ifdef HAVE_MMAP
-# include <sys/mman.h>
-#endif
-
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#if (_MSC_VER >= 1400)
-# define FILENO _fileno
-#else
-# define FILENO fileno
-#endif
-
-#if defined (PP_OS_WIN)
-# define PATH_SEPARATOR '\\'
-#else
-# define PATH_SEPARATOR '/'
-#endif
-
-#if defined (RPP_JAMBI)
-# include "parser/rxx_allocator.h"
-#else
-# include "parser/rpp-allocator.h"
-#endif
-
-#if defined (_MSC_VER)
-# define pp_snprintf _snprintf
-#else
-# define pp_snprintf snprintf
-#endif
-
-#include "pp-fwd.h"
-#include "pp-cctype.h"
-#include "pp-string.h"
-#include "pp-symbol.h"
-#include "pp-internal.h"
-#include "pp-iterator.h"
-#include "pp-macro.h"
-#include "pp-environment.h"
-#include "pp-scanner.h"
-#include "pp-macro-expander.h"
-#include "pp-engine.h"
-#include "pp-engine-bits.h"
-
-#endif // PP_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.cpp b/sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.cpp
deleted file mode 100644
index 315343321..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "preprocessor.h"
-
-#include <string>
-#include <cstdio>
-
-// register callback for include hooks
-static void includeFileHook(const std::string &, const std::string &, FILE *);
-
-#define PP_HOOK_ON_FILE_INCLUDED(A, B, C) includeFileHook(A, B, C)
-#include "pp.h"
-
-using namespace rpp;
-
-#include <QtCore/QtCore>
-
-class PreprocessorPrivate
-{
-public:
- QByteArray result;
- pp_environment env;
- QStringList includePaths;
-
- void initPP(pp &proc) {
- foreach(QString path, includePaths)
- proc.push_include_path(path.toStdString());
- }
-};
-
-QHash<QString, QStringList> includedFiles;
-
-void includeFileHook(const std::string &fileName, const std::string &filePath, FILE *)
-{
- includedFiles[QString::fromStdString(fileName)].append(QString::fromStdString(filePath));
-}
-
-Preprocessor::Preprocessor()
-{
- d = new PreprocessorPrivate;
- includedFiles.clear();
-}
-
-Preprocessor::~Preprocessor()
-{
- delete d;
-}
-
-void Preprocessor::processFile(const QString &fileName)
-{
- pp proc(d->env);
- d->initPP(proc);
-
- d->result.reserve(d->result.size() + 20 * 1024);
-
- d->result += "# 1 \"" + fileName.toLatin1() + "\"\n"; // ### REMOVE ME
- proc.file(fileName.toLocal8Bit().constData(), std::back_inserter(d->result));
-}
-
-void Preprocessor::processString(const QByteArray &str)
-{
- pp proc(d->env);
- d->initPP(proc);
-
- proc(str.begin(), str.end(), std::back_inserter(d->result));
-}
-
-QByteArray Preprocessor::result() const
-{
- return d->result;
-}
-
-void Preprocessor::addIncludePaths(const QStringList &includePaths)
-{
- d->includePaths += includePaths;
-}
-
-QStringList Preprocessor::macroNames() const
-{
- QStringList macros;
-
- pp_environment::const_iterator it = d->env.first_macro();
- while (it != d->env.last_macro()) {
- const pp_macro *m = *it;
- macros += QString::fromLatin1(m->name->begin(), m->name->size());
- ++it;
- }
-
- return macros;
-}
-
-QList<Preprocessor::MacroItem> Preprocessor::macros() const
-{
- QList<MacroItem> items;
-
- pp_environment::const_iterator it = d->env.first_macro();
- while (it != d->env.last_macro()) {
- const pp_macro *m = *it;
- MacroItem item;
- item.name = QString::fromLatin1(m->name->begin(), m->name->size());
- item.definition = QString::fromLatin1(m->definition->begin(),
- m->definition->size());
- for (size_t i = 0; i < m->formals.size(); ++i) {
- item.parameters += QString::fromLatin1(m->formals[i]->begin(),
- m->formals[i]->size());
- }
- item.isFunctionLike = m->function_like;
-
-#ifdef PP_WITH_MACRO_POSITION
- item.fileName = QString::fromLatin1(m->file->begin(), m->file->size());
-#endif
- items += item;
-
- ++it;
- }
-
- return items;
-}
-
-/*
-int main()
-{
- Preprocessor pp;
-
- QStringList paths;
- paths << "/usr/include";
- pp.addIncludePaths(paths);
-
- pp.processFile("pp-configuration");
- pp.processFile("/usr/include/stdio.h");
-
- qDebug() << pp.result();
-
- return 0;
-}
-*/
-
diff --git a/sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.h b/sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.h
deleted file mode 100644
index 7d00a5d09..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rpp/preprocessor.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef PREPROCESSOR_H
-#define PREPROCESSOR_H
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qstringlist.h>
-
-class PreprocessorPrivate;
-
-class Preprocessor
-{
-public:
- Preprocessor();
- ~Preprocessor();
-
- void processFile(const QString &fileName);
- void processString(const QByteArray &str);
-
- void addIncludePaths(const QStringList &includePaths);
-
- QByteArray result() const;
-
- QStringList macroNames() const;
-
- struct MacroItem {
- QString name;
- QStringList parameters;
- QString definition;
- bool isFunctionLike;
-#ifdef PP_WITH_MACRO_POSITION
- QString fileName;
-#endif
- };
- QList<MacroItem> macros() const;
-
-private:
- Q_DISABLE_COPY(Preprocessor)
- PreprocessorPrivate *d;
-};
-
-#endif
diff --git a/sources/shiboken2/ApiExtractor/parser/rxx_allocator.h b/sources/shiboken2/ApiExtractor/parser/rxx_allocator.h
deleted file mode 100644
index 8325edbdf..000000000
--- a/sources/shiboken2/ApiExtractor/parser/rxx_allocator.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* This file is part of KDevelop
- Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef RXX_ALLOCATOR_H
-#define RXX_ALLOCATOR_H
-
-#include <cstddef>
-#include <cstdlib>
-#include <string.h>
-#include <memory>
-
-// Stride calculation
-template <typename T>
-struct Tchar {
- T t;
- char c;
-};
-
-#define strideof(T) \
- ((sizeof(Tchar<T>) > sizeof(T)) ? \
- sizeof(Tchar<T>)-sizeof(T) : sizeof(T))
-
-
-/**The allocator which uses fixed size blocks for allocation of its elements.
-Block size is currently 64k, allocated space is not reclaimed,
-if the size of the element being allocated extends the amount of free
-memory in the block then a new block is allocated.
-
-The allocator supports standard c++ library interface but does not
-make use of allocation hints.
-*/
-template <class _Tp> class rxx_allocator {
-public:
- typedef _Tp value_type;
- typedef _Tp* pointer;
- typedef const _Tp* const_pointer;
- typedef _Tp& reference;
- typedef const _Tp& const_reference;
- typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
-
- static const size_type max_block_count = size_type(-1);
- static const size_type _S_block_size = 1 << 16; // 64K
-
- rxx_allocator() {
- init();
- }
-
- rxx_allocator(const rxx_allocator &/*__o*/) {
- init();
- }
-
- ~rxx_allocator() {
- for (size_type index = 0; index < _M_block_index + 1; ++index)
- delete[] _M_storage[index];
-
- ::free(_M_storage);
- }
-
- pointer address(reference __val) { return &__val; }
- const_pointer address(const_reference __val) const { return &__val; }
-
- /**Allocates @p __n elements continuosly in the pool. Warning! no
- check is done to check if the size of those @p __n elements
- fit into the block. You should assure you do not allocate more
- than the size of a block.*/
- pointer allocate(size_type __n, const void* = 0) {
- const size_type bytes = __n * sizeof(_Tp);
-
- if (_M_current_block == 0
- || _S_block_size < _M_current_index + bytes)
- {
- ++_M_block_index;
-
- _M_storage = reinterpret_cast<char**>
- (::realloc(_M_storage, sizeof(char*) * (1 + _M_block_index)));
-
- _M_current_block = _M_storage[_M_block_index] = reinterpret_cast<char*>
- (new char[_S_block_size]);
-
- ::memset(_M_current_block, 0, _S_block_size);
- _M_current_index = 0;
- }
-
- pointer p = reinterpret_cast<pointer>
- (_M_current_block + _M_current_index);
-
- _M_current_index += bytes;
-
- return p;
- }
-
- pointer allocate(size_type __n, size_type stride, const void* = 0) {
- if (reinterpret_cast<size_type>(_M_current_block + _M_current_index) % stride > 0)
- _M_current_index += stride - reinterpret_cast<size_type>(_M_current_block + _M_current_index) % stride;
- return allocate(__n);
- }
-
- /**Deallocate does nothing in this implementation.*/
- void deallocate(pointer /*__p*/, size_type /*__n*/) {}
-
- size_type max_size() const { return size_type(-1) / sizeof(_Tp); }
-
- void construct(pointer __p, const_reference __val) { new (__p) _Tp(__val); }
- void destroy(pointer __p) { __p->~_Tp(); }
-
- template <class _Tp1> struct rebind {
- typedef rxx_allocator<_Tp1> other;
- };
-
-private:
-
- void init()
- {
- _M_block_index = max_block_count;
- _M_current_index = 0;
- _M_storage = 0;
- _M_current_block = 0;
- }
-
- template <class _Tp1> rxx_allocator(const rxx_allocator<_Tp1> &__o) {}
-
-private:
- size_type _M_block_index;
- size_type _M_current_index;
- char *_M_current_block;
- char **_M_storage;
-};
-
-#endif // RXX_ALLOCATOR_H
-
diff --git a/sources/shiboken2/ApiExtractor/parser/smallobject.cpp b/sources/shiboken2/ApiExtractor/parser/smallobject.cpp
deleted file mode 100644
index 9cee247e0..000000000
--- a/sources/shiboken2/ApiExtractor/parser/smallobject.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "smallobject.h"
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/smallobject.h b/sources/shiboken2/ApiExtractor/parser/smallobject.h
deleted file mode 100644
index 99e4ea44a..000000000
--- a/sources/shiboken2/ApiExtractor/parser/smallobject.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef SMALLOBJECT_H
-#define SMALLOBJECT_H
-
-#include "rxx_allocator.h"
-#include <cstring>
-
-class pool
-{
- rxx_allocator<char> __alloc;
-
-public:
- inline void *allocate(std::size_t __size);
- inline void *allocate(std::size_t __size, std::size_t __stride);
-};
-
-inline void *pool::allocate(std::size_t __size)
-{
- return __alloc.allocate(__size);
-}
-
-inline void *pool::allocate(std::size_t __size, std::size_t __stride)
-{
- return __alloc.allocate(__size, __stride);
-}
-
-#endif
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/symbol.h b/sources/shiboken2/ApiExtractor/parser/symbol.h
deleted file mode 100644
index 588653846..000000000
--- a/sources/shiboken2/ApiExtractor/parser/symbol.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef SYMBOL_H
-#define SYMBOL_H
-
-#include <QtCore/QString>
-#include <cstring>
-
-#include <QtCore/QHash>
-#include <QtCore/QPair>
-
-struct NameSymbol
-{
- const char *data;
- std::size_t count;
-
- inline QString as_string() const
- {
- return QString::fromUtf8(data, (int) count);
- }
-
- inline bool operator == (const NameSymbol &other) const
- {
- return count == other.count
- && !std::strncmp(data, other.data, count);
- }
-
-protected:
- inline NameSymbol() {}
- inline NameSymbol(const char *d, std::size_t c)
- : data(d), count(c) {}
-
-private:
- void operator = (const NameSymbol &);
-
- friend class NameTable;
-};
-
-inline uint qHash(const NameSymbol &r)
-{
- uint hash_value = 0;
-
- for (std::size_t i = 0; i < r.count; ++i)
- hash_value = (hash_value << 5) - hash_value + r.data[i];
-
- return hash_value;
-}
-
-inline uint qHash(const QPair<const char*, std::size_t> &r)
-{
- uint hash_value = 0;
-
- for (std::size_t i = 0; i < r.second; ++i)
- hash_value = (hash_value << 5) - hash_value + r.first[i];
-
- return hash_value;
-}
-
-class NameTable
-{
-public:
- typedef QPair<const char *, std::size_t> KeyType;
- typedef QHash<KeyType, NameSymbol*> ContainerType;
-
-public:
- NameTable() {}
-
- ~NameTable()
- {
- qDeleteAll(_M_storage);
- }
-
- inline const NameSymbol *findOrInsert(const char *str, std::size_t len)
- {
- KeyType key(str, len);
-
- NameSymbol *name = _M_storage.value(key);
- if (!name) {
- name = new NameSymbol(str, len);
- _M_storage.insert(key, name);
- }
-
- return name;
- }
-
- inline std::size_t count() const { return _M_storage.size(); }
-
-private:
- ContainerType _M_storage;
-
-private:
- NameTable(const NameTable &other);
- void operator=(const NameTable &other);
-};
-
-#endif // SYMBOL_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
-
diff --git a/sources/shiboken2/ApiExtractor/parser/tokens.cpp b/sources/shiboken2/ApiExtractor/parser/tokens.cpp
deleted file mode 100644
index eace3c9fa..000000000
--- a/sources/shiboken2/ApiExtractor/parser/tokens.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include <QtCore/qglobal.h>
-
-#include "tokens.h"
-
-static char const * const _S_token_names[] = {
- "K_DCOP",
- "Q_OBJECT",
- "Q_PROPERTY",
- "__attribute__",
- "__typeof",
- "and",
- "and_eq",
- "arrow",
- "asm",
- "assign",
- "auto",
- "bitand",
- "bitor",
- "bool",
- "break",
- "case",
- "catch",
- "char",
- "char_literal",
- "class",
- "comment",
- "compl",
- "concat",
- "const",
- "const_cast",
- "continue",
- "decr",
- "default",
- "delete",
- "do",
- "double",
- "dynamic_cast",
- "ellipsis",
- "else",
- "emit",
- "enum",
- "eq",
- "explicit",
- "export",
- "extern",
- "false",
- "float",
- "for",
- "friend",
- "geq",
- "goto",
- "identifier",
- "if",
- "incr",
- "inline",
- "int",
- "k_dcop",
- "k_dcop_signals",
- "leq",
- "long",
- "mutable",
- "namespace",
- "new",
- "noexcept",
- "not",
- "not_eq",
- "number_literal",
- "operator",
- "or",
- "or_eq",
- "preproc",
- "private",
- "protected",
- "ptrmem",
- "public",
- "register",
- "reinterpret_cast",
- "return",
- "scope",
- "shift",
- "short",
- "signals",
- "signed",
- "sizeof",
- "slots",
- "static",
- "static_cast",
- "string_literal",
- "struct",
- "switch",
- "template",
- "this",
- "throw",
- "true",
- "try",
- "typedef",
- "typeid",
- "typename",
- "union",
- "unsigned",
- "using",
- "virtual",
- "void",
- "volatile",
- "wchar_t",
- "while",
- "whitespaces",
- "xor",
- "xor_eq",
- "Q_ENUMS",
- "Q_ENUM"
-};
-
-static char _S_printable[][2] = {
- { char(32), '\0' },
- { char(33), '\0' },
- { char(34), '\0' },
- { char(35), '\0' },
- { char(36), '\0' },
- { char(37), '\0' },
- { char(38), '\0' },
- { char(39), '\0' },
- { char(40), '\0' },
- { char(41), '\0' },
- { char(42), '\0' },
- { char(43), '\0' },
- { char(44), '\0' },
- { char(45), '\0' },
- { char(46), '\0' },
- { char(47), '\0' },
- { char(48), '\0' },
- { char(49), '\0' },
- { char(50), '\0' },
- { char(51), '\0' },
- { char(52), '\0' },
- { char(53), '\0' },
- { char(54), '\0' },
- { char(55), '\0' },
- { char(56), '\0' },
- { char(57), '\0' },
- { char(58), '\0' },
- { char(59), '\0' },
- { char(60), '\0' },
- { char(61), '\0' },
- { char(62), '\0' },
- { char(63), '\0' },
- { char(64), '\0' },
- { char(65), '\0' },
- { char(66), '\0' },
- { char(67), '\0' },
- { char(68), '\0' },
- { char(69), '\0' },
- { char(70), '\0' },
- { char(71), '\0' },
- { char(72), '\0' },
- { char(73), '\0' },
- { char(74), '\0' },
- { char(75), '\0' },
- { char(76), '\0' },
- { char(77), '\0' },
- { char(78), '\0' },
- { char(79), '\0' },
- { char(80), '\0' },
- { char(81), '\0' },
- { char(82), '\0' },
- { char(83), '\0' },
- { char(84), '\0' },
- { char(85), '\0' },
- { char(86), '\0' },
- { char(87), '\0' },
- { char(88), '\0' },
- { char(89), '\0' },
- { char(90), '\0' },
- { char(91), '\0' },
- { char(92), '\0' },
- { char(93), '\0' },
- { char(94), '\0' },
- { char(95), '\0' },
- { char(96), '\0' },
- { char(97), '\0' },
- { char(98), '\0' },
- { char(99), '\0' },
- { char(100), '\0' },
- { char(101), '\0' },
- { char(102), '\0' },
- { char(103), '\0' },
- { char(104), '\0' },
- { char(105), '\0' },
- { char(106), '\0' },
- { char(107), '\0' },
- { char(108), '\0' },
- { char(109), '\0' },
- { char(110), '\0' },
- { char(111), '\0' },
- { char(112), '\0' },
- { char(113), '\0' },
- { char(114), '\0' },
- { char(115), '\0' },
- { char(116), '\0' },
- { char(117), '\0' },
- { char(118), '\0' },
- { char(119), '\0' },
- { char(120), '\0' },
- { char(121), '\0' },
- { char(122), '\0' },
- { char(123), '\0' },
- { char(124), '\0' },
- { char(125), '\0' },
- { char(126), '\0' },
- { char(127), '\0' },
-};
-
-char const *token_name(int token)
-{
- if (token == 0)
- return "eof";
- else if (token >= 32 && token <= 127)
- return _S_printable[token - 32];
- else if (token >= 1000)
- return _S_token_names[token - 1000];
-
- Q_ASSERT(0);
- return 0;
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/tokens.h b/sources/shiboken2/ApiExtractor/parser/tokens.h
deleted file mode 100644
index 46ec96e74..000000000
--- a/sources/shiboken2/ApiExtractor/parser/tokens.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef TOKENS_H
-#define TOKENS_H
-
-enum TOKEN_KIND {
- Token_EOF = 0,
-
- Token_K_DCOP = 1000,
- Token_Q_OBJECT,
- Token_Q_PROPERTY,
- Token___attribute__,
- Token___typeof,
- Token_and,
- Token_and_eq,
- Token_arrow,
- Token_asm,
- Token_assign,
- Token_auto,
- Token_bitand,
- Token_bitor,
- Token_bool,
- Token_break,
- Token_case,
- Token_catch,
- Token_char,
- Token_char_literal,
- Token_class,
- Token_comment,
- Token_compl,
- Token_concat,
- Token_const,
- Token_const_cast,
- Token_continue,
- Token_decr,
- Token_default,
- Token_delete,
- Token_do,
- Token_double,
- Token_dynamic_cast,
- Token_ellipsis,
- Token_else,
- Token_emit,
- Token_enum,
- Token_eq,
- Token_explicit,
- Token_export,
- Token_extern,
- Token_false,
- Token_float,
- Token_for,
- Token_friend,
- Token_geq,
- Token_goto,
- Token_identifier,
- Token_if,
- Token_incr,
- Token_inline,
- Token_int,
- Token_k_dcop,
- Token_k_dcop_signals,
- Token_leq,
- Token_long,
- Token_mutable,
- Token_namespace,
- Token_new,
- Token_noexcept,
- Token_not,
- Token_not_eq,
- Token_number_literal,
- Token_operator,
- Token_or,
- Token_or_eq,
- Token_preproc,
- Token_private,
- Token_protected,
- Token_ptrmem,
- Token_public,
- Token_register,
- Token_reinterpret_cast,
- Token_return,
- Token_scope,
- Token_shift,
- Token_short,
- Token_signals,
- Token_signed,
- Token_sizeof,
- Token_slots,
- Token_static,
- Token_static_cast,
- Token_string_literal,
- Token_struct,
- Token_switch,
- Token_template,
- Token_this,
- Token_throw,
- Token_true,
- Token_try,
- Token_typedef,
- Token_typeid,
- Token_typename,
- Token_union,
- Token_unsigned,
- Token_using,
- Token_virtual,
- Token_void,
- Token_volatile,
- Token_wchar_t,
- Token_while,
- Token_whitespaces,
- Token_xor,
- Token_xor_eq,
- Token_Q_ENUMS,
- Token_Q_ENUM,
- Token_Q_INVOKABLE,
-
- TOKEN_KIND_COUNT
-};
-
-char const *token_name(int token);
-
-#endif
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/type_compiler.cpp b/sources/shiboken2/ApiExtractor/parser/type_compiler.cpp
deleted file mode 100644
index c08f210fa..000000000
--- a/sources/shiboken2/ApiExtractor/parser/type_compiler.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-
-
-#include "type_compiler.h"
-#include "name_compiler.h"
-#include "lexer.h"
-#include "symbol.h"
-#include "tokens.h"
-#include "binder.h"
-
-#include <QtCore/QString>
-
-TypeCompiler::TypeCompiler(Binder *binder)
- : _M_binder(binder), _M_token_stream(binder->tokenStream())
-{
-}
-
-void TypeCompiler::run(TypeSpecifierAST *node)
-{
- _M_type.clear();
- _M_cv.clear();
-
- visit(node);
-
- if (node && node->cv) {
- const ListNode<std::size_t> *it = node->cv->toFront();
- const ListNode<std::size_t> *end = it;
- do {
- int kind = _M_token_stream->kind(it->element);
- if (!_M_cv.contains(kind))
- _M_cv.append(kind);
-
- it = it->next;
- } while (it != end);
- }
-}
-
-void TypeCompiler::visitClassSpecifier(ClassSpecifierAST *node)
-{
- visit(node->name);
-}
-
-void TypeCompiler::visitEnumSpecifier(EnumSpecifierAST *node)
-{
- visit(node->name);
-}
-
-void TypeCompiler::visitElaboratedTypeSpecifier(ElaboratedTypeSpecifierAST *node)
-{
- visit(node->name);
-}
-
-void TypeCompiler::visitSimpleTypeSpecifier(SimpleTypeSpecifierAST *node)
-{
- if (const ListNode<std::size_t> *it = node->integrals) {
- it = it->toFront();
- const ListNode<std::size_t> *end = it;
- QString current_item;
- do {
- std::size_t token = it->element;
- current_item += QLatin1String(token_name(_M_token_stream->kind(token)));
- current_item += QLatin1Char(' ');
- it = it->next;
- } while (it != end);
- _M_type += current_item.trimmed();
- } else if (node->type_of) {
- // ### implement me
- _M_type += QLatin1String("typeof<...>");
- }
-
- visit(node->name);
-}
-
-void TypeCompiler::visitName(NameAST *node)
-{
- NameCompiler name_cc(_M_binder);
- name_cc.run(node);
- _M_type = name_cc.qualifiedName();
-}
-
-QStringList TypeCompiler::cvString() const
-{
- QStringList lst;
-
- foreach (int q, cv()) {
- if (q == Token_const)
- lst.append(QLatin1String("const"));
- else if (q == Token_volatile)
- lst.append(QLatin1String("volatile"));
- }
-
- return lst;
-}
-
-bool TypeCompiler::isConstant() const
-{
- return _M_cv.contains(Token_const);
-}
-
-bool TypeCompiler::isVolatile() const
-{
- return _M_cv.contains(Token_volatile);
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/type_compiler.h b/sources/shiboken2/ApiExtractor/parser/type_compiler.h
deleted file mode 100644
index 6755b30c3..000000000
--- a/sources/shiboken2/ApiExtractor/parser/type_compiler.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef TYPE_COMPILER_H
-#define TYPE_COMPILER_H
-
-#include "default_visitor.h"
-
-#include <QtCore/QString>
-#include <QtCore/QStringList>
-#include <QtCore/QList>
-
-class TokenStream;
-class Binder;
-
-class TypeCompiler: protected DefaultVisitor
-{
-public:
- TypeCompiler(Binder *binder);
-
- inline QStringList qualifiedName() const { return _M_type; }
- inline QList<int> cv() const { return _M_cv; }
-
- bool isConstant() const;
- bool isVolatile() const;
-
- QStringList cvString() const;
-
- void run(TypeSpecifierAST *node);
-
-protected:
- virtual void visitClassSpecifier(ClassSpecifierAST *node);
- virtual void visitEnumSpecifier(EnumSpecifierAST *node);
- virtual void visitElaboratedTypeSpecifier(ElaboratedTypeSpecifierAST *node);
- virtual void visitSimpleTypeSpecifier(SimpleTypeSpecifierAST *node);
-
- virtual void visitName(NameAST *node);
-
-private:
- Binder *_M_binder;
- TokenStream *_M_token_stream;
- QStringList _M_type;
- QList<int> _M_cv;
-};
-
-#endif // TYPE_COMPILER_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
-
diff --git a/sources/shiboken2/ApiExtractor/parser/visitor.cpp b/sources/shiboken2/ApiExtractor/parser/visitor.cpp
deleted file mode 100644
index e13e4acb3..000000000
--- a/sources/shiboken2/ApiExtractor/parser/visitor.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "visitor.h"
-
-Visitor::visitor_fun_ptr Visitor::_S_table[AST::NODE_KIND_COUNT] = {
- 0,
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitAccessSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitAsmDefinition),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitBaseClause),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitBaseSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitBinaryExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitCastExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitClassMemberAccess),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitClassSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitCompoundStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitCondition),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitConditionalExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitCppCastExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitCtorInitializer),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitDeclarationStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitDeclarator),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitDeleteExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitDoStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitElaboratedTypeSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitEnumSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitEnumerator),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitExceptionSpecification),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitExpressionOrDeclarationStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitExpressionStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitForStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitFunctionCall),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitFunctionDefinition),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitIfStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitIncrDecrExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitInitDeclarator),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitInitializer),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitInitializerClause),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitLabeledStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitLinkageBody),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitLinkageSpecification),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitMemInitializer),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitName),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitNamespace),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitNamespaceAliasDefinition),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitNewDeclarator),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitNewExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitNewInitializer),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitNewTypeId),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitOperator),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitOperatorFunctionId),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitParameterDeclaration),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitParameterDeclarationClause),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitPostfixExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitPrimaryExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitPtrOperator),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitPtrToMember),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitReturnStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitSimpleDeclaration),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitSimpleTypeSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitSizeofExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitStringLiteral),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitSubscriptExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitSwitchStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTemplateArgument),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTemplateDeclaration),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTemplateParameter),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitThrowExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTranslationUnit),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTryBlockStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTypeId),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTypeIdentification),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTypeParameter),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitTypedef),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitUnaryExpression),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitUnqualifiedName),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitUsing),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitUsingDirective),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitWhileStatement),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitWinDeclSpec),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitQProperty),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitForwardDeclarationSpecifier),
- reinterpret_cast<Visitor::visitor_fun_ptr>(&Visitor::visitQEnums)
-};
-
-Visitor::Visitor()
-{
-}
-
-Visitor::~Visitor()
-{
-}
-
-void Visitor::visit(AST *node)
-{
- if (node)
- (this->*_S_table[node->kind])(node);
-}
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/parser/visitor.h b/sources/shiboken2/ApiExtractor/parser/visitor.h
deleted file mode 100644
index b1fbf8763..000000000
--- a/sources/shiboken2/ApiExtractor/parser/visitor.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of PySide2.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef VISITOR_H
-#define VISITOR_H
-
-#include "ast.h"
-
-class Visitor
-{
-public:
- Visitor();
- virtual ~Visitor();
-
- virtual void visit(AST *node);
-
-protected:
- virtual void visitAccessSpecifier(AccessSpecifierAST *) {}
- virtual void visitAsmDefinition(AsmDefinitionAST *) {}
- virtual void visitBaseClause(BaseClauseAST *) {}
- virtual void visitBaseSpecifier(BaseSpecifierAST *) {}
- virtual void visitBinaryExpression(BinaryExpressionAST *) {}
- virtual void visitCastExpression(CastExpressionAST *) {}
- virtual void visitClassMemberAccess(ClassMemberAccessAST *) {}
- virtual void visitClassSpecifier(ClassSpecifierAST *) {}
- virtual void visitCompoundStatement(CompoundStatementAST *) {}
- virtual void visitCondition(ConditionAST *) {}
- virtual void visitConditionalExpression(ConditionalExpressionAST *) {}
- virtual void visitCppCastExpression(CppCastExpressionAST *) {}
- virtual void visitCtorInitializer(CtorInitializerAST *) {}
- virtual void visitDeclarationStatement(DeclarationStatementAST *) {}
- virtual void visitDeclarator(DeclaratorAST *) {}
- virtual void visitDeleteExpression(DeleteExpressionAST *) {}
- virtual void visitDoStatement(DoStatementAST *) {}
- virtual void visitElaboratedTypeSpecifier(ElaboratedTypeSpecifierAST *) {}
- virtual void visitEnumSpecifier(EnumSpecifierAST *) {}
- virtual void visitEnumerator(EnumeratorAST *) {}
- virtual void visitExceptionSpecification(ExceptionSpecificationAST *) {}
- virtual void visitExpressionOrDeclarationStatement(ExpressionOrDeclarationStatementAST *) {}
- virtual void visitExpressionStatement(ExpressionStatementAST *) {}
- virtual void visitForStatement(ForStatementAST *) {}
- virtual void visitFunctionCall(FunctionCallAST *) {}
- virtual void visitFunctionDefinition(FunctionDefinitionAST *) {}
- virtual void visitIfStatement(IfStatementAST *) {}
- virtual void visitIncrDecrExpression(IncrDecrExpressionAST *) {}
- virtual void visitInitDeclarator(InitDeclaratorAST *) {}
- virtual void visitInitializer(InitializerAST *) {}
- virtual void visitInitializerClause(InitializerClauseAST *) {}
- virtual void visitLabeledStatement(LabeledStatementAST *) {}
- virtual void visitLinkageBody(LinkageBodyAST *) {}
- virtual void visitLinkageSpecification(LinkageSpecificationAST *) {}
- virtual void visitMemInitializer(MemInitializerAST *) {}
- virtual void visitName(NameAST *) {}
- virtual void visitNamespace(NamespaceAST *) {}
- virtual void visitNamespaceAliasDefinition(NamespaceAliasDefinitionAST *) {}
- virtual void visitNewDeclarator(NewDeclaratorAST *) {}
- virtual void visitNewExpression(NewExpressionAST *) {}
- virtual void visitNewInitializer(NewInitializerAST *) {}
- virtual void visitNewTypeId(NewTypeIdAST *) {}
- virtual void visitOperator(OperatorAST *) {}
- virtual void visitOperatorFunctionId(OperatorFunctionIdAST *) {}
- virtual void visitParameterDeclaration(ParameterDeclarationAST *) {}
- virtual void visitParameterDeclarationClause(ParameterDeclarationClauseAST *) {}
- virtual void visitPostfixExpression(PostfixExpressionAST *) {}
- virtual void visitPrimaryExpression(PrimaryExpressionAST *) {}
- virtual void visitPtrOperator(PtrOperatorAST *) {}
- virtual void visitPtrToMember(PtrToMemberAST *) {}
- virtual void visitReturnStatement(ReturnStatementAST *) {}
- virtual void visitSimpleDeclaration(SimpleDeclarationAST *) {}
- virtual void visitSimpleTypeSpecifier(SimpleTypeSpecifierAST *) {}
- virtual void visitSizeofExpression(SizeofExpressionAST *) {}
- virtual void visitStringLiteral(StringLiteralAST *) {}
- virtual void visitSubscriptExpression(SubscriptExpressionAST *) {}
- virtual void visitSwitchStatement(SwitchStatementAST *) {}
- virtual void visitTemplateArgument(TemplateArgumentAST *) {}
- virtual void visitTemplateDeclaration(TemplateDeclarationAST *) {}
- virtual void visitTemplateParameter(TemplateParameterAST *) {}
- virtual void visitThrowExpression(ThrowExpressionAST *) {}
- virtual void visitTranslationUnit(TranslationUnitAST *) {}
- virtual void visitTryBlockStatement(TryBlockStatementAST *) {}
- virtual void visitTypeId(TypeIdAST *) {}
- virtual void visitTypeIdentification(TypeIdentificationAST *) {}
- virtual void visitTypeParameter(TypeParameterAST *) {}
- virtual void visitTypedef(TypedefAST *) {}
- virtual void visitUnaryExpression(UnaryExpressionAST *) {}
- virtual void visitUnqualifiedName(UnqualifiedNameAST *) {}
- virtual void visitUsing(UsingAST *) {}
- virtual void visitUsingDirective(UsingDirectiveAST *) {}
- virtual void visitWhileStatement(WhileStatementAST *) {}
- virtual void visitWinDeclSpec(WinDeclSpecAST *) {}
- virtual void visitQProperty(QPropertyAST *) {}
- virtual void visitForwardDeclarationSpecifier(ForwardDeclarationSpecifierAST *) {}
- virtual void visitQEnums(QEnumsAST *) {}
-
-private:
- typedef void (Visitor::*visitor_fun_ptr)(AST *);
- static visitor_fun_ptr _S_table[];
-};
-
-template <class _Tp>
-void visitNodes(Visitor *v, const ListNode<_Tp> *nodes)
-{
- if (!nodes)
- return;
-
- const ListNode<_Tp>
- *it = nodes->toFront(),
- *end = it;
-
- do {
- v->visit(it->element);
- it = it->next;
- } while (it != end);
-}
-
-#endif // VISITOR_H
-
-// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/sources/shiboken2/ApiExtractor/qtdocparser.cpp b/sources/shiboken2/ApiExtractor/qtdocparser.cpp
index f1421ff91..0ac87bd16 100644
--- a/sources/shiboken2/ApiExtractor/qtdocparser.cpp
+++ b/sources/shiboken2/ApiExtractor/qtdocparser.cpp
@@ -34,6 +34,7 @@
#include <QtXmlPatterns/QXmlQuery>
#include <QtCore/QDir>
#include <QtCore/QFile>
+#include <QtCore/QTextStream>
#include <QUrl>
Documentation QtDocParser::retrieveModuleDocumentation()
@@ -41,12 +42,50 @@ Documentation QtDocParser::retrieveModuleDocumentation()
return retrieveModuleDocumentation(packageName());
}
+static void formatFunctionArgTypeQuery(QTextStream &str, const AbstractMetaArgument *arg)
+{
+ const AbstractMetaType *metaType = arg->type();
+ if (metaType->isConstant())
+ str << "const " ;
+ switch (metaType->typeUsagePattern()) {
+ case AbstractMetaType::PrimitivePattern:
+ str << metaType->name();
+ break;
+ case AbstractMetaType::FlagsPattern: {
+ // Modify qualified name "QFlags<Qt::AlignmentFlag>" with name "Alignment"
+ // to "Qt::Alignment" as seen by qdoc.
+ const FlagsTypeEntry *flagsEntry = static_cast<const FlagsTypeEntry *>(metaType->typeEntry());
+ QString name = flagsEntry->qualifiedCppName();
+ if (name.endsWith(QLatin1Char('>')) && name.startsWith(QLatin1String("QFlags<"))) {
+ const int lastColon = name.lastIndexOf(QLatin1Char(':'));
+ if (lastColon != -1) {
+ name.replace(lastColon + 1, name.size() - lastColon - 1, metaType->name());
+ name.remove(0, 7);
+ } else {
+ name = metaType->name(); // QFlags<> of enum in global namespace
+ }
+ }
+ str << name;
+ }
+ break;
+ default: // Fully qualify enums (Qt::AlignmentFlag), nested classes, etc.
+ str << metaType->typeEntry()->qualifiedCppName();
+ break;
+ }
+
+ if (metaType->referenceType() == LValueReference)
+ str << " &";
+ else if (metaType->referenceType() == RValueReference)
+ str << " &&";
+ else if (metaType->indirections())
+ str << ' ' << QByteArray(metaType->indirections(), '*');
+}
+
void QtDocParser::fillDocumentation(AbstractMetaClass* metaClass)
{
if (!metaClass)
return;
- QString scope = metaClass->name();
const AbstractMetaClass* context = metaClass->enclosingClass();
while(context) {
if (context->enclosingClass() == 0)
@@ -54,32 +93,35 @@ void QtDocParser::fillDocumentation(AbstractMetaClass* metaClass)
context = context->enclosingClass();
}
- QString filename = metaClass->qualifiedCppName().toLower();
- filename.replace(QLatin1String("::"), QLatin1String("-"));
- QString sourceFile = documentationDataDirectory() + QLatin1Char('/')
- + filename + QLatin1String(".xml");
- if (metaClass->enclosingClass())
- sourceFile.replace(QLatin1String("::"), QLatin1String("-"));
+ QString sourceFileRoot = documentationDataDirectory() + QLatin1Char('/')
+ + metaClass->qualifiedCppName().toLower();
+ sourceFileRoot.replace(QLatin1String("::"), QLatin1String("-"));
- if (!QFile::exists(sourceFile)) {
+ QFileInfo sourceFile(sourceFileRoot + QStringLiteral(".webxml"));
+ if (!sourceFile.exists())
+ sourceFile.setFile(sourceFileRoot + QStringLiteral(".xml"));
+ if (!sourceFile.exists()) {
qCWarning(lcShiboken).noquote().nospace()
- << "Can't find qdoc3 file for class " << metaClass->name() << ", tried: "
- << QDir::toNativeSeparators(sourceFile);
+ << "Can't find qdoc file for class " << metaClass->name() << ", tried: "
+ << QDir::toNativeSeparators(sourceFile.absoluteFilePath());
return;
}
QXmlQuery xquery;
- xquery.setFocus(QUrl(sourceFile));
+ const QString sourceFileName = sourceFile.absoluteFilePath();
+ xquery.setFocus(QUrl::fromLocalFile(sourceFileName));
QString className = metaClass->name();
// Class/Namespace documentation
- QString type = metaClass->isNamespace() ? QLatin1String("namespace") : QLatin1String("class");
- QString query = QLatin1String("/WebXML/document/") + type + QLatin1String("[@name=\"")
- + className + QLatin1String("\"]/description");
+ const QString classQuery = QLatin1String("/WebXML/document/")
+ + (metaClass->isNamespace() ? QLatin1String("namespace") : QLatin1String("class"))
+ + QLatin1String("[@name=\"") + className + QLatin1String("\"]");
+ QString query = classQuery + QLatin1String("/description");
DocModificationList signedModifs, classModifs;
- foreach (DocModification docModif, metaClass->typeEntry()->docModifications()) {
+ const DocModificationList &mods = metaClass->typeEntry()->docModifications();
+ for (const DocModification &docModif : mods) {
if (docModif.signature().isEmpty())
classModifs.append(docModif);
else
@@ -87,62 +129,49 @@ void QtDocParser::fillDocumentation(AbstractMetaClass* metaClass)
}
Documentation doc(getDocumentation(xquery, query, classModifs));
+ if (doc.isEmpty())
+ qCWarning(lcShiboken(), "%s", qPrintable(msgCannotFindDocumentation(sourceFileName, "class", className, query)));
metaClass->setDocumentation(doc);
//Functions Documentation
- AbstractMetaFunctionList funcs = metaClass->functionsInTargetLang();
- foreach (AbstractMetaFunction *func, funcs) {
- if (!func || func->isPrivate())
- continue;
-
- QString query = QLatin1String("/WebXML/document/") + type
- + QLatin1String("[@name=\"") + className + QLatin1String("\"]");
+ const AbstractMetaFunctionList &funcs = DocParser::documentableFunctions(metaClass);
+ for (AbstractMetaFunction *func : funcs) {
+ query.clear();
+ QTextStream str(&query);
+ str << classQuery;
// properties
if (func->isPropertyReader() || func->isPropertyWriter() || func->isPropertyResetter()) {
- query += QLatin1String("/property[@name=\"") + func->propertySpec()->name()
- + QLatin1String("\"]");
+ str << "/property[@name=\"" << func->propertySpec()->name() << "\"]";
} else { // normal methods
- QString isConst = func->isConstant() ? QLatin1String("true") : QLatin1String("false");
- query += QLatin1String("/function[@name=\"") + func->originalName()
- + QLatin1String("\" and count(parameter)=")
- + QString::number(func->arguments().count())
- + QLatin1String(" and @const=\"") + isConst + QLatin1String("\"]");
-
- int i = 1;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
- QString type = arg->type()->name();
-
- if (arg->type()->isConstant())
- type.prepend(QLatin1String("const "));
-
- if (arg->type()->referenceType() == LValueReference) {
- type += QLatin1String(" &");
- } else if (arg->type()->referenceType() == RValueReference) {
- type += QLatin1String(" &&");
- } else if (arg->type()->indirections()) {
- type += QLatin1Char(' ');
- for (int j = 0, max = arg->type()->indirections(); j < max; ++j)
- type += QLatin1Char('*');
- }
- query += QLatin1String("/parameter[") + QString::number(i)
- + QLatin1String("][@left=\"") + type + QLatin1String("\"]/..");
- ++i;
+ str << "/function[@name=\"" << func->originalName() << "\" and count(parameter)="
+ << func->arguments().count() << " and @const=\""
+ << (func->isConstant() ? "true" : "false") << "\"]";
+
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (int i = 0, size = arguments.size(); i < size; ++i) {
+ str << "/parameter[" << (i + 1) << "][@type=\"";
+ formatFunctionArgTypeQuery(str, arguments.at(i));
+ str << "\"]/..";
}
}
- query += QLatin1String("/description");
+ str << "/description";
DocModificationList funcModifs;
- foreach (DocModification funcModif, signedModifs) {
+ for (const DocModification &funcModif : qAsConst(signedModifs)) {
if (funcModif.signature() == func->minimalSignature())
funcModifs.append(funcModif);
}
doc.setValue(getDocumentation(xquery, query, funcModifs));
+ if (doc.isEmpty()) {
+ qCWarning(lcShiboken(), "%s",
+ qPrintable(msgCannotFindDocumentation(sourceFileName, metaClass, func, query)));
+ }
func->setDocumentation(doc);
}
#if 0
// Fields
- AbstractMetaFieldList fields = metaClass->fields();
- foreach (AbstractMetaField *field, fields) {
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (AbstractMetaField *field : fields) {
if (field->isPrivate())
return;
@@ -152,13 +181,16 @@ void QtDocParser::fillDocumentation(AbstractMetaClass* metaClass)
}
#endif
// Enums
- AbstractMetaEnumList enums = metaClass->enums();
- foreach (AbstractMetaEnum *meta_enum, enums) {
- QString query = QLatin1String("/WebXML/document/") + type
- + QLatin1String("[@name=\"")
- + className + QLatin1String("\"]/enum[@name=\"")
- + meta_enum->name() + QLatin1String("\"]/description");
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (AbstractMetaEnum *meta_enum : enums) {
+ query.clear();
+ QTextStream(&query) << classQuery << "/enum[@name=\""
+ << meta_enum->name() << "\"]/description";
doc.setValue(getDocumentation(xquery, query, DocModificationList()));
+ if (doc.isEmpty()) {
+ qCWarning(lcShiboken(), "%s",
+ qPrintable(msgCannotFindDocumentation(sourceFileName, metaClass, meta_enum, query)));
+ }
meta_enum->setDocumentation(doc);
}
}
@@ -172,9 +204,12 @@ Documentation QtDocParser::retrieveModuleDocumentation(const QString& name)
QString sourceFile = documentationDataDirectory() + QLatin1Char('/')
+ moduleName.toLower() + QLatin1String(".xml");
+ if (!QFile::exists(sourceFile))
+ sourceFile = documentationDataDirectory() + QLatin1Char('/')
+ + moduleName.toLower() + QLatin1String("-module.webxml");
if (!QFile::exists(sourceFile)) {
qCWarning(lcShiboken).noquote().nospace()
- << "Can't find qdoc3 file for module " << name << ", tried: "
+ << "Can't find qdoc file for module " << name << ", tried: "
<< QDir::toNativeSeparators(sourceFile);
return Documentation();
}
@@ -184,5 +219,8 @@ Documentation QtDocParser::retrieveModuleDocumentation(const QString& name)
// Module documentation
QString query = QLatin1String("/WebXML/document/page[@name=\"") + moduleName + QLatin1String("\"]/description");
- return Documentation(getDocumentation(xquery, query, DocModificationList()));
+ const Documentation doc = getDocumentation(xquery, query, DocModificationList());
+ if (doc.isEmpty())
+ qCWarning(lcShiboken(), "%s", qPrintable(msgCannotFindDocumentation(sourceFile, "module", name, query)));
+ return doc;
}
diff --git a/sources/shiboken2/ApiExtractor/qtdocparser.h b/sources/shiboken2/ApiExtractor/qtdocparser.h
index 04c491853..f6bd479cd 100644
--- a/sources/shiboken2/ApiExtractor/qtdocparser.h
+++ b/sources/shiboken2/ApiExtractor/qtdocparser.h
@@ -35,9 +35,9 @@ class QtDocParser : public DocParser
{
public:
QtDocParser() {}
- virtual void fillDocumentation(AbstractMetaClass* metaClass);
- virtual Documentation retrieveModuleDocumentation();
- virtual Documentation retrieveModuleDocumentation(const QString& name);
+ void fillDocumentation(AbstractMetaClass* metaClass) override;
+ Documentation retrieveModuleDocumentation() override;
+ Documentation retrieveModuleDocumentation(const QString& name) override;
};
#endif // QTDOCPARSER_H
diff --git a/sources/shiboken2/ApiExtractor/reporthandler.cpp b/sources/shiboken2/ApiExtractor/reporthandler.cpp
index 8abea42c6..bb3677772 100644
--- a/sources/shiboken2/ApiExtractor/reporthandler.cpp
+++ b/sources/shiboken2/ApiExtractor/reporthandler.cpp
@@ -52,6 +52,7 @@ static int m_suppressedCount = 0;
static ReportHandler::DebugLevel m_debugLevel = ReportHandler::NoDebug;
static QSet<QString> m_reportedWarnings;
static QString m_progressBuffer;
+static QString m_prefix;
static int m_step_size = 0;
static int m_step = -1;
static int m_step_warning = 0;
@@ -106,6 +107,11 @@ void ReportHandler::setSilent(bool silent)
m_silent = silent;
}
+void ReportHandler::setPrefix(const QString &p)
+{
+ m_prefix = p;
+}
+
void ReportHandler::messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &text)
{
if (type == QtWarningMsg) {
@@ -120,7 +126,11 @@ void ReportHandler::messageOutput(QtMsgType type, const QMessageLogContext &cont
++m_step_warning;
m_reportedWarnings.insert(text);
}
- fprintf(stderr, "%s\n", qPrintable(qFormatLogMessage(type, context, text)));
+ QString message = m_prefix;
+ if (!message.isEmpty())
+ message.append(QLatin1Char(' '));
+ message.append(text);
+ fprintf(stderr, "%s\n", qPrintable(qFormatLogMessage(type, context, message)));
}
void ReportHandler::progress(const QString& str, ...)
diff --git a/sources/shiboken2/ApiExtractor/reporthandler.h b/sources/shiboken2/ApiExtractor/reporthandler.h
index 6896d6e86..a22e58d46 100644
--- a/sources/shiboken2/ApiExtractor/reporthandler.h
+++ b/sources/shiboken2/ApiExtractor/reporthandler.h
@@ -64,6 +64,8 @@ public:
static bool isSilent();
static void setSilent(bool silent);
+ static void setPrefix(const QString &p);
+
private:
static void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
};
diff --git a/sources/shiboken2/ApiExtractor/tests/CMakeLists.txt b/sources/shiboken2/ApiExtractor/tests/CMakeLists.txt
index 5429c1cb8..860a37d9d 100644
--- a/sources/shiboken2/ApiExtractor/tests/CMakeLists.txt
+++ b/sources/shiboken2/ApiExtractor/tests/CMakeLists.txt
@@ -16,6 +16,7 @@ macro(declare_test testname)
${apiextractor_SOURCE_DIR}
${Qt5Test_INCLUDE_DIRS}
)
+ link_directories(${APIEXTRACTOR_EXTRA_LINK_DIRECTORIES})
target_link_libraries(${testname}
${Qt5XmlPatterns_LIBRARIES}
${Qt5Test_LIBRARIES}
diff --git a/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp b/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp
index 028522159..9acbba675 100644
--- a/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp
@@ -57,7 +57,7 @@ void TestAbstractMetaClass::testClassNameUnderNamespace()
AbstractMetaClassList classes = builder->classes();
QCOMPARE(classes.count(), 2); // 1 namespace + 1 class
if (classes.first()->name() != QLatin1String("ClassName"))
- classes.swap(0, 1);
+ qSwap(classes[0], classes[1]);
QCOMPARE(classes[0]->name(), QLatin1String("ClassName"));
QCOMPARE(classes[0]->qualifiedCppName(), QLatin1String("Namespace::ClassName"));
@@ -71,7 +71,7 @@ void TestAbstractMetaClass::testClassNameUnderNamespace()
AbstractMetaFunctionList ctors = classes[0]->queryFunctions(AbstractMetaClass::Constructors);
QCOMPARE(ctors.size(), 2);
if (ctors.first()->minimalSignature() != QLatin1String("ClassName()"))
- ctors.swap(0, 1);
+ qSwap(ctors[0], ctors[1]);
QCOMPARE(ctors[0]->arguments().size(), 0);
QCOMPARE(ctors[0]->minimalSignature(), QLatin1String("ClassName()"));
@@ -86,42 +86,66 @@ void TestAbstractMetaClass::testClassNameUnderNamespace()
// QVERIFY(classes[0]->hasNonPrivateConstructor());
}
+static AbstractMetaFunctionList virtualFunctions(const AbstractMetaClass *c)
+{
+ AbstractMetaFunctionList result;
+ const AbstractMetaFunctionList &functions = c->functions();
+ for (AbstractMetaFunction *f : functions) {
+ if (f->isVirtual())
+ result.append(f);
+ }
+ return result;
+}
+
void TestAbstractMetaClass::testVirtualMethods()
{
- const char* cppCode ="\
- class A {\n\
- public:\n\
- virtual int pureVirtual() const = 0;\n\
- };\n\
- class B : public A {};\n\
- class C : public B {\n\
- public:\n\
- int pureVirtual() const { return 0; }\n\
- };\n";
- const char* xmlCode = "\
- <typesystem package=\"Foo\">\n\
- <primitive-type name='int'/>\n\
- <object-type name='A'/>\n\
- <object-type name='B'/>\n\
- <object-type name='C'/>\n\
- </typesystem>\n";
+ const char cppCode[] =R"CPP(
+class A {
+public:
+ virtual int pureVirtual() const = 0;
+};
+class B : public A {};
+class C : public B {
+public:
+ int pureVirtual() const override { return 0; }
+};
+class F final : public C {
+public:
+ int pureVirtual() const final { return 1; }
+};
+)CPP";
+
+ const char xmlCode[] = R"XML(
+<typesystem package="Foo">
+ <primitive-type name='int'/>
+ <object-type name='A'/>
+ <object-type name='B'/>
+ <object-type name='C'/>
+ <object-type name='F'/>
+</typesystem>
+)XML";
QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode));
QVERIFY(!builder.isNull());
AbstractMetaClassList classes = builder->classes();
- QCOMPARE(classes.count(), 3);
+ QCOMPARE(classes.count(), 4);
AbstractMetaClass* a = AbstractMetaClass::findClass(classes, QLatin1String("A"));
AbstractMetaClass* b = AbstractMetaClass::findClass(classes, QLatin1String("B"));
AbstractMetaClass* c = AbstractMetaClass::findClass(classes, QLatin1String("C"));
+ const AbstractMetaClass *f = AbstractMetaClass::findClass(classes, QLatin1String("F"));
+ QVERIFY(f);
AbstractMetaClass* no_class = 0;
QCOMPARE(a->baseClass(), no_class);
QCOMPARE(b->baseClass(), a);
QCOMPARE(c->baseClass(), b);
+ QCOMPARE(f->baseClass(), c);
QCOMPARE(a->functions().size(), 2); // default ctor + the pure virtual method
QCOMPARE(b->functions().size(), 2);
QCOMPARE(c->functions().size(), 2);
+ QCOMPARE(f->functions().size(), 2);
+ QVERIFY(f->attributes() & AbstractMetaAttributes::FinalCppClass);
// implementing class, ownclass, declaringclass
AbstractMetaFunction* ctorA = a->queryFunctions(AbstractMetaClass::Constructors).first();
@@ -137,17 +161,26 @@ void TestAbstractMetaClass::testVirtualMethods()
QCOMPARE(ctorA->ownerClass(), a);
QCOMPARE(ctorA->declaringClass(), a);
- QCOMPARE(a->virtualFunctions().size(), 1); // Add a pureVirtualMethods method !?
- QCOMPARE(b->virtualFunctions().size(), 1);
- QCOMPARE(c->virtualFunctions().size(), 1);
+ const AbstractMetaFunctionList virtualFunctionsA = virtualFunctions(a);
+ const AbstractMetaFunctionList virtualFunctionsB = virtualFunctions(b);
+ const AbstractMetaFunctionList virtualFunctionsC = virtualFunctions(c);
+ const AbstractMetaFunctionList virtualFunctionsF = virtualFunctions(f);
+ QCOMPARE(virtualFunctionsA.size(), 1); // Add a pureVirtualMethods method !?
+ QCOMPARE(virtualFunctionsB.size(), 1);
+ QCOMPARE(virtualFunctionsC.size(), 1);
+ QCOMPARE(virtualFunctionsF.size(), 1);
- AbstractMetaFunction* funcA = a->virtualFunctions().first();
- AbstractMetaFunction* funcB = b->virtualFunctions().first();
- AbstractMetaFunction* funcC = c->virtualFunctions().first();
+ const AbstractMetaFunction* funcA = virtualFunctionsA.constFirst();
+ const AbstractMetaFunction* funcB = virtualFunctionsB.constFirst();
+ const AbstractMetaFunction* funcC = virtualFunctionsC.constFirst();
+ const AbstractMetaFunction* funcF = virtualFunctionsF.constFirst();
QCOMPARE(funcA->ownerClass(), a);
+ QVERIFY(funcC->attributes() & AbstractMetaAttributes::VirtualCppMethod);
QCOMPARE(funcB->ownerClass(), b);
QCOMPARE(funcC->ownerClass(), c);
+ QVERIFY(funcC->attributes() & AbstractMetaAttributes::OverriddenCppMethod);
+ QVERIFY(funcF->attributes() & AbstractMetaAttributes::FinalCppMethod);
QCOMPARE(funcA->declaringClass(), a);
QCOMPARE(funcB->declaringClass(), a);
@@ -361,7 +394,7 @@ void TestAbstractMetaClass::testClassDefaultConstructors()
AbstractMetaFunctionList ctors = classA->queryFunctions(AbstractMetaClass::Constructors);
QCOMPARE(ctors.size(), 2);
if (ctors.first()->minimalSignature() != QLatin1String("A()"))
- ctors.swap(0, 1);
+ qSwap(ctors[0], ctors[1]);
QCOMPARE(ctors[0]->arguments().size(), 0);
QCOMPARE(ctors[0]->minimalSignature(), QLatin1String("A()"));
@@ -395,7 +428,7 @@ void TestAbstractMetaClass::testClassDefaultConstructors()
ctors = classF->queryFunctions(AbstractMetaClass::Constructors);
QCOMPARE(ctors.size(), 2);
if (ctors.first()->minimalSignature() != QLatin1String("F(int,int)"))
- ctors.swap(0, 1);
+ qSwap(ctors[0], ctors[1]);
QCOMPARE(ctors[0]->arguments().size(), 2);
QCOMPARE(ctors[0]->minimalSignature(), QLatin1String("F(int,int)"));
@@ -428,7 +461,7 @@ void TestAbstractMetaClass::testClassInheritedDefaultConstructors()
AbstractMetaFunctionList ctors = classA->queryFunctions(AbstractMetaClass::Constructors);
QCOMPARE(ctors.size(), 2);
if (ctors.first()->minimalSignature() != QLatin1String("A()"))
- ctors.swap(0, 1);
+ qSwap(ctors[0], ctors[1]);
QCOMPARE(ctors[0]->arguments().size(), 0);
QCOMPARE(ctors[0]->minimalSignature(), QLatin1String("A()"));
diff --git a/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp b/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
index 6e1da17ae..bcc5238bc 100644
--- a/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
@@ -49,7 +49,7 @@ void TestAddFunction::testParsingFuncNameAndConstness()
const char sig2[] = " _fu__nc_ ( type1, const type2, const Abc<int& , C<char*> * > * *, const type3* const ) const ";
AddedFunction f2(QLatin1String(sig2), QLatin1String("const Abc<int& , C<char*> * > * *"), 0);
QCOMPARE(f2.name(), QLatin1String("_fu__nc_"));
- QList< AddedFunction::TypeInfo > args = f2.arguments();
+ QVector< AddedFunction::TypeInfo > args = f2.arguments();
QCOMPARE(args.count(), 4);
retval = f2.returnType();
QCOMPARE(retval.name, QLatin1String("Abc<int& , C<char*> * >"));
@@ -423,8 +423,8 @@ void TestAddFunction::testAddFunctionOnTypedef()
AbstractMetaClass* foo = AbstractMetaClass::findClass(classes, QLatin1String("FooInt"));
QVERIFY(foo);
QVERIFY(foo->hasNonPrivateConstructor());
- AbstractMetaFunctionList lst = foo->queryFunctions(AbstractMetaClass::Constructors);
- foreach(AbstractMetaFunction* f, lst)
+ const AbstractMetaFunctionList &lst = foo->queryFunctions(AbstractMetaClass::Constructors);
+ for (const AbstractMetaFunction *f : lst)
QVERIFY(f->signature().startsWith(f->name()));
QCOMPARE(lst.size(), 2);
const AbstractMetaFunction* method = foo->findFunction(QLatin1String("method"));
diff --git a/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp b/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp
index 5385c9140..cbeb216c9 100644
--- a/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testarrayargument.cpp
@@ -58,6 +58,54 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByInteger()
QCOMPARE(arg->type()->arrayElementType()->name(), QLatin1String("double"));
}
+static QString functionMinimalSignature(const AbstractMetaClass *c, const QString &name)
+{
+ const AbstractMetaFunction *f = c->findFunction(name);
+ return f ? f->minimalSignature() : QString();
+}
+
+void TestArrayArgument::testArraySignature()
+{
+ const char cppCode[] ="\
+ struct A {\n\
+ void mi1(int arg[5]);\n\
+ void mi1c(const int arg[5]);\n\
+ void mi1cu(const int arg[]);\n\
+ void mc1cu(const char arg[]);\n\
+ void mc1cup(const char *arg[]);\n\
+ void muc2(unsigned char *arg[2][3]);\n\
+ void mc2c(const char *arg[5][6]);\n\
+ void mc2cu(const char arg[][2]);\n\
+ };\n";
+ const char xmlCode[] = "\
+ <typesystem package='Foo'>\n\
+ <primitive-type name='char'/>\n\
+ <primitive-type name='unsigned char'/>\n\
+ <primitive-type name='int'/>\n\
+ <object-type name='A'/>\n\
+ </typesystem>\n";
+
+ QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false));
+ QVERIFY(!builder.isNull());
+ const AbstractMetaClass *classA = AbstractMetaClass::findClass(builder->classes(), QLatin1String("A"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mi1")),
+ QLatin1String("mi1(int[5])"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mi1c")),
+ QLatin1String("mi1c(const int[5])"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mi1cu")),
+ QLatin1String("mi1cu(const int[])"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mc1cu")),
+ QLatin1String("mc1cu(const char*)"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mc1cup")),
+ QLatin1String("mc1cup(const char*[])"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("muc2")),
+ QLatin1String("muc2(unsigned char*[2][3])"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mc2c")),
+ QLatin1String("mc2c(const char*[5][6])"));
+ QCOMPARE(functionMinimalSignature(classA, QLatin1String("mc2cu")),
+ QLatin1String("mc2cu(const char[][2])"));
+}
+
void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValue()
{
const char* cppCode ="\
@@ -80,7 +128,7 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValue()
AbstractMetaEnum* someEnum = classA->findEnum(QLatin1String("SomeEnum"));
QVERIFY(someEnum);
- AbstractMetaEnumValue* nvalues = classA->findEnumValue(QLatin1String("NValues"), someEnum);
+ AbstractMetaEnumValue *nvalues = classA->findEnumValue(QLatin1String("NValues"));
QVERIFY(nvalues);
const AbstractMetaArgument* arg = classA->functions().last()->arguments().first();
@@ -111,13 +159,7 @@ void TestArrayArgument::testArrayArgumentWithSizeDefinedByEnumValueFromGlobalEnu
AbstractMetaEnum* someEnum = builder->globalEnums().first();
QVERIFY(someEnum);
- AbstractMetaEnumValue* nvalues = 0;
- foreach (AbstractMetaEnumValue* enumValue, someEnum->values()) {
- if (enumValue->name() == QLatin1String("NValues")) {
- nvalues = enumValue;
- break;
- }
- }
+ const AbstractMetaEnumValue *nvalues = someEnum->findEnumValue(QLatin1String("NValues"));
QVERIFY(nvalues);
const AbstractMetaArgument* arg = classA->functions().last()->arguments().first();
diff --git a/sources/shiboken2/ApiExtractor/tests/testarrayargument.h b/sources/shiboken2/ApiExtractor/tests/testarrayargument.h
index b50232ef4..45ca8e655 100644
--- a/sources/shiboken2/ApiExtractor/tests/testarrayargument.h
+++ b/sources/shiboken2/ApiExtractor/tests/testarrayargument.h
@@ -35,6 +35,7 @@ class TestArrayArgument : public QObject
Q_OBJECT
private slots:
void testArrayArgumentWithSizeDefinedByInteger();
+ void testArraySignature();
void testArrayArgumentWithSizeDefinedByEnumValue();
void testArrayArgumentWithSizeDefinedByEnumValueFromGlobalEnum();
};
diff --git a/sources/shiboken2/ApiExtractor/tests/testconversionoperator.cpp b/sources/shiboken2/ApiExtractor/tests/testconversionoperator.cpp
index cae4a3a62..86f571328 100644
--- a/sources/shiboken2/ApiExtractor/tests/testconversionoperator.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testconversionoperator.cpp
@@ -65,7 +65,7 @@ void TestConversionOperator::testConversionOperator()
QCOMPARE(classA->externalConversionOperators().count(), 2);
AbstractMetaFunction* convOp = 0;
- foreach(AbstractMetaFunction* func, classB->functions()) {
+ for (AbstractMetaFunction *func : classB->functions()) {
if (func->isConversionOperator()) {
convOp = func;
break;
diff --git a/sources/shiboken2/ApiExtractor/tests/testenum.cpp b/sources/shiboken2/ApiExtractor/tests/testenum.cpp
index 6700239d6..55c098840 100644
--- a/sources/shiboken2/ApiExtractor/tests/testenum.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testenum.cpp
@@ -83,6 +83,10 @@ void TestEnum::testEnumCppSignature()
AbstractMetaEnumList classEnums = classA->enums();
QCOMPARE(classEnums.first()->name(), QLatin1String("ClassEnum"));
+ AbstractMetaEnumValue *e = AbstractMetaClass::findEnumValue(classes, QLatin1String("CA"));
+ QVERIFY(e);
+ e = AbstractMetaClass::findEnumValue(classes, QLatin1String("ClassEnum::CA"));
+ QVERIFY(e);
}
void TestEnum::testEnumWithApiVersion()
@@ -318,7 +322,7 @@ void TestEnum::testEnumValueFromExpression()
AbstractMetaEnumValue* valueA4 = enumA->values().at(4);
QCOMPARE(valueA4->name(), QLatin1String("ValueA4"));
- QCOMPARE(valueA4->stringValue(), QLatin1String("8|ValueA3"));
+ QCOMPARE(valueA4->stringValue(), QLatin1String("8 |ValueA3"));
QCOMPARE(valueA4->value(), 8|0xf0);
AbstractMetaEnumValue* valueA5 = enumA->values().at(5);
@@ -328,12 +332,12 @@ void TestEnum::testEnumValueFromExpression()
AbstractMetaEnumValue* valueA6 = enumA->values().at(6);
QCOMPARE(valueA6->name(), QLatin1String("ValueA6"));
- QCOMPARE(valueA6->stringValue(), QLatin1String("ValueA3>>1"));
+ QCOMPARE(valueA6->stringValue(), QLatin1String("ValueA3 >> 1"));
QCOMPARE(valueA6->value(), 0xf0 >> 1);
AbstractMetaEnumValue* valueA7 = enumA->values().at(7);
QCOMPARE(valueA7->name(), QLatin1String("ValueA7"));
- QCOMPARE(valueA7->stringValue(), QLatin1String("ValueA3<<1"));
+ QCOMPARE(valueA7->stringValue(), QLatin1String("ValueA3 << 1"));
QCOMPARE(valueA7->value(), 0xf0 << 1);
}
diff --git a/sources/shiboken2/ApiExtractor/tests/testextrainclude.cpp b/sources/shiboken2/ApiExtractor/tests/testextrainclude.cpp
index 94158377e..97f0d568e 100644
--- a/sources/shiboken2/ApiExtractor/tests/testextrainclude.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testextrainclude.cpp
@@ -50,7 +50,7 @@ void TestExtraInclude::testClassExtraInclude()
const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
QVERIFY(classA);
- QList<Include> includes = classA->typeEntry()->extraIncludes();
+ QVector<Include> includes = classA->typeEntry()->extraIncludes();
QCOMPARE(includes.count(), 1);
QCOMPARE(includes.first().name(), QLatin1String("header.h"));
}
@@ -76,7 +76,7 @@ void TestExtraInclude::testGlobalExtraIncludes()
TypeEntry* module = td->findType(QLatin1String("Foo"));
QVERIFY(module);
- QList<Include> includes = module->extraIncludes();
+ QVector<Include> includes = module->extraIncludes();
QCOMPARE(includes.count(), 2);
QCOMPARE(includes.first().name(), QLatin1String("header1.h"));
QCOMPARE(includes.last().name(), QLatin1String("header2.h"));
diff --git a/sources/shiboken2/ApiExtractor/tests/testimplicitconversions.cpp b/sources/shiboken2/ApiExtractor/tests/testimplicitconversions.cpp
index 4438550b2..7e8db42f3 100644
--- a/sources/shiboken2/ApiExtractor/tests/testimplicitconversions.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testimplicitconversions.cpp
@@ -152,7 +152,7 @@ void TestImplicitConversions::testWithExternalConversionOperator()
QCOMPARE(externalConvOps.count(), 1);
const AbstractMetaFunction* convOp = 0;
- foreach(const AbstractMetaFunction* func, classB->functions()) {
+ for (const AbstractMetaFunction *func : classB->functions()) {
if (func->isConversionOperator())
convOp = func;
}
diff --git a/sources/shiboken2/ApiExtractor/tests/testmodifydocumentation.cpp b/sources/shiboken2/ApiExtractor/tests/testmodifydocumentation.cpp
index 96bd0251b..d56186479 100644
--- a/sources/shiboken2/ApiExtractor/tests/testmodifydocumentation.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testmodifydocumentation.cpp
@@ -66,7 +66,7 @@ void TestModifyDocumentation::testModifyDocumentation()
<para>Paragraph number 1</para>\n\
<para>Paragraph number 2</para>\n\
<para>Some changed contents here</para>\n\
-</description>\n"));
+</description>"));
}
// We expand QTEST_MAIN macro but using QCoreApplication instead of QApplication
diff --git a/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.cpp b/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.cpp
index 0e6bdc248..dd82a0f14 100644
--- a/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.cpp
@@ -32,24 +32,36 @@
#include <abstractmetalang.h>
#include <typesystem.h>
+void TestModifyFunction::testRenameArgument_data()
+{
+ QTest::addColumn<QByteArray>("pattern");
+ QTest::newRow("fixed_string") << QByteArrayLiteral("method(int)");
+ QTest::newRow("regular_expression") << QByteArrayLiteral("^method.*");
+}
+
void TestModifyFunction::testRenameArgument()
{
+ QFETCH(QByteArray, pattern);
+
const char* cppCode ="\
struct A {\n\
void method(int=0);\n\
};\n";
- const char* xmlCode = "\
+ const char xmlCode1[] = "\
<typesystem package='Foo'>\n\
<primitive-type name='int'/>\n\
<object-type name='A'>\n\
- <modify-function signature='method(int)'>\n\
+ <modify-function signature='";
+ const char xmlCode2[] = "'>\n\
<modify-argument index='1'>\n\
<rename to='otherArg'/>\n\
</modify-argument>\n\
</modify-function>\n\
</object-type>\n\
</typesystem>\n";
- QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false));
+
+ const QByteArray xmlCode = QByteArray(xmlCode1) + pattern + QByteArray(xmlCode2);
+ QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode.constData(), false));
QVERIFY(!builder.isNull());
AbstractMetaClassList classes = builder->classes();
const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
@@ -232,7 +244,7 @@ void TestModifyFunction::testGlobalFunctionModification()
FunctionModificationList mods = TypeDatabase::instance()->functionModifications(QLatin1String("function(A*)"));
QCOMPARE(mods.count(), 1);
- QList<ArgumentModification> argMods = mods.first().argument_mods;
+ QVector<ArgumentModification> argMods = mods.first().argument_mods;
QCOMPARE(argMods.count(), 1);
ArgumentModification argMod = argMods.first();
QCOMPARE(argMod.replacedDefaultExpression, QLatin1String("A()"));
diff --git a/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.h b/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.h
index fcaa0f9db..6bb62daf4 100644
--- a/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.h
+++ b/sources/shiboken2/ApiExtractor/tests/testmodifyfunction.h
@@ -37,6 +37,7 @@ class TestModifyFunction : public QObject
private slots:
void testOwnershipTransfer();
void testWithApiVersion();
+ void testRenameArgument_data();
void testRenameArgument();
void invalidateAfterUse();
void testGlobalFunctionModification();
diff --git a/sources/shiboken2/ApiExtractor/tests/testmultipleinheritance.cpp b/sources/shiboken2/ApiExtractor/tests/testmultipleinheritance.cpp
index 67c9089ce..b78e6ec01 100644
--- a/sources/shiboken2/ApiExtractor/tests/testmultipleinheritance.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testmultipleinheritance.cpp
@@ -61,7 +61,8 @@ void TestMultipleInheritance::testVirtualClass()
const AbstractMetaClass *classD = AbstractMetaClass::findClass(classes, QLatin1String("D"));
bool functionFound = false;
- foreach (AbstractMetaFunction* f, classD->functions()) {
+ const AbstractMetaFunctionList &functions = classD->functions();
+ for (AbstractMetaFunction *f : functions) {
if (f->name() == QLatin1String("theBug")) {
functionFound = true;
break;
diff --git a/sources/shiboken2/ApiExtractor/tests/testremoveoperatormethod.cpp b/sources/shiboken2/ApiExtractor/tests/testremoveoperatormethod.cpp
index 6b27227d6..508cff586 100644
--- a/sources/shiboken2/ApiExtractor/tests/testremoveoperatormethod.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testremoveoperatormethod.cpp
@@ -105,7 +105,8 @@ void TestRemoveOperatorMethod::testRemoveOperatorMethod()
removedSignatures.append(QLatin1String("operator>>(Char&)"));
removedSignatures.append(QLatin1String("operator>>(String&)"));
int notRemoved = classA->functions().size();
- foreach (const AbstractMetaFunction* f, classA->functions()) {
+ const AbstractMetaFunctionList &functions = classA->functions();
+ for (const AbstractMetaFunction *f : functions) {
QCOMPARE(f->isModifiedRemoved(), bool(removedSignatures.contains(f->minimalSignature())));
notRemoved -= int(f->isModifiedRemoved());
}
diff --git a/sources/shiboken2/ApiExtractor/tests/testreverseoperators.cpp b/sources/shiboken2/ApiExtractor/tests/testreverseoperators.cpp
index 76ba7d3b4..18d6902c2 100644
--- a/sources/shiboken2/ApiExtractor/tests/testreverseoperators.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testreverseoperators.cpp
@@ -53,7 +53,7 @@ void TestReverseOperators::testReverseSum()
const AbstractMetaFunction* reverseOp = 0;
const AbstractMetaFunction* normalOp = 0;
- foreach(const AbstractMetaFunction* func, classA->functions()) {
+ for (const AbstractMetaFunction *func : classA->functions()) {
if (func->name() == QLatin1String("operator+")) {
if (func->isReverseOperator())
reverseOp = func;
@@ -89,6 +89,7 @@ void TestReverseOperators::testReverseSumWithAmbiguity()
</typesystem>";
QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode, false));
+ QEXPECT_FAIL("", "Clang: Does not compile", Abort);
QVERIFY(!builder.isNull());
AbstractMetaClassList classes = builder->classes();
const AbstractMetaClass *classA = AbstractMetaClass::findClass(classes, QLatin1String("A"));
@@ -101,7 +102,7 @@ void TestReverseOperators::testReverseSumWithAmbiguity()
const AbstractMetaFunction* reverseOp = 0;
const AbstractMetaFunction* normalOp = 0;
- foreach(const AbstractMetaFunction* func, classB->functions()) {
+ for (const AbstractMetaFunction *func : classB->functions()) {
if (func->name() == QLatin1String("operator+")) {
if (func->isReverseOperator())
reverseOp = func;
diff --git a/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp b/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp
index cb90383db..4a66264d8 100644
--- a/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testtemplates.cpp
@@ -228,6 +228,7 @@ void TestTemplates::testTemplateParameterFixup()
const AbstractMetaFunction *erase = list->findFunction(QStringLiteral("erase"));
QVERIFY(erase);
QCOMPARE(erase->arguments().size(), 1);
+ QEXPECT_FAIL("", "Clang: Some other code changes the parameter type", Abort);
QCOMPARE(erase->arguments().at(0)->type()->cppSignature(), QLatin1String("List::Iterator"));
}
diff --git a/sources/shiboken2/ApiExtractor/tests/testutil.h b/sources/shiboken2/ApiExtractor/tests/testutil.h
index d4eb2fdf6..200fdb104 100644
--- a/sources/shiboken2/ApiExtractor/tests/testutil.h
+++ b/sources/shiboken2/ApiExtractor/tests/testutil.h
@@ -29,6 +29,9 @@
#ifndef TESTUTIL_H
#define TESTUTIL_H
#include <QtCore/QBuffer>
+#include <QtCore/QDebug>
+#include <QtCore/QDir>
+#include <QtCore/QTemporaryFile>
#include "abstractmetabuilder.h"
#include "reporthandler.h"
#include "typedatabase.h"
@@ -53,9 +56,18 @@ namespace TestUtil
td->parseFile(&buffer);
buffer.close();
// parse C++ code
- buffer.setData(cppCode);
+ QTemporaryFile tempSource(QDir::tempPath() + QLatin1String("/st_XXXXXX_main.cpp"));
+ if (!tempSource.open()) {
+ qWarning().noquote().nospace() << "Creation of temporary file failed: "
+ << tempSource.errorString();
+ return nullptr;
+ }
+ QByteArrayList arguments;
+ arguments.append(QFile::encodeName(tempSource.fileName()));
+ tempSource.write(cppCode, qint64(strlen(cppCode)));
+ tempSource.close();
AbstractMetaBuilder *builder = new AbstractMetaBuilder;
- if (!builder->build(&buffer)) {
+ if (!builder->build(arguments, 0)) {
delete builder;
return Q_NULLPTR;
}
diff --git a/sources/shiboken2/ApiExtractor/typedatabase.cpp b/sources/shiboken2/ApiExtractor/typedatabase.cpp
index 55170d7c1..76953a51e 100644
--- a/sources/shiboken2/ApiExtractor/typedatabase.cpp
+++ b/sources/shiboken2/ApiExtractor/typedatabase.cpp
@@ -31,6 +31,7 @@
#include "typesystem_p.h"
#include <QtCore/QFile>
+#include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QPair>
#include <QtCore/QVector>
@@ -175,8 +176,8 @@ FunctionTypeEntry* TypeDatabase::findFunctionType(const QString& name) const
TypeEntry* TypeDatabase::findType(const QString& name) const
{
- QList<TypeEntry *> entries = findTypes(name);
- foreach (TypeEntry *entry, entries) {
+ const TypeEntryList &entries = findTypes(name);
+ for (TypeEntry *entry : entries) {
if (entry &&
(!entry->isPrimitive() || static_cast<PrimitiveTypeEntry *>(entry)->preferredTargetLangType())) {
return entry;
@@ -185,7 +186,7 @@ TypeEntry* TypeDatabase::findType(const QString& name) const
return 0;
}
-QList<TypeEntry *> TypeDatabase::findTypes(const QString &name) const
+TypeEntryList TypeDatabase::findTypes(const QString &name) const
{
return m_entries.value(name);
}
@@ -201,12 +202,12 @@ SingleTypeEntryHash TypeDatabase::entries() const
return returned;
}
-QList<const PrimitiveTypeEntry*> TypeDatabase::primitiveTypes() const
+PrimitiveTypeEntryList TypeDatabase::primitiveTypes() const
{
TypeEntryHash entries = allEntries();
- QList<const PrimitiveTypeEntry*> returned;
+ PrimitiveTypeEntryList returned;
for (TypeEntryHash::const_iterator it = entries.cbegin(), end = entries.cend(); it != end; ++it) {
- foreach (TypeEntry *typeEntry, it.value()) {
+ for (TypeEntry *typeEntry : it.value()) {
if (typeEntry->isPrimitive())
returned.append(static_cast<PrimitiveTypeEntry *>(typeEntry));
}
@@ -214,75 +215,121 @@ QList<const PrimitiveTypeEntry*> TypeDatabase::primitiveTypes() const
return returned;
}
-QList<const ContainerTypeEntry*> TypeDatabase::containerTypes() const
+ContainerTypeEntryList TypeDatabase::containerTypes() const
{
TypeEntryHash entries = allEntries();
- QList<const ContainerTypeEntry*> returned;
+ ContainerTypeEntryList returned;
for (TypeEntryHash::const_iterator it = entries.cbegin(), end = entries.cend(); it != end; ++it) {
- foreach (TypeEntry *typeEntry, it.value()) {
+ for (TypeEntry *typeEntry : it.value()) {
if (typeEntry->isContainer())
returned.append(static_cast<ContainerTypeEntry *>(typeEntry));
}
}
return returned;
}
-void TypeDatabase::addRejection(const QString& className, const QString& functionName,
- const QString& fieldName, const QString& enumName)
+
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug d, const TypeRejection &r)
{
- TypeRejection r;
- r.class_name = className;
- r.function_name = functionName;
- r.field_name = fieldName;
- r.enum_name = enumName;
+ QDebugStateSaver saver(d);
+ d.noquote();
+ d.nospace();
+ d << "TypeRejection(type=" << r.matchType << ", class="
+ << r.className.pattern() << ", pattern=" << r.pattern.pattern() << ')';
+ return d;
+}
+#endif // !QT_NO_DEBUG_STREAM
+void TypeDatabase::addRejection(const TypeRejection &r)
+{
m_rejections << r;
}
-bool TypeDatabase::isClassRejected(const QString& className) const
+static inline QString msgRejectReason(const TypeRejection &r, const QString &needle = QString())
+{
+ QString result;
+ QTextStream str(&result);
+ switch (r.matchType) {
+ case TypeRejection::ExcludeClass:
+ str << " matches class exclusion \"" << r.className.pattern() << '"';
+ break;
+ case TypeRejection::Function:
+ case TypeRejection::Field:
+ case TypeRejection::Enum:
+ str << " matches class \"" << r.className.pattern() << "\" and \"" << r.pattern.pattern() << '"';
+ break;
+ case TypeRejection::ArgumentType:
+ case TypeRejection::ReturnType:
+ str << " matches class \"" << r.className.pattern() << "\" and \"" << needle
+ << "\" matches \"" << r.pattern.pattern() << '"';
+ break;
+ }
+ return result;
+}
+
+// Match class name only
+bool TypeDatabase::isClassRejected(const QString& className, QString *reason) const
{
- foreach (const TypeRejection& r, m_rejections) {
- if (r.class_name == className && r.function_name == QLatin1String("*")
- && r.field_name == QLatin1String("*") && r.enum_name == QLatin1String("*")) {
+ for (const TypeRejection& r : m_rejections) {
+ if (r.matchType == TypeRejection::ExcludeClass && r.className.match(className).hasMatch()) {
+ if (reason)
+ *reason = msgRejectReason(r);
return true;
}
}
return false;
}
-bool TypeDatabase::isEnumRejected(const QString& className, const QString& enumName) const
+// Match class name and function/enum/field
+static bool findRejection(const QVector<TypeRejection> &rejections,
+ TypeRejection::MatchType matchType,
+ const QString& className, const QString& name,
+ QString *reason = nullptr)
{
- foreach (const TypeRejection& r, m_rejections) {
- if (r.enum_name == enumName
- && (r.class_name == className || r.class_name == QLatin1String("*"))) {
+ Q_ASSERT(matchType != TypeRejection::ExcludeClass);
+ for (const TypeRejection& r : rejections) {
+ if (r.matchType == matchType && r.pattern.match(name).hasMatch()
+ && r.className.match(className).hasMatch()) {
+ if (reason)
+ *reason = msgRejectReason(r, name);
return true;
}
}
-
return false;
}
+bool TypeDatabase::isEnumRejected(const QString& className, const QString& enumName, QString *reason) const
+{
+ return findRejection(m_rejections, TypeRejection::Enum, className, enumName, reason);
+}
+
void TypeDatabase::addType(TypeEntry *e)
{
m_entries[e->qualifiedCppName()].append(e);
}
-bool TypeDatabase::isFunctionRejected(const QString& className, const QString& functionName) const
+bool TypeDatabase::isFunctionRejected(const QString& className, const QString& functionName,
+ QString *reason) const
{
- foreach (const TypeRejection& r, m_rejections)
- if (r.function_name == functionName &&
- (r.class_name == className || r.class_name == QLatin1String("*")))
- return true;
- return false;
+ return findRejection(m_rejections, TypeRejection::Function, className, functionName, reason);
}
+bool TypeDatabase::isFieldRejected(const QString& className, const QString& fieldName,
+ QString *reason) const
+{
+ return findRejection(m_rejections, TypeRejection::Field, className, fieldName, reason);
+}
-bool TypeDatabase::isFieldRejected(const QString& className, const QString& fieldName) const
+bool TypeDatabase::isArgumentTypeRejected(const QString& className, const QString& typeName,
+ QString *reason) const
{
- foreach (const TypeRejection& r, m_rejections)
- if (r.field_name == fieldName &&
- (r.class_name == className || r.class_name == QLatin1String("*")))
- return true;
- return false;
+ return findRejection(m_rejections, TypeRejection::ArgumentType, className, typeName, reason);
+}
+
+bool TypeDatabase::isReturnTypeRejected(const QString& className, const QString& typeName,
+ QString *reason) const
+{
+ return findRejection(m_rejections, TypeRejection::ReturnType, className, typeName, reason);
}
FlagsTypeEntry* TypeDatabase::findFlagsType(const QString &name) const
@@ -321,7 +368,7 @@ void TypeDatabase::addGlobalUserFunctions(const AddedFunctionList &functions)
AddedFunctionList TypeDatabase::findGlobalUserFunctions(const QString& name) const
{
AddedFunctionList addedFunctions;
- foreach (const AddedFunction &func, m_globalUserFunctions) {
+ for (const AddedFunction &func : m_globalUserFunctions) {
if (func.name() == name)
addedFunctions.append(func);
}
@@ -343,16 +390,52 @@ FunctionModificationList TypeDatabase::functionModifications(const QString& sign
FunctionModificationList lst;
for (int i = 0; i < m_functionMods.count(); ++i) {
const FunctionModification& mod = m_functionMods.at(i);
- if (mod.signature == signature)
+ if (mod.matches(signature))
lst << mod;
}
return lst;
}
-void TypeDatabase::addSuppressedWarning(const QString &s)
+bool TypeDatabase::addSuppressedWarning(const QString &warning, QString *errorMessage)
{
- m_suppressedWarnings.append(s);
+ QString pattern;
+ if (warning.startsWith(QLatin1Char('^')) && warning.endsWith(QLatin1Char('$'))) {
+ pattern = warning;
+ } else {
+ // Legacy syntax: Use wildcards '*' (unless escaped by '\')
+ QVector<int> asteriskPositions;
+ const int warningSize = warning.size();
+ for (int i = 0; i < warningSize; ++i) {
+ if (warning.at(i) == QLatin1Char('\\'))
+ ++i;
+ else if (warning.at(i) == QLatin1Char('*'))
+ asteriskPositions.append(i);
+ }
+ asteriskPositions.append(warningSize);
+
+ pattern.append(QLatin1Char('^'));
+ int lastPos = 0;
+ for (int a = 0, aSize = asteriskPositions.size(); a < aSize; ++a) {
+ if (a)
+ pattern.append(QStringLiteral(".*"));
+ const int nextPos = asteriskPositions.at(a);
+ if (nextPos > lastPos)
+ pattern.append(QRegularExpression::escape(warning.mid(lastPos, nextPos - lastPos)));
+ lastPos = nextPos + 1;
+ }
+ pattern.append(QLatin1Char('$'));
+ }
+
+ const QRegularExpression expression(pattern);
+ if (!expression.isValid()) {
+ *errorMessage = QLatin1String("Invalid message pattern \"") + warning
+ + QLatin1String("\": ") + expression.errorString();
+ return false;
+ }
+
+ m_suppressedWarnings.append(expression);
+ return true;
}
bool TypeDatabase::isSuppressedWarning(const QString& s) const
@@ -360,37 +443,28 @@ bool TypeDatabase::isSuppressedWarning(const QString& s) const
if (!m_suppressWarnings)
return false;
- foreach (const QString &_warning, m_suppressedWarnings) {
- QString warning = _warning;
- warning.replace(QLatin1String("\\*"), QLatin1String("&place_holder_for_asterisk;"));
-
- QStringList segs = warning.split(QLatin1Char('*'), QString::SkipEmptyParts);
- if (!segs.size())
- continue;
-
- int i = 0;
- int pos = s.indexOf(QString(segs.at(i++)).replace(QLatin1String("&place_holder_for_asterisk;"), QLatin1String("*")));
- //qDebug() << "s == " << s << ", warning == " << segs;
- while (pos != -1) {
- if (i == segs.size())
- return true;
- pos = s.indexOf(QString(segs.at(i++)).replace(QLatin1String("&place_holder_for_asterisk;"), QLatin1String("*")), pos);
- }
+ for (const QRegularExpression &warning : m_suppressedWarnings) {
+ if (warning.match(s).hasMatch())
+ return true;
}
return false;
}
-QString TypeDatabase::modifiedTypesystemFilepath(const QString& tsFile) const
+QString TypeDatabase::modifiedTypesystemFilepath(const QString& tsFile, const QString &currentPath) const
{
const QFileInfo tsFi(tsFile);
if (tsFi.isAbsolute()) // No point in further lookups
return tsFi.absoluteFilePath();
if (tsFi.isFile()) // Make path absolute
return tsFi.absoluteFilePath();
- const QString fileName = tsFi.fileName();
- foreach (const QString &path, m_typesystemPaths) {
- const QFileInfo fi(path + QLatin1Char('/') + fileName);
+ if (!currentPath.isEmpty()) {
+ const QFileInfo fi(currentPath + QLatin1Char('/') + tsFile);
+ if (fi.isFile())
+ return fi.absoluteFilePath();
+ }
+ for (const QString &path : m_typesystemPaths) {
+ const QFileInfo fi(path + QLatin1Char('/') + tsFile);
if (fi.isFile())
return fi.absoluteFilePath();
}
@@ -399,7 +473,13 @@ QString TypeDatabase::modifiedTypesystemFilepath(const QString& tsFile) const
bool TypeDatabase::parseFile(const QString &filename, bool generate)
{
- QString filepath = modifiedTypesystemFilepath(filename);
+ return parseFile(filename, QString(), generate);
+}
+
+bool TypeDatabase::parseFile(const QString &filename, const QString &currentPath, bool generate)
+{
+
+ QString filepath = modifiedTypesystemFilepath(filename, currentPath);
if (m_parsedTypesystemFiles.contains(filepath))
return m_parsedTypesystemFiles[filepath];
@@ -408,8 +488,11 @@ bool TypeDatabase::parseFile(const QString &filename, bool generate)
QFile file(filepath);
if (!file.exists()) {
m_parsedTypesystemFiles[filepath] = false;
- qCWarning(lcShiboken).noquote().nospace()
- << "Can't find " << filename << ", typesystem paths: " << m_typesystemPaths.join(QLatin1String(", "));
+ QString message = QLatin1String("Can't find ") + filename;
+ if (!currentPath.isEmpty())
+ message += QLatin1String(", current path: ") + currentPath;
+ message += QLatin1String(", typesystem paths: ") + m_typesystemPaths.join(QLatin1String(", "));
+ qCWarning(lcShiboken).noquote().nospace() << message;
return false;
}
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
@@ -440,9 +523,9 @@ bool TypeDatabase::parseFile(QIODevice* device, bool generate)
PrimitiveTypeEntry *TypeDatabase::findPrimitiveType(const QString& name) const
{
- QList<TypeEntry*> entries = findTypes(name);
+ const TypeEntryList &entries = findTypes(name);
- foreach (TypeEntry* entry, entries) {
+ for (TypeEntry *entry : entries) {
if (entry && entry->isPrimitive() && static_cast<PrimitiveTypeEntry*>(entry)->preferredTargetLangType())
return static_cast<PrimitiveTypeEntry*>(entry);
}
@@ -452,8 +535,8 @@ PrimitiveTypeEntry *TypeDatabase::findPrimitiveType(const QString& name) const
ComplexTypeEntry* TypeDatabase::findComplexType(const QString& name) const
{
- QList<TypeEntry*> entries = findTypes(name);
- foreach (TypeEntry* entry, entries) {
+ const TypeEntryList &entries = findTypes(name);
+ for (TypeEntry *entry : entries) {
if (entry && entry->isComplex())
return static_cast<ComplexTypeEntry*>(entry);
}
@@ -462,8 +545,8 @@ ComplexTypeEntry* TypeDatabase::findComplexType(const QString& name) const
ObjectTypeEntry* TypeDatabase::findObjectType(const QString& name) const
{
- QList<TypeEntry*> entries = findTypes(name);
- foreach (TypeEntry* entry, entries) {
+ const TypeEntryList &entries = findTypes(name);
+ for (TypeEntry *entry : entries) {
if (entry && entry->isObject())
return static_cast<ObjectTypeEntry*>(entry);
}
@@ -472,8 +555,8 @@ ObjectTypeEntry* TypeDatabase::findObjectType(const QString& name) const
NamespaceTypeEntry* TypeDatabase::findNamespaceType(const QString& name) const
{
- QList<TypeEntry*> entries = findTypes(name);
- foreach (TypeEntry* entry, entries) {
+ const TypeEntryList &entries = findTypes(name);
+ for (TypeEntry *entry : entries) {
if (entry && entry->isNamespace())
return static_cast<NamespaceTypeEntry*>(entry);
}
@@ -518,13 +601,13 @@ static bool compareTypeEntriesByName(const TypeEntry* t1, const TypeEntry* t2)
static void _computeTypeIndexes()
{
TypeDatabase* tdb = TypeDatabase::instance();
- typedef QMap<int, QList<TypeEntry*> > GroupedTypeEntries;
+ typedef QMap<int, TypeEntryList> GroupedTypeEntries;
GroupedTypeEntries groupedEntries;
// Group type entries by revision numbers
- TypeEntryHash allEntries = tdb->allEntries();
- foreach (QList<TypeEntry*> entryList, allEntries) {
- foreach (TypeEntry* entry, entryList) {
+ const TypeEntryHash &allEntries = tdb->allEntries();
+ for (TypeEntryHash::const_iterator tit = allEntries.cbegin(), end = allEntries.cend(); tit != end; ++tit) {
+ for (TypeEntry *entry : tit.value()) {
if (entry->isPrimitive()
|| entry->isContainer()
|| entry->isFunction()
@@ -543,12 +626,12 @@ static void _computeTypeIndexes()
GroupedTypeEntries::iterator it = groupedEntries.begin();
for (; it != groupedEntries.end(); ++it) {
// Remove duplicates
- QList<TypeEntry*>::iterator newEnd = std::unique(it.value().begin(), it.value().end());
+ TypeEntryList::iterator newEnd = std::unique(it.value().begin(), it.value().end());
it.value().erase(newEnd, it.value().end());
// Sort the type entries by name
qSort(it.value().begin(), newEnd, compareTypeEntriesByName);
- foreach (TypeEntry* entry, it.value()) {
+ for (TypeEntry *entry : qAsConst(it.value())) {
(*typeEntryFields())[entry].second = maxTypeIndex++;
}
}
@@ -614,7 +697,12 @@ QDebug operator<<(QDebug d, const TypeEntry *te)
d.nospace();
d << "TypeEntry(";
if (te) {
- d << '"' << te->qualifiedCppName() << "\", type=" << te->type();
+ const QString name = te->name();
+ const QString cppName = te->qualifiedCppName();
+ d << '"' << name << '"';
+ if (name != cppName)
+ d << "\", cppName=\"" << cppName << '"';
+ d << ", type=" << te->type();
if (te->include().isValid())
d << ", include=" << te->include();
const IncludeList &extraIncludes = te->extraIncludes();
@@ -640,7 +728,7 @@ QDebug operator<<(QDebug d, const TemplateEntry *te)
d.nospace();
d << "TemplateEntry(";
if (te) {
- d << '"' << te->name() << "\", version=" << te->version();
+ d << '"' << te->name() << '"';
} else {
d << '0';
}
diff --git a/sources/shiboken2/ApiExtractor/typedatabase.h b/sources/shiboken2/ApiExtractor/typedatabase.h
index 4255cf458..dfddfc300 100644
--- a/sources/shiboken2/ApiExtractor/typedatabase.h
+++ b/sources/shiboken2/ApiExtractor/typedatabase.h
@@ -31,9 +31,11 @@
#include "apiextractormacros.h"
#include "include.h"
+#include "typedatabase_typedefs.h"
#include "typesystem_enums.h"
#include "typesystem_typedefs.h"
+#include <QtCore/QRegularExpression>
#include <QtCore/QStringList>
QT_FORWARD_DECLARE_CLASS(QIODevice)
@@ -95,16 +97,22 @@ public:
SingleTypeEntryHash entries() const;
- QList<const PrimitiveTypeEntry*> primitiveTypes() const;
+ PrimitiveTypeEntryList primitiveTypes() const;
- QList<const ContainerTypeEntry*> containerTypes() const;
+ ContainerTypeEntryList containerTypes() const;
- void addRejection(const QString& className, const QString& functionName,
- const QString& fieldName, const QString& enumName);
- bool isClassRejected(const QString& className) const;
- bool isFunctionRejected(const QString& className, const QString& functionName) const;
- bool isFieldRejected(const QString& className, const QString& fieldName) const;
- bool isEnumRejected(const QString& className, const QString& enumName) const;
+ void addRejection(const TypeRejection &);
+ bool isClassRejected(const QString& className, QString *reason = nullptr) const;
+ bool isFunctionRejected(const QString& className, const QString& functionName,
+ QString *reason = nullptr) const;
+ bool isFieldRejected(const QString& className, const QString& fieldName,
+ QString *reason = nullptr) const;
+ bool isEnumRejected(const QString& className, const QString& enumName,
+ QString *reason = nullptr) const;
+ bool isArgumentTypeRejected(const QString& className, const QString& typeName,
+ QString *reason = nullptr) const;
+ bool isReturnTypeRejected(const QString& className, const QString& typeName,
+ QString *reason = nullptr) const;
void addType(TypeEntry* e);
@@ -127,13 +135,15 @@ public:
void setSuppressWarnings(bool on) { m_suppressWarnings = on; }
- void addSuppressedWarning(const QString &s);
+ bool addSuppressedWarning(const QString &warning, QString *errorMessage);
bool isSuppressedWarning(const QString& s) const;
static QString globalNamespaceClassName(const TypeEntry *te);
bool parseFile(const QString &filename, bool generate = true);
+ bool parseFile(const QString &filename, const QString &currentPath, bool generate);
+
bool parseFile(QIODevice* device, bool generate = true);
bool setApiVersion(const QString& package, const QString& version);
@@ -146,18 +156,19 @@ public:
void setDropTypeEntries(QStringList dropTypeEntries);
+ QString modifiedTypesystemFilepath(const QString &tsFile, const QString &currentPath = QString()) const;
+
#ifndef QT_NO_DEBUG_STREAM
void formatDebug(QDebug &d) const;
#endif
private:
- QList<TypeEntry *> findTypes(const QString &name) const;
- QString modifiedTypesystemFilepath(const QString &tsFile) const;
+ TypeEntryList findTypes(const QString &name) const;
bool m_suppressWarnings;
TypeEntryHash m_entries;
SingleTypeEntryHash m_flagsEntries;
TemplateEntryHash m_templates;
- QStringList m_suppressedWarnings;
+ QVector<QRegularExpression> m_suppressedWarnings;
AddedFunctionList m_globalUserFunctions;
FunctionModificationList m_functionMods;
@@ -167,7 +178,7 @@ private:
QStringList m_typesystemPaths;
QHash<QString, bool> m_parsedTypesystemFiles;
- QList<TypeRejection> m_rejections;
+ QVector<TypeRejection> m_rejections;
QStringList m_dropTypeEntries;
};
diff --git a/sources/shiboken2/ApiExtractor/asttoxml.h b/sources/shiboken2/ApiExtractor/typedatabase_typedefs.h
index ed2a04833..95859a399 100644
--- a/sources/shiboken2/ApiExtractor/asttoxml.h
+++ b/sources/shiboken2/ApiExtractor/typedatabase_typedefs.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of PySide2.
@@ -26,21 +26,24 @@
**
****************************************************************************/
+#ifndef TYPEDATABASE_TYPEDEFS_H
+#define TYPEDATABASE_TYPEDEFS_H
-#ifndef ASTTOXML
-#define ASTTOXML
-
-#include "parser/codemodel_fwd.h"
-
+#include <QtCore/QHash>
#include <QtCore/QString>
+#include <QtCore/QVector>
-QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter)
+class ContainerTypeEntry;
+class PrimitiveTypeEntry;
+class TemplateEntry;
+class TypeEntry;
-void astToXML(const QString name);
-void writeOutNamespace(QXmlStreamWriter &s, const NamespaceModelItem &item);
-void writeOutEnum(QXmlStreamWriter &s, const EnumModelItem &item);
-void writeOutFunction(QXmlStreamWriter &s, const FunctionModelItem &item);
-void writeOutClass(QXmlStreamWriter &s, const ClassModelItem &item);
+typedef QVector<TypeEntry *> TypeEntryList;
+typedef QHash<QString, TypeEntryList> TypeEntryHash;
+typedef QHash<QString, TypeEntry *> SingleTypeEntryHash;
+typedef QHash<QString, TemplateEntry *> TemplateEntryHash;
+typedef QVector<const ContainerTypeEntry *> ContainerTypeEntryList;
+typedef QVector<const PrimitiveTypeEntry *> PrimitiveTypeEntryList;
-#endif // ASTTOXML
+#endif // TYPEDATABASE_TYPEDEFS_H
diff --git a/sources/shiboken2/ApiExtractor/typeparser.cpp b/sources/shiboken2/ApiExtractor/typeparser.cpp
index 67120a1ac..09439a210 100644
--- a/sources/shiboken2/ApiExtractor/typeparser.cpp
+++ b/sources/shiboken2/ApiExtractor/typeparser.cpp
@@ -286,7 +286,7 @@ QString TypeParser::Info::instantiationName() const
QString s(qualified_name.join(QLatin1String("::")));
if (!template_instantiations.isEmpty()) {
QStringList insts;
- foreach (const Info &info, template_instantiations)
+ for (const Info &info : template_instantiations)
insts << info.toString();
s += QLatin1String("< ") + insts.join(QLatin1String(", ")) + QLatin1String(" >");
}
@@ -316,3 +316,47 @@ QString TypeParser::Info::toString() const
}
return s;
}
+
+#ifndef QT_NO_DEBUG_STREAM
+
+static void formatTypeInfo(QDebug &d, const TypeParser::Info &i)
+{
+ if (i.is_busted) {
+ d << "busted";
+ return;
+ }
+
+ d << '"' << i.qualified_name << '"';
+ if (!i.arrays.isEmpty()) {
+ d << ", arrays=";
+ for (const QString &a : i.arrays)
+ d << '[' << a << ']';
+ }
+ if (!i.template_instantiations.isEmpty()) {
+ d << ", template_instantiations=[";
+ for (int t = 0, size = i.template_instantiations.size(); t < size; ++t) {
+ if (t)
+ d << ", ";
+ formatTypeInfo(d, i.template_instantiations.at(t));
+ }
+ d << ']';
+ }
+ if (i.referenceType != NoReference)
+ d << ", refType=" << i.referenceType;
+ if (i.is_constant)
+ d << ", [const]";
+ if (i.indirections > 0)
+ d << ", indirections=" << i.indirections;
+}
+
+QDebug operator<<(QDebug d, const TypeParser::Info &i)
+{
+ QDebugStateSaver saver(d);
+ d.noquote();
+ d.nospace();
+ d << "TypeParser::Info(";
+ formatTypeInfo(d, i);
+ d << ')';
+ return d;
+}
+#endif // !QT_NO_DEBUG_STREAM
diff --git a/sources/shiboken2/ApiExtractor/typeparser.h b/sources/shiboken2/ApiExtractor/typeparser.h
index 9ccd0992c..568223656 100644
--- a/sources/shiboken2/ApiExtractor/typeparser.h
+++ b/sources/shiboken2/ApiExtractor/typeparser.h
@@ -34,6 +34,9 @@
#include <QtCore/QList>
#include <QtCore/QString>
#include <QtCore/QStringList>
+#include <QtCore/QVector>
+
+QT_FORWARD_DECLARE_CLASS(QDebug)
class TypeParser
{
@@ -43,7 +46,7 @@ public:
Info() : referenceType(NoReference), is_constant(false), is_busted(false), indirections(0) { }
QStringList qualified_name;
QStringList arrays;
- QList<Info> template_instantiations;
+ QVector<Info> template_instantiations;
ReferenceType referenceType;
uint is_constant : 1;
uint is_busted : 1;
@@ -56,4 +59,8 @@ public:
static Info parse(const QString &str, QString *errorMessage = Q_NULLPTR);
};
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug d, const TypeParser::Info &);
+#endif
+
#endif // TYPEPARSER_H
diff --git a/sources/shiboken2/ApiExtractor/typesystem.cpp b/sources/shiboken2/ApiExtractor/typesystem.cpp
index 869904d43..69dccbb86 100644
--- a/sources/shiboken2/ApiExtractor/typesystem.cpp
+++ b/sources/shiboken2/ApiExtractor/typesystem.cpp
@@ -32,6 +32,9 @@
#include "reporthandler.h"
#include <QtCore/QDir>
#include <QtCore/QFile>
+#include <QtCore/QFileInfo>
+#include <QtCore/QRegularExpression>
+#include <QtCore/QSet>
#include <QtCore/QXmlStreamAttributes>
#include <QtCore/QXmlStreamReader>
@@ -44,11 +47,92 @@ static QString strings_jobject = QLatin1String("jobject");
static inline QString colonColon() { return QStringLiteral("::"); }
static inline QString quoteAfterLineAttribute() { return QStringLiteral("quote-after-line"); }
static inline QString quoteBeforeLineAttribute() { return QStringLiteral("quote-before-line"); }
+static inline QString textAttribute() { return QStringLiteral("text"); }
static inline QString nameAttribute() { return QStringLiteral("name"); }
static inline QString sinceAttribute() { return QStringLiteral("since"); }
static inline QString flagsAttribute() { return QStringLiteral("flags"); }
+static inline QString classAttribute() { return QStringLiteral("class"); }
+static inline QString functionNameAttribute() { return QStringLiteral("function-name"); }
+static inline QString fieldNameAttribute() { return QStringLiteral("field-name"); }
+static inline QString enumNameAttribute() { return QStringLiteral("enum-name"); }
+static inline QString argumentTypeAttribute() { return QStringLiteral("argument-type"); }
+static inline QString returnTypeAttribute() { return QStringLiteral("return-type"); }
+static inline QString xPathAttribute() { return QStringLiteral("xpath"); }
+static inline QString enumIdentifiedByValueAttribute() { return QStringLiteral("identified-by-value"); }
+
+static inline QString noAttributeValue() { return QStringLiteral("no"); }
+static inline QString yesAttributeValue() { return QStringLiteral("yes"); }
+static inline QString trueAttributeValue() { return QStringLiteral("true"); }
+static inline QString falseAttributeValue() { return QStringLiteral("false"); }
+
+static QVector<CustomConversion *> customConversionsForReview;
+
+// Set a regular expression for rejection from text. By legacy, those are fixed
+// strings, except for '*' meaning 'match all'. Enclosing in "^..$"
+// indicates regular expression.
+static bool setRejectionRegularExpression(const QString &patternIn,
+ QRegularExpression *re,
+ QString *errorMessage)
+{
+ QString pattern;
+ if (patternIn.startsWith(QLatin1Char('^')) && patternIn.endsWith(QLatin1Char('$')))
+ pattern = patternIn;
+ else if (patternIn == QLatin1String("*"))
+ pattern = QStringLiteral("^.*$");
+ else
+ pattern = QLatin1Char('^') + QRegularExpression::escape(patternIn) + QLatin1Char('$');
+ re->setPattern(pattern);
+ if (!re->isValid()) {
+ *errorMessage = QLatin1String("Invalid pattern \"") + patternIn
+ + QLatin1String("\": ") + re->errorString();
+ return false;
+ }
+ return true;
+}
+
+static bool addRejection(TypeDatabase *database, const QHash<QString, QString> &attributes,
+ QString *errorMessage)
+{
+ typedef QPair<QString, TypeRejection::MatchType> AttributeMatchTypePair;
+
+ TypeRejection rejection;
+
+ const QString className = attributes.value(classAttribute());
+ if (!setRejectionRegularExpression(className, &rejection.className, errorMessage))
+ return false;
+
+ static const AttributeMatchTypePair attributeMatchTypeMapping[] =
+ {{functionNameAttribute(), TypeRejection::Function},
+ {fieldNameAttribute(), TypeRejection::Field},
+ {enumNameAttribute(), TypeRejection::Enum},
+ {argumentTypeAttribute(), TypeRejection::ArgumentType},
+ {returnTypeAttribute(), TypeRejection::ReturnType}
+ };
+
+ // Search for non-empty attribute (function, field, enum)
+ const auto aend = attributes.cend();
+ for (const AttributeMatchTypePair &mapping : attributeMatchTypeMapping) {
+ const auto it = attributes.constFind(mapping.first);
+ if (it != aend && !it.value().isEmpty()) {
+ if (!setRejectionRegularExpression(it.value(), &rejection.pattern, errorMessage))
+ return false;
+ rejection.matchType = mapping.second;
+ database->addRejection(rejection);
+ return true;
+ }
+ }
+
+ // Special case: When all fields except class are empty, completely exclude class
+ if (className == QLatin1String("*")) {
+ *errorMessage = QLatin1String("bad reject entry, neither 'class', 'function-name'"
+ " nor 'field' specified");
+ return false;
+ }
+ rejection.matchType = TypeRejection::ExcludeClass;
+ database->addRejection(rejection);
+ return true;
+}
-static QList<CustomConversion*> customConversionsForReview = QList<CustomConversion*>();
Handler::Handler(TypeDatabase* database, bool generate)
: m_database(database), m_generate(generate ? TypeEntry::GenerateAll : TypeEntry::GenerateForSubclass)
@@ -101,18 +185,26 @@ Handler::Handler(TypeDatabase* database, bool generate)
tagNames.insert(QLatin1String("no-null-pointer"), StackElement::NoNullPointers);
tagNames.insert(QLatin1String("reference-count"), StackElement::ReferenceCount);
tagNames.insert(QLatin1String("parent"), StackElement::ParentOwner);
+ tagNames.insert(QLatin1String("array"), StackElement::Array);
tagNames.insert(QLatin1String("inject-documentation"), StackElement::InjectDocumentation);
tagNames.insert(QLatin1String("modify-documentation"), StackElement::ModifyDocumentation);
tagNames.insert(QLatin1String("add-function"), StackElement::AddFunction);
}
+static QString readerFileName(const QXmlStreamReader &reader)
+{
+ const QFile *file = qobject_cast<const QFile *>(reader.device());
+ return file != nullptr ? file->fileName() : QString();
+}
+
static QString msgReaderError(const QXmlStreamReader &reader, const QString &what)
{
QString message;
QTextStream str(&message);
str << "Error: ";
- if (const QFile *file = qobject_cast<const QFile *>(reader.device()))
- str << "file=" << QDir::toNativeSeparators(file->fileName()) << ", ";
+ const QString fileName = readerFileName(reader);
+ if (!fileName.isEmpty())
+ str << "file=" << QDir::toNativeSeparators(fileName) << ", ";
str << "line=" << reader.lineNumber() << ", column=" << reader.columnNumber()
<< ", message=" << what;
return message;
@@ -126,6 +218,11 @@ static QString msgReaderError(const QXmlStreamReader &reader)
bool Handler::parse(QXmlStreamReader &reader)
{
m_error.clear();
+ m_currentPath.clear();
+ const QString fileName = readerFileName(reader);
+ if (!fileName.isEmpty())
+ m_currentPath = QFileInfo(fileName).absolutePath();
+
while (!reader.atEnd()) {
switch (reader.readNext()) {
case QXmlStreamReader::NoToken:
@@ -209,8 +306,9 @@ bool Handler::endElement(const QStringRef &localName)
if (m_generate == TypeEntry::GenerateAll) {
TypeDatabase::instance()->addGlobalUserFunctions(m_contextStack.top()->addedFunctions);
TypeDatabase::instance()->addGlobalUserFunctionModifications(m_contextStack.top()->functionMods);
- foreach (CustomConversion* customConversion, customConversionsForReview) {
- foreach (CustomConversion::TargetToNativeConversion* toNative, customConversion->targetToNativeConversions())
+ for (CustomConversion *customConversion : qAsConst(customConversionsForReview)) {
+ const CustomConversion::TargetToNativeConversions &toNatives = customConversion->targetToNativeConversions();
+ for (CustomConversion::TargetToNativeConversion *toNative : toNatives)
toNative->setSourceType(m_database->findType(toNative->sourceTypeName()));
}
}
@@ -281,6 +379,7 @@ bool Handler::endElement(const QStringRef &localName)
m_current->parent->entry->setCodeSnips(snips);
break;
}
+ Q_FALLTHROUGH();
case StackElement::NativeToTarget:
case StackElement::AddConversion:
m_contextStack.top()->codeSnips.last().addTemplateInstance(m_current->value.templateInstance);
@@ -441,21 +540,22 @@ bool Handler::importFileElement(const QXmlStreamAttributes &atts)
return true;
}
-bool Handler::convertBoolean(const QString &_value, const QString &attributeName, bool defaultValue)
+static bool convertBoolean(const QString &value, const QString &attributeName, bool defaultValue)
{
- QString value = _value.toLower();
- if (value == QLatin1String("true") || value == QLatin1String("yes"))
+ if (value.compare(trueAttributeValue(), Qt::CaseInsensitive) == 0
+ || value.compare(yesAttributeValue(), Qt::CaseInsensitive) == 0) {
return true;
- else if (value == QLatin1String("false") || value == QLatin1String("no"))
+ }
+ if (value.compare(falseAttributeValue(), Qt::CaseInsensitive) == 0
+ || value.compare(noAttributeValue(), Qt::CaseInsensitive) == 0) {
return false;
- else {
- QString warn = QStringLiteral("Boolean value '%1' not supported in attribute '%2'. Use 'yes' or 'no'. Defaulting to '%3'.")
+ }
+ const QString warn = QStringLiteral("Boolean value '%1' not supported in attribute '%2'. Use 'yes' or 'no'. Defaulting to '%3'.")
.arg(value, attributeName,
- defaultValue ? QLatin1String("yes") : QLatin1String("no"));
+ defaultValue ? yesAttributeValue() : noAttributeValue());
- qCWarning(lcShiboken).noquote().nospace() << warn;
- return defaultValue;
- }
+ qCWarning(lcShiboken).noquote().nospace() << warn;
+ return defaultValue;
}
static bool convertRemovalAttribute(const QString& removalAttribute, Modification& mod, QString& errorMsg)
@@ -493,7 +593,8 @@ static QString getNamePrefix(StackElement* element)
static QString checkSignatureError(const QString& signature, const QString& tag)
{
QString funcName = signature.left(signature.indexOf(QLatin1Char('('))).trimmed();
- static QRegExp whiteSpace(QLatin1String("\\s"));
+ static const QRegularExpression whiteSpace(QStringLiteral("\\s"));
+ Q_ASSERT(whiteSpace.isValid());
if (!funcName.startsWith(QLatin1String("operator ")) && funcName.contains(whiteSpace)) {
return QString::fromLatin1("Error in <%1> tag signature attribute '%2'.\n"
"White spaces aren't allowed in function names, "
@@ -521,11 +622,10 @@ void Handler::addFlags(const QString &name, QString flagName,
if (QStringList(lst.mid(0, lst.size() - 1)).join(colonColon()) != m_currentEnum->targetLangQualifier()) {
qCWarning(lcShiboken).noquote().nospace()
<< QStringLiteral("enum %1 and flags %2 differ in qualifiers")
- // avoid constFirst to stay Qt 5.5 compatible
- .arg(m_currentEnum->targetLangQualifier(), lst.first());
+ .arg(m_currentEnum->targetLangQualifier(), lst.constFirst());
}
- ftype->setFlagsName(lst.last());
+ ftype->setFlagsName(lst.constLast());
m_currentEnum->setFlags(ftype);
m_database->addFlagsType(ftype);
@@ -640,8 +740,8 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
case StackElement::PrimitiveTypeEntry:
attributes.insert(QLatin1String("target-lang-name"), QString());
attributes.insert(QLatin1String("target-lang-api-name"), QString());
- attributes.insert(QLatin1String("preferred-conversion"), QLatin1String("yes"));
- attributes.insert(QLatin1String("preferred-target-lang-type"), QLatin1String("yes"));
+ attributes.insert(QLatin1String("preferred-conversion"), yesAttributeValue());
+ attributes.insert(QLatin1String("preferred-target-lang-type"), yesAttributeValue());
attributes.insert(QLatin1String("default-constructor"), QString());
break;
case StackElement::ContainerTypeEntry:
@@ -657,35 +757,36 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
attributes.insert(QLatin1String("flags-revision"), QString());
attributes.insert(QLatin1String("upper-bound"), QString());
attributes.insert(QLatin1String("lower-bound"), QString());
- attributes.insert(QLatin1String("force-integer"), QLatin1String("no"));
- attributes.insert(QLatin1String("extensible"), QLatin1String("no"));
- attributes.insert(QLatin1String("identified-by-value"), QString());
+ attributes.insert(QLatin1String("force-integer"), noAttributeValue());
+ attributes.insert(QLatin1String("extensible"), noAttributeValue());
+ attributes.insert(enumIdentifiedByValueAttribute(), QString());
+ attributes.insert(classAttribute(), falseAttributeValue());
break;
case StackElement::ValueTypeEntry:
attributes.insert(QLatin1String("default-constructor"), QString());
- // fall throooough
+ Q_FALLTHROUGH();
case StackElement::ObjectTypeEntry:
- attributes.insert(QLatin1String("force-abstract"), QLatin1String("no"));
- attributes.insert(QLatin1String("deprecated"), QLatin1String("no"));
+ attributes.insert(QLatin1String("force-abstract"), noAttributeValue());
+ attributes.insert(QLatin1String("deprecated"), noAttributeValue());
attributes.insert(QLatin1String("hash-function"), QString());
- attributes.insert(QLatin1String("stream"), QLatin1String("no"));
- // fall throooough
+ attributes.insert(QLatin1String("stream"), noAttributeValue());
+ Q_FALLTHROUGH();
case StackElement::InterfaceTypeEntry:
attributes[QLatin1String("default-superclass")] = m_defaultSuperclass;
attributes.insert(QLatin1String("polymorphic-id-expression"), QString());
- attributes.insert(QLatin1String("delete-in-main-thread"), QLatin1String("no"));
+ attributes.insert(QLatin1String("delete-in-main-thread"), noAttributeValue());
attributes.insert(QLatin1String("held-type"), QString());
attributes.insert(QLatin1String("copyable"), QString());
- // fall through
+ Q_FALLTHROUGH();
case StackElement::NamespaceTypeEntry:
attributes.insert(QLatin1String("target-lang-name"), QString());
attributes[QLatin1String("package")] = m_defaultPackage;
attributes.insert(QLatin1String("expense-cost"), QLatin1String("1"));
attributes.insert(QLatin1String("expense-limit"), QLatin1String("none"));
- attributes.insert(QLatin1String("polymorphic-base"), QLatin1String("no"));
- attributes.insert(QLatin1String("generate"), QLatin1String("yes"));
+ attributes.insert(QLatin1String("polymorphic-base"), noAttributeValue());
+ attributes.insert(QLatin1String("generate"), yesAttributeValue());
attributes.insert(QLatin1String("target-type"), QString());
- attributes.insert(QLatin1String("generic-class"), QLatin1String("no"));
+ attributes.insert(QLatin1String("generic-class"), noAttributeValue());
break;
case StackElement::FunctionTypeEntry:
attributes.insert(QLatin1String("signature"), QString());
@@ -725,14 +826,16 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
QString rename = attributes[QLatin1String("rename")];
if (!rename.isEmpty()) {
- static QRegExp functionNameRegExp(QLatin1String("^[a-zA-Z_][a-zA-Z0-9_]*$"));
- if (!functionNameRegExp.exactMatch(rename)) {
+ static const QRegularExpression functionNameRegExp(QLatin1String("^[a-zA-Z_][a-zA-Z0-9_]*$"));
+ Q_ASSERT(functionNameRegExp.isValid());
+ if (!functionNameRegExp.match(rename).hasMatch()) {
m_error = QLatin1String("can not rename '") + signature + QLatin1String("', '")
+ rename + QLatin1String("' is not a valid function name");
return false;
}
- FunctionModification mod(since);
- mod.signature = signature;
+ FunctionModification mod;
+ if (!mod.setSignature(signature, &m_error))
+ return false;
mod.renamedToName = attributes[QLatin1String("rename")];
mod.modifiers |= Modification::Rename;
m_contextStack.top()->functionMods << mod;
@@ -751,9 +854,10 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
if (element->type == StackElement::EnumTypeEntry) {
+ const QString identifiedByValue = attributes.value(enumIdentifiedByValueAttribute());
if (name.isEmpty()) {
- name = attributes[QLatin1String("identified-by-value")];
- } else if (!attributes[QLatin1String("identified-by-value")].isEmpty()) {
+ name = identifiedByValue;
+ } else if (!identifiedByValue.isEmpty()) {
m_error = QLatin1String("can't specify both 'name' and 'identified-by-value' attributes");
return false;
}
@@ -837,8 +941,12 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
else
m_currentEnum =
new EnumTypeEntry(QStringList(names.mid(0, names.size() - 1)).join(colonColon()),
- names.last(), since);
- m_currentEnum->setAnonymous(!attributes[QLatin1String("identified-by-value")].isEmpty());
+ names.constLast(), since);
+ if (!attributes.value(enumIdentifiedByValueAttribute()).isEmpty()) {
+ m_currentEnum->setEnumKind(EnumTypeEntry::AnonymousEnum);
+ } else if (convertBoolean(attributes.value(classAttribute()), classAttribute(), false)) {
+ m_currentEnum->setEnumKind(EnumTypeEntry::EnumClass);
+ }
element->entry = m_currentEnum;
m_currentEnum->setCodeGeneration(m_generate);
m_currentEnum->setTargetLangPackage(m_defaultPackage);
@@ -850,7 +958,8 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
// put in the flags parallel...
const QString flagNames = attributes.value(flagsAttribute());
if (!flagNames.isEmpty()) {
- foreach (const QString &flagName, flagNames.split(QLatin1Char(',')))
+ const QStringList &flagNameList = flagNames.split(QLatin1Char(','));
+ for (const QString &flagName : flagNameList)
addFlags(name, flagName.trimmed(), attributes, since);
}
}
@@ -872,7 +981,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
itype->setOrigin(otype);
element->entry = otype;
}
- // fall through
+ Q_FALLTHROUGH();
case StackElement::ValueTypeEntry: {
if (!element->entry) {
ValueTypeEntry* typeEntry = new ValueTypeEntry(name, since);
@@ -882,17 +991,17 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
element->entry = typeEntry;
}
- // fall through
+ Q_FALLTHROUGH();
case StackElement::NamespaceTypeEntry:
if (!element->entry)
element->entry = new NamespaceTypeEntry(name, since);
- // fall through
+ Q_FALLTHROUGH();
case StackElement::ObjectTypeEntry:
if (!element->entry)
element->entry = new ObjectTypeEntry(name, since);
- element->entry->setStream(attributes[QLatin1String("stream")] == QLatin1String("yes"));
+ element->entry->setStream(attributes[QLatin1String("stream")] == yesAttributeValue());
ComplexTypeEntry *ctype = static_cast<ComplexTypeEntry *>(element->entry);
ctype->setTargetLangPackage(attributes[QLatin1String("package")]);
@@ -908,16 +1017,6 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
if (!targetLangName.isEmpty())
ctype->setTargetLangName(targetLangName);
- // The expense policy
- QString limit = attributes[QLatin1String("expense-limit")];
- if (!limit.isEmpty() && limit != QLatin1String("none")) {
- ExpensePolicy ep;
- ep.limit = limit.toInt();
- ep.cost = attributes[QLatin1String("expense-cost")];
- ctype->setExpensePolicy(ep);
- }
-
-
ctype->setIsPolymorphicBase(convertBoolean(attributes[QLatin1String("polymorphic-base")], QLatin1String("polymorphic-base"), false));
ctype->setPolymorphicIdValue(attributes[QLatin1String("polymorphic-id-expression")]);
//Copyable
@@ -1001,7 +1100,6 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
attributes.insert(sinceAttribute(), QLatin1String("0"));
fetchAttributeValues(tagName, atts, &attributes);
- double since = attributes[sinceAttribute()].toDouble();
const int validParent = StackElement::TypeEntryMask
| StackElement::ModifyFunction
@@ -1034,8 +1132,8 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
QString signature = m_current->type & StackElement::TypeEntryMask ? QString() : m_currentSignature;
- DocModification mod(mode, signature, since);
- mod.format = lang;
+ DocModification mod(mode, signature);
+ mod.setFormat(lang);
m_contextStack.top()->docModifications << mod;
} else {
m_error = QLatin1String("inject-documentation must be inside modify-function, "
@@ -1045,17 +1143,17 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
} else if (element->type == StackElement::ModifyDocumentation) {
// check the XML tag attributes
QHash<QString, QString> attributes;
- attributes.insert(QLatin1String("xpath"), QString());
+ attributes.insert(xPathAttribute(), QString());
attributes.insert(sinceAttribute(), QLatin1String("0"));
fetchAttributeValues(tagName, atts, &attributes);
- double since = attributes[sinceAttribute()].toDouble();
const int validParent = StackElement::TypeEntryMask
| StackElement::ModifyFunction
| StackElement::ModifyField;
if (m_current->parent && m_current->parent->type & validParent) {
QString signature = (m_current->type & StackElement::TypeEntryMask) ? QString() : m_currentSignature;
- m_contextStack.top()->docModifications << DocModification(attributes[QLatin1String("xpath")], signature, since);
+ m_contextStack.top()->docModifications
+ << DocModification(attributes.value(xPathAttribute()), signature);
} else {
m_error = QLatin1String("modify-documentation must be inside modify-function, "
"modify-field or other tags that creates a type");
@@ -1089,13 +1187,13 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
break;
case StackElement::LoadTypesystem:
attributes.insert(nameAttribute(), QString());
- attributes.insert(QLatin1String("generate"), QLatin1String("yes"));
+ attributes.insert(QLatin1String("generate"), yesAttributeValue());
break;
case StackElement::NoNullPointers:
attributes.insert(QLatin1String("default-value"), QString());
break;
case StackElement::SuppressedWarning:
- attributes.insert(QLatin1String("text"), QString());
+ attributes.insert(textAttribute(), QString());
break;
case StackElement::ReplaceDefaultExpression:
attributes.insert(QLatin1String("with"), QString());
@@ -1108,28 +1206,28 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
attributes.insert(QLatin1String("signature"), QString());
attributes.insert(QLatin1String("return-type"), QLatin1String("void"));
attributes.insert(QLatin1String("access"), QLatin1String("public"));
- attributes.insert(QLatin1String("static"), QLatin1String("no"));
+ attributes.insert(QLatin1String("static"), noAttributeValue());
break;
case StackElement::ModifyFunction:
attributes.insert(QLatin1String("signature"), QString());
attributes.insert(QLatin1String("access"), QString());
attributes.insert(QLatin1String("remove"), QString());
attributes.insert(QLatin1String("rename"), QString());
- attributes.insert(QLatin1String("deprecated"), QLatin1String("no"));
+ attributes.insert(QLatin1String("deprecated"), noAttributeValue());
attributes.insert(QLatin1String("associated-to"), QString());
- attributes.insert(QLatin1String("virtual-slot"), QLatin1String("no"));
- attributes.insert(QLatin1String("thread"), QLatin1String("no"));
- attributes.insert(QLatin1String("allow-thread"), QLatin1String("no"));
+ attributes.insert(QLatin1String("virtual-slot"), noAttributeValue());
+ attributes.insert(QLatin1String("thread"), noAttributeValue());
+ attributes.insert(QLatin1String("allow-thread"), noAttributeValue());
break;
case StackElement::ModifyArgument:
attributes.insert(QLatin1String("index"), QString());
attributes.insert(QLatin1String("replace-value"), QString());
- attributes.insert(QLatin1String("invalidate-after-use"), QLatin1String("no"));
+ attributes.insert(QLatin1String("invalidate-after-use"), noAttributeValue());
break;
case StackElement::ModifyField:
attributes.insert(nameAttribute(), QString());
- attributes.insert(QLatin1String("write"), QLatin1String("true"));
- attributes.insert(QLatin1String("read"), QLatin1String("true"));
+ attributes.insert(QLatin1String("write"), trueAttributeValue());
+ attributes.insert(QLatin1String("read"), trueAttributeValue());
attributes.insert(QLatin1String("remove"), QString());
break;
case StackElement::Access:
@@ -1160,7 +1258,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
attributes.insert(QLatin1String("file"), QString());
break;
case StackElement::TargetToNative:
- attributes.insert(QLatin1String("replace"), QLatin1String("yes"));
+ attributes.insert(QLatin1String("replace"), yesAttributeValue());
break;
case StackElement::AddConversion:
attributes.insert(QLatin1String("type"), QString());
@@ -1177,10 +1275,12 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
attributes.insert(QLatin1String("to"), QString());
break;
case StackElement::Rejection:
- attributes.insert(QLatin1String("class"), QLatin1String("*"));
- attributes.insert(QLatin1String("function-name"), QLatin1String("*"));
- attributes.insert(QLatin1String("field-name"), QLatin1String("*"));
- attributes.insert(QLatin1String("enum-name"), QLatin1String("*"));
+ attributes.insert(classAttribute(), QString());
+ attributes.insert(functionNameAttribute(), QString());
+ attributes.insert(fieldNameAttribute(), QString());
+ attributes.insert(enumNameAttribute(), QString());
+ attributes.insert(argumentTypeAttribute(), QString());
+ attributes.insert(returnTypeAttribute(), QString());
break;
case StackElement::Removal:
attributes.insert(QLatin1String("class"), QLatin1String("all"));
@@ -1202,6 +1302,9 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
case StackElement::ParentOwner:
attributes.insert(QLatin1String("index"), QString());
attributes.insert(QLatin1String("action"), QString());
+ break;
+ case StackElement::Array:
+ break;
default:
{ };
};
@@ -1238,19 +1341,18 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
return false;
}
bool generateChild = (convertBoolean(attributes[QLatin1String("generate")], QLatin1String("generate"), true) && (m_generate == TypeEntry::GenerateAll));
- if (!m_database->parseFile(name, generateChild)) {
+ if (!m_database->parseFile(name, m_currentPath, generateChild)) {
m_error = QStringLiteral("Failed to parse: '%1'").arg(name);
return false;
}
}
break;
- case StackElement::RejectEnumValue: {
+ case StackElement::RejectEnumValue:
if (!m_currentEnum) {
m_error = QLatin1String("<reject-enum-value> node must be used inside a <enum-type> node");
return false;
}
- QString name = attributes[nameAttribute()];
- } break;
+ break;
case StackElement::ReplaceType: {
if (topElement.type != StackElement::ModifyArgument) {
m_error = QLatin1String("Type replacement can only be specified for argument modifications");
@@ -1290,7 +1392,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
return false;
}
- CodeSnip snip(since);
+ CodeSnip snip;
snip.language = lang;
m_contextStack.top()->functionMods.last().argument_mods.last().conversion_rules.append(snip);
} else {
@@ -1332,7 +1434,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
m_error = QLatin1String("Native to Target conversion code can only be specified for custom conversion rules.");
return false;
}
- m_contextStack.top()->codeSnips << CodeSnip(0);
+ m_contextStack.top()->codeSnips << CodeSnip();
}
break;
case StackElement::TargetToNative: {
@@ -1340,7 +1442,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
m_error = QLatin1String("Target to Native conversions can only be specified for custom conversion rules.");
return false;
}
- bool replace = attributes[QLatin1String("replace")] == QLatin1String("yes");
+ bool replace = attributes[QLatin1String("replace")] == yesAttributeValue();
static_cast<TypeEntry*>(m_current->entry)->customConversion()->setReplaceOriginalTargetToNativeConversions(replace);
}
break;
@@ -1356,7 +1458,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
QString typeCheck = attributes[QLatin1String("check")];
static_cast<TypeEntry*>(m_current->entry)->customConversion()->addTargetToNativeConversion(sourceTypeName, typeCheck);
- m_contextStack.top()->codeSnips << CodeSnip(0);
+ m_contextStack.top()->codeSnips << CodeSnip();
}
break;
case StackElement::ModifyArgument: {
@@ -1388,7 +1490,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
return false;
}
- ArgumentModification argumentModification = ArgumentModification(idx, since);
+ ArgumentModification argumentModification = ArgumentModification(idx);
argumentModification.replace_value = replace_value;
argumentModification.resetAfterUse = convertBoolean(attributes[QLatin1String("invalidate-after-use")], QLatin1String("invalidate-after-use"), false);
m_contextStack.top()->functionMods.last().argument_mods.append(argumentModification);
@@ -1444,11 +1546,15 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
m_contextStack.top()->functionMods.last().argument_mods.last().ownerships[lang] = owner;
}
break;
- case StackElement::SuppressedWarning:
- if (attributes[QLatin1String("text")].isEmpty())
+ case StackElement::SuppressedWarning: {
+ const QString suppressedWarning = attributes.value(textAttribute());
+ if (suppressedWarning.isEmpty()) {
qCWarning(lcShiboken) << "Suppressed warning with no text specified";
- else
- m_database->addSuppressedWarning(attributes[QLatin1String("text")]);
+ } else {
+ if (!m_database->addSuppressedWarning(suppressedWarning, &m_error))
+ return false;
+ }
+ }
break;
case StackElement::ArgumentMap: {
if (!(topElement.type & StackElement::CodeSnipMask)) {
@@ -1586,8 +1692,8 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
QString read = attributes[QLatin1String("read")];
QString write = attributes[QLatin1String("write")];
- if (read == QLatin1String("true")) fm.modifiers |= FieldModification::Readable;
- if (write == QLatin1String("true")) fm.modifiers |= FieldModification::Writable;
+ if (read == trueAttributeValue()) fm.modifiers |= FieldModification::Readable;
+ if (write == trueAttributeValue()) fm.modifiers |= FieldModification::Writable;
m_contextStack.top()->fieldMods << fm;
}
@@ -1613,7 +1719,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
AddedFunction func(signature, attributes[QLatin1String("return-type")], since);
- func.setStatic(attributes[QLatin1String("static")] == QLatin1String("yes"));
+ func.setStatic(attributes[QLatin1String("static")] == yesAttributeValue());
if (!signature.contains(QLatin1Char('(')))
signature += QLatin1String("()");
m_currentSignature = signature;
@@ -1632,8 +1738,9 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
m_contextStack.top()->addedFunctions << func;
- FunctionModification mod(since);
- mod.signature = m_currentSignature;
+ FunctionModification mod;
+ if (!mod.setSignature(m_currentSignature, &m_error))
+ return false;
m_contextStack.top()->functionMods << mod;
}
break;
@@ -1657,8 +1764,10 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
return false;
}
- FunctionModification mod(since);
- m_currentSignature = mod.signature = signature;
+ FunctionModification mod;
+ if (!mod.setSignature(signature, &m_error))
+ return false;
+ m_currentSignature = signature;
QString access = attributes[QLatin1String("access")].toLower();
if (!access.isEmpty()) {
@@ -1746,8 +1855,8 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
if (rc.action == ReferenceCount::Invalid) {
m_error = QLatin1String("unrecognized value for action attribute. supported actions:");
- foreach (const QString &action, actions.keys())
- m_error += QLatin1Char(' ') + action;
+ for (QHash<QString, ReferenceCount::Action>::const_iterator it = actions.cbegin(), end = actions.cend(); it != end; ++it)
+ m_error += QLatin1Char(' ') + it.key();
}
m_contextStack.top()->functionMods.last().argument_mods.last().referenceCounts.append(rc);
@@ -1790,8 +1899,13 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
m_contextStack.top()->functionMods.last().argument_mods.last().owner = ao;
}
break;
-
-
+ case StackElement::Array:
+ if (topElement.type != StackElement::ModifyArgument) {
+ m_error = QLatin1String("array must be child of modify-argument");
+ return false;
+ }
+ m_contextStack.top()->functionMods.last().argument_mods.last().array = true;
+ break;
case StackElement::InjectCode: {
if (!(topElement.type & StackElement::ComplexTypeEntryMask)
&& (topElement.type != StackElement::AddFunction)
@@ -1837,7 +1951,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
return false;
}
- CodeSnip snip(since);
+ CodeSnip snip;
snip.language = languageNames[className];
snip.position = positionNames[position];
bool in_file = false;
@@ -1848,8 +1962,9 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
if (m_generate != TypeEntry::GenerateForSubclass &&
m_generate != TypeEntry::GenerateNothing &&
!file_name.isEmpty()) {
- if (QFile::exists(file_name)) {
- QFile codeFile(file_name);
+ const QString resolved = m_database->modifiedTypesystemFilepath(file_name, m_currentPath);
+ if (QFile::exists(resolved)) {
+ QFile codeFile(resolved);
if (codeFile.open(QIODevice::Text | QIODevice::ReadOnly)) {
QString content = QLatin1String("// ========================================================================\n"
"// START of custom code block [file: ");
@@ -1875,7 +1990,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
if (topElement.type == StackElement::ModifyFunction || topElement.type == StackElement::AddFunction) {
- FunctionModification mod = m_contextStack.top()->functionMods.last();
+ FunctionModification mod = m_contextStack.top()->functionMods.constLast();
if (snip.language == TypeSystem::ShellDeclaration) {
m_error = QLatin1String("no function implementation in shell declaration in which to inject code");
return false;
@@ -1930,21 +2045,12 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
}
}
break;
- case StackElement::Rejection: {
- QString cls = attributes[QLatin1String("class")];
- QString function = attributes[QLatin1String("function-name")];
- QString field = attributes[QLatin1String("field-name")];
- QString enum_ = attributes[QLatin1String("enum-name")];
- if (cls == QLatin1String("*") && function == QLatin1String("*") && field == QLatin1String("*") && enum_ == QLatin1String("*")) {
- m_error = QLatin1String("bad reject entry, neither 'class', 'function-name' nor "
- "'field' specified");
+ case StackElement::Rejection:
+ if (!addRejection(m_database, attributes, &m_error))
return false;
- }
- m_database->addRejection(cls, function, field, enum_);
- }
break;
case StackElement::Template:
- element->value.templateEntry = new TemplateEntry(attributes[nameAttribute()], since);
+ element->value.templateEntry = new TemplateEntry(attributes.value(nameAttribute()));
break;
case StackElement::TemplateInstanceEnum:
if (!(topElement.type & StackElement::CodeSnipMask) &&
@@ -1958,7 +2064,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
"custom-destructors, conversion-rule, native-to-target or add-conversion tags.");
return false;
}
- element->value.templateInstance = new TemplateInstance(attributes[nameAttribute()], since);
+ element->value.templateInstance = new TemplateInstance(attributes.value(nameAttribute()));
break;
case StackElement::Replace:
if (topElement.type != StackElement::TemplateInstanceEnum) {
@@ -1976,6 +2082,23 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts
return true;
}
+PrimitiveTypeEntry::PrimitiveTypeEntry(const QString &name, double vr) :
+ TypeEntry(name, PrimitiveType, vr),
+ m_preferredConversion(true),
+ m_preferredTargetLangType(true)
+{
+}
+
+QString PrimitiveTypeEntry::targetLangName() const
+{
+ return m_targetLangName;
+}
+
+QString PrimitiveTypeEntry::targetLangApiName() const
+{
+ return m_targetLangApiName;
+}
+
PrimitiveTypeEntry *PrimitiveTypeEntry::basicReferencedTypeEntry() const
{
if (!m_referencedTypeEntry)
@@ -1988,6 +2111,16 @@ PrimitiveTypeEntry *PrimitiveTypeEntry::basicReferencedTypeEntry() const
return m_referencedTypeEntry;
}
+bool PrimitiveTypeEntry::preferredConversion() const
+{
+ return m_preferredConversion;
+}
+
+void PrimitiveTypeEntry::setPreferredConversion(bool b)
+{
+ m_preferredConversion = b;
+}
+
typedef QHash<const PrimitiveTypeEntry*, QString> PrimitiveTypeEntryTargetLangPackageMap;
Q_GLOBAL_STATIC(PrimitiveTypeEntryTargetLangPackageMap, primitiveTypeEntryTargetLangPackages);
@@ -2021,7 +2154,7 @@ FunctionModificationList ComplexTypeEntry::functionModifications(const QString &
FunctionModificationList lst;
for (int i = 0; i < m_functionMods.count(); ++i) {
const FunctionModification &mod = m_functionMods.at(i);
- if (mod.signature == signature)
+ if (mod.matches(signature))
lst << mod;
}
return lst;
@@ -2038,6 +2171,17 @@ FieldModification ComplexTypeEntry::fieldModification(const QString &name) const
return mod;
}
+QString ComplexTypeEntry::targetLangPackage() const
+{
+ return m_package;
+}
+
+QString ComplexTypeEntry::targetLangName() const
+{
+ return m_targetLangName.isEmpty() ?
+ TypeEntry::targetLangName() : m_targetLangName;
+}
+
// The things we do not to break the ABI...
typedef QHash<const ComplexTypeEntry*, QString> ComplexTypeEntryDefaultConstructorMap;
Q_GLOBAL_STATIC(ComplexTypeEntryDefaultConstructorMap, complexTypeEntryDefaultConstructors);
@@ -2102,27 +2246,44 @@ QString EnumTypeEntry::targetLangQualifier() const
return m_qualifier;
}
+QString EnumTypeEntry::qualifiedTargetLangName() const
+{
+ QString qualifiedName;
+ QString pkg = targetLangPackage();
+ QString qualifier = targetLangQualifier();
+
+ if (!pkg.isEmpty())
+ qualifiedName += pkg + QLatin1Char('.');
+ if (!qualifier.isEmpty())
+ qualifiedName += qualifier + QLatin1Char('.');
+ qualifiedName += targetLangName();
+
+ return qualifiedName;
+}
+
QString EnumTypeEntry::targetLangApiName() const
{
return QLatin1String("jint");
}
+bool EnumTypeEntry::preferredConversion() const
+{
+ return false;
+}
+
QString FlagsTypeEntry::targetLangApiName() const
{
return QLatin1String("jint");
}
-void EnumTypeEntry::addEnumValueRedirection(const QString &rejected, const QString &usedValue)
+bool FlagsTypeEntry::preferredConversion() const
{
- m_enumRedirections << EnumValueRedirection(rejected, usedValue);
+ return false;
}
-QString EnumTypeEntry::enumValueRedirection(const QString &value) const
+QString FlagsTypeEntry::targetLangPackage() const
{
- for (int i = 0; i < m_enumRedirections.size(); ++i)
- if (m_enumRedirections.at(i).rejected == value)
- return m_enumRedirections.at(i).used;
- return QString();
+ return m_enum->targetLangPackage();
}
QString FlagsTypeEntry::qualifiedTargetLangName() const
@@ -2131,6 +2292,11 @@ QString FlagsTypeEntry::qualifiedTargetLangName() const
+ QLatin1Char('.') + targetLangName();
}
+QString FlagsTypeEntry::targetLangName() const
+{
+ return m_targetLangName;
+}
+
/*!
* The Visual Studio 2002 compiler doesn't support these symbols,
* which our typedefs unforntuatly expand to.
@@ -2172,7 +2338,7 @@ QString TemplateInstance::expandCode() const
QString CodeSnipAbstract::code() const
{
QString res;
- foreach (const CodeSnipFragment &codeFrag, codeList)
+ for (const CodeSnipFragment &codeFrag : codeList)
res.append(codeFrag.code());
return res;
@@ -2186,9 +2352,26 @@ QString CodeSnipFragment::code() const
return m_code;
}
+bool FunctionModification::setSignature(const QString &s, QString *errorMessage)
+{
+ if (s.startsWith(QLatin1Char('^'))) {
+ m_signaturePattern.setPattern(s);
+ if (!m_signaturePattern.isValid()) {
+ if (errorMessage) {
+ *errorMessage = QLatin1String("Invalid signature pattern: \"")
+ + s + QLatin1String("\": ") + m_signaturePattern.errorString();
+ }
+ return false;
+ }
+ } else {
+ m_signature = s;
+ }
+ return true;
+}
+
QString FunctionModification::toString() const
{
- QString str = signature + QLatin1String("->");
+ QString str = signature() + QLatin1String("->");
if (modifiers & AccessModifierMask) {
switch (modifiers & AccessModifierMask) {
case Private: str += QLatin1String("private"); break;
@@ -2205,7 +2388,7 @@ QString FunctionModification::toString() const
if (modifiers & Writable) str += QLatin1String("writable");
if (modifiers & CodeInjection) {
- foreach (const CodeSnip &s, snips) {
+ for (const CodeSnip &s : snips) {
str += QLatin1String("\n//code injection:\n");
str += s.code();
}
@@ -2220,41 +2403,11 @@ QString FunctionModification::toString() const
return str;
}
-bool FunctionModification::operator!=(const FunctionModification& other) const
-{
- return !(*this == other);
-}
-
-bool FunctionModification::operator==(const FunctionModification& other) const
-{
- if (signature != other.signature)
- return false;
-
- if (association != other.association)
- return false;
-
- if (modifiers != other.modifiers)
- return false;
-
- if (removal != other.removal)
- return false;
-
- if (m_thread != other.m_thread)
- return false;
-
- if (m_allowThread != other.m_allowThread)
- return false;
-
- if (m_version != other.m_version)
- return false;
-
- return true;
-}
-
static AddedFunction::TypeInfo parseType(const QString& signature, int startPos = 0, int* endPos = 0)
{
AddedFunction::TypeInfo result;
- QRegExp regex(QLatin1String("\\w"));
+ static const QRegularExpression regex(QLatin1String("\\w"));
+ Q_ASSERT(regex.isValid());
int length = signature.length();
int start = signature.indexOf(regex, startPos);
if (start == -1) {
@@ -2318,7 +2471,9 @@ static AddedFunction::TypeInfo parseType(const QString& signature, int startPos
return result;
}
-AddedFunction::AddedFunction(QString signature, QString returnType, double vr) : m_access(Public), m_version(vr)
+AddedFunction::AddedFunction(QString signature, QString returnType, double vr) :
+ m_version(vr),
+ m_access(Public)
{
Q_ASSERT(!returnType.isEmpty());
m_returnType = parseType(returnType);
@@ -2339,7 +2494,7 @@ AddedFunction::AddedFunction(QString signature, QString returnType, double vr) :
break;
}
// is const?
- m_isConst = signature.right(signatureLength - endPos).contains(QLatin1String("const"));
+ m_isConst = signature.rightRef(signatureLength - endPos).contains(QLatin1String("const"));
}
}
@@ -2385,6 +2540,25 @@ AddedFunction::TypeInfo AddedFunction::TypeInfo::fromSignature(const QString& si
return parseType(signature);
}
+ComplexTypeEntry::ComplexTypeEntry(const QString &name, TypeEntry::Type t, double vr) :
+ TypeEntry(QString(name).replace(QLatin1String(".*::"), QString()), t, vr),
+ m_qualifiedCppName(name),
+ m_qobject(false),
+ m_polymorphicBase(false),
+ m_genericClass(false)
+{
+}
+
+bool ComplexTypeEntry::isComplex() const
+{
+ return true;
+}
+
+QString ComplexTypeEntry::lookupName() const
+{
+ return m_lookupName.isEmpty() ? targetLangName() : m_lookupName;
+}
+
QString ComplexTypeEntry::targetLangApiName() const
{
return strings_jobject;
@@ -2401,6 +2575,18 @@ QString StringTypeEntry::targetLangPackage() const
{
return QString();
}
+
+bool StringTypeEntry::isNativeIdBased() const
+{
+ return false;
+}
+
+CharTypeEntry::CharTypeEntry(const QString &name, double vr) :
+ ValueTypeEntry(name, CharType, vr)
+{
+ setCodeGeneration(GenerateNothing);
+}
+
QString CharTypeEntry::targetLangApiName() const
{
return strings_jchar;
@@ -2409,6 +2595,22 @@ QString CharTypeEntry::targetLangName() const
{
return strings_char;
}
+
+QString CharTypeEntry::targetLangPackage() const
+{
+ return QString();
+}
+
+bool CharTypeEntry::isNativeIdBased() const
+{
+ return false;
+}
+
+VariantTypeEntry::VariantTypeEntry(const QString &name, double vr) :
+ ValueTypeEntry(name, VariantType, vr)
+{
+}
+
QString VariantTypeEntry::targetLangApiName() const
{
return strings_jobject;
@@ -2422,6 +2624,11 @@ QString VariantTypeEntry::targetLangPackage() const
return QString();
}
+bool VariantTypeEntry::isNativeIdBased() const
+{
+ return false;
+}
+
QString ContainerTypeEntry::typeName() const
{
switch(m_type) {
@@ -2455,9 +2662,19 @@ QString ContainerTypeEntry::typeName() const
}
}
-static bool strLess(const char* a, const char* b)
+static const QSet<QString> &primitiveCppTypes()
{
- return ::strcmp(a, b) < 0;
+ static QSet<QString> result;
+ if (result.isEmpty()) {
+ static const char *cppTypes[] = {
+ "bool", "char", "double", "float", "int",
+ "long", "long long", "short",
+ "wchar_t"
+ };
+ for (const char *cppType : cppTypes)
+ result.insert(QLatin1String(cppType));
+ }
+ return result;
}
bool TypeEntry::isCppPrimitive() const
@@ -2465,25 +2682,26 @@ bool TypeEntry::isCppPrimitive() const
if (!isPrimitive())
return false;
- const PrimitiveTypeEntry *referencedType =
- static_cast<const PrimitiveTypeEntry *>(this)->basicReferencedTypeEntry();
- QByteArray typeName = (referencedType ? referencedType->name() : m_name).toUtf8();
-
- if (typeName.contains(' ') || m_type == VoidType)
+ if (m_type == VoidType)
return true;
- // Keep this sorted!!
- static const char* cppTypes[] = { "bool", "char", "double", "float", "int", "long", "long long", "short", "wchar_t" };
- const int N = sizeof(cppTypes)/sizeof(char*);
-
- const char** res = qBinaryFind(&cppTypes[0], &cppTypes[N], typeName.constData(), strLess);
- return res != &cppTypes[N];
+ const PrimitiveTypeEntry *referencedType =
+ static_cast<const PrimitiveTypeEntry *>(this)->basicReferencedTypeEntry();
+ const QString &typeName = referencedType ? referencedType->name() : m_name;
+ return typeName.contains(QLatin1Char(' ')) || primitiveCppTypes().contains(typeName);
}
// Again, stuff to avoid ABI breakage.
typedef QHash<const TypeEntry*, CustomConversion*> TypeEntryCustomConversionMap;
Q_GLOBAL_STATIC(TypeEntryCustomConversionMap, typeEntryCustomConversionMap);
+TypeEntry::TypeEntry(const QString &name, TypeEntry::Type t, double vr) :
+ m_name(name),
+ m_type(t),
+ m_version(vr)
+{
+}
+
TypeEntry::~TypeEntry()
{
if (typeEntryCustomConversionMap()->contains(this)) {
@@ -2511,6 +2729,131 @@ CustomConversion* TypeEntry::customConversion() const
return 0;
}
+TypeSystemTypeEntry::TypeSystemTypeEntry(const QString &name, double vr) :
+ TypeEntry(name, TypeSystemType, vr)
+{
+}
+
+VoidTypeEntry::VoidTypeEntry() :
+ TypeEntry(QLatin1String("void"), VoidType, 0)
+{
+}
+
+VarargsTypeEntry::VarargsTypeEntry() :
+ TypeEntry(QLatin1String("..."), VarargsType, 0)
+{
+}
+
+TemplateArgumentEntry::TemplateArgumentEntry(const QString &name, double vr) :
+ TypeEntry(name, TemplateArgumentType, vr)
+{
+}
+
+ArrayTypeEntry::ArrayTypeEntry(const TypeEntry *nested_type, double vr) :
+ TypeEntry(QLatin1String("Array"), ArrayType, vr),
+ m_nestedType(nested_type)
+{
+ Q_ASSERT(m_nestedType);
+}
+
+QString ArrayTypeEntry::targetLangName() const
+{
+ return m_nestedType->targetLangName() + QLatin1String("[]");
+}
+
+QString ArrayTypeEntry::targetLangApiName() const
+{
+ if (m_nestedType->isPrimitive())
+ return m_nestedType->targetLangApiName() + QLatin1String("Array");
+ else
+ return QLatin1String("jobjectArray");
+}
+
+EnumTypeEntry::EnumTypeEntry(const QString &nspace, const QString &enumName, double vr) :
+ TypeEntry(nspace.isEmpty() ? enumName : nspace + QLatin1String("::") + enumName,
+ EnumType, vr),
+ m_qualifier(nspace),
+ m_targetLangName(enumName)
+{
+}
+
+QString EnumTypeEntry::targetLangPackage() const
+{
+ return m_packageName;
+}
+
+void EnumTypeEntry::setTargetLangPackage(const QString &package)
+{
+ m_packageName = package;
+}
+
+QString EnumTypeEntry::targetLangName() const
+{
+ return m_targetLangName;
+}
+
+EnumValueTypeEntry::EnumValueTypeEntry(const QString& name, const QString& value, const EnumTypeEntry* enclosingEnum, double vr) :
+ TypeEntry(name, TypeEntry::EnumValue, vr),
+ m_value(value),
+ m_enclosingEnum(enclosingEnum)
+{
+}
+
+FlagsTypeEntry::FlagsTypeEntry(const QString &name, double vr) :
+ TypeEntry(name, FlagsType, vr)
+{
+}
+
+ContainerTypeEntry::ContainerTypeEntry(const QString &name, Type type, double vr) :
+ ComplexTypeEntry(name, ContainerType, vr),
+ m_type(type)
+{
+ setCodeGeneration(GenerateForSubclass);
+}
+
+SmartPointerTypeEntry::SmartPointerTypeEntry(const QString &name,
+ const QString &getterName,
+ const QString &smartPointerType,
+ const QString &refCountMethodName,
+ double vr) :
+ ComplexTypeEntry(name, SmartPointerType, vr),
+ m_getterName(getterName),
+ m_smartPointerType(smartPointerType),
+ m_refCountMethodName(refCountMethodName)
+{
+}
+
+NamespaceTypeEntry::NamespaceTypeEntry(const QString &name, double vr) :
+ ComplexTypeEntry(name, NamespaceType, vr)
+{
+}
+
+ValueTypeEntry::ValueTypeEntry(const QString &name, double vr) :
+ ComplexTypeEntry(name, BasicValueType, vr)
+{
+}
+
+bool ValueTypeEntry::isValue() const
+{
+ return true;
+}
+
+bool ValueTypeEntry::isNativeIdBased() const
+{
+ return true;
+}
+
+ValueTypeEntry::ValueTypeEntry(const QString &name, Type t, double vr) :
+ ComplexTypeEntry(name, t, vr)
+{
+}
+
+StringTypeEntry::StringTypeEntry(const QString &name, double vr) :
+ ValueTypeEntry(name, StringType, vr)
+{
+ setCodeGeneration(GenerateNothing);
+}
+
/*
static void injectCode(ComplexTypeEntry *e,
const char *signature,
@@ -2563,9 +2906,7 @@ CustomConversion::CustomConversion(TypeEntry* ownerType)
CustomConversion::~CustomConversion()
{
- foreach (TargetToNativeConversion* targetToNativeConversion, m_d->targetToNativeConversions)
- delete targetToNativeConversion;
- m_d->targetToNativeConversions.clear();
+ qDeleteAll(m_d->targetToNativeConversions);
delete m_d;
}
@@ -2665,3 +3006,41 @@ void CustomConversion::TargetToNativeConversion::setConversion(const QString& co
{
m_d->conversion = conversion;
}
+
+InterfaceTypeEntry::InterfaceTypeEntry(const QString &name, double vr) :
+ ComplexTypeEntry(name, InterfaceType, vr)
+{
+}
+
+bool InterfaceTypeEntry::isNativeIdBased() const
+{
+ return true;
+}
+
+QString InterfaceTypeEntry::qualifiedCppName() const
+{
+ const int len = ComplexTypeEntry::qualifiedCppName().length() - interfaceName(QString()).length();
+ return ComplexTypeEntry::qualifiedCppName().left(len);
+}
+
+FunctionTypeEntry::FunctionTypeEntry(const QString &name, const QString &signature,
+ double vr) :
+ TypeEntry(name, FunctionType, vr)
+{
+ addSignature(signature);
+}
+
+ObjectTypeEntry::ObjectTypeEntry(const QString &name, double vr)
+ : ComplexTypeEntry(name, ObjectType, vr)
+{
+}
+
+InterfaceTypeEntry *ObjectTypeEntry::designatedInterface() const
+{
+ return m_interface;
+}
+
+bool ObjectTypeEntry::isNativeIdBased() const
+{
+ return true;
+}
diff --git a/sources/shiboken2/ApiExtractor/typesystem.h b/sources/shiboken2/ApiExtractor/typesystem.h
index a8ee0ced4..62d348f69 100644
--- a/sources/shiboken2/ApiExtractor/typesystem.h
+++ b/sources/shiboken2/ApiExtractor/typesystem.h
@@ -35,9 +35,11 @@
#include <QtCore/QHash>
#include <QtCore/qobjectdefs.h>
+#include <QtCore/QRegularExpression>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QMap>
+#include <QtCore/QVector>
//Used to identify the conversion rule to avoid break API
#define TARGET_CONVERSION_RULE_FLAG "0"
@@ -47,6 +49,7 @@ class Indentor;
class AbstractMetaType;
QT_BEGIN_NAMESPACE
+class QDebug;
class QTextStream;
QT_END_NAMESPACE
@@ -59,7 +62,6 @@ class TemplateInstance;
struct ReferenceCount
{
- ReferenceCount() {}
enum Action { // 0x01 - 0xff
Invalid = 0x00,
Add = 0x01,
@@ -73,8 +75,8 @@ struct ReferenceCount
Padding = 0xffffffff
};
- Action action;
QString varName;
+ Action action = Invalid;
};
struct ArgumentOwner
@@ -90,27 +92,23 @@ struct ArgumentOwner
ReturnIndex = 0,
FirstArgumentIndex = 1
};
- ArgumentOwner() : action(ArgumentOwner::Invalid), index(ArgumentOwner::InvalidIndex) {}
- Action action;
- int index;
+ Action action = Invalid;
+ int index = InvalidIndex;
};
class CodeSnipFragment
{
-private:
- QString m_code;
- TemplateInstance *m_instance;
-
public:
- CodeSnipFragment(const QString &code)
- : m_code(code),
- m_instance(0) {}
-
- CodeSnipFragment(TemplateInstance *instance)
- : m_instance(instance) {}
+ CodeSnipFragment() = default;
+ explicit CodeSnipFragment(const QString &code) : m_code(code) {}
+ explicit CodeSnipFragment(TemplateInstance *instance) : m_instance(instance) {}
QString code() const;
+
+private:
+ QString m_code;
+ TemplateInstance *m_instance = nullptr;
};
class CodeSnipAbstract
@@ -126,13 +124,13 @@ public:
codeList.append(CodeSnipFragment(ti));
}
- QList<CodeSnipFragment> codeList;
+ QVector<CodeSnipFragment> codeList;
};
class CustomFunction : public CodeSnipAbstract
{
public:
- CustomFunction(const QString &n = QString()) : name(n) { }
+ explicit CustomFunction(const QString &n = QString()) : name(n) {}
QString name;
QString paramName;
@@ -141,31 +139,21 @@ public:
class TemplateEntry : public CodeSnipAbstract
{
public:
- TemplateEntry(const QString &name, double vr)
- : m_name(name), m_version(vr)
- {
- };
+ explicit TemplateEntry(const QString &name) : m_name(name) {}
QString name() const
{
return m_name;
- };
-
- double version() const
- {
- return m_version;
}
private:
QString m_name;
- double m_version;
};
class TemplateInstance
{
public:
- TemplateInstance(const QString &name, double vr)
- : m_name(name), m_version(vr) {}
+ explicit TemplateInstance(const QString &name) : m_name(name) {}
void addReplaceRule(const QString &name, const QString &value)
{
@@ -179,14 +167,8 @@ public:
return m_name;
}
- double version() const
- {
- return m_version;
- }
-
private:
const QString m_name;
- double m_version;
QHash<QString, QString> replaceRules;
};
@@ -194,32 +176,26 @@ private:
class CodeSnip : public CodeSnipAbstract
{
public:
- CodeSnip(double vr) : language(TypeSystem::TargetLangCode), version(vr) { }
- CodeSnip(double vr, TypeSystem::Language lang) : language(lang), version(vr) { }
+ CodeSnip() = default;
+ explicit CodeSnip(TypeSystem::Language lang) : language(lang) {}
- TypeSystem::Language language;
- TypeSystem::CodeSnipPosition position;
+ TypeSystem::Language language = TypeSystem::TargetLangCode;
+ TypeSystem::CodeSnipPosition position = TypeSystem::CodeSnipPositionAny;
ArgumentMap argumentMap;
- double version;
};
struct ArgumentModification
{
- ArgumentModification(int idx, double vr)
- : removedDefaultExpression(false), removed(false),
- noNullPointers(false), index(idx), version(vr) {}
+ ArgumentModification() : removedDefaultExpression(false), removed(false),
+ noNullPointers(false), array(false) {}
+ explicit ArgumentModification(int idx) : index(idx), removedDefaultExpression(false), removed(false),
+ noNullPointers(false), array(false) {}
// Should the default expression be removed?
- uint removedDefaultExpression : 1;
- uint removed : 1;
- uint noNullPointers : 1;
- uint resetAfterUse : 1;
- // The index of this argument
- int index;
// Reference count flags for this argument
- QList<ReferenceCount> referenceCounts;
+ QVector<ReferenceCount> referenceCounts;
// The text given for the new type of the argument
QString modified_type;
@@ -244,11 +220,17 @@ struct ArgumentModification
//QObject parent(owner) of this argument
ArgumentOwner owner;
- //Api version
- double version;
-
//New name
QString renamed_to;
+
+ // The index of this argument
+ int index = -1;
+
+ uint removedDefaultExpression : 1;
+ uint removed : 1;
+ uint noNullPointers : 1;
+ uint resetAfterUse : 1;
+ uint array : 1; // consider "int*" to be "int[]"
};
struct Modification
@@ -274,8 +256,6 @@ struct Modification
VirtualSlot = 0x10000 | NonFinal
};
- Modification() : modifiers(0), removal(TypeSystem::NoLanguage) { }
-
bool isAccessModifier() const
{
return modifiers & AccessModifierMask;
@@ -337,15 +317,13 @@ struct Modification
return removal != TypeSystem::NoLanguage;
}
- uint modifiers;
QString renamedToName;
- TypeSystem::Language removal;
+ uint modifiers = 0;
+ TypeSystem::Language removal = TypeSystem::NoLanguage;
};
struct FunctionModification: public Modification
{
- FunctionModification(double vr) : m_thread(false), m_allowThread(false), m_version(vr) {}
-
bool isCodeInjection() const
{
return modifiers & CodeInjection;
@@ -366,31 +344,29 @@ struct FunctionModification: public Modification
{
m_allowThread = allow;
}
- double version() const
+
+ bool matches(const QString &functionSignature) const
{
- return m_version;
+ return m_signature.isEmpty()
+ ? m_signaturePattern.match(functionSignature).hasMatch()
+ : m_signature == functionSignature;
}
- bool operator!=(const FunctionModification& other) const;
- bool operator==(const FunctionModification& other) const;
-
+ bool setSignature(const QString &s, QString *errorMessage = nullptr);
+ QString signature() const { return m_signature.isEmpty() ? m_signaturePattern.pattern() : m_signature; }
QString toString() const;
- QString signature;
QString association;
CodeSnipList snips;
- QList<ArgumentModification> argument_mods;
+ QVector<ArgumentModification> argument_mods;
private:
- FunctionModification() {}
-
- bool m_thread;
- bool m_allowThread;
- double m_version;
-
-
+ QString m_signature;
+ QRegularExpression m_signaturePattern;
+ bool m_thread = false;
+ bool m_allowThread = false;
};
struct FieldModification: public Modification
@@ -428,18 +404,19 @@ struct AddedFunction
* AbstractMetaType and AbstractMetaArgument for the AbstractMetaFunctions.
*/
struct TypeInfo {
- TypeInfo() : isConstant(false), indirections(0), isReference(false) {}
+ TypeInfo() = default;
static TypeInfo fromSignature(const QString& signature);
QString name;
- bool isConstant;
- int indirections;
- bool isReference;
QString defaultValue;
+ int indirections = 0;
+ bool isConstant = false;
+ bool isReference = false;
};
/// Creates a new AddedFunction with a signature and a return type.
- AddedFunction(QString signature, QString returnType, double vr);
+ explicit AddedFunction(QString signature, QString returnType, double vr);
+ AddedFunction() = default;
/// Returns the function name.
QString name() const
@@ -466,7 +443,7 @@ struct AddedFunction
}
/// Returns a list of argument type infos.
- QList<TypeInfo> arguments() const
+ QVector<TypeInfo> arguments() const
{
return m_arguments;
}
@@ -495,12 +472,12 @@ struct AddedFunction
}
private:
QString m_name;
- Access m_access;
- QList<TypeInfo> m_arguments;
+ QVector<TypeInfo> m_arguments;
TypeInfo m_returnType;
- bool m_isConst;
- bool m_isStatic;
- double m_version;
+ double m_version = 0;
+ Access m_access = Protected;
+ bool m_isConst = false;
+ bool m_isStatic = false;
};
#ifndef QT_NO_DEBUG_STREAM
@@ -508,28 +485,17 @@ QDebug operator<<(QDebug d, const AddedFunction::TypeInfo &ti);
QDebug operator<<(QDebug d, const AddedFunction &af);
#endif
-struct ExpensePolicy
-{
- ExpensePolicy() : limit(-1) {}
- int limit;
- QString cost;
- bool isValid() const
- {
- return limit >= 0;
- }
-};
-
class InterfaceTypeEntry;
class ObjectTypeEntry;
class DocModification
{
public:
- DocModification(const QString& xpath, const QString& signature, double vr)
- : format(TypeSystem::NativeCode), m_mode(TypeSystem::DocModificationXPathReplace),
- m_xpath(xpath), m_signature(signature), m_version(vr) {}
- DocModification(TypeSystem::DocModificationMode mode, const QString& signature, double vr)
- : m_mode(mode), m_signature(signature), m_version(vr) {}
+ DocModification() = default;
+ explicit DocModification(const QString& xpath, const QString& signature) :
+ m_xpath(xpath), m_signature(signature) {}
+ explicit DocModification(TypeSystem::DocModificationMode mode, const QString& signature) :
+ m_signature(signature), m_mode(mode) {}
void setCode(const QString& code) { m_code = code; }
void setCode(const QStringRef& code) { m_code = code.toString(); }
@@ -550,25 +516,23 @@ public:
{
return m_mode;
}
- double version() const
- {
- return m_version;
- }
- TypeSystem::Language format;
+ TypeSystem::Language format() const { return m_format; }
+ void setFormat(TypeSystem::Language f) { m_format = f; }
private:
- TypeSystem::DocModificationMode m_mode;
QString m_code;
QString m_xpath;
QString m_signature;
- double m_version;
+ TypeSystem::DocModificationMode m_mode = TypeSystem::DocModificationXPathReplace;
+ TypeSystem::Language m_format = TypeSystem::NativeCode;
};
class CustomConversion;
class TypeEntry
{
+ Q_DISABLE_COPY(TypeEntry)
Q_GADGET
public:
enum Type {
@@ -609,15 +573,7 @@ public:
};
Q_ENUM(CodeGeneration)
- TypeEntry(const QString &name, Type t, double vr)
- : m_name(name),
- m_type(t),
- m_codeGeneration(GenerateAll),
- m_preferredConversion(true),
- m_stream(false),
- m_version(vr)
- {
- };
+ explicit TypeEntry(const QString &name, Type t, double vr);
virtual ~TypeEntry();
@@ -882,7 +838,13 @@ public:
}
void setInclude(const Include &inc)
{
- m_include = inc;
+ // This is a workaround for preventing double inclusion of the QSharedPointer implementation
+ // header, which does not use header guards. In the previous parser this was not a problem
+ // because the Q_QDOC define was set, and the implementation header was never included.
+ if (inc.name() == QLatin1String("qsharedpointer_impl.h"))
+ m_include = Include(inc.type(), QLatin1String("qsharedpointer.h"));
+ else
+ m_include = inc;
}
// Replace conversionRule arg to CodeSnip in future version
@@ -930,48 +892,42 @@ public:
private:
QString m_name;
Type m_type;
- uint m_codeGeneration;
+ uint m_codeGeneration = GenerateAll;
CustomFunction m_customConstructor;
CustomFunction m_customDestructor;
- bool m_preferredConversion;
+ bool m_preferredConversion = true;
CodeSnipList m_codeSnips;
DocModificationList m_docModifications;
IncludeList m_extraIncludes;
Include m_include;
QHash<QString, bool> m_includesUsed;
QString m_conversionRule;
- bool m_stream;
+ bool m_stream = false;
double m_version;
};
class TypeSystemTypeEntry : public TypeEntry
{
public:
- TypeSystemTypeEntry(const QString &name, double vr)
- : TypeEntry(name, TypeSystemType, vr)
- {
- };
+ explicit TypeSystemTypeEntry(const QString &name, double vr);
};
class VoidTypeEntry : public TypeEntry
{
public:
- VoidTypeEntry() : TypeEntry(QLatin1String("void"), VoidType, 0) { }
+ VoidTypeEntry();
};
class VarargsTypeEntry : public TypeEntry
{
public:
- VarargsTypeEntry() : TypeEntry(QLatin1String("..."), VarargsType, 0) { }
+ VarargsTypeEntry();
};
class TemplateArgumentEntry : public TypeEntry
{
public:
- TemplateArgumentEntry(const QString &name, double vr)
- : TypeEntry(name, TemplateArgumentType, vr), m_ordinal(0)
- {
- }
+ explicit TemplateArgumentEntry(const QString &name, double vr);
int ordinal() const
{
@@ -983,17 +939,13 @@ public:
}
private:
- int m_ordinal;
+ int m_ordinal = 0;
};
class ArrayTypeEntry : public TypeEntry
{
public:
- ArrayTypeEntry(const TypeEntry *nested_type, double vr)
- : TypeEntry(QLatin1String("Array"), ArrayType, vr), m_nestedType(nested_type)
- {
- Q_ASSERT(m_nestedType);
- }
+ explicit ArrayTypeEntry(const TypeEntry *nested_type, double vr);
void setNestedTypeEntry(TypeEntry *nested)
{
@@ -1004,17 +956,8 @@ public:
return m_nestedType;
}
- QString targetLangName() const
- {
- return m_nestedType->targetLangName() + QLatin1String("[]");
- }
- QString targetLangApiName() const
- {
- if (m_nestedType->isPrimitive())
- return m_nestedType->targetLangApiName() + QLatin1String("Array");
- else
- return QLatin1String("jobjectArray");
- }
+ QString targetLangName() const override;
+ QString targetLangApiName() const override;
private:
const TypeEntry *m_nestedType;
@@ -1024,27 +967,15 @@ private:
class PrimitiveTypeEntry : public TypeEntry
{
public:
- PrimitiveTypeEntry(const QString &name, double vr)
- : TypeEntry(name, PrimitiveType, vr),
- m_preferredConversion(true),
- m_preferredTargetLangType(true),
- m_referencedTypeEntry(0)
- {
- }
+ explicit PrimitiveTypeEntry(const QString &name, double vr);
- QString targetLangName() const
- {
- return m_targetLangName;
- }
+ QString targetLangName() const override;
void setTargetLangName(const QString &targetLangName)
{
m_targetLangName = targetLangName;
}
- QString targetLangApiName() const
- {
- return m_targetLangApiName;
- }
+ QString targetLangApiName() const override;
void setTargetLangApiName(const QString &targetLangApiName)
{
m_targetLangApiName = targetLangApiName;
@@ -1088,91 +1019,48 @@ public:
*/
PrimitiveTypeEntry* basicReferencedTypeEntry() const;
- virtual bool preferredConversion() const
- {
- return m_preferredConversion;
- }
- virtual void setPreferredConversion(bool b)
- {
- m_preferredConversion = b;
- }
+ bool preferredConversion() const override;
+ void setPreferredConversion(bool b) override;
- virtual bool preferredTargetLangType() const
+ bool preferredTargetLangType() const
{
return m_preferredTargetLangType;
}
- virtual void setPreferredTargetLangType(bool b)
+ void setPreferredTargetLangType(bool b)
{
m_preferredTargetLangType = b;
}
void setTargetLangPackage(const QString& package);
- QString targetLangPackage() const;
+ QString targetLangPackage() const override;
private:
QString m_targetLangName;
QString m_targetLangApiName;
QString m_defaultConstructor;
uint m_preferredConversion : 1;
uint m_preferredTargetLangType : 1;
- PrimitiveTypeEntry* m_referencedTypeEntry;
-};
-
-struct EnumValueRedirection
-{
- EnumValueRedirection(const QString &rej, const QString &us)
- : rejected(rej),
- used(us)
- {
- }
- QString rejected;
- QString used;
+ PrimitiveTypeEntry* m_referencedTypeEntry = nullptr;
};
class EnumTypeEntry : public TypeEntry
{
public:
- EnumTypeEntry(const QString &nspace, const QString &enumName, double vr)
- : TypeEntry(nspace.isEmpty() ? enumName : nspace + QLatin1String("::") + enumName,
- EnumType, vr),
- m_qualifier(nspace),
- m_targetLangName(enumName),
- m_flags(0),
- m_extensible(false),
- m_forceInteger(false),
- m_anonymous(false)
- {
- }
+ enum EnumKind {
+ CEnum, // Standard C: enum Foo { value1, value2 }
+ AnonymousEnum, // enum { value1, value2 }
+ EnumClass // C++ 11 : enum class Foo { value1, value2 }
+ };
- QString targetLangPackage() const
- {
- return m_packageName;
- }
- void setTargetLangPackage(const QString &package)
- {
- m_packageName = package;
- }
+ explicit EnumTypeEntry(const QString &nspace, const QString &enumName, double vr);
- QString targetLangName() const
- {
- return m_targetLangName;
- }
- QString targetLangQualifier() const;
- QString qualifiedTargetLangName() const
- {
- QString qualifiedName;
- QString pkg = targetLangPackage();
- QString qualifier = targetLangQualifier();
+ QString targetLangPackage() const override;
+ void setTargetLangPackage(const QString &package);
- if (!pkg.isEmpty())
- qualifiedName += pkg + QLatin1Char('.');
- if (!qualifier.isEmpty())
- qualifiedName += qualifier + QLatin1Char('.');
- qualifiedName += targetLangName();
-
- return qualifiedName;
- }
+ QString targetLangName() const override;
+ QString targetLangQualifier() const;
+ QString qualifiedTargetLangName() const override;
- QString targetLangApiName() const;
+ QString targetLangApiName() const override;
QString qualifier() const
{
@@ -1183,10 +1071,10 @@ public:
m_qualifier = q;
}
- virtual bool preferredConversion() const
- {
- return false;
- }
+ EnumKind enumKind() const { return m_enumKind; }
+ void setEnumKind(EnumKind kind) { m_enumKind = kind; }
+
+ bool preferredConversion() const override;
bool isBoundsChecked() const
{
@@ -1229,7 +1117,7 @@ public:
m_extensible = is;
}
- bool isEnumValueRejected(const QString &name)
+ bool isEnumValueRejected(const QString &name) const
{
return m_rejectedEnums.contains(name);
}
@@ -1242,9 +1130,6 @@ public:
return m_rejectedEnums;
}
- void addEnumValueRedirection(const QString &rejected, const QString &usedValue);
- QString enumValueRedirection(const QString &value) const;
-
bool forceInteger() const
{
return m_forceInteger;
@@ -1254,14 +1139,7 @@ public:
m_forceInteger = force;
}
- bool isAnonymous() const
- {
- return m_anonymous;
- }
- void setAnonymous(bool anonymous)
- {
- m_anonymous = anonymous;
- }
+ bool isAnonymous() const { return m_enumKind == AnonymousEnum; }
private:
QString m_packageName;
@@ -1272,22 +1150,21 @@ private:
QString m_upperBound;
QStringList m_rejectedEnums;
- QList<EnumValueRedirection> m_enumRedirections;
- FlagsTypeEntry *m_flags;
+ FlagsTypeEntry *m_flags = nullptr;
+
+ EnumKind m_enumKind = CEnum;
- bool m_extensible;
- bool m_forceInteger;
- bool m_anonymous;
+ bool m_extensible = false;
+ bool m_forceInteger = false;
};
+// EnumValueTypeEntry is used for resolving integer type templates
+// like array<EnumValue>.
class EnumValueTypeEntry : public TypeEntry
{
public:
- EnumValueTypeEntry(const QString& name, const QString& value, const EnumTypeEntry* enclosingEnum, double vr)
- : TypeEntry(name, TypeEntry::EnumValue, vr), m_value(value), m_enclosingEnum(enclosingEnum)
- {
- }
+ explicit EnumValueTypeEntry(const QString& name, const QString& value, const EnumTypeEntry* enclosingEnum, double vr);
QString value() const { return m_value; }
const EnumTypeEntry* enclosingEnum() const { return m_enclosingEnum; }
@@ -1299,20 +1176,12 @@ private:
class FlagsTypeEntry : public TypeEntry
{
public:
- FlagsTypeEntry(const QString &name, double vr) : TypeEntry(name, FlagsType, vr), m_enum(0)
- {
- }
+ explicit FlagsTypeEntry(const QString &name, double vr);
- QString qualifiedTargetLangName() const;
- QString targetLangName() const
- {
- return m_targetLangName;
- }
- QString targetLangApiName() const;
- virtual bool preferredConversion() const
- {
- return false;
- }
+ QString qualifiedTargetLangName() const override;
+ QString targetLangName() const override;
+ QString targetLangApiName() const override;
+ bool preferredConversion() const override;
QString originalName() const
{
@@ -1346,15 +1215,12 @@ public:
m_enum = e;
}
- QString targetLangPackage() const
- {
- return m_enum->targetLangPackage();
- }
+ QString targetLangPackage() const override;
private:
QString m_originalName;
QString m_targetLangName;
- EnumTypeEntry *m_enum;
+ EnumTypeEntry *m_enum = nullptr;
};
@@ -1374,52 +1240,18 @@ public:
Unknown
};
- ComplexTypeEntry(const QString &name, Type t, double vr)
- : TypeEntry(QString(name).replace(QLatin1String(".*::"), QString()), t, vr),
- m_qualifiedCppName(name),
- m_qobject(false),
- m_polymorphicBase(false),
- m_genericClass(false),
- m_typeFlags(0),
- m_copyableFlag(Unknown),
- m_baseContainerType(0)
- {
- }
-
- bool isComplex() const
- {
- return true;
- }
+ explicit ComplexTypeEntry(const QString &name, Type t, double vr);
- ComplexTypeEntry *copy() const
- {
- ComplexTypeEntry *centry = new ComplexTypeEntry(name(), type(), version());
- centry->setInclude(include());
- centry->setExtraIncludes(extraIncludes());
- centry->setAddedFunctions(addedFunctions());
- centry->setFunctionModifications(functionModifications());
- centry->setFieldModifications(fieldModifications());
- centry->setQObject(isQObject());
- centry->setDefaultSuperclass(defaultSuperclass());
- centry->setCodeSnips(codeSnips());
- centry->setTargetLangPackage(targetLangPackage());
- centry->setBaseContainerType(baseContainerType());
- centry->setDefaultConstructor(defaultConstructor());
-
- return centry;
- }
+ bool isComplex() const override;
void setLookupName(const QString &name)
{
m_lookupName = name;
}
- virtual QString lookupName() const
- {
- return m_lookupName.isEmpty() ? targetLangName() : m_lookupName;
- }
+ QString lookupName() const override;
- QString targetLangApiName() const;
+ QString targetLangApiName() const override;
void setTypeFlags(TypeFlags flags)
{
@@ -1468,10 +1300,7 @@ public:
return m_fieldMods;
}
- QString targetLangPackage() const
- {
- return m_package;
- }
+ QString targetLangPackage() const override;
void setTargetLangPackage(const QString &package)
{
m_package = package;
@@ -1495,7 +1324,7 @@ public:
m_defaultSuperclass = sc;
}
- virtual QString qualifiedCppName() const
+ QString qualifiedCppName() const override
{
return m_qualifiedCppName;
}
@@ -1528,16 +1357,6 @@ public:
return m_heldTypeValue;
}
-
- void setExpensePolicy(const ExpensePolicy &policy)
- {
- m_expensePolicy = policy;
- }
- const ExpensePolicy &expensePolicy() const
- {
- return m_expensePolicy;
- }
-
QString targetType() const
{
return m_targetType;
@@ -1547,12 +1366,7 @@ public:
m_targetType = code;
}
- QString targetLangName() const
- {
- return m_targetLangName.isEmpty()
- ? TypeEntry::targetLangName()
- : m_targetLangName;
- }
+ QString targetLangName() const override;
void setTargetLangName(const QString &name)
{
m_targetLangName = name;
@@ -1616,12 +1430,11 @@ private:
QString m_heldTypeValue;
QString m_lookupName;
QString m_targetType;
- ExpensePolicy m_expensePolicy;
TypeFlags m_typeFlags;
- CopyableFlag m_copyableFlag;
+ CopyableFlag m_copyableFlag = Unknown;
QString m_hashFunction;
- const ComplexTypeEntry* m_baseContainerType;
+ const ComplexTypeEntry* m_baseContainerType = nullptr;
};
class ContainerTypeEntry : public ComplexTypeEntry
@@ -1645,11 +1458,7 @@ public:
};
Q_ENUM(Type)
- ContainerTypeEntry(const QString &name, Type type, double vr)
- : ComplexTypeEntry(name, ContainerType, vr), m_type(type)
- {
- setCodeGeneration(GenerateForSubclass);
- }
+ explicit ContainerTypeEntry(const QString &name, Type type, double vr);
Type type() const
{
@@ -1657,9 +1466,9 @@ public:
}
QString typeName() const;
- QString targetLangName() const;
- QString targetLangPackage() const;
- QString qualifiedCppName() const;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override;
+ QString qualifiedCppName() const override;
static Type containerTypeFromString(QString typeName)
{
@@ -1688,17 +1497,11 @@ private:
class SmartPointerTypeEntry : public ComplexTypeEntry
{
public:
- SmartPointerTypeEntry(const QString &name,
- const QString &getterName,
- const QString &smartPointerType,
- const QString &refCountMethodName,
- double vr)
- : ComplexTypeEntry(name, SmartPointerType, vr),
- m_getterName(getterName),
- m_smartPointerType(smartPointerType),
- m_refCountMethodName(refCountMethodName)
- {
- }
+ explicit SmartPointerTypeEntry(const QString &name,
+ const QString &getterName,
+ const QString &smartPointerType,
+ const QString &refCountMethodName,
+ double vr);
QString getter() const
{
@@ -1719,91 +1522,65 @@ private:
class NamespaceTypeEntry : public ComplexTypeEntry
{
public:
- NamespaceTypeEntry(const QString &name, double vr) : ComplexTypeEntry(name, NamespaceType, vr) { }
+ explicit NamespaceTypeEntry(const QString &name, double vr);
};
class ValueTypeEntry : public ComplexTypeEntry
{
public:
- ValueTypeEntry(const QString &name, double vr) : ComplexTypeEntry(name, BasicValueType, vr) { }
+ explicit ValueTypeEntry(const QString &name, double vr);
- bool isValue() const
- {
- return true;
- }
+ bool isValue() const override;
- virtual bool isNativeIdBased() const
- {
- return true;
- }
+ bool isNativeIdBased() const override;
protected:
- ValueTypeEntry(const QString &name, Type t, double vr) : ComplexTypeEntry(name, t, vr) { }
+ explicit ValueTypeEntry(const QString &name, Type t, double vr);
};
class StringTypeEntry : public ValueTypeEntry
{
public:
- StringTypeEntry(const QString &name, double vr)
- : ValueTypeEntry(name, StringType, vr)
- {
- setCodeGeneration(GenerateNothing);
- }
+ explicit StringTypeEntry(const QString &name, double vr);
- QString targetLangApiName() const;
- QString targetLangName() const;
- QString targetLangPackage() const;
+ QString targetLangApiName() const override;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override;
- virtual bool isNativeIdBased() const
- {
- return false;
- }
+ bool isNativeIdBased() const override;
};
class CharTypeEntry : public ValueTypeEntry
{
public:
- CharTypeEntry(const QString &name, double vr) : ValueTypeEntry(name, CharType, vr)
- {
- setCodeGeneration(GenerateNothing);
- }
+ explicit CharTypeEntry(const QString &name, double vr);
- QString targetLangApiName() const;
- QString targetLangName() const;
- QString targetLangPackage() const
- {
- return QString();
- }
+ QString targetLangApiName() const override;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override;
- virtual bool isNativeIdBased() const
- {
- return false;
- }
+ bool isNativeIdBased() const override;
};
class VariantTypeEntry: public ValueTypeEntry
{
public:
- VariantTypeEntry(const QString &name, double vr) : ValueTypeEntry(name, VariantType, vr) { }
+ explicit VariantTypeEntry(const QString &name, double vr);
- QString targetLangApiName() const;
- QString targetLangName() const;
- QString targetLangPackage() const;
+ QString targetLangApiName() const override;
+ QString targetLangName() const override;
+ QString targetLangPackage() const override;
- virtual bool isNativeIdBased() const
- {
- return false;
- }
+ bool isNativeIdBased() const override;
};
class InterfaceTypeEntry : public ComplexTypeEntry
{
public:
- InterfaceTypeEntry(const QString &name, double vr)
- : ComplexTypeEntry(name, InterfaceType, vr) {}
+ explicit InterfaceTypeEntry(const QString &name, double vr);
static QString interfaceName(const QString &name)
{
@@ -1819,15 +1596,8 @@ public:
m_origin = origin;
}
- virtual bool isNativeIdBased() const
- {
- return true;
- }
- virtual QString qualifiedCppName() const
- {
- const int len = ComplexTypeEntry::qualifiedCppName().length() - interfaceName(QString()).length();
- return ComplexTypeEntry::qualifiedCppName().left(len);
- }
+ bool isNativeIdBased() const override;
+ QString qualifiedCppName() const override;
private:
ObjectTypeEntry *m_origin;
@@ -1837,11 +1607,7 @@ private:
class FunctionTypeEntry : public TypeEntry
{
public:
- FunctionTypeEntry(const QString& name, const QString& signature, double vr)
- : TypeEntry(name, FunctionType, vr)
- {
- addSignature(signature);
- }
+ explicit FunctionTypeEntry(const QString& name, const QString& signature, double vr);
void addSignature(const QString& signature)
{
m_signatures << signature;
@@ -1863,35 +1629,41 @@ private:
class ObjectTypeEntry : public ComplexTypeEntry
{
public:
- ObjectTypeEntry(const QString &name, double vr)
- : ComplexTypeEntry(name, ObjectType, vr), m_interface(0) {}
+ explicit ObjectTypeEntry(const QString &name, double vr);
- InterfaceTypeEntry *designatedInterface() const
- {
- return m_interface;
- }
+ InterfaceTypeEntry *designatedInterface() const override;
void setDesignatedInterface(InterfaceTypeEntry *entry)
{
m_interface = entry;
}
- virtual bool isNativeIdBased() const
- {
- return true;
- }
+ bool isNativeIdBased() const override;
private:
- InterfaceTypeEntry *m_interface;
+ InterfaceTypeEntry *m_interface = nullptr;
};
struct TypeRejection
{
- QString class_name;
- QString function_name;
- QString field_name;
- QString enum_name;
+ enum MatchType
+ {
+ ExcludeClass, // Match className only
+ Function, // Match className and function name
+ Field, // Match className and field name
+ Enum, // Match className and enum name
+ ArgumentType, // Match className and argument type
+ ReturnType // Match className and return type
+ };
+
+ QRegularExpression className;
+ QRegularExpression pattern;
+ MatchType matchType;
};
+#ifndef QT_NO_DEBUG_STREAM
+QDebug operator<<(QDebug d, const TypeRejection &r);
+#endif
+
QString fixCppTypeName(const QString &name);
class CustomConversion
@@ -1932,7 +1704,7 @@ public:
bool replaceOriginalTargetToNativeConversions() const;
void setReplaceOriginalTargetToNativeConversions(bool replaceOriginalTargetToNativeConversions);
- typedef QList<TargetToNativeConversion*> TargetToNativeConversions;
+ typedef QVector<TargetToNativeConversion*> TargetToNativeConversions;
bool hasTargetToNativeConversions() const;
TargetToNativeConversions& targetToNativeConversions();
const TargetToNativeConversions& targetToNativeConversions() const;
diff --git a/sources/shiboken2/ApiExtractor/typesystem_p.h b/sources/shiboken2/ApiExtractor/typesystem_p.h
index f2105a631..d3485726e 100644
--- a/sources/shiboken2/ApiExtractor/typesystem_p.h
+++ b/sources/shiboken2/ApiExtractor/typesystem_p.h
@@ -107,6 +107,7 @@ class StackElement
NoNullPointers = 0x40000000,
ReferenceCount = 0x80000000,
ParentOwner = 0x90000000,
+ Array = 0xA0000000,
ArgumentModifiers = 0xff000000
};
@@ -152,7 +153,6 @@ private:
QHash<QString, QString> *acceptedAttributes);
bool importFileElement(const QXmlStreamAttributes &atts);
- bool convertBoolean(const QString &, const QString &, bool);
void addFlags(const QString &name, QString flagName,
const QHash<QString, QString> &attributes, double since);
@@ -171,6 +171,7 @@ private:
QHash<QString, StackElement::ElementType> tagNames;
QString m_currentSignature;
+ QString m_currentPath;
};
#endif
diff --git a/sources/shiboken2/ApiExtractor/typesystem_typedefs.h b/sources/shiboken2/ApiExtractor/typesystem_typedefs.h
index 04b669655..4f29deced 100644
--- a/sources/shiboken2/ApiExtractor/typesystem_typedefs.h
+++ b/sources/shiboken2/ApiExtractor/typesystem_typedefs.h
@@ -31,28 +31,19 @@
#include <QtCore/QHash>
#include <QtCore/QList>
+#include <QtCore/QVector>
class CodeSnip;
-class ContainerTypeEntry;
class DocModification;
-class PrimitiveTypeEntry;
-class TemplateEntry;
-class TypeEntry;
struct AddedFunction;
struct FieldModification;
struct FunctionModification;
-typedef QHash<QString, QList<TypeEntry *> > TypeEntryHash;
-typedef QHash<QString, TypeEntry *> SingleTypeEntryHash;
-typedef QHash<QString, TemplateEntry *> TemplateEntryHash;
-
-typedef QList<AddedFunction> AddedFunctionList;
-typedef QList<CodeSnip> CodeSnipList;
-typedef QList<const ContainerTypeEntry *> ContainerTypeEntryList;
-typedef QList<DocModification> DocModificationList;
-typedef QList<FieldModification> FieldModificationList;
-typedef QList<FunctionModification> FunctionModificationList;
-typedef QList<const PrimitiveTypeEntry *> PrimitiveTypeEntryList;
+typedef QVector<AddedFunction> AddedFunctionList;
+typedef QVector<CodeSnip> CodeSnipList;
+typedef QVector<DocModification> DocModificationList;
+typedef QVector<FieldModification> FieldModificationList;
+typedef QVector<FunctionModification> FunctionModificationList;
#endif // TYPESYSTEM_TYPEDEFS_H
diff --git a/sources/shiboken2/CMakeLists.txt b/sources/shiboken2/CMakeLists.txt
index 5735fea18..ccabc72e3 100644
--- a/sources/shiboken2/CMakeLists.txt
+++ b/sources/shiboken2/CMakeLists.txt
@@ -1,8 +1,8 @@
Include(icecc.cmake)
project(shiboken2)
-cmake_minimum_required(VERSION 3.0)
-cmake_policy(VERSION 3.0)
+cmake_minimum_required(VERSION 3.1)
+cmake_policy(VERSION 3.1)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules/
${CMAKE_MODULE_PATH})
@@ -22,6 +22,104 @@ else()
find_package(PythonLibs 2.6)
endif()
+macro(get_python_arch)
+ execute_process(
+ COMMAND ${PYTHON_EXECUTABLE} -c "if True:
+ import sys
+ print('64' if sys.maxsize > 2**31-1 else '32')
+ "
+ OUTPUT_VARIABLE PYTHON_ARCH
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ message("PYTHON_ARCH: " ${PYTHON_ARCH})
+endmacro()
+
+if (NOT PYTHON_ARCH)
+ get_python_arch()
+endif()
+
+macro(get_llvm_config)
+ execute_process(
+ COMMAND ${PYTHON_EXECUTABLE} -c "if True:
+ import os
+ import sys
+ sys.path.append(os.path.realpath(os.path.join('${CMAKE_CURRENT_LIST_DIR}', '..', '..')))
+ from utils import findLlvmConfig
+ llvmConfig = findLlvmConfig()
+ if llvmConfig:
+ print(llvmConfig)
+ "
+ OUTPUT_VARIABLE LLVM_CONFIG
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ message("LLMV_CONFIG: " ${LLVM_CONFIG})
+endmacro()
+
+set(CLANG_DIR "")
+set(CLANG_DIR_SOURCE "")
+
+if (DEFINED ENV{LLVM_INSTALL_DIR})
+ set(CLANG_DIR $ENV{LLVM_INSTALL_DIR})
+ string(REPLACE "_ARCH_" "${PYTHON_ARCH}" CLANG_DIR "${CLANG_DIR}")
+ set(CLANG_DIR_SOURCE "LLVM_INSTALL_DIR")
+elseif (DEFINED ENV{CLANG_INSTALL_DIR})
+ set(CLANG_DIR $ENV{CLANG_INSTALL_DIR})
+ string(REPLACE "_ARCH_" "${PYTHON_ARCH}" CLANG_DIR "${CLANG_DIR}")
+ set(CLANG_DIR_SOURCE "CLANG_INSTALL_DIR")
+else ()
+ if (NOT LLVM_CONFIG)
+ get_llvm_config()
+ endif()
+ set(CLANG_DIR_SOURCE "${LLVM_CONFIG}")
+ EXEC_PROGRAM("${LLVM_CONFIG}" ARGS "--prefix" OUTPUT_VARIABLE CLANG_DIR)
+ if (NOT "${CLANG_DIR}" STREQUAL "")
+ EXEC_PROGRAM("${LLVM_CONFIG}" ARGS "--version" OUTPUT_VARIABLE CLANG_VERSION)
+ if (CLANG_VERSION VERSION_LESS 3.9)
+ message(FATAL_ERROR "LLVM version 3.9 is required (${LLVM_CONFIG} detected ${CLANG_VERSION} at ${CLANG_DIR}).")
+ endif()
+ endif()
+endif()
+
+if ("${CLANG_DIR}" STREQUAL "")
+ message(FATAL_ERROR "Unable to detect CLANG location by checking LLVM_INSTALL_DIR, CLANG_INSTALL_DIR or running llvm-config.")
+elseif (NOT IS_DIRECTORY ${CLANG_DIR})
+ message(FATAL_ERROR "${CLANG_DIR} detected by ${CLANG_DIR_SOURCE} does not exist.")
+endif()
+
+set(CLANG_LIB_NAME "clang")
+if(MSVC)
+ set(CLANG_LIB_NAME "libclang")
+endif()
+
+find_library(CLANG_LIBRARY ${CLANG_LIB_NAME} HINTS ${CLANG_DIR}/lib)
+if (NOT EXISTS ${CLANG_LIBRARY})
+ message(FATAL_ERROR "Unable to find Clang library ${CLANG_LIB_NAME} in ${CLANG_DIR}.")
+endif()
+
+message(STATUS "CLANG: ${CLANG_DIR}, ${CLANG_LIBRARY} detected by ${CLANG_DIR_SOURCE}")
+
+# Find highest version clang builtin includes folder to pass along to shiboken.
+set(CLANG_BUILTIN_INCLUDES_DIR_PREFIX ${CLANG_DIR}/lib/clang)
+file(GLOB CLANG_BUILTIN_INCLUDES_DIR_VERSIONS "${CLANG_BUILTIN_INCLUDES_DIR_PREFIX}/*")
+
+# Sort in alphabetical order the list of version folders.
+list(SORT CLANG_BUILTIN_INCLUDES_DIR_VERSIONS)
+
+# Reverse it so the first element is the highest version.
+list(REVERSE CLANG_BUILTIN_INCLUDES_DIR_VERSIONS)
+
+message(STATUS "Found the following CLANG builtins includes directories: ${CLANG_BUILTIN_INCLUDES_DIR_VERSIONS}")
+if(CLANG_BUILTIN_INCLUDES_DIR_VERSIONS)
+ # Get highest version.
+ list(GET CLANG_BUILTIN_INCLUDES_DIR_VERSIONS 0 CLANG_BUILTIN_INCLUDES_DIR_HIGHEST_VERSION)
+ if (CLANG_BUILTIN_INCLUDES_DIR_HIGHEST_VERSION)
+ # Set the final variable to the full include path to pass along to shiboken.
+ set(CLANG_BUILTIN_INCLUDES_DIR "${CLANG_BUILTIN_INCLUDES_DIR_HIGHEST_VERSION}/include")
+ endif()
+endif()
+message(STATUS "CLANG builtins includes directory chosen: ${CLANG_BUILTIN_INCLUDES_DIR}")
+
+set(CLANG_EXTRA_INCLUDES ${CLANG_DIR}/include)
+set(CLANG_EXTRA_LIBRARIES ${CLANG_LIBRARY})
+
set(SHIBOKEN_VERSION_FILE_PATH "${CMAKE_SOURCE_DIR}/shiboken_version.py")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
${SHIBOKEN_VERSION_FILE_PATH}
@@ -147,6 +245,11 @@ endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D QT_NO_CAST_FROM_ASCII -D QT_NO_CAST_TO_ASCII")
+# Force usage of the C++11 standard, without a silent fallback
+# to C++98 if the compiler does not support C++11.
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)" )
set(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})" FORCE)
diff --git a/sources/shiboken2/data/Shiboken2Config.cmake.in b/sources/shiboken2/data/Shiboken2Config.cmake.in
index 515b0d13b..7891c5a2d 100644
--- a/sources/shiboken2/data/Shiboken2Config.cmake.in
+++ b/sources/shiboken2/data/Shiboken2Config.cmake.in
@@ -2,4 +2,4 @@ if (NOT PYTHON_CONFIG_SUFFIX)
message(STATUS "Shiboken2Config: Using default python: @PYTHON_CONFIG_SUFFIX@")
SET(PYTHON_CONFIG_SUFFIX @PYTHON_CONFIG_SUFFIX@)
endif()
-include(@LIB_INSTALL_DIR@/cmake/Shiboken2-@shiboken2_VERSION@/Shiboken2Config${PYTHON_CONFIG_SUFFIX}.cmake)
+include("@LIB_INSTALL_DIR@/cmake/Shiboken2-@shiboken2_VERSION@/Shiboken2Config${PYTHON_CONFIG_SUFFIX}.cmake")
diff --git a/sources/shiboken2/doc/conf.py.in b/sources/shiboken2/doc/conf.py.in
index ed61d2695..5dc7b868d 100644
--- a/sources/shiboken2/doc/conf.py.in
+++ b/sources/shiboken2/doc/conf.py.in
@@ -131,10 +131,6 @@ html_theme_path = ['@CMAKE_CURRENT_SOURCE_DIR@/_themes']
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-html_use_smartypants = True
-
# Custom sidebar templates, maps document names to template names.
#html_sidebars = { '' : ''}
@@ -154,8 +150,6 @@ html_split_index = False
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = False
-html_add_permalinks = True
-
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
diff --git a/sources/shiboken2/ext/sparsehash/AUTHORS b/sources/shiboken2/ext/sparsehash/AUTHORS
deleted file mode 100644
index ee92be88d..000000000
--- a/sources/shiboken2/ext/sparsehash/AUTHORS
+++ /dev/null
@@ -1,2 +0,0 @@
-opensource@google.com
-
diff --git a/sources/shiboken2/ext/sparsehash/COPYING b/sources/shiboken2/ext/sparsehash/COPYING
deleted file mode 100644
index e4956cfd9..000000000
--- a/sources/shiboken2/ext/sparsehash/COPYING
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2005, Google Inc.
-All rights reserved.
-
-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 Google Inc. 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.
diff --git a/sources/shiboken2/ext/sparsehash/google/dense_hash_map b/sources/shiboken2/ext/sparsehash/google/dense_hash_map
deleted file mode 100644
index 09b0c4428..000000000
--- a/sources/shiboken2/ext/sparsehash/google/dense_hash_map
+++ /dev/null
@@ -1,310 +0,0 @@
-// Copyright (c) 2005, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-
-// ----
-// Author: Craig Silverstein
-//
-// This is just a very thin wrapper over densehashtable.h, just
-// like sgi stl's stl_hash_map is a very thin wrapper over
-// stl_hashtable. The major thing we define is operator[], because
-// we have a concept of a data_type which stl_hashtable doesn't
-// (it only has a key and a value).
-//
-// NOTE: this is exactly like sparse_hash_map.h, with the word
-// "sparse" replaced by "dense", except for the addition of
-// set_empty_key().
-//
-// YOU MUST CALL SET_EMPTY_KEY() IMMEDIATELY AFTER CONSTRUCTION.
-//
-// Otherwise your program will die in mysterious ways.
-//
-// In other respects, we adhere mostly to the STL semantics for
-// hash-map. One important exception is that insert() invalidates
-// iterators entirely. On the plus side, though, erase() doesn't
-// invalidate iterators at all, or even change the ordering of elements.
-//
-// Here are a few "power user" tips:
-//
-// 1) set_deleted_key():
-// If you want to use erase() you *must* call set_deleted_key(),
-// in addition to set_empty_key(), after construction.
-// The deleted and empty keys must differ.
-//
-// 2) resize(0):
-// When an item is deleted, its memory isn't freed right
-// away. This allows you to iterate over a hashtable,
-// and call erase(), without invalidating the iterator.
-// To force the memory to be freed, call resize(0).
-// For tr1 compatibility, this can also be called as rehash(0).
-//
-// 3) min_load_factor(0.0)
-// Setting the minimum load factor to 0.0 guarantees that
-// the hash table will never shrink.
-//
-// Guide to what kind of hash_map to use:
-// (1) dense_hash_map: fastest, uses the most memory
-// (2) sparse_hash_map: slowest, uses the least memory
-// (3) hash_map (STL): in the middle
-// Typically I use sparse_hash_map when I care about space and/or when
-// I need to save the hashtable on disk. I use hash_map otherwise. I
-// don't personally use dense_hash_set ever; some people use it for
-// small sets with lots of lookups.
-//
-// - dense_hash_map has, typically, a factor of 2 memory overhead (if your
-// data takes up X bytes, the hash_map uses X more bytes in overhead).
-// - sparse_hash_map has about 2 bits overhead per entry.
-// - sparse_hash_map can be 3-7 times slower than the others for lookup and,
-// especially, inserts. See time_hash_map.cc for details.
-//
-// See /usr/(local/)?doc/sparsehash-*/dense_hash_map.html
-// for information about how to use this class.
-
-#ifndef _DENSE_HASH_MAP_H_
-#define _DENSE_HASH_MAP_H_
-
-#include "google/sparsehash/sparseconfig.h"
-#include <stdio.h> // for FILE * in read()/write()
-#include <algorithm> // for the default template args
-#include <functional> // for equal_to
-#include <memory> // for alloc<>
-#include <utility> // for pair<>
-#include HASH_FUN_H // defined in config.h
-#include "google/sparsehash/densehashtable.h"
-
-
-_START_GOOGLE_NAMESPACE_
-
-using STL_NAMESPACE::pair;
-
-template <class Key, class T,
- class HashFcn = SPARSEHASH_HASH<Key>, // defined in sparseconfig.h
- class EqualKey = STL_NAMESPACE::equal_to<Key>,
- class Alloc = STL_NAMESPACE::allocator<T> >
-class dense_hash_map {
- private:
- // Apparently select1st is not stl-standard, so we define our own
- struct SelectKey {
- const Key& operator()(const pair<const Key, T>& p) const {
- return p.first;
- }
- };
- struct SetKey {
- void operator()(pair<const Key, T>* value, const Key& new_key) const {
- *const_cast<Key*>(&value->first) = new_key;
- // It would be nice to clear the rest of value here as well, in
- // case it's taking up a lot of memory. We do this by clearing
- // the value. This assumes T has a zero-arg constructor!
- value->second = T();
- }
- };
-
- // The actual data
- typedef dense_hashtable<pair<const Key, T>, Key, HashFcn,
- SelectKey, SetKey, EqualKey, Alloc> ht;
- ht rep;
-
- public:
- typedef typename ht::key_type key_type;
- typedef T data_type;
- typedef T mapped_type;
- typedef typename ht::value_type value_type;
- typedef typename ht::hasher hasher;
- typedef typename ht::key_equal key_equal;
- typedef Alloc allocator_type;
-
- typedef typename ht::size_type size_type;
- typedef typename ht::difference_type difference_type;
- typedef typename ht::pointer pointer;
- typedef typename ht::const_pointer const_pointer;
- typedef typename ht::reference reference;
- typedef typename ht::const_reference const_reference;
-
- typedef typename ht::iterator iterator;
- typedef typename ht::const_iterator const_iterator;
- typedef typename ht::local_iterator local_iterator;
- typedef typename ht::const_local_iterator const_local_iterator;
-
- // Iterator functions
- iterator begin() { return rep.begin(); }
- iterator end() { return rep.end(); }
- const_iterator begin() const { return rep.begin(); }
- const_iterator end() const { return rep.end(); }
-
-
- // These come from tr1's unordered_map. For us, a bucket has 0 or 1 elements.
- local_iterator begin(size_type i) { return rep.begin(i); }
- local_iterator end(size_type i) { return rep.end(i); }
- const_local_iterator begin(size_type i) const { return rep.begin(i); }
- const_local_iterator end(size_type i) const { return rep.end(i); }
-
- // Accessor functions
- // TODO(csilvers): implement Alloc get_allocator() const;
- hasher hash_funct() const { return rep.hash_funct(); }
- hasher hash_function() const { return hash_funct(); }
- key_equal key_eq() const { return rep.key_eq(); }
-
-
- // Constructors
- explicit dense_hash_map(size_type expected_max_items_in_table = 0,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal())
- : rep(expected_max_items_in_table, hf, eql) { }
-
- template <class InputIterator>
- dense_hash_map(InputIterator f, InputIterator l,
- size_type expected_max_items_in_table = 0,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal())
- : rep(expected_max_items_in_table, hf, eql) {
- rep.insert(f, l);
- }
- // We use the default copy constructor
- // We use the default operator=()
- // We use the default destructor
-
- void clear() { rep.clear(); }
- // This clears the hash map without resizing it down to the minimum
- // bucket count, but rather keeps the number of buckets constant
- void clear_no_resize() { rep.clear_no_resize(); }
- void swap(dense_hash_map& hs) { rep.swap(hs.rep); }
-
-
- // Functions concerning size
- size_type size() const { return rep.size(); }
- size_type max_size() const { return rep.max_size(); }
- bool empty() const { return rep.empty(); }
- size_type bucket_count() const { return rep.bucket_count(); }
- size_type max_bucket_count() const { return rep.max_bucket_count(); }
-
- // These are tr1 methods. bucket() is the bucket the key is or would be in.
- size_type bucket_size(size_type i) const { return rep.bucket_size(i); }
- size_type bucket(const key_type& key) const { return rep.bucket(key); }
- float load_factor() const {
- return size() * 1.0f / bucket_count();
- }
- float max_load_factor() const {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- return grow;
- }
- void max_load_factor(float new_grow) {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- rep.set_resizing_parameters(shrink, new_grow);
- }
- // These aren't tr1 methods but perhaps ought to be.
- float min_load_factor() const {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- return shrink;
- }
- void min_load_factor(float new_shrink) {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- rep.set_resizing_parameters(new_shrink, grow);
- }
- // Deprecated; use min_load_factor() or max_load_factor() instead.
- void set_resizing_parameters(float shrink, float grow) {
- return rep.set_resizing_parameters(shrink, grow);
- }
-
- void resize(size_type hint) { rep.resize(hint); }
- void rehash(size_type hint) { resize(hint); } // the tr1 name
-
- // Lookup routines
- iterator find(const key_type& key) { return rep.find(key); }
- const_iterator find(const key_type& key) const { return rep.find(key); }
-
- data_type& operator[](const key_type& key) { // This is our value-add!
- iterator it = find(key);
- if (it != end()) {
- return it->second;
- } else {
- return insert(value_type(key, data_type())).first->second;
- }
- }
-
- size_type count(const key_type& key) const { return rep.count(key); }
-
- pair<iterator, iterator> equal_range(const key_type& key) {
- return rep.equal_range(key);
- }
- pair<const_iterator, const_iterator> equal_range(const key_type& key) const {
- return rep.equal_range(key);
- }
-
- // Insertion routines
- pair<iterator, bool> insert(const value_type& obj) { return rep.insert(obj); }
- template <class InputIterator>
- void insert(InputIterator f, InputIterator l) { rep.insert(f, l); }
- void insert(const_iterator f, const_iterator l) { rep.insert(f, l); }
- // required for std::insert_iterator; the passed-in iterator is ignored
- iterator insert(iterator, const value_type& obj) { return insert(obj).first; }
-
-
- // Deletion and empty routines
- // THESE ARE NON-STANDARD! I make you specify an "impossible" key
- // value to identify deleted and empty buckets. You can change the
- // deleted key as time goes on, or get rid of it entirely to be insert-only.
- void set_empty_key(const key_type& key) { // YOU MUST CALL THIS!
- rep.set_empty_key(value_type(key, data_type())); // rep wants a value
- }
- void set_deleted_key(const key_type& key) {
- rep.set_deleted_key(key);
- }
- void clear_deleted_key() { rep.clear_deleted_key(); }
-
- // These are standard
- size_type erase(const key_type& key) { return rep.erase(key); }
- void erase(iterator it) { rep.erase(it); }
- void erase(iterator f, iterator l) { rep.erase(f, l); }
-
-
- // Comparison
- bool operator==(const dense_hash_map& hs) const { return rep == hs.rep; }
- bool operator!=(const dense_hash_map& hs) const { return rep != hs.rep; }
-
-
- // I/O -- this is an add-on for writing metainformation to disk
- bool write_metadata(FILE *fp) { return rep.write_metadata(fp); }
- bool read_metadata(FILE *fp) { return rep.read_metadata(fp); }
- bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); }
- bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); }
-};
-
-// We need a global swap as well
-template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
-inline void swap(dense_hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm1,
- dense_hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm2) {
- hm1.swap(hm2);
-}
-
-_END_GOOGLE_NAMESPACE_
-
-#endif /* _DENSE_HASH_MAP_H_ */
diff --git a/sources/shiboken2/ext/sparsehash/google/dense_hash_set b/sources/shiboken2/ext/sparsehash/google/dense_hash_set
deleted file mode 100644
index faa21dc59..000000000
--- a/sources/shiboken2/ext/sparsehash/google/dense_hash_set
+++ /dev/null
@@ -1,287 +0,0 @@
-// Copyright (c) 2005, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-
-// ---
-// Author: Craig Silverstein
-//
-// This is just a very thin wrapper over densehashtable.h, just
-// like sgi stl's stl_hash_set is a very thin wrapper over
-// stl_hashtable. The major thing we define is operator[], because
-// we have a concept of a data_type which stl_hashtable doesn't
-// (it only has a key and a value).
-//
-// This is more different from dense_hash_map than you might think,
-// because all iterators for sets are const (you obviously can't
-// change the key, and for sets there is no value).
-//
-// NOTE: this is exactly like sparse_hash_set.h, with the word
-// "sparse" replaced by "dense", except for the addition of
-// set_empty_key().
-//
-// YOU MUST CALL SET_EMPTY_KEY() IMMEDIATELY AFTER CONSTRUCTION.
-//
-// Otherwise your program will die in mysterious ways.
-//
-// In other respects, we adhere mostly to the STL semantics for
-// hash-set. One important exception is that insert() invalidates
-// iterators entirely. On the plus side, though, erase() doesn't
-// invalidate iterators at all, or even change the ordering of elements.
-//
-// Here are a few "power user" tips:
-//
-// 1) set_deleted_key():
-// If you want to use erase() you must call set_deleted_key(),
-// in addition to set_empty_key(), after construction.
-// The deleted and empty keys must differ.
-//
-// 2) resize(0):
-// When an item is deleted, its memory isn't freed right
-// away. This allows you to iterate over a hashtable,
-// and call erase(), without invalidating the iterator.
-// To force the memory to be freed, call resize(0).
-// For tr1 compatibility, this can also be called as rehash(0).
-//
-// 3) min_load_factor(0.0)
-// Setting the minimum load factor to 0.0 guarantees that
-// the hash table will never shrink.
-//
-// Guide to what kind of hash_set to use:
-// (1) dense_hash_set: fastest, uses the most memory
-// (2) sparse_hash_set: slowest, uses the least memory
-// (3) hash_set (STL): in the middle
-// Typically I use sparse_hash_set when I care about space and/or when
-// I need to save the hashtable on disk. I use hash_set otherwise. I
-// don't personally use dense_hash_set ever; some people use it for
-// small sets with lots of lookups.
-//
-// - dense_hash_set has, typically, a factor of 2 memory overhead (if your
-// data takes up X bytes, the hash_set uses X more bytes in overhead).
-// - sparse_hash_set has about 2 bits overhead per entry.
-// - sparse_hash_map can be 3-7 times slower than the others for lookup and,
-// especially, inserts. See time_hash_map.cc for details.
-//
-// See /usr/(local/)?doc/sparsehash-*/dense_hash_set.html
-// for information about how to use this class.
-
-#ifndef _DENSE_HASH_SET_H_
-#define _DENSE_HASH_SET_H_
-
-#include <google/sparsehash/sparseconfig.h>
-#include <stdio.h> // for FILE * in read()/write()
-#include <algorithm> // for the default template args
-#include <functional> // for equal_to
-#include <memory> // for alloc<>
-#include <utility> // for pair<>
-#include HASH_FUN_H // defined in config.h
-#include <google/sparsehash/densehashtable.h>
-
-
-_START_GOOGLE_NAMESPACE_
-
-using STL_NAMESPACE::pair;
-
-template <class Value,
- class HashFcn = SPARSEHASH_HASH<Value>, // defined in sparseconfig.h
- class EqualKey = STL_NAMESPACE::equal_to<Value>,
- class Alloc = STL_NAMESPACE::allocator<Value> >
-class dense_hash_set {
- private:
- // Apparently identity is not stl-standard, so we define our own
- struct Identity {
- Value& operator()(Value& v) const { return v; }
- const Value& operator()(const Value& v) const { return v; }
- };
- struct SetKey {
- void operator()(Value* value, const Value& new_key) const {
- *value = new_key;
- }
- };
-
- // The actual data
- typedef dense_hashtable<Value, Value, HashFcn,
- Identity, SetKey, EqualKey, Alloc> ht;
- ht rep;
-
- public:
- typedef typename ht::key_type key_type;
- typedef typename ht::value_type value_type;
- typedef typename ht::hasher hasher;
- typedef typename ht::key_equal key_equal;
- typedef Alloc allocator_type;
-
- typedef typename ht::size_type size_type;
- typedef typename ht::difference_type difference_type;
- typedef typename ht::const_pointer pointer;
- typedef typename ht::const_pointer const_pointer;
- typedef typename ht::const_reference reference;
- typedef typename ht::const_reference const_reference;
-
- typedef typename ht::const_iterator iterator;
- typedef typename ht::const_iterator const_iterator;
- typedef typename ht::const_local_iterator local_iterator;
- typedef typename ht::const_local_iterator const_local_iterator;
-
-
- // Iterator functions -- recall all iterators are const
- iterator begin() const { return rep.begin(); }
- iterator end() const { return rep.end(); }
-
- // These come from tr1's unordered_set. For us, a bucket has 0 or 1 elements.
- local_iterator begin(size_type i) const { return rep.begin(i); }
- local_iterator end(size_type i) const { return rep.end(i); }
-
-
- // Accessor functions
- hasher hash_funct() const { return rep.hash_funct(); }
- key_equal key_eq() const { return rep.key_eq(); }
-
-
- // Constructors
- explicit dense_hash_set(size_type expected_max_items_in_table = 0,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal())
- : rep(expected_max_items_in_table, hf, eql) { }
-
- template <class InputIterator>
- dense_hash_set(InputIterator f, InputIterator l,
- size_type expected_max_items_in_table = 0,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal())
- : rep(expected_max_items_in_table, hf, eql) {
- rep.insert(f, l);
- }
- // We use the default copy constructor
- // We use the default operator=()
- // We use the default destructor
-
- void clear() { rep.clear(); }
- // This clears the hash set without resizing it down to the minimum
- // bucket count, but rather keeps the number of buckets constant
- void clear_no_resize() { rep.clear_no_resize(); }
- void swap(dense_hash_set& hs) { rep.swap(hs.rep); }
-
-
- // Functions concerning size
- size_type size() const { return rep.size(); }
- size_type max_size() const { return rep.max_size(); }
- bool empty() const { return rep.empty(); }
- size_type bucket_count() const { return rep.bucket_count(); }
- size_type max_bucket_count() const { return rep.max_bucket_count(); }
-
- // These are tr1 methods. bucket() is the bucket the key is or would be in.
- size_type bucket_size(size_type i) const { return rep.bucket_size(i); }
- size_type bucket(const key_type& key) const { return rep.bucket(key); }
- float load_factor() const {
- return size() * 1.0f / bucket_count();
- }
- float max_load_factor() const {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- return grow;
- }
- void max_load_factor(float new_grow) {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- rep.set_resizing_parameters(shrink, new_grow);
- }
- // These aren't tr1 methods but perhaps ought to be.
- float min_load_factor() const {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- return shrink;
- }
- void min_load_factor(float new_shrink) {
- float shrink, grow;
- rep.get_resizing_parameters(&shrink, &grow);
- rep.set_resizing_parameters(new_shrink, grow);
- }
- // Deprecated; use min_load_factor() or max_load_factor() instead.
- void set_resizing_parameters(float shrink, float grow) {
- return rep.set_resizing_parameters(shrink, grow);
- }
-
- void resize(size_type hint) { rep.resize(hint); }
- void rehash(size_type hint) { resize(hint); } // the tr1 name
-
- // Lookup routines
- iterator find(const key_type& key) const { return rep.find(key); }
-
- size_type count(const key_type& key) const { return rep.count(key); }
-
- pair<iterator, iterator> equal_range(const key_type& key) const {
- return rep.equal_range(key);
- }
-
- // Insertion routines
- pair<iterator, bool> insert(const value_type& obj) {
- pair<typename ht::iterator, bool> p = rep.insert(obj);
- return pair<iterator, bool>(p.first, p.second); // const to non-const
- }
- template <class InputIterator>
- void insert(InputIterator f, InputIterator l) { rep.insert(f, l); }
- void insert(const_iterator f, const_iterator l) { rep.insert(f, l); }
- // required for std::insert_iterator; the passed-in iterator is ignored
- iterator insert(iterator, const value_type& obj) { return insert(obj).first; }
-
-
- // Deletion and empty routines
- // THESE ARE NON-STANDARD! I make you specify an "impossible" key
- // value to identify deleted and empty buckets. You can change the
- // deleted key as time goes on, or get rid of it entirely to be insert-only.
- void set_empty_key(const key_type& key) { rep.set_empty_key(key); }
- void set_deleted_key(const key_type& key) { rep.set_deleted_key(key); }
- void clear_deleted_key() { rep.clear_deleted_key(); }
-
- // These are standard
- size_type erase(const key_type& key) { return rep.erase(key); }
- void erase(iterator it) { rep.erase(it); }
- void erase(iterator f, iterator l) { rep.erase(f, l); }
-
-
- // Comparison
- bool operator==(const dense_hash_set& hs) const { return rep == hs.rep; }
- bool operator!=(const dense_hash_set& hs) const { return rep != hs.rep; }
-
-
- // I/O -- this is an add-on for writing metainformation to disk
- bool write_metadata(FILE *fp) { return rep.write_metadata(fp); }
- bool read_metadata(FILE *fp) { return rep.read_metadata(fp); }
- bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); }
- bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); }
-};
-
-template <class Val, class HashFcn, class EqualKey, class Alloc>
-inline void swap(dense_hash_set<Val, HashFcn, EqualKey, Alloc>& hs1,
- dense_hash_set<Val, HashFcn, EqualKey, Alloc>& hs2) {
- hs1.swap(hs2);
-}
-
-_END_GOOGLE_NAMESPACE_
-
-#endif /* _DENSE_HASH_SET_H_ */
diff --git a/sources/shiboken2/ext/sparsehash/google/sparsehash/densehashtable.h b/sources/shiboken2/ext/sparsehash/google/sparsehash/densehashtable.h
deleted file mode 100644
index 33b191ec8..000000000
--- a/sources/shiboken2/ext/sparsehash/google/sparsehash/densehashtable.h
+++ /dev/null
@@ -1,1062 +0,0 @@
-// Copyright (c) 2005, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-
-// ---
-// Author: Craig Silverstein
-//
-// A dense hashtable is a particular implementation of
-// a hashtable: one that is meant to minimize memory allocation.
-// It does this by using an array to store all the data. We
-// steal a value from the key space to indicate "empty" array
-// elements (ie indices where no item lives) and another to indicate
-// "deleted" elements.
-//
-// (Note it is possible to change the value of the delete key
-// on the fly; you can even remove it, though after that point
-// the hashtable is insert_only until you set it again. The empty
-// value however can't be changed.)
-//
-// To minimize allocation and pointer overhead, we use internal
-// probing, in which the hashtable is a single table, and collisions
-// are resolved by trying to insert again in another bucket. The
-// most cache-efficient internal probing schemes are linear probing
-// (which suffers, alas, from clumping) and quadratic probing, which
-// is what we implement by default.
-//
-// Type requirements: value_type is required to be Copy Constructible
-// and Default Constructible. It is not required to be (and commonly
-// isn't) Assignable.
-//
-// You probably shouldn't use this code directly. Use
-// <google/dense_hash_map> or <google/dense_hash_set> instead.
-
-// You can change the following below:
-// HT_OCCUPANCY_FLT -- how full before we double size
-// HT_EMPTY_FLT -- how empty before we halve size
-// HT_MIN_BUCKETS -- default smallest bucket size
-//
-// You can also change enlarge_resize_percent (which defaults to
-// HT_OCCUPANCY_FLT), and shrink_resize_percent (which defaults to
-// HT_EMPTY_FLT) with set_resizing_parameters().
-//
-// How to decide what values to use?
-// shrink_resize_percent's default of .4 * OCCUPANCY_FLT, is probably good.
-// HT_MIN_BUCKETS is probably unnecessary since you can specify
-// (indirectly) the starting number of buckets at construct-time.
-// For enlarge_resize_percent, you can use this chart to try to trade-off
-// expected lookup time to the space taken up. By default, this
-// code uses quadratic probing, though you can change it to linear
-// via _JUMP below if you really want to.
-//
-// From http://www.augustana.ca/~mohrj/courses/1999.fall/csc210/lecture_notes/hashing.html
-// NUMBER OF PROBES / LOOKUP Successful Unsuccessful
-// Quadratic collision resolution 1 - ln(1-L) - L/2 1/(1-L) - L - ln(1-L)
-// Linear collision resolution [1+1/(1-L)]/2 [1+1/(1-L)2]/2
-//
-// -- enlarge_resize_percent -- 0.10 0.50 0.60 0.75 0.80 0.90 0.99
-// QUADRATIC COLLISION RES.
-// probes/successful lookup 1.05 1.44 1.62 2.01 2.21 2.85 5.11
-// probes/unsuccessful lookup 1.11 2.19 2.82 4.64 5.81 11.4 103.6
-// LINEAR COLLISION RES.
-// probes/successful lookup 1.06 1.5 1.75 2.5 3.0 5.5 50.5
-// probes/unsuccessful lookup 1.12 2.5 3.6 8.5 13.0 50.0 5000.0
-
-#ifndef _DENSEHASHTABLE_H_
-#define _DENSEHASHTABLE_H_
-
-// The probing method
-// Linear probing
-// #define JUMP_(key, num_probes) ( 1 )
-// Quadratic-ish probing
-#define JUMP_(key, num_probes) ( num_probes )
-
-
-#include "google/sparsehash/sparseconfig.h"
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h> // for abort()
-#include <algorithm> // For swap(), eg
-#include <iostream> // For cerr
-#include <memory> // For uninitialized_fill, uninitialized_copy
-#include <utility> // for pair<>
-#include <iterator> // for facts about iterator tags
-#include "google/type_traits.h" // for true_type, integral_constant, etc.
-
-_START_GOOGLE_NAMESPACE_
-
-using STL_NAMESPACE::pair;
-
-// Hashtable class, used to implement the hashed associative containers
-// hash_set and hash_map.
-
-// Value: what is stored in the table (each bucket is a Value).
-// Key: something in a 1-to-1 correspondence to a Value, that can be used
-// to search for a Value in the table (find() takes a Key).
-// HashFcn: Takes a Key and returns an integer, the more unique the better.
-// ExtractKey: given a Value, returns the unique Key associated with it.
-// SetKey: given a Value* and a Key, modifies the value such that
-// ExtractKey(value) == key. We guarantee this is only called
-// with key == deleted_key or key == empty_key.
-// EqualKey: Given two Keys, says whether they are the same (that is,
-// if they are both associated with the same Value).
-// Alloc: STL allocator to use to allocate memory. Currently ignored.
-
-template <class Value, class Key, class HashFcn,
- class ExtractKey, class SetKey, class EqualKey, class Alloc>
-class dense_hashtable;
-
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-struct dense_hashtable_iterator;
-
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-struct dense_hashtable_const_iterator;
-
-// We're just an array, but we need to skip over empty and deleted elements
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-struct dense_hashtable_iterator {
- public:
- typedef dense_hashtable_iterator<V,K,HF,ExK,SetK,EqK,A> iterator;
- typedef dense_hashtable_const_iterator<V,K,HF,ExK,SetK,EqK,A> const_iterator;
-
- typedef STL_NAMESPACE::forward_iterator_tag iterator_category;
- typedef V value_type;
- typedef STL_NAMESPACE::ptrdiff_t difference_type;
- typedef size_t size_type;
- typedef V& reference; // Value
- typedef V* pointer;
-
- // "Real" constructor and default constructor
- dense_hashtable_iterator(const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *h,
- pointer it, pointer it_end, bool advance)
- : ht(h), pos(it), end(it_end) {
- if (advance) advance_past_empty_and_deleted();
- }
- dense_hashtable_iterator() { }
- // The default destructor is fine; we don't define one
- // The default operator= is fine; we don't define one
-
- // Happy dereferencer
- reference operator*() const { return *pos; }
- pointer operator->() const { return &(operator*()); }
-
- // Arithmetic. The only hard part is making sure that
- // we're not on an empty or marked-deleted array element
- void advance_past_empty_and_deleted() {
- while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )
- ++pos;
- }
- iterator& operator++() {
- assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;
- }
- iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }
-
- // Comparison.
- bool operator==(const iterator& it) const { return pos == it.pos; }
- bool operator!=(const iterator& it) const { return pos != it.pos; }
-
-
- // The actual data
- const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *ht;
- pointer pos, end;
-};
-
-
-// Now do it all again, but with const-ness!
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-struct dense_hashtable_const_iterator {
- public:
- typedef dense_hashtable_iterator<V,K,HF,ExK,SetK,EqK,A> iterator;
- typedef dense_hashtable_const_iterator<V,K,HF,ExK,SetK,EqK,A> const_iterator;
-
- typedef STL_NAMESPACE::forward_iterator_tag iterator_category;
- typedef V value_type;
- typedef STL_NAMESPACE::ptrdiff_t difference_type;
- typedef size_t size_type;
- typedef const V& reference; // Value
- typedef const V* pointer;
-
- // "Real" constructor and default constructor
- dense_hashtable_const_iterator(
- const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *h,
- pointer it, pointer it_end, bool advance)
- : ht(h), pos(it), end(it_end) {
- if (advance) advance_past_empty_and_deleted();
- }
- dense_hashtable_const_iterator() { }
- // This lets us convert regular iterators to const iterators
- dense_hashtable_const_iterator(const iterator &it)
- : ht(it.ht), pos(it.pos), end(it.end) { }
- // The default destructor is fine; we don't define one
- // The default operator= is fine; we don't define one
-
- // Happy dereferencer
- reference operator*() const { return *pos; }
- pointer operator->() const { return &(operator*()); }
-
- // Arithmetic. The only hard part is making sure that
- // we're not on an empty or marked-deleted array element
- void advance_past_empty_and_deleted() {
- while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )
- ++pos;
- }
- const_iterator& operator++() {
- assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;
- }
- const_iterator operator++(int) { const_iterator tmp(*this); ++*this; return tmp; }
-
- // Comparison.
- bool operator==(const const_iterator& it) const { return pos == it.pos; }
- bool operator!=(const const_iterator& it) const { return pos != it.pos; }
-
-
- // The actual data
- const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *ht;
- pointer pos, end;
-};
-
-template <class Value, class Key, class HashFcn,
- class ExtractKey, class SetKey, class EqualKey, class Alloc>
-class dense_hashtable {
- public:
- typedef Key key_type;
- typedef Value value_type;
- typedef HashFcn hasher;
- typedef EqualKey key_equal;
-
- typedef size_t size_type;
- typedef STL_NAMESPACE::ptrdiff_t difference_type;
- typedef value_type* pointer;
- typedef const value_type* const_pointer;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef dense_hashtable_iterator<Value, Key, HashFcn,
- ExtractKey, SetKey, EqualKey, Alloc>
- iterator;
-
- typedef dense_hashtable_const_iterator<Value, Key, HashFcn,
- ExtractKey, SetKey, EqualKey, Alloc>
- const_iterator;
-
- // These come from tr1. For us they're the same as regular iterators.
- typedef iterator local_iterator;
- typedef const_iterator const_local_iterator;
-
- // How full we let the table get before we resize, by default.
- // Knuth says .8 is good -- higher causes us to probe too much,
- // though it saves memory.
- static const float HT_OCCUPANCY_FLT; // = 0.5;
-
- // How empty we let the table get before we resize lower, by default.
- // (0.0 means never resize lower.)
- // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing
- static const float HT_EMPTY_FLT; // = 0.4 * HT_OCCUPANCY_FLT
-
- // Minimum size we're willing to let hashtables be.
- // Must be a power of two, and at least 4.
- // Note, however, that for a given hashtable, the initial size is a
- // function of the first constructor arg, and may be >HT_MIN_BUCKETS.
- static const size_t HT_MIN_BUCKETS = 4;
-
- // By default, if you don't specify a hashtable size at
- // construction-time, we use this size. Must be a power of two, and
- // at least HT_MIN_BUCKETS.
- static const size_t HT_DEFAULT_STARTING_BUCKETS = 32;
-
-
- // ITERATOR FUNCTIONS
- iterator begin() { return iterator(this, table,
- table + num_buckets, true); }
- iterator end() { return iterator(this, table + num_buckets,
- table + num_buckets, true); }
- const_iterator begin() const { return const_iterator(this, table,
- table+num_buckets,true);}
- const_iterator end() const { return const_iterator(this, table + num_buckets,
- table+num_buckets,true);}
-
- // These come from tr1 unordered_map. They iterate over 'bucket' n.
- // For sparsehashtable, we could consider each 'group' to be a bucket,
- // I guess, but I don't really see the point. We'll just consider
- // bucket n to be the n-th element of the sparsetable, if it's occupied,
- // or some empty element, otherwise.
- local_iterator begin(size_type i) {
- return local_iterator(this, table + i, table + i+1, false);
- }
- local_iterator end(size_type i) {
- local_iterator it = begin(i);
- if (!test_empty(i) && !test_deleted(i))
- ++it;
- return it;
- }
- const_local_iterator begin(size_type i) const {
- return const_local_iterator(this, table + i, table + i+1, false);
- }
- const_local_iterator end(size_type i) const {
- const_local_iterator it = begin(i);
- if (!test_empty(i) && !test_deleted(i))
- ++it;
- return it;
- }
-
- // ACCESSOR FUNCTIONS for the things we templatize on, basically
- hasher hash_funct() const { return hash; }
- key_equal key_eq() const { return equals; }
-
- private:
- // Annoyingly, we can't copy values around, because they might have
- // const components (they're probably pair<const X, Y>). We use
- // explicit destructor invocation and placement new to get around
- // this. Arg.
- void set_value(value_type* dst, const value_type& src) {
- dst->~value_type();
- new(dst) value_type(src);
- }
-
- void destroy_buckets(size_type first, size_type last) {
- for ( ; first != last; ++first)
- table[first].~value_type();
- }
-
- // DELETE HELPER FUNCTIONS
- // This lets the user describe a key that will indicate deleted
- // table entries. This key should be an "impossible" entry --
- // if you try to insert it for real, you won't be able to retrieve it!
- // (NB: while you pass in an entire value, only the key part is looked
- // at. This is just because I don't know how to assign just a key.)
- private:
- void squash_deleted() { // gets rid of any deleted entries we have
- if ( num_deleted ) { // get rid of deleted before writing
- dense_hashtable tmp(*this); // copying will get rid of deleted
- swap(tmp); // now we are tmp
- }
- assert(num_deleted == 0);
- }
-
- public:
- void set_deleted_key(const key_type &key) {
- // the empty indicator (if specified) and the deleted indicator
- // must be different
- assert(!use_empty || !equals(key, get_key(emptyval)));
- // It's only safe to change what "deleted" means if we purge deleted guys
- squash_deleted();
- use_deleted = true;
- delkey = key;
- }
- void clear_deleted_key() {
- squash_deleted();
- use_deleted = false;
- }
-
- // These are public so the iterators can use them
- // True if the item at position bucknum is "deleted" marker
- bool test_deleted(size_type bucknum) const {
- // The num_deleted test is crucial for read(): after read(), the ht values
- // are garbage, and we don't want to think some of them are deleted.
- return (use_deleted && num_deleted > 0 &&
- equals(delkey, get_key(table[bucknum])));
- }
- bool test_deleted(const iterator &it) const {
- return (use_deleted && num_deleted > 0 &&
- equals(delkey, get_key(*it)));
- }
- bool test_deleted(const const_iterator &it) const {
- return (use_deleted && num_deleted > 0 &&
- equals(delkey, get_key(*it)));
- }
- // Set it so test_deleted is true. true if object didn't used to be deleted
- // See below (at erase()) to explain why we allow const_iterators
- bool set_deleted(const_iterator &it) {
- assert(use_deleted); // bad if set_deleted_key() wasn't called
- bool retval = !test_deleted(it);
- // &* converts from iterator to value-type
- set_key(const_cast<value_type*>(&(*it)), delkey);
- return retval;
- }
- // Set it so test_deleted is false. true if object used to be deleted
- bool clear_deleted(const_iterator &it) {
- assert(use_deleted); // bad if set_deleted_key() wasn't called
- // happens automatically when we assign something else in its place
- return test_deleted(it);
- }
-
- // EMPTY HELPER FUNCTIONS
- // This lets the user describe a key that will indicate empty (unused)
- // table entries. This key should be an "impossible" entry --
- // if you try to insert it for real, you won't be able to retrieve it!
- // (NB: while you pass in an entire value, only the key part is looked
- // at. This is just because I don't know how to assign just a key.)
- public:
- // These are public so the iterators can use them
- // True if the item at position bucknum is "empty" marker
- bool test_empty(size_type bucknum) const {
- assert(use_empty); // we always need to know what's empty!
- return equals(get_key(emptyval), get_key(table[bucknum]));
- }
- bool test_empty(const iterator &it) const {
- assert(use_empty); // we always need to know what's empty!
- return equals(get_key(emptyval), get_key(*it));
- }
- bool test_empty(const const_iterator &it) const {
- assert(use_empty); // we always need to know what's empty!
- return equals(get_key(emptyval), get_key(*it));
- }
-
- private:
- // You can either set a range empty or an individual element
- void set_empty(size_type bucknum) {
- assert(use_empty);
- set_value(&table[bucknum], emptyval);
- }
- void fill_range_with_empty(value_type* table_start, value_type* table_end) {
- // Like set_empty(range), but doesn't destroy previous contents
- STL_NAMESPACE::uninitialized_fill(table_start, table_end, emptyval);
- }
- void set_empty(size_type buckstart, size_type buckend) {
- assert(use_empty);
- destroy_buckets(buckstart, buckend);
- fill_range_with_empty(table + buckstart, table + buckend);
- }
-
- public:
- // TODO(csilvers): change all callers of this to pass in a key instead,
- // and take a const key_type instead of const value_type.
- void set_empty_key(const value_type &val) {
- // Once you set the empty key, you can't change it
- assert(!use_empty);
- // The deleted indicator (if specified) and the empty indicator
- // must be different.
- assert(!use_deleted || !equals(get_key(val), delkey));
- use_empty = true;
- set_value(&emptyval, val);
-
- assert(!table); // must set before first use
- // num_buckets was set in constructor even though table was NULL
- table = (value_type *) malloc(num_buckets * sizeof(*table));
- assert(table);
- fill_range_with_empty(table, table + num_buckets);
- }
-
- // FUNCTIONS CONCERNING SIZE
- public:
- size_type size() const { return num_elements - num_deleted; }
- // Buckets are always a power of 2
- size_type max_size() const { return (size_type(-1) >> 1U) + 1; }
- bool empty() const { return size() == 0; }
- size_type bucket_count() const { return num_buckets; }
- size_type max_bucket_count() const { return max_size(); }
- size_type nonempty_bucket_count() const { return num_elements; }
- // These are tr1 methods. Their idea of 'bucket' doesn't map well to
- // what we do. We just say every bucket has 0 or 1 items in it.
- size_type bucket_size(size_type i) const {
- return begin(i) == end(i) ? 0 : 1;
- }
-
-
-
- private:
- // Because of the above, size_type(-1) is never legal; use it for errors
- static const size_type ILLEGAL_BUCKET = size_type(-1);
-
- private:
- // This is the smallest size a hashtable can be without being too crowded
- // If you like, you can give a min #buckets as well as a min #elts
- size_type min_size(size_type num_elts, size_type min_buckets_wanted) {
- size_type sz = HT_MIN_BUCKETS; // min buckets allowed
- while ( sz < min_buckets_wanted || num_elts >= sz * enlarge_resize_percent )
- sz *= 2;
- return sz;
- }
-
- // Used after a string of deletes
- void maybe_shrink() {
- assert(num_elements >= num_deleted);
- assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two
- assert(bucket_count() >= HT_MIN_BUCKETS);
-
- // If you construct a hashtable with < HT_DEFAULT_STARTING_BUCKETS,
- // we'll never shrink until you get relatively big, and we'll never
- // shrink below HT_DEFAULT_STARTING_BUCKETS. Otherwise, something
- // like "dense_hash_set<int> x; x.insert(4); x.erase(4);" will
- // shrink us down to HT_MIN_BUCKETS buckets, which is too small.
- if (shrink_threshold > 0 &&
- (num_elements-num_deleted) < shrink_threshold &&
- bucket_count() > HT_DEFAULT_STARTING_BUCKETS ) {
- size_type sz = bucket_count() / 2; // find how much we should shrink
- while ( sz > HT_DEFAULT_STARTING_BUCKETS &&
- (num_elements - num_deleted) < sz * shrink_resize_percent )
- sz /= 2; // stay a power of 2
- dense_hashtable tmp(*this, sz); // Do the actual resizing
- swap(tmp); // now we are tmp
- }
- consider_shrink = false; // because we just considered it
- }
-
- // We'll let you resize a hashtable -- though this makes us copy all!
- // When you resize, you say, "make it big enough for this many more elements"
- void resize_delta(size_type delta) {
- if ( consider_shrink ) // see if lots of deletes happened
- maybe_shrink();
- if ( bucket_count() > HT_MIN_BUCKETS &&
- (num_elements + delta) <= enlarge_threshold )
- return; // we're ok as we are
-
- // Sometimes, we need to resize just to get rid of all the
- // "deleted" buckets that are clogging up the hashtable. So when
- // deciding whether to resize, count the deleted buckets (which
- // are currently taking up room). But later, when we decide what
- // size to resize to, *don't* count deleted buckets, since they
- // get discarded during the resize.
- const size_type needed_size = min_size(num_elements + delta, 0);
- if ( needed_size > bucket_count() ) { // we don't have enough buckets
- const size_type resize_to = min_size(num_elements - num_deleted + delta,
- 0);
- dense_hashtable tmp(*this, resize_to);
- swap(tmp); // now we are tmp
- }
- }
-
- // Increase number of buckets, assuming value_type has trivial copy
- // constructor and destructor. (Really, we want it to have "trivial
- // move", because that's what realloc does. But there's no way to
- // capture that using type_traits, so we pretend that move(x, y) is
- // equivalent to "x.~T(); new(x) T(y);" which is pretty much
- // correct, if a bit conservative.)
- void expand_array(size_t resize_to, true_type) {
- table = (value_type *) realloc(table, resize_to * sizeof(value_type));
- assert(table);
- fill_range_with_empty(table + num_buckets, table + resize_to);
- }
-
- // Increase number of buckets, without special assumptions about value_type.
- // TODO(austern): make this exception safe. Handle exceptions from
- // value_type's copy constructor.
- void expand_array(size_t resize_to, false_type) {
- value_type* new_table =
- (value_type *) malloc(resize_to * sizeof(value_type));
- assert(new_table);
- STL_NAMESPACE::uninitialized_copy(table, table + num_buckets, new_table);
- fill_range_with_empty(new_table + num_buckets, new_table + resize_to);
- destroy_buckets(0, num_buckets);
- free(table);
- table = new_table;
- }
-
- // Used to actually do the rehashing when we grow/shrink a hashtable
- void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted) {
- clear(); // clear table, set num_deleted to 0
-
- // If we need to change the size of our table, do it now
- const size_type resize_to = min_size(ht.size(), min_buckets_wanted);
- if ( resize_to > bucket_count() ) { // we don't have enough buckets
- typedef integral_constant<bool,
- (has_trivial_copy<value_type>::value &&
- has_trivial_destructor<value_type>::value)>
- realloc_ok; // we pretend mv(x,y) == "x.~T(); new(x) T(y)"
- expand_array(resize_to, realloc_ok());
- num_buckets = resize_to;
- reset_thresholds();
- }
-
- // We use a normal iterator to get non-deleted bcks from ht
- // We could use insert() here, but since we know there are
- // no duplicates and no deleted items, we can be more efficient
- assert((bucket_count() & (bucket_count()-1)) == 0); // a power of two
- for ( const_iterator it = ht.begin(); it != ht.end(); ++it ) {
- size_type num_probes = 0; // how many times we've probed
- size_type bucknum;
- const size_type bucket_count_minus_one = bucket_count() - 1;
- for (bucknum = hash(get_key(*it)) & bucket_count_minus_one;
- !test_empty(bucknum); // not empty
- bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one) {
- ++num_probes;
- assert(num_probes < bucket_count()); // or else the hashtable is full
- }
- set_value(&table[bucknum], *it); // copies the value to here
- num_elements++;
- }
- }
-
- // Required by the spec for hashed associative container
- public:
- // Though the docs say this should be num_buckets, I think it's much
- // more useful as req_elements. As a special feature, calling with
- // req_elements==0 will cause us to shrink if we can, saving space.
- void resize(size_type req_elements) { // resize to this or larger
- if ( consider_shrink || req_elements == 0 )
- maybe_shrink();
- if ( req_elements > num_elements )
- return resize_delta(req_elements - num_elements);
- }
-
- // Get and change the value of shrink_resize_percent and
- // enlarge_resize_percent. The description at the beginning of this
- // file explains how to choose the values. Setting the shrink
- // parameter to 0.0 ensures that the table never shrinks.
- void get_resizing_parameters(float* shrink, float* grow) const {
- *shrink = shrink_resize_percent;
- *grow = enlarge_resize_percent;
- }
- void set_resizing_parameters(float shrink, float grow) {
- assert(shrink >= 0.0);
- assert(grow <= 1.0);
- if (shrink > grow/2.0f)
- shrink = grow / 2.0f; // otherwise we thrash hashtable size
- shrink_resize_percent = shrink;
- enlarge_resize_percent = grow;
- reset_thresholds();
- }
-
- // CONSTRUCTORS -- as required by the specs, we take a size,
- // but also let you specify a hashfunction, key comparator,
- // and key extractor. We also define a copy constructor and =.
- // DESTRUCTOR -- needs to free the table
- explicit dense_hashtable(size_type expected_max_items_in_table = 0,
- const HashFcn& hf = HashFcn(),
- const EqualKey& eql = EqualKey(),
- const ExtractKey& ext = ExtractKey(),
- const SetKey& set = SetKey())
- : hash(hf), equals(eql), get_key(ext), set_key(set), num_deleted(0),
- use_deleted(false), use_empty(false),
- delkey(), emptyval(), enlarge_resize_percent(HT_OCCUPANCY_FLT),
- shrink_resize_percent(HT_EMPTY_FLT), table(NULL),
- num_buckets(expected_max_items_in_table == 0
- ? HT_DEFAULT_STARTING_BUCKETS
- : min_size(expected_max_items_in_table, 0)),
- num_elements(0) {
- // table is NULL until emptyval is set. However, we set num_buckets
- // here so we know how much space to allocate once emptyval is set
- reset_thresholds();
- }
-
- // As a convenience for resize(), we allow an optional second argument
- // which lets you make this new hashtable a different size than ht
- dense_hashtable(const dense_hashtable& ht,
- size_type min_buckets_wanted = HT_DEFAULT_STARTING_BUCKETS)
- : hash(ht.hash), equals(ht.equals),
- get_key(ht.get_key), set_key(ht.set_key), num_deleted(0),
- use_deleted(ht.use_deleted), use_empty(ht.use_empty),
- delkey(ht.delkey), emptyval(ht.emptyval),
- enlarge_resize_percent(ht.enlarge_resize_percent),
- shrink_resize_percent(ht.shrink_resize_percent), table(NULL),
- num_buckets(0), num_elements(0) {
- reset_thresholds();
- copy_from(ht, min_buckets_wanted); // copy_from() ignores deleted entries
- }
-
- dense_hashtable& operator= (const dense_hashtable& ht) {
- if (&ht == this) return *this; // don't copy onto ourselves
- clear();
- hash = ht.hash;
- equals = ht.equals;
- get_key = ht.get_key;
- set_key = ht.set_key;
- use_deleted = ht.use_deleted;
- use_empty = ht.use_empty;
- delkey = ht.delkey;
- set_value(&emptyval, ht.emptyval);
- enlarge_resize_percent = ht.enlarge_resize_percent;
- shrink_resize_percent = ht.shrink_resize_percent;
- copy_from(ht, HT_MIN_BUCKETS); // sets num_deleted to 0 too
- return *this;
- }
-
- ~dense_hashtable() {
- if (table) {
- destroy_buckets(0, num_buckets);
- free(table);
- }
- }
-
- // Many STL algorithms use swap instead of copy constructors
- void swap(dense_hashtable& ht) {
- STL_NAMESPACE::swap(hash, ht.hash);
- STL_NAMESPACE::swap(equals, ht.equals);
- STL_NAMESPACE::swap(get_key, ht.get_key);
- STL_NAMESPACE::swap(set_key, ht.set_key);
- STL_NAMESPACE::swap(num_deleted, ht.num_deleted);
- STL_NAMESPACE::swap(use_deleted, ht.use_deleted);
- STL_NAMESPACE::swap(use_empty, ht.use_empty);
- STL_NAMESPACE::swap(enlarge_resize_percent, ht.enlarge_resize_percent);
- STL_NAMESPACE::swap(shrink_resize_percent, ht.shrink_resize_percent);
- STL_NAMESPACE::swap(delkey, ht.delkey);
- { value_type tmp; // for annoying reasons, swap() doesn't work
- set_value(&tmp, emptyval);
- set_value(&emptyval, ht.emptyval);
- set_value(&ht.emptyval, tmp);
- }
- STL_NAMESPACE::swap(table, ht.table);
- STL_NAMESPACE::swap(num_buckets, ht.num_buckets);
- STL_NAMESPACE::swap(num_elements, ht.num_elements);
- reset_thresholds();
- ht.reset_thresholds();
- }
-
- // It's always nice to be able to clear a table without deallocating it
- void clear() {
- if (table)
- destroy_buckets(0, num_buckets);
- num_buckets = min_size(0,0); // our new size
- reset_thresholds();
- table = (value_type *) realloc(table, num_buckets * sizeof(*table));
- assert(table);
- fill_range_with_empty(table, table + num_buckets);
- num_elements = 0;
- num_deleted = 0;
- }
-
- // Clear the table without resizing it.
- // Mimicks the stl_hashtable's behaviour when clear()-ing in that it
- // does not modify the bucket count
- void clear_no_resize() {
- if (table) {
- set_empty(0, num_buckets);
- }
- // don't consider to shrink before another erase()
- reset_thresholds();
- num_elements = 0;
- num_deleted = 0;
- }
-
- // LOOKUP ROUTINES
- private:
- // Returns a pair of positions: 1st where the object is, 2nd where
- // it would go if you wanted to insert it. 1st is ILLEGAL_BUCKET
- // if object is not found; 2nd is ILLEGAL_BUCKET if it is.
- // Note: because of deletions where-to-insert is not trivial: it's the
- // first deleted bucket we see, as long as we don't find the key later
- pair<size_type, size_type> find_position(const key_type &key) const {
- size_type num_probes = 0; // how many times we've probed
- const size_type bucket_count_minus_one = bucket_count() - 1;
- size_type bucknum = hash(key) & bucket_count_minus_one;
- size_type insert_pos = ILLEGAL_BUCKET; // where we would insert
- while ( 1 ) { // probe until something happens
- if ( test_empty(bucknum) ) { // bucket is empty
- if ( insert_pos == ILLEGAL_BUCKET ) // found no prior place to insert
- return pair<size_type,size_type>(ILLEGAL_BUCKET, bucknum);
- else
- return pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos);
-
- } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert
- if ( insert_pos == ILLEGAL_BUCKET )
- insert_pos = bucknum;
-
- } else if ( equals(key, get_key(table[bucknum])) ) {
- return pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET);
- }
- ++num_probes; // we're doing another probe
- bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one;
- assert(num_probes < bucket_count()); // don't probe too many times!
- }
- }
-
- public:
- iterator find(const key_type& key) {
- if ( size() == 0 ) return end();
- pair<size_type, size_type> pos = find_position(key);
- if ( pos.first == ILLEGAL_BUCKET ) // alas, not there
- return end();
- else
- return iterator(this, table + pos.first, table + num_buckets, false);
- }
-
- const_iterator find(const key_type& key) const {
- if ( size() == 0 ) return end();
- pair<size_type, size_type> pos = find_position(key);
- if ( pos.first == ILLEGAL_BUCKET ) // alas, not there
- return end();
- else
- return const_iterator(this, table + pos.first, table+num_buckets, false);
- }
-
- // This is a tr1 method: the bucket a given key is in, or what bucket
- // it would be put in, if it were to be inserted. Shrug.
- size_type bucket(const key_type& key) const {
- pair<size_type, size_type> pos = find_position(key);
- return pos.first == ILLEGAL_BUCKET ? pos.second : pos.first;
- }
-
- // Counts how many elements have key key. For maps, it's either 0 or 1.
- size_type count(const key_type &key) const {
- pair<size_type, size_type> pos = find_position(key);
- return pos.first == ILLEGAL_BUCKET ? 0 : 1;
- }
-
- // Likewise, equal_range doesn't really make sense for us. Oh well.
- pair<iterator,iterator> equal_range(const key_type& key) {
- iterator pos = find(key); // either an iterator or end
- if (pos == end()) {
- return pair<iterator,iterator>(pos, pos);
- } else {
- const iterator startpos = pos++;
- return pair<iterator,iterator>(startpos, pos);
- }
- }
- pair<const_iterator,const_iterator> equal_range(const key_type& key) const {
- const_iterator pos = find(key); // either an iterator or end
- if (pos == end()) {
- return pair<const_iterator,const_iterator>(pos, pos);
- } else {
- const const_iterator startpos = pos++;
- return pair<const_iterator,const_iterator>(startpos, pos);
- }
- }
-
-
- // INSERTION ROUTINES
- private:
- // If you know *this is big enough to hold obj, use this routine
- pair<iterator, bool> insert_noresize(const value_type& obj) {
- // First, double-check we're not inserting delkey or emptyval
- assert(!use_empty || !equals(get_key(obj), get_key(emptyval)));
- assert(!use_deleted || !equals(get_key(obj), delkey));
- const pair<size_type,size_type> pos = find_position(get_key(obj));
- if ( pos.first != ILLEGAL_BUCKET) { // object was already there
- return pair<iterator,bool>(iterator(this, table + pos.first,
- table + num_buckets, false),
- false); // false: we didn't insert
- } else { // pos.second says where to put it
- if ( test_deleted(pos.second) ) { // just replace if it's been del.
- const_iterator delpos(this, table + pos.second, // shrug:
- table + num_buckets, false);// shouldn't need const
- clear_deleted(delpos);
- assert( num_deleted > 0);
- --num_deleted; // used to be, now it isn't
- } else {
- ++num_elements; // replacing an empty bucket
- }
- set_value(&table[pos.second], obj);
- return pair<iterator,bool>(iterator(this, table + pos.second,
- table + num_buckets, false),
- true); // true: we did insert
- }
- }
-
- public:
- // This is the normal insert routine, used by the outside world
- pair<iterator, bool> insert(const value_type& obj) {
- resize_delta(1); // adding an object, grow if need be
- return insert_noresize(obj);
- }
-
- // When inserting a lot at a time, we specialize on the type of iterator
- template <class InputIterator>
- void insert(InputIterator f, InputIterator l) {
- // specializes on iterator type
- insert(f, l, typename STL_NAMESPACE::iterator_traits<InputIterator>::iterator_category());
- }
-
- // Iterator supports operator-, resize before inserting
- template <class ForwardIterator>
- void insert(ForwardIterator f, ForwardIterator l,
- STL_NAMESPACE::forward_iterator_tag) {
- size_type n = STL_NAMESPACE::distance(f, l); // TODO(csilvers): standard?
- resize_delta(n);
- for ( ; n > 0; --n, ++f)
- insert_noresize(*f);
- }
-
- // Arbitrary iterator, can't tell how much to resize
- template <class InputIterator>
- void insert(InputIterator f, InputIterator l,
- STL_NAMESPACE::input_iterator_tag) {
- for ( ; f != l; ++f)
- insert(*f);
- }
-
-
- // DELETION ROUTINES
- size_type erase(const key_type& key) {
- // First, double-check we're not trying to erase delkey or emptyval
- assert(!use_empty || !equals(key, get_key(emptyval)));
- assert(!use_deleted || !equals(key, delkey));
- const_iterator pos = find(key); // shrug: shouldn't need to be const
- if ( pos != end() ) {
- assert(!test_deleted(pos)); // or find() shouldn't have returned it
- set_deleted(pos);
- ++num_deleted;
- consider_shrink = true; // will think about shrink after next insert
- return 1; // because we deleted one thing
- } else {
- return 0; // because we deleted nothing
- }
- }
-
- // This is really evil: really it should be iterator, not const_iterator.
- // But...the only reason keys are const is to allow lookup.
- // Since that's a moot issue for deleted keys, we allow const_iterators
- void erase(const_iterator pos) {
- if ( pos == end() ) return; // sanity check
- if ( set_deleted(pos) ) { // true if object has been newly deleted
- ++num_deleted;
- consider_shrink = true; // will think about shrink after next insert
- }
- }
-
- void erase(const_iterator f, const_iterator l) {
- for ( ; f != l; ++f) {
- if ( set_deleted(f) ) // should always be true
- ++num_deleted;
- }
- consider_shrink = true; // will think about shrink after next insert
- }
-
-
- // COMPARISON
- bool operator==(const dense_hashtable& ht) const {
- if (size() != ht.size()) {
- return false;
- } else if (this == &ht) {
- return true;
- } else {
- // Iterate through the elements in "this" and see if the
- // corresponding element is in ht
- for ( const_iterator it = begin(); it != end(); ++it ) {
- const_iterator it2 = ht.find(get_key(*it));
- if ((it2 == ht.end()) || (*it != *it2)) {
- return false;
- }
- }
- return true;
- }
- }
- bool operator!=(const dense_hashtable& ht) const {
- return !(*this == ht);
- }
-
-
- // I/O
- // We support reading and writing hashtables to disk. Alas, since
- // I don't know how to write a hasher or key_equal, you have to make
- // sure everything but the table is the same. We compact before writing
- //
- // NOTE: These functions are currently TODO. They've not been implemented.
- bool write_metadata(FILE *fp) {
- squash_deleted(); // so we don't have to worry about delkey
- return false; // TODO
- }
-
- bool read_metadata(FILE *fp) {
- num_deleted = 0; // since we got rid before writing
- assert(use_empty); // have to set this before calling us
- if (table) free(table); // we'll make our own
- // TODO: read magic number
- // TODO: read num_buckets
- reset_thresholds();
- table = (value_type *) malloc(num_buckets * sizeof(*table));
- assert(table);
- fill_range_with_empty(table, table + num_buckets);
- // TODO: read num_elements
- for ( size_type i = 0; i < num_elements; ++i ) {
- // TODO: read bucket_num
- // TODO: set with non-empty, non-deleted value
- }
- return false; // TODO
- }
-
- // If your keys and values are simple enough, we can write them to
- // disk for you. "simple enough" means value_type is a POD type
- // that contains no pointers. However, we don't try to normalize
- // endianness
- bool write_nopointer_data(FILE *fp) const {
- for ( const_iterator it = begin(); it != end(); ++it ) {
- // TODO: skip empty/deleted values
- if ( !fwrite(&*it, sizeof(*it), 1, fp) ) return false;
- }
- return false;
- }
-
- // When reading, we have to override the potential const-ness of *it
- bool read_nopointer_data(FILE *fp) {
- for ( iterator it = begin(); it != end(); ++it ) {
- // TODO: skip empty/deleted values
- if ( !fread(reinterpret_cast<void*>(&(*it)), sizeof(*it), 1, fp) )
- return false;
- }
- return false;
- }
-
- private:
- // The actual data
- hasher hash; // required by hashed_associative_container
- key_equal equals;
- ExtractKey get_key;
- SetKey set_key;
- size_type num_deleted; // how many occupied buckets are marked deleted
- bool use_deleted; // false until delkey has been set
- bool use_empty; // you must do this before you start
- // TODO(csilvers): make a pointer, and get rid of use_deleted (benchmark!)
- key_type delkey; // which key marks deleted entries
- value_type emptyval; // which key marks unused entries
- float enlarge_resize_percent; // how full before resize
- float shrink_resize_percent; // how empty before resize
- size_type shrink_threshold; // num_buckets * shrink_resize_percent
- size_type enlarge_threshold; // num_buckets * enlarge_resize_percent
- value_type *table;
- size_type num_buckets;
- size_type num_elements;
- bool consider_shrink; // true if we should try to shrink before next insert
-
- void reset_thresholds() {
- enlarge_threshold = static_cast<size_type>(num_buckets
- * enlarge_resize_percent);
- shrink_threshold = static_cast<size_type>(num_buckets
- * shrink_resize_percent);
- consider_shrink = false; // whatever caused us to reset already considered
- }
-};
-
-// We need a global swap as well
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-inline void swap(dense_hashtable<V,K,HF,ExK,SetK,EqK,A> &x,
- dense_hashtable<V,K,HF,ExK,SetK,EqK,A> &y) {
- x.swap(y);
-}
-
-#undef JUMP_
-
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-const typename dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::size_type
-dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::ILLEGAL_BUCKET;
-
-// How full we let the table get before we resize. Knuth says .8 is
-// good -- higher causes us to probe too much, though saves memory.
-// However, we go with .5, getting better performance at the cost of
-// more space (a trade-off densehashtable explicitly chooses to make).
-// Feel free to play around with different values, though.
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-const float dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::HT_OCCUPANCY_FLT = 0.5f;
-
-// How empty we let the table get before we resize lower.
-// It should be less than OCCUPANCY_FLT / 2 or we thrash resizing
-template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
-const float dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::HT_EMPTY_FLT
- = 0.4f * dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::HT_OCCUPANCY_FLT;
-
-_END_GOOGLE_NAMESPACE_
-
-#endif /* _DENSEHASHTABLE_H_ */
diff --git a/sources/shiboken2/ext/sparsehash/google/sparsehash/sparseconfig.h b/sources/shiboken2/ext/sparsehash/google/sparsehash/sparseconfig.h
deleted file mode 100644
index 28c85d1f4..000000000
--- a/sources/shiboken2/ext/sparsehash/google/sparsehash/sparseconfig.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * NOTE: This file is for internal use only.
- * Do not use these #defines in your own program!
- */
-
-/* Namespace for Google classes */
-#define GOOGLE_NAMESPACE ::google
-
-#ifdef _MSC_VER
- /* the location of the header defining hash functions */
- #define HASH_FUN_H <unordered_map>
- /* the namespace of the hash<> function */
- #define HASH_NAMESPACE stdext
- /* The system-provided hash function including the namespace. */
- #define SPARSEHASH_HASH HASH_NAMESPACE::hash_compare
-/* libc++ does not implement the tr1 namespce, instead the
- * equivalient functionality is placed in namespace std,
- * so use when it targeting such systems (OS X 10.7 onwards) */
-#elif defined(_LIBCPP_VERSION)
- /* the location of the header defining hash functions */
- #define HASH_FUN_H <functional>
- /* the namespace of the hash<> function */
- #define HASH_NAMESPACE std
- /* The system-provided hash function including the namespace. */
- #define SPARSEHASH_HASH HASH_NAMESPACE::hash
-#else
- /* the location of the header defining hash functions */
- #define HASH_FUN_H <tr1/functional>
- /* the namespace of the hash<> function */
- #define HASH_NAMESPACE std::tr1
- /* The system-provided hash function including the namespace. */
- #define SPARSEHASH_HASH HASH_NAMESPACE::hash
-#endif
-
-/* Define to 1 if the system has the type `long long'. */
-#define HAVE_LONG_LONG 1
-
-/* the namespace where STL code like vector<> is defined */
-#define STL_NAMESPACE std
-
-/* Stops putting the code inside the Google namespace */
-#define _END_GOOGLE_NAMESPACE_ }
-
-/* Puts following code inside the Google namespace */
-#define _START_GOOGLE_NAMESPACE_ namespace google {
diff --git a/sources/shiboken2/ext/sparsehash/google/type_traits.h b/sources/shiboken2/ext/sparsehash/google/type_traits.h
deleted file mode 100644
index d9d4faf83..000000000
--- a/sources/shiboken2/ext/sparsehash/google/type_traits.h
+++ /dev/null
@@ -1,250 +0,0 @@
-// Copyright (c) 2006, Google Inc.
-// All rights reserved.
-//
-// 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 Google Inc. 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.
-
-// ----
-// Author: Matt Austern
-//
-// Define a small subset of tr1 type traits. The traits we define are:
-// is_integral
-// is_floating_point
-// is_pointer
-// is_reference
-// is_pod
-// has_trivial_constructor
-// has_trivial_copy
-// has_trivial_assign
-// has_trivial_destructor
-// remove_const
-// remove_volatile
-// remove_cv
-// remove_reference
-// remove_pointer
-// is_convertible
-// We can add more type traits as required.
-
-#ifndef BASE_TYPE_TRAITS_H_
-#define BASE_TYPE_TRAITS_H_
-
-#include "google/sparsehash/sparseconfig.h"
-#include <utility> // For pair
-
-_START_GOOGLE_NAMESPACE_
-
-// integral_constant, defined in tr1, is a wrapper for an integer
-// value. We don't really need this generality; we could get away
-// with hardcoding the integer type to bool. We use the fully
-// general integer_constant for compatibility with tr1.
-
-template<class T, T v>
-struct integral_constant {
- static const T value = v;
- typedef T value_type;
- typedef integral_constant<T, v> type;
-};
-
-template <class T, T v> const T integral_constant<T, v>::value;
-
-// Abbreviations: true_type and false_type are structs that represent
-// boolean true and false values.
-typedef integral_constant<bool, true> true_type;
-typedef integral_constant<bool, false> false_type;
-
-// Types small_ and big_ are guaranteed such that sizeof(small_) <
-// sizeof(big_)
-typedef char small_;
-
-struct big_ {
- char dummy[2];
-};
-
-// is_integral is false except for the built-in integer types.
-template <class T> struct is_integral : false_type { };
-template<> struct is_integral<bool> : true_type { };
-template<> struct is_integral<char> : true_type { };
-template<> struct is_integral<unsigned char> : true_type { };
-template<> struct is_integral<signed char> : true_type { };
-#if defined(_MSC_VER)
-// wchar_t is not by default a distinct type from unsigned short in
-// Microsoft C.
-// See http://msdn2.microsoft.com/en-us/library/dh8che7s(VS.80).aspx
-template<> struct is_integral<__wchar_t> : true_type { };
-#else
-template<> struct is_integral<wchar_t> : true_type { };
-#endif
-template<> struct is_integral<short> : true_type { };
-template<> struct is_integral<unsigned short> : true_type { };
-template<> struct is_integral<int> : true_type { };
-template<> struct is_integral<unsigned int> : true_type { };
-template<> struct is_integral<long> : true_type { };
-template<> struct is_integral<unsigned long> : true_type { };
-#ifdef HAVE_LONG_LONG
-template<> struct is_integral<long long> : true_type { };
-template<> struct is_integral<unsigned long long> : true_type { };
-#endif
-
-
-// is_floating_point is false except for the built-in floating-point types.
-template <class T> struct is_floating_point : false_type { };
-template<> struct is_floating_point<float> : true_type { };
-template<> struct is_floating_point<double> : true_type { };
-template<> struct is_floating_point<long double> : true_type { };
-
-
-// is_pointer is false except for pointer types.
-template <class T> struct is_pointer : false_type { };
-template <class T> struct is_pointer<T*> : true_type { };
-
-
-// is_reference is false except for reference types.
-template<typename T> struct is_reference : false_type {};
-template<typename T> struct is_reference<T&> : true_type {};
-
-
-// We can't get is_pod right without compiler help, so fail conservatively.
-// We will assume it's false except for arithmetic types and pointers,
-// and const versions thereof. Note that std::pair is not a POD.
-template <class T> struct is_pod
- : integral_constant<bool, (is_integral<T>::value ||
- is_floating_point<T>::value ||
- is_pointer<T>::value)> { };
-template <class T> struct is_pod<const T> : is_pod<T> { };
-
-
-// We can't get has_trivial_constructor right without compiler help, so
-// fail conservatively. We will assume it's false except for: (1) types
-// for which is_pod is true. (2) std::pair of types with trivial
-// constructors. (3) array of a type with a trivial constructor.
-// (4) const versions thereof.
-template <class T> struct has_trivial_constructor : is_pod<T> { };
-template <class T, class U> struct has_trivial_constructor<std::pair<T, U> >
- : integral_constant<bool,
- (has_trivial_constructor<T>::value &&
- has_trivial_constructor<U>::value)> { };
-template <class A, int N> struct has_trivial_constructor<A[N]>
- : has_trivial_constructor<A> { };
-template <class T> struct has_trivial_constructor<const T>
- : has_trivial_constructor<T> { };
-
-// We can't get has_trivial_copy right without compiler help, so fail
-// conservatively. We will assume it's false except for: (1) types
-// for which is_pod is true. (2) std::pair of types with trivial copy
-// constructors. (3) array of a type with a trivial copy constructor.
-// (4) const versions thereof.
-template <class T> struct has_trivial_copy : is_pod<T> { };
-template <class T, class U> struct has_trivial_copy<std::pair<T, U> >
- : integral_constant<bool,
- (has_trivial_copy<T>::value &&
- has_trivial_copy<U>::value)> { };
-template <class A, int N> struct has_trivial_copy<A[N]>
- : has_trivial_copy<A> { };
-template <class T> struct has_trivial_copy<const T> : has_trivial_copy<T> { };
-
-// We can't get has_trivial_assign right without compiler help, so fail
-// conservatively. We will assume it's false except for: (1) types
-// for which is_pod is true. (2) std::pair of types with trivial copy
-// constructors. (3) array of a type with a trivial assign constructor.
-template <class T> struct has_trivial_assign : is_pod<T> { };
-template <class T, class U> struct has_trivial_assign<std::pair<T, U> >
- : integral_constant<bool,
- (has_trivial_assign<T>::value &&
- has_trivial_assign<U>::value)> { };
-template <class A, int N> struct has_trivial_assign<A[N]>
- : has_trivial_assign<A> { };
-
-// We can't get has_trivial_destructor right without compiler help, so
-// fail conservatively. We will assume it's false except for: (1) types
-// for which is_pod is true. (2) std::pair of types with trivial
-// destructors. (3) array of a type with a trivial destructor.
-// (4) const versions thereof.
-template <class T> struct has_trivial_destructor : is_pod<T> { };
-template <class T, class U> struct has_trivial_destructor<std::pair<T, U> >
- : integral_constant<bool,
- (has_trivial_destructor<T>::value &&
- has_trivial_destructor<U>::value)> { };
-template <class A, int N> struct has_trivial_destructor<A[N]>
- : has_trivial_destructor<A> { };
-template <class T> struct has_trivial_destructor<const T>
- : has_trivial_destructor<T> { };
-
-// Specified by TR1 [4.7.1]
-template<typename T> struct remove_const { typedef T type; };
-template<typename T> struct remove_const<T const> { typedef T type; };
-template<typename T> struct remove_volatile { typedef T type; };
-template<typename T> struct remove_volatile<T volatile> { typedef T type; };
-template<typename T> struct remove_cv {
- typedef typename remove_const<typename remove_volatile<T>::type>::type type;
-};
-
-
-// Specified by TR1 [4.7.2]
-template<typename T> struct remove_reference { typedef T type; };
-template<typename T> struct remove_reference<T&> { typedef T type; };
-
-// Specified by TR1 [4.7.4] Pointer modifications.
-template<typename T> struct remove_pointer { typedef T type; };
-template<typename T> struct remove_pointer<T*> { typedef T type; };
-template<typename T> struct remove_pointer<T* const> { typedef T type; };
-template<typename T> struct remove_pointer<T* volatile> { typedef T type; };
-template<typename T> struct remove_pointer<T* const volatile> {
- typedef T type; };
-
-// Specified by TR1 [4.6] Relationships between types
-#ifndef _MSC_VER
-namespace internal {
-
-// This class is an implementation detail for is_convertible, and you
-// don't need to know how it works to use is_convertible. For those
-// who care: we declare two different functions, one whose argument is
-// of type To and one with a variadic argument list. We give them
-// return types of different size, so we can use sizeof to trick the
-// compiler into telling us which function it would have chosen if we
-// had called it with an argument of type From. See Alexandrescu's
-// _Modern C++ Design_ for more details on this sort of trick.
-
-template <typename From, typename To>
-struct ConvertHelper {
- static small_ Test(To);
- static big_ Test(...);
- static From Create();
-};
-} // namespace internal
-
-// Inherits from true_type if From is convertible to To, false_type otherwise.
-template <typename From, typename To>
-struct is_convertible
- : integral_constant<bool,
- sizeof(internal::ConvertHelper<From, To>::Test(
- internal::ConvertHelper<From, To>::Create()))
- == sizeof(small_)> {
-};
-#endif
-
-_END_GOOGLE_NAMESPACE_
-
-#endif // BASE_TYPE_TRAITS_H_
diff --git a/sources/shiboken2/generator/generator.cpp b/sources/shiboken2/generator/generator.cpp
index d7f98a90f..71647a1c5 100644
--- a/sources/shiboken2/generator/generator.cpp
+++ b/sources/shiboken2/generator/generator.cpp
@@ -36,6 +36,7 @@
#include <QtCore/QDir>
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
+#include <QtCore/QRegularExpression>
#include <QDebug>
#include <typedatabase.h>
@@ -48,18 +49,14 @@ struct Generator::GeneratorPrivate {
int numGenerated;
QStringList instantiatedContainersNames;
QStringList instantiatedSmartPointerNames;
- QList<const AbstractMetaType *> instantiatedContainers;
- QList<const AbstractMetaType *> instantiatedSmartPointers;
+ QVector<const AbstractMetaType *> instantiatedContainers;
+ QVector<const AbstractMetaType *> instantiatedSmartPointers;
};
Generator::Generator() : m_d(new GeneratorPrivate)
{
m_d->numGenerated = 0;
- m_d->instantiatedContainers = QList<const AbstractMetaType *>();
- m_d->instantiatedSmartPointers = QList<const AbstractMetaType *>();
- m_d->instantiatedContainersNames = QStringList();
- m_d->instantiatedSmartPointerNames = QStringList();
}
Generator::~Generator()
@@ -73,7 +70,7 @@ bool Generator::setup(const ApiExtractor& extractor, const QMap< QString, QStrin
TypeEntryHash allEntries = TypeDatabase::instance()->allEntries();
TypeEntry* entryFound = 0;
for (TypeEntryHash::const_iterator it = allEntries.cbegin(), end = allEntries.cend(); it != end; ++it) {
- foreach (TypeEntry *entry, it.value()) {
+ for (TypeEntry *entry : it.value()) {
if (entry->type() == TypeEntry::TypeSystemType && entry->generateCode()) {
entryFound = entry;
break;
@@ -120,7 +117,8 @@ void Generator::addInstantiatedContainersAndSmartPointers(const AbstractMetaType
{
if (!type)
return;
- foreach (const AbstractMetaType* t, type->instantiations())
+ const AbstractMetaTypeList &instantiations = type->instantiations();
+ for (const AbstractMetaType* t : instantiations)
addInstantiatedContainersAndSmartPointers(t, context);
if (!type->typeEntry()->isContainer() && !type->typeEntry()->isSmartPointer())
return;
@@ -129,7 +127,7 @@ void Generator::addInstantiatedContainersAndSmartPointers(const AbstractMetaType
QString piece = isContainer ? QStringLiteral("container") : QStringLiteral("smart pointer");
QString warning =
QString::fromLatin1("Skipping instantiation of %1 '%2' because it has template"
- " arguments.").arg(piece).arg(type->originalTypeDescription());
+ " arguments.").arg(piece, type->originalTypeDescription());
if (!context.isEmpty())
warning.append(QStringLiteral(" Calling context: %1").arg(context));
@@ -156,7 +154,8 @@ void Generator::addInstantiatedContainersAndSmartPointers(const AbstractMetaType
void Generator::collectInstantiatedContainersAndSmartPointers(const AbstractMetaFunction *func)
{
addInstantiatedContainersAndSmartPointers(func->type(), func->signature());
- foreach (const AbstractMetaArgument* arg, func->arguments())
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments)
addInstantiatedContainersAndSmartPointers(arg->type(), func->signature());
}
@@ -164,35 +163,40 @@ void Generator::collectInstantiatedContainersAndSmartPointers(const AbstractMeta
{
if (!metaClass->typeEntry()->generateCode())
return;
- foreach (const AbstractMetaFunction* func, metaClass->functions())
+ const AbstractMetaFunctionList &funcs = metaClass->functions();
+ for (const AbstractMetaFunction *func : funcs)
collectInstantiatedContainersAndSmartPointers(func);
- foreach (const AbstractMetaField* field, metaClass->fields())
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (const AbstractMetaField *field : fields)
addInstantiatedContainersAndSmartPointers(field->type(), field->name());
- foreach (AbstractMetaClass* innerClass, metaClass->innerClasses())
+ const AbstractMetaClassList &innerClasses = metaClass->innerClasses();
+ for (AbstractMetaClass *innerClass : innerClasses)
collectInstantiatedContainersAndSmartPointers(innerClass);
}
void Generator::collectInstantiatedContainersAndSmartPointers()
{
- foreach (const AbstractMetaFunction* func, globalFunctions())
+ const AbstractMetaFunctionList &funcs = globalFunctions();
+ for (const AbstractMetaFunction *func : funcs)
collectInstantiatedContainersAndSmartPointers(func);
- foreach (const AbstractMetaClass* metaClass, classes())
+ const AbstractMetaClassList &classList = classes();
+ for (const AbstractMetaClass *metaClass : classList)
collectInstantiatedContainersAndSmartPointers(metaClass);
}
-QList<const AbstractMetaType*> Generator::instantiatedContainers() const
+QVector<const AbstractMetaType *> Generator::instantiatedContainers() const
{
return m_d->instantiatedContainers;
}
-QList<const AbstractMetaType*> Generator::instantiatedSmartPointers() const
+QVector<const AbstractMetaType*> Generator::instantiatedSmartPointers() const
{
return m_d->instantiatedSmartPointers;
}
-QMap< QString, QString > Generator::options() const
+Generator::OptionDescriptions Generator::options() const
{
- return QMap<QString, QString>();
+ return OptionDescriptions();
}
AbstractMetaClassList Generator::classes() const
@@ -215,12 +219,12 @@ AbstractMetaEnumList Generator::globalEnums() const
return m_d->apiextractor->globalEnums();
}
-QList<const PrimitiveTypeEntry*> Generator::primitiveTypes() const
+PrimitiveTypeEntryList Generator::primitiveTypes() const
{
return m_d->apiextractor->primitiveTypes();
}
-QList<const ContainerTypeEntry*> Generator::containerTypes() const
+ContainerTypeEntryList Generator::containerTypes() const
{
return m_d->apiextractor->containerTypes();
}
@@ -351,13 +355,14 @@ QString Generator::getFileNameBaseForSmartPointer(const AbstractMetaType *smartP
bool Generator::generate()
{
- foreach (AbstractMetaClass *cls, m_d->apiextractor->classes()) {
+ const AbstractMetaClassList &classList = m_d->apiextractor->classes();
+ for (AbstractMetaClass *cls : classList) {
GeneratorContext context(cls);
if (!generateFileForContext(context))
return false;
}
- foreach (const AbstractMetaType *type, instantiatedSmartPointers()) {
+ for (const AbstractMetaType *type : qAsConst(m_d->instantiatedSmartPointers)) {
AbstractMetaClass *smartPointerClass =
AbstractMetaClass::findClass(m_d->apiextractor->smartPointers(), type->name());
GeneratorContext context(smartPointerClass, type, true);
@@ -394,7 +399,8 @@ void Generator::replaceTemplateVariables(QString &code, const AbstractMetaFuncti
if (cpp_class)
code.replace(QLatin1String("%TYPE"), cpp_class->name());
- foreach (AbstractMetaArgument *arg, func->arguments())
+ const AbstractMetaArgumentList &argument = func->arguments();
+ for (AbstractMetaArgument *arg : argument)
code.replace(QLatin1Char('%') + QString::number(arg->argumentIndex() + 1), arg->name());
//template values
@@ -419,10 +425,11 @@ void Generator::replaceTemplateVariables(QString &code, const AbstractMetaFuncti
QTextStream& formatCode(QTextStream &s, const QString& code, Indentor &indentor)
{
// detect number of spaces before the first character
- QStringList lst(code.split(QLatin1Char('\n')));
- QRegExp nonSpaceRegex(QLatin1String("[^\\s]"));
+ const QStringList lst(code.split(QLatin1Char('\n')));
+ static const QRegularExpression nonSpaceRegex(QStringLiteral("[^\\s]"));
+ Q_ASSERT(nonSpaceRegex.isValid());
int spacesToRemove = 0;
- foreach(QString line, lst) {
+ for (const QString &line : lst) {
if (!line.trimmed().isEmpty()) {
spacesToRemove = line.indexOf(nonSpaceRegex);
if (spacesToRemove == -1)
@@ -431,11 +438,12 @@ QTextStream& formatCode(QTextStream &s, const QString& code, Indentor &indentor)
}
}
- static QRegExp emptyLine(QLatin1String("\\s*[\\r]?[\\n]?\\s*"));
+ static const QRegularExpression emptyLine(QStringLiteral("^\\s*[\\r]?[\\n]?\\s*$"));
+ Q_ASSERT(emptyLine.isValid());
- foreach(QString line, lst) {
- if (!line.isEmpty() && !emptyLine.exactMatch(line)) {
- while (line.end()->isSpace())
+ for (QString line : lst) {
+ if (!line.isEmpty() && !emptyLine.match(line).hasMatch()) {
+ while (line.constEnd()->isSpace())
line.chop(1);
int limit = 0;
for(int i = 0; i < spacesToRemove; ++i) {
@@ -507,9 +515,12 @@ bool Generator::isVoidPointer(const AbstractMetaType* type)
QString Generator::getFullTypeName(const TypeEntry* type) const
{
- return type->isCppPrimitive()
- ? type->qualifiedCppName()
- : (QLatin1String("::") + type->qualifiedCppName());
+ QString result = type->qualifiedCppName();
+ if (type->isArray())
+ type = static_cast<const ArrayTypeEntry *>(type)->nestedTypeEntry();
+ if (!type->isCppPrimitive())
+ result.prepend(QLatin1String("::"));
+ return result;
}
QString Generator::getFullTypeName(const AbstractMetaType* type) const
@@ -639,9 +650,9 @@ QString Generator::minimalConstructor(const AbstractMetaClass* metaClass) const
if (cType->hasDefaultConstructor())
return cType->defaultConstructor();
- AbstractMetaFunctionList constructors = metaClass->queryFunctions(AbstractMetaClass::Constructors);
+ const AbstractMetaFunctionList &constructors = metaClass->queryFunctions(AbstractMetaClass::Constructors);
int maxArgs = 0;
- foreach (const AbstractMetaFunction* ctor, constructors) {
+ for (const AbstractMetaFunction *ctor : constructors) {
if (ctor->isUserAdded() || ctor->isPrivate() || ctor->functionType() != AbstractMetaFunction::ConstructorFunction)
continue;
@@ -656,28 +667,29 @@ QString Generator::minimalConstructor(const AbstractMetaClass* metaClass) const
QString qualifiedCppName = metaClass->typeEntry()->qualifiedCppName();
QStringList templateTypes;
- foreach (TypeEntry* templateType, metaClass->templateArguments())
+ const QVector<TypeEntry *> &templateArguments = metaClass->templateArguments();
+ for (TypeEntry *templateType : templateArguments)
templateTypes << templateType->qualifiedCppName();
// Empty constructor.
if (maxArgs == 0)
return QLatin1String("::") + qualifiedCppName + QLatin1String("()");
- QList<const AbstractMetaFunction*> candidates;
+ QVector<const AbstractMetaFunction *> candidates;
// Constructors with C++ primitive types, enums or pointers only.
// Start with the ones with fewer arguments.
for (int i = 1; i <= maxArgs; ++i) {
- foreach (const AbstractMetaFunction* ctor, constructors) {
+ for (const AbstractMetaFunction *ctor : constructors) {
if (ctor->isUserAdded() || ctor->isPrivate() || ctor->functionType() != AbstractMetaFunction::ConstructorFunction)
continue;
- AbstractMetaArgumentList arguments = ctor->arguments();
+ const AbstractMetaArgumentList &arguments = ctor->arguments();
if (arguments.size() != i)
continue;
QStringList args;
- foreach (const AbstractMetaArgument* arg, arguments) {
+ for (const AbstractMetaArgument *arg : arguments) {
const TypeEntry* type = arg->type()->typeEntry();
if (type == metaClass->typeEntry()) {
args.clear();
@@ -715,9 +727,10 @@ QString Generator::minimalConstructor(const AbstractMetaClass* metaClass) const
// Constructors with C++ primitive types, enums, pointers, value types,
// and user defined primitive types.
// Builds the minimal constructor recursively.
- foreach (const AbstractMetaFunction* ctor, candidates) {
+ for (const AbstractMetaFunction *ctor : qAsConst(candidates)) {
QStringList args;
- foreach (const AbstractMetaArgument* arg, ctor->arguments()) {
+ const AbstractMetaArgumentList &arguments = ctor->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (arg->type()->typeEntry() == metaClass->typeEntry()) {
args.clear();
break;
diff --git a/sources/shiboken2/generator/generator.h b/sources/shiboken2/generator/generator.h
index f734ff9d7..f0b2a5e41 100644
--- a/sources/shiboken2/generator/generator.h
+++ b/sources/shiboken2/generator/generator.h
@@ -30,6 +30,7 @@
#define GENERATOR_H
#include <abstractmetalang_typedefs.h>
+#include <typedatabase_typedefs.h>
#include <dependency.h>
#include <QtCore/QObject>
#include <QtCore/QSharedPointer>
@@ -136,6 +137,9 @@ private:
class Generator
{
public:
+ typedef QPair<QString, QString> OptionDescription;
+ typedef QVector<OptionDescription> OptionDescriptions;
+
/// Optiosn used around the generator code
enum Option {
NoOption = 0x00000000,
@@ -180,7 +184,7 @@ public:
bool setup(const ApiExtractor& extractor, const QMap<QString, QString> args);
- virtual QMap<QString, QString> options() const;
+ virtual OptionDescriptions options() const;
/// Returns the classes used to generate the binding code.
AbstractMetaClassList classes() const;
@@ -198,10 +202,10 @@ public:
AbstractMetaEnumList globalEnums() const;
/// Returns all primitive types found by APIExtractor
- QList<const PrimitiveTypeEntry*> primitiveTypes() const;
+ PrimitiveTypeEntryList primitiveTypes() const;
/// Returns all container types found by APIExtractor
- QList<const ContainerTypeEntry*> containerTypes() const;
+ ContainerTypeEntryList containerTypes() const;
/// Returns an AbstractMetaEnum for a given EnumTypeEntry, or NULL if not found.
const AbstractMetaEnum* findAbstractMetaEnum(const EnumTypeEntry* typeEntry) const;
@@ -388,8 +392,8 @@ protected:
*/
virtual QString subDirectoryForPackage(QString packageName = QString()) const;
- QList<const AbstractMetaType*> instantiatedContainers() const;
- QList<const AbstractMetaType*> instantiatedSmartPointers() const;
+ QVector<const AbstractMetaType*> instantiatedContainers() const;
+ QVector<const AbstractMetaType*> instantiatedSmartPointers() const;
static QString getSimplifiedContainerTypeName(const AbstractMetaType *type);
void addInstantiatedContainersAndSmartPointers(const AbstractMetaType *type,
diff --git a/sources/shiboken2/generator/main.cpp b/sources/shiboken2/generator/main.cpp
index 874540e54..774775fb0 100644
--- a/sources/shiboken2/generator/main.cpp
+++ b/sources/shiboken2/generator/main.cpp
@@ -46,6 +46,12 @@
#define PATH_SPLITTER ":"
#endif
+static inline QString includePathOption() { return QStringLiteral("include-paths"); }
+static inline QString frameworkIncludePathOption() { return QStringLiteral("framework-include-paths"); }
+static inline QString typesystemPathOption() { return QStringLiteral("typesystem-paths"); }
+static inline QString helpOption() { return QStringLiteral("help"); }
+static const char helpHint[] = "Note: use --help or -h for more information.\n";
+
namespace {
class ArgsHandler
@@ -134,14 +140,17 @@ QString ArgsHandler::errorMessage() const
}
}
-static void printOptions(QTextStream& s, const QMap<QString, QString>& options)
+typedef Generator::OptionDescriptions OptionDescriptions;
+
+static void printOptions(QTextStream& s, const OptionDescriptions& options)
{
- QMap<QString, QString>::const_iterator it = options.constBegin();
s.setFieldAlignment(QTextStream::AlignLeft);
- for (; it != options.constEnd(); ++it) {
- s << " --";
+ for (const auto &od : options) {
+ s << ' ';
+ if (!od.first.startsWith(QLatin1Char('-')))
+ s << "--";
s.setFieldWidth(38);
- s << it.key() << it.value();
+ s << od.first << od.second;
s.setFieldWidth(0);
s << endl;
}
@@ -156,6 +165,7 @@ static bool processProjectFile(QFile& projectFile, QMap<QString, QString>& args)
return false;
QStringList includePaths;
+ QStringList frameworkIncludePaths;
QStringList typesystemPaths;
QStringList apiVersions;
@@ -176,6 +186,8 @@ static bool processProjectFile(QFile& projectFile, QMap<QString, QString>& args)
if (key == "include-path")
includePaths << QDir::toNativeSeparators(value);
+ else if (key == "framework-include-path")
+ frameworkIncludePaths << QDir::toNativeSeparators(value);
else if (key == "typesystem-path")
typesystemPaths << QDir::toNativeSeparators(value);
else if (key == "api-version")
@@ -189,10 +201,14 @@ static bool processProjectFile(QFile& projectFile, QMap<QString, QString>& args)
}
if (!includePaths.isEmpty())
- args.insert(QLatin1String("include-paths"), includePaths.join(QLatin1String(PATH_SPLITTER)));
+ args.insert(includePathOption(), includePaths.join(QLatin1String(PATH_SPLITTER)));
+
+ if (!frameworkIncludePaths.isEmpty())
+ args.insert(frameworkIncludePathOption(),
+ frameworkIncludePaths.join(QLatin1String(PATH_SPLITTER)));
if (!typesystemPaths.isEmpty())
- args.insert(QLatin1String("typesystem-paths"), typesystemPaths.join(QLatin1String(PATH_SPLITTER)));
+ args.insert(typesystemPathOption(), typesystemPaths.join(QLatin1String(PATH_SPLITTER)));
if (!apiVersions.isEmpty())
args.insert(QLatin1String("api-version"), apiVersions.join(QLatin1Char('|')));
return true;
@@ -202,11 +218,11 @@ static QMap<QString, QString> getInitializedArguments()
{
QMap<QString, QString> args;
QStringList arguments = QCoreApplication::arguments();
- QString appName = arguments.first();
+ QString appName = arguments.constFirst();
arguments.removeFirst();
QString projectFileName;
- foreach (const QString& arg, arguments) {
+ for (const QString &arg : qAsConst(arguments)) {
if (arg.startsWith(QLatin1String("--project-file"))) {
int split = arg.indexOf(QLatin1Char('='));
if (split > 0)
@@ -239,6 +255,55 @@ static QMap<QString, QString> getInitializedArguments()
return args;
}
+// Concatenate values of path arguments that can occur multiple times on the
+// command line.
+static void addPathOptionValue(const QString &option, const QString &value,
+ QMap<QString, QString> &args)
+{
+ const QMap<QString, QString>::iterator it = args.find(option);
+ if (it != args.end())
+ it.value().append(QLatin1String(PATH_SPLITTER) + value);
+ else
+ args.insert(option, value);
+}
+
+static void getCommandLineArg(QString arg, int &argNum, QMap<QString, QString> &args)
+{
+ if (arg.startsWith(QLatin1String("--"))) {
+ arg.remove(0, 2);
+ const int split = arg.indexOf(QLatin1Char('='));
+ if (split < 0) {
+ args.insert(arg, QString());
+ return;
+ }
+ const QString option = arg.left(split);
+ const QString value = arg.mid(split + 1).trimmed();
+ if (option == includePathOption() || option == frameworkIncludePathOption()
+ || option == typesystemPathOption()) {
+ addPathOptionValue(option, value, args);
+ } else {
+ args.insert(option, value);
+ }
+ return;
+ }
+ if (arg.startsWith(QLatin1Char('-'))) {
+ arg.remove(0, 1);
+ if (arg.startsWith(QLatin1Char('I'))) // Shorthand path arguments -I/usr/include...
+ addPathOptionValue(includePathOption(), arg.mid(1), args);
+ else if (arg.startsWith(QLatin1Char('F')))
+ addPathOptionValue(frameworkIncludePathOption(), arg.mid(1), args);
+ else if (arg.startsWith(QLatin1Char('T')))
+ addPathOptionValue(typesystemPathOption(), arg.mid(1), args);
+ else if (arg == QLatin1String("h"))
+ args.insert(helpOption(), QString());
+ else
+ args.insert(arg, QString());
+ return;
+ }
+ argNum++;
+ args.insert(QStringLiteral("arg-") + QString::number(argNum), arg);
+}
+
static QMap<QString, QString> getCommandLineArgs()
{
QMap<QString, QString> args = getInitializedArguments();
@@ -246,21 +311,9 @@ static QMap<QString, QString> getCommandLineArgs()
arguments.removeFirst();
int argNum = 0;
- foreach (const QString &carg, arguments) {
- const QString &arg = carg.trimmed();
- if (arg.startsWith(QLatin1String("--"))) {
- int split = arg.indexOf(QLatin1Char('='));
- if (split > 0)
- args[arg.mid(2).left(split-2)] = arg.mid(split + 1).trimmed();
- else
- args[arg.mid(2)] = QString();
- } else if (arg.startsWith(QLatin1Char('-'))) {
- args[arg.mid(1)] = QString();
- } else {
- argNum++;
- args[QString::fromLatin1("arg-%1").arg(argNum)] = arg;
- }
- }
+ for (const QString &carg : qAsConst(arguments))
+ getCommandLineArg(carg.trimmed(), argNum, args);
+
return args;
}
@@ -286,40 +339,47 @@ void printUsage()
s << "Usage:\n "
<< "shiboken [options] header-file typesystem-file\n\n"
<< "General options:\n";
- QMap<QString, QString> generalOptions;
- generalOptions.insert(QLatin1String("project-file=<file>"),
- QLatin1String("text file containing a description of the binding project. Replaces and overrides command line arguments"));
- generalOptions.insert(QLatin1String("debug-level=[sparse|medium|full]"),
- QLatin1String("Set the debug level"));
- generalOptions.insert(QLatin1String("silent"),
- QLatin1String("Avoid printing any message"));
- generalOptions.insert(QLatin1String("help"),
- QLatin1String("Display this help and exit"));
- generalOptions.insert(QLatin1String("no-suppress-warnings"),
- QLatin1String("Show all warnings"));
- generalOptions.insert(QLatin1String("output-directory=<path>"),
- QLatin1String("The directory where the generated files will be written"));
- generalOptions.insert(QLatin1String("include-paths=<path>[" PATH_SPLITTER "<path>" PATH_SPLITTER "...]"),
- QLatin1String("Include paths used by the C++ parser"));
- generalOptions.insert(QLatin1String("typesystem-paths=<path>[" PATH_SPLITTER "<path>" PATH_SPLITTER "...]"),
- QLatin1String("Paths used when searching for typesystems"));
- generalOptions.insert(QLatin1String("documentation-only"),
- QLatin1String("Do not generates any code, just the documentation"));
- generalOptions.insert(QLatin1String("license-file=<license-file>"),
- QLatin1String("File used for copyright headers of generated files"));
- generalOptions.insert(QLatin1String("version"),
- QLatin1String("Output version information and exit"));
- generalOptions.insert(QLatin1String("generator-set=<\"generator module\">"),
- QLatin1String("generator-set to be used. e.g. qtdoc"));
- generalOptions.insert(QLatin1String("api-version=<\"package mask\">,<\"version\">"),
- QLatin1String("Specify the supported api version used to generate the bindings"));
- generalOptions.insert(QLatin1String("drop-type-entries=\"<TypeEntry0>[;TypeEntry1;...]\""),
- QLatin1String("Semicolon separated list of type system entries (classes, namespaces, global functions and enums) to be dropped from generation."));
+ const QString pathSyntax = QLatin1String("<path>[" PATH_SPLITTER "<path>" PATH_SPLITTER "...]");
+ OptionDescriptions generalOptions = OptionDescriptions()
+ << qMakePair(QLatin1String("api-version=<\"package mask\">,<\"version\">"),
+ QLatin1String("Specify the supported api version used to generate the bindings"))
+ << qMakePair(QLatin1String("debug-level=[sparse|medium|full]"),
+ QLatin1String("Set the debug level"))
+ << qMakePair(QLatin1String("documentation-only"),
+ QLatin1String("Do not generates any code, just the documentation"))
+ << qMakePair(QLatin1String("drop-type-entries=\"<TypeEntry0>[;TypeEntry1;...]\""),
+ QLatin1String("Semicolon separated list of type system entries (classes, namespaces, global functions and enums) to be dropped from generation."))
+ << qMakePair(QLatin1String("-F") + pathSyntax, QString())
+ << qMakePair(QLatin1String("framework-include-paths=") + pathSyntax,
+ QLatin1String("Framework include paths used by the C++ parser"))
+ << qMakePair(QLatin1String("generator-set=<\"generator module\">"),
+ QLatin1String("generator-set to be used. e.g. qtdoc"))
+ << qMakePair(QLatin1String("-h"), QString())
+ << qMakePair(helpOption(),
+ QLatin1String("Display this help and exit"))
+ << qMakePair(QLatin1String("-I") + pathSyntax, QString())
+ << qMakePair(QLatin1String("include-paths=") + pathSyntax,
+ QLatin1String("Include paths used by the C++ parser"))
+ << qMakePair(QLatin1String("license-file=<license-file>"),
+ QLatin1String("File used for copyright headers of generated files"))
+ << qMakePair(QLatin1String("no-suppress-warnings"),
+ QLatin1String("Show all warnings"))
+ << qMakePair(QLatin1String("output-directory=<path>"),
+ QLatin1String("The directory where the generated files will be written"))
+ << qMakePair(QLatin1String("project-file=<file>"),
+ QLatin1String("text file containing a description of the binding project. Replaces and overrides command line arguments"))
+ << qMakePair(QLatin1String("silent"),
+ QLatin1String("Avoid printing any message"))
+ << qMakePair(QLatin1String("-T") + pathSyntax, QString())
+ << qMakePair(QLatin1String("typesystem-paths=") + pathSyntax,
+ QLatin1String("Paths used when searching for typesystems"))
+ << qMakePair(QLatin1String("version"),
+ QLatin1String("Output version information and exit"));
printOptions(s, generalOptions);
const Generators generators = shibokenGenerators() + docGenerators();
- foreach (const GeneratorPtr &generator, generators) {
- QMap<QString, QString> options = generator->options();
+ for (const GeneratorPtr &generator : generators) {
+ const OptionDescriptions options = generator->options();
if (!options.isEmpty()) {
s << endl << generator->name() << " options:\n";
printOptions(s, generator->options());
@@ -437,14 +497,13 @@ int main(int argc, char *argv[])
extractor.setSuppressWarnings(false);
if (argsHandler.argExists(QLatin1String("api-version"))) {
- QStringList versions = argsHandler.removeArg(QLatin1String("api-version")).split(QLatin1Char('|'));
- foreach (const QString &fullVersion, versions) {
+ const QStringList &versions = argsHandler.removeArg(QLatin1String("api-version")).split(QLatin1Char('|'));
+ for (const QString &fullVersion : versions) {
QStringList parts = fullVersion.split(QLatin1Char(','));
QString package;
QString version;
- // avoid constFirst to stay Qt 5.5 compatible
- package = parts.count() == 1 ? QLatin1String("*") : parts.first();
- version = parts.last();
+ package = parts.count() == 1 ? QLatin1String("*") : parts.constFirst();
+ version = parts.constLast();
if (!extractor.setApiVersion(package, version)) {
errorPrint(msgInvalidVersion(package, version));
return EXIT_FAILURE;
@@ -460,11 +519,29 @@ int main(int argc, char *argv[])
extractor.addTypesystemSearchPath(path.split(QLatin1String(PATH_SPLITTER)));
path = argsHandler.removeArg(QLatin1String("include-paths"));
- if (!path.isEmpty())
- extractor.addIncludePath(path.split(QLatin1String(PATH_SPLITTER)));
+ if (!path.isEmpty()) {
+ const QStringList includePathListList = path.split(QLatin1String(PATH_SPLITTER));
+ for (const QString &s : qAsConst(includePathListList)) {
+ const bool isFramework = false;
+ extractor.addIncludePath(HeaderPath(s, isFramework));
+ }
+ }
+
+ path = argsHandler.removeArg(QLatin1String("framework-include-paths"));
+ if (!path.isEmpty()) {
+ const QStringList frameworkPathList = path.split(QLatin1String(PATH_SPLITTER));
+ const bool isFramework = true;
+ for (const QString &s : qAsConst(frameworkPathList)) {
+ extractor.addIncludePath(HeaderPath(s, isFramework));
+ }
+ }
QString cppFileName = argsHandler.removeArg(QLatin1String("arg-1"));
QString typeSystemFileName = argsHandler.removeArg(QLatin1String("arg-2"));
+ QString messagePrefix = QFileInfo(typeSystemFileName).baseName();
+ if (messagePrefix.startsWith(QLatin1String("typesystem_")))
+ messagePrefix.remove(0, 11);
+ ReportHandler::setPrefix(QLatin1Char('(') + messagePrefix + QLatin1Char(')'));
/* Make sure to remove the project file's arguments (if any) and
* --project-file, also the arguments of each generator before
@@ -478,18 +555,20 @@ int main(int argc, char *argv[])
for ( ; it != projectFileArgs.constEnd(); ++it)
argsHandler.removeArg(it.key());
}
- foreach (const GeneratorPtr &generator, generators) {
- QMap<QString, QString> options = generator->options();
- if (!options.isEmpty()) {
- QMap<QString, QString>::const_iterator it = options.constBegin();
- for ( ; it != options.constEnd(); ++it)
- argsHandler.removeArg(it.key());
- }
+ for (const GeneratorPtr &generator : qAsConst(generators)) {
+ const OptionDescriptions &options = generator->options();
+ for (const auto &od : options)
+ argsHandler.removeArg(od.first);
}
if (!argsHandler.noArgs()) {
errorPrint(argsHandler.errorMessage());
- std::cout << "Note: use --help option for more information." << std::endl;
+ std::cout << helpHint;
+ return EXIT_FAILURE;
+ }
+
+ if (typeSystemFileName.isEmpty()) {
+ std::cout << "You must specify a Type System file." << std::endl << helpHint;
return EXIT_FAILURE;
}
@@ -505,7 +584,7 @@ int main(int argc, char *argv[])
qCDebug(lcShiboken) << extractor;
- foreach (const GeneratorPtr &g, generators) {
+ for (const GeneratorPtr &g : qAsConst(generators)) {
g->setOutputDirectory(outputDirectory);
g->setLicenseComment(licenseComment);
if (g->setup(extractor, args)) {
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
index a7a176907..7cce97ae1 100644
--- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
+++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
@@ -35,6 +35,7 @@
#include <typedatabase.h>
#include <algorithm>
#include <QtCore/QStack>
+#include <QtCore/QRegularExpression>
#include <QtCore/QTextStream>
#include <QtCore/QXmlStreamReader>
#include <QtCore/QFile>
@@ -46,36 +47,36 @@ static Indentor INDENT;
static bool shouldSkip(const AbstractMetaFunction* func)
{
- bool skipable = func->isConstructor()
- || func->isModifiedRemoved()
- || func->declaringClass() != func->ownerClass()
- || func->isCastOperator()
- || func->name() == QLatin1String("operator=");
-
- // Search a const clone
- if (!skipable && !func->isConstant()) {
- const AbstractMetaArgumentList funcArgs = func->arguments();
- foreach (AbstractMetaFunction* f, func->ownerClass()->functions()) {
- if (f != func
- && f->isConstant()
- && f->name() == func->name()
- && f->arguments().count() == funcArgs.count()) {
- // Compare each argument
- bool cloneFound = true;
-
- const AbstractMetaArgumentList fargs = f->arguments();
- for (int i = 0, max = funcArgs.count(); i < max; ++i) {
- if (funcArgs.at(i)->type()->typeEntry() != fargs.at(i)->type()->typeEntry()) {
- cloneFound = false;
- break;
- }
+ // Constructors go to separate section
+ if (DocParser::skipForQuery(func) || func->isConstructor())
+ return true;
+
+ // Search a const clone (QImage::bits() vs QImage::bits() const)
+ if (func->isConstant())
+ return false;
+
+ const AbstractMetaArgumentList funcArgs = func->arguments();
+ const AbstractMetaFunctionList &ownerFunctions = func->ownerClass()->functions();
+ for (AbstractMetaFunction *f : ownerFunctions) {
+ if (f != func
+ && f->isConstant()
+ && f->name() == func->name()
+ && f->arguments().count() == funcArgs.count()) {
+ // Compare each argument
+ bool cloneFound = true;
+
+ const AbstractMetaArgumentList fargs = f->arguments();
+ for (int i = 0, max = funcArgs.count(); i < max; ++i) {
+ if (funcArgs.at(i)->type()->typeEntry() != fargs.at(i)->type()->typeEntry()) {
+ cloneFound = false;
+ break;
}
- if (cloneFound)
- return true;
}
+ if (cloneFound)
+ return true;
}
}
- return skipable;
+ return false;
}
static bool functionSort(const AbstractMetaFunction* func1, const AbstractMetaFunction* func2)
@@ -83,28 +84,106 @@ static bool functionSort(const AbstractMetaFunction* func1, const AbstractMetaFu
return func1->name() < func2->name();
}
-static QString createRepeatedChar(int i, char c)
+class Pad
+{
+public:
+ explicit Pad(char c, int count) : m_char(c), m_count(count) {}
+
+ void write(QTextStream &str) const
+ {
+ for (int i = 0; i < m_count; ++i)
+ str << m_char;
+ }
+
+private:
+ const char m_char;
+ const int m_count;
+};
+
+inline QTextStream &operator<<(QTextStream &str, const Pad &pad)
{
- QString out;
- for (int j = 0; j < i; ++j)
- out += QLatin1Char(c);
+ pad.write(str);
+ return str;
+}
- return out;
+template <class String>
+static int writeEscapedRstText(QTextStream &str, const String &s)
+{
+ int escaped = 0;
+ for (const QChar &c : s) {
+ switch (c.unicode()) {
+ case '*':
+ case '`':
+ case '_':
+ case '\\':
+ str << '\\';
+ ++escaped;
+ break;
+ }
+ str << c;
+ }
+ return s.size() + escaped;
}
-static QString escape(QString str)
+class escape
{
- str.replace(QLatin1Char('*'), QLatin1String("\\*"));
- str.replace(QLatin1Char('_'), QLatin1String("\\_"));
+public:
+ explicit escape(const QStringRef &s) : m_string(s) {}
+
+ void write(QTextStream &str) const { writeEscapedRstText(str, m_string); }
+
+private:
+ const QStringRef m_string;
+};
+
+inline QTextStream &operator<<(QTextStream &str, const escape &e)
+{
+ e.write(str);
return str;
}
-static QString escape(const QStringRef& strref)
+// Return last character of a QString-buffered stream.
+static QChar lastChar(const QTextStream &str)
{
- QString str = strref.toString();
- return escape(str);
+ const QString *string = str.string();
+ Q_ASSERT(string);
+ return string->isEmpty() ? QChar() : *(string->crbegin());
}
+static QTextStream &ensureEndl(QTextStream &s)
+{
+ if (lastChar(s) != QLatin1Char('\n'))
+ s << endl;
+ return s;
+}
+
+static QString msgTagWarning(const QXmlStreamReader &reader, const QString &context,
+ const QString &tag, const QString &message)
+{
+ QString result;
+ QTextStream str(&result);
+ str << "While handling <";
+ const QStringRef currentTag = reader.name();
+ if (currentTag.isEmpty())
+ str << tag;
+ else
+ str << currentTag;
+ str << "> in " << context << ", line "<< reader.lineNumber()
+ << ": " << message;
+ return result;
+}
+
+static QString msgFallbackWarning(const QXmlStreamReader &reader, const QString &context,
+ const QString &tag, const QString &location, const QString &identifier,
+ const QString &fallback)
+{
+ QString message = QLatin1String("Falling back to \"")
+ + QDir::toNativeSeparators(fallback) + QLatin1String("\" for \"") + location
+ + QLatin1Char('"');
+ if (!identifier.isEmpty())
+ message += QLatin1String(" [") + identifier + QLatin1Char(']');
+ return msgTagWarning(reader, context, tag, message);
+}
QtXmlToSphinx::QtXmlToSphinx(QtDocGenerator* generator, const QString& doc, const QString& context)
: m_context(context), m_generator(generator), m_insideBold(false), m_insideItalic(false)
@@ -125,7 +204,7 @@ QtXmlToSphinx::QtXmlToSphinx(QtDocGenerator* generator, const QString& doc, cons
m_handlerMap.insert(QLatin1String("argument"), &QtXmlToSphinx::handleArgumentTag);
m_handlerMap.insert(QLatin1String("teletype"), &QtXmlToSphinx::handleArgumentTag);
m_handlerMap.insert(QLatin1String("link"), &QtXmlToSphinx::handleLinkTag);
- m_handlerMap.insert(QLatin1String("inlineimage"), &QtXmlToSphinx::handleImageTag);
+ m_handlerMap.insert(QLatin1String("inlineimage"), &QtXmlToSphinx::handleInlineImageTag);
m_handlerMap.insert(QLatin1String("image"), &QtXmlToSphinx::handleImageTag);
m_handlerMap.insert(QLatin1String("list"), &QtXmlToSphinx::handleListTag);
m_handlerMap.insert(QLatin1String("term"), &QtXmlToSphinx::handleTermTag);
@@ -197,34 +276,34 @@ QString QtXmlToSphinx::popOutputBuffer()
return strcpy;
}
-QString QtXmlToSphinx::expandFunction(const QString& function)
+QString QtXmlToSphinx::expandFunction(const QString& function) const
{
- QStringList functionSpec = function.split(QLatin1Char('.'));
- QString className = functionSpec.first();
- const AbstractMetaClass* metaClass = 0;
- foreach (const AbstractMetaClass* cls, m_generator->classes()) {
- if (cls->name() == className) {
- metaClass = cls;
- break;
+ const int firstDot = function.indexOf(QLatin1Char('.'));
+ const AbstractMetaClass *metaClass = nullptr;
+ if (firstDot != -1) {
+ const QStringRef className = function.leftRef(firstDot);
+ const AbstractMetaClassList &classes = m_generator->classes();
+ for (const AbstractMetaClass *cls : classes) {
+ if (cls->name() == className) {
+ metaClass = cls;
+ break;
+ }
}
}
- if (metaClass) {
- functionSpec.removeFirst();
- return metaClass->typeEntry()->qualifiedTargetLangName()
- + QLatin1Char('.') + functionSpec.join(QLatin1Char('.'));
- } else {
- return function;
- }
+ return metaClass
+ ? metaClass->typeEntry()->qualifiedTargetLangName()
+ + function.right(function.size() - firstDot)
+ : function;
}
-QString QtXmlToSphinx::resolveContextForMethod(const QString& methodName)
+QString QtXmlToSphinx::resolveContextForMethod(const QString& methodName) const
{
- // avoid constLast to stay Qt 5.5 compatible
- QString currentClass = m_context.split(QLatin1Char('.')).last();
+ const QStringRef currentClass = m_context.splitRef(QLatin1Char('.')).constLast();
const AbstractMetaClass* metaClass = 0;
- foreach (const AbstractMetaClass* cls, m_generator->classes()) {
+ const AbstractMetaClassList &classes = m_generator->classes();
+ for (const AbstractMetaClass *cls : classes) {
if (cls->name() == currentClass) {
metaClass = cls;
break;
@@ -233,13 +312,14 @@ QString QtXmlToSphinx::resolveContextForMethod(const QString& methodName)
if (metaClass) {
QList<const AbstractMetaFunction*> funcList;
- foreach (const AbstractMetaFunction* func, metaClass->queryFunctionsByName(methodName)) {
+ const AbstractMetaFunctionList &methods = metaClass->queryFunctionsByName(methodName);
+ for (const AbstractMetaFunction *func : methods) {
if (methodName == func->name())
funcList.append(func);
}
const AbstractMetaClass* implementingClass = 0;
- foreach (const AbstractMetaFunction* func, funcList) {
+ for (const AbstractMetaFunction *func : qAsConst(funcList)) {
implementingClass = func->implementingClass();
if (implementingClass->name() == currentClass)
break;
@@ -290,94 +370,115 @@ QString QtXmlToSphinx::transform(const QString& doc)
m_lastTagName = reader.name().toString();
}
}
+
+ if (!m_inlineImages.isEmpty()) {
+ // Write out inline image definitions stored in handleInlineImageTag().
+ m_output << endl;
+ for (const InlineImage &img : qAsConst(m_inlineImages))
+ m_output << ".. |" << img.tag << "| image:: " << img.href << endl;
+ m_output << endl;
+ m_inlineImages.clear();
+ }
+
m_output.flush();
QString retval = popOutputBuffer();
Q_ASSERT(m_buffers.isEmpty());
return retval;
}
-QString QtXmlToSphinx::readFromLocations(const QStringList& locations, const QString& path, const QString& identifier)
+static QString resolveFile(const QStringList &locations, const QString &path)
{
- QString result;
- bool ok;
- foreach (QString location, locations) {
+ for (QString location : locations) {
location.append(QLatin1Char('/'));
location.append(path);
- result = readFromLocation(location, identifier, &ok);
- if (ok)
- break;
+ if (QFileInfo::exists(location))
+ return location;
}
- if (!ok) {
- qCDebug(lcShiboken).noquote().nospace() << "Couldn't read code snippet file: {"
- << locations.join(QLatin1Char('|')) << '}' << path;
- }
- return result;
+ return QString();
+}
+QString QtXmlToSphinx::readFromLocations(const QStringList &locations, const QString &path,
+ const QString &identifier, QString *errorMessage)
+{
+ QString result;
+ const QString resolvedPath = resolveFile(locations, path);
+ if (resolvedPath.isEmpty()) {
+ QTextStream(errorMessage) << "Could not resolve \"" << path << "\" in \""
+ << locations.join(QLatin1String("\", \""));
+ return QString(); // null
+ }
+ qCDebug(lcShiboken).noquote().nospace() << "snippet file " << path
+ << " [" << identifier << ']' << " resolved to " << resolvedPath;
+ return readFromLocation(resolvedPath, identifier, errorMessage);
}
-QString QtXmlToSphinx::readFromLocation(const QString& location, const QString& identifier, bool* ok)
+QString QtXmlToSphinx::readFromLocation(const QString &location, const QString &identifier,
+ QString *errorMessage)
{
QFile inputFile;
inputFile.setFileName(location);
if (!inputFile.open(QIODevice::ReadOnly)) {
- if (!ok) {
- qCDebug(lcShiboken).noquote().nospace() << "Couldn't read code snippet file: "
- << QDir::toNativeSeparators(inputFile.fileName());
- } else {
- *ok = false;
- }
- return QString();
+ QTextStream(errorMessage) << "Could not read code snippet file: "
+ << QDir::toNativeSeparators(inputFile.fileName())
+ << ": " << inputFile.errorString();
+ return QString(); // null
}
- QRegExp searchString(QLatin1String("//!\\s*\\[") + identifier + QLatin1String("\\]"));
- QRegExp codeSnippetCode(QLatin1String("//!\\s*\\[[\\w\\d\\s]+\\]"));
- QString code;
+ QString code = QLatin1String(""); // non-null
+ if (identifier.isEmpty()) {
+ while (!inputFile.atEnd())
+ code += QString::fromUtf8(inputFile.readLine());
+ return code;
+ }
+
+ const QRegularExpression searchString(QLatin1String("//!\\s*\\[")
+ + identifier + QLatin1String("\\]"));
+ Q_ASSERT(searchString.isValid());
+ static const QRegularExpression codeSnippetCode(QLatin1String("//!\\s*\\[[\\w\\d\\s]+\\]"));
+ Q_ASSERT(codeSnippetCode.isValid());
- bool identifierIsEmpty = identifier.isEmpty();
bool getCode = false;
while (!inputFile.atEnd()) {
QString line = QString::fromUtf8(inputFile.readLine());
- if (identifierIsEmpty) {
- code += line;
- } else if (getCode && !line.contains(searchString)) {
+ if (getCode && !line.contains(searchString)) {
line.remove(codeSnippetCode);
code += line;
} else if (line.contains(searchString)) {
if (getCode)
break;
- else
- getCode = true;
+ getCode = true;
}
}
- if (!identifierIsEmpty && !getCode) {
- qCDebug(lcShiboken).noquote().nospace() << "Code snippet file found ("
- << location << "), but snippet " << identifier << " not found.";
+ if (!getCode) {
+ QTextStream(errorMessage) << "Code snippet file found ("
+ << QDir::toNativeSeparators(location) << "), but snippet ["
+ << identifier << "] not found.";
+ return QString(); // null
}
- if (ok)
- *ok = true;
return code;
}
void QtXmlToSphinx::handleHeadingTag(QXmlStreamReader& reader)
{
- static QString heading;
+ static int headingSize = 0;
static char type;
static char types[] = { '-', '^' };
QXmlStreamReader::TokenType token = reader.tokenType();
if (token == QXmlStreamReader::StartElement) {
- uint typeIdx = reader.attributes().value(QLatin1String("level")).toString().toInt();
+ uint typeIdx = reader.attributes().value(QLatin1String("level")).toUInt();
if (typeIdx >= sizeof(types))
type = types[sizeof(types)-1];
else
type = types[typeIdx];
} else if (token == QXmlStreamReader::EndElement) {
- m_output << createRepeatedChar(heading.length(), type) << endl << endl;
+ m_output << Pad(type, headingSize) << endl << endl;
} else if (token == QXmlStreamReader::Characters) {
- heading = escape(reader.text()).trimmed();
- m_output << endl << endl << heading << endl;
+ m_output << endl << endl;
+ headingSize = writeEscapedRstText(m_output, reader.text().trimmed());
+ m_output << endl;
}
}
@@ -395,14 +496,14 @@ void QtXmlToSphinx::handleParaTag(QXmlStreamReader& reader)
m_output << INDENT << result << endl << endl;
} else if (token == QXmlStreamReader::Characters) {
- QString text = escape(reader.text());
- if (!m_output.string()->isEmpty()) {
+ const QStringRef text = reader.text();
+ const QChar end = lastChar(m_output);
+ if (!text.isEmpty() && INDENT.indent == 0 && !end.isNull()) {
QChar start = text[0];
- QChar end = m_output.string()->at(m_output.string()->length() - 1);
if ((end == QLatin1Char('*') || end == QLatin1Char('`')) && start != QLatin1Char(' ') && !start.isPunct())
m_output << '\\';
}
- m_output << INDENT << text;
+ m_output << INDENT << escape(text);
}
}
@@ -413,7 +514,7 @@ void QtXmlToSphinx::handleItalicTag(QXmlStreamReader& reader)
m_insideItalic = !m_insideItalic;
m_output << '*';
} else if (token == QXmlStreamReader::Characters) {
- m_output << escape(reader.text()).trimmed();
+ m_output << escape(reader.text().trimmed());
}
}
@@ -424,7 +525,7 @@ void QtXmlToSphinx::handleBoldTag(QXmlStreamReader& reader)
m_insideBold = !m_insideBold;
m_output << "**";
} else if (token == QXmlStreamReader::Characters) {
- m_output << escape(reader.text()).trimmed();
+ m_output << escape(reader.text().trimmed());
}
}
@@ -434,16 +535,102 @@ void QtXmlToSphinx::handleArgumentTag(QXmlStreamReader& reader)
if (token == QXmlStreamReader::StartElement || token == QXmlStreamReader::EndElement)
m_output << "``";
else if (token == QXmlStreamReader::Characters)
- m_output << reader.text().toString().trimmed();
+ m_output << reader.text().trimmed();
}
+static inline QString functionLinkType() { return QStringLiteral("function"); }
+static inline QString classLinkType() { return QStringLiteral("class"); }
+
+static inline QString fixLinkType(const QStringRef &type)
+{
+ // TODO: create a flag PROPERTY-AS-FUNCTION to ask if the properties
+ // are recognized as such or not in the binding
+ if (type == QLatin1String("property"))
+ return functionLinkType();
+ if (type == QLatin1String("typedef"))
+ return classLinkType();
+ return type.toString();
+}
+
+static inline QString linkSourceAttribute(const QString &type)
+{
+ if (type == functionLinkType() || type == classLinkType())
+ return QLatin1String("raw");
+ return type == QLatin1String("enum") || type == QLatin1String("page")
+ ? type : QLatin1String("href");
+}
+
+// "See also" links may appear as nested links:
+// <see-also>QAbstractXmlReceiver<link raw="isValid()" href="qxmlquery.html#isValid" type="function">isValid()</link>
+// which is handled in handleLinkTag
+// or direct text:
+// <see-also>rootIsDecorated()</see-also>
+// which is handled here.
+
void QtXmlToSphinx::handleSeeAlsoTag(QXmlStreamReader& reader)
{
- QXmlStreamReader::TokenType token = reader.tokenType();
- if (token == QXmlStreamReader::StartElement)
+ switch (reader.tokenType()) {
+ case QXmlStreamReader::StartElement:
m_output << INDENT << ".. seealso:: ";
- else if (token == QXmlStreamReader::EndElement)
+ break;
+ case QXmlStreamReader::Characters: {
+ // Direct embedded link: <see-also>rootIsDecorated()</see-also>
+ const QStringRef textR = reader.text().trimmed();
+ if (!textR.isEmpty()) {
+ const QString text = textR.toString();
+ if (m_seeAlsoContext.isNull()) {
+ const QString type = text.endsWith(QLatin1String("()"))
+ ? functionLinkType() : classLinkType();
+ m_seeAlsoContext.reset(handleLinkStart(type, text));
+ }
+ handleLinkText(m_seeAlsoContext.data(), text);
+ }
+ }
+ break;
+ case QXmlStreamReader::EndElement:
+ if (!m_seeAlsoContext.isNull()) { // direct, no nested </link> seen
+ handleLinkEnd(m_seeAlsoContext.data());
+ m_seeAlsoContext.reset();
+ }
m_output << endl;
+ break;
+ default:
+ break;
+ }
+}
+
+static inline QString fallbackPathAttribute() { return QStringLiteral("path"); }
+
+static inline bool snippetComparison()
+{
+ return ReportHandler::debugLevel() >= ReportHandler::FullDebug;
+}
+
+template <class Indent> // const char*/class Indentor
+void formatSnippet(QTextStream &str, Indent indent, const QString &snippet)
+{
+ const QVector<QStringRef> lines = snippet.splitRef(QLatin1Char('\n'));
+ for (const QStringRef &line : lines) {
+ if (!line.trimmed().isEmpty())
+ str << indent << line;
+ str << endl;
+ }
+}
+
+static QString msgSnippetComparison(const QString &location, const QString &identifier,
+ const QString &pythonCode, const QString &fallbackCode)
+{
+ QString result;
+ QTextStream str(&result);
+ str << "Python snippet " << location;
+ if (!identifier.isEmpty())
+ str << " [" << identifier << ']';
+ str << ":\n";
+ formatSnippet(str, " ", pythonCode);
+ str << "Corresponding fallback snippet:\n";
+ formatSnippet(str, " ", fallbackCode);
+ str << "-- end --\n";
+ return result;
}
void QtXmlToSphinx::handleSnippetTag(QXmlStreamReader& reader)
@@ -458,21 +645,38 @@ void QtXmlToSphinx::handleSnippetTag(QXmlStreamReader& reader)
}
QString location = reader.attributes().value(QLatin1String("location")).toString();
QString identifier = reader.attributes().value(QLatin1String("identifier")).toString();
- QString code = readFromLocations(m_generator->codeSnippetDirs(), location, identifier);
+ QString errorMessage;
+ const QString pythonCode =
+ readFromLocations(m_generator->codeSnippetDirs(), location, identifier, &errorMessage);
+ if (!errorMessage.isEmpty())
+ qCWarning(lcShiboken, "%s", qPrintable(msgTagWarning(reader, m_context, m_lastTagName, errorMessage)));
+ // Fall back to C++ snippet when "path" attribute is present.
+ // Also read fallback snippet when comparison is desired.
+ QString fallbackCode;
+ if ((pythonCode.isNull() || snippetComparison())
+ && reader.attributes().hasAttribute(fallbackPathAttribute())) {
+ const QString fallback = reader.attributes().value(fallbackPathAttribute()).toString();
+ if (QFileInfo::exists(fallback)) {
+ if (pythonCode.isNull())
+ qCWarning(lcShiboken, "%s", qPrintable(msgFallbackWarning(reader, m_context, m_lastTagName, location, identifier, fallback)));
+ fallbackCode = readFromLocation(fallback, identifier, &errorMessage);
+ if (!errorMessage.isEmpty())
+ qCWarning(lcShiboken, "%s", qPrintable(msgTagWarning(reader, m_context, m_lastTagName, errorMessage)));
+ }
+ }
+
+ if (!pythonCode.isEmpty() && !fallbackCode.isEmpty() && snippetComparison())
+ qCDebug(lcShiboken, "%s", qPrintable(msgSnippetComparison(location, identifier, pythonCode, fallbackCode)));
+
if (!consecutiveSnippet)
m_output << INDENT << "::\n\n";
Indentation indentation(INDENT);
- if (code.isEmpty()) {
+ const QString code = pythonCode.isNull() ? fallbackCode : pythonCode;
+ if (code.isEmpty())
m_output << INDENT << "<Code snippet \"" << location << ':' << identifier << "\" not found>" << endl;
- } else {
- foreach (const QString &line, code.split(QLatin1Char('\n'))) {
- if (!QString(line).trimmed().isEmpty())
- m_output << INDENT << line;
-
- m_output << endl;
- }
- }
+ else
+ formatSnippet(m_output, INDENT, code);
m_output << endl;
}
}
@@ -489,7 +693,7 @@ void QtXmlToSphinx::handleDotsTag(QXmlStreamReader& reader)
Indentation indentation(INDENT);
pushOutputBuffer();
m_output << INDENT;
- int indent = reader.attributes().value(QLatin1String("indent")).toString().toInt();
+ int indent = reader.attributes().value(QLatin1String("indent")).toInt();
for (int i = 0; i < indent; ++i)
m_output << ' ';
} else if (token == QXmlStreamReader::Characters) {
@@ -509,7 +713,7 @@ void QtXmlToSphinx::handleTableTag(QXmlStreamReader& reader)
// write the table on m_output
m_currentTable.enableHeader(m_tableHasHeader);
m_currentTable.normalize();
- m_output << m_currentTable;
+ m_output << ensureEndl << m_currentTable;
m_currentTable.clear();
}
}
@@ -537,8 +741,8 @@ void QtXmlToSphinx::handleItemTag(QXmlStreamReader& reader)
m_currentTable << TableRow();
TableRow& row = m_currentTable.last();
TableCell cell;
- cell.colSpan = reader.attributes().value(QLatin1String("colspan")).toString().toShort();
- cell.rowSpan = reader.attributes().value(QLatin1String("rowspan")).toString().toShort();
+ cell.colSpan = reader.attributes().value(QLatin1String("colspan")).toShort();
+ cell.rowSpan = reader.attributes().value(QLatin1String("rowspan")).toShort();
row << cell;
pushOutputBuffer();
} else if (token == QXmlStreamReader::EndElement) {
@@ -577,9 +781,9 @@ void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader)
if (!m_currentTable.isEmpty()) {
if (listType == QLatin1String("bullet")) {
m_output << endl;
- foreach (TableCell cell, m_currentTable.first()) {
- QStringList itemLines = cell.data.split(QLatin1Char('\n'));
- m_output << INDENT << "* " << itemLines.first() << endl;
+ for (const TableCell &cell : m_currentTable.constFirst()) {
+ const QVector<QStringRef> itemLines = cell.data.splitRef(QLatin1Char('\n'));
+ m_output << INDENT << "* " << itemLines.constFirst() << endl;
for (int i = 1, max = itemLines.count(); i < max; ++i)
m_output << INDENT << " " << itemLines[i] << endl;
}
@@ -587,7 +791,7 @@ void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader)
} else if (listType == QLatin1String("enum")) {
m_currentTable.enableHeader(m_tableHasHeader);
m_currentTable.normalize();
- m_output << m_currentTable;
+ m_output << ensureEndl << m_currentTable;
}
}
m_currentTable.clear();
@@ -596,115 +800,197 @@ void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader)
void QtXmlToSphinx::handleLinkTag(QXmlStreamReader& reader)
{
- static QString l_linktag;
- static QString l_linkref;
- static QString l_linktext;
- static QString l_linktagending;
- static QString l_type;
- QXmlStreamReader::TokenType token = reader.tokenType();
- if (token == QXmlStreamReader::StartElement) {
- l_linktagending = QLatin1String("` ");
- if (m_insideBold) {
- l_linktag.prepend(QLatin1String("**"));
- l_linktagending.append(QLatin1String("**"));
- } else if (m_insideItalic) {
- l_linktag.prepend(QLatin1Char('*'));
- l_linktagending.append(QLatin1Char('*'));
- }
- l_type = reader.attributes().value(QLatin1String("type")).toString();
-
- // TODO: create a flag PROPERTY-AS-FUNCTION to ask if the properties
- // are recognized as such or not in the binding
- if (l_type == QLatin1String("property"))
- l_type = QLatin1String("function");
-
- if (l_type == QLatin1String("typedef"))
- l_type = QLatin1String("class");
-
- QString linkSource;
- if (l_type == QLatin1String("function") || l_type == QLatin1String("class")) {
- linkSource = QLatin1String("raw");
- } else if (l_type == QLatin1String("enum")) {
- linkSource = QLatin1String("enum");
- } else if (l_type == QLatin1String("page")) {
- linkSource = QLatin1String("page");
+ switch (reader.tokenType()) {
+ case QXmlStreamReader::StartElement: {
+ // <link> embedded in <see-also> means the characters of <see-also> are no link.
+ m_seeAlsoContext.reset();
+ const QString type = fixLinkType(reader.attributes().value(QLatin1String("type")));
+ const QString ref = reader.attributes().value(linkSourceAttribute(type)).toString();
+ m_linkContext.reset(handleLinkStart(type, ref));
+ }
+ break;
+ case QXmlStreamReader::Characters:
+ Q_ASSERT(!m_linkContext.isNull());
+ handleLinkText(m_linkContext.data(), reader.text().toString());
+ break;
+ case QXmlStreamReader::EndElement:
+ Q_ASSERT(!m_linkContext.isNull());
+ handleLinkEnd(m_linkContext.data());
+ m_linkContext.reset();
+ break;
+ default:
+ break;
+ }
+}
+
+QtXmlToSphinx::LinkContext *QtXmlToSphinx::handleLinkStart(const QString &type, const QString &ref) const
+{
+ LinkContext *result = new LinkContext(ref, type);
+
+ result->linkTagEnding = QLatin1String("` ");
+ if (m_insideBold) {
+ result->linkTag.prepend(QLatin1String("**"));
+ result->linkTagEnding.append(QLatin1String("**"));
+ } else if (m_insideItalic) {
+ result->linkTag.prepend(QLatin1Char('*'));
+ result->linkTagEnding.append(QLatin1Char('*'));
+ }
+
+ result->linkRef.replace(QLatin1String("::"), QLatin1String("."));
+ result->linkRef.remove(QLatin1String("()"));
+
+ if (result->type == functionLinkType() && !m_context.isEmpty()) {
+ result->linkTag = QLatin1String(" :meth:`");
+ const QVector<QStringRef> rawlinklist = result->linkRef.splitRef(QLatin1Char('.'));
+ if (rawlinklist.size() == 1 || rawlinklist.constFirst() == m_context) {
+ QString context = resolveContextForMethod(rawlinklist.constLast().toString());
+ if (!result->linkRef.startsWith(context))
+ result->linkRef.prepend(context + QLatin1Char('.'));
} else {
- linkSource = QLatin1String("href");
+ result->linkRef = expandFunction(result->linkRef);
}
-
- l_linkref = reader.attributes().value(linkSource).toString();
- l_linkref.replace(QLatin1String("::"), QLatin1String("."));
- l_linkref.remove(QLatin1String("()"));
-
- if (l_type == QLatin1String("function") && !m_context.isEmpty()) {
- l_linktag = QLatin1String(" :meth:`");
- QStringList rawlinklist = l_linkref.split(QLatin1Char('.'));
- if (rawlinklist.size() == 1 || rawlinklist.first() == m_context) {
- QString context = resolveContextForMethod(rawlinklist.last());
- if (!l_linkref.startsWith(context))
- l_linkref.prepend(context + QLatin1Char('.'));
- } else {
- l_linkref = expandFunction(l_linkref);
+ } else if (result->type == functionLinkType() && m_context.isEmpty()) {
+ result->linkTag = QLatin1String(" :func:`");
+ } else if (result->type == classLinkType()) {
+ result->linkTag = QLatin1String(" :class:`");
+ if (const TypeEntry *type = TypeDatabase::instance()->findType(result->linkRef)) {
+ result->linkRef = type->qualifiedTargetLangName();
+ } else { // fall back to the old heuristic if the type wasn't found.
+ const QVector<QStringRef> rawlinklist = result->linkRef.splitRef(QLatin1Char('.'));
+ QStringList splittedContext = m_context.split(QLatin1Char('.'));
+ if (rawlinklist.size() == 1 || rawlinklist.constFirst() == splittedContext.constLast()) {
+ splittedContext.removeLast();
+ result->linkRef.prepend(QLatin1Char('~') + splittedContext.join(QLatin1Char('.'))
+ + QLatin1Char('.'));
}
- } else if (l_type == QLatin1String("function") && m_context.isEmpty()) {
- l_linktag = QLatin1String(" :func:`");
- } else if (l_type == QLatin1String("class")) {
- l_linktag = QLatin1String(" :class:`");
- TypeEntry* type = TypeDatabase::instance()->findType(l_linkref);
- if (type) {
- l_linkref = type->qualifiedTargetLangName();
- } else { // fall back to the old heuristic if the type wasn't found.
- QStringList rawlinklist = l_linkref.split(QLatin1Char('.'));
- QStringList splittedContext = m_context.split(QLatin1Char('.'));
- if (rawlinklist.size() == 1 || rawlinklist.first() == splittedContext.last()) {
- splittedContext.removeLast();
- l_linkref.prepend(QLatin1Char('~') + splittedContext.join(QLatin1Char('.'))
- + QLatin1Char('.'));
- }
- }
- } else if (l_type == QLatin1String("enum")) {
- l_linktag = QLatin1String(" :attr:`");
- } else if (l_type == QLatin1String("page") && l_linkref == m_generator->moduleName()) {
- l_linktag = QLatin1String(" :mod:`");
- } else {
- l_linktag = QLatin1String(" :ref:`");
}
+ } else if (result->type == QLatin1String("enum")) {
+ result->linkTag = QLatin1String(" :attr:`");
+ } else if (result->type == QLatin1String("page") && result->linkRef == m_generator->moduleName()) {
+ result->linkTag = QLatin1String(" :mod:`");
+ } else {
+ result->linkTag = QLatin1String(" :ref:`");
+ }
+ return result;
+}
- } else if (token == QXmlStreamReader::Characters) {
- QString linktext = reader.text().toString();
- linktext.replace(QLatin1String("::"), QLatin1String("."));
- // avoid constLast to stay Qt 5.5 compatible
- QString item = l_linkref.split(QLatin1Char('.')).last();
- if (l_linkref == linktext
- || (l_linkref + QLatin1String("()")) == linktext
- || item == linktext
- || (item + QLatin1String("()")) == linktext)
- l_linktext.clear();
- else
- l_linktext = linktext + QLatin1Char('<');
- } else if (token == QXmlStreamReader::EndElement) {
- if (!l_linktext.isEmpty())
- l_linktagending.prepend(QLatin1Char('>'));
- m_output << l_linktag << l_linktext << escape(l_linkref) << l_linktagending;
+void QtXmlToSphinx::handleLinkText(LinkContext *linkContext, QString linktext) const
+{
+ linktext.replace(QLatin1String("::"), QLatin1String("."));
+ const QStringRef item = linkContext->linkRef.splitRef(QLatin1Char('.')).constLast();
+ if (linkContext->linkRef == linktext
+ || (linkContext->linkRef + QLatin1String("()")) == linktext
+ || item == linktext
+ || (item + QLatin1String("()")) == linktext) {
+ linkContext->linkText.clear();
+ } else {
+ linkContext->linkText = linktext + QLatin1Char('<');
}
}
-void QtXmlToSphinx::handleImageTag(QXmlStreamReader& reader)
+void QtXmlToSphinx::handleLinkEnd(LinkContext *linkContext)
{
- QXmlStreamReader::TokenType token = reader.tokenType();
- if (token == QXmlStreamReader::StartElement) {
- QString href = reader.attributes().value(QLatin1String("href")).toString();
- QString packageName = m_generator->packageName();
- packageName.replace(QLatin1Char('.'), QLatin1Char('/'));
- QDir dir(m_generator->outputDirectory() + QLatin1Char('/') + packageName);
- QString imgPath = dir.relativeFilePath(m_generator->libSourceDir() + QLatin1String("/doc/src/"))
- + QLatin1Char('/') + href;
-
- if (reader.name() == QLatin1String("image"))
- m_output << INDENT << ".. image:: " << imgPath << endl << endl;
- else
- m_output << ".. image:: " << imgPath << ' ';
+ if (!linkContext->linkText.isEmpty())
+ linkContext->linkTagEnding.prepend(QLatin1Char('>'));
+ m_output << linkContext->linkTag << linkContext->linkText;
+ writeEscapedRstText(m_output, linkContext->linkRef);
+ m_output << linkContext->linkTagEnding;
+}
+
+// Copy images that are placed in a subdirectory "images" under the webxml files
+// by qdoc to a matching subdirectory under the "rst/PySide2/<module>" directory
+static bool copyImage(const QString &href, const QString &docDataDir,
+ const QString &context, const QString &outputDir,
+ QString *errorMessage)
+{
+ const QChar slash = QLatin1Char('/');
+ const int lastSlash = href.lastIndexOf(slash);
+ const QString imagePath = lastSlash != -1 ? href.left(lastSlash) : QString();
+ const QString imageFileName = lastSlash != -1 ? href.right(href.size() - lastSlash - 1) : href;
+ QFileInfo imageSource(docDataDir + slash + href);
+ if (!imageSource.exists()) {
+ QTextStream(errorMessage) << "Image " << href << " does not exist in "
+ << QDir::toNativeSeparators(docDataDir);
+ return false;
+ }
+ // Determine directory from context, "Pyside2.QtGui.QPainter" ->"Pyside2/QtGui".
+ // FIXME: Not perfect yet, should have knowledge about namespaces (DataVis3D) or
+ // nested classes "Pyside2.QtGui.QTouchEvent.QTouchPoint".
+ QString relativeTargetDir = context;
+ const int lastDot = relativeTargetDir.lastIndexOf(QLatin1Char('.'));
+ if (lastDot != -1)
+ relativeTargetDir.truncate(lastDot);
+ relativeTargetDir.replace(QLatin1Char('.'), slash);
+ if (!imagePath.isEmpty())
+ relativeTargetDir += slash + imagePath;
+
+ const QString targetDir = outputDir + slash + relativeTargetDir;
+ const QString targetFileName = targetDir + slash + imageFileName;
+ if (QFileInfo::exists(targetFileName))
+ return true;
+ if (!QFileInfo::exists(targetDir)) {
+ const QDir outDir(outputDir);
+ if (!outDir.mkpath(relativeTargetDir)) {
+ QTextStream(errorMessage) << "Cannot create " << QDir::toNativeSeparators(relativeTargetDir)
+ << " under " << QDir::toNativeSeparators(outputDir);
+ return false;
+ }
+ }
+
+ QFile source(imageSource.absoluteFilePath());
+ if (!source.copy(targetFileName)) {
+ QTextStream(errorMessage) << "Cannot copy " << QDir::toNativeSeparators(source.fileName())
+ << " to " << QDir::toNativeSeparators(targetFileName) << ": "
+ << source.errorString();
+ return false;
}
+ qCDebug(lcShiboken()).noquote().nospace() << __FUNCTION__ << " href=\""
+ << href << "\", context=\"" << context << "\", docDataDir=\""
+ << docDataDir << "\", outputDir=\"" << outputDir << "\", copied \""
+ << source.fileName() << "\"->\"" << targetFileName << '"';
+ return true;
+}
+
+bool QtXmlToSphinx::copyImage(const QString &href) const
+{
+ QString errorMessage;
+ const bool result =
+ ::copyImage(href, m_generator->docDataDir(), m_context,
+ m_generator->outputDirectory(), &errorMessage);
+ if (!result)
+ qCWarning(lcShiboken, "%s", qPrintable(errorMessage));
+ return result;
+}
+
+void QtXmlToSphinx::handleImageTag(QXmlStreamReader& reader)
+{
+ if (reader.tokenType() != QXmlStreamReader::StartElement)
+ return;
+ const QString href = reader.attributes().value(QLatin1String("href")).toString();
+ if (copyImage(href))
+ m_output << INDENT << ".. image:: " << href << endl << endl;
+}
+
+void QtXmlToSphinx::handleInlineImageTag(QXmlStreamReader& reader)
+{
+ if (reader.tokenType() != QXmlStreamReader::StartElement)
+ return;
+ const QString href = reader.attributes().value(QLatin1String("href")).toString();
+ if (!copyImage(href))
+ return;
+ // Handle inline images by substitution references. Insert a unique tag
+ // enclosed by '|' and define it further down. Determine tag from the base
+ //file name with number.
+ QString tag = href;
+ int pos = tag.lastIndexOf(QLatin1Char('/'));
+ if (pos != -1)
+ tag.remove(0, pos + 1);
+ pos = tag.indexOf(QLatin1Char('.'));
+ if (pos != -1)
+ tag.truncate(pos);
+ tag += QString::number(m_inlineImages.size() + 1);
+ m_inlineImages.append(InlineImage{tag, href});
+ m_output << '|' << tag << '|' << ' ';
}
void QtXmlToSphinx::handleRawTag(QXmlStreamReader& reader)
@@ -714,8 +1000,8 @@ void QtXmlToSphinx::handleRawTag(QXmlStreamReader& reader)
QString format = reader.attributes().value(QLatin1String("format")).toString();
m_output << INDENT << ".. raw:: " << format.toLower() << endl << endl;
} else if (token == QXmlStreamReader::Characters) {
- QStringList lst(reader.text().toString().split(QLatin1Char('\n')));
- foreach(QString row, lst)
+ const QVector<QStringRef> lst(reader.text().split(QLatin1Char('\n')));
+ for (const QStringRef &row : lst)
m_output << INDENT << INDENT << row << endl;
} else if (token == QXmlStreamReader::EndElement) {
m_output << endl << endl;
@@ -726,12 +1012,11 @@ void QtXmlToSphinx::handleCodeTag(QXmlStreamReader& reader)
{
QXmlStreamReader::TokenType token = reader.tokenType();
if (token == QXmlStreamReader::StartElement) {
- QString format = reader.attributes().value(QLatin1String("format")).toString();
m_output << INDENT << "::" << endl << endl;
INDENT.indent++;
} else if (token == QXmlStreamReader::Characters) {
- QStringList lst(reader.text().toString().split(QLatin1Char('\n')));
- foreach(QString row, lst)
+ const QVector<QStringRef> lst(reader.text().split(QLatin1Char('\n')));
+ for (const QStringRef &row : lst)
m_output << INDENT << INDENT << row << endl;
} else if (token == QXmlStreamReader::EndElement) {
m_output << endl << endl;
@@ -793,22 +1078,17 @@ void QtXmlToSphinx::handleQuoteFileTag(QXmlStreamReader& reader)
QXmlStreamReader::TokenType token = reader.tokenType();
if (token == QXmlStreamReader::Characters) {
QString location = reader.text().toString();
- QString identifier;
location.prepend(m_generator->libSourceDir() + QLatin1Char('/'));
- QString code = readFromLocation(location, identifier);
-
+ QString errorMessage;
+ QString code = readFromLocation(location, QString(), &errorMessage);
+ if (!errorMessage.isEmpty())
+ qCWarning(lcShiboken(), "%s", qPrintable(msgTagWarning(reader, m_context, m_lastTagName, errorMessage)));
m_output << INDENT << "::\n\n";
Indentation indentation(INDENT);
- if (code.isEmpty()) {
+ if (code.isEmpty())
m_output << INDENT << "<Code snippet \"" << location << "\" not found>" << endl;
- } else {
- foreach (QString line, code.split(QLatin1Char('\n'))) {
- if (!QString(line).trimmed().isEmpty())
- m_output << INDENT << line;
-
- m_output << endl;
- }
- }
+ else
+ formatCode(m_output, code, INDENT);
m_output << endl;
}
}
@@ -877,13 +1157,14 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
}
// calc width and height of each column and row
- QVector<int> colWidths(table.first().count());
+ const int headerColumnCount = table.constFirst().count();
+ QVector<int> colWidths(headerColumnCount);
QVector<int> rowHeights(table.count());
for (int i = 0, maxI = table.count(); i < maxI; ++i) {
const QtXmlToSphinx::TableRow& row = table[i];
for (int j = 0, maxJ = std::min(row.count(), colWidths.size()); j < maxJ; ++j) {
- QStringList rowLines = row[j].data.split(QLatin1Char('\n')); // cache this would be a good idea
- foreach (QString str, rowLines)
+ const QVector<QStringRef> rowLines = row[j].data.splitRef(QLatin1Char('\n')); // cache this would be a good idea
+ for (const QStringRef &str : rowLines)
colWidths[j] = std::max(colWidths[j], str.count());
rowHeights[i] = std::max(rowHeights[i], row[j].data.count(QLatin1Char('\n')) + 1);
}
@@ -895,7 +1176,7 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
// create a horizontal line to be used later.
QString horizontalLine = QLatin1String("+");
for (int i = 0, max = colWidths.count(); i < max; ++i) {
- horizontalLine += createRepeatedChar(colWidths[i], '-');
+ horizontalLine += QString(colWidths.at(i), QLatin1Char('-'));
horizontalLine += QLatin1Char('+');
}
@@ -905,7 +1186,7 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
// print line
s << INDENT << '+';
- for (int col = 0, max = colWidths.count(); col < max; ++col) {
+ for (int col = 0; col < headerColumnCount; ++col) {
char c;
if (col >= row.length() || row[col].rowSpan == -1)
c = ' ';
@@ -913,16 +1194,17 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
c = '=';
else
c = '-';
- s << createRepeatedChar(colWidths[col], c) << '+';
+ s << Pad(c, colWidths.at(col)) << '+';
}
s << endl;
// Print the table cells
for (int rowLine = 0; rowLine < rowHeights[i]; ++rowLine) { // for each line in a row
- for (int j = 0, maxJ = std::min(row.count(), colWidths.size()); j < maxJ; ++j) { // for each column
+ int j = 0;
+ for (int maxJ = std::min(row.count(), headerColumnCount); j < maxJ; ++j) { // for each column
const QtXmlToSphinx::TableCell& cell = row[j];
- QStringList rowLines = cell.data.split(QLatin1Char('\n')); // FIXME: Cache this!!!
+ const QVector<QStringRef> rowLines = cell.data.splitRef(QLatin1Char('\n')); // FIXME: Cache this!!!
if (!j) // First column, so we need print the identation
s << INDENT;
@@ -930,10 +1212,13 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
s << '|';
else
s << ' ';
- s << qSetFieldWidth(colWidths[j]) << left;
- s << (rowLine < rowLines.count() ? rowLines[rowLine] : QString());
- s << qSetFieldWidth(0);
+ if (rowLine < rowLines.count())
+ s << qSetFieldWidth(colWidths[j]) << left << rowLines.at(rowLine) << qSetFieldWidth(0);
+ else
+ s << Pad(' ', colWidths.at(j));
}
+ for ( ; j < headerColumnCount; ++j) // pad
+ s << '|' << Pad(' ', colWidths.at(j));
s << '|' << endl;
}
}
@@ -975,8 +1260,8 @@ static QString getFuncName(const AbstractMetaFunction* cppFunc) {
hashInitialized = true;
}
- QHash<QString, QString>::const_iterator it = operatorsHash.find(cppFunc->name());
- QString result = it != operatorsHash.end() ? it.value() : cppFunc->name();
+ QHash<QString, QString>::const_iterator it = operatorsHash.constFind(cppFunc->name());
+ QString result = it != operatorsHash.cend() ? it.value() : cppFunc->name();
result.replace(QLatin1String("::"), QLatin1String("."));
return result;
}
@@ -1007,7 +1292,8 @@ QString QtDocGenerator::fileNameForContext(GeneratorContext &context) const
}
}
-void QtDocGenerator::writeFormatedText(QTextStream& s, const Documentation& doc, const AbstractMetaClass* metaClass)
+void QtDocGenerator::writeFormattedText(QTextStream &s, const Documentation &doc,
+ const AbstractMetaClass *metaClass)
{
QString metaClassName;
@@ -1018,17 +1304,24 @@ void QtDocGenerator::writeFormatedText(QTextStream& s, const Documentation& doc,
QtXmlToSphinx x(this, doc.value(), metaClassName);
s << x;
} else {
- QStringList lines = doc.value().split(QLatin1Char('\n'));
- QRegExp regex(QLatin1String("\\S")); // non-space character
+ const QString &value = doc.value();
+ const QVector<QStringRef> lines = value.splitRef(QLatin1Char('\n'));
int typesystemIndentation = std::numeric_limits<int>().max();
- // check how many spaces must be removed from the begining of each line
- foreach (QString line, lines) {
- int idx = line.indexOf(regex);
- if (idx >= 0)
- typesystemIndentation = qMin(typesystemIndentation, idx);
+ // check how many spaces must be removed from the beginning of each line
+ for (const QStringRef &line : lines) {
+ const auto it = std::find_if(line.cbegin(), line.cend(),
+ [] (QChar c) { return !c.isSpace(); });
+ if (it != line.cend())
+ typesystemIndentation = qMin(typesystemIndentation, int(it - line.cbegin()));
+ }
+ if (typesystemIndentation == std::numeric_limits<int>().max())
+ typesystemIndentation = 0;
+ for (const QStringRef &line : lines) {
+ s << INDENT
+ << (typesystemIndentation > 0 && typesystemIndentation < line.size()
+ ? line.right(line.size() - typesystemIndentation) : line)
+ << endl;
}
- foreach (QString line, lines)
- s << INDENT << line.remove(0, typesystemIndentation) << endl;
}
s << endl;
@@ -1037,7 +1330,7 @@ void QtDocGenerator::writeFormatedText(QTextStream& s, const Documentation& doc,
static void writeInheritedByList(QTextStream& s, const AbstractMetaClass* metaClass, const AbstractMetaClassList& allClasses)
{
AbstractMetaClassList res;
- foreach (AbstractMetaClass* c, allClasses) {
+ for (AbstractMetaClass *c : allClasses) {
if (c != metaClass && c->inheritsFrom(metaClass))
res << c;
}
@@ -1047,7 +1340,7 @@ static void writeInheritedByList(QTextStream& s, const AbstractMetaClass* metaCl
s << "**Inherited by:** ";
QStringList classes;
- foreach (AbstractMetaClass* c, res)
+ for (AbstractMetaClass *c : qAsConst(res))
classes << QLatin1String(":ref:`") + getClassTargetFullName(c, false) + QLatin1Char('`');
s << classes.join(QLatin1String(", ")) << endl << endl;
}
@@ -1067,9 +1360,9 @@ void QtDocGenerator::generateClass(QTextStream &s, GeneratorContext &classContex
s << ".. _" << className << ":" << endl << endl;
s << className << endl;
- s << createRepeatedChar(className.count(), '*') << endl << endl;
+ s << Pad('*', className.count()) << endl << endl;
- s << ".. inheritance-diagram:: " << className << endl
+ s << ".. inheritance-diagram:: " << getClassTargetFullName(metaClass, true) << endl
<< " :parts: 2" << endl << endl; // TODO: This would be a parameter in the future...
@@ -1084,12 +1377,13 @@ void QtDocGenerator::generateClass(QTextStream &s, GeneratorContext &classContex
AbstractMetaFunctionList functionList = metaClass->functions();
qSort(functionList.begin(), functionList.end(), functionSort);
- s << "Detailed Description\n"
- "--------------------\n\n";
+ s << endl
+ << "Detailed Description\n"
+ "--------------------\n\n";
writeInjectDocumentation(s, TypeSystem::DocModificationPrepend, metaClass, 0);
if (!writeInjectDocumentation(s, TypeSystem::DocModificationReplace, metaClass, 0))
- writeFormatedText(s, metaClass->documentation(), metaClass);
+ writeFormattedText(s, metaClass->documentation(), metaClass);
if (!metaClass->isNamespace())
writeConstructors(s, metaClass);
@@ -1098,7 +1392,7 @@ void QtDocGenerator::generateClass(QTextStream &s, GeneratorContext &classContex
writeFields(s, metaClass);
- foreach (AbstractMetaFunction* func, functionList) {
+ for (AbstractMetaFunction *func : qAsConst(functionList)) {
if (shouldSkip(func))
continue;
@@ -1121,7 +1415,8 @@ void QtDocGenerator::writeFunctionList(QTextStream& s, const AbstractMetaClass*
QStringList slotList;
QStringList staticFunctionList;
- foreach (AbstractMetaFunction* func, cppClass->functions()) {
+ const AbstractMetaFunctionList &classFunctions = cppClass->functions();
+ for (AbstractMetaFunction *func : classFunctions) {
if (shouldSkip(func))
continue;
@@ -1157,9 +1452,9 @@ void QtDocGenerator::writeFunctionList(QTextStream& s, const AbstractMetaClass*
if ((functionList.size() > 0) || (staticFunctionList.size() > 0)) {
QtXmlToSphinx::Table functionTable;
- QtXmlToSphinx::TableRow row;
- s << "Synopsis" << endl
+ s << endl
+ << "Synopsis" << endl
<< "--------" << endl << endl;
writeFunctionBlock(s, QLatin1String("Functions"), functionList);
@@ -1180,8 +1475,8 @@ void QtDocGenerator::writeFunctionBlock(QTextStream& s, const QString& title, QS
s << ".. container:: function_list" << endl << endl;
Indentation indentation(INDENT);
- foreach (QString func, functions)
- s << '*' << INDENT << func << endl;
+ for (const QString &func : qAsConst(functions))
+ s << INDENT << '*' << ' ' << func << endl;
s << endl << endl;
}
@@ -1191,9 +1486,10 @@ void QtDocGenerator::writeEnums(QTextStream& s, const AbstractMetaClass* cppClas
{
static const QString section_title = QLatin1String(".. attribute:: ");
- foreach (AbstractMetaEnum* en, cppClass->enums()) {
+ const AbstractMetaEnumList &enums = cppClass->enums();
+ for (AbstractMetaEnum *en : enums) {
s << section_title << getClassTargetFullName(cppClass) << '.' << en->name() << endl << endl;
- writeFormatedText(s, en->documentation(), cppClass);
+ writeFormattedText(s, en->documentation(), cppClass);
if (en->typeEntry() && (en->typeEntry()->version() != 0))
s << ".. note:: This enum was introduced or modified in Qt " << en->typeEntry()->version() << endl;
@@ -1205,10 +1501,11 @@ void QtDocGenerator::writeFields(QTextStream& s, const AbstractMetaClass* cppCla
{
static const QString section_title = QLatin1String(".. attribute:: ");
- foreach (AbstractMetaField* field, cppClass->fields()) {
+ const AbstractMetaFieldList &fields = cppClass->fields();
+ for (AbstractMetaField *field : fields) {
s << section_title << getClassTargetFullName(cppClass) << "." << field->name() << endl << endl;
//TODO: request for member ‘documentation’ is ambiguous
- writeFormatedText(s, field->AbstractMetaAttributes::documentation(), cppClass);
+ writeFormattedText(s, field->AbstractMetaAttributes::documentation(), cppClass);
}
}
@@ -1218,14 +1515,15 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass*
static const QString sectionTitleSpace = QString(sectionTitle.size(), QLatin1Char(' '));
AbstractMetaFunctionList lst = cppClass->queryFunctions(AbstractMetaClass::Constructors | AbstractMetaClass::Visible);
+ for (int i = lst.size() - 1; i >= 0; --i) {
+ if (lst.at(i)->isModifiedRemoved() || lst.at(i)->functionType() == AbstractMetaFunction::MoveConstructorFunction)
+ lst.removeAt(i);
+ }
bool first = true;
QHash<QString, AbstractMetaArgument*> arg_map;
- foreach(AbstractMetaFunction* func, lst) {
- if (func->isModifiedRemoved())
- continue;
-
+ for (AbstractMetaFunction *func : qAsConst(lst)) {
if (first) {
first = false;
s << sectionTitle;
@@ -1233,8 +1531,8 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass*
s << sectionTitleSpace;
}
writeFunction(s, false, cppClass, func);
- foreach(AbstractMetaArgument* arg, func->arguments())
- {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
if (!arg_map.contains(arg->name())) {
arg_map.insert(arg->name(), arg);
}
@@ -1243,16 +1541,15 @@ void QtDocGenerator::writeConstructors(QTextStream& s, const AbstractMetaClass*
s << endl;
- foreach (AbstractMetaArgument* arg, arg_map.values()) {
+ for (QHash<QString, AbstractMetaArgument*>::const_iterator it = arg_map.cbegin(), end = arg_map.cend(); it != end; ++it) {
Indentation indentation(INDENT);
- writeParamerteType(s, cppClass, arg);
+ writeParameterType(s, cppClass, it.value());
}
s << endl;
- foreach (AbstractMetaFunction* func, lst) {
- writeFormatedText(s, func->documentation(), cppClass);
- }
+ for (AbstractMetaFunction *func : qAsConst(lst))
+ writeFormattedText(s, func->documentation(), cppClass);
}
QString QtDocGenerator::parseArgDocStyle(const AbstractMetaClass* cppClass, const AbstractMetaFunction* func)
@@ -1260,7 +1557,8 @@ QString QtDocGenerator::parseArgDocStyle(const AbstractMetaClass* cppClass, cons
QString ret;
int optArgs = 0;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
@@ -1311,7 +1609,7 @@ void QtDocGenerator::writeDocSnips(QTextStream &s,
invalidStrings << QLatin1String("*") << QLatin1String("//") << QLatin1String("/*") << QLatin1String("*/");
- foreach (CodeSnip snip, codeSnips) {
+ for (const CodeSnip &snip : codeSnips) {
if ((snip.position != position) ||
!(snip.language & language))
continue;
@@ -1325,14 +1623,13 @@ void QtDocGenerator::writeDocSnips(QTextStream &s,
break;
QString codeBlock = code.mid(startBlock, endBlock - startBlock);
- QStringList rows = codeBlock.split(QLatin1Char('\n'));
+ const QStringList rows = codeBlock.split(QLatin1Char('\n'));
int currenRow = 0;
int offset = 0;
- foreach(QString row, rows) {
- foreach(QString invalidString, invalidStrings) {
- row = row.remove(invalidString);
- }
+ for (QString row : rows) {
+ for (const QString &invalidString : qAsConst(invalidStrings))
+ row.remove(invalidString);
if (row.trimmed().size() == 0) {
if (currenRow == 0)
@@ -1370,7 +1667,8 @@ bool QtDocGenerator::writeInjectDocumentation(QTextStream& s,
Indentation indentation(INDENT);
bool didSomething = false;
- foreach (DocModification mod, cppClass->typeEntry()->docModifications()) {
+ const DocModificationList &mods = cppClass->typeEntry()->docModifications();
+ for (const DocModification &mod : mods) {
if (mod.mode() == mode) {
bool modOk = func ? mod.signature() == func->minimalSignature() : mod.signature().isEmpty();
@@ -1378,15 +1676,15 @@ bool QtDocGenerator::writeInjectDocumentation(QTextStream& s,
Documentation doc;
Documentation::Format fmt;
- if (mod.format == TypeSystem::NativeCode)
+ if (mod.format() == TypeSystem::NativeCode)
fmt = Documentation::Native;
- else if (mod.format == TypeSystem::TargetLangCode)
+ else if (mod.format() == TypeSystem::TargetLangCode)
fmt = Documentation::Target;
else
continue;
doc.setValue(mod.code() , fmt);
- writeFormatedText(s, doc, cppClass);
+ writeFormattedText(s, doc, cppClass);
didSomething = true;
}
}
@@ -1462,31 +1760,34 @@ QString QtDocGenerator::translateToPythonType(const AbstractMetaType* type, cons
return strType;
}
-void QtDocGenerator::writeParamerteType(QTextStream& s, const AbstractMetaClass* cppClass, const AbstractMetaArgument* arg)
+void QtDocGenerator::writeParameterType(QTextStream& s, const AbstractMetaClass* cppClass, const AbstractMetaArgument* arg)
{
s << INDENT << ":param " << arg->name() << ": "
<< translateToPythonType(arg->type(), cppClass) << endl;
}
-void QtDocGenerator::writeFunctionParametersType(QTextStream& s, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func)
+void QtDocGenerator::writeFunctionParametersType(QTextStream &s, const AbstractMetaClass *cppClass,
+ const AbstractMetaFunction *func)
{
Indentation indentation(INDENT);
s << endl;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &funcArgs = func->arguments();
+ for (AbstractMetaArgument *arg : funcArgs) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
- writeParamerteType(s, cppClass, arg);
+ writeParameterType(s, cppClass, arg);
}
if (!func->isConstructor() && func->type()) {
QString retType;
// check if the return type was modified
- foreach (FunctionModification mod, func->modifications()) {
- foreach (ArgumentModification argMod, mod.argument_mods) {
+ const FunctionModificationList &mods = func->modifications();
+ for (const FunctionModification &mod : mods) {
+ for (const ArgumentModification &argMod : mod.argument_mods) {
if (argMod.index == 0) {
retType = argMod.modified_type;
break;
@@ -1515,7 +1816,7 @@ void QtDocGenerator::writeFunction(QTextStream& s, bool writeDoc, const Abstract
s << endl;
writeInjectDocumentation(s, TypeSystem::DocModificationPrepend, cppClass, func);
if (!writeInjectDocumentation(s, TypeSystem::DocModificationReplace, cppClass, func))
- writeFormatedText(s, func->documentation(), cppClass);
+ writeFormattedText(s, func->documentation(), cppClass);
writeInjectDocumentation(s, TypeSystem::DocModificationAppend, cppClass, func);
}
}
@@ -1526,7 +1827,7 @@ static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 4
TocMap tocMap;
QChar Q = QLatin1Char('Q');
QChar idx;
- foreach (QString item, items) {
+ for (QString item : items) {
if (item.isEmpty())
continue;
if (item.startsWith(Q) && item.length() > 1)
@@ -1551,7 +1852,7 @@ static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 4
ss << "**" << it.key() << "**" << endl << endl;
i += 2; // a letter title is equivalent to two entries in space
- foreach (QString item, it.value()) {
+ for (const QString &item : qAsConst(it.value())) {
ss << "* :doc:`" << item << "`" << endl;
++i;
@@ -1595,7 +1896,7 @@ bool QtDocGenerator::finishGeneration()
QString title = it.key();
s << title << endl;
- s << createRepeatedChar(title.length(), '*') << endl << endl;
+ s << Pad('*', title.length()) << endl << endl;
/* Avoid showing "Detailed Description for *every* class in toc tree */
Indentation indentation(INDENT);
@@ -1628,7 +1929,7 @@ bool QtDocGenerator::finishGeneration()
s << INDENT << ".. toctree::" << endl;
Indentation deeperIndentation(INDENT);
s << INDENT << ":maxdepth: 1" << endl << endl;
- foreach (QString className, it.value())
+ for (const QString &className : qAsConst(it.value()))
s << INDENT << className << endl;
s << endl << endl;
}
@@ -1686,19 +1987,18 @@ bool QtDocGenerator::doSetup(const QMap<QString, QString>& args)
}
-QMap<QString, QString> QtDocGenerator::options() const
+Generator::OptionDescriptions QtDocGenerator::options() const
{
- QMap<QString, QString> options;
- options.insert(QLatin1String("doc-parser"),
- QLatin1String("The documentation parser used to interpret the documentation input files (qdoc3|doxygen)"));
- options.insert(QLatin1String("library-source-dir"),
- QLatin1String("Directory where library source code is located"));
- options.insert(QLatin1String("documentation-data-dir"),
- QLatin1String("Directory with XML files generated by documentation tool (qdoc3 or Doxygen)"));
- options.insert(QLatin1String("documentation-code-snippets-dir"),
- QLatin1String("Directory used to search code snippets used by the documentation"));
- options.insert(QLatin1String("documentation-extra-sections-dir"),
- QLatin1String("Directory used to search for extra documentation sections"));
- return options;
+ return OptionDescriptions()
+ << qMakePair(QLatin1String("doc-parser"),
+ QLatin1String("The documentation parser used to interpret the documentation input files (qdoc3|doxygen)"))
+ << qMakePair(QLatin1String("documentation-code-snippets-dir"),
+ QLatin1String("Directory used to search code snippets used by the documentation"))
+ << qMakePair(QLatin1String("documentation-data-dir"),
+ QLatin1String("Directory with XML files generated by documentation tool (qdoc3 or Doxygen)"))
+ << qMakePair(QLatin1String("documentation-extra-sections-dir"),
+ QLatin1String("Directory used to search for extra documentation sections"))
+ << qMakePair(QLatin1String("library-source-dir"),
+ QLatin1String("Directory where library source code is located"));
}
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
index fa8524b21..af26b7fab 100644
--- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
+++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
@@ -30,6 +30,7 @@
#include <QtCore/QStack>
#include <QtCore/QHash>
+#include <QtCore/QScopedPointer>
#include <QtCore/QTextStream>
#include <QXmlStreamReader>
#include "generator.h"
@@ -48,6 +49,12 @@ class QtDocGenerator;
class QtXmlToSphinx
{
public:
+ struct InlineImage
+ {
+ QString tag;
+ QString href;
+ };
+
struct TableCell
{
short rowSpan;
@@ -101,8 +108,19 @@ public:
}
private:
- QString resolveContextForMethod(const QString& methodName);
- QString expandFunction(const QString& function);
+ struct LinkContext
+ {
+ LinkContext(const QString &ref, const QString &lType) : linkRef(ref), type(lType) {}
+
+ QString linkTag;
+ QString linkRef;
+ QString linkText;
+ QString linkTagEnding;
+ QString type;
+ };
+
+ QString resolveContextForMethod(const QString& methodName) const;
+ QString expandFunction(const QString& function) const;
QString transform(const QString& doc);
void handleHeadingTag(QXmlStreamReader& reader);
@@ -115,6 +133,7 @@ private:
void handleDotsTag(QXmlStreamReader& reader);
void handleLinkTag(QXmlStreamReader& reader);
void handleImageTag(QXmlStreamReader& reader);
+ void handleInlineImageTag(QXmlStreamReader& reader);
void handleListTag(QXmlStreamReader& reader);
void handleTermTag(QXmlStreamReader& reader);
void handleSuperScriptTag(QXmlStreamReader& reader);
@@ -133,6 +152,10 @@ private:
void handleUselessTag(QXmlStreamReader& reader);
void handleAnchorTag(QXmlStreamReader& reader);
+ LinkContext *handleLinkStart(const QString &type, const QString &ref) const;
+ void handleLinkText(LinkContext *linkContext, QString linktext) const;
+ void handleLinkEnd(LinkContext *linkContext);
+
typedef void (QtXmlToSphinx::*TagHandler)(QXmlStreamReader&);
QHash<QString, TagHandler> m_handlerMap;
QStack<TagHandler> m_handlers;
@@ -143,6 +166,8 @@ private:
Table m_currentTable;
+ QScopedPointer<LinkContext> m_linkContext; // for <link>
+ QScopedPointer<LinkContext> m_seeAlsoContext; // for <see-also>foo()</see-also>
bool m_tableHasHeader;
QString m_context;
QtDocGenerator* m_generator;
@@ -150,12 +175,16 @@ private:
bool m_insideItalic;
QString m_lastTagName;
QString m_opened_anchor;
+ QVector<InlineImage> m_inlineImages;
- QString readFromLocations(const QStringList& locations, const QString& path, const QString& identifier);
- QString readFromLocation(const QString& location, const QString& identifier, bool* ok = 0);
+ QString readFromLocations(const QStringList &locations, const QString &path,
+ const QString &identifier, QString *errorMessage);
+ QString readFromLocation(const QString &location, const QString &identifier,
+ QString *errorMessage);
void pushOutputBuffer();
QString popOutputBuffer();
void writeTable(Table& table);
+ bool copyImage(const QString &href) const;
};
inline QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx& xmlToSphinx)
@@ -179,6 +208,8 @@ public:
return m_libSourceDir;
}
+ QString docDataDir() const { return m_docDataDir; }
+
bool doSetup(const QMap<QString, QString>& args);
const char* name() const
@@ -186,7 +217,7 @@ public:
return "QtDocGenerator";
}
- QMap<QString, QString> options() const;
+ OptionDescriptions options() const;
QStringList codeSnippetDirs() const
{
@@ -209,13 +240,15 @@ private:
void writeArguments(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaFunction *func);
void writeFunctionSignature(QTextStream& s, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func);
void writeFunction(QTextStream& s, bool writeDoc, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func);
- void writeFunctionParametersType(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaFunction* func);
+ void writeFunctionParametersType(QTextStream &s, const AbstractMetaClass *cppClass,
+ const AbstractMetaFunction* func);
void writeFunctionList(QTextStream& s, const AbstractMetaClass* cppClass);
void writeFunctionBlock(QTextStream& s, const QString& title, QStringList& functions);
- void writeParamerteType(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaArgument *arg);
+ void writeParameterType(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaArgument *arg);
void writeConstructors(QTextStream &s, const AbstractMetaClass *cppClass);
- void writeFormatedText(QTextStream& s, const Documentation& doc, const AbstractMetaClass* metaclass = 0);
+ void writeFormattedText(QTextStream &s, const Documentation &doc,
+ const AbstractMetaClass *metaclass = nullptr);
bool writeInjectDocumentation(QTextStream& s, TypeSystem::DocModificationMode mode, const AbstractMetaClass* cppClass, const AbstractMetaFunction* func);
void writeDocSnips(QTextStream &s, const CodeSnipList &codeSnips, TypeSystem::CodeSnipPosition position, TypeSystem::Language language);
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
index ce74c9887..be42adb0f 100644
--- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
@@ -36,6 +36,7 @@
#include <QtCore/QDir>
#include <QtCore/QMetaObject>
+#include <QtCore/QRegularExpression>
#include <QtCore/QTextStream>
#include <QtCore/QDebug>
#include <QMetaType>
@@ -153,13 +154,15 @@ QString CppGenerator::fileNameForContext(GeneratorContext &context) const
}
}
-QList<AbstractMetaFunctionList> CppGenerator::filterGroupedOperatorFunctions(const AbstractMetaClass* metaClass,
+QVector<AbstractMetaFunctionList> CppGenerator::filterGroupedOperatorFunctions(const AbstractMetaClass* metaClass,
uint queryIn)
{
// ( func_name, num_args ) => func_list
- QMap<QPair<QString, int >, AbstractMetaFunctionList> results;
+ typedef QMap<QPair<QString, int >, AbstractMetaFunctionList> ResultMap;
+ ResultMap results;
const AbstractMetaClass::OperatorQueryOptions query(queryIn);
- foreach (AbstractMetaFunction* func, metaClass->operatorOverloads(query)) {
+ const AbstractMetaFunctionList &funcs = metaClass->operatorOverloads(query);
+ for (AbstractMetaFunction *func : funcs) {
if (func->isModifiedRemoved()
|| func->usesRValueReferences()
|| func->name() == QLatin1String("operator[]")
@@ -176,7 +179,11 @@ QList<AbstractMetaFunctionList> CppGenerator::filterGroupedOperatorFunctions(con
QPair<QString, int > op(func->name(), args);
results[op].append(func);
}
- return results.values();
+ QVector<AbstractMetaFunctionList> result;
+ result.reserve(results.size());
+ for (ResultMap::const_iterator it = results.cbegin(), end = results.cend(); it != end; ++it)
+ result.append(it.value());
+ return result;
}
bool CppGenerator::hasBoolCast(const AbstractMetaClass* metaClass) const
@@ -203,6 +210,13 @@ static const char includeQDebug[] =
"#endif\n"
"#include <QDebug>\n";
+static QString chopType(QString s)
+{
+ if (s.endsWith(QLatin1String("_Type")))
+ s.chop(5);
+ return s;
+}
+
/*!
Function used to write the class generated binding code on the buffer
\param s the output buffer
@@ -252,7 +266,8 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
s << endl << "// main header" << endl << "#include \"" << headerfile << '"' << endl;
s << endl << "// inner classes" << endl;
- foreach (AbstractMetaClass* innerClass, metaClass->innerClasses()) {
+ const AbstractMetaClassList &innerClasses = metaClass->innerClasses();
+ for (AbstractMetaClass *innerClass : innerClasses) {
GeneratorContext innerClassContext(innerClass);
if (shouldGenerate(innerClass)) {
QString headerfile = fileNameForContext(innerClassContext);
@@ -262,16 +277,16 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
}
AbstractMetaEnumList classEnums = metaClass->enums();
- foreach (AbstractMetaClass* innerClass, metaClass->innerClasses())
+ for (AbstractMetaClass *innerClass : innerClasses)
lookForEnumsInClassesNotToBeGenerated(classEnums, innerClass);
//Extra includes
s << endl << "// Extra includes" << endl;
- QList<Include> includes = metaClass->typeEntry()->extraIncludes();
- foreach (AbstractMetaEnum* cppEnum, classEnums)
+ QVector<Include> includes = metaClass->typeEntry()->extraIncludes();
+ for (AbstractMetaEnum *cppEnum : qAsConst(classEnums))
includes.append(cppEnum->typeEntry()->extraIncludes());
qSort(includes.begin(), includes.end());
- foreach (const Include &inc, includes)
+ for (const Include &inc : qAsConst(includes))
s << inc.toString() << endl;
s << endl;
@@ -324,15 +339,19 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
s << "}\n\n";
}
- foreach (const AbstractMetaFunction* func, filterFunctions(metaClass)) {
- if ((func->isPrivate() && !visibilityModifiedToPrivate(func))
- || (func->isModifiedRemoved() && !func->isAbstract()))
+ const AbstractMetaFunctionList &funcs = filterFunctions(metaClass);
+ for (const AbstractMetaFunction *func : funcs) {
+ const bool notAbstract = !func->isAbstract();
+ if ((func->isPrivate() && notAbstract && !visibilityModifiedToPrivate(func))
+ || (func->isModifiedRemoved() && notAbstract))
continue;
- if (func->functionType() == AbstractMetaFunction::ConstructorFunction && !func->isUserAdded())
+ if (func->functionType() == AbstractMetaFunction::ConstructorFunction && !func->isUserAdded()) {
writeConstructorNative(s, func);
- else if ((!avoidProtectedHack() || !metaClass->hasPrivateDestructor())
- && (func->isVirtual() || func->isAbstract()))
+ } else if ((!avoidProtectedHack() || !metaClass->hasPrivateDestructor())
+ && ((func->isVirtual() || func->isAbstract())
+ && (func->attributes() & AbstractMetaAttributes::FinalCppMethod) == 0)) {
writeVirtualMethodNative(s, func);
+ }
}
if (!avoidProtectedHack() || !metaClass->hasPrivateDestructor()) {
@@ -357,7 +376,7 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
for (FunctionGroupMapIt it = functionGroups.cbegin(), end = functionGroups.cend(); it != end; ++it) {
AbstractMetaFunctionList overloads;
QSet<QString> seenSignatures;
- foreach (AbstractMetaFunction* func, it.value()) {
+ for (AbstractMetaFunction *func : it.value()) {
if (!func->isAssignmentOperator()
&& !func->usesRValueReferences()
&& !func->isCastOperator()
@@ -375,7 +394,7 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
if (overloads.isEmpty())
continue;
- const AbstractMetaFunction* rfunc = overloads.first();
+ const AbstractMetaFunction* rfunc = overloads.constFirst();
if (m_sequenceProtocol.contains(rfunc->name()) || m_mappingProtocol.contains(rfunc->name()))
continue;
@@ -411,7 +430,7 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
AbstractMetaType *pointerToInnerType =
buildAbstractMetaTypeFromString(pointerToInnerTypeName);
- AbstractMetaFunction *mutableRfunc = overloads.first();
+ AbstractMetaFunction *mutableRfunc = overloads.constFirst();
mutableRfunc->replaceType(pointerToInnerType);
} else if (smartPointerTypeEntry->refCountMethodName().isEmpty()
|| smartPointerTypeEntry->refCountMethodName() != rfunc->name()) {
@@ -434,8 +453,7 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
}
}
- QString className = cpythonTypeName(metaClass);
- className.remove(QRegExp(QLatin1String("_Type$")));
+ const QString className = chopType(cpythonTypeName(metaClass));
if (metaClass->typeEntry()->isValue() || metaClass->typeEntry()->isSmartPointer()) {
writeCopyFunction(s, classContext);
@@ -484,15 +502,15 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
}
if (supportsNumberProtocol(metaClass) && !metaClass->typeEntry()->isSmartPointer()) {
- QList<AbstractMetaFunctionList> opOverloads = filterGroupedOperatorFunctions(
+ const QVector<AbstractMetaFunctionList> opOverloads = filterGroupedOperatorFunctions(
metaClass,
AbstractMetaClass::ArithmeticOp
| AbstractMetaClass::LogicalOp
| AbstractMetaClass::BitwiseOp);
- foreach (const AbstractMetaFunctionList &allOverloads, opOverloads) {
+ for (const AbstractMetaFunctionList &allOverloads : opOverloads) {
AbstractMetaFunctionList overloads;
- foreach (AbstractMetaFunction* func, allOverloads) {
+ for (AbstractMetaFunction *func : allOverloads) {
if (!func->isModifiedRemoved()
&& !func->isPrivate()
&& (func->ownerClass() == func->implementingClass() || func->isAbstract()))
@@ -521,7 +539,8 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
}
if (shouldGenerateGetSetList(metaClass) && !classContext.forSmartPointer()) {
- foreach (const AbstractMetaField* metaField, metaClass->fields()) {
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (const AbstractMetaField *metaField : fields) {
if (metaField->isStatic())
continue;
writeGetterFunction(s, metaField, classContext);
@@ -532,7 +551,7 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
s << "// Getters and Setters for " << metaClass->name() << endl;
s << "static PyGetSetDef " << cpythonGettersSettersDefinitionName(metaClass) << "[] = {" << endl;
- foreach (const AbstractMetaField* metaField, metaClass->fields()) {
+ for (const AbstractMetaField *metaField : fields) {
if (metaField->isStatic())
continue;
@@ -562,7 +581,7 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext)
writeTypeDiscoveryFunction(s, metaClass);
- foreach (AbstractMetaEnum* cppEnum, classEnums) {
+ for (AbstractMetaEnum *cppEnum : qAsConst(classEnums)) {
if (cppEnum->isAnonymous() || cppEnum->isPrivate())
continue;
@@ -593,7 +612,7 @@ void CppGenerator::writeConstructorNative(QTextStream& s, const AbstractMetaFunc
s << " : ";
writeFunctionCall(s, func);
s << " {" << endl;
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, func->injectedCodeSnips(), TypeSystem::CodeSnipPositionBeginning, TypeSystem::NativeCode, func, lastArg);
s << INDENT << "// ... middle" << endl;
writeCodeSnips(s, func->injectedCodeSnips(), TypeSystem::CodeSnipPositionEnd, TypeSystem::NativeCode, func, lastArg);
@@ -614,7 +633,8 @@ static bool allArgumentsRemoved(const AbstractMetaFunction* func)
{
if (func->arguments().isEmpty())
return false;
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (!func->argumentRemoved(arg->argumentIndex() + 1))
return false;
}
@@ -666,19 +686,24 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
QString defaultReturnExpr;
if (retType) {
- foreach (const FunctionModification &mod, func->modifications()) {
- foreach (const ArgumentModification &argMod, mod.argument_mods) {
+ const FunctionModificationList &mods = func->modifications();
+ for (const FunctionModification &mod : mods) {
+ for (const ArgumentModification &argMod : mod.argument_mods) {
if (argMod.index == 0 && !argMod.replacedDefaultExpression.isEmpty()) {
- QRegExp regex(QLatin1String("%(\\d+)"));
+ static const QRegularExpression regex(QStringLiteral("%(\\d+)"));
+ Q_ASSERT(regex.isValid());
defaultReturnExpr = argMod.replacedDefaultExpression;
- int offset = 0;
- while ((offset = regex.indexIn(defaultReturnExpr, offset)) != -1) {
- int argId = regex.cap(1).toInt() - 1;
+ for (int offset = 0; ; ) {
+ const QRegularExpressionMatch match = regex.match(defaultReturnExpr, offset);
+ if (!match.hasMatch())
+ break;
+ const int argId = match.capturedRef(1).toInt() - 1;
if (argId < 0 || argId > func->arguments().count()) {
qCWarning(lcShiboken) << "The expression used in return value contains an invalid index.";
break;
}
- defaultReturnExpr.replace(regex.cap(0), func->arguments()[argId]->name());
+ defaultReturnExpr.replace(match.captured(0), func->arguments().at(argId)->name());
+ offset = match.capturedStart(1);
}
}
}
@@ -709,7 +734,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
//Write declaration/native injected code
if (func->hasInjectedCode()) {
CodeSnipList snips = func->injectedCodeSnips();
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionDeclaration, TypeSystem::NativeCode, func, lastArg);
s << endl;
}
@@ -732,7 +757,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
CodeSnipList snips;
if (func->hasInjectedCode()) {
snips = func->injectedCodeSnips();
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionBeginning, TypeSystem::ShellCode, func, lastArg);
s << endl;
}
@@ -764,7 +789,8 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
s << "PyTuple_New(0));" << endl;
} else {
QStringList argConversions;
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
@@ -810,8 +836,9 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
bool invalidateReturn = false;
QSet<int> invalidateArgs;
- foreach (const FunctionModification &funcMod, func->modifications()) {
- foreach (const ArgumentModification &argMod, funcMod.argument_mods) {
+ const FunctionModificationList &mods = func->modifications();
+ for (const FunctionModification &funcMod : mods) {
+ for (const ArgumentModification &argMod : funcMod.argument_mods) {
if (argMod.resetAfterUse && !invalidateArgs.contains(argMod.index)) {
invalidateArgs.insert(argMod.index);
s << INDENT << "bool invalidateArg" << argMod.index;
@@ -830,7 +857,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
if (injectedCodeUsesPySelf(func))
s << INDENT << "PyObject* pySelf = BindingManager::instance().retrieveWrapper(this);" << endl;
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionBeginning, TypeSystem::NativeCode, func, lastArg);
s << endl;
}
@@ -908,7 +935,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
Indentation indentation(INDENT);
s << INDENT << "Shiboken::Object::releaseOwnership(" << PYTHON_RETURN_VAR ".object());" << endl;
}
- foreach (int argIndex, invalidateArgs) {
+ for (int argIndex : qAsConst(invalidateArgs)) {
s << INDENT << "if (invalidateArg" << argIndex << ')' << endl;
Indentation indentation(INDENT);
s << INDENT << "Shiboken::Object::invalidate(PyTuple_GET_ITEM(" PYTHON_ARGS ", ";
@@ -916,8 +943,9 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
}
- foreach (const FunctionModification &funcMod, func->modifications()) {
- foreach (const ArgumentModification &argMod, funcMod.argument_mods) {
+ const FunctionModificationList &funcMods = func->modifications();
+ for (const FunctionModification &funcMod : funcMods) {
+ for (const ArgumentModification &argMod : funcMod.argument_mods) {
if (argMod.ownerships.contains(TypeSystem::NativeCode)
&& argMod.index == 0 && argMod.ownerships[TypeSystem::NativeCode] == TypeSystem::CppOwnership) {
s << INDENT << "if (Shiboken::Object::checkType(" PYTHON_RETURN_VAR "))" << endl;
@@ -929,7 +957,7 @@ void CppGenerator::writeVirtualMethodNative(QTextStream&s, const AbstractMetaFun
if (func->hasInjectedCode()) {
s << endl;
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionEnd, TypeSystem::NativeCode, func, lastArg);
}
@@ -1019,7 +1047,6 @@ void CppGenerator::writeEnumConverterFunctions(QTextStream& s, const TypeEntry*
{
if (!enumType)
return;
- QString enumFlagName = enumType->isFlags() ? QLatin1String("flag") : QLatin1String("enum");
QString typeName = fixedCppTypeName(enumType);
QString enumPythonType = cpythonTypeNameExt(enumType);
QString cppTypeName = getFullTypeName(enumType).trimmed();
@@ -1043,7 +1070,8 @@ void CppGenerator::writeEnumConverterFunctions(QTextStream& s, const TypeEntry*
code.clear();
- c << INDENT << "int castCppIn = *((" << cppTypeName << "*)cppIn);" << endl;
+ c << INDENT << "const int castCppIn = int(*reinterpret_cast<const "
+ << cppTypeName << " *>(cppIn));" << endl;
c << INDENT;
c << "return ";
if (enumType->isFlags())
@@ -1090,11 +1118,12 @@ void CppGenerator::writeConverterFunctions(QTextStream &s, const AbstractMetaCla
s << "// Type conversion functions." << endl << endl;
AbstractMetaEnumList classEnums = metaClass->enums();
- foreach (AbstractMetaClass* innerClass, metaClass->innerClasses())
+ const AbstractMetaClassList &innerClasses = metaClass->innerClasses();
+ for (AbstractMetaClass *innerClass : innerClasses)
lookForEnumsInClassesNotToBeGenerated(classEnums, innerClass);
if (!classEnums.isEmpty())
s << "// Python to C++ enum conversion." << endl;
- foreach (const AbstractMetaEnum* metaEnum, classEnums)
+ for (const AbstractMetaEnum *metaEnum : qAsConst(classEnums))
writeEnumConverterFunctions(s, metaEnum);
if (metaClass->isNamespace())
@@ -1204,7 +1233,8 @@ void CppGenerator::writeConverterFunctions(QTextStream &s, const AbstractMetaCla
// Implicit conversions.
AbstractMetaFunctionList implicitConvs;
if (!customConversion || !customConversion->replaceOriginalTargetToNativeConversions()) {
- foreach (AbstractMetaFunction* func, implicitConversions(metaClass->typeEntry())) {
+ const AbstractMetaFunctionList &allImplicitConvs = implicitConversions(metaClass->typeEntry());
+ for (AbstractMetaFunction *func : allImplicitConvs) {
if (!func->isUserAdded())
implicitConvs << func;
}
@@ -1214,7 +1244,7 @@ void CppGenerator::writeConverterFunctions(QTextStream &s, const AbstractMetaCla
s << "// Implicit conversions." << endl;
AbstractMetaType* targetType = buildAbstractMetaTypeFromAbstractMetaClass(metaClass);
- foreach (const AbstractMetaFunction* conv, implicitConvs) {
+ for (const AbstractMetaFunction* conv : qAsConst(implicitConvs)) {
if (conv->isModifiedRemoved())
continue;
@@ -1229,7 +1259,7 @@ void CppGenerator::writeConverterFunctions(QTextStream &s, const AbstractMetaCla
// Constructor that does implicit conversion.
if (!conv->typeReplaced(1).isEmpty())
continue;
- const AbstractMetaType* sourceType = conv->arguments().first()->type();
+ const AbstractMetaType* sourceType = conv->arguments().constFirst()->type();
typeCheck = cpythonCheckFunction(sourceType);
bool isUserPrimitiveWithoutTargetLangName = isUserPrimitive(sourceType)
&& sourceType->typeEntry()->targetLangApiName() == sourceType->typeEntry()->name();
@@ -1273,7 +1303,7 @@ void CppGenerator::writeConverterFunctions(QTextStream &s, const AbstractMetaCla
}
const AbstractMetaType* sourceType = conv->isConversionOperator()
? buildAbstractMetaTypeFromAbstractMetaClass(conv->ownerClass())
- : conv->arguments().first()->type();
+ : conv->arguments().constFirst()->type();
writePythonToCppConversionFunctions(s, sourceType, targetType, typeCheck, toCppConv, toCppPreConv);
}
@@ -1288,7 +1318,7 @@ void CppGenerator::writeCustomConverterFunctions(QTextStream& s, const CustomCon
if (toCppConversions.isEmpty())
return;
s << "// Python to C++ conversions for type '" << customConversion->ownerType()->qualifiedCppName() << "'." << endl;
- foreach (CustomConversion::TargetToNativeConversion* toNative, toCppConversions)
+ for (CustomConversion::TargetToNativeConversion *toNative : toCppConversions)
writePythonToCppConversionFunctions(s, toNative, customConversion->ownerType());
s << endl;
}
@@ -1368,7 +1398,8 @@ void CppGenerator::writeConverterRegister(QTextStream &s, const AbstractMetaClas
// Add implicit conversions.
AbstractMetaFunctionList implicitConvs;
if (!customConversion || !customConversion->replaceOriginalTargetToNativeConversions()) {
- foreach (AbstractMetaFunction* func, implicitConversions(metaClass->typeEntry())) {
+ const AbstractMetaFunctionList &allImplicitConvs = implicitConversions(metaClass->typeEntry());
+ for (AbstractMetaFunction *func : allImplicitConvs) {
if (!func->isUserAdded())
implicitConvs << func;
}
@@ -1378,7 +1409,7 @@ void CppGenerator::writeConverterRegister(QTextStream &s, const AbstractMetaClas
s << INDENT << "// Add implicit conversions to type converter." << endl;
AbstractMetaType* targetType = buildAbstractMetaTypeFromAbstractMetaClass(metaClass);
- foreach (const AbstractMetaFunction* conv, implicitConvs) {
+ for (const AbstractMetaFunction *conv : qAsConst(implicitConvs)) {
if (conv->isModifiedRemoved())
continue;
const AbstractMetaType* sourceType;
@@ -1388,7 +1419,7 @@ void CppGenerator::writeConverterRegister(QTextStream &s, const AbstractMetaClas
// Constructor that does implicit conversion.
if (!conv->typeReplaced(1).isEmpty())
continue;
- sourceType = conv->arguments().first()->type();
+ sourceType = conv->arguments().constFirst()->type();
}
QString toCpp = pythonToCppFunctionName(sourceType, targetType);
QString isConv = convertibleToCppFunctionName(sourceType, targetType);
@@ -1406,7 +1437,7 @@ void CppGenerator::writeCustomConverterRegister(QTextStream& s, const CustomConv
if (toCppConversions.isEmpty())
return;
s << INDENT << "// Add user defined implicit conversions to type converter." << endl;
- foreach (CustomConversion::TargetToNativeConversion* toNative, toCppConversions) {
+ for (CustomConversion::TargetToNativeConversion *toNative : toCppConversions) {
QString toCpp = pythonToCppFunctionName(toNative, customConversion->ownerType());
QString isConv = convertibleToCppFunctionName(toNative, customConversion->ownerType());
writeAddPythonToCppConversion(s, converterVar, toCpp, isConv);
@@ -1516,8 +1547,10 @@ void CppGenerator::writeConstructorWrapper(QTextStream &s, const AbstractMetaFun
QSet<QString> argNamesSet;
if (usePySideExtensions() && metaClass->isQObject()) {
// Write argNames variable with all known argument names.
- foreach (const AbstractMetaFunction* func, overloadData.overloads()) {
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const OverloadData::MetaFunctionList &overloads = overloadData.overloads();
+ for (const AbstractMetaFunction *func : overloads) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (arg->defaultValueExpression().isEmpty() || func->argumentRemoved(arg->argumentIndex() + 1))
continue;
argNamesSet << arg->name();
@@ -1595,7 +1628,7 @@ void CppGenerator::writeConstructorWrapper(QTextStream &s, const AbstractMetaFun
// (first "1") and the flag indicating that the Python wrapper holds an C++ wrapper
// is marked as true (the second "1"). Otherwise the default values apply:
// Python owns it and C++ wrapper is false.
- if (shouldGenerateCppWrapper(overloads.first()->ownerClass()))
+ if (shouldGenerateCppWrapper(overloads.constFirst()->ownerClass()))
s << INDENT << "Shiboken::Object::setHasCppWrapper(sbkSelf, true);" << endl;
// Need to check if a wrapper for same pointer is already registered
// Caused by bug PYSIDE-217, where deleted objects' wrappers are not released
@@ -1621,8 +1654,9 @@ void CppGenerator::writeConstructorWrapper(QTextStream &s, const AbstractMetaFun
// Constructor code injections, position=end
bool hasCodeInjectionsAtEnd = false;
- foreach(AbstractMetaFunction* func, overloads) {
- foreach (const CodeSnip &cs, func->injectedCodeSnips()) {
+ for (AbstractMetaFunction *func : overloads) {
+ const CodeSnipList &injectedCodeSnips = func->injectedCodeSnips();
+ for (const CodeSnip &cs : injectedCodeSnips) {
if (cs.position == TypeSystem::CodeSnipPositionEnd) {
hasCodeInjectionsAtEnd = true;
break;
@@ -1632,9 +1666,10 @@ void CppGenerator::writeConstructorWrapper(QTextStream &s, const AbstractMetaFun
if (hasCodeInjectionsAtEnd) {
// FIXME: C++ arguments are not available in code injection on constructor when position = end.
s << INDENT << "switch(overloadId) {" << endl;
- foreach(AbstractMetaFunction* func, overloads) {
+ for (AbstractMetaFunction *func : overloads) {
Indentation indent(INDENT);
- foreach (const CodeSnip &cs, func->injectedCodeSnips()) {
+ const CodeSnipList &injectedCodeSnips = func->injectedCodeSnips();
+ for (const CodeSnip &cs : injectedCodeSnips) {
if (cs.position == TypeSystem::CodeSnipPositionEnd) {
s << INDENT << "case " << metaClass->functions().indexOf(func) << ':' << endl;
s << INDENT << '{' << endl;
@@ -1812,10 +1847,10 @@ void CppGenerator::writeArgumentsInitializer(QTextStream& s, OverloadData& overl
s << INDENT << '}';
}
}
- QList<int> invalidArgsLength = overloadData.invalidArgumentLengths();
+ const QVector<int> invalidArgsLength = overloadData.invalidArgumentLengths();
if (!invalidArgsLength.isEmpty()) {
QStringList invArgsLen;
- foreach (int i, invalidArgsLength)
+ for (int i : qAsConst(invalidArgsLength))
invArgsLen << QStringLiteral("numArgs == %1").arg(i);
if (usesNamedArguments && (!ownerClassIsQObject || minArgs > 0))
s << " else ";
@@ -1943,9 +1978,11 @@ void CppGenerator::writeErrorSection(QTextStream& s, OverloadData& overloadData)
s << INDENT << "Shiboken::setErrorAboutWrongArguments(" << argsVar << ", \"" << funcName << "\", 0);" << endl;
} else {
QStringList overloadSignatures;
- foreach (const AbstractMetaFunction* f, overloadData.overloads()) {
+ const OverloadData::MetaFunctionList &overloads = overloadData.overloads();
+ for (const AbstractMetaFunction *f : overloads) {
QStringList args;
- foreach(AbstractMetaArgument* arg, f->arguments()) {
+ const AbstractMetaArgumentList &arguments = f->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
QString strArg;
AbstractMetaType* argType = arg->type();
if (isCString(argType)) {
@@ -1961,7 +1998,9 @@ void CppGenerator::writeErrorSection(QTextStream& s, OverloadData& overloadData)
strArg = QLatin1String("1-unicode");
} else {
strArg = ptp->name();
- strArg.remove(QRegExp(QLatin1String("^signed\\s+")));
+ static const QRegularExpression regex(QStringLiteral("^signed\\s+"));
+ Q_ASSERT(regex.isValid());
+ strArg.remove(regex);
if (strArg == QLatin1String("double"))
strArg = QLatin1String("float");
}
@@ -2043,9 +2082,13 @@ void CppGenerator::writeInvalidPyObjectCheck(QTextStream& s, const QString& pyOb
static QString pythonToCppConverterForArgumentName(const QString& argumentName)
{
- static QRegExp pyArgsRegex(QLatin1String(PYTHON_ARGS"(\\[\\d+[-]?\\d*\\])"));
- pyArgsRegex.indexIn(argumentName);
- return QLatin1String(PYTHON_TO_CPP_VAR) + pyArgsRegex.cap(1);
+ static const QRegularExpression pyArgsRegex(QLatin1String(PYTHON_ARGS"(\\[\\d+[-]?\\d*\\])"));
+ Q_ASSERT(pyArgsRegex.isValid());
+ const QRegularExpressionMatch match = pyArgsRegex.match(argumentName);
+ QString result = QLatin1String(PYTHON_TO_CPP_VAR);
+ if (match.hasMatch())
+ result += match.captured(1);
+ return result;
}
void CppGenerator::writeTypeCheck(QTextStream& s, const AbstractMetaType* argType, QString argumentName, bool isNumber, QString customType, bool rejectNull)
@@ -2085,20 +2128,26 @@ static void checkTypeViability(const AbstractMetaFunction* func, const AbstractM
if (!type
|| !type->typeEntry()->isPrimitive()
|| type->indirections() == 0
+ || (type->indirections() == 1 && type->typeUsagePattern() == AbstractMetaType::NativePointerAsArrayPattern)
|| ShibokenGenerator::isCString(type)
|| func->argumentRemoved(argIdx)
|| !func->typeReplaced(argIdx).isEmpty()
|| !func->conversionRule(TypeSystem::All, argIdx).isEmpty()
|| func->hasInjectedCode())
return;
- QString prefix;
+ QString message;
+ QTextStream str(&message);
+ str << "There's no user provided way (conversion rule, argument"
+ " removal, custom code, etc) to handle the primitive ";
+ if (argIdx == 0)
+ str << "return type '" << type->cppSignature() << '\'';
+ else
+ str << "type '" << type->cppSignature() << "' of argument " << argIdx;
+ str << " in function '";
if (func->ownerClass())
- prefix = func->ownerClass()->qualifiedCppName() + QLatin1String("::");
- qCWarning(lcShiboken).noquote().nospace()
- << QString::fromLatin1("There's no user provided way (conversion rule, argument removal, custom code, etc) "
- "to handle the primitive %1 type '%2' in function '%3%4'.")
- .arg(argIdx == 0 ? QStringLiteral("return") : QStringLiteral("argument"),
- type->cppSignature(), prefix, func->signature());
+ str << func->ownerClass()->qualifiedCppName() << "::";
+ str << func->signature() << "'.";
+ qCWarning(lcShiboken).noquote().nospace() << message;
}
static void checkTypeViability(const AbstractMetaFunction* func)
@@ -2114,9 +2163,10 @@ static void checkTypeViability(const AbstractMetaFunction* func)
void CppGenerator::writeTypeCheck(QTextStream& s, const OverloadData* overloadData, QString argumentName)
{
QSet<const TypeEntry*> numericTypes;
-
- foreach (OverloadData* od, overloadData->previousOverloadData()->nextOverloadData()) {
- foreach (const AbstractMetaFunction* func, od->overloads()) {
+ const OverloadDataList &overloads = overloadData->previousOverloadData()->nextOverloadData();
+ for (OverloadData *od : overloads) {
+ const OverloadData::MetaFunctionList &odOverloads = od->overloads();
+ for (const AbstractMetaFunction *func : odOverloads) {
checkTypeViability(func);
const AbstractMetaType* argType = od->argument(func)->type();
if (!argType->isPrimitive())
@@ -2174,6 +2224,23 @@ const AbstractMetaType* CppGenerator::getArgumentType(const AbstractMetaFunction
return argType;
}
+static inline QString arrayHandleType(const AbstractMetaTypeCList &nestedArrayTypes)
+{
+ switch (nestedArrayTypes.size()) {
+ case 1:
+ return QStringLiteral("Shiboken::Conversions::ArrayHandle<")
+ + nestedArrayTypes.constLast()->minimalSignature()
+ + QLatin1Char('>');
+ case 2:
+ return QStringLiteral("Shiboken::Conversions::Array2Handle<")
+ + nestedArrayTypes.constLast()->minimalSignature()
+ + QStringLiteral(", ")
+ + QString::number(nestedArrayTypes.constFirst()->arrayElementCount())
+ + QLatin1Char('>');
+ }
+ return QString();
+}
+
void CppGenerator::writePythonToCppTypeConversion(QTextStream& s,
const AbstractMetaType* type,
const QString& pyIn,
@@ -2195,7 +2262,13 @@ void CppGenerator::writePythonToCppTypeConversion(QTextStream& s,
&& !isCppPrimitive(type)
&& isNotContainerEnumOrFlags
&& !(treatAsPointer || isPointerOrObjectType);
- QString typeName = getFullTypeNameWithoutModifiers(type);
+
+ const AbstractMetaTypeCList nestedArrayTypes = type->nestedArrayTypes();
+ const bool isCppPrimitiveArray = !nestedArrayTypes.isEmpty()
+ && nestedArrayTypes.constLast()->isCppPrimitive();
+ QString typeName = isCppPrimitiveArray
+ ? arrayHandleType(nestedArrayTypes)
+ : getFullTypeNameWithoutModifiers(type);
bool isProtectedEnum = false;
@@ -2212,7 +2285,9 @@ void CppGenerator::writePythonToCppTypeConversion(QTextStream& s,
}
s << INDENT << typeName;
- if (treatAsPointer || isPointerOrObjectType) {
+ if (isCppPrimitiveArray) {
+ s << ' ' << cppOut;
+ } else if (treatAsPointer || isPointerOrObjectType) {
s << "* " << cppOut;
if (!defaultValue.isEmpty())
s << " = " << defaultValue;
@@ -2280,7 +2355,7 @@ static void addConversionRuleCodeSnippet(CodeSnipList& snippetList, QString& rul
} else {
rule.replace(QLatin1String("%out"), outputName);
}
- CodeSnip snip(0, snippetLanguage);
+ CodeSnip snip(snippetLanguage);
snip.position = (snippetLanguage == TypeSystem::NativeCode) ? TypeSystem::CodeSnipPositionAny : TypeSystem::CodeSnipPositionBeginning;
snip.addCode(rule);
snippetList << snip;
@@ -2289,7 +2364,8 @@ static void addConversionRuleCodeSnippet(CodeSnipList& snippetList, QString& rul
void CppGenerator::writeConversionRule(QTextStream& s, const AbstractMetaFunction* func, TypeSystem::Language language)
{
CodeSnipList snippets;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
QString rule = func->conversionRule(language, arg->argumentIndex() + 1);
addConversionRuleCodeSnippet(snippets, rule, language, TypeSystem::TargetLangCode,
arg->name(), arg->name());
@@ -2317,7 +2393,7 @@ void CppGenerator::writeOverloadedFunctionDecisor(QTextStream& s, const Overload
{
s << INDENT << "// Overloaded function decisor" << endl;
const AbstractMetaFunction* rfunc = overloadData.referenceFunction();
- QList<const AbstractMetaFunction*> functionOverloads = overloadData.overloadsWithoutRepetition();
+ const OverloadData::MetaFunctionList &functionOverloads = overloadData.overloadsWithoutRepetition();
for (int i = 0; i < functionOverloads.count(); i++)
s << INDENT << "// " << i << ": " << functionOverloads.at(i)->minimalSignature() << endl;
writeOverloadedFunctionDecisorEngine(s, &overloadData);
@@ -2351,7 +2427,8 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
// variable to be used further on this method on the conditional that identifies default
// method calls.
if (!hasDefaultCall) {
- foreach (const AbstractMetaFunction* func, parentOverloadData->overloads()) {
+ const OverloadData::MetaFunctionList &overloads = parentOverloadData->overloads();
+ for (const AbstractMetaFunction *func : overloads) {
if (parentOverloadData->isFinalOccurrence(func)) {
referenceFunction = func;
hasDefaultCall = true;
@@ -2392,6 +2469,7 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
// If the next argument has a default value the decisor can perform a method call;
// it just need to check if the number of arguments received from Python are equal
// to the number of parameters preceding the argument with the default value.
+ const OverloadDataList &overloads = parentOverloadData->nextOverloadData();
if (hasDefaultCall) {
isFirst = false;
int numArgs = parentOverloadData->argPos() + 1;
@@ -2399,7 +2477,7 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
{
Indentation indent(INDENT);
const AbstractMetaFunction* func = referenceFunction;
- foreach (OverloadData* overloadData, parentOverloadData->nextOverloadData()) {
+ for (OverloadData *overloadData : overloads) {
const AbstractMetaFunction* defValFunc = overloadData->getFunctionWithDefaultValue();
if (defValFunc) {
func = defValFunc;
@@ -2412,7 +2490,7 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
s << INDENT << '}';
}
- foreach (OverloadData* overloadData, parentOverloadData->nextOverloadData()) {
+ for (OverloadData *overloadData : overloads) {
bool signatureFound = overloadData->overloads().size() == 1
&& !overloadData->getFunctionWithDefaultValue()
&& !overloadData->findNextArgWithDefault();
@@ -2438,7 +2516,7 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
if (func->isConstructor() && func->arguments().count() == 1) {
const AbstractMetaClass* ownerClass = func->ownerClass();
const ComplexTypeEntry* baseContainerType = ownerClass->typeEntry()->baseContainerType();
- if (baseContainerType && baseContainerType == func->arguments().first()->type()->typeEntry() && isCopyable(ownerClass)) {
+ if (baseContainerType && baseContainerType == func->arguments().constFirst()->type()->typeEntry() && isCopyable(ownerClass)) {
tck << '!' << cpythonCheckFunction(ownerClass->typeEntry()) << pyArgName << ')' << endl;
Indentation indent(INDENT);
tck << INDENT << "&& ";
@@ -2453,17 +2531,17 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
if (od->nextOverloadData().isEmpty()
|| od->nextArgumentHasDefaultValue()
|| od->nextOverloadData().size() != 1
- || od->overloads().size() != od->nextOverloadData().first()->overloads().size()) {
+ || od->overloads().size() != od->nextOverloadData().constFirst()->overloads().size()) {
overloadData = od;
od = 0;
} else {
- od = od->nextOverloadData().first();
+ od = od->nextOverloadData().constFirst();
}
}
if (usePyArgs && signatureFound) {
AbstractMetaArgumentList args = refFunc->arguments();
- int lastArgIsVarargs = (int) (args.size() > 1 && args.last()->type()->isVarargs());
+ int lastArgIsVarargs = (int) (args.size() > 1 && args.constLast()->type()->isVarargs());
int numArgs = args.size() - OverloadData::numberOfRemovedArguments(refFunc) - lastArgIsVarargs;
typeChecks.prepend(QString::fromLatin1("numArgs %1 %2").arg(lastArgIsVarargs ? QLatin1String(">=") : QLatin1String("==")).arg(numArgs));
} else if (sequenceArgCount > 1) {
@@ -2501,13 +2579,13 @@ void CppGenerator::writeOverloadedFunctionDecisorEngine(QTextStream& s, const Ov
void CppGenerator::writeFunctionCalls(QTextStream &s, const OverloadData &overloadData,
GeneratorContext &context)
{
- QList<const AbstractMetaFunction*> overloads = overloadData.overloadsWithoutRepetition();
+ const OverloadData::MetaFunctionList &overloads = overloadData.overloadsWithoutRepetition();
s << INDENT << "// Call function/method" << endl;
s << INDENT << (overloads.count() > 1 ? "switch (overloadId) " : "") << '{' << endl;
{
Indentation indent(INDENT);
if (overloads.count() == 1) {
- writeSingleFunctionCall(s, overloadData, overloads.first(), context);
+ writeSingleFunctionCall(s, overloadData, overloads.constFirst(), context);
} else {
for (int i = 0; i < overloads.count(); i++) {
const AbstractMetaFunction* func = overloads.at(i);
@@ -2818,21 +2896,22 @@ void CppGenerator::writePythonToCppConversionFunctions(QTextStream& s, const Abs
QString code;
QTextStream c(&code);
c << INDENT << QString::fromLatin1("%1& cppOutRef = *((%1*)cppOut);").arg(cppTypeName) << endl;
- code.append(toCppConversions.first()->conversion());
+ code.append(toCppConversions.constFirst()->conversion());
for (int i = 0; i < containerType->instantiations().count(); ++i) {
const AbstractMetaType* type = containerType->instantiations().at(i);
QString typeName = getFullTypeName(type);
if (type->isValue() && isValueTypeWithCopyConstructorOnly(type)) {
- static QRegExp regex(QLatin1String(CONVERTTOCPP_REGEX));
- int pos = 0;
- while ((pos = regex.indexIn(code, pos)) != -1) {
- pos += regex.matchedLength();
- QStringList list = regex.capturedTexts();
- QString varName = list.at(1);
- QString leftCode = code.left(pos);
+ static const QRegularExpression regex(QLatin1String(CONVERTTOCPP_REGEX));
+ Q_ASSERT(regex.isValid());
+ for (int pos = 0; ; ) {
+ const QRegularExpressionMatch match = regex.match(code, pos);
+ if (!match.hasMatch())
+ break;
+ pos = match.capturedEnd();
+ const QString varName = match.captured(1);
QString rightCode = code.mid(pos);
rightCode.replace(varName, QLatin1Char('*') + varName);
- code = leftCode + rightCode;
+ code.replace(pos, code.size() - pos, rightCode);
}
typeName.append(QLatin1Char('*'));
}
@@ -2867,7 +2946,7 @@ void CppGenerator::writeAddPythonToCppConversion(QTextStream& s, const QString&
void CppGenerator::writeNamedArgumentResolution(QTextStream& s, const AbstractMetaFunction* func, bool usePyArgs)
{
- AbstractMetaArgumentList args = OverloadData::getArgumentsWithDefaultValues(func);
+ const AbstractMetaArgumentList &args = OverloadData::getArgumentsWithDefaultValues(func);
if (args.isEmpty())
return;
@@ -2878,7 +2957,7 @@ void CppGenerator::writeNamedArgumentResolution(QTextStream& s, const AbstractMe
{
Indentation indent(INDENT);
s << INDENT << "PyObject* ";
- foreach (const AbstractMetaArgument* arg, args) {
+ for (const AbstractMetaArgument *arg : args) {
int pyArgIndex = arg->argumentIndex() - OverloadData::numberOfRemovedArguments(func, arg->argumentIndex());
QString pyArgName = usePyArgs
? QString::fromLatin1(PYTHON_ARGS "[%1]").arg(pyArgIndex)
@@ -2903,7 +2982,7 @@ void CppGenerator::writeNamedArgumentResolution(QTextStream& s, const AbstractMe
}
}
s << INDENT << '}' << endl;
- if (arg != args.last())
+ if (arg != args.constLast())
s << INDENT;
}
}
@@ -2953,7 +3032,8 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
{
s << INDENT << "// " << func->minimalSignature() << (func->isReverseOperator() ? " [reverse operator]": "") << endl;
if (func->isConstructor()) {
- foreach (const CodeSnip &cs, func->injectedCodeSnips()) {
+ const CodeSnipList &snips = func->injectedCodeSnips();
+ for (const CodeSnip &cs : snips) {
if (cs.position == TypeSystem::CodeSnipPositionEnd) {
s << INDENT << "overloadId = " << func->ownerClass()->functions().indexOf(const_cast<AbstractMetaFunction* const>(func)) << ';' << endl;
break;
@@ -2990,7 +3070,7 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
removedArgs++;
}
} else if (maxArgs != 0 && !func->arguments().isEmpty()) {
- lastArg = func->arguments().last();
+ lastArg = func->arguments().constLast();
}
writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionBeginning, TypeSystem::TargetLangCode, func, lastArg);
@@ -3065,7 +3145,7 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
firstArg.remove(1, 1); // remove the de-reference operator
QString secondArg = QLatin1String(CPP_ARG0);
- if (!func->isUnaryOperator() && shouldDereferenceArgumentPointer(func->arguments().first())) {
+ if (!func->isUnaryOperator() && shouldDereferenceArgumentPointer(func->arguments().constFirst())) {
secondArg.prepend(QLatin1String("(*"));
secondArg.append(QLatin1Char(')'));
}
@@ -3255,11 +3335,12 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
bool hasReturnPolicy = false;
// Ownership transference between C++ and Python.
- QList<ArgumentModification> ownership_mods;
+ QVector<ArgumentModification> ownership_mods;
// Python object reference management.
- QList<ArgumentModification> refcount_mods;
- foreach (const FunctionModification &func_mod, func->modifications()) {
- foreach (const ArgumentModification &arg_mod, func_mod.argument_mods) {
+ QVector<ArgumentModification> refcount_mods;
+ const FunctionModificationList &funcMods = func->modifications();
+ for (const FunctionModification &func_mod : funcMods) {
+ for (const ArgumentModification &arg_mod : func_mod.argument_mods) {
if (!arg_mod.ownerships.isEmpty() && arg_mod.ownerships.contains(TypeSystem::TargetLangCode))
ownership_mods.append(arg_mod);
else if (!arg_mod.referenceCounts.isEmpty())
@@ -3273,7 +3354,7 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
if (!ownership_mods.isEmpty()) {
s << endl << INDENT << "// Ownership transferences." << endl;
- foreach (const ArgumentModification &arg_mod, ownership_mods) {
+ for (const ArgumentModification &arg_mod : qAsConst(ownership_mods)) {
const AbstractMetaClass* wrappedClass = 0;
QString pyArgName = argumentNameFromIndex(func, arg_mod.index, &wrappedClass);
if (!wrappedClass) {
@@ -3304,8 +3385,8 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
}
} else if (!refcount_mods.isEmpty()) {
- foreach (const ArgumentModification &arg_mod, refcount_mods) {
- ReferenceCount refCount = arg_mod.referenceCounts.first();
+ for (const ArgumentModification &arg_mod : qAsConst(refcount_mods)) {
+ ReferenceCount refCount = arg_mod.referenceCounts.constFirst();
if (refCount.action != ReferenceCount::Set
&& refCount.action != ReferenceCount::Remove
&& refCount.action != ReferenceCount::Add) {
@@ -3331,7 +3412,7 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
s << INDENT << "Shiboken::Object::removeReference(";
s << "reinterpret_cast<SbkObject*>(" PYTHON_SELF_VAR "), \"";
- QString varName = arg_mod.referenceCounts.first().varName;
+ QString varName = arg_mod.referenceCounts.constFirst().varName;
if (varName.isEmpty())
varName = func->minimalSignature() + QString().number(arg_mod.index);
@@ -3349,15 +3430,15 @@ void CppGenerator::writeMethodCall(QTextStream &s, const AbstractMetaFunction *f
QStringList CppGenerator::getAncestorMultipleInheritance(const AbstractMetaClass* metaClass)
{
QStringList result;
- AbstractMetaClassList baseClases = getBaseClasses(metaClass);
+ const AbstractMetaClassList &baseClases = getBaseClasses(metaClass);
if (!baseClases.isEmpty()) {
- foreach (const AbstractMetaClass* baseClass, baseClases) {
+ for (const AbstractMetaClass *baseClass : baseClases) {
result.append(QString::fromLatin1("((size_t) static_cast<const %1*>(class_ptr)) - base")
.arg(baseClass->qualifiedCppName()));
result.append(QString::fromLatin1("((size_t) static_cast<const %1*>((%2*)((void*)class_ptr))) - base")
.arg(baseClass->qualifiedCppName(), metaClass->qualifiedCppName()));
}
- foreach (const AbstractMetaClass* baseClass, baseClases)
+ for (const AbstractMetaClass *baseClass : baseClases)
result.append(getAncestorMultipleInheritance(baseClass));
}
return result;
@@ -3366,7 +3447,7 @@ QStringList CppGenerator::getAncestorMultipleInheritance(const AbstractMetaClass
void CppGenerator::writeMultipleInheritanceInitializerFunction(QTextStream& s, const AbstractMetaClass* metaClass)
{
QString className = metaClass->qualifiedCppName();
- QStringList ancestors = getAncestorMultipleInheritance(metaClass);
+ const QStringList ancestors = getAncestorMultipleInheritance(metaClass);
s << "static int mi_offsets[] = { ";
for (int i = 0; i < ancestors.size(); i++)
s << "-1, ";
@@ -3382,7 +3463,7 @@ void CppGenerator::writeMultipleInheritanceInitializerFunction(QTextStream& s, c
s << INDENT << "const " << className << "* class_ptr = reinterpret_cast<const " << className << "*>(cptr);" << endl;
s << INDENT << "size_t base = (size_t) class_ptr;" << endl;
- foreach (const QString &ancestor, ancestors)
+ for (const QString &ancestor : ancestors)
s << INDENT << "offsets.insert(" << ancestor << ");" << endl;
s << endl;
@@ -3410,7 +3491,8 @@ void CppGenerator::writeSpecialCastFunction(QTextStream& s, const AbstractMetaCl
s << "{\n";
s << INDENT << className << "* me = reinterpret_cast< ::" << className << "*>(obj);\n";
bool firstClass = true;
- foreach (const AbstractMetaClass* baseClass, getAllAncestors(metaClass)) {
+ const AbstractMetaClassList &allAncestors = getAllAncestors(metaClass);
+ for (const AbstractMetaClass *baseClass : allAncestors) {
s << INDENT << (!firstClass ? "else " : "") << "if (desiredType == reinterpret_cast<SbkObjectType*>(" << cpythonTypeNameExt(baseClass->typeEntry()) << "))\n";
Indentation indent(INDENT);
s << INDENT << "return static_cast< ::" << baseClass->qualifiedCppName() << "*>(me);\n";
@@ -3528,10 +3610,11 @@ void CppGenerator::writeContainerConverterInitialization(QTextStream& s, const A
writeAddPythonToCppConversion(s, converterObject(type), toCpp, isConv);
}
-void CppGenerator::writeExtendedConverterInitialization(QTextStream& s, const TypeEntry* externalType, const QList<const AbstractMetaClass*>& conversions)
+void CppGenerator::writeExtendedConverterInitialization(QTextStream& s, const TypeEntry* externalType,
+ const QVector<const AbstractMetaClass*>& conversions)
{
s << INDENT << "// Extended implicit conversions for " << externalType->qualifiedTargetLangName() << '.' << endl;
- foreach (const AbstractMetaClass* sourceClass, conversions) {
+ for (const AbstractMetaClass *sourceClass : conversions) {
const QString converterVar = QLatin1String("reinterpret_cast<SbkObjectType *>(")
+ cppApiVariableName(externalType->targetLangPackage()) + QLatin1Char('[')
+ getTypeIndexVariableName(externalType) + QLatin1String("])");
@@ -3586,7 +3669,8 @@ bool CppGenerator::supportsSequenceProtocol(const AbstractMetaClass* metaClass)
bool CppGenerator::shouldGenerateGetSetList(const AbstractMetaClass* metaClass)
{
- foreach (AbstractMetaField* f, metaClass->fields()) {
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (const AbstractMetaField *f : fields) {
if (!f->isStatic())
return true;
}
@@ -3604,11 +3688,11 @@ void CppGenerator::writeClassDefinition(QTextStream &s,
QString tp_hash(QLatin1Char('0'));
QString tp_call = tp_hash;
QString cppClassName = metaClass->qualifiedCppName();
- QString className = cpythonTypeName(metaClass);
- className.remove(QRegExp(QLatin1String("_Type$")));
+ const QString className = chopType(cpythonTypeName(metaClass));
QString baseClassName(QLatin1Char('0'));
AbstractMetaFunctionList ctors;
- foreach (AbstractMetaFunction* f, metaClass->queryFunctions(AbstractMetaClass::Constructors)) {
+ const AbstractMetaFunctionList &allCtors = metaClass->queryFunctions(AbstractMetaClass::Constructors);
+ for (AbstractMetaFunction *f : allCtors) {
if (!f->isPrivate() && !f->isModifiedRemoved() && !classContext.forSmartPointer())
ctors.append(f);
}
@@ -3641,8 +3725,7 @@ void CppGenerator::writeClassDefinition(QTextStream &s,
tp_dealloc = QLatin1String("&SbkDeallocQAppWrapper");
else
tp_dealloc = QLatin1String("&SbkDeallocWrapper");
- // avoid constFirst to stay Qt 5.5 compatible
- tp_init = (onlyPrivCtor || ctors.isEmpty()) ? QLatin1String("0") : cpythonFunctionName(ctors.first());
+ tp_init = (onlyPrivCtor || ctors.isEmpty()) ? QLatin1String("0") : cpythonFunctionName(ctors.constFirst());
}
QString tp_getattro(QLatin1Char('0'));
@@ -3679,7 +3762,8 @@ void CppGenerator::writeClassDefinition(QTextStream &s,
// search for special functions
ShibokenGenerator::clearTpFuncs();
- foreach (AbstractMetaFunction* func, metaClass->functions()) {
+ const AbstractMetaFunctionList &funcs = metaClass->functions();
+ for (AbstractMetaFunction *func : funcs) {
if (m_tpFuncs.contains(func->name()))
m_tpFuncs[func->name()] = cpythonFunctionName(func);
}
@@ -3788,11 +3872,7 @@ void CppGenerator::writeMappingMethods(QTextStream &s,
const AbstractMetaClass *metaClass,
GeneratorContext &context)
{
-
- QMap<QString, QString> funcs;
-
- QHash< QString, QPair< QString, QString > >::const_iterator it = m_mappingProtocol.begin();
- for (; it != m_mappingProtocol.end(); ++it) {
+ for (auto it = m_mappingProtocol.cbegin(), end = m_mappingProtocol.cend(); it != end; ++it) {
const AbstractMetaFunction* func = metaClass->findFunction(it.key());
if (!func)
continue;
@@ -3806,7 +3886,7 @@ void CppGenerator::writeMappingMethods(QTextStream &s,
writeCppSelfDefinition(s, func, context);
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode, func, lastArg);
s << '}' << endl << endl;
}
@@ -3816,12 +3896,9 @@ void CppGenerator::writeSequenceMethods(QTextStream &s,
const AbstractMetaClass *metaClass,
GeneratorContext &context)
{
-
- QMap<QString, QString> funcs;
bool injectedCode = false;
- QHash< QString, QPair< QString, QString > >::const_iterator it = m_sequenceProtocol.begin();
- for (; it != m_sequenceProtocol.end(); ++it) {
+ for (auto it = m_sequenceProtocol.cbegin(), end = m_sequenceProtocol.cend(); it != end; ++it) {
const AbstractMetaFunction* func = metaClass->findFunction(it.key());
if (!func)
continue;
@@ -3836,7 +3913,7 @@ void CppGenerator::writeSequenceMethods(QTextStream &s,
writeCppSelfDefinition(s, func, context);
- const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().last();
+ const AbstractMetaArgument* lastArg = func->arguments().isEmpty() ? 0 : func->arguments().constLast();
writeCodeSnips(s, snips,TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode, func, lastArg);
s << '}' << endl << endl;
}
@@ -3900,7 +3977,7 @@ void CppGenerator::writeTypeAsMappingDefinition(QTextStream& s, const AbstractMe
QString baseName = cpythonBaseName(metaClass);
s << INDENT << "memset(&" << baseName << "_TypeAsMapping, 0, sizeof(PyMappingMethods));" << endl;
- for (QHash<QString, QString>::const_iterator it = m_mpFuncs.cbegin(), end = m_mpFuncs.end(); it != end; ++it) {
+ for (auto it = m_mpFuncs.cbegin(), end = m_mpFuncs.cend(); it != end; ++it) {
const QString &mpName = it.key();
if (funcs[mpName].isEmpty())
continue;
@@ -3936,13 +4013,13 @@ void CppGenerator::writeTypeAsNumberDefinition(QTextStream& s, const AbstractMet
nb.insert(QLatin1String("__ixor__"), QString());
nb.insert(QLatin1String("__ior__"), QString());
- QList<AbstractMetaFunctionList> opOverloads =
+ const QVector<AbstractMetaFunctionList> opOverloads =
filterGroupedOperatorFunctions(metaClass,
AbstractMetaClass::ArithmeticOp
| AbstractMetaClass::LogicalOp
| AbstractMetaClass::BitwiseOp);
- foreach (const AbstractMetaFunctionList &opOverload, opOverloads) {
+ for (const AbstractMetaFunctionList &opOverload : opOverloads) {
const AbstractMetaFunction* rfunc = opOverload[0];
QString opName = ShibokenGenerator::pythonOperatorFunctionName(rfunc);
nb[opName] = cpythonFunctionName(rfunc);
@@ -4001,8 +4078,7 @@ void CppGenerator::writeTpClearFunction(QTextStream& s, const AbstractMetaClass*
void CppGenerator::writeCopyFunction(QTextStream &s, GeneratorContext &context)
{
const AbstractMetaClass *metaClass = context.metaClass();
- QString className = cpythonTypeName(metaClass);
- className.remove(QRegExp(QLatin1String("_Type$")));
+ const QString className = chopType(cpythonTypeName(metaClass));
s << "static PyObject* " << className << "___copy__(PyObject* " PYTHON_SELF_VAR ")" << endl;
s << "{" << endl;
writeCppSelfDefinition(s, context, false, true);
@@ -4181,7 +4257,8 @@ void CppGenerator::writeRichCompareFunction(QTextStream &s, GeneratorContext &co
s << INDENT << "switch (op) {" << endl;
{
Indentation indent(INDENT);
- foreach (const AbstractMetaFunctionList &overloads, filterGroupedOperatorFunctions(metaClass, AbstractMetaClass::ComparisonOp)) {
+ const QVector<AbstractMetaFunctionList> &groupedFuncs = filterGroupedOperatorFunctions(metaClass, AbstractMetaClass::ComparisonOp);
+ for (const AbstractMetaFunctionList &overloads : groupedFuncs) {
const AbstractMetaFunction* rfunc = overloads[0];
QString operatorId = ShibokenGenerator::pythonRichCompareOperatorId(rfunc);
@@ -4193,15 +4270,16 @@ void CppGenerator::writeRichCompareFunction(QTextStream &s, GeneratorContext &co
op = op.right(op.size() - QLatin1String("operator").size());
int alternativeNumericTypes = 0;
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction *func : overloads) {
if (!func->isStatic() &&
- ShibokenGenerator::isNumber(func->arguments()[0]->type()->typeEntry()))
+ ShibokenGenerator::isNumber(func->arguments().at(0)->type()->typeEntry()))
alternativeNumericTypes++;
}
bool first = true;
OverloadData overloadData(overloads, this);
- foreach (OverloadData* od, overloadData.nextOverloadData()) {
+ const OverloadDataList &nextOverloads = overloadData.nextOverloadData();
+ for (OverloadData *od : nextOverloads) {
const AbstractMetaFunction* func = od->referenceFunction();
if (func->isStatic())
continue;
@@ -4227,7 +4305,7 @@ void CppGenerator::writeRichCompareFunction(QTextStream &s, GeneratorContext &co
// If the function is user added, use the inject code
if (func->isUserAdded()) {
CodeSnipList snips = func->injectedCodeSnips();
- writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode, func, func->arguments().last());
+ writeCodeSnips(s, snips, TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode, func, func->arguments().constLast());
} else {
QString expression = QString::fromLatin1("%1%2 %3 (%4" CPP_ARG0 ")")
.arg(func->isPointerOperator() ? QLatin1String("&") : QString(),
@@ -4308,7 +4386,7 @@ void CppGenerator::writeMethodDefinitionEntry(QTextStream& s, const AbstractMeta
void CppGenerator::writeMethodDefinition(QTextStream& s, const AbstractMetaFunctionList overloads)
{
Q_ASSERT(!overloads.isEmpty());
- const AbstractMetaFunction* func = overloads.first();
+ const AbstractMetaFunction* func = overloads.constFirst();
if (m_tpFuncs.contains(func->name()))
return;
@@ -4349,18 +4427,10 @@ void CppGenerator::writeSignatureInfo(QTextStream &s, const AbstractMetaFunction
int idx = overloads.length() - 1;
bool multiple = idx > 0;
-// after merging, the #if may be removed!
-#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
for (const AbstractMetaFunction *f : overloads) {
QStringList args;
const AbstractMetaArgumentList &arguments = f->arguments();
- for (AbstractMetaArgument *arg : arguments) {
-#else
- foreach (const AbstractMetaFunction *f, overloads) {
- QStringList args;
- const AbstractMetaArgumentList &arguments = f->arguments();
- foreach (const AbstractMetaArgument *arg, arguments) {
-#endif
+ for (const AbstractMetaArgument *arg : arguments) {
QString strArg = resolveRetOrArgType(arg->type());
if (!arg->defaultValueExpression().isEmpty()) {
strArg += QLatin1Char('=');
@@ -4378,9 +4448,8 @@ void CppGenerator::writeSignatureInfo(QTextStream &s, const AbstractMetaFunction
// now calculate the return type.
s << funcName << '(' << args.join(QLatin1Char(',')) << ')';
AbstractMetaType *returnType = getTypeWithoutContainer(f->type());
- if (returnType) {
+ if (returnType)
s << "->" << resolveRetOrArgType(returnType);
- }
s << endl;
}
}
@@ -4390,7 +4459,7 @@ void CppGenerator::writeEnumsInitialization(QTextStream& s, AbstractMetaEnumList
if (enums.isEmpty())
return;
s << INDENT << "// Initialization of enums." << endl << endl;
- foreach (const AbstractMetaEnum* cppEnum, enums) {
+ for (const AbstractMetaEnum *cppEnum : qAsConst(enums)) {
if (cppEnum->isPrivate())
continue;
writeEnumInitialization(s, cppEnum);
@@ -4402,6 +4471,7 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu
const AbstractMetaClass* enclosingClass = getProperEnclosingClassForEnum(cppEnum);
const AbstractMetaClass* upper = enclosingClass ? enclosingClass->enclosingClass() : 0;
bool hasUpperEnclosingClass = upper && upper->typeEntry()->codeGeneration() != TypeEntry::GenerateForSubclass;
+ const EnumTypeEntry *enumTypeEntry = cppEnum->typeEntry();
QString enclosingObjectVariable;
if (enclosingClass)
enclosingObjectVariable = QLatin1Char('&') + cpythonTypeName(enclosingClass);
@@ -4414,14 +4484,17 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu
s << (cppEnum->isAnonymous() ? "anonymous enum identified by enum value" : "enum");
s << " '" << cppEnum->name() << "'." << endl;
+ QString enumVarTypeObj;
if (!cppEnum->isAnonymous()) {
- FlagsTypeEntry* flags = cppEnum->typeEntry()->flags();
+ FlagsTypeEntry* flags = enumTypeEntry->flags();
if (flags) {
s << INDENT << cpythonTypeNameExt(flags) << " = PySide::QFlags::create(\"" << flags->flagsName() << "\", &"
<< cpythonEnumName(cppEnum) << "_as_number);" << endl;
}
- s << INDENT << cpythonTypeNameExt(cppEnum->typeEntry()) << " = Shiboken::Enum::";
+ enumVarTypeObj = cpythonTypeNameExt(enumTypeEntry);
+
+ s << INDENT << enumVarTypeObj << " = Shiboken::Enum::";
s << ((enclosingClass || hasUpperEnclosingClass) ? "createScopedEnum" : "createGlobalEnum");
s << '(' << enclosingObjectVariable << ',' << endl;
{
@@ -4441,8 +4514,9 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu
}
}
- foreach (const AbstractMetaEnumValue* enumValue, cppEnum->values()) {
- if (cppEnum->typeEntry()->isEnumValueRejected(enumValue->name()))
+ const AbstractMetaEnumValueList &enumValues = cppEnum->values();
+ for (const AbstractMetaEnumValue *enumValue : enumValues) {
+ if (enumTypeEntry->isEnumValueRejected(enumValue->name()))
continue;
QString enumValueText;
@@ -4450,12 +4524,16 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu
enumValueText = QLatin1String("(long) ");
if (cppEnum->enclosingClass())
enumValueText += cppEnum->enclosingClass()->qualifiedCppName() + QLatin1String("::");
+ // Fully qualify the value which is required for C++ 11 enum classes.
+ if (!cppEnum->isAnonymous())
+ enumValueText += cppEnum->name() + QLatin1String("::");
enumValueText += enumValue->name();
} else {
enumValueText += QString::number(enumValue->value());
}
- if (cppEnum->isAnonymous()) {
+ switch (enumTypeEntry->enumKind()) {
+ case EnumTypeEntry::AnonymousEnum:
if (enclosingClass || hasUpperEnclosingClass) {
s << INDENT << '{' << endl;
{
@@ -4478,15 +4556,27 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu
s << INDENT << "return " << m_currentErrorCode << ';' << endl;
}
}
- } else {
+ break;
+ case EnumTypeEntry::CEnum: {
s << INDENT << "if (!Shiboken::Enum::";
s << ((enclosingClass || hasUpperEnclosingClass) ? "createScopedEnumItem" : "createGlobalEnumItem");
- s << '(' << cpythonTypeNameExt(cppEnum->typeEntry()) << ',' << endl;
+ s << '(' << enumVarTypeObj << ',' << endl;
Indentation indent(INDENT);
s << INDENT << enclosingObjectVariable << ", \"" << enumValue->name() << "\", ";
s << enumValueText << "))" << endl;
s << INDENT << "return " << m_currentErrorCode << ';' << endl;
}
+ break;
+ case EnumTypeEntry::EnumClass: {
+ s << INDENT << "if (!Shiboken::Enum::createScopedEnumItem("
+ << enumVarTypeObj << ',' << endl;
+ Indentation indent(INDENT);
+ s << INDENT << enumVarTypeObj<< ", \"" << enumValue->name() << "\", "
+ << enumValueText << "))" << endl
+ << INDENT << "return " << m_currentErrorCode << ';' << endl;
+ }
+ break;
+ }
}
writeEnumConverterInitialization(s, cppEnum);
@@ -4500,10 +4590,12 @@ void CppGenerator::writeEnumInitialization(QTextStream& s, const AbstractMetaEnu
void CppGenerator::writeSignalInitialization(QTextStream& s, const AbstractMetaClass* metaClass)
{
// Try to check something and print some warnings
- foreach (const AbstractMetaFunction* cppSignal, metaClass->cppSignalFunctions()) {
+ const AbstractMetaFunctionList &signalFuncs = metaClass->cppSignalFunctions();
+ for (const AbstractMetaFunction *cppSignal : signalFuncs) {
if (cppSignal->declaringClass() != metaClass)
continue;
- foreach (AbstractMetaArgument* arg, cppSignal->arguments()) {
+ const AbstractMetaArgumentList &arguments = cppSignal->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
AbstractMetaType* metaType = arg->type();
const QByteArray origType =
QMetaObject::normalizedType(qPrintable(metaType->originalTypeDescription()));
@@ -4704,9 +4796,8 @@ void CppGenerator::writeClassRegister(QTextStream &s,
s << "// Multiple signatures have their index \"n:\" in front." << endl;
s << "const char " << initFunctionName << "_SignaturesString[] = \"\"" << endl;
QString line;
- while (signatureStream.readLineInto(&line)) {
+ while (signatureStream.readLineInto(&line))
s << INDENT << '"' << line << "\\n\"" << endl;
- }
s << ';' << endl << endl;
s << "void init_" << initFunctionName;
s << "(PyObject* " << enclosingObjectVariable << ")" << endl;
@@ -4747,7 +4838,7 @@ void CppGenerator::writeClassRegister(QTextStream &s,
if (metaClass->baseClassNames().size() > 1) {
s << INDENT << "PyObject* " << pyTypeBasesVariable << " = PyTuple_Pack(" << baseClasses.size() << ',' << endl;
QStringList bases;
- foreach (const AbstractMetaClass* base, baseClasses)
+ for (const AbstractMetaClass *base : baseClasses)
bases << QLatin1String("(PyObject*)") + cpythonTypeNameExt(base->typeEntry());
Indentation indent(INDENT);
QString separator;
@@ -4842,7 +4933,8 @@ void CppGenerator::writeClassRegister(QTextStream &s,
}
AbstractMetaEnumList classEnums = metaClass->enums();
- foreach (AbstractMetaClass* innerClass, metaClass->innerClasses())
+ const AbstractMetaClassList &innerClasses = metaClass->innerClasses();
+ for (AbstractMetaClass *innerClass : innerClasses)
lookForEnumsInClassesNotToBeGenerated(classEnums, innerClass);
ErrorCode errorCode(QString::null);
@@ -4852,7 +4944,8 @@ void CppGenerator::writeClassRegister(QTextStream &s,
writeSignalInitialization(s, metaClass);
// Write static fields
- foreach (const AbstractMetaField* field, metaClass->fields()) {
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (const AbstractMetaField *field : fields) {
if (!field->isStatic())
continue;
s << INDENT << QLatin1String("PyDict_SetItemString(") + cpythonTypeName(metaClass) + QLatin1String(".super.ht_type.tp_dict, \"");
@@ -4897,7 +4990,7 @@ void CppGenerator::writeInitQtMetaTypeFunctionBody(QTextStream &s, GeneratorCont
const AbstractMetaClass* enclosingClass = metaClass->enclosingClass();
while (enclosingClass) {
if (enclosingClass->typeEntry()->generateCode())
- nameVariants << (enclosingClass->name() + QLatin1String("::") + nameVariants.last());
+ nameVariants << (enclosingClass->name() + QLatin1String("::") + nameVariants.constLast());
enclosingClass = enclosingClass->enclosingClass();
}
@@ -4912,7 +5005,8 @@ void CppGenerator::writeInitQtMetaTypeFunctionBody(QTextStream &s, GeneratorCont
bool canBeValue = false;
if (!isObjectType(metaClass)) {
// check if there's a empty ctor
- foreach (AbstractMetaFunction* func, metaClass->functions()) {
+ const AbstractMetaFunctionList &funcs = metaClass->functions();
+ for (AbstractMetaFunction *func : funcs) {
if (func->isConstructor() && !func->arguments().count()) {
canBeValue = true;
break;
@@ -4921,7 +5015,7 @@ void CppGenerator::writeInitQtMetaTypeFunctionBody(QTextStream &s, GeneratorCont
}
if (canBeValue) {
- foreach (const QString &name, nameVariants) {
+ for (const QString &name : qAsConst(nameVariants)) {
if (name == QLatin1String("iterator")) {
qCWarning(lcShiboken).noquote().nospace()
<< QString::fromLatin1("%1:%2 FIXME:\n"
@@ -4935,9 +5029,10 @@ void CppGenerator::writeInitQtMetaTypeFunctionBody(QTextStream &s, GeneratorCont
}
}
- foreach (AbstractMetaEnum* metaEnum, metaClass->enums()) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (AbstractMetaEnum *metaEnum : enums) {
if (!metaEnum->isPrivate() && !metaEnum->isAnonymous()) {
- foreach (const QString &name, nameVariants)
+ for (const QString &name : qAsConst(nameVariants))
s << INDENT << "qRegisterMetaType< ::" << metaEnum->typeEntry()->qualifiedCppName() << " >(\"" << name << "::" << metaEnum->name() << "\");" << endl;
if (metaEnum->typeEntry()->flags()) {
@@ -4965,8 +5060,8 @@ void CppGenerator::writeTypeDiscoveryFunction(QTextStream& s, const AbstractMeta
s << INDENT << "return cptr;" << endl;
}
} else if (metaClass->isPolymorphic()) {
- AbstractMetaClassList ancestors = getAllAncestors(metaClass);
- foreach (AbstractMetaClass* ancestor, ancestors) {
+ const AbstractMetaClassList &ancestors = getAllAncestors(metaClass);
+ for (AbstractMetaClass *ancestor : ancestors) {
if (ancestor->baseClass())
continue;
if (ancestor->isPolymorphic()) {
@@ -5077,7 +5172,8 @@ void CppGenerator::writeGetattroFunction(QTextStream& s, GeneratorContext &conte
}
s << INDENT << '}' << endl;
- foreach (const AbstractMetaFunction* func, getMethodsWithBothStaticAndNonStaticMethods(metaClass)) {
+ const AbstractMetaFunctionList &funcs = getMethodsWithBothStaticAndNonStaticMethods(metaClass);
+ for (const AbstractMetaFunction *func : funcs) {
QString defName = cpythonMethodDefinitionName(func);
s << INDENT << "static PyMethodDef non_static_" << defName << " = {" << endl;
{
@@ -5172,7 +5268,7 @@ bool CppGenerator::finishGeneration()
const FunctionGroupMap &functionGroups = getFunctionGroups();
for (FunctionGroupMapIt it = functionGroups.cbegin(), end = functionGroups.cend(); it != end; ++it) {
AbstractMetaFunctionList overloads;
- foreach (AbstractMetaFunction* func, it.value()) {
+ for (AbstractMetaFunction *func : it.value()) {
if (!func->isModifiedRemoved()) {
overloads.append(func);
if (func->typeEntry())
@@ -5203,7 +5299,7 @@ bool CppGenerator::finishGeneration()
}
const AbstractMetaClassList lst = classesTopologicalSorted(additionalDependencies);
- foreach (const AbstractMetaClass* cls, lst) {
+ for (const AbstractMetaClass *cls : lst){
if (!shouldGenerate(cls))
continue;
@@ -5219,7 +5315,8 @@ bool CppGenerator::finishGeneration()
}
// Initialize smart pointer types.
- foreach (const AbstractMetaType *metaType, instantiatedSmartPointers()) {
+ const QVector<const AbstractMetaType *> &smartPtrs = instantiatedSmartPointers();
+ for (const AbstractMetaType *metaType : smartPtrs) {
GeneratorContext context(0, metaType, true);
QString initFunctionName = getInitFunctionName(context);
s_classInitDecl << "void init_" << initFunctionName << "(PyObject* module);" << endl;
@@ -5255,13 +5352,14 @@ bool CppGenerator::finishGeneration()
}
s << "#include \"" << getModuleHeaderFileName() << '"' << endl << endl;
- foreach (const Include& include, includes)
+ for (const Include &include : qAsConst(includes))
s << include;
s << endl;
// Global enums
AbstractMetaEnumList globalEnums = this->globalEnums();
- foreach (const AbstractMetaClass* metaClass, classes()) {
+ const AbstractMetaClassList &classList = classes();
+ for (const AbstractMetaClass *metaClass : classList) {
const AbstractMetaClass* encClass = metaClass->enclosingClass();
if (encClass && encClass->typeEntry()->codeGeneration() != TypeEntry::GenerateForSubclass)
continue;
@@ -5273,13 +5371,13 @@ bool CppGenerator::finishGeneration()
//Extra includes
s << endl << "// Extra includes" << endl;
- QList<Include> extraIncludes;
+ QVector<Include> extraIncludes;
if (moduleEntry)
extraIncludes = moduleEntry->extraIncludes();
- foreach (AbstractMetaEnum* cppEnum, globalEnums)
+ for (AbstractMetaEnum *cppEnum : qAsConst(globalEnums))
extraIncludes.append(cppEnum->typeEntry()->extraIncludes());
qSort(extraIncludes.begin(), extraIncludes.end());
- foreach (const Include& inc, extraIncludes)
+ for (const Include &inc : qAsConst(extraIncludes))
s << inc;
s << endl;
@@ -5334,7 +5432,7 @@ bool CppGenerator::finishGeneration()
s << "// Enum definitions ";
s << "------------------------------------------------------------" << endl;
- foreach (const AbstractMetaEnum* cppEnum, globalEnums) {
+ for (const AbstractMetaEnum *cppEnum : qAsConst(globalEnums)) {
if (cppEnum->isAnonymous() || cppEnum->isPrivate())
continue;
writeEnumConverterFunctions(s, cppEnum);
@@ -5350,10 +5448,10 @@ bool CppGenerator::finishGeneration()
}
}
- QStringList requiredModules = typeDb->requiredTargetImports();
+ const QStringList &requiredModules = typeDb->requiredTargetImports();
if (!requiredModules.isEmpty())
s << "// Required modules' type and converter arrays." << endl;
- foreach (const QString& requiredModule, requiredModules) {
+ for (const QString &requiredModule : requiredModules) {
s << "PyTypeObject** " << cppApiVariableName(requiredModule) << ';' << endl;
s << "SbkConverter** " << convertersVariableName(requiredModule) << ';' << endl;
}
@@ -5367,7 +5465,7 @@ bool CppGenerator::finishGeneration()
for (ExtendedConverterData::const_iterator it = extendedConverters.cbegin(), end = extendedConverters.cend(); it != end; ++it) {
const TypeEntry *externalType = it.key();
s << "// Extended implicit conversions for " << externalType->qualifiedTargetLangName() << '.' << endl;
- foreach (const AbstractMetaClass* sourceClass, extendedConverters[externalType]) {
+ for (const AbstractMetaClass *sourceClass : it.value()) {
AbstractMetaType* sourceType = buildAbstractMetaTypeFromAbstractMetaClass(sourceClass);
AbstractMetaType* targetType = buildAbstractMetaTypeFromTypeEntry(externalType);
writePythonToCppConversionFunctions(s, sourceType, targetType);
@@ -5375,10 +5473,10 @@ bool CppGenerator::finishGeneration()
}
}
- QList<const CustomConversion*> typeConversions = getPrimitiveCustomConversions();
+ const QVector<const CustomConversion *> &typeConversions = getPrimitiveCustomConversions();
if (!typeConversions.isEmpty()) {
s << endl << "// Primitive Type converters." << endl << endl;
- foreach (const CustomConversion* conversion, typeConversions) {
+ for (const CustomConversion *conversion : typeConversions) {
s << "// C++ to Python conversion for type '" << conversion->ownerType()->qualifiedCppName() << "'." << endl;
writeCppToPythonFunction(s, conversion);
writeCustomConverterFunctions(s, conversion);
@@ -5386,10 +5484,10 @@ bool CppGenerator::finishGeneration()
s << endl;
}
- QList<const AbstractMetaType*> containers = instantiatedContainers();
+ const QVector<const AbstractMetaType *> &containers = instantiatedContainers();
if (!containers.isEmpty()) {
s << "// Container Type converters." << endl << endl;
- foreach (const AbstractMetaType* container, containers) {
+ for (const AbstractMetaType *container : containers) {
s << "// C++ to Python conversion for type '" << container->cppSignature() << "'." << endl;
writeContainerConverterFunctions(s, container);
}
@@ -5426,7 +5524,7 @@ bool CppGenerator::finishGeneration()
s << endl;
}
- foreach (const QString& requiredModule, typeDb->requiredTargetImports()) {
+ for (const QString& requiredModule : requiredModules) {
s << INDENT << "{" << endl;
{
Indentation indentation(INDENT);
@@ -5468,7 +5566,7 @@ bool CppGenerator::finishGeneration()
if (!typeConversions.isEmpty()) {
s << endl;
- foreach (const CustomConversion* conversion, typeConversions) {
+ for (const CustomConversion *conversion : typeConversions) {
writePrimitiveConverterInitialization(s, conversion);
s << endl;
}
@@ -5476,7 +5574,7 @@ bool CppGenerator::finishGeneration()
if (!containers.isEmpty()) {
s << endl;
- foreach (const AbstractMetaType* container, containers) {
+ for (const AbstractMetaType *container : containers) {
writeContainerConverterInitialization(s, container);
s << endl;
}
@@ -5493,7 +5591,8 @@ bool CppGenerator::finishGeneration()
writeEnumsInitialization(s, globalEnums);
s << INDENT << "// Register primitive types converters." << endl;
- foreach(const PrimitiveTypeEntry* pte, primitiveTypes()) {
+ const PrimitiveTypeEntryList &primitiveTypeList = primitiveTypes();
+ for (const PrimitiveTypeEntry *pte : primitiveTypeList) {
if (!pte->generateCode() || !pte->isCppPrimitive())
continue;
const TypeEntry *referencedType = pte->basicReferencedTypeEntry();
@@ -5534,7 +5633,7 @@ bool CppGenerator::finishGeneration()
}
if (usePySideExtensions()) {
- foreach (AbstractMetaEnum* metaEnum, globalEnums)
+ for (AbstractMetaEnum *metaEnum : qAsConst(globalEnums))
if (!metaEnum->isAnonymous()) {
s << INDENT << "qRegisterMetaType< ::" << metaEnum->typeEntry()->qualifiedCppName() << " >(\"" << metaEnum->name() << "\");" << endl;
}
@@ -5547,9 +5646,8 @@ bool CppGenerator::finishGeneration()
s << "// Multiple signatures have their index \"n:\" in front." << endl;
s << "const char " << moduleName() << "_SignaturesString[] = \"\"" << endl;
QString line;
- while (signatureStream.readLineInto(&line)) {
+ while (signatureStream.readLineInto(&line))
s << INDENT << '"' << line << "\\n\"" << endl;
- }
s << ';' << endl;
// finish the rest of __signature__ initialization.
s << INDENT << "FinishSignatureInitialization(module, " << moduleName()
@@ -5693,7 +5791,7 @@ void CppGenerator::writeStdListWrapperMethods(QTextStream &s, GeneratorContext &
s << INDENT << metaClass->qualifiedCppName() << "::iterator _item = " CPP_SELF_VAR "->begin();" << endl;
s << INDENT << "for (Py_ssize_t pos = 0; pos < _i; pos++) _item++;" << endl;
- const AbstractMetaType* itemType = metaClass->templateBaseClassInstantiations().first();
+ const AbstractMetaType* itemType = metaClass->templateBaseClassInstantiations().constFirst();
s << INDENT << "return ";
writeToPythonConversion(s, itemType, metaClass, QLatin1String("*_item"));
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.h b/sources/shiboken2/generator/shiboken2/cppgenerator.h
index 4877a1694..cce1842ab 100644
--- a/sources/shiboken2/generator/shiboken2/cppgenerator.h
+++ b/sources/shiboken2/generator/shiboken2/cppgenerator.h
@@ -39,12 +39,12 @@ class CppGenerator : public ShibokenGenerator
public:
CppGenerator();
protected:
- QString fileNamePrefix() const;
- QString fileNameForContext(GeneratorContext &context) const;
- QList<AbstractMetaFunctionList> filterGroupedOperatorFunctions(const AbstractMetaClass* metaClass,
- uint query);
- void generateClass(QTextStream& s, GeneratorContext &classContext);
- bool finishGeneration();
+ QString fileNamePrefix() const override;
+ QString fileNameForContext(GeneratorContext &context) const override;
+ QVector<AbstractMetaFunctionList> filterGroupedOperatorFunctions(const AbstractMetaClass* metaClass,
+ uint query);
+ void generateClass(QTextStream& s, GeneratorContext &classContext) override;
+ bool finishGeneration() override;
private:
void writeConstructorNative(QTextStream& s, const AbstractMetaFunction* func);
@@ -291,7 +291,7 @@ private:
void writeEnumConverterInitialization(QTextStream& s, const TypeEntry* enumType);
void writeEnumConverterInitialization(QTextStream& s, const AbstractMetaEnum* metaEnum);
void writeContainerConverterInitialization(QTextStream& s, const AbstractMetaType* type);
- void writeExtendedConverterInitialization(QTextStream& s, const TypeEntry* externalType, const QList<const AbstractMetaClass*>& conversions);
+ void writeExtendedConverterInitialization(QTextStream& s, const TypeEntry* externalType, const QVector<const AbstractMetaClass*>& conversions);
void writeParentChildManagement(QTextStream& s, const AbstractMetaFunction* func, bool userHeuristicForReturn);
bool writeParentChildManagement(QTextStream& s, const AbstractMetaFunction* func, int argIndex, bool userHeuristicPolicy);
diff --git a/sources/shiboken2/generator/shiboken2/headergenerator.cpp b/sources/shiboken2/generator/shiboken2/headergenerator.cpp
index 7158c370b..a033cb69a 100644
--- a/sources/shiboken2/generator/shiboken2/headergenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/headergenerator.cpp
@@ -35,7 +35,6 @@
#include <QtCore/QDir>
#include <QtCore/QTextStream>
#include <QtCore/QVariant>
-#include <QtCore/QRegExp>
#include <QtCore/QDebug>
QString HeaderGenerator::fileNamePrefix() const
@@ -139,15 +138,15 @@ void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classConte
s << endl << '{' << endl << "public:" << endl;
- bool hasVirtualFunction = false;
- foreach (AbstractMetaFunction *func, filterFunctions(metaClass)) {
- if (func->isVirtual())
- hasVirtualFunction = true;
- writeFunction(s, func);
+ const AbstractMetaFunctionList &funcs = filterFunctions(metaClass);
+ for (AbstractMetaFunction *func : funcs) {
+ if ((func->attributes() & AbstractMetaAttributes::FinalCppMethod) == 0)
+ writeFunction(s, func);
}
if (avoidProtectedHack() && metaClass->hasProtectedFields()) {
- foreach (AbstractMetaField* field, metaClass->fields()) {
+ const AbstractMetaFieldList &fields = metaClass->fields();
+ for (AbstractMetaField *field : fields) {
if (!field->isProtected())
continue;
writeProtectedFieldAccessors(s, field);
@@ -162,8 +161,6 @@ void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classConte
if (avoidProtectedHack() && metaClass->hasPrivateDestructor())
s << "// C++11: need to declare (unimplemented) destructor because "
"the base class destructor is private." << endl;
- if (metaClass->hasVirtualDestructor() || hasVirtualFunction)
- s << "virtual ";
s << '~' << wrapperName << "();" << endl;
}
@@ -172,8 +169,8 @@ void HeaderGenerator::generateClass(QTextStream &s, GeneratorContext &classConte
if ((!avoidProtectedHack() || !metaClass->hasPrivateDestructor())
&& usePySideExtensions() && metaClass->isQObject()) {
s << "public:\n";
- s << INDENT << "virtual int qt_metacall(QMetaObject::Call call, int id, void** args);" << endl;
- s << INDENT << "virtual void* qt_metacast(const char* _clname);" << endl;
+ s << INDENT << "int qt_metacall(QMetaObject::Call call, int id, void** args) override;" << endl;
+ s << INDENT << "void* qt_metacast(const char* _clname) override;" << endl;
}
if (m_inheritedOverloads.size()) {
@@ -228,7 +225,8 @@ void HeaderGenerator::writeFunction(QTextStream& s, const AbstractMetaFunction*
s << func->ownerClass()->qualifiedCppName() << "::";
s << func->originalName() << '(';
QStringList args;
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
QString argName = arg->name();
const TypeEntry* enumTypeEntry = 0;
if (arg->type()->isFlags())
@@ -244,8 +242,9 @@ void HeaderGenerator::writeFunction(QTextStream& s, const AbstractMetaFunction*
}
// pure virtual functions need a default implementation
- if ((func->isPrivate() && !visibilityModifiedToPrivate(func))
- || (func->isModifiedRemoved() && !func->isAbstract()))
+ const bool notAbstract = !func->isAbstract();
+ if ((func->isPrivate() && notAbstract && !visibilityModifiedToPrivate(func))
+ || (func->isModifiedRemoved() && notAbstract))
return;
if (avoidProtectedHack() && func->ownerClass()->hasPrivateDestructor()
@@ -256,15 +255,18 @@ void HeaderGenerator::writeFunction(QTextStream& s, const AbstractMetaFunction*
s << INDENT;
Options virtualOption = Generator::OriginalTypeDescription;
- if (func->isVirtual() || func->isAbstract())
- s << "virtual ";
- else if (!func->hasSignatureModifications())
+ const bool virtualFunc = func->isVirtual() || func->isAbstract();
+ if (!virtualFunc && !func->hasSignatureModifications())
virtualOption = Generator::NoOption;
- s << functionSignature(func, QString(), QString(), virtualOption) << ';' << endl;
+ s << functionSignature(func, QString(), QString(), virtualOption);
+ if (virtualFunc)
+ s << " override";
+ s << ';' << endl;
// Check if this method hide other methods in base classes
- foreach (const AbstractMetaFunction* f, func->ownerClass()->functions()) {
+ const AbstractMetaFunctionList &ownerFuncs = func->ownerClass()->functions();
+ for (const AbstractMetaFunction *f : ownerFuncs) {
if (f != func
&& !f->isConstructor()
&& !f->isPrivate()
@@ -317,7 +319,8 @@ void HeaderGenerator::writeTypeIndexDefine(QTextStream& s, const AbstractMetaCla
if (!metaClass->typeEntry()->generateCode())
return;
writeTypeIndexDefineLine(s, metaClass->typeEntry());
- foreach (const AbstractMetaEnum* metaEnum, metaClass->enums()) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (const AbstractMetaEnum *metaEnum : enums) {
if (metaEnum->isPrivate())
continue;
writeTypeIndexDefineLine(s, metaEnum->typeEntry());
@@ -341,18 +344,20 @@ bool HeaderGenerator::finishGeneration()
macrosStream << "// Type indices" << endl;
AbstractMetaEnumList globalEnums = this->globalEnums();
- foreach (const AbstractMetaClass* metaClass, classes()) {
+ const AbstractMetaClassList &classList = classes();
+ for (const AbstractMetaClass *metaClass : classList) {
writeTypeIndexDefine(macrosStream, metaClass);
lookForEnumsInClassesNotToBeGenerated(globalEnums, metaClass);
}
- foreach (const AbstractMetaEnum* metaEnum, globalEnums)
+ for (const AbstractMetaEnum *metaEnum : qAsConst(globalEnums))
writeTypeIndexDefineLine(macrosStream, metaEnum->typeEntry());
// Write the smart pointer define indexes.
int smartPointerCountIndex = getMaxTypeIndex();
int smartPointerCount = 0;
- foreach (const AbstractMetaType *metaType, instantiatedSmartPointers()) {
+ const QVector<const AbstractMetaType *> &instantiatedSmartPtrs = instantiatedSmartPointers();
+ for (const AbstractMetaType *metaType : instantiatedSmartPtrs) {
QString variableName = getTypeIndexVariableName(metaType);
macrosStream << "#define ";
macrosStream.setFieldWidth(60);
@@ -378,9 +383,9 @@ bool HeaderGenerator::finishGeneration()
// TODO-CONVERTER ------------------------------------------------------------------------------
// Using a counter would not do, a fix must be made to APIExtractor's getTypeIndex().
macrosStream << "// Converter indices" << endl;
- QList<const PrimitiveTypeEntry*> primitives = primitiveTypes();
+ const PrimitiveTypeEntryList &primitives = primitiveTypes();
int pCount = 0;
- foreach (const PrimitiveTypeEntry* ptype, primitives) {
+ for (const PrimitiveTypeEntry *ptype : primitives) {
/* Note: do not generate indices for typedef'd primitive types
* as they'll use the primitive type converters instead, so we
* don't need to create any other.
@@ -391,7 +396,8 @@ bool HeaderGenerator::finishGeneration()
_writeTypeIndexDefineLine(macrosStream, getTypeIndexVariableName(ptype), pCount++);
}
- foreach (const AbstractMetaType* container, instantiatedContainers()) {
+ const QVector<const AbstractMetaType *> &containers = instantiatedContainers();
+ for (const AbstractMetaType *container : containers) {
//_writeTypeIndexDefineLine(macrosStream, getTypeIndexVariableName(container), pCount);
// DEBUG
QString variableName = getTypeIndexVariableName(container);
@@ -412,7 +418,7 @@ bool HeaderGenerator::finishGeneration()
// TODO-CONVERTER ------------------------------------------------------------------------------
macrosStream << "// Macros for type check" << endl;
- foreach (const AbstractMetaEnum* cppEnum, globalEnums) {
+ for (const AbstractMetaEnum *cppEnum : qAsConst(globalEnums)) {
if (cppEnum->isAnonymous() || cppEnum->isPrivate())
continue;
includes << cppEnum->typeEntry()->include();
@@ -420,7 +426,7 @@ bool HeaderGenerator::finishGeneration()
writeSbkTypeFunction(typeFunctions, cppEnum);
}
- foreach (AbstractMetaClass* metaClass, classes()) {
+ for (AbstractMetaClass *metaClass : classList) {
if (!shouldGenerate(metaClass))
continue;
@@ -428,7 +434,8 @@ bool HeaderGenerator::finishGeneration()
const TypeEntry* classType = metaClass->typeEntry();
includes << classType->include();
- foreach (const AbstractMetaEnum* cppEnum, metaClass->enums()) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (const AbstractMetaEnum *cppEnum : enums) {
if (cppEnum->isAnonymous() || cppEnum->isPrivate())
continue;
EnumTypeEntry* enumType = cppEnum->typeEntry();
@@ -441,7 +448,7 @@ bool HeaderGenerator::finishGeneration()
writeSbkTypeFunction(typeFunctions, metaClass);
}
- foreach (const AbstractMetaType *metaType, instantiatedSmartPointers()) {
+ for (const AbstractMetaType *metaType : instantiatedSmartPtrs) {
const TypeEntry *classType = metaType->typeEntry();
includes << classType->include();
writeSbkTypeFunction(typeFunctions, metaType);
@@ -477,25 +484,27 @@ bool HeaderGenerator::finishGeneration()
QStringList requiredTargetImports = TypeDatabase::instance()->requiredTargetImports();
if (!requiredTargetImports.isEmpty()) {
s << "// Module Includes" << endl;
- foreach (const QString& requiredModule, requiredTargetImports)
+ for (const QString &requiredModule : qAsConst(requiredTargetImports))
s << "#include <" << getModuleHeaderFileName(requiredModule) << ">" << endl;
s << endl;
}
s << "// Binded library includes" << endl;
- foreach (const Include& include, includes)
+ for (const Include &include : qAsConst(includes))
s << include;
if (!primitiveTypes().isEmpty()) {
s << "// Conversion Includes - Primitive Types" << endl;
- foreach (const PrimitiveTypeEntry* ptype, primitiveTypes())
+ const PrimitiveTypeEntryList &primitiveTypeList = primitiveTypes();
+ for (const PrimitiveTypeEntry *ptype : primitiveTypeList)
s << ptype->include();
s << endl;
}
if (!containerTypes().isEmpty()) {
s << "// Conversion Includes - Container Types" << endl;
- foreach (const ContainerTypeEntry* ctype, containerTypes())
+ const ContainerTypeEntryList &containerTypeList = containerTypes();
+ for (const ContainerTypeEntry *ctype : containerTypeList)
s << ctype->include();
s << endl;
}
@@ -560,13 +569,14 @@ void HeaderGenerator::writeSbkTypeFunction(QTextStream &s, const AbstractMetaTyp
void HeaderGenerator::writeInheritedOverloads(QTextStream& s)
{
- foreach (const AbstractMetaFunction* func, m_inheritedOverloads) {
+ for (const AbstractMetaFunction *func : qAsConst(m_inheritedOverloads)) {
s << INDENT << "inline ";
s << functionSignature(func, QString(), QString(), Generator::EnumAsInts|Generator::OriginalTypeDescription) << " { ";
s << (func->type() ? "return " : "");
s << func->ownerClass()->qualifiedCppName() << "::" << func->originalName() << '(';
QStringList args;
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
QString argName = arg->name();
const TypeEntry* enumTypeEntry = 0;
if (arg->type()->isFlags())
diff --git a/sources/shiboken2/generator/shiboken2/headergenerator.h b/sources/shiboken2/generator/shiboken2/headergenerator.h
index 72dcbf69f..d9dc8ffe8 100644
--- a/sources/shiboken2/generator/shiboken2/headergenerator.h
+++ b/sources/shiboken2/generator/shiboken2/headergenerator.h
@@ -41,12 +41,12 @@ class AbstractMetaFunction;
class HeaderGenerator : public ShibokenGenerator
{
public:
- QMap<QString, QString> options() const { return QMap<QString, QString>(); }
+ OptionDescriptions options() const override { return OptionDescriptions(); }
protected:
- QString fileNamePrefix() const;
- QString fileNameForContext(GeneratorContext &context) const;
- void generateClass(QTextStream& s, GeneratorContext &classContext);
- bool finishGeneration();
+ QString fileNamePrefix() const override;
+ QString fileNameForContext(GeneratorContext &context) const override;
+ void generateClass(QTextStream& s, GeneratorContext &classContext) override;
+ bool finishGeneration() override;
private:
void writeCopyCtor(QTextStream &s, const AbstractMetaClass* metaClass) const;
diff --git a/sources/shiboken2/generator/shiboken2/overloaddata.cpp b/sources/shiboken2/generator/shiboken2/overloaddata.cpp
index 8731fe911..3340ee957 100644
--- a/sources/shiboken2/generator/shiboken2/overloaddata.cpp
+++ b/sources/shiboken2/generator/shiboken2/overloaddata.cpp
@@ -53,7 +53,8 @@ static QString getTypeName(const AbstractMetaType* type)
QString typeName = typeEntry->name();
if (typeEntry->isContainer()) {
QStringList types;
- foreach (const AbstractMetaType* cType, type->instantiations()) {
+ const AbstractMetaTypeList &instantiations = type->instantiations();
+ for (const AbstractMetaType *cType : instantiations) {
const TypeEntry *typeEntry = getReferencedTypeEntry(cType->typeEntry());
types << typeEntry->name();
}
@@ -93,7 +94,7 @@ static bool typesAreEqual(const AbstractMetaType* typeA, const AbstractMetaType*
*/
struct OverloadSortData
{
- OverloadSortData() : counter(0) {};
+ OverloadSortData() : counter(0) {}
/**
* Adds a typeName into the type map without associating it with
@@ -141,10 +142,11 @@ static QString getImplicitConversionTypeName(const AbstractMetaType* containerTy
else if (function->isConversionOperator())
impConv = function->ownerClass()->typeEntry()->name();
else
- impConv = getTypeName(function->arguments().first()->type());
+ impConv = getTypeName(function->arguments().constFirst()->type());
QStringList types;
- foreach (const AbstractMetaType* otherType, containerType->instantiations())
+ const AbstractMetaTypeList &instantiations = containerType->instantiations();
+ for (const AbstractMetaType *otherType : instantiations)
types << (otherType == instantiation ? impConv : getTypeName(otherType));
const ContainerTypeEntry* containerTypeEntry = dynamic_cast<const ContainerTypeEntry*>(containerType->typeEntry());
@@ -153,7 +155,7 @@ static QString getImplicitConversionTypeName(const AbstractMetaType* containerTy
}
static QString msgCyclicDependency(const QString &funcName, const QString &graphName,
- const QList<const AbstractMetaFunction *> &involvedConversions)
+ const OverloadData::MetaFunctionList &involvedConversions)
{
QString result;
QTextStream str(&result);
@@ -209,7 +211,7 @@ void OverloadData::sortNextOverloads()
<< QLatin1String("long");
// sort the children overloads
- foreach(OverloadData *ov, m_nextOverloadData)
+ for (OverloadData *ov : qAsConst(m_nextOverloadData))
ov->sortNextOverloads();
if (m_nextOverloadData.size() <= 1)
@@ -218,7 +220,7 @@ void OverloadData::sortNextOverloads()
// Populates the OverloadSortData object containing map and reverseMap, to map type names to ids,
// these ids will be used by the topological sort algorithm, because is easier and faster to work
// with graph sorting using integers.
- foreach(OverloadData* ov, m_nextOverloadData) {
+ for (OverloadData *ov : qAsConst(m_nextOverloadData)) {
sortData.mapType(ov);
const QString typeName(getTypeName(ov));
@@ -240,7 +242,8 @@ void OverloadData::sortNextOverloads()
qstringIndex = sortData.lastProcessedItemId();
}
- foreach (const AbstractMetaType* instantiation, ov->argType()->instantiations()) {
+ const AbstractMetaTypeList &instantiations = ov->argType()->instantiations();
+ for (const AbstractMetaType *instantiation : instantiations) {
// Add dependencies for type instantiation of container.
QString typeName = getTypeName(instantiation);
sortData.mapType(typeName);
@@ -251,10 +254,11 @@ void OverloadData::sortNextOverloads()
// as Point must come before the PointF instantiation, or else list<Point> will never
// be called. In the case of primitive types, list<double> must come before list<int>.
if (instantiation->isPrimitive() && (signedIntegerPrimitives.contains(instantiation->name()))) {
- foreach (const QString& primitive, nonIntegerPrimitives)
+ for (const QString &primitive : qAsConst(nonIntegerPrimitives))
sortData.mapType(getImplicitConversionTypeName(ov->argType(), instantiation, 0, primitive));
} else {
- foreach (const AbstractMetaFunction* function, m_generator->implicitConversions(instantiation))
+ const AbstractMetaFunctionList &funcs = m_generator->implicitConversions(instantiation);
+ for (const AbstractMetaFunction *function : funcs)
sortData.mapType(getImplicitConversionTypeName(ov->argType(), instantiation, function));
}
}
@@ -287,20 +291,21 @@ void OverloadData::sortNextOverloads()
QStringList classesWithIntegerImplicitConversion;
- QList<const AbstractMetaFunction *> involvedConversions;
+ MetaFunctionList involvedConversions;
- foreach(OverloadData* ov, m_nextOverloadData) {
+ for (OverloadData *ov : qAsConst(m_nextOverloadData)) {
const AbstractMetaType* targetType = ov->argType();
const QString targetTypeEntryName(getTypeName(ov));
int targetTypeId = sortData.map[targetTypeEntryName];
// Process implicit conversions
- foreach(AbstractMetaFunction* function, m_generator->implicitConversions(targetType)) {
+ const AbstractMetaFunctionList &functions = m_generator->implicitConversions(targetType);
+ for (AbstractMetaFunction *function : functions) {
QString convertibleType;
if (function->isConversionOperator())
convertibleType = function->ownerClass()->typeEntry()->name();
else
- convertibleType = getTypeName(function->arguments().first()->type());
+ convertibleType = getTypeName(function->arguments().constFirst()->type());
if (convertibleType == QLatin1String("int") || convertibleType == QLatin1String("unsigned int"))
classesWithIntegerImplicitConversion << targetTypeEntryName;
@@ -318,9 +323,10 @@ void OverloadData::sortNextOverloads()
}
// Process inheritance relationships
- if (targetType->isValue() || targetType->isObject()) {
+ if (targetType->isValue() || targetType->isObject() || targetType->isQObject()) {
const AbstractMetaClass *metaClass = AbstractMetaClass::findClass(m_generator->classes(), targetType->typeEntry());
- foreach (const AbstractMetaClass* ancestor, m_generator->getAllAncestors(metaClass)) {
+ const AbstractMetaClassList &ancestors = m_generator->getAllAncestors(metaClass);
+ for (const AbstractMetaClass *ancestor : ancestors) {
QString ancestorTypeName = ancestor->typeEntry()->name();
if (!sortData.map.contains(ancestorTypeName))
continue;
@@ -331,7 +337,8 @@ void OverloadData::sortNextOverloads()
}
// Process template instantiations
- foreach (const AbstractMetaType* instantiation, targetType->instantiations()) {
+ const AbstractMetaTypeList &instantiations = targetType->instantiations();
+ for (const AbstractMetaType *instantiation : instantiations) {
if (sortData.map.contains(getTypeName(instantiation))) {
int convertible = sortData.map[getTypeName(instantiation)];
@@ -339,14 +346,15 @@ void OverloadData::sortNextOverloads()
graph.addEdge(convertible, targetTypeId);
if (instantiation->isPrimitive() && (signedIntegerPrimitives.contains(instantiation->name()))) {
- foreach (const QString& primitive, nonIntegerPrimitives) {
+ for (const QString &primitive : qAsConst(nonIntegerPrimitives)) {
QString convertibleTypeName = getImplicitConversionTypeName(ov->argType(), instantiation, 0, primitive);
if (!graph.containsEdge(targetTypeId, sortData.map[convertibleTypeName])) // Avoid cyclic dependency.
graph.addEdge(sortData.map[convertibleTypeName], targetTypeId);
}
} else {
- foreach (const AbstractMetaFunction* function, m_generator->implicitConversions(instantiation)) {
+ const AbstractMetaFunctionList &funcs = m_generator->implicitConversions(instantiation);
+ for (const AbstractMetaFunction *function : funcs) {
QString convertibleTypeName = getImplicitConversionTypeName(ov->argType(), instantiation, function);
if (!graph.containsEdge(targetTypeId, sortData.map[convertibleTypeName])) { // Avoid cyclic dependency.
graph.addEdge(sortData.map[convertibleTypeName], targetTypeId);
@@ -396,22 +404,22 @@ void OverloadData::sortNextOverloads()
if (sortData.map.contains(QLatin1String("QString")) && sortData.map.contains(QLatin1String("QByteArray")))
graph.addEdge(sortData.map[QLatin1String("QString")], sortData.map[QLatin1String("QByteArray")]);
- foreach(OverloadData* ov, m_nextOverloadData) {
+ for (OverloadData *ov : qAsConst(m_nextOverloadData)) {
const AbstractMetaType* targetType = ov->argType();
if (!targetType->isEnum())
continue;
QString targetTypeEntryName = getTypeName(targetType);
// Enum values must precede types implicitly convertible from "int" or "unsigned int".
- foreach (const QString& implicitFromInt, classesWithIntegerImplicitConversion)
+ for (const QString &implicitFromInt : qAsConst(classesWithIntegerImplicitConversion))
graph.addEdge(sortData.map[targetTypeEntryName], sortData.map[implicitFromInt]);
}
// Special case for double(int i) (not tracked by m_generator->implicitConversions
- foreach (const QString& signedIntegerName, signedIntegerPrimitives) {
+ for (const QString &signedIntegerName : qAsConst(signedIntegerPrimitives)) {
if (sortData.map.contains(signedIntegerName)) {
- foreach (const QString& nonIntegerName, nonIntegerPrimitives) {
+ for (const QString &nonIntegerName : qAsConst(nonIntegerPrimitives)) {
if (sortData.map.contains(nonIntegerName))
graph.addEdge(sortData.map[nonIntegerName], sortData.map[signedIntegerName]);
}
@@ -419,7 +427,7 @@ void OverloadData::sortNextOverloads()
}
// sort the overloads topologically based on the dependency graph.
- QLinkedList<int> unmappedResult = graph.topologicalSort();
+ const QLinkedList<int> unmappedResult = graph.topologicalSort();
if (unmappedResult.isEmpty()) {
QString funcName = referenceFunction()->name();
if (referenceFunction()->ownerClass())
@@ -427,16 +435,15 @@ void OverloadData::sortNextOverloads()
// Dump overload graph
QString graphName = QDir::tempPath() + QLatin1Char('/') + funcName + QLatin1String(".dot");
- QHash<QString, int>::const_iterator it = sortData.map.begin();
QHash<int, QString> nodeNames;
- for (; it != sortData.map.end(); ++it)
+ for (auto it = sortData.map.cbegin(), end = sortData.map.cend(); it != end; ++it)
nodeNames.insert(it.value(), it.key());
graph.dumpDot(nodeNames, graphName);
qCWarning(lcShiboken).noquote() << qPrintable(msgCyclicDependency(funcName, graphName, involvedConversions));
}
m_nextOverloadData.clear();
- foreach(int i, unmappedResult) {
+ for (int i : unmappedResult) {
if (!sortData.reverseMap[i])
continue;
m_nextOverloadData << sortData.reverseMap[i];
@@ -464,7 +471,7 @@ OverloadData::OverloadData(const AbstractMetaFunctionList& overloads, const Shib
: m_minArgs(256), m_maxArgs(0), m_argPos(-1), m_argType(0),
m_headOverloadData(this), m_previousOverloadData(0), m_generator(generator)
{
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction *func : overloads) {
m_overloads.append(func);
int argSize = func->arguments().size() - numberOfRemovedArguments(func);
if (m_minArgs > argSize)
@@ -472,7 +479,8 @@ OverloadData::OverloadData(const AbstractMetaFunctionList& overloads, const Shib
else if (m_maxArgs < argSize)
m_maxArgs = argSize;
OverloadData* currentOverloadData = this;
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
currentOverloadData = currentOverloadData->addOverloadData(func, arg);
@@ -512,7 +520,7 @@ void OverloadData::addOverload(const AbstractMetaFunction* func)
for (int i = 0; m_headOverloadData->m_minArgs > 0 && i < origNumArgs; i++) {
if (func->argumentRemoved(i + 1))
continue;
- if (!ShibokenGenerator::getDefaultValue(func, func->arguments()[i]).isEmpty()) {
+ if (!ShibokenGenerator::getDefaultValue(func, func->arguments().at(i)).isEmpty()) {
int fixedArgIndex = i - removed;
if (fixedArgIndex < m_headOverloadData->m_minArgs)
m_headOverloadData->m_minArgs = fixedArgIndex;
@@ -528,7 +536,7 @@ OverloadData* OverloadData::addOverloadData(const AbstractMetaFunction* func,
const AbstractMetaType* argType = arg->type();
OverloadData* overloadData = 0;
if (!func->isOperatorOverload()) {
- foreach (OverloadData* tmp, m_nextOverloadData) {
+ for (OverloadData *tmp : qAsConst(m_nextOverloadData)) {
// TODO: 'const char *', 'char *' and 'char' will have the same TypeEntry?
// If an argument have a type replacement, then we should create a new overloaddata
@@ -560,7 +568,7 @@ OverloadData* OverloadData::addOverloadData(const AbstractMetaFunction* func,
QStringList OverloadData::returnTypes() const
{
QSet<QString> retTypes;
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ for (const AbstractMetaFunction *func : m_overloads) {
if (!func->typeReplaced(0).isEmpty())
retTypes << func->typeReplaced(0);
else if (func->type() && !func->argumentRemoved(0))
@@ -579,9 +587,9 @@ bool OverloadData::hasNonVoidReturnType() const
bool OverloadData::hasVarargs() const
{
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ for (const AbstractMetaFunction *func : m_overloads) {
AbstractMetaArgumentList args = func->arguments();
- if (args.size() > 1 && args.last()->type()->isVarargs())
+ if (args.size() > 1 && args.constLast()->type()->isVarargs())
return true;
}
return false;
@@ -589,7 +597,7 @@ bool OverloadData::hasVarargs() const
bool OverloadData::hasAllowThread() const
{
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ for (const AbstractMetaFunction *func : m_overloads) {
if (func->allowThread())
return true;
}
@@ -598,7 +606,7 @@ bool OverloadData::hasAllowThread() const
bool OverloadData::hasStaticFunction(const AbstractMetaFunctionList& overloads)
{
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction *func : qAsConst(overloads)) {
if (func->isStatic())
return true;
}
@@ -607,7 +615,7 @@ bool OverloadData::hasStaticFunction(const AbstractMetaFunctionList& overloads)
bool OverloadData::hasStaticFunction() const
{
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ for (const AbstractMetaFunction *func : m_overloads) {
if (func->isStatic())
return true;
}
@@ -616,7 +624,7 @@ bool OverloadData::hasStaticFunction() const
bool OverloadData::hasInstanceFunction(const AbstractMetaFunctionList& overloads)
{
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction *func : qAsConst(overloads)) {
if (!func->isStatic())
return true;
}
@@ -625,7 +633,7 @@ bool OverloadData::hasInstanceFunction(const AbstractMetaFunctionList& overloads
bool OverloadData::hasInstanceFunction() const
{
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ for (const AbstractMetaFunction *func : m_overloads) {
if (!func->isStatic())
return true;
}
@@ -644,7 +652,7 @@ bool OverloadData::hasStaticAndInstanceFunctions() const
const AbstractMetaFunction* OverloadData::referenceFunction() const
{
- return m_overloads.first();
+ return m_overloads.constFirst();
}
const AbstractMetaArgument* OverloadData::argument(const AbstractMetaFunction* func) const
@@ -661,7 +669,7 @@ const AbstractMetaArgument* OverloadData::argument(const AbstractMetaFunction* f
argPos++;
}
- return func->arguments()[m_argPos + removed];
+ return func->arguments().at(m_argPos + removed);
}
OverloadDataList OverloadData::overloadDataOnPosition(OverloadData* overloadData, int argPos) const
@@ -670,7 +678,8 @@ OverloadDataList OverloadData::overloadDataOnPosition(OverloadData* overloadData
if (overloadData->argPos() == argPos) {
overloadDataList.append(overloadData);
} else if (overloadData->argPos() < argPos) {
- foreach (OverloadData* pd, overloadData->nextOverloadData())
+ const OverloadDataList &data = overloadData->nextOverloadData();
+ for (OverloadData *pd : data)
overloadDataList += overloadDataOnPosition(pd, argPos);
}
return overloadDataList;
@@ -685,7 +694,7 @@ OverloadDataList OverloadData::overloadDataOnPosition(int argPos) const
bool OverloadData::nextArgumentHasDefaultValue() const
{
- foreach (OverloadData* overloadData, m_nextOverloadData) {
+ for (OverloadData *overloadData : m_nextOverloadData) {
if (overloadData->getFunctionWithDefaultValue())
return true;
}
@@ -698,7 +707,8 @@ static OverloadData* _findNextArgWithDefault(OverloadData* overloadData)
return overloadData;
OverloadData* result = 0;
- foreach (OverloadData* odata, overloadData->nextOverloadData()) {
+ const OverloadDataList &data = overloadData->nextOverloadData();
+ for (OverloadData *odata : data) {
OverloadData* tmp = _findNextArgWithDefault(odata);
if (!result || (tmp && result->argPos() > tmp->argPos()))
result = tmp;
@@ -713,20 +723,20 @@ OverloadData* OverloadData::findNextArgWithDefault()
bool OverloadData::isFinalOccurrence(const AbstractMetaFunction* func) const
{
- foreach (const OverloadData* pd, m_nextOverloadData) {
+ for (const OverloadData *pd : m_nextOverloadData) {
if (pd->overloads().contains(func))
return false;
}
return true;
}
-QList<const AbstractMetaFunction*> OverloadData::overloadsWithoutRepetition() const
+OverloadData::MetaFunctionList OverloadData::overloadsWithoutRepetition() const
{
- QList<const AbstractMetaFunction*> overloads = m_overloads;
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ MetaFunctionList overloads = m_overloads;
+ for (const AbstractMetaFunction *func : m_overloads) {
if (func->minimalSignature().endsWith(QLatin1String("const")))
continue;
- foreach (const AbstractMetaFunction* f, overloads) {
+ for (const AbstractMetaFunction *f : qAsConst(overloads)) {
if ((func->minimalSignature() + QLatin1String("const")) == f->minimalSignature()) {
overloads.removeOne(f);
break;
@@ -738,23 +748,23 @@ QList<const AbstractMetaFunction*> OverloadData::overloadsWithoutRepetition() co
const AbstractMetaFunction* OverloadData::getFunctionWithDefaultValue() const
{
- foreach (const AbstractMetaFunction* func, m_overloads) {
+ for (const AbstractMetaFunction *func : m_overloads) {
int removedArgs = 0;
for (int i = 0; i <= m_argPos + removedArgs; i++) {
if (func->argumentRemoved(i + 1))
removedArgs++;
}
- if (!ShibokenGenerator::getDefaultValue(func, func->arguments()[m_argPos + removedArgs]).isEmpty())
+ if (!ShibokenGenerator::getDefaultValue(func, func->arguments().at(m_argPos + removedArgs)).isEmpty())
return func;
}
return 0;
}
-QList<int> OverloadData::invalidArgumentLengths() const
+QVector<int> OverloadData::invalidArgumentLengths() const
{
QSet<int> validArgLengths;
- foreach (const AbstractMetaFunction* func, m_headOverloadData->m_overloads) {
+ for (const AbstractMetaFunction *func : qAsConst(m_headOverloadData->m_overloads)) {
const AbstractMetaArgumentList args = func->arguments();
int offset = 0;
for (int i = 0; i < args.size(); ++i) {
@@ -768,7 +778,7 @@ QList<int> OverloadData::invalidArgumentLengths() const
validArgLengths << args.size() - offset;
}
- QList<int> invalidArgLengths;
+ QVector<int> invalidArgLengths;
for (int i = minArgs() + 1; i < maxArgs(); i++) {
if (!validArgLengths.contains(i))
invalidArgLengths.append(i);
@@ -811,7 +821,7 @@ QPair<int, int> OverloadData::getMinMaxArguments(const AbstractMetaFunctionList&
if (func->argumentRemoved(j + 1))
continue;
int fixedArgIndex = j - removed;
- if (fixedArgIndex < minArgs && !ShibokenGenerator::getDefaultValue(func, func->arguments()[j]).isEmpty())
+ if (fixedArgIndex < minArgs && !ShibokenGenerator::getDefaultValue(func, func->arguments().at(j)).isEmpty())
minArgs = fixedArgIndex;
}
}
@@ -821,7 +831,7 @@ QPair<int, int> OverloadData::getMinMaxArguments(const AbstractMetaFunctionList&
bool OverloadData::isSingleArgument(const AbstractMetaFunctionList& overloads)
{
bool singleArgument = true;
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction *func : overloads) {
if (func->arguments().size() - numberOfRemovedArguments(func) != 1) {
singleArgument = false;
break;
@@ -859,7 +869,7 @@ QString OverloadData::dumpGraph() const
// Shows all function signatures
s << "legend [fontsize=9 fontname=freemono shape=rect label=\"";
- foreach (const AbstractMetaFunction* func, overloads()) {
+ for (const AbstractMetaFunction *func : m_overloads) {
s << "f" << functionNumber(func) << " : ";
if (func->type())
s << toHtml(func->type()->cppSignature());
@@ -893,7 +903,7 @@ QString OverloadData::dumpGraph() const
s << "</td></tr>";
// Shows type changes for all function signatures
- foreach (const AbstractMetaFunction* func, overloads()) {
+ for (const AbstractMetaFunction *func : m_overloads) {
if (func->typeReplaced(0).isEmpty())
continue;
s << "<tr><td bgcolor=\"gray\" align=\"right\">f" << functionNumber(func);
@@ -916,13 +926,13 @@ QString OverloadData::dumpGraph() const
// Overloads for the signature to present point
s << "<tr><td bgcolor=\"gray\" align=\"right\">overloads</td><td bgcolor=\"gray\" align=\"left\">";
- foreach (const AbstractMetaFunction* func, overloads())
+ for (const AbstractMetaFunction *func : m_overloads)
s << 'f' << functionNumber(func) << ' ';
s << "</td></tr>";
s << "</table>> ];" << endl;
- foreach (const OverloadData* pd, nextOverloadData())
+ for (const OverloadData *pd : m_nextOverloadData)
s << indent << '"' << rfunc->name() << "\" -> " << pd->dumpGraph();
s << "}" << endl;
@@ -948,12 +958,12 @@ QString OverloadData::dumpGraph() const
// Overloads for the signature to present point
s << "<tr><td bgcolor=\"gray\" align=\"right\">overloads</td><td bgcolor=\"gray\" align=\"left\">";
- foreach (const AbstractMetaFunction* func, overloads())
+ for (const AbstractMetaFunction *func : m_overloads)
s << 'f' << functionNumber(func) << ' ';
s << "</td></tr>";
// Show default values (original and modified) for various functions
- foreach (const AbstractMetaFunction* func, overloads()) {
+ for (const AbstractMetaFunction *func : m_overloads) {
const AbstractMetaArgument* arg = argument(func);
if (!arg)
continue;
@@ -973,7 +983,7 @@ QString OverloadData::dumpGraph() const
s << "</table>>];" << endl;
- foreach (const OverloadData* pd, nextOverloadData())
+ for (const OverloadData *pd : m_nextOverloadData)
s << indent << argId << " -> " << pd->dumpGraph();
}
return result;
@@ -1004,7 +1014,7 @@ bool OverloadData::hasArgumentWithDefaultValue(const AbstractMetaFunctionList& o
{
if (OverloadData::getMinMaxArguments(overloads).second == 0)
return false;
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction *func : overloads) {
if (hasArgumentWithDefaultValue(func))
return true;
}
@@ -1015,7 +1025,7 @@ bool OverloadData::hasArgumentWithDefaultValue() const
{
if (maxArgs() == 0)
return false;
- foreach (const AbstractMetaFunction* func, overloads()) {
+ for (const AbstractMetaFunction *func : m_overloads) {
if (hasArgumentWithDefaultValue(func))
return true;
}
@@ -1024,7 +1034,8 @@ bool OverloadData::hasArgumentWithDefaultValue() const
bool OverloadData::hasArgumentWithDefaultValue(const AbstractMetaFunction* func)
{
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
if (!ShibokenGenerator::getDefaultValue(func, arg).isEmpty())
@@ -1036,7 +1047,8 @@ bool OverloadData::hasArgumentWithDefaultValue(const AbstractMetaFunction* func)
AbstractMetaArgumentList OverloadData::getArgumentsWithDefaultValues(const AbstractMetaFunction* func)
{
AbstractMetaArgumentList args;
- foreach (AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (AbstractMetaArgument *arg : arguments) {
if (ShibokenGenerator::getDefaultValue(func, arg).isEmpty()
|| func->argumentRemoved(arg->argumentIndex() + 1))
continue;
diff --git a/sources/shiboken2/generator/shiboken2/overloaddata.h b/sources/shiboken2/generator/shiboken2/overloaddata.h
index 959b96d0b..2d815f6bb 100644
--- a/sources/shiboken2/generator/shiboken2/overloaddata.h
+++ b/sources/shiboken2/generator/shiboken2/overloaddata.h
@@ -30,19 +30,21 @@
#define OVERLOADDATA_H
#include <abstractmetalang_typedefs.h>
-#include <QtCore/QList>
#include <QtCore/QBitArray>
+#include <QtCore/QVector>
QT_FORWARD_DECLARE_CLASS(QDebug)
class ShibokenGenerator;
class OverloadData;
-typedef QList<OverloadData*> OverloadDataList;
+typedef QVector<OverloadData *> OverloadDataList;
class OverloadData
{
public:
+ typedef QVector<const AbstractMetaFunction *> MetaFunctionList;
+
OverloadData(const AbstractMetaFunctionList& overloads, const ShibokenGenerator* generator);
~OverloadData();
@@ -100,12 +102,12 @@ public:
bool isFinalOccurrence(const AbstractMetaFunction* func) const;
/// Returns the list of overloads removing repeated constant functions (ex.: "foo()" and "foo()const", the second is removed).
- QList<const AbstractMetaFunction*> overloadsWithoutRepetition() const;
- const QList<const AbstractMetaFunction*>& overloads() const { return m_overloads; }
+ MetaFunctionList overloadsWithoutRepetition() const;
+ const MetaFunctionList& overloads() const { return m_overloads; }
OverloadDataList nextOverloadData() const { return m_nextOverloadData; }
OverloadData* previousOverloadData() const { return m_previousOverloadData; }
- QList<int> invalidArgumentLengths() const;
+ QVector<int> invalidArgumentLengths() const;
static int numberOfRemovedArguments(const AbstractMetaFunction* func, int finalArgPos = -1);
static QPair<int, int> getMinMaxArguments(const AbstractMetaFunctionList& overloads);
@@ -146,7 +148,7 @@ private:
int m_argPos;
const AbstractMetaType* m_argType;
QString m_argTypeReplaced;
- QList<const AbstractMetaFunction*> m_overloads;
+ MetaFunctionList m_overloads;
OverloadData* m_headOverloadData;
OverloadDataList m_nextOverloadData;
diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
index 670659854..d64719bb8 100644
--- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
@@ -35,6 +35,7 @@
#include <QtCore/QDir>
#include <QtCore/QDebug>
+#include <QtCore/QRegularExpression>
#include <limits>
#include <memory>
@@ -54,22 +55,51 @@ QHash<QString, QString> ShibokenGenerator::m_formatUnits = QHash<QString, QStrin
QHash<QString, QString> ShibokenGenerator::m_tpFuncs = QHash<QString, QString>();
QStringList ShibokenGenerator::m_knownPythonTypes = QStringList();
-static QString resolveScopePrefix(const AbstractMetaClass* scope, const QString& value)
+static QRegularExpression placeHolderRegex(int index)
{
- if (!scope)
- return QString();
+ return QRegularExpression(QLatin1Char('%') + QString::number(index) + QStringLiteral("\\b"));
+}
+// Return a prefix to fully qualify value, eg:
+// resolveScopePrefix("Class::NestedClass::Enum::Value1", "Enum::Value1")
+// -> "Class::NestedClass::")
+static QString resolveScopePrefix(const QStringList &scopeList, const QString &value)
+{
QString name;
- QStringList parts = scope->qualifiedCppName().split(QLatin1String("::"), QString::SkipEmptyParts);
- for(int i = (parts.size() - 1) ; i >= 0; i--) {
- if (!value.startsWith(parts[i] + QLatin1String("::")))
- name = parts[i] + QLatin1String("::") + name;
- else
+ for (int i = scopeList.size() - 1 ; i >= 0; --i) {
+ const QString prefix = scopeList.at(i) + QLatin1String("::");
+ if (value.startsWith(prefix))
name.clear();
+ else
+ name.prepend(prefix);
}
-
return name;
}
+
+static inline QStringList splitClassScope(const AbstractMetaClass *scope)
+{
+ return scope->qualifiedCppName().split(QLatin1String("::"), QString::SkipEmptyParts);
+}
+
+static QString resolveScopePrefix(const AbstractMetaClass *scope, const QString &value)
+{
+ return scope
+ ? resolveScopePrefix(splitClassScope(scope), value)
+ : QString();
+}
+
+static QString resolveScopePrefix(const AbstractMetaEnum *metaEnum,
+ const QString &value)
+{
+ QStringList parts;
+ if (const AbstractMetaClass *scope = metaEnum->enclosingClass())
+ parts.append(splitClassScope(scope));
+ // Fully qualify the value which is required for C++ 11 enum classes.
+ if (!metaEnum->isAnonymous())
+ parts.append(metaEnum->name());
+ return resolveScopePrefix(parts, value);
+}
+
ShibokenGenerator::ShibokenGenerator() : Generator()
{
if (m_pythonPrimitiveTypeName.isEmpty())
@@ -87,10 +117,10 @@ ShibokenGenerator::ShibokenGenerator() : Generator()
m_typeSystemConvName[TypeSystemIsConvertibleFunction] = QLatin1String("isConvertible");
m_typeSystemConvName[TypeSystemToCppFunction] = QLatin1String("toCpp");
m_typeSystemConvName[TypeSystemToPythonFunction] = QLatin1String("toPython");
- m_typeSystemConvRegEx[TypeSystemCheckFunction] = QRegExp(QLatin1String(CHECKTYPE_REGEX));
- m_typeSystemConvRegEx[TypeSystemIsConvertibleFunction] = QRegExp(QLatin1String(ISCONVERTIBLE_REGEX));
- m_typeSystemConvRegEx[TypeSystemToPythonFunction] = QRegExp(QLatin1String(CONVERTTOPYTHON_REGEX));
- m_typeSystemConvRegEx[TypeSystemToCppFunction] = QRegExp(QLatin1String(CONVERTTOCPP_REGEX));
+ m_typeSystemConvRegEx[TypeSystemCheckFunction] = QRegularExpression(QLatin1String(CHECKTYPE_REGEX));
+ m_typeSystemConvRegEx[TypeSystemIsConvertibleFunction] = QRegularExpression(QLatin1String(ISCONVERTIBLE_REGEX));
+ m_typeSystemConvRegEx[TypeSystemToPythonFunction] = QRegularExpression(QLatin1String(CONVERTTOPYTHON_REGEX));
+ m_typeSystemConvRegEx[TypeSystemToCppFunction] = QRegularExpression(QLatin1String(CONVERTTOCPP_REGEX));
}
ShibokenGenerator::~ShibokenGenerator()
@@ -115,36 +145,34 @@ void ShibokenGenerator::initPrimitiveTypesCorrespondences()
// PyBool
m_pythonPrimitiveTypeName.insert(QLatin1String("bool"), QLatin1String("PyBool"));
+ const char *charTypes[] = {
+ "char", "signed char", "unsigned char"
+ };
+ for (const char *charType : charTypes)
+ m_pythonPrimitiveTypeName.insert(QLatin1String(charType), QStringLiteral("SbkChar"));
+
// PyInt
- m_pythonPrimitiveTypeName.insert(QLatin1String("char"), QLatin1String("SbkChar"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("signed char"), QLatin1String("SbkChar"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned char"), QLatin1String("SbkChar"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("int"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("signed int"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("uint"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned int"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("short"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("ushort"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("signed short"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("signed short int"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned short"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned short int"), QLatin1String("PyInt"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("long"), QLatin1String("PyInt"));
+ const char *intTypes[] = {
+ "int", "signed int", "uint", "unsigned int",
+ "short", "ushort", "signed short", "signed short int",
+ "unsigned short", "unsigned short", "unsigned short int",
+ "long"
+ };
+ for (const char *intType : intTypes)
+ m_pythonPrimitiveTypeName.insert(QLatin1String(intType), QStringLiteral("PyInt"));
// PyFloat
m_pythonPrimitiveTypeName.insert(QLatin1String("double"), QLatin1String("PyFloat"));
m_pythonPrimitiveTypeName.insert(QLatin1String("float"), QLatin1String("PyFloat"));
// PyLong
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned long"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("signed long"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("ulong"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned long int"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("long long"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("__int64"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned long long"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("unsigned __int64"), QLatin1String("PyLong"));
- m_pythonPrimitiveTypeName.insert(QLatin1String("size_t"), QLatin1String("PyLong"));
+ const char *longTypes[] = {
+ "unsigned long", "signed long", "ulong", "unsigned long int",
+ "long long", "__int64",
+ "unsigned long long", "unsigned __int64", "size_t"
+ };
+ for (const char *longType : longTypes)
+ m_pythonPrimitiveTypeName.insert(QLatin1String(longType), QStringLiteral("PyLong"));
// Python operators
m_pythonOperators.clear();
@@ -237,13 +265,16 @@ QString ShibokenGenerator::translateTypeForWrapperMethod(const AbstractMetaType*
bool ShibokenGenerator::shouldGenerateCppWrapper(const AbstractMetaClass* metaClass) const
{
+ if (metaClass->isNamespace() || (metaClass->attributes() & AbstractMetaAttributes::FinalCppClass))
+ return false;
bool result = metaClass->isPolymorphic() || metaClass->hasVirtualDestructor();
if (avoidProtectedHack()) {
result = result || metaClass->hasProtectedFields() || metaClass->hasProtectedDestructor();
if (!result && metaClass->hasProtectedFunctions()) {
int protectedFunctions = 0;
int protectedOperators = 0;
- foreach (const AbstractMetaFunction* func, metaClass->functions()) {
+ const AbstractMetaFunctionList &funcs = metaClass->functions();
+ for (const AbstractMetaFunction *func : funcs) {
if (!func->isProtected() || func->isSignal() || func->isModifiedRemoved())
continue;
else if (func->isOperatorOverload())
@@ -256,7 +287,7 @@ bool ShibokenGenerator::shouldGenerateCppWrapper(const AbstractMetaClass* metaCl
} else {
result = result && !metaClass->hasPrivateDestructor();
}
- return result && !metaClass->isNamespace();
+ return result;
}
void ShibokenGenerator::lookForEnumsInClassesNotToBeGenerated(AbstractMetaEnumList& enumList, const AbstractMetaClass* metaClass)
@@ -265,7 +296,8 @@ void ShibokenGenerator::lookForEnumsInClassesNotToBeGenerated(AbstractMetaEnumLi
return;
if (metaClass->typeEntry()->codeGeneration() == TypeEntry::GenerateForSubclass) {
- foreach (const AbstractMetaEnum* metaEnum, metaClass->enums()) {
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (const AbstractMetaEnum *metaEnum : enums) {
if (metaEnum->isPrivate() || metaEnum->typeEntry()->codeGeneration() == TypeEntry::GenerateForSubclass)
continue;
if (!enumList.contains(const_cast<AbstractMetaEnum*>(metaEnum)))
@@ -409,32 +441,91 @@ static QString cpythonEnumFlagsName(QString moduleName, QString qualifiedCppName
return result;
}
+// Return the scope for fully qualifying the enumeration including trailing "::".
static QString searchForEnumScope(const AbstractMetaClass* metaClass, const QString& value)
{
- QString enumValueName = value.trimmed();
-
if (!metaClass)
return QString();
-
- foreach (const AbstractMetaEnum* metaEnum, metaClass->enums()) {
- foreach (const AbstractMetaEnumValue* enumValue, metaEnum->values()) {
- if (enumValueName == enumValue->name())
- return metaClass->qualifiedCppName();
- }
+ const AbstractMetaEnumList &enums = metaClass->enums();
+ for (const AbstractMetaEnum *metaEnum : enums) {
+ if (metaEnum->findEnumValue(value))
+ return resolveScopePrefix(metaEnum, value);
}
// PYSIDE-331: We need to also search the base classes.
- QString ret = searchForEnumScope(metaClass->enclosingClass(), enumValueName);
+ QString ret = searchForEnumScope(metaClass->enclosingClass(), value);
if (ret.isEmpty())
- ret = searchForEnumScope(metaClass->baseClass(), enumValueName);
+ ret = searchForEnumScope(metaClass->baseClass(), value);
return ret;
}
+// Handle QFlags<> for guessScopeForDefaultValue()
+QString ShibokenGenerator::guessScopeForDefaultFlagsValue(const AbstractMetaFunction *func,
+ const AbstractMetaArgument *arg,
+ const QString &value) const
+{
+ // Numeric values -> "Options(42)"
+ static const QRegularExpression numberRegEx(QStringLiteral("^\\d+$")); // Numbers to flags
+ Q_ASSERT(numberRegEx.isValid());
+ if (numberRegEx.match(value).hasMatch()) {
+ QString typeName = translateTypeForWrapperMethod(arg->type(), func->implementingClass());
+ if (arg->type()->isConstant())
+ typeName.remove(0, sizeof("const ") / sizeof(char) - 1);
+ switch (arg->type()->referenceType()) {
+ case NoReference:
+ break;
+ case LValueReference:
+ typeName.chop(1);
+ break;
+ case RValueReference:
+ typeName.chop(2);
+ break;
+ }
+ return typeName + QLatin1Char('(') + value + QLatin1Char(')');
+ }
+
+ // "Options(Option1 | Option2)" -> "Options(Class::Enum::Option1 | Class::Enum::Option2)"
+ static const QRegularExpression enumCombinationRegEx(QStringLiteral("^([A-Za-z_][\\w:]*)\\(([^,\\(\\)]*)\\)$")); // FlagName(EnumItem|EnumItem|...)
+ Q_ASSERT(enumCombinationRegEx.isValid());
+ const QRegularExpressionMatch match = enumCombinationRegEx.match(value);
+ if (match.hasMatch()) {
+ const QString expression = match.captured(2).trimmed();
+ if (expression.isEmpty())
+ return value;
+ const QStringList enumItems = expression.split(QLatin1Char('|'));
+ const QString scope = searchForEnumScope(func->implementingClass(),
+ enumItems.constFirst().trimmed());
+ if (scope.isEmpty())
+ return value;
+ QString result;
+ QTextStream str(&result);
+ str << match.captured(1) << '('; // Flag name
+ for (int i = 0, size = enumItems.size(); i < size; ++i) {
+ if (i)
+ str << '|';
+ str << scope << enumItems.at(i).trimmed();
+ }
+ str << ')';
+ return result;
+ }
+ // A single flag "Option1" -> "Class::Enum::Option1"
+ return searchForEnumScope(func->implementingClass(), value) + value;
+}
+
/*
* This function uses some heuristics to find out the scope for a given
- * argument default value. New situations may arise in the future and
+ * argument default value since they must be fully qualified when used outside the class:
+ * class A {
+ * enum Enum { e1, e1 };
+ * void foo(Enum e = e1);
+ * }
+ * should be qualified to:
+ * A::Enum cppArg0 = A::Enum::e1;
+ *
+ * New situations may arise in the future and
* this method should be updated, do it with care.
*/
-QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction* func, const AbstractMetaArgument* arg)
+QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction *func,
+ const AbstractMetaArgument *arg) const
{
QString value = getDefaultValue(func, arg);
@@ -444,64 +535,35 @@ QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction*
if (isPointer(arg->type()))
return value;
- static QRegExp enumValueRegEx(QLatin1String("^([A-Za-z_]\\w*)?$"));
- QString prefix;
- QString suffix;
+ static const QRegularExpression enumValueRegEx(QStringLiteral("^([A-Za-z_]\\w*)?$"));
+ Q_ASSERT(enumValueRegEx.isValid());
+ // Do not qualify macros by class name, eg QSGGeometry(..., int t = GL_UNSIGNED_SHORT);
+ static const QRegularExpression macroRegEx(QStringLiteral("^[A-Z_][A-Z0-9_]*$"));
+ Q_ASSERT(macroRegEx.isValid());
+ if (arg->type()->isPrimitive() && macroRegEx.match(value).hasMatch())
+ return value;
+ QString prefix;
if (arg->type()->isEnum()) {
- const AbstractMetaEnum* metaEnum = findAbstractMetaEnum(arg->type());
- if (metaEnum)
- prefix = resolveScopePrefix(metaEnum->enclosingClass(), value);
+ if (const AbstractMetaEnum* metaEnum = findAbstractMetaEnum(arg->type()))
+ prefix = resolveScopePrefix(metaEnum, value);
} else if (arg->type()->isFlags()) {
- static QRegExp numberRegEx(QLatin1String("^\\d+$")); // Numbers to flags
- if (numberRegEx.exactMatch(value)) {
- QString typeName = translateTypeForWrapperMethod(arg->type(), func->implementingClass());
- if (arg->type()->isConstant())
- typeName.remove(0, sizeof("const ") / sizeof(char) - 1);
- switch (arg->type()->referenceType()) {
- case NoReference:
- break;
- case LValueReference:
- typeName.chop(1);
- break;
- case RValueReference:
- typeName.chop(2);
- break;
- }
- prefix = typeName + QLatin1Char('(');
- suffix = QLatin1Char(')');
- }
-
- static QRegExp enumCombinationRegEx(QLatin1String("^([A-Za-z_][\\w:]*)\\(([^,\\(\\)]*)\\)$")); // FlagName(EnumItem|EnumItem|...)
- if (prefix.isEmpty() && enumCombinationRegEx.indexIn(value) != -1) {
- QString flagName = enumCombinationRegEx.cap(1);
- QStringList enumItems = enumCombinationRegEx.cap(2).split(QLatin1Char('|'));
- QString scope = searchForEnumScope(func->implementingClass(), enumItems.first());
- if (!scope.isEmpty())
- scope.append(QLatin1String("::"));
-
- QStringList fixedEnumItems;
- foreach (const QString& enumItem, enumItems)
- fixedEnumItems << QString(scope + enumItem);
-
- if (!fixedEnumItems.isEmpty()) {
- prefix = flagName + QLatin1Char('(');
- value = fixedEnumItems.join(QLatin1Char('|'));
- suffix = QLatin1Char(')');
- }
- }
+ value = guessScopeForDefaultFlagsValue(func, arg, value);
} else if (arg->type()->typeEntry()->isValue()) {
const AbstractMetaClass *metaClass = AbstractMetaClass::findClass(classes(), arg->type()->typeEntry());
- if (enumValueRegEx.exactMatch(value)&& value != QLatin1String("NULL"))
+ if (enumValueRegEx.match(value).hasMatch() && value != QLatin1String("NULL"))
prefix = resolveScopePrefix(metaClass, value);
} else if (arg->type()->isPrimitive() && arg->type()->name() == QLatin1String("int")) {
- if (enumValueRegEx.exactMatch(value) && func->implementingClass())
+ if (enumValueRegEx.match(value).hasMatch() && func->implementingClass())
prefix = resolveScopePrefix(func->implementingClass(), value);
} else if(arg->type()->isPrimitive()) {
- static QRegExp unknowArgumentRegEx(QLatin1String("^(?:[A-Za-z_][\\w:]*\\()?([A-Za-z_]\\w*)(?:\\))?$")); // [PrimitiveType(] DESIREDNAME [)]
- if (unknowArgumentRegEx.indexIn(value) != -1 && func->implementingClass()) {
- foreach (const AbstractMetaField* field, func->implementingClass()->fields()) {
- if (unknowArgumentRegEx.cap(1).trimmed() == field->name()) {
+ static const QRegularExpression unknowArgumentRegEx(QStringLiteral("^(?:[A-Za-z_][\\w:]*\\()?([A-Za-z_]\\w*)(?:\\))?$")); // [PrimitiveType(] DESIREDNAME [)]
+ Q_ASSERT(unknowArgumentRegEx.isValid());
+ const QRegularExpressionMatch match = unknowArgumentRegEx.match(value);
+ if (match.hasMatch() && func->implementingClass()) {
+ const AbstractMetaFieldList &fields = func->implementingClass()->fields();
+ for (const AbstractMetaField *field : fields) {
+ if (match.captured(1).trimmed() == field->name()) {
QString fieldName = field->name();
if (field->isStatic()) {
prefix = resolveScopePrefix(func->implementingClass(), value);
@@ -510,7 +572,7 @@ QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction*
} else {
fieldName.prepend(QLatin1String(CPP_SELF_VAR "->"));
}
- value.replace(unknowArgumentRegEx.cap(1), fieldName);
+ value.replace(match.captured(1), fieldName);
break;
}
}
@@ -519,9 +581,6 @@ QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction*
if (!prefix.isEmpty())
value.prepend(prefix);
- if (!suffix.isEmpty())
- value.append(suffix);
-
return value;
}
@@ -622,8 +681,9 @@ bool ShibokenGenerator::shouldRejectNullPointerArgument(const AbstractMetaFuncti
return false;
if (func->argumentRemoved(argIndex + 1))
return false;
- foreach (const FunctionModification &funcMod, func->modifications()) {
- foreach (const ArgumentModification &argMod, funcMod.argument_mods) {
+ const FunctionModificationList &mods = func->modifications();
+ for (const FunctionModification &funcMod : mods) {
+ for (const ArgumentModification &argMod : funcMod.argument_mods) {
if (argMod.index == argIndex + 1 && argMod.noNullPointers)
return true;
}
@@ -635,7 +695,8 @@ QString ShibokenGenerator::getFormatUnitString(const AbstractMetaFunction* func,
{
QString result;
const char objType = (incRef ? 'O' : 'N');
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (func->argumentRemoved(arg->argumentIndex() + 1))
continue;
@@ -758,6 +819,13 @@ QString ShibokenGenerator::converterObject(const AbstractMetaType* type)
return QLatin1String("Shiboken::Conversions::PrimitiveTypeConverter<const char*>()");
if (isVoidPointer(type))
return QLatin1String("Shiboken::Conversions::PrimitiveTypeConverter<void*>()");
+ const AbstractMetaTypeCList nestedArrayTypes = type->nestedArrayTypes();
+ if (!nestedArrayTypes.isEmpty() && nestedArrayTypes.constLast()->isCppPrimitive()) {
+ return QStringLiteral("Shiboken::Conversions::ArrayTypeConverter<")
+ + nestedArrayTypes.constLast()->minimalSignature()
+ + QLatin1String(">(") + QString::number(nestedArrayTypes.size())
+ + QLatin1Char(')');
+ }
if (type->typeEntry()->isContainer()) {
return convertersVariableName(type->typeEntry()->targetLangPackage())
+ QLatin1Char('[') + getTypeIndexVariableName(type) + QLatin1Char(']');
@@ -983,10 +1051,12 @@ bool ShibokenGenerator::isValueTypeWithCopyConstructorOnly(const AbstractMetaCla
{
if (!metaClass || !metaClass->typeEntry()->isValue())
return false;
+ if ((metaClass->attributes() & AbstractMetaAttributes::HasRejectedConstructor) != 0)
+ return false;
AbstractMetaFunctionList ctors = metaClass->queryFunctions(AbstractMetaClass::Constructors);
if (ctors.count() != 1)
return false;
- return ctors.first()->functionType() == AbstractMetaFunction::CopyConstructorFunction;
+ return ctors.constFirst()->functionType() == AbstractMetaFunction::CopyConstructorFunction;
}
bool ShibokenGenerator::isValueTypeWithCopyConstructorOnly(const TypeEntry* type) const
@@ -1054,7 +1124,8 @@ bool ShibokenGenerator::shouldDereferenceAbstractMetaTypePointer(const AbstractM
bool ShibokenGenerator::visibilityModifiedToPrivate(const AbstractMetaFunction* func)
{
- foreach (const FunctionModification &mod, func->modifications()) {
+ const FunctionModificationList &mods = func->modifications();
+ for (const FunctionModification &mod : mods) {
if (mod.modifiers & Modification::Private)
return true;
}
@@ -1089,7 +1160,7 @@ QString ShibokenGenerator::cpythonCheckFunction(const AbstractMetaType* metaType
|| type == ContainerTypeEntry::StackContainer
|| type == ContainerTypeEntry::SetContainer
|| type == ContainerTypeEntry::QueueContainer) {
- const AbstractMetaType* type = metaType->instantiations().first();
+ const AbstractMetaType* type = metaType->instantiations().constFirst();
if (isPointerToWrapperType(type)) {
typeCheck += QString::fromLatin1("checkSequenceTypes(%1, ").arg(cpythonTypeNameExt(type));
} else if (isWrapperType(type)) {
@@ -1105,8 +1176,8 @@ QString ShibokenGenerator::cpythonCheckFunction(const AbstractMetaType* metaType
|| type == ContainerTypeEntry::MultiHashContainer
|| type == ContainerTypeEntry::PairContainer) {
QString pyType = (type == ContainerTypeEntry::PairContainer) ? QLatin1String("Pair") : QLatin1String("Dict");
- const AbstractMetaType* firstType = metaType->instantiations().first();
- const AbstractMetaType* secondType = metaType->instantiations().last();
+ const AbstractMetaType* firstType = metaType->instantiations().constFirst();
+ const AbstractMetaType* secondType = metaType->instantiations().constLast();
if (isPointerToWrapperType(firstType) && isPointerToWrapperType(secondType)) {
typeCheck += QString::fromLatin1("check%1Types(%2, %3, ").arg(pyType)
.arg(cpythonTypeNameExt(firstType), cpythonTypeNameExt(secondType));
@@ -1208,8 +1279,8 @@ QString ShibokenGenerator::cpythonIsConvertibleFunction(const AbstractMetaType*
return customCheck;
}
+ QString result = QLatin1String("Shiboken::Conversions::");
if (isWrapperType(metaType)) {
- QString result = QLatin1String("Shiboken::Conversions::");
if (isPointer(metaType) || isValueTypeWithCopyConstructorOnly(metaType))
result += QLatin1String("isPythonToCppPointerConvertible");
else if (metaType->referenceType() == LValueReference)
@@ -1220,8 +1291,18 @@ QString ShibokenGenerator::cpythonIsConvertibleFunction(const AbstractMetaType*
+ cpythonTypeNameExt(metaType) + QLatin1String("), ");
return result;
}
- return QStringLiteral("Shiboken::Conversions::isPythonToCppConvertible(%1, ")
- .arg(converterObject(metaType));
+ result += QLatin1String("isPythonToCppConvertible(") + converterObject(metaType);
+ // Write out array sizes if known
+ const AbstractMetaTypeCList nestedArrayTypes = metaType->nestedArrayTypes();
+ if (!nestedArrayTypes.isEmpty() && nestedArrayTypes.constLast()->isCppPrimitive()) {
+ const int dim1 = metaType->arrayElementCount();
+ const int dim2 = nestedArrayTypes.constFirst()->isArray()
+ ? nestedArrayTypes.constFirst()->arrayElementCount() : -1;
+ result += QLatin1String(", ") + QString::number(dim1)
+ + QLatin1String(", ") + QString::number(dim2);
+ }
+ result += QLatin1String(", ");
+ return result;
}
QString ShibokenGenerator::cpythonIsConvertibleFunction(const AbstractMetaArgument *metaArg, bool genericNumberType)
@@ -1306,12 +1387,14 @@ QString ShibokenGenerator::argumentString(const AbstractMetaFunction *func,
arg = modified_type.replace(QLatin1Char('$'), QLatin1Char('.'));
if (!(options & Generator::SkipName)) {
- arg += QLatin1Char(' ');
- arg += argument->name();
+ // "int a", "int a[]"
+ const int arrayPos = arg.indexOf(QLatin1Char('['));
+ if (arrayPos != -1)
+ arg.insert(arrayPos, QLatin1Char(' ') + argument->name());
+ else
+ arg.append(QLatin1Char(' ') + argument->name());
}
- QList<ReferenceCount> referenceCounts;
- referenceCounts = func->referenceCounts(func->implementingClass(), argument->argumentIndex() + 1);
if ((options & Generator::SkipDefaultValues) != Generator::SkipDefaultValues &&
!argument->originalDefaultValueExpression().isEmpty())
{
@@ -1445,7 +1528,8 @@ void ShibokenGenerator::writeUnusedVariableCast(QTextStream& s, const QString& v
AbstractMetaFunctionList ShibokenGenerator::filterFunctions(const AbstractMetaClass* metaClass)
{
AbstractMetaFunctionList result;
- foreach (AbstractMetaFunction *func, metaClass->functions()) {
+ const AbstractMetaFunctionList &funcs = metaClass->functions();
+ for (AbstractMetaFunction *func : funcs) {
if (func->isSignal() || func->isDestructor() || func->usesRValueReferences()
|| (func->isModifiedRemoved() && !func->isAbstract()
&& (!avoidProtectedHack() || !func->isProtected())))
@@ -1458,11 +1542,13 @@ AbstractMetaFunctionList ShibokenGenerator::filterFunctions(const AbstractMetaCl
ShibokenGenerator::ExtendedConverterData ShibokenGenerator::getExtendedConverters() const
{
ExtendedConverterData extConvs;
- foreach (const AbstractMetaClass* metaClass, classes()) {
+ const AbstractMetaClassList &classList = classes();
+ for (const AbstractMetaClass *metaClass : classList) {
// Use only the classes for the current module.
if (!shouldGenerate(metaClass))
continue;
- foreach (AbstractMetaFunction* convOp, metaClass->operatorOverloads(AbstractMetaClass::ConversionOp)) {
+ const AbstractMetaFunctionList &overloads = metaClass->operatorOverloads(AbstractMetaClass::ConversionOp);
+ for (AbstractMetaFunction *convOp : overloads) {
// Get only the conversion operators that return a type from another module,
// that are value-types and were not removed in the type system.
const TypeEntry* convType = convOp->type()->typeEntry();
@@ -1476,10 +1562,11 @@ ShibokenGenerator::ExtendedConverterData ShibokenGenerator::getExtendedConverter
return extConvs;
}
-QList<const CustomConversion*> ShibokenGenerator::getPrimitiveCustomConversions()
+QVector<const CustomConversion *> ShibokenGenerator::getPrimitiveCustomConversions()
{
- QList<const CustomConversion*> conversions;
- foreach (const PrimitiveTypeEntry* type, primitiveTypes()) {
+ QVector<const CustomConversion*> conversions;
+ const PrimitiveTypeEntryList &primitiveTypeList = primitiveTypes();
+ for (const PrimitiveTypeEntry *type : primitiveTypeList) {
if (!shouldGenerateTypeEntry(type) || !isUserPrimitive(type) || !type->customConversion())
continue;
@@ -1522,7 +1609,7 @@ QString ShibokenGenerator::getCodeSnippets(const CodeSnipList& codeSnips,
{
QString code;
QTextStream c(&code);
- foreach (const CodeSnip &snip, codeSnips) {
+ for (const CodeSnip &snip : codeSnips) {
if ((position != TypeSystem::CodeSnipPositionAny && snip.position != position) || !(snip.language & language))
continue;
QString snipCode;
@@ -1623,6 +1710,17 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
s << INDENT << "// End of code injection" << endl;
}
+static QString msgWrongIndex(const char *varName, const QString &capture, const AbstractMetaFunction *func)
+{
+ QString result;
+ QTextStream str(&result);
+ str << "Wrong index for " << varName << " variable (" << capture << ") on ";
+ if (const AbstractMetaClass *c = func->implementingClass())
+ str << c->name() << "::";
+ str << func->signature();
+ return result;
+}
+
void ShibokenGenerator::writeCodeSnips(QTextStream& s,
const CodeSnipList& codeSnips,
TypeSystem::CodeSnipPosition position,
@@ -1647,15 +1745,18 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
// Replace %PYARG_# variables.
code.replace(QLatin1String("%PYARG_0"), QLatin1String(PYTHON_RETURN_VAR));
- static QRegExp pyArgsRegex(QLatin1String("%PYARG_(\\d+)"));
+ static const QRegularExpression pyArgsRegex(QStringLiteral("%PYARG_(\\d+)"));
+ Q_ASSERT(pyArgsRegex.isValid());
if (language == TypeSystem::TargetLangCode) {
if (usePyArgs) {
code.replace(pyArgsRegex, QLatin1String(PYTHON_ARGS"[\\1-1]"));
} else {
- static QRegExp pyArgsRegexCheck(QLatin1String("%PYARG_([2-9]+)"));
- if (pyArgsRegexCheck.indexIn(code) != -1) {
+ static const QRegularExpression pyArgsRegexCheck(QStringLiteral("%PYARG_([2-9]+)"));
+ Q_ASSERT(pyArgsRegexCheck.isValid());
+ const QRegularExpressionMatch match = pyArgsRegexCheck.match(code);
+ if (match.hasMatch()) {
qCWarning(lcShiboken).noquote().nospace()
- << "Wrong index for %PYARG variable (" << pyArgsRegexCheck.cap(1) << ") on " << func->signature();
+ << msgWrongIndex("%PYARG", match.captured(1), func);
return;
}
code.replace(QLatin1String("%PYARG_1"), QLatin1String(PYTHON_ARG));
@@ -1663,25 +1764,27 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
} else {
// Replaces the simplest case of attribution to a
// Python argument on the binding virtual method.
- static QRegExp pyArgsAttributionRegex(QLatin1String("%PYARG_(\\d+)\\s*=[^=]\\s*([^;]+)"));
+ static const QRegularExpression pyArgsAttributionRegex(QStringLiteral("%PYARG_(\\d+)\\s*=[^=]\\s*([^;]+)"));
+ Q_ASSERT(pyArgsAttributionRegex.isValid());
code.replace(pyArgsAttributionRegex, QLatin1String("PyTuple_SET_ITEM(" PYTHON_ARGS ", \\1-1, \\2)"));
code.replace(pyArgsRegex, QLatin1String("PyTuple_GET_ITEM(" PYTHON_ARGS ", \\1-1)"));
}
// Replace %ARG#_TYPE variables.
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
QString argTypeVar = QStringLiteral("%ARG%1_TYPE").arg(arg->argumentIndex() + 1);
QString argTypeVal = arg->type()->cppSignature();
code.replace(argTypeVar, argTypeVal);
}
- int pos = 0;
- static QRegExp cppArgTypeRegexCheck(QLatin1String("%ARG(\\d+)_TYPE"));
- while ((pos = cppArgTypeRegexCheck.indexIn(code, pos)) != -1) {
+ static const QRegularExpression cppArgTypeRegexCheck(QStringLiteral("%ARG(\\d+)_TYPE"));
+ Q_ASSERT(cppArgTypeRegexCheck.isValid());
+ QRegularExpressionMatchIterator rit = cppArgTypeRegexCheck.globalMatch(code);
+ while (rit.hasNext()) {
+ QRegularExpressionMatch match = rit.next();
qCWarning(lcShiboken).noquote().nospace()
- << "Wrong index for %ARG#_TYPE variable (" << cppArgTypeRegexCheck.cap(1)
- << ") on " << func->signature();
- pos += cppArgTypeRegexCheck.matchedLength();
+ << msgWrongIndex("%ARG#_TYPE", match.captured(1), func);
}
// Replace template variable for return variable name.
@@ -1762,17 +1865,17 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
// Replaces template %ARGUMENT_NAMES and %# variables by argument variables and values.
// Replaces template variables %# for individual arguments.
- ArgumentVarReplacementList argReplacements = getArgumentReplacement(func, usePyArgs, language, lastArg);
+ const ArgumentVarReplacementList &argReplacements = getArgumentReplacement(func, usePyArgs, language, lastArg);
QStringList args;
- foreach (const ArgumentVarReplacementPair &pair, argReplacements) {
+ for (const ArgumentVarReplacementPair &pair : argReplacements) {
if (pair.second.startsWith(QLatin1String(CPP_ARG_REMOVED)))
continue;
args << pair.second;
}
code.replace(QLatin1String("%ARGUMENT_NAMES"), args.join(QLatin1String(", ")));
- foreach (const ArgumentVarReplacementPair &pair, argReplacements) {
+ for (const ArgumentVarReplacementPair &pair : argReplacements) {
const AbstractMetaArgument* arg = pair.first;
int idx = arg->argumentIndex() + 1;
AbstractMetaType* type = arg->type();
@@ -1789,7 +1892,7 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
if (type->referenceType() == LValueReference || isPointer(type))
code.replace(QString::fromLatin1("%%1.").arg(idx), replacement + QLatin1String("->"));
}
- code.replace(QRegExp(QString::fromLatin1("%%1\\b").arg(idx)), pair.second);
+ code.replace(placeHolderRegex(idx), pair.second);
}
if (language == TypeSystem::NativeCode) {
@@ -1811,7 +1914,8 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
// dispatcher.
bool hasProtectedOverload = false;
if (func->isUserAdded()) {
- foreach (const AbstractMetaFunction* f, getFunctionOverloads(func->ownerClass(), func->name()))
+ const AbstractMetaFunctionList &funcs = getFunctionOverloads(func->ownerClass(), func->name());
+ for (const AbstractMetaFunction *f : funcs)
hasProtectedOverload |= f->isProtected();
}
@@ -1842,8 +1946,9 @@ void ShibokenGenerator::writeCodeSnips(QTextStream& s,
// and false if it is a variable.
static bool isVariable(const QString& code)
{
- static QRegExp expr(QLatin1String("\\s*\\*?\\s*[A-Za-z_][A-Za-z_0-9.]*\\s*(?:\\[[^\\[]+\\])*"));
- return expr.exactMatch(code.trimmed());
+ static const QRegularExpression expr(QStringLiteral("^\\s*\\*?\\s*[A-Za-z_][A-Za-z_0-9.]*\\s*(?:\\[[^\\[]+\\])*$"));
+ Q_ASSERT(expr.isValid());
+ return expr.match(code.trimmed()).hasMatch();
}
// A miniature normalizer that puts a type string into a format
@@ -1893,14 +1998,13 @@ static QString getConverterTypeSystemVariableArgument(const QString& code, int p
typedef QPair<QString, QString> StringPair;
void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVariable converterVariable, QString& code)
{
- QRegExp& regex = m_typeSystemConvRegEx[converterVariable];
- int pos = 0;
- QList<StringPair> replacements;
- while ((pos = regex.indexIn(code, pos)) != -1) {
- pos += regex.matchedLength();
- QStringList list = regex.capturedTexts();
- QString conversionString = list.first();
- QString conversionTypeName = list.last();
+ QVector<StringPair> replacements;
+ QRegularExpressionMatchIterator rit = m_typeSystemConvRegEx[converterVariable].globalMatch(code);
+ while (rit.hasNext()) {
+ const QRegularExpressionMatch match = rit.next();
+ const QStringList list = match.capturedTexts();
+ QString conversionString = list.constFirst();
+ QString conversionTypeName = list.constLast();
const AbstractMetaType* conversionType = buildAbstractMetaTypeFromString(conversionTypeName);
if (!conversionType) {
qFatal(qPrintable(QString::fromLatin1("Could not find type '%1' for use in '%2' conversion. "
@@ -1912,14 +2016,14 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
QTextStream c(&conversion);
switch (converterVariable) {
case TypeSystemToCppFunction: {
- int end = pos - list.first().count();
+ int end = match.capturedStart();
int start = end;
while (start > 0 && code.at(start) != QLatin1Char('\n'))
--start;
while (code.at(start).isSpace())
++start;
QString varType = code.mid(start, end - start);
- conversionString = varType + list.first();
+ conversionString = varType + list.constFirst();
varType = miniNormalizer(varType);
QString varName = list.at(1).trimmed();
if (!varType.isEmpty()) {
@@ -1941,7 +2045,7 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
} else {
prefix = QLatin1Char('&');
}
- QString arg = getConverterTypeSystemVariableArgument(code, pos);
+ QString arg = getConverterTypeSystemVariableArgument(code, match.capturedEnd());
conversionString += arg;
c << arg << ", " << prefix << '(' << varName << ')';
break;
@@ -1961,7 +2065,7 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
if (conversion.isEmpty())
conversion = cpythonToPythonConversionFunction(conversionType);
default: {
- QString arg = getConverterTypeSystemVariableArgument(code, pos);
+ QString arg = getConverterTypeSystemVariableArgument(code, match.capturedEnd());
conversionString += arg;
if (converterVariable == TypeSystemToPythonFunction && !isVariable(arg)) {
qFatal(qPrintable(QString::fromLatin1("Only variables are acceptable as argument to %%CONVERTTOPYTHON type system variable on code snippet: '%1'")
@@ -1977,14 +2081,14 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
}
replacements.append(qMakePair(conversionString, conversion));
}
- foreach (const StringPair &rep, replacements)
+ for (const StringPair &rep : qAsConst(replacements))
code.replace(rep.first, rep.second);
}
bool ShibokenGenerator::injectedCodeUsesCppSelf(const AbstractMetaFunction* func)
{
CodeSnipList snips = func->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode);
- foreach (const CodeSnip &snip, snips) {
+ for (const CodeSnip &snip : qAsConst(snips)) {
if (snip.code().contains(QLatin1String("%CPPSELF")))
return true;
}
@@ -1994,7 +2098,7 @@ bool ShibokenGenerator::injectedCodeUsesCppSelf(const AbstractMetaFunction* func
bool ShibokenGenerator::injectedCodeUsesPySelf(const AbstractMetaFunction* func)
{
CodeSnipList snips = func->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, TypeSystem::NativeCode);
- foreach (const CodeSnip &snip, snips) {
+ for (const CodeSnip &snip : qAsConst(snips)) {
if (snip.code().contains(QLatin1String("%PYSELF")))
return true;
}
@@ -2010,7 +2114,7 @@ bool ShibokenGenerator::injectedCodeCallsCppFunction(const AbstractMetaFunction*
wrappedCtorCall = QStringLiteral("new %1(").arg(wrapperName(func->ownerClass()));
}
CodeSnipList snips = func->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, TypeSystem::TargetLangCode);
- foreach (const CodeSnip &snip, snips) {
+ for (const CodeSnip &snip : qAsConst(snips)) {
if (snip.code().contains(QLatin1String("%FUNCTION_NAME(")) || snip.code().contains(funcCall)
|| (func->isConstructor()
&& ((func->ownerClass()->isPolymorphic() && snip.code().contains(wrappedCtorCall))
@@ -2023,10 +2127,11 @@ bool ShibokenGenerator::injectedCodeCallsCppFunction(const AbstractMetaFunction*
bool ShibokenGenerator::injectedCodeCallsPythonOverride(const AbstractMetaFunction* func)
{
- static QRegExp overrideCallRegexCheck(QLatin1String("PyObject_Call\\s*\\(\\s*%PYTHON_METHOD_OVERRIDE\\s*,"));
+ static const QRegularExpression overrideCallRegexCheck(QStringLiteral("PyObject_Call\\s*\\(\\s*%PYTHON_METHOD_OVERRIDE\\s*,"));
+ Q_ASSERT(overrideCallRegexCheck.isValid());
CodeSnipList snips = func->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, TypeSystem::NativeCode);
- foreach (const CodeSnip &snip, snips) {
- if (overrideCallRegexCheck.indexIn(snip.code()) != -1)
+ for (const CodeSnip &snip : qAsConst(snips)) {
+ if (snip.code().contains(overrideCallRegexCheck))
return true;
}
return false;
@@ -2034,15 +2139,17 @@ bool ShibokenGenerator::injectedCodeCallsPythonOverride(const AbstractMetaFuncti
bool ShibokenGenerator::injectedCodeHasReturnValueAttribution(const AbstractMetaFunction* func, TypeSystem::Language language)
{
- static QRegExp retValAttributionRegexCheck_native(QLatin1String("%0\\s*=[^=]\\s*.+"));
- static QRegExp retValAttributionRegexCheck_target(QLatin1String("%PYARG_0\\s*=[^=]\\s*.+"));
+ static const QRegularExpression retValAttributionRegexCheck_native(QStringLiteral("%0\\s*=[^=]\\s*.+"));
+ Q_ASSERT(retValAttributionRegexCheck_native.isValid());
+ static const QRegularExpression retValAttributionRegexCheck_target(QStringLiteral("%PYARG_0\\s*=[^=]\\s*.+"));
+ Q_ASSERT(retValAttributionRegexCheck_target.isValid());
CodeSnipList snips = func->injectedCodeSnips(TypeSystem::CodeSnipPositionAny, language);
- foreach (const CodeSnip &snip, snips) {
+ for (const CodeSnip &snip : qAsConst(snips)) {
if (language == TypeSystem::TargetLangCode) {
- if (retValAttributionRegexCheck_target.indexIn(snip.code()) != -1)
+ if (snip.code().contains(retValAttributionRegexCheck_target))
return true;
} else {
- if (retValAttributionRegexCheck_native.indexIn(snip.code()) != -1)
+ if (snip.code().contains(retValAttributionRegexCheck_native))
return true;
}
}
@@ -2052,11 +2159,10 @@ bool ShibokenGenerator::injectedCodeHasReturnValueAttribution(const AbstractMeta
bool ShibokenGenerator::injectedCodeUsesArgument(const AbstractMetaFunction* func, int argumentIndex)
{
CodeSnipList snips = func->injectedCodeSnips(TypeSystem::CodeSnipPositionAny);
- foreach (const CodeSnip &snip, snips) {
+ const QRegularExpression argRegEx = placeHolderRegex(argumentIndex + 1);
+ for (const CodeSnip &snip : qAsConst(snips)) {
QString code = snip.code();
- if (code.contains(QLatin1String("%ARGUMENT_NAMES")))
- return true;
- if (code.contains(QRegExp(QStringLiteral("%%1\\b").arg(argumentIndex + 1))))
+ if (code.contains(QLatin1String("%ARGUMENT_NAMES")) || code.contains(argRegEx))
return true;
}
return false;
@@ -2083,7 +2189,7 @@ bool ShibokenGenerator::classNeedsGetattroFunction(const AbstractMetaClass* meta
const FunctionGroupMap &functionGroup = getFunctionGroups(metaClass);
for (FunctionGroupMapIt it = functionGroup.cbegin(), end = functionGroup.cend(); it != end; ++it) {
AbstractMetaFunctionList overloads;
- foreach (AbstractMetaFunction* func, it.value()) {
+ for (AbstractMetaFunction *func : qAsConst(it.value())) {
if (func->isAssignmentOperator() || func->isCastOperator() || func->isModifiedRemoved()
|| func->isPrivate() || func->ownerClass() != func->implementingClass()
|| func->isConstructor() || func->isOperatorOverload())
@@ -2114,7 +2220,7 @@ AbstractMetaFunctionList ShibokenGenerator::getMethodsWithBothStaticAndNonStatic
const FunctionGroupMap &functionGroups = getFunctionGroups(metaClass);
for (FunctionGroupMapIt it = functionGroups.cbegin(), end = functionGroups.cend(); it != end; ++it) {
AbstractMetaFunctionList overloads;
- foreach (AbstractMetaFunction* func, it.value()) {
+ for (AbstractMetaFunction *func : qAsConst(it.value())) {
if (func->isAssignmentOperator() || func->isCastOperator() || func->isModifiedRemoved()
|| func->isPrivate() || func->ownerClass() != func->implementingClass()
|| func->isConstructor() || func->isOperatorOverload())
@@ -2124,7 +2230,7 @@ AbstractMetaFunctionList ShibokenGenerator::getMethodsWithBothStaticAndNonStatic
if (overloads.isEmpty())
continue;
if (OverloadData::hasStaticAndInstanceFunctions(overloads))
- methods.append(overloads.first());
+ methods.append(overloads.constFirst());
}
}
return methods;
@@ -2134,7 +2240,8 @@ AbstractMetaClassList ShibokenGenerator::getBaseClasses(const AbstractMetaClass*
{
AbstractMetaClassList baseClasses;
if (metaClass) {
- foreach (const QString &parent, metaClass->baseClassNames()) {
+ const QStringList &baseClassNames = metaClass->baseClassNames();
+ for (const QString &parent : baseClassNames) {
AbstractMetaClass *clazz = AbstractMetaClass::findClass(classes(), parent);
if (clazz)
baseClasses << clazz;
@@ -2157,7 +2264,7 @@ AbstractMetaClassList ShibokenGenerator::getAllAncestors(const AbstractMetaClass
AbstractMetaClassList result;
if (metaClass) {
AbstractMetaClassList baseClasses = getBaseClasses(metaClass);
- foreach (AbstractMetaClass* base, baseClasses) {
+ for (AbstractMetaClass *base : qAsConst(baseClasses)) {
result.append(base);
result.append(getAllAncestors(base));
}
@@ -2268,7 +2375,7 @@ AbstractMetaType* ShibokenGenerator::buildAbstractMetaTypeFromString(QString typ
metaType->setReferenceType(refType);
metaType->setConstant(isConst);
metaType->setTypeUsagePattern(AbstractMetaType::ContainerPattern);
- foreach (const QString& instantiation, instantiatedTypes) {
+ for (const QString &instantiation : qAsConst(instantiatedTypes)) {
AbstractMetaType* tmplArgType = buildAbstractMetaTypeFromString(instantiation);
metaType->addInstantiation(tmplArgType);
}
@@ -2303,7 +2410,7 @@ AbstractMetaType* ShibokenGenerator::buildAbstractMetaTypeFromAbstractMetaClass(
static void dumpFunction(AbstractMetaFunctionList lst)
{
qDebug() << "DUMP FUNCTIONS: ";
- foreach (AbstractMetaFunction *func, lst)
+ for (AbstractMetaFunction *func : qAsConst(lst))
qDebug() << "*" << func->ownerClass()->name()
<< func->signature()
<< "Private: " << func->isPrivate()
@@ -2331,7 +2438,7 @@ QMap< QString, AbstractMetaFunctionList > ShibokenGenerator::getFunctionGroups(c
AbstractMetaFunctionList lst = scope ? scope->functions() : globalFunctions();
QMap<QString, AbstractMetaFunctionList> results;
- foreach (AbstractMetaFunction* func, lst) {
+ for (AbstractMetaFunction *func : qAsConst(lst)) {
if (isGroupable(func))
results[func->name()].append(func);
}
@@ -2370,7 +2477,7 @@ AbstractMetaFunctionList ShibokenGenerator::getFunctionOverloads(const AbstractM
AbstractMetaFunctionList results;
QSet<QString> seenSignatures;
- foreach (AbstractMetaFunction* func, lst) {
+ for (AbstractMetaFunction *func : qAsConst(lst)) {
if (func->name() != functionName)
continue;
if (isGroupable(func)) {
@@ -2387,9 +2494,10 @@ QPair< int, int > ShibokenGenerator::getMinMaxArguments(const AbstractMetaFuncti
int minArgs = std::numeric_limits<int>::max();
int maxArgs = 0;
- foreach (const AbstractMetaFunction* func, overloads) {
+ for (const AbstractMetaFunction* func : qAsConst(overloads)) {
int numArgs = 0;
- foreach (const AbstractMetaArgument* arg, func->arguments()) {
+ const AbstractMetaArgumentList &arguments = func->arguments();
+ for (const AbstractMetaArgument *arg : arguments) {
if (!func->argumentRemoved(arg->argumentIndex() + 1))
numArgs++;
}
@@ -2399,27 +2507,26 @@ QPair< int, int > ShibokenGenerator::getMinMaxArguments(const AbstractMetaFuncti
return qMakePair(minArgs, maxArgs);
}
-QMap<QString, QString> ShibokenGenerator::options() const
+Generator::OptionDescriptions ShibokenGenerator::options() const
{
- QMap<QString, QString> opts(Generator::options());
- opts.insert(QLatin1String(AVOID_PROTECTED_HACK),
- QLatin1String("Avoid the use of the '#define protected public' hack."));
- opts.insert(QLatin1String(PARENT_CTOR_HEURISTIC),
- QLatin1String("Enable heuristics to detect parent relationship on constructors."));
- opts.insert(QLatin1String(RETURN_VALUE_HEURISTIC),
- QLatin1String("Enable heuristics to detect parent relationship on return values (USE WITH CAUTION!)"));
- opts.insert(QLatin1String(ENABLE_PYSIDE_EXTENSIONS),
- QLatin1String("Enable PySide extensions, such as support for signal/slots, use this if you are creating a binding for a Qt-based library."));
- opts.insert(QLatin1String(DISABLE_VERBOSE_ERROR_MESSAGES),
- QLatin1String("Disable verbose error messages. Turn the python code hard to debug but safe few kB on the generated bindings."));
- opts.insert(QLatin1String(USE_ISNULL_AS_NB_NONZERO),
- QLatin1String("If a class have an isNull()const method, it will be used to compute the value of boolean casts"));
- return opts;
+ return OptionDescriptions()
+ << qMakePair(QLatin1String(AVOID_PROTECTED_HACK),
+ QLatin1String("Avoid the use of the '#define protected public' hack."))
+ << qMakePair(QLatin1String(DISABLE_VERBOSE_ERROR_MESSAGES),
+ QLatin1String("Disable verbose error messages. Turn the python code hard to debug but safe few kB on the generated bindings."))
+ << qMakePair(QLatin1String(PARENT_CTOR_HEURISTIC),
+ QLatin1String("Enable heuristics to detect parent relationship on constructors."))
+ << qMakePair(QLatin1String(ENABLE_PYSIDE_EXTENSIONS),
+ QLatin1String("Enable PySide extensions, such as support for signal/slots, use this if you are creating a binding for a Qt-based library."))
+ << qMakePair(QLatin1String(RETURN_VALUE_HEURISTIC),
+ QLatin1String("Enable heuristics to detect parent relationship on return values (USE WITH CAUTION!)"))
+ << qMakePair(QLatin1String(USE_ISNULL_AS_NB_NONZERO),
+ QLatin1String("If a class have an isNull()const method, it will be used to compute the value of boolean casts"));
}
static void getCode(QStringList& code, const CodeSnipList& codeSnips)
{
- foreach (const CodeSnip& snip, codeSnips)
+ for (const CodeSnip &snip : qAsConst(codeSnips))
code.append(snip.code());
}
@@ -2438,7 +2545,7 @@ static void getCode(QStringList& code, const TypeEntry* type)
if (toCppConversions.isEmpty())
return;
- foreach (CustomConversion::TargetToNativeConversion* toNative, toCppConversions)
+ for (CustomConversion::TargetToNativeConversion *toNative : qAsConst(toCppConversions))
code.append(toNative->conversion());
}
@@ -2453,20 +2560,23 @@ bool ShibokenGenerator::doSetup(const QMap<QString, QString>& args)
TypeDatabase* td = TypeDatabase::instance();
QStringList snips;
- foreach (const PrimitiveTypeEntry* type, primitiveTypes())
+ const PrimitiveTypeEntryList &primitiveTypeList = primitiveTypes();
+ for (const PrimitiveTypeEntry *type : primitiveTypeList)
getCode(snips, type);
- foreach (const ContainerTypeEntry* type, containerTypes())
+ const ContainerTypeEntryList &containerTypeList = containerTypes();
+ for (const ContainerTypeEntry *type : containerTypeList)
getCode(snips, type);
- foreach (const AbstractMetaClass* metaClass, classes())
+ const AbstractMetaClassList &classList = classes();
+ for (const AbstractMetaClass *metaClass : classList)
getCode(snips, metaClass->typeEntry());
getCode(snips, td->findType(packageName()));
const FunctionGroupMap &functionGroups = getFunctionGroups();
for (FunctionGroupMapIt it = functionGroups.cbegin(), end = functionGroups.cend(); it != end; ++it) {
- foreach (AbstractMetaFunction* func, it.value())
+ for (AbstractMetaFunction *func : it.value())
getCode(snips, func->injectedCodeSnips());
}
- foreach (const QString& code, snips) {
+ for (const QString &code : qAsConst(snips)) {
collectContainerTypesFromConverterMacros(code, true);
collectContainerTypesFromConverterMacros(code, false);
}
@@ -2536,7 +2646,8 @@ QString ShibokenGenerator::convertersVariableName(const QString& moduleName) con
static QString processInstantiationsVariableName(const AbstractMetaType* type)
{
QString res = QLatin1Char('_') + _fixedCppTypeName(type->typeEntry()->qualifiedCppName()).toUpper();
- foreach (const AbstractMetaType* instantiation, type->instantiations()) {
+ const AbstractMetaTypeList &instantiations = type->instantiations();
+ for (const AbstractMetaType *instantiation : instantiations) {
res += instantiation->isContainer()
? processInstantiationsVariableName(instantiation)
: QLatin1Char('_') + _fixedCppTypeName(instantiation->cppSignature()).toUpper();
@@ -2551,7 +2662,8 @@ QString ShibokenGenerator::getTypeIndexVariableName(const AbstractMetaClass* met
return QString();
QString base = _fixedCppTypeName(templateBaseClass->typeEntry()->qualifiedCppName()).toUpper();
QString instantiations;
- foreach (const AbstractMetaType* instantiation, metaClass->templateBaseClassInstantiations())
+ const AbstractMetaTypeList &templateBaseClassInstantiations = metaClass->templateBaseClassInstantiations();
+ for (const AbstractMetaType *instantiation : templateBaseClassInstantiations)
instantiations += processInstantiationsVariableName(instantiation);
return QString::fromLatin1("SBK_%1%2_IDX").arg(base, instantiations);
}
@@ -2615,8 +2727,9 @@ QString ShibokenGenerator::getDefaultValue(const AbstractMetaFunction* func, co
return arg->defaultValueExpression();
//Check modifications
- foreach(FunctionModification m, func->modifications()) {
- foreach(ArgumentModification am, m.argument_mods) {
+ const FunctionModificationList &mods = func->modifications();
+ for (const FunctionModification &m : mods) {
+ for (const ArgumentModification &am : m.argument_mods) {
if (am.index == (arg->argumentIndex() + 1))
return am.replacedDefaultExpression;
}
diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.h b/sources/shiboken2/generator/shiboken2/shibokengenerator.h
index d36962cf1..5ed7f79f6 100644
--- a/sources/shiboken2/generator/shiboken2/shibokengenerator.h
+++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.h
@@ -56,6 +56,8 @@
#include "typesystem.h"
+#include <QtCore/QRegularExpression>
+
class DocParser;
class CodeSnip;
class OverloadData;
@@ -132,7 +134,7 @@ public:
void writeArgumentNames(QTextStream &s,
const AbstractMetaFunction* func,
- Options options = NoOption) const;
+ Options options = NoOption) const override;
/**
* Function used to write the fucntion arguments on the class buffer.
@@ -143,32 +145,32 @@ public:
*/
void writeFunctionArguments(QTextStream &s,
const AbstractMetaFunction* func,
- Options options = NoOption) const;
+ Options options = NoOption) const override;
QString functionReturnType(const AbstractMetaFunction* func, Options options = NoOption) const;
/// Utility function for writeCodeSnips.
typedef QPair<const AbstractMetaArgument*, QString> ArgumentVarReplacementPair;
- typedef QList<ArgumentVarReplacementPair> ArgumentVarReplacementList;
+ typedef QVector<ArgumentVarReplacementPair> ArgumentVarReplacementList;
ArgumentVarReplacementList getArgumentReplacement(const AbstractMetaFunction* func,
bool usePyArgs, TypeSystem::Language language,
const AbstractMetaArgument* lastArg);
/// Write user's custom code snippets at class or module level.
void writeCodeSnips(QTextStream& s,
- const QList<CodeSnip>& codeSnips,
+ const QVector<CodeSnip> & codeSnips,
TypeSystem::CodeSnipPosition position,
TypeSystem::Language language,
const AbstractMetaClass* context = 0);
/// Write user's custom code snippets at function level.
void writeCodeSnips(QTextStream& s,
- const QList<CodeSnip>& codeSnips,
+ const QVector<CodeSnip> & codeSnips,
TypeSystem::CodeSnipPosition position,
TypeSystem::Language language,
const AbstractMetaFunction* func,
const AbstractMetaArgument* lastArg = 0);
/// Returns a string with the user's custom code snippets that comply with \p position and \p language.
- QString getCodeSnippets(const QList<CodeSnip>& codeSnips, TypeSystem::CodeSnipPosition position, TypeSystem::Language language);
+ QString getCodeSnippets(const QVector<CodeSnip> & codeSnips, TypeSystem::CodeSnipPosition position, TypeSystem::Language language);
/// Replaces variables for the user's custom code at global or class level.
void processCodeSnip(QString& code, const AbstractMetaClass* context = 0);
@@ -409,7 +411,11 @@ public:
QString cpythonWrapperCPtr(const TypeEntry* type, QString argName);
/// Guesses the scope to where belongs an argument's default value.
- QString guessScopeForDefaultValue(const AbstractMetaFunction* func, const AbstractMetaArgument* arg);
+ QString guessScopeForDefaultValue(const AbstractMetaFunction *func,
+ const AbstractMetaArgument *arg) const;
+ QString guessScopeForDefaultFlagsValue(const AbstractMetaFunction *func,
+ const AbstractMetaArgument *arg,
+ const QString &value) const;
QString cpythonEnumName(const EnumTypeEntry* enumEntry);
QString cpythonEnumName(const AbstractMetaEnum* metaEnum);
@@ -428,7 +434,7 @@ public:
QString extendedIsConvertibleFunctionName(const TypeEntry* targetType) const;
QString extendedToCppFunctionName(const TypeEntry* targetType) const;
- QMap< QString, QString > options() const;
+ OptionDescriptions options() const override;
/// Returns true if the user enabled the so called "parent constructor heuristic".
bool useCtorHeuristic() const;
@@ -513,12 +519,12 @@ protected:
// All data about extended converters: the type entries of the target type, and a
// list of AbstractMetaClasses accepted as argument for the conversion.
- typedef QHash<const TypeEntry*, QList<const AbstractMetaClass*> > ExtendedConverterData;
+ typedef QHash<const TypeEntry *, QVector<const AbstractMetaClass *> > ExtendedConverterData;
/// Returns all extended conversions for the current module.
ExtendedConverterData getExtendedConverters() const;
/// Returns a list of converters for the non wrapper types of the current module.
- QList<const CustomConversion*> getPrimitiveCustomConversions();
+ QVector<const CustomConversion *> getPrimitiveCustomConversions();
/// Returns true if the Python wrapper for the received OverloadData must accept a list of arguments.
static bool pythonFunctionWrapperUsesListOfArguments(const OverloadData& overloadData);
@@ -549,7 +555,7 @@ private:
/// Type system converter variable replacement names and regular expressions.
QString m_typeSystemConvName[TypeSystemConverterVariables];
- QRegExp m_typeSystemConvRegEx[TypeSystemConverterVariables];
+ QRegularExpression m_typeSystemConvRegEx[TypeSystemConverterVariables];
};
#endif // SHIBOKENGENERATOR_H
diff --git a/sources/shiboken2/header.COMM b/sources/shiboken2/header.COMM
deleted file mode 100644
index 1c8cb00e7..000000000
--- a/sources/shiboken2/header.COMM
+++ /dev/null
@@ -1,20 +0,0 @@
-/******************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the <Fill> module.
-**
-** $QT_BEGIN_LICENSE:COMM$
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** $QT_END_LICENSE$
-**
-******************************************************************************/
diff --git a/sources/shiboken2/header.LGPL-ONLY b/sources/shiboken2/header.LGPL-ONLY
deleted file mode 100644
index 9a676032e..000000000
--- a/sources/shiboken2/header.LGPL-ONLY
+++ /dev/null
@@ -1,22 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL-ONLY$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** If you have questions regarding the use of this file, please contact
-** us via http://www.qt.io/contact-us/.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
diff --git a/sources/shiboken2/header.LGPL21 b/sources/shiboken2/header.LGPL21
deleted file mode 100644
index 533390b07..000000000
--- a/sources/shiboken2/header.LGPL21
+++ /dev/null
@@ -1,33 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/shiboken2/header.LGPL3 b/sources/shiboken2/header.LGPL3
deleted file mode 100644
index d9a65c2e4..000000000
--- a/sources/shiboken2/header.LGPL3
+++ /dev/null
@@ -1,36 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later as published by the Free
-** Software Foundation and appearing in the file LICENSE.GPL included in
-** the packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/shiboken2/header.LGPL3-COMM b/sources/shiboken2/header.LGPL3-COMM
deleted file mode 100644
index b5dc15d38..000000000
--- a/sources/shiboken2/header.LGPL3-COMM
+++ /dev/null
@@ -1,28 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the FOO module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3-COMM$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
diff --git a/sources/shiboken2/libshiboken/CMakeLists.txt b/sources/shiboken2/libshiboken/CMakeLists.txt
index 6e725e6af..e87cf07fd 100644
--- a/sources/shiboken2/libshiboken/CMakeLists.txt
+++ b/sources/shiboken2/libshiboken/CMakeLists.txt
@@ -1,5 +1,22 @@
project(libshiboken)
+macro(get_numpy_location)
+ execute_process(
+ COMMAND ${PYTHON_EXECUTABLE} -c "if True:
+ import sys
+ import os
+ numpy = ''
+ for p in sys.path:
+ if 'site-' in p:
+ numpy = os.path.join(p, 'numpy')
+ if os.path.exists(numpy):
+ print(os.path.realpath(numpy))
+ break"
+ OUTPUT_VARIABLE PYTHON_NUMPY_LOCATION
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ message("PYTHON_NUMPY_LOCATION: " ${PYTHON_NUMPY_LOCATION})
+endmacro()
+
option(ENABLE_VERSION_SUFFIX "Used to use current version in suffix to generated files. This is used to allow multiples versions installed simultaneous." FALSE)
if(ENABLE_VERSION_SUFFIX)
set(shiboken2_SUFFIX "-${shiboken_MAJOR_VERSION}.${shiboken_MINOR_VERSION}")
@@ -10,14 +27,6 @@ endif()
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/sbkversion.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/sbkversion.h" @ONLY)
-#Find installed sparsehash
-find_path(SPARSEHASH_INCLUDE_PATH sparseconfig.h PATH_SUFFIXES "/google/sparsehash")
-if(SPARSEHASH_INCLUDE_PATH)
- message(STATUS "Using system hash found in: ${SPARSEHASH_INCLUDE_PATH}")
-else()
- set(SPARSEHASH_INCLUDE_PATH ${CMAKE_SOURCE_DIR}/ext/sparsehash)
-endif()
-
set(libshiboken_MAJOR_VERSION ${shiboken_MAJOR_VERSION})
set(libshiboken_MINOR_VERSION ${shiboken_MINOR_VERSION})
set(libshiboken_MICRO_VERSION ${shiboken_MICRO_VERSION})
@@ -29,6 +38,7 @@ basewrapper.cpp
debugfreehook.cpp
gilstate.cpp
helper.cpp
+sbkarrayconverter.cpp
sbkconverter.cpp
sbkenum.cpp
sbkmodule.cpp
@@ -41,10 +51,19 @@ qapp_macro.cpp
voidptr.cpp
)
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_CURRENT_BINARY_DIR}
- ${SBK_PYTHON_INCLUDE_DIR}
- ${SPARSEHASH_INCLUDE_PATH})
+get_numpy_location()
+
+set(libshiboken_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${SBK_PYTHON_INCLUDE_DIR})
+
+if (NOT "${PYTHON_NUMPY_LOCATION}" STREQUAL "")
+ set(libshiboken_INCLUDES ${libshiboken_INCLUDES} ${PYTHON_NUMPY_LOCATION}/core/include)
+ set(libshiboken_SRC ${libshiboken_SRC} sbknumpyarrayconverter.cpp)
+ add_definitions(-DHAVE_NUMPY -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION)
+endif()
+
+set(APIEXTRACTOR_EXTRA_INCLUDES ${APIEXTRACTOR_EXTRA_INCLUDES} ${LIBXSLT_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
+
+include_directories(${libshiboken_INCLUDES})
add_library(libshiboken SHARED ${libshiboken_SRC})
target_link_libraries(libshiboken ${SBK_PYTHON_LIBRARIES})
set_target_properties(libshiboken PROPERTIES OUTPUT_NAME "shiboken2${shiboken2_SUFFIX}${PYTHON_SHARED_LIBRARY_SUFFIX}"
@@ -58,6 +77,7 @@ install(FILES
bindingmanager.h
gilstate.h
helper.h
+ sbkarrayconverter.h
sbkconverter.h
sbkenum.h
sbkmodule.h
diff --git a/sources/shiboken2/libshiboken/basewrapper.cpp b/sources/shiboken2/libshiboken/basewrapper.cpp
index 270a5df94..d7d37971c 100644
--- a/sources/shiboken2/libshiboken/basewrapper.cpp
+++ b/sources/shiboken2/libshiboken/basewrapper.cpp
@@ -542,7 +542,6 @@ void DeallocVisitor::done()
DtorCallerVisitor::done();
}
-namespace Module { void init(); }
namespace Conversions { void init(); }
void init()
@@ -551,7 +550,6 @@ void init()
if (shibokenAlreadInitialised)
return;
- Module::init();
Conversions::init();
PyEval_InitThreads();
@@ -681,14 +679,6 @@ bool canCallConstructor(PyTypeObject* myType, PyTypeObject* ctorType)
return true;
}
-
-bool hasExternalCppConversions(SbkObjectType*) { return false; } // DEPRECATED.
-bool isExternalConvertible(SbkObjectType *, PyObject *) { return false; } // DEPRECATED.
-void setExternalCppConversionFunction(SbkObjectType*, ExtendedToCppFunc) {} // DEPRECATED.
-void setExternalIsConvertibleFunction(SbkObjectType*, ExtendedIsConvertibleFunc) {} // DEPRECATED.
-void* callExternalCppConversion(SbkObjectType*, PyObject*) { return 0; } // DEPRECATED.
-
-
bool hasCast(SbkObjectType* type)
{
return type->d->mi_specialcast != 0;
@@ -721,18 +711,6 @@ void setTypeDiscoveryFunctionV2(SbkObjectType* self, TypeDiscoveryFuncV2 func)
self->d->type_discovery = func;
}
-void setTypeDiscoveryFunction(SbkObjectType* self, TypeDiscoveryFunc func)
-{
- self->d->type_discovery = (TypeDiscoveryFuncV2)func;
-}
-
-TypeDiscoveryFunc getTypeDiscoveryFunction(SbkObjectType* self)
-{
- // This is an illegal cast because the return value is different,
- // but nobody ever used this function, so... =]
- return (TypeDiscoveryFunc)self->d->type_discovery;
-}
-
void copyMultimpleheritance(SbkObjectType* self, SbkObjectType* other)
{
self->d->mi_init = other->d->mi_init;
@@ -840,13 +818,15 @@ Py_hash_t hash(PyObject* pyObj)
static void setSequenceOwnership(PyObject* pyObj, bool owner)
{
if (PySequence_Check(pyObj)) {
- std::list<SbkObject*> objs = splitPyObject(pyObj);
- std::list<SbkObject*>::const_iterator it = objs.begin();
- for(; it != objs.end(); ++it) {
- if (owner)
- getOwnership(*it);
- else
- releaseOwnership(*it);
+ Py_ssize_t size = PySequence_Size(pyObj);
+ if (size > 0) {
+ std::list<SbkObject*> objs = splitPyObject(pyObj);
+ for (auto it = objs.begin(), end = objs.end(); it != end; ++it) {
+ if (owner)
+ getOwnership(*it);
+ else
+ releaseOwnership(*it);
+ }
}
} else if (Object::checkType(pyObj)) {
if (owner)
@@ -1053,11 +1033,6 @@ void makeValid(SbkObject* self)
}
}
-bool hasParentInfo(SbkObject* pyObj)
-{
- return pyObj->d->parentInfo != 0;
-}
-
void* cppPointer(SbkObject* pyObj, PyTypeObject* desiredType)
{
PyTypeObject* type = Py_TYPE(pyObj);
diff --git a/sources/shiboken2/libshiboken/basewrapper.h b/sources/shiboken2/libshiboken/basewrapper.h
index bd2d6820f..f6a7352f7 100644
--- a/sources/shiboken2/libshiboken/basewrapper.h
+++ b/sources/shiboken2/libshiboken/basewrapper.h
@@ -151,14 +151,6 @@ LIBSHIBOKEN_API bool isUserType(PyTypeObject* pyObj);
*/
LIBSHIBOKEN_API bool canCallConstructor(PyTypeObject* myType, PyTypeObject* ctorType);
-
-LIBSHIBOKEN_API bool hasExternalCppConversions(SbkObjectType*); // DEPRECATED.
-LIBSHIBOKEN_API bool isExternalConvertible(SbkObjectType*, PyObject*); // DEPRECATED.
-LIBSHIBOKEN_API void setExternalCppConversionFunction(SbkObjectType*, ExtendedToCppFunc); // DEPRECATED.
-LIBSHIBOKEN_API void setExternalIsConvertibleFunction(SbkObjectType*, ExtendedIsConvertibleFunc); // DEPRECATED.
-LIBSHIBOKEN_API void* callExternalCppConversion(SbkObjectType*, PyObject*); // DEPRECATED.
-
-
/**
* Tells if the \p type represents an object of a class with multiple inheritance in C++.
* When this occurs, the C++ pointer held by the Python wrapper will need to be cast when
@@ -180,9 +172,6 @@ LIBSHIBOKEN_API void setOriginalName(SbkObjectType* self, const char* nam
LIBSHIBOKEN_API const char* getOriginalName(SbkObjectType* self);
LIBSHIBOKEN_API void setTypeDiscoveryFunctionV2(SbkObjectType* self, TypeDiscoveryFuncV2 func);
-LIBSHIBOKEN_API SBK_DEPRECATED(void setTypeDiscoveryFunction(SbkObjectType* self, TypeDiscoveryFunc func));
-LIBSHIBOKEN_API SBK_DEPRECATED(TypeDiscoveryFunc getTypeDiscoveryFunction(SbkObjectType* self));
-
LIBSHIBOKEN_API void copyMultimpleheritance(SbkObjectType* self, SbkObjectType* other);
LIBSHIBOKEN_API void setMultipleIheritanceFunction(SbkObjectType* self, MultipleInheritanceInitFunction func);
LIBSHIBOKEN_API MultipleInheritanceInitFunction getMultipleIheritanceFunction(SbkObjectType* self);
@@ -333,11 +322,6 @@ LIBSHIBOKEN_API void releaseOwnership(PyObject* pyObj);
LIBSHIBOKEN_API void releaseOwnership(SbkObject* pyObj);
/**
- * Returns true if the pyObj holds information about their parents.
- */
-LIBSHIBOKEN_API bool hasParentInfo(SbkObject* pyObj);
-
-/**
* Get the C++ pointer of type \p desiredType from a Python object.
*/
LIBSHIBOKEN_API void* cppPointer(SbkObject* pyObj, PyTypeObject* desiredType);
@@ -387,12 +371,6 @@ LIBSHIBOKEN_API void setParent(PyObject* parent, PyObject* child);
LIBSHIBOKEN_API void removeParent(SbkObject* child, bool giveOwnershipBack = true, bool keepReferenc = false);
/**
-* \internal This is an internal function called by tp_dealloc, it's exported just for technical reasons.
-* \note Do not call this function inside your bindings.
-*/
-LIBSHIBOKEN_API void destroyParentInfo(SbkObject* obj, bool removeFromParent = true);
-
-/**
* Mark the object as invalid
*/
LIBSHIBOKEN_API void invalidate(SbkObject* self);
diff --git a/sources/shiboken2/libshiboken/bindingmanager.cpp b/sources/shiboken2/libshiboken/bindingmanager.cpp
index d7e122cd7..3308ef972 100644
--- a/sources/shiboken2/libshiboken/bindingmanager.cpp
+++ b/sources/shiboken2/libshiboken/bindingmanager.cpp
@@ -40,7 +40,6 @@
#include "basewrapper.h"
#include "basewrapper_p.h"
#include "bindingmanager.h"
-#include "google/dense_hash_map"
#include "sbkdbg.h"
#include "gilstate.h"
#include "sbkstring.h"
@@ -48,23 +47,23 @@
#include <cstddef>
#include <fstream>
+#include <unordered_map>
namespace Shiboken
{
-typedef google::dense_hash_map<const void*, SbkObject*> WrapperMap;
+typedef std::unordered_map<const void *, SbkObject *> WrapperMap;
class Graph
{
public:
typedef std::list<SbkObjectType*> NodeList;
- typedef google::dense_hash_map<SbkObjectType*, NodeList> Edges;
+ typedef std::unordered_map<SbkObjectType *, NodeList> Edges;
Edges m_edges;
Graph()
{
- m_edges.set_empty_key(0);
}
void addEdge(SbkObjectType* from, SbkObjectType* to)
@@ -172,8 +171,6 @@ void BindingManager::BindingManagerPrivate::assignWrapper(SbkObject* wrapper, co
BindingManager::BindingManager()
{
m_d = new BindingManager::BindingManagerPrivate;
- m_d->wrapperMapper.set_empty_key((WrapperMap::key_type)0);
- m_d->wrapperMapper.set_deleted_key((WrapperMap::key_type)1);
#ifdef SHIBOKEN_INSTALL_FREE_DEBUG_HOOK
debugInstallFreeHook();
diff --git a/sources/shiboken2/libshiboken/sbkarrayconverter.cpp b/sources/shiboken2/libshiboken/sbkarrayconverter.cpp
new file mode 100644
index 000000000..c22015709
--- /dev/null
+++ b/sources/shiboken2/libshiboken/sbkarrayconverter.cpp
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sbkarrayconverter.h"
+#include "sbkarrayconverter_p.h"
+#include "helper.h"
+#include "sbkconverter.h"
+#include "sbkconverter_p.h"
+
+#include <longobject.h>
+#include <floatobject.h>
+
+#include <algorithm>
+
+static SbkArrayConverter *ArrayTypeConverters[Shiboken::Conversions::SBK_ARRAY_IDX_SIZE] [2] = {};
+
+namespace Shiboken {
+namespace Conversions {
+
+// Check whether Predicate is true for all elements of a sequence
+template <class Predicate>
+static bool sequenceAllOf(PyObject *pyIn, Predicate p)
+{
+ const Py_ssize_t size = PySequence_Size(pyIn);
+ for (Py_ssize_t i = 0; i < size; ++i) {
+ PyObject *item = PySequence_GetItem(pyIn, i);
+ const bool ok = p(item);
+ Py_XDECREF(item);
+ if (!ok)
+ return false;
+ }
+ return true;
+}
+
+// Convert a sequence to output iterator
+template <class T, class Converter>
+inline void convertPySequence(PyObject *pyIn, Converter c, T *out)
+{
+ const Py_ssize_t size = PySequence_Size(pyIn);
+ for (Py_ssize_t i = 0; i < size; ++i) {
+ PyObject *item = PySequence_GetItem(pyIn, i);
+ *out++ = c(item);
+ Py_XDECREF(item);
+ }
+}
+
+// Internal, for usage by numpy
+SbkArrayConverter *createArrayConverter(IsArrayConvertibleToCppFunc toCppCheckFunc)
+{
+ SbkArrayConverter *result = new SbkArrayConverter;
+ result->toCppConversions.push_back(toCppCheckFunc);
+ return result;
+}
+
+static PythonToCppFunc unimplementedArrayCheck(PyObject *, int, int)
+{
+ warning(PyExc_RuntimeWarning, 0, "SbkConverter: Unimplemented C++ array type.");
+ return nullptr;
+}
+
+SbkArrayConverter *unimplementedArrayConverter()
+{
+ static SbkArrayConverter *result = createArrayConverter(unimplementedArrayCheck);
+ return result;
+}
+
+// Integers
+
+static inline bool intCheck(PyObject *pyIn)
+{
+#ifdef IS_PY3K
+ return PyLong_Check(pyIn);
+#else
+ return PyInt_Check(pyIn);
+#endif
+}
+
+static short toShort(PyObject *pyIn) { return short(PyLong_AsLong(pyIn)); }
+
+static void sequenceToCppShortArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<short> *handle = reinterpret_cast<ArrayHandle<short> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, toShort, handle->data());
+}
+
+static inline bool sequenceSizeCheck(PyObject *pyIn, int expectedSize = -1)
+{
+ if (expectedSize >= 0) {
+ const int size = int(PySequence_Size(pyIn));
+ if (size < expectedSize) {
+ warning(PyExc_RuntimeWarning, 0, "A sequence of size %d was passed to a function that expects %d.",
+ size, expectedSize);
+ return false;
+ }
+ }
+ return true;
+}
+
+static inline bool intArrayCheck(PyObject *pyIn, int expectedSize = -1)
+{
+ return PySequence_Check(pyIn) && sequenceAllOf(pyIn, intCheck)
+ && sequenceSizeCheck(pyIn, expectedSize);
+}
+
+static PythonToCppFunc sequenceToCppShortArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return intArrayCheck(pyIn, dim1) ? sequenceToCppShortArray : nullptr;
+}
+
+static short toUnsignedShort(PyObject *pyIn) { return static_cast<unsigned short>(PyLong_AsUnsignedLong(pyIn)); }
+
+static void sequenceToCppUnsignedShortArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<unsigned short> *handle = reinterpret_cast<ArrayHandle<unsigned short> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, toUnsignedShort, handle->data());
+}
+
+static PythonToCppFunc sequenceToCppUnsignedShortArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return intArrayCheck(pyIn, dim1) ? sequenceToCppUnsignedShortArray : nullptr;
+}
+
+static void sequenceToCppIntArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<int> *handle = reinterpret_cast<ArrayHandle<int> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, _PyLong_AsInt, handle->data());
+}
+
+static PythonToCppFunc sequenceToCppIntArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return intArrayCheck(pyIn, dim1) ? sequenceToCppIntArray : nullptr;
+}
+
+static void sequenceToCppUnsignedArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<unsigned> *handle = reinterpret_cast<ArrayHandle<unsigned> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, PyLong_AsUnsignedLong, handle->data());
+}
+
+static PythonToCppFunc sequenceToCppUnsignedArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return intArrayCheck(pyIn, dim1) ? sequenceToCppUnsignedArray : nullptr;
+}
+
+static void sequenceToCppLongLongArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<long long> *handle = reinterpret_cast<ArrayHandle<long long> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, PyLong_AsLongLong, handle->data());
+}
+
+static PythonToCppFunc sequenceToCppLongLongArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return intArrayCheck(pyIn, dim1) ? sequenceToCppLongLongArray : nullptr;
+}
+
+static void sequenceToCppUnsignedLongLongArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<unsigned long long> *handle = reinterpret_cast<ArrayHandle<unsigned long long> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, PyLong_AsUnsignedLongLong, handle->data());
+}
+
+static PythonToCppFunc sequenceToCppUnsignedLongLongArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return intArrayCheck(pyIn, dim1) ? sequenceToCppUnsignedLongLongArray : nullptr;
+}
+
+// Float
+
+static inline bool floatCheck(PyObject *pyIn) { return PyFloat_Check(pyIn); }
+
+static inline bool floatArrayCheck(PyObject *pyIn, int expectedSize = -1)
+{
+ return PySequence_Check(pyIn) && sequenceAllOf(pyIn, floatCheck)
+ && sequenceSizeCheck(pyIn, expectedSize);
+}
+
+static void sequenceToCppDoubleArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<double> *handle = reinterpret_cast<ArrayHandle<double> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, PyFloat_AsDouble, handle->data());
+}
+
+static inline float pyToFloat(PyObject *pyIn) { return float(PyFloat_AsDouble(pyIn)); }
+
+static void sequenceToCppFloatArray(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<float> *handle = reinterpret_cast<ArrayHandle<float> *>(cppOut);
+ handle->allocate(PySequence_Size(pyIn));
+ convertPySequence(pyIn, pyToFloat, handle->data());
+}
+
+static PythonToCppFunc sequenceToCppFloatArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return floatArrayCheck(pyIn, dim1) ? sequenceToCppFloatArray : nullptr;
+}
+
+static PythonToCppFunc sequenceToCppDoubleArrayCheck(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return floatArrayCheck(pyIn, dim1) ? sequenceToCppDoubleArray : nullptr;
+}
+
+#ifdef HAVE_NUMPY
+void initNumPyArrayConverters();
+#endif
+
+void initArrayConverters()
+{
+ SbkArrayConverter **start = &ArrayTypeConverters[0][0];
+ std::fill(start, start + sizeof(ArrayTypeConverters) / sizeof(ArrayTypeConverters[0][0]), nullptr);
+ // Populate 1-dimensional sequence converters
+ ArrayTypeConverters[SBK_DOUBLE_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppDoubleArrayCheck);
+ ArrayTypeConverters[SBK_FLOAT_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppFloatArrayCheck);
+ ArrayTypeConverters[SBK_SHORT_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppShortArrayCheck);
+ ArrayTypeConverters[SBK_UNSIGNEDSHORT_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppUnsignedShortArrayCheck);
+ ArrayTypeConverters[SBK_INT_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppIntArrayCheck);
+ ArrayTypeConverters[SBK_UNSIGNEDINT_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppUnsignedArrayCheck);
+ ArrayTypeConverters[SBK_LONGLONG_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppLongLongArrayCheck);
+ ArrayTypeConverters[SBK_UNSIGNEDLONGLONG_ARRAY_IDX][0] =
+ createArrayConverter(sequenceToCppUnsignedLongLongArrayCheck);
+
+#ifdef HAVE_NUMPY
+ initNumPyArrayConverters();
+#endif
+}
+
+SbkArrayConverter *arrayTypeConverter(int index, int dimension)
+{
+ SbkArrayConverter *c = ArrayTypeConverters[index][dimension - 1];
+ return c ? c : unimplementedArrayConverter();
+}
+
+// Internal, for usage by numpy
+void setArrayTypeConverter(int index, int dimension, SbkArrayConverter *c)
+{
+ ArrayTypeConverters[index][dimension - 1] = c;
+}
+
+} // namespace Conversions
+} // namespace Shiboken
diff --git a/sources/shiboken2/libshiboken/sbkarrayconverter.h b/sources/shiboken2/libshiboken/sbkarrayconverter.h
new file mode 100644
index 000000000..f3d3e5f98
--- /dev/null
+++ b/sources/shiboken2/libshiboken/sbkarrayconverter.h
@@ -0,0 +1,171 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SBKARRAYCONVERTERS_H
+#define SBKARRAYCONVERTERS_H
+
+#include "sbkpython.h"
+#include "shibokenmacros.h"
+
+extern "C" {
+struct SbkArrayConverter;
+}
+
+namespace Shiboken {
+namespace Conversions {
+
+enum : int {
+ SBK_UNIMPLEMENTED_ARRAY_IDX,
+ SBK_DOUBLE_ARRAY_IDX,
+ SBK_FLOAT_ARRAY_IDX,
+ SBK_SHORT_ARRAY_IDX,
+ SBK_UNSIGNEDSHORT_ARRAY_IDX,
+ SBK_INT_ARRAY_IDX,
+ SBK_UNSIGNEDINT_ARRAY_IDX,
+ SBK_LONGLONG_ARRAY_IDX,
+ SBK_UNSIGNEDLONGLONG_ARRAY_IDX,
+ SBK_ARRAY_IDX_SIZE
+};
+
+/**
+ * ArrayHandle is the type expected by shiboken2's array converter
+ * functions. It provides access to array data which it may own
+ * (in the case of conversions from PySequence) or a flat pointer
+ * to internal data (in the case of array modules like numpy).
+ */
+
+template <class T>
+class ArrayHandle
+{
+ ArrayHandle(const ArrayHandle &) = delete;
+ ArrayHandle& operator=(const ArrayHandle &) = delete;
+public:
+ ArrayHandle() {}
+ ~ArrayHandle() { destroy(); }
+
+ void allocate(Py_ssize_t size);
+ void setData(T *d, size_t size);
+
+ size_t size() const { return m_size; }
+ T *data() const { return m_data; }
+ operator T*() const { return m_data; }
+
+private:
+ void destroy();
+
+ T *m_data = nullptr;
+ Py_ssize_t m_size = 0;
+ bool m_owned = false;
+};
+
+/**
+ * Similar to ArrayHandle for fixed size 2 dimensional arrays.
+ * columns is the size of the last dimension
+ * It only has a setData() methods since it will be used for numpy only.
+ */
+
+template <class T, int columns>
+class Array2Handle
+{
+public:
+ typedef T RowType[columns];
+
+ Array2Handle() {}
+
+ operator RowType*() const { return m_rows; }
+
+ void setData(RowType *d) { m_rows = d; }
+
+private:
+ RowType *m_rows = nullptr;
+};
+
+/// Returns the converter for an array type.
+LIBSHIBOKEN_API SbkArrayConverter *arrayTypeConverter(int index, int dimension = 1);
+
+template <class T>
+struct ArrayTypeIndex{
+ enum : int { index = SBK_UNIMPLEMENTED_ARRAY_IDX };
+};
+
+template <> struct ArrayTypeIndex<double> { enum : int { index = SBK_DOUBLE_ARRAY_IDX }; };
+template <> struct ArrayTypeIndex<float> { enum : int { index = SBK_FLOAT_ARRAY_IDX };};
+template <> struct ArrayTypeIndex<short> { enum : int { index = SBK_SHORT_ARRAY_IDX };};
+template <> struct ArrayTypeIndex<unsigned short> { enum : int { index = SBK_UNSIGNEDSHORT_ARRAY_IDX };};
+template <> struct ArrayTypeIndex<int> { enum : int { index = SBK_INT_ARRAY_IDX };};
+template <> struct ArrayTypeIndex<unsigned> { enum : int { index = SBK_UNSIGNEDINT_ARRAY_IDX };};
+template <> struct ArrayTypeIndex<long long> { enum : int { index = SBK_LONGLONG_ARRAY_IDX };};
+template <> struct ArrayTypeIndex<unsigned long long> { enum : int { index = SBK_UNSIGNEDLONGLONG_ARRAY_IDX };};
+
+template<typename T> SbkArrayConverter *ArrayTypeConverter(int dimension)
+{ return arrayTypeConverter(ArrayTypeIndex<T>::index, dimension); }
+
+// ArrayHandle methods
+template<class T>
+void ArrayHandle<T>::allocate(Py_ssize_t size)
+{
+ destroy();
+ m_data = new T[size];
+ m_size = size;
+ m_owned = true;
+}
+
+template<class T>
+void ArrayHandle<T>::setData(T *d, size_t size)
+{
+ destroy();
+ m_data = d;
+ m_size = size;
+ m_owned = false;
+}
+
+template<class T>
+void ArrayHandle<T>::destroy()
+{
+ if (m_owned)
+ delete [] m_data;
+ m_data = nullptr;
+ m_size = 0;
+ m_owned = false;
+}
+
+} // namespace Conversions
+} // namespace Shiboken
+
+#endif // SBKARRAYCONVERTERS_H
diff --git a/sources/shiboken2/libshiboken/sbkarrayconverter_p.h b/sources/shiboken2/libshiboken/sbkarrayconverter_p.h
new file mode 100644
index 000000000..9384fbcf5
--- /dev/null
+++ b/sources/shiboken2/libshiboken/sbkarrayconverter_p.h
@@ -0,0 +1,62 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef SBKARRAYCONVERTER_P_H
+#define SBKARRAYCONVERTER_P_H
+
+#include "sbkconverter_p.h"
+#include <vector>
+
+extern "C"
+{
+
+typedef PythonToCppFunc (*IsArrayConvertibleToCppFunc)(PyObject*, int dim1, int dim2);
+/**
+ * \internal
+ * Private structure of SbkArrayConverter.
+ */
+
+struct SbkArrayConverter
+{
+ std::vector<IsArrayConvertibleToCppFunc> toCppConversions;
+};
+
+} // extern "C"
+
+#endif // SBKARRAYCONVERTER_P_H
diff --git a/sources/shiboken2/libshiboken/sbkconverter.cpp b/sources/shiboken2/libshiboken/sbkconverter.cpp
index 0949d803d..0e154da39 100644
--- a/sources/shiboken2/libshiboken/sbkconverter.cpp
+++ b/sources/shiboken2/libshiboken/sbkconverter.cpp
@@ -39,22 +39,26 @@
#include "sbkconverter.h"
#include "sbkconverter_p.h"
+#include "sbkarrayconverter_p.h"
#include "basewrapper_p.h"
#include "bindingmanager.h"
-#include "google/dense_hash_map"
#include "autodecref.h"
#include "sbkdbg.h"
#include "helper.h"
#include "voidptr.h"
+#include <unordered_map>
+
static SbkConverter** PrimitiveTypeConverters;
-typedef google::dense_hash_map<std::string, SbkConverter*> ConvertersMap;
+typedef std::unordered_map<std::string, SbkConverter *> ConvertersMap;
static ConvertersMap converters;
namespace Shiboken {
namespace Conversions {
+void initArrayConverters();
+
void init()
{
static SbkConverter* primitiveTypeConverters[] = {
@@ -79,8 +83,6 @@ void init()
PrimitiveTypeConverters = primitiveTypeConverters;
assert(converters.empty());
- converters.set_empty_key("");
- converters.set_deleted_key("?");
converters["PY_LONG_LONG"] = primitiveTypeConverters[SBK_PY_LONG_LONG_IDX];
converters["bool"] = primitiveTypeConverters[SBK_BOOL_IDX_1];
converters["char"] = primitiveTypeConverters[SBK_CHAR_IDX];
@@ -98,9 +100,11 @@ void init()
converters["unsigned long"] = primitiveTypeConverters[SBK_UNSIGNEDLONG_IDX];
converters["unsigned short"] = primitiveTypeConverters[SBK_UNSIGNEDSHORT_IDX];
converters["void*"] = primitiveTypeConverters[SBK_VOIDPTR_IDX];
+
+ initArrayConverters();
}
-static SbkConverter* createConverterObject(PyTypeObject* type,
+SbkConverter *createConverterObject(PyTypeObject *type,
PythonToCppFunc toCppPointerConvFunc,
IsConvertibleToCppFunc toCppPointerCheckFunc,
CppToPythonFunc pointerToPythonFunc,
@@ -257,6 +261,17 @@ PythonToCppFunc isPythonToCppConvertible(const SbkConverter *converter, PyObject
return IsPythonToCppConvertible(converter, pyIn);
}
+PythonToCppFunc isPythonToCppConvertible(const SbkArrayConverter *converter,
+ int dim1, int dim2, PyObject *pyIn)
+{
+ assert(pyIn);
+ for (IsArrayConvertibleToCppFunc f : converter->toCppConversions) {
+ if (PythonToCppFunc c = f(pyIn, dim1, dim2))
+ return c;
+ }
+ return nullptr;
+}
+
PythonToCppFunc isPythonToCppReferenceConvertible(const SbkObjectType *type, PyObject *pyIn)
{
if (pyIn != Py_None) {
diff --git a/sources/shiboken2/libshiboken/sbkconverter.h b/sources/shiboken2/libshiboken/sbkconverter.h
index 7eb666b25..6d40f85cc 100644
--- a/sources/shiboken2/libshiboken/sbkconverter.h
+++ b/sources/shiboken2/libshiboken/sbkconverter.h
@@ -67,6 +67,7 @@ extern "C"
* using the functions provided by the converter API.
*/
struct SbkConverter;
+struct SbkArrayConverter;
/**
* Given a void pointer to a C++ object, this function must return
@@ -241,6 +242,8 @@ LIBSHIBOKEN_API PythonToCppFunc isPythonToCppReferenceConvertible(const SbkObjec
/// This is the same as isPythonToCppValueConvertible function.
LIBSHIBOKEN_API PythonToCppFunc isPythonToCppConvertible(const SbkConverter *converter, PyObject *pyIn);
+LIBSHIBOKEN_API PythonToCppFunc isPythonToCppConvertible(const SbkArrayConverter *converter,
+ int dim1, int dim2, PyObject *pyIn);
/**
* Returns the C++ pointer for the \p pyIn object cast to the type passed via \p desiredType.
diff --git a/sources/shiboken2/libshiboken/sbkconverter_p.h b/sources/shiboken2/libshiboken/sbkconverter_p.h
index 110358273..cfe3d7e98 100644
--- a/sources/shiboken2/libshiboken/sbkconverter_p.h
+++ b/sources/shiboken2/libshiboken/sbkconverter_p.h
@@ -533,4 +533,13 @@ struct Primitive<std::string> : TwoPrimitive<std::string>
}
};
+namespace Shiboken {
+namespace Conversions {
+SbkConverter *createConverterObject(PyTypeObject *type,
+ PythonToCppFunc toCppPointerConvFunc,
+ IsConvertibleToCppFunc toCppPointerCheckFunc,
+ CppToPythonFunc pointerToPythonFunc,
+ CppToPythonFunc copyToPythonFunc);
+} // namespace Conversions
+} // namespace Shiboken
#endif // SBK_CONVERTER_P_H
diff --git a/sources/shiboken2/libshiboken/sbkenum.cpp b/sources/shiboken2/libshiboken/sbkenum.cpp
index a62448aa6..c817a21de 100644
--- a/sources/shiboken2/libshiboken/sbkenum.cpp
+++ b/sources/shiboken2/libshiboken/sbkenum.cpp
@@ -492,11 +492,11 @@ bool createGlobalEnumItem(PyTypeObject* enumType, PyObject* module, const char*
return false;
}
-bool createScopedEnumItem(PyTypeObject* enumType, SbkObjectType* scope, const char* itemName, long itemValue)
+bool createScopedEnumItem(PyTypeObject *enumType, PyTypeObject *scope,
+ const char *itemName, long itemValue)
{
- PyObject* enumItem = createEnumItem(enumType, itemName, itemValue);
- if (enumItem) {
- if (PyDict_SetItemString(scope->super.ht_type.tp_dict, itemName, enumItem) < 0)
+ if (PyObject *enumItem = createEnumItem(enumType, itemName, itemValue)) {
+ if (PyDict_SetItemString(scope->tp_dict, itemName, enumItem) < 0)
return false;
Py_DECREF(enumItem);
return true;
@@ -504,6 +504,11 @@ bool createScopedEnumItem(PyTypeObject* enumType, SbkObjectType* scope, const ch
return false;
}
+bool createScopedEnumItem(PyTypeObject* enumType, SbkObjectType* scope, const char* itemName, long itemValue)
+{
+ return createScopedEnumItem(enumType, &scope->super.ht_type, itemName, itemValue);
+}
+
PyObject* newItem(PyTypeObject* enumType, long itemValue, const char* itemName)
{
bool newValue = true;
diff --git a/sources/shiboken2/libshiboken/sbkenum.h b/sources/shiboken2/libshiboken/sbkenum.h
index 4b572dbcc..b01114ba6 100644
--- a/sources/shiboken2/libshiboken/sbkenum.h
+++ b/sources/shiboken2/libshiboken/sbkenum.h
@@ -95,6 +95,8 @@ namespace Enum
*/
LIBSHIBOKEN_API bool createGlobalEnumItem(PyTypeObject* enumType, PyObject* module, const char* itemName, long itemValue);
/// This function does the same as createGlobalEnumItem, but adds the enum to a Shiboken type or namespace.
+ LIBSHIBOKEN_API bool createScopedEnumItem(PyTypeObject *enumType, PyTypeObject *scope,
+ const char *itemName, long itemValue);
LIBSHIBOKEN_API bool createScopedEnumItem(PyTypeObject* enumType, SbkObjectType* scope, const char* itemName, long itemValue);
LIBSHIBOKEN_API PyObject* newItem(PyTypeObject* enumType, long itemValue, const char* itemName = 0);
diff --git a/sources/shiboken2/libshiboken/sbkmodule.cpp b/sources/shiboken2/libshiboken/sbkmodule.cpp
index 084e23efa..2ea9d56ac 100644
--- a/sources/shiboken2/libshiboken/sbkmodule.cpp
+++ b/sources/shiboken2/libshiboken/sbkmodule.cpp
@@ -40,17 +40,13 @@
#include "sbkmodule.h"
#include "basewrapper.h"
#include "bindingmanager.h"
-
-// TODO: for performance reasons this should be a sparse_hash_map,
-// because there'll be very few modules as keys. The sparse_hash_map
-// is missing from the code added in ../ext/sparsehash/google directory.
-#include "google/dense_hash_map"
+#include <unordered_map>
/// This hash maps module objects to arrays of Python types.
-typedef google::dense_hash_map<PyObject*, PyTypeObject**> ModuleTypesMap;
+typedef std::unordered_map<PyObject *, PyTypeObject **> ModuleTypesMap;
/// This hash maps module objects to arrays of converters.
-typedef google::dense_hash_map<PyObject*, SbkConverter**> ModuleConvertersMap;
+typedef std::unordered_map<PyObject *, SbkConverter **> ModuleConvertersMap;
/// All types produced in imported modules are mapped here.
static ModuleTypesMap moduleTypes;
@@ -61,15 +57,6 @@ namespace Shiboken
namespace Module
{
-void init()
-{
- // Initializes type registry for modules.
- moduleTypes.set_empty_key((ModuleTypesMap::key_type)0);
- moduleTypes.set_deleted_key((ModuleTypesMap::key_type)1);
- moduleConverters.set_empty_key((ModuleConvertersMap::key_type)0);
- moduleConverters.set_deleted_key((ModuleConvertersMap::key_type)1);
-}
-
PyObject* import(const char* moduleName)
{
PyObject* sysModules = PyImport_GetModuleDict();
diff --git a/sources/shiboken2/libshiboken/sbknumpyarrayconverter.cpp b/sources/shiboken2/libshiboken/sbknumpyarrayconverter.cpp
new file mode 100644
index 000000000..97eab2205
--- /dev/null
+++ b/sources/shiboken2/libshiboken/sbknumpyarrayconverter.cpp
@@ -0,0 +1,308 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of PySide2.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "sbkarrayconverter.h"
+#include "helper.h"
+#include "sbkconverter.h"
+#include "sbkconverter_p.h"
+#include "sbkarrayconverter_p.h"
+
+#include <numpy/arrayobject.h>
+
+#include <algorithm>
+#include <iostream>
+#include <cstdint>
+
+enum { debugNumPy = 0 };
+
+struct TypeCharMapping
+{
+ NPY_TYPES type;
+ const char *name;
+};
+
+static const TypeCharMapping typeCharMappings[] = {
+{NPY_BYTE, "NPY_BYTE"},
+{NPY_UBYTE, "NPY_UBYTE"},
+{NPY_SHORT, "NPY_SHORT"},
+{NPY_USHORT, "NPY_USHORT"},
+{NPY_INT, "NPY_INT"},
+{NPY_UINT, "NPY_UINT"},
+{NPY_LONG, "NPY_LONG"},
+{NPY_ULONG, "NPY_ULONG"},
+{NPY_LONGLONG, "NPY_LONGLONG"},
+{NPY_ULONGLONG, "NPY_ULONGLONG"},
+{NPY_FLOAT, "NPY_FLOAT"},
+{NPY_DOUBLE, "NPY_DOUBLE"}
+};
+
+const char *npTypeName(npy_intp t)
+{
+ const TypeCharMapping *end = typeCharMappings + sizeof(typeCharMappings) / sizeof(typeCharMappings[0]);
+ const TypeCharMapping *result =
+ std::find_if(typeCharMappings, end,
+ [t] (const TypeCharMapping &m) { return m.type == t; });
+ return result != end ? result->name : nullptr;
+}
+
+std::ostream &operator<<(std::ostream &str, PyArrayObject *o)
+{
+ str << "PyArrayObject(";
+ if (o) {
+ const npy_intp npType = PyArray_TYPE(o);
+ if (const char *name = npTypeName(npType))
+ str << name;
+ else
+ str << "type=" << npType;
+ const int nDim = PyArray_NDIM(o);
+ const npy_intp *dims = PyArray_DIMS(o);
+ for (int d = 0; d < nDim; ++d)
+ str << '[' << dims[d] << ']';
+ str << ", ";
+ const int flags = PyArray_FLAGS(o);
+ if ((flags & NPY_ARRAY_C_CONTIGUOUS) != 0)
+ str << " NPY_ARRAY_C_CONTIGUOUS";
+ if ((flags & NPY_ARRAY_F_CONTIGUOUS) != 0)
+ str << " NPY_ARRAY_F_CONTIGUOUS";
+ if ((flags & NPY_ARRAY_OWNDATA) != 0)
+ str << " NPY_ARRAY_OWNDATA";
+ if ((flags & NPY_ARRAY_FORCECAST) != 0)
+ str << " NPY_ARRAY_FORCECAST";
+ if ((flags & NPY_ARRAY_ENSURECOPY) != 0)
+ str << " NPY_ARRAY_ENSURECOPY";
+ if ((flags & NPY_ARRAY_ENSUREARRAY) != 0)
+ str << " NPY_ARRAY_ENSUREARRAY";
+ if ((flags & NPY_ARRAY_ELEMENTSTRIDES) != 0)
+ str << " NPY_ARRAY_ELEMENTSTRIDES";
+ if ((flags & NPY_ARRAY_ALIGNED) != 0)
+ str << " NPY_ARRAY_ALIGNED";
+ if ((flags & NPY_ARRAY_NOTSWAPPED) != 0)
+ str << " NPY_ARRAY_NOTSWAPPED";
+ if ((flags & NPY_ARRAY_WRITEABLE) != 0)
+ str << " NPY_ARRAY_WRITEABLE";
+ if ((flags & NPY_ARRAY_UPDATEIFCOPY) != 0)
+ str << " NPY_ARRAY_UPDATEIFCOPY";
+ } else {
+ str << '0';
+ }
+ str << ')';
+ return str;
+}
+
+namespace Shiboken {
+namespace Conversions {
+
+// Internals from sbkarrayconverter.cpp
+SbkArrayConverter *createArrayConverter(IsArrayConvertibleToCppFunc toCppCheckFunc);
+void setArrayTypeConverter(int index, int dimension, SbkArrayConverter *c);
+SbkArrayConverter *unimplementedArrayConverter();
+
+template <int dimension>
+static bool isPrimitiveArray(PyObject *pyIn, int expectedNpType)
+{
+ if (!PyArray_Check(pyIn))
+ return false;
+ PyArrayObject *pya = reinterpret_cast<PyArrayObject *>(pyIn);
+ if (debugNumPy) {
+ std::cerr << __FUNCTION__ << "(expectedNpType=" << expectedNpType;
+ if (const char *name = npTypeName(expectedNpType))
+ std::cerr << " (" << name << ')';
+ std::cerr << ' ' << pya << '\n';
+ }
+
+ const int dim = PyArray_NDIM(pya);
+ if (dim != dimension) {
+ warning(PyExc_RuntimeWarning, 0,
+ "%d dimensional numpy array passed to a function expecting a %d dimensional array.",
+ dim, dimension);
+ return false;
+ }
+ if ((PyArray_FLAGS(pya) & NPY_ARRAY_C_CONTIGUOUS) == 0) {
+ warning(PyExc_RuntimeWarning, 0,
+ "Cannot handle numpy arrays that do not have NPY_ARRAY_C_CONTIGUOUS set.");
+ return false;
+ }
+ const int actualNpType = PyArray_TYPE(pya);
+ if (actualNpType != expectedNpType) {
+ const char *actualName = npTypeName(actualNpType);
+ const char *expectedName = npTypeName(expectedNpType);
+ warning(PyExc_RuntimeWarning, 0,
+ "A numpy array of type %d (%s) was passed to a function expecting type %d (%s).",
+ actualNpType, actualName ? actualName : "",
+ expectedNpType, expectedName ? expectedName : "");
+ return false;
+ }
+ return true;
+}
+
+static inline bool primitiveArrayCheck1(PyObject *pyIn, int expectedNpType, int expectedSize)
+{
+ if (!isPrimitiveArray<1>(pyIn, expectedNpType))
+ return false;
+ if (expectedSize >= 0) {
+ PyArrayObject *pya = reinterpret_cast<PyArrayObject *>(pyIn);
+ const int size = int(PyArray_DIMS(pya)[0]);
+ if (size < expectedSize) {
+ warning(PyExc_RuntimeWarning, 0, "A numpy array of size %d was passed to a function expects %d.",
+ size, expectedSize);
+ return false;
+ }
+ }
+ return true;
+}
+
+// Convert one-dimensional array
+template <class T>
+static void convertArray1(PyObject *pyIn, void *cppOut)
+{
+ ArrayHandle<T> *handle = reinterpret_cast<ArrayHandle<T> *>(cppOut);
+ PyArrayObject *pya = reinterpret_cast<PyArrayObject *>(pyIn);
+ const npy_intp size = PyArray_DIMS(pya)[0];
+ if (debugNumPy)
+ std::cerr << __FUNCTION__ << ' ' << size << '\n';
+ handle->setData(reinterpret_cast<T *>(PyArray_DATA(pya)), size_t(size));
+}
+
+// Convert 2 dimensional array
+template <class T>
+static void convertArray2(PyObject *pyIn, void *cppOut)
+{
+ typedef typename Array2Handle<T, 1>::RowType RowType;
+ Array2Handle<T, 1> *handle = reinterpret_cast<Array2Handle<T, 1> *>(cppOut);
+ PyArrayObject *pya = reinterpret_cast<PyArrayObject *>(pyIn);
+ handle->setData(reinterpret_cast<RowType *>(PyArray_DATA(pya)));
+}
+
+template <class T, int NumPyType>
+static PythonToCppFunc checkArray1(PyObject *pyIn, int dim1, int /* dim2 */)
+{
+ return primitiveArrayCheck1(pyIn, NumPyType, dim1) ? convertArray1<T> : nullptr;
+}
+
+static inline bool primitiveArrayCheck2(PyObject *pyIn, int expectedNpType, int expectedDim1, int expectedDim2)
+{
+ if (!isPrimitiveArray<2>(pyIn, expectedNpType))
+ return false;
+ if (expectedDim2 >= 0) {
+ PyArrayObject *pya = reinterpret_cast<PyArrayObject *>(pyIn);
+ const int dim1 = int(PyArray_DIMS(pya)[0]);
+ const int dim2 = int(PyArray_DIMS(pya)[1]);
+ if (dim1 != expectedDim1 || dim2 != expectedDim2) {
+ warning(PyExc_RuntimeWarning, 0, "A numpy array of size %dx%d was passed to a function that expects %dx%d.",
+ dim1, dim2, expectedDim1, expectedDim2);
+ return false;
+ }
+ }
+ return true;
+}
+
+template <class T, int NumPyType>
+static PythonToCppFunc checkArray2(PyObject *pyIn, int dim1, int dim2)
+{
+ return primitiveArrayCheck2(pyIn, NumPyType, dim1, dim2) ? convertArray2<T> : nullptr;
+}
+
+template <class T>
+static void setOrExtendArrayConverter(int dimension, IsArrayConvertibleToCppFunc toCppCheckFunc)
+{
+ SbkArrayConverter *arrayConverter = ArrayTypeConverter<T>(dimension);
+ if (arrayConverter == unimplementedArrayConverter()) {
+ arrayConverter = createArrayConverter(toCppCheckFunc);
+ setArrayTypeConverter(ArrayTypeIndex<T>::index, dimension, arrayConverter);
+ } else {
+ arrayConverter->toCppConversions.push_back(toCppCheckFunc);
+ }
+}
+
+// Extend the converters for primitive type one-dimensional arrays by NumPy ones.
+template <class T, int NumPyType>
+static inline void extendArrayConverter1()
+{
+ setOrExtendArrayConverter<T>(1, checkArray1<T, NumPyType>);
+}
+
+// Extend the converters for primitive type one-dimensional arrays by NumPy ones.
+template <class T, int NumPyType>
+static inline void extendArrayConverter2()
+{
+ setOrExtendArrayConverter<T>(2, checkArray2<T, NumPyType>);
+}
+
+void initNumPyArrayConverters()
+{
+ // Expanded from macro "import_array" in __multiarray_api.h
+ // Make sure to read about the magic defines PY_ARRAY_UNIQUE_SYMBOL etc.,
+ // when changing this or spreading the code over several source files.
+ if (_import_array() < 0) {
+ if (debugNumPy)
+ PyErr_Print();
+ PyErr_Clear();
+ return;
+ }
+ // Extend the converters for primitive types by NumPy ones.
+ extendArrayConverter1<short, NPY_SHORT>();
+ extendArrayConverter2<short, NPY_SHORT>();
+ extendArrayConverter1<unsigned short, NPY_SHORT>();
+ extendArrayConverter2<unsigned short, NPY_SHORT>();
+ extendArrayConverter1<int, NPY_INT>();
+ extendArrayConverter2<int, NPY_INT>();
+ extendArrayConverter1<unsigned int, NPY_UINT>();
+ extendArrayConverter2<unsigned int, NPY_UINT>();
+ extendArrayConverter1<long long, NPY_LONGLONG>();
+ extendArrayConverter2<long long, NPY_LONGLONG>();
+ extendArrayConverter1<unsigned long long, NPY_ULONGLONG>();
+ if (sizeof(long) == 8) { // UNIX/LP64: ints typically come as long
+ extendArrayConverter1<long long, NPY_LONG>();
+ extendArrayConverter2<long long, NPY_LONG>();
+ extendArrayConverter1<unsigned long long, NPY_ULONG>();
+ extendArrayConverter2<unsigned long long, NPY_ULONG>();
+ } else if (sizeof(long) == sizeof(int)) {
+ extendArrayConverter1<int, NPY_LONG>();
+ extendArrayConverter1<unsigned, NPY_ULONG>();
+ extendArrayConverter2<int, NPY_LONG>();
+ extendArrayConverter2<unsigned, NPY_ULONG>();
+ }
+ extendArrayConverter1<float, NPY_FLOAT>();
+ extendArrayConverter2<float, NPY_FLOAT>();
+ extendArrayConverter1<double, NPY_DOUBLE>();
+ extendArrayConverter2<double, NPY_DOUBLE>();
+}
+
+} // namespace Conversions
+} // namespace Shiboken
diff --git a/sources/shiboken2/libshiboken/shiboken.h b/sources/shiboken2/libshiboken/shiboken.h
index 9f4b8a560..6cdfe65bd 100644
--- a/sources/shiboken2/libshiboken/shiboken.h
+++ b/sources/shiboken2/libshiboken/shiboken.h
@@ -47,6 +47,7 @@
#include "gilstate.h"
#include "threadstatesaver.h"
#include "helper.h"
+#include "sbkarrayconverter.h"
#include "sbkconverter.h"
#include "sbkenum.h"
#include "sbkmodule.h"
diff --git a/sources/shiboken2/shiboken_version.py b/sources/shiboken2/shiboken_version.py
index b207d6b9c..aacb7e0d9 100644
--- a/sources/shiboken2/shiboken_version.py
+++ b/sources/shiboken2/shiboken_version.py
@@ -1,5 +1,44 @@
+#############################################################################
+##
+## Copyright (C) 2018 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
major_version = "5"
-minor_version = "6"
+minor_version = "9"
patch_version = "0"
pre_release_version_type = "a" # e.g. "a", "b", "rc".
pre_release_version = "1" # e.g "1", "2", (which means "beta1", "beta2", if type is "b")
diff --git a/sources/shiboken2/tests/dumpcodemodel/main.cpp b/sources/shiboken2/tests/dumpcodemodel/main.cpp
index 9e62faa16..13dab6e8a 100644
--- a/sources/shiboken2/tests/dumpcodemodel/main.cpp
+++ b/sources/shiboken2/tests/dumpcodemodel/main.cpp
@@ -37,6 +37,8 @@
#include <QtCore/QFile>
#include <iostream>
+#include <algorithm>
+#include <iterator>
int main(int argc, char **argv)
{
@@ -53,22 +55,19 @@ int main(int argc, char **argv)
parser.addPositionalArgument(QStringLiteral("file"), QStringLiteral("C++ source file"));
parser.process(app);
- if (parser.positionalArguments().isEmpty())
+ const QStringList &positionalArguments = parser.positionalArguments();
+ if (positionalArguments.isEmpty())
parser.showHelp(1);
- const QString sourceFileName = parser.positionalArguments().at(0);
- QFile sourceFile(sourceFileName);
- if (!sourceFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QString message = QLatin1String("Cannot open \"") + QDir::toNativeSeparators(sourceFileName)
- + QLatin1String("\": ") + sourceFile.errorString();
+ QByteArrayList arguments;
+ std::transform(positionalArguments.cbegin(), positionalArguments.cend(),
+ std::back_inserter(arguments), QFile::encodeName);
+ const FileModelItem dom = AbstractMetaBuilderPrivate::buildDom(arguments, 0);
+ if (dom.isNull()) {
+ QString message = QLatin1String("Unable to parse ") + positionalArguments.join(QLatin1Char(' '));
std::cerr << qPrintable(message) << '\n';
- return -1;
- }
-
- const FileModelItem dom = AbstractMetaBuilderPrivate::buildDom(&sourceFile);
- sourceFile.close();
- if (dom.isNull())
return -2;
+ }
QString output;
{
diff --git a/sources/shiboken2/tests/libother/otherderived.cpp b/sources/shiboken2/tests/libother/otherderived.cpp
index 4128d73ff..de16b0ab4 100644
--- a/sources/shiboken2/tests/libother/otherderived.cpp
+++ b/sources/shiboken2/tests/libother/otherderived.cpp
@@ -59,3 +59,6 @@ OtherDerived::unpureVirtual()
{
}
+void OtherDerived::pureVirtualPrivate()
+{
+}
diff --git a/sources/shiboken2/tests/libother/otherderived.h b/sources/shiboken2/tests/libother/otherderived.h
index 792b7c408..592e9e023 100644
--- a/sources/shiboken2/tests/libother/otherderived.h
+++ b/sources/shiboken2/tests/libother/otherderived.h
@@ -41,11 +41,11 @@ class LIBOTHER_API OtherDerived : public Abstract
{
public:
OtherDerived(int id = -1);
- virtual ~OtherDerived();
- virtual void pureVirtual();
- virtual void* pureVirtualReturningVoidPtr();
- virtual void unpureVirtual();
- virtual PrintFormat returnAnEnum() { return Short; }
+ ~OtherDerived() override;
+ void pureVirtual() override;
+ void* pureVirtualReturningVoidPtr() override;
+ void unpureVirtual() override;
+ PrintFormat returnAnEnum() override { return Short; }
inline void useObjectTypeFromOtherModule(ObjectType*) {}
inline Event useValueTypeFromOtherModule(const Event& e) { return e; }
@@ -59,7 +59,10 @@ public:
protected:
inline const char* getClassName() { return className(); }
- virtual const char* className() { return "OtherDerived"; }
+ virtual const char* className() override { return "OtherDerived"; }
+
+private:
+ void pureVirtualPrivate() override;
};
#endif // OTHERDERIVED_H
diff --git a/sources/shiboken2/tests/libsample/abstract.h b/sources/shiboken2/tests/libsample/abstract.h
index 77a43f3d1..f31870522 100644
--- a/sources/shiboken2/tests/libsample/abstract.h
+++ b/sources/shiboken2/tests/libsample/abstract.h
@@ -102,6 +102,7 @@ protected:
unsigned int bitField: 1;
private:
+ virtual void pureVirtualPrivate() = 0;
int m_id;
};
#endif // ABSTRACT_H
diff --git a/sources/shiboken2/tests/libsample/derived.cpp b/sources/shiboken2/tests/libsample/derived.cpp
index 00ac8ebe5..9552a2a8c 100644
--- a/sources/shiboken2/tests/libsample/derived.cpp
+++ b/sources/shiboken2/tests/libsample/derived.cpp
@@ -103,6 +103,8 @@ struct SecretClass : public Abstract {
virtual void* pureVirtualReturningVoidPtr() { return 0; }
virtual PrintFormat returnAnEnum() { return Short; }
void hideFunction(HideType*){};
+private:
+ virtual void pureVirtualPrivate() {}
};
Abstract* Derived::triggerImpossibleTypeDiscovery()
@@ -117,3 +119,7 @@ Abstract* Derived::triggerAnotherImpossibleTypeDiscovery()
{
return new AnotherSecretClass;
}
+
+void Derived::pureVirtualPrivate()
+{
+}
diff --git a/sources/shiboken2/tests/libsample/derived.h b/sources/shiboken2/tests/libsample/derived.h
index 5c57e4691..84c502566 100644
--- a/sources/shiboken2/tests/libsample/derived.h
+++ b/sources/shiboken2/tests/libsample/derived.h
@@ -53,13 +53,13 @@ public:
};
Derived(int id = -1);
- virtual ~Derived();
- virtual void pureVirtual();
- virtual void* pureVirtualReturningVoidPtr();
- virtual void unpureVirtual();
+ ~Derived() override;
+ void pureVirtual() override;
+ void* pureVirtualReturningVoidPtr() override;
+ void unpureVirtual() override;
- virtual PrintFormat returnAnEnum() { return Short; }
- virtual Type type() const { return TpDerived; }
+ PrintFormat returnAnEnum() override { return Short; }
+ Type type() const override { return TpDerived; }
// factory method
static Abstract* createObject();
@@ -83,10 +83,13 @@ public:
static Abstract* triggerImpossibleTypeDiscovery();
static Abstract* triggerAnotherImpossibleTypeDiscovery();
- void hideFunction(HideType*) {}
+ void hideFunction(HideType*) override {}
protected:
const char* getClassName() { return className(); }
- virtual const char* className() { return "Derived"; }
+ virtual const char* className() override { return "Derived"; }
+
+private:
+ void pureVirtualPrivate() override;
};
#endif // DERIVED_H
diff --git a/sources/shiboken2/tests/libsample/functions.cpp b/sources/shiboken2/tests/libsample/functions.cpp
index 4a15cdae8..bf73d5ed7 100644
--- a/sources/shiboken2/tests/libsample/functions.cpp
+++ b/sources/shiboken2/tests/libsample/functions.cpp
@@ -28,7 +28,9 @@
#include "functions.h"
#include <string.h>
+#include <algorithm>
#include <iostream>
+#include <numeric>
using namespace std;
@@ -197,6 +199,45 @@ acceptOddBoolReference(OddBool& x)
return x;
}
+int sumIntArray(int array[4])
+{
+ return std::accumulate(array, array + 4, 0);
+}
+
+double sumDoubleArray(double array[4])
+{
+ return std::accumulate(array, array + 4, double(0));
+}
+
+int sumIntMatrix(int m[2][3])
+{
+ int result = 0;
+ for (int r = 0; r < 2; ++r) {
+ for (int c = 0; c < 3; ++c)
+ result += m[r][c];
+ }
+ return result;
+}
+
+double sumDoubleMatrix(double m[2][3])
+{
+ double result = 0;
+ for (int r = 0; r < 2; ++r) {
+ for (int c = 0; c < 3; ++c)
+ result += m[r][c];
+ }
+ return result;
+}
+
+ArrayModifyTest::ArrayModifyTest()
+{
+}
+
+int ArrayModifyTest::sumIntArray(int n, int *array)
+{
+ return std::accumulate(array, array + n, 0);
+}
+
ClassWithFunctionPointer::ClassWithFunctionPointer()
{
callFunctionPointer(0, &ClassWithFunctionPointer::doNothing);
diff --git a/sources/shiboken2/tests/libsample/functions.h b/sources/shiboken2/tests/libsample/functions.h
index 89a175bc4..a53f97c6e 100644
--- a/sources/shiboken2/tests/libsample/functions.h
+++ b/sources/shiboken2/tests/libsample/functions.h
@@ -81,6 +81,17 @@ LIBSAMPLE_API double acceptDouble(double x);
LIBSAMPLE_API int acceptIntReference(int& x);
LIBSAMPLE_API OddBool acceptOddBoolReference(OddBool& x);
+LIBSAMPLE_API int sumIntArray(int array[4]);
+LIBSAMPLE_API double sumDoubleArray(double array[4]);
+LIBSAMPLE_API int sumIntMatrix(int m[2][3]);
+LIBSAMPLE_API double sumDoubleMatrix(double m[2][3]);
+
+class LIBSAMPLE_API ArrayModifyTest
+{
+public:
+ ArrayModifyTest();
+ int sumIntArray(int n, int *array);
+};
class LIBSAMPLE_API ClassWithFunctionPointer
{
diff --git a/sources/shiboken2/tests/libsample/multiple_derived.h b/sources/shiboken2/tests/libsample/multiple_derived.h
index 5825e59b4..7a130c6b5 100644
--- a/sources/shiboken2/tests/libsample/multiple_derived.h
+++ b/sources/shiboken2/tests/libsample/multiple_derived.h
@@ -58,11 +58,11 @@ class LIBSAMPLE_API MDerived1 : public Base1, public Base2
{
public:
MDerived1();
- virtual ~MDerived1() {}
+ ~MDerived1() override {}
- virtual int mderived1Method() { return m_value; }
- virtual int base1Method() { return Base1::base1Method() * 10; }
- virtual int base2Method() { return Base2::base2Method() * 10; }
+ int mderived1Method() { return m_value; }
+ int base1Method () override { return Base1::base1Method() * 10; }
+ int base2Method() override { return Base2::base2Method() * 10; }
inline Base1* castToBase1() { return (Base1*) this; }
inline Base2* castToBase2() { return (Base2*) this; }
@@ -71,7 +71,7 @@ public:
static MDerived1* transformFromBase2(Base2 *self);
private:
- virtual void publicMethod() {}
+ void publicMethod() override {}
int m_value;
};
diff --git a/sources/shiboken2/tests/libsample/objecttype.h b/sources/shiboken2/tests/libsample/objecttype.h
index 487472b0f..91fb45515 100644
--- a/sources/shiboken2/tests/libsample/objecttype.h
+++ b/sources/shiboken2/tests/libsample/objecttype.h
@@ -45,6 +45,12 @@ struct Event
SOME_EVENT,
ANY_EVENT
};
+
+ enum class EventTypeClass {
+ Value1,
+ Value2
+ };
+
Event(EventType eventType) : m_eventType(eventType) {}
EventType eventType() { return m_eventType; }
private:
@@ -167,8 +173,8 @@ class LIBSAMPLE_API ObjectTypeDerived: public ObjectType, public OtherBase {
public:
ObjectTypeDerived(): ObjectType(), OtherBase() {};
- virtual bool event(Event* event);
- virtual ~ObjectTypeDerived();
+ bool event(Event* event) override;
+ ~ObjectTypeDerived() override;
};
#endif // OBJECTTYPE_H
diff --git a/sources/shiboken2/tests/libsample/objecttypelayout.h b/sources/shiboken2/tests/libsample/objecttypelayout.h
index 3fa8b9dbf..8524c1989 100644
--- a/sources/shiboken2/tests/libsample/objecttypelayout.h
+++ b/sources/shiboken2/tests/libsample/objecttypelayout.h
@@ -41,10 +41,10 @@ public:
void addObject(ObjectType* obj);
std::list<ObjectType*> objects() const;
- virtual bool isLayoutType() { return true; }
+ bool isLayoutType() override { return true; }
inline static ObjectTypeLayout* create() { return new ObjectTypeLayout(); }
- virtual ObjectType* takeChild(const Str& name) { return ObjectType::takeChild(name); }
+ ObjectType* takeChild(const Str& name) override { return ObjectType::takeChild(name); }
private:
std::list<ObjectType*> m_objects;
diff --git a/sources/shiboken2/tests/libsample/photon.h b/sources/shiboken2/tests/libsample/photon.h
index d8b1be423..437ec1d9b 100644
--- a/sources/shiboken2/tests/libsample/photon.h
+++ b/sources/shiboken2/tests/libsample/photon.h
@@ -84,7 +84,7 @@ public:
static inline TemplateBase<CLASS_TYPE>* passPointerThrough(TemplateBase<CLASS_TYPE>* obj) { return obj; }
- virtual ClassType type() const { return CLASS_TYPE; }
+ ClassType type() const override { return CLASS_TYPE; }
static const ClassType staticType = CLASS_TYPE;
};
diff --git a/sources/shiboken2/tests/libsample/samplenamespace.h b/sources/shiboken2/tests/libsample/samplenamespace.h
index 3ce410941..93cafa29c 100644
--- a/sources/shiboken2/tests/libsample/samplenamespace.h
+++ b/sources/shiboken2/tests/libsample/samplenamespace.h
@@ -110,6 +110,10 @@ public:
NiceValue1, NiceValue2
};
+ enum class NiceEnumClass {
+ NiceClassValue1, NiceClassValue2
+ };
+
inline int someMethod(SomeInnerClass*) { return 0; }
virtual OkThisIsRecursiveEnough* someVirtualMethod(OkThisIsRecursiveEnough* arg) { return arg; }
};
diff --git a/sources/shiboken2/tests/libsample/virtualmethods.cpp b/sources/shiboken2/tests/libsample/virtualmethods.cpp
index 05b854e08..e0cba3a47 100644
--- a/sources/shiboken2/tests/libsample/virtualmethods.cpp
+++ b/sources/shiboken2/tests/libsample/virtualmethods.cpp
@@ -57,3 +57,22 @@ VirtualMethods::getMargins(int* left, int* top, int* right, int* bottom) const
*bottom = m_bottom;
}
+double VirtualDaughter2::virtualMethod0(Point pt, int val, Complex cpx, bool b)
+{
+ return 42 + VirtualMethods::virtualMethod0(pt, val, cpx, b);
+}
+
+int VirtualDaughter2::sum0(int a0, int a1, int a2)
+{
+ return 42 + VirtualMethods::sum0(a0, a1, a2);
+}
+
+double VirtualFinalDaughter::virtualMethod0(Point pt, int val, Complex cpx, bool b)
+{
+ return 42 + VirtualMethods::virtualMethod0(pt, val, cpx, b);
+}
+
+int VirtualFinalDaughter::sum0(int a0, int a1, int a2)
+{
+ return 42 + VirtualMethods::sum0(a0, a1, a2);
+}
diff --git a/sources/shiboken2/tests/libsample/virtualmethods.h b/sources/shiboken2/tests/libsample/virtualmethods.h
index 5754d0d5d..4ba3ad338 100644
--- a/sources/shiboken2/tests/libsample/virtualmethods.h
+++ b/sources/shiboken2/tests/libsample/virtualmethods.h
@@ -121,6 +121,24 @@ public:
VirtualDaughter(Str name) : VirtualMethods(name) {}
};
+class LIBSAMPLE_API VirtualDaughter2 : public VirtualMethods
+{
+public:
+ VirtualDaughter2() : VirtualMethods("VirtualDaughter2") {}
+
+ double virtualMethod0(Point pt, int val, Complex cpx, bool b) override;
+ int sum0(int a0, int a1, int a2) final;
+};
+
+class LIBSAMPLE_API VirtualFinalDaughter final : public VirtualMethods
+{
+public:
+ VirtualFinalDaughter() : VirtualMethods("VirtualFinalDaughter") {}
+
+ double virtualMethod0(Point pt, int val, Complex cpx, bool b) override;
+ int sum0(int a0, int a1, int a2) override;
+};
+
class LIBSAMPLE_API VirtualDtor
{
public:
diff --git a/sources/shiboken2/tests/samplebinding/CMakeLists.txt b/sources/shiboken2/tests/samplebinding/CMakeLists.txt
index 1b97bd0e8..78ddfca0a 100644
--- a/sources/shiboken2/tests/samplebinding/CMakeLists.txt
+++ b/sources/shiboken2/tests/samplebinding/CMakeLists.txt
@@ -7,6 +7,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_sample.xml
set(sample_SRC
${CMAKE_CURRENT_BINARY_DIR}/sample/abstractmodifications_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/abstract_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/sample/arraymodifytest_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/base1_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/base2_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/base3_wrapper.cpp
@@ -109,6 +110,8 @@ ${CMAKE_CURRENT_BINARY_DIR}/sample/time_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/templateptr_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/unremovednamespace_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/virtualdaughter_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/sample/virtualdaughter2_wrapper.cpp
+${CMAKE_CURRENT_BINARY_DIR}/sample/virtualfinaldaughter_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/virtualdtor_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/virtualmethods_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/sample/voidholder_wrapper.cpp
diff --git a/sources/shiboken2/tests/samplebinding/array_numpy_test.py b/sources/shiboken2/tests/samplebinding/array_numpy_test.py
new file mode 100644
index 000000000..bde46f2e3
--- /dev/null
+++ b/sources/shiboken2/tests/samplebinding/array_numpy_test.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test case for NumPy Array types.'''
+
+import unittest
+import sample
+
+hasNumPy = False
+
+try:
+ import numpy
+ hasNumPy = True
+except ImportError:
+ pass
+
+class ArrayTester(unittest.TestCase):
+ '''Test case for NumPy arrays.'''
+
+ def testIntArray(self):
+ intList = numpy.array([1, 2, 3, 4], dtype = 'int32')
+ self.assertEqual(sample.sumIntArray(intList), 10)
+
+ def testDoubleArray(self):
+ doubleList = numpy.array([1, 2, 3, 4], dtype = 'double')
+ self.assertEqual(sample.sumDoubleArray(doubleList), 10)
+
+ def testIntMatrix(self):
+ intMatrix = numpy.array([[1, 2, 3], [4, 5, 6]], dtype = 'int32')
+ self.assertEqual(sample.sumIntMatrix(intMatrix), 21)
+
+ def testDoubleMatrix(self):
+ doubleMatrix = numpy.array([[1, 2, 3], [4, 5, 6]], dtype = 'double')
+ self.assertEqual(sample.sumDoubleMatrix(doubleMatrix), 21)
+
+if __name__ == '__main__' and hasNumPy:
+ unittest.main()
diff --git a/sources/shiboken2/tests/samplebinding/array_sequence_test.py b/sources/shiboken2/tests/samplebinding/array_sequence_test.py
new file mode 100644
index 000000000..0fd2ec636
--- /dev/null
+++ b/sources/shiboken2/tests/samplebinding/array_sequence_test.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+'''Test case for Array types (PySequence).'''
+
+import unittest
+import sample
+
+class ArrayTester(unittest.TestCase):
+ '''Test case for arrays.'''
+
+ def testIntArray(self):
+ intList = [1, 2, 3, 4]
+ self.assertEqual(sample.sumIntArray(intList), 10)
+
+ def testIntArrayModified(self):
+ intList = [1, 2, 3, 4]
+ tester = sample.ArrayModifyTest()
+ self.assertEqual(tester.sumIntArray(4, intList), 10)
+
+ def testDoubleArray(self):
+ doubleList = [1.2, 2.3, 3.4, 4.5]
+ self.assertEqual(sample.sumDoubleArray(doubleList), 11.4)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/shiboken2/tests/samplebinding/enum_test.py b/sources/shiboken2/tests/samplebinding/enum_test.py
index 6468d3cc4..711215c35 100644
--- a/sources/shiboken2/tests/samplebinding/enum_test.py
+++ b/sources/shiboken2/tests/samplebinding/enum_test.py
@@ -110,6 +110,11 @@ class EnumTest(unittest.TestCase):
self.assertEqual(SampleNamespace.AnonymousClassEnum_Value0, 0)
self.assertEqual(SampleNamespace.AnonymousClassEnum_Value1, 1)
+ def testEnumClasses(self):
+ # C++ 11: values of enum classes need to be fully qualified to match C++
+ sum = Event.EventTypeClass.Value1 + Event.EventTypeClass.Value2
+ self.assertEqual(sum, 1)
+
def testEnumTpPrintImplementation(self):
'''Without SbkEnum.tp_print 'print' returns the enum represented as an int.'''
tmpfile = createTempFile()
diff --git a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
index e4e8f7e22..5a12eeccd 100644
--- a/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
+++ b/sources/shiboken2/tests/samplebinding/typesystem_sample.xml
@@ -501,11 +501,21 @@
<function signature="gimmeInt()" />
<function signature="gimmeDouble()" />
<function signature="makeCString()" />
+ <function signature="sumIntArray(int[4])"/>
+ <function signature="sumDoubleArray(double[4])"/>
+ <function signature="sumIntMatrix(int[2][3])"/>
+ <function signature="sumDoubleMatrix(double[2][3])"/>
<function signature="multiplyPair(std::pair&lt;double, double>)" />
<function signature="returnCString()" />
<function signature="overloadedFunc(double)" />
<function signature="overloadedFunc(int)" />
+ <value-type name="ArrayModifyTest">
+ <modify-function signature="sumIntArray(int, int*)">
+ <modify-argument index="2"><array/></modify-argument>
+ </modify-function>
+ </value-type>
+
<value-type name="ClassWithFunctionPointer">
<suppress-warning text="skipping function 'ClassWithFunctionPointer::callFunctionPointer', unmatched parameter type 'void (*)(void*)'" />
</value-type>
@@ -538,6 +548,7 @@
<value-type name="SomeInnerClass">
<object-type name="OkThisIsRecursiveEnough">
<enum-type name="NiceEnum" />
+ <enum-type name="NiceEnumClass" />
</object-type>
<enum-type name="ProtectedEnum"/>
</value-type>
@@ -787,6 +798,7 @@
<value-type name="Event">
<enum-type name="EventType"/>
+ <enum-type name="EventTypeClass" class="yes"/>
</value-type>
<value-type name="BlackBox">
@@ -1159,7 +1171,7 @@
<!-- change the name of this virtual method -->
<modify-function signature="className()" rename="name"/>
- <modify-function signature="sumPointArray(int, const Point*)">
+ <modify-function signature="sumPointArray(int, const Point[])">
<modify-argument index="1">
<remove-argument/>
<conversion-rule class="native">
@@ -1477,6 +1489,8 @@
</modify-function>
</value-type>
<value-type name="VirtualDaughter" />
+ <object-type name="VirtualDaughter2" />
+ <object-type name="VirtualFinalDaughter" />
<value-type name="VirtualDtor">
<modify-function signature="create()">
@@ -1950,7 +1964,7 @@
<define-ownership owner="c++"/>
</modify-argument>
</modify-function>
- <modify-function signature="acceptSequence(const char**)">
+ <modify-function signature="acceptSequence(const char*[])">
<modify-argument index="1">
<replace-type modified-type="PySequence" />
<conversion-rule class="native">
diff --git a/sources/shiboken2/tests/test_generator/dummygenerator.cpp b/sources/shiboken2/tests/test_generator/dummygenerator.cpp
index 51d2b33da..40d9fb771 100644
--- a/sources/shiboken2/tests/test_generator/dummygenerator.cpp
+++ b/sources/shiboken2/tests/test_generator/dummygenerator.cpp
@@ -52,7 +52,8 @@ DummyGenerator::doSetup(const QMap<QString, QString>& args)
QFile logFile(args["dump-arguments"]);
logFile.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&logFile);
- foreach (const QString& key, args.keys()) {
+ for (QMap<QString, QString>::const_iterator it = args.cbegin(), end = args.cend(); it != end; ++it) {
+ const QString& key = it.key();
if (key == "arg-1")
out << "header-file";
else if (key == "arg-2")
diff --git a/testing/runner.py b/testing/runner.py
index a993c3a5c..6c3eef388 100644
--- a/testing/runner.py
+++ b/testing/runner.py
@@ -51,6 +51,8 @@ from textwrap import dedent
from .buildlog import builds
from .helper import decorate, PY3, TimeoutExpired
+sys.path.append('..')
+from utils import detectClang
class TestRunner(object):
def __init__(self, log_entry, project, index):
@@ -63,8 +65,20 @@ class TestRunner(object):
else:
self.logfile = os.path.join(log_dir, project + ".log")
os.environ['CTEST_OUTPUT_ON_FAILURE'] = '1'
+ self._setupClang()
self._setup()
+ def _setupClang(self):
+ if sys.platform != "win32":
+ return
+ clangDir = detectClang()
+ if clangDir[0]:
+ clangBinDir = os.path.join(clangDir[0], 'bin')
+ path = os.environ.get('PATH')
+ if not clangBinDir in path:
+ os.environ['PATH'] = clangBinDir + os.pathsep + path
+ print("Adding %s as detected by %s to PATH" % (clangBinDir, clangDir[1]))
+
def _find_ctest(self):
"""
Find ctest in the Makefile
@@ -149,11 +163,11 @@ class TestRunner(object):
print(*args, file=output, **kw)
# 'for line in input:' would read into too large chunks
+ labelled = True
while True:
line = input.readline()
if not line:
break
- labelled = True
if line.startswith('BEGIN_FILE'):
labelled = False
txt = line.rstrip()
diff --git a/tests/QtQml/qquickitem_grabToImage.py b/tests/QtQml/qquickitem_grabToImage.py
new file mode 100644
index 000000000..91835e689
--- /dev/null
+++ b/tests/QtQml/qquickitem_grabToImage.py
@@ -0,0 +1,79 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the test suite of PySide2.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import unittest
+from helper import adjust_filename, TimedQApplication
+from PySide2 import QtCore, QtGui, QtQuick
+
+class TestGrabToSharedPointerImage(TimedQApplication):
+ def setUp(self):
+ TimedQApplication.setUp(self, 1000)
+
+ def testQQuickItemGrabToImageSharedPointer(self):
+ view = QtQuick.QQuickView()
+ view.setSource(QtCore.QUrl.fromLocalFile(
+ adjust_filename('qquickitem_grabToImage.qml', __file__)))
+ view.show()
+
+ # Get the QQuickItem objects for the blue Rectangle and the Image item.
+ root = view.rootObject()
+ blueRectangle = root.findChild(QtQuick.QQuickItem, "blueRectangle")
+ imageContainer = root.findChild(QtQuick.QQuickItem, "imageContainer")
+
+ # Start the image grabbing.
+ grabResultSharedPtr = blueRectangle.grabToImage()
+
+ # Implicit call of operator bool() of the smart pointer, to check that it holds
+ # a valid pointer.
+ self.assertTrue(grabResultSharedPtr)
+
+ self.grabbedColor = None
+ def onGrabReady():
+ # Signal early exit.
+ QtCore.QTimer.singleShot(0, self.app.quit)
+
+ # Show the grabbed image in the QML Image item.
+ imageContainer.setProperty("source", grabResultSharedPtr.url())
+
+ # Wait for signal when grabbing is complete.
+ grabResultSharedPtr.ready.connect(onGrabReady)
+ self.app.exec_()
+
+ # Get the first pixel color of the grabbed image.
+ self.image = grabResultSharedPtr.image()
+ self.assertTrue(self.image)
+ self.grabbedColor = self.image.pixelColor(0,0)
+ self.assertTrue(self.grabbedColor.isValid())
+
+ # Compare the grabbed color with the one we set in the rectangle.
+ blueColor = QtGui.QColor("blue")
+ self.assertEqual(self.grabbedColor, blueColor)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/sources/shiboken2/ApiExtractor/parser/name_compiler.h b/tests/QtQml/qquickitem_grabToImage.qml
index 431d401f8..d103cf076 100644
--- a/sources/shiboken2/ApiExtractor/parser/name_compiler.h
+++ b/tests/QtQml/qquickitem_grabToImage.qml
@@ -1,10 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2002-2005 Roberto Raggi <roberto@kdevelop.org>
+** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
-** This file is part of PySide2.
+** This file is part of the test suite of PySide2.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
@@ -27,48 +26,44 @@
**
****************************************************************************/
+import QtQuick 2.0
-#ifndef NAME_COMPILER_H
-#define NAME_COMPILER_H
+Item {
+ id: root
+ width: 600
+ height: 600
-#include "default_visitor.h"
-#include <QtCore/QStringList>
-
-class TokenStream;
-class Binder;
-
-class NameCompiler: protected DefaultVisitor
-{
-public:
- NameCompiler(Binder *binder);
-
- void run(NameAST *node) {
- internal_run(node);
- }
- void run(UnqualifiedNameAST *node) {
- internal_run(node);
+ Rectangle {
+ id: blue
+ objectName: "blueRectangle"
+ width: 200
+ height: 200
+ anchors.top: root.top
+ anchors.horizontalCenter: root.horizontalCenter
+ color: "blue"
}
- QString name() const {
- return _M_name.join(QLatin1String("::"));
- }
- QStringList qualifiedName() const {
- return _M_name;
+ Text {
+ text: qsTr("Original blue rectangle")
+ anchors.left: blue.right
+ anchors.verticalCenter: blue.verticalCenter
}
-protected:
- virtual void visitUnqualifiedName(UnqualifiedNameAST *node);
- virtual void visitTemplateArgument(TemplateArgumentAST *node);
-
- QString internal_run(AST *node);
- QString decode_operator(std::size_t index) const;
-
-private:
- Binder *_M_binder;
- TokenStream *_M_token_stream;
- QStringList _M_name;
-};
+ Image {
+ id: imageContainer
+ objectName: "imageContainer"
+ width: 200
+ height: 200
+ anchors.bottom: root.bottom
+ anchors.horizontalCenter: root.horizontalCenter
+ }
-#endif // NAME_COMPILER_H
+ Text {
+ text: qsTr("Image with the source URL set to the result of calling QQuickItem::grabToImage on the rectangle. If you see a second blue rectangle, that means it works.")
+ anchors.left: imageContainer.right
+ anchors.verticalCenter: imageContainer.verticalCenter
+ wrapMode: Text.WrapAtWordBoundaryOrAnywhere
+ width: 200
+ }
-// kate: space-indent on; indent-width 2; replace-tabs on;
+}
diff --git a/utils.py b/utils.py
index 1e23a89c4..d1bf2d6b9 100644
--- a/utils.py
+++ b/utils.py
@@ -1,3 +1,42 @@
+#############################################################################
+##
+## Copyright (C) 2017 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of PySide2.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
import sys
import os
import re
@@ -7,6 +46,7 @@ import time
import shutil
import subprocess
import fnmatch
+import glob
import itertools
import popenasync
import glob
@@ -666,6 +706,75 @@ def osx_add_qt_rpath(library_path, qt_lib_dir,
back_tick('install_name_tool -add_rpath {rpath} {library_path}'.format(
rpath=qt_lib_dir, library_path=library_path))
+# Find an executable specified by a glob pattern ('foo*') in the OS path
+def findGlobInPath(pattern):
+ result = []
+ if sys.platform == 'win32':
+ pattern += '.exe'
+
+ for path in os.environ.get('PATH', '').split(os.pathsep):
+ for match in glob.glob(os.path.join(path, pattern)):
+ result.append(match)
+ return result
+
+# Locate the most recent version of llvmConfig in the path.
+def findLlvmConfig():
+ versionRe = re.compile('(\d+)\.(\d+)\.(\d+)')
+ result = None
+ lastVersionString = '000000'
+ for llvmConfig in findGlobInPath('llvm-config*'):
+ try:
+ output = run_process_output([llvmConfig, '--version'])
+ if output:
+ match = versionRe.match(output[0])
+ if match:
+ versionString = '%02d%02d%02d' % (int(match.group(1)),
+ int(match.group(2)), int(match.group(3)))
+ if (versionString > lastVersionString):
+ result = llvmConfig
+ lastVersionString = versionString
+ except OSError:
+ pass
+ return result
+
+# Add Clang to path for Windows for the shiboken ApiExtractor tests.
+# Revisit once Clang is bundled with Qt.
+def detectClang():
+ source = 'LLVM_INSTALL_DIR'
+ clangDir = os.environ.get(source, None)
+ if not clangDir:
+ source = 'CLANG_INSTALL_DIR'
+ clangDir = os.environ.get(source, None)
+ if not clangDir:
+ source = findLlvmConfig()
+ try:
+ output = run_process_output([source, '--prefix'])
+ if output:
+ clangDir = output[0]
+ except OSError:
+ pass
+ if clangDir:
+ arch = '64' if sys.maxsize > 2**31-1 else '32'
+ clangDir = clangDir.replace('_ARCH_', arch)
+ return (clangDir, source)
+
+def download_and_extract_7z(fileurl, target):
+ """ Downloads 7z file from fileurl and extract to target """
+ print("Downloading fileUrl %s " % fileurl)
+ info = ""
+ try:
+ localfile, info = urllib.urlretrieve(fileurl)
+ except:
+ print("Error downloading %r : %r" % (fileurl, info))
+ raise RuntimeError(' Error downloading ' + fileurl)
+
+ try:
+ outputDir = "-o" + target
+ print("calling 7z x %s %s" % (localfile, outputDir))
+ subprocess.call(["7z", "x", "-y", localfile, outputDir])
+ except:
+ raise RuntimeError(' Error extracting ' + localfile)
+
def split_and_strip(input):
lines = [s.strip() for s in input.splitlines()]
return lines
diff --git a/wiki b/wiki
deleted file mode 160000
-Subproject ac1b69fabc1a9f81da585fe1a1aa4188862ced6