Ticket #1282: remove-mac-app.darcs.2.patch

File remove-mac-app.darcs.2.patch, 213.4 KB (added by davidsarah, at 2010-12-26T03:30:49Z)

Remove unmaintained Mac GUI app. This version also removes the Makefile targets.

Line 
13 patches for repository davidsarah@dev.allmydata.org:/home/darcs/tahoe/trunk:
2
3Sun Dec 26 02:05:08 GMT Standard Time 2010  david-sarah@jacaranda.org
4  * Remove unmaintained Mac GUI app. fixes #1282
5
6Sun Dec 26 02:08:58 GMT Standard Time 2010  david-sarah@jacaranda.org
7  * NEWS: remove unmaintained Mac GUI app. refs #1282
8
9Sun Dec 26 02:58:59 GMT Standard Time 2010  david-sarah@jacaranda.org
10  * Remove the Makefile targets relating to the Mac GUI app. refs #1282
11
12New patches:
13
14[Remove unmaintained Mac GUI app. fixes #1282
15david-sarah@jacaranda.org**20101226020508
16 Ignore-this: b3613bf1abfd284d542bf7c753ec557a
17] {
18rmdir ./mac/macfuse
19rmfile ./src/allmydata/gui/__init__.py
20hunk ./src/allmydata/gui/amdicon.py 1
21-#----------------------------------------------------------------------
22-# This file was generated by encode_icons.py
23-#
24-from wx import ImageFromStream, BitmapFromImage
25-from wx import EmptyIcon
26-import cStringIO
27-
28-
29-def getData():
30-    return \
31-'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\
32-\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x04\
33-\x1aIDATX\x85\xad\x97MLTW\x14\xc7\xff\xef\xbd\x997|\x8c\x86\xb1\x888\x0c\x06\
34-\x17\x80\x03\xa1\x8a\t\xa9\x8d5a\xd3t\xd3\xa4\xed\xae+\xe3\xa6\xe9\x02v\x8d\
35-\xdd\xb8\xd2%D\xb1\x06\x02]\xd9.\xba\xd0\xa4iBqaHHM\xcbnbGZeH\x8d\x16\xad\
36-\xed\x14\x91\xe1c\x98\xb9\xf7\xbdw\xcf\xe9\x02\x9c\xf2\xf1\xde\x9b7\xc8\x99L\
37-2\x99{\xce\xb9\xbfs\xee\xb9\xe7\xde\xabi\xba\x81\xa0\x12\x1eN2\xd9!\x90\x1d\
38-\xc2\xdb\x87\x92\xa8\xab\x8abY\xe41\xb34\x0b=\xec\xc00mX}\x19-\xb0C\x00\xd0t\
39-#\xd0\xd7\xb8\xde\xcd-\xa3\x1f\xf3\xcd\x99\t\xce\x895\xde*9\xb1\xc67g&\xb8e\
40-\xec#\x0e}u\x8a\x83\xfa\xd4t#\x18\x80q\xed4_\xb8s\x85\xcbIN\xac\xf1\x85;W\
41-\xd8\xb8v:0D\xf9\xc9\x87\xba\xf9\xfc\xc4eV;>S\xf3)\x9e\x9aO\xf1\xfdlf\xd7\
42-\xd8\xf9\x89\xcbl\\\xef\x0e\x06\xe1W\x03\xa1\x1b\x1d|&\xf6.\xee~:T\xfao\xe2\
43-\x8fi\\\xfci\x04\x7f\x15\x9e\x03:\x03\xa4!Q\xd3\x8c\xc1\xde>|\xd8z\xb6\xa4w\
44-\xe6\xdb\xcf\x90\x113\xb0\xfbg\xfdk\xa2\\\xea\xc7\x9fL\xf1\x92\xbd\xc8K\xf6"\
45-\x8f\xa4o\xb16\xd8\xc3\x91\xd1\xcem\xd1EF;Y\x1b\xec\xe1\x91\xf4\xad\x92\xee\
46-\xf8\x93\xa9@K\xa1\xfb\xc1\xc5\xab\xe2\xe8ij\x83$\x81\x97\xc5W\xb8to\x0cf\
47-\xb4\xb0\xab\xd2\xad\xbe\x8cfF\x0b\xb8to\x0c/\x8b\xaf I\xa0\xa7\xa9\r\xf1\
48-\xea\xb8\xff\x0e\x00\xbc\x01B7:\xf8\x9dD\x12\x92\x05$\x0b|\xf7p\x12y\xe4<\
49-\xb7\x99\xd5\x97\xd1\xf2\xc8\xe1\xc7\xc7\xd3%\x9bd\xfd1\x84\x87\x93\xbc\'\
50-\x00\x008z \x06I\x02\x92\x04rb\x15\x9a\xa1|\xa3\xd1\x0c\x85\xf9\x95l\xc9\xa6\
51-\xbd>\x01&\xff\x12\x08\xf9\r:\xec@\x92(\xfd\x0e"\x95\xda\x94\x01\xb0\xb78\
52-\xb3\x03\x02Tf\xe3\t\xa0\xa4\t\x87\x1d\x08*\x02\x00\xea\xa3Qt\x1e\xec\x00\
53-\xbe\xe9\xf0]\xd3\xfah\xb4d\xe3\xb0\x03%M_\x00\xd7>\xa0\r\x9e\xe2/\xce~\x82\
54-\x0f\xdaO\x96\x8d\xa0\x9c\xdc\x9d{\x80\xab\xd3?\x80/\xa6]\x8b\xc15\x03-\x07\
55-\xe3\xe8mm/\xa5\xf2M\xa4\xb7\xb5\x1d\xdf\xff\x16\xc7S\xa4]\xc7]\x01\xaa\xcd\
56-\xf0\xbeL\xbe\xd5\x9f\x97\xb8\x020\x13\xc4>\x020Se\x00\x04\x82do\x80\xb9\xec\
57-\x02&\x1feP\xb0,\xd4\x98&\xde\xef8\x81\xf6\xc6\x06O}B\xa5\x00L\xa5J\xde)\x0f\
58-\x9e\xfd\x83\xaf\x7f\xfe\x05\xe1\xda"\xec\xfeY-<\x9c\xe4\xfb\x93\x7f\xe2\xf3\
59-s\xef\xe1\xe4\xb1\xa3\xee\x00{\xca\x80\xcb\x12,;K\xb8\x9dJo;\x0f\xec\xfeY\
60-\xcd\x1c9\xc1\xb7S\xbf\xe2\xad\x06\x0bu\xa1\x18\xc2\xba\xb9\xcb\xdf\x1e\x00$\
61-\x14;X\xb0\xb3\xf8\xd7z\x81U\xb5\x02b\x85e\xa1\x83\xbf\xdc}\x18\xd9\x03\xd5<\
62-\x99\x1b\x07\x81P\xa5W\xe3p\xf8\x08\x8eW\xb5\xe1\x88\x19\xaf\x1c\x80\x99\xf0\
63-B>\xc3\xbc|\x0c\x8b,\x10\x14\x14\x13\x88\x15\x98j\\\x1d1i\x90,A\xacP\xa0u,\
64-\xda\x0bx\xb8\x9e\xc6a\xb3\x11k\x8ew}\xb8\x1eFy\xb5\x86\xb9\xe2\xef(\xa8\xf5\
65-\xcd\x83E\xc2\xa2\x8d\x13\xae\xb1Y\xc0\x18\xea\xda\xd6\r\x8d\xa1.\x8e5\xadl\
66-\xeaHX$7\xecX\xe2\xb9x\x8aU\xb5R\x19\xc0\xeb~.Y\xc2\xe2\xff\x9dY$\xd1p|\t\
67-\xb5Q\xa7\x04a\x0cuq\xa4V\xa2\xae\xe5\xefM\x1d\x01\x8b$\x1c\xb672\x06\xdf\
68-\xce\xed]\x03\x16I((\x10+\x106\xd2\xafX\x81\x0cB]3!\xff\xa8\x11\x00\xc0\xac\
69-\xe1@"\x0bG/\x80\xc9\x7f\xb2\xe0\x00\xbc\xd1\x07\x88is\xfd\xb7C\xd8\xac\xef\
70-\xd2/\x17iE\x00\xbc3\x03L\xdb\xb2\xe1\x90wk\xdd\x17\x00\x02C\x92\x00\x816\
71-\xa3W`\xe6=GY9\x00\x13,\x96\xbe\xa9%+\x04m\xa0\x9b\xc9\xaa\xec%\x16\x08\x80\
72-\xc1P\xec}\xff\x8b\xd4\xad"q.\xf5F\x13\xbf\x16\xd7mHN\xf0\x07k\x10\xf1\xf3\
73-\xe7\n\xa0\xa4\x89\xe2bl_&/.\xc6\xa0D\xc4s\xdc\xf3i\xa6\rt\xb3Q%\xa1\x87\xfc\
74-\xaf\xe2~B\x8e\x01%M\xcf\xeb\x18\x00\xfc\x07\x9aY\xdf_&\xed\xfd\xe8\x00\x00\
75-\x00\x00IEND\xaeB`\x82'
76-
77-def getBitmap():
78-    return BitmapFromImage(getImage())
79-
80-def getImage():
81-    stream = cStringIO.StringIO(getData())
82-    return ImageFromStream(stream)
83-
84-def getIcon():
85-    icon = EmptyIcon()
86-    icon.CopyFromBitmap(getBitmap())
87-    return icon
88-
89-
90rmfile ./src/allmydata/gui/amdicon.py
91hunk ./src/allmydata/gui/amdlogo.py 1
92-#----------------------------------------------------------------------
93-# This file was generated by /opt/local/lib/python2.4/site-packages/wx-2.6-mac-unicode/wx/tools/img2py.py
94-#
95-from wx import ImageFromStream, BitmapFromImage
96-from wx import EmptyIcon
97-import cStringIO, zlib
98-
99-
100-def getData():
101-    return zlib.decompress(
102-'x\xda\x01\n\x0f\xf5\xf0\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x006\x00\
103-\x00\x006\x08\x06\x00\x00\x00\x8cEj\xdd\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\
104-\x08d\x88\x00\x00\x0e\xc1IDATh\x81\xbd\x9ai\x90\\Wu\xc7\x7f\xe7\xde\xb7\xf42\
105-\xdd\xa3\x914\x92,\x8d$[\xdedIF62\x8b\xb0\xc16\xa0\x02C\xb1\x84J\xfc!T\xd9\
106-\x15\x12Ha\x96PT\x92\xa2\x12 \xa4(Hp\x80\xa2\x1c\x8aP\x10\x92\x94M\x9cJ\x11\
107-\x02$\x80C\x19\x8c\xcdb\xcb\x06\x83\xe5\x05!,dY\x8b5\xb24\x9a\x99\xee\xe9\
108-\xe5\xdd\xf7\xee\xbd\xf9\xf0^\xcf\xa6\x91=\xd3\x92y]\xb7\xdf\xed\xb7\x9cw\
109-\xfe\xf7\x7f\xce\xb9\xe7\xdc\xd7\xc2\x1d\xaf\xe4\x05\xdf\xbc\x03\xef\xf3\xbe\
110-\x00(\x10yA\x1f\x19\xbc`\x92m:\x80\xcb\xde\x80\xe8\x9daT=\xaf\x16\x96\x97\t\
111-\x12\xa6\xce\xb6\x1bfj\x8c\xb4{\x10\xf86A\xf8sD\x9f\xf3\xc7\x9f{`.\x1b\xc1\
112-\xd9?\xbct\xf9\x85\x7f\xbcs\xd5E\x97l]\xbe\x96-\xcb\xd6\xb1\xa2TE\x10\x8c\
113-\xb3\x1ci\x9db\xcf\xd8!\xf6\x8e\x8f~\xe4\x87\xc7\x1e\xffv\xa33\xf6/\x84\xa5o\
114-\x15t\x9e\x93M\xce\xa9)f\xc9\xf5C\xa5e\xb7\xdf\xb2\xf5\x8d#o\xbf\xe8%\x04\
115-\xda`|\x82\xb1\x19\xd6[<\xa0D\x08$ R\x01\x91\xaap\xa8\xd9\xe63{\xbe\xc3w\x9e\
116-~\xe0\xbfP\xfaOQ\xfa\xd4\xb9P\xe5\xdc\x01K;\xef\xbb~\xfdK?\xfb\xb1\x1do\rVWC\
117-\x1ai\x13\xeb=R\xb0\xe0\x8bo_|{\x1c\x16GY\x87D\xaa\xca\xcf\x8e\x8d\xf2\xe7\
118-\xbbo\xff\xf5d2y#:z\xecl\xd5\xd1\xbcm\xe3\xd9\xca\x80\xb4{\xcb\xef]x\xfd\xe7\
119-?\xb3\xf3F\x15\x06\x1d\x1aY\x1b\x07\x80\xc7b\xc9\xc8\xf0bq\xe2\xc8HI\xc9\nX\
120-\x8e\xae7\xb4|\x93\xf3\x87\xea\\\xb3z\xfb\xca\xdd\xc7\x0f\xbc\xb6\xd1\x9d\
121-\xb8\x0f\x15\x1c?\x1b\x95\xd49\x00\xf5\xa6\xab\xd7]\xf9\xb9O\xbc\xec\xad4\
122-\xdc\xb34l\x87\x8c\x0c\x83!\xa1K\x1c\x06\xd4\xc2A\xbc+\xd1\xcd4\xb1\xaa3\x18\
123-\r\xe2\xb5\xa3K\x17C\x8a\xc1r\xcc\x9cd\xdd\n\xf8\xe8\xcb\xdevq=\xaa\xfd;\xde\
124-V\xceF\xad\xb3c\xcc\xd9hYi\xd9]\xb7]s\xd3r\x82I\xda\xce\xe0p\xa4\xa4(-T\xf5\
125-\x10\x0f\x8f\x9e\xe4\x0b\x8f\xfe\xd0}\xf1W\xf7M\xde\xb9\xff\xa1\xd6\x0f\x0f\
126-\xef\xf3\xc7\xa7\xba\xd1\x05\xb5\x11\x06+!-\xdf"-\xd8\x9b\xb4S\\0\xb4\x8c5\
127-\xa5\x91U\xf7>\xfd\x88\xa0\x83{\xfaU\xed\xec|,3\x1f\xfc\xe4\xce?\xfa\xcc\xeb\
128-6\xad\xe7\xd9d\x0c\x10\x1c\x96\x81\xb0\xc2\xc4T\xc8\xc7v\xffw\xfa\xcb\x93\
129-\xfbo\xc5e_C\x07\xcf\x80dx[\xc3\xda\xcd\x95\xb8\xfe\xc1?\xb8\xf8\xea\xd7\xdd\
130-\xf4\xa2+9\xe9\x8e\xe1|\xe1\x7fb\x19\x94a>p\xf7\xb7\xba\xfb\xc7\x0f^\x82\x8e\
131-\x0e\xf7\xa3Z\xff\x8c9\xbblye\xc5W\xdf\xb3\xfd\x9a\xda\x94?E\x86\xc7\x92\x11\
132-\x06\x9a\xb1\xa6\xe6\xcf\xee\xbd\xe3\xe9\xdf\x8c\x1f|#Ax;:<\x8e\xa86\xa2\xba\
133-(=\x89\x0e\x7f\x9b\xfa\xec\xab{\x8e\xed\xed4\xd3\xf05\xd7\x8c\\(\xe3n\x1c\
134-\x8b#\x15\x8b\x0e\x1d\x1b\xe2\xf5\xc1=\x87\x9e8\x8aR\x0f\xf4\xa3^\xff>f\xd3K\
135-\xae[\xbbem\xb9\xech{S\xf8TBU\x86\xf8\xa7G\x7f\xdc<\xd28z\x13ai\xf7\x19\xe7&\
136-Q\x10\x97o\xfd\xc6\xbe{\xbf\xfc\xfd\x03\x07)G1F\x0c)\x19\'\xb3S\\\xbaf\x905\
137-\x03\xc37\xe1l_sm\xff\xc0T\xf0\xb2k\xd7]\xca\x94\x9f*\x02\x80!\nC\xee9\xf4\
138-\x14\xf7\x1e\xfa\xf9\x9dD\x95\x1f=\xbf\x10\x01\xa5\xfe\xea\xdb\xbf}\xf4H\xec\
139-\x06I\xa4\x9b\x0f\x907L\x05c\xac\xa9\xd6\xb7\xe1\xdc\xd6\xbe\xd4\xeb\xe7&\
140-\xbc\xa3\x1a\xd7^\xba\xb6^e\xd26HII0X\x0f\xdf=\xf8\x88G\xfc\x9d\x8b\x96\x15D\
141-\xa7\xf6\x9e:t\xc7\xc1\x93M\x02\xad\xc9\xb9\xcf\xe8\xaa6k\xebu\x85\xf7\x9b\
142-\xfaQ\xb1O`\x9e\x81\xa0t\x9e\x0e\x1d\x1d\xdf\xc5H\x8aQ\x06\xe3<\xe3\xdd\xce\
143-\tD\xedY\x92<k\x9e\xdc?~\x12\xad4\xdd\x02\x9aQ\t+\xaaU\xf0\xd4\xfaQ\xb1\xef\
144-\\QDTFF"\x06\xbc`\x8b\x8f\xc7w@\xd2%\t\xf3t\xdaiB&\n#\x06\x80\xc4\x1bJA\x00"\
145-}\xe9x6I\xb0O\xc90\xa4\xf8"\xcc\xa7d\x90G\x8b\xa5f\xb3\x82\xd0\xe3\n\x0f\xc4\
146-\x04\xb8\\=\xdf\x8frg\x95\xddgX\x12\x0cL\x03[\x1aQ\xb37\x87\xc3\xe0\x8a\x81\
147-\xcaA:4\xfdf\xfcg\t,O\x9d@a\xb1\xa4\x92\xf5-\xcb\xe31\xa4$\xa4 `$\xc0\x11\
148-\xf7-\xaf\x0f`\x1e\xbc\xc7{o32\x12RD\x14V2R\x9f\xe2\xbdsx\xdf\x9a\xae\x98\
149-\x17%\xd2w\x1d.\x0fB\x85\x8f\x194\x0e\x0b\xdew\xf1\xbe n\xf1\xec-\x11\x98\
150-\xbf\\\xbc~\xb7\x12U\x0e%\xdc\xe6\xc4c$A\xbc&##\xc3\x12H8\xac%\xbc\x03\x82\
151-\xdc.\x0b]\x9eC%\x0f\\\x18\x10\x90\x15\xf3\xa1 \x18\x02\x14\x9a\x80\xe8\x16\
152-\x91`W\xea\xd2\t\xc4\x7f\n\x91Ee\xfd\x8b\xcf\x15\xbd\xafT\xc2\xd2\x9e\xf7\
153-\xed|\xd5E\xa5\x18B\x89\x08\xeb\x1d\x8e\xfa\xc3(\x14\x19\x19\xcbe\x05As9m\
154-\xdb\xcdo\x91^\x15\x96\x7f\xfb9U\xd9\xac\xf3\xce\xb3\xacZ\xe6p\xe97\xb4\\\
155-\x1b\x00-\x8a\xf5\xc9%L\xb53D{\xa4U\xe1\x8b\x0f\xdc\xff\xe5n\x96\xbck1\xeb%\
156-\x8bg\xcc\xfbrIE\xab\xc2\x15\x934\xa3S8\x0f\xc6Z\x04\xe9ECF\xfd(zp\x14\xa4\
157-\x07c\xee\xc7\xf5z2\xef\x8cx\x8e:\x8b\xcf\x8b\xb8\xfc:\xef\xd8[\xfa%\xaa"X\
158-\x95\xb2\xa3\xbe\x93\x81\xa0\xb2\xa6\x9bv\x17\xb5\x10\xb4\x14S\xf4\x1e\x9f\
159-\xb5\xad\xa1e\xf3\xb9\xeb4\xd5\xc5\x93\xbaY\x00\x168?\x1b$\xf3\xfa\xa7\x01\
160-\xf7\x1eg=\xd6\xa5t2\x03\xf8EG\xa7%\x07\x8f\x9e\x1f\x80,8\xfan\xba\xfc\xef\
161-\xa9\t^f\xc3\x98\xcb\xde\x82\x80\xe6]\x97a\xc8XZ\xc4]2\xb0\xb4\x17\xe2E\x9d\
162-\xd1\xdc(\x94tx\x1c\xaeX\x1a\xf0 \x1e\xe7\x1d\xde\x83BOCu\xd3\x80`>\x7f9\xb0\
163-\x94\x0c\xfb\x02\x02\x13H%\xc5HZ\x98\xe2lEr\x10^ \x9fn\xf3y\xa9\x16\x94Y/\
164-\x1b\xf0I\x88\xb3\x1e\x15\x80\x89[\x1crG\xe8X\x83F\x9f\xc9p\xa7\x99\xcc\xc4\
165-\x90\xc9\x0b\t\x8c\x9c\xb1\x04\x83\xa0\xe6<|\xae\xff8P\x8e\r\xb2\x91\xf2\xe8\
166-\x08O\x1c\x18\xef\xec;1z\xa8\x9b\xa5\x9dZ\\\xaam[\xb3\xf6\x82\xcd\x9b\xd6\
167-\xa9c+\xf6q\xd8\x1e\x01\x9f\xe7\xe2\xc5\xd0\xcc2\xe1\xbc\x97\xfenL1\x9d\xce6\
168-\x98cF\xb3FYYv\xf8\x97\xb0\xfb\xa7\x1d\xee\x7f\xfa\xfe\x7f\xf5\xde|\n\xad\
169-\x9f\x02I\xc7\xba\x93\xa5\x83\xe3\xcf\\\x1e\xed+\xff\xed\x9b\xb6m\x7f\xfd\
170-\xa5WTx\xd8>B\xe4\xa3\x99\xfb\xe7\xc9LI\xb1K4\xc5%\x97-\xbd\xc4\xd7\x14&\x99\
171-\x17\x993\xad--\xce\xf7\x9bxhw\x92\xfd\xf4\xa9\'\xfe\xc4\x07\xfe\x1d\x84\xd1\
172->\x946(\xe5\xd1\xbaC\x18=dTv\xc3\xd7\xf7\xfc\xecS\x13\x8f\xad\xe4\xe2\xf0\
173-\x02Z\xd2\x99\x96\x99\x0f\xdd\x8c\xcc\x04C\xb6\xc4<ti\xc0|\xeec\x89\xf4\x96\
174-\x02z\xf9x\xae@\x87\x84\xc1p\x00\xf3\xf4\n~\xbc\xff\xf1\xcf\x13\x85_9\xf3\
175-\xd2\x80@(\x1f\xba\xeb\xd1}\xdf\r\x8f\x9e\x87U&\xaf\xed0\x18\xc9\xc8$\x9b\
176-\xf6\xe7\xbc\xf4\xfc\x1d\xf8\x98!\x9d\xf6\xb1\x9e? \x1e#\x86\r\xeer\x1e:0q\
177-\x14\xcdG\x9fW\x98(\x92\xac\xf5\xd9\x03\xbf\xed\xde`KN\x0e\x99ch\xad\xd1Z\
178-\x13\xe8\x800\xd4\xe8@c\x83l\xc9\xa6\xd8\xb7\x8f\tz\xba\xf2r\xde\xd1\xcd\x12\
179-&\x92\t\xa6:\xb0\xff\xd4\xb3\xf7\xa3usQ\x02\x95\xfc\xa81\x95=9\xe2\xd7_r\xc0\
180-\x1d!\xf3\x96\xe98!\xf9\x9a\x8f\x04\xc2\x94\x9aZR\x01\xd3\x17c\xa9d\x08\x9en\
181-\xdae\xb2\xdd\xa4c\xba\xb4M\x07/\x9e\xb6\xb1t2s\n\xb5H5D\xd2\xa9\xc4\x1c\xba\
182-\xc0\xd7.A1c\xb9\xc5\xde\x03\xdez\xb2^\xbe\xb5\xc8\xad/\xc6Nu\'\xe8\xb4\x12\
183-\x1a\x9d)\xbc\xf3\xd3\xcc\x89\x06\x15:B\xa5+\xc6g\x8b{\xb9\xe7=q\x10,K\x95\
184-\x99\x0bj^\x7f\xa9\xef\t\x17\x1f<D\x10\x81c\xa7\x9ee\xf4\xc4I&[\xcd\xdc\xbbt\
185-!E\xe5/.Me\x825\x03\x83\xdbX\xec\x08{\x7f\xf1P5\xdez\\?\x93\x83X\x80\xb5~\
186-\x8a\xe8%EE\xef=If\xf2\xbbzU\xfb\xbc\xf6\xb8\xec\xe1\xb2u\x83W\x90\xf9\x9b\
187-\x17\'4\xbc\xa5\xba*)?\xe9\x0e,(\xaf\xd7\xd4\x12\'\xa6%\xcfc\xa2\xe49\x158\
188-\x94\x8e\xd2]\xfb\x94lZ\xbe\xeeV\xb2l\xcbs\n3\xe9\x8d/\xdfx\xfe;\xcc\xc8A\
189-\x12\x9b\x9d&K\x04\x02%h\x05\x91,MU\x85\xcbXR\x19\xcf\x99A!\x80\x87_\x04\x0f\
190-\xb1cG\xb4j]m\xf8\xfb8\xf7\x16 \x9a\'\xa1\x8as7o^\xbd\xe1\xf6\xda\xb6\xd1\
191-\xfa\x83\xf6\xe1\x19\xb9\xcc\x00\x8a\x95\xa6\xac4\xe5~\x80\r\x95\x86rm\xb2dF\
192-r\xbf\xa0\n\x1fifm\xfe7\xfa\x1a\xaf\xb868o\xf3\xf0\x9aob\xed\x85sdX\xfb\xcam\
193-k\xd6\xfe\xdb\xc8\xd5\xc7\xe3{\xf4\xdd\xf9\xb8\x16\x7f$\x08\x95PR\x9a\x8a\
194-\xd2T\x94\xa2\xac4\x15Q\x8b\x07f\x13\xc8\xba\xa8\xdf\xbc\xe5N\xee\xde\xf59v\
195-\x0co\x81d\xe2y\xd9\x93y \xe6\xecg\xb5\xaeMyP\xdf\xcf\xb2\x81\xd8\xe2\x0b\
196-\x93\xef\xc9\xf6\xe8z5\xe4W\xea\t\xac\xf3(\x81PT\xc1N\x0ej\xba/\x8a\x8aR\x84\
197-\xa2xN\xcd\xbc\x83\xa4\xc1\x8e\xe1m|\xfd\xd5\x9fF\xad\x8c\x07y\xed\x9a\xab\
198-\xb8{\xd7m\xfc\xc5\x15\xef\x04g\xc0-\x90I\xf7\xa4>\x0f[\xd3{\x05\x01\x01\xd6\
199-\xb9\xa2\xba\xc9\xf2\x87\xbb\x0c\xbcx\xe7=\x91Dh\xc5i`\xcaJQ\x16\x9d\xb7\xe2\
200-X\xfc\\\xf1\xde\xa5\xe02>\xfc\xe2[\xf8\xc1\xae\xdbx\xdb\x86W\xcd\x04\x8f\xa1\
201-\xa8\xc6\xad;\xde\xcb\xdf]\xf5~b\x15\x805,h\x9a\xb3\x810o\xbf\xd0\xfc\x83@\
202-\xda\xe6\xca\x95\x97\xf1\x8d\xeb\xff\x9e\xd5\x95a\xb0\x1d\x04(\x89\xa2\xa4d\
203-\x06Laz%\xd13\xfd\x02Xx&S\xb4\t5]\xe2\x9f\xaf\xfe\x08\x1f\xbf\xf2]\x0c\x86U`\
204-\xd6\x04\xed\x8b7\xfc\x1f\xda\xfav^\xber\x0b7\xde\xf7\xd7\x9ch=\x0bau\x16]\
205-\xcf\x01j\xa1=\xd0\xb1\t\xdbV]\x9e\xdd\xf5\x9aO\xb3:\x1eb\xa4\xba\x8a7\xfc\
206-\xdf\x07l\xe6\xed\x1cv\x02\x84@\x84@)\xc2^_\x84P\x14\xa2\xdc\xc2>\x96\xb6X_\
207-\x1b\xe1?\xaf\xfd$;\x87\xe7\xbem\x9asuo\x01\xe5\xba\xd5Wr\xf7\xae\xdbx\xf1\
208-\xf0VH\x17H\xf9\x16\xf0\xa9\x85\x9a\x13\x8f\x88\xf0\x89\xed\xef\xde\xba:\x1c\
209-\xba\xcc\x18\xf3\xa2\xab\x96_z\xe9\x87\xb7\xbfk\x93\xb1)%Q\xd3&X\x99\xe3SE\
210-\xf0(\x98\xab(M4\xdf\x14\xcd\x14\xaf\x1d\xb9\x86\x9f\xdc\xf0%v\x0eo\xc5\xcf\
211-\x8b\rgL\xa9\xb6\x0f]\xc4\xf7v\xdd\xc6\x9b\xef\xf9K\x1ex\xe6A@Ci`f(\x16J\x7f\
212-\xe6\x1d\xd7J\x88t(\xc7\xf6\x1e\x1c\xf9\xc5A\xd5\xed8\x13\r\xe8R\xb7\xd1<q^\
213-\xb4,\x98ez\x8a\x00U0T0\x85B\x17\xbf\x95rD*_B \xeb\x02\x96\xb7n\xba\x81;\xaf\
214-\xf9\x1b\xcaA\x8cs\x0e\x99\x07\xfc\x8c\xc0\xbc\xf7\xac\x8c\x07\xf9\xc1\xae\
215-\x7f\xe4+\xfb\xff\x87\xbb\x8e>\x90\xed>\xb57\x17\x9e\x17\xcf\x0b\x9a\xa0\x00\
216-Z\xf2\t\xad\xa2\x02\x9c\xf5\xf2\x1f\x8f|\xef\xa2\x9f\xd8\xc1r\x8a\x0b#\xb4\
217-\xd9\x1b\x9e\xd8\xa8^\xa1(\xab\x80\xb2\xe4>\xd53\xbd@f\x9b\xa2"\x14A\xab\xfc\
218-\xbdK\xa4Bw\xe5\xca\xcd\xbcf\xddN\xfe\xe1\xc5\xef\xc9\xad\xc2-\x9c\xba=o\x12\
219-\\\xd6\x11\xef\xdd\xfc\xfb\xdc\xbc\xe9\x8d[\xae\xf8\xee\xcdq\xc7\xdb\x05}I\
220-\x04\x02\x99\x19u\xb0\x04\xde\xb3}d\xa5:p\xdd\xd8\xfb\x0f\xabg\x11\xc9\xff\
221-\xa73h\x85\xcd\xabVq\x18OE)b\xd1\xd3L\x05"\x04\xa89\xbf5\x1a\xe3\x12\xae^\
222-\xb9m\xe5\xd7\xae\xfd\xf8 0\tg\x06u\x1a\xb0YtF"Ru\xceU\xad\xb55o\xddUGN<s\
223-\xb9sN\xc9\xbc$U\x15\x0c\x85\xd2SF\x15\xca\x05L\xb81~5\xf2MJ\x1b\x03\x02a\
224-\x96\xb9)\x8exG\xcb6\xa9\xaa\x88h\xfa\x1eE\xa0\xa4`,?&\x80+\x1e\xa8\xad\xaci\
225-O\xb4\xde\x19V\xc2GD\xa9\x03Z\xeb)\x11i\x03m`\x0e\xca\x1e\xb0\x92snU\x9a\xa6\
226-\xf5$I\x96w:\x9dz\xab\xd5\x8a\x9b\xcd\xa6dY6X\n\xa2mO\x9e8\x14Yk\x85"WT\xc8\
227-\xb4\x0f\x04s\x80I\x11\xe1\x14\x81@\xc3\x8d\xd3\xf1s#]\xcf\xc4b\x15\x10\x8a\
228-\x9ecz\x81\xca\xef\x9f?\xd1(\xa5i6\x9a\xfa\xb1\xc7\x1f[S\xaeW\xaeK\x92d\xa8Z\
229-\xadR\xadV\xd3j\xb5\xda)\x97\xcb\xe3Q\x14\x8d\x07A0."\'\x03\xa0j\x8cyu\xa3\
230-\xd1\x18h4\x1a\xae\xd1h\xf8F\xa3\xe1\x9a\xcd\xa6o4\x1a\xb6\xd3\xe94W\xad\x18\
231-n\x9cl\x8f\r{\xed\xf1\x92\x9bb \xbeh\x85\t\xe2g\xd8\x12!\x14?\xcb4)\x02\x820\
232-;@\x04\xe2\xa6\xaf\x0b\x11\xb4\xf8\x82\xa1|\xeb\xc59G\x8a(\x8f1\t\xa3\xc7\
233-\x8f\xdb\xe4h\xf7\xe4T\xab\x95\x0e\x0e\x0e\xaaZ\xad\xa6\xeb\xf5z\xad^\xaf/\
234-\xab\xd7\xeb\x9b\xea\xf5\xba\x0c\x0c\x0c\xec\x0b\x00\xa3\x94:\x1cE\xd1\x868\
235-\x8eK\xa5RI\x8c1:MSo\x8c\x91$I\xd2\xb1\xb1\xb1_\xeb\x01\x1d\'>\x8d\xb6\x84\
236-\x1b9/.\x11\xf9`\xc6\x07z\x0e\xaf\x04=\xcb\x8cr\xff\x10B\xa5\x08\n\x8659@M\
237-\xce\x8c.\xda\xe9\xa9\xc0\xec\xf0\xed(\xf9\x01\x8cX\xdd\xedt\x9e\x9el5\x8e\
238-\xd5\xea5]*\x95T\xa9T\x92R\xa9$q\x1c\xfb8\x8em\x18\x86\x13\xc0\xa8\xf8\xfc%\
239-\x1e@\xd997\x94\xa6i\xd9\x183\x90$\xc9`\xb7\xdb\xad\xb4\xdb\xed\xb85\xd5R&1\
240-\xfa\x0b\x8d\xbbnzB\xff\xfa\xf5\x95(\x0e\x05\x01\xe7g\xe6\x0f\xef\xe7\x0c\
241-\xb4\xf4z\x02\xd2\xfb\xd7\xac\xe4g\xe6\xc4\x1e\x99\x03J$wt\x11\x11z\xcd{\xe7\
242-&Mbn\x90W}\xe9\xcd\x03/\xf9~X\x8d\x83J\xa5\x92V*\x95N\x1c\xc7SQ\x14M\x86a\
243-\xd8\t\xc3\xb0\xa9\x94\x1a\xf7\xde\xfbi`\xb3\'\xb8\\\x98\x87\xbc\x9c\x8c\x9d\
244-seA\xa241\xe1c\x13\x07\xd7g\xdeV\xc51d\xad\xad\xa7Y6`\x12S\xeb&\xddJ\x92$a\
245-\x92\x18mR#i\x9ab3+\xd6fX\xe7\xe6\xc8W"(\xad\t\x82\x80 \x08|\x18\x86>\x8a"\
246-\x17\xc7\xb1\x8d\xe38)\x94m*\xa5\xa6\xb4\xd6\xe3\x99\xb8F=\xa8\xb4/\x1f\xdax\
247-\xc4k\xb1\xa2\xa4\x0bt\x94Rf\xb6\xee\xbd\x81\x008\r\xd8\xec\xbd\xf7y\xe6\xe0\
248-\x9c#\x08\x02lf\tu\x98\x87\xc2\xccA\xa0f\x87\xfc*\x8e\xaa\xcf\xec\x80s\xae\
249-\x92eY\xd9Z\x1b9\xe7\x94sN\x9cs\xd2{\xb8R\xca+\xa5\x9cR\xcaj\xad;A\x10t\x95\
250-\xd6-D\x9ahZ\x90\xaf\x8ezc\x11\xa5 \x10|j\xb12W75\xaf\xacVJM\x03\xfb\x7f\xee\
251-r\xc9\xfc\x835!h\x00\x00\x00\x00IEND\xaeB`\x82`\xcd|Q' )
252-
253-def getBitmap():
254-    return BitmapFromImage(getImage())
255-
256-def getImage():
257-    stream = cStringIO.StringIO(getData())
258-    return ImageFromStream(stream)
259-
260-def getIcon():
261-    icon = EmptyIcon()
262-    icon.CopyFromBitmap(getBitmap())
263-    return icon
264-
265rmfile ./src/allmydata/gui/amdlogo.py
266hunk ./src/allmydata/gui/confwiz.py 1
267-
268-DEFAULT_SERVER_URL = 'https://www.allmydata.com/'
269-
270-BACKEND = 'native_client.php'
271-ACCOUNT_PAGE = 'account'
272-WELCOME_PAGE = 'welcome_install'
273-TAHOESVC_NAME = 'Tahoe'
274-WINFUSESVC_NAME = 'Allmydata SMB'
275-
276-CONVERGENCE_DOMAIN_TAG = "allmydata_root_cap_to_convergence_domain_tag_v1"
277-
278-import os
279-import re
280-import socket
281-import sys
282-#import time
283-import traceback
284-import urllib2
285-from urllib import urlencode
286-import webbrowser
287-import wx
288-
289-from allmydata.util.assertutil import precondition
290-from allmydata.util import hashutil, base32
291-from allmydata import uri
292-import allmydata
293-from allmydata.gui import amdlogo
294-
295-from foolscap.api import Tub
296-from twisted.python import usage
297-
298-class AuthError(Exception):
299-    pass
300-
301-def unicode_to_utf8(uobj):
302-    assert precondition(isinstance(uobj, unicode))
303-    return uobj.encode('utf-8')
304-
305-
306-def post(url, args):
307-    argstr = urlencode(args)
308-    conn = urllib2.urlopen(url, argstr)
309-    return conn.read()
310-
311-def get_root_cap(url, user, passwd):
312-    args = {
313-        'action': 'authenticate',
314-        'email': unicode_to_utf8(user),
315-        'passwd': unicode_to_utf8(passwd),
316-        }
317-    root_cap = post(url, args)
318-    if root_cap == '0':
319-        raise AuthError()
320-    elif not uri.is_uri(root_cap):
321-        raise ValueError('%r is not a URI' % (root_cap,))
322-    else:
323-        return root_cap
324-
325-def create_account(url, user, passwd, subscribe):
326-    args = {
327-        'action': 'create_account',
328-        'email': unicode_to_utf8(user),
329-        'passwd': unicode_to_utf8(passwd),
330-        'subscribe': subscribe and 'true' or 'false',
331-        }
332-    result_code = post(url, args)
333-    return result_code
334-
335-def record_install(url, user, passwd, nodeid, nickname):
336-    args = {
337-        'action': 'record_install',
338-        'email': unicode_to_utf8(user),
339-        'passwd': unicode_to_utf8(passwd),
340-        'nodeid': nodeid,
341-        'moniker': nickname,
342-        }
343-    result_code = post(url, args)
344-    return result_code
345-
346-def record_uninstall(url, nodeid):
347-    args = {
348-        'action': 'record_uninstall',
349-        'nodeid': nodeid,
350-        }
351-    result_code = post(url, args)
352-    return result_code
353-
354-def get_introducer_furl(url):
355-    return post(url, { 'action': 'getintroducerfurl' })
356-
357-def get_config(url, user, passwd):
358-    args = {
359-        'action': 'get_config',
360-        'email': unicode_to_utf8(user),
361-        'passwd': unicode_to_utf8(passwd),
362-        }
363-    config = post(url, args)
364-    return config
365-
366-def get_basedir():
367-    if sys.platform == 'win32':
368-        from allmydata.windows import registry
369-        return registry.get_base_dir_path()
370-    else:
371-        return os.path.expanduser('~/.tahoe')
372-
373-def write_config_file(filename, contents):
374-    basedir = get_basedir()
375-    path = os.path.join(basedir, filename)
376-    dirname = os.path.dirname(path)
377-    if not os.path.exists(dirname):
378-        os.makedirs(dirname)
379-    iff = file(path, 'wb')
380-    iff.write(contents)
381-    iff.close()
382-
383-def write_root_cap(root_cap):
384-    write_config_file('private/root_dir.cap', root_cap+'\n')
385-    convergence = base32.b2a(hashutil.tagged_hash(CONVERGENCE_DOMAIN_TAG, root_cap))
386-    write_config_file('private/convergence', convergence+'\n')
387-
388-def get_nodeid():
389-    CERTFILE = "node.pem"
390-    certfile = os.path.join(get_basedir(), "private", CERTFILE)
391-    tub = Tub(certFile=certfile)
392-    return tub.getTubID()
393-
394-def get_nickname():
395-    nick = None
396-    nnfile = os.path.join(get_basedir(), 'nickname')
397-    if os.path.exists(nnfile):
398-        try:
399-            fh = file(nnfile, 'rb')
400-            nick = fh.read().strip()
401-            fh.close()
402-        except:
403-            DisplayTraceback('Failed to read existing nickname file %s' % (nnfile,))
404-    if not nick:
405-        nick = socket.gethostname()
406-    return nick
407-
408-def maybe_write_file(filename, contents):
409-    fname = os.path.join(get_basedir(), filename)
410-    try:
411-        if not os.path.exists(fname):
412-            fh = file(fname, 'wb')
413-            fh.write(contents)
414-            fh.write('\n')
415-            fh.close()
416-    except:
417-        DisplayTraceback('Failed to write file %s' % (fname,))
418-
419-def configure(backend, user, passwd):
420-    _config_re = re.compile('^([^:]*): (.*)$')
421-    config = get_config(backend, user, passwd)
422-    config_dict = {}
423-    for line in config.split('\n'):
424-        if line:
425-            m = _config_re.match(line)
426-            if m:
427-                fname, contents = m.groups()
428-                config_dict[fname] = contents
429-    for fname, contents in config_dict.items():
430-        write_config_file(fname, contents+'\n')
431-
432-def start_windows_service(svc_name):
433-    try:
434-        import win32service
435-        import win32serviceutil as wsu
436-        if wsu.QueryServiceStatus(svc_name)[1] != win32service.SERVICE_RUNNING:
437-            wsu.StartService(svc_name)
438-    except:
439-        DisplayTraceback('Failed to start windows service "%s"' % (svc_name,))
440-
441-def maybe_start_services():
442-    if sys.platform == 'win32':
443-        start_windows_service(TAHOESVC_NAME)
444-        start_windows_service(WINFUSESVC_NAME)
445-
446-def DisplayTraceback(message):
447-    xc = traceback.format_exception(*sys.exc_info())
448-    wx.MessageBox(u"%s\n (%s)"%(message,''.join(xc)), 'Error')
449-
450-class ConfWizApp(wx.App):
451-    def __init__(self, server, open_welcome_page=False):
452-        self.server = server
453-        self.show_welcome = open_welcome_page
454-        wx.App.__init__(self, 0)
455-
456-    def get_backend(self):
457-        return self.server + BACKEND
458-
459-    def open_welcome_page(self):
460-        if self.show_welcome:
461-            args = {'v':    str(allmydata.__version__),
462-                    'plat': sys.platform,
463-                    }
464-            webbrowser.open(self.server + WELCOME_PAGE + '?' + urlencode(args))
465-
466-    def OnInit(self):
467-        try:
468-            wx.InitAllImageHandlers()
469-
470-            self.login_frame = WizardFrame(self, LoginPanel)
471-            self.login_frame.CenterOnScreen()
472-            self.SetTopWindow(self.login_frame)
473-            #self.SetExitOnFrameDelete(True)
474-            self.login_frame.Show(True)
475-
476-            return True
477-        except:
478-            DisplayTraceback('config wizard init threw an exception')
479-
480-    def swap_to_register_frame(self):
481-        try:
482-            self.login_frame.Show(False)
483-            self.regiser_frame = WizardFrame(self, RegisterPanel)
484-            self.regiser_frame.CenterOnScreen()
485-            self.SetTopWindow(self.regiser_frame)
486-            self.SetExitOnFrameDelete(True)
487-            self.regiser_frame.Show(True)
488-        except:
489-            DisplayTraceback('config wizard threw an exception')
490-
491-class WizardFrame(wx.Frame):
492-    def __init__(self, app, panel_class):
493-        #title = 'Allmydata Config Wizard'
494-        title = 'Setup - Allmydata'
495-        wx.Frame.__init__(self, None, -1, title)
496-        self.app = app
497-        self.SetIcon(amdlogo.getIcon())
498-        self.Bind(wx.EVT_CLOSE, self.close)
499-
500-        self.SetSizeHints(500, 360, 600, 800)
501-
502-        banner = wx.Panel(self, -1)
503-        banner.SetSize((496,58))
504-        banner.SetBackgroundColour(wx.WHITE)
505-
506-        banner_title = wx.StaticText(banner, -1, panel_class.title)
507-        banner_desc = wx.StaticText(banner, -1, "        " + panel_class.description)
508-        font = banner_title.GetFont()
509-        font.SetWeight(wx.FONTWEIGHT_BOLD)
510-        banner_title.SetFont(font)
511-        banner_icon = wx.StaticBitmap(banner, -1, amdlogo.getBitmap())
512-        banner_label_sizer = wx.BoxSizer(wx.VERTICAL)
513-        banner_label_sizer.Add(banner_title, 0, wx.EXPAND | wx.ALL, 2)
514-        banner_label_sizer.Add(banner_desc, 0, wx.EXPAND | wx.ALL, 2)
515-
516-        banner_sizer = wx.BoxSizer(wx.HORIZONTAL)
517-        banner_sizer.Add(banner_label_sizer, 1, wx.EXPAND | wx.ALL, 12)
518-        banner_sizer.Add(banner_icon, 0, wx.ALL, 12)
519-        banner.SetSizer(banner_sizer)
520-        banner.SetAutoLayout(True)
521-
522-        background = wx.Panel(self, -1, style=wx.SIMPLE_BORDER)
523-        background.parent = self
524-
525-        button_panel = wx.Panel(self, -1)
526-        button_panel.SetSize((496, 64))
527-
528-        self.panel = panel_class(background, button_panel, app)
529-        sizer = wx.BoxSizer(wx.VERTICAL)
530-        background_sizer = wx.BoxSizer(wx.VERTICAL)
531-        background_sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, self.panel.padding)
532-        background_sizer.Add(self.panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
533-        background_sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, self.panel.padding)
534-        background.SetSizer(background_sizer)
535-
536-
537-        sizer.Add(banner, 0, wx.EXPAND | wx.HORIZONTAL, 0)
538-        sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
539-        sizer.Add(button_panel, 0, wx.EXPAND | wx.HORIZONTAL, 0)
540-        self.SetSizer(sizer)
541-        self.SetAutoLayout(True)
542-        self.Fit()
543-        self.Layout()
544-
545-    def close(self, event):
546-        self.Show(False)
547-        self.app.ExitMainLoop()
548-
549-
550-class LoginPanel(wx.Panel):
551-    padding = 26
552-    title = 'Sign in'
553-    description = 'Sign in to your existing account'
554-
555-    def __init__(self, parent, button_panel, app):
556-        wx.Panel.__init__(self, parent, -1)
557-        self.parent = parent
558-        self.app = app
559-
560-        self.sizer = wx.BoxSizer(wx.VERTICAL)
561-
562-        self.user_label = wx.StaticText(self, -1, 'Email')
563-        self.pass_label = wx.StaticText(self, -1, 'Password')
564-        self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1))
565-        self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
566-        self.warning_label = wx.StaticText(self, -1, '')
567-        self.warning_label.SetOwnForegroundColour(wx.RED)
568-        wx.EVT_CHAR(self.user_field, self.on_user_entry)
569-        wx.EVT_CHAR(self.pass_field, self.on_pass_entry)
570-        login_sizer = wx.FlexGridSizer(2, 2, 5, 4)
571-        login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
572-        login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2)
573-        login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
574-        login_sizer.Add(self.pass_field, 0, wx.EXPAND | wx.ALL, 2)
575-        self.sizer.Add(login_sizer, 1, wx.EXPAND | wx.ALL, 2)
576-        self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2)
577-        self.SetSizer(self.sizer)
578-        self.SetAutoLayout(True)
579-
580-        self.reg_label = wx.StaticText(button_panel, -1, "Don't have an account?")
581-        self.reg_button = wx.Button(button_panel, -1, 'Create Account')
582-        self.login_button = wx.Button(button_panel, -1, 'Sign In')
583-        button_panel.Bind(wx.EVT_BUTTON, self.on_reg_button, self.reg_button)
584-        button_panel.Bind(wx.EVT_BUTTON, self.on_login, self.login_button)
585-        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
586-        btn_sizer.Add(wx.Size(2,2), 1, wx.EXPAND | wx.ALL, 12)
587-        btn_sizer.Add(self.reg_label, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
588-        btn_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
589-        btn_sizer.Add(self.login_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
590-        button_panel.SetSizer(btn_sizer)
591-        self.button_panel = button_panel
592-
593-    def on_reg_button(self, event):
594-        self.app.swap_to_register_frame()
595-
596-    def on_user_entry(self, event):
597-        if event.GetKeyCode() == wx.WXK_RETURN:
598-            self.pass_field.SetFocus()
599-        else:
600-            event.Skip()
601-
602-    def on_pass_entry(self, event):
603-        if event.GetKeyCode() == wx.WXK_RETURN:
604-            self.on_login(event)
605-        else:
606-            event.Skip()
607-
608-    def on_login(self, event):
609-        user = self.user_field.GetValue()
610-        passwd = self.pass_field.GetValue()
611-        self.warning_label.SetLabel('Connecting...')
612-        self.Layout()
613-        wx.Yield()
614-
615-        backend = self.app.get_backend()
616-
617-        if passwd == '':
618-            self.warning_label.SetLabel('You must enter a password')
619-            self.pass_field.SetFocus()
620-            self.Layout()
621-            return
622-
623-        try:
624-            root_cap = get_root_cap(backend, user, passwd)
625-            write_root_cap(root_cap)
626-        except AuthError:
627-            self.warning_label.SetLabel('Your email and/or password is incorrect')
628-            self.user_field.SetFocus()
629-            self.Layout()
630-            return
631-
632-        nodeid = get_nodeid()
633-        nickname = get_nickname()
634-        ret = record_install(backend, user, passwd, nodeid, nickname)
635-        if ret != 'ok':
636-            wx.MessageBox('Error "%s" recording this system (%s)' % (ret, nodeid), 'Error')
637-
638-        configure(backend, user, passwd)
639-        maybe_start_services()
640-        maybe_write_file('nickname', nickname)
641-        maybe_write_file('accountname', user)
642-
643-        self.app.open_welcome_page()
644-
645-        # exit
646-        self.parent.parent.Close()
647-
648-class RegisterPanel(wx.Panel):
649-    padding = 7
650-    title = 'Create account'
651-    description = 'Create a new account on Allmydata'
652-
653-    def __init__(self, parent, button_panel, app):
654-        wx.Panel.__init__(self, parent, -1)
655-        self.parent = parent
656-        self.app = app
657-
658-        self.sizer = wx.BoxSizer(wx.VERTICAL)
659-
660-        self.user_label = wx.StaticText(self, -1, 'Email')
661-        self.pass_label = wx.StaticText(self, -1, 'Password')
662-        self.conf_label = wx.StaticText(self, -1, 'Confirm Password')
663-        self.user_field = wx.TextCtrl(self, -1, u'', size=(260,-1))
664-        self.pass_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
665-        self.conf_field = wx.TextCtrl(self, -1, u'', size=(260,-1), style=wx.TE_PASSWORD)
666-        self.subscribe_box = wx.CheckBox(self, -1, 'Sign up for our Newsletter')
667-        self.subscribe_box.SetValue(True)
668-        self.warning_label = wx.StaticText(self, -1, '')
669-        self.warning_label.SetOwnForegroundColour(wx.RED)
670-        wx.EVT_CHAR(self.user_field, self.on_user_entry)
671-        wx.EVT_CHAR(self.pass_field, self.on_pass_entry)
672-        wx.EVT_CHAR(self.conf_field, self.on_conf_entry)
673-        login_sizer = wx.FlexGridSizer(3, 2, 5, 4)
674-        login_sizer.Add(self.user_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
675-        login_sizer.Add(self.user_field, 0, wx.EXPAND | wx.ALL, 2)
676-        login_sizer.Add(self.pass_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
677-        login_sizer.Add(self.pass_field, 0, wx.EXPAND | wx.ALL, 2)
678-        login_sizer.Add(self.conf_label, 0, wx.ALIGN_RIGHT | wx.ALL, 2)
679-        login_sizer.Add(self.conf_field, 0, wx.EXPAND | wx.ALL, 2)
680-        login_sizer.Add(wx.Size(2,2), 0, wx.ALIGN_RIGHT | wx.ALL, 2)
681-        self.sizer.Add(login_sizer, 0, wx.EXPAND | wx.ALL, 2)
682-        self.sizer.Add(self.warning_label, 0, wx.CENTER | wx.ALL, 2)
683-        self.sizer.Add(wx.Size(2,2), 0, wx.EXPAND | wx.ALL, 4)
684-        self.sizer.Add(self.subscribe_box, 0, wx.CENTER | wx.ALL, 2)
685-        self.SetSizer(self.sizer)
686-        self.SetAutoLayout(True)
687-
688-        self.reg_button = wx.Button(button_panel, -1, 'Create Account')
689-        button_panel.Bind(wx.EVT_BUTTON, self.on_create_account, self.reg_button)
690-        btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
691-        btn_sizer.Add(wx.Size(2,2), 1, wx.EXPAND | wx.ALL, 12)
692-        btn_sizer.Add(self.reg_button, 0, wx.ALIGN_RIGHT | wx.ALL, 12)
693-        button_panel.SetSizer(btn_sizer)
694-        self.button_panel = button_panel
695-
696-        self.Fit()
697-
698-    def on_user_entry(self, event):
699-        if event.GetKeyCode() == wx.WXK_RETURN:
700-            self.pass_field.SetFocus()
701-        else:
702-            event.Skip()
703-
704-    def on_pass_entry(self, event):
705-        if event.GetKeyCode() == wx.WXK_RETURN:
706-            self.conf_field.SetFocus()
707-        else:
708-            event.Skip()
709-
710-    def on_conf_entry(self, event):
711-        if event.GetKeyCode() == wx.WXK_RETURN:
712-            self.on_create_account(event)
713-        else:
714-            event.Skip()
715-
716-    def on_create_account(self, event):
717-        user = self.user_field.GetValue()
718-        passwd = self.pass_field.GetValue()
719-        pconf = self.conf_field.GetValue()
720-        subscribe = self.subscribe_box.IsChecked()
721-        self.warning_label.SetLabel('Connecting...')
722-        self.Layout()
723-        wx.Yield()
724-
725-        if passwd == '':
726-            self.warning_label.SetLabel('You must enter a password')
727-            self.pass_field.SetFocus()
728-            self.Layout()
729-            return
730-
731-        if passwd != pconf:
732-            self.warning_label.SetLabel("Passwords don't match")
733-            self.pass_field.SetValue('')
734-            self.conf_field.SetValue('')
735-            self.pass_field.SetFocus()
736-            self.Layout()
737-            return
738-
739-        backend = self.app.get_backend()
740-
741-        #print 'calling create_account', time.asctime()
742-        result_code = create_account(backend, user, passwd, subscribe)
743-
744-        if result_code == 'account_exists':
745-            # try and log into it; if valid, use it anyway
746-            try:
747-                #print 'calling get_root_cap (ae)', time.asctime()
748-                root_cap = get_root_cap(backend, user, passwd)
749-                write_root_cap(root_cap)
750-            except AuthError:
751-                self.warning_label.SetLabel('That email address is already registered')
752-                self.user_field.SetFocus()
753-                self.Layout()
754-                return
755-        elif result_code == 'error':
756-            self.warning_label.SetLabel('an error occurred')
757-            self.user_field.SetFocus()
758-            self.Layout()
759-            return
760-        elif result_code == 'ok':
761-            #print 'calling get_root_cap (ok)', time.asctime()
762-            root_cap = get_root_cap(backend, user, passwd)
763-            write_root_cap(root_cap)
764-        else:
765-            self.warning_label.SetLabel('an unexpected error occurred ("%s")' % (result_code,))
766-            self.user_field.SetFocus()
767-            self.Layout()
768-            return
769-
770-        nodeid = get_nodeid()
771-        nickname = get_nickname()
772-        ret = record_install(backend, user, passwd, nodeid, nickname)
773-        if ret != 'ok':
774-            wx.MessageBox('Error "%s" recording this system (%s)' % (ret, nodeid), 'Error')
775-
776-        configure(backend, user, passwd)
777-        maybe_start_services()
778-        maybe_write_file('nickname', nickname)
779-        maybe_write_file('accountname', user)
780-
781-        self.app.open_welcome_page()
782-
783-        # exit
784-        self.parent.parent.Close()
785-
786-def do_uninstall(server_url):
787-    nodeid = get_nodeid()
788-    ret = record_uninstall(server_url + BACKEND, nodeid)
789-    print ret
790-    if ret != 'ok':
791-        print 'Error "%s" recording uninstall of this system (%s)' % (ret, nodeid)
792-
793-class Options(usage.Options):
794-    synopsis = "Usage:  confwiz [options]"
795-
796-    optFlags = [
797-        ['uninstall', 'u', 'record uninstall'],
798-        ]
799-    optParameters = [
800-        ['server', 's', DEFAULT_SERVER_URL, 'url of server to contact'],
801-        ]
802-
803-def main(argv):
804-    config = Options()
805-    try:
806-        config.parseOptions(argv[1:])
807-    except usage.error, e:
808-        print config
809-        print "%s:  %s" % (sys.argv[0], e)
810-        sys.exit(-1)
811-
812-    server = config['server']
813-    if not server.endswith('/'):
814-        server += '/'
815-
816-    if config['uninstall']:
817-        do_uninstall(server)
818-    else:
819-        app = ConfWizApp(server)
820-        app.MainLoop()
821-
822-
823-if __name__ == '__main__':
824-    main(sys.argv)
825rmfile ./src/allmydata/gui/confwiz.py
826hunk ./src/allmydata/gui/macapp.py 1
827-
828-import operator
829-import os
830-import stat
831-from subprocess import Popen, PIPE
832-import sys
833-import thread
834-import threading
835-import traceback
836-import urllib
837-import webbrowser
838-
839-import wx
840-from twisted.internet import reactor
841-from twisted.python import log, logfile
842-
843-import allmydata
844-from allmydata import client
845-from allmydata.gui.confwiz import ConfWizApp, ACCOUNT_PAGE, DEFAULT_SERVER_URL
846-from allmydata.scripts.common import get_aliases
847-from allmydata.gui import amdicon, amdlogo
848-
849-DEFAULT_FUSE_TIMEOUT = 300
850-
851-TRY_TO_INSTALL_TAHOE_SCRIPT = True
852-TAHOE_SCRIPT = '''#!/bin/bash
853-if [ "x${*}x" == "xx" ]
854-then
855-    %(exe)s --help
856-else
857-    %(exe)s "${@}"
858-fi
859-'''
860-
861-def run_macapp():
862-    nodedir = os.path.expanduser('~/.tahoe')
863-    if not os.path.isdir(nodedir):
864-        app_supp = os.path.expanduser('~/Library/Application Support/Allmydata Tahoe/')
865-        if not os.path.isdir(app_supp):
866-            os.makedirs(app_supp)
867-        os.symlink(app_supp, nodedir)
868-
869-    app_cont = AppContainer(nodedir)
870-    return app_cont.run()
871-
872-class MacGuiClient(client.Client):
873-    """
874-    This is a subclass of the tahoe 'client' node, which hooks into the
875-    client's 'notice something went wrong' mechanism, to display the fact
876-    in a manner sensible for a wx gui app
877-    """
878-    def __init__(self, nodedir, app_cont):
879-        self.app_cont = app_cont
880-        client.Client.__init__(self, nodedir)
881-
882-    def _service_startup_failed(self, failure):
883-        wx.CallAfter(self.wx_abort, failure)
884-        log.msg('node service startup failed')
885-        log.err(failure)
886-
887-    def wx_abort(self, failure):
888-        wx.MessageBox(failure.getTraceback(), 'Fatal Error in Node startup')
889-        self.app_cont.guiapp.ExitMainLoop()
890-
891-class AppContainer(object):
892-    """
893-    This is the 'container' for the mac app, which takes care of initial
894-    configuration concerns - e.g. running the confwiz before going any further -
895-    of launching the reactor, and within it the tahoe node, on a separate thread,
896-    and then lastly of launching the actual wx gui app and waiting for it to exit.
897-    """
898-    def __init__(self, nodedir):
899-        self.nodedir = nodedir
900-
901-    def files_exist(self, file_list):
902-        extant_conf = [ os.path.exists(os.path.join(self.nodedir, f)) for f in file_list ]
903-        return reduce(operator.__and__, extant_conf)
904-
905-    def is_config_incomplete(self):
906-        necessary_conf_files = ['introducer.furl', 'private/root_dir.cap']
907-        need_config = not self.files_exist(necessary_conf_files)
908-        if need_config:
909-            print 'some config is missing from nodedir (%s): %s' % (self.nodedir, necessary_conf_files)
910-        return need_config
911-
912-    def run(self):
913-        # handle initial config
914-        if not os.path.exists(os.path.join(self.nodedir, 'webport')):
915-            f = file(os.path.join(self.nodedir, 'webport'), 'wb')
916-            f.write('3456')
917-            f.close()
918-
919-        if self.is_config_incomplete():
920-            confwiz = ConfWizApp(DEFAULT_SERVER_URL, open_welcome_page=True)
921-            confwiz.MainLoop()
922-
923-        if self.is_config_incomplete():
924-            print 'config still incomplete; confwiz cancelled, exiting'
925-            return 1
926-
927-        # set up twisted logging. this will become part of the node rsn.
928-        logdir = os.path.join(self.nodedir, 'logs')
929-        if not os.path.exists(logdir):
930-            os.makedirs(logdir)
931-        lf = logfile.LogFile('tahoesvc.log', logdir)
932-        log.startLogging(lf)
933-
934-        if TRY_TO_INSTALL_TAHOE_SCRIPT:
935-            self.maybe_install_tahoe_script()
936-
937-        # actually start up the node and the ui
938-        os.chdir(self.nodedir)
939-
940-        # start the reactor thread up, launch the tahoe node therein
941-        self.start_reactor()
942-
943-        try:
944-            # launch the actual gui on the wx event loop, wait for it to quit
945-            self.guiapp = MacGuiApp(app_cont=self)
946-            self.guiapp.MainLoop()
947-            log.msg('gui mainloop exited')
948-        except:
949-            log.err()
950-
951-        # shutdown the reactor, hence tahoe node, before exiting
952-        self.stop_reactor()
953-
954-        return 0
955-
956-    def start_reactor(self):
957-        self.reactor_shutdown = threading.Event()
958-        thread.start_new_thread(self.launch_reactor, ())
959-
960-    def launch_reactor(self):
961-        # run the node itself
962-        #c = client.Client(self.nodedir)
963-        c = MacGuiClient(self.nodedir, app_cont=self)
964-        reactor.callLater(0, c.startService) # after reactor startup
965-        reactor.run(installSignalHandlers=False)
966-        self.reactor_shutdown.set()
967-
968-    def stop_reactor(self):
969-        # trigger reactor shutdown, and block waiting on it
970-        reactor.callFromThread(reactor.stop)
971-        log.msg('waiting for reactor shutdown')
972-        self.reactor_shutdown.wait()
973-        log.msg('reactor shut down')
974-
975-    def maybe_install_tahoe_script(self):
976-        path_candidates = ['/usr/local/bin', '~/bin', '~/Library/bin']
977-        env_path = map(os.path.expanduser, os.environ['PATH'].split(':'))
978-        if not sys.executable.endswith('/python'):
979-            print 'not installing tahoe script: unexpected sys.exe "%s"' % (sys.executable,)
980-            return
981-        for path_candidate in map(os.path.expanduser, env_path):
982-            tahoe_path = path_candidate + '/tahoe'
983-            if os.path.exists(tahoe_path):
984-                print 'not installing "tahoe": it already exists at "%s"' % (tahoe_path,)
985-                return
986-        for path_candidate in map(os.path.expanduser, path_candidates):
987-            if path_candidate not in env_path:
988-                print path_candidate, 'not in', env_path
989-                continue
990-            tahoe_path = path_candidate + '/tahoe'
991-            try:
992-                print 'trying to install "%s"' % (tahoe_path,)
993-                bin_path = (sys.executable[:-6] + 'Allmydata')
994-                script = TAHOE_SCRIPT % { 'exe': bin_path }
995-                f = file(tahoe_path, 'wb')
996-                f.write(script)
997-                f.close()
998-                mode = stat.S_IRUSR|stat.S_IXUSR|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH
999-                os.chmod(tahoe_path, mode)
1000-                print 'installed "%s"' % (tahoe_path,)
1001-                return
1002-            except:
1003-                print 'unable to write %s' % (tahoe_path,)
1004-                traceback.print_exc()
1005-        else:
1006-            print 'no remaining candidate paths for installation of tahoe script'
1007-
1008-
1009-def DisplayTraceback(message):
1010-    xc = traceback.format_exception(*sys.exc_info())
1011-    wx.MessageBox(u"%s\n (%s)"%(message,''.join(xc)), 'Error')
1012-
1013-WEBOPEN_ID = wx.NewId()
1014-ACCOUNT_PAGE_ID = wx.NewId()
1015-MOUNT_ID = wx.NewId()
1016-
1017-class SplashFrame(wx.Frame):
1018-    def __init__(self):
1019-        no_resz = wx.DEFAULT_FRAME_STYLE & ~ (wx.MINIMIZE_BOX|wx.RESIZE_BORDER|wx.MAXIMIZE_BOX)
1020-        wx.Frame.__init__(self, None, -1, 'Allmydata', style=no_resz)
1021-
1022-        self.SetSizeHints(100, 100, 600, 800)
1023-        self.SetIcon(amdicon.getIcon())
1024-        self.Bind(wx.EVT_CLOSE, self.on_close)
1025-
1026-        background = wx.Panel(self, -1)
1027-        background.parent = self
1028-        self.login_panel = SplashPanel(background, self.on_close)
1029-        sizer = wx.BoxSizer(wx.VERTICAL)
1030-        background_sizer = wx.BoxSizer(wx.VERTICAL)
1031-        background_sizer.Add(self.login_panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
1032-        background.SetSizer(background_sizer)
1033-        sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
1034-        self.SetSizer(sizer)
1035-        self.SetAutoLayout(True)
1036-        self.Fit()
1037-        self.Layout()
1038-
1039-    def on_close(self, event):
1040-        self.Show(False)
1041-
1042-class SplashPanel(wx.Panel):
1043-    def __init__(self, parent, on_close):
1044-        wx.Panel.__init__(self, parent, -1)
1045-        self.parent = parent
1046-
1047-        hbox = wx.BoxSizer(wx.HORIZONTAL)
1048-        vbox = wx.BoxSizer(wx.VERTICAL)
1049-        self.sizer = wx.BoxSizer(wx.VERTICAL)
1050-
1051-        self.icon = wx.StaticBitmap(self, -1, amdlogo.getBitmap())
1052-        self.label = wx.StaticText(self, -1, 'Allmydata')
1053-        bigfont = self.label.GetFont()
1054-        bigfont.SetPointSize(26)
1055-        smlfont = self.label.GetFont()
1056-        smlfont.SetPointSize(10)
1057-        self.label.SetFont(bigfont)
1058-        ver = "Version 3.0 (%s)" % (allmydata.__version__,)
1059-        self.ver_label = wx.StaticText(self, -1, ver)
1060-        self.ver_label.SetFont(smlfont)
1061-        copy = u"Copyright \N{COPYRIGHT SIGN} 2004-2008 Allmydata Inc.,"
1062-        self.copy_label = wx.StaticText(self, -1, copy)
1063-        self.copy_label.SetFont(smlfont)
1064-        self.res_label = wx.StaticText(self, -1, "All Rights Reserved.")
1065-        self.res_label.SetFont(smlfont)
1066-        ##self.ok = wx.Button(self, -1, 'Ok')
1067-        ##self.Bind(wx.EVT_BUTTON, on_close, self.ok)
1068-        hbox.Add(self.icon, 0, wx.CENTER | wx.ALL, 2)
1069-        vbox.Add(self.label, 0, wx.CENTER | wx.ALL, 2)
1070-        vbox.Add(self.ver_label, 0, wx.CENTER | wx.ALL, 2)
1071-        hbox.Add(vbox)
1072-        self.sizer.Add(hbox)
1073-        self.sizer.Add(wx.Size(8,8), 1, wx.EXPAND | wx.ALL, 2)
1074-        self.sizer.Add(self.copy_label, 0, wx.CENTER | wx.ALL, 2)
1075-        self.sizer.Add(self.res_label, 0, wx.CENTER | wx.ALL, 2)
1076-        #self.sizer.Add(wx.Size(42,42), 1, wx.EXPAND | wx.ALL, 2)
1077-        ##self.sizer.Add(self.ok, 0, wx.CENTER | wx.ALL, 2)
1078-        self.SetSizer(self.sizer)
1079-        self.SetAutoLayout(True)
1080-
1081-
1082-class MountFrame(wx.Frame):
1083-    def __init__(self, guiapp):
1084-        wx.Frame.__init__(self, None, -1, 'Allmydata Mount Filesystem')
1085-
1086-        self.SetSizeHints(100, 100, 600, 800)
1087-        self.SetIcon(amdicon.getIcon())
1088-        self.Bind(wx.EVT_CLOSE, self.on_close)
1089-
1090-        background = wx.Panel(self, -1)
1091-        background.parent = self
1092-        self.mount_panel = MountPanel(background, self.on_close, guiapp)
1093-        sizer = wx.BoxSizer(wx.VERTICAL)
1094-        background_sizer = wx.BoxSizer(wx.VERTICAL)
1095-        background_sizer.Add(self.mount_panel, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 26)
1096-        background.SetSizer(background_sizer)
1097-        sizer.Add(background, 0, wx.EXPAND | wx.ALL, 0)
1098-        self.SetSizer(sizer)
1099-        self.SetAutoLayout(True)
1100-        self.Fit()
1101-        self.Layout()
1102-
1103-    def on_close(self, event):
1104-        self.Show(False)
1105-
1106-class MountPanel(wx.Panel):
1107-    def __init__(self, parent, on_close, guiapp):
1108-        wx.Panel.__init__(self, parent, -1)
1109-        self.parent = parent
1110-        self.guiapp = guiapp
1111-
1112-        self.sizer = wx.BoxSizer(wx.VERTICAL)
1113-
1114-        self.label = wx.StaticText(self, -1, 'Allmydata Mount Filesystem')
1115-        self.mnt_label = wx.StaticText(self, -1, 'Mount')
1116-        self.alias_choice = wx.Choice(self, -1, (120, 64), choices=self.guiapp.aliases.keys())
1117-        root_dir = self.alias_choice.FindString('tahoe')
1118-        if root_dir != -1:
1119-            self.alias_choice.SetSelection(root_dir)
1120-        self.at_label = wx.StaticText(self, -1, 'at')
1121-        self.mountpoint = wx.TextCtrl(self, -1, 'choose a mount dir', size=(256,22))
1122-        self.mnt_browse = wx.Button(self, -1, 'Browse')
1123-        mount_sizer = wx.BoxSizer(wx.HORIZONTAL)
1124-        mount_sizer.Add(self.mnt_label, 0, wx.ALL, 4)
1125-        mount_sizer.Add(self.alias_choice, 0, wx.ALL, 4)
1126-        mount_sizer.Add(self.at_label, 0, wx.ALL, 4)
1127-        mount_sizer.Add(self.mountpoint, 0, wx.ALL, 4)
1128-        mount_sizer.Add(self.mnt_browse, 0, wx.ALL, 4)
1129-        self.mount = wx.Button(self, -1, 'Mount')
1130-        self.Bind(wx.EVT_BUTTON, self.on_mount, self.mount)
1131-        #self.Bind(wx.EVT_CHOICE, self.on_choice, self.alias_choice)
1132-        self.Bind(wx.EVT_BUTTON, self.on_mnt_browse, self.mnt_browse)
1133-        self.sizer.Add(self.label, 0, wx.CENTER | wx.ALL, 2)
1134-        self.sizer.Add(wx.Size(28,28), 1, wx.EXPAND | wx.ALL, 2)
1135-        self.sizer.Add(mount_sizer, 0, wx.EXPAND | wx.ALL, 0)
1136-        self.sizer.Add(wx.Size(28,28), 1, wx.EXPAND | wx.ALL, 2)
1137-        self.sizer.Add(self.mount, 0, wx.CENTER | wx.ALL, 2)
1138-        self.SetSizer(self.sizer)
1139-        self.SetAutoLayout(True)
1140-
1141-    def on_mount(self, event):
1142-        mountpoint = str(self.mountpoint.GetValue())
1143-        if not os.path.isdir(mountpoint):
1144-            wx.MessageBox(u'"%s" is not a directory' % (mountpoint,))
1145-        else:
1146-            alias_name = self.alias_choice.GetStringSelection()
1147-            self.do_mount(alias_name, mountpoint)
1148-
1149-    def on_mnt_browse(self, event):
1150-        dlg = wx.DirDialog(self, "Choose a Mountpoint Directory:",
1151-                           style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)
1152-        if dlg.ShowModal() == wx.ID_OK:
1153-            mountpoint = dlg.GetPath()
1154-            self.mountpoint.SetValue(mountpoint)
1155-        dlg.Destroy()
1156-
1157-    def do_mount(self, alias_name, mountpoint):
1158-        log.msg('do_mount(%r, %r)' % (alias_name, mountpoint))
1159-        self.guiapp.mount_filesystem(alias_name, mountpoint)
1160-        self.parent.parent.Show(False)
1161-
1162-class MacGuiApp(wx.App):
1163-    config = {
1164-        'auto-mount': True,
1165-        'auto-open': True,
1166-        'show-webopen': False,
1167-        'daemon-timeout': DEFAULT_FUSE_TIMEOUT,
1168-        }
1169-
1170-    def __init__(self, app_cont):
1171-        self.app_cont = app_cont
1172-        self.nodedir = app_cont.nodedir
1173-        self.load_config()
1174-        self.mounted_filesystems = {}
1175-        self.aliases = get_aliases(self.nodedir)
1176-        wx.App.__init__(self)
1177-
1178-    ## load up setting from gui.conf dir
1179-    def load_config(self):
1180-        log.msg('load_config')
1181-        confdir = os.path.join(self.nodedir, 'gui.conf')
1182-        config = {}
1183-        config.update(self.config)
1184-        for k in self.config:
1185-            f = os.path.join(confdir, k)
1186-            if os.path.exists(f):
1187-                val = file(f, 'rb').read().strip()
1188-                if type(self.config[k]) == bool:
1189-                    if val.lower() in ['y', 'yes', 'true', 'on', '1']:
1190-                        val = True
1191-                    else:
1192-                        val = False
1193-                elif type(self.config[k]) == int:
1194-                    val = int(val)
1195-                config[k] = val
1196-        self.config = config
1197-
1198-    ## GUI wx init
1199-    def OnInit(self):
1200-        log.msg('OnInit')
1201-        try:
1202-            self.frame = SplashFrame()
1203-            self.frame.CenterOnScreen()
1204-            self.frame.Show(True)
1205-            self.SetTopWindow(self.frame)
1206-
1207-            # self.load_config()
1208-
1209-            wx.FutureCall(4096, self.on_timer, None)
1210-
1211-            self.mount_frame = MountFrame(guiapp=self)
1212-
1213-            self.setup_dock_icon()
1214-            menubar = self.setup_app_menu(self.frame)
1215-            self.frame.SetMenuBar(menubar)
1216-
1217-            return True
1218-        except:
1219-            DisplayTraceback('exception on startup')
1220-            sys.exit()
1221-
1222-    ## WX menu and event handling
1223-
1224-    def on_timer(self, event):
1225-        self.frame.Show(False)
1226-        self.perhaps_automount()
1227-
1228-    def setup_dock_icon(self):
1229-        self.tbicon = wx.TaskBarIcon()
1230-        #self.tbicon.SetIcon(amdicon.getIcon(), "Allmydata")
1231-        wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.on_dock_menu)
1232-
1233-    def setup_app_menu(self, frame):
1234-        menubar = wx.MenuBar()
1235-        file_menu = wx.Menu()
1236-        if self.config['show-webopen']:
1237-            webopen_menu = wx.Menu()
1238-            self.webopen_menu_ids = {}
1239-            for alias in self.aliases:
1240-                mid = wx.NewId()
1241-                self.webopen_menu_ids[mid] = alias
1242-                item = webopen_menu.Append(mid, alias)
1243-                frame.Bind(wx.EVT_MENU, self.on_webopen, item)
1244-            file_menu.AppendMenu(WEBOPEN_ID, 'Open Web UI', webopen_menu)
1245-        item = file_menu.Append(ACCOUNT_PAGE_ID, text='Open Account Page')
1246-        frame.Bind(wx.EVT_MENU, self.on_account_page, item)
1247-        item = file_menu.Append(MOUNT_ID, text='Mount Filesystem')
1248-        frame.Bind(wx.EVT_MENU, self.on_mount, item)
1249-        item = file_menu.Append(wx.ID_ABOUT, text='About')
1250-        frame.Bind(wx.EVT_MENU, self.on_about, item)
1251-        item = file_menu.Append(wx.ID_EXIT, text='Quit')
1252-        frame.Bind(wx.EVT_MENU, self.on_quit, item)
1253-        menubar.Append(file_menu, 'File')
1254-        return menubar
1255-
1256-    def on_dock_menu(self, event):
1257-        dock_menu = wx.Menu()
1258-        item = dock_menu.Append(wx.NewId(), text='About')
1259-        self.tbicon.Bind(wx.EVT_MENU, self.on_about, item)
1260-        if self.config['show-webopen']:
1261-            item = dock_menu.Append(WEBOPEN_ID, text='Open Web Root')
1262-            self.tbicon.Bind(wx.EVT_MENU, self.on_webopen, item)
1263-        item = dock_menu.Append(ACCOUNT_PAGE_ID, text='Open Account Page')
1264-        self.tbicon.Bind(wx.EVT_MENU, self.on_account_page, item)
1265-        item = dock_menu.Append(MOUNT_ID, text='Mount Filesystem')
1266-        self.tbicon.Bind(wx.EVT_MENU, self.on_mount, item)
1267-        self.tbicon.PopupMenu(dock_menu)
1268-
1269-    def on_about(self, event):
1270-        self.frame.Show(True)
1271-
1272-    def on_quit(self, event):
1273-        self.unmount_filesystems()
1274-        self.ExitMainLoop()
1275-
1276-    def on_webopen(self, event):
1277-        alias = self.webopen_menu_ids.get(event.GetId())
1278-        #log.msg('on_webopen() alias=%r' % (alias,))
1279-        self.webopen(alias)
1280-
1281-    def on_account_page(self, event):
1282-        webbrowser.open(DEFAULT_SERVER_URL + ACCOUNT_PAGE)
1283-
1284-    def on_mount(self, event):
1285-        self.mount_frame.Show(True)
1286-
1287-    ## Gui App methods
1288-
1289-    def perhaps_automount(self):
1290-        if self.config['auto-mount']:
1291-            mountpoint = os.path.join(self.nodedir, 'mnt/__auto__')
1292-            if not os.path.isdir(mountpoint):
1293-                os.makedirs(mountpoint)
1294-            self.mount_filesystem('tahoe', mountpoint, 'Allmydata')
1295-
1296-    def webopen(self, alias=None):
1297-        log.msg('webopen: %r' % (alias,))
1298-        if alias is None:
1299-            alias = 'tahoe'
1300-        root_uri = self.aliases.get(alias)
1301-        if root_uri:
1302-            nodeurl = file(os.path.join(self.nodedir, 'node.url'), 'rb').read().strip()
1303-            if nodeurl[-1] != "/":
1304-                nodeurl += "/"
1305-            url = nodeurl + "uri/%s/" % urllib.quote(root_uri)
1306-            webbrowser.open(url)
1307-
1308-    def mount_filesystem(self, alias_name, mountpoint, display_name=None):
1309-        log.msg('mount_filesystem(%r,%r,%r)' % (alias_name, mountpoint, display_name))
1310-        log.msg('sys.exec = %r' % (sys.executable,))
1311-
1312-        # first determine if we can find the 'tahoe' binary (i.e. contents of .app)
1313-        if not sys.executable.endswith('Allmydata.app/Contents/MacOS/python'):
1314-            log.msg("can't find allmydata.app: sys.executable = %r" % (sys.executable,))
1315-            wx.MessageBox("Can't determine location of Allmydata.app")
1316-            return False
1317-        bin_path = sys.executable[:-6] + 'Allmydata'
1318-        log.msg('%r exists: %r' % (bin_path, os.path.exists(bin_path),))
1319-
1320-        # check mountpoint exists
1321-        if not os.path.exists(mountpoint):
1322-            log.msg('mountpoint %r does not exist' % (mountpoint,))
1323-            return False
1324-
1325-        # figure out options for fuse_main
1326-        foptions = []
1327-        foptions.append('-olocal') # required to display in Finder on leopard
1328-        #foptions.append('-ofstypename=allmydata') # shown in 'get info'
1329-        if display_name is None:
1330-            display_name = alias_name
1331-        foptions.append('-ovolname=%s' % (display_name,))
1332-        timeout = self.config['daemon-timeout']
1333-        foptions.append('-odaemon_timeout=%d' % (timeout,))
1334-        icns_path = os.path.join(self.nodedir, 'private/icons', alias_name+'.icns')
1335-        log.msg('icns_path %r exists: %s' % (icns_path, os.path.exists(icns_path)))
1336-        if not os.path.exists(icns_path):
1337-            icns_path = os.path.normpath(os.path.join(os.path.dirname(sys.executable),
1338-                                                      '../Resources/allmydata.icns'))
1339-            log.msg('set icns_path=%s' % (icns_path,))
1340-        if os.path.exists(icns_path):
1341-            foptions.append('-ovolicon=%s' % (icns_path,))
1342-
1343-
1344-        # actually launch tahoe fuse
1345-        command = [bin_path, 'fuse', '--alias', alias_name] + foptions + [mountpoint]
1346-        #log.msg('spawning command %r' % (command,))
1347-        #proc = Popen(command, cwd=self.nodedir, stdout=PIPE, stderr=PIPE)
1348-        #log.msg('spawned process, pid %s' % (proc.pid,))
1349-        self.async_run_cmd(command)
1350-
1351-        # log the outcome, record the fact that we mounted this fs
1352-        #wx.FutureCall(4096, self.check_proc, proc, 'fuse')
1353-        self.mounted_filesystems[display_name] = mountpoint
1354-
1355-        # open finder, if configured to do so
1356-        if self.config['auto-open']:
1357-            wx.FutureCall(4096, self.sync_run_cmd, ['/usr/bin/open', mountpoint])
1358-        return True
1359-
1360-    def unmount_filesystems(self):
1361-        # the user may've already unmounted some, but we should ensure that
1362-        # anything the gui mounted gets shut down, since they all depend on
1363-        # the tahoe node, which is going away
1364-        for name, mountpoint in self.mounted_filesystems.items():
1365-            log.msg('unmounting %r (%s)' % (name, mountpoint))
1366-            self.sync_run_cmd(['/sbin/umount', mountpoint])
1367-
1368-    def sync_run_cmd(self, argv):
1369-        log.msg('synchronously running command: %r' % (argv,))
1370-        proc = Popen(argv, cwd=self.nodedir, stdout=PIPE, stderr=PIPE)
1371-        proc.wait()
1372-        self.check_proc(proc)
1373-
1374-    def async_run_cmd(self, argv):
1375-        log.msg('asynchronously running command: %r' % (argv,))
1376-        proc = Popen(argv, cwd=self.nodedir, stdout=PIPE, stderr=PIPE)
1377-        log.msg('spawned process, pid: %s' % (proc.pid,))
1378-        wx.FutureCall(4096, self.check_proc, proc, 'async fuse process:')
1379-
1380-    def check_proc(self, proc, description=None):
1381-        message = []
1382-        if description is not None:
1383-            message.append(description)
1384-        message.append('pid: %s  retcode: %s' % (proc.pid, proc.returncode,))
1385-        stdout = proc.stdout.read()
1386-        if stdout:
1387-            message.append('\nstdout:\n%s' % (stdout,))
1388-        stderr = proc.stderr.read()
1389-        if stderr:
1390-            message.append('\nstdout:\n%s' % (stderr,))
1391-        log.msg(' '.join(message))
1392-
1393rmfile ./src/allmydata/gui/macapp.py
1394rmdir ./src/allmydata/gui
1395hunk ./mac/COPYING.LGPL2 1
1396-mac/fuse.py and mac/fuseparts/subbedopts.py are also available (at your option) under LGPL2 as well as under GPL2+|TGPPL1+
1397-
1398-GNU Lesser General Public License
1399-
1400-Version 2.1, February 1999
1401-
1402-    Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
1403-
1404-    [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
1405-
1406-Preamble
1407-
1408-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
1409-
1410-This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
1411-
1412-When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
1413-
1414-To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
1415-
1416-For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
1417-
1418-We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
1419-
1420-To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
1421-
1422-Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
1423-
1424-Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
1425-
1426-When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
1427-
1428-We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
1429-
1430-For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
1431-
1432-In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
1433-
1434-Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
1435-
1436-The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
1437-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
1438-
1439-0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
1440-
1441-A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
1442-
1443-The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
1444-
1445-"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
1446-
1447-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1448-
1449-1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
1450-
1451-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
1452-
1453-2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
1454-
1455-    a) The modified work must itself be a software library.
1456-
1457-    b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
1458-
1459-    c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
1460-
1461-    d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
1462-
1463-    (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
1464-
1465-    These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
1466-
1467-    Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
1468-
1469-    In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
1470-
1471-3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
1472-
1473-Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
1474-
1475-This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
1476-
1477-4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
1478-
1479-If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
1480-
1481-5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
1482-
1483-However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
1484-
1485-When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
1486-
1487-If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
1488-
1489-Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
1490-
1491-6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
1492-
1493-You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
1494-
1495-    a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
1496-
1497-    b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
1498-
1499-    c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
1500-
1501-    d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
1502-
1503-    e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
1504-
1505-For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
1506-
1507-It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
1508-
1509-7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
1510-
1511-    a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
1512-
1513-    b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
1514-
1515-8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
1516-
1517-9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
1518-
1519-10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
1520-
1521-11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
1522-
1523-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
1524-
1525-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
1526-
1527-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
1528-
1529-12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
1530-
1531-13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
1532-
1533-Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
1534-
1535-14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
1536-
1537-NO WARRANTY
1538-
1539-15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
1540-
1541-16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
1542-END OF TERMS AND CONDITIONS
1543-How to Apply These Terms to Your New Libraries
1544-If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
1545-
1546-To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
1547-
1548-    <one line to give the library's name and an idea of what it does.> Copyright (C) <year> <name of author>
1549-
1550-    This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
1551-
1552-    This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
1553-
1554-    You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1555-
1556-Also add information on how to contact you by electronic and paper mail.
1557-
1558-You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
1559-
1560-    Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
1561-
1562-    signature of Ty Coon, 1 April 1990
1563-    Ty Coon, President of Vice
1564-
1565-That's all there is to it!
1566rmfile ./mac/COPYING.LGPL2
1567hunk ./mac/Makefile 1
1568-
1569-.PHONY: all dist build diskimage upload cleanup clean
1570-
1571-all: build
1572-
1573-dist: build diskimage upload cleanup
1574-
1575-build:
1576-       rsync -av ` sw_vers -productVersion | sed -e 's/^\(10\.[0-9]*\)\..*$$/\1/' `/ ./
1577-       ln -sf ../contrib/fuse/impl_c/blackmatch.py tahoefuse.py
1578-       python setup.py py2app --no-chdir
1579-
1580-diskimage:
1581-       mv dist Allmydata-$(VERSION)
1582-       hdiutil create -ov -srcfolder Allmydata-$(VERSION) allmydata-rw.dmg
1583-       hdiutil convert -ov allmydata-rw.dmg -format UDRO -o allmydata-ro.dmg
1584-       hdiutil convert -ov allmydata-ro.dmg -format UDZO -o Allmydata-$(VERSION).dmg
1585-       hdiutil internet-enable -yes Allmydata-$(VERSION).dmg
1586-       rm -r Allmydata-$(VERSION) allmydata-rw.dmg allmydata-ro.dmg
1587-
1588-ifdef UPLOAD_DEST_FURLFILE
1589-# N.B.: xfer-client.py requires foolscap, so we hack up PYTHONPATH to improve
1590-# the chances of finding it (using the one that we just built)
1591-# broken. To fix this just use flappclient. --Zooko 2010-06-06
1592-upload:
1593-       chmod a+r Allmydata-$(VERSION).dmg
1594-       PYTHONPATH=$(PYTHONPATH):../support/lib/python2.5/site-packages \
1595-        python ../misc/xfer-client.py --furlfile $(UPLOAD_DEST_FURLFILE) \
1596-        Allmydata-$(VERSION).dmg
1597-else
1598-upload:
1599-       $(error UPLOAD_DEST_FURLFILE must be set when using upload target. e.g. make upload UPLOAD_DEST_FURLFILE=~/.upload.furl)
1600-endif
1601-
1602-cleanup:
1603-       rm Allmydata-$(VERSION).dmg
1604-
1605-clean:
1606-       rm -rf build dist
1607rmfile ./mac/Makefile
1608hunk ./mac/README.txt 1
1609-2009-02-07:
1610-
1611-Zooko wrote this what is in this directory after asking RobK about it:
1612-
1613-wxpython trappings to build a .app bundle which is both a gui app and (when launching the binary from within the .app bundle) a functioning bin/tahoe binary including "tahoe fuse" subcommand
1614-
1615rmfile ./mac/README.txt
1616binary ./mac/allmydata.icns
1617oldhex
1618*69636e73000099af697433320000599f00000000fffffcfffc0000fffc0000ffb6000c0b284b62
1619*75777677756149280bb60000ffb20014022c6fa3cee1e5e7ebe9e8e9ece8e4e1cda0672a01b200
1620*00ffb0000a1665b8e2ece2d4cdcac8c780c60ac7c8cacdd5e3ebe2b26011b00000ffae00091776
1621*d3eddecec7c6c7c786c809c7c7c6c8cedfedd17716ae0000ffac00070363d4ecd7c8c6c78ec806
1622*c7c6c8d6edcd5dad0000ffab00052db1efd9c8c68ec80bc7c7c6c6c5c4c2c3d7eca925ab0000ff
1623*aa000459dee7cac689c880c703c6c6c5c580c400c380c205c1bec4e3d64baa0000ffa900047cee
1624*d9c6c786c802c7c7c680c500c480c301c2c280c100c080bf05bebcbbd2e771a90000ffa7000406
1625*91efd1c682c880c701c6c580c400c380c280c105c0c0bfbfbebe80bd07bcbbbbbab7c6ea7ea800
1626*00ffa7000994f2cdc6c8c7c6c6c5c580c400c380c207c1c1c0c0bfbfbebe80bd05bcbcbbbbbaba
1627*80b905b8b7b4c0e87da70000ffa600087defcbc4c5c4c4c3c381c209c1c1c0bfbfbebcbbbaba82
1628*b902babab980b801b7b780b605b5b4b2bee76da60000ffa500065aeeccc2c3c2c280c100c080bf
1629*10bebdbcbbbfc7d2dadededdd9cfc3bab5b580b605b5b5b4b4b3b380b203aebee34ba50000ffa4
1630*00062ddcd3bec1c1c080bf00be80bd14bcbabbc8dedfcfac907d747c92b0d2dddac1b2b1b380b2
1631*0ab1b1b0b0afafaeaac6d021a40000ffa3000306b6dfbd80be80bd0cbcbbbbbab9b7c8e2d28c45
1632*11028200070313478fd2ddbeae81af00ae80ad06acacaba9d4a202a30000ffa3000269e9be80bc
1633*0cbbbbbabab9b9b8b5badbd7771a8a00072181d7d3afaaacac80ab07aaaaa9a8a7acdd58a30000
1634*ffa200081bd3ccb8babab9b9b880b705b6b3bfe4a9278e00052eaddeb2a7a980a880a705a6a6a2
1635*bdc513a20000ffa2000181e481b780b607b5b5b4b1bee482049000080785dfb3a4a6a6a5a580a4
1636*04a3a2a2d76fa20000ffa100071ad4c4b4b5b5b4b480b304b2afbbe3679400067bdeada1a3a3a2
1637*80a105a0a09db4c411a10000ffa100076ce1b2b3b3b2b2b180b003aeb2e07a96000485daa39fa0
1638*809f069e9d9d9c9cd45da10000ffa0000305b9c9ae80b000af80ae04adaad6a50396000307abc9
1639*9b809d009c809b049a96bba702a00000ffa0000637dcb4adaeaead80ac04aba8bcd02298000527
1640*ceac989a9a8099059898969fcd28a00000ffa0000175d981ab80aa04a9a8a8db719a000578cf97
1641*979897809604959493cb66a00000ff9f000702a8c7a6a9a9a8a880a703a3b8c7149a00041bc8a6
1642*93958094059392928db696a00000ff9f000d12ccb4a5a7a6a6a5a5a4a3a1d17d9c000686c38f92
1643*9291918090038ca1bc0b9f0000ff9f000436d2a9a3a480a305a2a2a0a5d4389c00023fcc93808f
1644*078e8e8d8d8c92c7299f0000ff9f000255d2a380a180a0049f9cb0be099c000d10bf9e8b8d8c8c
1645*8b8b8a898cc3459f0000ff9f00056bd19e9f9f9e809d039c98be979d000401a0ac878a80890588
1646*888786c05e9f0000ff9f00047cc8999d9c809b049a9995c67c9e000485b5838787808604858481
1647*bd6b9f0000ff9f000389c4969a80990598989795cb6d9e00046fbb81858480830482827cb4749f
1648*0000ff9f000c87c3949897979696959592c96d9e00036abf8082808105807f7f7ab0829f0000ff
1649*9f000386c191958094059392928fc86d9e00026abd7d807f067e7e7d7d77ae819f0000ff9f000c
1650*85bf8e9292919190908f8cc66c9e000c69bb7b7d7d7c7c7b7b7a74ad809f0000ff9f000485be8b
1651*8f8f818e038d8ac46c9e000269b978807a007980780271ab7f9f0000ff9f000584bc888d8d8c80
1652*8b038a87c36c9e000569b875787777807603756ea87f9f0000ff9f000484b9868b8a8089048887
1653*84c16c9e000368b6737581740473736ca77f9f0000ff9f000384b8838880870586858582bf6b9e
1654*000468b4707372807104707069a67e9f0000ff9f000283b681808506848383827fbe6b9e000368
1655*b36d70806f056e6e6d67a47e9f0000ff9f000c83b47e838282818180807cbc6a9e000667b16b6d
1656*6d6c6c806b0264a27d9f0000ff9f000382b37b80807f057e7e7d7aba699e000267b068806a0669
1657*696868619f7c9f0000ff9f000c82b1797e7d7d7c7c7b7b77b96a9e000c67ad6568686767666665
1658*5f9e7c9f0000ff9f000581ae767b7b7a8079037874b6699e000266ac6381658064025d9d7c9f00
1659*00ff9f000481ad737878807704767572b5689e000566ab61646463806203615a9b7c9f0000ff9f
1660*00047dab707675807404737370b4649e000462aa5e61618060045f5e5799779f0000ff98000011
1661*823c0e3a99a76e737372727171706db08838893b013a3a823b013a3a813b833a033786a75b805e
1662*075d5d5c5c549693388139013c27980000ff9700150699bdb0b1b1b0afb3906d7170706f6f6e6d
1663*6b93b0ab80ac80ab81aa84a981a881a782a60ea5a4a8885a5c5c5b5b5a5a59537da682a002a2b5
1664*39970000ff97000b0ebb7e7173727271706f6f6e806d006c806b056a6a6b6a6a69806881670066
1665*80658064056363626261618060015f5e805d055c5b5a5a59598058005780560855565655555450
1666*a366970000ff9700060db4776d6e6e6d816c806b006a8069016867806680650164648063046262
1667*616160815f005e805d005c805b045a5a595958815781560d555554545352525150504f4b9c6397
1668*0000ff9700040db4766b6c806b096a6a696968686767666681658064056363626261618060045f
1669*5e5e5d5d805c055b5b5a5a5959805800578056025555548053805200518050064f4f4e4d499b62
1670*970000ff9700050db373686969806800678066096565646564646363626280610060805f095e5e
1671*5d5d5c5c5b5b5a5a805900588057015656805500548053005280510050804f804e074d4d4c4b4b
1672*479a62970000ff9700060db17165676666826500648063066262616160605f805e805d0a5c5c5b
1673*5b5a5a5959585857805680550554545353525280510050804f004e804d004c804b804a04494844
1674*9862970000ff9700040db16e63658064056363626261618060005f805e005d805c005b805a0159
1675*59805800578056805504545353525280510550504f4f4e4e804d004c804b054a4a494948488047
1676*0345419761970000ff9700030db06d61806200618060055f5f5e5e5d5d805c005b805a00598058
1677*005781560d5555545453535252515150504f4f804e004d804c014b4b804a004980480447474646
1678*45804403433f9561970000ff97000a0db06a5e60605f5e5e5d5d805c055b5b5a5a595980580057
1679*805602555554805380520a515150504f4f4e4e4d4d4c804b804a05494948484747804600458044
1680*004380420441403c9361970000ff97000b0dae675c5d5d5c5c5b5b5a5a80590058805701565680
1681*5500548053005280510050804f014e4e804d004c804b804a044948484747804605454544444343
1682*804200418040053f3e3d399160970000ff97000b0dad65595b5a5a595958585780568055055454
1683*5353525280510050804f004e804d014c4b824a0b49494848474746464545444480430042804103
1684*40403f3f803e063d3c3c3b379060970000ff9700060dac62565858578056805504545353525280
1685*510550504f4f4e4e804d054c4b4a47444280440e4140424546464545444443434242418040803f
1686*003e803d013c3c803b053a3939348f5f970000ff9700120dab6054565555545453535252515150
1687*504f4f804e004d804c164b4b4a4a4742495b76899598978d7c644b3e3d414242418040003f803e
1688*003d803c803b0b3a3a39393838373736318d5f970000ff9700040daa5e515380520a515150504f
1689*4f4e4e4d4d4c804b804a1649494846415282a5a88e756261616b819fa890613e3a3f803e003d80
1690*3c803b043a393938388037083636353534332e8a5f970000ff9700040da95b4f50804f014e4e80
1691*4d004c804b804a0e49484847474645404a84ae8d49150283001609336fa79c57353a3c3b3b3a3a
1692*3939383837373636353580340033803203312c895e970000ff9700030da7584c804d004c814b09
1693*4a4a4949484847474646804505433d60a992368a00071569ae7b39353938803708363635353434
1694*33333280318030042f2e29885e970000ff9700080da756494b4b4a4a49804880470e4646454544
1695*44434342403b70b35c038d00082b9b953b31353534348033003280318030092f2e2e2d2d2c2b27
1696*865d970000ff9700030da65347804800478046004580440143438042074140403f3874af3c9000
1697*05118b9a382f3381311130302f2f2e2e2d2d2c2c2b2b2a2a2824855d970000ff9700060da55144
1698*46464580440043804205414140403f3f803e033664b1339200050b8b8f2e2e2f802e802d0e2c2c
1699*2b2b2a2a29292828272621835d970000ff9700050da44e4243438042084140403f3f3e3e3d3d81
1700*3c03374baf4a940003109c6f26802c002b802a012929802800278026052524231f815d970000ff
1701*97000e0da34c3f4140403f3f3e3e3d3d3c3c803b003a80390235947a9600052da743252a298028
1702*05272726262525802406232222211c805c970000ff9700060da2493c3e3e3d803c803b003a8039
1703*0038803703305ba51697000b6f8924272726262524242323812207212120201e197e5b970000ff
1704*9700030da1463a803b053a3a39393838803707363535343330946198000518a03d1e222282230c
1705*222120201f1e1e1d1d1c177c5b970000ff9700040da04437398038003780360b35353434333332
1706*322d47a3199900166e5e010306080a0e101316191b1c1d1d1c1b1b19147b5b970000ff9700040d
1707*9f42353680358034023333328031803002276e839a000239850485000b0103070b0e1216171712
1708*795b970000ff9700030d9e3f328033003280318030082f2f2e2e2f2e298a549a0002108f1a8b00
1709*0501040807745a970000ff9700160d9d3c2f313130302f2f2e2e2d2d2e2e2d2820130f822f9a00
1710*02027e3a8f00016b57970000ff9700080d9d3a2d2f2e2e2d2d802c0a2d2c261b0f0400000a8c1a
1711*9b00016d4e8f00016b57970000ff9700070d9c382a2c2c2b2a802b03261b0e03820002178c0c9b
1712*00016a588f00016b57970000ff9700030d9b35288029042a271e10048500021b8d0b9b00016b58
1713*8f00016b57970000ff9700080d9a322528282316088800020d8d139b00016a538f00016b579700
1714*00ff9700060d9831241f11048a00020888289b000176418f00016b57970000ff9700040d99280d
1715*028c00020176459a0002088a268f00016b57970000ff9700020d8f0d8f00015a6c9a00022a8c08
1716*8f00016b57970000ff9700020c890b8f00022a8e0b9900015d6b9000016b58970000ff9700020c
1717*8a0c8f00020386439800020a8d2f9000016c59970000ff9700020c8a0c9000024289059700024d
1718*83038d00040102006f59970000ff9700020c8a0c90000206874f9600021696318c000601020405
1719*02725a970000ff9700020c8a0c9100022a9822950001796b8b000801020507080906745a970000
1720*ff9700020c8a0c920002538e139300025e8a0b89000a01030407090a0c0d0a765b970000ff9700
1721*020c8a0c930002698c1591000257931d88000c01030407090b0d0e0f110e7a5c970000ff970002
1722*0c8a0c930003046592298e00030b6b911e87000e01040506080b0d0f10111315127c5d970000ff
1723*9700020c8a0c9500034d9957098b00032b87791486001001030608090a0d0f111214151819167e
1724*5d970001ff079600020c8a0c96000225973f8b00017c6885001301020305080a0b0c0f11131415
1725*181a1c1d1a815e970003ffd386469400020c8b0c97000176468b0001794183001501020306080a
1726*0c0d0e10131516171a1c1e20211d845e9500010d0f80ff02fa7f059200020c8b0c97000178458b
1727*0001794581001701020406070a0c0e1011121517181a1b1e2021222421855f930003147fe8f082
1728*ff01b9459100020c8b0c97000179458b0001794580001802050708090c0e1012121517191b1c1d
1729*2022242526282689609200014eea86ff01f94e9000020c8b0c97000179458b001d794500030407
1730*090a0c0d1012131416191b1d1e1f22242627282b2c2a8c6090000505b0fffffefe83ff04feffff
1731*b0068e00020c8b0c97000179458b001d79470007090b0d0e0f12141517181b1d1f202223262829
1732*2a2c2f302d8e618f000145b980ff01fefe83ff00fe80ff01b2148d00020c8b0c97000179458200
1733*0206b15683001d794a000b0d0f1011131618191a1d1f21222326282a2c2d2e3133343190628e00
1734*074cf9fffffefffefe83ff06fefffdffffea4d8c00020c8c0c970001794581000406b3fff94c82
1735*001d7a4d040f11121415181a1b1c1e21232425282a2c2e2f30333537373592628c0009077ff8ff
1736*fefffefffefe83ff07fefffdfffdfff84d8b00020c8c0c970001794580000106b380ff01f94c81
1737*001d7c5008131415181a1c1d1f2023252628292c2e3031333537393a3b3995638b000106b380ff
1738*05fefffefffefe83ff09fefffdfffdfdffffb0068900020c8c0c9700057945000006b382ff01f9
1739*4c80001d7d530c16171a1c1e2021222527282a2b2e3031333437393b3c3d3f3d98648a000b14b1
1740*fffefdfffefffefffefe83ff05fefffdfffdfd80ff01b3068800020c8c0c97000479450033b384
1741*ff21f93f00007d5710191b1e2021222527292b2c2d3032343536393b3d3e404143419b6489000c
1742*4deafffffefdfffefffefffefe83ff0bfefffdfffdfdfffdffffb1148700020c8c0c9700047945
1743*008a38851220660e007f5a141d2022232426292b2d2e2f31343637383a3d3f4041444647459d65
1744*88000d4bf8fffcfffefdfffefffefffefe83ff07fefffdfffdfdfffd80ff01ea4d8600020c8c0c
1745*9700067944002388000080fb23000010915600805c1722242627282b2d2f3032333638393b3c3f
1746*41424345484a4b49a06586000f077ff7fffdfcfffefdfffefffefffefe83ff0dfefffdfffdfdff
1747*fdfffffcfff94c8500020c8c0c960005017a4400f9fb84872198cc4e0081601c2628292a2d2f31
1748*323336383a3c3d3e41434446474a4c4e4f4ca26685000106b380ff0bfdfcfffefdfffefffefffe
1749*fe83ff0efefffdfffdfdfffdfffffcfdfff84b8400020c8c0c9400070102057c4500d89b843421
1750*457341008263202a2b2c2e31333435383a3c3e3f4142454748494c4e50515251a56784001106b2
1751*fffdfcfffdfcfffefdfffefffefffefe83ff10fefffdfffdfdfffdfffffcfdfffff77e06820002
1752*0c8c0c92000a01030606087f4600b946eb82e822ebf82638008366242e2f3033353738393c3e3f
1753*40434547494a4b4d505253545655a76783001214b1fffffdfcfffdfcfffefdfffefffefffefe83
1754*ff18fefffdfffdfdfffdfffffcfdfffeffffba80791600000c8c0c8f000d010203060809090d81
1755*470089945782552257617f290084692830333537393a3b3e4042434447494b4c4e4f5254555758
1756*5a59a9678100140f4fe9fffefffdfcfffdfcfffefdfffefffefffefe83ff0ffefffdfffdfdfffd
1757*fffffcfdfffefbfc80ff05f2aa060a8c0c8e000d020306080a0c0d0d1183460004098607380000
1758*846b2b3437393b3c3d3f42444546494b4d4e5052545658595a5d5e5dac69002278b8f0fffffbfe
1759*fffdfcfffdfcfffefdfffefffefffefe83ff0ffefffdfffdfdfffdfffffcfdfffefbfc80ff0500
1760*000c088d0d8b000f01020405070a0c0e0f101115864d06058704220607896e2f393b3d3e404144
1761*4647484a4d4f50515456585a5b5c5f616260ae6900110080ff12fcfbfefffdfcfffdfcfffefdff
1762*fefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfcffff78765f0a088d0d8900540102
1763*050608090c0e101113141518809b898b8b8c8c8d8e8e8f9090919192ae69333d3f40414446484a
1764*4b4c4f51525355585a5c5d5f6163656561ae6800e2600cfffffcfbfefffdfcfffdfcfffefdfffe
1765*fffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfdff61d8e93e0a088d0d870036010205
1766*07090a0b0e1012131417191b1c2f3c3f4142434547494a4c4d4f51535452443e41424346484a4c
1767*4d4e51535556575a5c5e5f606381651b61ae6800d6360029fffdfbfefffdfcfffdfcfffefdfffe
1768*fffefffefe83ff18fefffdfffdfdfffdffff009f0e09c7cf00ebd9ce7c09098d0d850037010305
1769*06090b0c0d0f12141516191b1d1f201e1f22232526292b2c2e2f32343637393a40434446474a4c
1770*4e4f5153555758595c5e6061636482651b61ae6800b4fad700ac3f2b28df2a00fffdfcfffefdff
1771*fefffefffefe83ff18fefffdff7f0094ce35227f16efc8b159a2938c8f4e08098d0d8300360203
1772*0407090b0d0e1011141617181a1d1f21212426282a2b2c2f31333435383a3c3e3f404345474849
1773*4c4e4f51525557595a5c5d60626385651b61ae68009fb18f92bb89b4d0f827ab5d932bb24800ff
1774*fefffefffefe83ff1800df69d7a81de3b2a4a59d93877484e7827b6e6e3107098d0d8100360103
1775*0607080b0d0f1112131618191b1c1f21222425282a2c2d2e3033353637393c3e3f40434547494a
1776*4b4d5052535457595b5c5e60626487651b61ae6800918c707d8a227f778796969da7baef2be33f
1777*6e15fffffefe81ff531200ba03ccb2b4b2a29b8879695a4a373ab86661535218060a8d0c000001
1778*030608090a0d0f11121316181a1c1d1e21232526272a2c2e2f31323537393a3b3e404142444749
1779*4b4c4d4f52545556585b5d5e5f626489657161ae6800866e56636fe4333b4a5a697c8b9ba2b5b4
1780*b5d5190433bffeffff007f19d0cccdc3b1a18f7f6f5d4d3b281806fbc55e5044410a060a8d0d00
1781*0305080a0b0c0e11131415171a1c1e1f2022252728292b2e3031323537393b3c3d404244454649
1782*4b4d4e5051545657595a5d5f6062648b656f61ae68007f5d46516bdefb091b2b3b4d606f8292a4
1783*b4c7cdc3d855aa7fff45bbece6d3c0ae9e8f7c69574734250f00efdcd27949403c05050a8e1003
1784*080a0c0e0f1013151718191c1e2021232427292a2c2d3032333436393b3d3e4041444647484b4d
1785*4f50515456585a5b5c5f6162648d656d61ae68007c55404e8fd8dfef03152537475d6c7c8fa1b4
1786*c3d3e6def0aeff9e00d5ddd6c3b19e8f7f6c5a4a37281503f2dfcfb96944410c060a9012050a0c
1787*0e0f1013151718191c1e2021222527292b2c2d30323335363a3c3d3e4042454748494b4e505152
1788*5457595a5c5d5f62638f646d60ae6900805a457fc5d0e3f206182b3b4a5d6f7f92a4b4c3d6e0d0
1789*6355ffff000800c4c3c1b2a798887663534431220f00ecdfcd7f5b1d06099722101617181a1d1f
1790*2022232527292a2c2e3032343536393b3d3e3f42444647484b4d4f5052535658595b5c5f616263
1791*6567696a6a8269896a6a6966b66b00867e93d5dcef0312253444576976889babb5bcbacf1dbb75
1792*fefffffefe00f8f213d7afa6a39f9085766657473728180c00d368170177988d8f8f9192939495
1793*9696979899999b9c9d9e9e9fa1a1a2a3a4a4a6a6a7a8a9a9ababacadaeafb0b0b1b2b3b4b5b5b6
1794*86b789b81ab7babc3300b1180309182837475a697988909f9fa6b2e33533000080fe01ffff80fe
1795*00fd800015f2685f0cdcae988e8a7f7a6b5f57474d778500052f33833281338134833583368437
1796*83389a39163b1b0014ea5e4a5a5f6e7a828d9190b7e810a3ad8ce80083fe01ffff80fe80fd14fc
1797*fdfeaa00e8e96368bc33fbdcb69a7c7888828105c500153379bc7b7f9abedf0045eaa8c3838c5f
1798*7ffdfafcfdfd82fe01ffff80fe80fd08fcfdfdfbfefcf9fcfe80002835e3dbbdef47f2de498d85
1799*7c603b200d0400fffaf5f2ede8e5e0ddd8d5d0cdcac8c4c3c1bebcbbbbb980b700b680b736b9bb
1800*bbbcc0c1c3c8c6caced2d5d8dde2e5e8edf3f7fa0000040f224468808a87f1815d561f00439c00
1801*c6bf00fefcf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd11fcfdfdfbfefcf9fbfdf9f8fdfbf9f7
1802*fcfffc8000207f66eef06707b3d8ea662100e6cccbc3b1aaa79e95918b88817a7773716f6d6b6b
1803*8369366b6d6f7375777c81888d91979ea7abb3c6cdd1ee022d7f120024ef94df75bf00fe0000fc
1804*fdf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd35fcfdfdfbfefcf9fbfdf9
1805*f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fbff0075005b9bcc35e6c9af7b595758503e30302b
1806*262121242482213724242121262b303341595d5c5e89afd4ef53f6f9b3743800fdf5f6f6f8f9fb
1807*fdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34fcfdfdfb
1808*fefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fafefafefcf9fefd55009995b3c305
1809*5fea98452f1e0d09f5e884e536e800090d1a3370aa0c7825061538005f00fcfef9fbfefbfcf5f6
1810*f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34
1811*fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fafefafefcf9fdfcfafefd
1812*fbf9fc5500d4aa72ce55d708c0f2840c07f21d08dff4ced4c880002bfdfafcfdfbf9fbfdf9fbfe
1813*fbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fefffffcff
1814*b5a30ecc4ef25c1600ded8e2011665134eccb5a300ffb2a307004e6bf5bda59e9e829d079e9fa6
1815*bdf5759900b2a300ffb0a30a0c4ec6a29ea2a7b2bfc8cf80d00acfc7bfb2a7a19da3cf59a0b0a3
1816*00ffaea31cbefba79ea3b3cde1f1f9fbfcfefefdfefefcfbf9f1dfcab3a29eaa065faea300ffac
1817*a30c2701a19eabc9e9fafdfbf7f5f480f300f280f30cf4f5f7fbfef9e6c7a99ea50bc3aca300ff
1818*aaa30b0065ad9eabcff3fefaf5f3f28af30af2f3f5fafef3cfaa9eb386aba300ffa9a30960e09f
1819*a3c8f3fef8f3f290f309f2f3f8fff1c6a2a0ecc8a9a300ffa8a3066ab89fb3e6fef898f306f9fe
1820*e4b09ebecaa8a300ffa7a306c6a69fc5f7fcf49af306f4fdf5bf9eabe1a7a300ffa6a305b8a3a1
1821*d2fdf99ef305f9fdcea0a3c6a6a300ffa5a305cca3a4dbfef6a0f305f7ffd4a0a4e7a5a300ffa4
1822*a30550a5a0dbfff59ef381f405f6ffd4a0abcaa4a300ffa3a305c3b2a0d3fef48ef382f287f384
1823*f405f6ffce9fb97aa3a300ffa2a30500da9ec6fef68cf303f4f6f9fc80fd03fcf9f6f482f387f4
1824*05f7fdc19de900a2a300ffa2a304629fb4f8f88bf310f7fdfbf4e6dbd3ced3dbe8f5fcfcf6f3f3
1825*89f404faf5b0a07fa2a300ffa1a30427a9a4e9fc8af312f7fdf5d9bdaaa3a09e9c9ea0a4aabedb
1826*f6fef78af404fde4a2af39a1a300ffa1a304f49ecbfff488f316f4fcf7d1ac9f9fb0e125465646
1827*1fdaae9e9faed5f9fcf588f404f5fec69e06a1a300ffa0a305f1a0adf5f7f287f308f5fee5b19e
1828*a3f3060084a30886e1eda09eb4e8fff688f404f9f2aba5c3a0a300ffa0a303f09ed5fe88f306f6
1829*fed6a39fe5f18aa306bedc9fa4d8fef688f403fed09e06a0a300ff9fa30499a2aef6f787f305f5
1830*fdcc9fa57f8ea30559a1a0d4fef685f406f5f5f9f3aaa6e79fa300ff9fa303309ecdfe87f305f4
1831*fed39fac5090a304f2aaa0d8ff83f482f503fec99e569fa300ff9ea3053fbda5ecf9f286f304fc
1832*e4a2a55892a306f8a3a4e8fcf4f485f504fbe7a2c7669ea300ff9ea304919fb9fbf486f304f7f6
1833*b09f7f94a3055f9fb3f8f7f485f504f6f9b3a03d9ea300ff9ea303469ed1fe87f303fed09dea95
1834*a30400da9ed4fe87f503fecd9e6e9ea300ff9da30400dfa3e6fa86f304f8f3aba5c396a304f1a1
1835*aef6f886f503fce1a1f19ea300ff9da3047fb2aaf5f686f303fdd59e0198a303ee9fdafe86f504
1836*f8f3a7b63f9da300ff9da3044e9fb9faf485f304f4fbba9e7d98a3040c9fbcfcf685f504f7f9b4
1837*a4e79da300ff9da303f89ec5fc86f304f7f0a7bb3f98a30487b1aaf4f786f503fbbf9f509da300
1838*ff9da3038a9dcdfd83f380f403fbe1a2f79aa303e2a3e6fa86f503feca9db89da300ff9da30446
1839*9ed5fdf280f382f403fdd59f419aa30323a0dafd84f505f6f6ffd09d7f9da300ff9da30543a0da
1840*fcf2f384f403ffcf9d9e9aa303629ed1ff82f581f603ffd49e439da300ff9da30443a0d9fcf385
1841*f403ffcf9da69aa305a29dcffff5f584f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9d
1842*a29aa304a29dcffff585f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9da29aa303a29d
1843*d0ff86f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9da29aa303a29dd0ff86f603feda
1844*a0439da300ff9da30343a0d9fd86f403ffcf9da29aa303a29dd0ff86f603fedaa0439da300ff9d
1845*a30343a0d9fd86f403ffcf9da29aa303a29dd0ff86f603fedaa0439da300ff9da30343a0d9fd86
1846*f403ffcf9da29aa303a29dd0ff86f603fedaa0439da300ff9da30343a0d9fd86f403ffcf9da29a
1847*a303a29dd0ff84f605f7f7ffdaa0439da300ff9da30343a0d9fd85f404f5ffcf9da29aa303a29d
1848*d0ff82f681f703ffdaa0439da300ff9da30343a0d9fd82f481f503ffcf9da29aa303a29dd0ff80
1849*f683f703ffdaa0439da300ff9da30343a0d9fd80f483f503ffcf9da29aa304a29dd0fff685f703
1850*ffdaa0439da300ff9da30453a0d9fdf385f503ffcf9dc29aa303c29dd0ff86f703ffdaa0539da3
1851*00ff98a308e758373f61fba0d9fd86f504ffcf9d2158983f0458219dd0ff86f709ffdaa0fb613f
1852*3f370e6697a300ff96a3023f1ba8829f029cd8fd86f502ffcd999c9f0299ceff86f702ffd99c82
1853*9f02a1c99996a300ff96a3024ea2aa82bc02bae3fc86f502fddcb89cbc02b8ddfe86f702fde4ba
1854*81bc04bdb5a2be1f95a300ff95a30400c1a4e7fd82fa01f9f786f500f885fa98fb00f986f700f9
1855*83fb04fcfbbe9fe795a300ff95a304cca9a8f7f882f68af582f690f786f88af701f8f881f903ff
1856*d19d9695a300ff95a304ccaaa8f5f791f591f695f783f803ffd09da295a300ff95a304ccaaa8f5
1857*f78ef591f695f786f803ffd09da295a300ff95a304ccaaa8f5f78cf591f695f788f803ffd09da2
1858*95a300ff95a304ccaaa8f5f78af590f696f78af803ffd09da295a300ff95a304ccaaa8f5f788f5
1859*90f696f78cf803ffd09da295a300ff95a304ccaaa8f5f786f590f696f78ef803ffd09da295a300
1860*ff95a304ccaaa8f5f784f590f695f791f803ffd09da295a300ff95a304ccaaa8f5f781f591f695
1861*f793f803ffd09da295a300ff95a306ccaaa8f5f7f5f591f695f795f803ffd09da295a300ff95a3
1862*05ccaaa8f5f7f590f695f796f804f9ffd09da295a300ff95a304ccaaa8f6f88ff689f701f9fd82
1863*ff02fdfaf880f794f881f903ffd09da295a300ff95a304ccaaa8f6f88cf689f70ef8fdfef7e7d9
1864*d0d0cfd4e0f2fcfffb93f883f903ffd09da295a300ff95a304ccaaa8f6f88af689f712f8fefde5
1865*c5ada39f9d9d9c9ea2a7bad7f5fffb8ff885f903ffd09da295a300ff95a304ccaaa8f6f888f68a
1866*f714f9ffe8bca29eaadc2678a69e50fabb9f9eacd3fafe8cf887f903ffd09da295a300ff95a304
1867*ccaaa8f6f886f68bf707fbfccea39ec686c884a3080061fba39eb6eefff988f889f903ffd09da2
1868*95a300ff95a304ccaaa8f6f884f68cf706fbf8bf9eac6e0089a306cad89ea9e5fff985f88bf903
1869*ffd09da295a300ff95a304ccaaa8f6f882f68df705fafabb9dc44e8ca3050026a0a7e5ff82f88e
1870*f903ffd09da295a300ff95a304ccaaa8f6f880f68ef705f8fec69dc6668fa306659fabf0fdf8f8
1871*90f903ffd09da295a300ff95a305ccaaa8f6f8f690f704ffdea0b63991a305169eb9fbfaf890f9
1872*03ffd09da295a300ff95a304ccaaa8f6f990f704fbf5ae9f1a92a30424cd9fd9ff91f903ffd09d
1873*a295a300ff95a304ccaaa8f6f990f703ffd19efa94a3097da1aff8f9f7f8f8f9f982fa86f903ff
1874*d09da295a300ff95a304ccaaa8f6f98ff704f9f8afa37195a30fe6a0d9f1e2e4e7e8eaeceff1f4
1875*f6f8f984fa03ffd09da295a300ff95a304ccaaa8f6f98ef704f8fee3a1e196a304ec9fbef4e381
1876*e280e30ee4e5e7eaedf0f4f8fafbfbffd09da295a300ff95a304ccaaa8f6f98bf707f8f9faf8fe
1877*cb9e7896a30586aeabf0e7e383e401e5e580e409e5e6e7eaeff2fed09da295a300ff95a304ccaa
1878*a8f6f988f70af8f9f9f6f0eae4f0b99fe397a304dba4e3ece380e482e585e604e5f6ce9da295a3
1879*00ff95a304ccaaa8f6f986f70cf9f8f6eee6dfdcdbdeefb0a75c97a30516a1d8f0e3e482e582e6
1880*83e703f7ce9da295a300ff95a304ccaaa8f6f983f70ff8f8f5eee5dedbdbdcdddce1eea8b70097
1881*a30446a0d5f1e481e581e682e780e804e7f7ce9da295a300ff95a304ccaaa8f6f980f708f8f8f7
1882*f0e7dfdbdadc80dd06dedce3eda7bf2497a30648a0d6f2e4e5e581e682e783e803f8ce9da295a3
1883*00ff95a30eccaaa8f6f9f7f8f8f5ece2dcdadbdc80dd81de04e1eeacabcc97a3042ea0d7f2e481
1884*e682e782e880e903f8ce9da295a300ff95a30bccaaa8f6faf9f3e9dfdbdbdc81dd83de04e0f0b6
1885*a3da97a306f3a3e0f0e5e6e682e782e882e903f8ce9da295a300ff95a309ccaaa9f7f4e7dedbdb
1886*dc81dd82de81df03f1c39ec696a30524baa6ecebe682e782e882e905eae9f8ce9da295a300ff95
1887*a307ccaba9f0e0dadcdc81dd82de82df04deefd7a00196a304f19fb7f4e881e782e881e981ea04
1888*e9f8ce9da295a300ff95a305ccaba8ebdfdc81dd82de82df07e0e0dfe7eca8aebf95a306189fd1
1889*f5e6e7e782e881e984ea03f9ce9da295a300ff95a304ccaba8ede080dd82de82df82e004e1f4c3
1890*9e4694a3050faaa8ecede681e882e982ea81eb03f9ce9da295a300ff95a305ccaba8ede0dd82de
1891*81df82e080e105e0ebe7a5aec393a303069dc9f881e882e982ea81eb05ececf9cf9da295a300ff
1892*95a304ccaba8ede181de81df82e083e105e3f5ca9ee17f91a306cc9faef0eee7e882e982ea82eb
1893*80ec03facf9da295a300ff95a305ccaba8ede1de82df82e082e180e205e1e9f3b49e1d90a30661
1894*aba1dff5e7e881e983ea81eb00ec81ed03fbcf9da295a300ff95a304ccaba8ede181df82e082e1
1895*82e207e3e2efe9ac9f18008da30630ab9fd1f9eae880e983ea04ebebecebec80ed06eeedeefbcf
1896*9da295a300ff95a306ccaba8ede2dfdf82e082e182e282e305f3e8ac9eda998aa3092456a3a1ce
1897*f8ece8e9e983ea01ebeb80ec80ed80ee05efeffccf9da295a300ff95a304ccaba8ede282e082e1
1898*81e282e381e406f2ecb79ea923b687a30773ce9fa7d8faece884ea01ebeb80ec81ed80ee06efef
1899*f0fccf9da295a301ffa294a304ccaba8eee380e082e181e282e384e405f0f5cea7a23787a306ff
1900*a1b8e9f7ebe881ea81eb80ec81ed00ee80ef81f003fccf9da295a303ffa69d9f92a305ccaba8ee
1901*e3e081e182e282e382e481e505e4ebfac39e3787a30506a3e2f8e9e980ea81eb80ec81ed00ee80
1902*ef80f006f1f0f1fdcf9da293a307a1a1ffefd4bb9ba290a304ccaba8eee480e182e282e382e482
1903*e506e6e6e5f5c59e3f87a30606a3e0f3e9eaea82eb80ec80ed00ee80ef80f080f105f2f2fecf9d
1904*a291a303a19ea8a980ff03fdd0a49d8fa305ccaba8eee4e182e282e382e482e581e604e7f5c49e
1905*3f87a30406a3e0f3e982eb80ec00ed80ee80ef81f080f180f203fecf9da28fa305a29faad1f7f9
1906*82ff03e6b99da28da304ccaba8eee481e282e382e481e582e680e703f5c49e3f87a30406a3e0f3
1907*ea80eb03ecedeced80ee81ef80f000f180f280f304f4ffcf9da28ea303a19fbff886ff03fdbf9f
1908*a18ca306ccaba8efe5e2e282e382e481e582e682e703f6c49e3f81a300a282a30606a3e1f4ebeb
1909*ec80ed81ee80ef03f0f1f0f180f281f305f4f4ffcf9da28da3069da3e2fffffefe83ff05feffff
1910*e2a3a08ba304ccaba8efe581e382e482e582e683e704e8f6c49e3f80a302a1a2a181a30406a3e1
1911*f4eb80ed81ee03eff0eff080f180f281f300f480f503ffd09da28ca3029db9e680ff01fefe83ff
1912*06fefffeffe3a79f8aa306ccaba8efe6e3e382e482e582e682e781e80af6c49e3fa3a3a0a3e3c2
1913*9c80a30606a3e1f4eceded80ee00ef80f080f181f280f300f482f503ffd09da28aa309a29abefd
1914*fffffefffefe83ff08fefffdfffff7be9ca288a305ccaba8efe6e381e482e582e682e782e814e9
1915*f6c49e3fa3a0a3e4fffcbe9ca3a306a3e1f6ecee80ef80f080f181f200f380f480f580f604f7ff
1916*d09da289a30aa0a5cffcfffefffefffefe83ff09fefffdfffdfffdbe9fa187a304ccaba8efe680
1917*e482e582e682e781e881e906f6c49e3fa0a3e480ff0afdbe9ca306a3e1f6eeefef80f080f181f2
1918*00f380f480f581f605f7f7ffd09da288a30ba0a2e3fffefffefffefffefe83ff0afefffdfffdfd
1919*ffffe2a3a086a305ccaba8efe6e482e582e682e781e882e906eaf7c49e35a3e482ff07fdbe9d06
1920*a3e1f6ee80f081f180f200f380f480f581f607f7f8f7f8ffd09da287a30c9fa7e2fffefdfffeff
1921*fefffefe83ff0bfefffdfffdfdfffeffe4a2a085a304ccaba8efe781e581e682e782e882e980ea
1922*04f7c49d57e484ff08fdb900a3e1f7eff0f080f100f280f380f481f580f600f780f805f9f8ffd0
1923*9da286a30d9cbef7fffffefdfffefffefffefe83ff0cfefffdfffdfdfffdffffe2a79f84a306cc
1924*aba8f0e7e5e581e682e782e882e982ea04f7c49890388512096606a2e2f8eff1f2f1f280f381f4
1925*80f500f680f780f880f904faffd09da284a30fa29abdfdfffcfffefdfffefffefffefe83ff07fe
1926*fffdfffdfdfffd80ff02f7bf9c83a304ccaba8f0e881e682e782e882e982ea08ebebf8c59ba072
1927*000080fb0a00000c7bfc9fe2f8f1f2f281f380f403f5f6f5f680f781f880f905fafaffd19da283
1928*a310a0a5cffbfffdfcfffefdfffefffefffefe83ff0efefffdfffdfdfffdfffffcfffdbe9c82a3
1929*06ccaba8f0e8e6e682e782e882e983ea07ebebecf8c59c75d984870695cceea0e2f9f281f303f4
1930*f5f4f580f681f780f80af9faf9fafbfafbffd19da282a311a0a3e4fffdfffdfcfffefdfffefffe
1931*fffefe83ff10fefffdfffdfdfffdfffffcfdfffcbc9aa280a304ccaba8f0e882e782e882e983ea
1932*09ebebecebecf8c59d557c8434094273e3a2e2faf2f3f3f480f580f681f703f8f9f8f980fa80fb
1933*05fcfbffd19da281a312a0a2e3fffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffdfdff
1934*fdfffffcfdfffffacfa49b9da1bbaba8f0e980e782e881e982ea03ebeaebeb80ec07ededf9c59e
1935*371ce282df08e2eb1bd9a3e3faf4f480f580f681f700f880f980fa80fb80fc1bfdffd19da2a3a2
1936*a19fa7e1fffffdfcfffdfcfffefdfffefffefffefe83ff19fefffdfffdfdfffdfffffcfdfffefc
1937*ffe6ceceabbbaaa8f0e9e782e881e982ea81eb80ec81ed05f9c59f0d916f826c096f7695cba4e3
1938*faf4f5f580f681f700f880f980fa81fb80fc1cfdfdffd19d9f9ca3a5bff7fffefffdfcfffdfcff
1939*fefdfffefffefffefe83ff0ffefffdfffdfdfffdfffffcfdfffefbfc80ff05fabfaaa8f0ea80e8
1940*82e982ea82eb80ec80ed06eeeff9c49dabaf82ae08adaeaeb0a5a2e2fbf581f680f700f880f980
1941*fa81fb03fcfdfcfd80fe1affd19cbccce5f9fffefbfefffdfcfffdfcfffefdfffefffefffefe83
1942*ff0ffefffdfffdfdfffdfffffcfdfffefbfc80ff060008ada7f1eae882e982ea82eb80ec0aedee
1943*edeeefeeeffac7a1a687a703a5a5e4fb80f600f780f880f981fa80fb00fc80fd80fe80ff03d197
1944*c20080ff12fcfbfefffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfd
1945*fffefbfcffff786f77aba7f1eb81e983ea81eb80ec00ed80ee80ef04f0f0f7f1ea81eb86ec03f8
1946*f9f6f780f881f980fa00fb80fc80fd80fe82ff19d1975d600cfffffcfbfefffdfcfffdfcfffefd
1947*fffefffefffefe83ff1afefffdfffdfdfffdfffffcfdfffefbfdff61d8e058aba7f1ebe9e983ea
1948*81eb00ec80ed80ee81ef80f003f2f5f6f680f781f880f901fafb83f880f900fa80fb80fc81fd01
1949*fefe84ff19d19853190029fffdfbfefffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffd
1950*fdfffdffff009f0e09c7cf00ebd9c88ea8a7f1eb83ea01ebeb80ec80ed81ee80ef00f080f181f2
1951*80f380f401f5f580f680f780f803f9faf9fa80fb81fc80fd00fe87ff19d19917e4d700ac3f2b28
1952*df2a00fffdfcfffefdfffefffefffefe83ff18fefffdff7f0094ce35227f16efc8b159a2938c89
1953*5ea7a8f1ec81ea01ebeb80ec81ed80ee00ef80f080f181f280f300f480f580f681f780f800f980
1954*fa80fb81fc03fdfefdfe89ff19d19a029e8f92bb89b4d0f827ab5d932bb24800fffefffefffefe
1955*83ff1c00df69d7a81de3b2a4a59d93877484e7827b6e6942a5a8f1eceaeaebeb80ec81ed03eeef
1956*eeef80f080f181f200f380f480f580f681f700f880f980fa80fb81fc00fd80fe8bff19d19bf378
1957*707d8a227f778796969da7baef2be33f6e15fffffefe81ff1c1200ba03ccb2b4b2a29b8879695a
1958*4a373ab86661534c28a5a8f2edebeb80ec81ed00ee80ef80f080f181f200f380f480f580f681f7
1959*00f880f980fa81fb80fc00fd80fe8dff38d19ce85b56636fe4333b4a5a697c8b9ba2b5b4b5d519
1960*0433bffeffff007f19d0cccdc3b1a18f7f6f5d4d3b281806fbc55e50443c1aa4a8f2ed81ec80ed
1961*00ee80ef80f081f180f200f380f480f581f680f700f880f980fa81fb03fcfdfcfd80fe8fff3ed1
1962*9ce04646516bdefb091b2b3b4d606f8292a4b4c7cdc3d855aa7fff45bbece6d3c0ae9e8f7c6957
1963*4734250f00efdcd27949403618a4a8f2eeececedeeedee80ef81f080f103f2f3f2f380f481f580
1964*f600f780f880f981fa80fb00fc80fd80fe91ff3ad19cdf42404e8fd8dfef03152537475d6c7c8f
1965*a1b4c3d3e6def0aeff9e00d5ddd6c3b19e8f7f6c5a4a37281503f2dfcfb969443d1da4a8f2eeed
1966*ed80ee80ef80f080f101f2f280f380f480f503f6f7f6f781f880f980fa00fb80fc80fd80fe93ff
1967*3ad19ce148457fc5d0e3f206182b3b4a5d6f7f92a4b4c3d6e0d06355ffff000800c4c3c1b2a798
1968*887663534431220f00ecdfcd7f562ea5a8f5f1efef80f080f101f2f280f381f480f503f6f6f7f7
1969*81f880f980fa80fb01fcfc80fd80fe97ff38d29be96a93d5dcef0312253444576976889babb5bc
1970*bacf1dbb75fefffffefe00f8f213d7afa6a39f9085766657473728180c00cd74b1a3e1fa80f885
1971*f984fa80fb85fc82fd84fe9aff18faba9e18fb0309182837475a697988909f9fa6b2e335330000
1972*80fe01ffff80fe00fd800014f2685f0cdcae988e8a7f7a6b5f57474a620f9fa6ba87bb8dbc9dbd
1973*88bc16bdb09ebb0e554a5a5f6e7a828d9190b7e810a3ad8ce80083fe01ffff80fe80fd14fcfdfe
1974*aa00e8e96368bc33fbdcb69a7c78828213ab809e019f9f8b9e019d9e9e9d899e1b9f9f9e9e9da1
1975*d0caa87b7f9abedf0045eaa8c3838c5f7ffdfafcfdfd82fe01ffff80fe80fd08fcfdfdfbfefcf9
1976*fcfe80002835e3dbbdef47e6c685fcf5e1ab7c5c453b3a36352f2c2924211c1614110c09060401
1977*00fffaf8f6f6f584f336f5f6f6f8fbff00040406090e1116191e2124292f323539383e495f85b9
1978*e8f5fa49853e561f00439c00c6bf00fefcf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd11fcfdfd
1979*fbfefcf9fbfdf9f8fdfbf9f7fcfffc81001e66ddb438e292c1d85513f2dac0bfb7a49e9b928886
1980*807c756f6b6766646260845e3660626266696b71757c82868b929b9ea7babfc3e1f6216d00e605
1981*bf5f9f75bf7ff90000fcfdf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd35
1982*fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fbff0075005b9bcc35e6c9
1983*af7b595758503e30302b262121242482213724242121262b303341595d5c5e89afd4ef53f6f9b3
1984*743800fdf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe01ff
1985*ff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fafefafefc
1986*f9fefd55009995b3c3055fea98452f1e0d09f5e884e536e800090d1a3370aa0c7825061538005f
1987*00fcfef9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd
1988*82fe01ffff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8f7f6fa
1989*fefafefcf9fdfcfafefdfbf9fc5500d4aa72ce55d708c0f2840c07f21d08dff4ced4c880002bfd
1990*fafcfdfbf9fbfdf9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfbf9fcfbf9fc
1991*fafcfdfd82fefffffcffb53d0e0039b880675e5250545f6783c43900b53d00ffb23d070039865a
1992*42393433823207333439425a895500b23d00ffb03d0a7f7b4738333a455872839080910a908270
1993*59453933384b7fb6b03d00ffae3d1c045d3a343d5c8cb0cdd7d8d7d8d5d3d5d9d7d8d8cdae865a
1994*3c343c613fae3d00ffac3d0e895f38344c85bedadacec0b7b4b1b080af0eb0b2b4b7c0cfdad9ba
1995*8148343963c3ac3d00ffaa3d0e00833e344c91d1decab8b1afb0b1b184b20db1b1b0afb1b9ccdd
1996*d0914a344090ab3d00ffa93d0a9e53363e82d2dcc3b2afb18eb20ab1afb2c2dccd7f3b375724a9
1997*3d00ffa83d08e443345abae1c4b1b08cb201b1b280b10bb0afafacaec4dfb454334508a83d00ff
1998*a73d07a83a367bd9d4b5af88b201b1b280b103b0b0afaf80ae00ad80ac07a8afd1d271343db1a7
1999*3d00ffa63d07a2393894e2c6afb186b280b103b0afb0af80ae00ad80ac00ab81aa08a9a8a6c0dc
2000*8b383aa8a63d00ffa53d06aa393ea4e1bdaf80b201b1b280b100b081af07aeaeadadacacabab80
2001*aa01a9a980a880a707a6a2b3dc96383ab7a53d00ffa43d07da3a39a6e1b8afb280b100b080af02
2002*aeaead80ac04abaaabaaaa80a980a805a7a7a6a6a5a580a407a39faedb95383d08a43d00ffa33d
2003*09c3413796e0b6aeb0afaf80ae00ad80ac07abaaaaa9a7a6a5a581a482a580a401a3a380a208a1
2004*a19dabd98a354466a33d00ffa23d080050347ce1b9abaead80ac01abab80aa10a9a9a6a6abb4bf
2005*c7cbcacac6bcafa6a1a080a201a1a180a00a9f9f9e9e9aacd771335600a23d00ffa23d0782365c
2006*d7bfa9abab80aa80a980a814a5a6b4ccd4ccb4a1948c94a3b6cdd2c9af9e9d9f9f819e0a9d9d9c
2007*9c9b97b5cb53378da23d00ffa13d05893d3fbccda780a981a818a7a7a6a4a2b4d2ce9e6b493d38
2008*343234383e4a6ea1cdcdac9a819c009b809a0899999795c3ae3b40eea13d00ffa13d095a3487da
2009*aba7a8a7a7a680a51ca4a4a1a6c9d28f4c35353e516a787e78684e3e35365197d1c29c97999981
2010*98809705949ad17b3461a13d00ffa03d05173750d0baa380a580a40ca3a3a29facd6b45533395a
2011*bf55843d0a28b15637345ab5d0a0949780960195958094058facc44a3964a03d00ffa03d045835
2012*97d2a281a30ca2a2a1a1a09cabd7983c3755178a3d150451363e9ad2a291949493939292919190
2013*8fc88a3560a03d00ff9f3d0555384fcfb19f80a100a0809f079e9ba9d685363b8d8e3d097f3837
2014*92d19c8f9291918090078f8e8ba3c2493bd09f3d00ff9f3d04703489d09e809f019e9e809d069b
2015*9fd293353eda903d09b83c3799cb918d8f8e8e808d068c8b8bc77d357e9f3d00ff9e3d057f4440
2016*bdb79a809d009c809b069997c5af3b3add923d0aba393eb2b98a8c8c8b8c8b808a0585abb03d49
2017*009e3d00ff9e3d08f23764d1a19a9b9b9a8099069895abcb54378d943d12813658c89c878a8a89
2018*89888887858ec65937339e3d00ff9e3d0478348ec79781988097059696cc8b3356953d12005035
2019*90c186878786858685858482bc8334879e3d00ff9d3d1200513db1b5939797969695959491a7c5
2020*4b3a64963d05173850c396828184078383827da7a23b579e3d00ff9d3d11003f4ac8a293959493
2021*939292918fc193345f983d04583699b37f8082098180807f7d92ba45427f9d3d00ff9d3d063936
2022*63c9969292819106908f93ca6435eb983d04c13668c283807f817e057c82c05939d09d3d00ff9d
2023*3d08ba3578c59190908f8f808e058b9fbd44437f983d07874048bd8e7b7e7d807c067b7a7cb86c
2024*36da9d3d00ff9d3d05913387c08c8e818d068c8c87aea53b5a9a3d05533ea99c787b807a077979
2025*7877b27d34a29d3d00ff9d3d05783593b7878c808b078a8a8984b59336769a3d05693897a57479
2026*80780777777672ae86338d9d3d00ff9d3d0475389bb4858089088888878683ba8733999a3d0482
2027*3489ab72807600758074046ea48c35779d3d00ff9d3d0575389ab3828780860785858481b98833
2028*9c9a3d059a3385af717480738072046ca29538759d3d00ff9d3d04753899b1808184078383827f
2029*b888339a9a3d059a3485ae6f72807180700469a09438759d3d00ff9d3d04753899af7e80820881
2030*80807f7cb687339a9a3d049a3485ad6d806f006e806d04669f9338759d3d00ff9d3d04753898ad
2031*7b807f817e047bb587339a9a3d069a3484aa6a6d6d816c056b649c9338759d3d00ff9d3d107538
2032*98ac797e7e7d7d7c7c7b78b387339a9a3d109a3484a9686b6b6a6a696968629b9338759d3d00ff
2033*9d3d06753897aa777c7b807a06797976b186339a9a3d069a3484a866686880670666665f999238
2034*759d3d00ff9d3d06753896a8757979807806777773b086339a9a3d069a3483a663666680650664
2035*645e989138759d3d00ff9d3d05753896a6727780760775747471af86349a9a3d109a3483a46264
2036*6463636262615b959138759d3d00ff9d3d04753896a56f807408737372726fad85349a9a3d049a
2037*3482a25f80610860605f5f59949038759d3d00ff9d3d04753896a46d807208717170706cab8434
2038*9a9a3d049a3481a15c805f085e5e5d5d56939038759d3d00ff9d3d10753895a26b70706f6f6e6e
2039*6d6aaa84349a9a3d109a34819f5a5d5d5c5c5b5a5a53908f38759d3d00ff9d3d047b3894a06880
2040*6d806c056b68a88434a69a3d07a634819e575a5b5a815904518f8f387b9d3d00ff983d16d0ddd1
2041*d4e15b38939e666c6b6b6a6a696965a683346add98d417dd6a34819c55595858575756564e8d8e
2042*385be1d4d4d12100973d00ff963d027f683c81370f3632919d636969686867676663a5802e8e37
2043*8b38052e7d9b52565680550654544c8c8c32378238014a55963d00ff963d047b3b486666806504
2044*62a59a606780660765656461a3985f65826401656582640165658b640763635d95995054548053
2045*055251498a9f6081630464563c46bf953d00ff953d0500463fa1b1a680a704a6aa856165806405
2046*6362625f89a682a281a182a0829f819e809d819c809b039f7e5052805105504f4f49739d809806
2047*979698ac6138b7953d00ff953d10003d47b5716566666564646363626261618060825f005e805d
2048*015c5c805b015a5a805901585880570156568155005480530652525150504f4f804e0e4d4c4d4c
2049*4b4c4c4b4a4a46947f3596953d00ff953d08003d46b06b616262618260805f805e015d5c805b00
2050*5a805980580157578056005581548053095252515150504f4f4e4e804d044e4d4d4c4c804b014a
2051*49804807474746428f7d359a953d00ff953d07003d46af695e6060815f0d5e5e5d5d5c5c5b5b5a
2052*5a595a59598058005780568055015454805301525280510050804f804e004d814c014b4b804a03
2053*49484948804780460545418e7d359a953d00ff953d07003d46ae675d5e5e805d005c805b015a5a
2054*8059805800578056805580548053005280510050804f804e804d004c804b804a03494948488147
2055*0d4646454544444343423e8c7c359a953d00ff953d07003d46ae655a5c5b805a81598058025756
2056*56805581540353535252805102504f4f804e044d4d4c4d4c804b804a0649484847484747804600
2057*4580440343434242804105403c8b7c359a953d00ff953d05003d46ac6258815900588057015656
2058*80558054015353805200518050014f4f804e034d4c4d4c814b054a4a4949484880478046054545
2059*4444434380428041014040803f053d39897b359a953d00ff953d09003d46ac6056575756568155
2060*0154548053045252515150804f814e034d4d4c4c804b024a4a4980488147804604454444434380
2061*4280418040043f3f3e3e3d803c053b37887b359a953d00ff953d09003d46ab5e53555554548053
2062*01525280510050804f804e004d814c014b4b804a03494849488147004680450544444343424280
2063*418040013f3f803e003d803c803b073a3a3935867b359a953d00ff953d08003d46a95c51535352
2064*80510050804f804e804d004c804b804a0349494848814705464645454444804301424280410340
2065*403f3f803e003d803c803b803a80390738373633847a359a953d00ff953d09003d46a9594f5150
2066*4f4f804e044d4d4c4d4c804b804a06494848474847478046004580440043804281410940403f3f
2067*3e3e3d3d3c3c803b813a0f393938383737363635353430837a359a953d00ff953d0b003d46a857
2068*4c4e4e4d4c4d4c814b054a4a494948488047804609454544444343413f3c39803c0639383a3d3e
2069*3e3d803c803b013a3a80398038003780360135358034073333322e8179359a953d00ff953d0600
2070*3d46a7554a4c804b024a4a49804881478046044544444343804213413e3a41526b7c878b8a8071
2071*5a4336363a3b3a3a8039003880370436363536358034803309323131302f2b8079369a953d00ff
2072*953d0a003d46a652484a494849488147004680450544444343424280411540403e394a769aa395
2073*887c7b7a818e9f9f83583733388037003680358134053333323231318030802f052e297f79369a
2074*953d00ff953d05003d46a55045804705464645454444804301424280410e40403f3f3e3e384279
2075*a4966b4a3d3980350c373b425c83a3904e2f343534348033003280318130012f2f802e082d2d2c
2076*2b277c78369a953d00ff953d06003d46a34e444580440043804281412240403f3f3e3e3d3d3c3b
2077*35579d9a5f3b363c506d8b9c997c5b433837497ea571322f3280318030012f2f802e012d2d802c
2078*002b802a0528247b78369a953d00ff953d05003d46a24c4180420141418040803f023e3e3d803c
2079*803b093a3466aa773d37489024843d09aae15d3a36579e89352c802f802e002d802c002b802a80
2080*2980280527227a78369a953d00ff953d05003d46a14a3f8040003f803e003d803c813b0c3a3a39
2081*3938326aa961363e87aa893d0808503745948e332a2d802c022b2a2a8029042828272827802606
2082*25241f7877369a953d00ff953d08003d46a0483c3e3e3d803c013b3b803a80390138388037062f
2083*5ba85d3548398c3d08006d3942948328292a8029032827282780260125258024072322221d7776
2084*369a953d00ff953d05003d469f453a803b803a0539393838373780368035063043a36b3649008f
2085*3d058339469d652180270526262525242480238122072121201b7475369a953d00ff953d0e003d
2086*469e43383a393938383737363681350a34343333322e87893844ee913d0a6737599e3c20252424
2087*2323822200218020081f1f1e1d187375369a953d00ff953d0b003d469d41353737363635358034
2088*80330032803106302a53a24b39c6923d0f914c38817e1f22232222212120201f1f801e091d1d1c
2089*1c1b167175369a953d00ff953d06003d469b3e33358034053333323231318030802f052e2b897a
2090*365c943d05eb384c99371b841f011e1d801c091b1b1a1a18147074369a953d00ff953d07003d46
2091*9b3d31333280318030012f2f802e802d05283f9d4c3a46953d1a55397d5501030507090c0e1114
2092*1718191a1a19181816116e74369a953d00ff953d05003d469a3a2e8030012f2f802e002d802c00
2093*2b802a0422638d3b52963d04b6395d7b0385000d010306090c10131414106d74369a953d00ff95
2094*3d09003d4699382c2e2e2d2d802c002b802a8029062a28247d70378b963d0428404689188b0007
2095*010407076973369a953d00ff953d07003d4598362a2c2b802a80298028092928241c110d7a5838
2096*12973d03503e82348f00035f70379a953d00ff953d1a003d459633272929282827282727282722
2097*170e04000008854d3cb9973d03673b7b458f00035f70379a953d00ff953d07003d459530252727
2098*802605272621170c0382000415874543aa973d03783a7b4f8f00035f70379a953d00ff953d0d00
2099*3d45952e2325242425221a0e048500041988434691973d03793a7b4f8f00035f70379a953d00ff
2100*953d0a003d45942c2123231f14078800040b86493d00973d036f3a7a4a8f00035f70379a953d00
2101*ff953d08003d45932b201c0f038a0004077f54396d973d035a3d7f398f00035f70379a953d00ff
2102*953d06003d4592230c028d00036c6538a8963d0491444288238f00035f70379a953d00ff953d04
2103*003d458a0b8f0003507b395f963d0417385583078f00035f70379a953d00ff953d04003e45830a
2104*8f0004258b443f7f953d03683974609000035f70379a953d00ff953d04003e45840a8f0004037a
2105*643878943d04df3d438a2a9000035f70379a953d00ff953d04003e45840a9000043b8b3f3fc393
2106*3d0460376a77039000036070379a953d00ff953d04003e45840a900005057b6b385500913d04aa
2107*39498f2c8d00800104006171379a953d00ff953d04003e45840a910004258f513869903d04e13e
2108*3b825f8c000001810204006271379a953d00ff953d04003e45840a9200054b8c473968008d3d05
2109*ce3e38737c0a8a000b01010202030403006371379a953d00ff953d04003e45840a9300055e8d48
2110*3850558a3d06917e3a3a6f861a89000d010102030304040505016472379a953d00ff953d04003e
2111*45840a930007045b8e54373e6bda873d06e74c39417a831b870010010102020303040405050605
2112*026572379a953d01ff3a943d04003e45840a950005458e6c403cd1873d055d3b53886c12860006
2113*0101020203040480050806060707036572379a953d04ff4231343e913d04003e45840a96000420
2114*876138d1873d03603d825b86000201010280030604040505060607800804046672379a933d073a
2115*3affdea3702b3a903d04003e45840a9700036a6638d4873d03603d803984000201010280030804
2116*0405060607070808800904056772379a913d033932474980ff04fb9c40323e8e3d04003e45840a
2117*9700036c6538d4873d03603d803d8200000180020c03030404050606070708080909800a040767
2118*72379a8f3d053c354b9eeef382ff03ca6b303c8d3d04003e45840a9700036c6538d4873d03603d
2119*803d80000001800207030304050506060780080009800a070b0c0b076772379a8e3d03393578f0
2120*86ff03fb7735398c3d04003e45840a9700036c6538d4813d003c823d21603d803d000101020203
2121*0404050506060707080809090a0a0b0c0c0d0d096972379a8c3d073e323bc2fffffefe83ff05fe
2122*ffffc23c368b3d04003e45840a9700036c6538d4803d02393a38813d0c603d803d000203030404
2123*0506068007110808090a0a0b0b0c0c0d0d0e0e0a6a73379a8c3d02306bcb80ff01fefe83ff00fe
2124*80ff02c546358a3d04003e45840a97000a6c6538d43d3d383ec37e2f803d15603d803e00030404
2125*0505060607070808090a0a0b0c0c800d080e0e0f0f0b6a73379a8a3d093a2a75fbfffffefffefe
2126*83ff08fefffdfffff0772f3c883d04003e45840a9700126c6538d43d383bc5fffa752f3d3d603d
2127*803f00800511060607080809090a0a0b0b0c0c0d0d0e0e0f8010040c6b73369a893d0a38419cfa
2128*fffefffefffefe83ff09fefffdfffdfffa773539873d04003e45840a9700066c6538d4383bc680
2129*ff11fa752f3d603d80400005060607080809090a800b080c0c0d0e0e0f0f10108011040d6c7336
2130*9a883d02363bc580ff05fefffefffefe83ff0afefffdfffdfdffffc23c38863d04003e45840a97
2131*00056c6538c23bc682ff0efa7530623d8141000707080809090a800b070c0c0d0e0e0f0f108011
2132*8012040f6c74369a873d0c3545c5fffefdfffefffefffefe83ff05fefffdfffdfd80ff02c63b36
2133*853d04003e45840a9700046c6536e9c684ff16fa6b503d824200080809090a0a0b0b0c0d0d0e0e
2134*0f0f1080110912121314130f6e74369a863d0d2f77effffffefdfffefffefffefe83ff0cfefffd
2135*fffdfdfffdffffc54535843d04003e45840a9700046c652bef3885122266613b82430009090a0a
2136*0b0c0c0d0d0e0e0f0f1010111112131314141515116e74369a843d0f3a2a75fafffcfffefdfffe
2137*fffefffefe83ff07fefffdfffdfdfffd80ff02ef772f833d04003e45840a9700066c6431537d00
2138*0080fb100000108a96368243010a0a0b0c0c0d0e0e800f0910101112121313141415801604126e
2139*74369a833d1038419bf9fffdfcfffefdfffefffefffefe83ff0efefffdfffdfdfffdfffffcfffb
2140*752f823d04003e45840a9700046c643228f184871798cc8b378345030b0c0c0d0d0e0e0f0f1010
2141*11121213141480150016801704137075369a823d02383bc680ff0bfdfcfffefdfffefffefffefe
2142*83ff10fefffdfffdfdfffdfffffcfdfffa742b3a803d04003e45840a960005026d6434078d8434
2143*0642737e38824604800d0b0e0e0f10101111121213131480150a161617171818147175369a813d
2144*12363bc5fffdfcfffdfcfffefdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffff89b
2145*402c3039dd3e45840a92000a01010201026e6534e935e882e510e8f52275398347050d0e0e0f10
2146*1011111280130814141515161717181880191b167174369a3d3b3a3546c4fffffdfcfffdfcfffe
2147*fdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefeffca97994eee3b45840a90000c
2148*010102030302046f6536ba9460825d0e606789673b8347060f0f10101111128013091414151616
2149*1717181919811a1b16727536952e3c4178effffefffdfcfffdfcfffefdfffefffefffefe83ff0f
2150*fefffdfffdfdfffdfffffcfdfffefbfc80ff05f5153d43840a8e00020101028003060403057065
2151*37428747383d3c834807101011111212131314151516161717181819191a1a1b1b1c18727534bc
2152*93c9f2fffffbfefffdfcfffdfcfffefdfffefffefffefe83ff0ffefffdfffdfdfffdfffffcfdff
2153*fefbfc80ff0500004941840a8c0002010202800308040405050672693c4188400441874a081180
2154*1207131414151516161780180e19191a1b1b1c1c1d1d1973742a540080ff12fcfbfefffdfcfffd
2155*fcfffefdfffefffefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfcffff786f674742840a
2156*8a0000018002040303040405800603076b8e82818382848085098696450a121213141415801600
2157*1780180719191a1b1b1c1c1d801e1b1973742b10600cfffffcfbfefffdfcfffdfcfffefdfffeff
2158*fefffefe83ff18fefffdfffdfdfffdfffffcfdfffefbfdff61d8e6434742840a88001601010202
2159*03040405050606070708081a2425252626272780280b29292a2b2b2a1b111314141580160b1717
2160*1818191a1a1b1b1c1c1d811e1c1d1973752c03300029fffdfbfefffdfcfffdfcfffefdfffefffe
2161*fffefe83ff18fefffdfffdfdfffdffff009f0e09c7cf00ebd9cc834542840a8600090101020303
2162*040405050680070a0808090a07060707080909800a0a0b0c0c0d0d0e0f1214151580160c171718
2163*19191a1a1b1b1c1c1d1d821e1c1d1973742ed9f2d700ac3f2b28df2a00fffdfcfffefdfffefffe
2164*fffefe83ff18fefffdff7f0094ce35227f16efc8b159a2938c8d554442840a8400090101020303
2165*04040505068007070808090a0a0b0b0c800d0b0e0e0f1010111112121313148015091616171718
2166*19191a1b1b801c011d1d841e1c1d1973742fc5aa8f92bb89b4d0f827ab5d932bb24800fffefffe
2167*fffefe83ff1800df69d7a81de3b2a4a59d93877484e7827b6e6c384343840a8100130101020203
2168*0304040505060607070809090a0a0b800c1c0d0d0e0e0f10101111121213131414151516171718
2169*1819191a1a1b1b1c801d861e1c1d19737430b686707d8a227f778796969da7baef2be33f6e15ff
2170*fffefe81ff231200ba03ccb2b4b2a29b8879695a4a373ab8666153501f4243840a000001010203
2171*030404800514060607080809090a0a0b0b0c0c0d0d0e0f0f101011801200138014071516161717
2172*181819801a041b1b1c1d1d891e3e1d19737530aa6956636fe4333b4a5a697c8b9ba2b5b4b5d519
2173*0433bffeffff007f19d0cccdc3b1a18f7f6f5d4d3b281806fbc55e50443f0f4143840a00010280
2174*030b040405050606070808090a0a800b180c0c0d0e0e0f0f101011111212131314151516161717
2175*181819801a041b1b1c1d1d8b1e3c1d19737531a35546516bdefb091b2b3b4d606f8292a4b4c7cd
2176*c3d855aa7fff45bbece6d3c0ae9e8f7c69574734250f00efdcd27949403a0c4143840b00800316
2177*04040506060707080809090a0a0b0b0c0c0d0e0e0f101080111512121314141515161617171818
2178*19191a1b1b1c1c1d1d8d1e3c1d19737531a24f404e8fd8dfef03152537475d6c7c8fa1b4c3d3e6
2179*def0aeff9e00d5ddd6c3b19e8f7f6c5a4a37281503f2dfcfb969443f134143840a008002050304
2180*050506068007070809090a0a0b0c0c800d0b0e0f0f101011111213131414801509161717181819
2181*1a1a1b1b901c421b17727531a454457fc5d0e3f206182b3b4a5d6f7f92a4b4c3d6e0d06355ffff
2182*000800c4c3c1b2a798887663534431220f00ecdfcd7f58224243881706090a0a0b0c0c800d090e
2183*0f0f1010111212131380140915161617171818191a1a801b001c801d031e1e1f20802192223c21
2184*1e787630ac7693d5dcef0312253444576976889babb5bcbacf1dbb75fefffffefe00f8f213d7af
2185*a6a39f9085766657473728180c00d06c513a7b847b807d807e827f828001818181828283018484
2186*8285008682870188889789198a955633d70f0309182837475a697988909f9fa6b2e33533000080
2187*fe01ffff80fe00fd800016f2685f0cdcae988e8a7f7a6b5f57474d70b8313f5759598058895983
2188*5a8f5b015c5c975b165c4a3252f65b4a5a5f6e7a828d9190b7e810a3ad8ce80083fe01ffff80fe
2189*80fd1afcfdfeaa00e8e96368bc33fbdcb69a7c788582b8423536363a3a398a3802373738a13785
2190*381b3a393635353a6b97b57b7f9abedf0045eaa8c3838c5f7ffdfafcfdfd82fe01ffff80fe80fd
2191*08fcfdfdfbfefcf9fcfe80002835e3dbbdef47ead660b8afa07c5435231915120f0c0904fffbf6
2192*f2eeeae6e3e0dddbd9d6d5d3d1d1d080ce00cc80ce36d0d1d1d5d6d6d9dddee2e3e8ebf0f5f8fa
2193*0004090c0f12151b25395c87a7b1b1128550561f00439c00c6bf00fefcf9fcfbf9fcfafcfdfd82
2194*fe01ffff80fe80fd11fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fcfffc80001f7f66eef05500a5d0e1
2195*5f1cf8e0c8c7bfaba6a39a918d88847d77736f6d6b69678466366769696d7173787d82888d939a
2196*a1a6afc2c7cbea0026770cf61ad77fdf75bf00fc0000fcfdf7f7fafdfaf7f9fdfbf9fcfbf9fcfa
2197*fcfdfd82fe01ffff80fe80fd35fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7f5f9fdfbf9f8
2198*f7f6fbff0075005b9bcc35e6c9af7b595758503e30302b262121242482213724242121262b3033
2199*41595d5c5e89afd4ef53f6f9b3743800fdf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfaf7f9fdfb
2200*f9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fbfefbfaf7
2201*f5f9fdfbf9f8f7f6fafefafefcf9fefd55009995b3c3055fea98452f1e0d09f5e884e536e80009
2202*0d1a3370aa0c7825061538005f00fcfef9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7f7fafdfa
2203*f7f9fdfbf9fcfbf9fcfafcfdfd82fe01ffff80fe80fd34fcfdfdfbfefcf9fbfdf9f8fdfbf9f7fb
2204*fefbfaf7f5f9fdfbf9f8f7f6fafefafefcf9fdfcfafefdfbf9fc5500d4aa72ce55d708c0f2840c
2205*07f21d08dff4ced4c880002bfdfafcfdfbf9fbfdf9fbfefbfcf5f6f6f8f9fbfdfaf5f8f9fbfcf7
2206*f7fafdfaf7f9fdfbf9fcfbf9fcfafcfdfd82fe74386d6b00004008000000000000000000000000
2207*000000000000000000000000000000000000000000000000000000000000000000000000000000
2208*000000000000000000000000000000000000000000000000000000000000000000000000000000
2209*000000000000000000000000000000000000000000000000000000000000000000000000000000
2210*000000000000000000000000000000000000000000000000000000000000000000000000000000
2211*000000000000000000000000000000000000000000000000000000000000000000000000000000
2212*000000000000000000000000000000000000000000000000000000000000000000000000000000
2213*000000000000000000000000000000000000000000000000000000000000000000000000000000
2214*000000000000000000000000000000000000000000000000000000000f31537794a2babfb6a194
2215*744e310f0000000000000000000000000000000000000000000000000000000000000000000000
2216*000000000000000000000000000000000000000000000000000000000000000000000000000000
2217*000000000000000000000000000000000000000000000000000000000000000000000000063172
2218*a7d9f5fefffffffffffffffdf3d9a76f2d03000000000000000000000000000000000000000000
2219*000000000000000000000000000000000000000000000000000000000000000000000000000000
2220*000000000000000000000000000000000000000000000000000000000000000000000000000000
2221*000000000000287ccffafffffffffffffffffffffffffffffffffff8c678230000000000000000
2222*000000000000000000000000000000000000000000000000000000000000000000000000000000
2223*000000000000000000000000000000000000000000000000000000000000000000000000000000
2224*0000000000000000000000000000003ba4f4ffffffffffffffffffffffffffffffffffffffffff
2225*fffff09d3000000000000000000000000000000000000000000000000000000000000000000000
2226*000000000000000000000000000000000000000000000000000000000000000000000000000000
2227*00000000000000000000000000000000000000000000000027a1fdffffffffffffffffffffffff
2228*fffffffffffffffffffffffffffffff79a22000000000000000000000000000000000000000000
2229*000000000000000000000000000000000000000000000000000000000000000000000000000000
2230*0000000000000000000000000000000000000000000000000000000000000000000274ecffffff
2231*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe56a000000000000000000
2232*000000000000000000000000000000000000000000000000000000000000000000000000000000
2233*000000000000000000000000000000000000000000000000000000000000000000000000000000
2234*0000000025b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2235*ffffaf1c0000000000000000000000000000000000000000000000000000000000000000000000
2236*000000000000000000000000000000000000000000000000000000000000000000000000000000
2237*000000000000000000000000000043dfffffffffffffffffffffffffffffffffffffffffffffff
2238*ffffffffffffffffffffffffffffd93a0000000000000000000000000000000000000000000000
2239*000000000000000000000000000000000000000000000000000000000000000000000000000000
2240*0000000000000000000000000000000000000000000000005bf7ffffffffffffffffffffffffff
2241*ffffffffffffffffffffffffffffffffffffffffffffffffffffef560000000000000000000000
2242*000000000000000000000000000000000000000000000000000000000000000000000000000000
2243*000000000000000000000000000000000000000000000000000000000000000000005efaffffff
2244*fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa
2245*5b0000000000000000000000000000000000000000000000000000000000000000000000000000
2246*000000000000000000000000000000000000000000000000000000000000000000000000000000
2247*00000000005af9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2248*fffffffffffffffffffffff9550000000000000000000000000000000000000000000000000000
2249*000000000000000000000000000000000000000000000000000000000000000000000000000000
2250*00000000000000000000000000000046f8ffffffffffffffffffffffffffffffffffffffffffff
2251*fffffffffffffffffffffffffffffffffffffffffffffff03a0000000000000000000000000000
2252*000000000000000000000000000000000000000000000000000000000000000000000000000000
2253*0000000000000000000000000000000000000000000000000022e6ffffffffffffffffffffffff
2254*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd190000
2255*000000000000000000000000000000000000000000000000000000000000000000000000000000
2256*000000000000000000000000000000000000000000000000000000000000000000000006bdffff
2257*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2258*ffffffffffffffffb1020000000000000000000000000000000000000000000000000000000000
2259*000000000000000000000000000000000000000000000000000000000000000000000000000000
2260*0000000000000075ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2261*ffffffffffffffffffffffffffffffffffffffff6c000000000000000000000000000000000000
2262*000000000000000000000000000000000000000000000000000000000000000000000000000000
2263*000000000000000000000000000000000027f2ffffffffffffffffffffffffffffffffffffffff
2264*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1f000000000000
2265*000000000000000000000000000000000000000000000000000000000000000000000000000000
2266*00000000000000000000000000000000000000000000000000000000a9ffffffffffffffffffff
2267*ffffffffffffffffffffffffe7b68d7f797f90bceaffffffffffffffffffffffffffffffffffff
2268*ffffffff9d00000000000000000000000000000000000000000000000000000000000000000000
2269*000000000000000000000000000000000000000000000000000000000000000000000000000037
2270*fcfffffffffffffffffffffffffffffffffffffffaaa5012000000000000001356aefdffffffff
2271*fffffffffffffffffffffffffffffff72b00000000000000000000000000000000000000000000
2272*000000000000000000000000000000000000000000000000000000000000000000000000000000
2273*00000000000000000000acffffffffffffffffffffffffffffffffffffffb43700000000000000
2274*0000000000003bbbffffffffffffffffffffffffffffffffffffff9e0000000000000000000000
2275*000000000000000000000000000000000000000000000000000000000000000000000000000000
2276*00000000000000000000000000000000000000002dfbffffffffffffffffffffffffffffffffff
2277*f66c000000000000000000000000000000000078fcfffffffffffffffffffffffffffffffffff5
2278*210000000000000000000000000000000000000000000000000000000000000000000000000000
2279*0000000000000000000000000000000000000000000000000000000000000088ffffffffffffff
2280*ffffffffffffffffffffee460000000000000000000000000000000000000053f0ffffffffffff
2281*ffffffffffffffffffffff79000000000000000000000000000000000000000000000000000000
2282*000000000000000000000000000000000000000000000000000000000000000000000000000000
2283*000008d9fffffffffffffffffffffffffffffffff7450000000000000000000000000000000000
2284*0000000052faffffffffffffffffffffffffffffffffce05000000000000000000000000000000
2285*000000000000000000000000000000000000000000000000000000000000000000000000000000
2286*000000000000000000000000003fffffffffffffffffffffffffffffffffff6c00000000000000
2287*0000000000000000000000000000000076fffffffffffffffffffffffffffffffffc3200000000
2288*000000000000000000000000000000000000000000000000000000000000000000000000000000
2289*0000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffff
2290*ffffb000000000000000000000000000000000000000000000000001bdffffffffffffffffffff
2291*ffffffffffff710000000000000000000000000000000000000000000000000000000000000000
2292*0000000000000000000000000000000000000000000000000000000000000000000001b8ffffff
2293*fffffffffffffffffffffffff62b00000000000000000000000000000000000000000000000000
2294*37fbffffffffffffffffffffffffffffffab000000000000000000000000000000000000000000
2295*000000000000000000000000000000000000000000000000000000000000000000000000000000
2296*0000000000000ce6ffffffffffffffffffffffffffffffa1000000000000000000000000000000
2297*000000000000000000000000adffffffffffffffffffffffffffffffdf08000000000000000000
2298*000000000000000000000000000000000000000000000000000000000000000000000000000000
2299*000000000000000000000000000000000031fcfffffffffffffffffffffffffffffe4100000000
2300*00000000000000000000000000000000000000000000004fffffffffffffffffffffffffffffff
2301*f72100000000000000000000000000000000000000000000000000000000000000000000000000
2302*0000000000000000000000000000000000000000000000000000000052ffffffffffffffffffff
2303*ffffffffffdb0800000000000000000000000000000000000000000000000000000011e7ffffff
2304*ffffffffffffffffffffffff460000000000000000000000000000000000000000000000000000
2305*000000000000000000000000000000000000000000000000000000000000000000000000000000
2306*69ffffffffffffffffffffffffffffffa600000000000000000000000000000000000000000000
2307*00000000000000b5ffffffffffffffffffffffffffffff5e000000000000000000000000000000
2308*000000000000000000000000000000000000000000000000000000000000000000000000000000
2309*00000000000000000000007fffffffffffffffffffffffffffffff810000000000000000000000
2310*0000000000000000000000000000000000008effffffffffffffffffffffffffffff6c00000000
2311*000000000000000000000000000000000000000000000000000000000000000000000000000000
2312*0000000000000000000000000000000000000000000080ffffffffffffffffffffffffffffff64
2313*000000000000000000000000000000000000000000000000000000000075ffffffffffffffffff
2314*ffffffffffff800000000000000000000000000000000000000000000000000000000000000000
2315*00000000000000000000000000000000000000000000000000000000000000000080ffffffffff
2316*ffffffffffffffffffff6200000000000000000000000000000000000000000000000000000000
2317*0063ffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000
2318*000000000000000000000000000000000000000000000000000000000000000000000000000000
2319*000000000080ffffffffffffffffffffffffffffff630000000000000000000000000000000000
2320*00000000000000000000000063ffffffffffffffffffffffffffffff8000000000000000000000
2321*000000000000000000000000000000000000000000000000000000000000000000000000000000
2322*0000000000000000000000000000000080ffffffffffffffffffffffffffffff63000000000000
2323*000000000000000000000000000000000000000000000063ffffffffffffffffffffffffffffff
2324*800000000000000000000000000000000000000000000000000000000000000000000000000000
2325*00000000000000000000000000000000000000000000000000000080ffffffffffffffffffffff
2326*ffffffff63000000000000000000000000000000000000000000000000000000000063ffffffff
2327*ffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000
2328*000000000000000000000000000000000000000000000000000000000000000000000000000080
2329*ffffffffffffffffffffffffffffff630000000000000000000000000000000000000000000000
2330*00000000000063ffffffffffffffffffffffffffffff8000000000000000000000000000000000
2331*000000000000000000000000000000000000000000000000000000000000000000000000000000
2332*0000000000000000000080ffffffffffffffffffffffffffffff63000000000000000000000000
2333*000000000000000000000000000000000063ffffffffffffffffffffffffffffff800000000000
2334*000000000000000000000000000000000000000000000000000000000000000000000000000000
2335*00000000000000000000000000000000000000000080ffffffffffffffffffffffffffffff6300
2336*0000000000000000000000000000000000000000000000000000000063ffffffffffffffffffff
2337*ffffffffff80000000000000000000000000000000000000000000000000000000000000000000
2338*000000000000000000000000000000000000000000000000000000000000000080ffffffffffff
2339*ffffffffffffffffff630000000000000000000000000000000000000000000000000000000000
2340*63ffffffffffffffffffffffffffffff8000000000000000000000000000000000000000000000
2341*000000000000000000000000000000000000000000000000000000000000000000000000000000
2342*0000000080ffffffffffffffffffffffffffffff63000000000000000000000000000000000000
2343*000000000000000000000063ffffffffffffffffffffffffffffff800000000000000000000000
2344*000000000000000000000000000000000000000000000000000000000000000000000000000000
2345*00000000000000000000000000000080ffffffffffffffffffffffffffffff6300000000000000
2346*0000000000000000000000000000000000000000000063ffffffffffffffffffffffffffffff80
2347*000000000000000000000000000000000000000000000000000000000000000000000000000000
2348*000000000000000000000000000000000000000000000000000080ffffffffffffffffffffffff
2349*ffffff63000000000000000000000000000000000000000000000000000000000063ffffffffff
2350*ffffffffffffffffffff8000000000000000000000000000000000000000000000000000000000
2351*000000000000000000000000000000000000000000000000000000000000000000000000007aff
2352*ffffffffffffffffffffffffffff5c000000000000000000000000000000000000000000000000
2353*00000000005cffffffffffffffffffffffffffffff7a0000000000000000000000000000000000
2354*000000000000000000000000000000000000000000000000000000000000000000000000000000
2355*000000002145494844a4ffffffffffffffffffffffffffffff8f45484848484848484848484848
2356*484848484848484848484848484848458fffffffffffffffffffffffffffffffa4444848493505
2357*000000000000000000000000000000000000000000000000000000000000000000000000000000
2358*000000000000000000000000000892f2ffffffffffffffffffffffffffffffffffffffffffffff
2359*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2360*fffffffffffffffffffbcd2d000000000000000000000000000000000000000000000000000000
2361*0000000000000000000000000000000000000000000000007cffffffffffffffffffffffffffff
2362*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2363*ffffffffffffffffffffffffffffffffffffffffffffd910000000000000000000000000000000
2364*0000000000000000000000000000000000000000000000000000000000000000000006d4ffffff
2365*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2366*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5500000000
2367*000000000000000000000000000000000000000000000000000000000000000000000000000000
2368*0000000000000ff1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2369*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2370*ffffffffffff660000000000000000000000000000000000000000000000000000000000000000
2371*00000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffff
2372*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2373*ffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000000000
2374*000000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffff
2375*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2376*ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000
2377*000000000000000000000000000000000000000000000000000000000000000000000000000000
2378*0ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2379*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2380*630000000000000000000000000000000000000000000000000000000000000000000000000000
2381*00000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffff
2382*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2383*ffffffffffffffffffffff63000000000000000000000000000000000000000000000000000000
2384*000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffff
2385*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2386*ffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000000000000000
2387*0000000000000000000000000000000000000000000000000000000000000000000ff0ffffffff
2388*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2389*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000
2390*000000000000000000000000000000000000000000000000000000000000000000000000000000
2391*00000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2392*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2393*ffffffffff63000000000000000000000000000000000000000000000000000000000000000000
2394*000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffff
2395*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2396*ffffffffffffffffffffffffffffffff6300000000000000000000000000000000000000000000
2397*0000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffff
2398*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2399*ffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000000000
2400*00000000000000000000000000000000000000000000000000000000000000000000000000000f
2401*f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2402*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63
2403*000000000000000000000000000000000000000000000000000000000000000000000000000000
2404*000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffff
2405*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2406*ffffffffffffffffffff6300000000000000000000000000000000000000000000000000000000
2407*0000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffff
2408*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2409*ffffffffffffffffffffffffffffffffffffffffff630000000000000000000000000000000000
2410*00000000000000000000000000000000000000000000000000000000000000000ff0ffffffffff
2411*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2412*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000
2413*000000000000000000000000000000000000000000000000000000000000000000000000000000
2414*000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2415*f0ba8c6e62647ba4dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2416*ffffffff6300000000000000000000000000000000000000000000000000000000000000000000
2417*0000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffff
2418*ffffffffffffffffffcf6a1c000000000000000944a4f9ffffffffffffffffffffffffffffffff
2419*ffffffffffffffffffffffffffffff630000000000000000000000000000000000000000000000
2420*00000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffff
2421*ffffffffffffffffffffffffffffffffffffee71090000000000000000000000003abfffffffff
2422*ffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000000000
2423*000000000000000000000000000000000000000000000000000000000000000000000000000ff0
2424*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd231000000000000000000
2425*000000000000068cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300
2426*000000000000000000000000000000000000000000000000000000000000000000000000000000
2427*0000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffd0
2428*1e00000000000000000000000000000000000074ffffffffffffffffffffffffffffffffffffff
2429*ffffffffffffffffff630000000000000000000000000000000000000000000000000000000000
2430*00000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffff
2431*ffffffffffffffffffe11f000000000000000000000000000000000000000094ffffffffffffff
2432*ffffffffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000
2433*000000000000000000000000000000000000000000000000000000000000000ff0ffffffffffff
2434*fffffffffffffffffffffffffffffffffffffffe4d000000000000000000000000000000000000
2435*00000007c9ffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000
2436*000000000000000000000000000000000000000000000000000000000000000000000000000000
2437*0000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffa50000000000000000
2438*00000000000000000000000000000041fbffffffffffffffffffffffffffffffffffffffffffff
2439*ffffff630000000000000000000000000000000000000000000000000000000000000000000000
2440*00000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffff
2441*fffa2f000000000000000000000000000000000000000000000000b3ffffffffffffffffffffff
2442*ffffffffffffffffffffffffffff63000000000000000000000000000000000000000000000000
2443*000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffff
2444*ffffffffffffffffffffffffb70000000000000000000000000000000000000000000000000054
2445*ffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000000000
2446*0000000000000000000000000000000000000000000000000000000000000000000000000ff0ff
2447*ffffffffffffffffffffffffffffffffffffffffffffff6e000000000000000000000000000000
2448*0000000000000000000013ebffffffffffffffffffffffffffffffffffffffffffffffff630000
2449*000000000000000000000000000000000000000000000000000000000000000000000000000000
2450*00000000000000000ff0fffffffffffffffffffffffffffffffffffffffffffffffc3800000000
2451*00000000000000000000000000000000000000000000bbffffffffffffffffffffffffffffffff
2452*ffffffffffffffff63000000000000000000000000000000000000000000000000000000000000
2453*000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffff
2454*fffffffffff416000000000000000000000000000000000000000000000000000094ffffffffff
2455*ffffffffffffffffffffffffffffffffffffff6300000000000000000000000000000000000000
2456*0000000000000000000000000000000000000000000000000000000000000ff0ffffffffffffff
2457*ffffffffffffffffffffffffffffffffe009000000000000000000000000000000000000000000
2458*00000000007fffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000
2459*000000000000000000000000000000000000000000000000000000000000000000000000000000
2460*00000ff0ffffffffffffffffffffffffffffffffffffffffffffffd60700000000000000000000
2461*000000000000000000000000000000007effffffffffffffffffffffffffffffffffffffffffff
2462*ffff63000000000000000000000000000000000000000000000000000000000000000000000000
2463*000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffef
2464*0f000000000000000000000000000000000000000000000000000089ffffffffffffffffffffff
2465*ffffffffffffffffffffffffff6300000000000000000000000000000000000000000000000000
2466*0000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffff
2467*fffffffffffffffffffff82a0000000000000000000000000000000000000000000000000000aa
2468*ffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000000000000000
2469*00000000000000000000000000000000000000000000000000000000000000000000000ff0ffff
2470*ffffffffffffffffffffffffffffffffffffffffffff5b00000000000000000000000000000000
2471*00000000000000000007dcffffffffffffffffffffffffffffffffffffffffffffffff63000000
2472*000000000000000000000000000000000000000000000000000000000000000000000000000000
2473*000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffa00000000000
2474*000000000000000000000000000000000000000037fcffffffffffffffffffffffffffffffffff
2475*ffffffffffffff6300000000000000000000000000000000000000000000000000000000000000
2476*0000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffff
2477*ffffffffffea1800000000000000000000000000000000000000000000000093ffffffffffffff
2478*ffffffffffffffffffffffffffffffffffff630000000000000000000000000000000000000000
2479*00000000000000000000000000000000000000000000000000000000000ff0ffffffffffffffff
2480*ffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000
2481*000020f0ffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000
2482*000000000000000000000000000000000000000000000000000000000000000000000000000000
2483*000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffea22000000000000000000
2484*000000000000000000000000009effffffffffffffffffffffffffffffffffffffffffffffffff
2485*ff6300000000000000000000000000000000000000000000000000000000000000000000000000
2486*0000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffff
2487*ffb70400000000000000000000000000000000000000005afeffffffffffffffffffffffffffff
2488*ffffffffffffffffffffffff630000000000000000000000000000000000000000000000000000
2489*00000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffff
2490*ffffffffffffffffffffffffff910000000000000000000000000000000000000044f0ffffffff
2491*ffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000000000000000
2492*000000000000000000000000000000000000000000000000000000000000000000000ff0ffffff
2493*ffffffffffffffffffffffffffffffffffffffffffffffffff9306000000000000000000000000
2494*000000004aefffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000
2495*000000000000000000000000000000000000000000000000000000000000000000000000000000
2496*0000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd2d
2497*000000000000000000000000000779f9ffffffffffffffffffffffffffffffffffffffffffffff
2498*ffffffffffff630000000000000000000000000000000000000000000000000000000000000000
2499*00000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffff
2500*fffffffffffffffffffff28e150000000000000000000042c8ffffffffffffffffffffffffffff
2501*ffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000000000
2502*000000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffff
2503*ffffffffffffffffffffffffffffffffffffffffffffff4900000000000000000000a3ffffffff
2504*ffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000
2505*000000000000000000000000000000000000000000000000000000000000000000000000000000
2506*0ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4900000000
2507*0000000000009cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2508*630000000000000000000000000000000000000000000000000000000000000000000000000000
2509*00000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffff
2510*ffffffffffff48000000000000000000009cffffffffffffffffffffffffffffffffffffffffff
2511*ffffffffffffffffffffff63000000000000000000000000000000000000000000000000000000
2512*000000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffff
2513*ffffffffffffffffffffffffffffffffff48000000000000000000009cffffffffffffffffffff
2514*ffffffffffffffffffffffffffffffffffffffffffff6300000000000000000000000000000000
2515*0000000000000000000000000000000000000000000000000000000000000000000ff0ffffffff
2516*ffffffffffffffffffffffffffffffffffffffffffffffffffffffff4800000000000000000000
2517*9cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000
2518*000000000000000000000000000000000000000000000000000000000000000000000000000000
2519*00000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2520*48000000000000000000009cffffffffffffffffffffffffffffffffffffffffffffffffffffff
2521*ffffffffff63000000000000000000000000000000000000000000000000000000000000000000
2522*000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffff
2523*ffffffffffffffffffffff48000000000000000000009cffffffffffffffffffffffffffffffff
2524*ffffffffffffffffffffffffffffffff6300000000000000000000000000000000000000000000
2525*0000000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffff
2526*ffffffffffffffffffffffffffffffffffffffffffff48000000000000000000009cffffffffff
2527*ffffffffffffffffffffffffffffffffffffffffffffffffffffff630000000000000000000000
2528*00000000000000000000000000000000000000000000000000000000000000000000000000000f
2529*f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff480000000000
2530*00000000009cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63
2531*000000000000000000000000000000000000000000000000000000000000000000000000000000
2532*000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffff
2533*ffffffffff48000000000000000000009cffffffffffffffffffffffffffffffffffffffffffff
2534*ffffffffffffffffffff6300000000000000000000000000000000000000000000000000000000
2535*0000000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffff
2536*ffffffffffffffffffffffffffffffff48000000000000000000009cffffffffffffffffffffff
2537*ffffffffffffffffffffffffffffffffffffffffff630000000000000000000000000000000000
2538*00000000000000000000000000000000000000000000000000000000000000000ff0ffffffffff
2539*ffffffffffffffffffffffffffffffffffffffffffffffffffffff46000000000000000000009c
2540*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000
2541*000000000000000000000000000000000000000000000000000000000000000000000000000000
2542*000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff51
2543*090e0e0e0e0e0e0e0e059dffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2544*ffffffff6300000000000000000000000000000000000000000000000000000000000000000000
2545*0000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffff
2546*ffffffffffffffffffff8147505050505050504f46b9ffffffffffffffffffffffffffffffffff
2547*ffffffffffffffffffffffffffffff630000000000000000000000000000000000000000000000
2548*00000000000000000000000000000000000000000000000000000ff0ffffffffffffffffffffff
2549*ffffffffffffffffffffffffffffffffffffffffff844b53535353535353524cbcffffffffffff
2550*ffffffffffffffffffffffffffffffffffffffffffffffffffff63000000000000000000000000
2551*000000000000000000000000000000000000000000000000000000000000000000000000000ff0
2552*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff834a5252525252
2553*5252514bbbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6300
2554*000000000000000000000000000000000000000000000000000000000000000000000000000000
2555*0000000000000000000ff0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2556*ffffffff8148505050505050504f49baffffffffffffffffffffffffffffffffffffffffffffff
2557*ffffffffffffffffff630000000000000000000000000000000000000000000000000000000000
2558*00000000000000000000000000000000000000000ff0ffffffffffffffffffffffffffffffffff
2559*ffffffffffffffffffffffffffffff864f575757575757575650bdffffffffffffffffffffffff
2560*ffffffffffffffffffffffffffffffffffffffff63000000000000000000000000000000000000
2561*000000000000000000000000000000000000000000000000000000000000000cf0ffffffffffff
2562*ffffffffffffffffffffffffffffffffffffffffffffffffffffeae0e2e2e2e2e2e2e2e2e0f3ff
2563*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000000000000000
2564*000000000000000000000000000000000000000000000000000000000000000000000000000000
2565*00000b3ef5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2566*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2567*ffffff760100000000000000000000000000000000000000000000000000000000000000000000
2568*000000000000000000000000224960f5ffffffffffffffffffffffffffffffffffffffffffffff
2569*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2570*ffffffffffffffffffffffffffff983a1500000000000000000000000000000000000000000000
2571*000000000000000000000000000000000000000000002f575462f6ffffffffffffffffffffffff
2572*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2573*ffffffffffffffffffffffffffffffffffffffffffffffffff984f531f00000000000000000000
2574*00000000000000000000000000000000000000000000000000000308121c252b538081838ff8ff
2575*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2576*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb67d82
2577*7b44282319100602000000000000000000000000000000000000000000000002091825303c464e
2578*515455618d8e8c8992f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2579*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2580*ffffffffffffffffb9848c8f85595553504d43392d231407010000000000000000000000000002
2581*102234444e53575755545353534f6c8d8a8a8891f8ffffffffffffffffffffffffffffffffffff
2582*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2583*ffffffffffffffffffffffffffffffffffffffb8838a8a8a5f5053535355565756524d40301e0c
2584*00000000000000000e2a43515657555353525252525252524e6d8e8a8a8891f8ffffffffffffff
2585*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2586*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb8838a8a8b60505252
2587*525252525253535557554f3e23080000000b2e50575553525252525252525252525252505d8a8b
2588*8a8891f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2589*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2590*ffffb8838a8c8355515252525252525252525252525356564b2104003b5b535252525252525252
2591*525252525252525250738e8a8891f8ffffffffffffffffffffffffffffffffffffffffffffffff
2592*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2593*ffffffffffffffffffffffffffb8838b8c674f5252525252525252525252525252525255552600
2594*2d5356535252525252525252525252525252525154798d8991f8ffffffffffffffffffffffffff
2595*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2596*ffffffffffffffffffffffffffffffffffffffffffffffffb8858c6c5052525252525252525252
2597*52525252525253574a1b0000153e52575553535252525252525252525252525152708894f8ffff
2598*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2599*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc7f6650
2600*52525252525252525252525252535456564f350d0000000000122a3f4f54575654535352525252
2601*5252525251505d7debffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2602*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2603*ffffffffffffff9b534f5252525252525252525353555657534c3b240c00000000000000000001
2604*091c2a38484f52565756555453535352524f4ba0ffffffffffffffffffffffffffffffffffffff
2605*ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
2606*ffffffffffffffffffffffffffffffffffde564e52525353535455565855514e43352617070000
2607*000000000000000000000000000000030b17242e38414b4f51545658575452a9f1fbfbfcfffffd
2608*fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfc
2609*fcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfdfffffbfbfcfad16f5057585653514f493e35
2610*2b2114080200000000000000000000000000000000000000000000000000000001040b131c242b
2611*32393e3f5a6c6d7181919da5a7a5a3a2a1a0a0a09f9f9f9f9f9f9f9f9f9e9e9e9e9e9e9e9e9e9e
2612*9e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9f9f9f9f9f9fa0a0a0a0a1a2a3a6a7a39b8d7c6f6d6d6143
2613*39383029221a120904010000000000000000000000000000000000000000000000000000000000
2614*00000000000000000000000000010201040a0f111b243642576873797d82808084848384858585
2615*85868787878787878787878787878787878787878787878685858585848384837f80817b787164
2616*523f312018100d0802000101000000000000000000000000000000000000000000000000000000
2617*000000000000000000000000000000000000000000000000000000000000000000000000020d1c
2618*2736414c5355575d61605f5f62646363636363626262626262626262636363636364615e5f6061
2619*5b575452493e322518090100000000000000000000000000000000000000000000000000000000
2620*000000000000000000000000000000000000000000000000000000000000000000000000000000
2621*0000000000000000000000000000030b141d252b31383e43494b4c4d4d4f505050505050505050
2622*4e4d4d4c4b46423c373029231b1208030000000000000000000000000000000000000000000000
2623*000000000000000000000000000000000000000000000000000000000000000000000000000000
2624*0000000000000000000000000000000000000000000000000000000000000003070c0f14151b20
2625*1f252a292929292929292a231f201915120e0a0702000000000000000000000000000000000000
2626*00000000000000000000000000000000000000000000000000000000000000
2627newhex
2628*
2629rmfile ./mac/allmydata.icns
2630hunk ./mac/allmydata_tahoe.py 1
2631-from allmydata.util import pkgresutil # override the pkg_resources zip provider for py2app deployment
2632-pkgresutil.install() # this is done before nevow is imported by depends
2633-import depends # import dependencies so that py2exe finds them
2634-_junk = depends # appease pyflakes
2635-
2636-import sys
2637-
2638-from twisted.python import usage
2639-
2640-class ReplOptions(usage.Options):
2641-    pass
2642-
2643-def repl(config, stdout, stderr):
2644-    import code
2645-    return code.interact()
2646-
2647-class DbgRunnerExtension(object):
2648-    subCommands = [
2649-        ["dbgrepl", None, ReplOptions, "Open a python interpreter"],
2650-        ]
2651-    dispatch = {
2652-        "dbgrepl": repl,
2653-        }
2654-
2655-class FuseOptions(usage.Options):
2656-    def parseOptions(self, args):
2657-        self.args = args
2658-
2659-def fuse(config, stdout, stderr):
2660-    import tahoefuse
2661-    tahoefuse.main(config.args)
2662-
2663-class FuseRunnerExtension(object):
2664-    subCommands = [
2665-        ["fuse", None, FuseOptions, "Mount a filesystem via fuse"],
2666-        ]
2667-    dispatch = {
2668-        "fuse": fuse,
2669-        }
2670-
2671-def main(argv):
2672-    if len(argv) == 1:
2673-        # then we were given no args; do default mac node startup
2674-        from allmydata.gui.macapp import run_macapp
2675-        sys.exit(run_macapp())
2676-    else:
2677-        # given any cmd line args, do 'tahoe' cli behaviour
2678-        from allmydata.scripts import runner
2679-        #runner_extensions = [DbgRunnerExtension, FuseRunnerExtension, ]
2680-        runner_extensions = [FuseRunnerExtension, ]
2681-        sys.exit(runner.runner(argv[1:],
2682-                               install_node_control=False,
2683-                               additional_commands=runner_extensions,
2684-                               ))
2685-
2686-if __name__ == '__main__':
2687-    main(sys.argv)
2688-
2689rmfile ./mac/allmydata_tahoe.py
2690hunk ./mac/depends.py 1
2691-
2692-# nevow requires all these for its voodoo module import time adaptor registrations
2693-from nevow import accessors, appserver, static, rend, url, util, query, i18n, flat
2694-from nevow import guard, stan, testutil, context
2695-from nevow.flat import flatmdom, flatstan, twist
2696-from formless import webform, processors, annotate, iformless
2697-from decimal import Decimal
2698-
2699-
2700-#if sys.platform in ['darwin', ]:
2701-from nevow.flat import flatsax
2702-from xml.parsers import expat
2703-from xml.sax import expatreader
2704-junk = [ flatsax, expat, expatreader, ]
2705-
2706-try:
2707-    # these build hints are needed for nevow/xml on otto's 10.4 / py2.4
2708-    # environment.  they are broken on zandr's 10.5/py2.5 env, but are
2709-    # also unnecessary.
2710-    from xml.sax import sax2exts
2711-    from xml.sax.drivers2 import drv_pyexpat, drv_xmlproc
2712-    junk = [ sax2exts, drv_pyexpat, drv_xmlproc, ]
2713-except:
2714-    pass
2715-
2716-
2717-
2718-import allmydata.web
2719-
2720-# junk to appease pyflakes's outrage at py2exe's needs
2721-junk = [
2722-    accessors, appserver, static, rend, url, util, query, i18n, flat, guard, stan, testutil,
2723-    context, flatmdom, flatstan, twist, webform, processors, annotate, iformless, Decimal,
2724-    allmydata,
2725-    ]
2726-
2727rmfile ./mac/depends.py
2728hunk ./mac/fuse.py 1
2729-#
2730-#    Copyright (C) 2001  Jeff Epler  <jepler@unpythonic.dhs.org>
2731-#    Copyright (C) 2006  Csaba Henk  <csaba.henk@creo.hu>
2732-#
2733-#    This program can be distributed under the terms of the GNU LGPL.
2734-#    See the file COPYING.
2735-#
2736-# On 2009-09-21 Csaba Henk granted permission for this file to be
2737-# licensed under the same terms as Tahoe-LAFS itself.
2738-#
2739-
2740-
2741-# suppress version mismatch warnings
2742-try:
2743-    import warnings
2744-    warnings.filterwarnings('ignore',
2745-                            'Python C API version mismatch',
2746-                            RuntimeWarning,
2747-                            )
2748-except:
2749-    pass
2750-
2751-from string import join
2752-import sys
2753-from errno import *
2754-from os import environ
2755-import re
2756-from fuseparts import __version__
2757-from fuseparts._fuse import main, FuseGetContext, FuseInvalidate
2758-from fuseparts._fuse import FuseError, FuseAPIVersion
2759-from fuseparts.subbedopts import SubOptsHive, SubbedOptFormatter
2760-from fuseparts.subbedopts import SubbedOptIndentedFormatter, SubbedOptParse
2761-from fuseparts.subbedopts import SUPPRESS_HELP, OptParseError
2762-from fuseparts.setcompatwrap import set
2763-
2764-
2765-##########
2766-###
2767-###  API specification API.
2768-###
2769-##########
2770-
2771-# The actual API version of this module
2772-FUSE_PYTHON_API_VERSION = (0, 2)
2773-
2774-def __getenv__(var, pattern = '.', trans = lambda x: x):
2775-    """
2776-    Fetch enviroment variable and optionally transform it. Return `None` if
2777-    variable is unset. Bail out if value of variable doesn't match (optional)
2778-    regex pattern.
2779-    """
2780-
2781-    if var not in environ:
2782-        return None
2783-    val = environ[var]
2784-    rpat = pattern
2785-    if not isinstance(rpat, type(re.compile(''))):
2786-        rpat = re.compile(rpat)
2787-    if not rpat.search(val):
2788-        raise RuntimeError("env var %s doesn't match required pattern %s" % \
2789-                           (var, `pattern`))
2790-    return trans(val)
2791-
2792-def get_fuse_python_api():
2793-    if fuse_python_api:
2794-        return fuse_python_api
2795-    elif compat_0_1:
2796-        # deprecated way of API specification
2797-        return (0,1)
2798-
2799-def get_compat_0_1():
2800-    return get_fuse_python_api() == (0, 1)
2801-
2802-# API version to be used
2803-fuse_python_api = __getenv__('FUSE_PYTHON_API', '^[\d.]+$',
2804-                              lambda x: tuple([int(i) for i in x.split('.')]))
2805-
2806-# deprecated way of API specification
2807-compat_0_1 = __getenv__('FUSE_PYTHON_COMPAT', '^(0.1|ALL)$', lambda x: True)
2808-
2809-fuse_python_api = get_fuse_python_api()
2810-
2811-##########
2812-###
2813-###  Parsing for FUSE.
2814-###
2815-##########
2816-
2817-
2818-
2819-class FuseArgs(SubOptsHive):
2820-    """
2821-    Class representing a FUSE command line.
2822-    """
2823-
2824-    fuse_modifiers = {'showhelp': '-ho',
2825-                      'showversion': '-V',
2826-                      'foreground': '-f'}
2827-
2828-    def __init__(self):
2829-
2830-        SubOptsHive.__init__(self)
2831-
2832-        self.modifiers = {}
2833-        self.mountpoint = None
2834-
2835-        for m in self.fuse_modifiers:
2836-            self.modifiers[m] = False
2837-
2838-    def __str__(self):
2839-        return '\n'.join(['< on ' + str(self.mountpoint) + ':',
2840-                          '  ' + str(self.modifiers), '  -o ']) + \
2841-               ',\n     '.join(self._str_core()) + \
2842-               ' >'
2843-
2844-    def getmod(self, mod):
2845-        return self.modifiers[mod]
2846-
2847-    def setmod(self, mod):
2848-        self.modifiers[mod] = True
2849-
2850-    def unsetmod(self, mod):
2851-        self.modifiers[mod] = False
2852-
2853-    def mount_expected(self):
2854-        if self.getmod('showhelp'):
2855-            return False
2856-        if self.getmod('showversion'):
2857-            return False
2858-        return True
2859-
2860-    def assemble(self):
2861-        """Mangle self into an argument array"""
2862-
2863-        self.canonify()
2864-        args = [sys.argv and sys.argv[0] or "python"]
2865-        if self.mountpoint:
2866-            args.append(self.mountpoint)
2867-        for m, v in self.modifiers.iteritems():
2868-            if v:
2869-                args.append(self.fuse_modifiers[m])
2870-
2871-        opta = []
2872-        for o, v in self.optdict.iteritems():
2873-                opta.append(o + '=' + v)
2874-        opta.extend(self.optlist)
2875-
2876-        if opta:
2877-            args.append("-o" + ",".join(opta))
2878-
2879-        return args
2880-
2881-    def filter(self, other=None):
2882-        """
2883-        Same as for SubOptsHive, with the following difference:
2884-        if other is not specified, `Fuse.fuseoptref()` is run and its result
2885-        will be used.
2886-        """
2887-
2888-        if not other:
2889-            other = Fuse.fuseoptref()
2890-
2891-        return SubOptsHive.filter(self, other)
2892-
2893-
2894-
2895-class FuseFormatter(SubbedOptIndentedFormatter):
2896-
2897-    def __init__(self, **kw):
2898-        if not 'indent_increment' in kw:
2899-            kw['indent_increment'] = 4
2900-        SubbedOptIndentedFormatter.__init__(self, **kw)
2901-
2902-    def store_option_strings(self, parser):
2903-        SubbedOptIndentedFormatter.store_option_strings(self, parser)
2904-        # 27 is how the lib stock help appears
2905-        self.help_position = max(self.help_position, 27)
2906-        self.help_width = self.width - self.help_position
2907-
2908-
2909-class FuseOptParse(SubbedOptParse):
2910-    """
2911-    This class alters / enhances `SubbedOptParse` so that it's
2912-    suitable for usage with FUSE.
2913-
2914-    - When adding options, you can use the `mountopt` pseudo-attribute which
2915-      is equivalent with adding a subopt for option ``-o``
2916-      (it doesn't require an option argument).
2917-
2918-    - FUSE compatible help and version printing.
2919-
2920-    - Error and exit callbacks are relaxed. In case of FUSE, the command
2921-      line is to be treated as a DSL [#]_. You don't wanna this module to
2922-      force an exit on you just because you hit a DSL syntax error.
2923-
2924-    - Built-in support for conventional FUSE options (``-d``, ``-f`, ``-s``).
2925-      The way of this can be tuned by keyword arguments, see below.
2926-
2927-    .. [#] http://en.wikipedia.org/wiki/Domain-specific_programming_language
2928-
2929-    Keyword arguments for initialization
2930-    ------------------------------------
2931-
2932-    standard_mods
2933-      Boolean [default is `True`].
2934-      Enables support for the usual interpretation of the ``-d``, ``-f``
2935-      options.
2936-
2937-    fetch_mp
2938-      Boolean [default is `True`].
2939-      If it's True, then the last (non-option) argument
2940-      (if there is such a thing) will be used as the FUSE mountpoint.
2941-
2942-    dash_s_do
2943-      String: ``whine``, ``undef``, or ``setsingle`` [default is ``whine``].
2944-      The ``-s`` option -- traditionally for asking for single-threadedness --
2945-      is an oddball: single/multi threadedness of a fuse-py fs doesn't depend
2946-      on the FUSE command line, we have direct control over it.
2947-
2948-      Therefore we have two conflicting principles:
2949-
2950-      - *Orthogonality*: option parsing shouldn't affect the backing `Fuse`
2951-        instance directly, only via its `fuse_args` attribute.
2952-
2953-      - *POLS*: behave like other FUSE based fs-es do. The stock FUSE help
2954-        makes mention of ``-s`` as a single-threadedness setter.
2955-
2956-      So, if we follow POLS and implement a conventional ``-s`` option, then
2957-      we have to go beyond the `fuse_args` attribute and set the respective
2958-      Fuse attribute directly, hence violating orthogonality.
2959-
2960-      We let the fs authors make their choice: ``dash_s_do=undef`` leaves this
2961-      option unhandled, and the fs author can add a handler as she desires.
2962-      ``dash_s_do=setsingle`` enables the traditional behaviour.
2963-
2964-      Using ``dash_s_do=setsingle`` is not problematic at all, but we want fs
2965-      authors be aware of the particularity of ``-s``, therefore the default is
2966-      the ``dash_s_do=whine`` setting which raises an exception for ``-s`` and
2967-      suggests the user to read this documentation.
2968-
2969-    dash_o_handler
2970-      Argument should be a SubbedOpt instance (created with
2971-      ``action="store_hive"`` if you want it to be useful).
2972-      This lets you customize the handler of the ``-o`` option. For example,
2973-      you can alter or suppress the generic ``-o`` entry in help output.
2974-    """
2975-
2976-    def __init__(self, *args, **kw):
2977-
2978-        self.mountopts = []
2979-
2980-        self.fuse_args = \
2981-            'fuse_args' in kw and kw.pop('fuse_args') or FuseArgs()
2982-        dsd = 'dash_s_do' in kw and kw.pop('dash_s_do') or 'whine'
2983-        if 'fetch_mp' in kw:
2984-            self.fetch_mp = bool(kw.pop('fetch_mp'))
2985-        else:
2986-            self.fetch_mp = True
2987-        if 'standard_mods' in kw:
2988-            smods = bool(kw.pop('standard_mods'))
2989-        else:
2990-            smods = True
2991-        if 'fuse' in kw:
2992-            self.fuse = kw.pop('fuse')
2993-        if not 'formatter' in kw:
2994-            kw['formatter'] = FuseFormatter()
2995-        doh = 'dash_o_handler' in kw and kw.pop('dash_o_handler')
2996-
2997-        SubbedOptParse.__init__(self, *args, **kw)
2998-
2999-        if doh:
3000-            self.add_option(doh)
3001-        else:
3002-            self.add_option('-o', action='store_hive',
3003-                            subopts_hive=self.fuse_args, help="mount options",
3004-                            metavar="opt,[opt...]")
3005-
3006-        if smods:
3007-            self.add_option('-f', action='callback',
3008-                            callback=lambda *a: self.fuse_args.setmod('foreground'),
3009-                            help=SUPPRESS_HELP)
3010-            self.add_option('-d', action='callback',
3011-                            callback=lambda *a: self.fuse_args.add('debug'),
3012-                            help=SUPPRESS_HELP)
3013-
3014-        if dsd == 'whine':
3015-            def dsdcb(option, opt_str, value, parser):
3016-                raise RuntimeError, """
3017-
3018-! If you want the "-s" option to work, pass
3019-!
3020-!   dash_s_do='setsingle'
3021-!
3022-! to the Fuse constructor. See docstring of the FuseOptParse class for an
3023-! explanation why is it not set by default.
3024-"""
3025-
3026-        elif dsd == 'setsingle':
3027-            def dsdcb(option, opt_str, value, parser):
3028-                self.fuse.multithreaded = False
3029-
3030-        elif dsd == 'undef':
3031-            dsdcb = None
3032-        else:
3033-            raise ArgumentError, "key `dash_s_do': uninterpreted value " + str(dsd)
3034-
3035-        if dsdcb:
3036-            self.add_option('-s', action='callback', callback=dsdcb,
3037-                            help=SUPPRESS_HELP)
3038-
3039-
3040-    def exit(self, status=0, msg=None):
3041-        if msg:
3042-            sys.stderr.write(msg)
3043-
3044-    def error(self, msg):
3045-        SubbedOptParse.error(self, msg)
3046-        raise OptParseError, msg
3047-
3048-    def print_help(self, file=sys.stderr):
3049-        SubbedOptParse.print_help(self, file)
3050-        print >> file
3051-        self.fuse_args.setmod('showhelp')
3052-
3053-    def print_version(self, file=sys.stderr):
3054-        SubbedOptParse.print_version(self, file)
3055-        self.fuse_args.setmod('showversion')
3056-
3057-    def parse_args(self, args=None, values=None):
3058-        o, a = SubbedOptParse.parse_args(self, args, values)
3059-        if a and self.fetch_mp:
3060-            self.fuse_args.mountpoint = a.pop()
3061-        return o, a
3062-
3063-    def add_option(self, *opts, **attrs):
3064-        if 'mountopt' in attrs:
3065-            if opts or 'subopt' in attrs:
3066-                raise OptParseError(
3067-                  "having options or specifying the `subopt' attribute conflicts with `mountopt' attribute")
3068-            opts = ('-o',)
3069-            attrs['subopt'] = attrs.pop('mountopt')
3070-            if not 'dest' in attrs:
3071-                attrs['dest'] = attrs['subopt']
3072-
3073-        SubbedOptParse.add_option(self, *opts, **attrs)
3074-
3075-
3076-
3077-##########
3078-###
3079-###  The FUSE interface.
3080-###
3081-##########
3082-
3083-
3084-
3085-class ErrnoWrapper(object):
3086-
3087-    def __init__(self, func):
3088-        self.func = func
3089-
3090-    def __call__(self, *args, **kw):
3091-        try:
3092-            return apply(self.func, args, kw)
3093-        except (IOError, OSError), detail:
3094-            # Sometimes this is an int, sometimes an instance...
3095-            if hasattr(detail, "errno"): detail = detail.errno
3096-            return -detail
3097-
3098-
3099-########### Custom objects for transmitting system structures to FUSE
3100-
3101-class FuseStruct(object):
3102-
3103-    def __init__(self, **kw):
3104-        for k in kw:
3105-             setattr(self, k, kw[k])
3106-
3107-
3108-class Stat(FuseStruct):
3109-    """
3110-    Auxiliary class which can be filled up stat attributes.
3111-    The attributes are undefined by default.
3112-    """
3113-
3114-    def __init__(self, **kw):
3115-        self.st_mode  = None
3116-        self.st_ino   = 0
3117-        self.st_dev   = 0
3118-        self.st_nlink = None
3119-        self.st_uid   = 0
3120-        self.st_gid   = 0
3121-        self.st_size  = 0
3122-        self.st_atime = 0
3123-        self.st_mtime = 0
3124-        self.st_ctime = 0
3125-
3126-        FuseStruct.__init__(self, **kw)
3127-
3128-
3129-class StatVfs(FuseStruct):
3130-    """
3131-    Auxiliary class which can be filled up statvfs attributes.
3132-    The attributes are 0 by default.
3133-    """
3134-
3135-    def __init__(self, **kw):
3136-
3137-        self.f_bsize   = 0
3138-        self.f_frsize  = 0
3139-        self.f_blocks  = 0
3140-        self.f_bfree   = 0
3141-        self.f_bavail  = 0
3142-        self.f_files   = 0
3143-        self.f_ffree   = 0
3144-        self.f_favail  = 0
3145-        self.f_flag    = 0
3146-        self.f_namemax = 0
3147-
3148-        FuseStruct.__init__(self, **kw)
3149-
3150-
3151-class Direntry(FuseStruct):
3152-    """
3153-    Auxiliary class for carrying directory entry data.
3154-    Initialized with `name`. Further attributes (each
3155-    set to 0 as default):
3156-
3157-    offset
3158-        An integer (or long) parameter, used as a bookmark
3159-        during directory traversal.
3160-        This needs to be set it you want stateful directory
3161-        reading.
3162-
3163-    type
3164-       Directory entry type, should be one of the stat type
3165-       specifiers (stat.S_IFLNK, stat.S_IFBLK, stat.S_IFDIR,
3166-       stat.S_IFCHR, stat.S_IFREG, stat.S_IFIFO, stat.S_IFSOCK).
3167-
3168-    ino
3169-       Directory entry inode number.
3170-
3171-    Note that Python's standard directory reading interface is
3172-    stateless and provides only names, so the above optional
3173-    attributes doesn't make sense in that context.
3174-    """
3175-
3176-    def __init__(self, name, **kw):
3177-
3178-        self.name   = name
3179-        self.offset = 0
3180-        self.type   = 0
3181-        self.ino    = 0
3182-
3183-        FuseStruct.__init__(self, **kw)
3184-
3185-
3186-class Flock(FuseStruct):
3187-    """
3188-    Class for representing flock structures (cf. fcntl(3)).
3189-   
3190-    It makes sense to give values to the `l_type`, `l_start`,
3191-    `l_len`, `l_pid` attributes (`l_whence` is not used by
3192-    FUSE, see ``fuse.h``).
3193-    """
3194-
3195-    def __init__(self, name, **kw):
3196-   
3197-        self.l_type  = None
3198-        self.l_start = None
3199-        self.l_len   = None
3200-        self.l_pid   = None
3201-
3202-        FuseStruct.__init__(self, **kw)
3203-
3204-
3205-class Timespec(FuseStruct):
3206-    """
3207-    Cf. struct timespec in time.h:
3208-    http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html
3209-    """
3210-
3211-    def __init__(self, name, **kw):
3212-   
3213-        self.tv_sec  = None
3214-        self.tv_nsec = None
3215-
3216-        FuseStruct.__init__(self, **kw)
3217-
3218-
3219-class FuseFileInfo(FuseStruct):
3220-
3221-    def __init__(self, **kw):
3222-
3223-        self.keep      = False
3224-        self.direct_io = False
3225-
3226-        FuseStruct.__init__(self, **kw)
3227-
3228-
3229-
3230-########## Interface for requiring certain features from your underlying FUSE library.
3231-
3232-def feature_needs(*feas):
3233-    """
3234-    Get info about the FUSE API version needed for the support of some features.
3235-
3236-    This function takes a variable number of feature patterns.
3237-
3238-    A feature pattern is either:
3239-
3240-    -  an integer (directly referring to a FUSE API version number)
3241-    -  a built-in feature specifier string (meaning defined by dictionary)
3242-    -  a string of the form ``has_foo``, where ``foo`` is a filesystem method
3243-       (refers to the API version where the method has been introduced)
3244-    -  a list/tuple of other feature patterns (matches each of its members)
3245-    -  a regexp (meant to be matched against the builtins plus ``has_foo``
3246-       patterns; can also be given by a string of the from "re:*")
3247-    -  a negated regexp (can be given by a string of the form "!re:*")
3248-
3249-    If called with no arguments, then the list of builtins is returned, mapped
3250-    to their meaning.
3251-
3252-    Otherwise the function returns the smallest FUSE API version number which
3253-    has all the matching features.
3254-
3255-    Builtin specifiers worth to explicit mention:
3256-    - ``stateful_files``: you want to use custom filehandles (eg. a file class).
3257-    - ``*``: you want all features.
3258-    - while ``has_foo`` makes sense for all filesystem method ``foo``, some
3259-      of these can be found among the builtins, too (the ones which can be
3260-      handled by the general rule).
3261-
3262-    specifiers like ``has_foo`` refer to requirement that the library knows of
3263-      the fs method ``foo``.
3264-    """
3265-
3266-    fmap = {'stateful_files': 22,
3267-            'stateful_dirs':  23,
3268-            'stateful_io':    ('stateful_files', 'stateful_dirs'),
3269-            'stateful_files_keep_cache': 23,
3270-            'stateful_files_direct_io': 23,
3271-            'keep_cache':     ('stateful_files_keep_cache',),
3272-            'direct_io':      ('stateful_files_direct_io',),
3273-            'has_opendir':    ('stateful_dirs',),
3274-            'has_releasedir': ('stateful_dirs',),
3275-            'has_fsyncdir':   ('stateful_dirs',),
3276-            'has_create':     25,
3277-            'has_access':     25,
3278-            'has_fgetattr':   25,
3279-            'has_ftruncate':  25,
3280-            'has_fsinit':     ('has_init'),
3281-            'has_fsdestroy':  ('has_destroy'),
3282-            'has_lock':       26,
3283-            'has_utimens':    26,
3284-            'has_bmap':       26,
3285-            'has_init':       23,
3286-            'has_destroy':    23,
3287-            '*':              '!re:^\*$'}
3288-
3289-    if not feas:
3290-        return fmap
3291-
3292-    def resolve(args, maxva):
3293-
3294-        for fp in args:
3295-            if isinstance(fp, int):
3296-                maxva[0] = max(maxva[0], fp)
3297-                continue
3298-            if isinstance(fp, list) or isinstance(fp, tuple):
3299-                for f in fp:
3300-                    yield f
3301-                continue
3302-            ma = isinstance(fp, str) and re.compile("(!\s*|)re:(.*)").match(fp)
3303-            if isinstance(fp, type(re.compile(''))) or ma:
3304-                neg = False
3305-                if ma:
3306-                    mag = ma.groups()
3307-                    fp = re.compile(mag[1])
3308-                    neg = bool(mag[0])
3309-                for f in fmap.keys() + [ 'has_' + a for a in Fuse._attrs ]:
3310-                    if neg != bool(re.search(fp, f)):
3311-                        yield f
3312-                continue
3313-            ma = re.compile("has_(.*)").match(fp)
3314-            if ma and ma.groups()[0] in Fuse._attrs and not fp in fmap:
3315-                yield 21
3316-                continue
3317-            yield fmap[fp]
3318-
3319-    maxva = [0]
3320-    while feas:
3321-        feas = set(resolve(feas, maxva))
3322-
3323-    return maxva[0]
3324-
3325-
3326-def APIVersion():
3327-    """Get the API version of your underlying FUSE lib"""
3328-
3329-    return FuseAPIVersion()
3330-
3331-
3332-def feature_assert(*feas):
3333-    """
3334-    Takes some feature patterns (like in `feature_needs`).
3335-    Raises a fuse.FuseError if your underlying FUSE lib fails
3336-    to have some of the matching features.
3337-
3338-    (Note: use a ``has_foo`` type feature assertion only if lib support
3339-    for method ``foo`` is *necessary* for your fs. Don't use this assertion
3340-    just because your fs implements ``foo``. The usefulness of ``has_foo``
3341-    is limited by the fact that we can't guarantee that your FUSE kernel
3342-    module also supports ``foo``.)
3343-    """
3344-
3345-    fav = APIVersion()
3346-
3347-    for fea in feas:
3348-        fn = feature_needs(fea)
3349-        if fav < fn:
3350-            raise FuseError(
3351-              "FUSE API version %d is required for feature `%s' but only %d is available" % \
3352-              (fn, str(fea), fav))
3353-
3354-
3355-############# Subclass this.
3356-
3357-class Fuse(object):
3358-    """
3359-    Python interface to FUSE.
3360-
3361-    Basic usage:
3362-
3363-    - instantiate
3364-
3365-    - add options to `parser` attribute (an instance of `FuseOptParse`)
3366-
3367-    - call `parse`
3368-
3369-    - call `main`
3370-    """
3371-
3372-    _attrs = ['getattr', 'readlink', 'readdir', 'mknod', 'mkdir',
3373-              'unlink', 'rmdir', 'symlink', 'rename', 'link', 'chmod',
3374-              'chown', 'truncate', 'utime', 'open', 'read', 'write', 'release',
3375-              'statfs', 'fsync', 'create', 'opendir', 'releasedir', 'fsyncdir',
3376-              'flush', 'fgetattr', 'ftruncate', 'getxattr', 'listxattr',
3377-              'setxattr', 'removexattr', 'access', 'lock', 'utimens', 'bmap',
3378-              'fsinit', 'fsdestroy']
3379-
3380-    fusage = "%prog [mountpoint] [options]"
3381-
3382-    def __init__(self, *args, **kw):
3383-        """
3384-        Not much happens here apart from initializing the `parser` attribute.
3385-        Arguments are forwarded to the constructor of the parser class almost
3386-        unchanged.
3387-
3388-        The parser class is `FuseOptParse` unless you specify one using the
3389-        ``parser_class`` keyword. (See `FuseOptParse` documentation for
3390-        available options.)
3391-        """
3392-
3393-        if not fuse_python_api:
3394-            raise RuntimeError, __name__ + """.fuse_python_api not defined.
3395-
3396-! Please define """ + __name__ + """.fuse_python_api internally (eg.
3397-!
3398-! (1)  """ + __name__ + """.fuse_python_api = """ + `FUSE_PYTHON_API_VERSION` + """
3399-!
3400-! ) or in the enviroment (eg.
3401-!
3402-! (2)  FUSE_PYTHON_API=0.1
3403-!
3404-! ).
3405-!
3406-! If you are actually developing a filesystem, probably (1) is the way to go.
3407-! If you are using a filesystem written before 2007 Q2, probably (2) is what
3408-! you want."
3409-"""
3410-
3411-        def malformed():
3412-            raise RuntimeError, \
3413-                  "malformatted fuse_python_api value " + `fuse_python_api`
3414-        if not isinstance(fuse_python_api, tuple):
3415-            malformed()
3416-        for i in fuse_python_api:
3417-            if not isinstance(i, int) or i < 0:
3418-                malformed()
3419-
3420-        if fuse_python_api > FUSE_PYTHON_API_VERSION:
3421-            raise RuntimeError, """
3422-! You require FUSE-Python API version """ + `fuse_python_api` + """.
3423-! However, the latest available is """ + `FUSE_PYTHON_API_VERSION` + """.
3424-"""
3425-
3426-        self.fuse_args = \
3427-            'fuse_args' in kw and kw.pop('fuse_args') or FuseArgs()
3428-
3429-        if get_compat_0_1():
3430-            return self.__init_0_1__(*args, **kw)
3431-
3432-        self.multithreaded = True
3433-
3434-        if not 'usage' in kw:
3435-            kw['usage'] = self.fusage
3436-        if not 'fuse_args' in kw:
3437-            kw['fuse_args'] = self.fuse_args
3438-        kw['fuse'] = self
3439-        parserclass = \
3440-          'parser_class' in kw and kw.pop('parser_class') or FuseOptParse
3441-
3442-        self.parser = parserclass(*args, **kw)
3443-        self.methproxy = self.Methproxy()
3444-
3445-    def parse(self, *args, **kw):
3446-        """Parse command line, fill `fuse_args` attribute."""
3447-
3448-        ev = 'errex' in kw and kw.pop('errex')
3449-        if ev and not isinstance(ev, int):
3450-            raise TypeError, "error exit value should be an integer"
3451-
3452-        try:
3453-            self.cmdline = self.parser.parse_args(*args, **kw)
3454-        except OptParseError:
3455-          if ev:
3456-              sys.exit(ev)
3457-          raise
3458-
3459-        return self.fuse_args
3460-
3461-    def main(self, args=None):
3462-        """Enter filesystem service loop."""
3463-
3464-        if get_compat_0_1():
3465-            args = self.main_0_1_preamble()
3466-
3467-        d = {'multithreaded': self.multithreaded and 1 or 0}
3468-        d['fuse_args'] = args or self.fuse_args.assemble()
3469-
3470-        for t in 'file_class', 'dir_class':
3471-            if hasattr(self, t):
3472-                getattr(self.methproxy, 'set_' + t)(getattr(self,t))
3473-
3474-        for a in self._attrs:
3475-            b = a
3476-            if get_compat_0_1() and a in self.compatmap:
3477-                b = self.compatmap[a]
3478-            if hasattr(self, b):
3479-                c = ''
3480-                if get_compat_0_1() and hasattr(self, a + '_compat_0_1'):
3481-                    c = '_compat_0_1'
3482-                d[a] = ErrnoWrapper(self.lowwrap(a + c))
3483-
3484-        try:
3485-            main(**d)
3486-        except FuseError:
3487-            if args or self.fuse_args.mount_expected():
3488-                raise
3489-
3490-    def lowwrap(self, fname):
3491-        """
3492-        Wraps the fname method when the C code expects a different kind of
3493-        callback than we have in the fusepy API. (The wrapper is usually for
3494-        performing some checks or transfromations which could be done in C but
3495-        is simpler if done in Python.)
3496-
3497-        Currently `open` and `create` are wrapped: a boolean flag is added
3498-        which indicates if the result is to be kept during the opened file's
3499-        lifetime or can be thrown away. Namely, it's considered disposable
3500-        if it's an instance of FuseFileInfo.
3501-        """
3502-        fun = getattr(self, fname)
3503-
3504-        if fname in ('open', 'create'):
3505-            def wrap(*a, **kw):
3506-                res = fun(*a, **kw)
3507-                if not res or type(res) == type(0):
3508-                    return res
3509-                else:
3510-                    return (res, type(res) != FuseFileInfo)
3511-        elif fname == 'utimens':
3512-            def wrap(path, acc_sec, acc_nsec, mod_sec, mod_nsec):
3513-                ts_acc = Timespec(tv_sec = acc_sec, tv_nsec = acc_nsec)
3514-                ts_mod = Timespec(tv_sec = mod_sec, tv_nsec = mod_nsec)
3515-                return fun(path, ts_acc, ts_mod)
3516-        else:
3517-            wrap = fun
3518-
3519-        return wrap
3520-
3521-    def GetContext(self):
3522-        return FuseGetContext(self)
3523-
3524-    def Invalidate(self, path):
3525-        return FuseInvalidate(self, path)
3526-
3527-    def fuseoptref(cls):
3528-        """
3529-        Find out which options are recognized by the library.
3530-        Result is a `FuseArgs` instance with the list of supported
3531-        options, suitable for passing on to the `filter` method of
3532-        another `FuseArgs` instance.
3533-        """
3534-
3535-        import os, re
3536-
3537-        pr, pw = os.pipe()
3538-        pid = os.fork()
3539-        if pid == 0:
3540-             os.dup2(pw, 2)
3541-             os.close(pr)
3542-
3543-             fh = cls()
3544-             fh.fuse_args = FuseArgs()
3545-             fh.fuse_args.setmod('showhelp')
3546-             fh.main()
3547-             sys.exit()
3548-
3549-        os.close(pw)
3550-
3551-        fa = FuseArgs()
3552-        ore = re.compile("-o\s+([\w\[\]]+(?:=\w+)?)")
3553-        fpr = os.fdopen(pr)
3554-        for l in fpr:
3555-             m = ore.search(l)
3556-             if m:
3557-                 o = m.groups()[0]
3558-                 oa = [o]
3559-                 # try to catch two-in-one options (like "[no]foo")
3560-                 opa = o.split("[")
3561-                 if len(opa) == 2:
3562-                    o1, ox = opa
3563-                    oxpa = ox.split("]")
3564-                    if len(oxpa) == 2:
3565-                       oo, o2 = oxpa
3566-                       oa = [o1 + o2, o1 + oo + o2]
3567-                 for o in oa:
3568-                     fa.add(o)
3569-
3570-        fpr.close()
3571-        return fa
3572-
3573-    fuseoptref = classmethod(fuseoptref)
3574-
3575-
3576-    class Methproxy(object):
3577-
3578-        def __init__(self):
3579-
3580-            class mpx(object):
3581-               def __init__(self, name):
3582-                   self.name = name
3583-               def __call__(self, *a, **kw):
3584-                   return getattr(a[-1], self.name)(*(a[1:-1]), **kw)
3585-
3586-            self.proxyclass = mpx
3587-            self.mdic = {}
3588-            self.file_class = None
3589-            self.dir_class = None
3590-
3591-        def __call__(self, meth):
3592-            return meth in self.mdic and self.mdic[meth] or None
3593-
3594-        def _add_class_type(cls, type, inits, proxied):
3595-
3596-            def setter(self, xcls):
3597-
3598-                setattr(self, type + '_class', xcls)
3599-
3600-                for m in inits:
3601-                    self.mdic[m] = xcls
3602-
3603-                for m in proxied:
3604-                    if hasattr(xcls, m):
3605-                        self.mdic[m] = self.proxyclass(m)
3606-
3607-            setattr(cls, 'set_' + type + '_class', setter)
3608-
3609-        _add_class_type = classmethod(_add_class_type)
3610-
3611-    Methproxy._add_class_type('file', ('open', 'create'),
3612-                              ('read', 'write', 'fsync', 'release', 'flush',
3613-                               'fgetattr', 'ftruncate', 'lock'))
3614-    Methproxy._add_class_type('dir', ('opendir',),
3615-                              ('readdir', 'fsyncdir', 'releasedir'))
3616-
3617-
3618-    def __getattr__(self, meth):
3619-
3620-        m = self.methproxy(meth)
3621-        if m:
3622-            return m
3623-
3624-        raise AttributeError, "Fuse instance has no attribute '%s'" % meth
3625-
3626-
3627-
3628-##########
3629-###
3630-###  Compat stuff.
3631-###
3632-##########
3633-
3634-
3635-
3636-    def __init_0_1__(self, *args, **kw):
3637-
3638-        self.flags = 0
3639-        multithreaded = 0
3640-
3641-        # default attributes
3642-        if args == ():
3643-            # there is a self.optlist.append() later on, make sure it won't
3644-            # bomb out.
3645-            self.optlist = []
3646-        else:
3647-            self.optlist = args
3648-        self.optdict = kw
3649-
3650-        if len(self.optlist) == 1:
3651-            self.mountpoint = self.optlist[0]
3652-        else:
3653-            self.mountpoint = None
3654-
3655-        # grab command-line arguments, if any.
3656-        # Those will override whatever parameters
3657-        # were passed to __init__ directly.
3658-        argv = sys.argv
3659-        argc = len(argv)
3660-        if argc > 1:
3661-            # we've been given the mountpoint
3662-            self.mountpoint = argv[1]
3663-        if argc > 2:
3664-            # we've received mount args
3665-            optstr = argv[2]
3666-            opts = optstr.split(",")
3667-            for o in opts:
3668-                try:
3669-                    k, v = o.split("=", 1)
3670-                    self.optdict[k] = v
3671-                except:
3672-                    self.optlist.append(o)
3673-
3674-
3675-    def main_0_1_preamble(self):
3676-
3677-        cfargs = FuseArgs()
3678-
3679-        cfargs.mountpoint = self.mountpoint
3680-
3681-        if hasattr(self, 'debug'):
3682-            cfargs.add('debug')
3683-
3684-        if hasattr(self, 'allow_other'):
3685-            cfargs.add('allow_other')
3686-
3687-        if hasattr(self, 'kernel_cache'):
3688-            cfargs.add('kernel_cache')
3689-
3690-        return cfargs.assemble()
3691-
3692-
3693-    def getattr_compat_0_1(self, *a):
3694-        from os import stat_result
3695-
3696-        return stat_result(self.getattr(*a))
3697-
3698-
3699-    def statfs_compat_0_1(self, *a):
3700-
3701-        oout = self.statfs(*a)
3702-        lo = len(oout)
3703-
3704-        svf = StatVfs()
3705-        svf.f_bsize   = oout[0]                   # 0
3706-        svf.f_frsize  = oout[lo >= 8 and 7 or 0]  # 1
3707-        svf.f_blocks  = oout[1]                   # 2
3708-        svf.f_bfree   = oout[2]                   # 3
3709-        svf.f_bavail  = oout[3]                   # 4
3710-        svf.f_files   = oout[4]                   # 5
3711-        svf.f_ffree   = oout[5]                   # 6
3712-        svf.f_favail  = lo >= 9 and oout[8] or 0  # 7
3713-        svf.f_flag    = lo >= 10 and oout[9] or 0 # 8
3714-        svf.f_namemax = oout[6]                   # 9
3715-
3716-        return svf
3717-
3718-
3719-    def readdir_compat_0_1(self, path, offset, *fh):
3720-
3721-        for name, type in self.getdir(path):
3722-            de = Direntry(name)
3723-            de.type = type
3724-
3725-            yield de
3726-
3727-
3728-    compatmap = {'readdir': 'getdir'}
3729rmfile ./mac/fuse.py
3730hunk ./mac/fuseparts/__init__.py 1
3731-__version__ = "0.2"
3732rmfile ./mac/fuseparts/__init__.py
3733hunk ./mac/fuseparts/setcompatwrap.py 1
3734-try:
3735-  set()
3736-  set = set
3737-except:
3738-  from sets import Set as set
3739rmfile ./mac/fuseparts/setcompatwrap.py
3740hunk ./mac/fuseparts/subbedopts.py 1
3741-#
3742-#    Copyright (C) 2006  Csaba Henk  <csaba.henk@creo.hu>
3743-#
3744-#    This program can be distributed under the terms of the GNU LGPL.
3745-#    See the file COPYING.
3746-#
3747-# On 2009-09-21 Csaba Henk granted permission for this file to be
3748-# licensed under the same terms as Tahoe-LAFS itself.
3749-#
3750-
3751-from optparse import Option, OptionParser, OptParseError, OptionConflictError
3752-from optparse import HelpFormatter, IndentedHelpFormatter, SUPPRESS_HELP
3753-from fuseparts.setcompatwrap import set
3754-
3755-##########
3756-###
3757-###  Generic suboption parsing stuff.
3758-###
3759-##########
3760-
3761-
3762-
3763-class SubOptsHive(object):
3764-    """
3765-    Class for collecting unhandled suboptions.
3766-    """
3767-
3768-    def __init__(self):
3769-
3770-        self.optlist = set()
3771-        self.optdict = {}
3772-
3773-    def _str_core(self):
3774-
3775-        sa = []
3776-        for k, v in self.optdict.iteritems():
3777-             sa.append(str(k) + '=' + str(v))
3778-
3779-        ra = (list(self.optlist) + sa) or ["(none)"]
3780-        ra.sort()
3781-        return ra
3782-
3783-    def __str__(self):
3784-        return "< opts: " + ", ".join(self._str_core()) + " >"
3785-
3786-    def canonify(self):
3787-        """
3788-        Transform self to an equivalent canonical form:
3789-        delete optdict keys with False value, move optdict keys
3790-        with True value to optlist, stringify other values.
3791-        """
3792-
3793-        for k, v in self.optdict.iteritems():
3794-            if v == False:
3795-                self.optdict.pop(k)
3796-            elif v == True:
3797-                self.optdict.pop(k)
3798-                self.optlist.add(v)
3799-            else:
3800-                self.optdict[k] = str(v)
3801-
3802-    def filter(self, other):
3803-        """
3804-        Throw away those options which are not in the other one.
3805-        Returns a new instance with the rejected options.
3806-        """
3807-
3808-        self.canonify()
3809-        other.canonify()
3810-
3811-        rej = self.__class__()
3812-        rej.optlist = self.optlist.difference(other.optlist)
3813-        self.optlist.difference_update(rej.optlist)
3814-        for x in self.optdict.copy():
3815-             if x not in other.optdict:
3816-                 self.optdict.pop(x)
3817-                 rej.optdict[x] = None
3818-
3819-        return rej
3820-
3821-    def add(self, opt, val=None):
3822-        """Add a suboption."""
3823-
3824-        ov = opt.split('=', 1)
3825-        o = ov[0]
3826-        v = len(ov) > 1 and ov[1] or None
3827-
3828-        if (v):
3829-            if val != None:
3830-                raise AttributeError, "ambiguous option value"
3831-            val = v
3832-
3833-        if val == False:
3834-            return
3835-
3836-        if val in (None, True):
3837-            self.optlist.add(o)
3838-        else:
3839-            self.optdict[o] = val
3840-
3841-
3842-
3843-class SubbedOpt(Option):
3844-    """
3845-    `Option` derivative enhanced with the attribute of being a suboption of
3846-     some other option (like ``foo`` and ``bar`` for ``-o`` in ``-o foo,bar``).
3847-    """
3848-
3849-    ATTRS = Option.ATTRS + ["subopt", "subsep", "subopts_hive"]
3850-    ACTIONS = Option.ACTIONS + ("store_hive",)
3851-    STORE_ACTIONS = Option.STORE_ACTIONS + ("store_hive",)
3852-    TYPED_ACTIONS = Option.TYPED_ACTIONS + ("store_hive",)
3853-
3854-    def __init__(self, *opts, **attrs):
3855-
3856-       self.subopt_map = {}
3857-
3858-       if "subopt" in attrs:
3859-           self._short_opts = []
3860-           self._long_opts = []
3861-           self._set_opt_strings(opts)
3862-           self.baseopt = self._short_opts[0] or self._long_opts[0]
3863-           opts = ()
3864-
3865-       Option.__init__(self, *opts, **attrs)
3866-
3867-    def __str__(self):
3868-        pf = ""
3869-        if hasattr(self, "subopt") and self.subopt:
3870-            pf = " %s...,%s,..." % (self.baseopt, self.subopt)
3871-        return Option.__str__(self) + pf
3872-
3873-    def _check_opt_strings(self, opts):
3874-        return opts
3875-
3876-    def _check_dest(self):
3877-        try:
3878-            Option._check_dest(self)
3879-        except IndexError:
3880-            if self.subopt:
3881-                self.dest = "__%s__%s" % (self.baseopt, self.subopt)
3882-                self.dest = self.dest.replace("-", "")
3883-            else:
3884-                raise
3885-
3886-    def get_opt_string(self):
3887-        if hasattr(self, 'subopt'):
3888-            return self.subopt
3889-        else:
3890-            return Option.get_opt_string(self)
3891-
3892-    def take_action(self, action, dest, opt, value, values, parser):
3893-        if action == "store_hive":
3894-            if not hasattr(values, dest) or getattr(values, dest) == None:
3895-                 if hasattr(self, "subopts_hive") and self.subopts_hive:
3896-                     hive = self.subopts_hive
3897-                 else:
3898-                     hive = parser.hive_class()
3899-                 setattr(values, dest, hive)
3900-            for o in value.split(self.subsep or ","):
3901-                oo = o.split('=')
3902-                ok = oo[0]
3903-                ov = None
3904-                if (len(oo) > 1):
3905-                    ov = oo[1]
3906-                if ok in self.subopt_map:
3907-                    self.subopt_map[ok].process(ok, ov, values, parser)
3908-                else:
3909-                    getattr(values, dest).add(*oo)
3910-            return
3911-        Option.take_action(self, action, dest, opt, value, values, parser)
3912-
3913-    def register_sub(self, o):
3914-        """Register argument a suboption for `self`."""
3915-
3916-        if o.subopt in self.subopt_map:
3917-            raise OptionConflictError(
3918-              "conflicting suboption handlers for `%s'" % o.subopt,
3919-              o)
3920-        self.subopt_map[o.subopt] = o
3921-
3922-    CHECK_METHODS = []
3923-    for m in Option.CHECK_METHODS:
3924-        #if not m == Option._check_dest:
3925-        if not m.__name__ == '_check_dest':
3926-            CHECK_METHODS.append(m)
3927-    CHECK_METHODS.append(_check_dest)
3928-
3929-
3930-
3931-class SubbedOptFormatter(HelpFormatter):
3932-
3933-    def format_option_strings(self, option):
3934-        if hasattr(option, "subopt") and option.subopt:
3935-            res = '-o ' + option.subopt
3936-            if option.takes_value():
3937-                res += "="
3938-                res += option.metavar or 'FOO'
3939-            return res
3940-
3941-        return HelpFormatter.format_option_strings(self, option)
3942-
3943-
3944-
3945-class SubbedOptIndentedFormatter(IndentedHelpFormatter, SubbedOptFormatter):
3946-
3947-    def format_option_strings(self, option):
3948-        return SubbedOptFormatter.format_option_strings(self, option)
3949-
3950-
3951-
3952-class SubbedOptParse(OptionParser):
3953-    """
3954-    This class alters / enhances `OptionParser` with *suboption handlers*.
3955-
3956-    That is, calling `sop.add_option('-x', subopt=foo)` installs a handler
3957-    which will be triggered if there is ``-x foo`` in the command line being
3958-    parsed (or, eg., ``-x foo,bar``).
3959-
3960-    Moreover, ``-x`` implicitly gets a handler which collects the unhandled
3961-    suboptions of ``-x`` into a `SubOptsHive` instance (accessible post festam
3962-    via the `x` attribute of the returned Values object). (The only exception
3963-    is when ``-x`` has *explicitly*  been added with action ``store_hive``.
3964-    This opens up the possibility of customizing the ``-x`` handler at some
3965-    rate.)
3966-
3967-    Suboption handlers have all the nice features of normal option handlers,
3968-    eg. they are displayed in the automatically generated help message
3969-    (and can have their own help info).
3970-    """
3971-
3972-    def __init__(self, *args, **kw):
3973-
3974-         if not 'formatter' in kw:
3975-             kw['formatter'] = SubbedOptIndentedFormatter()
3976-         if not 'option_class' in kw:
3977-             kw['option_class'] = SubbedOpt
3978-         if 'hive_class' in kw:
3979-             self.hive_class = kw.pop('hive_class')
3980-         else:
3981-             self.hive_class = SubOptsHive
3982-
3983-         OptionParser.__init__(self, *args, **kw)
3984-
3985-    def add_option(self, *args, **kwargs):
3986-        if 'action' in kwargs and kwargs['action'] == 'store_hive':
3987-            if 'subopt' in kwargs:
3988-                raise OptParseError(
3989-                  """option can't have a `subopt' attr and `action="store_hive"' at the same time""")
3990-            if not 'type' in kwargs:
3991-                kwargs['type'] = 'string'
3992-        elif 'subopt' in kwargs:
3993-            o = self.option_class(*args, **kwargs)
3994-
3995-            oo = self.get_option(o.baseopt)
3996-            if oo:
3997-                if oo.action != "store_hive":
3998-                    raise OptionConflictError(
3999-                      "can't add subopt as option has already a handler that doesn't do `store_hive'",
4000-                      oo)
4001-            else:
4002-                self.add_option(o.baseopt, action='store_hive',
4003-                                metavar="sub1,[sub2,...]")
4004-                oo = self.get_option(o.baseopt)
4005-
4006-            oo.register_sub(o)
4007-
4008-            args = (o,)
4009-            kwargs = {}
4010-
4011-        return OptionParser.add_option(self, *args, **kwargs)
4012rmfile ./mac/fuseparts/subbedopts.py
4013rmdir ./mac/fuseparts
4014hunk ./mac/setup.py 1
4015-#!/usr/bin/env python
4016-
4017-from setuptools import setup
4018-import py2app
4019-
4020-import glob
4021-import os
4022-import sys
4023-
4024-# pull in formless, as best way to grab its .css file depenedency
4025-import formless
4026-
4027-def find_formless_css():
4028-    fpath = formless.__path__[0]
4029-    # first look for it from a regular package install
4030-    f = os.path.join(fpath, 'freeform-default.css')
4031-    if os.path.exists(f):
4032-        return f
4033-    # then try looking within .egg structured files
4034-    pyver = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
4035-    f = os.path.join(fpath, '../lib', pyver, 'site-packages/formless/freeform-default.css')
4036-    if os.path.exists(f):
4037-        return f
4038-    raise RuntimeError("Can't find formless .css file")
4039-
4040-data_files = [
4041-     ('pkg_resources/allmydata/web', glob.glob('../src/allmydata/web/*')),
4042-     ('pkg_resources/formless', [find_formless_css()]),
4043-     ]
4044-
4045-from setuptools import find_packages
4046-
4047-packages = find_packages('../src')
4048-
4049-py2app_options = {
4050-    'argv_emulation': True,
4051-    'iconfile': 'allmydata.icns',
4052-    'plist': { 'CFBundleIconFile': 'allmydata.icns', },
4053-    }
4054-
4055-setup_args = {
4056-    'name': 'Allmydata',
4057-    'description': 'The various parts of the Allmydata Tahoe system',
4058-    'author': 'Allmydata, Inc.',
4059-    'app': [ 'allmydata_tahoe.py' ],
4060-    'options': { 'py2app': py2app_options },
4061-    'data_files': data_files,
4062-    'setup_requires': [ 'py2app', 'macholib>=1.2' ],
4063-    'packages': packages,
4064-}
4065-
4066-
4067-if __name__ == '__main__':
4068-    if not os.path.exists('allmydata'):
4069-        os.symlink('../src/allmydata', 'allmydata')
4070-    setup(**setup_args)
4071-
4072-junk = [formless, py2app]
4073-del junk
4074-
4075-
4076-
4077-
4078rmfile ./mac/setup.py
4079rmdir ./mac
4080}
4081[NEWS: remove unmaintained Mac GUI app. refs #1282
4082david-sarah@jacaranda.org**20101226020858
4083 Ignore-this: 40474a07f4a550b48563d35350be7ab5
4084] hunk ./NEWS 3
4085 User visible changes in Tahoe-LAFS.  -*- outline; coding: utf-8 -*-
4086 
4087+* Trunk, post-1.8.1
4088+
4089+** Removals
4090+
4091+ - The unmaintained GUI application for Mac OS X has been removed. (#1282)
4092+
4093+
4094 * Release 1.8.1 (2010-10-28)
4095 
4096 ** Bugfixes and Improvements
4097[Remove the Makefile targets relating to the Mac GUI app. refs #1282
4098david-sarah@jacaranda.org**20101226025859
4099 Ignore-this: 75303be783974b41138744ec62b07965
4100] hunk ./Makefile 433
4101 windows-installer-upload:
4102        $(RUNPP) -c "$(MAKE) -C windows windows-installer-upload"
4103 
4104-
4105-# These targets provide for mac native builds
4106-.PHONY: mac-exe mac-upload mac-cleanup mac-dbg
4107-
4108-mac-exe: .built
4109-       $(MAKE) -C mac clean
4110-       VERSION=$(VER) $(RUNPP) -c "$(MAKE) -C mac build"
4111-
4112-mac-dist:
4113-       VERSION=$(VER) $(MAKE) -C mac diskimage
4114-
4115-mac-upload:
4116-       VERSION=$(VER) $(MAKE) -C mac upload
4117-
4118-mac-cleanup:
4119-       VERSION=$(VER) $(MAKE) -C mac cleanup
4120-
4121-mac-dbg:
4122-       cd mac && $(PP) $(PYTHON)w allmydata_tahoe.py
4123-
4124-
4125
4126Context:
4127
4128[docs/architecture.rst: correct rst syntax.
4129david-sarah@jacaranda.org**20101212202003
4130 Ignore-this: 3fbe12feb28bec6f1c63aedbc79aad21
4131]
4132[docs/architecture.rst: formatting.
4133david-sarah@jacaranda.org**20101212201719
4134 Ignore-this: 305fa5dfc2939355eaf6d0d2161eb1ff
4135]
4136[docs: linkification, wording improvements.
4137david-sarah@jacaranda.org**20101212201234
4138 Ignore-this: 4e67287f527a8bc728cfbd93255d2aae
4139]
4140[docs: formatting.
4141david-sarah@jacaranda.org**20101212201115
4142 Ignore-this: 2e0ed394ac7726651d3a4f2c4b0d3798
4143]
4144[docs/configuration.rst: more formatting tweaks; which -> that.
4145david-sarah@jacaranda.org**20101212195522
4146 Ignore-this: a7becb7021854ca5a90edd892b36fdd7
4147]
4148[docs/configuration.rst: more changes to formatting.
4149david-sarah@jacaranda.org**20101212194511
4150 Ignore-this: 491aac33e5f5268d224359f1447d10be
4151]
4152[docs/configuration.rst: changes to formatting (mainly putting commands and filenames in monospace).
4153david-sarah@jacaranda.org**20101212181828
4154 Ignore-this: 8a1480e2d5f43bee678476424615b50f
4155]
4156[scripts/backupdb.py: more accurate comment about path field.
4157david-sarah@jacaranda.org**20101212170320
4158 Ignore-this: 50e47a2228a85207bbcd188a78a0d4e6
4159]
4160[scripts/cli.py: fix missing 'put' in usage example for 'tahoe put'.
4161david-sarah@jacaranda.org**20101212170207
4162 Ignore-this: 2cbadf066fff611fc03d3c0ff97ce6ec
4163]
4164[docs/frontends/CLI.rst: changes to formatting (mainly putting commands and filenames in monospace), and to command syntax to reflect that DIRCAP/... is accepted. Clarify the syntax of 'tahoe put' and other minor corrections. Tahoe -> Tahoe-LAFS.
4165david-sarah@jacaranda.org**20101212165800
4166 Ignore-this: a123ef6b564aa8624d1e79c97068ea12
4167]
4168[docs/frontends/CLI.rst: Unicode arguments to 'tahoe' work on Windows as of v1.7.1.
4169david-sarah@jacaranda.org**20101212063740
4170 Ignore-this: 3977a99dfa86ac33a44171deaf43aaab
4171]
4172[docs/known_issues.rst: fix title and linkify another URL. refs #1225
4173david-sarah@jacaranda.org**20101212062817
4174 Ignore-this: cc91287f7fb51c23440b3d2fe79c449c
4175]
4176[docs/known_issues.rst: fix an external link. refs #1225
4177david-sarah@jacaranda.org**20101212062435
4178 Ignore-this: b8cbf12f353131756c358965c48060ec
4179]
4180[Fix a link from uri.rst to dirnodes.rst. refs #1225
4181david-sarah@jacaranda.org**20101212054502
4182 Ignore-this: af6205299f5c9a33229cab259c00f9d5
4183]
4184[Fix a link from webapi.rst to FTP-and-SFTP.rst. refs #1225
4185david-sarah@jacaranda.org**20101212053435
4186 Ignore-this: 2b9f88678c3447ea860d6b61e8799858
4187]
4188[More specific hyperlink to architecture.rst from helper.rst. refs #1225
4189david-sarah@jacaranda.org**20101212052607
4190 Ignore-this: 50424c768fca481252fabf58424852dc
4191]
4192[Update hyperlinks between docs, and linkify some external references. refs #1225
4193david-sarah@jacaranda.org**20101212051459
4194 Ignore-this: cd43a4c3d3de1f832abfa88d5fc4ace1
4195]
4196[docs/specifications/dirnodes.rst: fix references to mutable.rst. refs #1225
4197david-sarah@jacaranda.org**20101212012720
4198 Ignore-this: 6819b4b4e06e947ee48b365e840db37d
4199]
4200[docs/specifications/mutable.rst: correct the magic string for v1 mutable containers. refs #1225
4201david-sarah@jacaranda.org**20101212011400
4202 Ignore-this: 99a5fcdd40cef83dbb08f323f6cdaaca
4203]
4204[Move .txt files in docs/frontends and docs/specifications to .rst. refs #1225
4205david-sarah@jacaranda.org**20101212010251
4206 Ignore-this: 8796d35d928370f7dc6ad2dafdc1c0fe
4207]
4208[Convert docs/frontends and docs/specifications to reStructuredText format (not including file moves).
4209david-sarah@jacaranda.org**20101212004632
4210 Ignore-this: e3ceb2d832d73875abe48624ddbb5622
4211]
4212[scripts/cli.py: remove the disclaimer in the help for 'tahoe cp' that it does not handle non-ASCII filenames well. (At least, we intend to handle them.)
4213david-sarah@jacaranda.org**20101130002145
4214 Ignore-this: 94c003efaa20b9eb4a83503d79844ca
4215]
4216[relnotes.txt: fifth -> sixth labor-of-love release
4217zooko@zooko.com**20101129045647
4218 Ignore-this: 21c245015268b38916e3a138d256c09d
4219]
4220[Makefile: BB_BRANCH is set to the empty string for trunk, not the string 'trunk'.
4221david-sarah@jacaranda.org**20101128233512
4222 Ignore-this: 5a7ef8eb10475636d21b91e25b56c369
4223]
4224[relnotes.txt: eleventh -> twelfth release.
4225david-sarah@jacaranda.org**20101128223321
4226 Ignore-this: 1e26410156a665271c1170803dea2c0d
4227]
4228[relnotes.tst: point to known_issues.rst, not known_issues.txt.
4229david-sarah@jacaranda.org**20101128222918
4230 Ignore-this: 60194eb4544cac446fe4f60b3e34b887
4231]
4232[quickstart.html: fix link to point to allmydata-tahoe-1.8.1.zip.
4233david-sarah@jacaranda.org**20101128221728
4234 Ignore-this: 7b3ee86f8256aa12f5d862f689f3ee29
4235]
4236[TAG allmydata-tahoe-1.8.1
4237david-sarah@jacaranda.org**20101128212336
4238 Ignore-this: 9c18bdeaef4822f590d2a0d879e00621
4239]
4240Patch bundle hash:
42419ddc8fd479dea5501cfa96306c7ea93c7f4bd0c6