Game class now tracks board state and moves, as strings, and can step through its history.
authorJens Alfke <jens@mooseyard.com>
Sun Mar 16 15:06:47 2008 -0700 (2008-03-16)
changeset 7428a194e3e59
parent 6 af9b2b929b03
child 8 45c82a071aca
Game class now tracks board state and moves, as strings, and can step through its history.
Fixed another bug in Go (you could drag your captured stones back to the board!)
English.lproj/MainMenu.nib/designable.nib
English.lproj/MainMenu.nib/keyedobjects.nib
Source/Bit.m
Source/BitHolder.m
Source/CheckersGame.h
Source/CheckersGame.m
Source/DemoBoardView.h
Source/DemoBoardView.m
Source/GGBLayer.h
Source/GGBLayer.m
Source/GGBUtils.h
Source/GGBUtils.m
Source/Game.h
Source/Game.m
Source/GoGame.m
Source/Grid.h
Source/Grid.m
Source/HexchequerGame.m
Source/QuartzUtils.m
Source/TicTacToeGame.m
     1.1 --- a/English.lproj/MainMenu.nib/designable.nib	Wed Mar 12 15:51:32 2008 -0700
     1.2 +++ b/English.lproj/MainMenu.nib/designable.nib	Sun Mar 16 15:06:47 2008 -0700
     1.3 @@ -1,31 +1,31 @@
     1.4  <?xml version="1.0" encoding="UTF-8"?>
     1.5 -<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.01">
     1.6 +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.02">
     1.7  	<data>
     1.8  		<int key="IBDocument.SystemTarget">0</int>
     1.9 -		<string key="IBDocument.SystemVersion">9B18</string>
    1.10 -		<string key="IBDocument.InterfaceBuilderVersion">629</string>
    1.11 -		<string key="IBDocument.AppKitVersion">949</string>
    1.12 -		<string key="IBDocument.HIToolboxVersion">343.00</string>
    1.13 +		<string key="IBDocument.SystemVersion">9C31</string>
    1.14 +		<string key="IBDocument.InterfaceBuilderVersion">644</string>
    1.15 +		<string key="IBDocument.AppKitVersion">949.26</string>
    1.16 +		<string key="IBDocument.HIToolboxVersion">352.00</string>
    1.17  		<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
    1.18  			<bool key="EncodedWithXMLCoder">YES</bool>
    1.19  			<integer value="380"/>
    1.20 -			<integer value="371"/>
    1.21 +			<integer value="372"/>
    1.22  		</object>
    1.23  		<object class="NSArray" key="IBDocument.PluginDependencies">
    1.24  			<bool key="EncodedWithXMLCoder">YES</bool>
    1.25 -			<string id="617114957">com.apple.InterfaceBuilderKit</string>
    1.26 -			<string id="248469711">com.apple.InterfaceBuilder.CocoaPlugin</string>
    1.27 +			<string>com.apple.InterfaceBuilderKit</string>
    1.28 +			<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
    1.29  		</object>
    1.30  		<object class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
    1.31  			<bool key="EncodedWithXMLCoder">YES</bool>
    1.32  			<object class="NSCustomObject" id="1021">
    1.33 -				<string key="NSClassName" id="1039455869">NSApplication</string>
    1.34 +				<string key="NSClassName">NSApplication</string>
    1.35  			</object>
    1.36  			<object class="NSCustomObject" id="1014">
    1.37  				<string key="NSClassName">FirstResponder</string>
    1.38  			</object>
    1.39  			<object class="NSCustomObject" id="1050">
    1.40 -				<reference key="NSClassName" ref="1039455869"/>
    1.41 +				<string key="NSClassName">NSApplication</string>
    1.42  			</object>
    1.43  			<object class="NSMenu" id="649796088">
    1.44  				<string key="NSTitle">AMainMenu</string>
    1.45 @@ -33,41 +33,41 @@
    1.46  					<bool key="EncodedWithXMLCoder">YES</bool>
    1.47  					<object class="NSMenuItem" id="694149608">
    1.48  						<reference key="NSMenu" ref="649796088"/>
    1.49 -						<string key="NSTitle" id="101265034">GeekGameBoard</string>
    1.50 -						<string key="NSKeyEquiv" id="1003"/>
    1.51 +						<string key="NSTitle">GeekGameBoard</string>
    1.52 +						<string key="NSKeyEquiv"/>
    1.53  						<int key="NSKeyEquivModMask">1048576</int>
    1.54  						<int key="NSMnemonicLoc">2147483647</int>
    1.55  						<object class="NSCustomResource" key="NSOnImage" id="484312224">
    1.56 -							<string key="NSClassName" id="140112029">NSImage</string>
    1.57 +							<string key="NSClassName">NSImage</string>
    1.58  							<string key="NSResourceName">NSMenuCheckmark</string>
    1.59  						</object>
    1.60 -						<object class="NSCustomResource" key="NSMixedImage" id="309443010">
    1.61 -							<reference key="NSClassName" ref="140112029"/>
    1.62 +						<object class="NSCustomResource" key="NSMixedImage" id="237504539">
    1.63 +							<string key="NSClassName">NSImage</string>
    1.64  							<string key="NSResourceName">NSMenuMixedState</string>
    1.65  						</object>
    1.66  						<string key="NSAction">submenuAction:</string>
    1.67  						<object class="NSMenu" key="NSSubmenu" id="110575045">
    1.68 -							<reference key="NSTitle" ref="101265034"/>
    1.69 +							<string key="NSTitle">GeekGameBoard</string>
    1.70  							<object class="NSMutableArray" key="NSMenuItems">
    1.71  								<bool key="EncodedWithXMLCoder">YES</bool>
    1.72  								<object class="NSMenuItem" id="238522557">
    1.73  									<reference key="NSMenu" ref="110575045"/>
    1.74  									<string key="NSTitle">About GeekGameBoard</string>
    1.75 -									<reference key="NSKeyEquiv" ref="1003"/>
    1.76 +									<string key="NSKeyEquiv"/>
    1.77  									<int key="NSMnemonicLoc">2147483647</int>
    1.78  									<reference key="NSOnImage" ref="484312224"/>
    1.79 -									<reference key="NSMixedImage" ref="309443010"/>
    1.80 +									<reference key="NSMixedImage" ref="237504539"/>
    1.81  								</object>
    1.82  								<object class="NSMenuItem" id="304266470">
    1.83  									<reference key="NSMenu" ref="110575045"/>
    1.84  									<bool key="NSIsDisabled">YES</bool>
    1.85  									<bool key="NSIsSeparator">YES</bool>
    1.86 -									<reference key="NSTitle" ref="1003"/>
    1.87 -									<reference key="NSKeyEquiv" ref="1003"/>
    1.88 +									<string key="NSTitle"/>
    1.89 +									<string key="NSKeyEquiv"/>
    1.90  									<int key="NSKeyEquivModMask">1048576</int>
    1.91  									<int key="NSMnemonicLoc">2147483647</int>
    1.92  									<reference key="NSOnImage" ref="484312224"/>
    1.93 -									<reference key="NSMixedImage" ref="309443010"/>
    1.94 +									<reference key="NSMixedImage" ref="237504539"/>
    1.95  								</object>
    1.96  								<object class="NSMenuItem" id="609285721">
    1.97  									<reference key="NSMenu" ref="110575045"/>
    1.98 @@ -76,30 +76,30 @@
    1.99  									<int key="NSKeyEquivModMask">1048576</int>
   1.100  									<int key="NSMnemonicLoc">2147483647</int>
   1.101  									<reference key="NSOnImage" ref="484312224"/>
   1.102 -									<reference key="NSMixedImage" ref="309443010"/>
   1.103 +									<reference key="NSMixedImage" ref="237504539"/>
   1.104  								</object>
   1.105  								<object class="NSMenuItem" id="481834944">
   1.106  									<reference key="NSMenu" ref="110575045"/>
   1.107  									<bool key="NSIsDisabled">YES</bool>
   1.108  									<bool key="NSIsSeparator">YES</bool>
   1.109 -									<reference key="NSTitle" ref="1003"/>
   1.110 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.111 +									<string key="NSTitle"/>
   1.112 +									<string key="NSKeyEquiv"/>
   1.113  									<int key="NSKeyEquivModMask">1048576</int>
   1.114  									<int key="NSMnemonicLoc">2147483647</int>
   1.115  									<reference key="NSOnImage" ref="484312224"/>
   1.116 -									<reference key="NSMixedImage" ref="309443010"/>
   1.117 +									<reference key="NSMixedImage" ref="237504539"/>
   1.118  								</object>
   1.119  								<object class="NSMenuItem" id="1046388886">
   1.120  									<reference key="NSMenu" ref="110575045"/>
   1.121 -									<string key="NSTitle" id="487627014">Services</string>
   1.122 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.123 +									<string key="NSTitle">Services</string>
   1.124 +									<string key="NSKeyEquiv"/>
   1.125  									<int key="NSKeyEquivModMask">1048576</int>
   1.126  									<int key="NSMnemonicLoc">2147483647</int>
   1.127  									<reference key="NSOnImage" ref="484312224"/>
   1.128 -									<reference key="NSMixedImage" ref="309443010"/>
   1.129 +									<reference key="NSMixedImage" ref="237504539"/>
   1.130  									<string key="NSAction">submenuAction:</string>
   1.131  									<object class="NSMenu" key="NSSubmenu" id="752062318">
   1.132 -										<reference key="NSTitle" ref="487627014"/>
   1.133 +										<string key="NSTitle">Services</string>
   1.134  										<object class="NSMutableArray" key="NSMenuItems">
   1.135  											<bool key="EncodedWithXMLCoder">YES</bool>
   1.136  										</object>
   1.137 @@ -110,50 +110,50 @@
   1.138  									<reference key="NSMenu" ref="110575045"/>
   1.139  									<bool key="NSIsDisabled">YES</bool>
   1.140  									<bool key="NSIsSeparator">YES</bool>
   1.141 -									<reference key="NSTitle" ref="1003"/>
   1.142 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.143 +									<string key="NSTitle"/>
   1.144 +									<string key="NSKeyEquiv"/>
   1.145  									<int key="NSKeyEquivModMask">1048576</int>
   1.146  									<int key="NSMnemonicLoc">2147483647</int>
   1.147  									<reference key="NSOnImage" ref="484312224"/>
   1.148 -									<reference key="NSMixedImage" ref="309443010"/>
   1.149 +									<reference key="NSMixedImage" ref="237504539"/>
   1.150  								</object>
   1.151  								<object class="NSMenuItem" id="755159360">
   1.152  									<reference key="NSMenu" ref="110575045"/>
   1.153  									<string key="NSTitle">Hide GeekGameBoard</string>
   1.154 -									<string key="NSKeyEquiv" id="712247123">h</string>
   1.155 +									<string key="NSKeyEquiv">h</string>
   1.156  									<int key="NSKeyEquivModMask">1048576</int>
   1.157  									<int key="NSMnemonicLoc">2147483647</int>
   1.158  									<reference key="NSOnImage" ref="484312224"/>
   1.159 -									<reference key="NSMixedImage" ref="309443010"/>
   1.160 +									<reference key="NSMixedImage" ref="237504539"/>
   1.161  								</object>
   1.162  								<object class="NSMenuItem" id="342932134">
   1.163  									<reference key="NSMenu" ref="110575045"/>
   1.164  									<string key="NSTitle">Hide Others</string>
   1.165 -									<reference key="NSKeyEquiv" ref="712247123"/>
   1.166 +									<string key="NSKeyEquiv">h</string>
   1.167  									<int key="NSKeyEquivModMask">1572864</int>
   1.168  									<int key="NSMnemonicLoc">2147483647</int>
   1.169  									<reference key="NSOnImage" ref="484312224"/>
   1.170 -									<reference key="NSMixedImage" ref="309443010"/>
   1.171 +									<reference key="NSMixedImage" ref="237504539"/>
   1.172  								</object>
   1.173  								<object class="NSMenuItem" id="908899353">
   1.174  									<reference key="NSMenu" ref="110575045"/>
   1.175  									<string key="NSTitle">Show All</string>
   1.176 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.177 +									<string key="NSKeyEquiv"/>
   1.178  									<int key="NSKeyEquivModMask">1048576</int>
   1.179  									<int key="NSMnemonicLoc">2147483647</int>
   1.180  									<reference key="NSOnImage" ref="484312224"/>
   1.181 -									<reference key="NSMixedImage" ref="309443010"/>
   1.182 +									<reference key="NSMixedImage" ref="237504539"/>
   1.183  								</object>
   1.184  								<object class="NSMenuItem" id="1056857174">
   1.185  									<reference key="NSMenu" ref="110575045"/>
   1.186  									<bool key="NSIsDisabled">YES</bool>
   1.187  									<bool key="NSIsSeparator">YES</bool>
   1.188 -									<reference key="NSTitle" ref="1003"/>
   1.189 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.190 +									<string key="NSTitle"/>
   1.191 +									<string key="NSKeyEquiv"/>
   1.192  									<int key="NSKeyEquivModMask">1048576</int>
   1.193  									<int key="NSMnemonicLoc">2147483647</int>
   1.194  									<reference key="NSOnImage" ref="484312224"/>
   1.195 -									<reference key="NSMixedImage" ref="309443010"/>
   1.196 +									<reference key="NSMixedImage" ref="237504539"/>
   1.197  								</object>
   1.198  								<object class="NSMenuItem" id="632727374">
   1.199  									<reference key="NSMenu" ref="110575045"/>
   1.200 @@ -162,7 +162,7 @@
   1.201  									<int key="NSKeyEquivModMask">1048576</int>
   1.202  									<int key="NSMnemonicLoc">2147483647</int>
   1.203  									<reference key="NSOnImage" ref="484312224"/>
   1.204 -									<reference key="NSMixedImage" ref="309443010"/>
   1.205 +									<reference key="NSMixedImage" ref="237504539"/>
   1.206  								</object>
   1.207  							</object>
   1.208  							<string key="NSName">_NSAppleMenu</string>
   1.209 @@ -170,15 +170,15 @@
   1.210  					</object>
   1.211  					<object class="NSMenuItem" id="379814623">
   1.212  						<reference key="NSMenu" ref="649796088"/>
   1.213 -						<string key="NSTitle" id="589729360">File</string>
   1.214 -						<reference key="NSKeyEquiv" ref="1003"/>
   1.215 +						<string key="NSTitle">File</string>
   1.216 +						<string key="NSKeyEquiv"/>
   1.217  						<int key="NSKeyEquivModMask">1048576</int>
   1.218  						<int key="NSMnemonicLoc">2147483647</int>
   1.219  						<reference key="NSOnImage" ref="484312224"/>
   1.220 -						<reference key="NSMixedImage" ref="309443010"/>
   1.221 +						<reference key="NSMixedImage" ref="237504539"/>
   1.222  						<string key="NSAction">submenuAction:</string>
   1.223  						<object class="NSMenu" key="NSSubmenu" id="720053764">
   1.224 -							<reference key="NSTitle" ref="589729360"/>
   1.225 +							<string key="NSTitle">File</string>
   1.226  							<object class="NSMutableArray" key="NSMenuItems">
   1.227  								<bool key="EncodedWithXMLCoder">YES</bool>
   1.228  								<object class="NSMenuItem" id="705341025">
   1.229 @@ -188,7 +188,7 @@
   1.230  									<int key="NSKeyEquivModMask">1048576</int>
   1.231  									<int key="NSMnemonicLoc">2147483647</int>
   1.232  									<reference key="NSOnImage" ref="484312224"/>
   1.233 -									<reference key="NSMixedImage" ref="309443010"/>
   1.234 +									<reference key="NSMixedImage" ref="237504539"/>
   1.235  								</object>
   1.236  								<object class="NSMenuItem" id="722745758">
   1.237  									<reference key="NSMenu" ref="720053764"/>
   1.238 @@ -197,29 +197,29 @@
   1.239  									<int key="NSKeyEquivModMask">1048576</int>
   1.240  									<int key="NSMnemonicLoc">2147483647</int>
   1.241  									<reference key="NSOnImage" ref="484312224"/>
   1.242 -									<reference key="NSMixedImage" ref="309443010"/>
   1.243 +									<reference key="NSMixedImage" ref="237504539"/>
   1.244  								</object>
   1.245  								<object class="NSMenuItem" id="1025936716">
   1.246  									<reference key="NSMenu" ref="720053764"/>
   1.247 -									<string key="NSTitle" id="1022827674">Open Recent</string>
   1.248 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.249 +									<string key="NSTitle">Open Recent</string>
   1.250 +									<string key="NSKeyEquiv"/>
   1.251  									<int key="NSKeyEquivModMask">1048576</int>
   1.252  									<int key="NSMnemonicLoc">2147483647</int>
   1.253  									<reference key="NSOnImage" ref="484312224"/>
   1.254 -									<reference key="NSMixedImage" ref="309443010"/>
   1.255 +									<reference key="NSMixedImage" ref="237504539"/>
   1.256  									<string key="NSAction">submenuAction:</string>
   1.257  									<object class="NSMenu" key="NSSubmenu" id="1065607017">
   1.258 -										<reference key="NSTitle" ref="1022827674"/>
   1.259 +										<string key="NSTitle">Open Recent</string>
   1.260  										<object class="NSMutableArray" key="NSMenuItems">
   1.261  											<bool key="EncodedWithXMLCoder">YES</bool>
   1.262  											<object class="NSMenuItem" id="759406840">
   1.263  												<reference key="NSMenu" ref="1065607017"/>
   1.264  												<string key="NSTitle">Clear Menu</string>
   1.265 -												<reference key="NSKeyEquiv" ref="1003"/>
   1.266 +												<string key="NSKeyEquiv"/>
   1.267  												<int key="NSKeyEquivModMask">1048576</int>
   1.268  												<int key="NSMnemonicLoc">2147483647</int>
   1.269  												<reference key="NSOnImage" ref="484312224"/>
   1.270 -												<reference key="NSMixedImage" ref="309443010"/>
   1.271 +												<reference key="NSMixedImage" ref="237504539"/>
   1.272  											</object>
   1.273  										</object>
   1.274  										<string key="NSName">_NSRecentDocumentsMenu</string>
   1.275 @@ -229,12 +229,12 @@
   1.276  									<reference key="NSMenu" ref="720053764"/>
   1.277  									<bool key="NSIsDisabled">YES</bool>
   1.278  									<bool key="NSIsSeparator">YES</bool>
   1.279 -									<reference key="NSTitle" ref="1003"/>
   1.280 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.281 +									<string key="NSTitle"/>
   1.282 +									<string key="NSKeyEquiv"/>
   1.283  									<int key="NSKeyEquivModMask">1048576</int>
   1.284  									<int key="NSMnemonicLoc">2147483647</int>
   1.285  									<reference key="NSOnImage" ref="484312224"/>
   1.286 -									<reference key="NSMixedImage" ref="309443010"/>
   1.287 +									<reference key="NSMixedImage" ref="237504539"/>
   1.288  								</object>
   1.289  								<object class="NSMenuItem" id="776162233">
   1.290  									<reference key="NSMenu" ref="720053764"/>
   1.291 @@ -243,7 +243,7 @@
   1.292  									<int key="NSKeyEquivModMask">1048576</int>
   1.293  									<int key="NSMnemonicLoc">2147483647</int>
   1.294  									<reference key="NSOnImage" ref="484312224"/>
   1.295 -									<reference key="NSMixedImage" ref="309443010"/>
   1.296 +									<reference key="NSMixedImage" ref="237504539"/>
   1.297  								</object>
   1.298  								<object class="NSMenuItem" id="1023925487">
   1.299  									<reference key="NSMenu" ref="720053764"/>
   1.300 @@ -252,7 +252,7 @@
   1.301  									<int key="NSKeyEquivModMask">1048576</int>
   1.302  									<int key="NSMnemonicLoc">2147483647</int>
   1.303  									<reference key="NSOnImage" ref="484312224"/>
   1.304 -									<reference key="NSMixedImage" ref="309443010"/>
   1.305 +									<reference key="NSMixedImage" ref="237504539"/>
   1.306  								</object>
   1.307  								<object class="NSMenuItem" id="117038363">
   1.308  									<reference key="NSMenu" ref="720053764"/>
   1.309 @@ -261,26 +261,26 @@
   1.310  									<int key="NSKeyEquivModMask">1179648</int>
   1.311  									<int key="NSMnemonicLoc">2147483647</int>
   1.312  									<reference key="NSOnImage" ref="484312224"/>
   1.313 -									<reference key="NSMixedImage" ref="309443010"/>
   1.314 +									<reference key="NSMixedImage" ref="237504539"/>
   1.315  								</object>
   1.316  								<object class="NSMenuItem" id="579971712">
   1.317  									<reference key="NSMenu" ref="720053764"/>
   1.318  									<string key="NSTitle">Revert to Saved</string>
   1.319 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.320 +									<string key="NSKeyEquiv"/>
   1.321  									<int key="NSMnemonicLoc">2147483647</int>
   1.322  									<reference key="NSOnImage" ref="484312224"/>
   1.323 -									<reference key="NSMixedImage" ref="309443010"/>
   1.324 +									<reference key="NSMixedImage" ref="237504539"/>
   1.325  								</object>
   1.326  								<object class="NSMenuItem" id="1010469920">
   1.327  									<reference key="NSMenu" ref="720053764"/>
   1.328  									<bool key="NSIsDisabled">YES</bool>
   1.329  									<bool key="NSIsSeparator">YES</bool>
   1.330 -									<reference key="NSTitle" ref="1003"/>
   1.331 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.332 +									<string key="NSTitle"/>
   1.333 +									<string key="NSKeyEquiv"/>
   1.334  									<int key="NSKeyEquivModMask">1048576</int>
   1.335  									<int key="NSMnemonicLoc">2147483647</int>
   1.336  									<reference key="NSOnImage" ref="484312224"/>
   1.337 -									<reference key="NSMixedImage" ref="309443010"/>
   1.338 +									<reference key="NSMixedImage" ref="237504539"/>
   1.339  								</object>
   1.340  								<object class="NSMenuItem" id="294629803">
   1.341  									<reference key="NSMenu" ref="720053764"/>
   1.342 @@ -289,8 +289,8 @@
   1.343  									<int key="NSKeyEquivModMask">1179648</int>
   1.344  									<int key="NSMnemonicLoc">2147483647</int>
   1.345  									<reference key="NSOnImage" ref="484312224"/>
   1.346 -									<reference key="NSMixedImage" ref="309443010"/>
   1.347 -									<reference key="NSToolTip" ref="1003"/>
   1.348 +									<reference key="NSMixedImage" ref="237504539"/>
   1.349 +									<string key="NSToolTip"/>
   1.350  								</object>
   1.351  								<object class="NSMenuItem" id="49223823">
   1.352  									<reference key="NSMenu" ref="720053764"/>
   1.353 @@ -299,22 +299,22 @@
   1.354  									<int key="NSKeyEquivModMask">1048576</int>
   1.355  									<int key="NSMnemonicLoc">2147483647</int>
   1.356  									<reference key="NSOnImage" ref="484312224"/>
   1.357 -									<reference key="NSMixedImage" ref="309443010"/>
   1.358 +									<reference key="NSMixedImage" ref="237504539"/>
   1.359  								</object>
   1.360  							</object>
   1.361  						</object>
   1.362  					</object>
   1.363  					<object class="NSMenuItem" id="952259628">
   1.364  						<reference key="NSMenu" ref="649796088"/>
   1.365 -						<string key="NSTitle" id="459142759">Edit</string>
   1.366 -						<reference key="NSKeyEquiv" ref="1003"/>
   1.367 +						<string key="NSTitle">Edit</string>
   1.368 +						<string key="NSKeyEquiv"/>
   1.369  						<int key="NSKeyEquivModMask">1048576</int>
   1.370  						<int key="NSMnemonicLoc">2147483647</int>
   1.371  						<reference key="NSOnImage" ref="484312224"/>
   1.372 -						<reference key="NSMixedImage" ref="309443010"/>
   1.373 +						<reference key="NSMixedImage" ref="237504539"/>
   1.374  						<string key="NSAction">submenuAction:</string>
   1.375  						<object class="NSMenu" key="NSSubmenu" id="789758025">
   1.376 -							<reference key="NSTitle" ref="459142759"/>
   1.377 +							<string key="NSTitle">Edit</string>
   1.378  							<object class="NSMutableArray" key="NSMenuItems">
   1.379  								<bool key="EncodedWithXMLCoder">YES</bool>
   1.380  								<object class="NSMenuItem" id="1058277027">
   1.381 @@ -324,7 +324,7 @@
   1.382  									<int key="NSKeyEquivModMask">1048576</int>
   1.383  									<int key="NSMnemonicLoc">2147483647</int>
   1.384  									<reference key="NSOnImage" ref="484312224"/>
   1.385 -									<reference key="NSMixedImage" ref="309443010"/>
   1.386 +									<reference key="NSMixedImage" ref="237504539"/>
   1.387  								</object>
   1.388  								<object class="NSMenuItem" id="790794224">
   1.389  									<reference key="NSMenu" ref="789758025"/>
   1.390 @@ -333,18 +333,18 @@
   1.391  									<int key="NSKeyEquivModMask">1179648</int>
   1.392  									<int key="NSMnemonicLoc">2147483647</int>
   1.393  									<reference key="NSOnImage" ref="484312224"/>
   1.394 -									<reference key="NSMixedImage" ref="309443010"/>
   1.395 +									<reference key="NSMixedImage" ref="237504539"/>
   1.396  								</object>
   1.397  								<object class="NSMenuItem" id="1040322652">
   1.398  									<reference key="NSMenu" ref="789758025"/>
   1.399  									<bool key="NSIsDisabled">YES</bool>
   1.400  									<bool key="NSIsSeparator">YES</bool>
   1.401 -									<reference key="NSTitle" ref="1003"/>
   1.402 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.403 +									<string key="NSTitle"/>
   1.404 +									<string key="NSKeyEquiv"/>
   1.405  									<int key="NSKeyEquivModMask">1048576</int>
   1.406  									<int key="NSMnemonicLoc">2147483647</int>
   1.407  									<reference key="NSOnImage" ref="484312224"/>
   1.408 -									<reference key="NSMixedImage" ref="309443010"/>
   1.409 +									<reference key="NSMixedImage" ref="237504539"/>
   1.410  								</object>
   1.411  								<object class="NSMenuItem" id="296257095">
   1.412  									<reference key="NSMenu" ref="789758025"/>
   1.413 @@ -353,7 +353,7 @@
   1.414  									<int key="NSKeyEquivModMask">1048576</int>
   1.415  									<int key="NSMnemonicLoc">2147483647</int>
   1.416  									<reference key="NSOnImage" ref="484312224"/>
   1.417 -									<reference key="NSMixedImage" ref="309443010"/>
   1.418 +									<reference key="NSMixedImage" ref="237504539"/>
   1.419  								</object>
   1.420  								<object class="NSMenuItem" id="860595796">
   1.421  									<reference key="NSMenu" ref="789758025"/>
   1.422 @@ -362,7 +362,7 @@
   1.423  									<int key="NSKeyEquivModMask">1048576</int>
   1.424  									<int key="NSMnemonicLoc">2147483647</int>
   1.425  									<reference key="NSOnImage" ref="484312224"/>
   1.426 -									<reference key="NSMixedImage" ref="309443010"/>
   1.427 +									<reference key="NSMixedImage" ref="237504539"/>
   1.428  								</object>
   1.429  								<object class="NSMenuItem" id="29853731">
   1.430  									<reference key="NSMenu" ref="789758025"/>
   1.431 @@ -371,16 +371,16 @@
   1.432  									<int key="NSKeyEquivModMask">1048576</int>
   1.433  									<int key="NSMnemonicLoc">2147483647</int>
   1.434  									<reference key="NSOnImage" ref="484312224"/>
   1.435 -									<reference key="NSMixedImage" ref="309443010"/>
   1.436 +									<reference key="NSMixedImage" ref="237504539"/>
   1.437  								</object>
   1.438  								<object class="NSMenuItem" id="437104165">
   1.439  									<reference key="NSMenu" ref="789758025"/>
   1.440  									<string key="NSTitle">Delete</string>
   1.441 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.442 +									<string key="NSKeyEquiv"/>
   1.443  									<int key="NSKeyEquivModMask">1048576</int>
   1.444  									<int key="NSMnemonicLoc">2147483647</int>
   1.445  									<reference key="NSOnImage" ref="484312224"/>
   1.446 -									<reference key="NSMixedImage" ref="309443010"/>
   1.447 +									<reference key="NSMixedImage" ref="237504539"/>
   1.448  								</object>
   1.449  								<object class="NSMenuItem" id="583158037">
   1.450  									<reference key="NSMenu" ref="789758025"/>
   1.451 @@ -389,49 +389,49 @@
   1.452  									<int key="NSKeyEquivModMask">1048576</int>
   1.453  									<int key="NSMnemonicLoc">2147483647</int>
   1.454  									<reference key="NSOnImage" ref="484312224"/>
   1.455 -									<reference key="NSMixedImage" ref="309443010"/>
   1.456 +									<reference key="NSMixedImage" ref="237504539"/>
   1.457  								</object>
   1.458  								<object class="NSMenuItem" id="212016141">
   1.459  									<reference key="NSMenu" ref="789758025"/>
   1.460  									<bool key="NSIsDisabled">YES</bool>
   1.461  									<bool key="NSIsSeparator">YES</bool>
   1.462 -									<reference key="NSTitle" ref="1003"/>
   1.463 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.464 +									<string key="NSTitle"/>
   1.465 +									<string key="NSKeyEquiv"/>
   1.466  									<int key="NSKeyEquivModMask">1048576</int>
   1.467  									<int key="NSMnemonicLoc">2147483647</int>
   1.468  									<reference key="NSOnImage" ref="484312224"/>
   1.469 -									<reference key="NSMixedImage" ref="309443010"/>
   1.470 +									<reference key="NSMixedImage" ref="237504539"/>
   1.471  								</object>
   1.472  								<object class="NSMenuItem" id="676164635">
   1.473  									<reference key="NSMenu" ref="789758025"/>
   1.474 -									<string key="NSTitle" id="1050731385">Speech</string>
   1.475 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.476 +									<string key="NSTitle">Speech</string>
   1.477 +									<string key="NSKeyEquiv"/>
   1.478  									<int key="NSKeyEquivModMask">1048576</int>
   1.479  									<int key="NSMnemonicLoc">2147483647</int>
   1.480  									<reference key="NSOnImage" ref="484312224"/>
   1.481 -									<reference key="NSMixedImage" ref="309443010"/>
   1.482 +									<reference key="NSMixedImage" ref="237504539"/>
   1.483  									<string key="NSAction">submenuAction:</string>
   1.484  									<object class="NSMenu" key="NSSubmenu" id="785027613">
   1.485 -										<reference key="NSTitle" ref="1050731385"/>
   1.486 +										<string key="NSTitle">Speech</string>
   1.487  										<object class="NSMutableArray" key="NSMenuItems">
   1.488  											<bool key="EncodedWithXMLCoder">YES</bool>
   1.489  											<object class="NSMenuItem" id="731782645">
   1.490  												<reference key="NSMenu" ref="785027613"/>
   1.491  												<string key="NSTitle">Start Speaking</string>
   1.492 -												<reference key="NSKeyEquiv" ref="1003"/>
   1.493 +												<string key="NSKeyEquiv"/>
   1.494  												<int key="NSKeyEquivModMask">1048576</int>
   1.495  												<int key="NSMnemonicLoc">2147483647</int>
   1.496  												<reference key="NSOnImage" ref="484312224"/>
   1.497 -												<reference key="NSMixedImage" ref="309443010"/>
   1.498 +												<reference key="NSMixedImage" ref="237504539"/>
   1.499  											</object>
   1.500  											<object class="NSMenuItem" id="680220178">
   1.501  												<reference key="NSMenu" ref="785027613"/>
   1.502  												<string key="NSTitle">Stop Speaking</string>
   1.503 -												<reference key="NSKeyEquiv" ref="1003"/>
   1.504 +												<string key="NSKeyEquiv"/>
   1.505  												<int key="NSKeyEquivModMask">1048576</int>
   1.506  												<int key="NSMnemonicLoc">2147483647</int>
   1.507  												<reference key="NSOnImage" ref="484312224"/>
   1.508 -												<reference key="NSMixedImage" ref="309443010"/>
   1.509 +												<reference key="NSMixedImage" ref="237504539"/>
   1.510  											</object>
   1.511  										</object>
   1.512  									</object>
   1.513 @@ -441,55 +441,55 @@
   1.514  					</object>
   1.515  					<object class="NSMenuItem" id="517895433">
   1.516  						<reference key="NSMenu" ref="649796088"/>
   1.517 -						<string key="NSTitle" id="898761740">Game</string>
   1.518 -						<reference key="NSKeyEquiv" ref="1003"/>
   1.519 +						<string key="NSTitle">Game</string>
   1.520 +						<string key="NSKeyEquiv"/>
   1.521  						<int key="NSKeyEquivModMask">1048576</int>
   1.522  						<int key="NSMnemonicLoc">2147483647</int>
   1.523  						<reference key="NSOnImage" ref="484312224"/>
   1.524 -						<reference key="NSMixedImage" ref="309443010"/>
   1.525 +						<reference key="NSMixedImage" ref="237504539"/>
   1.526  						<string key="NSAction">submenuAction:</string>
   1.527  						<object class="NSMenu" key="NSSubmenu" id="330268596">
   1.528 -							<reference key="NSTitle" ref="898761740"/>
   1.529 +							<string key="NSTitle">Game</string>
   1.530  							<object class="NSMutableArray" key="NSMenuItems">
   1.531  								<bool key="EncodedWithXMLCoder">YES</bool>
   1.532  								<object class="NSMenuItem" id="394352720">
   1.533  									<reference key="NSMenu" ref="330268596"/>
   1.534  									<string key="NSTitle">Klondike (Solitaire)</string>
   1.535 -									<string key="NSKeyEquiv" id="344781584">1</string>
   1.536 +									<string key="NSKeyEquiv">1</string>
   1.537  									<int key="NSKeyEquivModMask">1048840</int>
   1.538  									<int key="NSMnemonicLoc">2147483647</int>
   1.539  									<reference key="NSOnImage" ref="484312224"/>
   1.540 -									<reference key="NSMixedImage" ref="309443010"/>
   1.541 +									<reference key="NSMixedImage" ref="237504539"/>
   1.542  								</object>
   1.543  								<object class="NSMenuItem" id="154289436">
   1.544  									<reference key="NSMenu" ref="330268596"/>
   1.545  									<bool key="NSIsDisabled">YES</bool>
   1.546  									<bool key="NSIsSeparator">YES</bool>
   1.547 -									<reference key="NSTitle" ref="1003"/>
   1.548 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.549 +									<string key="NSTitle"/>
   1.550 +									<string key="NSKeyEquiv"/>
   1.551  									<int key="NSKeyEquivModMask">1048576</int>
   1.552  									<int key="NSMnemonicLoc">2147483647</int>
   1.553  									<reference key="NSOnImage" ref="484312224"/>
   1.554 -									<reference key="NSMixedImage" ref="309443010"/>
   1.555 +									<reference key="NSMixedImage" ref="237504539"/>
   1.556  								</object>
   1.557  								<object class="NSMenuItem" id="630661937">
   1.558  									<reference key="NSMenu" ref="330268596"/>
   1.559  									<string key="NSTitle">Checkers</string>
   1.560 -									<string key="NSKeyEquiv" id="5220549">2</string>
   1.561 +									<string key="NSKeyEquiv">2</string>
   1.562  									<int key="NSKeyEquivModMask">1048840</int>
   1.563  									<int key="NSMnemonicLoc">2147483647</int>
   1.564  									<reference key="NSOnImage" ref="484312224"/>
   1.565 -									<reference key="NSMixedImage" ref="309443010"/>
   1.566 +									<reference key="NSMixedImage" ref="237504539"/>
   1.567  									<int key="NSTag">1</int>
   1.568  								</object>
   1.569  								<object class="NSMenuItem" id="778498721">
   1.570  									<reference key="NSMenu" ref="330268596"/>
   1.571  									<string key="NSTitle">Go</string>
   1.572 -									<string key="NSKeyEquiv" id="8808733">3</string>
   1.573 +									<string key="NSKeyEquiv">3</string>
   1.574  									<int key="NSKeyEquivModMask">1048840</int>
   1.575  									<int key="NSMnemonicLoc">2147483647</int>
   1.576  									<reference key="NSOnImage" ref="484312224"/>
   1.577 -									<reference key="NSMixedImage" ref="309443010"/>
   1.578 +									<reference key="NSMixedImage" ref="237504539"/>
   1.579  									<int key="NSTag">4</int>
   1.580  								</object>
   1.581  								<object class="NSMenuItem" id="538211827">
   1.582 @@ -499,17 +499,17 @@
   1.583  									<int key="NSKeyEquivModMask">1048840</int>
   1.584  									<int key="NSMnemonicLoc">2147483647</int>
   1.585  									<reference key="NSOnImage" ref="484312224"/>
   1.586 -									<reference key="NSMixedImage" ref="309443010"/>
   1.587 +									<reference key="NSMixedImage" ref="237504539"/>
   1.588  									<int key="NSTag">2</int>
   1.589  								</object>
   1.590  								<object class="NSMenuItem" id="739065818">
   1.591  									<reference key="NSMenu" ref="330268596"/>
   1.592  									<string key="NSTitle">Tic-Tac-Toe</string>
   1.593 -									<string key="NSKeyEquiv" id="720655175">5</string>
   1.594 +									<string key="NSKeyEquiv">5</string>
   1.595  									<int key="NSKeyEquivModMask">1048840</int>
   1.596  									<int key="NSMnemonicLoc">2147483647</int>
   1.597  									<reference key="NSOnImage" ref="484312224"/>
   1.598 -									<reference key="NSMixedImage" ref="309443010"/>
   1.599 +									<reference key="NSMixedImage" ref="237504539"/>
   1.600  									<int key="NSTag">3</int>
   1.601  								</object>
   1.602  							</object>
   1.603 @@ -517,15 +517,15 @@
   1.604  					</object>
   1.605  					<object class="NSMenuItem" id="586577488">
   1.606  						<reference key="NSMenu" ref="649796088"/>
   1.607 -						<string key="NSTitle" id="180305338">View</string>
   1.608 -						<reference key="NSKeyEquiv" ref="1003"/>
   1.609 +						<string key="NSTitle">View</string>
   1.610 +						<string key="NSKeyEquiv"/>
   1.611  						<int key="NSKeyEquivModMask">1048576</int>
   1.612  						<int key="NSMnemonicLoc">2147483647</int>
   1.613  						<reference key="NSOnImage" ref="484312224"/>
   1.614 -						<reference key="NSMixedImage" ref="309443010"/>
   1.615 +						<reference key="NSMixedImage" ref="237504539"/>
   1.616  						<string key="NSAction">submenuAction:</string>
   1.617  						<object class="NSMenu" key="NSSubmenu" id="466310130">
   1.618 -							<reference key="NSTitle" ref="180305338"/>
   1.619 +							<string key="NSTitle">View</string>
   1.620  							<object class="NSMutableArray" key="NSMenuItems">
   1.621  								<bool key="EncodedWithXMLCoder">YES</bool>
   1.622  								<object class="NSMenuItem" id="713673133">
   1.623 @@ -535,18 +535,18 @@
   1.624  									<int key="NSKeyEquivModMask">1048576</int>
   1.625  									<int key="NSMnemonicLoc">2147483647</int>
   1.626  									<reference key="NSOnImage" ref="484312224"/>
   1.627 -									<reference key="NSMixedImage" ref="309443010"/>
   1.628 +									<reference key="NSMixedImage" ref="237504539"/>
   1.629  								</object>
   1.630  								<object class="NSMenuItem" id="30531644">
   1.631  									<reference key="NSMenu" ref="466310130"/>
   1.632  									<bool key="NSIsDisabled">YES</bool>
   1.633  									<bool key="NSIsSeparator">YES</bool>
   1.634 -									<reference key="NSTitle" ref="1003"/>
   1.635 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.636 +									<string key="NSTitle"/>
   1.637 +									<string key="NSKeyEquiv"/>
   1.638  									<int key="NSKeyEquivModMask">1048576</int>
   1.639  									<int key="NSMnemonicLoc">2147483647</int>
   1.640  									<reference key="NSOnImage" ref="484312224"/>
   1.641 -									<reference key="NSMixedImage" ref="309443010"/>
   1.642 +									<reference key="NSMixedImage" ref="237504539"/>
   1.643  								</object>
   1.644  								<object class="NSMenuItem" id="102151532">
   1.645  									<reference key="NSMenu" ref="466310130"/>
   1.646 @@ -555,31 +555,31 @@
   1.647  									<int key="NSKeyEquivModMask">1572864</int>
   1.648  									<int key="NSMnemonicLoc">2147483647</int>
   1.649  									<reference key="NSOnImage" ref="484312224"/>
   1.650 -									<reference key="NSMixedImage" ref="309443010"/>
   1.651 +									<reference key="NSMixedImage" ref="237504539"/>
   1.652  								</object>
   1.653  								<object class="NSMenuItem" id="237841660">
   1.654  									<reference key="NSMenu" ref="466310130"/>
   1.655  									<string type="base64-UTF8" key="NSTitle">Q3VzdG9taXplIFRvb2xiYXLigKY</string>
   1.656 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.657 +									<string key="NSKeyEquiv"/>
   1.658  									<int key="NSKeyEquivModMask">1048576</int>
   1.659  									<int key="NSMnemonicLoc">2147483647</int>
   1.660  									<reference key="NSOnImage" ref="484312224"/>
   1.661 -									<reference key="NSMixedImage" ref="309443010"/>
   1.662 +									<reference key="NSMixedImage" ref="237504539"/>
   1.663  								</object>
   1.664  							</object>
   1.665  						</object>
   1.666  					</object>
   1.667  					<object class="NSMenuItem" id="713487014">
   1.668  						<reference key="NSMenu" ref="649796088"/>
   1.669 -						<string key="NSTitle" id="15506412">Window</string>
   1.670 -						<reference key="NSKeyEquiv" ref="1003"/>
   1.671 +						<string key="NSTitle">Window</string>
   1.672 +						<string key="NSKeyEquiv"/>
   1.673  						<int key="NSKeyEquivModMask">1048576</int>
   1.674  						<int key="NSMnemonicLoc">2147483647</int>
   1.675  						<reference key="NSOnImage" ref="484312224"/>
   1.676 -						<reference key="NSMixedImage" ref="309443010"/>
   1.677 +						<reference key="NSMixedImage" ref="237504539"/>
   1.678  						<string key="NSAction">submenuAction:</string>
   1.679  						<object class="NSMenu" key="NSSubmenu" id="835318025">
   1.680 -							<reference key="NSTitle" ref="15506412"/>
   1.681 +							<string key="NSTitle">Window</string>
   1.682  							<object class="NSMutableArray" key="NSMenuItems">
   1.683  								<bool key="EncodedWithXMLCoder">YES</bool>
   1.684  								<object class="NSMenuItem" id="1011231497">
   1.685 @@ -589,36 +589,36 @@
   1.686  									<int key="NSKeyEquivModMask">1048576</int>
   1.687  									<int key="NSMnemonicLoc">2147483647</int>
   1.688  									<reference key="NSOnImage" ref="484312224"/>
   1.689 -									<reference key="NSMixedImage" ref="309443010"/>
   1.690 +									<reference key="NSMixedImage" ref="237504539"/>
   1.691  								</object>
   1.692  								<object class="NSMenuItem" id="575023229">
   1.693  									<reference key="NSMenu" ref="835318025"/>
   1.694  									<string key="NSTitle">Zoom</string>
   1.695 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.696 +									<string key="NSKeyEquiv"/>
   1.697  									<int key="NSKeyEquivModMask">1048576</int>
   1.698  									<int key="NSMnemonicLoc">2147483647</int>
   1.699  									<reference key="NSOnImage" ref="484312224"/>
   1.700 -									<reference key="NSMixedImage" ref="309443010"/>
   1.701 +									<reference key="NSMixedImage" ref="237504539"/>
   1.702  								</object>
   1.703  								<object class="NSMenuItem" id="299356726">
   1.704  									<reference key="NSMenu" ref="835318025"/>
   1.705  									<bool key="NSIsDisabled">YES</bool>
   1.706  									<bool key="NSIsSeparator">YES</bool>
   1.707 -									<reference key="NSTitle" ref="1003"/>
   1.708 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.709 +									<string key="NSTitle"/>
   1.710 +									<string key="NSKeyEquiv"/>
   1.711  									<int key="NSKeyEquivModMask">1048576</int>
   1.712  									<int key="NSMnemonicLoc">2147483647</int>
   1.713  									<reference key="NSOnImage" ref="484312224"/>
   1.714 -									<reference key="NSMixedImage" ref="309443010"/>
   1.715 +									<reference key="NSMixedImage" ref="237504539"/>
   1.716  								</object>
   1.717  								<object class="NSMenuItem" id="625202149">
   1.718  									<reference key="NSMenu" ref="835318025"/>
   1.719  									<string key="NSTitle">Bring All to Front</string>
   1.720 -									<reference key="NSKeyEquiv" ref="1003"/>
   1.721 +									<string key="NSKeyEquiv"/>
   1.722  									<int key="NSKeyEquivModMask">1048576</int>
   1.723  									<int key="NSMnemonicLoc">2147483647</int>
   1.724  									<reference key="NSOnImage" ref="484312224"/>
   1.725 -									<reference key="NSMixedImage" ref="309443010"/>
   1.726 +									<reference key="NSMixedImage" ref="237504539"/>
   1.727  								</object>
   1.728  							</object>
   1.729  							<string key="NSName">_NSWindowsMenu</string>
   1.730 @@ -626,15 +626,15 @@
   1.731  					</object>
   1.732  					<object class="NSMenuItem" id="391199113">
   1.733  						<reference key="NSMenu" ref="649796088"/>
   1.734 -						<string key="NSTitle" id="519223894">Help</string>
   1.735 -						<reference key="NSKeyEquiv" ref="1003"/>
   1.736 +						<string key="NSTitle">Help</string>
   1.737 +						<string key="NSKeyEquiv"/>
   1.738  						<int key="NSKeyEquivModMask">1048576</int>
   1.739  						<int key="NSMnemonicLoc">2147483647</int>
   1.740  						<reference key="NSOnImage" ref="484312224"/>
   1.741 -						<reference key="NSMixedImage" ref="309443010"/>
   1.742 +						<reference key="NSMixedImage" ref="237504539"/>
   1.743  						<string key="NSAction">submenuAction:</string>
   1.744  						<object class="NSMenu" key="NSSubmenu" id="374024848">
   1.745 -							<reference key="NSTitle" ref="519223894"/>
   1.746 +							<string key="NSTitle">Help</string>
   1.747  							<object class="NSMutableArray" key="NSMenuItems">
   1.748  								<bool key="EncodedWithXMLCoder">YES</bool>
   1.749  							</object>
   1.750 @@ -646,9 +646,9 @@
   1.751  			<object class="NSWindowTemplate" id="972006081">
   1.752  				<int key="NSWindowStyleMask">7</int>
   1.753  				<int key="NSWindowBacking">2</int>
   1.754 -				<string key="NSWindowRect">{{57, 175}, {1084, 587}}</string>
   1.755 +				<string key="NSWindowRect">{{57, 145}, {1084, 617}}</string>
   1.756  				<int key="NSWTFlags">1946157056</int>
   1.757 -				<reference key="NSWindowTitle" ref="101265034"/>
   1.758 +				<string key="NSWindowTitle">GeekGameBoard</string>
   1.759  				<string key="NSWindowClass">NSWindow</string>
   1.760  				<nil key="NSViewClass"/>
   1.761  				<object class="NSView" key="NSWindowView" id="439893737">
   1.762 @@ -659,19 +659,43 @@
   1.763  						<object class="NSCustomView" id="1060834180">
   1.764  							<reference key="NSNextResponder" ref="439893737"/>
   1.765  							<int key="NSvFlags">274</int>
   1.766 -							<string key="NSFrameSize">{1084, 587}</string>
   1.767 +							<string key="NSFrame">{{0, 30}, {1084, 587}}</string>
   1.768  							<reference key="NSSuperview" ref="439893737"/>
   1.769 -							<reference key="NSWindow"/>
   1.770  							<bool key="NSViewIsLayerTreeHost">YES</bool>
   1.771  							<string key="NSClassName">DemoBoardView</string>
   1.772  						</object>
   1.773 +						<object class="NSSlider" id="817996208">
   1.774 +							<reference key="NSNextResponder" ref="439893737"/>
   1.775 +							<int key="NSvFlags">290</int>
   1.776 +							<string key="NSFrame">{{162, 1}, {754, 25}}</string>
   1.777 +							<reference key="NSSuperview" ref="439893737"/>
   1.778 +							<bool key="NSEnabled">YES</bool>
   1.779 +							<object class="NSSliderCell" key="NSCell" id="42512652">
   1.780 +								<int key="NSCellFlags">-2080244224</int>
   1.781 +								<int key="NSCellFlags2">0</int>
   1.782 +								<string key="NSContents"/>
   1.783 +								<object class="NSFont" key="NSSupport">
   1.784 +									<string key="NSName">Helvetica</string>
   1.785 +									<double key="NSSize">1.200000e+01</double>
   1.786 +									<int key="NSfFlags">16</int>
   1.787 +								</object>
   1.788 +								<reference key="NSControlView" ref="817996208"/>
   1.789 +								<double key="NSMaxValue">1.000000e+00</double>
   1.790 +								<double key="NSMinValue">0.000000e+00</double>
   1.791 +								<double key="NSValue">0.000000e+00</double>
   1.792 +								<double key="NSAltIncValue">0.000000e+00</double>
   1.793 +								<int key="NSNumberOfTickMarks">2</int>
   1.794 +								<int key="NSTickMarkPosition">0</int>
   1.795 +								<bool key="NSAllowsTickMarkValuesOnly">YES</bool>
   1.796 +								<bool key="NSVertical">NO</bool>
   1.797 +							</object>
   1.798 +						</object>
   1.799  					</object>
   1.800 -					<string key="NSFrameSize">{1084, 587}</string>
   1.801 +					<string key="NSFrameSize">{1084, 617}</string>
   1.802  					<reference key="NSSuperview"/>
   1.803 -					<reference key="NSWindow"/>
   1.804  				</object>
   1.805  				<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
   1.806 -				<reference key="NSFrameAutosaveName" ref="1003"/>
   1.807 +				<string key="NSFrameAutosaveName"/>
   1.808  			</object>
   1.809  		</object>
   1.810  		<object class="IBObjectContainer" key="IBDocument.Objects">
   1.811 @@ -911,7 +935,7 @@
   1.812  				</object>
   1.813  				<object class="IBConnectionRecord">
   1.814  					<object class="IBActionConnection" key="connection">
   1.815 -						<string key="label" id="560321708">startGameFromMenu:</string>
   1.816 +						<string key="label">startGameFromMenu:</string>
   1.817  						<reference key="source" ref="1060834180"/>
   1.818  						<reference key="destination" ref="394352720"/>
   1.819  					</object>
   1.820 @@ -919,7 +943,7 @@
   1.821  				</object>
   1.822  				<object class="IBConnectionRecord">
   1.823  					<object class="IBActionConnection" key="connection">
   1.824 -						<reference key="label" ref="560321708"/>
   1.825 +						<string key="label">startGameFromMenu:</string>
   1.826  						<reference key="source" ref="1060834180"/>
   1.827  						<reference key="destination" ref="630661937"/>
   1.828  					</object>
   1.829 @@ -927,7 +951,7 @@
   1.830  				</object>
   1.831  				<object class="IBConnectionRecord">
   1.832  					<object class="IBActionConnection" key="connection">
   1.833 -						<reference key="label" ref="560321708"/>
   1.834 +						<string key="label">startGameFromMenu:</string>
   1.835  						<reference key="source" ref="1060834180"/>
   1.836  						<reference key="destination" ref="538211827"/>
   1.837  					</object>
   1.838 @@ -935,7 +959,7 @@
   1.839  				</object>
   1.840  				<object class="IBConnectionRecord">
   1.841  					<object class="IBActionConnection" key="connection">
   1.842 -						<reference key="label" ref="560321708"/>
   1.843 +						<string key="label">startGameFromMenu:</string>
   1.844  						<reference key="source" ref="1060834180"/>
   1.845  						<reference key="destination" ref="739065818"/>
   1.846  					</object>
   1.847 @@ -943,7 +967,7 @@
   1.848  				</object>
   1.849  				<object class="IBConnectionRecord">
   1.850  					<object class="IBActionConnection" key="connection">
   1.851 -						<reference key="label" ref="560321708"/>
   1.852 +						<string key="label">startGameFromMenu:</string>
   1.853  						<reference key="source" ref="1060834180"/>
   1.854  						<reference key="destination" ref="778498721"/>
   1.855  					</object>
   1.856 @@ -965,6 +989,14 @@
   1.857  					</object>
   1.858  					<int key="connectionID">400</int>
   1.859  				</object>
   1.860 +				<object class="IBConnectionRecord">
   1.861 +					<object class="IBOutletConnection" key="connection">
   1.862 +						<string key="label">_turnSlider</string>
   1.863 +						<reference key="source" ref="1060834180"/>
   1.864 +						<reference key="destination" ref="817996208"/>
   1.865 +					</object>
   1.866 +					<int key="connectionID">403</int>
   1.867 +				</object>
   1.868  			</object>
   1.869  			<object class="IBMutableOrderedSet" key="objectRecords">
   1.870  				<object class="NSArray" key="orderedObjects">
   1.871 @@ -1037,7 +1069,7 @@
   1.872  							<reference ref="374024848"/>
   1.873  						</object>
   1.874  						<reference key="parent" ref="649796088"/>
   1.875 -						<reference key="objectName" ref="344781584"/>
   1.876 +						<string key="objectName">1</string>
   1.877  					</object>
   1.878  					<object class="IBObjectRecord">
   1.879  						<int key="objectID">217</int>
   1.880 @@ -1080,7 +1112,7 @@
   1.881  						<int key="objectID">75</int>
   1.882  						<reference key="object" ref="1023925487"/>
   1.883  						<reference key="parent" ref="720053764"/>
   1.884 -						<reference key="objectName" ref="8808733"/>
   1.885 +						<string key="objectName">3</string>
   1.886  					</object>
   1.887  					<object class="IBObjectRecord">
   1.888  						<int key="objectID">80</int>
   1.889 @@ -1118,13 +1150,13 @@
   1.890  						<int key="objectID">77</int>
   1.891  						<reference key="object" ref="294629803"/>
   1.892  						<reference key="parent" ref="720053764"/>
   1.893 -						<reference key="objectName" ref="720655175"/>
   1.894 +						<string key="objectName">5</string>
   1.895  					</object>
   1.896  					<object class="IBObjectRecord">
   1.897  						<int key="objectID">73</int>
   1.898  						<reference key="object" ref="776162233"/>
   1.899  						<reference key="parent" ref="720053764"/>
   1.900 -						<reference key="objectName" ref="344781584"/>
   1.901 +						<string key="objectName">1</string>
   1.902  					</object>
   1.903  					<object class="IBObjectRecord">
   1.904  						<int key="objectID">79</int>
   1.905 @@ -1142,7 +1174,7 @@
   1.906  						<int key="objectID">74</int>
   1.907  						<reference key="object" ref="1010469920"/>
   1.908  						<reference key="parent" ref="720053764"/>
   1.909 -						<reference key="objectName" ref="5220549"/>
   1.910 +						<string key="objectName">2</string>
   1.911  					</object>
   1.912  					<object class="IBObjectRecord">
   1.913  						<int key="objectID">125</int>
   1.914 @@ -1228,7 +1260,7 @@
   1.915  							<bool key="EncodedWithXMLCoder">YES</bool>
   1.916  						</object>
   1.917  						<reference key="parent" ref="391199113"/>
   1.918 -						<reference key="objectName" ref="5220549"/>
   1.919 +						<string key="objectName">2</string>
   1.920  					</object>
   1.921  					<object class="IBObjectRecord">
   1.922  						<int key="objectID">57</int>
   1.923 @@ -1422,6 +1454,7 @@
   1.924  						<object class="NSMutableArray" key="children">
   1.925  							<bool key="EncodedWithXMLCoder">YES</bool>
   1.926  							<reference ref="1060834180"/>
   1.927 +							<reference ref="817996208"/>
   1.928  						</object>
   1.929  						<reference key="parent" ref="972006081"/>
   1.930  					</object>
   1.931 @@ -1493,6 +1526,20 @@
   1.932  						<reference key="object" ref="778498721"/>
   1.933  						<reference key="parent" ref="330268596"/>
   1.934  					</object>
   1.935 +					<object class="IBObjectRecord">
   1.936 +						<int key="objectID">401</int>
   1.937 +						<reference key="object" ref="817996208"/>
   1.938 +						<object class="NSMutableArray" key="children">
   1.939 +							<bool key="EncodedWithXMLCoder">YES</bool>
   1.940 +							<reference ref="42512652"/>
   1.941 +						</object>
   1.942 +						<reference key="parent" ref="439893737"/>
   1.943 +					</object>
   1.944 +					<object class="IBObjectRecord">
   1.945 +						<int key="objectID">402</int>
   1.946 +						<reference key="object" ref="42512652"/>
   1.947 +						<reference key="parent" ref="817996208"/>
   1.948 +					</object>
   1.949  				</object>
   1.950  			</object>
   1.951  			<object class="NSMutableDictionary" key="flattenedProperties">
   1.952 @@ -1580,6 +1627,7 @@
   1.953  					<string>24.IBPluginDependency</string>
   1.954  					<string>24.ImportedFromIB2</string>
   1.955  					<string>24.editorWindowContentRectSynchronizationRect</string>
   1.956 +					<string>29.IBEditorWindowLastContentRect</string>
   1.957  					<string>29.IBPluginDependency</string>
   1.958  					<string>29.ImportedFromIB2</string>
   1.959  					<string>29.WindowOrigin</string>
   1.960 @@ -1589,15 +1637,18 @@
   1.961  					<string>296.editorWindowContentRectSynchronizationRect</string>
   1.962  					<string>297.IBPluginDependency</string>
   1.963  					<string>298.IBPluginDependency</string>
   1.964 +					<string>371.IBEditorWindowLastContentRect</string>
   1.965  					<string>371.IBPluginDependency</string>
   1.966  					<string>371.IBWindowTemplateEditedContentRect</string>
   1.967  					<string>371.NSWindowTemplate.visibleAtLaunch</string>
   1.968  					<string>371.editorWindowContentRectSynchronizationRect</string>
   1.969 +					<string>371.lastResizeAction</string>
   1.970  					<string>372.IBPluginDependency</string>
   1.971  					<string>375.IBPluginDependency</string>
   1.972  					<string>376.IBPluginDependency</string>
   1.973  					<string>377.IBPluginDependency</string>
   1.974  					<string>379.IBPluginDependency</string>
   1.975 +					<string>380.IBEditorWindowLastContentRect</string>
   1.976  					<string>380.IBPluginDependency</string>
   1.977  					<string>380.editorWindowContentRectSynchronizationRect</string>
   1.978  					<string>381.IBPluginDependency</string>
   1.979 @@ -1606,6 +1657,8 @@
   1.980  					<string>384.IBPluginDependency</string>
   1.981  					<string>387.IBPluginDependency</string>
   1.982  					<string>393.IBPluginDependency</string>
   1.983 +					<string>401.IBPluginDependency</string>
   1.984 +					<string>402.IBPluginDependency</string>
   1.985  					<string>5.IBPluginDependency</string>
   1.986  					<string>5.ImportedFromIB2</string>
   1.987  					<string>56.IBPluginDependency</string>
   1.988 @@ -1643,146 +1696,164 @@
   1.989  				</object>
   1.990  				<object class="NSMutableArray" key="dict.values">
   1.991  					<bool key="EncodedWithXMLCoder">YES</bool>
   1.992 -					<reference ref="248469711"/>
   1.993 -					<reference ref="617114957"/>
   1.994 -					<reference ref="617114957"/>
   1.995 -					<reference ref="248469711"/>
   1.996 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
   1.997 +					<string>com.apple.InterfaceBuilderKit</string>
   1.998 +					<string>com.apple.InterfaceBuilderKit</string>
   1.999 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1000  					<integer value="1" id="9"/>
  1.1001 -					<reference ref="248469711"/>
  1.1002 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1003  					<reference ref="9"/>
  1.1004  					<string>{{497, 828}, {64, 6}}</string>
  1.1005 -					<reference ref="248469711"/>
  1.1006 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1007  					<reference ref="9"/>
  1.1008 -					<reference ref="248469711"/>
  1.1009 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1010  					<reference ref="9"/>
  1.1011 -					<reference ref="248469711"/>
  1.1012 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1013  					<reference ref="9"/>
  1.1014  					<string>{{522, 812}, {146, 23}}</string>
  1.1015 -					<reference ref="248469711"/>
  1.1016 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1017  					<reference ref="9"/>
  1.1018 -					<reference ref="248469711"/>
  1.1019 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1020  					<reference ref="9"/>
  1.1021 -					<reference ref="248469711"/>
  1.1022 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1023  					<reference ref="9"/>
  1.1024  					<string>{{436, 809}, {64, 6}}</string>
  1.1025 -					<reference ref="248469711"/>
  1.1026 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1027  					<reference ref="9"/>
  1.1028 -					<reference ref="248469711"/>
  1.1029 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1030  					<reference ref="9"/>
  1.1031 -					<reference ref="248469711"/>
  1.1032 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1033  					<reference ref="9"/>
  1.1034 -					<reference ref="248469711"/>
  1.1035 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1036  					<reference ref="9"/>
  1.1037 -					<reference ref="248469711"/>
  1.1038 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1039  					<reference ref="9"/>
  1.1040 -					<reference ref="248469711"/>
  1.1041 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1042  					<reference ref="9"/>
  1.1043 -					<reference ref="248469711"/>
  1.1044 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1045  					<reference ref="9"/>
  1.1046 -					<reference ref="248469711"/>
  1.1047 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1048  					<reference ref="9"/>
  1.1049 -					<reference ref="248469711"/>
  1.1050 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1051  					<reference ref="9"/>
  1.1052 -					<reference ref="248469711"/>
  1.1053 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1054  					<reference ref="9"/>
  1.1055 -					<reference ref="248469711"/>
  1.1056 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1057  					<reference ref="9"/>
  1.1058 -					<reference ref="248469711"/>
  1.1059 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1060  					<reference ref="9"/>
  1.1061 -					<reference ref="248469711"/>
  1.1062 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1063  					<reference ref="9"/>
  1.1064 -					<reference ref="248469711"/>
  1.1065 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1066  					<reference ref="9"/>
  1.1067 -					<reference ref="248469711"/>
  1.1068 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1069  					<reference ref="9"/>
  1.1070 -					<reference ref="248469711"/>
  1.1071 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1072  					<reference ref="9"/>
  1.1073 -					<reference ref="248469711"/>
  1.1074 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1075  					<reference ref="9"/>
  1.1076  					<string>{{271, 653}, {154, 183}}</string>
  1.1077 -					<reference ref="248469711"/>
  1.1078 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1079  					<reference ref="9"/>
  1.1080 -					<reference ref="248469711"/>
  1.1081 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1082  					<reference ref="9"/>
  1.1083 -					<reference ref="248469711"/>
  1.1084 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1085  					<reference ref="9"/>
  1.1086 -					<reference ref="248469711"/>
  1.1087 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1088  					<reference ref="9"/>
  1.1089  					<string>{{514, 573}, {167, 43}}</string>
  1.1090 -					<reference ref="248469711"/>
  1.1091 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1092  					<reference ref="9"/>
  1.1093 -					<reference ref="248469711"/>
  1.1094 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1095  					<reference ref="9"/>
  1.1096 -					<reference ref="248469711"/>
  1.1097 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1098  					<reference ref="9"/>
  1.1099 -					<reference ref="248469711"/>
  1.1100 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1101  					<reference ref="9"/>
  1.1102 -					<reference ref="248469711"/>
  1.1103 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1104  					<reference ref="9"/>
  1.1105 -					<reference ref="248469711"/>
  1.1106 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1107  					<reference ref="9"/>
  1.1108 -					<reference ref="248469711"/>
  1.1109 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1110  					<reference ref="9"/>
  1.1111  					<string>{{525, 802}, {197, 73}}</string>
  1.1112 -					<reference ref="248469711"/>
  1.1113 +					<string>{{79, 825}, {473, 20}}</string>
  1.1114 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1115  					<reference ref="9"/>
  1.1116  					<string>{74, 862}</string>
  1.1117  					<string>{{85, 834}, {473, 20}}</string>
  1.1118 -					<reference ref="248469711"/>
  1.1119 -					<reference ref="248469711"/>
  1.1120 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1121 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1122  					<string>{{319, 763}, {234, 73}}</string>
  1.1123 -					<reference ref="248469711"/>
  1.1124 -					<reference ref="248469711"/>
  1.1125 -					<reference ref="248469711"/>
  1.1126 -					<string>{{117, 199}, {1084, 587}}</string>
  1.1127 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1128 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1129 +					<string>{{85, 58}, {1084, 617}}</string>
  1.1130 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1131 +					<string>{{85, 58}, {1084, 617}}</string>
  1.1132  					<reference ref="9"/>
  1.1133  					<string>{{117, 199}, {1084, 587}}</string>
  1.1134 -					<reference ref="248469711"/>
  1.1135 -					<reference ref="248469711"/>
  1.1136 -					<reference ref="248469711"/>
  1.1137 -					<reference ref="248469711"/>
  1.1138 -					<reference ref="248469711"/>
  1.1139 -					<reference ref="248469711"/>
  1.1140 +					<object class="NSDictionary">
  1.1141 +						<bool key="EncodedWithXMLCoder">YES</bool>
  1.1142 +						<object class="NSMutableArray" key="dict.sortedKeys">
  1.1143 +							<bool key="EncodedWithXMLCoder">YES</bool>
  1.1144 +							<string>IBResizeActionFinalFrame</string>
  1.1145 +							<string>IBResizeActionInitialFrame</string>
  1.1146 +						</object>
  1.1147 +						<object class="NSMutableArray" key="dict.values">
  1.1148 +							<bool key="EncodedWithXMLCoder">YES</bool>
  1.1149 +							<string>{{60, 145}, {1084, 617}}</string>
  1.1150 +							<string>{{60, 175}, {1084, 587}}</string>
  1.1151 +						</object>
  1.1152 +					</object>
  1.1153 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1154 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1155 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1156 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1157 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1158 +					<string>{{313, 712}, {205, 113}}</string>
  1.1159 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1160  					<string>{{319, 721}, {205, 113}}</string>
  1.1161 -					<reference ref="248469711"/>
  1.1162 -					<reference ref="248469711"/>
  1.1163 -					<reference ref="248469711"/>
  1.1164 -					<reference ref="248469711"/>
  1.1165 -					<reference ref="248469711"/>
  1.1166 -					<reference ref="248469711"/>
  1.1167 -					<reference ref="248469711"/>
  1.1168 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1169 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1170 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1171 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1172 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1173 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1174 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1175 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1176 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1177  					<reference ref="9"/>
  1.1178 -					<reference ref="248469711"/>
  1.1179 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1180  					<reference ref="9"/>
  1.1181 -					<reference ref="248469711"/>
  1.1182 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1183  					<reference ref="9"/>
  1.1184  					<string>{{97, 651}, {250, 183}}</string>
  1.1185 -					<reference ref="248469711"/>
  1.1186 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1187  					<reference ref="9"/>
  1.1188 -					<reference ref="248469711"/>
  1.1189 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1190  					<reference ref="9"/>
  1.1191 -					<reference ref="248469711"/>
  1.1192 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1193  					<reference ref="9"/>
  1.1194 -					<reference ref="248469711"/>
  1.1195 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1196  					<reference ref="9"/>
  1.1197 -					<reference ref="248469711"/>
  1.1198 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1199  					<reference ref="9"/>
  1.1200 -					<reference ref="248469711"/>
  1.1201 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1202  					<reference ref="9"/>
  1.1203 -					<reference ref="248469711"/>
  1.1204 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1205  					<reference ref="9"/>
  1.1206 -					<reference ref="248469711"/>
  1.1207 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1208  					<reference ref="9"/>
  1.1209 -					<reference ref="248469711"/>
  1.1210 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1211  					<reference ref="9"/>
  1.1212 -					<reference ref="248469711"/>
  1.1213 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1214  					<reference ref="9"/>
  1.1215  					<string>{{233, 633}, {199, 203}}</string>
  1.1216 -					<reference ref="248469711"/>
  1.1217 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1218  					<reference ref="9"/>
  1.1219 -					<reference ref="248469711"/>
  1.1220 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1221  					<reference ref="9"/>
  1.1222 -					<reference ref="248469711"/>
  1.1223 +					<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
  1.1224  					<reference ref="9"/>
  1.1225  				</object>
  1.1226  			</object>
  1.1227 @@ -1806,7 +1877,7 @@
  1.1228  				</object>
  1.1229  			</object>
  1.1230  			<nil key="sourceID"/>
  1.1231 -			<int key="maxID">400</int>
  1.1232 +			<int key="maxID">403</int>
  1.1233  		</object>
  1.1234  		<object class="IBClassDescriber" key="IBDocument.Classes">
  1.1235  			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
  1.1236 @@ -1816,19 +1887,10 @@
  1.1237  					<string key="superclassName">NSView</string>
  1.1238  					<object class="NSMutableDictionary" key="actions">
  1.1239  						<string key="NS.key.0">enterFullScreen:</string>
  1.1240 -						<string key="NS.object.0" id="765642758">id</string>
  1.1241 -					</object>
  1.1242 -					<object class="NSMutableDictionary" key="outlets">
  1.1243 -						<bool key="EncodedWithXMLCoder">YES</bool>
  1.1244 -						<object class="NSArray" key="dict.sortedKeys">
  1.1245 -							<bool key="EncodedWithXMLCoder">YES</bool>
  1.1246 -						</object>
  1.1247 -						<object class="NSMutableArray" key="dict.values">
  1.1248 -							<bool key="EncodedWithXMLCoder">YES</bool>
  1.1249 -						</object>
  1.1250 +						<string key="NS.object.0">id</string>
  1.1251  					</object>
  1.1252  					<object class="IBClassDescriptionSource" key="sourceIdentifier">
  1.1253 -						<string key="majorKey" id="755626269">IBProjectSource</string>
  1.1254 +						<string key="majorKey">IBProjectSource</string>
  1.1255  						<string key="minorKey">Source/BoardView.h</string>
  1.1256  					</object>
  1.1257  				</object>
  1.1258 @@ -1837,290 +1899,21 @@
  1.1259  					<string key="superclassName">BoardView</string>
  1.1260  					<object class="NSMutableDictionary" key="actions">
  1.1261  						<string key="NS.key.0">startGameFromMenu:</string>
  1.1262 -						<reference key="NS.object.0" ref="765642758"/>
  1.1263 +						<string key="NS.object.0">id</string>
  1.1264  					</object>
  1.1265  					<object class="NSMutableDictionary" key="outlets">
  1.1266 -						<bool key="EncodedWithXMLCoder">YES</bool>
  1.1267 -						<object class="NSArray" key="dict.sortedKeys">
  1.1268 -							<bool key="EncodedWithXMLCoder">YES</bool>
  1.1269 -						</object>
  1.1270 -						<object class="NSMutableArray" key="dict.values">
  1.1271 -							<bool key="EncodedWithXMLCoder">YES</bool>
  1.1272 -						</object>
  1.1273 +						<string key="NS.key.0">_turnSlider</string>
  1.1274 +						<string key="NS.object.0">NSSlider</string>
  1.1275  					</object>
  1.1276  					<object class="IBClassDescriptionSource" key="sourceIdentifier">
  1.1277 -						<reference key="majorKey" ref="755626269"/>
  1.1278 +						<string key="majorKey">IBProjectSource</string>
  1.1279  						<string key="minorKey">Source/DemoBoardView.h</string>
  1.1280  					</object>
  1.1281  				</object>
  1.1282  			</object>
  1.1283  		</object>
  1.1284  		<int key="IBDocument.localizationMode">0</int>
  1.1285 -		<string key="IBDocument.LastKnownRelativeProjectPath">../../GeekGameBoard.xcodeproj</string>
  1.1286 +		<string key="IBDocument.LastKnownRelativeProjectPath">../GeekGameBoard.xcodeproj</string>
  1.1287  		<int key="IBDocument.defaultPropertyAccessControl">3</int>
  1.1288 -		<object class="NSMutableData" key="IBDocument.RunnableNib">
  1.1289 -			<bytes key="NS.bytes">YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA
  1.1290 -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEByQALAAwAMQA1ADYAPAA9
  1.1291 -AEIAWABZAFoAWwALAGgAbAB2AHcAeAB9AHYACwCBAIMAhACFAIgAjACzALsAzADRANIA0wDYANkA2gDd
  1.1292 -AOEA4gDlAOYA6gDuAPYA/AD9AP4BAgEJAQ0BDgEPARMBGgEeAR8BIAEkASwBMAExATIBMwE4ATkBPAFA
  1.1293 -AUcBSAFJAUoBTgFVAVkBWgFbAV8BZgFnAWgBbAF0AXkBegF7AXwBgAGHAYgBiQGKAY4BlQGWAZcBmAGd
  1.1294 -AaUBpgGnAawBtAG1AbYBugHBAcIBwwHIAc8B0AHRAdUB3AHhAeIB4wHnAe4B7wHwAfEB9QH8Af0B/gH/
  1.1295 -AgMCCgILAgwCDQIRAhoCGwIcAh0CIQIoAikCKgIuAjUCNgI3AjgCPAJDAkQCRQJGAkoCUQJSAlMCWAJZ
  1.1296 -Al0CZAJlAmYCZwJsAnMCdAJ1AnoCgQKCAoMChAKJApECkgKTApcCngKfAqACoQKlAqwCrQKuAq8CswK6
  1.1297 -ArsCvAK9AsECyALJAsoCywLPAtYC1wLYAtwC4wLkAuUC5gMwAzEDOANDA0QDRgNRA1YDVwNlA24DdQN2
  1.1298 -A3cDgAOJA1YDigOPA5IDkwOcA6UDpgOqA6sDrgO3A7gDxQPOA9cD4ANWA+ED5gPvA1YD+ANWBAEECgQT
  1.1299 -A1YEFAQdBB4EKAQxA1YEMgRABEkDVgRKBE4ETwRYA1YEWQRgBGkDVgRyBHMEdgR4BMIFDQVYBVkFWgVb
  1.1300 -BVwFXQVeBV8FYAVhBWIFYwVkBWUFZgVnBWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5
  1.1301 -BXoFewV8BX0FfgV/BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWX
  1.1302 -BZgFmQWaBZsFnAWfBaIGEQaABoEGggaDBoQGhQaGBocGiAaJBooGiwaMBo0GjgaPBpAGkQaSBpMGlAaV
  1.1303 -BpYGlwaYBpkGmgabBpwGnQaeBp8GoAahBqIGowakBqUGpganBqgGqQaqBqsGrAatBq4GrwawBrEGsgaz
  1.1304 -BrQGtQa2BrcGuAa5BroGuwa8Br0Gvga/BsAGwQbCBsMGxAbFBsYGxwbIBskGygbLBswGzQbOBs8G0AbR
  1.1305 -BtIG0wbUBtUG1gbXBtgG2QbaBtsG3AbdBt4G3wbgBuEG4gbjBuQG5QbmBucG6AbpBuoG6wbsBu8G8gb1
  1.1306 -VSRudWxs3xASAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUA
  1.1307 -JgAnACgAKQAqACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nl
  1.1308 -c1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5
  1.1309 -c1tOU0ZyYW1ld29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNj
  1.1310 -ZXNzaWJpbGl0eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09i
  1.1311 -amVjdHNWYWx1ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVz
  1.1312 -gAKBAciAy4EBVoEBx4AagQEPgAWBAVWBAVeBARCBAcWAAIAGgQEOgQHGEQGSgQFY0gAOADIAMwA0W05T
  1.1313 -Q2xhc3NOYW1lgASAA11OU0FwcGxpY2F0aW9u0gA3ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWiADoA
  1.1314 -O15OU0N1c3RvbU9iamVjdFhOU09iamVjdF8QEElCQ29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMub2Jq
  1.1315 -ZWN0c4AZoQBBgAfbAEMADgBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWACtcTlNX
  1.1316 -aW5kb3dWaWV3XE5TU2NyZWVuUmVjdF8QE05TRnJhbWVBdXRvc2F2ZU5hbWVdTlNXaW5kb3dUaXRsZVlO
  1.1317 -U1dURmxhZ3NdTlNXaW5kb3dDbGFzc1xOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tpbmdfEBFOU1dp
  1.1318 -bmRvd1N0eWxlTWFza1tOU1ZpZXdDbGFzc4ALgBiAFoAXgAkSdAAAAIAKgAgQAhAHgABfEBh7ezU3LCAx
  1.1319 -NzV9LCB7MTA4NCwgNTg3fX1dR2Vla0dhbWVCb2FyZFhOU1dpbmRvd9cAXAAOAF0AXgBfAFoAYABhAGIA
  1.1320 -YwBkAGUAYQBnXxAPTlNOZXh0UmVzcG9uZGVyWk5TU3Vidmlld3NYTlN2RmxhZ3NbTlNGcmFtZVNpemVb
  1.1321 -TlNTdXBlcnZpZXeADIAVgA0RAQCAE4AMgBTSAA4APgBpAGqAEqEAa4AO2ABcAA4AXgBfAFoAMgBgAG0A
  1.1322 -TQBvAHAAcQBhAHMATQB1XxAVTlNWaWV3SXNMYXllclRyZWVIb3N0gAuAEREBEoAPgAyAEIALCVt7MTA4
  1.1323 -NCwgNTg3fV1EZW1vQm9hcmRWaWV30gA3ADgAeQB6pAB6AHsAfAA7XE5TQ3VzdG9tVmlld1ZOU1ZpZXdb
  1.1324 -TlNSZXNwb25kZXLSADcAOAB+AH+jAH8AgAA7Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnSADcAOACCAHuj
  1.1325 -AHsAfAA7XxAVe3swLCAwfSwgezE0NDAsIDg3OH19UNIANwA4AIYAh6IAhwA7XxAQTlNXaW5kb3dUZW1w
  1.1326 -bGF0ZdIANwA4AIkAiqMAigCLADtcTlNNdXRhYmxlU2V0VU5TU2V00gAOAD4AaQCOgBKvECQAjwCQAJEA
  1.1327 -kgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCuAK8A
  1.1328 -sACxALKAG4ApgC6AM4A4gD6AQYBGgEuAT4BVgFqAX4BjgGeAa4BvgHSAeYB+gIOAiICMgJGAloCagJyA
  1.1329 -oYClgKqAroCzgLiAvYDCgMbUAA4AtAC1ALYAtwBrALkAul1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05T
  1.1330 -TGFiZWyAKIAOgByAJ9kADgC8AL0AvgC/AMAAwQDCAMMAxADFAMYAxwDIAMkAygDLAFVXTlNUaXRsZV8Q
  1.1331 -EU5TS2V5RXF1aXZNb2RNYXNrWk5TS2V5RXF1aXZdTlNNbmVtb25pY0xvY1lOU09uSW1hZ2VcTlNNaXhl
  1.1332 -ZEltYWdlVk5TTWVudVVOU1RhZ4AmgB4SABABCIAfEn////+AIIAkgB3TAA4AvADNAM4AzwDQW05TTWVu
  1.1333 -dUl0ZW1zgNCA9oD4WkhleGNoZXF1ZXJRNNMADgAyANQA1QDWANdeTlNSZXNvdXJjZU5hbWWAI4AhgCJX
  1.1334 -TlNJbWFnZV8QD05TTWVudUNoZWNrbWFya9IANwA4ANsA3KIA3AA7XxAQTlNDdXN0b21SZXNvdXJjZdMA
  1.1335 -DgAyANQA1QDWAOCAI4AhgCVfEBBOU01lbnVNaXhlZFN0YXRl0gA3ADgA4wDkogDkADtaTlNNZW51SXRl
  1.1336 -bV8QEnN0YXJ0R2FtZUZyb21NZW51OtIANwA4AOcA6KMA6ADpADtfEBVOU05pYkNvbnRyb2xDb25uZWN0
  1.1337 -b3JeTlNOaWJDb25uZWN0b3LTAA4AtQC2ALcA7ADtgCiAKoAt2AAOALwAvQC+AL8AwADBAMIAxADwAPEA
  1.1338 -UADIAMkAygD1gCaALBIAEAAAgBeAIIAkgCvUAA4AvAD3AM0AzgD5APoA+1ZOU05hbWWA0IDMgM+AzV8Q
  1.1339 -EkJyaW5nIEFsbCB0byBGcm9udF8QD2FycmFuZ2VJbkZyb250OtMADgC1ALYAtwEAAQGAKIAvgDLYAA4A
  1.1340 -vAC9AL4AvwDAAMEAwgDEAQQA8QBQAMgAyQDKAQiAJoAxgBeAIIAkgDDTAA4AvADNAM4BCwEMgNCA7IDu
  1.1341 -XlN0YXJ0IFNwZWFraW5nXnN0YXJ0U3BlYWtpbmc60wAOALUAtgC3AREBEoAogDSAN9cADgC8AL4AvwDA
  1.1342 -AMEAwgDEARUAUADIAMkAygEZgCaANoAXgCCAJIA10wAOALwAzQDOARwBHYDQgPyA/l8QD1JldmVydCB0
  1.1343 -byBTYXZlZF8QFnJldmVydERvY3VtZW50VG9TYXZlZDrTAA4AtQC2ALcBIgEjgCiAOYA92AAOALwAvQC+
  1.1344 -AL8AwADBAMIAxAEmAScBKADIAMkAygErgCaAOxIAEgAAgDyAIIAkgDrTAA4AvADNAM4BLgEvgNCA54Do
  1.1345 -VFJlZG9RWlVyZWRvOtQADgC0ALUAtgE0AGsAHwE3gECADoACgD9YZGVsZWdhdGXSADcAOAE6ATujATsA
  1.1346 -6QA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3LTAA4AtQC2ALcBPgE/gCiAQoBF2AAOALwAvQC+AL8AwADB
  1.1347 -AMIAxAFCAPEBQwDIAMkAygEZgCaAQ4BEgCCAJIA1U05ld1FuXG5ld0RvY3VtZW50OtMADgC1ALYAtwFM
  1.1348 -AU2AKIBHgErYAA4AvAC9AL4AvwDAAMEAwgDEAVAA8QBQAMgAyQDKAVSAJoBJgBeAIIAkgEjTAA4AvADN
  1.1349 -AM4BVwFYgNCBAQWBAQdvEBIAQwB1AHMAdABvAG0AaQB6AGUAIABUAG8AbwBsAGIAYQByICZfEB9ydW5U
  1.1350 -b29sYmFyQ3VzdG9taXphdGlvblBhbGV0dGU60wAOALUAtgC3AV0BXoAogEyATtgADgC8AL0AvgC/AMAA
  1.1351 -wQDCAMQBYQDxAFAAyADJAMoBK4AmgE2AF4AggCSAOlZEZWxldGVXZGVsZXRlOtMADgC1ALYAtwFqAWuA
  1.1352 -KIBQgFTYAA4AvAC9AL4AvwDAAMEAwgDEAW4BbwFwAMgAyQDKAXOAJoBSEgAYAACAU4AggCSAUdQADgC8
  1.1353 -APcAzQDOAFEBdwF4gNCACYDigNRbSGlkZSBPdGhlcnNRaF8QFmhpZGVPdGhlckFwcGxpY2F0aW9uczrT
  1.1354 -AA4AtQC2ALcBfgF/gCiAVoBZ2AAOALwAvQC+AL8AwADBAMIAxAGCAPEBgwDIAMkAygEZgCaAV4BYgCCA
  1.1355 -JIA1ZgBQAHIAaQBuAHQgJlFwVnByaW50OtMADgC1ALYAtwGMAY2AKIBbgF7YAA4AvAC9AL4AvwDAAMEA
  1.1356 -wgDEAZAA8QGRAMgAyQDKARmAJoBcgF2AIIAkgDVlAE8AcABlAG4gJlFvXW9wZW5Eb2N1bWVudDrUAA4A
  1.1357 -tAC1ALYAtwBrAZsAuoAogA6AYIAn2QAOALwAvQC+AL8AwADBAMIAwwDEAZ8AxgGgAMgAyQDKAMsBpIAm
  1.1358 -gGGAYoAggCSAHRAEUkdvUTPUAA4AtAC1ALYAtwBrAaoAuoAogA6AZIAn2QAOALwAvQC+AL8AwADBAMIA
  1.1359 -wwDEAa4AxgGvAMgAyQDKAMsBs4AmgGWAZoAggCSAHRADW1RpYy1UYWMtVG9lUTXTAA4AtQC2ALcBuAG5
  1.1360 -gCiAaIBq2AAOALwAvQC+AL8AwADBAMIAxAG8APEAUADIAMkAygD1gCaAaYAXgCCAJIArVFpvb21ccGVy
  1.1361 -Zm9ybVpvb2061AAOALQAtQC2ALcAawHGALqAKIAOgGyAJ9gADgC8AL0AvgC/AMAAwQDCAMQBygDGAcsA
  1.1362 -yADJAMoAy4AmgG2AboAggCSAHV8QFEtsb25kaWtlIChTb2xpdGFpcmUpUTHTAA4AtQC2ALcB0wHUgCiA
  1.1363 -cIBz2AAOALwAvQC+AL8AwADBAMIAxAHXAPEAUADIAMkAygHbgCaAcoAXgCCAJIBx1AAOALwA9wDNAM4B
  1.1364 -3gHfAeCA0IEBAIEBA4EBAlpDbGVhciBNZW51XxAVY2xlYXJSZWNlbnREb2N1bWVudHM60wAOALUAtgC3
  1.1365 -AeUB5oAogHWAeNgADgC8AL0AvgC/AMAAwQDCAMQB6QDxAeoAyADJAMoA9YAmgHaAd4AggCSAK1hNaW5p
  1.1366 -bWl6ZVFtXxATcGVyZm9ybU1pbmlhdHVyaXplOtMADgC1ALYAtwHzAfSAKIB6gH3YAA4AvAC9AL4AvwDA
  1.1367 -AMEAwgDEAfcA8QH4AMgAyQDKARmAJoB7gHyAIIAkgDVUU2F2ZVFzXXNhdmVEb2N1bWVudDrTAA4AtQC2
  1.1368 -ALcCAQICgCiAf4CC2AAOALwAvQC+AL8AwADBAMIAxAIFAPECBgDIAMkAygErgCaAgICBgCCAJIA6VVBh
  1.1369 -c3RlUXZWcGFzdGU60wAOALUAtgC3Ag8CEIAogISAh9kADgISALwAvQC+AL8AwADBAMIAxABQAhUBJwIW
  1.1370 -AMgAyQDKARlZTlNUb29sVGlwgCaAF4CFgIaAIIAkgDVdUGFnZSBTZXR1cC4uLlFQXnJ1blBhZ2VMYXlv
  1.1371 -dXQ60wAOALUAtgC3Ah8CIIAogImAi9gADgC8AL0AvgC/AMAAwQDCAMQCIwDxAFAAyADJAMoBCIAmgIqA
  1.1372 -F4AggCSAMF1TdG9wIFNwZWFraW5nXXN0b3BTcGVha2luZzrTAA4AtQC2ALcCLAItgCiAjYCQ2AAOALwA
  1.1373 -vQC+AL8AwADBAMIAxAIwAPECMQDIAMkAygErgCaAjoCPgCCAJIA6WlNlbGVjdCBBbGxRYVpzZWxlY3RB
  1.1374 -bGw60wAOALUAtgC3AjoCO4AogJKAldgADgC8AL0AvgC/AMAAwQDCAMQCPgDxAj8AyADJAMoBK4AmgJOA
  1.1375 -lIAggCSAOlRDb3B5UWNVY29weTrTAA4AtQC2ALcCSAJJgCiAl4CZ2AAOALwAvQC+AL8AwADBAMIAxAJM
  1.1376 -APEBcADIAMkAygFzgCaAmIBTgCCAJIBRXxASSGlkZSBHZWVrR2FtZUJvYXJkVWhpZGU61AAOALQAtQC2
  1.1377 -ATQAawBBAleAQIAOgAeAm18QFWluaXRpYWxGaXJzdFJlc3BvbmRlctMADgC1ALYAtwJbAlyAKICdgKDY
  1.1378 -AA4AvAC9AL4AvwDAAMEAwgDEAl8A8QJgAMgAyQDKARmAJoCegJ+AIIAkgDVVQ2xvc2VRd11wZXJmb3Jt
  1.1379 -Q2xvc2U61AAOALQAtQC2ALcAHwJqAmuAKIACgKKApNcADgC8AL4AvwDAAMEAwgDEAm4AUADIAMkAygFz
  1.1380 -gCaAo4AXgCCAJIBRXxATQWJvdXQgR2Vla0dhbWVCb2FyZF8QHW9yZGVyRnJvbnRTdGFuZGFyZEFib3V0
  1.1381 -UGFuZWw61AAOALQAtQC2ALcAawJ4AnmAKIAOgKaAqdgADgC8AL0AvgC/AMAAwQDCAMQCfADxAn0AyADJ
  1.1382 -AMoBVIAmgKeAqIAggCSASFtGdWxsIFNjcmVlblFmXxAQZW50ZXJGdWxsU2NyZWVuOtQADgC0ALUAtgC3
  1.1383 -AGsChwC6gCiADoCrgCfZAA4AvAC9AL4AvwDAAMEAwgDDAMQCiwDGAowAyADJAMoAywKQgCaArICtgCCA
  1.1384 -JIAdEAFYQ2hlY2tlcnNRMtMADgC1ALYAtwKVApaAKICvgLLYAA4AvAC9AL4AvwDAAMEAwgDEApkA8QKa
  1.1385 -AMgAyQDKASuAJoCwgLGAIIAkgDpUVW5kb1F6VXVuZG860wAOALUAtgC3AqMCpIAogLSAt9gADgC8AL0A
  1.1386 -vgC/AMAAwQDCAMQCpwDxAqgAyADJAMoBc4AmgLWAtoAggCSAUV8QElF1aXQgR2Vla0dhbWVCb2FyZFFx
  1.1387 -WnRlcm1pbmF0ZTrTAA4AtQC2ALcCsQKygCiAuYC82AAOALwAvQC+AL8AwADBAMIAxAK1APECtgDIAMkA
  1.1388 -ygErgCaAuoC7gCCAJIA6U0N1dFF4VGN1dDrTAA4AtQC2ALcCvwLAgCiAvoDB2AAOALwAvQC+AL8AwADB
  1.1389 -AMIAxALDAW8CxADIAMkAygFUgCaAv4DAgCCAJIBIXFNob3cgVG9vbGJhclF0XxATdG9nZ2xlVG9vbGJh
  1.1390 -clNob3duOtMADgC1ALYAtwLNAs6AKIDDgMXYAA4AvAC9AL4AvwDAAMEAwgDEAtEA8QBQAMgAyQDKAXOA
  1.1391 -JoDEgBeAIIAkgFFYU2hvdyBBbGxfEBZ1bmhpZGVBbGxBcHBsaWNhdGlvbnM60wAOALUAtgC3AtoC24Ao
  1.1392 -gMeAytgADgC8AL0AvgC/AMAAwQDCAMQC3gEnAt8AyADJAMoBGYAmgMiAyYAggCSANWgAUwBhAHYAZQAg
  1.1393 -AEEAcyAmUVNfEA9zYXZlRG9jdW1lbnRBczrSAA4APgLnAuiBAQ2vEEcA9QE+AusC7AHlAu4CLAGMAvEC
  1.1394 -8gKHASsBagHGAvcBcwKVAfMBIgEAAUwCowL/AdMBqgLaAg8COgK/AwYBfgMIAwkCeAMLAwwBXQMOAw8B
  1.1395 -GQMRAxIDEwMUAxUAuQKxAs0ATQERAEEDHAJqAh8DHwJIAGsB2wEIAbgCAQMmAMsBmwMpAVQDKwDsAy0C
  1.1396 -WwMvgCuAQoDOgNGAdYDjgI2AW4DmgNWAq4A6gFCAbIDvgFGAr4B6gDmAL4BHgLSA8IBwgGSAx4CEgJKA
  1.1397 -voDrgFaA8oDdgKaA9ID1gEyA0oDZgDWA4YEBCYEBDIDWgPuAHIC5gMOAC4A0gAeA6YCigImBAQSAl4AO
  1.1398 -gHGAMIBogH+A2oAdgGCA/4BIgQEIgCqA4ICdgOpWV2luZG930gAOAD4AaQMzgBKkAeUBuALrAOyAdYBo
  1.1399 -gM6AKtoADgC8AL0DOQC+AzoAvwDAAMEAwgDEAFAA8QB1AFAAdQDIAMkAygD1XU5TSXNTZXBhcmF0b3Jc
  1.1400 -TlNJc0Rpc2FibGVkgCaAFwmAFwmAIIAkgCteX05TV2luZG93c01lbnXSADcAOANFAMKiAMIAO9oADgNH
  1.1401 -ALwAvQC+AL8AwADBAMIDSADEAXMAUQDxAFAAyADJAMoDDgNQWU5TU3VibWVudVhOU0FjdGlvboAmgFGA
  1.1402 -CYAXgCCAJIDSgNPUAA4AvAD3AM0AzgNTA1QDVYDQgPmBAQuA+l5zdWJtZW51QWN0aW9uOtIADgA+AGkD
  1.1403 -WYASqwJqAvIDFAMPAyYDLQJIAWoCzQMRAqOAooDVgNaA2YDagOCAl4BQgMOA4YC02gAOALwAvQM5AL4D
  1.1404 -OgC/AMAAwQDCAMQAUADxAHUAUAB1AMgAyQDKAXOAJoAXCYAXCYAggCSAUdgADgC8AL0AvgC/AMAAwQDC
  1.1405 -AMQDcADxA3EAyADJAMoBc4AmgNeA2IAggCSAUWwAUAByAGUAZgBlAHIAZQBuAGMAZQBzICZRLNoADgC8
  1.1406 -AL0DOQC+AzoAvwDAAMEAwgDEAFAA8QB1AFAAdQDIAMkAygFzgCaAFwmAFwmAIIAkgFHaAA4DRwC8AL0A
  1.1407 -vgC/AMAAwQDCA0gAxAMJA4MA8QBQAMgAyQDKAXMDiIAmgN2A24AXgCCAJIBRgNxYU2VydmljZXPUAA4A
  1.1408 -vAD3AM0AzgODA40DjoDQgNuA34De0gAOAD4AaQORgBKgXxAPX05TU2VydmljZXNNZW512gAOALwAvQM5
  1.1409 -AL4DOgC/AMAAwQDCAMQAUADxAHUAUAB1AMgAyQDKAXOAJoAXCYAXCYAggCSAUdoADgC8AL0DOQC+AzoA
  1.1410 -vwDAAMEAwgDEAFAA8QB1AFAAdQDIAMkAygFzgCaAFwmAFwmAIIAkgFFcX05TQXBwbGVNZW510wAOALwA
  1.1411 -zQDOA6gDqYDQgOSA5VRIZWxw0gAOAD4AaQOtgBKg2gAOALwAvQM5AL4DOgC/AMAAwQDCAMQAUADxAHUA
  1.1412 -UAB1AMgAyQDKARmAJoAXCYAXCYAggCSANVRFZGl00gAOAD4AaQO6gBKqApUBIgMcArECOgIBAV0CLAMv
  1.1413 -AwaAr4A5gOmAuYCSgH+ATICNgOqA69oADgC8AL0DOQC+AzoAvwDAAMEAwgDEAFAA8QB1AFAAdQDIAMkA
  1.1414 -ygErgCaAFwmAFwmAIIAkgDraAA4AvAC9AzkAvgM6AL8AwADBAMIAxABQAPEAdQBQAHUAyADJAMoBK4Am
  1.1415 -gBcJgBcJgCCAJIA62gAOA0cAvAC9AL4AvwDAAMEAwgNIAMQBCAELAPEAUADIAMkAygErA9+AJoAwgOyA
  1.1416 -F4AggCSAOoDtVlNwZWVjaNIADgA+AGkD44ASogEAAh+AL4CJ2gAOALwAvQM5AL4DOgC/AMAAwQDCAMQA
  1.1417 -UADxAHUAUAB1AMgAyQDKAMuAJoAXCYAXCYAggCSAHdoADgNHALwAvQC+AL8AwADBAMIDSADEAu4DqADx
  1.1418 -AFAAyADJAMoDDgP3gCaA44DkgBeAIIAkgNKA8doADgNHALwAvQC+AL8AwADBAMIDSADEASsBLgDxAFAA
  1.1419 -yADJAMoDDgQAgCaAOoDngBeAIIAkgNKA89oADgC8AL0DOQC+AzoAvwDAAMEAwgDEAFAA8QB1AFAAdQDI
  1.1420 -AMkAygEZgCaAFwmAFwmAIIAkgDXaAA4DRwC8AL0AvgC/AMAAwQDCA0gAxADLAM8A8QBQAMgAyQDKAw4E
  1.1421 -EoAmgB2A9oAXgCCAJIDSgPdUR2FtZdIADgA+AGkEFoASpgHGAvcChwGbALkBqoBsgO+Aq4BggByAZFlB
  1.1422 -TWFpbk1lbnXSAA4APgBpBCCAEqcC7AMVAwgDDAMfAxIC/4DRgPuA8oD1gQEEgQEJgPDaAA4DRwC8AL0A
  1.1423 -vgC/AMAAwQDCA0gAxAEZARwA8QBQAMgAyQDKAw4EMIAmgDWA/IAXgCCAJIDSgP1URmlsZdIADgA+AGkE
  1.1424 -NIASqwE+AYwDKQLxAlsB8wLaAREDCwIPAX6AQoBbgP+A5oCdgHqAx4A0gPSAhIBW2gAOA0cAvAC9AL4A
  1.1425 -vwDAAMEAwgNIAMQB2wHeAPEAUADIAMkAygEZBEiAJoBxgQEAgBeAIIAkgDWBAQFbT3BlbiBSZWNlbnTS
  1.1426 -AA4APgBpBEyAEqEB04BwXxAWX05TUmVjZW50RG9jdW1lbnRzTWVuddoADgNHALwAvQC+AL8AwADBAMID
  1.1427 -SADEAVQBVwDxAFAAyADJAMoDDgRXgCaASIEBBYAXgCCAJIDSgQEGVFZpZXfSAA4APgBpBFuAEqQCeAMr
  1.1428 -Ar8BTICmgQEIgL6AR9oADgC8AL0DOQC+AzoAvwDAAMEAwgDEAFAA8QB1AFAAdQDIAMkAygFUgCaAFwmA
  1.1429 -FwmAIIAkgEjaAA4DRwC8AL0AvgC/AMAAwQDCA0gAxAD1APkA8QBQAMgAyQDKAw4EcYAmgCuAzIAXgCCA
  1.1430 -JIDSgQEKW19OU01haW5NZW510gAOADIAMwA0gASAA9IANwA4BHcAgKIAgAA70gAOAD4C5wR6gQENrxBH
  1.1431 -AxIBGQD1Aw4A9QL/ASsBGQEZAXMAywMIAXMAywDLAuwBKwEZASsBCAFUAXMDDgHbAMsBGQEZASsBVAEr
  1.1432 -ARkDDgMmAVQBGQMOASsAHwFzAxUBcwMOAB8BcwMOAMsBKwFzAEEBGQAfASsBcwEIAw4BcwBNAykDBgD1
  1.1433 -ASsBcwMMAMsBGQMfAVQA9QFzARkBK4EBCYA1gCuA0oArgPCAOoA1gDWAUYAdgPKAUYAdgB2A0YA6gDWA
  1.1434 -OoAwgEiAUYDSgHGAHYA1gDWAOoBIgDqANYDSgNqASIA1gNKAOoACgFGA+4BRgNKAAoBRgNKAHYA6gFGA
  1.1435 -B4A1gAKAOoBRgDCA0oBRgAuA/4DrgCuAOoBRgPWAHYA1gQEEgEiAK4BRgDWAOtIADgA+AucExIEBDa8Q
  1.1436 -SAD1AT4C7ALrAeUC7gIsAYwC8QLyAocBKwFqAcYC9wFzApUB8wEiAaoBTAL/AqMBAAHTAtoCDwI6Ar8D
  1.1437 -BgF+AwgDCQJ4AB8DCwMMAV0DDgEZAw8DEQMSAxMDFQMUALkCsQLNAE0BEQBBAGsDHwJqAxwCSAIfAdsB
  1.1438 -CAG4AMsDJgIBAZsDKQFUAysDLQDsAlsDL4ArgEKA0YDOgHWA44CNgFuA5oDVgKuAOoBQgGyA74BRgK+A
  1.1439 -eoA5gGSAR4DwgLSAL4BwgMeAhICSgL6A64BWgPKA3YCmgAKA9ID1gEyA0oA1gNmA4YEBCYEBDID7gNaA
  1.1440 -HIC5gMOAC4A0gAeADoEBBICigOmAl4CJgHGAMIBogB2A2oB/gGCA/4BIgQEIgOCAKoCdgOrSAA4APgLn
  1.1441 -BQ+BAQ2vEEgFEAURBRIFEwUUAowFFgUXBRgFGQUaBRsFHAUdBR4FHwUgAaAFIgUjBSQBywUmBScFKAUp
  1.1442 -Aa8FKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVH
  1.1443 -BUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVeBARGBARKBAROBARSBARWArYEBFoEBF4EBGIEB
  1.1444 -GYEBGoEBG4EBHIEBHYEBHoEBH4EBIIBigQEhgQEigQEjgG6BASSBASWBASaBASeAZoEBKIEBKYEBKoEB
  1.1445 -K4EBLIEBLYEBLoEBL4EBMIEBMYEBMoEBM4EBNIEBNYEBNoEBN4EBOIEBOYEBOoEBO4EBPIEBPYEBPoEB
  1.1446 -P4EBQIEBQYEBQoEBQ4EBRIEBRYEBRoEBR4EBSIEBSYEBSoEBS4EBTIEBTYEBToEBT4EBUIEBUYEBUoEB
  1.1447 -U4EBVF1NZW51IChXaW5kb3cpUTlfEBlNZW51IEl0ZW0gKEdlZWtHYW1lQm9hcmQpW1NlcGFyYXRvci03
  1.1448 -XxAUTWVudSBJdGVtIChNaW5pbWl6ZSlfEBZNZW51IEl0ZW0gKFNlbGVjdCBBbGwpbxARAE0AZQBuAHUA
  1.1449 -IABJAHQAZQBtACAAKABPAHAAZQBuICYAKVE3WVNlcGFyYXRvcl8QFE1lbnUgSXRlbSAoQ2hlY2tlcnMp
  1.1450 -W01lbnUgKEVkaXQpXxAXTWVudSBJdGVtIChIaWRlIE90aGVycylfECBNZW51IEl0ZW0gKEtsb25kaWtl
  1.1451 -IChTb2xpdGFpcmUpKVtTZXBhcmF0b3ItNl8QFE1lbnUgKEdlZWtHYW1lQm9hcmQpXxAQTWVudSBJdGVt
  1.1452 -IChVbmRvKV8QEE1lbnUgSXRlbSAoUmVkbylfEBdNZW51IEl0ZW0gKFRpYy1UYWMtVG9lKW8QHgBNAGUA
  1.1453 -bgB1ACAASQB0AGUAbQAgACgAQwB1AHMAdABvAG0AaQB6AGUAIABUAG8AbwBsAGIAYQByICYAKVQxMTEx
  1.1454 -XxAaTWVudSBJdGVtIChTdGFydCBTcGVha2luZylfEBZNZW51IEl0ZW0gKENsZWFyIE1lbnUpUThfEBBN
  1.1455 -ZW51IEl0ZW0gKENvcHkpXxAYTWVudSBJdGVtIChTaG93IFRvb2xiYXIpXxASTWVudSBJdGVtIChTcGVl
  1.1456 -Y2gpUTZfEBBNZW51IEl0ZW0gKEVkaXQpXxAPTWVudSAoU2VydmljZXMpXxAXTWVudSBJdGVtIChGdWxs
  1.1457 -IFNjcmVlbilcRmlsZSdzIE93bmVyUzItMV8QEE1lbnUgSXRlbSAoR2FtZSlfEBJNZW51IEl0ZW0gKERl
  1.1458 -bGV0ZSlYTWFpbk1lbnVbTWVudSAoRmlsZSlbU2VwYXJhdG9yLTFbU2VwYXJhdG9yLTJfEBJNZW51IEl0
  1.1459 -ZW0gKFdpbmRvdylbQXBwbGljYXRpb25fEBBNZW51IEl0ZW0gKEZpbGUpUzEyMV8QFk1lbnUgSXRlbSAo
  1.1460 -SGV4Y2hlcXVlcilfEA9NZW51IEl0ZW0gKEN1dClfEBRNZW51IEl0ZW0gKFNob3cgQWxsKVxDb250ZW50
  1.1461 -IFZpZXdSMTBfEBZXaW5kb3cgKEdlZWtHYW1lQm9hcmQpXxAPRGVtbyBCb2FyZCBWaWV3XxAQTWVudSBJ
  1.1462 -dGVtIChWaWV3KV8QH01lbnUgSXRlbSAoQWJvdXQgR2Vla0dhbWVCb2FyZClbU2VwYXJhdG9yLTRfEB5N
  1.1463 -ZW51IEl0ZW0gKEhpZGUgR2Vla0dhbWVCb2FyZClfEBlNZW51IEl0ZW0gKFN0b3AgU3BlYWtpbmcpXxAS
  1.1464 -TWVudSAoT3BlbiBSZWNlbnQpXU1lbnUgKFNwZWVjaClfEBBNZW51IEl0ZW0gKFpvb20pW01lbnUgKEdh
  1.1465 -bWUpXxAUTWVudSBJdGVtIChTZXJ2aWNlcylfEBFNZW51IEl0ZW0gKFBhc3RlKV5NZW51IEl0ZW0gKEdv
  1.1466 -KV8QF01lbnUgSXRlbSAoT3BlbiBSZWNlbnQpW01lbnUgKFZpZXcpW1NlcGFyYXRvci04W1NlcGFyYXRv
  1.1467 -ci0zXxAeTWVudSBJdGVtIChCcmluZyBBbGwgdG8gRnJvbnQpUzEtMVtTZXBhcmF0b3ItNdIADgA+AucF
  1.1468 -noEBDaDSAA4APgLnBaGBAQ2g0gAOAD4C5wWkgQENrxBsAT4AlwLuAiwBjAHGAvcAsAKVAfMBAAChAUwC
  1.1469 -owL/AKUC2gI6Ar8ApACsAX4AqAMJAJUArwMLAwwAsQFdAw4BGQCcAxIApgMTAJ0DFACqAJMAngCuAs0B
  1.1470 -EQBBAxwDHwCaAkgArQIBAMsBmwMrAOwDLQMvAPUC6wLsAeUC8QLyAocBKwFqAJ8BcwEiAaoAogHTAg8D
  1.1471 -BgCrAKkDCACQALIAowJ4AB8ApwCPAw8DEQMVALkAkgKxAJEATQCWAGsCHwJqAJkAoAHbAQgBuAMmAJgD
  1.1472 -KQFUAJQAmwJbgEKAS4DjgI2AW4BsgO+AvYCvgHqAL4B5gEeAtIDwgIyAx4CSgL6AiICqgFaAmoDdgEGA
  1.1473 -uID0gPWAwoBMgNKANYBjgQEJgJGBAQyAZ4DWgKGAOIBrgLOAw4A0gAeA6YEBBIBagJeAroB/gB2AYIEB
  1.1474 -CIAqgOCA6oArgM6A0YB1gOaA1YCrgDqAUIBvgFGAOYBkgH6AcICEgOuApYCcgPKAKYDGgIOApoACgJaA
  1.1475 -G4DZgOGA+4AcgDOAuYAugAuARoAOgImAooBVgHSAcYAwgGiA2oBPgP+ASIA+gF+AndIADgA+AucGE4EB
  1.1476 -Da8QbAYUBhUGFgYXBhgGGQYaBhsGHAYdBh4GHwYgBiEGIgYjBiQGJQYmBicGKAYpBioGKwYsBi0GLgYv
  1.1477 -BjAGMQYyBjMGNAY1BjYGNwY4BjkGOgY7BjwGPQY+Bj8GQAZBBkIGQwZEBkUGRgZHBkgGSQZKBksGTAZN
  1.1478 -Bk4GTwZQBlEGUgZTBlQGVQZWBlcGWAZZBloGWwZcBl0GXgZfBmAGYQZiBmMGZAZlBmYGZwZoBmkGagZr
  1.1479 -BmwGbQZuBm8GcAZxBnIGcwZ0BnUGdgZ3BngGeQZ6BnsGfAZ9Bn4Gf4EBWYEBWoEBW4EBXIEBXYEBXoEB
  1.1480 -X4EBYIEBYYEBYoEBY4EBZIEBZYEBZoEBZ4EBaIEBaYEBaoEBa4EBbIEBbYEBboEBb4EBcIEBcYEBcoEB
  1.1481 -c4EBdIEBdYEBdoEBd4EBeIEBeYEBeoEBe4EBfIEBfYEBfoEBf4EBgIEBgYEBgoEBg4EBhIEBhYEBhoEB
  1.1482 -h4EBiIEBiYEBioEBi4EBjIEBjYEBjoEBj4EBkIEBkYEBkoEBk4EBlIEBlYEBloEBl4EBmIEBmYEBmoEB
  1.1483 -m4EBnIEBnYEBnoEBn4EBoIEBoYEBooEBo4EBpIEBpYEBpoEBp4EBqIEBqYEBqoEBq4EBrIEBrYEBroEB
  1.1484 -r4EBsIEBsYEBsoEBs4EBtIEBtYEBtoEBt4EBuIEBuYEBuoEBu4EBvIEBvYEBvoEBv4EBwIEBwYEBwoEB
  1.1485 -w4EBxBBSEOsQahDGEEgRAX0RAYMRAW4QzxBLEMQRAWoRASoQiBBnEOgQUBDFEQEpEOMRAYUQThEBjxCC
  1.1486 -EQF1EOQQShEBexEBchDKEB0QUREBhxATEOAT//////////0Q8BCBEI4Q5xEBhBEBcRCWEHARAXMQzhEB
  1.1487 -JxEBdhCGEN8QyxEBfBEBiREBeRAFEJAQ1hAYEFwQOBAXEE8Q7BEBfhDNEJEQfxA5ENcRAYAQ4hB+EE0Q
  1.1488 -0xEBehDBENkQJxEBaxBXEQF4EQGREQFvEQGGEI8QlRBTEQF/EQFsEMcQ6REBdBEBbREBdxDDEDoQVhAl
  1.1489 -EH0Q1BDvEIMRAXAQfBEBKBEBkBEBihBJ0gAOAD4AaQbugBKg0gAOAD4C5wbxgQENoNIADgA+AucG9IEB
  1.1490 -DaDSADcAOAb2BveiBvcAO15OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBUAGYD/AQCBE0E
  1.1491 -VARbBGkEewSXBKUEsQS9BMsE1gTkBQAFDgUhBTMFTQVXBWQFZgVpBWsFbgVxBXMFdgV4BXsFfgWBBYQF
  1.1492 -hgWIBYsFjgWRBZQFnQWpBasFrQW7BcQFzQXYBd0F7AX1BggGEQYcBh4GIQYjBlAGXQZqBoAGjgaYBqYG
  1.1493 -swbFBtkG5QbnBukG6wbtBu8G9Ab2BvgG+gb8Bv4HGQcnBzAHTQdfB2oHcwd/B4sHjQePB5EHlAeWB5gH
  1.1494 -mgejB6UHqAeqB8sH4wflB+cH6gfsB+4H8AfyB/MH/wgNCBYIHwgsCDMIPwhICE8IXghmCG8IdgiOCI8I
  1.1495 -mAidCLAIuQjACM0I0wjcCN4JKQkrCS0JLwkxCTMJNQk3CTkJOwk9CT8JQQlDCUUJRwlJCUsJTQlPCVEJ
  1.1496 -UwlVCVcJWQlbCV0JXwlhCWMJZQlnCWkJawltCW8JcQmCCZAJmQmhCaMJpQmnCakJzgnWCeoJ9QoDCg0K
  1.1497 -GgohCicKKQorCjAKMgo3CjkKOwo9CkoKVgpYCloKXApnCmkKdgqFCocKiQqLCpMKpQquCrMKxgrTCtUK
  1.1498 -1wrZCuwK9Qr6CwULGgsjCyoLQgtRC14LYAtiC2QLhQuHC4kLjguQC5ILlAuWC6cLrguwC7ILtAu2C8sL
  1.1499 -3QvqC+wL7gvwDBEMEwwVDBcMGQwbDB0MKgwsDC4MMAw/DE4MWwxdDF8MYQx+DIAMggyEDIYMiAyKDJcM
  1.1500 -mQybDJ0MrwzIDNUM1wzZDNsM/Az+DQANBQ0HDQkNCw0NDRoNHA0eDSANJQ0nDS0NPg1ADUINRA1GDU8N
  1.1501 -WA1fDXYNgw2FDYcNiQ2qDawNrg2wDbINtA22DboNvA3JDdYN2A3aDdwN/Q3/DgEOAw4FDgcOCQ4WDhgO
  1.1502 -Gw4eDkUOZw50DnYOeA56DpsOnQ6fDqEOow6lDqcOrg62DsMOxQ7HDskO6g7sDu4O8w71DvcO+Q77DwwP
  1.1503 -Dg8QDxIPFA8gDyIPOw9ID0oPTA9OD28PcQ9zD3UPdw95D3sPiA+KD5EPng+gD6IPpA/FD8cPyQ/LD80P
  1.1504 -zw/RD9wP3g/sD/0P/xABEAMQBRAqECwQLhAwEDIQNBA2EDgQOxA9EE4QUBBSEFQQVhB7EH0QfxCBEIMQ
  1.1505 -hRCHEIkQlRCXEKQQphCoEKoQyxDNEM8Q0RDTENUQ1xDcEOkQ+hD8EP4RABECESMRJREnESkRKxEtES8R
  1.1506 -RhFIEVURVxFZEVsRfBF+EYARghGEEYYRiBGZEZsRnhGhEaQRrxHHEdQR1hHYEdoR+xH9Ef8SARIDEgUS
  1.1507 -BxIQEhISKBI1EjcSORI7ElwSXhJgEmISZBJmEmgSbRJvEn0SihKMEo4SkBKxErMStRK3ErkSuxK9EsMS
  1.1508 -xRLMEtkS2xLdEt8TBBMOExATEhMUExYTGBMaExwTKhMsEzsTSBNKE0wTThNvE3ETcxN1E3cTeRN7E4kT
  1.1509 -lxOkE6YTqBOqE8sTzRPPE9ET0xPVE9cT4hPkE+8T/BP+FAAUAhQjFCUUJxQpFCsULRQvFDQUNhQ8FEkU
  1.1510 -SxRNFE8UcBRyFHQUdhR4FHoUfBSRFJcUqBSqFKwUrhSwFMgU1RTXFNkU2xT8FP4VABUCFQQVBhUIFQ4V
  1.1511 -EBUeFS8VMRUzFTUVNxVUFVYVWBVaFVwVXhVgFXYVlhWnFakVqxWtFa8V0BXSFdQV1hXYFdoV3BXoFeoV
  1.1512 -/RYOFhAWEhYUFhYWOxY9Fj8WQRZDFkUWRxZJFlIWVBZhFmMWZRZnFogWihaMFo4WkBaSFpQWmRabFqEW
  1.1513 -rhawFrIWtBbVFtcW2RbbFt0W3xbhFvYW+BcDFxAXEhcUFxYXNxc5FzsXPRc/F0EXQxdHF0kXThdbF10X
  1.1514 -XxdhF4IXhBeGF4gXiheMF44XmxedF7MXwBfCF8QXxhfnF+kX6xftF+8X8RfzF/wYFRgiGCQYJhgoGEkY
  1.1515 -SxhNGE8YURhTGFUYZhhoGHoYgxiGGRcZGRkbGR0ZHxkhGSMZJRknGSkZKxktGS8ZMRkzGTUZNxk5GTsZ
  1.1516 -PRk/GUEZQxlFGUcZSRlLGU0ZTxlRGVMZVRlXGVkZWxldGV8ZYRljGWUZZxlpGWwZbxlxGXMZdRl3GXkZ
  1.1517 -exl9GX8ZgRmDGYUZiBmKGYwZjhmQGZIZlBmWGZgZmhmcGZ4ZoRmjGaUZpxmpGbAZuRm7GcQZxhnIGcoZ
  1.1518 -zBn1GgMaEBoSGhQaFRoXGhgaGhocGh4aLRo2GjsaZBpuGncaeRp7Gn0afxqBGoMahRqHGpgamhqcGp8a
  1.1519 -oRqwGrkauxrSGtQa1hrYGtoa3BreGuAa4hrkGuYa6BsRGxMbFRsWGxgbGRsbGx0bHxtAG0IbRBtGG0gb
  1.1520 -ShtMG2UbZxuQG5IblBuVG5cbmBuaG5wbnhvHG8kbyxvNG88b0RvTG9Ub1xvgG/Eb8xv1G/cb+RwCHAQc
  1.1521 -BRwXHEAcQhxEHEUcRxxIHEocTBxOHHcceRx7HHwcfhx/HIEcgxyFHJIcnxyhHKMcpRyqHLMctRy2HN8c
  1.1522 -4RzjHOQc5hznHOkc6xztHPIc+xz9HRIdFB0WHRgdGh0cHR4dIB0iHSQdJh1PHVEdUx1UHVYdVx1ZHVsd
  1.1523 -XR2GHYgdih2LHY0djh2QHZIdlB29Hb8dwR3DHcUdxx3JHcsdzR3UHd0d3x3kHeYd6B4RHhMeFR4WHhge
  1.1524 -GR4bHh0eHx5IHkoeTB5OHlAeUh5UHlYeWB6BHoMehR6HHokeix6NHo8ekR66Hrwevh6/HsEewh7EHsYe
  1.1525 -yB7xHvMe9R73Hvke+x79Hv8fAR8GHw8fER8eHyAfIh8kHyYfKB8qHzQfPR8/H04fUB9SH1QfVh9ZH1wf
  1.1526 -Xh+HH4kfix+NH48fkR+TH5Uflx+cH6Ufpx++H8Afwh/EH8YfyB/KH8wfzh/QH9If1B/9H/8gASAEIAYg
  1.1527 -CCAKIAwgDyAbICQgJiApICsgRCBtIG8gcSB0IHYgeCB6IHwgfyCEII0gjyCYIJognSCfIKEgyiDMIM4g
  1.1528 -zyDRINIg1CDWINghASEDIQUhByEJIQshDSEPIRIhHiEnISkhKyE0ITkhQiFFIdYh2SHbId0h3yHhIeMh
  1.1529 -5SHnIekh6yHtIe8h8SHzIfUh9yH5Ifsh/SH/IgEiAyIFIgciCSILIg0iDyIRIhMiFSIXIhkiGyIdIh8i
  1.1530 -ISIjIiUiJyIpIisiLSIvIjEiMyI1IjciOSI7Ij0iPyJBIkMiRSJHIkkiSyJNIk8iUSJTIlUiVyJZIlwi
  1.1531 -XiJgImIiZCJmIm8iciMFIwcjCSMLIw0jDyMRIxMjFSMXIxkjGyMdIx8jISMjIyUjJyMpIysjLSMvIzEj
  1.1532 -MyM1IzcjOSM7Iz0jPyNBI0MjRSNHI0kjSyNNI08jUSNTI1UjVyNZI1wjXyNhI2MjZSNnI2kjayNtI28j
  1.1533 -cSN0I3YjeCN6I3wjfiOAI4IjhCOGI4gjiiOMI44jkSOTI5UjlyOZI6IjpSQ4JDskPiRBJEQkRyRJJEwk
  1.1534 -TyRSJFUkWCRbJF4kYSRkJGckaiRsJG8kciR1JHckeiR9JIAkgySFJIgkiySOJJEklCSXJJoknSSgJKMk
  1.1535 -piSpJKwkrySyJLUkuCS7JL4kwSTEJMckyiTNJNAk0yTWJNkk3CTfJOIk5SToJOsk7iTxJPQk9yT6JP0l
  1.1536 -ACUDJQYlCSUMJRolHCU4JUQlWyV0JZklmyWlJbwlyCXiJgUmESYoJjsmTiZoJqcmrCbJJuIm5Cb3JxIn
  1.1537 -JycpJzwnTidoJ3UneSeMJ6Enqie2J8InzifjJ+8oAigGKB8oMShIKFUoWChxKIMolii4KMQo5SkBKRYp
  1.1538 -JCk3KUMpWiluKX0plymjKa8puyncKeAp7Cn1Kfgp+SoCKgUqBioPKhIq7SrvKvEq8yr1Kvcq+Sr7Kv0q
  1.1539 -/ysBKwMrBSsHKwkrCysNKw8rESsTKxUrFysZKxsrHSsfKyErIyslKycrKSsrKy0rLysyKzQrNys5Kzsr
  1.1540 -PSs/K0ErQytFK0crSStLK04rUCtSK1QrVitYK1orXStfK2ErYytlK2craStrK20rbytxK3MrdSt3K3kr
  1.1541 -eyt9K38rgSuDK4UrhyuJK4srjSuPK5ErkyuVK5crmSubK50rnyuhK6MrpSunK6krqyutK68rsSuzK7Ur
  1.1542 -tyu5K7srvSu/K8ErwyvFK8crySvSK9UssCyzLLYsuSy8LL8swizFLMgsyyzOLNEs1CzXLNos3SzgLOMs
  1.1543 -5izpLOws7yzyLPUs+Cz7LP4tAS0ELQctCi0NLRAtEy0WLRktHC0fLSItJS0oLSstLi0xLTQtNy06LT0t
  1.1544 -QC1DLUYtSS1MLU8tUi1VLVgtWy1eLWEtZC1nLWotbS1wLXMtdi15LXwtfy2CLYUtiC2LLY4tkS2ULZct
  1.1545 -mi2dLaAtoy2mLaktrC2vLbIttS24Lbstvi3BLcQtxy3KLc0t0C3TLdYt2S3cLd8t4i3lLegt6y3uLfEt
  1.1546 -9C32Lfgt+i38Lf4uAS4ELgcuCS4LLg0uEC4TLhUuFy4ZLhsuHS4gLiIuJS4nLiouLC4vLjEuMy42Ljku
  1.1547 -Oy49Lj8uQi5ELkYuTy5RLlMuVS5XLlouXS5fLmEuZC5mLmkubC5uLnAuci51Lnguey59Ln8ugS6DLoUu
  1.1548 -hy6JLosujS6QLpIulC6WLpgumi6dLp8uoS6jLqUuqC6qLqwuri6xLrMuti65Lrwuvy7BLsMuxS7ILssu
  1.1549 -zS7PLtIu1S7YLtou3C7eLuAu4i7kLuYu6C7rLu0u8C7zLvYu+C8BLwMvBC8NLxAvES8aLx0vHi8nLywA
  1.1550 -AAAAAAACAgAAAAAAAAb4AAAAAAAAAAAAAAAAAAAvOw</bytes>
  1.1551 -		</object>
  1.1552  	</data>
  1.1553  </archive>
     2.1 Binary file English.lproj/MainMenu.nib/keyedobjects.nib has changed
     3.1 --- a/Source/Bit.m	Wed Mar 12 15:51:32 2008 -0700
     3.2 +++ b/Source/Bit.m	Sun Mar 16 15:06:47 2008 -0700
     3.3 @@ -35,11 +35,26 @@
     3.4      return clone;
     3.5  }
     3.6  
     3.7 +- (void) dealloc
     3.8 +{
     3.9 +    [super dealloc];
    3.10 +}
    3.11 +
    3.12 +
    3.13  @synthesize owner=_owner;
    3.14  
    3.15  - (BOOL) isFriendly         {return _owner.friendly;}
    3.16  - (BOOL) isUnfriendly       {return _owner.unfriendly;}
    3.17  
    3.18 +/*
    3.19 +- (NSString*) identifier
    3.20 +{
    3.21 +    if( _identifier )
    3.22 +        return _identifier;
    3.23 +    // Defaults to just identifying the owner:
    3.24 +    return [NSString stringWithFormat: @"p%i", _owner.index+1];
    3.25 +}
    3.26 +*/
    3.27  
    3.28  - (CGFloat) scale
    3.29  {
     4.1 --- a/Source/BitHolder.m	Wed Mar 12 15:51:32 2008 -0700
     4.2 +++ b/Source/BitHolder.m	Sun Mar 16 15:06:47 2008 -0700
     4.3 @@ -46,8 +46,12 @@
     4.4  - (void) setBit: (Bit*)bit
     4.5  {
     4.6      if( bit != self.bit ) {
     4.7 -        if( bit && _bit )
     4.8 -            [_bit destroy];
     4.9 +        if( _bit ) {
    4.10 +            if( bit )
    4.11 +                [_bit destroy];
    4.12 +            else
    4.13 +                [_bit removeFromSuperlayer];
    4.14 +        }
    4.15          setObj(&_bit,bit);
    4.16          ChangeSuperlayer(bit,self,-1);
    4.17      }
     5.1 --- a/Source/CheckersGame.h	Wed Mar 12 15:51:32 2008 -0700
     5.2 +++ b/Source/CheckersGame.h	Sun Mar 16 15:06:47 2008 -0700
     5.3 @@ -29,13 +29,8 @@
     5.4  @interface CheckersGame : Game 
     5.5  {
     5.6      int _numPieces[2];
     5.7 +    Grid *_grid;
     5.8 +    NSMutableArray *_cells;
     5.9  }
    5.10  
    5.11 -// For subclasses (See HexchequerGame):
    5.12 -- (void) addPieces: (NSString*)imageName
    5.13 -            toGrid: (Grid*)grid
    5.14 -         forPlayer: (int)playerNum
    5.15 -              rows: (NSRange)rows
    5.16 -       alternating: (BOOL)alternating;
    5.17 -
    5.18  @end
     6.1 --- a/Source/CheckersGame.m	Wed Mar 12 15:51:32 2008 -0700
     6.2 +++ b/Source/CheckersGame.m	Sun Mar 16 15:06:47 2008 -0700
     6.3 @@ -30,46 +30,34 @@
     6.4  @implementation CheckersGame
     6.5  
     6.6  
     6.7 -- (void) addPieces: (NSString*)imageName
     6.8 -            toGrid: (Grid*)grid
     6.9 -         forPlayer: (int)playerNum
    6.10 -              rows: (NSRange)rows
    6.11 -       alternating: (BOOL)alternating
    6.12 +- (Piece*) pieceForPlayer: (int)playerNum
    6.13  {
    6.14 -    Piece *prototype = [[Piece alloc] initWithImageNamed: imageName scale: floor(grid.spacing.width * 0.8)];
    6.15 -    prototype.owner = [self.players objectAtIndex: playerNum];
    6.16 -    unsigned cols=grid.columns;
    6.17 -    for( unsigned row=rows.location; row<NSMaxRange(rows); row++ )
    6.18 -        for( unsigned col=0; col<cols; col++ ) {
    6.19 -            if( !alternating || ((row+col) & 1) == 0 ) {
    6.20 -                GridCell *cell = [grid cellAtRow: row column: col];
    6.21 -                if( cell ) {
    6.22 -                    Piece *piece = [prototype copy];
    6.23 -                    cell.bit = piece;
    6.24 -                    [piece release];
    6.25 -                    //cell.bit.rotation = random() % 360; // keeps pieces from looking too samey
    6.26 -                    _numPieces[playerNum]++;
    6.27 -                }
    6.28 -            }
    6.29 -        }
    6.30 -    [prototype release];
    6.31 +    Piece *p = [[Piece alloc] initWithImageNamed: (playerNum==0 ?@"Green Ball.png" :@"Red Ball.png") 
    6.32 +                                           scale: floor(_grid.spacing.width * 0.8)];
    6.33 +    p.owner = [self.players objectAtIndex: playerNum];
    6.34 +    p.name = playerNum ?@"2" :@"1";
    6.35 +    return [p autorelease];
    6.36  }
    6.37  
    6.38 -
    6.39  - (Grid*) x_makeGrid
    6.40  {
    6.41      RectGrid *grid = [[[RectGrid alloc] initWithRows: 8 columns: 8 frame: _board.bounds] autorelease];
    6.42 -    CGPoint pos = grid.position;
    6.43 +    _grid = grid;
    6.44 +    CGPoint pos = _grid.position;
    6.45      pos.x = floor((_board.bounds.size.width-grid.frame.size.width)/2);
    6.46 -    [grid addAllCells];
    6.47      grid.position = pos;
    6.48      grid.allowsMoves = YES;
    6.49      grid.allowsCaptures = NO;
    6.50      grid.cellColor = CreateGray(0.0, 0.25);
    6.51      grid.altCellColor = CreateGray(1.0, 0.25);
    6.52      grid.lineColor = nil;
    6.53 -    [self addPieces: @"Green Ball.png" toGrid: grid forPlayer: 0 rows: NSMakeRange(0,3) alternating: YES];
    6.54 -    [self addPieces: @"Red Ball.png"   toGrid: grid forPlayer: 1 rows: NSMakeRange(5,3) alternating: YES];
    6.55 +
    6.56 +    [grid addAllCells];
    6.57 +    for( int i=0; i<32; i++ ) {
    6.58 +        int row = i/4;
    6.59 +        [_cells addObject: [_grid cellAtRow: row column: 2*(i%4) + (row&1)]];
    6.60 +    }
    6.61 +    self.stateString = @"111111111111--------222222222222";
    6.62      return grid;
    6.63  }
    6.64  
    6.65 @@ -79,12 +67,56 @@
    6.66      self = [super initWithBoard: board];
    6.67      if (self != nil) {
    6.68          [self setNumberOfPlayers: 2];
    6.69 -        [board addSublayer: [self x_makeGrid]];
    6.70 +        _cells = [[NSMutableArray alloc] init];
    6.71 +        [self x_makeGrid];
    6.72 +        [board addSublayer: _grid];
    6.73          [self nextPlayer];
    6.74 +        
    6.75 +        PreloadSound(@"Tink");
    6.76 +        PreloadSound(@"Funk");
    6.77 +        PreloadSound(@"Blow");
    6.78 +        PreloadSound(@"Pop");
    6.79      }
    6.80      return self;
    6.81  }
    6.82  
    6.83 +- (void) dealloc
    6.84 +{
    6.85 +    [_cells release];
    6.86 +    [_grid release];
    6.87 +    [super dealloc];
    6.88 +}
    6.89 +
    6.90 +
    6.91 +- (NSString*) stateString
    6.92 +{
    6.93 +    unichar state[_cells.count];
    6.94 +    int i = 0;
    6.95 +    for( GridCell *cell in _cells ) {
    6.96 +        NSString *ident = cell.bit.name;
    6.97 +        if( ident )
    6.98 +            state[i++] = [ident characterAtIndex: 0];
    6.99 +        else
   6.100 +            state[i++] = '-';
   6.101 +    }
   6.102 +    return [NSString stringWithCharacters: state length: i];
   6.103 +}
   6.104 +
   6.105 +- (void) setStateString: (NSString*)state
   6.106 +{
   6.107 +    _numPieces[0] = _numPieces[1] = 0;
   6.108 +    int i = 0;
   6.109 +    for( GridCell *cell in _cells ) {
   6.110 +        Piece *piece;
   6.111 +        switch( [state characterAtIndex: i++] ) {
   6.112 +            case '1': piece = [self pieceForPlayer: 0]; _numPieces[0]++; break;
   6.113 +            case '2': piece = [self pieceForPlayer: 1]; _numPieces[1]++; break;
   6.114 +            default:  piece = nil; break;
   6.115 +        }
   6.116 +        cell.bit = piece;
   6.117 +    }    
   6.118 +}
   6.119 +
   6.120  
   6.121  - (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)srcHolder to: (id<BitHolder>)dstHolder
   6.122  {
   6.123 @@ -101,8 +133,12 @@
   6.124  {
   6.125      Square *src=(Square*)srcHolder, *dst=(Square*)dstHolder;
   6.126      int playerIndex = self.currentPlayer.index;
   6.127 +    
   6.128 +    if( self.currentMove.length==0 )
   6.129 +        [self.currentMove appendString: src.name];
   6.130 +    [self.currentMove appendString: dst.name];
   6.131 +    
   6.132      BOOL isKing = ([bit valueForKey: @"King"] != nil);
   6.133 -    
   6.134      PlaySound(isKing ?@"Funk" :@"Tink");
   6.135  
   6.136      // "King" a piece that made it to the last row:
   6.137 @@ -154,4 +190,22 @@
   6.138  }
   6.139  
   6.140  
   6.141 +- (BOOL) applyMoveString: (NSString*)move
   6.142 +{
   6.143 +    int length = move.length;
   6.144 +    if( length<4 || (length&1) )
   6.145 +        return NO;
   6.146 +    GridCell *src = nil;
   6.147 +    for( int i=0; i<length; i+=2 ) {
   6.148 +        NSString *ident = [move substringWithRange: NSMakeRange(i,2)];
   6.149 +        GridCell *dst = [_grid cellWithName: ident];
   6.150 +        if( i > 0 )
   6.151 +            if( ! [self animateMoveFrom: src to: dst] )
   6.152 +                return NO;
   6.153 +        src = dst;
   6.154 +    }
   6.155 +    return YES;
   6.156 +}
   6.157 +
   6.158 +
   6.159  @end
     7.1 --- a/Source/DemoBoardView.h	Wed Mar 12 15:51:32 2008 -0700
     7.2 +++ b/Source/DemoBoardView.h	Sun Mar 16 15:06:47 2008 -0700
     7.3 @@ -28,6 +28,7 @@
     7.4  @interface DemoBoardView : BoardView
     7.5  {
     7.6      CATextLayer *_headline;
     7.7 +    IBOutlet NSSlider *_turnSlider;
     7.8  }
     7.9  
    7.10  - (IBAction) startGameFromMenu: (id)sender;
     8.1 --- a/Source/DemoBoardView.m	Wed Mar 12 15:51:32 2008 -0700
     8.2 +++ b/Source/DemoBoardView.m	Sun Mar 16 15:06:47 2008 -0700
     8.3 @@ -43,7 +43,7 @@
     8.4                                             @"TicTacToeGame", @"GoGame"};
     8.5  
     8.6  /** Class name of the current game. */
     8.7 -static NSString* sCurrentGameName = @"KlondikeGame";
     8.8 +static NSString* sCurrentGameName = @"CheckersGame";
     8.9  
    8.10  
    8.11  - (void) startGameNamed: (NSString*)gameClassName
    8.12 @@ -89,6 +89,8 @@
    8.13                                            alignment: kCALayerWidthSizable | kCALayerMinYMargin];
    8.14      
    8.15      [self startGameNamed: sCurrentGameName];
    8.16 +    
    8.17 +    [_turnSlider bind: @"value"    toObject: self withKeyPath: @"game.currentTurn" options: nil];
    8.18  }
    8.19  
    8.20  
    8.21 @@ -106,6 +108,10 @@
    8.22  {
    8.23      Game *game = self.game;
    8.24      if( object == game ) {
    8.25 +        NSLog(@"maxTurn = %u, currentTurn=%u", self.game.maxTurn,self.game.currentTurn);
    8.26 +        _turnSlider.maxValue = self.game.maxTurn;
    8.27 +        _turnSlider.numberOfTickMarks = self.game.maxTurn+1;
    8.28 +        
    8.29          Player *p = game.winner;
    8.30          NSString *msg;
    8.31          if( p ) {
    8.32 @@ -114,6 +120,7 @@
    8.33          } else {
    8.34              p = game.currentPlayer;
    8.35              msg = @"Your turn, %@";
    8.36 +            NSLog(@"Game state = '%@'", self.game.stateString);
    8.37          }
    8.38          _headline.string = [NSString stringWithFormat: msg, p.name];
    8.39      }
     9.1 --- a/Source/GGBLayer.h	Wed Mar 12 15:51:32 2008 -0700
     9.2 +++ b/Source/GGBLayer.h	Sun Mar 16 15:06:47 2008 -0700
     9.3 @@ -14,18 +14,24 @@
     9.4  
     9.5  
     9.6  @interface GGBLayer : CALayer <NSCopying>
     9.7 +{
     9.8 +    CABasicAnimation *_curAnimation;
     9.9  
    9.10 -#if TARGET_OS_ASPEN
    9.11 +#if ! TARGET_OS_ASPEN
    9.12 +}
    9.13 +#else
    9.14  // For some reason, the CALayer class on iPhone OS doesn't have these!
    9.15 -{
    9.16      CGFloat _cornerRadius, _borderWidth;
    9.17      CGColorRef _borderColor, _realBGColor;
    9.18      unsigned int _autoresizingMask;
    9.19  }
    9.20 +
    9.21  @property CGFloat cornerRadius, borderWidth;
    9.22  @property CGColorRef borderColor;
    9.23  #endif
    9.24  
    9.25  - (void) redisplayAll;
    9.26  
    9.27 +- (void) animateAndBlock: (NSString*)keyPath from: (id)from to: (id)to duration: (NSTimeInterval)duration;
    9.28 +
    9.29  @end
    10.1 --- a/Source/GGBLayer.m	Wed Mar 12 15:51:32 2008 -0700
    10.2 +++ b/Source/GGBLayer.m	Sun Mar 16 15:06:47 2008 -0700
    10.3 @@ -30,6 +30,43 @@
    10.4  }
    10.5  
    10.6  
    10.7 +/*
    10.8 +- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key 
    10.9 +{
   10.10 +    NSLog(@"%@[%p] addAnimation: %p forKey: %@",[self class],self,anim,key);
   10.11 +    [super addAnimation: anim forKey: key];
   10.12 +}
   10.13 +*/
   10.14 +
   10.15 +
   10.16 +- (void) animateAndBlock: (NSString*)keyPath from: (id)from to: (id)to duration: (NSTimeInterval)duration
   10.17 +{
   10.18 +    //WARNING: This code works, but is a mess. I hope to find a better way to do this. --Jens 3/16/08
   10.19 +    CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath: keyPath];
   10.20 +    anim.duration= duration;
   10.21 +    anim.fromValue = from;
   10.22 +    anim.toValue = to;
   10.23 +    anim.isRemovedOnCompletion = YES;
   10.24 +    anim.delegate = self;
   10.25 +    [self addAnimation:anim forKey: @"animateAndBlock:"];
   10.26 +    _curAnimation = (id)[self animationForKey: @"animateAndBlock:"];
   10.27 +    [self setValue: to forKeyPath: keyPath];    // animation doesn't update the property value
   10.28 +
   10.29 +    // Now wait for it to finish:
   10.30 +    while( _curAnimation ) {
   10.31 +        [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode//NSEventTrackingRunLoopMode
   10.32 +                                 beforeDate: [NSDate dateWithTimeIntervalSinceNow: 0.1]];
   10.33 +    }
   10.34 +}
   10.35 +
   10.36 +- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
   10.37 +{
   10.38 +    if( anim==_curAnimation ) {
   10.39 +        _curAnimation = nil;
   10.40 +    }
   10.41 +}
   10.42 +
   10.43 +
   10.44  #if TARGET_OS_ASPEN
   10.45  
   10.46  #pragma mark -
    11.1 --- a/Source/GGBUtils.h	Wed Mar 12 15:51:32 2008 -0700
    11.2 +++ b/Source/GGBUtils.h	Sun Mar 16 15:06:47 2008 -0700
    11.3 @@ -30,5 +30,6 @@
    11.4  void setObjCopy( id<NSCopying> *variable, id<NSCopying> newValue );
    11.5  
    11.6  
    11.7 +void PreloadSound( NSString* name );
    11.8  void PlaySound( NSString* name );
    11.9  void Beep( void );
   11.10 \ No newline at end of file
    12.1 --- a/Source/GGBUtils.m	Wed Mar 12 15:51:32 2008 -0700
    12.2 +++ b/Source/GGBUtils.m	Sun Mar 16 15:06:47 2008 -0700
    12.3 @@ -42,6 +42,17 @@
    12.4  }
    12.5  
    12.6  
    12.7 +void PreloadSound( NSString* name )
    12.8 +{
    12.9 +#if ! TARGET_OS_ASPEN
   12.10 +    NSSound *sound = [[NSSound soundNamed: @"Pop"] copy];
   12.11 +    sound.volume = 0;
   12.12 +    [sound play];
   12.13 +    [sound release];
   12.14 +#endif
   12.15 +}    
   12.16 +
   12.17 +
   12.18  void PlaySound( NSString* name )
   12.19  {
   12.20  #if TARGET_OS_ASPEN
    13.1 --- a/Source/Game.h	Wed Mar 12 15:51:32 2008 -0700
    13.2 +++ b/Source/Game.h	Sun Mar 16 15:06:47 2008 -0700
    13.3 @@ -20,7 +20,7 @@
    13.4      CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 
    13.5      THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    13.6  */
    13.7 -@class GGBLayer, Bit, Player;
    13.8 +@class GGBLayer, Bit, BitHolder, Player;
    13.9  @protocol BitHolder;
   13.10  
   13.11  
   13.12 @@ -30,6 +30,9 @@
   13.13      GGBLayer *_board;
   13.14      NSArray *_players;
   13.15      Player *_currentPlayer, *_winner;
   13.16 +    NSMutableString *_currentMove;
   13.17 +    NSMutableArray *_states, *_moves;
   13.18 +    unsigned _currentTurn;
   13.19  }
   13.20  
   13.21  /** Returns the human-readable name of this game.
   13.22 @@ -41,6 +44,13 @@
   13.23  @property (readonly, copy) NSArray *players;
   13.24  @property (readonly) Player *currentPlayer, *winner;
   13.25  
   13.26 +@property (readonly) NSArray *states, *moves;
   13.27 +@property (readonly) unsigned maxTurn;
   13.28 +@property unsigned currentTurn;
   13.29 +@property (readonly) BOOL isLatestTurn;
   13.30 +
   13.31 +- (BOOL) animateMoveFrom: (BitHolder*)src to: (BitHolder*)dst;
   13.32 +
   13.33  
   13.34  // Methods for subclasses to implement:
   13.35  
   13.36 @@ -48,6 +58,7 @@
   13.37      it should add the necessary Grids, Pieces, Cards, Decks etc. to the board. */
   13.38  - (id) initWithBoard: (GGBLayer*)board;
   13.39  
   13.40 +
   13.41  /** Should return YES if it is legal for the given bit to be moved from its current holder.
   13.42      Default implementation always returns YES. */
   13.43  - (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)src;
   13.44 @@ -56,6 +67,7 @@
   13.45      Default implementation always returns YES. */
   13.46  - (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)src to: (id<BitHolder>)dst;
   13.47  
   13.48 +
   13.49  /** Should handle any side effects of a Bit's movement, such as captures or scoring.
   13.50      Does not need to do the actual movement! That's already happened.
   13.51      It should end by calling -endTurn, if the player's turn is over.
   13.52 @@ -76,11 +88,18 @@
   13.53  - (Player*) checkForWinner;
   13.54  
   13.55  
   13.56 +@property (copy) NSString* stateString;
   13.57 +- (BOOL) applyMoveString: (NSString*)move;
   13.58 +
   13.59 +
   13.60  // Protected methods for subclasses to call:
   13.61  
   13.62  /** Sets the number of players in the game. Subclass initializers should call this. */
   13.63  - (void) setNumberOfPlayers: (unsigned)n;
   13.64  
   13.65 +/** The current move in progress. Append text to it as the user makes moves. */
   13.66 +@property (readonly) NSMutableString* currentMove;
   13.67 +
   13.68  /** Advance to the next player, when a turn is over. */
   13.69  - (void) nextPlayer;
   13.70  
    14.1 --- a/Source/Game.m	Wed Mar 12 15:51:32 2008 -0700
    14.2 +++ b/Source/Game.m	Sun Mar 16 15:06:47 2008 -0700
    14.3 @@ -22,6 +22,8 @@
    14.4  */
    14.5  #import "Game.h"
    14.6  #import "Bit.h"
    14.7 +#import "BitHolder.h"
    14.8 +#import "QuartzUtils.h"
    14.9  
   14.10  
   14.11  @interface Game ()
   14.12 @@ -46,6 +48,9 @@
   14.13  {
   14.14      self = [super init];
   14.15      if (self != nil) {
   14.16 +        _states = [[NSMutableArray alloc] init];
   14.17 +        _moves = [[NSMutableArray alloc] init];
   14.18 +        _currentMove = [[NSMutableString alloc] init];
   14.19          _board = [board retain];
   14.20          // Store a pointer to myself as the value of the "Game" property
   14.21          // of my root layer. (CALayers can have arbitrary KV properties stored into them.)
   14.22 @@ -60,11 +65,15 @@
   14.23  {
   14.24      [_board release];
   14.25      [_players release];
   14.26 +    [_currentMove release];
   14.27 +    [_states release];
   14.28 +    [_moves release];
   14.29      [super dealloc];
   14.30  }
   14.31  
   14.32  
   14.33 -@synthesize players=_players, currentPlayer=_currentPlayer, winner=_winner;
   14.34 +@synthesize players=_players, currentPlayer=_currentPlayer, winner=_winner, 
   14.35 +            currentMove=_currentMove, states=_states, moves=_moves;
   14.36  
   14.37  
   14.38  - (void) setNumberOfPlayers: (unsigned)n
   14.39 @@ -82,13 +91,35 @@
   14.40  }
   14.41  
   14.42  
   14.43 +- (void) addToMove: (NSString*)str;
   14.44 +{
   14.45 +    [_currentMove appendString: str];
   14.46 +}
   14.47 +
   14.48 +
   14.49 +- (BOOL) _rememberState
   14.50 +{
   14.51 +    if( self.isLatestTurn ) {
   14.52 +        [_states addObject: self.stateString];
   14.53 +        return YES;
   14.54 +    } else
   14.55 +        return NO;
   14.56 +}
   14.57 +
   14.58 +
   14.59  - (void) nextPlayer
   14.60  {
   14.61 +    BOOL latestTurn = [self _rememberState];
   14.62      if( ! _currentPlayer ) {
   14.63          NSLog(@"*** The %@ Begins! ***", self.class);
   14.64          self.currentPlayer = [_players objectAtIndex: 0];
   14.65      } else {
   14.66          self.currentPlayer = _currentPlayer.nextPlayer;
   14.67 +        if( latestTurn ) {
   14.68 +            [self willChangeValueForKey: @"currentTurn"];
   14.69 +            _currentTurn++;
   14.70 +            [self didChangeValueForKey: @"currentTurn"];
   14.71 +        }
   14.72      }
   14.73      NSLog(@"Current player is %@",_currentPlayer);
   14.74  }
   14.75 @@ -96,16 +127,88 @@
   14.76  
   14.77  - (void) endTurn
   14.78  {
   14.79 -    NSLog(@"--- End of turn");
   14.80 +    NSLog(@"--- End of turn (move was '%@')", _currentMove);
   14.81 +    if( self.isLatestTurn ) {
   14.82 +        [self willChangeValueForKey: @"maxTurn"];
   14.83 +        [_moves addObject: [[_currentMove copy] autorelease]];
   14.84 +        [_currentMove setString: @""];
   14.85 +        [self didChangeValueForKey: @"maxTurn"];
   14.86 +    }
   14.87 +
   14.88      Player *winner = [self checkForWinner];
   14.89      if( winner ) {
   14.90          NSLog(@"*** The %@ Ends! The winner is %@ ! ***", self.class, winner);
   14.91 +        [self _rememberState];
   14.92          self.winner = winner;
   14.93      } else
   14.94          [self nextPlayer];
   14.95  }
   14.96  
   14.97  
   14.98 +- (unsigned) maxTurn
   14.99 +{
  14.100 +    return _moves.count;
  14.101 +}
  14.102 +
  14.103 +- (unsigned) currentTurn
  14.104 +{
  14.105 +    return _currentTurn;
  14.106 +}
  14.107 +
  14.108 +- (void) setCurrentTurn: (unsigned)turn
  14.109 +{
  14.110 +    NSParameterAssert(turn<=self.maxTurn);
  14.111 +    if( turn != _currentTurn ) {
  14.112 +        if( turn==_currentTurn+1 ) {
  14.113 +            [self applyMoveString: [_moves objectAtIndex: _currentTurn]];
  14.114 +        } else {
  14.115 +            [CATransaction begin];
  14.116 +            [CATransaction setValue:(id)kCFBooleanTrue
  14.117 +                             forKey:kCATransactionDisableActions];
  14.118 +            self.stateString = [_states objectAtIndex: turn];
  14.119 +            [CATransaction commit];
  14.120 +        }
  14.121 +        _currentTurn = turn;
  14.122 +        self.currentPlayer = [_players objectAtIndex: (turn % _players.count)];
  14.123 +    }
  14.124 +}
  14.125 +
  14.126 +
  14.127 +- (BOOL) isLatestTurn
  14.128 +{
  14.129 +    return _currentTurn == MAX(_states.count,1)-1;
  14.130 +}
  14.131 +
  14.132 +
  14.133 +- (BOOL) animateMoveFrom: (BitHolder*)src to: (BitHolder*)dst
  14.134 +{
  14.135 +    if( src==nil || dst==nil || dst==src )
  14.136 +        return NO;
  14.137 +    Bit *bit = [src canDragBit: src.bit];
  14.138 +    if( ! bit || ! [dst canDropBit: bit atPoint: GetCGRectCenter(dst.bounds)]
  14.139 +              || ! [self canBit: bit moveFrom: src to: dst] )
  14.140 +        return NO;
  14.141 +    
  14.142 +    ChangeSuperlayer(bit, _board.superlayer, -1);
  14.143 +    bit.pickedUp = YES;
  14.144 +    dst.highlighted = YES;
  14.145 +    [bit performSelector: @selector(setPickedUp:) withObject:nil afterDelay: 0.15];
  14.146 +    CGPoint endPosition = [dst convertPoint: GetCGRectCenter(dst.bounds) toLayer: bit.superlayer];
  14.147 +    [bit animateAndBlock: @"position"
  14.148 +                    from: [NSValue valueWithPoint: NSPointFromCGPoint(bit.position)]
  14.149 +                      to: [NSValue valueWithPoint: NSPointFromCGPoint(endPosition)]
  14.150 +                duration: 0.25];
  14.151 +    dst.bit = bit;
  14.152 +    dst.highlighted = NO;
  14.153 +    bit.pickedUp = NO;
  14.154 +    
  14.155 +    [src draggedBit: bit to: dst];
  14.156 +    [self bit: bit movedFrom: src to: dst];
  14.157 +    src = dst;
  14.158 +    return YES;
  14.159 +}
  14.160 +     
  14.161 +
  14.162  #pragma mark -
  14.163  #pragma mark GAMEPLAY METHODS TO BE OVERRIDDEN:
  14.164  
  14.165 @@ -148,6 +251,11 @@
  14.166  }
  14.167  
  14.168  
  14.169 +- (NSString*) stateString                   {return @"";}
  14.170 +- (void) setStateString: (NSString*)s       { }
  14.171 +
  14.172 +- (BOOL) applyMoveString: (NSString*)move   {return NO;}
  14.173 +
  14.174  @end
  14.175  
  14.176  
    15.1 --- a/Source/GoGame.m	Wed Mar 12 15:51:32 2008 -0700
    15.2 +++ b/Source/GoGame.m	Sun Mar 16 15:06:47 2008 -0700
    15.3 @@ -87,6 +87,7 @@
    15.4          [_captured[1] release];
    15.5  
    15.6          [self nextPlayer];
    15.7 +        PreloadSound(@"Pop");
    15.8  }
    15.9      return self;
   15.10  }
   15.11 @@ -104,9 +105,15 @@
   15.12  }
   15.13  
   15.14  
   15.15 +- (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)srcHolder
   15.16 +{
   15.17 +    return (srcHolder==nil);
   15.18 +}
   15.19 +
   15.20 +
   15.21  - (BOOL) canBit: (Bit*)bit moveFrom: (id<BitHolder>)srcHolder to: (id<BitHolder>)dstHolder
   15.22  {
   15.23 -    if( ! [dstHolder isKindOfClass: [Square class]] )
   15.24 +    if( srcHolder!=nil || ! [dstHolder isKindOfClass: [Square class]] )
   15.25          return NO;
   15.26      Square *dst=(Square*)dstHolder;
   15.27      
    16.1 --- a/Source/Grid.h	Wed Mar 12 15:51:32 2008 -0700
    16.2 +++ b/Source/Grid.h	Sun Mar 16 15:06:47 2008 -0700
    16.3 @@ -67,6 +67,7 @@
    16.4  /** Removes a particular cell, leaving a blank space. */
    16.5  - (void) removeCellAtRow: (unsigned)row column: (unsigned)col;
    16.6  
    16.7 +- (GridCell*) cellWithName: (NSString*)identifier;
    16.8  
    16.9  // protected:
   16.10  - (GridCell*) createCellAtRow: (unsigned)row column: (unsigned)col 
    17.1 --- a/Source/Grid.m	Wed Mar 12 15:51:32 2008 -0700
    17.2 +++ b/Source/Grid.m	Sun Mar 16 15:06:47 2008 -0700
    17.3 @@ -124,10 +124,11 @@
    17.4  - (GridCell*) createCellAtRow: (unsigned)row column: (unsigned)col 
    17.5                 suggestedFrame: (CGRect)frame
    17.6  {
    17.7 -    return [[[_cellClass alloc] initWithGrid: self 
    17.8 +    GridCell *cell = [[_cellClass alloc] initWithGrid: self 
    17.9                                          row: row column: col
   17.10 -                                      frame: frame]
   17.11 -                    autorelease];
   17.12 +                                                frame: frame];
   17.13 +    cell.name = [NSString stringWithFormat: @"%c%u", ('A'+row),col];
   17.14 +    return [cell autorelease];
   17.15  }
   17.16  
   17.17  
   17.18 @@ -172,6 +173,16 @@
   17.19  }
   17.20  
   17.21  
   17.22 +- (GridCell*) cellWithName: (NSString*)name
   17.23 +{
   17.24 +    for( CALayer *layer in self.sublayers )
   17.25 +        if( [layer isKindOfClass: [GridCell class]] )
   17.26 +            if( [name isEqualToString: ((GridCell*)layer).name] )
   17.27 +                return (GridCell*)layer;
   17.28 +    return nil;
   17.29 +}
   17.30 +
   17.31 +
   17.32  #pragma mark -
   17.33  #pragma mark DRAWING:
   17.34  
    18.1 --- a/Source/HexchequerGame.m	Wed Mar 12 15:51:32 2008 -0700
    18.2 +++ b/Source/HexchequerGame.m	Sun Mar 16 15:06:47 2008 -0700
    18.3 @@ -32,18 +32,31 @@
    18.4  
    18.5  - (Grid*) x_makeGrid
    18.6  {
    18.7 -    HexGrid *grid = [[[HexGrid alloc] initWithRows: 9 columns: 9 frame: _board.bounds] autorelease];
    18.8 +    HexGrid *grid = [[HexGrid alloc] initWithRows: 9 columns: 9 frame: _board.bounds];
    18.9 +    _grid = grid;
   18.10      CGPoint pos = grid.position;
   18.11      pos.x = floor((_board.bounds.size.width-grid.frame.size.width)/2);
   18.12      grid.position = pos;
   18.13 -    [grid addCellsInHexagon];
   18.14      grid.allowsMoves = YES;
   18.15      grid.allowsCaptures = NO;      // no land-on captures, that is
   18.16      grid.cellColor = CreateGray(1.0, 0.25);
   18.17      grid.lineColor = kTranslucentLightGrayColor;
   18.18      
   18.19 -    [self addPieces: @"Green Ball.png" toGrid: grid forPlayer: 0 rows: NSMakeRange(0,2) alternating: NO];
   18.20 -    [self addPieces: @"Red Ball.png"   toGrid: grid forPlayer: 1 rows: NSMakeRange(7,2) alternating: NO];
   18.21 +    [grid addCellsInHexagon];
   18.22 +    for( int y=0; y<9; y++ ) {
   18.23 +        for( int x=0; x<9; x++ ) {
   18.24 +            GridCell *cell = [_grid cellAtRow: y column: x];
   18.25 +            if( cell )
   18.26 +                [_cells addObject: cell];
   18.27 +        }
   18.28 +    }
   18.29 +    self.stateString = @"111111111111111111-------------------------222222222222222222";
   18.30 +    
   18.31 +    [self performSelector: @selector(applyMoveString:) withObject: @"C4D4" afterDelay: 2.0];
   18.32 +    [self performSelector: @selector(applyMoveString:) withObject: @"G3F3" afterDelay: 5.0];
   18.33 +    [self performSelector: @selector(applyMoveString:) withObject: @"D4E4" afterDelay: 8.0];
   18.34 +    [self performSelector: @selector(applyMoveString:) withObject: @"F3D4" afterDelay: 11.0];
   18.35 +    
   18.36      return grid;
   18.37  }
   18.38  
   18.39 @@ -64,8 +77,12 @@
   18.40  {
   18.41      Hex *src=(Hex*)srcHolder, *dst=(Hex*)dstHolder;
   18.42      int playerIndex = self.currentPlayer.index;
   18.43 -    BOOL isKing = ([bit valueForKey: @"King"] != nil);
   18.44 +
   18.45 +    if( self.currentMove.length==0 )
   18.46 +        [self.currentMove appendString: src.name];
   18.47 +    [self.currentMove appendString: dst.name];
   18.48      
   18.49 +    BOOL isKing = ([bit valueForKey: @"King"] != nil);    
   18.50      PlaySound(isKing ?@"Funk" :@"Tink");
   18.51  
   18.52      // "King" a piece that made it to the last row:
    19.1 --- a/Source/QuartzUtils.m	Wed Mar 12 15:51:32 2008 -0700
    19.2 +++ b/Source/QuartzUtils.m	Sun Mar 16 15:06:47 2008 -0700
    19.3 @@ -76,11 +76,11 @@
    19.4          pos = [newSuperlayer convertPoint: pos fromLayer: layer.superlayer];
    19.5      [layer retain];
    19.6      [layer removeFromSuperlayer];
    19.7 +    layer.position = pos;
    19.8      if( index >= 0 )
    19.9          [newSuperlayer insertSublayer: layer atIndex: index];
   19.10      else
   19.11          [newSuperlayer addSublayer: layer];
   19.12 -    layer.position = pos;
   19.13      [layer release];
   19.14  
   19.15      [CATransaction commit];
    20.1 --- a/Source/TicTacToeGame.m	Wed Mar 12 15:51:32 2008 -0700
    20.2 +++ b/Source/TicTacToeGame.m	Sun Mar 16 15:06:47 2008 -0700
    20.3 @@ -29,21 +29,13 @@
    20.4  
    20.5  @implementation TicTacToeGame
    20.6  
    20.7 -- (void) x_createDispenser: (NSString*)imageName forPlayer: (int)playerNumber
    20.8 +- (Piece*) pieceForPlayer: (int)playerNumber
    20.9  {
   20.10 -    Piece *p = [[Piece alloc] initWithImageNamed: imageName scale: 80];
   20.11 +    Piece *p = [[Piece alloc] initWithImageNamed: (playerNumber ? @"O.tiff" :@"X.tiff")
   20.12 +                                           scale: 80];
   20.13      p.owner = [self.players objectAtIndex: playerNumber];
   20.14 -    CGFloat x = floor(CGRectGetMidX(_board.bounds));
   20.15 -#if TARGET_OS_ASPEN
   20.16 -    x = x - 80 + 160*playerNumber;
   20.17 -    CGFloat y = 360;
   20.18 -#else
   20.19 -    x += (playerNumber==0 ?-230 :230);
   20.20 -    CGFloat y = 175;
   20.21 -#endif
   20.22 -    _dispenser[playerNumber] = [[Dispenser alloc] initWithPrototype: p quantity: 0
   20.23 -                                                        frame: CGRectMake(x-45,y-45, 90,90)];
   20.24 -    [_board addSublayer: _dispenser[playerNumber]];
   20.25 +    p.name = (playerNumber ?@"O" :@"X");
   20.26 +    return [p autorelease];
   20.27  }
   20.28  
   20.29  - (id) initWithBoard: (GGBLayer*)board
   20.30 @@ -62,8 +54,20 @@
   20.31          [board addSublayer: _grid];
   20.32          
   20.33          // Create piece dispensers for the two players:
   20.34 -        [self x_createDispenser: @"X.tiff" forPlayer: 0];
   20.35 -        [self x_createDispenser: @"O.tiff" forPlayer: 1];
   20.36 +        for( int playerNumber=0; playerNumber<=1; playerNumber++ ) {
   20.37 +            Piece *p = [self pieceForPlayer: playerNumber];
   20.38 +            CGFloat x = floor(CGRectGetMidX(_board.bounds));
   20.39 +#if TARGET_OS_ASPEN
   20.40 +            x = x - 80 + 160*playerNumber;
   20.41 +            CGFloat y = 360;
   20.42 +#else
   20.43 +            x += (playerNumber==0 ?-230 :230);
   20.44 +            CGFloat y = 175;
   20.45 +#endif
   20.46 +            _dispenser[playerNumber] = [[Dispenser alloc] initWithPrototype: p quantity: 0
   20.47 +                                                                      frame: CGRectMake(x-45,y-45, 90,90)];
   20.48 +            [_board addSublayer: _dispenser[playerNumber]];
   20.49 +        }            
   20.50          
   20.51          // And they're off!
   20.52          [self nextPlayer];
   20.53 @@ -71,6 +75,34 @@
   20.54      return self;
   20.55  }
   20.56  
   20.57 +
   20.58 +- (NSString*) stateString
   20.59 +{
   20.60 +    unichar str[10];
   20.61 +    for( int i=0; i<9; i++ ) {
   20.62 +        NSString *ident = [_grid cellAtRow: i/3 column: i%3].bit.name;
   20.63 +        if( ident==nil )
   20.64 +            str[i] = '-';
   20.65 +        else 
   20.66 +            str[i] = [ident characterAtIndex: 0];
   20.67 +    }
   20.68 +    return [NSString stringWithCharacters: str length: 9];
   20.69 +}
   20.70 +
   20.71 +- (void) setStateString: (NSString*)stateString
   20.72 +{
   20.73 +    for( int i=0; i<9; i++ ) {
   20.74 +        Piece *piece;
   20.75 +        switch( [stateString characterAtIndex: i] ) {
   20.76 +            case 'X': case 'x': piece = [self pieceForPlayer: 0]; break;
   20.77 +            case 'O': case 'o': piece = [self pieceForPlayer: 1]; break;
   20.78 +            default:            piece = nil; break;
   20.79 +        }
   20.80 +        [_grid cellAtRow: i/3 column: i%3].bit = piece;
   20.81 +    }
   20.82 +}
   20.83 +
   20.84 +
   20.85  - (Bit*) bitToPlaceInHolder: (id<BitHolder>)holder
   20.86  {
   20.87      if( holder.bit==nil && [holder isKindOfClass: [Square class]] )
   20.88 @@ -79,6 +111,15 @@
   20.89          return nil;
   20.90  }
   20.91  
   20.92 +
   20.93 +- (void) bit: (Bit*)bit movedFrom: (id<BitHolder>)src to: (id<BitHolder>)dst
   20.94 +{
   20.95 +    Square *square = (Square*)dst;
   20.96 +    int squareIndex = 3*square.row + square.column;
   20.97 +    [self.currentMove appendFormat: @"%@%i", bit.name, squareIndex];
   20.98 +    [super bit: bit movedFrom: src to: dst];
   20.99 +}
  20.100 +
  20.101  - (void) nextPlayer
  20.102  {
  20.103      [super nextPlayer];