pymoul-svn Mailing List for pyMoul (Page 6)
Status: Alpha
Brought to you by:
tiran
You can subscribe to this list here.
| 2007 |
Jan
(89) |
Feb
(108) |
Mar
(62) |
Apr
(8) |
May
(9) |
Jun
(2) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|---|
|
From: <ti...@us...> - 2007-02-16 13:09:45
|
Revision: 174
http://pymoul.svn.sourceforge.net/pymoul/?rev=174&view=rev
Author: tiran
Date: 2007-02-16 05:09:45 -0800 (Fri, 16 Feb 2007)
Log Message:
-----------
Added hacky code to move the number in the right position
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/dninumbers.py
pymoul/trunk/src/moul/qt/mainwindow.py
Property Changed:
----------------
pymoul/trunk/src/moul/qt/dninumbers.py
Modified: pymoul/trunk/src/moul/qt/dninumbers.py
===================================================================
--- pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-15 18:18:46 UTC (rev 173)
+++ pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-16 13:09:45 UTC (rev 174)
@@ -19,8 +19,8 @@
"""Moul QT D'ni Number renderer
"""
__author__ = "Christian Heimes"
-__version__ = "$Id: wdysini.py 144 2007-02-06 03:51:21Z tiran $"
-__revision__ = "$Revision: 144 $"
+__version__ = "$Id$"
+__revision__ = "$Revision$"
import sys
from PyQt4 import QtCore
@@ -127,6 +127,7 @@
self.dni = None
self.height = None
self.numbers = ()
+ self._layout = None
def setDniNumbers(self, dninumbers):
"""Set D'ni number instance
@@ -163,6 +164,20 @@
self.setMaximumSize(self.width, self.height)
self.resize(self.width, self.height)
+ def setPosition(self, layout, row, col, position):
+ """Set position (hack)
+ """
+ self._layout = None
+ if position == QtCore.Qt.AlignLeft:
+ return
+ elif position == QtCore.Qt.AlignCenter:
+ pass
+ elif position == QtCore.Qt.AlignRight:
+ pass
+ else:
+ raise ValueError(position)
+ self._layout = layout, row, col, position
+
def paintEvent(self, event):
"""Render and paint numbers
"""
@@ -178,3 +193,14 @@
painter.drawPixmap(0, 0, self._pmleft)
painter.drawPixmap(self.width-self._pmright.width(), 0, self._pmright)
painter.end()
+
+ # remove the hack!
+ if self._layout is not None:
+ layout, row, col, position = self._layout
+ x, y, w, h = layout.cellRect(row, col).getRect()
+ geometry = self.geometry()
+ movex = self.width - w
+ if position == QtCore.Qt.AlignCenter:
+ movex = movex // 2
+ self.move(geometry.x()+movex, geometry.y())
+ self._layout = None
Property changes on: pymoul/trunk/src/moul/qt/dninumbers.py
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 18:18:46 UTC (rev 173)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-16 13:09:45 UTC (rev 174)
@@ -554,9 +554,10 @@
dnipix = QDniNumberWidget(widget)
dnipix.setDniNumbers(self._dninumbers)
dnipix.setHeight(25)
- dnipix.setNumbers(5, 24)
- dnipix.setObjectName("dnw_dninumber_test")
- grid.addWidget(dnipix, 5, 8, 1, 2)
+ dnipix.setNumbers(1, 0)
+ dnipix.setObjectName("dnw_dninumber_250")
+ dnipix.setPosition(grid, 5, 0, QtCore.Qt.AlignRight)
+ grid.addWidget(dnipix, 5, 0, 1, 2)
class PingServerThread(QtCore.QThread):
def __init__(self, parent=None):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-15 18:18:46
|
Revision: 173
http://pymoul.svn.sourceforge.net/pymoul/?rev=173&view=rev
Author: tiran
Date: 2007-02-15 10:18:46 -0800 (Thu, 15 Feb 2007)
Log Message:
-----------
Added Dni number stuff for Qt
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
Added Paths:
-----------
pymoul/trunk/src/moul/qt/dninumbers.py
Added: pymoul/trunk/src/moul/qt/dninumbers.py
===================================================================
--- pymoul/trunk/src/moul/qt/dninumbers.py (rev 0)
+++ pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-15 18:18:46 UTC (rev 173)
@@ -0,0 +1,180 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program 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 General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+"""Moul QT D'ni Number renderer
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id: wdysini.py 144 2007-02-06 03:51:21Z tiran $"
+__revision__ = "$Revision: 144 $"
+
+import sys
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+from PyQt4.QtCore import Qt
+from PyQt4.QtCore import SIGNAL
+from PyQt4.QtCore import pyqtSignature
+
+from moul.qt.utils import QNamespaceContainer
+from moul.qt.utils import QSignalLoggerMetaclass
+from moul.qt.utils import questionMB
+from moul.qt.utils import criticalMB
+
+
+class QDniNumbers(object):
+ """Qt D'ni Number helper class
+
+ Lookup and scale pixmaps for D'ni numbers
+ """
+ def __init__(self):
+ self.pixmaps = {}
+ for i in range(0, 26):
+ self.pixmaps[i] = QtGui.QPixmap(
+ ":/dninumbers/resources/dninumbers/%02i.png" % i)
+ self.pixmaps['cyclic'] = QtGui.QPixmap(
+ ":/dninumbers/resources/dninumbers/00c.png")
+ # w, h = 67, 55
+ self._rectleft = QtCore.QRect(0, 0, 60, 55) # with right border
+ self._rectright = QtCore.QRect(12, 0, 55, 55) # w/o left border
+ self._rectmiddle = QtCore.QRect(12, 0, 49, 55) # right line
+
+ @staticmethod
+ def _scale(pixmap, height=None):
+ """Scale a pixmap to height
+ """
+ if height is not None:
+ return pixmap.scaledToHeight(height, QtCore.Qt.SmoothTransformation)
+ else:
+ return pixmap
+
+ def get(self, nr, height=None):
+ """Get pixmap by number and scale it
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ try:
+ nr = int(nr)
+ except ValueError:
+ pass
+ pixmap = self.pixmaps[nr]
+ return self._scale(pixmap, height)
+
+ def getLeft(self, nr, height=None):
+ """Get pixmap for left digit of combined number
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ pixmap = self.get(nr).copy(self._rectleft)
+ return self._scale(pixmap, height)
+
+ def getRight(self, nr, height=None):
+ """Get pixmap for right digit of combined number
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ pixmap = self.get(nr).copy(self._rectright)
+ return self._scale(pixmap, height)
+
+ def getMiddle(self, nr, heigh=None):
+ """Get pixmap for middle digit of combined number
+
+ @param nr: number (0-25, 'cyclic')
+ @type nr: int or str
+ @param height: scale pixmap to height
+ @param height: int or None for default size
+ @return: (scaled) pixmap
+ @rtype: QPixmap instance
+ """
+ pixmap = self.get(nr).copy(self._rectmiddle)
+ return self._scale(pixmap, height)
+
+class QDniNumberWidget(QtGui.QWidget):
+ """Q D'ni number widget
+
+ Displays combined number
+ """
+ def __init__(self, parent):
+ QtGui.QWidget.__init__(self, parent)
+ self.dni = None
+ self.height = None
+ self.numbers = ()
+
+ def setDniNumbers(self, dninumbers):
+ """Set D'ni number instance
+ """
+ if not isinstance(dninumbers, QDniNumbers):
+ raise TypeError(type(dninumbers))
+ self.dni = dninumbers
+
+ def setHeight(self, height=None):
+ """Set height to scale
+ """
+ self.height=height
+
+ def setNumbers(self, *args):
+ """Set numbers to display
+ """
+ valid = tuple(range(0, 26)) + ('cyclic',)
+ for number in args:
+ if not isinstance(number, int):
+ raise TypeError(number)
+ if number not in valid:
+ raise ValueError(number)
+ self.numbers = args
+ self._pmleft = self.dni.getLeft(self.numbers[0], height=self.height)
+ self._pmright = self.dni.getRight(self.numbers[-1], height=self.height)
+ self._pmmiddle = [self.dni.getMiddle(nr, height=self.height)
+ for nr in self.numbers[1:-1]]
+ if self._pmmiddle:
+ raise NotImplementedError
+ else:
+ middlewidth = 0
+ self.width = self._pmleft.width() + self._pmright.width() + middlewidth
+ self.setMinimumSize(self.width, self.height)
+ self.setMaximumSize(self.width, self.height)
+ self.resize(self.width, self.height)
+
+ def paintEvent(self, event):
+ """Render and paint numbers
+ """
+ painter = QtGui.QPainter()
+ painter.begin(self)
+ #rect = painter.viewport()
+ #size = QtCore.QSize(width, height)
+ #size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)
+ #painter.setViewport(0, 0, size.width(), size.height())
+ #painter.setWindow(self.parent().rect())
+
+ # left
+ painter.drawPixmap(0, 0, self._pmleft)
+ painter.drawPixmap(self.width-self._pmright.width(), 0, self._pmright)
+ painter.end()
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 18:18:46 UTC (rev 173)
@@ -52,6 +52,8 @@
from moul.qt.threadlet import Threadlet
from moul.qt.ui.mainwindow import Ui_MainWindow
from moul.qt import utils as qtutils
+from moul.qt.dninumbers import QDniNumbers
+from moul.qt.dninumbers import QDniNumberWidget
LOG = getLogger('moul.qt')
@@ -505,6 +507,8 @@
LOG.error("Ping thread is already running")
def _dninumbers_init(self):
+ self._dninumbers = QDniNumbers()
+ height = 25
widget = self.gridLayout_3
grid = self.gridlayout3
alignl = QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter
@@ -516,9 +520,7 @@
nr.setAlignment(alignc)
nr.setText(str(i + j*5))
grid.addWidget(nr, j, i*2)
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5))
- #dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni_pic = self._dninumbers.get(i + j*5, height=height)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j))
dni.setPixmap(dni_pic)
@@ -530,8 +532,7 @@
nr.setAlignment(alignc)
nr.setText("25")
grid.addWidget(nr, 5, 2)
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png")
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni_pic = self._dninumbers.get(25, height=height)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_25")
dni.setAlignment(alignl)
@@ -541,16 +542,22 @@
nr = QtGui.QLabel(widget)
nr.setObjectName("lb_dninumber_nr_00c")
nr.setAlignment(alignc)
- nr.setText("cyclic 0")
+ nr.setText(self.trUtf8("cyclic 0"))
grid.addWidget(nr, 5, 5, 1, 2)
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png")
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni_pic = self._dninumbers.get("cyclic", height=height)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_00c")
dni.setAlignment(alignl)
dni.setPixmap(dni_pic)
grid.addWidget(dni, 5, 7)
+ dnipix = QDniNumberWidget(widget)
+ dnipix.setDniNumbers(self._dninumbers)
+ dnipix.setHeight(25)
+ dnipix.setNumbers(5, 24)
+ dnipix.setObjectName("dnw_dninumber_test")
+ grid.addWidget(dnipix, 5, 8, 1, 2)
+
class PingServerThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-15 12:30:31
|
Revision: 172
http://pymoul.svn.sourceforge.net/pymoul/?rev=172&view=rev
Author: tiran
Date: 2007-02-15 04:30:31 -0800 (Thu, 15 Feb 2007)
Log Message:
-----------
Much better alignement of D'ni numbers
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.ui
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 03:14:42 UTC (rev 171)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172)
@@ -505,48 +505,51 @@
LOG.error("Ping thread is already running")
def _dninumbers_init(self):
- # XXX needs better alignment
widget = self.gridLayout_3
grid = self.gridlayout3
- alignvcr = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter
+ alignl = QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter
+ alignc = QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter
for i in range(0, 5):
for j in range(0, 5):
nr = QtGui.QLabel(widget)
nr.setObjectName("lb_dninumber_nr_%02i_%02i" % (i, j))
- nr.setAlignment(alignvcr)
+ nr.setAlignment(alignc)
nr.setText(str(i + j*5))
grid.addWidget(nr, j, i*2)
- dni = QtGui.QLabel(widget)
- dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j))
dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5))
#dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni = QtGui.QLabel(widget)
+ dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j))
dni.setPixmap(dni_pic)
+ dni.setAlignment(alignl)
grid.addWidget(dni, j, i*2+1)
nr = QtGui.QLabel(widget)
nr.setObjectName("lb_dninumber_nr_25")
- nr.setAlignment(alignvcr)
+ nr.setAlignment(alignc)
nr.setText("25")
- grid.addWidget(nr, 5, 3)
+ grid.addWidget(nr, 5, 2)
+ dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png")
+ dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_25")
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png")
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni.setAlignment(alignl)
dni.setPixmap(dni_pic)
- grid.addWidget(dni, 5, 4)
+ grid.addWidget(dni, 5, 3)
nr = QtGui.QLabel(widget)
nr.setObjectName("lb_dninumber_nr_00c")
- nr.setAlignment(alignvcr)
+ nr.setAlignment(alignc)
nr.setText("cyclic 0")
- grid.addWidget(nr, 5, 5)
+ grid.addWidget(nr, 5, 5, 1, 2)
+ dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png")
+ dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
dni = QtGui.QLabel(widget)
dni.setObjectName("lb_dninumber_00c")
- dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png")
- dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni.setAlignment(alignl)
dni.setPixmap(dni_pic)
- grid.addWidget(dni, 5, 6)
+ grid.addWidget(dni, 5, 7)
class PingServerThread(QtCore.QThread):
def __init__(self, parent=None):
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 03:14:42 UTC (rev 171)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172)
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file './src/moul/qt/ui/mainwindow.ui'
#
-# Created: Thu Feb 15 03:57:16 2007
+# Created: Thu Feb 15 13:28:03 2007
# by: PyQt4 UI code generator 4.1.1
#
# WARNING! All changes made in this file will be lost!
@@ -875,7 +875,7 @@
self.gb_dninumbers.setObjectName("gb_dninumbers")
self.gridLayout_3 = QtGui.QWidget(self.gb_dninumbers)
- self.gridLayout_3.setGeometry(QtCore.QRect(10,20,431,341))
+ self.gridLayout_3.setGeometry(QtCore.QRect(10,20,411,341))
self.gridLayout_3.setObjectName("gridLayout_3")
self.gridlayout3 = QtGui.QGridLayout(self.gridLayout_3)
@@ -930,9 +930,9 @@
self.lb_doc_status.setBuddy(self.pb_doc_loadjournals)
self.retranslateUi(MainWindow)
- self.tabwidget.setCurrentIndex(3)
+ self.tabwidget.setCurrentIndex(0)
self.tab_sub_settings.setCurrentIndex(0)
- self.tabWidget.setCurrentIndex(2)
+ self.tabWidget.setCurrentIndex(0)
self.tabwidget_about.setCurrentIndex(0)
QtCore.QObject.connect(self.main_buttonbox,QtCore.SIGNAL("rejected()"),MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 03:14:42 UTC (rev 171)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 12:30:31 UTC (rev 172)
@@ -110,7 +110,7 @@
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex" >
- <number>3</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="tab_tasks" >
<attribute name="title" >
@@ -1648,7 +1648,7 @@
</rect>
</property>
<property name="currentIndex" >
- <number>2</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="tab_sub_chatlogs" >
<attribute name="title" >
@@ -1891,7 +1891,7 @@
<rect>
<x>10</x>
<y>20</y>
- <width>431</width>
+ <width>411</width>
<height>341</height>
</rect>
</property>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-15 03:14:41
|
Revision: 171
http://pymoul.svn.sourceforge.net/pymoul/?rev=171&view=rev
Author: tiran
Date: 2007-02-14 19:14:42 -0800 (Wed, 14 Feb 2007)
Log Message:
-----------
Property fixes
Modified Paths:
--------------
pymoul/trunk/Makefile.in
pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py
pymoul/trunk/src/moul/time/utils.py
Property Changed:
----------------
pymoul/trunk/src/moul/crypt/binaryrecord.py
pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py
pymoul/trunk/src/moul/time/utils.py
Modified: pymoul/trunk/Makefile.in
===================================================================
--- pymoul/trunk/Makefile.in 2007-02-15 03:13:10 UTC (rev 170)
+++ pymoul/trunk/Makefile.in 2007-02-15 03:14:42 UTC (rev 171)
@@ -75,7 +75,9 @@
propset:
$(FINDPYTXT) | xargs svn propset svn:keywords "Id Revision"
- $(FINDTEXT) | xargs svn propset svn:eol-style "native"
+ $(FINDTEXT) | xargs svn propset svn:eol-style "native"
+ find src/moul -name '*.png' $(NOTSVN) | xargs svn propset \
+ svn:mimetype image/png
fixlineendings:
$(FINDPY) | xargs recode -f ibmpc..latin1
Property changes on: pymoul/trunk/src/moul/crypt/binaryrecord.py
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Modified: pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py
===================================================================
--- pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py 2007-02-15 03:13:10 UTC (rev 170)
+++ pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py 2007-02-15 03:14:42 UTC (rev 171)
@@ -18,8 +18,8 @@
"""moul.crypt.binaryrecord unit tests
"""
__author__ = "Christian Heimes"
-__version__ = "$Id: test_elf.py 122 2007-02-02 17:34:06Z tiran $"
-__revision__ = "$Revision: 122 $"
+__version__ = "$Id$"
+__revision__ = "$Revision$"
import os
import unittest
Property changes on: pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Modified: pymoul/trunk/src/moul/time/utils.py
===================================================================
--- pymoul/trunk/src/moul/time/utils.py 2007-02-15 03:13:10 UTC (rev 170)
+++ pymoul/trunk/src/moul/time/utils.py 2007-02-15 03:14:42 UTC (rev 171)
@@ -18,8 +18,8 @@
"""pyMoul cavern time tool
"""
__author__ = "Christian Heimes"
-__version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $"
-__revision__ = "$Revision: 124 $"
+__version__ = "$Id$"
+__revision__ = "$Revision$"
from moul.osdependent import __FROZEN__
# pytz is an egg
Property changes on: pymoul/trunk/src/moul/time/utils.py
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-15 03:13:11
|
Revision: 170
http://pymoul.svn.sourceforge.net/pymoul/?rev=170&view=rev
Author: tiran
Date: 2007-02-14 19:13:10 -0800 (Wed, 14 Feb 2007)
Log Message:
-----------
Added D'ni number tab to UI
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.ui
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 02:26:43 UTC (rev 169)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 03:13:10 UTC (rev 170)
@@ -87,6 +87,7 @@
self.urupersonaldir.initializeFactories()
# init handlers
+ self._dninumbers_init()
self._timezone_init()
self._ping_init()
self._systray_init()
@@ -336,10 +337,9 @@
mb.exec_()
return
logzipper = self.urupersonaldr.logzipper
- logzipper.setZip(self.radio_ziplogs.isChecked()
- # always remove
+ logzipper.setZip(self.radio_ziplogs.isChecked())
+ # always remove: self.radio_deletelogs.isChecked()
logzipper.setRemove(True)
- #doremove = self.radio_deletelogs.isChecked()
# ************************************************************************
# system tray
@@ -504,6 +504,50 @@
else:
LOG.error("Ping thread is already running")
+ def _dninumbers_init(self):
+ # XXX needs better alignment
+ widget = self.gridLayout_3
+ grid = self.gridlayout3
+ alignvcr = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter
+ for i in range(0, 5):
+ for j in range(0, 5):
+ nr = QtGui.QLabel(widget)
+ nr.setObjectName("lb_dninumber_nr_%02i_%02i" % (i, j))
+ nr.setAlignment(alignvcr)
+ nr.setText(str(i + j*5))
+ grid.addWidget(nr, j, i*2)
+ dni = QtGui.QLabel(widget)
+ dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j))
+ dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5))
+ #dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
+ dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni.setPixmap(dni_pic)
+ grid.addWidget(dni, j, i*2+1)
+
+ nr = QtGui.QLabel(widget)
+ nr.setObjectName("lb_dninumber_nr_25")
+ nr.setAlignment(alignvcr)
+ nr.setText("25")
+ grid.addWidget(nr, 5, 3)
+ dni = QtGui.QLabel(widget)
+ dni.setObjectName("lb_dninumber_25")
+ dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png")
+ dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni.setPixmap(dni_pic)
+ grid.addWidget(dni, 5, 4)
+
+ nr = QtGui.QLabel(widget)
+ nr.setObjectName("lb_dninumber_nr_00c")
+ nr.setAlignment(alignvcr)
+ nr.setText("cyclic 0")
+ grid.addWidget(nr, 5, 5)
+ dni = QtGui.QLabel(widget)
+ dni.setObjectName("lb_dninumber_00c")
+ dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png")
+ dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation)
+ dni.setPixmap(dni_pic)
+ grid.addWidget(dni, 5, 6)
+
class PingServerThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 02:26:43 UTC (rev 169)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 03:13:10 UTC (rev 170)
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file './src/moul/qt/ui/mainwindow.ui'
#
-# Created: Mon Feb 12 20:15:18 2007
+# Created: Thu Feb 15 03:57:16 2007
# by: PyQt4 UI code generator 4.1.1
#
# WARNING! All changes made in this file will be lost!
@@ -866,6 +866,23 @@
self.tb_journal_view.setOpenExternalLinks(True)
self.tb_journal_view.setObjectName("tb_journal_view")
self.tabWidget.addTab(self.tab_sub_journals,"")
+
+ self.tab = QtGui.QWidget()
+ self.tab.setObjectName("tab")
+
+ self.gb_dninumbers = QtGui.QGroupBox(self.tab)
+ self.gb_dninumbers.setGeometry(QtCore.QRect(10,0,451,371))
+ self.gb_dninumbers.setObjectName("gb_dninumbers")
+
+ self.gridLayout_3 = QtGui.QWidget(self.gb_dninumbers)
+ self.gridLayout_3.setGeometry(QtCore.QRect(10,20,431,341))
+ self.gridLayout_3.setObjectName("gridLayout_3")
+
+ self.gridlayout3 = QtGui.QGridLayout(self.gridLayout_3)
+ self.gridlayout3.setMargin(0)
+ self.gridlayout3.setSpacing(6)
+ self.gridlayout3.setObjectName("gridlayout3")
+ self.tabWidget.addTab(self.tab,"")
self.tabwidget.addTab(self.tab_browse,"")
self.tab_about = QtGui.QWidget()
@@ -913,9 +930,9 @@
self.lb_doc_status.setBuddy(self.pb_doc_loadjournals)
self.retranslateUi(MainWindow)
- self.tabwidget.setCurrentIndex(0)
+ self.tabwidget.setCurrentIndex(3)
self.tab_sub_settings.setCurrentIndex(0)
- self.tabWidget.setCurrentIndex(0)
+ self.tabWidget.setCurrentIndex(2)
self.tabwidget_about.setCurrentIndex(0)
QtCore.QObject.connect(self.main_buttonbox,QtCore.SIGNAL("rejected()"),MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
@@ -926,9 +943,9 @@
self.lb_log_archive.setText(QtGui.QApplication.translate("MainWindow", "Archive chatlogs and zip log files", None, QtGui.QApplication.UnicodeUTF8))
self.pb_log_remove.setText(QtGui.QApplication.translate("MainWindow", "Remove", None, QtGui.QApplication.UnicodeUTF8))
self.pb_log_archive.setText(QtGui.QApplication.translate("MainWindow", "Archive", None, QtGui.QApplication.UnicodeUTF8))
- self.radio_ziplogs.setText(QtGui.QApplication.translate("MainWindow", "Zip debug logs", None, QtGui.QApplication.UnicodeUTF8))
+ self.radio_ziplogs.setText(QtGui.QApplication.translate("MainWindow", "Zip and delete debug logs", None, QtGui.QApplication.UnicodeUTF8))
self.radio_deletelogs.setText(QtGui.QApplication.translate("MainWindow", "Delete debug logs", None, QtGui.QApplication.UnicodeUTF8))
- self.lb_log_remove.setText(QtGui.QApplication.translate("MainWindow", "Remove zipped logs", None, QtGui.QApplication.UnicodeUTF8))
+ self.lb_log_remove.setText(QtGui.QApplication.translate("MainWindow", "Remove all zipped logs", None, QtGui.QApplication.UnicodeUTF8))
self.groupBox_2.setTitle(QtGui.QApplication.translate("MainWindow", "KI Image repair", None, QtGui.QApplication.UnicodeUTF8))
self.pb_kiimage_repair.setText(QtGui.QApplication.translate("MainWindow", "Repair", None, QtGui.QApplication.UnicodeUTF8))
self.pb_kiimage_repair1.setText(QtGui.QApplication.translate("MainWindow", "Fix KI and avatar images", None, QtGui.QApplication.UnicodeUTF8))
@@ -996,6 +1013,8 @@
self.pb_doc_loadjournals.setText(QtGui.QApplication.translate("MainWindow", "Load journals", None, QtGui.QApplication.UnicodeUTF8))
self.lb_doc_status.setText(QtGui.QApplication.translate("MainWindow", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_sub_journals), QtGui.QApplication.translate("MainWindow", "Journals", None, QtGui.QApplication.UnicodeUTF8))
+ self.gb_dninumbers.setTitle(QtGui.QApplication.translate("MainWindow", "D\'ni Numbers", None, QtGui.QApplication.UnicodeUTF8))
+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "D\'ni Numbers", None, QtGui.QApplication.UnicodeUTF8))
self.tabwidget.setTabText(self.tabwidget.indexOf(self.tab_browse), QtGui.QApplication.translate("MainWindow", "Browse", None, QtGui.QApplication.UnicodeUTF8))
self.tb_abouttext.setHtml(QtGui.QApplication.translate("MainWindow", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 02:26:43 UTC (rev 169)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 03:13:10 UTC (rev 170)
@@ -110,7 +110,7 @@
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex" >
- <number>0</number>
+ <number>3</number>
</property>
<widget class="QWidget" name="tab_tasks" >
<attribute name="title" >
@@ -1648,7 +1648,7 @@
</rect>
</property>
<property name="currentIndex" >
- <number>0</number>
+ <number>2</number>
</property>
<widget class="QWidget" name="tab_sub_chatlogs" >
<attribute name="title" >
@@ -1870,6 +1870,42 @@
</widget>
</widget>
</widget>
+ <widget class="QWidget" name="tab" >
+ <attribute name="title" >
+ <string>D'ni Numbers</string>
+ </attribute>
+ <widget class="QGroupBox" name="gb_dninumbers" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>0</y>
+ <width>451</width>
+ <height>371</height>
+ </rect>
+ </property>
+ <property name="title" >
+ <string>D'ni Numbers</string>
+ </property>
+ <widget class="QWidget" name="gridLayout_3" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>431</width>
+ <height>341</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ </layout>
+ </widget>
+ </widget>
+ </widget>
</widget>
</widget>
<widget class="QWidget" name="tab_about" >
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-15 02:26:42
|
Revision: 169
http://pymoul.svn.sourceforge.net/pymoul/?rev=169&view=rev
Author: tiran
Date: 2007-02-14 18:26:43 -0800 (Wed, 14 Feb 2007)
Log Message:
-----------
Added image to resource
Fixed mimetype of images
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/ui/moulqt.qrc
pymoul/trunk/src/moul/qt/ui/moulqt_rc.py
Property Changed:
----------------
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png
pymoul/trunk/src/moul/qt/ui/resources/moul_logo.png
pymoul/trunk/src/moul/qt/ui/resources/uru_icon_32x32.png
Modified: pymoul/trunk/src/moul/qt/ui/moulqt.qrc
===================================================================
--- pymoul/trunk/src/moul/qt/ui/moulqt.qrc 2007-02-15 02:14:13 UTC (rev 168)
+++ pymoul/trunk/src/moul/qt/ui/moulqt.qrc 2007-02-15 02:26:43 UTC (rev 169)
@@ -3,4 +3,33 @@
<file>resources/moul_logo.png</file>
<file>resources/uru_icon_32x32.png</file>
</qresource>
+ <qresource prefix="/dninumbers" >
+ <file>resources/dninumbers/00.png</file>
+ <file>resources/dninumbers/00c.png</file>
+ <file>resources/dninumbers/01.png</file>
+ <file>resources/dninumbers/02.png</file>
+ <file>resources/dninumbers/03.png</file>
+ <file>resources/dninumbers/04.png</file>
+ <file>resources/dninumbers/05.png</file>
+ <file>resources/dninumbers/06.png</file>
+ <file>resources/dninumbers/07.png</file>
+ <file>resources/dninumbers/08.png</file>
+ <file>resources/dninumbers/09.png</file>
+ <file>resources/dninumbers/10.png</file>
+ <file>resources/dninumbers/11.png</file>
+ <file>resources/dninumbers/12.png</file>
+ <file>resources/dninumbers/13.png</file>
+ <file>resources/dninumbers/14.png</file>
+ <file>resources/dninumbers/15.png</file>
+ <file>resources/dninumbers/16.png</file>
+ <file>resources/dninumbers/17.png</file>
+ <file>resources/dninumbers/18.png</file>
+ <file>resources/dninumbers/19.png</file>
+ <file>resources/dninumbers/20.png</file>
+ <file>resources/dninumbers/21.png</file>
+ <file>resources/dninumbers/22.png</file>
+ <file>resources/dninumbers/23.png</file>
+ <file>resources/dninumbers/24.png</file>
+ <file>resources/dninumbers/25.png</file>
+ </qresource>
</RCC>
Modified: pymoul/trunk/src/moul/qt/ui/moulqt_rc.py
===================================================================
--- pymoul/trunk/src/moul/qt/ui/moulqt_rc.py 2007-02-15 02:14:13 UTC (rev 168)
+++ pymoul/trunk/src/moul/qt/ui/moulqt_rc.py 2007-02-15 02:26:43 UTC (rev 169)
@@ -2,7 +2,7 @@
# Resource object code
#
-# Created: Fr Feb 2 18:43:48 2007
+# Created: Do Feb 15 03:19:29 2007
# by: The Resource Compiler for PyQt (Qt v4.2.0)
#
# WARNING! All changes made in this file will be lost!
@@ -3355,9 +3355,1169 @@
\xce\xc7\x8e\x8b\x69\x60\x6f\x6f\xc5\xad\xbd\x43\x54\x55\xb0\x1b\
\x06\x3a\xeb\x71\x51\x32\x26\xcd\xff\x03\xbd\xf7\x7d\xa3\xd4\x5a\
\x95\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xa5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\
+\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\x02\
+\x0f\x02\x08\x14\x30\xcb\x4f\x1a\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\x02\x1b\x49\x44\x41\x54\x68\xde\xed\xd9\x4b\x2f\x24\
+\x51\x14\xc0\xf1\x7f\x99\xde\x11\x66\xb0\xf4\x18\x63\xec\x25\x3a\
+\xd6\x16\x76\x7c\x05\x44\x87\x19\x91\x09\x3e\x80\x05\x11\x11\xef\
+\x2f\xc0\x77\xf0\x01\x2c\x24\x88\xa0\xd1\x7b\xe6\xe1\x31\xbb\x59\
+\x0c\x6b\xaf\x85\xae\x85\x4e\x9d\xea\x94\xae\xae\x7b\xda\xbd\x27\
+\xa9\xcd\xbd\x95\x53\x55\xbf\x4a\xee\xe3\x5c\x0f\xa8\x01\x76\x70\
+\x01\x30\x95\x02\x3e\x00\x5d\xce\x02\x80\xba\x2a\x67\xf0\x3a\x1c\
+\x88\x03\x71\x20\x91\xc2\xcb\x0f\xaa\x9d\x42\x7f\x56\x68\x4f\xc7\
+\xf0\xec\x01\x60\x32\xa0\xfd\x2f\x30\x08\xdc\xc6\xf0\x8c\x0d\xe1\
+\xdb\xa6\x80\xbd\x80\xf6\x8b\x62\x09\x9f\x84\xab\xd4\x18\x02\xee\
+\x03\xf2\xde\x00\x1d\x31\xfe\xf0\x5d\xe1\xfd\xfb\xde\x9a\xb0\x1c\
+\x20\x12\xc6\x75\xcc\x18\x15\x01\x32\x1c\x82\xf1\xb5\x0c\x43\x82\
+\x6a\x90\x61\xe0\x21\x20\xd7\x15\xd0\x5e\xa6\x31\x52\x2d\x48\xc6\
+\x00\x86\x5a\x90\x0c\xf0\x18\x90\xe3\x12\xf8\x52\xe6\x59\x54\x1d\
+\xc8\x88\x41\x0c\x75\x20\xa3\x02\xc6\x1f\xa0\x2d\xa1\x75\x96\x1a\
+\x90\x6f\x0a\x30\xd4\x80\x7c\x0f\xc1\xf8\x9c\xf0\x4a\xdc\x38\xc8\
+\x98\x80\xf1\xdb\x00\x86\x71\x90\xf1\x10\x8c\x56\x43\x7b\x35\x63\
+\x20\x12\xc6\x2f\x83\x18\xc6\x40\x7e\x84\x60\xb4\x18\xde\xcd\x27\
+\x0e\x22\x61\xfc\x54\x80\x91\x38\xc8\x44\x08\x46\xb3\x92\x7a\x4f\
+\x62\x20\x93\x02\xc6\x85\x22\x8c\x44\x41\x24\x8c\x26\x65\x15\xc1\
+\xc8\x20\xa9\x12\x4a\x8f\x85\xd1\x9e\xaf\x6b\x54\x74\xb8\x22\xb3\
+\x03\x71\x20\x91\x22\x15\x63\xae\x73\x60\x53\xd9\xf7\x8d\xc5\xbd\
+\x87\x92\x66\x99\x9c\xd0\x3e\x53\xe9\xb3\xcc\x5b\x41\x1a\x81\x33\
+\xa1\x6f\xd6\x46\x10\x2a\x04\x25\xf1\xbd\x4c\x03\x70\x2a\xdc\x33\
+\x67\x23\x88\x76\x14\x63\xf5\x90\x7a\xe0\x44\xb8\x77\xde\x46\x10\
+\xad\x28\xc6\x6b\xaa\x9f\x42\x50\x16\x6c\x04\xf1\x51\xb2\x4a\x50\
+\xd4\x9c\xcb\x7c\x0c\x41\x59\xb4\x11\xc4\x47\x39\x36\x8c\xa2\xee\
+\x6c\xb7\x2e\x04\x65\xc9\x46\x10\x1f\xe5\x50\xc8\xb3\x6c\x23\x48\
+\x31\x94\x15\x1b\x41\x7c\x94\x03\x21\xdf\xaa\x8d\x20\xc5\x50\xd6\
+\x6c\x04\xf1\x51\xf6\x85\xbc\xeb\x04\x17\xb0\xdf\x35\x48\x92\x28\
+\x91\x41\x3c\xa0\x1a\xd8\x12\xfa\x7b\x85\xf6\xed\x18\x5e\xb6\x16\
+\xe8\x16\xfa\x8e\x80\xbb\x18\x9e\x91\xce\xaf\x87\x0a\x23\x07\xfc\
+\x0b\x68\x9f\xf6\xf2\x7f\xeb\x3f\x2e\x00\xfa\x5d\xd5\xbd\x20\x1c\
+\x88\x03\x71\x20\x91\xc2\xe3\xe5\xb0\xaa\xc7\x51\xbc\xcc\x3e\xcf\
+\x20\x47\xa9\xd6\x8f\x2b\x9c\x8e\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x01\x80\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x02\x05\xa0\x94\x87\x62\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\xf6\x49\x44\x41\x54\x68\xde\xed\xdb\x2f\x0e\xc2\
+\x30\x18\x87\xe1\x17\xb2\x20\x26\xc0\x00\x41\x21\x08\x16\xcf\x31\
+\xa6\xb9\x01\x47\xe1\x02\x68\x0c\x37\xe0\x1a\x18\x14\x82\x3f\x09\
+\x8a\x40\x82\xc2\x83\x22\x98\x36\x24\x4b\x17\x20\x79\x7f\xc9\xcc\
+\x9a\xad\xdb\xb3\xf5\xeb\x26\x5a\x03\x86\x40\x0b\x73\x03\x58\x01\
+\x0f\x37\x96\x75\x5f\x88\x77\xc4\x10\x43\x8c\x8f\xc9\x80\x1d\xb0\
+\x0e\xb4\xc5\x66\x99\xe3\xab\xf2\xfe\x78\x3a\x40\x3f\xb0\xff\x0a\
+\x9c\x22\xf7\x15\x4d\x6c\x96\x99\xfc\xc9\x83\x9e\x46\xae\x7f\xee\
+\x30\xb1\x66\x88\x21\x86\x18\x62\x54\xfb\x9d\xf1\xcd\x6c\x80\x91\
+\x6f\x86\xc3\x44\x0c\x6b\x46\xc9\x6c\x81\x45\xa2\x73\x8d\x81\xe2\
+\x9f\x31\xf6\xc0\x2c\xe1\xbf\x49\xe1\x30\xb1\x66\x88\x21\x86\x18\
+\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\
+\x88\x21\x86\x11\x43\x0c\x31\xc4\x10\x43\x0c\x31\xc4\xa8\x36\x19\
+\xd0\x03\xf2\x40\x5b\x1e\x39\xa6\x0b\x0c\x12\xf5\xdf\x08\xf4\x99\
+\xea\xdc\xed\xc8\xfe\x66\xa4\x8f\x3b\xb8\xde\xc4\xf5\x26\xd6\x0c\
+\x31\xc4\x28\x3d\x9b\x9c\x81\x83\x14\x5c\x9e\x60\xfb\xa1\xec\xd4\
+\x4a\xd7\x99\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\x7c\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x03\x2d\x8c\x3a\x1e\xd9\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\xf2\x49\x44\x41\x54\x68\xde\xed\xdb\x4d\x0a\x82\
+\x40\x18\x87\xf1\xc7\x92\xa0\x36\xee\x5a\x47\x75\x80\xa0\xdb\xd4\
+\xa6\x6b\x74\x94\xee\xd1\x29\x82\xa0\x13\xd8\xbe\x85\x04\xb5\xed\
+\x63\x61\x20\x88\x16\xb6\x51\xeb\xf9\x83\x9b\x57\x50\xe7\x27\xf3\
+\x0e\x0c\x4c\x00\xcc\x31\x00\xc7\x00\x78\xe8\x00\xc0\xb2\xa3\x41\
+\x16\x31\xc4\x10\xe3\x63\x42\x60\x5f\x72\x6f\x06\x74\x0b\xea\x07\
+\xe0\xd6\x82\xb1\x4d\x81\xa8\x68\xd5\x00\x92\x82\x7a\xf2\xee\x61\
+\xe7\xd7\x4a\x93\xbf\xa2\x96\xfc\xe8\x6d\xc9\xf7\x2f\x9c\x26\xf6\
+\x0c\x31\xc4\x10\x43\x0c\x31\xc4\x10\x43\x0c\x31\xc4\x10\x43\x0c\
+\x31\xc4\x10\xe3\x07\x13\xd6\xf8\xee\x1e\xb0\xca\xd5\x76\xa4\xdb\
+\x8a\x7f\x87\xd1\x07\x36\xb9\xda\xba\x4e\x0c\xa7\x89\x18\x62\x34\
+\xba\x67\x5c\x80\x49\xae\x96\xfc\x2b\xc6\x1d\x88\x9d\x26\xf6\x0c\
+\x31\xc4\x10\x43\x0c\x31\xc4\x10\x43\x0c\x31\x8c\x18\x62\x88\x21\
+\x86\x18\xdf\x27\x04\xc6\x15\xa1\x46\xa4\xbb\x54\x4d\xcf\xa0\xa4\
+\x3e\x2c\x19\xf3\xc9\xf3\x26\x59\x3c\x6f\x62\xcf\x10\x43\x8c\xca\
+\xab\x49\x2c\x03\x00\xd7\x27\x81\xed\x21\xfc\xab\x1b\xcf\x92\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x68\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\
+\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\x02\
+\x0f\x02\x05\x23\x3d\xd8\x94\x58\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\x02\xde\x49\x44\x41\x54\x68\xde\xed\xdb\x49\x4f\x14\
+\x41\x14\xc0\xf1\x3f\x66\xe2\xc9\xa3\x37\x13\x0e\xa2\xa0\x12\x70\
+\x47\xa2\x5e\x4c\x54\x44\xc5\x8d\x2d\x84\x10\x02\x12\x34\xc6\x9b\
+\x9e\x39\x78\xd5\xc4\x9b\x77\x3f\x84\xdf\x43\x4d\xd4\x78\x04\x1d\
+\x05\x67\x58\x5c\xa2\x32\xe0\x72\xa0\x3a\x69\x3a\x55\x35\x5d\xd0\
+\x5d\x55\x3d\xa9\x97\xf4\x65\xba\xaa\xfb\xf5\x6f\x92\x57\x93\x37\
+\xd5\x4d\x40\x33\xf0\x84\x10\x00\x0f\x9b\x80\x0e\xe0\x75\xb0\x00\
+\xa0\x73\x47\x30\xd8\x1c\x01\x24\x80\x04\x10\xa3\x28\x01\x73\xc0\
+\x90\xe4\xdc\x6e\xe0\x59\x8a\x6b\x3c\x07\x5e\x78\xf2\x3c\x17\x81\
+\xa9\x34\xab\x89\x78\xee\x64\xcc\xe9\x26\x35\x03\xff\x52\x1c\xab\
+\x40\x9f\x07\x18\x3d\xc0\xcf\x94\x39\x77\x6c\xe5\x06\x69\x41\x7c\
+\x40\xe9\x01\x7e\x19\xe4\x9b\x29\xc8\x0f\x60\xc5\x23\x94\x4b\x0a\
+\x8c\xef\x22\xd7\xdc\x41\x66\x81\x6e\x0d\xca\x35\x4f\x30\xce\x8a\
+\x5c\xad\x80\x00\x74\x69\x50\xae\x5b\xc2\xf8\x2d\xb9\xff\x37\x81\
+\x81\x6d\x10\x80\x93\x8e\x50\x54\x18\x5f\x81\x33\xb1\x71\xd6\x41\
+\x00\x4e\x00\xcb\x0a\x94\x1b\x39\x60\xf4\x6a\x30\x4e\x27\xc6\x3a\
+\x01\x01\x38\x0e\x2c\x29\x50\x6e\x5a\xc0\x58\x91\x60\x38\x05\xb1\
+\x81\xd2\x2b\xae\x25\xc3\xe8\x56\xcc\x71\x0a\x02\x70\x0c\x58\xcc\
+\x01\xe5\xb2\x06\xe3\x94\x66\x9e\x73\x10\x80\xa3\x40\x55\x81\x72\
+\x2b\x63\x8c\xae\x3a\x73\xbd\x00\x01\x38\xa2\x41\xe9\x37\xc8\xe1\
+\x8a\x02\x63\x59\x14\x73\x8a\x02\x12\xa1\x54\xb6\x81\xb2\x5d\x0c\
+\xef\x40\x00\x0e\x03\x5f\x24\xd7\xa8\xd5\x41\xb9\xaa\xc0\x58\x12\
+\xc5\x9b\xa2\x82\x00\x74\x1a\xa2\xf4\x29\x30\x16\x45\xd1\xa6\xe8\
+\x20\x88\x04\x54\x28\x03\x39\x61\x78\x0d\x02\xd0\x0e\x2c\x68\x50\
+\x54\x18\x55\xb1\x72\xd1\x68\x20\x3a\x94\x35\x05\x46\x45\x14\x67\
+\x6c\x81\xd8\xee\xa9\xbe\x01\xce\x09\x94\x64\x2b\x73\x67\xe2\xb3\
+\x2a\x70\x01\x78\xd9\xe8\x4d\xe6\xb7\x02\x65\x5e\x33\xa6\x02\x9c\
+\xb7\x8d\xe1\x0a\x04\xe0\x1d\xf0\x58\x73\xfe\x29\xf0\x0a\xcf\x22\
+\x8f\x1a\x12\x45\xbf\xa2\x66\x44\xc7\x3a\x30\x9c\xc1\x7d\xbc\x2f\
+\xaa\x11\x46\x2d\x45\x23\x78\x1d\x18\x69\x74\x90\x01\x05\xc6\x02\
+\x50\x56\xa0\x8c\x36\x2a\xc8\xa0\x58\x5e\x65\x18\xed\x40\x5b\x0e\
+\x28\xde\x82\x0c\x8a\x07\x93\x61\x1c\x8a\x8d\xd3\xa1\x8c\x35\x0a\
+\xc8\xb0\x02\x63\x3e\x81\x11\x45\xab\x06\x65\xbc\xe8\x20\x23\x86\
+\x18\x71\x94\x8f\x19\xa0\x78\x05\xb2\x55\x8c\x34\x28\x13\x45\x03\
+\x19\xd5\x60\x1c\x34\xc8\x61\xbf\x02\xe5\x0f\x30\x59\x14\x90\x31\
+\x05\xc6\x67\x43\x8c\x2c\x50\x9c\x83\x64\x8d\x11\x47\xf9\x20\xb9\
+\xee\x5f\xf4\xfb\x41\x9c\x82\x8c\x6b\x30\x0e\x64\xf0\x33\x5c\x87\
+\x32\xed\x1b\xc8\x44\xce\x18\x51\xec\x33\x44\x71\x02\xa2\xc2\xf8\
+\x94\x31\x46\x14\x2d\x1a\x94\xbb\xae\x41\x26\x45\x71\xb3\x85\x91\
+\x06\xe5\x9e\x2b\x90\xdb\x22\x01\x19\x46\x9b\x85\xf6\x44\x0b\x1b\
+\x9b\xe4\x74\x28\xd6\x40\xa6\x14\x18\x65\x4b\x18\x69\x50\xee\xdb\
+\x02\xa9\x79\x82\x11\xc5\x5e\x0d\xca\x1a\x8e\x76\x21\xba\xc2\x88\
+\xa3\xcc\xe2\x68\x17\xa2\x0c\xa3\xd5\x83\x96\xa7\x09\x8a\x12\xa4\
+\x04\xec\x01\x66\x24\xe7\x76\x19\x34\x8c\x1f\x78\xd2\x07\x7e\x2f\
+\xbe\xc8\x7a\x31\xc3\xc6\xff\xc4\xc9\x78\x14\xde\x97\xd9\x1c\xe1\
+\x7d\x99\x64\x04\x90\x00\x12\x40\x8c\xa2\x24\x96\xcd\x3b\x81\x02\
+\x80\xf2\x7f\x73\xe2\xb4\xaf\xf2\xe9\x93\x8e\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\xd5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x0a\x2a\xc3\x9c\x30\x33\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\x01\x4b\x49\x44\x41\x54\x68\xde\xed\xd9\xa1\x4b\x43\
+\x41\x1c\xc0\xf1\xef\x93\x17\xc4\xa0\xc5\xa2\x41\x64\x33\x88\x20\
+\x88\xc8\x92\xc5\x22\x83\xfd\x07\x26\x83\xe5\x81\x98\x4d\x06\xff\
+\x04\x9b\x60\x5d\xb2\x2e\x59\x0c\x33\x8b\x60\xb1\xac\x58\x2c\xcb\
+\xc6\x69\x19\x38\x1e\x77\x4f\x9e\x1c\x43\xb6\xef\x0f\x5e\xb8\xbb\
+\xdf\xbb\xbb\x7d\xc6\xfd\xc2\xbb\x0c\xb8\x04\xf6\x31\x9e\x73\xe0\
+\x10\xe8\x68\xc1\xd2\x82\x06\x3f\x21\x86\x18\x62\xfc\x1a\xd9\xb8\
+\x80\xae\x05\xc6\x2e\xc6\x63\xe5\xb8\x03\x1e\x22\xf3\x1d\x03\x67\
+\xa5\xbe\x53\xe0\x33\x92\x7f\x0d\x6c\x4f\xb4\xdf\x80\xab\x44\xbf\
+\x2d\xb4\x17\x80\x27\xe0\x26\xd0\xff\x51\x35\x59\x17\xf8\x0a\x3c\
+\x45\xc5\x3b\x45\x20\x7f\xa5\x22\xbf\x5f\xca\xed\x27\xfc\xa3\x8b\
+\xc8\xfe\xbb\x1e\x13\x6b\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\
+\x86\x18\x62\x88\x21\x86\x18\x62\x88\x31\x83\x91\x4f\x61\x8d\x17\
+\x60\x14\x19\x5b\x2f\xb5\x0f\x80\x41\xa2\x75\x97\xff\x23\xc6\x66\
+\x8d\xdc\x45\xa0\xe1\x31\xb1\x66\xcc\x76\xcd\x18\x00\xf7\x35\xf2\
+\x8f\x80\xd5\x89\xf6\x10\x78\x4c\xb4\x97\x26\x09\x2f\xd4\xff\x72\
+\x55\x50\x37\xbc\x2a\xb0\x66\x88\x21\x86\x18\x62\x88\x21\x86\x18\
+\x62\x88\x61\x88\x21\x86\x18\x62\x88\x21\x46\x9a\xc8\x81\x73\x60\
+\x37\x30\xd6\x8a\xbc\x73\x02\xec\x25\x5a\x7f\x2b\xd0\xbe\x4d\x34\
+\xf7\x4e\xa4\xbf\x15\x59\xe3\x15\xa0\x47\xf8\xf3\xd8\xbc\x3d\x3d\
+\x8f\x89\x35\x43\x0c\x31\xea\x44\x06\xb4\x81\x0d\x29\x78\xff\x06\
+\x62\x34\x7f\xf6\xf9\x47\xa2\x7f\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x03\x4a\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\
+\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\x02\
+\x0f\x02\x0b\x01\x76\x3b\xf8\x32\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\x02\xc0\x49\x44\x41\x54\x68\xde\xed\xdb\xcb\x4e\x14\
+\x41\x14\x80\xe1\x7f\x94\x4b\xa2\xa0\x42\x82\x57\xdc\x78\xe3\x22\
+\x6e\x04\x2f\xd1\x71\x6b\xa2\xc6\x28\x3b\x07\x6f\x4b\xe3\x4b\xb8\
+\xf3\x15\x78\x03\x10\x74\x14\x17\x66\x04\x45\x86\x88\x6f\xe0\x1b\
+\xf8\x02\x2e\x18\x50\x51\xa3\x8b\x39\xa3\x63\x5b\x35\xd3\x3d\xd3\
+\x55\xdd\x9d\x9c\x93\xcc\xa6\x1b\x3a\x55\xdf\x9c\x3e\xd5\x5d\x55\
+\x93\x03\x7a\x80\x4e\x34\xb6\x00\x5e\x01\xbf\xf4\xc3\xcc\x36\x4d\
+\x88\xbf\xa1\x18\x8a\xa1\x18\x4d\xa3\x03\xa8\x00\x9f\x0d\xe7\x6c\
+\xa3\xcc\x46\xad\xf2\xa6\x3c\xba\x81\x1d\x86\xe3\xdf\x80\x4d\x4b\
+\xbf\xac\x61\x1b\x65\xa6\x32\xf2\x45\x3f\xb4\xb4\x7f\x5a\x6f\x13\
+\xad\x19\x8a\xa1\x18\x8a\xa1\x18\x6e\x9f\x33\x92\x8c\x12\x30\xe4\
+\xe8\xda\xbb\xb2\x86\x31\x08\x1c\xd1\xdb\x44\x6b\x86\xd6\x8c\x28\
+\xf1\x09\x58\x8c\xe9\x5a\xa3\x40\x3e\xcb\x18\x1f\x81\x07\x31\xbe\
+\x9b\xe4\xf5\x36\xd1\x9a\xa1\x18\x8a\x91\x26\x8c\xed\x19\xe9\x5b\
+\x97\x0f\x8c\xc7\xc0\xd1\x94\x43\x9c\x06\x1e\xf9\xc0\x38\x0c\xac\
+\x02\xc7\x52\x0c\xf1\x16\xe8\xf7\x55\x33\x06\x81\x32\x70\x3c\x65\
+\x10\xe3\xc0\x72\x2b\x10\xed\x16\xd0\xb4\x81\x8c\x4b\x46\xf4\x25\
+\x35\x9a\x1c\x12\x90\x13\x09\x43\x4c\x48\x46\xf4\xb5\x73\x91\x38\
+\x86\xd6\xa4\x41\x26\x24\x23\xf6\x24\x31\xb4\xbe\x04\x7e\x06\x8e\
+\x1d\x14\x90\x21\xcf\x10\x67\x24\x23\x82\x10\x5f\x81\x05\x1f\x18\
+\xcf\x80\xfb\x29\x00\x39\x2b\x19\xb1\x3b\x70\xfc\x0b\x70\x53\xce\
+\x79\xb9\x4d\x66\x80\x7b\x06\x90\x03\x02\x32\xec\x18\xe2\x1c\xf0\
+\xc6\x02\x31\x09\x2c\xf9\xae\x19\xb3\xc0\x5d\x0b\xc8\x8a\x43\x90\
+\xf3\xd2\xd9\x20\xc4\xa6\x64\xc4\x92\xcf\x9a\x51\x1f\x4f\x80\x3b\
+\x0d\x32\x64\xc4\x01\xc4\xa2\x05\x62\x52\xb2\x25\xd1\xd1\x64\x0e\
+\xb8\x6d\x00\xd9\x2f\x19\x12\x17\xc8\x85\x06\x10\x37\xda\x85\x88\
+\xf3\xad\x75\xbe\x01\x48\x99\xea\x14\x5c\xbb\x10\xa5\x06\x10\xcb\
+\x69\x7b\x85\x9f\xa7\xba\x5d\x21\x08\xb2\x4f\x32\xa4\x55\x90\x8b\
+\xc0\x6b\x0b\xc4\xf5\xb8\x20\x5c\xcc\x67\x3c\x05\x0a\xc0\x0f\x03\
+\x48\x19\x38\xd9\x02\x44\x89\xff\x17\x84\x6a\x10\x2b\x49\xcf\x67\
+\x84\x79\x0e\x99\x32\x80\xec\x95\xc6\x87\x05\xc9\x4b\x46\x98\x20\
+\xae\xc5\x0d\xe1\x0a\xa3\x06\x52\xb0\x80\x94\x81\xb1\x10\x10\x25\
+\xa0\xd7\x02\xb1\xea\xa2\xd1\x2e\xa7\xfd\x8a\x02\xf2\x3d\x70\x7c\
+\x40\xbe\xd5\x53\x96\xff\xbb\x24\x19\x61\x82\xb8\xea\x0a\x02\xdc\
+\xaf\x9b\x14\xeb\x1e\xd0\x3a\x03\x20\xef\xa8\xee\xb1\xaa\x8f\x61\
+\xc9\x88\x9e\xc0\xf1\x0d\x81\x78\xef\xb2\xb1\x3e\x16\x91\x8a\xd2\
+\xe9\x59\xfe\x9d\x97\x1c\x30\xfc\xad\x69\x3a\xd1\x0b\x84\xeb\xdb\
+\xa4\x3e\x9e\x4b\x51\x8d\xba\x65\xb2\x02\x5c\xf1\x01\xe1\x13\xa3\
+\x06\x52\x88\x00\x52\x91\x8c\x58\xf3\xd5\x40\xdf\xeb\x26\x2f\x80\
+\x5b\x21\x40\xd6\x25\x23\xd6\x7c\x36\x2e\x89\x45\xa4\x85\x26\x20\
+\xeb\x92\x11\x1f\x7c\x37\x2c\x27\x2f\x5a\x97\x0d\xe7\x5c\x6f\x97\
+\xee\xb5\x14\xf0\x2d\x9a\x6c\x5d\x0e\x19\x51\xb7\x4b\x17\x3b\xa4\
+\xd3\x51\x26\x52\x77\xca\xc7\x55\x74\xd1\xc2\x6a\x58\x44\xa4\x6e\
+\x53\xbf\x74\xad\x35\xe1\x9a\xa1\x18\x8a\x91\xb1\xc8\xa1\x3f\xe5\
+\xfc\x33\x8a\xfd\x06\x73\x42\xd1\xe3\xd7\x79\x9a\x4a\x00\x00\x00\
+\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xbd\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\
+\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\x02\
+\x0f\x02\x0b\x23\xa3\x5b\xb9\xd6\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\x02\x33\x49\x44\x41\x54\x68\xde\xed\xdb\x4d\x4f\x13\
+\x41\x18\xc0\xf1\x7f\x49\x4b\xb0\x45\x28\x27\x51\xf8\x32\x98\xf8\
+\x25\xf0\x4e\x08\x41\xad\x8d\x11\xce\x7c\x00\x0c\x11\x50\xc1\xa3\
+\x27\xce\x1c\x78\x57\x04\x8e\x1c\x2d\x2a\x7c\x01\x2e\xc8\x05\x12\
+\x7b\x60\x39\xd8\x01\x42\xf6\x99\xe9\xb6\xfb\x32\x8d\xcf\x24\x7b\
+\xd9\x79\x66\x3a\xfb\xdb\x76\x76\x3b\x2f\x39\x60\x00\x4d\x00\x17\
+\x39\x20\x50\x07\x00\x9e\x77\xa9\xc1\x6d\x52\x0c\xc5\x50\x0c\x67\
+\xca\x03\x7f\x84\xbc\x32\x90\x0b\x39\x7f\xde\x21\x9d\x6e\x2f\x50\
+\x08\x7b\x6a\x00\xf5\x90\xf3\x75\x5b\x65\xe6\xa2\xef\x1f\xfd\x1d\
+\x72\xa3\x57\x85\xf6\x8f\xea\xcf\x44\xfb\x0c\xc5\x50\x0c\xc5\x50\
+\x0c\xc5\x50\x0c\xc5\x50\x0c\xc5\x50\x0c\xc5\x50\x0c\xc5\x50\x8c\
+\xff\x19\xa3\xd0\x21\xd7\x56\x48\x03\xe3\x0b\xd0\xe3\x39\xc4\x18\
+\xf0\x2c\xce\x0a\xa5\x61\xbf\x00\x58\x03\x1e\x78\x0a\x31\x0e\x5c\
+\x59\xda\x3e\x1a\x37\x46\x00\xac\x7b\x08\xe2\x82\x48\x0c\xc3\x80\
+\x14\x3d\x81\x98\x68\x02\x22\x51\x8c\x00\xd8\xf0\x00\xa4\x59\x88\
+\xc4\x31\x02\x60\x33\x43\x90\xc9\x08\x10\xb1\x63\xac\x08\xe7\xb7\
+\x32\x00\x91\x20\x4e\x80\xc3\x34\x30\xca\xc0\x67\x21\x6f\x3b\x45\
+\x90\x17\x16\x88\x61\x5a\x98\x44\x6a\x05\xa3\x9f\x7f\xd3\x8e\xcb\
+\x42\xfe\x4e\x0a\x20\x2f\x05\x88\xe3\x06\x04\x69\x62\xd0\x00\x59\
+\x12\x62\xbe\x26\x08\xf2\x4a\x80\xf8\x7d\x07\x22\x75\x0c\x03\xf2\
+\x49\x88\xfb\x96\x00\x48\xa5\x49\x88\x4c\x30\x0c\xc8\x47\x21\x76\
+\x37\x46\x90\x8a\xf0\x19\xbf\x80\xa1\x90\xf8\x4c\x30\x0c\xc8\x07\
+\x0b\x48\xa9\x4d\x88\x6a\x44\x88\x4c\x31\x0c\xc8\xa2\x50\xe6\x7b\
+\x1b\x20\x36\x88\x27\x96\x72\x99\x62\x18\x90\x05\x0b\x48\x6f\xc4\
+\x36\xbc\x11\xea\xfa\xe9\x80\xf0\x02\xc3\x80\xcc\x0b\x65\xf7\x22\
+\x80\xb4\x03\xe1\x0d\x86\x01\x79\x6f\x01\x79\xe8\x28\xff\x56\x28\
+\x7b\x04\x3c\x6e\xb2\xfd\xde\x60\xb8\x40\xf6\x2d\x20\x71\x40\x78\
+\x87\x61\x40\xe6\x2c\x20\x7d\xf7\xe2\xa7\x2c\x10\x83\x11\xdb\xef\
+\x1d\x86\x0b\xe4\xe0\x0e\xc8\xb4\x10\x53\x6b\x01\xc2\x5b\x0c\x03\
+\xf2\xce\x02\x32\x13\x33\x84\xd7\x18\x2e\x90\xb0\xe3\x07\xf0\xa8\
+\x8d\x17\x35\xaf\x97\x3e\x06\xc0\xeb\x06\x88\x2b\xd5\x80\xa7\xc0\
+\x69\x9a\x83\x23\x59\x4c\x22\x55\x81\x59\x07\xc4\x48\xda\x10\xe6\
+\xab\x7b\x26\xe4\x25\xbd\x5c\x5a\xda\xf4\x73\x09\xfc\x8d\xa1\xfe\
+\xa8\xcb\xa5\xc7\xf2\x44\xdf\x89\x54\x4e\xf8\x06\x15\x13\x1e\x1c\
+\x2a\x09\xff\x93\xba\x75\xae\x35\xe3\x3e\x43\x31\x14\xa3\xc3\x52\
+\x0e\xdd\xca\x79\xf3\x94\xb9\x06\xe3\xdb\x11\x7e\xe1\x58\xb6\x71\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xb9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x07\x35\xfb\x3a\x43\x8b\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\x02\x2f\x49\x44\x41\x54\x68\xde\xed\xdb\xbb\x6b\x54\
+\x41\x14\xc7\xf1\xcf\x6a\x40\xc1\x20\x22\x11\xdf\x21\x8a\xb1\x88\
+\x8d\x9d\x20\x41\x30\x95\x95\xa8\x10\xd0\x56\x45\x0c\x62\xa1\x7f\
+\x80\x8d\x85\x0a\x41\x42\x48\x61\x1d\x08\x58\x09\x91\x28\x56\x16\
+\x66\x55\x04\xb1\x11\xe2\x83\x08\x2a\x84\x88\x58\x29\x88\xab\x82\
+\x16\x3b\x60\x58\xee\x3e\xbd\xd9\x44\x39\x07\xa6\xb8\x33\xb3\xe7\
+\x9c\xfd\xce\xe3\xce\x85\xdf\x14\x70\x08\xdd\xc2\xde\xc3\x14\x7e\
+\x45\x31\xb5\x22\x26\xc4\x1f\x0b\x18\x01\x23\x60\xd4\xb5\x0e\xdc\
+\xc3\x5c\x46\xdb\x00\x76\x65\xd4\x17\x31\x93\x53\xfc\xc3\xd8\xb4\
+\xe0\xf9\x03\x6e\xe7\xe4\xbb\x0f\xfd\x19\xf5\xb3\xb8\x9f\x51\xff\
+\xbc\x96\xb3\x89\x2a\xbb\xee\x50\x8e\x83\x31\x5d\xe1\x7b\x3a\x47\
+\xdf\x43\x55\xf2\x9f\x88\x65\x12\x7b\x46\xc0\x08\x18\x01\x23\x60\
+\x04\x8c\x80\x11\x30\x02\x46\xc0\x08\x18\x01\x23\x60\x04\x8c\x80\
+\x11\x30\x02\x46\xc0\x08\x18\x01\x23\x60\x84\x05\x8c\x80\x11\x30\
+\x02\x46\xc0\x08\x18\x01\xe3\xbf\x82\xb1\x46\x59\x32\xd0\x59\x51\
+\xdf\x89\x9d\x58\xb5\x14\x49\x75\xb4\x21\xc6\x46\x1c\xc0\x7e\xec\
+\x53\xd6\x7c\x6c\xa8\xd2\x77\x2f\xde\x28\x4b\x07\xe6\xf0\x1a\x8f\
+\x95\x35\x21\x0f\xf1\xe5\x5f\x84\xb1\x1e\xc7\x31\x98\x40\x34\x3b\
+\x03\x0b\xd8\x96\xca\x40\xaa\xfb\x86\xbb\xb8\xa9\x2c\x68\x29\x2d\
+\x77\x18\x3b\x70\x01\x27\xd3\x52\xc8\xd3\x56\xe3\x58\x2a\xf3\x18\
+\xc1\x0d\x7c\x5e\x6e\x7b\xc6\x3a\x0c\xe3\x25\xce\x2f\x02\x88\x4a\
+\xdb\x8c\x6b\x78\x87\x73\x79\x0d\x6a\x1e\x4e\x4e\x60\x14\x5d\x0d\
+\xf4\x9d\x55\xd6\x83\xbd\xc0\x5b\x5c\x44\x6f\x45\xfb\xf5\x34\xc3\
+\xfa\xb0\x07\x3d\x75\x06\x61\x0c\xa7\x70\x06\x4f\x17\x8b\x7e\x3d\
+\x4d\xd7\x5a\x8c\xab\xad\xba\xfd\x8e\x49\x9c\x4e\xeb\xbf\xd2\x1a\
+\xd1\x74\xf5\xe0\x2c\xee\xe0\x47\x8d\x58\xa5\xb4\x44\x0b\xe9\x77\
+\x4d\x6b\xba\x5a\x85\xd1\x8b\x57\x35\x12\xfb\x88\xcb\xd8\x52\x27\
+\x46\xb3\x02\xb7\xed\xb8\x82\x4f\x35\x62\x4f\xa6\x65\xda\x16\x18\
+\xe3\x35\x92\x29\xe1\x6a\xc6\xf9\x21\x2f\x18\x16\xcc\xca\xe1\x34\
+\xf3\xb2\xf2\x78\x82\x4b\xed\x80\x51\xad\x14\xb1\xbb\xc9\x18\x7f\
+\x2b\x7d\xec\x4b\xe7\x90\xac\x7c\x7e\x5a\x22\xe9\xe3\x08\x0e\xa6\
+\x43\x52\x3b\x6d\x26\x9d\x63\xc6\x32\xda\x56\xb6\xf2\x36\xe9\x4f\
+\xaf\xaa\x4a\x6b\xf4\x0e\xca\x2d\x3c\xc2\x91\x16\xfe\x4c\x57\xc6\
+\xf3\x60\x0b\x7e\x1e\x60\x2b\x8e\x36\xd0\xb7\xbb\x4a\x8c\x79\xe2\
+\xbe\x49\xdc\x37\x89\x4f\xf8\x80\x11\x30\x5a\xfe\x36\x29\xe2\x6b\
+\xa0\xf0\xec\x37\x24\xa6\x4c\x90\x46\x18\xbe\x34\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\xdc\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x08\x0b\xbd\xc3\x42\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\x01\x52\x49\x44\x41\x54\x68\xde\xed\xda\x21\x4b\x03\
+\x61\x18\xc0\xf1\xff\xc9\x45\xd1\xb2\x60\x10\x8b\x0b\x2b\x82\x30\
+\xd0\x05\xb3\xc9\x60\x30\xf9\x0d\xd6\x8c\x06\xa3\x61\xc1\x60\x5a\
+\xb6\x08\x06\xe3\xc2\x92\x7e\x02\x41\xc4\xa0\x20\x58\x0c\x03\x87\
+\x60\xb1\x6a\x50\x70\x8c\xf7\x45\x4e\xde\x39\x6f\xfb\x3f\x70\xe1\
+\x9e\x83\xe7\x76\xbf\xed\x79\x5e\x76\x77\x19\x70\x0c\x6c\x60\x74\
+\x73\xa0\x0a\xd4\xb5\xe0\x7e\x46\x83\xef\x10\x43\x0c\x31\x7e\x8c\
+\xec\x6b\x80\xce\x07\x8e\xc5\x56\x99\x03\xa0\x5b\x82\x6b\xdb\x01\
+\xf6\x03\xf9\x73\xa0\x15\xc8\xbf\xe4\xc0\x43\xa4\xd8\x6b\x24\xff\
+\x08\x5c\x95\x00\x63\x2d\x92\x7f\x8e\x7d\x7e\xdb\x44\x0c\x31\xc4\
+\x10\xe3\x97\x91\x8f\xf9\xfc\x47\xc0\xd2\x88\x6a\x2f\x97\x0d\x63\
+\x13\x58\xb1\x4d\x9c\x19\xce\x8c\x22\xf1\x06\xf4\x12\xd5\x9a\x03\
+\x2a\x65\xc6\xb8\x04\xb6\x12\xd5\x6a\x02\x6d\xdb\xc4\x99\x21\x86\
+\x18\x62\x88\xf1\x7f\xa2\x03\xbc\x4f\xe0\xd6\xf6\x97\x61\x9b\x88\
+\xf1\xa7\xff\x4d\xce\x80\xeb\x44\xe7\xdf\x03\x16\x06\xf6\xef\x80\
+\x93\x44\xb5\x1b\xc0\xf6\xa8\x07\xe8\x6e\xc2\x2f\xe3\x66\xa8\x76\
+\x27\x61\xed\xa6\x03\xd4\x99\x21\x86\x18\x62\x88\x21\x86\x18\x62\
+\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x4c\x51\x64\xc0\x21\xb0\
+\x1e\x38\xb6\x4a\xf8\x91\xfe\x2d\xe9\x5e\x1b\x68\x00\xb3\x03\xfb\
+\x7d\xd2\xdd\x52\x5c\x04\x6a\x81\xfc\x13\x9f\xb7\x17\x87\xe3\x02\
+\x26\xf7\xf9\x48\xd1\xed\xd4\x36\x71\x66\x88\x21\x46\xd1\xd5\x24\
+\xb6\x6a\x4c\x5b\xf4\x3e\x00\x87\x29\xa8\x51\xc2\x15\x79\x34\x00\
+\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\x76\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x04\x03\x1f\xad\x85\xd1\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\xec\x49\x44\x41\x54\x68\xde\xed\xd9\xa1\x0a\xc2\
+\x50\x14\x87\xf1\x6f\xb2\x28\x08\xe2\x43\x18\x05\xab\x61\xc1\xa7\
+\xd0\xe2\x83\x18\x6c\x56\x1f\xc6\x20\x58\xf6\x00\x46\xbb\xd5\xb8\
+\x60\x30\x08\x1a\x16\x2c\x67\x93\x89\xe5\xca\xf7\x87\x95\x33\x76\
+\xd9\xfd\x6d\xf7\x5c\xd8\x32\xe0\x84\x01\x58\xe7\xc0\x54\x07\x00\
+\x86\x3d\x0d\xde\x11\x43\x0c\x31\x3e\x26\x6b\x69\xa0\x25\xd0\x0f\
+\xea\x05\x70\x4b\x60\x6e\x3b\x60\x16\xed\x1a\xc0\x21\xa8\x5f\xda\
+\x06\xab\x80\x67\x70\x0c\x12\x79\xd0\xfb\x86\xfb\x5f\xb8\x4c\xec\
+\x19\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\
+\x62\x88\x21\xc6\x1f\x26\xff\xe2\x9a\xca\x37\xc3\x65\x22\x86\x3d\
+\xa3\x43\x36\xc0\x3d\x81\xb9\xad\x80\xf1\xaf\x06\xf3\x57\x81\x3d\
+\xc3\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\
+\x88\x21\x86\x18\xe9\x24\x03\x8e\x0d\xe7\x0a\xe2\xcf\x82\x25\xf0\
+\x48\x60\x6e\x13\x60\x14\xd4\xcf\xc0\x35\xa8\x6f\x33\xea\x4f\x61\
+\x06\x96\x2e\x13\x7b\x86\x18\x62\x74\xdd\x4d\xe6\x32\xd4\xbb\xcc\
+\x0b\xdb\x19\x29\xb5\xa9\xcc\xe7\xf4\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x01\x6f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x02\x38\xf8\xfc\xcb\x73\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\xe5\x49\x44\x41\x54\x68\xde\xed\xdb\x31\x0a\xc2\
+\x30\x14\x80\xe1\x5f\xe9\x20\x12\x10\xa4\x82\x93\xa0\x08\x9e\xad\
+\x07\xeb\x0d\x7a\x83\xce\x1e\x40\x28\x0a\x4e\x05\x41\x10\xc4\x55\
+\x47\x45\x12\x05\xc9\x24\xff\x83\x0e\x79\xa1\xef\x85\xaf\x6d\x3a\
+\x65\x00\xac\x81\x09\xc6\x05\xa0\x01\xee\x5e\x34\x43\x5f\x88\x67\
+\x88\x21\x86\x18\x5f\xa3\x00\x3a\x60\x1b\x99\x5b\x02\xd3\x48\xfe\
+\x08\x9c\x32\xf5\xdf\x00\xe1\x65\x7c\x05\x76\x99\x6a\xcf\x80\x45\
+\x24\x7f\x06\x0e\x91\x7c\xf7\xa9\x58\x9d\xd8\x75\xab\x8c\x0f\xa3\
+\x7d\xab\xdd\x66\xac\x5d\x25\xd6\x5f\xfb\x99\xb8\x67\x88\x21\x86\
+\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\
+\x62\x88\x21\x86\x18\x62\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\
+\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\xf1\x5f\x51\
+\x00\x73\x60\x1c\x99\x0b\x89\x7b\x4a\x60\x95\xa9\xff\x28\x32\xce\
+\x55\xbb\x4c\xe4\x43\xa2\xc7\x0d\x3c\x6f\xe2\x79\x13\xf7\x0c\x31\
+\xc4\xf8\xf9\x6f\xd2\x03\x7b\x29\xe8\x1f\x56\x5d\xa3\x76\xb7\xf5\
+\xc3\x9c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\x9e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x0a\x20\x23\x49\xd9\x2d\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\x02\x14\x49\x44\x41\x54\x68\xde\xed\x9a\x4d\x28\x45\
+\x41\x14\xc7\x7f\x4f\xcf\x67\x24\x25\x4b\x2b\xd9\x58\xfb\x58\xc8\
+\x82\x52\x16\x24\xb2\x60\x25\xb2\xb0\x60\x85\xd8\x52\x16\x56\x4a\
+\x94\x48\x62\x2b\x94\x14\x16\x4a\x94\x6c\x58\x88\x85\x8f\x7c\x95\
+\x95\x22\xca\x47\xd1\xb3\xb8\x53\xf7\xb9\x86\xde\xe3\x3e\xd7\x7d\
+\x73\xfe\x35\x8b\x39\xf3\xee\x34\xf7\x37\xef\x9c\x99\xd3\x3d\x01\
+\xa0\x14\xe8\x44\x44\x10\xc8\x05\x1a\x04\x05\x24\x08\x02\x81\x21\
+\x30\x04\x46\x14\x0a\xa8\x00\x5a\xac\x19\x8b\xe4\x94\xd9\x07\x06\
+\xc2\xfa\xd9\xc0\x98\xe3\x37\x93\xc0\x9a\x07\xef\x96\x06\x4c\x6b\
+\xec\x8f\x40\x73\xb4\x93\x35\x01\xa1\x08\x5a\x6f\xd8\x33\xb9\x9a\
+\xf1\x76\x8f\x36\x3a\xf3\x8b\xf5\xde\xc5\xd2\x4d\x06\x81\x3a\x89\
+\x19\xb6\xab\x4d\xaa\x7f\x85\x71\x30\x76\x80\x33\x87\x2d\x0b\x98\
+\xf5\x7b\x40\xfe\xc9\xe2\x6f\x80\x7a\x15\x88\xc2\x55\x06\xb4\x98\
+\xe8\x26\x7b\x40\x87\xc6\xde\x6d\x6a\xcc\x98\xd2\x1c\x99\x29\x26\
+\x07\xd0\x0e\xe0\x45\x6e\xa0\x96\x8e\x34\x97\x2c\xa3\x8f\xd6\x61\
+\xe0\x55\x60\x58\xba\x04\xe6\x05\x86\xad\x19\x81\x61\x6b\x1d\x78\
+\x12\x18\x96\x9e\x14\x10\x81\xa1\xb4\x29\x30\x6c\x1d\x08\x0c\x5b\
+\x87\x02\xc3\xd6\x85\xdf\x61\x04\x5d\x9c\xeb\x4d\x65\xb2\x69\x0e\
+\x7b\x3f\xd0\xe5\x87\x8d\x0e\xba\xbc\x80\x07\x0d\x8c\x6c\xd5\x8c\
+\x72\x13\xfc\x9e\xb4\xb9\x0d\x23\x5d\x62\x86\xad\x0c\x47\xff\x14\
+\xd8\xf5\xe8\xdd\x12\x81\x5a\xaf\x60\xa4\xaa\x05\x84\x6b\x8e\x8f\
+\x9f\x12\xfe\x52\x99\x7c\xf3\x59\x20\xd6\x6e\x92\xaf\xb1\x9d\x99\
+\x1a\x33\x0a\x34\xb6\x73\x81\xe1\xd3\x5b\xa9\x9b\x30\x2a\x1c\xfd\
+\x4b\xe0\xca\x44\x18\x39\x40\xa1\xc3\xb6\x65\xea\x3d\xa3\x5a\x33\
+\xd7\xaa\xa9\x30\xda\x1c\xfd\x67\x60\xd1\x44\x18\x25\x7c\xae\xef\
+\x58\x02\xee\x4d\x84\xd1\xa7\xb1\x8d\x9a\x98\x9b\x54\x02\x35\x0e\
+\xdb\x36\xb0\x61\x1a\x8c\x64\x60\x44\x63\xef\x37\x31\x6b\x1d\xd2\
+\x5c\xc1\x97\x81\x15\xd3\x60\x34\xf2\xb9\xf8\xed\x19\x7d\x99\x42\
+\x5c\xc3\xc8\x07\x26\x34\xf6\x1e\xbf\x25\x66\xd1\x28\xd2\x6a\xbf\
+\x10\xb0\x80\x55\xdb\xf5\x9f\xe4\x49\xb5\xdf\x09\x56\xf9\x52\xc8\
+\xef\xbb\xff\x5b\x18\xd7\x40\x15\x70\x1b\x0f\xae\x10\x04\x8a\x80\
+\x56\xcd\x58\x5e\x04\xcf\x1f\xf3\x7f\xeb\xb8\x92\xbe\xb0\xa7\x02\
+\xe3\x6e\xc4\x86\xb8\x6e\x52\x48\x1f\x83\xac\x55\x60\x08\x8c\x38\
+\x56\x40\x9d\x1a\xe5\x82\x02\xde\x01\xb9\xce\xad\x29\x36\xe7\x60\
+\x02\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xf7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\
+\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\x02\
+\x0f\x02\x0b\x1b\x8b\x59\x01\x48\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\x02\x6d\x49\x44\x41\x54\x68\xde\xed\xdb\x5b\x4f\x13\
+\x41\x14\xc0\xf1\x7f\xe5\x96\x20\x86\x96\x9b\x2f\x1a\x7d\x15\xd2\
+\x54\x2e\x9f\xc1\x57\xc0\xbb\x1f\x81\xef\xa0\x1f\x87\xc4\x27\xb0\
+\x14\x28\xd7\xf8\xc0\x07\xf2\x41\xa8\x05\x4c\xf4\x81\x53\x35\xeb\
+\xcc\xb6\xdb\xce\x9e\x1d\xc2\x39\x49\x5f\xa6\xbb\x33\x67\x7e\x3b\
+\x9d\xc9\xee\x4e\x4b\xc0\x04\x30\x82\xc5\x35\xc0\x2e\xf0\xcb\x3e\
+\xec\xde\xb3\x01\xf1\x37\x0c\xc3\x30\x0c\xa3\x6b\x0c\x03\xe7\xc0\
+\x37\xc7\x77\xf7\x81\x51\x47\x79\x0b\xb8\x0c\xd4\xfe\x03\xc9\xa1\
+\x13\x3f\x81\xef\x81\xea\x1e\x03\xc6\x1d\xe5\x57\xc0\x85\xa3\xfc\
+\x3c\xad\xb2\x4d\xcf\xac\xbb\x11\xf0\x62\x9c\x25\xea\x3e\x0b\x58\
+\xf7\x86\x27\xff\x4d\xfb\x99\xd8\x9c\x61\x18\x86\x61\x18\x86\x61\
+\x18\x86\x61\x18\x86\x61\x18\x86\x61\x18\x86\x61\x18\x86\x71\x97\
+\x31\x86\x6e\x49\xdf\x86\x34\x30\x3e\x02\xcf\x22\x87\x98\x07\x3e\
+\x69\x60\x3c\x04\xbe\x4a\x83\x31\xc6\x82\xe4\x37\xa7\x35\x67\xc4\
+\x0a\xd2\x37\xc4\xa0\x13\xe8\x9c\x34\xbc\x10\x09\x44\x55\xf2\x99\
+\x2d\x6a\x35\x89\x05\xa4\x0a\x9c\x0e\x02\x11\x6a\x69\x9d\x15\x90\
+\x6a\x41\x10\xb5\x10\x10\xfd\x62\x34\xb9\x79\x11\x93\x04\x39\x2d\
+\x00\xa4\x06\x1c\x3b\x20\xae\x80\x3d\x0d\x8c\x06\xf0\x21\x05\xa4\
+\xa6\x08\x71\xe2\x81\x78\xa7\x85\x01\xb0\x05\xbc\xf7\x80\x1c\x2b\
+\x80\x3c\x17\x88\x19\x07\xc4\x5b\xe0\x8b\xf6\x9c\xb1\x9d\x02\x72\
+\x22\x09\x6b\x43\xbc\x01\xea\x45\x4d\xa0\xdb\x72\x25\x92\x20\x33\
+\x32\x42\x42\x83\x2c\x0a\xc4\xb4\x03\xe2\x35\xb0\x53\xf4\x6a\x52\
+\x4f\x01\x09\x39\x42\xd2\x20\x5e\xc9\x5c\x16\xc5\x5d\x6b\x5d\x86\
+\x68\x12\x64\x5a\x3a\xb0\x38\x60\xfd\x4b\x52\xcf\x94\x03\xe2\x25\
+\x37\xfb\xd2\xa2\xba\x85\xdf\x91\xa1\x1a\x1a\x24\x0d\x62\xbd\x9f\
+\x55\x43\xeb\x79\x46\xc3\x03\x32\x25\x1d\x5a\xca\x58\xdf\xb2\x9c\
+\x57\x71\x40\xac\x01\xfb\xb1\x3f\xdc\x69\xc8\xd0\x1d\x14\xc4\x07\
+\x71\x29\x10\xcd\x18\x1e\xee\xf4\x12\x7b\x1e\x90\x8a\x74\x70\xb9\
+\xcb\xf9\x2b\x72\x5c\x59\x0b\x22\x4f\x8c\x0e\xc8\x7a\x1f\x20\x3e\
+\x88\xb6\x40\x1c\xe4\x95\x70\xde\xcf\x40\xf7\xa5\x03\x49\x90\xb2\
+\x74\xf8\x49\xa2\xfc\xa9\x94\x4f\x6a\x43\x68\x60\x74\x6e\xec\xd6\
+\xf8\x7f\x87\x60\x19\x78\x9c\x28\x7b\xe4\x80\xf8\x21\xe7\x1f\xe6\
+\x9d\xa8\xd6\xd3\xf1\xa6\xfc\x64\xb2\x6e\x99\x54\x83\xd0\xc4\xf8\
+\x77\x84\xb4\x7b\x3c\xbe\x25\xc7\x1f\x69\x25\xa8\xfd\xde\xe4\x40\
+\x46\x48\x3b\x36\x88\x22\x30\x3a\x20\x69\x23\xa4\x05\xac\xca\x8d\
+\x9e\x6a\x94\x80\xcf\xc0\x0b\xc7\x77\x79\x6f\x97\xf6\xfd\xe9\xe7\
+\x9a\x2e\x5b\x97\x7b\x8c\xac\xdb\xa5\x8f\x86\x25\xa9\x4a\x86\x46\
+\xc6\x3d\x8d\x84\x8a\x91\x8c\xf9\x64\x8d\x51\xcf\x45\x9e\xb0\x77\
+\xad\x05\xcf\x19\x86\x61\x18\xb7\x2c\x4a\xd8\x5f\x39\xff\xac\x62\
+\xbf\x01\xf5\x9d\xd3\x0f\x74\xaa\x37\xd0\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x63\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x07\x2d\xe8\x56\xdb\xdd\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\x02\xd9\x49\x44\x41\x54\x68\xde\xed\xdb\x4d\x68\xdc\
+\x45\x18\xc7\xf1\xcf\xb6\xa9\x79\x91\x12\x0f\x0a\x16\x4a\x90\x52\
+\x31\x6d\x72\x2a\x48\xb5\x4a\x43\x15\x6f\x16\x41\xe3\xa5\x60\x91\
+\x36\x68\x4f\xa5\x97\x7a\x53\xef\x3d\x88\x04\xe9\xc1\x78\x10\xf1\
+\xd0\x2a\xc5\x4b\xbd\x58\x08\x82\x60\xa3\x17\x41\x31\xb4\x35\x98\
+\x52\xa5\x3d\x14\x92\xf8\x92\x6a\x13\x9b\xf4\xf0\x1f\x68\x18\x66\
+\x5f\x62\x36\xd9\xa4\xf3\x7f\x60\xd8\x9d\xdf\x7f\xd9\x99\xfd\xce\
+\xcc\x33\x6f\xcf\x56\xb0\x13\xcf\x29\x0d\x1c\xc2\x62\x99\x2c\x6e\
+\x2a\xfb\xc2\x3d\x2b\x61\x94\x30\x4a\x18\x75\xad\x0d\x13\xf8\x30\
+\xf1\xac\x91\x59\x66\x12\x17\xd6\xe9\x6f\x7b\x00\xaf\x27\xf4\x39\
+\x7c\xbc\x1a\xb3\xcc\x7f\x78\x71\x9d\xc2\xe8\xae\x52\xe7\x99\xd5\
+\x1a\x26\x9b\xf1\x29\xfa\x4b\x9f\x71\xaf\x05\x3e\x43\x57\x8e\x30\
+\x7e\xc1\x6c\xa4\xed\xc2\x7b\x39\xc2\xb8\x82\xa3\x09\xfd\x4d\x1c\
+\xc8\x71\x98\x9c\xc5\xfb\x09\x7d\x38\xcc\x50\xd9\xf9\x8c\xb7\x70\
+\x29\xd2\xfa\x71\x24\x47\x18\xf3\x38\x9e\xd0\x4f\x6e\xd4\xde\xb1\
+\xd2\xd9\xe4\x02\xbe\x48\x2c\xd6\x5e\xce\x75\x6a\x3d\x95\xd0\x8e\
+\xe5\x0a\x63\x2c\xa4\xa5\x36\x80\x47\x73\xdd\xa8\x9d\x4e\x7c\xef\
+\x60\xae\x30\xbe\xc4\x9d\x48\x7b\x21\x57\x18\x53\xb8\x18\x69\x4f\
+\xa3\x92\xeb\x79\xc6\x68\x94\x7f\x04\x8f\xe7\x0a\x63\x3c\xa1\x65\
+\x0b\xe3\xe7\x84\xb6\x23\x57\x18\x57\x12\xda\x63\xb9\xc2\x98\x0b\
+\x69\xa9\x75\xe6\x0a\x03\xfe\x8a\xf2\x0f\xe6\x0c\x23\x3e\xf4\x69\
+\xcb\x19\x46\x3c\x2c\xee\xe4\x0c\x63\x6b\x94\xff\x3b\x57\x18\x6d\
+\xe8\x88\xb4\xdb\xb9\xc2\x48\xad\x29\xae\xe6\x0a\x63\x57\x42\xfb\
+\x35\x57\x18\x7d\x09\x6d\x22\x57\x18\x03\x51\x7e\x1a\x97\x73\x84\
+\xd1\x89\xfd\x91\xf6\x2d\x16\x72\x84\xf1\x7c\x62\x26\x19\xb5\xc1\
+\xac\x59\x2b\xc4\xa1\x28\xbf\x80\xcf\xeb\x94\xbb\x4d\x71\xe6\x51\
+\x51\xdc\xd7\xfe\x13\xf6\x36\xb3\xb8\x81\x3f\x36\x22\x8c\x9d\x38\
+\x18\x69\xdf\xe0\xb7\xf0\xbe\x03\x4f\xe1\x19\xec\xc3\x6e\x6c\x6f\
+\xa0\xec\x29\x45\xfc\xc7\xf7\x61\xc8\x7d\x8d\xdf\x5b\xd5\x6b\xaa\
+\xc5\x67\x9c\x8f\x3e\x37\x9c\xf8\xcc\x6b\x8a\xb8\x8d\x4f\x42\x0b\
+\x37\x2b\x22\x6f\x0c\x27\x42\xaf\xaa\x67\xcb\x8e\xcf\x58\x29\x8c\
+\xde\xd0\xb5\x97\x3e\x5f\x08\x2d\xba\x9a\x61\x8a\xff\xe2\x23\x3c\
+\xd1\x4c\x18\x2b\x75\xa0\xc3\xd8\x12\x69\x95\x35\x38\xd4\x69\x57\
+\x44\x02\x8c\x63\x04\x0f\xb7\xda\x67\x0c\x59\xfe\x75\xc0\x14\x7e\
+\x54\x5c\x58\x5f\x0a\xad\x34\x1b\x5e\xdb\xc3\xf9\xc7\x43\x8a\x0b\
+\xa8\xbe\xe0\x5f\x7a\x6b\xd4\x73\x53\xa8\xc7\xa0\xe2\x22\x7c\xa4\
+\x15\x3e\x63\x4f\xf0\xfe\x8d\x74\xe9\x1f\xf0\x36\x9e\xf4\xff\xae\
+\x0e\xba\xf1\x4a\x18\x16\x53\x75\xca\x3a\x17\x60\xae\x99\xcf\x18\
+\x0b\x7b\x8e\x5a\x95\x9a\xc3\x19\xc5\xdd\x49\x33\xad\x0b\x6f\xe0\
+\xa7\x1a\x65\x4f\x2a\x42\x23\xd6\x04\x46\xbd\xf4\x55\x95\x4d\x5b\
+\x33\xad\x82\xc3\xb8\x5e\xa5\x0e\xd3\x78\xa9\x95\x30\x6e\x5a\xfb\
+\x50\x84\xad\xf8\xa0\x4a\x7d\xe6\x5b\x05\xe3\x3b\xf4\xb4\x70\x25\
+\xfd\x2a\xfe\x6c\xb0\xae\x33\xb5\xba\x5b\x0f\xf6\x26\x9e\x3d\x2b\
+\x1d\x99\x13\xdb\x24\xde\x59\x07\xa7\x5a\xbd\x78\x57\x11\x9b\x5a\
+\xcb\x6e\x49\x47\x0e\xaf\xc8\x37\x94\xff\x37\xb9\x9f\xad\x84\x51\
+\xc2\x28\x61\x34\xb4\x37\xb9\x56\xe7\x20\x26\x1b\xbb\x0b\x8a\xcf\
+\xbf\x6f\x9f\xf5\x6a\xf1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x01\xc7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x04\x30\xa0\x7d\xe4\xc7\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\x01\x3d\x49\x44\x41\x54\x68\xde\xed\xda\xa1\x4e\xc3\
+\x50\x14\x80\xe1\xbf\xa4\x9e\x09\x04\x62\x02\x81\x40\x20\x96\x40\
+\x60\x82\x07\x40\x22\x78\x04\x04\x7b\x03\x04\x12\x81\x44\x22\xb0\
+\x73\x08\xc4\x04\x7e\x08\x48\x58\x82\x40\x20\x10\x84\x20\x26\x08\
+\x61\x09\x1e\x04\x24\x34\xe4\x0c\xb2\xe5\x60\xb6\xff\x24\x15\xf7\
+\x34\x3d\xb7\xfd\xda\x7b\x2a\xda\x02\x38\x02\x36\x30\x2e\x4a\x60\
+\x11\x58\xd1\x82\xfe\x8c\x06\xdf\x21\x86\x18\x62\xfc\x19\xc5\x57\
+\x03\x9d\x0d\xf6\x1d\x00\x9b\x41\xfe\x10\x38\x4d\x9a\xff\x04\x68\
+\x54\xc6\x37\xc0\x4e\x52\xed\x6d\x60\x2f\xc8\x9f\x03\xfb\x41\x7e\
+\x50\x02\xf7\x43\x8a\xbd\x0c\xc9\x3f\x02\xbd\xa4\x13\x7e\x0b\xc6\
+\x59\xb5\xd7\x7e\xb9\xae\x9e\xcb\xc4\x9e\x21\x86\x18\x62\x88\x21\
+\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x4c\x51\xb4\
+\x81\xf7\x09\xdc\xda\x3e\x19\x2e\x13\x31\xc6\x8e\x72\x8c\x63\xce\
+\x80\xcb\xa4\xf9\x77\x81\x85\xca\xf8\x01\x38\x4e\xaa\xdd\x04\xb6\
+\xfe\xbb\x81\xb6\x12\x6f\x46\xf7\x47\xed\x6e\x62\xed\x96\x0d\xd4\
+\x9e\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\
+\x21\x86\x18\x62\x4c\x51\x14\x7c\xfe\x09\xbc\x1e\xec\x5b\x06\xe6\
+\x83\xfc\x1d\xf0\x94\x34\xff\x2a\x50\xab\x8c\x5f\x81\xeb\xa4\xda\
+\x75\x60\x29\xc8\xf7\x81\xdb\x20\x7f\x05\xd0\x61\x32\xbf\x8f\x8c\
+\xba\x75\x5c\x26\xf6\x0c\x31\xc4\x18\xf5\x6d\xd2\x00\xe6\xa4\xe0\
+\xf9\x03\xc6\x6f\xa8\x02\xb1\x08\xb6\x06\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\x9e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x02\x2c\xe2\x26\x1f\x0e\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\x02\x14\x49\x44\x41\x54\x68\xde\xed\xdb\x4f\x88\x4d\
+\x61\x18\xc7\xf1\xcf\x35\x57\x24\x93\xff\x93\xb2\x31\x1a\x1b\xa5\
+\x6c\x94\x61\x2d\xf2\x67\x2f\x92\x2c\x58\x59\xd9\xa8\x29\x0b\xb1\
+\x10\xd9\x33\x25\xd9\x49\x62\x61\xc1\xc2\x6a\x76\x42\x8d\x92\x66\
+\x81\x85\x22\x0d\xa3\x69\x58\x90\xc6\x58\xdc\x53\x73\xbd\xf3\xce\
+\x5c\x69\x6e\xcd\x9d\xe7\xfd\xd5\x59\xbc\xbf\xd3\xa9\x73\xbe\x3d\
+\xe7\x79\x9f\xe7\xbc\xef\xa9\x61\x2d\x7a\x15\x81\xa3\x98\x2a\x87\
+\xa9\x25\x25\x16\xa6\x55\x60\x14\x18\x05\x46\x4b\xd5\xf1\x15\x2f\
+\x32\xe7\xfe\x65\x96\xf9\x84\x0f\x0b\xf4\xd9\xba\xb0\x23\xe3\x4f\
+\x62\xb8\x1d\xb3\xcc\x28\xfa\x16\x28\x8c\x55\xb3\xdc\xf3\x78\xbb\
+\x5e\x93\x0d\x78\x84\xf5\x25\x67\x34\xd4\x87\x5b\xa8\x45\x84\xf1\
+\xa5\x0a\xb7\x66\x1d\xc2\x99\x88\x30\x9e\xe2\x72\xc6\xbf\x82\xad\
+\x11\x5f\x93\xf3\x78\x92\x78\xcb\x71\x2d\x22\x8c\x49\x1c\xc3\x58\
+\xe2\x1f\xc6\xde\x88\x09\x74\xb4\x8a\x90\x54\x17\xa2\xce\x26\x83\
+\x78\x9e\x78\xfd\xd8\x15\x11\xc6\x24\x2e\x65\xfc\xb3\x51\xeb\x8c\
+\x87\x78\x93\x78\x07\xb1\x32\x22\x8c\xdf\xb8\x91\x78\x2b\xaa\x64\
+\x1a\xb2\x6b\x7d\x90\xf1\x0e\x44\x85\xf1\x16\x23\x89\xb7\x27\xf2\
+\xf7\x8c\xc7\xc9\xb8\x17\x1b\xa3\xc2\x78\x99\xf1\xb6\x47\x85\xf1\
+\x3a\xe3\x6d\x8e\x0a\x63\xa4\xc0\x98\xd6\x44\x55\x84\x35\x6b\x4d\
+\x54\x18\xf0\x2d\x19\x2f\x8b\x0c\x63\x22\xd3\xd6\x87\x85\xb1\x54\
+\x07\x6b\xbe\x61\x74\xb7\x88\x94\x30\x30\x6a\x99\xe6\xec\x57\x54\
+\x18\x9b\x32\xde\xc7\xa8\x30\xb6\x65\xbc\x77\x05\xc6\xdf\x0d\x5c\
+\x48\x18\x3b\x93\xf1\x0f\xbc\x8a\x08\xa3\x0b\xfb\x13\xef\x19\x7e\
+\x46\x84\xd1\xaf\xb1\x6a\xdf\xac\xa1\xa8\x75\xc6\x91\x8c\x77\x2f\
+\x22\x8c\xd5\x38\x91\x69\xe7\x87\x23\xc2\x38\x95\x29\xb6\x6e\x47\
+\x2c\xc7\xd7\xe1\x5c\xe2\x8d\x6b\x2c\x2e\x85\x83\x71\xb1\x02\xd2\
+\xac\xeb\xe6\xd8\x1d\xb3\x58\x61\xec\xc6\xe9\xc4\xfb\x8c\xab\xd1\
+\xba\xd6\x1e\xdc\xad\xea\x8b\x66\x0d\x68\x6c\x98\x0b\x03\xa3\x0b\
+\x77\x32\x8d\xd9\x10\x6e\xea\x60\xd5\xff\xe3\x9a\x7d\x66\xee\xdf\
+\x1a\xc3\x71\x33\xb7\x37\x2d\xfa\xc8\x48\x41\x4c\xe1\x24\xde\xeb\
+\x70\xcd\x47\x9d\x31\xa0\xb1\x12\xdf\xf1\xaa\x57\x05\x53\xcf\x2c\
+\x49\xb2\x95\xee\x57\x89\x74\xcb\x02\x7c\xb6\xee\x39\x02\x60\xd6\
+\xfb\x2d\xff\x9b\x94\xff\x4d\xda\xd7\xb5\x16\x18\x05\xc6\x22\x56\
+\x1d\xdf\x75\xd8\x57\xec\x76\xe9\x0f\x34\xc7\xdb\xc6\x22\x99\x78\
+\x07\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x12\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\
+\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\x02\
+\x0f\x02\x0a\x14\x02\xfd\x2d\x98\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\x02\x88\x49\x44\x41\x54\x68\xde\xed\xdb\x39\x6b\x14\
+\x51\x1c\x00\xf0\xdf\xea\x2a\x98\xc6\xc6\x4a\x30\x5e\x11\x6d\xfc\
+\x04\x5a\x18\x35\x6a\x8c\x57\x65\x23\x12\x15\xf1\x88\xa9\xfc\x02\
+\x82\x95\x85\x85\x88\x8d\x95\x8a\x5d\x14\xf1\x6c\x6c\xbd\x0f\x24\
+\x68\x93\xc2\x78\x0b\x82\x07\xd9\x88\xd8\x78\x15\x99\x85\x64\x99\
+\x37\x1a\x77\xd9\x99\xec\xcc\x1f\xb6\xd8\x37\xc3\x9b\x99\xdf\xbc\
+\x99\xf7\x7f\xf3\x66\x4a\x68\xc3\x59\x45\xc0\xb1\x12\x66\x63\xa4\
+\xb0\x00\x9b\xa6\x15\x06\x13\xa3\x00\x29\x40\x0a\x90\x49\x45\x09\
+\x33\xb0\x2d\xb0\x7c\x20\x50\xbe\x3d\xa1\xce\xe3\x68\x1f\xf7\xff\
+\x09\x8e\xc5\xac\xb7\x0a\x7d\x31\xe5\x5f\x71\x18\x95\x06\x1c\xdf\
+\x51\x2c\x8b\xeb\x4d\xa2\xfd\xaa\x8d\xdb\x7f\xab\xf0\x77\xe0\x97\
+\x14\x4f\x6b\xd6\xbd\x1e\xc0\xf8\x16\x53\xef\x28\x56\x36\xf0\x84\
+\xdf\x0a\xec\x7f\x4f\x96\x2e\x99\xd5\xb8\x11\xe5\x3f\xe3\x63\x14\
+\xdd\xff\x72\x96\x5a\xe9\x1e\xb2\x06\xd7\x02\x18\x1b\x71\x27\x4f\
+\x37\xd5\xb5\xb8\x9a\xd0\x32\x52\xc7\x68\x26\x48\x17\xae\xc4\x60\
+\x54\x22\x8c\xbb\x59\xe9\x65\xca\x4d\xd8\xc6\x72\x5c\x4e\xc0\xb8\
+\x97\xa5\x6e\xb7\x19\x20\xed\x31\x65\x15\x6c\xc0\xfd\xac\xe5\x21\
+\xe5\x14\xb6\x59\xc1\x7a\x3c\xc8\x62\x62\x56\x4e\x01\x63\x1d\x1e\
+\x66\x35\x53\x2d\x37\x19\xa3\x0b\x8f\xf2\x34\x96\xe9\xc6\xd2\x98\
+\xf2\x91\xa8\xdb\xcd\x34\x46\xa3\x41\xba\xa3\xde\x64\x66\xa0\x65\
+\x3c\xce\xd3\x68\xb7\x27\x80\x51\x1d\x30\x4d\x09\x8c\x46\x81\xf4\
+\xe0\x52\x00\x23\x77\xcf\x43\x36\xb7\x12\x46\xbd\x20\x5b\x70\xb1\
+\x95\x30\xea\x01\xd9\x8a\x0b\x31\x18\x5f\xf0\x31\x8f\x20\x03\x31\
+\x18\x9f\xa3\xae\xf5\xc3\x54\x06\xf9\xdf\xc4\x2c\x84\x31\x18\xb3\
+\x6e\x27\x86\x53\x3a\xbe\xb9\x69\x64\xaa\x9f\xa2\x3c\x63\x30\xb0\
+\xbc\x0d\x8b\xf2\xd4\xed\x9e\x4c\xc0\xc8\x5d\xb7\x0b\x47\xb0\xa3\
+\x55\x40\x1a\x71\xc9\x4c\xc7\xb9\x08\xf7\x3c\x6e\x62\x28\x23\xc7\
+\xd7\x89\x39\x8d\xac\x30\x34\x0d\xf1\x2e\xa6\xec\x07\x76\x66\xec\
+\x84\x37\x6d\x1a\xa2\x13\xef\x63\x5a\xca\x19\xf4\x6a\xe1\x48\x9a\
+\xa8\x5a\x82\xb7\x81\x96\xd2\x3b\x55\x5b\x48\x3d\x20\xd0\x91\x80\
+\xb2\x2b\x8f\x20\xb0\x18\x6f\x02\x28\xbb\xf3\x08\x92\x84\xf2\x33\
+\x65\x94\xd4\x40\x44\xd9\xe8\xeb\x00\xca\x9e\x3c\x82\x24\xa1\xfc\
+\x4a\x09\x25\x75\x10\x58\x88\x57\x01\x94\xbd\x79\x04\xc9\x12\x4a\
+\x66\x40\x60\x41\x02\xca\xbe\x3c\x82\x54\x51\x5e\xa6\x88\x92\x39\
+\x10\x98\x9f\x80\x72\x20\x8f\x20\x55\x94\x17\x29\xa0\x64\x16\x84\
+\xb1\xd7\x22\x42\x28\x07\xf3\x08\x52\x45\x19\x0e\xa0\xf4\xe5\x11\
+\x04\xe6\x25\xa0\x1c\xca\x23\x48\x15\xe5\x79\x00\xa5\x3f\x4d\x90\
+\x32\x66\xe1\xc4\x24\x37\x74\xba\x01\x3b\x3b\x14\x0d\x0a\xc7\x47\
+\xc9\xd8\x43\xeb\x15\xc6\xde\x4e\xac\x37\x3a\x02\xe5\xfd\xc6\x66\
+\x1e\x6b\xe3\x54\xf1\xbd\xcc\xc4\x28\xbe\x97\xa9\x8d\x02\xa4\x00\
+\x29\x40\x26\x15\x65\x7c\xc7\xfe\x82\x02\x3c\xfb\x03\xc1\xfc\x98\
+\xc9\x91\x70\x72\xe2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x02\x97\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\
+\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\x02\
+\x0f\x02\x06\x07\x2a\xf6\x23\x4a\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\x02\x0d\x49\x44\x41\x54\x68\xde\xed\xdb\x3b\x6f\x53\
+\x31\x14\xc0\xf1\x3f\x34\x62\x65\x85\x52\x1e\x2d\xea\x63\x61\xe9\
+\xcc\xc2\xcc\xc0\xc6\xc2\x02\x7d\xab\x42\x25\xaa\x2a\x14\x5e\x45\
+\x94\x2f\xc0\x0e\xdf\x86\x9d\x05\xa9\x09\x51\x69\x0b\x7d\xe6\x0b\
+\x14\xb5\xaa\x68\x87\xa4\x12\x44\x3e\x56\xee\xcd\x8d\x7d\xec\xf8\
+\x48\x59\x4e\xae\xed\xf8\x27\xe7\x38\x0f\xdf\x4b\xc0\x24\x50\x21\
+\x05\xc0\x53\x80\x87\xc0\x59\x7a\x70\x06\x5c\xbd\x9c\x16\xc5\xff\
+\x91\x40\x12\x48\x02\xc9\x14\x25\xe0\x1b\xf0\xd8\xf0\xdc\x04\xb0\
+\x66\xc8\xd7\x80\x55\xa5\xf3\x79\x02\x3c\xea\x70\x37\x39\x32\xe4\
+\x8f\x6c\x8d\xee\x0b\x95\xf8\xab\x52\x8c\x67\xc0\x69\xa7\xbb\x49\
+\xec\x6f\x99\x29\xe0\x0b\x30\x90\x6a\x48\x13\xe3\xb3\x61\x2e\x8d\
+\x7e\x04\x99\x6e\xad\x8c\xf6\x79\x1c\x02\x0f\x8a\x1e\x4c\x7b\x0d\
+\x99\x01\xfe\x1a\x5e\xdf\x41\x6b\x43\x20\x4f\x0d\x09\x15\x64\x56\
+\xc0\xd8\xff\x07\xa3\x6f\x40\xe6\x2c\x18\xe3\x6d\xd7\x46\x0f\x22\
+\x61\xec\x19\x30\xa2\x07\x59\xc8\x88\x11\x35\x88\x84\xb1\x0b\x8c\
+\x59\xda\x45\x09\xb2\x98\x13\x23\x4a\x10\x09\x63\x07\x18\xed\xa0\
+\x7d\x54\x20\xcf\xbb\xc4\x88\x0a\xc4\x86\x71\x37\x43\x3f\x51\x80\
+\x2c\x09\x18\xbf\x33\x62\x44\x01\x62\xc3\x18\xc9\xd1\x5f\xd0\x20\
+\x2f\x04\x8c\x5f\x39\x31\x82\x06\x29\x5b\x30\x86\xbb\xe8\x37\x48\
+\x90\xb2\x30\xce\x76\x97\x18\x41\x82\x2c\xf7\x10\x23\x38\x10\x09\
+\x63\x0b\xb8\x53\xd0\x18\xc1\x80\xac\x38\xc0\x08\x06\x44\xc2\xd8\
+\x04\x6e\x17\x5c\x9f\xd4\x83\xbc\x74\x88\xa1\x1e\x44\xc2\xf8\x09\
+\xdc\xea\xd1\x67\x1b\xb5\x20\x15\x0f\x18\x6a\x41\x24\x8c\x0d\xe0\
+\x66\x8f\xbf\x17\xa9\x03\x79\xe5\x11\x43\x1d\xc8\x6b\x0b\xc6\x90\
+\xa3\xdf\x54\xd4\x80\xbc\x11\xda\xd6\x1d\x62\xa8\x01\x79\xab\x04\
+\x43\x05\xc8\x3b\xa1\xcd\x0f\xe0\x06\xee\xc3\x2b\xc8\xaa\x32\x0c\
+\xaf\x20\xef\x85\x6b\x6b\xc0\x20\xfe\xc2\x0b\xc8\x07\xa5\x18\x5e\
+\x40\x24\x8c\x2a\x70\x1d\xff\xe1\x14\x64\x4d\x39\x86\x53\x90\x8f\
+\x16\x8c\x6b\xe8\x09\x27\x20\xc7\x42\x7e\x5d\x19\x46\x2e\x90\x52\
+\x8e\x41\xae\x18\x72\x55\x9a\x67\xba\x1a\x04\x1e\x45\x1c\xba\x5b\
+\x8f\x05\xe3\x62\x85\xdc\xa3\xf9\x5f\x6a\x7b\x74\xba\xfc\xeb\x98\
+\x4f\x3c\x6b\x8e\x4f\xc0\x89\x21\x5f\x86\x74\xbf\x4c\xba\x5f\xa6\
+\xd7\x35\x24\x81\x24\x90\x3e\x8a\x12\xf0\x1d\x98\x4f\x14\x00\xfc\
+\x39\x07\x4e\x22\x30\x54\x3a\x0d\x90\xff\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\xc3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\
+\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\x02\
+\x0f\x02\x0b\x11\x6b\x8c\xe8\x56\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\x03\x39\x49\x44\x41\x54\x68\xde\xed\x9b\x4b\x68\xd4\
+\x40\x18\x80\xbf\xd4\xd5\xd2\xf4\x61\x2b\x48\x5b\x11\x41\x10\x41\
+\x41\x2f\x0a\x82\x27\x51\xa9\x07\x0f\x82\xa8\x07\x8f\x42\x5d\x6f\
+\x16\x11\xe9\xcd\x07\xe8\x45\x7c\xf7\xa9\x1e\x7b\x50\x3c\x68\xa9\
+\xe2\xb1\x3e\xaf\x0a\x8a\x0f\xac\x56\xd1\x83\x82\x4a\x8b\x2d\xdb\
+\xda\x4a\xd7\xc3\x8e\x18\xc2\x4c\x92\xcd\x63\xb2\x3a\xf9\x21\x2c\
+\xf9\xff\xc9\x3f\x93\x6f\x27\x33\xff\xfc\x93\x58\xc0\x02\xa0\x96\
+\x4c\x00\xd8\x0b\x14\xb3\x83\x62\x55\xd6\x17\xfe\x4a\x06\x23\x83\
+\x91\xc1\xf0\x95\x1c\x30\x03\x8c\x49\x6c\x41\x66\x99\x29\x60\xba\
+\x42\xef\xcd\x02\x1a\x25\xfa\x22\x30\x9e\xc4\x2c\x33\x02\x2c\xae\
+\x50\x18\x0b\x15\x6d\x1e\x4f\xea\x31\x59\x01\x0c\x01\x76\x36\x66\
+\x94\x64\x03\x70\xd6\x54\x18\x05\x89\x2e\x0f\xec\x34\x11\xc6\x30\
+\x30\x20\xd1\x5f\xa9\xe0\xf1\x23\xd1\xc7\x24\x0f\x3c\x73\xe9\x16\
+\x01\xa7\x4c\x84\x51\x00\x76\x4b\xa6\xd5\x7d\xc0\x7a\x13\x07\xd0\
+\x37\x92\x9e\x50\x05\x1c\x35\x75\x36\x39\x0d\xbc\x77\xe9\xb6\x03\
+\xab\x4d\x84\x31\x0d\x1c\x93\x44\x7e\x07\x4d\x8d\x33\xae\x01\xdf\
+\x5c\xba\x3d\x22\x9c\x37\x0e\xc6\x0c\xd0\xef\xd2\x35\x02\x6d\xa6\
+\xae\x5a\xaf\x4b\x74\x3b\x4c\x85\xf1\x1c\xf8\xe8\xd2\x6d\x34\x39\
+\x9f\x71\xd7\x75\xbe\x4a\x04\x62\x46\xc2\x78\x2a\x99\x55\xd6\x98\
+\x0a\xe3\x85\x44\xb7\xfc\x7f\x87\x91\x53\xe8\x5f\x55\x18\x8c\xf9\
+\x3a\x60\xb4\x01\xed\x12\xfd\x77\x4a\x99\x24\xa7\xa4\xb5\x8a\xad\
+\x51\xac\xac\x63\x87\x61\x89\xb8\x62\xbf\xc4\xf6\x23\xea\xbf\x13\
+\x13\x88\x9b\xc0\x36\x5d\x63\x86\x05\xf4\x89\xa5\xbc\x53\x26\x5c\
+\xe7\xba\xd3\x81\x36\x70\x2b\x0c\x88\xa8\x03\xa8\x05\xf4\x02\x07\
+\x5c\xba\xb4\xc4\x16\x3d\x22\x74\xe4\x9b\x8b\xd8\x00\x0b\xe8\x71\
+\x80\xa9\x77\xd9\x27\x35\x82\x18\x04\xb6\x46\x71\x92\x8b\xa1\x21\
+\x16\xd0\x2d\x7e\x1b\x5c\xb6\xd9\x7f\x05\x44\xd8\xc7\xe4\x09\x30\
+\x2a\x01\xd2\x25\x29\xfb\x45\x03\x88\x21\x05\x88\x1b\x3a\x60\x7c\
+\x06\x36\x29\x80\xb8\x65\x54\x03\x88\xcd\x12\xdb\x55\xc5\x6c\x97\
+\xc8\x00\xfa\x49\x00\x79\xe7\x53\xee\x43\x82\x20\xee\xf8\x80\x28\
+\xc6\x59\xa1\x6a\x7b\xf1\xb6\xa3\xcc\x52\xe0\xad\xa2\xdc\x2c\x50\
+\x97\x10\x88\x61\x45\x9d\xfd\x8e\x1e\x5a\xf6\xf6\x62\x54\x18\x7f\
+\x80\x8c\x48\xca\xcd\x11\x7f\xfa\xcf\x06\xee\x05\x00\x91\x1a\x0c\
+\x80\x2d\x8a\xb2\x73\x40\x47\x4c\x20\x6a\x81\xfb\x8a\x7a\x7a\x25\
+\x63\x56\x6a\x30\x4e\xe2\xbd\x5b\xdf\xa1\x19\x44\x6a\x30\x6a\x80\
+\xaf\xf8\xbf\xbe\x70\x28\x24\x88\x3a\xe0\x81\xc2\x67\xb7\x47\xd4\
+\x9b\x0a\x8c\x76\x49\x99\x9f\x31\x01\x09\x0b\x22\x15\x18\x36\xa5\
+\x4d\x24\xa7\x7d\x0a\x58\x07\xbc\x56\x5c\x7f\x38\x60\xfd\xf5\xc0\
+\x43\x85\x8f\xae\x00\xeb\x20\xed\x30\x4e\x48\xec\x7d\xc2\xb6\x24\
+\x02\x10\x2f\x10\x97\x02\x2e\x08\xb5\xc2\x58\x29\x7a\x81\xd3\x36\
+\x09\x2c\x73\xf8\x68\xf5\x00\x72\x44\x51\x6f\x03\xf0\x48\x71\xcd\
+\xc5\x32\x56\xc6\xda\x60\xd8\x94\xb6\x07\xdc\xb6\x4e\x89\x9f\x56\
+\x91\x12\x0c\x02\xc4\x0b\xc4\x85\x32\x53\x04\xda\x60\x0c\x48\xf4\
+\x2f\x81\x6a\x85\xaf\x16\x0f\x20\x9d\x0e\x10\x8f\x15\x65\xce\x87\
+\xc8\x95\x68\x81\x51\x50\xe8\xd6\xfa\xf8\x6b\x11\xc0\x64\x3e\x8f\
+\x7b\x80\x38\x17\x32\x69\xa4\x05\x86\xec\xc8\x07\xf4\xd9\xec\x01\
+\x44\x05\x22\xac\xa4\x02\xa3\xa7\x4c\xbf\xcd\x94\xf6\x58\xfc\xfc\
+\x9e\x89\x18\xb5\x6a\x87\x31\x08\xcc\x0b\xe1\xdb\x0f\x48\x54\x10\
+\xa1\x60\x58\xc0\x2e\xe0\xb2\xc4\x16\xe4\x75\xe9\x09\xe0\x57\xc8\
+\xc6\x56\xa3\xce\x9e\x8f\xc5\x94\x8e\x2c\xeb\x75\xe9\x9c\xb8\xe9\
+\xa6\x90\x15\xd6\x27\x94\xbc\x69\x22\x39\xb1\x54\xfe\xb3\xaf\x0a\
+\x32\x18\x19\x8c\x0c\x46\xb9\x83\x49\xf6\x29\xa7\x90\xdf\xeb\x61\
+\x37\x61\xcd\xc7\x11\xff\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x03\xa7\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\
+\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\x02\
+\x0f\x02\x07\x24\x91\x8a\x63\x79\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\x03\x1d\x49\x44\x41\x54\x68\xde\xed\xdb\xcd\x6f\x0c\
+\x61\x1c\xc0\xf1\xef\xe8\x12\xaf\x51\x2f\x89\x97\x06\x6d\x59\x24\
+\x1c\xd4\x4a\x13\x2f\x07\x84\x48\x54\x04\x71\xd2\x08\x1a\x1a\x11\
+\x71\xe0\xea\xd2\x43\xc5\xc5\x3f\xd0\x88\x8b\x38\xa8\x83\x83\x34\
+\x1a\xed\x89\x26\x42\x84\x93\x88\x78\xab\x16\x3d\x70\x68\x2b\x94\
+\xda\xb5\x0e\xfb\x6b\x6c\x37\xf3\xcc\x74\x66\x67\x67\x9e\xdd\x79\
+\x7e\xc9\x73\xd8\x67\x77\x9f\x79\xf6\xb3\xcf\xdb\x3c\xfb\xac\x05\
+\xcc\x00\x4e\x62\x02\xa0\xdb\x02\xe6\x03\xc3\xc6\x02\x80\x03\xd3\
+\x8c\xc1\xe4\x30\x20\x06\xc4\x80\x78\x8a\x04\x30\x0e\x74\x28\x9e\
+\x6f\x55\xe4\x77\x04\x70\xed\x1a\xa0\xc9\x26\x3f\x0b\xdc\x06\x46\
+\x03\xb8\xc6\x41\x60\xa9\xdd\x6c\x02\x0c\xd8\xe4\x0f\xb8\x15\x98\
+\x55\xa4\x62\x63\x05\xf0\xd6\xa6\xdc\xbf\xc0\xf9\x00\xbf\xf0\x47\
+\x8a\xfa\x37\xf9\x2d\xb0\x14\x20\x2b\x81\x77\x21\x60\x94\x05\x88\
+\x13\xc6\xb9\x12\x0c\x09\x5a\x83\xac\x02\xde\x87\x88\xa1\x35\x88\
+\x13\xc6\xd9\x12\x4e\x1a\x5a\x82\xd4\x02\x1f\x22\xc0\xd0\x12\xa4\
+\x16\xe8\x57\x60\xb4\x86\xb0\xac\xd0\x0a\xa4\x2e\x62\x0c\xad\x40\
+\xea\x80\x8f\x0a\x8c\xd3\x21\x2e\x3c\xb5\x00\xa9\xd7\x04\x43\x0b\
+\x90\x7a\x59\xfe\xda\x61\xb4\x44\x70\x6b\x12\x29\xc8\x6a\x05\x46\
+\x26\x22\x8c\x48\x41\xd6\x00\x83\x9a\x61\x44\x06\x92\x54\x60\xa4\
+\x81\x53\x11\xdf\xcd\x87\x0e\x92\x04\x3e\x69\x8a\x11\x3a\xc8\x5a\
+\x07\x8c\x13\x9a\xec\xf7\x84\x06\xb2\x0e\xf8\xac\x39\x46\xa8\x20\
+\x2a\x8c\xe3\x9a\xed\x08\x7a\x06\xf1\xbb\xa7\xba\xbc\xe0\x71\x46\
+\xc6\x8c\x9b\x94\x79\x24\x02\x28\x23\x23\xdd\xe4\x16\x15\x10\x41\
+\xec\xba\xb7\x55\x0a\x46\x50\x20\x17\x80\x4d\x06\xe4\x7f\x2c\x06\
+\x7a\x2b\x05\xc5\x2f\xc8\x78\xc1\xe3\x45\x82\xd2\x10\x57\x90\xa3\
+\x95\x8a\xe2\x17\xe4\x1e\x70\xc4\x06\x65\xa1\xa0\x6c\x8e\xe3\x18\
+\xd2\xe5\x80\xd2\x53\xae\x28\xc5\x0e\xaa\x5d\xc0\x21\x87\x96\x92\
+\x8a\xe3\x2c\x73\x5f\x50\x7e\x17\xe4\x2f\x90\x96\x92\x8a\x1b\x88\
+\x1b\x4a\x2f\xb0\x25\x4e\x4b\xf7\x89\xe8\x16\x94\xbb\xc0\xcc\xbc\
+\xfc\x6a\x69\x29\x7b\x81\x67\x79\xf9\x4b\x80\x65\x40\x15\x30\x0f\
+\xb0\xc8\x1d\x81\x48\x03\x5f\x81\x21\x82\x39\x69\x10\x68\xf8\xd9\
+\x75\xdf\x07\x8c\xd9\xbc\x67\x58\x96\xf8\x2f\x81\x9f\x0e\x65\x4f\
+\xa4\x31\xe0\x15\xd0\x29\xab\xe1\x94\x8f\x16\xad\xcd\xef\x32\x2a\
+\x94\x62\xd3\x20\x70\xcd\xc3\xb8\x14\x39\x88\x25\x18\x3d\x25\xc0\
+\x28\x4c\x0f\xe5\x83\x59\xba\x82\x34\x48\x25\xb3\x21\xa7\x27\x40\
+\x63\x50\x20\x41\x0c\xaa\x73\xa4\x19\x9f\xf1\xd1\xc7\xaf\x03\x0f\
+\x80\x11\x72\x3f\x66\x55\x03\x73\x65\x76\x5a\x0f\x6c\x00\x36\x92\
+\x3b\x5c\xac\x8a\x46\xe0\x31\x70\x03\xb8\x44\x30\x67\xd3\x7c\xb7\
+\x90\x14\xf0\xda\xe5\x1b\xfc\x22\x95\xfd\xa1\x18\x68\xb7\xb9\xd4\
+\xa1\x0a\xd8\x0a\xb4\xcb\x80\xec\x74\xad\x37\x05\x53\x7c\xa8\x5d\
+\xa6\x45\x56\xa8\xaa\xd7\x3c\x05\x8e\x91\x3b\x4b\x0f\xb0\xa7\x08\
+\x94\xfc\xd8\x25\x53\x7b\x5a\x71\xdd\x5f\xd2\x5a\x43\x05\x69\x77\
+\x78\xae\x1f\x38\xac\x28\x6f\xb7\x02\x65\x04\xd8\xee\xb1\x6e\x6e\
+\x63\x56\x1b\xd0\x17\x16\x88\x5d\xca\x00\x57\x80\x59\x2e\x65\x06\
+\x89\x62\x01\xcd\xd2\xca\xec\xea\x94\x8e\x0a\xe4\x1b\xb0\xdf\x43\
+\xb9\x3b\x15\x28\xa3\xc0\x0e\x1f\xf5\x4c\x02\x2f\x3c\xd4\xb7\xc9\
+\x49\x78\xba\x2c\xb9\xed\xa2\x73\x8a\xbb\x67\x97\xa5\xab\xe0\x11\
+\xc5\xee\xf4\xe1\x77\xe0\xa2\xb4\x18\x2f\x31\x5b\xba\x72\xcd\x14\
+\x5e\x7b\x15\x78\x6e\x93\xdf\x67\xfe\x2f\x33\x39\xcc\xff\x65\x4a\
+\x75\xfb\x6f\x40\x0c\x48\x4c\x22\x01\xfc\x01\xee\x18\x0a\x00\x86\
+\xfe\x01\xc7\x2c\xc6\x33\xb5\x4e\x77\xd4\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xa8\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\
+\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\x02\
+\x0f\x02\x08\x20\x11\x7f\xbb\xaf\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\x02\x1e\x49\x44\x41\x54\x68\xde\xed\xda\x41\x88\x8c\
+\x61\x1c\xc7\xf1\xcf\xab\x89\x15\x21\xa5\x56\xa4\xdd\x72\x40\x28\
+\x94\x93\x24\x87\xcd\x19\x27\xb5\x4e\x7b\x11\x0e\x22\x11\x49\x72\
+\x50\xeb\xa4\x70\x12\x07\x72\x91\x1c\x36\xc4\x81\x83\x58\xe5\xa2\
+\x8d\xa4\x24\x07\x25\xb6\xac\x4d\xb4\x49\xe3\x60\x44\x4f\xcf\xd4\
+\x0c\xbb\x76\x67\xfe\xef\xaf\x9e\xc3\xf3\x7b\xde\x67\x9a\xf7\x3b\
+\xcf\xf3\x7f\x9e\xff\xf3\x4c\x81\x2d\x38\xa9\x94\x0a\xe6\x63\x5d\
+\x89\x82\x69\x25\x82\x12\x46\x09\xa3\x84\xd1\x84\x8a\x5a\x00\xed\
+\xce\xb4\x35\xb2\xca\x0c\xa1\x0f\xdf\xa7\xe0\xbb\xcd\xc6\xfd\x8c\
+\xff\x19\x9b\x9a\x...
[truncated message content] |
|
From: <ti...@us...> - 2007-02-15 02:14:14
|
Revision: 168
http://pymoul.svn.sourceforge.net/pymoul/?rev=168&view=rev
Author: tiran
Date: 2007-02-14 18:14:13 -0800 (Wed, 14 Feb 2007)
Log Message:
-----------
Added D'ni number pictures
Added Paths:
-----------
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png
pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png
===================================================================
(Binary files differ)
Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-14 22:48:23
|
Revision: 167
http://pymoul.svn.sourceforge.net/pymoul/?rev=167&view=rev
Author: tiran
Date: 2007-02-14 14:48:22 -0800 (Wed, 14 Feb 2007)
Log Message:
-----------
Some time and ui fixes
Modified Paths:
--------------
pymoul/trunk/src/moul/file/plasmalog.py
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.ui
pymoul/trunk/src/moul/time/__init__.py
pymoul/trunk/src/moul/time/cavern.py
pymoul/trunk/src/moul/time/dni.py
pymoul/trunk/src/moul/time/utils.py
Modified: pymoul/trunk/src/moul/file/plasmalog.py
===================================================================
--- pymoul/trunk/src/moul/file/plasmalog.py 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/file/plasmalog.py 2007-02-14 22:48:22 UTC (rev 167)
@@ -72,7 +72,7 @@
"""
self._dozip = bool(boolean)
- def setRemoe(self, boolean):
+ def setRemove(self, boolean):
"""Set remoe flag
"""
self._doremove = bool(boolean)
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-14 22:48:22 UTC (rev 167)
@@ -334,6 +334,12 @@
"""
mb = qtutils.notImplementedMB(self)
mb.exec_()
+ return
+ logzipper = self.urupersonaldr.logzipper
+ logzipper.setZip(self.radio_ziplogs.isChecked()
+ # always remove
+ logzipper.setRemove(True)
+ #doremove = self.radio_deletelogs.isChecked()
# ************************************************************************
# system tray
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-14 22:48:22 UTC (rev 167)
@@ -244,7 +244,7 @@
<bool>true</bool>
</property>
<property name="text" >
- <string>Zip debug logs</string>
+ <string>Zip and delete debug logs</string>
</property>
<property name="checked" >
<bool>true</bool>
@@ -266,7 +266,7 @@
<item row="1" column="1" colspan="3" >
<widget class="QLabel" name="lb_log_remove" >
<property name="text" >
- <string>Remove zipped logs</string>
+ <string>Remove all zipped logs</string>
</property>
<property name="buddy" >
<cstring>pb_log_remove</cstring>
Modified: pymoul/trunk/src/moul/time/__init__.py
===================================================================
--- pymoul/trunk/src/moul/time/__init__.py 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/time/__init__.py 2007-02-14 22:48:22 UTC (rev 167)
@@ -21,8 +21,4 @@
__version__ = "$Id$"
__revision__ = "$Revision$"
-from moul.osdependent import __FROZEN__
-# pytz is an egg
-if not __FROZEN__:
- import pkg_resources
- pkg_resources.require("pytz>=2006p")
+import moul.time.utils
Modified: pymoul/trunk/src/moul/time/cavern.py
===================================================================
--- pymoul/trunk/src/moul/time/cavern.py 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/time/cavern.py 2007-02-14 22:48:22 UTC (rev 167)
@@ -24,14 +24,14 @@
__all__ = ['CavernTime']
from datetime import datetime
-from pytz import all_timezones
-from pytz import timezone
-from pytz import utc as UTC
+from moul.time.utils import diffTD
+from moul.time.utils import normalizeTZ
from moul.time.utils import td2sec
-from moul.time.utils import diffTD
+from moul.time.utils import timezone
from moul.time.utils import utcnow
-from moul.time.utils import normalizeTZ
+from moul.time.utils import UNIX_0
+from moul.time.utils import UTC
## not used in the current version
#SUPPORTED_TZ = ('America', 'Canada', 'Etc', 'Europe', 'US')
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-14 22:48:22 UTC (rev 167)
@@ -94,13 +94,14 @@
__revision__ = "$Revision$"
from datetime import datetime
-from pytz import utc as UTC
-from pytz import timezone
from time import mktime
import sys
from moul.time.utils import td2sec
+from moul.time.utils import timezone
from moul.time.utils import utcnow
+from moul.time.utils import UNIX_0
+from moul.time.utils import UTC
# list of month names with approx. dates
VAILEETEE = (
@@ -120,8 +121,6 @@
BASE_GREGORIAN = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC)
BASE_HAHR = 9654
FAHRAH_1 = -7656 # hahrtee fahrah 1 starts ~April 21st 7656 B.C
-# timestamp 0 - start of unix time
-UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC)
BASE_SEC = td2sec(BASE_GREGORIAN - UNIX_0) # WTF? no tottimestamp in datetime
# factors
Modified: pymoul/trunk/src/moul/time/utils.py
===================================================================
--- pymoul/trunk/src/moul/time/utils.py 2007-02-14 22:47:45 UTC (rev 166)
+++ pymoul/trunk/src/moul/time/utils.py 2007-02-14 22:48:22 UTC (rev 167)
@@ -21,9 +21,18 @@
__version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $"
__revision__ = "$Revision: 124 $"
+from moul.osdependent import __FROZEN__
+# pytz is an egg
+if not __FROZEN__:
+ import pkg_resources
+ pkg_resources.require("pytz>=2006p")
+
from datetime import datetime
from pytz import utc as UTC
+from pytz import timezone
+# timestamp 0 - start of unix time
+UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC)
def diffTD(td1, td2):
"""Difference of two time delta objects -> int
@@ -71,4 +80,6 @@
"""
if utc_dt is None:
utc_dt = utcnow()
+ if isinstance(tz, basestring):
+ tz = timezone(tz)
return tz.normalize(utc_dt.astimezone(tz))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-14 22:47:48
|
Revision: 166
http://pymoul.svn.sourceforge.net/pymoul/?rev=166&view=rev
Author: tiran
Date: 2007-02-14 14:47:45 -0800 (Wed, 14 Feb 2007)
Log Message:
-----------
Updated XXX report and languages
Modified Paths:
--------------
pymoul/trunk/doc/XXXreport.html
pymoul/trunk/src/moul/qt/i18n/pymoul_de.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_es.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_fr.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_it.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_nl.ts
Modified: pymoul/trunk/doc/XXXreport.html
===================================================================
--- pymoul/trunk/doc/XXXreport.html 2007-02-13 19:37:02 UTC (rev 165)
+++ pymoul/trunk/doc/XXXreport.html 2007-02-14 22:47:45 UTC (rev 166)
@@ -3,11 +3,11 @@
<body>
<h1>pyMoul - Developer report tools: XXX/TODO/FIXME comments</h1>
-<p>Generated on Wed, 07 Feb 2007 16:03:30 CET, based on Zope 3's XXX report</p>
+<p>Generated on Tue, 13 Feb 2007 20:37:41 CET, based on Zope 3's XXX report</p>
<hr>
<h3>Summary</h3>
<p>
- There are currently 88 XXX/TODO/FIXME comments.
+ There are currently 133 XXX/TODO/FIXME comments.
</p>
<hr/>
<h3>Listing</h3>
@@ -63,14 +63,14 @@
base-106-
base-107- def test_publicapi_create(self):
base-108- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:116</b><br/><pre> # TODO: more
-base-117-
-base-118-class AudioIniTest(GenericIniTest):
-base-119- enc = aud_enc
-</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:154</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-155-
-base-156- p.screenres = 0
-base-157- eq(p._get('Graphics.Width'), 800)
+</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:114</b><br/><pre> # TODO: more
+base-115-
+base-116-class AudioIniTest(GenericIniTest):
+base-117- enc = aud_enc
+</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:152</b><br/><pre> #XXX self.failIf(p.isChanged())
+base-153-
+base-154- p.screenres = 0
+base-155- eq(p._get('Graphics.Width'), 800)
</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
base-81- fd = open(os.path.join(path, fname), 'wb')
base-82- fd.write('dummy')
@@ -79,14 +79,26 @@
def test_publicapi_create(self):
inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:116</b><br/><pre> # TODO: more
+</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:114</b><br/><pre> # TODO: more
class AudioIniTest(GenericIniTest):
enc = aud_enc
-</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:154</b><br/><pre> #XXX self.failIf(p.isChanged())
+</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:152</b><br/><pre> #XXX self.failIf(p.isChanged())
p.screenres = 0
eq(p._get('Graphics.Width'), 800)
+</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py~:105</b><br/><pre> # TODO: more
+
+ def test_publicapi_create(self):
+ inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
+</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py~:116</b><br/><pre> # TODO: more
+
+class AudioIniTest(GenericIniTest):
+ enc = aud_enc
+</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py~:154</b><br/><pre> #XXX self.failIf(p.isChanged())
+
+ p.screenres = 0
+ eq(p._get('Graphics.Width'), 800)
</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
fd = open(os.path.join(path, fname), 'wb')
fd.write('dummy')
@@ -155,110 +167,164 @@
return len([name for name in os.listdir(path)
if os.path.isfile(os.path.join(path, name))])
-</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:77</b><br/><pre> # XXX: dos format
-base-78- return data.replace("\r\n", "\n")
-base-79-
-base-80-def encryptWDYS(instr, fout):
-</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:87</b><br/><pre> # XXX: dos format
-base-88- instr = instr.replace("\n", "\r\n")
-base-89- fout.seek(0)
-base-90- fout.write(HEADER)
-</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:71</b><br/><pre> # XXX NotImplemented
-base-72- raise NotImplementedError
-base-73-
-base-74-def decipher(crypt, size, key):
-</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:77</b><br/><pre> # XXX: dos format
+</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:76</b><br/><pre> # XXX: dos format
+base-77- return data.replace("\r\n", "\n")
+base-78-
+base-79-def encryptWDYS(instr, fout):
+</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:86</b><br/><pre> # XXX: dos format
+base-87- instr = instr.replace("\n", "\r\n")
+base-88- fout.seek(0)
+base-89- fout.write(HEADER)
+</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:28</b><br/><pre># TODO: use BinaryFile
+base-29-
+base-30-def list2int(lst):
+base-31- return [ord(s) for s in lst]
+</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:72</b><br/><pre> # XXX NotImplemented
+base-73- raise NotImplementedError
+base-74-
+base-75-def decipher(crypt, size, key):
+</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/binary.py.svn-base:293</b><br/><pre> if size > 1024: # XXX: ???
+base-294- raise ValueError("string is too long: %i" % size)
+base-295- if self.version == 5:
+base-296- size |= 0xF000
+</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/binary.py.svn-base:315</b><br/><pre> if size > 1024: # XXX: ???
+base-316- raise ValueError("size '%i' > 1024 at position %s(%s)" %
+base-317- (size, fd.tell(), repr(fd)))
+base-318- if self.version == 5:
+base:319: # XXX: testme
+base-320- # read data as tuple of integeres
+base-321- data = fd.readPacked("<%iI" % size)
+base-322- # OR integers with 0xff and write their char equivalent to string
+</pre></li><li><b>File: utilities/../src/moul/crypt/tests/.svn/text-base/test_binary.py.svn-base:98</b><br/><pre> # XXX: no test data
+base-99- pass
+base-100-
+base-101- def test_string0(self):
+</pre></li><li><b>File: utilities/../src/moul/crypt/tests/test_binary.py:98</b><br/><pre> # XXX: no test data
+ pass
+
+ def test_string0(self):
+</pre></li><li><b>File: utilities/../src/moul/crypt/tests/test_binary.py~:98</b><br/><pre> # XXX: no test data
+ pass
+
+ def test_string0(self):
+</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:76</b><br/><pre> # XXX: dos format
return data.replace("\r\n", "\n")
def encryptWDYS(instr, fout):
-</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:87</b><br/><pre> # XXX: dos format
+</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:86</b><br/><pre> # XXX: dos format
instr = instr.replace("\n", "\r\n")
fout.seek(0)
fout.write(HEADER)
-</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:71</b><br/><pre> # XXX NotImplemented
+</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py~:293</b><br/><pre> if size > 1024: # XXX: ???
+ raise ValueError("string is too long: %i" % size)
+ if self.version == 5:
+ size |= 0xF000
+</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py~:315</b><br/><pre> if size > 1024: # XXX: ???
+ raise ValueError("size '%i' > 1024 at position %s(%s)" %
+ (size, fd.tell(), repr(fd)))
+ if self.version == 5:
+ # read data as tuple of integeres
+ data = fd.readPacked("<%iI" % size)
+ # OR integers with 0xff and write their char equivalent to string
+</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:28</b><br/><pre># TODO: use BinaryFile
+
+def list2int(lst):
+ return [ord(s) for s in lst]
+</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:72</b><br/><pre> # XXX NotImplemented
raise NotImplementedError
def decipher(crypt, size, key):
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything
-base-153- self.emit(SIGNAL("close()"))
-base-154- event.accept()
-base-155- event.ignore()
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-292- del self._kiimage_progressbar
-base-293- self.pb_kiimage_repair.setEnabled(True)
-base-294- mb = qtutils.infoMB(self,
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:390</b><br/><pre> # TODO: change timer from every second to every minute
-base-391- self._timezone_timer = timer = QtCore.QTimer(self)
-base-392- timer.setInterval(1000) # 1 sec
-base:393: # TODO: needs optimization? run only when timer tab is active
-base-394- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-395- timer.start()
-base-396-
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:487</b><br/><pre> # TODO: thread safety!
-base-488- self.servers = servers
-base-489- if not self.isRunning():
-base-490- self.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:493</b><br/><pre> # TODO: thread safety!
-base-494- # emit a list of names first
-base-495- for server in self.servers:
-base-496- self.emit(SIGNAL("server(const QString&)"), server.name)
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:531</b><br/><pre> # TODO check this
-base-532- self._running = False
-base-533- self.condition.wakeAll()
-base-534-
+</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py:293</b><br/><pre> if size > 1024: # XXX: ???
+ raise ValueError("string is too long: %i" % size)
+ if self.version == 5:
+ size |= 0xF000
+</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py:315</b><br/><pre> if size > 1024: # XXX: ???
+ raise ValueError("size '%i' > 1024 at position %s(%s)" %
+ (size, fd.tell(), repr(fd)))
+ if self.version == 5:
+ # read data as tuple of integeres
+ data = fd.readPacked("<%iI" % size)
+ # OR integers with 0xff and write their char equivalent to string
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:154</b><br/><pre> # FIXME: signal doesn't do anything
+base-155- self.emit(SIGNAL("close()"))
+base-156- event.accept()
+base-157- event.ignore()
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:293</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+base-294- del self._kiimage_progressbar
+base-295- self.pb_kiimage_repair.setEnabled(True)
+base-296- mb = qtutils.infoMB(self,
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:392</b><br/><pre> # TODO: change timer from every second to every minute
+base-393- self._timezone_timer = QtCore.QTimer(self)
+base-394- self._timezone_timer.setInterval(1000) # 1 sec
+base:395: # TODO: needs optimization? run only when timer tab is active
+base-396- self.connect(self._timezone_timer, SIGNAL('timeout()'),
+base-397- self.on_timezone_timer_timeout)
+base-398- self._timezone_timer.start()
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:507</b><br/><pre> # TODO: thread safety!
+base-508- self.servers = servers
+base-509- if not self.isRunning():
+base-510- self.start()
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:513</b><br/><pre> # TODO: thread safety!
+base-514- # emit a list of names first
+base-515- for server in self.servers:
+base-516- self.emit(SIGNAL("server(const QString&)"), server.name)
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:551</b><br/><pre> # TODO check this
+base-552- self._running = False
+base-553- self.condition.wakeAll()
+base-554-
</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:45</b><br/><pre> # TODO: translation aware
base-46- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
base-47- if getattr(sys, 'frozen', False):
base-48- try:
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:151</b><br/><pre> # FIXME: signal doesn't do anything
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:154</b><br/><pre> # FIXME: signal doesn't do anything
self.emit(SIGNAL("close()"))
event.accept()
event.ignore()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:290</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:293</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
del self._kiimage_progressbar
self.pb_kiimage_repair.setEnabled(True)
mb = qtutils.infoMB(self,
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:389</b><br/><pre> # TODO: change timer from every second to every minute
- self._timezone_timer = timer = QtCore.QTimer(self)
- timer.setInterval(1000) # 1 sec
- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
- timer.start()
-
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:486</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:392</b><br/><pre> # TODO: change timer from every second to every minute
+ self._timezone_timer = QtCore.QTimer(self)
+ self._timezone_timer.setInterval(1000) # 1 sec
+ self.connect(self._timezone_timer, SIGNAL('timeout()'),
+ self.on_timezone_timer_timeout)
+ self._timezone_timer.start()
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:507</b><br/><pre> # TODO: thread safety!
self.servers = servers
if not self.isRunning():
self.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:492</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:513</b><br/><pre> # TODO: thread safety!
# emit a list of names first
for server in self.servers:
self.emit(SIGNAL("server(const QString&)"), server.name)
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:530</b><br/><pre> # TODO check this
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:551</b><br/><pre> # TODO check this
self._running = False
self.condition.wakeAll()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:154</b><br/><pre> # FIXME: signal doesn't do anything
self.emit(SIGNAL("close()"))
event.accept()
event.ignore()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:293</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
del self._kiimage_progressbar
self.pb_kiimage_repair.setEnabled(True)
mb = qtutils.infoMB(self,
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:390</b><br/><pre> # TODO: change timer from every second to every minute
- self._timezone_timer = timer = QtCore.QTimer(self)
- timer.setInterval(1000) # 1 sec
- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
- timer.start()
-
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:487</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:392</b><br/><pre> # TODO: change timer from every second to every minute
+ self._timezone_timer = QtCore.QTimer(self)
+ self._timezone_timer.setInterval(1000) # 1 sec
+ self.connect(self._timezone_timer, SIGNAL('timeout()'),
+ self.on_timezone_timer_timeout)
+ self._timezone_timer.start()
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:507</b><br/><pre> # TODO: thread safety!
self.servers = servers
if not self.isRunning():
self.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:493</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:513</b><br/><pre> # TODO: thread safety!
# emit a list of names first
for server in self.servers:
self.emit(SIGNAL("server(const QString&)"), server.name)
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:531</b><br/><pre> # TODO check this
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:551</b><br/><pre> # TODO check this
self._running = False
self.condition.wakeAll()
@@ -270,6 +336,18 @@
_thismodule = sys.modules[__name__]
if __WIN32__:
from moul.osdependent import win32 as osdep_win32
+</pre></li><li><b>File: utilities/../src/moul/osdependent/darwin/__init__.py:37</b><br/><pre>EXEC_NAME = "???" # XXX
+UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater"
+LOCATIONS = [
+ "/Applications",
+</pre></li><li><b>File: utilities/../src/moul/osdependent/darwin/.svn/text-base/__init__.py.svn-base:37</b><br/><pre>EXEC_NAME = "???" # XXX
+base-38-UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater"
+base-39-LOCATIONS = [
+base-40- "/Applications",
+</pre></li><li><b>File: utilities/../src/moul/osdependent/darwin/__init__.py~:37</b><br/><pre>EXEC_NAME = "???" # XXX
+UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater"
+LOCATIONS = [
+ "/Applications",
</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:120</b><br/><pre># XXX: what about cygwin, bsd and others?
base-121-_thismodule = sys.modules[__name__]
base-122-if __WIN32__:
@@ -290,10 +368,10 @@
base-27-base-691- from zope.tales.tales import TALESTracebackSupplement
base-28-base-692- from zope.pagetemplate.pagetemplate \
base-29-base-693- import PageTemplateTracebackSupplement
-base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:208</b><br/><pre> # TODO: inefficient, compare list with directory content
-base-31-base-209- if not os.path.isdir(self._logdir):
-base-32-base-210- LOG.warning("%s is not a directory" % logdir)
-base-33-base-211- return
+base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:216</b><br/><pre> # TODO: inefficient, compare list with directory content
+base-31-base-217- if not os.path.isdir(self._archivedir):
+base-32-base-218- LOG.warning("%s is not a directory" % self._archivedir)
+base-33-base-219- return
base:34:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct
base-35-base-113- if header is None:
base-36-base-114- fd = self._fd
@@ -354,10 +432,10 @@
base-91- fd = open(os.path.join(path, fname), 'wb')
base-92- fd.write('dummy')
base-93- fd.close()
-base:94:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:208</b><br/><pre> # TODO: inefficient, compare list with directory content
-base-95- if not os.path.isdir(self._logdir):
-base-96- LOG.warning("%s is not a directory" % logdir)
-base-97- return
+base:94:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:216</b><br/><pre> # TODO: inefficient, compare list with directory content
+base-95- if not os.path.isdir(self._archivedir):
+base-96- LOG.warning("%s is not a directory" % self._archivedir)
+base-97- return
base:98:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct
base-99- if header is None:
base-100- fd = self._fd
@@ -406,10 +484,10 @@
base-143-
base-144-class GraphicsIni(ConfFile):
base-145- _filename = 'graphics.ini'
-base:146:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:208</b><br/><pre> # TODO: inefficient, compare list with directory content
-base-147- if not os.path.isdir(logdir):
-base-148- LOG.warning("%s is not a directory" % logdir)
-base-149- return
+base:146:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:216</b><br/><pre> # TODO: inefficient, compare list with directory content
+base-147- if not os.path.isdir(self._archivedir):
+base-148- LOG.warning("%s is not a directory" % self._archivedir)
+base-149- return
base:150:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch
base-151- return len([name for name in os.listdir(path)
base-152- if os.path.isfile(os.path.join(path, name))])
@@ -442,89 +520,89 @@
base-179- raise NotImplementedError
base-180-
base-181-def decipher(crypt, size, key):
-base:182:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:149</b><br/><pre> # FIXME: signal doesn't do anything
-base-183-base-150- self.emit(SIGNAL("close()"))
-base-184-base-151- event.accept()
-base-185-base-152- event.ignore()
-base:186:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-187-base-251- del self._kiimage_progressbar
-base-188-base-252- self.pb_kiimage_repair.setEnabled(True)
-base-189-base-253- mb = qtutils.infoMB(self,
-base:190:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:345</b><br/><pre> # TODO: change timer from every second to every minute
-base-191-base-346- self._timezone_timer = timer = QtCore.QTimer(self)
-base-192-base-347- timer.setInterval(1000) # 1 sec
-base:193:base:348: # TODO: needs optimization? run only when timer tab is active
-base-194-base-349- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-195-base-350- timer.start()
-base-196-base-351-
-base:197:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:442</b><br/><pre> # TODO: thread safety!
-base-198-base-443- self.servers = servers
-base-199-base-444- if not self.isRunning():
-base-200-base-445- self.start()
-base:201:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:448</b><br/><pre> # TODO: thread safety!
-base-202-base-449- # emit a list of names first
-base-203-base-450- for server in self.servers:
-base-204-base-451- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:205:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:484</b><br/><pre> # TODO check this
-base-206-base-485- self._running = False
-base-207-base-486- self.condition.wakeAll()
-base-208-base-487-
-base:209:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware
-base-210-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-211-base-48- if not getattr(sys, 'frozen', False):
-base-212-base-49- return
-base:213:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:149</b><br/><pre> # FIXME: signal doesn't do anything
+base:182:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything
+base-183-base-153- self.emit(SIGNAL("close()"))
+base-184-base-154- event.accept()
+base-185-base-155- event.ignore()
+base:186:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+base-187-base-292- del self._kiimage_progressbar
+base-188-base-293- self.pb_kiimage_repair.setEnabled(True)
+base-189-base-294- mb = qtutils.infoMB(self,
+base:190:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:390</b><br/><pre> # TODO: change timer from every second to every minute
+base-191-base-391- self._timezone_timer = timer = QtCore.QTimer(self)
+base-192-base-392- timer.setInterval(1000) # 1 sec
+base:193:base:393: # TODO: needs optimization? run only when timer tab is active
+base-194-base-394- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
+base-195-base-395- timer.start()
+base-196-base-396-
+base:197:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:487</b><br/><pre> # TODO: thread safety!
+base-198-base-488- self.servers = servers
+base-199-base-489- if not self.isRunning():
+base-200-base-490- self.start()
+base:201:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:493</b><br/><pre> # TODO: thread safety!
+base-202-base-494- # emit a list of names first
+base-203-base-495- for server in self.servers:
+base-204-base-496- self.emit(SIGNAL("server(const QString&)"), server.name)
+base:205:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:531</b><br/><pre> # TODO check this
+base-206-base-532- self._running = False
+base-207-base-533- self.condition.wakeAll()
+base-208-base-534-
+base:209:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:45</b><br/><pre> # TODO: translation aware
+base-210-base-46- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
+base-211-base-47- if getattr(sys, 'frozen', False):
+base-212-base-48- try:
+base:213:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:151</b><br/><pre> # FIXME: signal doesn't do anything
base-214- self.emit(SIGNAL("close()"))
base-215- event.accept()
base-216- event.ignore()
-base:217:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+base:217:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:290</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
base-218- del self._kiimage_progressbar
base-219- self.pb_kiimage_repair.setEnabled(True)
base-220- mb = qtutils.infoMB(self,
-base:221:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:345</b><br/><pre> # TODO: change timer from every second to every minute
+base:221:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:389</b><br/><pre> # TODO: change timer from every second to every minute
base-222- self._timezone_timer = timer = QtCore.QTimer(self)
base-223- timer.setInterval(1000) # 1 sec
base-224- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:227</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:442</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:227</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:486</b><br/><pre> # TODO: thread safety!
base-228- self.servers = servers
base-229- if not self.isRunning():
base-230- self.start()
-base:231:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:448</b><br/><pre> # TODO: thread safety!
+base:231:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:492</b><br/><pre> # TODO: thread safety!
base-232- # emit a list of names first
base-233- for server in self.servers:
base-234- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:235:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:484</b><br/><pre> # TODO check this
+base:235:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:530</b><br/><pre> # TODO check this
base-236- self._running = False
base-237- self.condition.wakeAll()
base-238-
-base:239:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:149</b><br/><pre> # FIXME: signal doesn't do anything
+base:239:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything
base-240- self.emit(SIGNAL("close()"))
base-241- event.accept()
base-242- event.ignore()
-base:243:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+base:243:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
base-244- del self._kiimage_progressbar
base-245- self.pb_kiimage_repair.setEnabled(True)
base-246- mb = qtutils.infoMB(self,
-base:247:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:345</b><br/><pre> # TODO: change timer from every second to every minute
+base:247:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:390</b><br/><pre> # TODO: change timer from every second to every minute
base-248- self._timezone_timer = timer = QtCore.QTimer(self)
base-249- timer.setInterval(1000) # 1 sec
base-250- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:253</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:442</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:253</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:487</b><br/><pre> # TODO: thread safety!
base-254- self.servers = servers
base-255- if not self.isRunning():
base-256- self.start()
-base:257:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:448</b><br/><pre> # TODO: thread safety!
+base:257:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:493</b><br/><pre> # TODO: thread safety!
base-258- # emit a list of names first
base-259- for server in self.servers:
base-260- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:261:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:484</b><br/><pre> # TODO check this
+base:261:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:531</b><br/><pre> # TODO check this
base-262- self._running = False
base-263- self.condition.wakeAll()
base-264-
-base:265:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware
+base:265:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:45</b><br/><pre> # TODO: translation aware
base-266- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-267- if not getattr(sys, 'frozen', False):
-base-268- return
+base-267- if getattr(sys, 'frozen', False):
+base-268- try:
base:269:</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:120</b><br/><pre># XXX: what about cygwin, bsd and others?
base-270-_thismodule = sys.modules[__name__]
base-271-if __WIN32__:
@@ -549,836 +627,1179 @@
base-290-base-27-base-691- from zope.tales.tales import TALESTracebackSupplement
base-291-base-28-base-692- from zope.pagetemplate.pagetemplate \
base-292-base-29-base-693- import PageTemplateTracebackSupplement
-base:293:base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-294-base-31-base-281- return iter(self._fd)
-base:295:base:32:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct
-base-296-base-33-base-113- if header is None:
-base-297-base-34-base-114- fd = self._fd
-base-298-base-35-base-115- fd.seek(0)
-base:299:base:36:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct
-base-300-base-37-base-128- if size is None:
-base-301-base-38-base-129- size = self.getFileSize()
-base-302-base-39-base-130- leading = 4* [None]
-base:303:base:40:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:267</b><br/><pre> # XXX: move checks to copy method!
-base-304-base-41-base-268- if os.path.isfile(fixed):
-base-305-base-42-base-269- if fixedNewer(ki, fixed):
-base-306-base-43-base-270- LOG.debug("File %s exists but was changed." % name)
-base:307:base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:157</b><br/><pre> # TODO: write me
-base-308-base-45-base-158- pass
-base-309-base-46-base-159-
-base-310-base-47-base-160-class Constrain(object):
-base:311:base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-312-base-49-base-542- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-313-base-50-base-543- # microphon missing -> OS mixer
-base-314-base-51-base-544- }
-base:315:base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-316-base-53-base-630-
-base-317-base-54-base-631-class GraphicsIni(ConfFile):
-base-318-base-55-base-632- _filename = 'graphics.ini'
-base:319:base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/directory.py.svn-base:59</b><br/><pre> # TODO: fnmatch
-base-320-base-57-base-60- return len([name for name in os.listdir(path)
-base-321-base-58-base-61- if os.path.isfile(os.path.join(path, name))])
-base-322-base-59-base-62-
-base:323:base:60:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:105</b><br/><pre> # TODO: more
-base-324-base-61-base-106-
-base-325-base-62-base-107- def test_publicapi_create(self):
-base-326-base-63-base-108- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-base:327:base:64:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:116</b><br/><pre> # TODO: more
-base-328-base-65-base-117-
-base-329-base-66-base-118-class AudioIniTest(GenericIniTest):
-base-330-base-67-base-119- enc = aud_enc
-base:331:base:68:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:154</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-332-base-69-base-155-
-base-333-base-70-base-156- p.screenres = 0
-base-334-base-71-base-157- eq(p._get('Graphics.Width'), 800)
-base:335:base:72:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
-base-336-base-73-base-81- fd = open(os.path.join(path, fname), 'wb')
-base-337-base-74-base-82- fd.write('dummy')
-base-338-base-75-base-83- fd.close()
-base:339:base:76:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:105</b><br/><pre> # TODO: more
-base-340-base-77-
-base-341-base-78- def test_publicapi_create(self):
-base-342-base-79- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-base:343:base:80:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:116</b><br/><pre> # TODO: more
-base-344-base-81-
-base-345-base-82-class AudioIniTest(GenericIniTest):
-base-346-base-83- enc = aud_enc
-base:347:base:84:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:154</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-348-base-85-
-base-349-base-86- p.screenres = 0
-base-350-base-87- eq(p._get('Graphics.Width'), 800)
-base:351:base:88:</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
-base-352-base-89- fd = open(os.path.join(path, fname), 'wb')
-base-353-base-90- fd.write('dummy')
-base-354-base-91- fd.close()
-base:355:base:92:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-356-base-93- return iter(self._fd)
-base:357:base:94:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct
-base-358-base-95- if header is None:
-base-359-base-96- fd = self._fd
-base-360-base-97- fd.seek(0)
-base:361:base:98:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:127</b><br/><pre> # XXX use struct
-base-362-base-99- if size is None:
-base-363-base-100- size = self.getFileSize()
-base-364-base-101- leading = 4* [None]
-base:365:base:102:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:267</b><br/><pre> # XXX: move checks to copy method!
-base-366-base-103- if os.path.isfile(fixed):
-base-367-base-104- if fixedNewer(ki, fixed):
-base-368-base-105- LOG.debug("File %s exists but was changed." % name)
-base:369:base:106:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:157</b><br/><pre> # TODO: write me
-base-370-base-107- pass
-base-371-base-108-
-base-372-base-109-class Constrain(object):
-base:373:base:110:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-374-base-111- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-375-base-112- # microphon missing -> OS mixer
-base-376-base-113- }
-base:377:base:114:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-378-base-115-
-base-379-base-116-class GraphicsIni(ConfFile):
-base-380-base-117- _filename = 'graphics.ini'
-base:381:base:118:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:112</b><br/><pre> # XXX use struct
-base-382-base-119- if header is None:
-base-383-base-120- fd = self._fd
-base-384-base-121- fd.seek(0)
-base:385:base:122:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:127</b><br/><pre> # XXX use struct
-base-386-base-123- if size is None:
-base-387-base-124- size = self.getFileSize()
-base-388-base-125- leading = 4* [None]
-base:389:base:126:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:267</b><br/><pre> # XXX: move checks to copy method!
-base-390-base-127- if os.path.isfile(fixed):
-base-391-base-128- if fixedNewer(ki, fixed):
-base-392-base-129- LOG.debug("File %s exists but was changed." % name)
-base:393:base:130:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-394-base-131- return iter(self._fd)
-base:395:base:132:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:156</b><br/><pre> # TODO: write me
-base-396-base-133- pass
-base-397-base-134-
-base-398-base-135-class Constrain(object):
-base:399:base:136:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-400-base-137- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-401-base-138- # microphon missing -> OS mixer
-base-402-base-139- }
-base:403:base:140:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-404-base-141-
-base-405-base-142-class GraphicsIni(ConfFile):
-base-406-base-143- _filename = 'graphics.ini'
-base:407:base:144:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch
-base-408-base-145- return len([name for name in os.listdir(path)
-base-409-base-146- if os.path.isfile(os.path.join(path, name))])
-base-410-base-147-
-base:411:base:148:</pre></li><li><b>File: utilities/../src/moul/file/directory.py~:59</b><br/><pre> # TODO: fnmatch
-base-412-base-149- return len([name for name in os.listdir(path)
-base-413-base-150- if os.path.isfile(os.path.join(path, name))])
-base-414-base-151-
-base:415:base:152:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:77</b><br/><pre> # XXX: dos format
-base-416-base-153-base-78- return data.replace("\r\n", "\n")
-base-417-base-154-base-79-
-base-418-base-155-base-80-def encryptWDYS(instr, fout):
-base:419:base:156:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:87</b><br/><pre> # XXX: dos format
-base-420-base-157-base-88- instr = instr.replace("\n", "\r\n")
-base-421-base-158-base-89- fout.seek(0)
-base-422-base-159-base-90- fout.write(HEADER)
-base:423:base:160:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:71</b><br/><pre> # XXX NotImplemented
-base-424-base-161-base-72- raise NotImplementedError
-base-425-base-162-base-73-
-base-426-base-163-base-74-def decipher(crypt, size, key):
-base:427:base:164:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:77</b><br/><pre> # XXX: dos format
-base-428-base-165- return data.replace("\r\n", "\n")
-base-429-base-166-
-base-430-base-167-def encryptWDYS(instr, fout):
-base:431:base:168:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:87</b><br/><pre> # XXX: dos format
-base-432-base-169- instr = instr.replace("\n", "\r\n")
-base-433-base-170- fout.seek(0)
-base-434-base-171- fout.write(HEADER)
-base:435:base:172:</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:71</b><br/><pre> # XXX NotImplemented
-base-436-base-173- raise NotImplementedError
-base-437-base-174-
-base-438-base-175-def decipher(crypt, size, key):
-base:439:base:176:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:151</b><br/><pre> # FIXME: signal doesn't do anything
-base-440-base-177-base-152- self.emit(SIGNAL("close()"))
-base-441-base-178-base-153- event.accept()
-base-442-base-179-base-154- event.ignore()
-base:443:base:180:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:222</b><br/><pre> # TODO: msg
-base-444-base-181-base-223- return
-base-445-base-182-base-224-
-base-446-base-183-base-225- self.pb_kiimage_repair.setEnabled(False)
-base:447:base:184:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:248</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-448-base-185-base-249- del self._kiimage_progressbar
-base-449-base-186-base-250- self.pb_kiimage_repair.setEnabled(True)
-base:450:base:187:base:251: # TODO: msg
-base-451-base-188-base-252-
-base-452-base-189-base-253- # ************************************************************************
-base-453-base-190-base-254- # system tray
-base:454:base:191:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:281</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-455-base-192-base-282- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-456-base-193-base-283- timer.start()
-base-457-base-194-base-284-
-base:458:base:195:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:375</b><br/><pre> # TODO: thread safety!
-base-459-base-196-base-376- self.servers = servers
-base-460-base-197-base-377- if not self.isRunning():
-base-461-base-198-base-378- self.start()
-base:462:base:199:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:381</b><br/><pre> # TODO: thread safety!
-base-463-base-200-base-382- # emit a list of names first
-base-464-base-201-base-383- for server in self.servers:
-base-465-base-202-base-384- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:466:base:203:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:417</b><br/><pre> # TODO check this
-base-467-base-204-base-418- self._running = False
-base-468-base-205-base-419- self.condition.wakeAll()
-base-469-base-206-base-420-
-base:470:base:207:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware
-base-471-base-208-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-472-base-209-base-48- if not getattr(sys, 'frozen', False):
-base-473-base-210-base-49- return
-base:474:base:211:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/wdysini.py.svn-base:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit
-base:475:base:212:base:68: self.context.emit(SIGNAL("graphicsini_load()")) # XXX: hard coded emit
-base-476-base-213-base-69-
-base-477-base-214-base-70- @pyqtSignature("bool")
-base-478-base-215-base-71- def on_graphicsChanged(self, boolean):
-base:479:base:216:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:143</b><br/><pre> # FIXME: signal doesn't do anything
-base-480-base-217- self.emit(SIGNAL("close()"))
-base-481-base-218- event.accept()
-base-482-base-219- event.ignore()
-base:483:base:220:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:214</b><br/><pre> # TODO: msg
-base-484-base-221- return
-base-485-base-222-
-base-486-base-223- self.pb_kiimage_repair.setEnabled(False)
-base:487:base:224:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-488-base-225- del self._kiimage_progressbar
-base-489-base-226- self.pb_kiimage_repair.setEnabled(True)
-base-490-base-227-
-base:491:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:230</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-492-base-231- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-493-base-232- timer.start()
-base-494-base-233-
-base:495:base:234:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:382</b><br/><pre> # TODO: thread safety!
-base-496-base-235- self.servers = servers
-base-497-base-236- if not self.isRunning():
-base-498-base-237- self.start()
-base:499:base:238:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:388</b><br/><pre> # TODO: thread safety!
-base-500-base-239- # emit a list of names first
-base-501-base-240- for server in self.servers:
-base-502-base-241- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:503:base:242:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:424</b><br/><pre> # TODO check this
-base-504-base-243- self._running = False
-base-505-base-244- self.condition.wakeAll()
-base-506-base-245-
-base:507:base:246:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:143</b><br/><pre> # FIXME: signal doesn't do anything
-base-508-base-247- self.emit(SIGNAL("close()"))
-base-509-base-248- event.accept()
-base-510-base-249- event.ignore()
-base:511:base:250:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:214</b><br/><pre> # TODO: msg
-base-512-base-251- return
-base-513-base-252-
-base-514-base-253- self.pb_kiimage_repair.setEnabled(False)
-base:515:base:254:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-516-base-255- del self._kiimage_progressbar
-base-517-base-256- self.pb_kiimage_repair.setEnabled(True)
-base-518-base-257-
-base:519:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:260</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-520-base-261- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-521-base-262- timer.start()
-base-522-base-263-
-base:523:base:264:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:382</b><br/><pre> # TODO: thread safety!
-base-524-base-265- self.servers = servers
-base-525-base-266- if not self.isRunning():
-base-526-base-267- self.start()
-base:527:base:268:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:388</b><br/><pre> # TODO: thread safety!
-base-528-base-269- # emit a list of names first
-base-529-base-270- for server in self.servers:
-base-530-base-271- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:531:base:272:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:424</b><br/><pre> # TODO check this
-base-532-base-273- self._running = False
-base-533-base-274- self.condition.wakeAll()
-base-534-base-275-
-base:535:base:276:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware
-base-536-base-277- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-537-base-278- if not getattr(sys, 'frozen', False):
-base-538-base-279- return
-base:539:base:280:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py~:46</b><br/><pre> # TODO: translation aware
-base-540-base-281- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-541-base-282- if not getattr(sys, 'frozen', False):
-base-542-base-283- return
-base:543:base:284:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py~:68</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit
-base-544-base-285-
-base-545-base-286- @signalLogDecorator(LOG)
-base-546-base-287- @pyqtSignature("bool")
-base:547:base:288:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit
-base-548-base-289-
-base-549-base-290- @pyqtSignature("bool")
-base-550-base-291- def on_graphicsChanged(self, boolean):
-base:551:base:292:</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:117</b><br/><pre># XXX: what about cygwin, bsd and others?
-base-552-base-293-_thismodule = sys.modules[__name__]
-base-553-base-294-if __WIN32__:
-base-554-base-295- from moul.osdependent import win32 as osdep_win32
-base:555:base:296:</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:117</b><br/><pre># XXX: what about cygwin, bsd and others?
-base-556-base-297-base-118-_thismodule = sys.modules[__name__]
-base-557-base-298-base-119-if __WIN32__:
-base-558-base-299-base-120- from moul.osdependent import win32 as osdep_win32
-base:559:base:300:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:14</b><br/><pre><ol><li><b>File: utilities/../.svn/text-base/ez_setup.py.svn-base:92</b><br/><pre> # XXX could we install in a subprocess here?
-base-560-base-301-base-15-base-93- print >>sys.stderr, (
-base-561-base-302-base-16-base-94- "The required version of setuptools (>=%s) is not available, and\n"
-base-562-base-303-base-17-base-95- "can't be installed while this script is running. Please install\n"
-base:563:base:304:base:18:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:548</b><br/><pre> # XXX bug: doctest may report several failures in one test, they are
-base-564-base-305-base-19-base-549- # separated by a horizontal dash line. Only the first one of
-base-565-base-306-base-20-base-550- # them is now colorized properly.
-base-566-base-307-base-21-base-551- header = lines[0]
-base:567:base:308:base:22:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:603</b><br/><pre> # TODO: Scrape and colorize the traceback.
-base-568-base-309-base-23-base-604- result.append(self.colorize('doctest_got', line))
-base-569-base-310-base-24-base-605- elif remaining[0] == 'Differences (ndiff with -expected +actual):':
-base-570-base-311-base-25-base-606- result.append(self.colorize('doctest_title', remaining.pop(0))) # E. raised:
-base:571:base:312:base:26:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:623</b><br/><pre> # TODO: We only deal with the output from Zope 3's doctest module.
-base-572-base-313-base-27-base-624- # A colorizer for the Python's doctest module would be nice too.
-base-573-base-314-base-28-base-625- if doctest:
-base-574-base-315-base-29-base-626- # If we have a doctest, we do not care about this header. All the
-base:575:base:316:base:30:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:690</b><br/><pre> # TODO these should be hookable
-base-576-base-317-base-31-base-691- from zope.tales.tales import TALESTracebackSupplement
-base-577-base-318-base-32-base-692- from zope.pagetemplate.pagetemplate \
-base-578-base-319-base-33-base-693- import PageTemplateTracebackSupplement
-base:579:base:320:base:34:</pre></li><li><b>File: utilities/../.svn/text-base/setup_win32.py.svn-base:84</b><br/><pre> pexe['innosetup'] = os.environ.get('INNOSETUP') # TODO:
-base-580-base-321-base-35-base-85- pexe['inno_templates'] = "template.iss"
-base-581-base-322-base-36-base-86- pexe['app_name'] = 'pyMoul'
-base-582-base-323-base-37-base-87- pexe['includes'].extend(findPyTz())
-base:583:base:324:base:38:</pre></li><li><b>File: utilities/../.svn/text-base/distutils_upx.py.svn-base:117</b><br/><pre> sys.exit(retcode) # XXX
-base-584-base-325-base-39-base-118-
-base-585-base-326-base-40-base-119- def _upxAvailable(self):
-base-586-base-327-base-41-base-120- """Search for UPX in search path
-base:587:base:328:base:42:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-588-base-329-base-43-base-269- return iter(self._fd)
-base:589:base:330:base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct
-base-590-base-331-base-45-base-113- if header is None:
-base-591-base-332-base-46-base-114- fd = self._fd
-base-592-base-333-base-47-base-115- fd.seek(0)
-base:593:base:334:base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct
-base-594-base-335-base-49-base-128- if size is None:
-base-595-base-336-base-50-base-129- size = self.getFileSize()
-base-596-base-337-base-51-base-130- leading = 4* [None]
-base:597:base:338:base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:156</b><br/><pre> # TODO: write me
-base-598-base-339-base-53-base-157- pass
-base-599-base-340-base-54-base-158-
-base-600-base-341-base-55-base-159-class Constrain(object):
-base:601:base:342:base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-602-base-343-base-57-base-541- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-603-base-344-base-58-base-542- # microphon missing -> OS mixer
-base-604-base-345-base-59-base-543- }
-base:605:base:346:base:60:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-606-base-347-base-61-base-629-
-base-607-base-348-base-62-base-630-class GraphicsIni(ConfFile):
-base-608-base-349-base-63-base-631- _filename = 'graphics.ini'
-base:609:base:350:base:64:</pre></li><li><b>File: utilities/../src/moul/file...
[truncated message content] |
|
From: <ti...@us...> - 2007-02-13 19:37:09
|
Revision: 165
http://pymoul.svn.sourceforge.net/pymoul/?rev=165&view=rev
Author: tiran
Date: 2007-02-13 11:37:02 -0800 (Tue, 13 Feb 2007)
Log Message:
-----------
Fixed broken unit tests
Modified Paths:
--------------
pymoul/trunk/Makefile.in
pymoul/trunk/src/moul/file/chatlog.py
pymoul/trunk/src/moul/file/plasmalog.py
pymoul/trunk/src/moul/file/tests/test_wdysini.py
Modified: pymoul/trunk/Makefile.in
===================================================================
--- pymoul/trunk/Makefile.in 2007-02-13 15:32:47 UTC (rev 164)
+++ pymoul/trunk/Makefile.in 2007-02-13 19:37:02 UTC (rev 165)
@@ -38,10 +38,10 @@
ui:
$(PYTHON) utilities/compileui.py ./src/moul/
-test_build: build ui
+test_build: build
PYTHONPATH="src" $(PYTHON) test.py $(TESTFLAGS) $(TESTOPTS)
-test_inplace: ui
+test_inplace:
PYTHONPATH="src" $(PYTHON) test.py $(TESTFLAGS) $(TESTOPTS)
doc_html:
Modified: pymoul/trunk/src/moul/file/chatlog.py
===================================================================
--- pymoul/trunk/src/moul/file/chatlog.py 2007-02-13 15:32:47 UTC (rev 164)
+++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-13 19:37:02 UTC (rev 165)
@@ -101,7 +101,7 @@
return False
if not os.path.isdir(self._destdir):
LOG.info("Creating chatlog directory %s" % self._destdir)
- os.mkdir(destdir)
+ os.mkdir(self._destdir)
return False
return True
@@ -232,6 +232,12 @@
self._chatlogs.append(chatlog)
self._chatlogs.sort(key=lambda element:element.name)
+ @property
+ def names(self):
+ """list of names
+ """
+ return [clv.name for clv in self._chatlogs]
+
def __len__(self):
"""len() support
"""
@@ -239,10 +245,10 @@
def __iter__(self):
return iter(self._chatlogs)
-
+
def __contains__(self, other):
return other in self._chatlogs
-
+
def __getitem__(self, idx):
return self._chatlogs[idx]
Modified: pymoul/trunk/src/moul/file/plasmalog.py
===================================================================
--- pymoul/trunk/src/moul/file/plasmalog.py 2007-02-13 15:32:47 UTC (rev 164)
+++ pymoul/trunk/src/moul/file/plasmalog.py 2007-02-13 19:37:02 UTC (rev 165)
@@ -48,6 +48,7 @@
self._doremove = True
self._dozip = True
LOG.debug("PlasmalogZipper: %s -> %s" % (srcdir, destdir))
+ self.clear()
def clear(self):
"""Clear state
@@ -56,15 +57,15 @@
self._not_removed = [] # files with full path
if not os.path.isdir(self._srcdir):
- LOG.warning("%s is not a directory" % srcdir)
+ LOG.warning("%s is not a directory" % self._srcdir)
if not self.isPlasmaLogDir():
self._ispldir = False
- LOG.warning("%s is not a plasma log directory" % srcdir)
+ LOG.warning("%s is not a plasma log directory" % self._srcdir)
else:
self._ispldir = True
if not os.path.isdir(self._destdir):
- LOG.info("Creating chatlog directory %s" % destdir)
- os.mkdir(destdir)
+ LOG.info("Creating chatlog directory %s" % self._destdir)
+ os.mkdir(self._destdir)
def setZip(self, boolean):
"""Set ZIP flag
Modified: pymoul/trunk/src/moul/file/tests/test_wdysini.py
===================================================================
--- pymoul/trunk/src/moul/file/tests/test_wdysini.py 2007-02-13 15:32:47 UTC (rev 164)
+++ pymoul/trunk/src/moul/file/tests/test_wdysini.py 2007-02-13 19:37:02 UTC (rev 165)
@@ -111,8 +111,6 @@
self.failIf(p.exists())
p.create()
self.failUnless(p.exists())
- p.write()
- self.failUnless(p.exists())
# TODO: more
class AudioIniTest(GenericIniTest):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-13 15:32:55
|
Revision: 164
http://pymoul.svn.sourceforge.net/pymoul/?rev=164&view=rev
Author: tiran
Date: 2007-02-13 07:32:47 -0800 (Tue, 13 Feb 2007)
Log Message:
-----------
Dni time cleanup
Added fromString method
Modified Paths:
--------------
pymoul/trunk/src/moul/time/dni.py
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-13 03:16:06 UTC (rev 163)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-13 15:32:47 UTC (rev 164)
@@ -70,13 +70,24 @@
>>> compareDT(dni.toUTC(), other)
True
->>> dni.bell
+>>> dni.pahrtovo
24
->>> dni.secondsToBell(25)
+>>> dni.secondsToPahrtovo(25)
2616
->>> dni.secondsToBell(18)
+>>> dni.secondsToPahrtovo(18)
80964
+>>> CET = timezone('CET')
+>>> dni.fromString("2007-02-12 14:55:10", tzinfo=CET)
+>>> str(dni)
+'04:21:24:22, Leevotar 4, 9662'
+>>> dni.fromString("2007-02-12 6:55:10", tzinfo='MST')
+>>> str(dni)
+'04:21:24:22, Leevotar 4, 9662'
+>>> dni.fromString("2007-02-12 13:55:10")
+>>> str(dni)
+'04:21:24:22, Leevotar 4, 9662'
+
"""
__author__ = "Christian Heimes"
__version__ = "$Id$"
@@ -84,28 +95,13 @@
from datetime import datetime
from pytz import utc as UTC
+from pytz import timezone
from time import mktime
import sys
from moul.time.utils import td2sec
from moul.time.utils import utcnow
-
-FAHRAH_1 = -7656 # hahrtee fahrah 1 starts at April 21st 7656 B.C
-
-# name -> amount of smaller element, e.g. a hartee fahrah as 625 hahr
-DNI_FACTORS = (
- ('hahrtee fahrah', 625),
- ('hahr', 10), # year
- ('vai-lee', 29), # month
- ('yahr', 5), # day (~30h and 14min)
- # pahr-to-vo (bell) each yahr has 25 bells (~74 min)
- ('gahr-tah-vo', 25), # ~6h 3min
- ('tah-vo', 25), # ~14,5 min
- ('gor-ahn', 25), # ~34,8 seconds
- ('pro-rahn', None), # ~1.39 seconds
- )
-
# list of month names with approx. dates
VAILEETEE = (
'Leefo', # 1: April 21st to May 27th
@@ -120,15 +116,24 @@
'Leenovoo', # 10: March 16th to April 21st
)
-# 00:00:00:00, Leefo 1, 9654 DE
-BASE = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC)
+# 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 1998/4/21
+BASE_GREGORIAN = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC)
+BASE_HAHR = 9654
+FAHRAH_1 = -7656 # hahrtee fahrah 1 starts ~April 21st 7656 B.C
# timestamp 0 - start of unix time
UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC)
-BASE_SEC = td2sec(BASE-UNIX_0) # WTF? datetime has no totimestamp() method
-BASE_HAHR = 9654
-BASE_YEAR = 1998
+BASE_SEC = td2sec(BASE_GREGORIAN - UNIX_0) # WTF? no tottimestamp in datetime
+
+# factors
+HAHR_PER_HAHRTEE_FAHRAH = 625 # ~ 625 years
SECONDS_PER_HAHR = 31556925
-PRORAHN_PER_HAHR = 22656250
+PRORAHN_PER_HAHR = 22656250 # ~ 1 year, 25 * 25 * 25 * 5 * 29 * 10
+PRORAHN_PER_VAILEE = 2265625 # ~ 36 days, 25 * 25 * 25 * 5 * 29
+PRORAHN_PER_YAHR = 78125 # ~30h 14min, 25 * 25 * 25 * 5
+PRORAHN_PER_GAHRTAHVO = 15625 # ~6h 3min, 25 * 25 * 25
+PRORAHN_PER_PAHRTOVO = 3125 # ~74min, 25 * 25 * 5
+PRORAHN_PER_TAHVO = 625 # ~14,5 min, 25 * 25
+PRORAHN_PER_GORAHN = 25 # ~34,8 sec, 25
FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) # 1.39285737931
FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) # 0.717948596069
@@ -149,34 +154,32 @@
class DniTime(object):
"""D'ni time representation
-
+
The D'ni were using a complex calendar based on a pentovigesimal (25)
numbering system.
-
+
The DniTime class assumes the following rules:
-
+
- Hahrtee Farah 1 started on 21st of April 7656 B.C.
- Hahrtee Fahrah 15 started 1719 A.C.
- - A new hahr starts on 21st of April.
- - The reference time for the calculation is Mountain Standard Time (MST)
- without (!) DST. The UTC offset is always UTC-7.
- - To compensate leap years a new hahr starts on midnight (0:00am) in every
- forth year (year % 4 == 0).
- - To simplify the code special cases like year % 100 and year % 400 are
- NOT taken into account. I'm assuming a year has 365,25 days (which is
- wrong). A year according to the Gregorian Calendar has 365,2425 days.
-
+ - A new hahr starts around midnight 21st of April.
+ - Each D'ni year has a fixed length
+ - The exact start of a D'ni year is calculated relatively to
+ 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 1998/4/21
+
Overview
--------
-
+
fahrah millenium 625 years
hahr year 1 year
vailee month 10 per year
yahr day 29 per vailee, about 30h 14min
gahrtahvo section about 6h, 3min
+ pahrtovo hour about 1h 14min
tahvo quarter about 14,5min
gorahn minute 36 seconds
prorahn second about 1.3929 seconds
+
"""
def __init__(self, hahr=0, vailee=0, yahr=0, gahrtahvo=0, tahvo=0,
gorahn=0, prorahn=0):
@@ -202,10 +205,20 @@
"""
if utc_dt is None:
utc_dt = utcnow()
- sec = td2sec(utc_dt - BASE)
+ sec = td2sec(utc_dt - BASE_GREGORIAN)
prorahn = int(round(sec * FACTOR_PS))
self.set(hahr=BASE_HAHR, prorahn=prorahn)
+ def fromString(self, s, fmt="%Y-%m-%d %H:%M:%S", tzinfo=UTC):
+ """Convert date from string to Dni Time
+ """
+ if isinstance(tzinfo, basestring):
+ tzinfo = timezone(tzinfo)
+ dt = datetime.strptime(s, fmt)
+ dt = tzinfo.localize(dt)
+ utc_dt = UTC.normalize(dt.astimezone(UTC))
+ return self.fromUTC(utc_dt)
+
def toUTC(self):
"""Convert to UTC datetime value
"""
@@ -242,45 +255,45 @@
hahr = property(_getHahr, _setHahr)
def _getVailee(self):
- return ((self._prorahn // 2265625) % 10) +1
+ return ((self._prorahn // PRORAHN_PER_VAILEE) % 10) +1
@valueCheck(int, 0, 10)
def _setVailee(self, value):
- self._addProrahn(value * 2265625)
+ self._addProrahn(value * PRORAHN_PER_VAILEE)
vailee = property(_getVailee, _setVailee)
def getVaileeName(self):
return VAILEETEE[self.vailee-1]
def _getYahr(self):
- return ((self._prorahn // 78125) % 29) +1
+ return ((self._prorahn // PRORAHN_PER_YAHR) % 29) +1
@valueCheck(int, 0, 29)
def _setYahr(self, value):
- self._addProrahn(value * 78125)
+ self._addProrahn(value * PRORAHN_PER_YAHR)
yahr = property(_getYahr, _setYahr)
def _getGahrtahvo(self):
- return (self._prorahn // 15625) % 5
+ return (self._prorahn // PRORAHN_PER_GAHRTAHVO) % 5
@valueCheck(int, 0, 5)
def _setGahrtahvo(self, value):
- self._addProrahn(value * 15625)
+ self._addProrahn(value * PRORAHN_PER_GAHRTAHVO)
gahrtahvo = property(_getGahrtahvo, _setGahrtahvo)
def _getPahrtovo(self):
- return (self._prorahn // 3125) % 25
+ return (self._prorahn // PRORAHN_PER_PAHRTOVO) % 25
pahrtovo = property(_getPahrtovo)
def _getTahvo(self):
- return (self._prorahn // 625) % 25
+ return (self._prorahn // PRORAHN_PER_TAHVO) % 25
@valueCheck(int, 0, 25)
def _setTahvo(self, value):
- self._addProrahn(value * 625)
+ self._addProrahn(value * PRORAHN_PER_TAHVO)
tahvo = property(_getTahvo, _setTahvo)
def _getGorahn(self):
- return (self._prorahn // 25) % 25
+ return (self._prorahn // PRORAHN_PER_GORAHN) % 25
@valueCheck(int, 0, 25)
def _setGorahn(self, value):
- self._addProrahn(value * 25)
+ self._addProrahn(value * PRORAHN_PER_GORAHN)
gorahn = property(_getGorahn, _setGorahn)
def _getProrahn(self):
@@ -301,5 +314,6 @@
def prorahnOfYahr(self):
"""Get numbers of prorahntee since start of yahr
"""
- return (self.gahrtahvo * 15625 + self.tahvo * 625 +
- self.gorahn * 25 + self.prorahn)
+ return (self.gahrtahvo * PRORAHN_PER_GAHRTAHVO +
+ self.tahvo * PRORAHN_PER_TAHVO +
+ self.gorahn * PRORAHN_PER_GORAHN + self.prorahn)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-13 03:16:08
|
Revision: 163
http://pymoul.svn.sourceforge.net/pymoul/?rev=163&view=rev
Author: tiran
Date: 2007-02-12 19:16:06 -0800 (Mon, 12 Feb 2007)
Log Message:
-----------
Renamed bell to pahrtove
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/time/dni.py
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-12 19:34:10 UTC (rev 162)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-13 03:16:06 UTC (rev 163)
@@ -439,7 +439,7 @@
SIGNAL: QTimer timeout
"""
dni = self._dnitime.fromUTC() # set to now
- self.le_dnitime.setText(str(self._dnitime)+", bell: %s" % self._dnitime.bell)
+ self.le_dnitime.setText(str(self._dnitime)+", bell: %s" % self._dnitime.pahrtovo)
# ************************************************************************
# ping
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-12 19:34:10 UTC (rev 162)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-13 03:16:06 UTC (rev 163)
@@ -23,6 +23,15 @@
official sources say that:
00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE
+D'ni New Year - Leefo 1, April 21
+First Feast of the Maker - Lenovoo 10, March 27 (Pre-earth celebration)
+The Common Library Opened - Leefo 12, May 5
+Second Feast of the Maker - Leebro 20, June 21 (Pre-earth celebration)
+The Day of Dancing - Leetar 21, September 3
+First Arrival of the Great King - Leevot 12, September 28
+Third Feast of the Maker - Leevofo 18, November 11 (Pre-earth celebration)
+Coronation of King Kerath - Leevofo 27, November 23
+
>>> from datetime import timedelta
>>> LEEFO_1_TABLE = [
@@ -74,7 +83,6 @@
__revision__ = "$Revision$"
from datetime import datetime
-from operator import mul
from pytz import utc as UTC
from time import mktime
import sys
@@ -91,7 +99,7 @@
('hahr', 10), # year
('vai-lee', 29), # month
('yahr', 5), # day (~30h and 14min)
- # bell - each yahr has 25 bells (~74 min)
+ # pahr-to-vo (bell) each yahr has 25 bells (~74 min)
('gahr-tah-vo', 25), # ~6h 3min
('tah-vo', 25), # ~14,5 min
('gor-ahn', 25), # ~34,8 seconds
@@ -206,8 +214,8 @@
sec = hahr_sec + BASE_SEC + prorahn_sec
return UTC.localize(datetime.utcfromtimestamp(sec))
- def secondsToBell(self, bell):
- """Calculate seconds until bell
+ def secondsToPahrtovo(self, bell):
+ """Calculate seconds until bell (pahr-to-vo)
"""
if bell < 1 or bell > 25:
raise ValueError("%s too large or small" % bell)
@@ -257,9 +265,9 @@
self._addProrahn(value * 15625)
gahrtahvo = property(_getGahrtahvo, _setGahrtahvo)
- def _getBell(self):
+ def _getPahrtovo(self):
return (self._prorahn // 3125) % 25
- bell = property(_getBell)
+ pahrtovo = property(_getPahrtovo)
def _getTahvo(self):
return (self._prorahn // 625) % 25
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-12 19:34:23
|
Revision: 162
http://pymoul.svn.sourceforge.net/pymoul/?rev=162&view=rev
Author: tiran
Date: 2007-02-12 11:34:10 -0800 (Mon, 12 Feb 2007)
Log Message:
-----------
Show D'ni time
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.py
pymoul/trunk/src/moul/qt/ui/mainwindow.ui
pymoul/trunk/src/moul/time/dni.py
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-12 17:15:11 UTC (rev 161)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-12 19:34:10 UTC (rev 162)
@@ -42,6 +42,8 @@
from moul.server.ping import isSocketError
from moul.server.ping import fmtSocketError
from moul.time.cavern import CavernTime
+from moul.time.dni import DniTime
+from moul.time.dni import FACTOR_SP
from moul.qt.localization import LocalizationContainer
from moul.qt.wdysini import IniFileContainer
@@ -388,12 +390,21 @@
# create a timer to update the display every second
# TODO: change timer from every second to every minute
- self._timezone_timer = timer = QtCore.QTimer(self)
- timer.setInterval(1000) # 1 sec
+ self._timezone_timer = QtCore.QTimer(self)
+ self._timezone_timer.setInterval(1000) # 1 sec
# TODO: needs optimization? run only when timer tab is active
- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
- timer.start()
+ self.connect(self._timezone_timer, SIGNAL('timeout()'),
+ self.on_timezone_timer_timeout)
+ self._timezone_timer.start()
+ self._dnitime = DniTime()
+ self.on_dnitimer_timeout()
+ self._dnitime_timer = QtCore.QTimer(self)
+ self._dnitime_timer.setInterval(FACTOR_SP*1000)
+ self.connect(self._dnitime_timer, SIGNAL('timeout()'),
+ self.on_dnitimer_timeout)
+ self._dnitime_timer.start()
+
def _timezone_update(self):
"""
Update datetime widgets
@@ -421,6 +432,15 @@
self.dt_cavern.setDateTime(ct['cavern'])
self.dt_pacific.setDateTime(ct['pacific'])
+ @pyqtSignature("")
+ @qtutils.skipLogging
+ def on_dnitimer_timeout(self):
+ """
+ SIGNAL: QTimer timeout
+ """
+ dni = self._dnitime.fromUTC() # set to now
+ self.le_dnitime.setText(str(self._dnitime)+", bell: %s" % self._dnitime.bell)
+
# ************************************************************************
# ping
def _ping_init(self):
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-12 17:15:11 UTC (rev 161)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-12 19:34:10 UTC (rev 162)
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file './src/moul/qt/ui/mainwindow.ui'
#
-# Created: Tue Feb 6 04:38:34 2007
+# Created: Mon Feb 12 20:15:18 2007
# by: PyQt4 UI code generator 4.1.1
#
# WARNING! All changes made in this file will be lost!
@@ -117,7 +117,7 @@
self.gridlayout.addWidget(self.lb_log_remove,1,1,1,3)
self.groupBox_2 = QtGui.QGroupBox(self.tab_tasks)
- self.groupBox_2.setGeometry(QtCore.QRect(10,130,451,81))
+ self.groupBox_2.setGeometry(QtCore.QRect(10,120,451,81))
self.groupBox_2.setObjectName("groupBox_2")
self.layoutWidget1 = QtGui.QWidget(self.groupBox_2)
@@ -142,7 +142,7 @@
self.hboxlayout1.addItem(spacerItem3)
self.gb_caverntime = QtGui.QGroupBox(self.tab_tasks)
- self.gb_caverntime.setGeometry(QtCore.QRect(10,220,451,101))
+ self.gb_caverntime.setGeometry(QtCore.QRect(10,200,451,101))
self.gb_caverntime.setObjectName("gb_caverntime")
self.gridLayout = QtGui.QWidget(self.gb_caverntime)
@@ -201,6 +201,16 @@
spacerItem4 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
self.gridlayout1.addItem(spacerItem4,0,3,1,1)
+
+ self.gb_dnitime = QtGui.QGroupBox(self.tab_tasks)
+ self.gb_dnitime.setGeometry(QtCore.QRect(10,300,451,101))
+ self.gb_dnitime.setObjectName("gb_dnitime")
+
+ self.le_dnitime = QtGui.QLineEdit(self.gb_dnitime)
+ self.le_dnitime.setGeometry(QtCore.QRect(10,40,281,25))
+ self.le_dnitime.setEchoMode(QtGui.QLineEdit.Normal)
+ self.le_dnitime.setReadOnly(True)
+ self.le_dnitime.setObjectName("le_dnitime")
self.tabwidget.addTab(self.tab_tasks,"")
self.tab_settings = QtGui.QWidget()
@@ -927,6 +937,7 @@
self.lb_pacific_utc.setText(QtGui.QApplication.translate("MainWindow", "UTC -0", None, QtGui.QApplication.UnicodeUTF8))
self.label_4.setText(QtGui.QApplication.translate("MainWindow", "Cavern time:", None, QtGui.QApplication.UnicodeUTF8))
self.label_5.setText(QtGui.QApplication.translate("MainWindow", "Cyan time:", None, QtGui.QApplication.UnicodeUTF8))
+ self.gb_dnitime.setTitle(QtGui.QApplication.translate("MainWindow", "D\'ni time", None, QtGui.QApplication.UnicodeUTF8))
self.tabwidget.setTabText(self.tabwidget.indexOf(self.tab_tasks), QtGui.QApplication.translate("MainWindow", "Tasks", None, QtGui.QApplication.UnicodeUTF8))
self.groupBox_screenres.setTitle(QtGui.QApplication.translate("MainWindow", "Screen Resolution", None, QtGui.QApplication.UnicodeUTF8))
self.lb_screenres.setText(QtGui.QApplication.translate("MainWindow", "800x600 (4:3)", None, QtGui.QApplication.UnicodeUTF8))
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-12 17:15:11 UTC (rev 161)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-12 19:34:10 UTC (rev 162)
@@ -280,7 +280,7 @@
<property name="geometry" >
<rect>
<x>10</x>
- <y>130</y>
+ <y>120</y>
<width>451</width>
<height>81</height>
</rect>
@@ -347,7 +347,7 @@
<property name="geometry" >
<rect>
<x>10</x>
- <y>220</y>
+ <y>200</y>
<width>451</width>
<height>101</height>
</rect>
@@ -466,6 +466,35 @@
</layout>
</widget>
</widget>
+ <widget class="QGroupBox" name="gb_dnitime" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>300</y>
+ <width>451</width>
+ <height>101</height>
+ </rect>
+ </property>
+ <property name="title" >
+ <string>D'ni time</string>
+ </property>
+ <widget class="QLineEdit" name="le_dnitime" >
+ <property name="geometry" >
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>281</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="echoMode" >
+ <enum>QLineEdit::Normal</enum>
+ </property>
+ <property name="readOnly" >
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
</widget>
<widget class="QWidget" name="tab_settings" >
<attribute name="title" >
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-12 17:15:11 UTC (rev 161)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 19:34:10 UTC (rev 162)
@@ -18,10 +18,13 @@
"""pyMoul D'ni time tool
Based on informations from http://www.dpwr.net/archive.php?showarticle=2193
+Verified with http://home.earthlink.net/~seizuretown/myst/ccconverter.html
official sources say that:
00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE
+>>> from datetime import timedelta
+
>>> LEEFO_1_TABLE = [
... datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC),
... datetime(1999, 4, 21, 16, 24, 3, 0, tzinfo=UTC),
@@ -118,8 +121,8 @@
BASE_YEAR = 1998
SECONDS_PER_HAHR = 31556925
PRORAHN_PER_HAHR = 22656250
-FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR)
-FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR)
+FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) # 1.39285737931
+FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) # 0.717948596069
def valueCheck(typ, minv, maxv):
"""Value and type checking decorator
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-12 17:19:23
|
Revision: 161
http://pymoul.svn.sourceforge.net/pymoul/?rev=161&view=rev
Author: tiran
Date: 2007-02-12 09:15:11 -0800 (Mon, 12 Feb 2007)
Log Message:
-----------
Better round()
Added method to calculate seconds to next bell
Modified Paths:
--------------
pymoul/trunk/src/moul/time/dni.py
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-12 16:06:42 UTC (rev 160)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 17:15:11 UTC (rev 161)
@@ -34,10 +34,10 @@
>>> def compareDT(dt1, dt2):
... delta = td2sec(dt1 - dt2)
... # smaller than 5 seconds
-... if abs(delta) < 5:
+... if abs(delta) >0: # 1 off is fine
+... return delta
+... else:
... return True
-... else:
-... return delta
>>> dni = DniTime()
>>> dni.fromUTC(LEEFO_1_TABLE[1])
@@ -51,13 +51,20 @@
>>> other = datetime(2007, 2, 12, 13, 55, 10, 0, tzinfo=UTC)
>>> dni.fromUTC(other)
>>> dni.get()
-(9662, 9, 4, 4, 21, 24, 21)
+(9662, 9, 4, 4, 21, 24, 22)
>>> str(dni)
-'04:21:24:21, Leevotar 4, 9662'
+'04:21:24:22, Leevotar 4, 9662'
>>> compareDT(dni.toUTC(), other)
True
+>>> dni.bell
+24
+>>> dni.secondsToBell(25)
+2616
+>>> dni.secondsToBell(18)
+80964
+
"""
__author__ = "Christian Heimes"
__version__ = "$Id$"
@@ -185,17 +192,29 @@
if utc_dt is None:
utc_dt = utcnow()
sec = td2sec(utc_dt - BASE)
- prorahn = int(sec * FACTOR_PS)
+ prorahn = int(round(sec * FACTOR_PS))
self.set(hahr=BASE_HAHR, prorahn=prorahn)
def toUTC(self):
"""Convert to UTC datetime value
"""
hahr_sec = (self.hahr - BASE_HAHR) * SECONDS_PER_HAHR
- prorahn_sec = int(self._prorahn * FACTOR_SP)
+ prorahn_sec = int(round(self._prorahn * FACTOR_SP))
sec = hahr_sec + BASE_SEC + prorahn_sec
return UTC.localize(datetime.utcfromtimestamp(sec))
+ def secondsToBell(self, bell):
+ """Calculate seconds until bell
+ """
+ if bell < 1 or bell > 25:
+ raise ValueError("%s too large or small" % bell)
+ pro = self.prorahnOfYahr() # prorahn of day
+ probells = bell * 3125 # prorahn of start of bell
+ diff = probells - pro
+ if diff < 0:
+ diff = diff + 78125
+ return int(round(diff * FACTOR_SP))
+
def __str__(self):
"""00:00:00:00, Leefo 1, 9654
"""
@@ -228,10 +247,6 @@
self._addProrahn(value * 78125)
yahr = property(_getYahr, _setYahr)
- def _getBell(self):
- return (self.gahrtahvo // 5) % 25
- bell = property(_getBell)
-
def _getGahrtahvo(self):
return (self._prorahn // 15625) % 5
@valueCheck(int, 0, 5)
@@ -239,6 +254,10 @@
self._addProrahn(value * 15625)
gahrtahvo = property(_getGahrtahvo, _setGahrtahvo)
+ def _getBell(self):
+ return (self._prorahn // 3125) % 25
+ bell = property(_getBell)
+
def _getTahvo(self):
return (self._prorahn // 625) % 25
@valueCheck(int, 0, 25)
@@ -261,9 +280,15 @@
prorahn = property(_getProrahn, _setProrahn)
def _addProrahn(self, value):
- value = int(value)
+ value = int(round(value))
addhahr = value // PRORAHN_PER_HAHR
if addhahr:
self._hahr += addhahr
value = value - (addhahr * PRORAHN_PER_HAHR)
self._prorahn = value
+
+ def prorahnOfYahr(self):
+ """Get numbers of prorahntee since start of yahr
+ """
+ return (self.gahrtahvo * 15625 + self.tahvo * 625 +
+ self.gorahn * 25 + self.prorahn)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-12 16:06:48
|
Revision: 160
http://pymoul.svn.sourceforge.net/pymoul/?rev=160&view=rev
Author: tiran
Date: 2007-02-12 08:06:42 -0800 (Mon, 12 Feb 2007)
Log Message:
-----------
Finished D'ni time calculation
Modified Paths:
--------------
pymoul/trunk/src/moul/time/dni.py
Added Paths:
-----------
pymoul/trunk/src/moul/time/utils.py
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-12 13:36:09 UTC (rev 159)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 16:06:42 UTC (rev 160)
@@ -21,20 +21,43 @@
official sources say that:
00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE
+
>>> LEEFO_1_TABLE = [
-... datetime(1998, 4, 21, 10, 35, 18, 0, UTC),
-... datetime(1999, 4, 21, 16, 24, 3, 0, UTC),
-... datetime(2000, 4, 20, 22, 12, 48, 0, UTC),
-... datetime(2001, 4, 21, 4, 1, 33, 0, UTC),
-... datetime(2002, 4, 21, 9, 50, 18, 0, UTC),
-... datetime(2003, 4, 21, 15, 39, 3, 0, UTC),
+... datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC),
+... datetime(1999, 4, 21, 16, 24, 3, 0, tzinfo=UTC),
+... datetime(2000, 4, 20, 22, 12, 48, 0, tzinfo=UTC),
+... datetime(2001, 4, 21, 4, 1, 33, 0, tzinfo=UTC),
+... datetime(2002, 4, 21, 9, 50, 18, 0, tzinfo=UTC),
+... datetime(2003, 4, 21, 15, 39, 3, 0, tzinfo=UTC),
... ]
+>>> def compareDT(dt1, dt2):
+... delta = td2sec(dt1 - dt2)
+... # smaller than 5 seconds
+... if abs(delta) < 5:
+... return True
+... else:
+... return delta
+
>>> dni = DniTime()
>>> dni.fromUTC(LEEFO_1_TABLE[1])
>>> dni.get()
-(9655, 0, 0, 0, 0, 0, 0)
+(9655, 1, 1, 0, 0, 0, 0)
+>>> str(dni)
+'00:00:00:00, Leefo 1, 9655'
+>>> compareDT(dni.toUTC(), LEEFO_1_TABLE[1])
+True
+>>> other = datetime(2007, 2, 12, 13, 55, 10, 0, tzinfo=UTC)
+>>> dni.fromUTC(other)
+>>> dni.get()
+(9662, 9, 4, 4, 21, 24, 21)
+>>> str(dni)
+'04:21:24:21, Leevotar 4, 9662'
+
+>>> compareDT(dni.toUTC(), other)
+True
+
"""
__author__ = "Christian Heimes"
__version__ = "$Id$"
@@ -43,6 +66,7 @@
from datetime import datetime
from operator import mul
from pytz import utc as UTC
+from time import mktime
import sys
from moul.time.utils import td2sec
@@ -79,12 +103,16 @@
)
# 00:00:00:00, Leefo 1, 9654 DE
-BASE = datetime(1998, 4, 21, 10, 35, 18, 0, UTC)
+BASE = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC)
+# timestamp 0 - start of unix time
+UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC)
+BASE_SEC = td2sec(BASE-UNIX_0) # WTF? datetime has no totimestamp() method
BASE_HAHR = 9654
+BASE_YEAR = 1998
SECONDS_PER_HAHR = 31556925
PRORAHN_PER_HAHR = 22656250
-FACTOR_SH = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR)
-FACTOR_HS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR)
+FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR)
+FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR)
def valueCheck(typ, minv, maxv):
"""Value and type checking decorator
@@ -157,14 +185,25 @@
if utc_dt is None:
utc_dt = utcnow()
sec = td2sec(utc_dt - BASE)
- prorahn = sec * FACTOR_HS
+ prorahn = int(sec * FACTOR_PS)
self.set(hahr=BASE_HAHR, prorahn=prorahn)
def toUTC(self):
"""Convert to UTC datetime value
"""
- raise NotImplementedError
+ hahr_sec = (self.hahr - BASE_HAHR) * SECONDS_PER_HAHR
+ prorahn_sec = int(self._prorahn * FACTOR_SP)
+ sec = hahr_sec + BASE_SEC + prorahn_sec
+ return UTC.localize(datetime.utcfromtimestamp(sec))
+ def __str__(self):
+ """00:00:00:00, Leefo 1, 9654
+ """
+ return ("%02i:%02i:%02i:%02i, %s %i, %i" % (
+ self.gahrtahvo, self.tahvo, self.gorahn, self.prorahn,
+ self.getVaileeName(), self.yahr, self.hahr
+ ))
+
def _getHahr(self):
return self._hahr
@valueCheck(int, 0, sys.maxint)
@@ -173,42 +212,42 @@
hahr = property(_getHahr, _setHahr)
def _getVailee(self):
- return self._prorahn // 2265625
+ return ((self._prorahn // 2265625) % 10) +1
@valueCheck(int, 0, 10)
def _setVailee(self, value):
self._addProrahn(value * 2265625)
vailee = property(_getVailee, _setVailee)
def getVaileeName(self):
- return VAILEETEE[self.vailee]
+ return VAILEETEE[self.vailee-1]
def _getYahr(self):
- return self._prorahn // 78125
+ return ((self._prorahn // 78125) % 29) +1
@valueCheck(int, 0, 29)
def _setYahr(self, value):
self._addProrahn(value * 78125)
yahr = property(_getYahr, _setYahr)
def _getBell(self):
- return self.gahrtahvo // 5
+ return (self.gahrtahvo // 5) % 25
bell = property(_getBell)
def _getGahrtahvo(self):
- return self._prorahn // 15625
+ return (self._prorahn // 15625) % 5
@valueCheck(int, 0, 5)
def _setGahrtahvo(self, value):
self._addProrahn(value * 15625)
gahrtahvo = property(_getGahrtahvo, _setGahrtahvo)
def _getTahvo(self):
- return self._prorahn // 625
+ return (self._prorahn // 625) % 25
@valueCheck(int, 0, 25)
def _setTahvo(self, value):
self._addProrahn(value * 625)
tahvo = property(_getTahvo, _setTahvo)
def _getGorahn(self):
- return self._prorahn // 25
+ return (self._prorahn // 25) % 25
@valueCheck(int, 0, 25)
def _setGorahn(self, value):
self._addProrahn(value * 25)
@@ -222,7 +261,9 @@
prorahn = property(_getProrahn, _setProrahn)
def _addProrahn(self, value):
- self._prorahn += int(value)
- addhahr = self._prorahn // PRORAHN_PER_HAHR
+ value = int(value)
+ addhahr = value // PRORAHN_PER_HAHR
if addhahr:
self._hahr += addhahr
+ value = value - (addhahr * PRORAHN_PER_HAHR)
+ self._prorahn = value
Added: pymoul/trunk/src/moul/time/utils.py
===================================================================
--- pymoul/trunk/src/moul/time/utils.py (rev 0)
+++ pymoul/trunk/src/moul/time/utils.py 2007-02-12 16:06:42 UTC (rev 160)
@@ -0,0 +1,74 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program 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 General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+"""pyMoul cavern time tool
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $"
+__revision__ = "$Revision: 124 $"
+
+from datetime import datetime
+from pytz import utc as UTC
+
+
+def diffTD(td1, td2):
+ """Difference of two time delta objects -> int
+
+ >>> from datetime import timedelta
+ >>> type(diffTD(timedelta(0, 3600), timedelta(0, -3600)))
+ <type 'int'>
+ >>> diffTD(timedelta(0, 3600), timedelta(0, -3600))
+ 7200
+ >>> diffTD(timedelta(0, 3600), timedelta(0, 3600))
+ 0
+ >>> diffTD(timedelta(0, -3600), timedelta(0, -3600))
+ 0
+ >>> diffTD(timedelta(0, -7200), timedelta(0, -3600))
+ -3600
+ >>> diffTD(timedelta(0, -3600), timedelta(0, -7200))
+ 3600
+ >>> diffTD(timedelta(0, 3600, 1), timedelta(0, -3600))
+ Traceback (most recent call last):
+ ...
+ ValueError: Can't handle microseconds
+ """
+ if td1.microseconds or td2.microseconds:
+ raise ValueError("Can't handle microseconds")
+ return (td1.seconds + 86400 * td1.days) - (td2.seconds + 86400 * td2.days)
+
+def td2sec(td):
+ """timedelta to seconds
+
+ >>> from datetime import timedelta
+ >>> td2sec(timedelta(0, 3600))
+ 3600
+ >>> td2sec(timedelta(0, -3600))
+ -3600
+ """
+ return td.seconds + 86400 * td.days
+
+def utcnow():
+ """Get current time in UTC
+ """
+ return UTC.localize(datetime.utcnow())
+
+def normalizeTZ(tz, utc_dt=None):
+ """Normalize a datetime object with UTC tz using another tz
+ """
+ if utc_dt is None:
+ utc_dt = utcnow()
+ return tz.normalize(utc_dt.astimezone(tz))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-12 13:36:27
|
Revision: 159
http://pymoul.svn.sourceforge.net/pymoul/?rev=159&view=rev
Author: tiran
Date: 2007-02-12 05:36:09 -0800 (Mon, 12 Feb 2007)
Log Message:
-----------
Added mac pathes
First work on DNI time module
Modified Paths:
--------------
pymoul/trunk/src/moul/log.py
pymoul/trunk/src/moul/osdependent/darwin/__init__.py
pymoul/trunk/src/moul/osdependent/linux/__init__.py
pymoul/trunk/src/moul/time/__init__.py
pymoul/trunk/src/moul/time/cavern.py
pymoul/trunk/src/moul/time/dni.py
pymoul/trunk/src/moul/time/tests/test_cavern.py
Modified: pymoul/trunk/src/moul/log.py
===================================================================
--- pymoul/trunk/src/moul/log.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/log.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -117,7 +117,7 @@
shdlr = logging.StreamHandler(sys.stderr)
shdlr.setFormatter(format)
root.addHandler(shdlr)
- _systemInfo()
+ #_systemInfo()
else:
_installMemoryHdlr()
_systemInfo()
Modified: pymoul/trunk/src/moul/osdependent/darwin/__init__.py
===================================================================
--- pymoul/trunk/src/moul/osdependent/darwin/__init__.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/osdependent/darwin/__init__.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -30,9 +30,17 @@
LOG = getLogger('moul.darwin')
LOG.critical('Darwin/Mac support is not tested')
-MOUL_DIR = "Uru Live"
-EXEC_NAME = "UruLauncher"
-HOME = os.environ['HOME']
+HOME = os.path.expanduser('~')
+MOUL_DIR = "Library/Preferences/UruLive Preferences/p_drive/My Documents/Uru Live"
+APP_PATH = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/transgaming/c_drive/Program Files/Uru Live/"
+APP_NAME = "Uru Live.app"
+EXEC_NAME = "???" # XXX
+UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater"
+LOCATIONS = [
+ "/Applications",
+ "%s/Applications" % HOME,
+ ]
+PYMOUL_DIR = "Library/Preferences/pyMoul"
def getMoulUserDataDir():
"""Get path of MOUL data directory
@@ -45,7 +53,7 @@
def getPyMoulDataDir():
"""Get path to the pyMoul ini directory
"""
- inidir= os.path.join(HOME, '.pymoul')
+ inidir= os.path.join(HOME, PYMOUL_DIR)
return inidir
def startMoul(installdir, *args, **kwargs):
Modified: pymoul/trunk/src/moul/osdependent/linux/__init__.py
===================================================================
--- pymoul/trunk/src/moul/osdependent/linux/__init__.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/osdependent/linux/__init__.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -31,10 +31,10 @@
LOG = getLogger('moul.linux')
LOG.critical('Linux support is not tested')
+HOME = os.path.expanduser('~')
MOUL_DIR = ".urulive"
INI_FILE = ('pyMoul', 'pymoul.ini')
EXEC_NAME = "UruLauncher"
-HOME = os.environ['HOME']
PROCESSES = ('urulauncher', 'uruexplorer')
LOCATIONS = [
"%s/dev/pymoul/MystOnline" % HOME,
Modified: pymoul/trunk/src/moul/time/__init__.py
===================================================================
--- pymoul/trunk/src/moul/time/__init__.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/time/__init__.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -20,3 +20,9 @@
__author__ = "Christian Heimes"
__version__ = "$Id$"
__revision__ = "$Revision$"
+
+from moul.osdependent import __FROZEN__
+# pytz is an egg
+if not __FROZEN__:
+ import pkg_resources
+ pkg_resources.require("pytz>=2006p")
Modified: pymoul/trunk/src/moul/time/cavern.py
===================================================================
--- pymoul/trunk/src/moul/time/cavern.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/time/cavern.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -24,17 +24,15 @@
__all__ = ['CavernTime']
from datetime import datetime
-
-from moul.osdependent import __FROZEN__
-# pytz is an egg
-if not __FROZEN__:
- import pkg_resources
- pkg_resources.require("pytz>=2006p")
-
from pytz import all_timezones
from pytz import timezone
from pytz import utc as UTC
+from moul.time.utils import td2sec
+from moul.time.utils import diffTD
+from moul.time.utils import utcnow
+from moul.time.utils import normalizeTZ
+
## not used in the current version
#SUPPORTED_TZ = ('America', 'Canada', 'Etc', 'Europe', 'US')
#ADDITIONAL_TZ = ('GMT', 'UTC')
@@ -73,42 +71,6 @@
PACIFIC_TZ_NAME = ('US/Pacific', 'PST', 'PDT') # PST / PDT
PACIFIC_TZ = timezone(PACIFIC_TZ_NAME[0])
-def diffTD(td1, td2):
- """Difference of two time delta objects -> int
-
- >>> from datetime import timedelta
- >>> type(diffTD(timedelta(0, 3600), timedelta(0, -3600)))
- <type 'int'>
- >>> diffTD(timedelta(0, 3600), timedelta(0, -3600))
- 7200
- >>> diffTD(timedelta(0, 3600), timedelta(0, 3600))
- 0
- >>> diffTD(timedelta(0, -3600), timedelta(0, -3600))
- 0
- >>> diffTD(timedelta(0, -7200), timedelta(0, -3600))
- -3600
- >>> diffTD(timedelta(0, -3600), timedelta(0, -7200))
- 3600
- >>> diffTD(timedelta(0, 3600, 1), timedelta(0, -3600))
- Traceback (most recent call last):
- ...
- ValueError: Can't handle microseconds
- """
- if td1.microseconds or td2.microseconds:
- raise ValueError("Can't handle microseconds")
- return (td1.seconds + 86400 * td1.days) - (td2.seconds + 86400 * td2.days)
-
-def td2int(td):
- """timedelta to int
-
- >>> from datetime import timedelta
- >>> td2int(timedelta(0, 3600))
- 3600
- >>> td2int(timedelta(0, -3600))
- -3600
- """
- return td.seconds + 86400 * td.days
-
class CavernTime(object):
"""Cavern time calculator
@@ -167,41 +129,27 @@
_cavern_name = CAVERN_TZ_NAME
_pacific = PACIFIC_TZ
_pacific_name = PACIFIC_TZ_NAME
-
- @staticmethod
- def _utcnow():
- """Get current time in UTC
- """
- return UTC.localize(datetime.utcnow())
- @staticmethod
- def _normalize(tz, utc_dt=None):
- """Normalize a datetime object with UTC tz using another tz
- """
- if utc_dt is None:
- utc_dt = self._utcnow()
- return tz.normalize(utc_dt.astimezone(tz))
-
def __call__(self):
- now = self._utcnow()
+ now = utcnow()
result = {}
for id, tz in (('cavern', self._cavern), ('pacific', self._pacific)):
- result[id] = self._normalize(tz, now)
+ result[id] = normalizeTZ(tz, now)
return result
def info(self):
- now = self._utcnow()
+ now = utcnow()
result = {}
for id, tz in (('cavern', self._cavern), ('pacific', self._pacific)):
info = result.setdefault(id, {})
- utcoffset = td2int(tz.utcoffset(now))
+ utcoffset = td2sec(tz.utcoffset(now))
signum = utcoffset < 0 and '-' or '+'
info['tz'] = tz
info['utcoffset'] = signum,int(utcoffset/3600), float((utcoffset%3600)/3600.0)
- info['datetime'] = self._normalize(tz, now)
+ info['datetime'] = normalizeTZ(tz, now)
info['name'] = str(tz)
info['id'] = tz._tzname
- info['dst'] = td2int(tz.dst(now))
+ info['dst'] = td2sec(tz.dst(now))
result['utc'] = {'datetime' : now}
return result
Modified: pymoul/trunk/src/moul/time/dni.py
===================================================================
--- pymoul/trunk/src/moul/time/dni.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -15,53 +15,94 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59
# Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
-"""pyMoul D'ni time tool
+"""pyMoul D'ni time tool
+
+Based on informations from http://www.dpwr.net/archive.php?showarticle=2193
+
+official sources say that:
+00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE
+>>> LEEFO_1_TABLE = [
+... datetime(1998, 4, 21, 10, 35, 18, 0, UTC),
+... datetime(1999, 4, 21, 16, 24, 3, 0, UTC),
+... datetime(2000, 4, 20, 22, 12, 48, 0, UTC),
+... datetime(2001, 4, 21, 4, 1, 33, 0, UTC),
+... datetime(2002, 4, 21, 9, 50, 18, 0, UTC),
+... datetime(2003, 4, 21, 15, 39, 3, 0, UTC),
+... ]
+
+>>> dni = DniTime()
+>>> dni.fromUTC(LEEFO_1_TABLE[1])
+>>> dni.get()
+(9655, 0, 0, 0, 0, 0, 0)
+
"""
__author__ = "Christian Heimes"
__version__ = "$Id$"
__revision__ = "$Revision$"
+from datetime import datetime
from operator import mul
+from pytz import utc as UTC
+import sys
+from moul.time.utils import td2sec
+from moul.time.utils import utcnow
-FARAH_1 = -7656 # hahrtee fahrah 1 starts at April 21st 7656 B.C
+
+FAHRAH_1 = -7656 # hahrtee fahrah 1 starts at April 21st 7656 B.C
+
+# name -> amount of smaller element, e.g. a hartee fahrah as 625 hahr
DNI_FACTORS = (
('hahrtee fahrah', 625),
- ('hahr', 10),
- ('vai-lee', 29),
- ('yahr', 5),
- ('gahr-tah-vo', 25),
- ('tah-vo', 25),
- ('gor-ahn', 25),
- ('pro-rahn', 1),
-)
+ ('hahr', 10), # year
+ ('vai-lee', 29), # month
+ ('yahr', 5), # day (~30h and 14min)
+ # bell - each yahr has 25 bells (~74 min)
+ ('gahr-tah-vo', 25), # ~6h 3min
+ ('tah-vo', 25), # ~14,5 min
+ ('gor-ahn', 25), # ~34,8 seconds
+ ('pro-rahn', None), # ~1.39 seconds
+ )
-VAILATEE = (
- ('Leefo', ( 4, 21), ( 5, 27)), # 1: April 21st to May 27th
- ('Leebro', ( 5, 28), ( 7, 3)), # 2: May 28th to July 3rd
- ('Leesahn', ( 7, 3), ( 8, 8)), # 3: July 3rd to August 8th
- ('Leetar', ( 8, 9), ( 9, 15)), # 4: August 9th and September 14th
- ('Leevot', ( 9, 14), (10, 20)), # 5: September 14th to October 20th
- ('Leevofo', (10, 21), (11, 26)), # 6: October 21st to November 26th
- ('Leevobro', (11, 26), ( 1, 1)), # 7: November 26th to January 1st
- ('Leevosahn', ( 1, 2), ( 2, 7)), # 8: January 2nd to February 7th
- ('Leevotar', ( 2, 7), ( 3, 15)), # 9: February 7th to March 15th
- ('Leenovoo', ( 3, 16), ( 4, 21)), # 10: March 16th to April 21st
-)
+# list of month names with approx. dates
+VAILEETEE = (
+ 'Leefo', # 1: April 21st to May 27th
+ 'Leebro', # 2: May 28th to July 3rd
+ 'Leesahn', # 3: July 3rd to August 8th
+ 'Leetar', # 4: August 9th and September 14th
+ 'Leevot', # 5: September 14th to October 20th
+ 'Leevofo', # 6: October 21st to November 26th
+ 'Leevobro', # 7: November 26th to January 1st
+ 'Leevosahn', # 8: January 2nd to February 7th
+ 'Leevotar', # 9: February 7th to March 15th
+ 'Leenovoo', # 10: March 16th to April 21st
+ )
-PRORAHN_PER_HAHR = reduce(mul,
- [float(factor) for name, factor in DNI_FACTORS[1:-1]])
+# 00:00:00:00, Leefo 1, 9654 DE
+BASE = datetime(1998, 4, 21, 10, 35, 18, 0, UTC)
+BASE_HAHR = 9654
+SECONDS_PER_HAHR = 31556925
+PRORAHN_PER_HAHR = 22656250
+FACTOR_SH = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR)
+FACTOR_HS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR)
-# Official SI year 365.25 days = 31.557.600 seconds
-YEAR_SI = 31557600
-# Sidereal year: 365.256 363 051 days (365 d 6 h 9 min 9 s)
-# YEAR_SIDEREAL = (((((365 * 24) + 6 ) * 60 ) + 9 ) * 60 ) + 9
-YEAR = float(YEAR_SI)
+def valueCheck(typ, minv, maxv):
+ """Value and type checking decorator
+ """
+ def wrapper(func):
+ def checker(self, value):
+ if not isinstance(value, typ):
+ raise TypeError("%s <%s>" % (value, type(value)))
+ if value < minv or value > maxv:
+ raise ValueError("%s not in (%i, %i)" % (value, minv, maxv))
+ return func(self, value)
+ checker.__doc__ = func.__doc__
+ checker.__name__ = func.__name__
+ return checker
+ return wrapper
-FACTOR = YEAR / PRORAHN_PER_HAHR
-
class DniTime(object):
- """D'ni time handler
+ """D'ni time representation
The D'ni were using a complex calendar based on a pentovigesimal (25)
numbering system.
@@ -91,11 +132,97 @@
gorahn minute 36 seconds
prorahn second about 1.3929 seconds
"""
- _fahrah = None # millenium (625 years)
- _hahr = None # year (1 year)
- _vailee = None # month (10 per year)
- _yahr = None # day (29 per vailee)
- _gahrtahvo = None # section (about 6h, 3min)
- _tahvo = None # quarter (about 14,5min)
- _gorahn = None # minute (about 36 seconds)
- _prorahn = None # second (1,4 seconds)
+ def __init__(self, hahr=0, vailee=0, yahr=0, gahrtahvo=0, tahvo=0,
+ gorahn=0, prorahn=0):
+ self.set(hahr, vailee, yahr, gahrtahvo, tahvo, gorahn, prorahn)
+
+ def set(self, hahr=0, vailee=0, yahr=0, gahrtahvo=0, tahvo=0,
+ gorahn=0, prorahn=0):
+ self.hahr = hahr
+ self._prorahn = 0
+ self.vailee = vailee
+ self.yahr = yahr
+ self.gahrtahvo = gahrtahvo
+ self.tahvo = tahvo
+ self.gorahn = gorahn
+ self._addProrahn(prorahn)
+
+ def get(self):
+ return (self.hahr, self.vailee, self.yahr, self.gahrtahvo, self.tahvo,
+ self.gorahn, self.prorahn)
+
+ def fromUTC(self, utc_dt=None):
+ """Convert from UTC datetime
+ """
+ if utc_dt is None:
+ utc_dt = utcnow()
+ sec = td2sec(utc_dt - BASE)
+ prorahn = sec * FACTOR_HS
+ self.set(hahr=BASE_HAHR, prorahn=prorahn)
+
+ def toUTC(self):
+ """Convert to UTC datetime value
+ """
+ raise NotImplementedError
+
+ def _getHahr(self):
+ return self._hahr
+ @valueCheck(int, 0, sys.maxint)
+ def _setHahr(self, value):
+ self._hahr = value
+ hahr = property(_getHahr, _setHahr)
+
+ def _getVailee(self):
+ return self._prorahn // 2265625
+ @valueCheck(int, 0, 10)
+ def _setVailee(self, value):
+ self._addProrahn(value * 2265625)
+ vailee = property(_getVailee, _setVailee)
+
+ def getVaileeName(self):
+ return VAILEETEE[self.vailee]
+
+ def _getYahr(self):
+ return self._prorahn // 78125
+ @valueCheck(int, 0, 29)
+ def _setYahr(self, value):
+ self._addProrahn(value * 78125)
+ yahr = property(_getYahr, _setYahr)
+
+ def _getBell(self):
+ return self.gahrtahvo // 5
+ bell = property(_getBell)
+
+ def _getGahrtahvo(self):
+ return self._prorahn // 15625
+ @valueCheck(int, 0, 5)
+ def _setGahrtahvo(self, value):
+ self._addProrahn(value * 15625)
+ gahrtahvo = property(_getGahrtahvo, _setGahrtahvo)
+
+ def _getTahvo(self):
+ return self._prorahn // 625
+ @valueCheck(int, 0, 25)
+ def _setTahvo(self, value):
+ self._addProrahn(value * 625)
+ tahvo = property(_getTahvo, _setTahvo)
+
+ def _getGorahn(self):
+ return self._prorahn // 25
+ @valueCheck(int, 0, 25)
+ def _setGorahn(self, value):
+ self._addProrahn(value * 25)
+ gorahn = property(_getGorahn, _setGorahn)
+
+ def _getProrahn(self):
+ return self._prorahn % 25
+ @valueCheck(int, 0, 25)
+ def _setProrahn(self, value):
+ self._prorahn+= value
+ prorahn = property(_getProrahn, _setProrahn)
+
+ def _addProrahn(self, value):
+ self._prorahn += int(value)
+ addhahr = self._prorahn // PRORAHN_PER_HAHR
+ if addhahr:
+ self._hahr += addhahr
Modified: pymoul/trunk/src/moul/time/tests/test_cavern.py
===================================================================
--- pymoul/trunk/src/moul/time/tests/test_cavern.py 2007-02-10 16:01:28 UTC (rev 158)
+++ pymoul/trunk/src/moul/time/tests/test_cavern.py 2007-02-12 13:36:09 UTC (rev 159)
@@ -31,6 +31,7 @@
def test_suite():
return unittest.TestSuite((
DocTestSuite('moul.time.cavern'),
+ DocTestSuite('moul.time.utils'),
))
if __name__ == '__main__':
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-10 16:01:33
|
Revision: 158
http://pymoul.svn.sourceforge.net/pymoul/?rev=158&view=rev
Author: tiran
Date: 2007-02-10 08:01:28 -0800 (Sat, 10 Feb 2007)
Log Message:
-----------
Added binary record
Modified Paths:
--------------
pymoul/trunk/src/moul/crypt/binary.py
Added Paths:
-----------
pymoul/trunk/src/moul/crypt/binaryrecord.py
pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py
Modified: pymoul/trunk/src/moul/crypt/binary.py
===================================================================
--- pymoul/trunk/src/moul/crypt/binary.py 2007-02-10 13:14:18 UTC (rev 157)
+++ pymoul/trunk/src/moul/crypt/binary.py 2007-02-10 16:01:28 UTC (rev 158)
@@ -25,6 +25,9 @@
from struct import unpack
from struct import calcsize
+from moul.crypt.binaryrecord import parseRecord
+from moul.crypt.binaryrecord import registerRecord
+
class BinaryFile(file):
"""Binary file
@@ -136,6 +139,13 @@
def readString32(self, terminate=False):
return String32('', terminate=terminate).readfd(self)
+ def readRecord(self, name):
+ return parseRecord(name, self)
+
+ @staticmethod
+ def registerRecord(name, fmt):
+ return registerRecord(name, fmt)
+
#write
def writeChar(self, data, _pack=pack):
self.write(_pack('<c', data))
@@ -198,6 +208,9 @@
def writeString32(self, data, terminate=False):
String32(data, terminate=terminate).writefd(self)
+ def writeRecord(self, rec):
+ self.write(rec.read())
+
class AbstractString(object):
"""Abstract string class
"""
Added: pymoul/trunk/src/moul/crypt/binaryrecord.py
===================================================================
--- pymoul/trunk/src/moul/crypt/binaryrecord.py (rev 0)
+++ pymoul/trunk/src/moul/crypt/binaryrecord.py 2007-02-10 16:01:28 UTC (rev 158)
@@ -0,0 +1,170 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program 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 General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+"""Binary file helper: Records
+
+This module is roughly based on Maciej Obarski's recipe "parse and create
+fixed size binary data" from
+http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/465219
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id"
+__revision__ = "$Revision"
+
+from struct import pack
+from struct import unpack
+from struct import calcsize
+
+_marker = object()
+
+class RecordRegistry(dict):
+ """Registry for record definitions
+ """
+ __slots__ = ()
+ def register(self, name, fmt):
+ """Register a format by name
+
+ @param name: name of the format
+ @type name: str
+ @param fmt: a record format
+ @type fmt: str
+
+ Example:
+ >>> reg = RecordRegistry()
+ >>> registerRecord = reg.register
+ >>> parseRecord = reg.parse
+ >>> obj = registerRecord("connection", "4B.ip >H.port >I.session_id")
+ >>> isinstance(obj, RecordDefinition)
+ True
+ >>> data = "\\xc0\\xa8\\x00\\x01" + "\\x00P" + "\\xFE\\xDC\\xBA\\x98"
+
+ >>> rec = parseRecord("connection", data)
+ >>> rec.ip
+ (192, 168, 0, 1)
+ >>> rec.port
+ 80
+ >>> rec.session_id
+ 4275878552L
+ >>> rec.read() == data or rec.read()
+ True
+ """
+ if name in self:
+ raise NameError("%s already registered!" % name)
+ self[name] = RecordDefinition(name, fmt)
+ return self[name]
+
+ def parse(self, name, fd_data):
+ """Parse data using the RecordDefinition 'name'
+
+ @param name: name of the format
+ @type name: str
+ @param fd_data: data to parse: either a string or an open file
+ @type fd_data: str or file
+ """
+ return self[name](fd_data)
+
+class RecordDefinition(object):
+ """A record definition
+ """
+ __slots__ = ('_fields', '_recordsize', '_name')
+
+ def __init__(self, name, recordfmt):
+ self._name = name
+ self._fields = []
+ pos = 0
+ for field in recordfmt.split():
+ if field.startswith('#'):
+ continue
+ fmt, name = field.split('.')
+ if '#' in name:
+ name = name.split('#')[0]
+ name = name.strip()
+ size = calcsize(fmt)
+ self._fields.append((name, fmt, pos, pos+size))
+ pos += size
+
+ self._recordsize = pos
+
+ @property
+ def name(self):
+ return self._name
+
+ @property
+ def size(self):
+ return self._recordsize
+
+ def __call__(self, fd_data):
+ """Parse data using the format string
+
+ @param fd_data: data to parse: either a string or an open file
+ @type fd_data: str or file
+ """
+ if isinstance(fd_data, basestring):
+ # handle string
+ data = fd_data
+ elif hasattr(fd_data, 'read'):
+ data = fd_data.read(self._recordsize)
+ else:
+ raise TypeError(type(fd_data))
+ if len(data) != self._recordsize:
+ raise ValueError("Data has wrong size: %i, required: %i" %
+ (len(data), self._recordsize))
+ return Record(self._fields, data)
+
+class Record(object):
+ __slots__ = ('_fields', '_data')
+
+ def __init__(self, fields, data=None):
+ self._fields = fields
+ self._data = {}
+ if data is not None:
+ self.write(data)
+
+ def write(self, data):
+ """Write data
+
+ Creates the instance attributes defined in fmt
+ """
+ for name, fmt, start, stop in self._fields:
+ value = unpack(fmt, data[start:stop])
+ if len(value) == 1:
+ value = value[0]
+ self._data[name] = value
+
+ def read(self):
+ """Convert data to binary string
+ """
+ result = []
+ for name, fmt, start, stop in self._fields:
+ value = self._data[name]
+ if not isinstance(value, (tuple, list)):
+ value = (value,)
+ result.append(pack(fmt, *value))
+ return ''.join(result)
+
+ def __getattr__(self, name, default=_marker):
+ value = self._data.get(name, default)
+ if value is _marker:
+ raise AttributeError(name)
+ return value
+
+ def __str__(self):
+ return self.read()
+
+_recordRegistry = RecordRegistry()
+registerRecord = _recordRegistry.register
+parseRecord = _recordRegistry.parse
Added: pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py
===================================================================
--- pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py (rev 0)
+++ pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py 2007-02-10 16:01:28 UTC (rev 158)
@@ -0,0 +1,38 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program 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 General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+"""moul.crypt.binaryrecord unit tests
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id: test_elf.py 122 2007-02-02 17:34:06Z tiran $"
+__revision__ = "$Revision: 122 $"
+
+import os
+import unittest
+from doctest import DocTestSuite
+
+import moul.crypt.binaryrecord
+
+def test_suite():
+ return unittest.TestSuite((
+ DocTestSuite('moul.crypt.binaryrecord'),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest="test_suite")
+
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-10 13:14:21
|
Revision: 157
http://pymoul.svn.sourceforge.net/pymoul/?rev=157&view=rev
Author: tiran
Date: 2007-02-10 05:14:18 -0800 (Sat, 10 Feb 2007)
Log Message:
-----------
Updated binary file, added String16, String32 and UruString
Added unit tests
Modified Paths:
--------------
pymoul/trunk/src/moul/crypt/binary.py
Added Paths:
-----------
pymoul/trunk/src/moul/crypt/tests/test_binary.py
Property Changed:
----------------
pymoul/trunk/src/moul/crypt/binary.py
Modified: pymoul/trunk/src/moul/crypt/binary.py
===================================================================
--- pymoul/trunk/src/moul/crypt/binary.py 2007-02-08 20:02:58 UTC (rev 156)
+++ pymoul/trunk/src/moul/crypt/binary.py 2007-02-10 13:14:18 UTC (rev 157)
@@ -18,14 +18,12 @@
"""Binary file helper
"""
__author__ = "Christian Heimes"
-__version__ = "$Id: elf.py 122 2007-02-02 17:34:06Z tiran $"
-__revision__ = "$Revision: 122 $"
+__version__ = "$Id"
+__revision__ = "$Revision"
-from _struct import Struct
from struct import pack
from struct import unpack
from struct import calcsize
-from tempfile import NamedTemporaryFile
class BinaryFile(file):
"""Binary file
@@ -48,15 +46,22 @@
- double: readDouble / writeDouble
- packed data: readPacked(fmt) / writePacked(fmt, data)
- quad (two int16): readQuad / writeQuad)
+ - NULL: read0 / write0
+ - null string: readString0 / writeString0 (size is string + NULL)
+ - uru string: readUruString(version), writeUruString
+ - string w/ 16bit size header: readString16(null terminated) / writeString16
+ - string w/ 32bit size header: readString32(null terminated) / writeString32
For conveniance the class has a size() method
-
- The class is using some optimization tricks like using _struct.Struct
- directly and binding functions to the local namespace of a method.
+
+ The class is using some optimization tricks like binding functions to the
+ local namespace of a method.
"""
def __new__(cls, fname, mode='rb'):
assert 'b' in mode
- return file.__new__(cls, fname, mode)
+ self = file.__new__(cls, fname, mode)
+ self.NULL = '\x00'
+ return self
def size(self):
pos = self.tell()
@@ -66,93 +71,296 @@
finally:
self.seek(pos)
- def readChar(self, __unpack=Struct('<c').unpack):
- return __unpack(self.read(1))[0]
+ def readChar(self, _unpack=unpack):
+ return _unpack('<c', self.read(1))[0]
- def readByte(self, __unpack=Struct('<B').unpack):
- return __unpack(self.read(1))[0]
+ def readByte(self, _unpack=unpack):
+ return _unpack('<B',self.read(1))[0]
- def readBool(self, __unpack=Struct('<B').unpack):
- return bool(__unpack(self.read(1))[0])
+ def readBool(self, _unpack=unpack):
+ return bool(_unpack('<B', self.read(1))[0])
- def read8(self, __unpack=Struct('<B').unpack):
- return __unpack(self.read(1))[0]
+ def read8(self, _unpack=unpack):
+ return _unpack('<B', self.read(1))[0]
- def read8s(self, __unpack=Struct('<b').unpack):
- return __unpack(self.read(1))[0]
+ def read8s(self, _unpack=unpack):
+ return _unpack('<b', self.read(1))[0]
- def read16(self, __unpack=Struct('<H').unpack):
- return __unpack(self.read(2))[0]
+ def read16(self, _unpack=unpack):
+ return _unpack('<H', self.read(2))[0]
- def read16s(self, __unpack=Struct('<h').unpack):
- return __unpack(self.read(2))[0]
+ def read16s(self, _unpack=unpack):
+ return _unpack('<h', self.read(2))[0]
- def read32(self, __unpack=Struct('<I').unpack):
- return __unpack(self.read(4))[0]
+ def read32(self, _unpack=unpack):
+ return _unpack('<I', self.read(4))[0]
- def read32s(self, __unpack=Struct('<i').unpack):
- return __unpack(self.read(4))[0]
+ def read32s(self, _unpack=unpack):
+ return _unpack('<i', self.read(4))[0]
- def read64(self, __unpack=Struct('<Q').unpack):
- return __unpack(self.read(8))[0]
+ def read64(self, _unpack=unpack):
+ return _unpack('<Q', self.read(8))[0]
- def read64s(self, __unpack=Struct('<q').unpack):
- return __unpack(self.read(8))[0]
+ def read64s(self, _unpack=unpack):
+ return _unpack('<q',self.read(8))[0]
- def readQuad(self, __unpack=Struct('<2I').unpack):
- return __unpack(self.read(8))
+ def readQuad(self, _unpack=unpack):
+ return _unpack('<2I', self.read(8))
- def readFloat(self, __unpack=Struct('<f').unpack):
- return __unpack(self.read(4))[0]
+ def readFloat(self, _unpack=unpack):
+ return _unpack('<f', self.read(4))[0]
- def readDouble(self, __unpack=Struct('<d').unpack):
- return __unpack(self.read(8))[0]
+ def readDouble(self, _unpack=unpack):
+ return _unpack('<d', self.read(8))[0]
- def readPacked(self, fmt):
+ def readPacked(self, fmt, _unpack=unpack):
return unpack(fmt, self.read(calcsize(fmt)))
+ def read0(self):
+ null = self.read(1)
+ if null != self.NULL:
+ raise ValueError("%s != NULL at %i" % (null, self.tell()-1))
+ return null
+
+ def readUruString(self, version=5):
+ return UruString('', version=version).readfd(self)
+
+ def readString0(self, size):
+ s = self.read(size-1)
+ self.read0()
+ return s
+
+ def readString16(self, terminate=False):
+ return String16('', terminate=terminate).readfd(self)
+
+ def readString32(self, terminate=False):
+ return String32('', terminate=terminate).readfd(self)
+
#write
- def writeChar(self, data, __pack=Struct('<c').pack):
- self.write(__pack(data))
+ def writeChar(self, data, _pack=pack):
+ self.write(_pack('<c', data))
- def writeByte(self, data, __pack=Struct('<B').pack):
- self.write(__pack(data))
+ def writeByte(self, data, _pack=pack):
+ self.write(_pack('<B', data))
- def writeBool(self, data, __pack=Struct('<B').pack):
- self.write(__pack(data))
+ def writeBool(self, data, _pack=pack):
+ self.write(_pack('<B', bool(data)))
- def write8(self, data, __pack=Struct('<B').pack):
- self.write(__pack(data))
+ def write8(self, data, _pack=pack):
+ self.write(_pack('<B', data))
- def write8s(self, data, __pack=Struct('<b').pack):
- self.write(__pack(data))
+ def write8s(self, data, _pack=pack):
+ self.write(_pack('<b', data))
- def write16(self, data, __pack=Struct('<H').pack):
- self.write(__pack(data))
+ def write16(self, data, _pack=pack):
+ self.write(_pack('<H', data))
- def write16s(self, data, __pack=Struct('<h').pack):
- self.write(__pack(data))
+ def write16s(self, data, _pack=pack):
+ self.write(_pack('<h', data))
- def write32(self, data, __pack=Struct('<I').pack):
- self.write(__pack(data))
+ def write32(self, data, _pack=pack):
+ self.write(_pack('<I', data))
- def write32s(self, data, __pack=Struct('<i').pack):
- self.write(__pack(data))
+ def write32s(self, data, _pack=pack):
+ self.write(_pack('<i', data))
- def write64(self, data, __pack=Struct('<Q').pack):
- self.write(__pack(data))
+ def write64(self, data, _pack=pack):
+ self.write(_pack('<Q', data))
- def write64s(self, data, __pack=Struct('<q').pack):
- self.write(__pack(data))
+ def write64s(self, data, _pack=pack):
+ self.write(_pack('<q', data))
- def writeQuad(self, data, __pack=Struct('<2I').pack):
- self.write(__pack(data))
+ def writeQuad(self, tupl, _pack=pack):
+ self.write(_pack('<2I', *tupl))
- def writeFloat(self, data, __pack=Struct('<f').pack):
- self.write(__pack(data))
+ def writeFloat(self, data, _pack=pack):
+ self.write(_pack('<f', data))
- def writeDouble(self, data, __pack=Struct('<d').pack):
- self.write(__pack(data))
+ def writeDouble(self, data, _pack=pack):
+ self.write(_pack('<d', data))
+ def write0(self):
+ self.write(self.NULL)
+
+ def writeString0(self, s):
+ self.write(s)
+ self.write0()
+
def writePacked(self, data, fmt):
- return self.write(pack(fmt, data))
+ self.write(pack(fmt, data))
+
+ def writeUruString(self, data, version=5):
+ UruString(data, version=version).writefd(self)
+
+ def writeString16(self, data, terminate=False):
+ String16(data, terminate=terminate).writefd(self)
+
+ def writeString32(self, data, terminate=False):
+ String32(data, terminate=terminate).writefd(self)
+
+class AbstractString(object):
+ """Abstract string class
+ """
+ def __init__(self, s=''):
+ self._data = s
+
+ def readfd(self, fd):
+ raise NotImplementedError
+
+ def writefd(self, fd):
+ raise NotImplementedError
+
+ def clear(self):
+ """Clear data
+ """
+ self._data = ''
+
+ def set(self, urustr):
+ """Replace current data with urustr
+ """
+ self._data = urustr
+
+ def __repr__(self):
+ """repr(self)
+ """
+ return ("<%s at %x (%i)" % (self.__class__.__name__, id(self),
+ len(self)))
+
+ def __len__(self):
+ """len(self)
+ """
+ return len(self._data)
+
+ def __cmp__(self, other):
+ if isinstance(other, AbstractString):
+ return cmp(self._data, other._data)
+ else:
+ return cmp(self._data, other)
+
+class UruString(AbstractString):
+ """Uru Safe String
+
+ The algorithm is based on Alcug's Ustr. This version is optimized to
+ copy and convert as less data as possible.
+
+ version 0 - normal str
+ version 1 - auto (normal/inverted)
+ version 5 - inverted
+ version 6 - myst5
+ """
+ MYST5KEY = [ord(s) for s in "mystnerd"]
+
+ def __init__(self, urustr='', version=1):
+ AbstractString.__init__(self, urustr)
+ self.version = version
+
+ def _setVersion(self, version):
+ assert version in (0, 1, 5, 6)
+ self._version = version
+
+ def _getVersion(self):
+ return self._version
+
+ version = property(_getVersion, _setVersion)
+
+ def setInverted(self, b):
+ """Set inverted flag
+ """
+ if b:
+ self.version=5
+ else:
+ self.version=0
+
+ def writefd(self, fd):
+ """Write uru string to a file
+ """
+ if self.version == 1:
+ raise RuntimeError("Version is not explicit")
+ size = len(self._data)
+ if size > 1024: # XXX: ???
+ raise ValueError("string is too long: %i" % size)
+ if self.version == 5:
+ size |= 0xF000
+ data = ''.join([chr(ord(d) ^ 0xff) for d in self._data])
+ elif self.version == 6:
+ data = ''.join([chr(ord(d) ^ self.MYST5KEY[i%8])
+ for i, d in enumerate(self._data)])
+ else:
+ data = self._data
+ fd.write16(size)
+ fd.write(data)
+
+ def readfd(self, fd):
+ """Read uru string from a file
+ """
+ size = fd.read16()
+ if self.version == 1:
+ inv = (size & 0xF000) == 0xF000
+ self.version = 0 if not inv else 5
+ if self.version in (0, 5):
+ size = size & 0x0FFF
+ if size > 1024: # XXX: ???
+ raise ValueError("size '%i' > 1024 at position %s(%s)" %
+ (size, fd.tell(), repr(fd)))
+ if self.version == 5:
+ # XXX: testme
+ # read data as tuple of integeres
+ data = fd.readPacked("<%iI" % size)
+ # OR integers with 0xff and write their char equivalent to string
+ result = ''.join([chr(d ^ 0xff) for d in data])
+ elif self.version == 6:
+ data = fd.readPacked("<%iI" % size)
+ result = ''.join([chr(d ^ self.MYST5KEY[i%8])
+ for i, d in enumerate(data)])
+ else:
+ result = fd.read(size)
+ self._data = result
+ return result
+
+class String32(AbstractString):
+ """String with 32 bit size header
+ """
+ def __init__(self, s='', terminate=False):
+ AbstractString.__init__(self, s)
+ self._terminate = bool(terminate)
+
+ def readfd(self, fd):
+ size = fd.read32()
+ if self._terminate:
+ self._data = fd.readString0(size)
+ else:
+ self._data = fd.read(size)
+ return self._data
+
+ def writefd(self, fd):
+ size = len(self)
+ if self._terminate:
+ fd.write32(size+1)
+ fd.writeString0(self._data)
+ else:
+ fd.write32(size)
+ fd.write(self._data)
+
+class String16(AbstractString):
+ """String with 16 bit size header
+ """
+ def __init__(self, s='', terminate=False):
+ AbstractString.__init__(self, s)
+ self._terminate = bool(terminate)
+
+ def readfd(self, fd):
+ size = fd.read16()
+ if self._terminate:
+ self._data = fd.readString0(size)
+ else:
+ self._data = fd.read(size)
+ return self._data
+
+ def writefd(self, fd):
+ size = len(self)
+ if self._terminate:
+ fd.write16(size+1)
+ fd.writeString0(self._data)
+ else:
+ fd.write16(size)
+ fd.write(self._data)
Property changes on: pymoul/trunk/src/moul/crypt/binary.py
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
Added: pymoul/trunk/src/moul/crypt/tests/test_binary.py
===================================================================
--- pymoul/trunk/src/moul/crypt/tests/test_binary.py (rev 0)
+++ pymoul/trunk/src/moul/crypt/tests/test_binary.py 2007-02-10 13:14:18 UTC (rev 157)
@@ -0,0 +1,148 @@
+# pyMoul - Python interface to Myst Online URU Live
+# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de>
+
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program 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 General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc., 59
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+"""moul.crypt.binary unit tests
+"""
+__author__ = "Christian Heimes"
+__version__ = "$Id$"
+__revision__ = "$Revision$"
+
+import os
+import unittest
+from doctest import DocTestSuite
+from tempfile import mkstemp
+
+from moul.crypt.binary import BinaryFile
+
+class BinaryFileTest(unittest.TestCase):
+ def setUp(self):
+ self.tmpname = mkstemp()[1]
+ self.b = BinaryFile(self.tmpname, 'wb+')
+
+ def tearDown(self):
+ self.b.close()
+ os.unlink(self.tmpname)
+
+ def _testrw(self, name, data):
+ #import pdb; pdb.set_trace()
+ read = getattr(self.b, 'read%s' % name)
+ write = getattr(self.b, 'write%s' % name)
+ write(data)
+ self.b.seek(0)
+ fdata = read()
+ self.failUnlessEqual(data, fdata)
+
+ def test_char(self):
+ self._testrw('Char', 'a')
+
+ def test_byte(self):
+ self._testrw('Byte', 127)
+
+ def test_bool(self):
+ self._testrw('Bool', True)
+
+ def test_8(self):
+ self._testrw('8', 42)
+
+ def test_8s(self):
+ self._testrw('8s', -42)
+
+ def test_16(self):
+ self._testrw('16', 2**15)
+
+ def test_16s(self):
+ self._testrw('16s', -2**15)
+
+ def test_32(self):
+ self._testrw('32', 2*31)
+
+ def test_32s(self):
+ self._testrw('32s', -2*31)
+
+ def test_64(self):
+ self._testrw('64', 2*63)
+
+ def test_64s(self):
+ self._testrw('64s', -2*63)
+
+ def test_float(self):
+ data = -0.07
+ self.b.writeFloat(data)
+ self.b.seek(0)
+ self.failUnlessAlmostEqual(data, self.b.readFloat())
+
+ def test_double(self):
+ self._testrw('Double', -23*10e200)
+
+ def test_quad(self):
+ data = (23, 42)
+ self.b.writeQuad(data)
+ self.b.seek(0)
+ self.failUnlessEqual(data, self.b.readQuad())
+
+ def test_urustring(self):
+ # XXX: no test data
+ pass
+
+ def test_string0(self):
+ s = "a test string"
+ l = len(s)
+ self.b.writeString0(s)
+ self.b.seek(0)
+ self.failUnlessEqual(self.b.size(), l+1)
+ self.failUnlessEqual(self.b.readString0(l+1), s)
+ self.b.seek(0)
+ self.failUnlessEqual(self.b.read(), s+'\x00')
+
+ def test_string16(self):
+ s = "a test string"
+ l = len(s)
+ self.b.writeString16(s, terminate=False)
+ self.b.seek(0)
+ self.failUnlessEqual(self.b.size(), l+2)
+ self.failUnlessEqual(self.b.readString16(terminate=False), s)
+
+ self.b.seek(0)
+ self.b.truncate(0)
+ self.b.writeString16(s, terminate=True)
+ self.b.seek(0)
+ self.failUnlessEqual(self.b.size(), l+3)
+ self.failUnlessEqual(self.b.readString16(terminate=True), s)
+
+ def test_string32(self):
+ s = "a test string"
+ l = len(s)
+ self.b.writeString32(s, terminate=False)
+ self.b.seek(0)
+ self.failUnlessEqual(self.b.size(), l+4)
+ self.failUnlessEqual(self.b.readString32(terminate=False), s)
+
+ self.b.seek(0)
+ self.b.truncate(0)
+ self.b.writeString32(s, terminate=True)
+ self.b.seek(0)
+ self.failUnlessEqual(self.b.size(), l+5)
+ self.failUnlessEqual(self.b.readString32(terminate=True), s)
+
+
+def test_suite():
+ return unittest.TestSuite((
+ unittest.makeSuite(BinaryFileTest),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest="test_suite")
Property changes on: pymoul/trunk/src/moul/crypt/tests/test_binary.py
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-08 20:03:37
|
Revision: 156
http://pymoul.svn.sourceforge.net/pymoul/?rev=156&view=rev
Author: tiran
Date: 2007-02-08 12:02:58 -0800 (Thu, 08 Feb 2007)
Log Message:
-----------
Added binary file class
Updated languages
Updated XXX report and Readme
Modified Paths:
--------------
pymoul/trunk/README.txt
pymoul/trunk/doc/TODO.txt
pymoul/trunk/doc/XXXreport.html
pymoul/trunk/src/moul/crypt/elf.py
pymoul/trunk/src/moul/crypt/whatdoyousee.py
pymoul/trunk/src/moul/metadata.py
pymoul/trunk/src/moul/qt/i18n/pymoul_de.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_es.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_fr.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_it.ts
pymoul/trunk/src/moul/qt/i18n/pymoul_nl.ts
Added Paths:
-----------
pymoul/trunk/src/moul/crypt/binary.py
Modified: pymoul/trunk/README.txt
===================================================================
--- pymoul/trunk/README.txt 2007-02-07 15:01:15 UTC (rev 155)
+++ pymoul/trunk/README.txt 2007-02-08 20:02:58 UTC (rev 156)
@@ -8,6 +8,29 @@
pyMoul is a set of Python libraries around MOUL (Myst Online : Uru Live). At
the moment the main focus is on the Qt4 based graphical tool.
+Bug reporting and feature requests
+==================================
+
+Please do not mail me bug reports or feature requests. You should use the bug
+and feature tracker at http://sourceforge.net/projects/pymoul instead. Do not
+forget to include a log file! The location of the log file is stated in the
+about tab of pyMoul.
+
+GnuPG / PGP
+===========
+
+Every released file is signed with my GPG key 0xAD16AB1B for security reasons.
+You can grab my keys from http://cheimes.de/heimes.asc.
+
+Anti virus
+==========
+
+The windows builds are scanned for viruses and trojaners with the personal
+edition of Avira AntiVir (formally known as H+BEDV AntiVir)
+http://www.freeav.de/. Although the files are scanned under Windows and Linux
+and my Windows box is kept up to date I cannot gurantee that the files are
+clean.
+
Donate
======
@@ -15,5 +38,4 @@
use the link below to send me money over PayPal. You don't need a PayPal
account. A credit card or bank account is sufficient.
-https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=christian%40cheimes%2ede&item_name=Donate%20for%20Tiran%27s%20open%20source%20activities&page_style=PayPal&no_shipping=2&cn=Your%20note%20for%20me&tax=0¤cy_code=EUR&lc=DE&bn=PP%2dDonationsBF&charset=UTF%2d8
-
+https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=christian%40cheimes%2ede&item_name=Donate%20for%20Tiran%27s%20open%20source%20activities&page_style=PayPal&no_shipping=0&cn=Your%20note%20for%20me&tax=0¤cy_code=EUR&lc=DE&bn=PP%2dDonationsBF&charset=UTF%2d8
Modified: pymoul/trunk/doc/TODO.txt
===================================================================
--- pymoul/trunk/doc/TODO.txt 2007-02-07 15:01:15 UTC (rev 155)
+++ pymoul/trunk/doc/TODO.txt 2007-02-08 20:02:58 UTC (rev 156)
@@ -6,13 +6,19 @@
-----------
* get official OK from Chogon
- * API for create Uru Live directory with config files with default values.
* integrate log zipper
- * integrate chat archiver
- * complete chatlog viewer
* more checks and exceptions! Never fail silentely
* update readme.txt
* connect QThread.terminate() slots with its parents close/destroy signal
handler
* clean documents/journal/localization naming
+ * table model for PING tab
+future
+------
+
+ * better chatlog viewer
+ * ElementTree based generator chatlog xml and color coded html
+ * more unit tests
+ * more epydoc strings
+ * UI enhancements like whatisthis bubbles and accelerators
Modified: pymoul/trunk/doc/XXXreport.html
===================================================================
--- pymoul/trunk/doc/XXXreport.html 2007-02-07 15:01:15 UTC (rev 155)
+++ pymoul/trunk/doc/XXXreport.html 2007-02-08 20:02:58 UTC (rev 156)
@@ -3,7 +3,7 @@
<body>
<h1>pyMoul - Developer report tools: XXX/TODO/FIXME comments</h1>
-<p>Generated on Tue, 06 Feb 2007 18:05:35 CET, based on Zope 3's XXX report</p>
+<p>Generated on Wed, 07 Feb 2007 16:03:30 CET, based on Zope 3's XXX report</p>
<hr>
<h3>Summary</h3>
<p>
@@ -27,10 +27,10 @@
base-691- from zope.tales.tales import TALESTracebackSupplement
base-692- from zope.pagetemplate.pagetemplate \
base-693- import PageTemplateTracebackSupplement
-</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:208</b><br/><pre> # TODO: inefficient, compare list with directory content
-base-209- if not os.path.isdir(self._logdir):
-base-210- LOG.warning("%s is not a directory" % logdir)
-base-211- return
+</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:216</b><br/><pre> # TODO: inefficient, compare list with directory content
+base-217- if not os.path.isdir(self._archivedir):
+base-218- LOG.warning("%s is not a directory" % self._archivedir)
+base-219- return
</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct
base-113- if header is None:
base-114- fd = self._fd
@@ -91,10 +91,10 @@
fd = open(os.path.join(path, fname), 'wb')
fd.write('dummy')
fd.close()
-</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:208</b><br/><pre> # TODO: inefficient, compare list with directory content
- if not os.path.isdir(self._logdir):
- LOG.warning("%s is not a directory" % logdir)
- return
+</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:216</b><br/><pre> # TODO: inefficient, compare list with directory content
+ if not os.path.isdir(self._archivedir):
+ LOG.warning("%s is not a directory" % self._archivedir)
+ return
</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct
if header is None:
fd = self._fd
@@ -143,10 +143,10 @@
class GraphicsIni(ConfFile):
_filename = 'graphics.ini'
-</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:208</b><br/><pre> # TODO: inefficient, compare list with directory content
- if not os.path.isdir(logdir):
- LOG.warning("%s is not a directory" % logdir)
- return
+</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:216</b><br/><pre> # TODO: inefficient, compare list with directory content
+ if not os.path.isdir(self._archivedir):
+ LOG.warning("%s is not a directory" % self._archivedir)
+ return
</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch
return len([name for name in os.listdir(path)
if os.path.isfile(os.path.join(path, name))])
@@ -179,93 +179,93 @@
raise NotImplementedError
def decipher(crypt, size, key):
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:149</b><br/><pre> # FIXME: signal doesn't do anything
-base-150- self.emit(SIGNAL("close()"))
-base-151- event.accept()
-base-152- event.ignore()
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-251- del self._kiimage_progressbar
-base-252- self.pb_kiimage_repair.setEnabled(True)
-base-253- mb = qtutils.infoMB(self,
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:345</b><br/><pre> # TODO: change timer from every second to every minute
-base-346- self._timezone_timer = timer = QtCore.QTimer(self)
-base-347- timer.setInterval(1000) # 1 sec
-base:348: # TODO: needs optimization? run only when timer tab is active
-base-349- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-350- timer.start()
-base-351-
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:442</b><br/><pre> # TODO: thread safety!
-base-443- self.servers = servers
-base-444- if not self.isRunning():
-base-445- self.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:448</b><br/><pre> # TODO: thread safety!
-base-449- # emit a list of names first
-base-450- for server in self.servers:
-base-451- self.emit(SIGNAL("server(const QString&)"), server.name)
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:484</b><br/><pre> # TODO check this
-base-485- self._running = False
-base-486- self.condition.wakeAll()
-base-487-
-</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware
-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-48- if not getattr(sys, 'frozen', False):
-base-49- return
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:149</b><br/><pre> # FIXME: signal doesn't do anything
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything
+base-153- self.emit(SIGNAL("close()"))
+base-154- event.accept()
+base-155- event.ignore()
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+base-292- del self._kiimage_progressbar
+base-293- self.pb_kiimage_repair.setEnabled(True)
+base-294- mb = qtutils.infoMB(self,
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:390</b><br/><pre> # TODO: change timer from every second to every minute
+base-391- self._timezone_timer = timer = QtCore.QTimer(self)
+base-392- timer.setInterval(1000) # 1 sec
+base:393: # TODO: needs optimization? run only when timer tab is active
+base-394- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
+base-395- timer.start()
+base-396-
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:487</b><br/><pre> # TODO: thread safety!
+base-488- self.servers = servers
+base-489- if not self.isRunning():
+base-490- self.start()
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:493</b><br/><pre> # TODO: thread safety!
+base-494- # emit a list of names first
+base-495- for server in self.servers:
+base-496- self.emit(SIGNAL("server(const QString&)"), server.name)
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:531</b><br/><pre> # TODO check this
+base-532- self._running = False
+base-533- self.condition.wakeAll()
+base-534-
+</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:45</b><br/><pre> # TODO: translation aware
+base-46- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
+base-47- if getattr(sys, 'frozen', False):
+base-48- try:
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:151</b><br/><pre> # FIXME: signal doesn't do anything
self.emit(SIGNAL("close()"))
event.accept()
event.ignore()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:290</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
del self._kiimage_progressbar
self.pb_kiimage_repair.setEnabled(True)
mb = qtutils.infoMB(self,
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:345</b><br/><pre> # TODO: change timer from every second to every minute
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:389</b><br/><pre> # TODO: change timer from every second to every minute
self._timezone_timer = timer = QtCore.QTimer(self)
timer.setInterval(1000) # 1 sec
self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
timer.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:442</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:486</b><br/><pre> # TODO: thread safety!
self.servers = servers
if not self.isRunning():
self.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:448</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:492</b><br/><pre> # TODO: thread safety!
# emit a list of names first
for server in self.servers:
self.emit(SIGNAL("server(const QString&)"), server.name)
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:484</b><br/><pre> # TODO check this
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:530</b><br/><pre> # TODO check this
self._running = False
self.condition.wakeAll()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:149</b><br/><pre> # FIXME: signal doesn't do anything
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything
self.emit(SIGNAL("close()"))
event.accept()
event.ignore()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
del self._kiimage_progressbar
self.pb_kiimage_repair.setEnabled(True)
mb = qtutils.infoMB(self,
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:345</b><br/><pre> # TODO: change timer from every second to every minute
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:390</b><br/><pre> # TODO: change timer from every second to every minute
self._timezone_timer = timer = QtCore.QTimer(self)
timer.setInterval(1000) # 1 sec
self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
timer.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:442</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:487</b><br/><pre> # TODO: thread safety!
self.servers = servers
if not self.isRunning():
self.start()
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:448</b><br/><pre> # TODO: thread safety!
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:493</b><br/><pre> # TODO: thread safety!
# emit a list of names first
for server in self.servers:
self.emit(SIGNAL("server(const QString&)"), server.name)
-</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:484</b><br/><pre> # TODO check this
+</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:531</b><br/><pre> # TODO check this
self._running = False
self.condition.wakeAll()
-</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware
+</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:45</b><br/><pre> # TODO: translation aware
LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
- if not getattr(sys, 'frozen', False):
- return
+ if getattr(sys, 'frozen', False):
+ try:
</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:120</b><br/><pre># XXX: what about cygwin, bsd and others?
_thismodule = sys.modules[__name__]
if __WIN32__:
@@ -290,752 +290,1095 @@
base-27-base-691- from zope.tales.tales import TALESTracebackSupplement
base-28-base-692- from zope.pagetemplate.pagetemplate \
base-29-base-693- import PageTemplateTracebackSupplement
-base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-31-base-281- return iter(self._fd)
-base:32:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct
-base-33-base-113- if header is None:
-base-34-base-114- fd = self._fd
-base-35-base-115- fd.seek(0)
-base:36:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct
-base-37-base-128- if size is None:
-base-38-base-129- size = self.getFileSize()
-base-39-base-130- leading = 4* [None]
-base:40:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:267</b><br/><pre> # XXX: move checks to copy method!
-base-41-base-268- if os.path.isfile(fixed):
-base-42-base-269- if fixedNewer(ki, fixed):
-base-43-base-270- LOG.debug("File %s exists but was changed." % name)
-base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:157</b><br/><pre> # TODO: write me
-base-45-base-158- pass
-base-46-base-159-
-base-47-base-160-class Constrain(object):
-base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-49-base-542- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-50-base-543- # microphon missing -> OS mixer
-base-51-base-544- }
-base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-53-base-630-
-base-54-base-631-class GraphicsIni(ConfFile):
-base-55-base-632- _filename = 'graphics.ini'
-base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/directory.py.svn-base:59</b><br/><pre> # TODO: fnmatch
-base-57-base-60- return len([name for name in os.listdir(path)
-base-58-base-61- if os.path.isfile(os.path.join(path, name))])
-base-59-base-62-
-base:60:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:105</b><br/><pre> # TODO: more
-base-61-base-106-
-base-62-base-107- def test_publicapi_create(self):
-base-63-base-108- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-base:64:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:116</b><br/><pre> # TODO: more
-base-65-base-117-
-base-66-base-118-class AudioIniTest(GenericIniTest):
-base-67-base-119- enc = aud_enc
-base:68:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:154</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-69-base-155-
-base-70-base-156- p.screenres = 0
-base-71-base-157- eq(p._get('Graphics.Width'), 800)
-base:72:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
-base-73-base-81- fd = open(os.path.join(path, fname), 'wb')
-base-74-base-82- fd.write('dummy')
-base-75-base-83- fd.close()
-base:76:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:105</b><br/><pre> # TODO: more
-base-77-
-base-78- def test_publicapi_create(self):
-base-79- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-base:80:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:116</b><br/><pre> # TODO: more
-base-81-
-base-82-class AudioIniTest(GenericIniTest):
-base-83- enc = aud_enc
-base:84:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:154</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-85-
-base-86- p.screenres = 0
-base-87- eq(p._get('Graphics.Width'), 800)
-base:88:</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
-base-89- fd = open(os.path.join(path, fname), 'wb')
-base-90- fd.write('dummy')
-base-91- fd.close()
-base:92:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-93- return iter(self._fd)
-base:94:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct
-base-95- if header is None:
-base-96- fd = self._fd
-base-97- fd.seek(0)
-base:98:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:127</b><br/><pre> # XXX use struct
-base-99- if size is None:
-base-100- size = self.getFileSize()
-base-101- leading = 4* [None]
-base:102:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:267</b><br/><pre> # XXX: move checks to copy method!
-base-103- if os.path.isfile(fixed):
-base-104- if fixedNewer(ki, fixed):
-base-105- LOG.debug("File %s exists but was changed." % name)
-base:106:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:157</b><br/><pre> # TODO: write me
-base-107- pass
-base-108-
-base-109-class Constrain(object):
-base:110:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-111- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-112- # microphon missing -> OS mixer
-base-113- }
-base:114:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-115-
-base-116-class GraphicsIni(ConfFile):
-base-117- _filename = 'graphics.ini'
-base:118:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:112</b><br/><pre> # XXX use struct
-base-119- if header is None:
-base-120- fd = self._fd
-base-121- fd.seek(0)
-base:122:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:127</b><br/><pre> # XXX use struct
-base-123- if size is None:
-base-124- size = self.getFileSize()
-base-125- leading = 4* [None]
-base:126:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:267</b><br/><pre> # XXX: move checks to copy method!
-base-127- if os.path.isfile(fixed):
-base-128- if fixedNewer(ki, fixed):
-base-129- LOG.debug("File %s exists but was changed." % name)
-base:130:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-131- return iter(self._fd)
-base:132:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:156</b><br/><pre> # TODO: write me
-base-133- pass
-base-134-
-base-135-class Constrain(object):
-base:136:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-137- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-138- # microphon missing -> OS mixer
-base-139- }
-base:140:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-141-
-base-142-class GraphicsIni(ConfFile):
-base-143- _filename = 'graphics.ini'
-base:144:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch
-base-145- return len([name for name in os.listdir(path)
-base-146- if os.path.isfile(os.path.join(path, name))])
-base-147-
-base:148:</pre></li><li><b>File: utilities/../src/moul/file/directory.py~:59</b><br/><pre> # TODO: fnmatch
-base-149- return len([name for name in os.listdir(path)
-base-150- if os.path.isfile(os.path.join(path, name))])
-base-151-
-base:152:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:77</b><br/><pre> # XXX: dos format
-base-153-base-78- return data.replace("\r\n", "\n")
-base-154-base-79-
-base-155-base-80-def encryptWDYS(instr, fout):
-base:156:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:87</b><br/><pre> # XXX: dos format
-base-157-base-88- instr = instr.replace("\n", "\r\n")
-base-158-base-89- fout.seek(0)
-base-159-base-90- fout.write(HEADER)
-base:160:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:71</b><br/><pre> # XXX NotImplemented
-base-161-base-72- raise NotImplementedError
-base-162-base-73-
-base-163-base-74-def decipher(crypt, size, key):
-base:164:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:77</b><br/><pre> # XXX: dos format
-base-165- return data.replace("\r\n", "\n")
-base-166-
-base-167-def encryptWDYS(instr, fout):
-base:168:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:87</b><br/><pre> # XXX: dos format
-base-169- instr = instr.replace("\n", "\r\n")
-base-170- fout.seek(0)
-base-171- fout.write(HEADER)
-base:172:</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:71</b><br/><pre> # XXX NotImplemented
-base-173- raise NotImplementedError
-base-174-
-base-175-def decipher(crypt, size, key):
-base:176:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:151</b><br/><pre> # FIXME: signal doesn't do anything
-base-177-base-152- self.emit(SIGNAL("close()"))
-base-178-base-153- event.accept()
-base-179-base-154- event.ignore()
-base:180:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:222</b><br/><pre> # TODO: msg
-base-181-base-223- return
-base-182-base-224-
-base-183-base-225- self.pb_kiimage_repair.setEnabled(False)
-base:184:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:248</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-185-base-249- del self._kiimage_progressbar
-base-186-base-250- self.pb_kiimage_repair.setEnabled(True)
-base:187:base:251: # TODO: msg
-base-188-base-252-
-base-189-base-253- # ************************************************************************
-base-190-base-254- # system tray
-base:191:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:281</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-192-base-282- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-193-base-283- timer.start()
-base-194-base-284-
-base:195:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:375</b><br/><pre> # TODO: thread safety!
-base-196-base-376- self.servers = servers
-base-197-base-377- if not self.isRunning():
-base-198-base-378- self.start()
-base:199:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:381</b><br/><pre> # TODO: thread safety!
-base-200-base-382- # emit a list of names first
-base-201-base-383- for server in self.servers:
-base-202-base-384- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:203:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:417</b><br/><pre> # TODO check this
-base-204-base-418- self._running = False
-base-205-base-419- self.condition.wakeAll()
-base-206-base-420-
-base:207:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware
-base-208-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-209-base-48- if not getattr(sys, 'frozen', False):
-base-210-base-49- return
-base:211:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/wdysini.py.svn-base:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit
-base:212:base:68: self.context.emit(SIGNAL("graphicsini_load()")) # XXX: hard coded emit
-base-213-base-69-
-base-214-base-70- @pyqtSignature("bool")
-base-215-base-71- def on_graphicsChanged(self, boolean):
-base:216:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:143</b><br/><pre> # FIXME: signal doesn't do anything
-base-217- self.emit(SIGNAL("close()"))
-base-218- event.accept()
-base-219- event.ignore()
-base:220:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:214</b><br/><pre> # TODO: msg
-base-221- return
-base-222-
-base-223- self.pb_kiimage_repair.setEnabled(False)
-base:224:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-225- del self._kiimage_progressbar
-base-226- self.pb_kiimage_repair.setEnabled(True)
-base-227-
-</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:230</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-231- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-232- timer.start()
-base-233-
-base:234:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:382</b><br/><pre> # TODO: thread safety!
-base-235- self.servers = servers
-base-236- if not self.isRunning():
-base-237- self.start()
-base:238:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:388</b><br/><pre> # TODO: thread safety!
-base-239- # emit a list of names first
-base-240- for server in self.servers:
-base-241- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:242:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:424</b><br/><pre> # TODO check this
-base-243- self._running = False
-base-244- self.condition.wakeAll()
-base-245-
-base:246:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:143</b><br/><pre> # FIXME: signal doesn't do anything
-base-247- self.emit(SIGNAL("close()"))
-base-248- event.accept()
-base-249- event.ignore()
-base:250:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:214</b><br/><pre> # TODO: msg
-base-251- return
-base-252-
-base-253- self.pb_kiimage_repair.setEnabled(False)
-base:254:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box
-base-255- del self._kiimage_progressbar
-base-256- self.pb_kiimage_repair.setEnabled(True)
-base-257-
-</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:260</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-261- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-262- timer.start()
-base-263-
-base:264:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:382</b><br/><pre> # TODO: thread safety!
-base-265- self.servers = servers
-base-266- if not self.isRunning():
-base-267- self.start()
-base:268:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:388</b><br/><pre> # TODO: thread safety!
-base-269- # emit a list of names first
-base-270- for server in self.servers:
-base-271- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:272:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:424</b><br/><pre> # TODO check this
-base-273- self._running = False
-base-274- self.condition.wakeAll()
-base-275-
-base:276:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware
-base-277- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-278- if not getattr(sys, 'frozen', False):
-base-279- return
-base:280:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py~:46</b><br/><pre> # TODO: translation aware
-base-281- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-282- if not getattr(sys, 'frozen', False):
-base-283- return
-base:284:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py~:68</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit
-base-285-
-base-286- @signalLogDecorator(LOG)
-base-287- @pyqtSignature("bool")
-base:288:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit
-base-289-
-base-290- @pyqtSignature("bool")
-base-291- def on_graphicsChanged(self, boolean):
-base:292:</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:117</b><br/><pre># XXX: what about cygwin, bsd and others?
-base-293-_thismodule = sys.modules[__name__]
-base-294-if __WIN32__:
-base-295- from moul.osdependent import win32 as osdep_win32
-base:296:</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:117</b><br/><pre># XXX: what about cygwin, bsd and others?
-base-297-base-118-_thismodule = sys.modules[__name__]
-base-298-base-119-if __WIN32__:
-base-299-base-120- from moul.osdependent import win32 as osdep_win32
-base:300:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:14</b><br/><pre><ol><li><b>File: utilities/../.svn/text-base/ez_setup.py.svn-base:92</b><br/><pre> # XXX could we install in a subprocess here?
-base-301-base-15-base-93- print >>sys.stderr, (
-base-302-base-16-base-94- "The required version of setuptools (>=%s) is not available, and\n"
-base-303-base-17-base-95- "can't be installed while this script is running. Please install\n"
-base:304:base:18:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:548</b><br/><pre> # XXX bug: doctest may report several failures in one test, they are
-base-305-base-19-base-549- # separated by a horizontal dash line. Only the first one of
-base-306-base-20-base-550- # them is now colorized properly.
-base-307-base-21-base-551- header = lines[0]
-base:308:base:22:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:603</b><br/><pre> # TODO: Scrape and colorize the traceback.
-base-309-base-23-base-604- result.append(self.colorize('doctest_got', line))
-base-310-base-24-base-605- elif remaining[0] == 'Differences (ndiff with -expected +actual):':
-base-311-base-25-base-606- result.append(self.colorize('doctest_title', remaining.pop(0))) # E. raised:
-base:312:base:26:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:623</b><br/><pre> # TODO: We only deal with the output from Zope 3's doctest module.
-base-313-base-27-base-624- # A colorizer for the Python's doctest module would be nice too.
-base-314-base-28-base-625- if doctest:
-base-315-base-29-base-626- # If we have a doctest, we do not care about this header. All the
-base:316:base:30:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:690</b><br/><pre> # TODO these should be hookable
-base-317-base-31-base-691- from zope.tales.tales import TALESTracebackSupplement
-base-318-base-32-base-692- from zope.pagetemplate.pagetemplate \
-base-319-base-33-base-693- import PageTemplateTracebackSupplement
-base:320:base:34:</pre></li><li><b>File: utilities/../.svn/text-base/setup_win32.py.svn-base:84</b><br/><pre> pexe['innosetup'] = os.environ.get('INNOSETUP') # TODO:
-base-321-base-35-base-85- pexe['inno_templates'] = "template.iss"
-base-322-base-36-base-86- pexe['app_name'] = 'pyMoul'
-base-323-base-37-base-87- pexe['includes'].extend(findPyTz())
-base:324:base:38:</pre></li><li><b>File: utilities/../.svn/text-base/distutils_upx.py.svn-base:117</b><br/><pre> sys.exit(retcode) # XXX
-base-325-base-39-base-118-
-base-326-base-40-base-119- def _upxAvailable(self):
-base-327-base-41-base-120- """Search for UPX in search path
-base:328:base:42:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-329-base-43-base-269- return iter(self._fd)
-base:330:base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct
-base-331-base-45-base-113- if header is None:
-base-332-base-46-base-114- fd = self._fd
-base-333-base-47-base-115- fd.seek(0)
-base:334:base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct
-base-335-base-49-base-128- if size is None:
-base-336-base-50-base-129- size = self.getFileSize()
-base-337-base-51-base-130- leading = 4* [None]
-base:338:base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:156</b><br/><pre> # TODO: write me
-base-339-base-53-base-157- pass
-base-340-base-54-base-158-
-base-341-base-55-base-159-class Constrain(object):
-base:342:base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-343-base-57-base-541- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-344-base-58-base-542- # microphon missing -> OS mixer
-base-345-base-59-base-543- }
-base:346:base:60:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-347-base-61-base-629-
-base-348-base-62-base-630-class GraphicsIni(ConfFile):
-base-349-base-63-base-631- _filename = 'graphics.ini'
-base:350:base:64:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/directory.py.svn-base:58</b><br/><pre> # TODO: fnmatch
-base-351-base-65-base-59- return len([name for name in os.listdir(path)
-base-352-base-66-base-60- if os.path.isfile(os.path.join(path, name))])
-base-353-base-67-base-61-
-base:354:base:68:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:104</b><br/><pre> # TODO: more
-base-355-base-69-base-105-
-base-356-base-70-base-106- def test_publicapi_create(self):
-base-357-base-71-base-107- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-base:358:base:72:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:115</b><br/><pre> # TODO: more
-base-359-base-73-base-116-
-base-360-base-74-base-117-class AudioIniTest(GenericIniTest):
-base-361-base-75-base-118- enc = aud_enc
-base:362:base:76:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:153</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-363-base-77-base-154-
-base-364-base-78-base-155- p.screenres = 0
-base-365-base-79-base-156- eq(p._get('Graphics.Width'), 800)
-base:366:base:80:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:79</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
-base-367-base-81-base-80- fd = open(os.path.join(path, fname), 'wb')
-base-368-base-82-base-81- fd.write('dummy')
-base-369-base-83-base-82- fd.close()
-base:370:base:84:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:104</b><br/><pre> # TODO: more
-base-371-base-85-
-base-372-base-86- def test_publicapi_create(self):
-base-373-base-87- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc))
-base:374:base:88:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:115</b><br/><pre> # TODO: more
-base-375-base-89-
-base-376-base-90-class AudioIniTest(GenericIniTest):
-base-377-base-91- enc = aud_enc
-base:378:base:92:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:153</b><br/><pre> #XXX self.failIf(p.isChanged())
-base-379-base-93-
-base-380-base-94- p.screenres = 0
-base-381-base-95- eq(p._get('Graphics.Width'), 800)
-base:382:base:96:</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:79</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32
-base-383-base-97- fd = open(os.path.join(path, fname), 'wb')
-base-384-base-98- fd.write('dummy')
-base-385-base-99- fd.close()
-base:386:base:100:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-387-base-101- return iter(self._fd)
-base:388:base:102:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct
-base-389-base-103- if header is None:
-base-390-base-104- fd = self._fd
-base-391-base-105- fd.seek(0)
-base:392:base:106:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:127</b><br/><pre> # XXX use struct
-base-393-base-107- if size is None:
-base-394-base-108- size = self.getFileSize()
-base-395-base-109- leading = 4* [None]
-base:396:base:110:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:156</b><br/><pre> # TODO: write me
-base-397-base-111- pass
-base-398-base-112-
-base-399-base-113-class Constrain(object):
-base:400:base:114:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-401-base-115- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-402-base-116- # microphon missing -> OS mixer
-base-403-base-117- }
-base:404:base:118:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-405-base-119-
-base-406-base-120-class GraphicsIni(ConfFile):
-base-407-base-121- _filename = 'graphics.ini'
-base:408:base:122:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:112</b><br/><pre> # XXX use struct
-base-409-base-123- if header is None:
-base-410-base-124- fd = self._fd
-base-411-base-125- fd.seek(0)
-base:412:base:126:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:127</b><br/><pre> # XXX use struct
-base-413-base-127- if size is None:
-base-414-base-128- size = self.getFileSize()
-base-415-base-129- leading = 4* [None]
-base:416:base:130:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file
-base-417-base-131- return iter(self._fd)
-base:418:base:132:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:156</b><br/><pre> # TODO: write me
-base-419-base-133- pass
-base-420-base-134-
-base-421-base-135-class Constrain(object):
-base:422:base:136:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check
-base-423-base-137- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui
-base-424-base-138- # microphon missing -> OS mixer
-base-425-base-139- }
-base:426:base:140:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer.
-base-427-base-141-
-base-428-base-142-class GraphicsIni(ConfFile):
-base-429-base-143- _filename = 'graphics.ini'
-base:430:base:144:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:58</b><br/><pre> # TODO: fnmatch
-base-431-base-145- return len([name for name in os.listdir(path)
-base-432-base-146- if os.path.isfile(os.path.join(path, name))])
-base-433-base-147-
-base:434:base:148:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:76</b><br/><pre> # XXX: dos format
-base-435-base-149-base-77- return data.replace("\r\n", "\n")
-base-436-base-150-base-78-
-base-437-base-151-base-79-def encryptWDYS(instr, fout):
-base:438:base:152:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:86</b><br/><pre> # XXX: dos format
-base-439-base-153-base-87- instr = instr.replace("\n", "\r\n")
-base-440-base-154-base-88- fout.seek(0)
-base-441-base-155-base-89- fout.write(HEADER)
-base:442:base:156:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:70</b><br/><pre> # XXX NotImplemented
-base-443-base-157-base-71- raise NotImplementedError
-base-444-base-158-base-72-
-base-445-base-159-base-73-def decipher(crypt, size, key):
-base:446:base:160:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:76</b><br/><pre> # XXX: dos format
-base-447-base-161- return data.replace("\r\n", "\n")
-base-448-base-162-
-base-449-base-163-def encryptWDYS(instr, fout):
-base:450:base:164:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:86</b><br/><pre> # XXX: dos format
-base-451-base-165- instr = instr.replace("\n", "\r\n")
-base-452-base-166- fout.seek(0)
-base-453-base-167- fout.write(HEADER)
-base:454:base:168:</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:70</b><br/><pre> # XXX NotImplemented
-base-455-base-169- raise NotImplementedError
-base-456-base-170-
-base-457-base-171-def decipher(crypt, size, key):
-base:458:base:172:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/localization.py.svn-base:78</b><br/><pre> # TODO: other message box
-base-459-base-173-base-79- self._journal_progressbar = SimpleProgressbar(self)
-base-460-base-174-base-80- self._journal_progressbar.setWindowTitle(self.trUtf8("Loading journals"))
-base-461-base-175-base-81- self._journal_progressbar.setProgressbar(0, 1, 0)
-base:462:base:176:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:76</b><br/><pre> # TODO: checks
-base-463-base-177-base-77- self.urudatadir.initializeFactories()
-base-464-base-178-base-78-
-base-465-base-179-base-79- # init handlers
-base:466:base:180:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything
-base-467-base-181-base-153- self.emit(SIGNAL("close()"))
-base-468-base-182-base-154- event.accept()
-base-469-base-183-base-155- event.ignore()
-base:470:base:184:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:189</b><br/><pre> # TODO: msg
-base-471-base-185-base-190- return
-base-472-base-186-base-191-
-base-473-base-187-base-192- self.pb_kiimage_repair.setEnabled(False)
-base:474:base:188:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:219</b><br/><pre> # TODO: msg
-base-475-base-189-base-220-
-base-476-base-190-base-221- # ************************************************************************
-base-477-base-191-base-222- # graphics settings
-base:478:base:192:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:237</b><br/><pre> self.emit(SIGNAL("graphicsini_loaded()")) # XXX: hard coded emit
-base-479-base-193-base-238-
-base-480-base-194-base-239- @signalLogDecorator(LOG)
-base-481-base-195-base-240- def on_graphicsini_loaded(self):
-base:482:base:196:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:297</b><br/><pre> # XXX: fixme
-base-483-base-197-base-298- txt = videoModes.getVidModeHuman(idx)
-base-484-base-198-base-299- self.lb_screenres.setText(QtCore.QString(txt))
-base-485-base-199-base-300- self._graphics_ini.screenres = idx
-base:486:base:200:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:387</b><br/><pre> self.emit(SIGNAL("audioini_loaded()")) # XXX: hard coded emit
-base-487-base-201-base-388-
-base-488-base-202-base-389- @signalLogDecorator(LOG)
-base-489-base-203-base-390- def on_audioini_loaded(self):
-base:490:base:204:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:506</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-491-base-205-base-507- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-492-base-206-base-508- timer.start()
-base-493-base-207-base-509-
-base:494:base:208:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:602</b><br/><pre> # TODO: thread safety!
-base-495-base-209-base-603- self.servers = servers
-base-496-base-210-base-604- if not self.isRunning():
-base-497-base-211-base-605- self.start()
-base:498:base:212:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:608</b><br/><pre> # TODO: thread safety!
-base-499-base-213-base-609- # emit a list of names first
-base-500-base-214-base-610- for server in self.servers:
-base-501-base-215-base-611- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:502:base:216:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:644</b><br/><pre> # TODO check this
-base-503-base-217-base-645- self._running = False
-base-504-base-218-base-646- self.condition.wakeAll()
-base-505-base-219-base-647-
-base:506:base:220:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware
-base-507-base-221-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base:508:base:222:base:48: return # XXX: remove
-base-509-base-223-base-49- try:
-base-510-base-224-base-50- title= QtGui.QApplication.translate("excepthook",
-base-511-base-225-base-51- "An unhandled error has occured",
-base:512:base:226:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:76</b><br/><pre> # TODO: checks
-base-513-base-227- self.urudatadir.initializeFactories()
-base-514-base-228-
-base-515-base-229- # init handlers
-base:516:base:230:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:152</b><br/><pre> # FIXME: signal doesn't do anything
-base-517-base-231- self.emit(SIGNAL("close()"))
-base-518-base-232- event.accept()
-base-519-base-233- event.ignore()
-base:520:base:234:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:189</b><br/><pre> # TODO: msg
-base-521-base-235- return
-base-522-base-236-
-base-523-base-237- self.pb_kiimage_repair.setEnabled(False)
-base:524:base:238:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:236</b><br/><pre> self.emit(SIGNAL("graphicsini_loaded()")) # XXX: hard coded emit
-base-525-base-239-
-base-526-base-240- @signalLogDecorator(LOG)
-base-527-base-241- def on_graphicsini_loaded(self):
-base:528:base:242:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:296</b><br/><pre> # XXX: fixme
-base-529-base-243- txt = videoModes.getVidModeHuman(idx)
-base-530-base-244- self.lb_screenres.setText(QtCore.QString(txt))
-base-531-base-245- self._graphics_ini.screenres = idx
-base:532:base:246:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:386</b><br/><pre> self.emit(SIGNAL("audioini_loaded()")) # XXX: hard coded emit
-base-533-base-247-
-base-534-base-248- @signalLogDecorator(LOG)
-base-535-base-249- def on_audioini_loaded(self):
-base:536:base:250:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:505</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-537-base-251- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-538-base-252- timer.start()
-base-539-base-253-
-base:540:base:254:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:601</b><br/><pre> # TODO: thread safety!
-base-541-base-255- self.servers = servers
-base-542-base-256- if not self.isRunning():
-base-543-base-257- self.start()
-base:544:base:258:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:607</b><br/><pre> # TODO: thread safety!
-base-545-base-259- # emit a list of names first
-base-546-base-260- for server in self.servers:
-base-547-base-261- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:548:base:262:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:643</b><br/><pre> # TODO check this
-base-549-base-263- self._running = False
-base-550-base-264- self.condition.wakeAll()
-base-551-base-265-
-base:552:base:266:</pre></li><li><b>File: utilities/../src/moul/qt/localization.py:78</b><br/><pre> # TODO: other message box
-base-553-base-267- self._journal_progressbar = SimpleProgressbar(self)
-base-554-base-268- self._journal_progressbar.setWindowTitle(self.trUtf8("Loading journals"))
-base-555-base-269- self._journal_progressbar.setProgressbar(0, 1, 0)
-base:556:base:270:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:76</b><br/><pre> # TODO: checks
-base-557-base-271- self.urudatadir.initializeFactories()
-base-558-base-272-
-base-559-base-273- # init handlers
-base:560:base:274:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything
-base-561-base-275- self.emit(SIGNAL("close()"))
-base-562-base-276- event.accept()
-base-563-base-277- event.ignore()
-base:564:base:278:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:189</b><br/><pre> # TODO: msg
-base-565-base-279- return
-base-566-base-280-
-base-567-base-281- self.pb_kiimage_repair.setEnabled(False)
-base:568:base:282:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:219</b><br/><pre> # TODO: msg
-base-569-base-283-
-base-570-base-284- # ************************************************************************
-base-571-base-285- # graphics settings
-base:572:base:286:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:237</b><br/><pre> self.emit(SIGNAL("graphicsini_loaded()")) # XXX: hard coded emit
-base-573-base-287-
-base-574-base-288- @signalLogDecorator(LOG)
-base-575-base-289- def on_graphicsini_loaded(self):
-base:576:base:290:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:297</b><br/><pre> # XXX: fixme
-base-577-base-291- txt = videoModes.getVidModeHuman(idx)
-base-578-base-292- self.lb_screenres.setText(QtCore.QString(txt))
-base-579-base-293- self._graphics_ini.screenres = idx
-base:580:base:294:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:387</b><br/><pre> self.emit(SIGNAL("audioini_loaded()")) # XXX: hard coded emit
-base-581-base-295-
-base-582-base-296- @signalLogDecorator(LOG)
-base-583-base-297- def on_audioini_loaded(self):
-base:584:base:298:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:506</b><br/><pre> # TODO: needs optimization? run only when timer tab is active
-base-585-base-299- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout)
-base-586-base-300- timer.start()
-base-587-base-301-
-base:588:base:302:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:602</b><br/><pre> # TODO: thread safety!
-base-589-base-303- self.servers = servers
-base-590-base-304- if not self.isRunning():
-base-591-base-305- self.start()
-base:592:base:306:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:608</b><br/><pre> # TODO: thread safety!
-base-593-base-307- # emit a list of names first
-base-594-base-308- for server in self.servers:
-base-595-base-309- self.emit(SIGNAL("server(const QString&)"), server.name)
-base:596:base:310:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:644</b><br/><pre> # TODO check this
-base-597-base-311- self._running = False
-base-598-base-312- self.condition.wakeAll()
-base-599-base-313-
-base:600:base:314:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware
-base-601-base-315- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
-base-602-base-316- try:
-base-603-base-317- title= QtGui.QApplication.translate("excepthook",
-base:604:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:319</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:116</b><br/><pre># XXX: what about cygwin, bsd and others?
-base-605-base-320-_thismodule = sys.modules[__name__]
-base-606-base-321-if __WIN32__:
-base-607-base-322- from moul.osdependent import win32 as osdep_win32
-base:608:base:323:</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:116</b><br/><pre># XXX: what about cygwin, bsd and others?
-base-609-base-324-base-117-_thismodule = sys.modules[__name__]
-base-610-base-325-base-118-if __WIN32__:
-base-611-base-326-base-119- from moul.osdependent import win32 as osdep_win32
-base:612:base:327:</pre></li><li><b>File: utilities/../test.py:548</b><br/><pre> # XXX bug: doctest may report several failures in one test, they are
-base-613-base-328- # separated by a horizontal dash line. Only the first one of
-base-614-base-329- # them is now colorized properly.
-base-615-base-330- header = lines[0]
-base:616:base:331:</pre></li><li><b>File: utilities/../test.py:603</b...
[truncated message content] |
|
From: <ti...@us...> - 2007-02-07 15:01:57
|
Revision: 155
http://pymoul.svn.sourceforge.net/pymoul/?rev=155&view=rev
Author: tiran
Date: 2007-02-07 07:01:15 -0800 (Wed, 07 Feb 2007)
Log Message:
-----------
Fix for Windows socket error issue
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/server/ping.py
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 13:28:12 UTC (rev 154)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 15:01:15 UTC (rev 155)
@@ -40,6 +40,7 @@
from moul.osdependent import isMoulRunning
from moul.server.ping import ServerList
from moul.server.ping import isSocketError
+from moul.server.ping import fmtSocketError
from moul.time.cavern import CavernTime
from moul.qt.localization import LocalizationContainer
@@ -498,15 +499,17 @@
name = server.name
dns = server.dns()
if isSocketError(dns):
+ errno, msg = fmtSocketError(dns)
self.emit(SIGNAL("dnserror(const QString&, int, const QString&)"),
- name, dns.args[0], dns.args[1])
+ name, errno, msg)
continue
self.emit(SIGNAL("dns(const QString&, float)"), name, dns)
ping = server.portping()
if isSocketError(ping):
+ errno, msg = fmtSocketError(dns)
self.emit(SIGNAL("pingerror(const QString&, int, const QString&)"),
- name, ping.args[0], ping.args[1])
+ name, errno, msg)
continue
self.emit(SIGNAL("ping(const QString&, float)"), name, ping)
Modified: pymoul/trunk/src/moul/server/ping.py
===================================================================
--- pymoul/trunk/src/moul/server/ping.py 2007-02-07 13:28:12 UTC (rev 154)
+++ pymoul/trunk/src/moul/server/ping.py 2007-02-07 15:01:15 UTC (rev 155)
@@ -28,6 +28,29 @@
def isSocketError(stat):
return isinstance(stat, socket.error)
+def fmtSocketError(exc):
+ """Formats the output of a socket error
+
+ @param exc: a socket exception
+ @type. exc: socket.error instance
+ @return: errno, msg
+ @rtype: tuple (int, str)
+ """
+ errno, msg = -1, ''
+ if isinstance(exc, socket.timeout):
+ msg = str(exc)
+ elif isinstance(exc, socket.gaierror):
+ # address-related errors
+ errno, msg = exc[0], exc[1]
+ elif isinstance(exc, socket.herror):
+ # address-related errors using h_errno
+ errno, msg = exc[0], exc[1]
+ elif isinstance(exc, socket.error):
+ errno, msg = exc[0], exc[1]
+ else:
+ msg = str(exc)
+ return errno, msg
+
class Server(object):
"""A server object
"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-07 13:28:12
|
Revision: 154
http://pymoul.svn.sourceforge.net/pymoul/?rev=154&view=rev
Author: tiran
Date: 2007-02-07 05:28:12 -0800 (Wed, 07 Feb 2007)
Log Message:
-----------
Removed clear call from Threadlet.run()
Implemented first version of chat log browser
Modified Paths:
--------------
pymoul/trunk/src/moul/file/chatlog.py
pymoul/trunk/src/moul/qt/mainwindow.py
pymoul/trunk/src/moul/qt/threadlet.py
Modified: pymoul/trunk/src/moul/file/chatlog.py
===================================================================
--- pymoul/trunk/src/moul/file/chatlog.py 2007-02-07 11:31:49 UTC (rev 153)
+++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-07 13:28:12 UTC (rev 154)
@@ -204,40 +204,47 @@
Lists all chat logs in the directory
"""
- def __init__(self, logdir):
- self._logdir = logdir
- self._logfiles = [] # list of ChatlogViews
+ def __init__(self, archivedir):
+ self._archivedir = archivedir
+ self._chatlogs = [] # list of ChatlogViews
+ LOG.debug("Chatlogs DV in %s" % archivedir)
self.refresh()
def refresh(self):
"""Refresh list
"""
# TODO: inefficient, compare list with directory content
- if not os.path.isdir(self._logdir):
- LOG.warning("%s is not a directory" % logdir)
- return
- self._logfiles[:] = []
+ if not os.path.isdir(self._archivedir):
+ LOG.warning("%s is not a directory" % self._archivedir)
+ return
+ self._chatlogs[:] = []
self._findChatlogs()
def _findChatlogs(self):
"""Find chat logs in logdir directory
"""
- for name in os.listdir(self._logdir):
- fname = os.path.join(self._logdir, name)
+ for name in os.listdir(self._archivedir):
+ fname = os.path.join(self._archivedir, name)
if not os.path.isfile(fname):
continue
chatlog = ChatlogView(fname)
if chatlog.date is not None:
- self._logfiles.append(chatlog)
- self._logfiles.sort(key=lambda element:(element.date, element.name))
+ self._chatlogs.append(chatlog)
+ self._chatlogs.sort(key=lambda element:element.name)
def __len__(self):
"""len() support
"""
- return len(self._logfiles)
+ return len(self._chatlogs)
def __iter__(self):
- return iter(self._logfiles)
+ return iter(self._chatlogs)
+
+ def __contains__(self, other):
+ return other in self._chatlogs
+
+ def __getitem__(self, idx):
+ return self._chatlogs[idx]
class ChatlogView(object):
"""A view of a single chat log file
@@ -271,9 +278,21 @@
if not mo:
# urks
return None
- d = mo.groupdict()
+ d = {}
+ for key, value in mo.groupdict().items():
+ d[key] = int(value)
self._date = d
return d
+
+ @property
+ def humanname(self):
+ """Human readable name
+ """
+ d = self.date
+ if not d:
+ return self.name
+ return "Chatlog %02i:%02i - %02i:%02i %02i-%02i-%02i" % (
+ d['ch'], d['cm'], d['sh'], d['sm'], d['Y'], d['M'], d['D'])
def open(self):
"""Open fhe file
@@ -281,6 +300,7 @@
if not self._opened:
self._fd = open(self._fname, 'r')
self._opened = True
+ self._fd.seek(0)
def close(self):
"""Close the file
@@ -298,4 +318,4 @@
@rtype: str
"""
self.open()
- self._fd.read()
+ return self._fd.read()
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 11:31:49 UTC (rev 153)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 13:28:12 UTC (rev 154)
@@ -46,6 +46,7 @@
from moul.qt.wdysini import IniFileContainer
from moul.qt.simpleprogressbar import SimpleProgressbar
from moul.qt.threadlet import YieldingThreadlet
+from moul.qt.threadlet import Threadlet
from moul.qt.ui.mainwindow import Ui_MainWindow
from moul.qt import utils as qtutils
@@ -87,6 +88,7 @@
self._ping_init()
self._systray_init()
self._about_init()
+ self._chatlog_init()
self.qcLocalization = LocalizationContainer(self)
self.qcIniFile = IniFileContainer(self)
@@ -208,7 +210,45 @@
# ************************************************************************
# tasks
+ def _chatlog_init(self):
+ self._chatlog_threadlet = Threadlet(self)
+ self.connect(self, SIGNAL("chatlogsUpdated()"),
+ self._chatlog_threadlet.start)
+ self.connect(self._chatlog_threadlet, SIGNAL("finished()"),
+ self.on_chatlogview_refresh)
+ # detach and fire
+ self._chatlog_threadlet.detach(self.on_chatlogs_updated)
+
@pyqtSignature("")
+ def on_chatlogs_updated(self):
+ """
+ Called as detached method inside a threadlet
+ """
+ self.urupersonaldir.chatview.refresh()
+
+ @pyqtSignature("")
+ def on_chatlogview_refresh(self):
+ """
+ Called when the chatlet threadlet has finished
+ """
+ self.cb_chatlog.clear()
+ lst = [chatview.humanname
+ for chatview in self.urupersonaldir.chatview]
+ lst.insert(0, "<choose>")
+ self.cb_chatlog.addItems(QtCore.QStringList(lst))
+
+ @pyqtSignature("int")
+ def on_cb_chatlog_currentIndexChanged(self, idx):
+ """
+ """
+ self.tb_chatlog_view.clear()
+ if idx < 1:
+ # chooser or -1
+ return
+ chatview = self.urupersonaldir.chatview[idx-1]
+ self.tb_chatlog_view.setPlainText(chatview.view())
+
+ @pyqtSignature("")
def on_pb_kiimage_repair_clicked(self):
"""
Clicked repair button
@@ -262,7 +302,6 @@
def on_pb_log_archive_clicked(self):
"""
"""
- self.emit(SIGNAL("chatlogsUpdated()"))
chatmover = self.urupersonaldir.chatmover
logzipper = self.urupersonaldir.logzipper
if chatmover.findLogs():
@@ -273,12 +312,16 @@
len(chatmover))
)
mb.exec_()
+ self.emit(SIGNAL("chatlogsUpdated()"))
else:
mb = qtutils.infoMB(self,
self.trUtf8("Chatlog archive"),
self.trUtf8("No chatlog(s) to archive")
)
mb.exec_()
+ # also emit the signal here so the button reacts as a refresh
+ # button, too
+ self.emit(SIGNAL("chatlogsUpdated()"))
#mb = qtutils.notImplementedMB(self)
#mb.exec_()
Modified: pymoul/trunk/src/moul/qt/threadlet.py
===================================================================
--- pymoul/trunk/src/moul/qt/threadlet.py 2007-02-07 11:31:49 UTC (rev 153)
+++ pymoul/trunk/src/moul/qt/threadlet.py 2007-02-07 13:28:12 UTC (rev 154)
@@ -79,6 +79,9 @@
self._args = None
self._kwargs = None
+ def __del__(self):
+ self.clear()
+
def detach(self, obj, *args, **kwargs):
"""
Detach a function call
@@ -89,8 +92,8 @@
"""
self.mutex.lock()
self._obj = obj
- self._args = args
- self._kwargs = kwargs
+ self._args = args or ()
+ self._kwargs = kwargs or {}
self.mutex.unlock()
if not self.isRunning():
self.start()
@@ -107,7 +110,6 @@
self.mutex.lock()
result = self._obj(*self._args, **self._kwargs)
self.emit(SIGNAL("done(result)"), result)
- self.clear()
self.mutex.unlock()
class YieldingThreadlet(Threadlet):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-07 11:31:54
|
Revision: 153
http://pymoul.svn.sourceforge.net/pymoul/?rev=153&view=rev
Author: tiran
Date: 2007-02-07 03:31:49 -0800 (Wed, 07 Feb 2007)
Log Message:
-----------
Fixed typo in file.chatlog
Added PBML parser to localization
Modified Paths:
--------------
pymoul/trunk/src/moul/file/chatlog.py
pymoul/trunk/src/moul/file/localization.py
pymoul/trunk/src/moul/qt/mainwindow.py
Modified: pymoul/trunk/src/moul/file/chatlog.py
===================================================================
--- pymoul/trunk/src/moul/file/chatlog.py 2007-02-06 20:35:26 UTC (rev 152)
+++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-07 11:31:49 UTC (rev 153)
@@ -131,7 +131,7 @@
'modtime' : mtime,
'created' : created,
'newname' : newname,
- 'newpath' : os.path.join(self._destdirt, newname),
+ 'newpath' : os.path.join(self._destdir, newname),
}
self._logs.append(details)
Modified: pymoul/trunk/src/moul/file/localization.py
===================================================================
--- pymoul/trunk/src/moul/file/localization.py 2007-02-06 20:35:26 UTC (rev 152)
+++ pymoul/trunk/src/moul/file/localization.py 2007-02-07 11:31:49 UTC (rev 153)
@@ -20,9 +20,11 @@
from __future__ import with_statement
import glob
import os
+from sgmllib import SGMLParser
from xml.sax import ContentHandler
from xml.sax import make_parser
from xml.sax.handler import feature_namespaces
+from xml.sax.saxutils import unescape
from moul.log import getLogger
@@ -197,8 +199,42 @@
def __str__(self):
return self.content
+class PBMLParser(SGMLParser):
+ """Plasma Book Markup Language parser
+
+ Handles the PBML language used to describe books in Uru.
+ """
+ def __init__(self):
+ self.pbml_content = []
+ return SGMLParser.__init__(self)
+
+ def handle_data(self, data):
+ """Handle data outside tags
+ """
+ self.pbml_content.append(data)
+
+ def getPBML(self):
+ """Get PBML data and close parser
+
+ @return: pbml data w/o tags
+ @rtype: unicode
+ """
+ self.close()
+ return u''.join(self.pbml_content)
+
+ def feedEscaped(self, data):
+ """Feed escaped data as read from loc files
+
+ @param data: data to parse
+ @type data: str or unicode
+ """
+ self.feed(unescape(data))
+
class MoulLocHandler(ContentHandler):
- """Content handler for Myst Online Uru Live locatization"""
+ """Content handler for Myst Online Uru Live localization
+
+ Reads and parsed .loc files which contain MOUL's i18n text.
+ """
def __init__(self, fname=''):
self._fname = fname
@@ -246,11 +282,13 @@
"""</translation> handler
"""
content = u''.join(self._content)
+ pbml = PBMLParser()
+ pbml.feedEscaped(content)
tl = Translation(age = self._age,
set = self._set,
element = self._element,
language = self._language,
- content = content,
+ content = pbml.getPBML(),
fname = self._fname)
self.translations.append(tl)
Modified: pymoul/trunk/src/moul/qt/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-06 20:35:26 UTC (rev 152)
+++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 11:31:49 UTC (rev 153)
@@ -262,6 +262,7 @@
def on_pb_log_archive_clicked(self):
"""
"""
+ self.emit(SIGNAL("chatlogsUpdated()"))
chatmover = self.urupersonaldir.chatmover
logzipper = self.urupersonaldir.logzipper
if chatmover.findLogs():
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-06 20:35:25
|
Revision: 152
http://pymoul.svn.sourceforge.net/pymoul/?rev=152&view=rev
Author: tiran
Date: 2007-02-06 12:35:26 -0800 (Tue, 06 Feb 2007)
Log Message:
-----------
Fixed the unicode fix for windows process info code
Modified Paths:
--------------
pymoul/trunk/src/moul/osdependent/processinfo.py
Modified: pymoul/trunk/src/moul/osdependent/processinfo.py
===================================================================
--- pymoul/trunk/src/moul/osdependent/processinfo.py 2007-02-06 20:31:12 UTC (rev 151)
+++ pymoul/trunk/src/moul/osdependent/processinfo.py 2007-02-06 20:35:26 UTC (rev 152)
@@ -203,10 +203,11 @@
name = u"".join([c for c in modname if c != NULL])
except UnicodeError, msg:
LOG.exception("Can't decode name of pid %i" % pid)
+ else:
+ mapping[pid] = name
modname[:] = sizeof(modname) * NULL
KERNEL.CloseHandle(hProcess)
- mapping[pid] = name
-
+
return mapping
def getPidDetails(self, pid):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-06 20:31:15
|
Revision: 151
http://pymoul.svn.sourceforge.net/pymoul/?rev=151&view=rev
Author: tiran
Date: 2007-02-06 12:31:12 -0800 (Tue, 06 Feb 2007)
Log Message:
-----------
Fix for chatlog directory doesn't exist
Modified Paths:
--------------
pymoul/trunk/src/moul/file/chatlog.py
pymoul/trunk/src/moul/qt/i18n/__init__.py
Modified: pymoul/trunk/src/moul/file/chatlog.py
===================================================================
--- pymoul/trunk/src/moul/file/chatlog.py 2007-02-06 17:51:25 UTC (rev 150)
+++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-06 20:31:12 UTC (rev 151)
@@ -90,14 +90,20 @@
self.clear()
def clear(self):
+ """Clear results and check the existence of directories
+
+ @return: state of directories, True if everything is ok
+ @rtype: bool
"""
- """
self._logs = []
if not os.path.isdir(self._srcdir):
LOG.warning("%s is not a directory" % self._srcdir)
+ return False
if not os.path.isdir(self._destdir):
LOG.info("Creating chatlog directory %s" % self._destdir)
os.mkdir(destdir)
+ return False
+ return True
def findLogs(self):
"""Find log files in self._srcdir
@@ -105,7 +111,8 @@
Also calls and stores _findCreated(), modtime() and _makeFile()
for the file.
"""
- self.clear()
+ if not self.clear():
+ return
for file in os.listdir(self._srcdir):
if not fnmatch(file.lower(), self._pat):
continue
Modified: pymoul/trunk/src/moul/qt/i18n/__init__.py
===================================================================
--- pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 17:51:25 UTC (rev 150)
+++ pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 20:31:12 UTC (rev 151)
@@ -56,7 +56,7 @@
@rtype: str or None
"""
global TRANSLATIONS
- if True: #__FROZEN__:
+ if __FROZEN__:
basedir = os.path.dirname(os.path.abspath(sys.argv[0]))
#basedir = sys.prefix
qm = os.path.join(basedir, 'i18n', '%s.qm' % name)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ti...@us...> - 2007-02-06 17:51:40
|
Revision: 150
http://pymoul.svn.sourceforge.net/pymoul/?rev=150&view=rev
Author: tiran
Date: 2007-02-06 09:51:25 -0800 (Tue, 06 Feb 2007)
Log Message:
-----------
Added run.bat to run the program under windows w/o build the py2exe version first
Fixed error handler
Fixed translation installer
Modified Paths:
--------------
pymoul/trunk/src/moul/qt/errorhandler.py
pymoul/trunk/src/moul/qt/i18n/__init__.py
pymoul/trunk/src/moul/qt/moulqt.py
Added Paths:
-----------
pymoul/trunk/run.bat
Added: pymoul/trunk/run.bat
===================================================================
--- pymoul/trunk/run.bat (rev 0)
+++ pymoul/trunk/run.bat 2007-02-06 17:51:25 UTC (rev 150)
@@ -0,0 +1,5 @@
+@echo off
+cls
+set PYTHONPATH=src
+python src\moul\qt\moulqt.py
+pause
Modified: pymoul/trunk/src/moul/qt/errorhandler.py
===================================================================
--- pymoul/trunk/src/moul/qt/errorhandler.py 2007-02-06 17:15:50 UTC (rev 149)
+++ pymoul/trunk/src/moul/qt/errorhandler.py 2007-02-06 17:51:25 UTC (rev 150)
@@ -32,7 +32,6 @@
from traceback import format_exception
from moul.log import getLogger
-
from moul.qt.utils import criticalMB
@@ -45,21 +44,20 @@
"""
# TODO: translation aware
LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback))
- if not getattr(sys, 'frozen', False):
- return
- try:
- title= QApplication.translate("excepthook",
- "An unhandled error has occured",
- None, QQApplication.UnicodeUTF8)
- msg = ("Please report the error:\n\n" +
- '\n'.join([line.strip() for line in
- format_exception(typ, value, traceback)])
- )
- mb = criticalMB(None, title, msg)
- mb.exec_()
- except Exception, msg:
- print msg
- #sys.exit(100)
+ if getattr(sys, 'frozen', False):
+ try:
+ title= QApplication.translate("excepthook",
+ "An unhandled error has occured",
+ None, QApplication.UnicodeUTF8)
+ msg = ("Please report the error:\n\n" +
+ '\n'.join([line.strip() for line in
+ format_exception(typ, value, traceback)])
+ )
+ mb = criticalMB(None, title, msg)
+ mb.exec_()
+ except Exception, msg:
+ print msg
+ sys.exit(100)
def setupQtExceptHook():
"""
Modified: pymoul/trunk/src/moul/qt/i18n/__init__.py
===================================================================
--- pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 17:15:50 UTC (rev 149)
+++ pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 17:51:25 UTC (rev 150)
@@ -36,11 +36,11 @@
# pkg_resources is incompatible with os.listdir()
LANGS = ('de', 'es', 'fr', 'it', 'nl')
PREFIX = "pymoul"
+TRANSLATIONS = {}
if not __FROZEN__:
# pkg_resources don't work under py2exe yet
import pkg_resources
- TRANSLATIONS = {}
for lang in LANGS:
name = "%s_%s" % (PREFIX, lang)
qm = pkg_resources.resource_string(__name__, "%s.qm" % name)
@@ -55,15 +55,21 @@
@return: binary file data or None
@rtype: str or None
"""
- if __FROZEN__:
- qm = os.path.join(sys.prefix, 'i18n', '%s.qm' % name)
+ global TRANSLATIONS
+ if True: #__FROZEN__:
+ basedir = os.path.dirname(os.path.abspath(sys.argv[0]))
+ #basedir = sys.prefix
+ qm = os.path.join(basedir, 'i18n', '%s.qm' % name)
if os.path.isfile(qm):
- return open(qm, 'rb').read()
+ # TRICKY: we have to make sure that the data is NEVER garbage
+ # collected! But the data in a global dict
+ data = open(qm, 'rb').read()
+ TRANSLATIONS[name] = data
else:
LOG.debug("QM file not found: %s" % qm)
- else:
- return TRANSLATIONS.get(name, None)
+ return TRANSLATIONS.get(name, None)
+
def installTranslator(app):
"""
Installs a translator for the ap
@@ -91,6 +97,6 @@
LOG.info("Loading translation %s" % longname)
if qm is not None:
- #LOG.debug("len(qm) %i" % len(qm))
+ LOG.debug("len(%i), type(%s)" % (len(qm), type(qm)))
translator.load(qm, len(qm))
app.installTranslator(translator)
Modified: pymoul/trunk/src/moul/qt/moulqt.py
===================================================================
--- pymoul/trunk/src/moul/qt/moulqt.py 2007-02-06 17:15:50 UTC (rev 149)
+++ pymoul/trunk/src/moul/qt/moulqt.py 2007-02-06 17:51:25 UTC (rev 150)
@@ -58,7 +58,7 @@
singleapp = SimpleSingleApp('pymoulqt', path=getPyMoulDataDir(check=True))
try:
singleapp.acquire()
- createLogfile()
+
except OSError:
mb = criticalMB(None,
app.trUtf8("pyMoul QT already running"),
@@ -67,6 +67,7 @@
mb.exec_()
sys.exit(1)
+ createLogfile()
setupQtExceptHook()
installTranslator(app)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|